diff options
author | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:01:29 +0200 |
---|---|---|
committer | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:01:29 +0200 |
commit | 9a2a524f1e311853d08050be2dcdddc09ac7759a (patch) | |
tree | d8e4a24169fce88c2d89931d58514889a0bcb0ea /ui/SyncDialog.cpp | |
parent | 2.3 (diff) | |
download | FreeFileSync-9a2a524f1e311853d08050be2dcdddc09ac7759a.tar.gz FreeFileSync-9a2a524f1e311853d08050be2dcdddc09ac7759a.tar.bz2 FreeFileSync-9a2a524f1e311853d08050be2dcdddc09ac7759a.zip |
3.0
Diffstat (limited to 'ui/SyncDialog.cpp')
-rw-r--r-- | ui/SyncDialog.cpp | 1245 |
1 files changed, 0 insertions, 1245 deletions
diff --git a/ui/SyncDialog.cpp b/ui/SyncDialog.cpp deleted file mode 100644 index 8f5066c5..00000000 --- a/ui/SyncDialog.cpp +++ /dev/null @@ -1,1245 +0,0 @@ -#include "syncDialog.h" -#include "../shared/systemConstants.h" -#include "../library/resources.h" -#include <wx/msgdlg.h> -#include "../shared/customButton.h" -#include "../synchronization.h" -#include "../algorithm.h" -#include <wx/dnd.h> -#include "../shared/dragAndDrop.h" -#include "../shared/fileHandling.h" -#include "../shared/xmlBase.h" -#include <wx/wupdlock.h> -#include "folderPair.h" - -using namespace FreeFileSync; - - -SyncCfgDialog::SyncCfgDialog(wxWindow* window, - const CompareVariant compareVar, - SyncConfiguration& syncConfiguration, - DeletionPolicy& handleDeletion, - wxString& customDeletionDirectory, - bool* ignoreErrors) : - SyncCfgDlgGenerated(window), - cmpVariant(compareVar), - localSyncConfiguration(syncConfiguration), //make working copy of syncConfiguration - refSyncConfiguration(syncConfiguration), - refHandleDeletion(handleDeletion), - refCustomDeletionDirectory(customDeletionDirectory), - refIgnoreErrors(ignoreErrors), - dragDropCustomDelFolder(new DragDropOnDlg(m_panelCustomDeletionDir, m_dirPickerCustomDelFolder, m_textCtrlCustomDelFolder)) -{ - setDeletionHandling(handleDeletion); - m_textCtrlCustomDelFolder->SetValue(customDeletionDirectory); - - //error handling - if (ignoreErrors) - setErrorHandling(*ignoreErrors); - else - { - sbSizerErrorHandling->Show(false); - Layout(); - } - - //set sync config icons - updateConfigIcons(cmpVariant, localSyncConfiguration); - - //set icons for this dialog - m_bitmapLeftOnly->SetBitmap(*GlobalResources::getInstance().bitmapLeftOnly); - m_bitmapRightOnly->SetBitmap(*GlobalResources::getInstance().bitmapRightOnly); - m_bitmapLeftNewer->SetBitmap(*GlobalResources::getInstance().bitmapLeftNewer); - m_bitmapRightNewer->SetBitmap(*GlobalResources::getInstance().bitmapRightNewer); - m_bitmapDifferent->SetBitmap(*GlobalResources::getInstance().bitmapDifferent); - m_bitmapConflict->SetBitmap(*GlobalResources::getInstance().bitmapConflictGrey); - - bSizer201->Layout(); //wxButtonWithImage size might have changed - - //set radiobutton - switch (localSyncConfiguration.getVariant()) - { - case SyncConfiguration::MIRROR: - m_radioBtn1->SetValue(true); //one way -> - break; - case SyncConfiguration::UPDATE: - m_radioBtnUpdate->SetValue(true); //Update -> - break; - case SyncConfiguration::TWOWAY: - m_radioBtn2->SetValue(true); //two way <-> - break; - case SyncConfiguration::CUSTOM: - m_radioBtn3->SetValue(true); //other - break; - } - - m_buttonApply->SetFocus(); - - Fit(); -} - -//################################################################################################################# - -SyncCfgDialog::~SyncCfgDialog() {} - - -void SyncCfgDialog::updateConfigIcons(const FreeFileSync::CompareVariant cmpVar, const FreeFileSync::SyncConfiguration& syncConfig) -{ - updateConfigIcons(cmpVar, - syncConfig, - m_bpButtonLeftOnly, - m_bpButtonRightOnly, - m_bpButtonLeftNewer, - m_bpButtonRightNewer, - m_bpButtonDifferent, - m_bpButtonConflict, - m_bitmapLeftOnly, - m_bitmapRightOnly, - m_bitmapLeftNewer, - m_bitmapRightNewer, - m_bitmapDifferent, - m_bitmapConflict); -} - - -void SyncCfgDialog::updateConfigIcons(const CompareVariant compareVar, - const SyncConfiguration& syncConfig, - wxBitmapButton* buttonLeftOnly, - wxBitmapButton* buttonRightOnly, - wxBitmapButton* buttonLeftNewer, - wxBitmapButton* buttonRightNewer, - wxBitmapButton* buttonDifferent, - wxBitmapButton* buttonConflict, - wxStaticBitmap* bitmapLeftOnly, - wxStaticBitmap* bitmapRightOnly, - wxStaticBitmap* bitmapLeftNewer, - wxStaticBitmap* bitmapRightNewer, - wxStaticBitmap* bitmapDifferent, - wxStaticBitmap* bitmapConflict) -{ - //display only relevant sync options - switch (compareVar) - { - case CMP_BY_TIME_SIZE: - buttonLeftOnly ->Show(); - buttonRightOnly ->Show(); - buttonLeftNewer ->Show(); - buttonRightNewer->Show(); - buttonDifferent ->Hide(); - buttonConflict ->Show(); - - bitmapLeftOnly ->Show(); - bitmapRightOnly ->Show(); - bitmapLeftNewer ->Show(); - bitmapRightNewer->Show(); - bitmapDifferent ->Hide(); - bitmapConflict ->Show(); - break; - - case CMP_BY_CONTENT: - buttonLeftOnly ->Show(); - buttonRightOnly ->Show(); - buttonLeftNewer ->Hide(); - buttonRightNewer->Hide(); - buttonDifferent ->Show(); - buttonConflict ->Show(); - - bitmapLeftOnly ->Show(); - bitmapRightOnly ->Show(); - bitmapLeftNewer ->Hide(); - bitmapRightNewer->Hide(); - bitmapDifferent ->Show(); - bitmapConflict ->Show(); - break; - } - - - switch (syncConfig.exLeftSideOnly) - { - case SYNC_DIR_RIGHT: - buttonLeftOnly->SetBitmapLabel(*GlobalResources::getInstance().bitmapArrowRightCr); - buttonLeftOnly->SetToolTip(getDescription(SO_CREATE_NEW_RIGHT)); - break; - case SYNC_DIR_LEFT: - buttonLeftOnly->SetBitmapLabel(*GlobalResources::getInstance().bitmapDeleteLeft); - buttonLeftOnly->SetToolTip(getDescription(SO_DELETE_LEFT)); - break; - case SYNC_DIR_NONE: - buttonLeftOnly->SetBitmapLabel(*GlobalResources::getInstance().bitmapArrowNone); - buttonLeftOnly->SetToolTip(getDescription(SO_DO_NOTHING)); - break; - } - - switch (syncConfig.exRightSideOnly) - { - case SYNC_DIR_RIGHT: - buttonRightOnly->SetBitmapLabel(*GlobalResources::getInstance().bitmapDeleteRight); - buttonRightOnly->SetToolTip(getDescription(SO_DELETE_RIGHT)); - break; - case SYNC_DIR_LEFT: - buttonRightOnly->SetBitmapLabel(*GlobalResources::getInstance().bitmapArrowLeftCr); - buttonRightOnly->SetToolTip(getDescription(SO_CREATE_NEW_LEFT)); - break; - case SYNC_DIR_NONE: - buttonRightOnly->SetBitmapLabel(*GlobalResources::getInstance().bitmapArrowNone); - buttonRightOnly->SetToolTip(getDescription(SO_DO_NOTHING)); - break; - } - - switch (syncConfig.leftNewer) - { - case SYNC_DIR_RIGHT: - buttonLeftNewer->SetBitmapLabel(*GlobalResources::getInstance().bitmapArrowRight); - buttonLeftNewer->SetToolTip(getDescription(SO_OVERWRITE_RIGHT)); - break; - case SYNC_DIR_LEFT: - buttonLeftNewer->SetBitmapLabel(*GlobalResources::getInstance().bitmapArrowLeft); - buttonLeftNewer->SetToolTip(getDescription(SO_OVERWRITE_LEFT)); - break; - case SYNC_DIR_NONE: - buttonLeftNewer->SetBitmapLabel(*GlobalResources::getInstance().bitmapArrowNone); - buttonLeftNewer->SetToolTip(getDescription(SO_DO_NOTHING)); - break; - } - - switch (syncConfig.rightNewer) - { - case SYNC_DIR_RIGHT: - buttonRightNewer->SetBitmapLabel(*GlobalResources::getInstance().bitmapArrowRight); - buttonRightNewer->SetToolTip(getDescription(SO_OVERWRITE_RIGHT)); - break; - case SYNC_DIR_LEFT: - buttonRightNewer->SetBitmapLabel(*GlobalResources::getInstance().bitmapArrowLeft); - buttonRightNewer->SetToolTip(getDescription(SO_OVERWRITE_LEFT)); - break; - case SYNC_DIR_NONE: - buttonRightNewer->SetBitmapLabel(*GlobalResources::getInstance().bitmapArrowNone); - buttonRightNewer->SetToolTip(getDescription(SO_DO_NOTHING)); - break; - } - - switch (syncConfig.different) - { - case SYNC_DIR_RIGHT: - buttonDifferent->SetBitmapLabel(*GlobalResources::getInstance().bitmapArrowRight); - buttonDifferent->SetToolTip(getDescription(SO_OVERWRITE_RIGHT)); - break; - case SYNC_DIR_LEFT: - buttonDifferent->SetBitmapLabel(*GlobalResources::getInstance().bitmapArrowLeft); - buttonDifferent->SetToolTip(getDescription(SO_OVERWRITE_LEFT)); - break; - case SYNC_DIR_NONE: - buttonDifferent->SetBitmapLabel(*GlobalResources::getInstance().bitmapArrowNone); - buttonDifferent->SetToolTip(getDescription(SO_DO_NOTHING)); - break; - } - - switch (syncConfig.conflict) - { - case SYNC_DIR_RIGHT: - buttonConflict->SetBitmapLabel(*GlobalResources::getInstance().bitmapArrowRight); - buttonConflict->SetToolTip(getDescription(SO_OVERWRITE_RIGHT)); - break; - case SYNC_DIR_LEFT: - buttonConflict->SetBitmapLabel(*GlobalResources::getInstance().bitmapArrowLeft); - buttonConflict->SetToolTip(getDescription(SO_OVERWRITE_LEFT)); - break; - case SYNC_DIR_NONE: - buttonConflict->SetBitmapLabel(*GlobalResources::getInstance().bitmapConflict); - buttonConflict->SetToolTip(_("Leave as unresolved conflict")); - break; - } -} - - -void SyncCfgDialog::OnClose(wxCloseEvent& event) -{ - EndModal(0); -} - - -void SyncCfgDialog::OnCancel(wxCommandEvent& event) -{ - EndModal(0); -} - - -void SyncCfgDialog::OnApply(wxCommandEvent& event) -{ - //write configuration to main dialog - refSyncConfiguration = localSyncConfiguration; - refHandleDeletion = getDeletionHandling(); - refCustomDeletionDirectory = m_textCtrlCustomDelFolder->GetValue(); - if (refIgnoreErrors) - *refIgnoreErrors = getErrorHandling(); - - EndModal(BUTTON_APPLY); -} - - -void updateToolTipErrorHandling(wxChoice* choiceHandleError, const xmlAccess::OnError value) -{ - switch (value) - { - case xmlAccess::ON_ERROR_POPUP: - choiceHandleError->SetToolTip(_("Show popup on errors or warnings")); - break; - case xmlAccess::ON_ERROR_IGNORE: - choiceHandleError->SetToolTip(_("Hide all error and warning messages")); - break; - case xmlAccess::ON_ERROR_EXIT: - choiceHandleError->SetToolTip(_("Exit immediately and set returncode < 0")); - break; - default: - assert(false); - choiceHandleError->SetToolTip(wxEmptyString); - } -} - - -bool SyncCfgDialog::getErrorHandling() -{ - if (m_choiceHandleError->GetSelection() == 1) //Ignore errors - return true; - else - return false; // Show popup -} - - -void SyncCfgDialog::setErrorHandling(bool ignoreErrors) -{ - m_choiceHandleError->Clear(); - m_choiceHandleError->Append(_("Show popup")); - m_choiceHandleError->Append(_("Ignore errors")); - - if (ignoreErrors) - m_choiceHandleError->SetSelection(1); - else - m_choiceHandleError->SetSelection(0); - - updateToolTipErrorHandling(m_choiceHandleError, ignoreErrors ? xmlAccess::ON_ERROR_IGNORE : xmlAccess::ON_ERROR_POPUP); -} - - -void SyncCfgDialog::OnChangeErrorHandling(wxCommandEvent& event) -{ - updateToolTipErrorHandling(m_choiceHandleError, getErrorHandling() ? xmlAccess::ON_ERROR_IGNORE : xmlAccess::ON_ERROR_POPUP); -} - -//------------------- - -void updateToolTipDeletionHandling(wxChoice* choiceHandleError, wxPanel* customDir, const FreeFileSync::DeletionPolicy value) -{ - customDir->Disable(); - - switch (value) - { - case FreeFileSync::DELETE_PERMANENTLY: - choiceHandleError->SetToolTip(_("Delete or overwrite files permanently.")); - break; - - case FreeFileSync::MOVE_TO_RECYCLE_BIN: - choiceHandleError->SetToolTip(_("Use Recycle Bin when deleting or overwriting files.")); - break; - - case FreeFileSync::MOVE_TO_CUSTOM_DIRECTORY: - choiceHandleError->SetToolTip(_("Move files to a user-defined directory.")); - customDir->Enable(); - break; - } -} - - -FreeFileSync::DeletionPolicy SyncCfgDialog::getDeletionHandling() -{ - switch (m_choiceHandleDeletion->GetSelection()) - { - case 0: - return FreeFileSync::DELETE_PERMANENTLY; - case 1: - return FreeFileSync::MOVE_TO_RECYCLE_BIN; - case 2: - return FreeFileSync::MOVE_TO_CUSTOM_DIRECTORY; - default: - assert(false); - return FreeFileSync::MOVE_TO_RECYCLE_BIN; - } -} - - -void SyncCfgDialog::setDeletionHandling(FreeFileSync::DeletionPolicy newValue) -{ - m_choiceHandleDeletion->Clear(); - m_choiceHandleDeletion->Append(_("Delete permanently")); - m_choiceHandleDeletion->Append(_("Use Recycle Bin")); - m_choiceHandleDeletion->Append(_("User-defined directory")); - - switch (newValue) - { - case FreeFileSync::DELETE_PERMANENTLY: - m_choiceHandleDeletion->SetSelection(0); - break; - case FreeFileSync::MOVE_TO_RECYCLE_BIN: - m_choiceHandleDeletion->SetSelection(1); - break; - case FreeFileSync::MOVE_TO_CUSTOM_DIRECTORY: - m_choiceHandleDeletion->SetSelection(2); - break; - } - - updateToolTipDeletionHandling(m_choiceHandleDeletion, m_panelCustomDeletionDir, newValue); -} - - -void SyncCfgDialog::OnChangeDeletionHandling(wxCommandEvent& event) -{ - updateToolTipDeletionHandling(m_choiceHandleDeletion, m_panelCustomDeletionDir, getDeletionHandling()); -} - - -void SyncCfgDialog::OnSyncLeftToRight(wxCommandEvent& event) -{ - localSyncConfiguration.setVariant(SyncConfiguration::MIRROR); - - updateConfigIcons(cmpVariant, localSyncConfiguration); - - //if event is triggered by button - m_radioBtn1->SetValue(true); -} - - -void SyncCfgDialog::OnSyncUpdate(wxCommandEvent& event) -{ - localSyncConfiguration.setVariant(SyncConfiguration::UPDATE); - - updateConfigIcons(cmpVariant, localSyncConfiguration); - - //if event is triggered by button - m_radioBtnUpdate->SetValue(true); -} - - -void SyncCfgDialog::OnSyncBothSides(wxCommandEvent& event) -{ - localSyncConfiguration.setVariant(SyncConfiguration::TWOWAY); - - updateConfigIcons(cmpVariant, localSyncConfiguration); - - //if event is triggered by button - m_radioBtn2->SetValue(true); -} - - -void toggleSyncDirection(SyncDirectionCfg& current) -{ - switch (current) - { - case SYNC_DIR_CFG_RIGHT: - current = SYNC_DIR_CFG_LEFT; - break; - case SYNC_DIR_CFG_LEFT: - current = SYNC_DIR_CFG_NONE; - break; - case SYNC_DIR_CFG_NONE: - current = SYNC_DIR_CFG_RIGHT; - break; - } -} - - -void SyncCfgDialog::OnExLeftSideOnly( wxCommandEvent& event ) -{ - toggleSyncDirection(localSyncConfiguration.exLeftSideOnly); - updateConfigIcons(cmpVariant, localSyncConfiguration); - //set custom config button - m_radioBtn3->SetValue(true); -} - - -void SyncCfgDialog::OnExRightSideOnly( wxCommandEvent& event ) -{ - toggleSyncDirection(localSyncConfiguration.exRightSideOnly); - updateConfigIcons(cmpVariant, localSyncConfiguration); - //set custom config button - m_radioBtn3->SetValue(true); -} - - -void SyncCfgDialog::OnLeftNewer( wxCommandEvent& event ) -{ - toggleSyncDirection(localSyncConfiguration.leftNewer); - updateConfigIcons(cmpVariant, localSyncConfiguration); - //set custom config button - m_radioBtn3->SetValue(true); -} - - -void SyncCfgDialog::OnRightNewer( wxCommandEvent& event ) -{ - toggleSyncDirection(localSyncConfiguration.rightNewer); - updateConfigIcons(cmpVariant, localSyncConfiguration); - //set custom config button - m_radioBtn3->SetValue(true); -} - - -void SyncCfgDialog::OnDifferent( wxCommandEvent& event ) -{ - toggleSyncDirection(localSyncConfiguration.different); - updateConfigIcons(cmpVariant, localSyncConfiguration); - //set custom config button - m_radioBtn3->SetValue(true); -} - - -void SyncCfgDialog::OnConflict(wxCommandEvent& event) -{ - toggleSyncDirection(localSyncConfiguration.conflict); - updateConfigIcons(cmpVariant, localSyncConfiguration); - //set custom config button - m_radioBtn3->SetValue(true); -} -//################################################################################################################################### - - -typedef FreeFileSync::FolderPairPanelBasic<BatchFolderPairGenerated> FolderPairParent; - -class BatchFolderPairPanel : public FolderPairParent -{ -public: - BatchFolderPairPanel(wxWindow* parent, BatchDialog* batchDialog) : - FolderPairParent(parent), - batchDlg(batchDialog) {} - -private: - virtual wxWindow* getParentWindow() - { - return batchDlg; - } - - virtual MainConfiguration getMainConfig() const - { - return batchDlg->getCurrentConfiguration().mainCfg; - } - - virtual void OnAltFilterCfgChange(bool defaultValueSet) - { - if (!defaultValueSet) - { - //activate filter - batchDlg->m_checkBoxFilter->SetValue(true); - batchDlg->updateVisibleTabs(); - } - } - - BatchDialog* batchDlg; -}; -//################################################################################################################################### - - -class BatchFileDropEvent : public wxFileDropTarget -{ -public: - BatchFileDropEvent(BatchDialog* dlg) : - batchDlg(dlg) {} - - virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames) - { - if (!filenames.IsEmpty()) - { - const wxString droppedFileName = filenames[0]; - - xmlAccess::XmlType fileType = xmlAccess::getXmlType(droppedFileName); - - //test if ffs batch file has been dropped - if (fileType == xmlAccess::XML_BATCH_CONFIG) - batchDlg->loadBatchFile(droppedFileName); - else - { - wxString errorMessage = _("%x is not a valid FreeFileSync batch file!"); - errorMessage.Replace(wxT("%x"), wxString(wxT("\"")) + droppedFileName + wxT("\""), false); - wxMessageBox(errorMessage, _("Error"), wxOK | wxICON_ERROR); - } - } - return false; - } - -private: - BatchDialog* batchDlg; -}; - - -BatchDialog::BatchDialog(wxWindow* window, const xmlAccess::XmlBatchConfig& batchCfg) : - BatchDlgGenerated(window) -{ - init(); - loadBatchCfg(batchCfg); -} - - -BatchDialog::BatchDialog(wxWindow* window, const wxString& filename) : - BatchDlgGenerated(window) -{ - init(); - loadBatchFile(filename); -} - - -void BatchDialog::init() -{ - //prepare drag & drop for loading of *.ffs_batch files - SetDropTarget(new BatchFileDropEvent(this)); - dragDropOnLogfileDir.reset(new DragDropOnDlg(m_panelLogging, m_dirPickerLogfileDir, m_textCtrlLogfileDir)); - - //support for drag and drop on main pair - dragDropOnLeft.reset( new DragDropOnDlg(m_panelLeft, m_dirPickerLeft, m_directoryLeft)); - dragDropOnRight.reset(new DragDropOnDlg(m_panelRight, m_dirPickerRight, m_directoryRight)); - - dragDropCustomDelFolder.reset(new DragDropOnDlg(m_panelCustomDeletionDir, m_dirPickerCustomDelFolder, m_textCtrlCustomDelFolder)); - - - //set icons for this dialog - m_bpButtonAddPair->SetBitmapLabel(*GlobalResources::getInstance().bitmapAddFolderPair); - m_bitmapLeftOnly->SetBitmap(*GlobalResources::getInstance().bitmapLeftOnly); - m_bitmapRightOnly->SetBitmap(*GlobalResources::getInstance().bitmapRightOnly); - m_bitmapLeftNewer->SetBitmap(*GlobalResources::getInstance().bitmapLeftNewer); - m_bitmapRightNewer->SetBitmap(*GlobalResources::getInstance().bitmapRightNewer); - m_bitmapDifferent->SetBitmap(*GlobalResources::getInstance().bitmapDifferent); - m_bitmapConflict->SetBitmap(*GlobalResources::getInstance().bitmapConflictGrey); - m_bitmap8->SetBitmap(*GlobalResources::getInstance().bitmapInclude); - m_bitmap9->SetBitmap(*GlobalResources::getInstance().bitmapExclude); - m_bitmap27->SetBitmap(*GlobalResources::getInstance().bitmapBatch); - - m_buttonSave->SetFocus(); -} - -//------------------- error handling -------------------------- - -xmlAccess::OnError BatchDialog::getSelectionHandleError() const -{ - switch (m_choiceHandleError->GetSelection()) - { - case 0: - return xmlAccess::ON_ERROR_POPUP; - case 1: - return xmlAccess::ON_ERROR_IGNORE; - case 2: - return xmlAccess::ON_ERROR_EXIT; - default: - assert(false); - return xmlAccess::ON_ERROR_POPUP; - } -} - - -void BatchDialog::setSelectionHandleError(const xmlAccess::OnError value) -{ - m_choiceHandleError->Clear(); - m_choiceHandleError->Append(_("Show popup")); - m_choiceHandleError->Append(_("Ignore errors")); - m_choiceHandleError->Append(_("Exit with RC < 0")); - - switch (value) - { - case xmlAccess::ON_ERROR_POPUP: - m_choiceHandleError->SetSelection(0); - break; - case xmlAccess::ON_ERROR_IGNORE: - m_choiceHandleError->SetSelection(1); - break; - case xmlAccess::ON_ERROR_EXIT: - m_choiceHandleError->SetSelection(2); - break; - default: - assert(false); - m_choiceHandleError->SetSelection(0); - } - - updateToolTipErrorHandling(m_choiceHandleError, getSelectionHandleError()); -} - - -void BatchDialog::OnChangeErrorHandling(wxCommandEvent& event) -{ - updateToolTipErrorHandling(m_choiceHandleError, getSelectionHandleError()); -} - - -void BatchDialog::OnExLeftSideOnly(wxCommandEvent& event) -{ - toggleSyncDirection(localSyncConfiguration.exLeftSideOnly); - updateConfigIcons(getCurrentCompareVar(), localSyncConfiguration); -} - - -//------------------- deletion handling -------------------------- - -FreeFileSync::DeletionPolicy BatchDialog::getDeletionHandling() const -{ - switch (m_choiceHandleDeletion->GetSelection()) - { - case 0: - return FreeFileSync::DELETE_PERMANENTLY; - case 1: - return FreeFileSync::MOVE_TO_RECYCLE_BIN; - case 2: - return FreeFileSync::MOVE_TO_CUSTOM_DIRECTORY; - default: - assert(false); - return FreeFileSync::MOVE_TO_RECYCLE_BIN; - } -} - - -void BatchDialog::setDeletionHandling(FreeFileSync::DeletionPolicy newValue) -{ - m_choiceHandleDeletion->Clear(); - m_choiceHandleDeletion->Append(_("Delete permanently")); - m_choiceHandleDeletion->Append(_("Use Recycle Bin")); - m_choiceHandleDeletion->Append(_("User-defined directory")); - - switch (newValue) - { - case FreeFileSync::DELETE_PERMANENTLY: - m_choiceHandleDeletion->SetSelection(0); - break; - case FreeFileSync::MOVE_TO_RECYCLE_BIN: - m_choiceHandleDeletion->SetSelection(1); - break; - case FreeFileSync::MOVE_TO_CUSTOM_DIRECTORY: - m_choiceHandleDeletion->SetSelection(2); - break; - } - - updateToolTipDeletionHandling(m_choiceHandleDeletion, m_panelCustomDeletionDir, newValue); -} - - -void BatchDialog::OnChangeDeletionHandling(wxCommandEvent& event) -{ - updateToolTipDeletionHandling(m_choiceHandleDeletion, m_panelCustomDeletionDir, getDeletionHandling()); -} - - - -void BatchDialog::OnExRightSideOnly(wxCommandEvent& event) -{ - toggleSyncDirection(localSyncConfiguration.exRightSideOnly); - updateConfigIcons(getCurrentCompareVar(), localSyncConfiguration); -} - - -void BatchDialog::OnLeftNewer(wxCommandEvent& event) -{ - toggleSyncDirection(localSyncConfiguration.leftNewer); - updateConfigIcons(getCurrentCompareVar(), localSyncConfiguration); -} - - -void BatchDialog::OnRightNewer(wxCommandEvent& event) -{ - toggleSyncDirection(localSyncConfiguration.rightNewer); - updateConfigIcons(getCurrentCompareVar(), localSyncConfiguration); -} - - -void BatchDialog::OnDifferent(wxCommandEvent& event) -{ - toggleSyncDirection(localSyncConfiguration.different); - updateConfigIcons(getCurrentCompareVar(), localSyncConfiguration); -} - - -void BatchDialog::OnConflict(wxCommandEvent& event) -{ - toggleSyncDirection(localSyncConfiguration.conflict); - updateConfigIcons(getCurrentCompareVar(), localSyncConfiguration); -} - - -void BatchDialog::OnCheckFilter(wxCommandEvent& event) -{ - updateVisibleTabs(); -} - - -void BatchDialog::OnCheckLogging(wxCommandEvent& event) -{ - updateVisibleTabs(); -} - - -void BatchDialog::updateVisibleTabs() -{ - showNotebookpage(m_panelFilter, _("Filter"), m_checkBoxFilter->GetValue()); - showNotebookpage(m_panelLogging, _("Logging"), m_checkBoxSilent->GetValue()); -} - - -void BatchDialog::showNotebookpage(wxWindow* page, const wxString& pageName, bool show) -{ - int windowPosition = -1; - for (size_t i = 0; i < m_notebookSettings->GetPageCount(); ++i) - if ( static_cast<wxWindow*>(m_notebookSettings->GetPage(i)) == - static_cast<wxWindow*>(page)) - { - windowPosition = i; - break; - } - - if (show) - { - if (windowPosition == -1) - m_notebookSettings->AddPage(page, pageName, false); - } - else - { - if (windowPosition != -1) - { - //do not delete currently selected tab!! - if (m_notebookSettings->GetCurrentPage() == m_notebookSettings->GetPage(windowPosition)) - m_notebookSettings->ChangeSelection(0); - - m_notebookSettings->RemovePage(windowPosition); - } - } -} - - -CompareVariant BatchDialog::getCurrentCompareVar() const -{ - if (m_radioBtnSizeDate->GetValue()) - return CMP_BY_TIME_SIZE; - else if (m_radioBtnContent->GetValue()) - return CMP_BY_CONTENT; - else - { - assert(false); - return CMP_BY_TIME_SIZE; - } -} - - -void BatchDialog::updateConfigIcons(const FreeFileSync::CompareVariant cmpVar, const FreeFileSync::SyncConfiguration& syncConfig) -{ - SyncCfgDialog::updateConfigIcons(cmpVar, - syncConfig, - m_bpButtonLeftOnly, - m_bpButtonRightOnly, - m_bpButtonLeftNewer, - m_bpButtonRightNewer, - m_bpButtonDifferent, - m_bpButtonConflict, - m_bitmapLeftOnly, - m_bitmapRightOnly, - m_bitmapLeftNewer, - m_bitmapRightNewer, - m_bitmapDifferent, - m_bitmapConflict); -} - - -void BatchDialog::OnChangeCompareVar(wxCommandEvent& event) -{ - updateConfigIcons(getCurrentCompareVar(), localSyncConfiguration); - - m_panelOverview->Layout(); //needed - Fit(); -} - - -void BatchDialog::OnClose(wxCloseEvent& event) -{ - EndModal(0); -} - - -void BatchDialog::OnCancel(wxCommandEvent& event) -{ - EndModal(0); -} - - -void BatchDialog::OnSaveBatchJob(wxCommandEvent& event) -{ - //get a filename - const wxString defaultFileName = proposedBatchFileName.empty() ? wxT("SyncJob.ffs_batch") : proposedBatchFileName; - - wxFileDialog* filePicker = new wxFileDialog(this, wxEmptyString, wxEmptyString, defaultFileName, wxString(_("FreeFileSync batch file")) + wxT(" (*.ffs_batch)|*.ffs_batch"), wxFD_SAVE); - if (filePicker->ShowModal() == wxID_OK) - { - const wxString newFileName = filePicker->GetPath(); - if (FreeFileSync::fileExists(newFileName.c_str())) - { - wxMessageDialog* messageDlg = new wxMessageDialog(this, wxString(_("File already exists. Overwrite?")) + wxT(" \"") + newFileName + wxT("\""), _("Warning") , wxOK | wxCANCEL); - - if (messageDlg->ShowModal() != wxID_OK) - { - OnSaveBatchJob(event); //retry - return; - } - } - - //create batch file - if (saveBatchFile(newFileName)) - EndModal(BATCH_FILE_SAVED); - } -} - - -void BatchDialog::OnLoadBatchJob(wxCommandEvent& event) -{ - wxFileDialog* filePicker = new wxFileDialog(this, wxEmptyString, wxEmptyString, wxEmptyString, wxString(_("FreeFileSync batch file")) + wxT(" (*.ffs_batch)|*.ffs_batch"), wxFD_OPEN);; - if (filePicker->ShowModal() == wxID_OK) - loadBatchFile(filePicker->GetPath()); -} - - - -inline -FolderPairEnh getEnahncedPair(const BatchFolderPairPanel* panel) -{ - return FolderPairEnh(panel->m_directoryLeft->GetValue().c_str(), - panel->m_directoryRight->GetValue().c_str(), - panel->altSyncConfig, - panel->altFilter); -} - - -xmlAccess::XmlBatchConfig BatchDialog::getCurrentConfiguration() const -{ - xmlAccess::XmlBatchConfig batchCfg; - - //load structure with basic settings "mainCfg" - batchCfg.mainCfg.compareVar = getCurrentCompareVar(); - batchCfg.mainCfg.syncConfiguration = localSyncConfiguration; - batchCfg.mainCfg.filterIsActive = m_checkBoxFilter->GetValue(); - batchCfg.mainCfg.includeFilter = m_textCtrlInclude->GetValue(); - batchCfg.mainCfg.excludeFilter = m_textCtrlExclude->GetValue(); - batchCfg.mainCfg.handleDeletion = getDeletionHandling(); - batchCfg.mainCfg.customDeletionDirectory = m_textCtrlCustomDelFolder->GetValue(); - - //main pair - batchCfg.mainCfg.mainFolderPair.leftDirectory = m_directoryLeft->GetValue().c_str(); - batchCfg.mainCfg.mainFolderPair.rightDirectory = m_directoryRight->GetValue().c_str(); - - //add additional pairs - batchCfg.mainCfg.additionalPairs.clear(); - std::transform(additionalFolderPairs.begin(), additionalFolderPairs.end(), - std::back_inserter(batchCfg.mainCfg.additionalPairs), getEnahncedPair); - - - //load structure with batch settings "batchCfg" - batchCfg.silent = m_checkBoxSilent->GetValue(); - batchCfg.handleError = getSelectionHandleError(); - batchCfg.logFileDirectory = m_textCtrlLogfileDir->GetValue(); - - return batchCfg; -} - - -bool BatchDialog::saveBatchFile(const wxString& filename) -{ - const xmlAccess::XmlBatchConfig batchCfg = getCurrentConfiguration(); - - //write config to XML - try - { - xmlAccess::writeBatchConfig(batchCfg, filename); - } - catch (const xmlAccess::XmlError& error) - { - wxMessageBox(error.show().c_str(), _("Error"), wxOK | wxICON_ERROR); - return false; - } - - SetTitle(wxString(_("Create a batch job")) + wxT(" - ") + filename); - proposedBatchFileName = filename; //may be used on next save - - return true; -} - - -void BatchDialog::loadBatchFile(const wxString& filename) -{ - //load XML settings - xmlAccess::XmlBatchConfig batchCfg; //structure to receive gui settings - try - { - xmlAccess::readBatchConfig(filename, batchCfg); - } - catch (const xmlAccess::XmlError& error) - { - if (error.getSeverity() == xmlAccess::XmlError::WARNING) - wxMessageBox(error.show(), _("Warning"), wxOK | wxICON_WARNING); - else - { - wxMessageBox(error.show(), _("Error"), wxOK | wxICON_ERROR); - return; - } - } - - SetTitle(wxString(_("Create a batch job")) + wxT(" - ") + filename); - proposedBatchFileName = filename; //may be used on next save - this->loadBatchCfg(batchCfg); -} - - -void BatchDialog::loadBatchCfg(const xmlAccess::XmlBatchConfig& batchCfg) -{ - wxWindowUpdateLocker dummy(this); //avoid display distortion - - //make working copy of mainDialog.cfg.syncConfiguration and recycler setting - localSyncConfiguration = batchCfg.mainCfg.syncConfiguration; - - setDeletionHandling(batchCfg.mainCfg.handleDeletion); - m_textCtrlCustomDelFolder->SetValue(batchCfg.mainCfg.customDeletionDirectory); - - setSelectionHandleError(batchCfg.handleError); - - switch (batchCfg.mainCfg.compareVar) - { - case CMP_BY_TIME_SIZE: - m_radioBtnSizeDate->SetValue(true); - break; - case CMP_BY_CONTENT: - m_radioBtnContent->SetValue(true); - break; - } - - updateConfigIcons(batchCfg.mainCfg.compareVar, batchCfg.mainCfg.syncConfiguration); - - m_checkBoxFilter->SetValue(batchCfg.mainCfg.filterIsActive); - m_textCtrlInclude->SetValue(batchCfg.mainCfg.includeFilter); - m_textCtrlExclude->SetValue(batchCfg.mainCfg.excludeFilter); - - m_checkBoxSilent->SetValue(batchCfg.silent); - m_textCtrlLogfileDir->SetValue(batchCfg.logFileDirectory); - - - //set main folder pair - FreeFileSync::setDirectoryName(batchCfg.mainCfg.mainFolderPair.leftDirectory.c_str(), m_directoryLeft, m_dirPickerLeft); - FreeFileSync::setDirectoryName(batchCfg.mainCfg.mainFolderPair.rightDirectory.c_str(), m_directoryRight, m_dirPickerRight); - - //remove existing additional folder pairs - clearAddFolderPairs(); - - //set additional pairs - addFolderPair(batchCfg.mainCfg.additionalPairs); - - updateVisibleTabs(); - - Fit(); //needed - Refresh(); //needed - Centre(); -} - - -void BatchDialog::OnAddFolderPair(wxCommandEvent& event) -{ - std::vector<FolderPairEnh> newPairs; - newPairs.push_back( - FolderPairEnh(Zstring(), - Zstring(), - boost::shared_ptr<AlternateSyncConfig>(), - boost::shared_ptr<AlternateFilter>())); - - addFolderPair(newPairs, false); //add pair at the end of additional pairs -} - - -void BatchDialog::OnRemoveFolderPair(wxCommandEvent& event) -{ - //find folder pair originating the event - const wxObject* const eventObj = event.GetEventObject(); - for (std::vector<BatchFolderPairPanel*>::const_iterator i = additionalFolderPairs.begin(); i != additionalFolderPairs.end(); ++i) - { - if (eventObj == static_cast<wxObject*>((*i)->m_bpButtonRemovePair)) - { - removeAddFolderPair(i - additionalFolderPairs.begin()); - return; - } - } -} - - -void BatchDialog::OnRemoveTopFolderPair(wxCommandEvent& event) -{ - if (additionalFolderPairs.size() > 0) - { - const wxString leftDir = (*additionalFolderPairs.begin())->m_directoryLeft ->GetValue().c_str(); - const wxString rightDir = (*additionalFolderPairs.begin())->m_directoryRight->GetValue().c_str(); - - FreeFileSync::setDirectoryName(leftDir, m_directoryLeft, m_dirPickerLeft); - FreeFileSync::setDirectoryName(rightDir, m_directoryRight, m_dirPickerRight); - - removeAddFolderPair(0); //remove first of additional folder pairs - } -} - - -const size_t MAX_FOLDER_PAIRS = 3; - - -void BatchDialog::addFolderPair(const std::vector<FreeFileSync::FolderPairEnh>& newPairs, bool addFront) -{ - if (newPairs.size() == 0) - return; - - wxWindowUpdateLocker dummy(m_panelOverview); //avoid display distortion - - //add folder pairs - int pairHeight = 0; - for (std::vector<FreeFileSync::FolderPairEnh>::const_iterator i = newPairs.begin(); i != newPairs.end(); ++i) - { - BatchFolderPairPanel* newPair = new BatchFolderPairPanel(m_scrolledWindow6, this); - - if (addFront) - { - bSizerAddFolderPairs->Insert(0, newPair, 0, wxEXPAND, 5); - additionalFolderPairs.insert(additionalFolderPairs.begin(), newPair); - } - else - { - bSizerAddFolderPairs->Add(newPair, 0, wxEXPAND, 5); - additionalFolderPairs.push_back(newPair); - } - - //get size of scrolled window - pairHeight = newPair->GetSize().GetHeight(); - - //register events - newPair->m_bpButtonRemovePair->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(BatchDialog::OnRemoveFolderPair), NULL, this ); - - //insert directory names - FreeFileSync::setDirectoryName(i->leftDirectory.c_str(), newPair->m_directoryLeft, newPair->m_dirPickerLeft); - FreeFileSync::setDirectoryName(i->rightDirectory.c_str(), newPair->m_directoryRight, newPair->m_dirPickerRight); - - //set alternate configuration - newPair->altSyncConfig = i->altSyncConfig; - newPair->altFilter = i->altFilter; - newPair->updateAltButtonColor(); - } - //set size of scrolled window - const int visiblePairs = std::min(additionalFolderPairs.size() + 1, MAX_FOLDER_PAIRS); //up to MAX_FOLDER_PAIRS pairs shall be shown - m_scrolledWindow6->SetMinSize(wxSize( -1, pairHeight * visiblePairs)); - - //update controls - m_scrolledWindow6->Fit(); //adjust scrolled window size - m_panelOverview->Layout(); //adjust stuff inside scrolled window - Fit(); //adapt dialog size - - //after changing folder pairs window focus is lost: results in scrolled window scrolling to top each time window is shown: we don't want this - m_bpButtonLeftOnly->SetFocus(); -} - - -void BatchDialog::removeAddFolderPair(const int pos) -{ - if (0 <= pos && pos < static_cast<int>(additionalFolderPairs.size())) - { - wxWindowUpdateLocker dummy(m_panelOverview); //avoid display distortion - - //remove folder pairs from window - BatchFolderPairPanel* pairToDelete = additionalFolderPairs[pos]; - const int pairHeight = pairToDelete->GetSize().GetHeight(); - - bSizerAddFolderPairs->Detach(pairToDelete); //Remove() does not work on Window*, so do it manually - pairToDelete->Destroy(); // - additionalFolderPairs.erase(additionalFolderPairs.begin() + pos); //remove last element in vector - - //set size of scrolled window - const int visiblePairs = std::min(additionalFolderPairs.size() + 1, MAX_FOLDER_PAIRS); //up to MAX_FOLDER_PAIRS pairs shall be shown - m_scrolledWindow6->SetMinSize(wxSize(-1, pairHeight * visiblePairs)); - - //update controls - m_scrolledWindow6->Fit(); //adjust scrolled window size - m_panelOverview->Layout(); //adjust stuff inside scrolled window - - m_panelOverview->InvalidateBestSize(); //needed for Fit() to work correctly! - Fit(); //adapt dialog size - - //after changing folder pairs window focus is lost: results in scrolled window scrolling to top each time window is shown: we don't want this - m_bpButtonLeftOnly->SetFocus(); - } -} - - -void BatchDialog::clearAddFolderPairs() -{ - wxWindowUpdateLocker dummy(m_panelOverview); //avoid display distortion - - additionalFolderPairs.clear(); - bSizerAddFolderPairs->Clear(true); - - m_scrolledWindow6->SetMinSize(wxSize(-1, sbSizerMainPair->GetSize().GetHeight())); //respect height of main pair -} - - -/* -#ifdef FFS_WIN -#include <wx/msw/wrapwin.h> //includes "windows.h" -#include <shlobj.h> -#endif // FFS_WIN - -template <typename T> -struct CleanUp -{ - CleanUp(T* element) : m_element(element) {} - - ~CleanUp() - { - m_element->Release(); - } - - T* m_element; -}; - - -bool BatchDialog::createBatchFile(const wxString& filename) -{ - //create shell link (instead of batch file) for full Unicode support - HRESULT hResult = E_FAIL; - IShellLink* pShellLink = NULL; - - if (FAILED(CoCreateInstance(CLSID_ShellLink, //class identifier - NULL, //object isn't part of an aggregate - CLSCTX_INPROC_SERVER, //context for running executable code - IID_IShellLink, //interface identifier - (void**)&pShellLink))) //pointer to storage of interface pointer - return false; - CleanUp<IShellLink> cleanOnExit(pShellLink); - - wxString freeFileSyncExe = wxStandardPaths::Get().GetExecutablePath(); - if (FAILED(pShellLink->SetPath(freeFileSyncExe.c_str()))) - return false; - - if (FAILED(pShellLink->SetArguments(getCommandlineArguments().c_str()))) - return false; - - if (FAILED(pShellLink->SetIconLocation(freeFileSyncExe.c_str(), 1))) //second icon from executable file is used - return false; - - if (FAILED(pShellLink->SetDescription(_("FreeFileSync Batch Job")))) - return false; - - IPersistFile* pPersistFile = NULL; - if (FAILED(pShellLink->QueryInterface(IID_IPersistFile, (void**)&pPersistFile))) - return false; - CleanUp<IPersistFile> cleanOnExit2(pPersistFile); - - //pPersistFile->Save accepts unicode input only -#ifdef _UNICODE - hResult = pPersistFile->Save(filename.c_str(), TRUE); -#else - WCHAR wszTemp [MAX_PATH]; - if (MultiByteToWideChar(CP_ACP, 0, filename.c_str(), -1, wszTemp, MAX_PATH) == 0) - return false; - - hResult = pPersistFile->Save(wszTemp, TRUE); -#endif - if (FAILED(hResult)) - return false; - - return true; -} -*/ |