diff options
41 files changed, 6942 insertions, 6034 deletions
diff --git a/Application.cpp b/Application.cpp index c7a0beda..1ff7c029 100644 --- a/Application.cpp +++ b/Application.cpp @@ -16,6 +16,9 @@ #include <wx/msgdlg.h> #include "library/processXml.h" #include <wx/stopwatch.h> +#include "comparison.h" +#include "synchronization.h" +#include "algorithm.h" using namespace xmlAccess; @@ -54,7 +57,7 @@ bool Application::OnInit() } catch (const FileError& error) { - if (wxFileExists(FreeFileSync::FfsGlobalSettingsFile)) + if (wxFileExists(FreeFileSync::GLOBAL_CONFIG_FILE)) { //show messagebox and quit program immediately wxMessageBox(error.show(), _("Error"), wxOK | wxICON_ERROR); return false; @@ -102,7 +105,7 @@ void Application::initialize() } else //start in GUI mode (standard) { - MainDialog* frame = new MainDialog(NULL, FreeFileSync::FfsLastConfigFile, &programLanguage, globalSettings); + MainDialog* frame = new MainDialog(NULL, FreeFileSync::LAST_CONFIG_FILE, &programLanguage, globalSettings); frame->SetIcon(*globalResource.programIcon); //set application icon frame->Show(); } @@ -167,13 +170,15 @@ public: readyToWrite = logFile.IsOpened(); if (readyToWrite) { - logFile.Write(wxString(_("FreeFileSync (Date: ")) + wxDateTime::Now().FormatDate() + _(" Time: ") + wxDateTime::Now().FormatTime() + wxT(")") + wxChar('\n')); - logFile.Write(wxString(_("-------------------------------------------------")) + wxChar('\n')); - logFile.Write(wxChar('\n')); - logFile.Write(_("Log-messages:\n-------------")); - logFile.Write(wxChar('\n')); - write(_("Start")); - logFile.Write(wxChar('\n')); + wxString headerLine = wxString(wxT("FreeFileSync (")) + _("Date: ") + wxDateTime::Now().FormatDate() + wxT(" ") + _("Time: ") + wxDateTime::Now().FormatTime() + wxT(")"); + logFile.Write(headerLine + wxChar('\n')); + logFile.Write(wxString().Pad(headerLine.Len(), wxChar('-')) + wxChar('\n') + wxChar('\n')); + + wxString caption = _("Log-messages:"); + logFile.Write(caption + wxChar('\n')); + logFile.Write(wxString().Pad(caption.Len(), wxChar('-')) + wxChar('\n')); + + write(wxString(_("Start")) + wxChar('\n')); totalTime.Start(); //measure total time } @@ -250,7 +255,7 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet } //all settings have been read successfully... - applicationRunsInBatchWithoutWindows = batchCfg.silent; //this value is needed for the application to decide whether to wait for windows to close or not + applicationRunsInBatchWithoutWindows = batchCfg.silent; //this value is needed for the application to decide whether to wait for all windows to close or not //format directory names for (vector<FolderPair>::iterator i = batchCfg.directoryPairs.begin(); i != batchCfg.directoryPairs.end(); ++i) @@ -272,53 +277,120 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet } - //check if directories exist - wxString errorMessage; - if (!FreeFileSync::foldersAreValidForComparison(batchCfg.directoryPairs, errorMessage)) + //begin of synchronization process (all in one try-catch block) + try { - if (batchCfg.silent) + FileCompareResult currentGridData; + //class handling status updates and error messages + BatchStatusUpdater statusUpdater(batchCfg.mainCfg.ignoreErrors, batchCfg.silent, log); + + //test existence of Recycle Bin + if (batchCfg.mainCfg.useRecycleBin) { - log->write(errorMessage, _("Warning")); - log->close(_("Synchronization aborted!")); + if (!FreeFileSync::recycleBinExists()) + { + statusUpdater.setFinalStatus(_("Unable to initialize Recycle Bin!"), SyncStatus::ABORTED); + returnValue = -2; + return; + } } - else wxMessageBox(errorMessage + wxT("\n\n") + _("Synchronization aborted!"), _("Warning"), wxICON_WARNING); - returnValue = -2; - return; - } + //check if directories are valid + wxString errorMessage; + if (!FreeFileSync::foldersAreValidForComparison(batchCfg.directoryPairs, errorMessage)) + { + statusUpdater.setFinalStatus(errorMessage, SyncStatus::ABORTED); + returnValue = -2; + return; + } - //test existence of Recycle Bin - if (batchCfg.mainCfg.useRecycleBin) - { - if (!FreeFileSync::recycleBinExists()) + //check if folders have dependencies + if (globalSettings.global.folderDependCheckActive) { - wxString errorMessage = wxString(_("Unable to initialize Recycle Bin!")); - wxString statusMessage = wxString(_("Synchronization aborted!")); - if (batchCfg.silent) + wxString warningMessage; + if (FreeFileSync::foldersHaveDependencies(batchCfg.directoryPairs, warningMessage)) { - log->write(errorMessage, _("Error")); - log->close(statusMessage); + //abort if in silent mode + if (batchCfg.silent) + { + statusUpdater.setFinalStatus(warningMessage, SyncStatus::ABORTED); + returnValue = -2; + return; + } + + //non silent mode: offer possibility to ignore issue + bool hideThisDialog = false; + wxString messageText = warningMessage + wxT("\n\n") + + _("Consider this when setting up synchronization rules: You might want to avoid write access to these directories so that synchronization of both does not interfere."); + + //show popup and ask user how to handle warning + WarningDlg* warningDlg = new WarningDlg(statusUpdater.getWindow(), WarningDlg::BUTTON_IGNORE | WarningDlg::BUTTON_ABORT, messageText, hideThisDialog); + if (warningDlg->ShowModal() == WarningDlg::BUTTON_ABORT) + { + statusUpdater.setFinalStatus(warningMessage, SyncStatus::ABORTED); + returnValue = -2; + return; + } + else + globalSettings.global.folderDependCheckActive = !hideThisDialog; } - else wxMessageBox(errorMessage + wxT("\n\n") + statusMessage, _("Error"), wxICON_WARNING); - - returnValue = -2; - return; } - } - //begin of synchronization process (all in one try-catch block) - try - { - FileCompareResult currentGridData; - //class handling status updates and error messages - BatchStatusUpdater statusUpdater(batchCfg.mainCfg.continueOnError, batchCfg.silent, log); //COMPARE DIRECTORIES - FreeFileSync::startCompareProcess(batchCfg.directoryPairs, - batchCfg.mainCfg.compareVar, - currentGridData, - &statusUpdater); + bool lineBreakOnMessages = !batchCfg.silent; + FreeFileSync::CompareProcess comparison(lineBreakOnMessages, &statusUpdater); + comparison.startCompareProcess(batchCfg.directoryPairs, + batchCfg.mainCfg.compareVar, + currentGridData); + +#ifdef FFS_WIN + //check if DST time correction needs to be applied + if (globalSettings.global.dstCheckActive) + { + int timeShift = 0; + wxString driveName; + FreeFileSync::checkForDSTChange(currentGridData, batchCfg.directoryPairs, timeShift, driveName); + if (timeShift) + { + //abort if in silent mode + if (batchCfg.silent) + { + statusUpdater.setFinalStatus(_("Daylight saving time change detected for FAT/FAT32 drive."), SyncStatus::ABORTED); + returnValue = -2; + return; + } + + //non silent mode: offer possibility to resolve issue + bool hideThisDialog = false; + wxString errorMessage = wxString(_("A file time shift due to a daylight saving time change was detected for a FAT/FAT32 drive.")) + wxT("\n") + + _("You can adjust the file times accordingly to resolve the issue:"); + errorMessage+= wxString(wxT("\n\n")) + _("Drive:") + wxT(" ") + driveName + wxT("\n") + + _("Time shift:") + wxT(" ") + globalFunctions::numberToWxString(timeShift); + + //show popup and ask user how to handle the DST change + WarningDlg* warningDlg = new WarningDlg(statusUpdater.getWindow(), WarningDlg::BUTTON_RESOLVE | WarningDlg::BUTTON_IGNORE, errorMessage, hideThisDialog); + warningDlg->m_bitmap10->SetBitmap(*globalResource.bitmapClock); + + if (warningDlg->ShowModal() == WarningDlg::BUTTON_RESOLVE) + { + ModifyFilesDlg* modifyDlg = new ModifyFilesDlg(NULL, driveName, timeShift); + modifyDlg->ShowModal(); + delete modifyDlg; + + //exit batch processing + statusUpdater.setFinalStatus(wxString(_("Daylight saving time change detected for FAT/FAT32 drive.")) + wxT("\n\n") + + _("Please restart synchronization!"), SyncStatus::ABORTED); + returnValue = -2; + return; + } + else + globalSettings.global.dstCheckActive = !hideThisDialog; + } + } +#endif //FFS_WIN + //APPLY FILTERS if (batchCfg.mainCfg.filterIsActive) @@ -337,14 +409,14 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet batchCfg.mainCfg.syncConfiguration); if (objectsToCreate + objectsToOverwrite + objectsToDelete == 0) { - statusUpdater.noSynchronizationNeeded(); //inform about this special case - - returnValue = -3; + statusUpdater.setFinalStatus(_("Nothing to synchronize. Both directories adhere to the sync-configuration!"), SyncStatus::FINISHED_WITH_SUCCESS); //inform about this special case + returnValue = 0; return; } //START SYNCHRONIZATION - FreeFileSync::startSynchronizationProcess(currentGridData, batchCfg.mainCfg.syncConfiguration, &statusUpdater, batchCfg.mainCfg.useRecycleBin); + FreeFileSync::SyncProcess synchronization(batchCfg.mainCfg.useRecycleBin, lineBreakOnMessages, &statusUpdater); + synchronization.startSynchronizationProcess(currentGridData, batchCfg.mainCfg.syncConfiguration); } catch (AbortThisProcess& theException) //exit used by statusUpdater { @@ -357,12 +429,11 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet //###################################################################################################### -BatchStatusUpdater::BatchStatusUpdater(bool continueOnError, bool silent, LogFile* log) : +BatchStatusUpdater::BatchStatusUpdater(bool ignoreAllErrors, bool silent, LogFile* log) : m_log(log), - continueErrors(continueOnError), + ignoreErrors(ignoreAllErrors), silentMode(silent), - currentProcess(StatusHandler::PROCESS_NONE), - synchronizationNeeded(true) + currentProcess(StatusHandler::PROCESS_NONE) { if (!silentMode) { @@ -379,16 +450,14 @@ BatchStatusUpdater::~BatchStatusUpdater() //output the result if (silentMode) { - if (abortionRequested) + if (!customStatusMessage.IsEmpty()) + m_log->close(customStatusMessage); + else if (abortRequested) m_log->close(_("Synchronization aborted!")); else if (failedItems) m_log->close(_("Synchronization completed with errors!")); else - { - if (!synchronizationNeeded) - m_log->write(_("Nothing to synchronize. Both directories adhere to the sync-configuration!"), _("Info")); m_log->close(_("Synchronization completed successfully.")); - } } else { @@ -402,7 +471,13 @@ BatchStatusUpdater::~BatchStatusUpdater() } //notify to syncStatusFrame that current process has ended - if (abortionRequested) + if (!customStatusMessage.IsEmpty()) //custom status message written by service consumer + { + finalMessage+= customStatusMessage; + syncStatusFrame->setStatusText_NoUpdate(finalMessage); + syncStatusFrame->processHasFinished(customStatusId); + } + else if (abortRequested) { finalMessage+= _("Synchronization aborted!"); syncStatusFrame->setStatusText_NoUpdate(finalMessage); @@ -416,11 +491,7 @@ BatchStatusUpdater::~BatchStatusUpdater() } else { - if (synchronizationNeeded) - finalMessage+= _("Synchronization completed successfully."); - else - finalMessage+= _("Nothing to synchronize. Both directories adhere to the sync-configuration!"); - + finalMessage+= _("Synchronization completed successfully."); syncStatusFrame->setStatusText_NoUpdate(finalMessage); syncStatusFrame->processHasFinished(SyncStatus::FINISHED_WITH_SUCCESS); } @@ -489,32 +560,33 @@ ErrorHandler::Response BatchStatusUpdater::reportError(const wxString& text) unhandledErrors.Add(text); m_log->write(text, _("Error")); - if (continueErrors) // /|\ before return, the logfile is written!!! + if (ignoreErrors) // /|\ before return, the logfile is written!!! return ErrorHandler::CONTINUE_NEXT; else { - abortionRequested = true; + abortRequested = true; throw AbortThisProcess(); } } else //show dialog to user who can decide how to continue { - if (continueErrors) //this option can be set from commandline or by the user in the error dialog on UI + if (ignoreErrors) //this option can be set from commandline or by the user in the error dialog on UI { unhandledErrors.Add(text); return ErrorHandler::CONTINUE_NEXT; } - wxString errorMessage = text + _("\n\nContinue with next object, retry or abort synchronization?"); - ErrorDlg* errorDlg = new ErrorDlg(errorMessage, continueErrors); - syncStatusFrame->updateStatusDialogNow(); - int rv = errorDlg->ShowModal(); - errorDlg->Destroy(); + bool ignoreNextErrors = false; + wxString errorMessage = text + wxT("\n\n") + _("Ignore this error, retry or abort synchronization?"); + ErrorDlg* errorDlg = new ErrorDlg(syncStatusFrame, errorMessage, ignoreNextErrors, 90); + + int rv = errorDlg->ShowModal(); switch (rv) { - case ErrorDlg::BUTTON_CONTINUE: + case ErrorDlg::BUTTON_IGNORE: + ignoreErrors = ignoreNextErrors; unhandledErrors.Add(text); return ErrorHandler::CONTINUE_NEXT; case ErrorDlg::BUTTON_RETRY: @@ -522,7 +594,7 @@ ErrorHandler::Response BatchStatusUpdater::reportError(const wxString& text) case ErrorDlg::BUTTON_ABORT: { unhandledErrors.Add(text); - abortionRequested = true; + abortRequested = true; throw AbortThisProcess(); } default: @@ -547,7 +619,18 @@ void BatchStatusUpdater::abortThisProcess() } -void BatchStatusUpdater::noSynchronizationNeeded() +void BatchStatusUpdater::setFinalStatus(const wxString& message, SyncStatus::SyncStatusID id) { - synchronizationNeeded = false;; + customStatusMessage = message; + customStatusId = id; +} + + +wxWindow* BatchStatusUpdater::getWindow() +{ + assert(!silentMode); + if (!silentMode) + return syncStatusFrame; + else + return NULL; } diff --git a/Application.h b/Application.h index 220c81a1..42c425a7 100644 --- a/Application.h +++ b/Application.h @@ -12,7 +12,6 @@ #include <wx/app.h> #include <wx/cmdline.h> -#include "FreeFileSync.h" #include "ui/smallDialogs.h" #include "library/misc.h" #include "library/processXml.h" @@ -43,28 +42,31 @@ class LogFile; class BatchStatusUpdater : public StatusHandler { public: - BatchStatusUpdater(bool continueOnError, bool silent, LogFile* log); + BatchStatusUpdater(bool ignoreAllErrors, bool silent, LogFile* log); ~BatchStatusUpdater(); - void updateStatusText(const wxString& text); - void initNewProcess(int objectsTotal, double dataTotal, Process processID); - void updateProcessedData(int objectsProcessed, double dataProcessed); - ErrorHandler::Response reportError(const wxString& text); - void forceUiRefresh(); + virtual void updateStatusText(const wxString& text); + virtual void initNewProcess(int objectsTotal, double dataTotal, Process processID); + virtual void updateProcessedData(int objectsProcessed, double dataProcessed); + virtual ErrorHandler::Response reportError(const wxString& text); + virtual void forceUiRefresh(); - void noSynchronizationNeeded(); + wxWindow* getWindow(); + void setFinalStatus(const wxString& message, SyncStatus::SyncStatusID id); //overwrite final status message text private: - void abortThisProcess(); + virtual void abortThisProcess(); LogFile* m_log; SyncStatus* syncStatusFrame; - bool continueErrors; + bool ignoreErrors; bool silentMode; wxArrayString unhandledErrors; //list of non-resolved errors Process currentProcess; - bool synchronizationNeeded; + + wxString customStatusMessage; //final status message written by service consumer + SyncStatus::SyncStatusID customStatusId; }; diff --git a/Changelog.txt b/Changelog.txt index 0e64fbac..ce24ee35 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,17 @@ FreeFileSync ------------ +Changelog v1.13 +--------------- +Automatically detect daylight saving time (DST) change for FAT/FAT32 drives +Added directory dependency check when synchronizing multiple folder pairs +New synchronization option: "update" +Reduced status screen flicker when comparing and synchronizing +Fixed bug when sorting by filename +Further GUI improvements +Updated translation files + + Changelog v1.12 --------------- Significantly improved speed of all sorting algorithms diff --git a/FreeFileSync - Unicode.cbp b/FreeFileSync - Unicode.cbp index 640c289f..7b47c0e2 100644 --- a/FreeFileSync - Unicode.cbp +++ b/FreeFileSync - Unicode.cbp @@ -107,7 +107,6 @@ <Add library="libodbc32.a" /> <Add directory="C:\Programme\C++\wxWidgets\lib\gcc_lib" /> </Linker> - <Unit filename="FreeFileSync.cpp" /> <Unit filename="FreeFileSync.h"> <Option target="Debug" /> <Option target="Release" /> @@ -116,6 +115,8 @@ <Option target="Debug" /> <Option target="Release" /> </Unit> + <Unit filename="algorithm.cpp" /> + <Unit filename="algorithm.h" /> <Unit filename="application.cpp"> <Option target="Debug" /> <Option target="Release" /> @@ -124,6 +125,11 @@ <Option target="Debug" /> <Option target="Release" /> </Unit> + <Unit filename="comparison.cpp" /> + <Unit filename="comparison.h"> + <Option target="Debug" /> + <Option target="Release" /> + </Unit> <Unit filename="library\customGrid.cpp"> <Option target="Debug" /> <Option target="Release" /> @@ -132,6 +138,8 @@ <Option target="Debug" /> <Option target="Release" /> </Unit> + <Unit filename="library\fileHandling.cpp" /> + <Unit filename="library\fileHandling.h" /> <Unit filename="library\globalFunctions.cpp" /> <Unit filename="library\globalFunctions.h"> <Option target="Debug" /> @@ -204,6 +212,11 @@ <Option target="Debug" /> <Option target="Release" /> </Unit> + <Unit filename="synchronization.cpp" /> + <Unit filename="synchronization.h"> + <Option target="Debug" /> + <Option target="Release" /> + </Unit> <Unit filename="ui\guiGenerated.cpp"> <Option target="Debug" /> <Option target="Release" /> diff --git a/FreeFileSync.cpp b/FreeFileSync.cpp deleted file mode 100644 index d7f398df..00000000 --- a/FreeFileSync.cpp +++ /dev/null @@ -1,1923 +0,0 @@ -#include <wx/arrstr.h> -#include <wx/dir.h> -#include <wx/msgdlg.h> -#include "FreeFileSync.h" -#include "library/globalFunctions.h" -#include <wx/filename.h> -#include "library/resources.h" -#include <sys/stat.h> -#include <wx/ffile.h> - -#ifdef FFS_WIN -#include <windows.h> -#endif // FFS_WIN - -#ifdef FFS_LINUX -#include <utime.h> -#endif // FFS_LINUX - - -using namespace globalFunctions; - - -MainConfiguration::MainConfiguration() : - compareVar(CMP_BY_TIME_SIZE), - filterIsActive(false), //do not filter by default - includeFilter(wxT("*")), //include all files/folders - excludeFilter(wxEmptyString), //exclude nothing - useRecycleBin(FreeFileSync::recycleBinExists()), //enable if OS supports it; else user will have to activate first and then get an error message - continueOnError(false) -{} - - -struct FileInfo -{ - wxULongLong fileSize; //unit: bytes! - wxString lastWriteTime; - wxULongLong lastWriteTimeRaw; //unit: seconds! -}; - - -//some special file functions -void generateFileAndFolderDescriptions(DirectoryDescrType& output, const wxString& directory, StatusHandler* updateClass = 0); -void getFileInformation(FileInfo& output, const wxString& filename); - - -//Note: the following lines are a performance optimization for deleting elements from a vector. It is incredibly faster to create a new -//vector and leave specific elements out than to delete row by row and force recopying of most elements for each single deletion (linear vs quadratic runtime) -template <class T> -void removeRowsFromVector(vector<T>& grid, const set<int>& rowsToRemove) -{ - vector<T> temp; - int rowToSkip = -1; //keep it an INT! - - set<int>::iterator rowToSkipIndex = rowsToRemove.begin(); - - if (rowToSkipIndex != rowsToRemove.end()) - rowToSkip = *rowToSkipIndex; - - for (int i = 0; i < int(grid.size()); ++i) - { - if (i != rowToSkip) - temp.push_back(grid[i]); - else - { - ++rowToSkipIndex; - if (rowToSkipIndex != rowsToRemove.end()) - rowToSkip = *rowToSkipIndex; - } - } - grid.swap(temp); -} - - -class GetAllFilesFull : public wxDirTraverser -{ -public: - GetAllFilesFull(DirectoryDescrType& output, wxString dirThatIsSearched, StatusHandler* updateClass = 0); - - wxDirTraverseResult OnFile(const wxString& filename); - - wxDirTraverseResult OnDir(const wxString& dirname); - - wxDirTraverseResult OnOpenError(const wxString& openerrorname); - -private: - DirectoryDescrType& m_output; - wxString directory; - int prefixLength; - FileInfo currentFileInfo; - FileDescrLine fileDescr; - StatusHandler* statusUpdater; -}; - - -inline -wxString formatTime(unsigned int number) -{ - assert (number < 100); - - if (number <= 9) - { - wxChar result[3]; - - *result = '0'; - result[1] = '0' + number; - result[2] = 0; - - return result; - } - else - { - wxString result; - if (result.Printf(wxT("%d"), number) < 0) - throw RuntimeException(_("Error when converting int to wxString")); - return result; - } -} - - -void getFileInformation(FileInfo& output, const wxString& filename) -{ -#ifdef FFS_WIN - WIN32_FIND_DATA winFileInfo; - FILETIME localFileTime; - SYSTEMTIME time; - HANDLE fileHandle; - - if ((fileHandle = FindFirstFile(filename.c_str(), &winFileInfo)) == INVALID_HANDLE_VALUE) - throw FileError(wxString(_("Could not retrieve file info for: ")) + wxT("\"") + filename + wxT("\"")); - - FindClose(fileHandle); - - if (FileTimeToLocalFileTime( - &winFileInfo.ftLastWriteTime, //pointer to UTC file time to convert - &localFileTime //pointer to converted file time - ) == 0) - throw RuntimeException(_("Error converting FILETIME to local FILETIME")); - - if (FileTimeToSystemTime( - &localFileTime, //pointer to file time to convert - &time //pointer to structure to receive system time - ) == 0) - throw RuntimeException(_("Error converting FILETIME to SYSTEMTIME")); - - output.lastWriteTime = numberToWxString(time.wYear) + wxT("-") + - formatTime(time.wMonth) + wxT("-") + - formatTime(time.wDay) + wxT(" ") + - formatTime(time.wHour) + wxT(":") + - formatTime(time.wMinute) + wxT(":") + - formatTime(time.wSecond); - - //local time - output.lastWriteTimeRaw = wxULongLong(localFileTime.dwHighDateTime, localFileTime.dwLowDateTime); - - //reduce precision to 1 second (FILETIME has unit 10^-7 s) - output.lastWriteTimeRaw/= 10000000; // <- time is used for comparison only: unit switched to seconds - - output.fileSize = wxULongLong(winFileInfo.nFileSizeHigh, winFileInfo.nFileSizeLow); - -#else - struct stat fileInfo; - if (stat(filename.c_str(), &fileInfo) != 0) - throw FileError(wxString(_("Could not retrieve file info for: ")) + wxT("\"") + filename + wxT("\"")); - - tm* timeinfo; - timeinfo = localtime(&fileInfo.st_mtime); - char buffer [50]; - strftime(buffer,50,"%Y-%m-%d %H:%M:%S",timeinfo); - - //local time - output.lastWriteTime = buffer; - - //UTC time; unit: 1 second - output.lastWriteTimeRaw = fileInfo.st_mtime; - - output.fileSize = fileInfo.st_size; -#endif -} - - -struct MemoryAllocator -{ - MemoryAllocator() - { - buffer1 = new unsigned char[bufferSize]; - buffer2 = new unsigned char[bufferSize]; - } - - ~MemoryAllocator() - { - delete [] buffer1; - delete [] buffer2; - } - - static const unsigned int bufferSize = 1024 * 512; //512 kb seems to be the perfect buffer size - unsigned char* buffer1; - unsigned char* buffer2; -}; - - -bool filesHaveSameContent(const wxString& filename1, const wxString& filename2) -{ - static MemoryAllocator memory; - - wxFFile file1(filename1.c_str(), wxT("rb")); - if (!file1.IsOpened()) - throw FileError(wxString(_("Could not open file: ")) + wxT("\"") + filename1 + wxT("\"")); - - wxFFile file2(filename2.c_str(), wxT("rb")); - if (!file2.IsOpened()) //NO cleanup necessary for wxFFile - throw FileError(wxString(_("Could not open file: ")) + wxT("\"") + filename2 + wxT("\"")); - - do - { - size_t length1 = file1.Read(memory.buffer1, memory.bufferSize); - if (file1.Error()) throw FileError(wxString(_("Error reading file: ")) + wxT("\"") + filename1 + wxT("\"")); - - size_t length2 = file2.Read(memory.buffer2, memory.bufferSize); - if (file2.Error()) throw FileError(wxString(_("Error reading file: ")) + wxT("\"") + filename2 + wxT("\"")); - - if (length1 != length2 || memcmp(memory.buffer1, memory.buffer2, length1) != 0) - return false; - } - while (!file1.Eof()); - - if (!file2.Eof()) - return false; - - return true; -} - - -void generateFileAndFolderDescriptions(DirectoryDescrType& output, const wxString& directory, StatusHandler* updateClass) -{ - assert (updateClass); - - while (true) - { - output.clear(); - - //get all files and folders from directory (and subdirectories) + information - GetAllFilesFull traverser(output, FreeFileSync::getFormattedDirectoryName(directory), updateClass); - wxDir dir(directory); - - if (dir.Traverse(traverser) != (size_t)-1) - break; //traversed successfully - else - { - ErrorHandler::Response rv = updateClass->reportError(wxString(_("Error traversing directory ")) + wxT("\"") + directory + wxT("\"")); - if (rv == ErrorHandler::CONTINUE_NEXT) - break; - else if (rv == ErrorHandler::RETRY) - ; //continue with loop - else - assert (false); - } - } -} - - -//handle execution of a method while updating the UI -class UpdateWhileComparing : public UpdateWhileExecuting -{ -public: - UpdateWhileComparing() {} - ~UpdateWhileComparing() {} - - wxString file1; - wxString file2; - bool success; - wxString errorMessage; - bool result; - -private: - void longRunner() //virtual method implementation - { - try - { - result = filesHaveSameContent(file1, file2); - success = true; - } - catch (FileError& error) - { - success = false; - errorMessage = error.show(); - } - } -}; - - -bool filesHaveSameContentMultithreaded(const wxString& filename1, const wxString& filename2, StatusHandler* updateClass) -{ - static UpdateWhileComparing cmpAndUpdate; //single instantiation: thread enters wait phase after each execution - - cmpAndUpdate.waitUntilReady(); - - //longRunner is called from thread, but no mutex needed here, since thread is in waiting state! - cmpAndUpdate.file1 = filename1; - cmpAndUpdate.file2 = filename2; - - cmpAndUpdate.execute(updateClass); - - //no mutex needed here since longRunner is finished - if (!cmpAndUpdate.success) - throw FileError(cmpAndUpdate.errorMessage); - - return cmpAndUpdate.result; -} - - -void calcTotalDataForCompare(int& objectsTotal, double& dataTotal, const FileCompareResult& grid, const set<int>& rowsToCompare) -{ - dataTotal = 0; - - for (set<int>::iterator i = rowsToCompare.begin(); i != rowsToCompare.end(); ++i) - { - const FileCompareLine& gridline = grid[*i]; - - dataTotal+= gridline.fileDescrLeft.fileSize.ToDouble(); - dataTotal+= gridline.fileDescrRight.fileSize.ToDouble(); - } - - objectsTotal = rowsToCompare.size() * 2; -} - - -struct DescrBufferLine -{ - wxString directoryName; - DirectoryDescrType* directoryDesc; - -#ifdef FFS_WIN - //Windows does NOT distinguish between upper/lower-case - bool operator>(const DescrBufferLine& b ) const - { - return (directoryName.CmpNoCase(b.directoryName) > 0); - } - bool operator<(const DescrBufferLine& b) const - { - return (directoryName.CmpNoCase(b.directoryName) < 0); - } - bool operator==(const DescrBufferLine& b) const - { - return (directoryName.CmpNoCase(b.directoryName) == 0); - } - -#elif defined FFS_LINUX - //Linux DOES distinguish between upper/lower-case - bool operator>(const DescrBufferLine& b ) const - { - return (directoryName.Cmp(b.directoryName) > 0); - } - bool operator<(const DescrBufferLine& b) const - { - return (directoryName.Cmp(b.directoryName) < 0); - } - bool operator==(const DescrBufferLine& b) const - { - return (directoryName.Cmp(b.directoryName) == 0); - } -#else - adapt this -#endif - -}; - - -class DirectoryDescrBuffer //buffer multiple scans of the same directories -{ -public: - ~DirectoryDescrBuffer() - { - //clean up - for (set<DescrBufferLine>::iterator i = buffer.begin(); i != buffer.end(); ++i) - delete i->directoryDesc; - } - - const DirectoryDescrType* getDirectoryDescription(const wxString& directory, StatusHandler* statusUpdater) - { - DescrBufferLine bufferEntry; - bufferEntry.directoryName = directory; - - set<DescrBufferLine>::iterator entryFound; - if ((entryFound = buffer.find(bufferEntry)) != buffer.end()) - { - //entry found in buffer; return - return entryFound->directoryDesc; - } - else - { - //entry not found; create new one - bufferEntry.directoryDesc = new DirectoryDescrType; - buffer.insert(bufferEntry); //exception safety: insert into buffer right after creation! - - generateFileAndFolderDescriptions(*bufferEntry.directoryDesc, directory, statusUpdater); //exceptions may be thrown! - return bufferEntry.directoryDesc; - } - } - -private: - set<DescrBufferLine> buffer; -}; - - -void FreeFileSync::startCompareProcess(const vector<FolderPair>& directoryPairsFormatted, - const CompareVariant cmpVar, - FileCompareResult& output, - StatusHandler* statusUpdater) -{ -#ifndef __WXDEBUG__ - wxLogNull noWxLogs; //hide wxWidgets log messages in release build -#endif - assert (statusUpdater); - -//################################################################################################################################################ - - FileCompareResult output_tmp; //write to output not before END of process! - - try - { - //inform about the total amount of data that will be processed from now on - statusUpdater->initNewProcess(-1, 0, StatusHandler::PROCESS_SCANNING); //it's not known how many files will be scanned => -1 objects - - //do basis scan: only result lines of type FILE_UNDEFINED need to be determined - FreeFileSync::performBaseComparison(directoryPairsFormatted, - output_tmp, - statusUpdater); - - if (cmpVar == CMP_BY_TIME_SIZE) - { - for (FileCompareResult::iterator i = output_tmp.begin(); i != output_tmp.end(); ++i) - { - if (i->cmpResult == FILE_UNDEFINED) - { - //last write time may differ by up to 2 seconds (NTFS vs FAT32) - bool sameWriteTime; - if (i->fileDescrLeft.lastWriteTimeRaw < i->fileDescrRight.lastWriteTimeRaw) - sameWriteTime = (i->fileDescrRight.lastWriteTimeRaw - i->fileDescrLeft.lastWriteTimeRaw <= 2); - else - sameWriteTime = (i->fileDescrLeft.lastWriteTimeRaw - i->fileDescrRight.lastWriteTimeRaw <= 2); - - if (sameWriteTime) - { - if (i->fileDescrLeft.fileSize == i->fileDescrRight.fileSize) - i->cmpResult = FILE_EQUAL; - else - i->cmpResult = FILE_DIFFERENT; - } - else - { - if (i->fileDescrLeft.lastWriteTimeRaw < i->fileDescrRight.lastWriteTimeRaw) - i->cmpResult = FILE_RIGHT_NEWER; - else - i->cmpResult = FILE_LEFT_NEWER; - } - } - } - } -//################################################################################################################################################ - else if (cmpVar == CMP_BY_CONTENT) - { - set<int> rowsToCompareBytewise; //compare of file content happens AFTER finding corresponding files - //in order to separate into two processes (scanning and comparing) - - //pre-check: files have different content if they have a different filesize - for (FileCompareResult::iterator i = output_tmp.begin(); i != output_tmp.end(); ++i) - { - if (i->cmpResult == FILE_UNDEFINED) - { - if (i->fileDescrLeft.fileSize != i->fileDescrRight.fileSize) - i->cmpResult = FILE_DIFFERENT; - else - rowsToCompareBytewise.insert(i - output_tmp.begin()); - } - } - - int objectsTotal = 0; - double dataTotal = 0; - calcTotalDataForCompare(objectsTotal, dataTotal, output_tmp, rowsToCompareBytewise); - - statusUpdater->initNewProcess(objectsTotal, dataTotal, StatusHandler::PROCESS_COMPARING_CONTENT); - - set<int> rowsToDelete; //if errors occur during file access and user skips, these rows need to be deleted from result - - //compair files (that have same size) bytewise... - for (set<int>::iterator i = rowsToCompareBytewise.begin(); i != rowsToCompareBytewise.end(); ++i) - { - FileCompareLine& gridline = output_tmp[*i]; - - statusUpdater->updateStatusText(wxString(_("Comparing content of files ")) + wxT("\"") + gridline.fileDescrLeft.relativeName + wxT("\"")); - - //check files that exist in left and right model but have different content - while (true) - { - //trigger display refresh - statusUpdater->requestUiRefresh(); - - try - { - if (filesHaveSameContentMultithreaded(gridline.fileDescrLeft.fullName, gridline.fileDescrRight.fullName, statusUpdater)) - gridline.cmpResult = FILE_EQUAL; - else - gridline.cmpResult = FILE_DIFFERENT; - - statusUpdater->updateProcessedData(2, (gridline.fileDescrLeft.fileSize * 2).ToDouble()); - break; - } - catch (FileError& error) - { - ErrorHandler::Response rv = statusUpdater->reportError(error.show()); - if (rv == ErrorHandler::CONTINUE_NEXT) - { - rowsToDelete.insert(*i); - break; - } - else if (rv == ErrorHandler::RETRY) - ; //continue with loop - else - assert (false); - } - } - } - - //delete invalid rows that have no valid cmpResult - if (rowsToDelete.size() > 0) - removeRowsFromVector(output_tmp, rowsToDelete); - } - else assert(false); - - - statusUpdater->requestUiRefresh(); - } - catch (const RuntimeException& theException) - { - wxMessageBox(theException.show(), _("An exception occured!"), wxOK | wxICON_ERROR); - return; - } - catch (std::bad_alloc& e) - { - wxMessageBox(wxString(_("System out of memory!")) + wxT(" ") + wxString::From8BitData(e.what()), _("An exception occured!"), wxOK | wxICON_ERROR); - return; - } - -//only if everything was processed correctly output is written to! - output_tmp.swap(output); -} - - -void FreeFileSync::performBaseComparison(const vector<FolderPair>& directoryPairsFormatted, - FileCompareResult& output, - StatusHandler* statusUpdater) -{ - //buffer accesses to the same directories; useful when multiple folder pairs are used - DirectoryDescrBuffer descriptionBuffer; - - //process one folder pair after each other - for (vector<FolderPair>::const_iterator pair = directoryPairsFormatted.begin(); pair != directoryPairsFormatted.end(); ++pair) - { - //retrieve sets of files (with description data) - const DirectoryDescrType* directoryLeft = descriptionBuffer.getDirectoryDescription(pair->leftDirectory, statusUpdater); - const DirectoryDescrType* directoryRight = descriptionBuffer.getDirectoryDescription(pair->rightDirectory, statusUpdater); - - statusUpdater->forceUiRefresh(); - FileCompareLine newline; - - //find files/folders that exist in left file model but not in right model - for (DirectoryDescrType::iterator i = directoryLeft->begin(); i != directoryLeft->end(); ++i) - if (directoryRight->find(*i) == directoryRight->end()) - { - newline.fileDescrLeft = *i; - newline.fileDescrRight = FileDescrLine(); - newline.fileDescrRight.directory = pair->rightDirectory; - newline.cmpResult = FILE_LEFT_SIDE_ONLY; - output.push_back(newline); - } - - for (DirectoryDescrType::iterator j = directoryRight->begin(); j != directoryRight->end(); ++j) - { - DirectoryDescrType::iterator i; - - //find files/folders that exist in right file model but not in left model - if ((i = directoryLeft->find(*j)) == directoryLeft->end()) - { - newline.fileDescrLeft = FileDescrLine(); - newline.fileDescrLeft.directory = pair->leftDirectory; //directory info is needed when creating new directories - newline.fileDescrRight = *j; - newline.cmpResult = FILE_RIGHT_SIDE_ONLY; - output.push_back(newline); - } - //find files/folders that exist in left and right file model - else - { //files... - if (i->objType == FileDescrLine::TYPE_FILE && j->objType == FileDescrLine::TYPE_FILE) - { - newline.fileDescrLeft = *i; - newline.fileDescrRight = *j; - newline.cmpResult = FILE_UNDEFINED; //not yet determined! - output.push_back(newline); - } - //directories... - else if (i->objType == FileDescrLine::TYPE_DIRECTORY && j->objType == FileDescrLine::TYPE_DIRECTORY) - { - newline.fileDescrLeft = *i; - newline.fileDescrRight = *j; - newline.cmpResult = FILE_EQUAL; - output.push_back(newline); - } - //if we have a nameclash between a file and a directory: split into two separate rows - else if (i->objType != j->objType) - { - newline.fileDescrLeft = *i; - newline.fileDescrRight = FileDescrLine(); - newline.fileDescrRight.directory = pair->rightDirectory; - newline.cmpResult = FILE_LEFT_SIDE_ONLY; - output.push_back(newline); - - newline.fileDescrLeft = FileDescrLine(); - newline.fileDescrLeft.directory = pair->leftDirectory; - newline.fileDescrRight = *j; - newline.cmpResult = FILE_RIGHT_SIDE_ONLY; - output.push_back(newline); - } - else assert (false); - } - } - } - statusUpdater->requestUiRefresh(); -} - - -void FreeFileSync::swapGrids(FileCompareResult& grid) -{ - FileDescrLine tmp; - - for (FileCompareResult::iterator i = grid.begin(); i != grid.end(); ++i) - { - //swap compare result - if (i->cmpResult == FILE_LEFT_SIDE_ONLY) - i->cmpResult = FILE_RIGHT_SIDE_ONLY; - else if (i->cmpResult == FILE_RIGHT_SIDE_ONLY) - i->cmpResult = FILE_LEFT_SIDE_ONLY; - else if (i->cmpResult == FILE_RIGHT_NEWER) - i->cmpResult = FILE_LEFT_NEWER; - else if (i->cmpResult == FILE_LEFT_NEWER) - i->cmpResult = FILE_RIGHT_NEWER; - - //swap file descriptors - tmp = i->fileDescrLeft; - i->fileDescrLeft = i->fileDescrRight; - i->fileDescrRight = tmp; - } -} - - -GetAllFilesFull::GetAllFilesFull(DirectoryDescrType& output, wxString dirThatIsSearched, StatusHandler* updateClass) - : m_output(output), directory(dirThatIsSearched), statusUpdater(updateClass) -{ - assert(updateClass); - prefixLength = directory.Len(); -} - - -wxDirTraverseResult GetAllFilesFull::OnFile(const wxString& filename) -{ - fileDescr.fullName = filename; - fileDescr.directory = directory; - fileDescr.relativeName = filename.Mid(prefixLength, wxSTRING_MAXLEN); - while (true) - { - try - { - getFileInformation(currentFileInfo, filename); - break; - } - catch (FileError& error) - { - //if (updateClass) -> is mandatory - ErrorHandler::Response rv = statusUpdater->reportError(error.show()); - if ( rv == ErrorHandler::CONTINUE_NEXT) - return wxDIR_CONTINUE; - else if (rv == ErrorHandler::RETRY) - ; //continue with loop - else - assert (false); - } - } - - fileDescr.lastWriteTime = currentFileInfo.lastWriteTime; - fileDescr.lastWriteTimeRaw = currentFileInfo.lastWriteTimeRaw; - fileDescr.fileSize = currentFileInfo.fileSize; - fileDescr.objType = FileDescrLine::TYPE_FILE; - m_output.insert(fileDescr); - - //update UI/commandline status information - statusUpdater->updateStatusText(wxString(_("Scanning ")) + wxT("\"") + filename + wxT("\"")); //NO performance issue at all - //add 1 element to the progress indicator - statusUpdater->updateProcessedData(1, 0); //NO performance issue at all - //trigger display refresh - statusUpdater->requestUiRefresh(); - - return wxDIR_CONTINUE; -} - - -wxDirTraverseResult GetAllFilesFull::OnDir(const wxString& dirname) -{ -#ifdef FFS_WIN - if ( dirname.EndsWith(wxT("\\RECYCLER")) || - dirname.EndsWith(wxT("\\System Volume Information"))) - return wxDIR_IGNORE; -#endif // FFS_WIN - - fileDescr.fullName = dirname; - fileDescr.directory = directory; - fileDescr.relativeName = dirname.Mid(prefixLength, wxSTRING_MAXLEN); - fileDescr.lastWriteTime = wxEmptyString; //irrelevant for directories - fileDescr.lastWriteTimeRaw = wxULongLong(0); //irrelevant for directories - fileDescr.fileSize = wxULongLong(0); //currently used by getBytesToTransfer - fileDescr.objType = FileDescrLine::TYPE_DIRECTORY; - m_output.insert(fileDescr); - - //update UI/commandline status information - statusUpdater->updateStatusText(wxString(_("Scanning ")) + wxT("\"") + dirname + wxT("\"")); //NO performance issue at all - //add 1 element to the progress indicator - statusUpdater->updateProcessedData(1, 0); //NO performance issue at all - //trigger display refresh - statusUpdater->requestUiRefresh(); - - return wxDIR_CONTINUE; -} - - -wxDirTraverseResult GetAllFilesFull::OnOpenError(const wxString& openerrorname) -{ - wxMessageBox(openerrorname, _("Error")); - return wxDIR_IGNORE; -} - - -//##################################################################################################### -//file functions - -class GetAllFilesSimple : public wxDirTraverser -{ -public: - GetAllFilesSimple(wxArrayString& files, wxArrayString& subDirectories) : - m_files(files), - m_dirs(subDirectories) - {} - - wxDirTraverseResult OnDir(const wxString& dirname) - { - m_dirs.Add(dirname); - return wxDIR_CONTINUE; - } - - wxDirTraverseResult OnFile(const wxString& filename) - { - m_files.Add(filename); - return wxDIR_CONTINUE; - } - - wxDirTraverseResult OnOpenError(const wxString& openerrorname) - { - wxMessageBox(openerrorname, _("Error")); - return wxDIR_IGNORE; - } - -private: - wxArrayString& m_files; - wxArrayString& m_dirs; -}; - - -class RecycleBin -{ -public: - RecycleBin() : - recycleBinAvailable(false) - { -#ifdef FFS_WIN - recycleBinAvailable = true; -#endif // FFS_WIN - } - - ~RecycleBin() {} - - bool recycleBinExists() - { - return recycleBinAvailable; - } - - void moveToRecycleBin(const wxString& filename) - { - if (!recycleBinAvailable) //this method should ONLY be called if recycle bin is available - throw RuntimeException(_("Initialization of Recycle Bin failed! It cannot be used!")); - -#ifdef FFS_WIN - wxString filenameDoubleNull = filename + wxChar(0); - - SHFILEOPSTRUCT fileOp; - fileOp.hwnd = NULL; - fileOp.wFunc = FO_DELETE; - fileOp.pFrom = filenameDoubleNull.c_str(); - fileOp.pTo = NULL; - fileOp.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_SILENT; - fileOp.fAnyOperationsAborted = false; - fileOp.hNameMappings = NULL; - fileOp.lpszProgressTitle = NULL; - - if (SHFileOperation(&fileOp //pointer to an SHFILEOPSTRUCT structure that contains information the function needs to carry out - ) != 0 || fileOp.fAnyOperationsAborted) throw FileError(wxString(_("Error moving to recycle bin: ")) + wxT("\"") + filename + wxT("\"")); -#endif // FFS_WIN - } - -private: - bool recycleBinAvailable; -}; - - -RecycleBin FreeFileSync::recycler; - - -inline -void FreeFileSync::removeFile(const wxString& filename, const bool useRecycleBin) -{ - if (!wxFileExists(filename)) return; //this is NOT an error situation: the manual deletion relies on it! - - if (useRecycleBin) - { - recycler.moveToRecycleBin(filename); - return; - } - -#ifdef FFS_WIN - if (!SetFileAttributes( - filename.c_str(), //address of filename - FILE_ATTRIBUTE_NORMAL //attributes to set - )) throw FileError(wxString(_("Error deleting file ")) + wxT("\"") + filename + wxT("\"")); -#endif //FFS_WIN - - if (!wxRemoveFile(filename)) - throw FileError(wxString(_("Error deleting file ")) + wxT("\"") + filename + wxT("\"")); -} - - -void FreeFileSync::removeDirectory(const wxString& directory, const bool useRecycleBin) -{ - if (!wxDirExists(directory)) return; //this is NOT an error situation: the manual deletion relies on it! - - if (useRecycleBin) - { - recycler.moveToRecycleBin(directory); - return; - } - - wxArrayString fileList; - wxArrayString dirList; - - { //own scope for directory access to not disturb deletion! - wxDir dir(directory); - - //get all files and directories from current directory (and subdirectories) - GetAllFilesSimple traverser(fileList, dirList); - if (dir.Traverse(traverser) == (size_t)-1) - throw FileError(wxString(_("Error deleting directory ")) + wxT("\"") + directory + wxT("\"")); - } - - for (unsigned int j = 0; j < fileList.GetCount(); ++j) - removeFile(fileList[j], useRecycleBin); - - dirList.Insert(directory, 0); //this directory will be deleted last - - for (int j = int(dirList.GetCount()) - 1; j >= 0 ; --j) - { -#ifdef FFS_WIN - if (!SetFileAttributes( - dirList[j].c_str(), // address of directory name - FILE_ATTRIBUTE_NORMAL // attributes to set - )) throw FileError(wxString(_("Error deleting directory ")) + wxT("\"") + dirList[j] + wxT("\"")); -#endif // FFS_WIN - - if (!wxRmdir(dirList[j])) - throw FileError(wxString(_("Error deleting directory ")) + wxT("\"") + dirList[j] + wxT("\"")); - } -} - - -void FreeFileSync::createDirectory(const wxString& directory, int level) -{ - if (wxDirExists(directory)) - return; - - if (level == 50) //catch endless loop - return; - - //try to create directory - if (wxMkdir(directory)) - return; - - //if not successfull try to create containing folders first - wxString createFirstDir = wxDir(directory).GetName().BeforeLast(GlobalResources::fileNameSeparator); - - //call function recursively - if (createFirstDir.IsEmpty()) return; - createDirectory(createFirstDir, level + 1); - - //now creation should be possible - if (!wxMkdir(directory)) - { - if (level == 0) - throw FileError(wxString(_("Error creating directory ")) + wxT("\"") + directory + wxT("\"")); - } -} - -/* -void FreeFileSync::copyCreatingDirs(const wxString& source, const wxString& target) -{ - wxString targetPath = wxFileName(target).GetPath(); - createDirectory(targetPath); - - if (!wxCopyFile(source, target, false)) //error if file exists - throw FileError(wxString(_("Error copying file ")) + "\"" + source + "\"" + _(" to ") + "\"" + target + "\""); -} -*/ -//########################################################################################### - - -//handle execution of a method while updating the UI -class UpdateWhileCopying : public UpdateWhileExecuting -{ -public: - UpdateWhileCopying() {} - ~UpdateWhileCopying() {} - - wxString source; - wxString target; - bool success; - wxString errorMessage; - -private: - void longRunner() //virtual method implementation - { - if (!wxCopyFile(source, target, false)) //abort if file exists - { - success = false; - errorMessage = wxString(_("Error copying file ")) + wxT("\"") + source + wxT("\"") + _(" to ") + wxT("\"") + target + wxT("\""); - return; - } - -#ifdef FFS_LINUX //copying files with Linux does not preserve the modification time => adapt after copying - struct stat fileInfo; - if (stat(source.c_str(), &fileInfo) != 0) //read modification time from source file - { - success = false; - errorMessage = wxString(_("Could not retrieve file info for: ")) + wxT("\"") + source + wxT("\""); - return; - } - - utimbuf newTimes; - newTimes.actime = fileInfo.st_mtime; - newTimes.modtime = fileInfo.st_mtime; - - if (utime(target.c_str(), &newTimes) != 0) - { - success = false; - errorMessage = wxString(_("Error adapting modification time of file ")) + wxT("\"") + target + wxT("\""); - return; - } -#endif // FFS_LINUX - - success = true; - } -}; - - -void FreeFileSync::copyfileMultithreaded(const wxString& source, const wxString& target, StatusHandler* updateClass) -{ - static UpdateWhileCopying copyAndUpdate; //single instantiation: after each execution thread enters wait phase - - copyAndUpdate.waitUntilReady(); - - //longRunner is called from thread, but no mutex needed here, since thread is in waiting state! - copyAndUpdate.source = source; - copyAndUpdate.target = target; - - copyAndUpdate.execute(updateClass); - - //no mutex needed here since longRunner is finished - if (!copyAndUpdate.success) - throw FileError(copyAndUpdate.errorMessage); -} - - -bool FreeFileSync::recycleBinExists() -{ - return recycler.recycleBinExists(); -} - - -inline -SyncConfiguration::Direction getSyncDirection(const CompareFilesResult cmpResult, const SyncConfiguration& config) -{ - switch (cmpResult) - { - case FILE_LEFT_SIDE_ONLY: - return config.exLeftSideOnly; - break; - - case FILE_RIGHT_SIDE_ONLY: - return config.exRightSideOnly; - break; - - case FILE_RIGHT_NEWER: - return config.rightNewer; - break; - - case FILE_LEFT_NEWER: - return config.leftNewer; - break; - - case FILE_DIFFERENT: - return config.different; - break; - - default: - assert (false); - } - return SyncConfiguration::SYNC_DIR_NONE; -} - - -bool getBytesToTransfer(int& objectsToCreate, - int& objectsToOverwrite, - int& objectsToDelete, - double& dataToProcess, - const FileCompareLine& fileCmpLine, - const SyncConfiguration& config) -{ //false if nothing has to be done - - objectsToCreate = 0; //always initialize variables - objectsToOverwrite = 0; - objectsToDelete = 0; - dataToProcess = 0; - - //do not add filtered entries - if (!fileCmpLine.selectedForSynchronization) - return false; - - - switch (fileCmpLine.cmpResult) - { - case FILE_LEFT_SIDE_ONLY: - //get data to process - switch (getSyncDirection(fileCmpLine.cmpResult, config)) - { - case SyncConfiguration::SYNC_DIR_LEFT: //delete file on left - dataToProcess = 0; - objectsToDelete = 1; - break; - case SyncConfiguration::SYNC_DIR_RIGHT: //copy from left to right - dataToProcess = fileCmpLine.fileDescrLeft.fileSize.ToDouble(); - objectsToCreate = 1; - break; - case SyncConfiguration::SYNC_DIR_NONE: - return false; - } - break; - - case FILE_RIGHT_SIDE_ONLY: - switch (getSyncDirection(fileCmpLine.cmpResult, config)) - { - case SyncConfiguration::SYNC_DIR_LEFT: //copy from right to left - dataToProcess = fileCmpLine.fileDescrRight.fileSize.ToDouble();; - objectsToCreate = 1; - break; - case SyncConfiguration::SYNC_DIR_RIGHT: //delete file on right - dataToProcess = 0; - objectsToDelete = 1; - break; - case SyncConfiguration::SYNC_DIR_NONE: - return false; - } - break; - - case FILE_LEFT_NEWER: - case FILE_RIGHT_NEWER: - case FILE_DIFFERENT: - //get data to process - switch (getSyncDirection(fileCmpLine.cmpResult, config)) - { - case SyncConfiguration::SYNC_DIR_LEFT: //copy from right to left - dataToProcess = fileCmpLine.fileDescrRight.fileSize.ToDouble(); - objectsToOverwrite = 1; - break; - case SyncConfiguration::SYNC_DIR_RIGHT: //copy from left to right - dataToProcess = fileCmpLine.fileDescrLeft.fileSize.ToDouble(); - objectsToOverwrite = 1; - break; - case SyncConfiguration::SYNC_DIR_NONE: - return false; - } - break; - - case FILE_EQUAL: - return false; - default: - assert(false); - return false; - }; - - return true; -} - - -void FreeFileSync::calcTotalBytesToSync(int& objectsToCreate, - int& objectsToOverwrite, - int& objectsToDelete, - double& dataToProcess, - const FileCompareResult& fileCmpResult, - const SyncConfiguration& config) -{ - objectsToCreate = 0; - objectsToOverwrite = 0; - objectsToDelete = 0; - dataToProcess = 0; - - int toCreate = 0; - int toOverwrite = 0; - int toDelete = 0; - double data = 0; - - for (FileCompareResult::const_iterator i = fileCmpResult.begin(); i != fileCmpResult.end(); ++i) - { //only sum up sizes of files AND directories - if (getBytesToTransfer(toCreate, toOverwrite, toDelete, data, *i, config)) - { - objectsToCreate+= toCreate; - objectsToOverwrite+= toOverwrite; - objectsToDelete+= toDelete; - dataToProcess+= data; - } - } -} - - -bool FreeFileSync::synchronizeFile(const FileCompareLine& cmpLine, const SyncConfiguration& config, const bool useRecycleBin, StatusHandler* statusUpdater) -{ //false if nothing was to be done - assert (statusUpdater); - - if (!cmpLine.selectedForSynchronization) return false; - - wxString target; - - //synchronize file: - switch (cmpLine.cmpResult) - { - case FILE_LEFT_SIDE_ONLY: - switch (config.exLeftSideOnly) - { - case SyncConfiguration::SYNC_DIR_LEFT: //delete files on left - statusUpdater->updateStatusText(wxString(_("Deleting file ")) + wxT("\"") + cmpLine.fileDescrLeft.fullName + wxT("\"")); - removeFile(cmpLine.fileDescrLeft.fullName, useRecycleBin); - break; - case SyncConfiguration::SYNC_DIR_RIGHT: //copy files to right - target = cmpLine.fileDescrRight.directory + cmpLine.fileDescrLeft.relativeName; - statusUpdater->updateStatusText(wxString(_("Copying file ")) + wxT("\"") + cmpLine.fileDescrLeft.fullName + wxT("\"") + - _(" to ") + wxT("\"") + target + wxT("\"")); - - copyfileMultithreaded(cmpLine.fileDescrLeft.fullName, target, statusUpdater); - break; - case SyncConfiguration::SYNC_DIR_NONE: - return false; - default: - assert (false); - } - break; - - case FILE_RIGHT_SIDE_ONLY: - switch (config.exRightSideOnly) - { - case SyncConfiguration::SYNC_DIR_LEFT: //copy files to left - target = cmpLine.fileDescrLeft.directory + cmpLine.fileDescrRight.relativeName; - statusUpdater->updateStatusText(wxString(_("Copying file ")) + wxT("\"") + cmpLine.fileDescrRight.fullName + wxT("\"") + - _(" to ") + wxT("\"") + target + wxT("\"")); - - copyfileMultithreaded(cmpLine.fileDescrRight.fullName, target, statusUpdater); - break; - case SyncConfiguration::SYNC_DIR_RIGHT: //delete files on right - statusUpdater->updateStatusText(wxString(_("Deleting file ")) + wxT("\"") + cmpLine.fileDescrRight.fullName + wxT("\"")); - removeFile(cmpLine.fileDescrRight.fullName, useRecycleBin); - break; - case SyncConfiguration::SYNC_DIR_NONE: - return false; - default: - assert (false); - } - break; - - case FILE_LEFT_NEWER: - case FILE_RIGHT_NEWER: - case FILE_DIFFERENT: - switch (getSyncDirection(cmpLine.cmpResult, config)) - { - case SyncConfiguration::SYNC_DIR_LEFT: //copy from right to left - statusUpdater->updateStatusText(wxString(_("Copying file ")) + wxT("\"") + cmpLine.fileDescrRight.fullName + wxT("\"") + - _(" overwriting ") + wxT("\"") + cmpLine.fileDescrLeft.fullName + wxT("\"")); - - removeFile(cmpLine.fileDescrLeft.fullName, useRecycleBin); //only used if switch activated by user, else file is simply deleted - copyfileMultithreaded(cmpLine.fileDescrRight.fullName, cmpLine.fileDescrLeft.fullName, statusUpdater); - break; - case SyncConfiguration::SYNC_DIR_RIGHT: //copy from left to right - statusUpdater->updateStatusText(wxString(_("Copying file ")) + wxT("\"") + cmpLine.fileDescrLeft.fullName + wxT("\"") + - _(" overwriting ") + wxT("\"") + cmpLine.fileDescrRight.fullName + wxT("\"")); - - removeFile(cmpLine.fileDescrRight.fullName, useRecycleBin); //only used if switch activated by user, else file is simply deleted - copyfileMultithreaded(cmpLine.fileDescrLeft.fullName, cmpLine.fileDescrRight.fullName, statusUpdater); - break; - case SyncConfiguration::SYNC_DIR_NONE: - return false; - default: - assert (false); - } - break; - - case FILE_EQUAL: - return false; - - default: - assert (false); - } - return true; -} - - -bool FreeFileSync::synchronizeFolder(const FileCompareLine& cmpLine, const SyncConfiguration& config, const bool useRecycleBin, StatusHandler* statusUpdater) -{ //false if nothing was to be done - assert (statusUpdater); - - if (!cmpLine.selectedForSynchronization) return false; - - wxString target; - - //synchronize folders: - switch (cmpLine.cmpResult) - { - case FILE_LEFT_SIDE_ONLY: - switch (config.exLeftSideOnly) - { - case SyncConfiguration::SYNC_DIR_LEFT: //delete folders on left - statusUpdater->updateStatusText(wxString(_("Deleting folder ")) + wxT("\"") + cmpLine.fileDescrLeft.fullName + wxT("\"")); - removeDirectory(cmpLine.fileDescrLeft.fullName, useRecycleBin); - break; - case SyncConfiguration::SYNC_DIR_RIGHT: //create folders on right - target = cmpLine.fileDescrRight.directory + cmpLine.fileDescrLeft.relativeName; - statusUpdater->updateStatusText(wxString(_("Creating folder ")) + wxT("\"") + target + wxT("\"")); - - //some check to catch the error that directory on source has been deleted externally after the "compare"... - if (!wxDirExists(cmpLine.fileDescrLeft.fullName)) - throw FileError(wxString(_("Error: Source directory does not exist anymore: ")) + wxT("\"") + cmpLine.fileDescrLeft.fullName + wxT("\"")); - createDirectory(target); - break; - case SyncConfiguration::SYNC_DIR_NONE: - return false; - default: - assert (false); - } - break; - - case FILE_RIGHT_SIDE_ONLY: - switch (config.exRightSideOnly) - { - case SyncConfiguration::SYNC_DIR_LEFT: //create folders on left - target = cmpLine.fileDescrLeft.directory + cmpLine.fileDescrRight.relativeName; - statusUpdater->updateStatusText(wxString(_("Creating folder ")) + wxT("\"") + target + wxT("\"")); - - //some check to catch the error that directory on source has been deleted externally after the "compare"... - if (!wxDirExists(cmpLine.fileDescrRight.fullName)) - throw FileError(wxString(_("Error: Source directory does not exist anymore: ")) + wxT("\"") + cmpLine.fileDescrRight.fullName + wxT("\"")); - createDirectory(target); - break; - case SyncConfiguration::SYNC_DIR_RIGHT: //delete folders on right - statusUpdater->updateStatusText(wxString(_("Deleting folder ")) + wxT("\"") + cmpLine.fileDescrRight.fullName + wxT("\"")); - removeDirectory(cmpLine.fileDescrRight.fullName, useRecycleBin); - break; - case SyncConfiguration::SYNC_DIR_NONE: - return false; - default: - assert (false); - } - break; - - case FILE_EQUAL: - return false; - case FILE_RIGHT_NEWER: - case FILE_LEFT_NEWER: - case FILE_DIFFERENT: - default: - assert (false); - } - return true; -} - - -wxString FreeFileSync::formatFilesizeToShortString(const wxULongLong& filesize) -{ - return formatFilesizeToShortString(filesize.ToDouble()); -} - - -wxString FreeFileSync::formatFilesizeToShortString(const double filesize) -{ - double nrOfBytes = filesize; - - wxString unit = _(" Byte"); - if (nrOfBytes > 999) - { - nrOfBytes/= 1024; - unit = _(" kB"); - if (nrOfBytes > 999) - { - nrOfBytes/= 1024; - unit = _(" MB"); - if (nrOfBytes > 999) - { - nrOfBytes/= 1024; - unit = _(" GB"); - if (nrOfBytes > 999) - { - nrOfBytes/= 1024; - unit = _(" TB"); - if (nrOfBytes > 999) - { - nrOfBytes/= 1024; - unit = _(" PB"); - } - } - } - } - } - - wxString temp; - if (unit == _(" Byte")) //no decimal places in case of bytes - { - double integer = 0; - modf(nrOfBytes, &integer); //get integer part of nrOfBytes - temp = numberToWxString(int(integer)); - } - else - { - nrOfBytes*= 100; //we want up to two decimal places - double integer = 0; - modf(nrOfBytes, &integer); //get integer part of nrOfBytes - - temp = numberToWxString(int(integer)); - - int length = temp.Len(); - - switch (length) - { - case 0: - temp = _("Error"); - break; - case 1: - temp = wxString(wxT("0")) + GlobalResources::decimalPoint + wxT("0") + temp; - break; //0,01 - case 2: - temp = wxString(wxT("0")) + GlobalResources::decimalPoint + temp; - break; //0,11 - case 3: - temp.insert(1, GlobalResources::decimalPoint); - break; //1,11 - case 4: - temp = temp.substr(0, 3); - temp.insert(2, GlobalResources::decimalPoint); - break; //11,1 - case 5: - temp = temp.substr(0, 3); - break; //111 - default: - return _("Error"); - } - } - return (temp + unit); -} - - -void compoundStringToTable(const wxString& compoundInput, const wxChar* delimiter, vector<wxString>& output) -{ - output.clear(); - wxString input(compoundInput); - - //make sure input ends with delimiter - no problem with empty strings here - if (!input.EndsWith(delimiter)) - input+= delimiter; - - unsigned int indexStart = 0; - unsigned int indexEnd = 0; - while ((indexEnd = input.find(delimiter, indexStart )) != string::npos) - { - if (indexStart != indexEnd) //do not add empty strings - { - wxString newEntry = input.substr(indexStart, indexEnd - indexStart); - - newEntry.Trim(true); //remove whitespace characters from right - newEntry.Trim(false); //remove whitespace characters from left - - if (!newEntry.IsEmpty()) - output.push_back(newEntry); - } - indexStart = indexEnd + 1; - } -} - - -inline -void formatFilterString(wxString& filter) -{ -#ifdef FFS_WIN - //Windows does NOT distinguish between upper/lower-case - filter.MakeLower(); -#elif defined FFS_LINUX - //Linux DOES distinguish between upper/lower-case -//nothing to do here -#else - assert(false); -#endif -} - - -inline -void formatFilenameString(wxString& filename) -{ -#ifdef FFS_WIN - //Windows does NOT distinguish between upper/lower-case - filename.MakeLower(); -#elif defined FFS_LINUX - //Linux DOES distinguish between upper/lower-case -//nothing to do here -#else - assert(false); -#endif -} - - -inline -void mergeVectors(vector<wxString>& changing, const vector<wxString>& input) -{ - for (vector<wxString>::const_iterator i = input.begin(); i != input.end(); ++i) - changing.push_back(*i); -} - - -vector<wxString> FreeFileSync::compoundStringToFilter(const wxString& filterString) -{ - //delimiters may be ';' or '\n' - vector<wxString> filterList; - vector<wxString> filterPreProcessing; - compoundStringToTable(filterString, wxT(";"), filterPreProcessing); - - for (vector<wxString>::const_iterator i = filterPreProcessing.begin(); i != filterPreProcessing.end(); ++i) - { - vector<wxString> newEntries; - compoundStringToTable(*i, wxT("\n"), newEntries); - mergeVectors(filterList, newEntries); - } - - return filterList; -} - - -void FreeFileSync::filterCurrentGridData(FileCompareResult& currentGridData, const wxString& includeFilter, const wxString& excludeFilter) -{ - //load filter into vectors of strings - //delimiters may be ';' or '\n' - vector<wxString> includeList = FreeFileSync::compoundStringToFilter(includeFilter); - vector<wxString> excludeList = FreeFileSync::compoundStringToFilter(excludeFilter); - - //format entries - for (vector<wxString>::iterator i = includeList.begin(); i != includeList.end(); ++i) - formatFilterString(*i); - for (vector<wxString>::iterator i = excludeList.begin(); i != excludeList.end(); ++i) - formatFilterString(*i); - -//############################################################## - - //filter currentGridData - for (FileCompareResult::iterator i = currentGridData.begin(); i != currentGridData.end(); ++i) - { - wxString filenameLeft = i->fileDescrLeft.fullName; - wxString filenameRight = i->fileDescrRight.fullName; - - formatFilenameString(filenameLeft); - formatFilenameString(filenameRight); - - //process include filters - if (i->fileDescrLeft.objType != FileDescrLine::TYPE_NOTHING) - { - bool includedLeft = false; - for (vector<wxString>::const_iterator j = includeList.begin(); j != includeList.end(); ++j) - if (filenameLeft.Matches(*j)) - { - includedLeft = true; - break; - } - - if (!includedLeft) - { - i->selectedForSynchronization = false; - continue; - } - } - - if (i->fileDescrRight.objType != FileDescrLine::TYPE_NOTHING) - { - bool includedRight = false; - for (vector<wxString>::const_iterator j = includeList.begin(); j != includeList.end(); ++j) - if (filenameRight.Matches(*j)) - { - includedRight = true; - break; - } - - if (!includedRight) - { - i->selectedForSynchronization = false; - continue; - } - } - - //process exclude filters - bool excluded = false; - for (vector<wxString>::const_iterator j = excludeList.begin(); j != excludeList.end(); ++j) - if (filenameLeft.Matches(*j) || filenameRight.Matches(*j)) - { - excluded = true; - break; - } - - if (excluded) - { - i->selectedForSynchronization = false; - continue; - } - - i->selectedForSynchronization = true; - } -} - - -void FreeFileSync::removeFilterOnCurrentGridData(FileCompareResult& currentGridData) -{ - //remove all filters on currentGridData - for (FileCompareResult::iterator i = currentGridData.begin(); i != currentGridData.end(); ++i) - i->selectedForSynchronization = true; -} - - -wxString FreeFileSync::getFormattedDirectoryName(const wxString& dirname) -{ //Formatting is needed since functions in FreeFileSync.cpp expect the directory to end with '\' to be able to split the relative names. - //Also improves usability. - - wxString dirnameTmp = dirname; - dirnameTmp.Trim(true); //remove whitespace characters from right - dirnameTmp.Trim(false); //remove whitespace characters from left - - if (dirnameTmp.IsEmpty()) //an empty string is interpreted as "\"; this is not desired - return wxEmptyString; - - //let wxWidgets do the directory formatting, e.g. replace '/' with '\' for Windows - wxString result = wxDir(dirnameTmp).GetName(); - - result.Append(GlobalResources::fileNameSeparator); - return result; -} - - -inline -bool deletionImminent(const FileCompareLine& line, const SyncConfiguration& config) -{ //test if current sync-line will result in deletion of files -> used to avoid disc space bottlenecks - if ( (line.cmpResult == FILE_LEFT_SIDE_ONLY && config.exLeftSideOnly == SyncConfiguration::SYNC_DIR_LEFT) || - (line.cmpResult == FILE_RIGHT_SIDE_ONLY && config.exRightSideOnly == SyncConfiguration::SYNC_DIR_RIGHT)) - return true; - else - return false; -} - - -class AlwaysWriteToGrid //this class ensures, that the result of the method below is ALWAYS written on exit, even if exceptions are thrown! -{ -public: - AlwaysWriteToGrid(FileCompareResult& grid) : - gridToWrite(grid) - {} - - ~AlwaysWriteToGrid() - { - removeRowsFromVector(gridToWrite, rowsProcessed); - } - - void rowProcessedSuccessfully(int nr) - { - rowsProcessed.insert(nr); - } - -private: - FileCompareResult& gridToWrite; - set<int> rowsProcessed; -}; - - -//synchronizes while processing rows in grid and returns all rows that have not been synced -void FreeFileSync::startSynchronizationProcess(FileCompareResult& grid, const SyncConfiguration& config, StatusHandler* statusUpdater, const bool useRecycleBin) -{ - assert (statusUpdater); - -#ifndef __WXDEBUG__ - wxLogNull noWxLogs; //prevent wxWidgets logging -#endif - - AlwaysWriteToGrid writeOutput(grid); //ensure that grid is always written to, even if method is exitted via exceptions - - //inform about the total amount of data that will be processed from now on - int objectsToCreate = 0; - int objectsToOverwrite = 0; - int objectsToDelete = 0; - double dataToProcess = 0; - calcTotalBytesToSync(objectsToCreate, - objectsToOverwrite, - objectsToDelete, - dataToProcess, - grid, - config); - - statusUpdater->initNewProcess(objectsToCreate + objectsToOverwrite + objectsToDelete, dataToProcess, StatusHandler::PROCESS_SYNCHRONIZING); - - try - { - // it should never happen, that a directory on left side has same name as file on right side. startCompareProcess() should take care of this - // and split into two "exists on one side only" cases - // Note: this case is not handled by this tool as this is considered to be a bug and must be solved by the user - - //synchronize folders: - for (FileCompareResult::const_iterator i = grid.begin(); i != grid.end(); ++i) - { - if ( i->fileDescrLeft.objType == FileDescrLine::TYPE_DIRECTORY || - i->fileDescrRight.objType == FileDescrLine::TYPE_DIRECTORY) - { - - while (true) - { //trigger display refresh - statusUpdater->requestUiRefresh(); - - try - { - if (FreeFileSync::synchronizeFolder(*i, config, useRecycleBin, statusUpdater)) - //progress indicator update - //indicator is updated only if directory is synched correctly (and if some sync was done)! - statusUpdater->updateProcessedData(1, 0); //each call represents one processed file/directory - - writeOutput.rowProcessedSuccessfully(i - grid.begin()); - break; - } - catch (FileError& error) - { - //if (updateClass) -> is mandatory - ErrorHandler::Response rv = statusUpdater->reportError(error.show()); - - if ( rv == ErrorHandler::CONTINUE_NEXT) - break; - else if (rv == ErrorHandler::RETRY) - ; //continue with loop - else - assert (false); - } - } - } - } - - //synchronize files: - bool deleteLoop = true; - for (int k = 0; k < 2; ++k) //loop over all files twice; reason: first delete, then copy (no sorting necessary: performance) - { - deleteLoop = !k; //-> first loop: delete files, second loop: copy files - - for (FileCompareResult::const_iterator i = grid.begin(); i != grid.end(); ++i) - { - if ( i->fileDescrLeft.objType == FileDescrLine::TYPE_FILE || - i->fileDescrRight.objType == FileDescrLine::TYPE_FILE) - { - if (deleteLoop && deletionImminent(*i, config) || - !deleteLoop && !deletionImminent(*i, config)) - { - while (true) - { //trigger display refresh - statusUpdater->requestUiRefresh(); - - try - { - if (FreeFileSync::synchronizeFile(*i, config, useRecycleBin, statusUpdater)) - { - //progress indicator update - //indicator is updated only if file is sync'ed correctly (and if some sync was done)! - int objectsToCreate = 0; - int objectsToOverwrite = 0; - int objectsToDelete = 0; - double dataToProcess = 0; - - if (getBytesToTransfer(objectsToCreate, - objectsToOverwrite, - objectsToDelete, - dataToProcess, - *i, - config)) //update status if some work was done (answer is always "yes" in this context) - statusUpdater->updateProcessedData(objectsToCreate + objectsToOverwrite + objectsToDelete, dataToProcess); - } - - writeOutput.rowProcessedSuccessfully(i - grid.begin()); - break; - } - catch (FileError& error) - { - //if (updateClass) -> is mandatory - ErrorHandler::Response rv = statusUpdater->reportError(error.show()); - - if ( rv == ErrorHandler::CONTINUE_NEXT) - break; - else if (rv == ErrorHandler::RETRY) - ; //continue with loop - else - assert (false); - } - } - } - } - } - } - } - catch (const RuntimeException& theException) - { - wxMessageBox(theException.show(), _("An exception occured!"), wxOK | wxICON_ERROR); - return; - } -} - - -//add(!) all files and subfolder gridlines that are dependent from the directory -void FreeFileSync::addSubElements(set<int>& subElements, const FileCompareResult& grid, const FileCompareLine& relevantRow) -{ - wxString relevantDirectory; - - if (relevantRow.fileDescrLeft.objType == FileDescrLine::TYPE_DIRECTORY) - relevantDirectory = relevantRow.fileDescrLeft.relativeName + GlobalResources::fileNameSeparator; //fileNameSeparator needed to exclude subfile/dirs only - - else if (relevantRow.fileDescrRight.objType == FileDescrLine::TYPE_DIRECTORY) - relevantDirectory = relevantRow.fileDescrRight.relativeName + GlobalResources::fileNameSeparator; - - else - return; - - for (FileCompareResult::const_iterator i = grid.begin(); i != grid.end(); ++i) - if ( i->fileDescrLeft.relativeName.StartsWith(relevantDirectory) || - i->fileDescrRight.relativeName.StartsWith(relevantDirectory)) - subElements.insert(i - grid.begin()); -} - - -void FreeFileSync::deleteOnGridAndHD(FileCompareResult& grid, const set<int>& rowsToDelete, ErrorHandler* errorHandler, const bool useRecycleBin) -{ - //remove deleted rows from grid - AlwaysWriteToGrid writeOutput(grid); //ensure that grid is always written to, even if method is exitted via exceptions - - //remove from hd - for (set<int>::iterator i = rowsToDelete.begin(); i != rowsToDelete.end(); ++i) - { - const FileCompareLine& currentCmpLine = grid[*i]; - - while (true) - { - try - { - if (currentCmpLine.fileDescrLeft.objType == FileDescrLine::TYPE_FILE) - FreeFileSync::removeFile(currentCmpLine.fileDescrLeft.fullName, useRecycleBin); - else if (currentCmpLine.fileDescrLeft.objType == FileDescrLine::TYPE_DIRECTORY) - FreeFileSync::removeDirectory(currentCmpLine.fileDescrLeft.fullName, useRecycleBin); - - if (currentCmpLine.fileDescrRight.objType == FileDescrLine::TYPE_FILE) - FreeFileSync::removeFile(currentCmpLine.fileDescrRight.fullName, useRecycleBin); - else if (currentCmpLine.fileDescrRight.objType == FileDescrLine::TYPE_DIRECTORY) - FreeFileSync::removeDirectory(currentCmpLine.fileDescrRight.fullName, useRecycleBin); - - //remove deleted row from grid - writeOutput.rowProcessedSuccessfully(*i); - - //retrieve all files and subfolder gridlines that are dependent from this deleted entry - set<int> additionalRowsToDelete; - addSubElements(additionalRowsToDelete, grid, grid[*i]); - - //...and remove them also - for (set<int>::iterator j = additionalRowsToDelete.begin(); j != additionalRowsToDelete.end(); ++j) - writeOutput.rowProcessedSuccessfully(*j); - - break; - } - catch (FileError& error) - { - //if (updateClass) -> is mandatory - ErrorHandler::Response rv = errorHandler->reportError(error.show()); - - if (rv == ErrorHandler::CONTINUE_NEXT) - break; - - else if (rv == ErrorHandler::RETRY) - ; //continue in loop - else - assert (false); - } - } - } -} - - -bool FreeFileSync::foldersAreValidForComparison(const vector<FolderPair>& folderPairs, wxString& errorMessage) -{ - for (vector<FolderPair>::const_iterator i = folderPairs.begin(); i != folderPairs.end(); ++i) - { - const wxString leftFolderName = getFormattedDirectoryName(i->leftDirectory); - const wxString rightFolderName = getFormattedDirectoryName(i->rightDirectory); - - //check if folder name is empty - if (leftFolderName.IsEmpty() || rightFolderName.IsEmpty()) - { - errorMessage = _("Please fill all empty directory fields."); - return false; - } - - //check if folder exists - if (!wxDirExists(leftFolderName)) - { - errorMessage = wxString(_("Directory does not exist: ")) + wxT("\"") + leftFolderName + wxT("\""); - return false; - } - if (!wxDirExists(rightFolderName)) - { - errorMessage = wxString(_("Directory does not exist: ")) + wxT("\"") + rightFolderName + wxT("\""); - return false; - } - } - return true; -} - - -void FreeFileSync::adjustModificationTimes(const wxString& parentDirectory, const int timeInSeconds, ErrorHandler* errorHandler) -{ - if (timeInSeconds == 0) - return; - - wxArrayString fileList; - wxArrayString dirList; - - while (true) //own scope for directory access to not disturb file access! - { - fileList.Clear(); - dirList.Clear(); - - //get all files and folders from directory (and subdirectories) - GetAllFilesSimple traverser(fileList, dirList); - - wxDir dir(parentDirectory); - if (dir.Traverse(traverser) != (size_t)-1) - break; //traversed successfully - else - { - ErrorHandler::Response rv = errorHandler->reportError(wxString(_("Error traversing directory ")) + wxT("\"") + parentDirectory + wxT("\"")); - if (rv == ErrorHandler::CONTINUE_NEXT) - break; - else if (rv == ErrorHandler::RETRY) - ; //continue with loop - else - assert (false); - } - } - - - //this part is only a bit slower than direct Windows API-access! - wxDateTime modTime; - for (unsigned int j = 0; j < fileList.GetCount(); ++j) - { - while (true) //own scope for directory access to not disturb file access! - { - try - { - wxFileName file(fileList[j]); - if (!file.GetTimes(NULL, &modTime, NULL)) //get modification time - throw FileError(wxString(_("Error changing modification time: ")) + wxT("\"") + fileList[j] + wxT("\"")); - - modTime.Add(wxTimeSpan(0, 0, timeInSeconds, 0)); - - if (!file.SetTimes(NULL, &modTime, NULL)) //get modification time - throw FileError(wxString(_("Error changing modification time: ")) + wxT("\"") + fileList[j] + wxT("\"")); - - break; - } - catch (const FileError& error) - { - ErrorHandler::Response rv = errorHandler->reportError(error.show()); - if (rv == ErrorHandler::CONTINUE_NEXT) - break; - else if (rv == ErrorHandler::RETRY) - ; //continue with loop - else - assert (false); - } - } - } -} - - - - - - - - diff --git a/FreeFileSync.h b/FreeFileSync.h index 22a0f4e1..92d90189 100644 --- a/FreeFileSync.h +++ b/FreeFileSync.h @@ -4,240 +4,177 @@ #include <wx/string.h> #include <set> #include <vector> -#include <wx/dir.h> -#include <wx/log.h> -#include "library/multithreading.h" +#include "library/statusHandler.h" +#include "library/fileHandling.h" -using namespace std; - -enum CompareVariant -{ - CMP_BY_CONTENT, - CMP_BY_TIME_SIZE -}; - -struct SyncConfiguration +namespace FreeFileSync { - SyncConfiguration() : - exLeftSideOnly(SYNC_DIR_RIGHT), - exRightSideOnly(SYNC_DIR_RIGHT), - leftNewer(SYNC_DIR_RIGHT), - rightNewer(SYNC_DIR_RIGHT), - different(SYNC_DIR_RIGHT) {} - - enum Direction + enum CompareVariant { - SYNC_DIR_LEFT, - SYNC_DIR_RIGHT, - SYNC_DIR_NONE + CMP_BY_CONTENT, + CMP_BY_TIME_SIZE }; - Direction exLeftSideOnly; - Direction exRightSideOnly; - Direction leftNewer; - Direction rightNewer; - Direction different; -}; + struct SyncConfiguration + { + SyncConfiguration() : + exLeftSideOnly(SYNC_DIR_RIGHT), + exRightSideOnly(SYNC_DIR_RIGHT), + leftNewer(SYNC_DIR_RIGHT), + rightNewer(SYNC_DIR_RIGHT), + different(SYNC_DIR_RIGHT) {} + + enum Direction + { + SYNC_DIR_LEFT, + SYNC_DIR_RIGHT, + SYNC_DIR_NONE + }; + + Direction exLeftSideOnly; + Direction exRightSideOnly; + Direction leftNewer; + Direction rightNewer; + Direction different; + }; -struct MainConfiguration -{ - MainConfiguration(); - //Compare setting - CompareVariant compareVar; + struct MainConfiguration + { + MainConfiguration() : + compareVar(CMP_BY_TIME_SIZE), + filterIsActive(false), //do not filter by default + includeFilter(wxT("*")), //include all files/folders + excludeFilter(wxEmptyString), //exclude nothing + useRecycleBin(FreeFileSync::recycleBinExists()), //enable if OS supports it; else user will have to activate first and then get an error message + ignoreErrors(false) {} - //Synchronisation settings - SyncConfiguration syncConfiguration; + //Compare setting + CompareVariant compareVar; - //Filter setting - bool filterIsActive; - wxString includeFilter; - wxString excludeFilter; + //Synchronisation settings + SyncConfiguration syncConfiguration; + //Filter setting + bool filterIsActive; + wxString includeFilter; + wxString excludeFilter; - //misc options - bool useRecycleBin; //use Recycle bin when deleting or overwriting files while synchronizing - bool continueOnError; //hides error messages during synchronization -}; + //misc options + bool useRecycleBin; //use Recycle bin when deleting or overwriting files while synchronizing + bool ignoreErrors; //hides error messages during synchronization + }; -struct FileDescrLine -{ - FileDescrLine() : objType(TYPE_NOTHING) {} - enum ObjectType + struct FileDescrLine { - TYPE_NOTHING, - TYPE_DIRECTORY, - TYPE_FILE - }; - - wxString fullName; // == directory + relativeName - wxString directory; //directory to be synced - wxString relativeName; //fullName without directory that is being synchronized - //Note on performance: Keep redundant information "directory" and "relativeName"! Extracting info from "fullName" results in noticeable performance loss! - wxString lastWriteTime; - wxULongLong lastWriteTimeRaw; - wxULongLong fileSize; - ObjectType objType; //is it a file or directory or initial? - - //the following operators are needed by template class "set" - //DO NOT CHANGE THESE RELATIONS!!! + FileDescrLine() : objType(TYPE_NOTHING) {} + + enum ObjectType + { + TYPE_NOTHING, + TYPE_DIRECTORY, + TYPE_FILE + }; + + wxString fullName; // == directory + relativeName + wxString directory; //directory to be synced + separator + wxString relativeName; //fullName without directory that is being synchronized + //Note on performance: Keep redundant information "directory" and "relativeName"! + //Extracting info from "fullName" instead would result in noticeable performance loss, with only limited memory reduction (note ref. counting strings)! + wxString lastWriteTime; + wxULongLong lastWriteTimeRaw; + wxULongLong fileSize; + ObjectType objType; //is it a file or directory or initial? + + //the following operators are needed by template class "set" + //DO NOT CHANGE THESE RELATIONS!!! #ifdef FFS_WIN - //Windows does NOT distinguish between upper/lower-case - bool operator>(const FileDescrLine& b ) const - { - return (relativeName.CmpNoCase(b.relativeName) > 0); - } - bool operator<(const FileDescrLine& b) const - { - return (relativeName.CmpNoCase(b.relativeName) < 0); - } - bool operator==(const FileDescrLine& b) const - { - return (relativeName.CmpNoCase(b.relativeName) == 0); - } + //Windows does NOT distinguish between upper/lower-case + bool operator>(const FileDescrLine& b ) const + { + return (relativeName.CmpNoCase(b.relativeName) > 0); + } + bool operator<(const FileDescrLine& b) const + { + return (relativeName.CmpNoCase(b.relativeName) < 0); + } + bool operator==(const FileDescrLine& b) const + { + return (relativeName.CmpNoCase(b.relativeName) == 0); + } #elif defined FFS_LINUX - //Linux DOES distinguish between upper/lower-case - bool operator>(const FileDescrLine& b ) const - { - return (relativeName.Cmp(b.relativeName) > 0); - } - bool operator<(const FileDescrLine& b) const - { - return (relativeName.Cmp(b.relativeName) < 0); - } - bool operator==(const FileDescrLine& b) const - { - return (relativeName.Cmp(b.relativeName) == 0); - } + //Linux DOES distinguish between upper/lower-case + bool operator>(const FileDescrLine& b ) const + { + return (relativeName.Cmp(b.relativeName) > 0); + } + bool operator<(const FileDescrLine& b) const + { + return (relativeName.Cmp(b.relativeName) < 0); + } + bool operator==(const FileDescrLine& b) const + { + return (relativeName.Cmp(b.relativeName) == 0); + } #else - adapt this + adapt this #endif -}; -typedef set<FileDescrLine> DirectoryDescrType; - - -enum CompareFilesResult -{ - FILE_LEFT_SIDE_ONLY, - FILE_RIGHT_SIDE_ONLY, - FILE_RIGHT_NEWER, - FILE_LEFT_NEWER, - FILE_DIFFERENT, - FILE_EQUAL, - - FILE_UNDEFINED -}; - - -struct FileCompareLine -{ - FileCompareLine() : selectedForSynchronization(true) {} - - FileDescrLine fileDescrLeft; - FileDescrLine fileDescrRight; - - CompareFilesResult cmpResult; - bool selectedForSynchronization; -}; -typedef vector<FileCompareLine> FileCompareResult; - - -typedef int GridViewLine; -typedef vector<GridViewLine> GridView; //vector of references to lines in FileCompareResult - - -struct FolderPair -{ - wxString leftDirectory; - wxString rightDirectory; -}; - - -class RecycleBin; - -namespace FreeFileSync -{ - //main functions for compare - bool foldersAreValidForComparison(const vector<FolderPair>& folderPairs, wxString& errorMessage); - void startCompareProcess(const vector<FolderPair>& directoryPairsFormatted, const CompareVariant cmpVar, FileCompareResult& output, StatusHandler* statusUpdater); - - //main function for synchronization - void startSynchronizationProcess(FileCompareResult& grid, const SyncConfiguration& config, StatusHandler* statusUpdater, const bool useRecycleBin); - - bool recycleBinExists(); //test existence of Recycle Bin API on current system - - void deleteOnGridAndHD(FileCompareResult& grid, const set<int>& rowsToDelete, ErrorHandler* errorHandler, const bool useRecycleBin); - void addSubElements(set<int>& subElements, const FileCompareResult& grid, const FileCompareLine& relevantRow); - - void filterCurrentGridData(FileCompareResult& currentGridData, const wxString& includeFilter, const wxString& excludeFilter); - void removeFilterOnCurrentGridData(FileCompareResult& currentGridData); - - wxString formatFilesizeToShortString(const wxULongLong& filesize); - wxString formatFilesizeToShortString(const double filesize); - wxString getFormattedDirectoryName(const wxString& dirname); - - void calcTotalBytesToSync(int& objectsToCreate, - int& objectsToOverwrite, - int& objectsToDelete, - double& dataToProcess, - const FileCompareResult& fileCmpResult, - const SyncConfiguration& config); - - void swapGrids(FileCompareResult& grid); - - void adjustModificationTimes(const wxString& parentDirectory, const int timeInSeconds, ErrorHandler* errorHandler); + }; + typedef set<FileDescrLine> DirectoryDescrType; - const wxString FfsLastConfigFile = wxT("LastRun.ffs_gui"); - const wxString FfsGlobalSettingsFile = wxT("GlobalSettings.xml"); + enum CompareFilesResult + { + FILE_LEFT_SIDE_ONLY, + FILE_RIGHT_SIDE_ONLY, + FILE_LEFT_NEWER, + FILE_RIGHT_NEWER, + FILE_DIFFERENT, + FILE_EQUAL, + + FILE_UNDEFINED + }; -//+++++++++++++++++++SUBROUTINES++++++++++++++++++++++++++ - //create comparison result table and fill relation except for files existing on both sides - void performBaseComparison(const vector<FolderPair>& directoryPairsFormatted, - FileCompareResult& output, - StatusHandler* statusUpdater); - bool synchronizeFile(const FileCompareLine& cmpLine, const SyncConfiguration& config, const bool useRecycleBin, StatusHandler* statusUpdater); // false if nothing had to be done - bool synchronizeFolder(const FileCompareLine& cmpLine, const SyncConfiguration& config, const bool useRecycleBin, StatusHandler* statusUpdater); // false if nothing had to be done + struct FileCompareLine + { + FileCompareLine() : selectedForSynchronization(true) {} - //file functionality - void removeDirectory(const wxString& directory, const bool useRecycleBin); - void removeFile(const wxString& filename, const bool useRecycleBin); - void copyfileMultithreaded(const wxString& source, const wxString& target, StatusHandler* updateClass); - void createDirectory(const wxString& directory, int level = 0); //level is used internally only + FileDescrLine fileDescrLeft; + FileDescrLine fileDescrRight; - //misc - vector<wxString> compoundStringToFilter(const wxString& filterString); //convert compound string, separated by ';' or '\n' into formatted vector of wxStrings + CompareFilesResult cmpResult; + bool selectedForSynchronization; + }; + typedef vector<FileCompareLine> FileCompareResult; - extern RecycleBin recycler; -} + typedef int GridViewLine; + typedef vector<GridViewLine> GridView; //vector of references to lines in FileCompareResult -class FileError //Exception class used to notify file/directory copy/delete errors -{ -public: - FileError(const wxString& txt) : errorMessage(txt) {} - wxString show() const + struct FolderPair { - return errorMessage; - } + wxString leftDirectory; + wxString rightDirectory; + }; -private: - wxString errorMessage; -}; + class AbortThisProcess //Exception class used to abort the "compare" and "sync" process + { + public: + AbortThisProcess() {} + ~AbortThisProcess() {} + }; -class AbortThisProcess //Exception class used to abort the "compare" and "sync" process -{ -public: - AbortThisProcess() {} - ~AbortThisProcess() {} -}; + const int FILE_TIME_PRECISION = 2; //file times have precision of 2 seconds due to FAT/FAT32 file systems + const wxString LAST_CONFIG_FILE = wxT("LastRun.ffs_gui"); + const wxString GLOBAL_CONFIG_FILE = wxT("GlobalSettings.xml"); +} #endif // FREEFILESYNC_H_INCLUDED @@ -3,8 +3,14 @@ ENDFLAGS=`wx-config --libs` -lwx_gtk2_aui-2.8 -O3 -pthread all: FreeFileSync -obj/FreeFileSync.o: FreeFileSync.cpp - g++ $(CPPFLAGS) FreeFileSync.cpp -o obj/FreeFileSync.o +obj/algorithm.o: algorithm.cpp + g++ $(CPPFLAGS) algorithm.cpp -o obj/algorithm.o + +obj/comparison.o: comparison.cpp + g++ $(CPPFLAGS) comparison.cpp -o obj/comparison.o + +obj/synchronization.o: synchronization.cpp + g++ $(CPPFLAGS) synchronization.cpp -o obj/synchronization.o obj/application.o: application.cpp g++ $(CPPFLAGS) application.cpp -o obj/application.o @@ -24,6 +30,9 @@ obj/syncDialog.o: ui/syncDialog.cpp obj/customGrid.o: library/customGrid.cpp g++ $(CPPFLAGS) library/customGrid.cpp -o obj/customGrid.o +obj/fileHandling.o: library/fileHandling.cpp + g++ $(CPPFLAGS) library/fileHandling.cpp -o obj/fileHandling.o + obj/multithreading.o: library/multithreading.cpp g++ $(CPPFLAGS) library/multithreading.cpp -o obj/multithreading.o @@ -51,8 +60,8 @@ obj/tinyxmlparser.o: library/tinyxml/tinyxmlparser.cpp obj/processXml.o: library/processXml.cpp g++ $(CPPFLAGS) library/processXml.cpp -o obj/processXml.o -FreeFileSync: obj/FreeFileSync.o obj/application.o obj/globalFunctions.o obj/guiGenerated.o obj/mainDialog.o obj/syncDialog.o obj/customGrid.o obj/resources.o obj/smallDialogs.o obj/multithreading.o obj/misc.o obj/tinyxml.o obj/tinystr.o obj/tinyxmlerror.o obj/tinyxmlparser.o obj/processXml.o - g++ $(ENDFLAGS) -o FreeFileSync obj/application.o obj/FreeFileSync.o obj/globalFunctions.o obj/guiGenerated.o obj/mainDialog.o obj/syncDialog.o obj/customGrid.o obj/resources.o obj/smallDialogs.o obj/multithreading.o obj/misc.o obj/tinyxml.o obj/tinystr.o obj/tinyxmlerror.o obj/tinyxmlparser.o obj/processXml.o +FreeFileSync: obj/application.o obj/algorithm.o obj/comparison.o obj/synchronization.o obj/globalFunctions.o obj/guiGenerated.o obj/mainDialog.o obj/syncDialog.o obj/customGrid.o obj/fileHandling.o obj/resources.o obj/smallDialogs.o obj/multithreading.o obj/misc.o obj/tinyxml.o obj/tinystr.o obj/tinyxmlerror.o obj/tinyxmlparser.o obj/processXml.o + g++ $(ENDFLAGS) -o FreeFileSync obj/application.o obj/algorithm.o obj/comparison.o obj/synchronization.o obj/globalFunctions.o obj/guiGenerated.o obj/mainDialog.o obj/syncDialog.o obj/customGrid.o obj/fileHandling.o obj/resources.o obj/smallDialogs.o obj/multithreading.o obj/misc.o obj/tinyxml.o obj/tinystr.o obj/tinyxmlerror.o obj/tinyxmlparser.o obj/processXml.o clean: diff --git a/Makefile_Win_Unicode.cmd b/Makefile_Win_Unicode.cmd index 61d53dce..aab510e1 100644 --- a/Makefile_Win_Unicode.cmd +++ b/Makefile_Win_Unicode.cmd @@ -7,10 +7,13 @@ set mingw=C:\Programme\C++\MinGW\bin set parameters=-Wall -pipe -mthreads -D__GNUWIN32__ -DwxUSE_UNICODE -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -DTIXML_USE_STL path=%path%;%mingw% if not exist obj md obj -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\application.cpp -o obj\Application.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\FreeFileSync.cpp -o obj\FreeFileSync.o +mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\application.cpp -o obj\application.o +mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\algorithm.cpp -o obj\algorithm.o +mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\comparison.cpp -o obj\comparison.o +mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\synchronization.cpp -o obj\synchronization.o mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\globalFunctions.cpp -o obj\globalFunctions.o mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\multithreading.cpp -o obj\multithreading.o +mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\fileHandling.cpp -o obj\fileHandling.o mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\ui\guiGenerated.cpp -o obj\GUI_Generated.o mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\ui\mainDialog.cpp -o obj\MainDialog.o mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\ui\syncDialog.cpp -o obj\SyncDialog.o @@ -25,5 +28,5 @@ mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I% mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\processXml.cpp -o obj\processXml.o windres.exe -i %sources%\resource.rc -J rc -o obj\resource.res -O coff -I%widgets%\include -I%widgetslib% -mingw32-g++.exe -L%widgets%\lib\gcc_lib -o FreeFileSync.exe obj\Application.o obj\FreeFileSync.o obj\globalFunctions.o obj\multithreading.o obj\misc.o obj\GUI_Generated.o obj\MainDialog.o obj\SyncDialog.o obj\CustomGrid.o obj\Resources.o obj\SmallDialogs.o obj\resource.res obj\tinyxml.o obj\tinystr.o obj\tinyxmlerror.o obj\tinyxmlparser.o obj\processXml.o -s -mthreads -lwxmsw28u_adv -lwxmsw28u_core -lwxbase28u -lwxpng -lwxzlib -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lcomctl32 -lwsock32 -lodbc32 -mwindows +mingw32-g++.exe -L%widgets%\lib\gcc_lib -o FreeFileSync.exe obj\application.o obj\algorithm.o obj\comparison.o obj\synchronization.o obj\globalFunctions.o obj\multithreading.o obj\fileHandling.o obj\misc.o obj\GUI_Generated.o obj\MainDialog.o obj\SyncDialog.o obj\CustomGrid.o obj\Resources.o obj\SmallDialogs.o obj\resource.res obj\tinyxml.o obj\tinystr.o obj\tinyxmlerror.o obj\tinyxmlparser.o obj\processXml.o -s -mthreads -lwxmsw28u_adv -lwxmsw28u_core -lwxbase28u -lwxpng -lwxzlib -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lcomctl32 -lwsock32 -lodbc32 -mwindows pause
\ No newline at end of file @@ -1,4 +1,4 @@ -FreeFileSync v1.12 +FreeFileSync v1.13 ------------------ Usage @@ -34,12 +34,13 @@ Key Features 12. Support for filesizes > 4 GB. 13. Option to move files to Recycle Bin instead of deleting/overwriting them. 14. Automatically ignore directories "\RECYCLER" and "\System Volume Information" when comparing and sync'ing. (Windows only) -15. Localized English, German, French and Japanese versions available. +15. Localized English, German, French, Dutch and Japanese versions available. 16. Delete before copy: Avoid disc space shortages with large sync-operations. 17. Based on wxWidgets framework => Portable to many operating systems. 18. Filter functionality to include/exclude files from synchronization (without re-compare!). 19. Include/exclude specific files from synchronization manually. 20. Create sync jobs via GUI to synchronize automatically (can be scheduled or executed directly). +21. Handle daylight saving time changes on FAT/FAT32 volumes correctly and automatically: No need für a "ignore +/-1h" option Links diff --git a/Resources.dat b/Resources.dat Binary files differindex fd4e61a8..76da9870 100644 --- a/Resources.dat +++ b/Resources.dat diff --git a/algorithm.cpp b/algorithm.cpp new file mode 100644 index 00000000..4ea1a82d --- /dev/null +++ b/algorithm.cpp @@ -0,0 +1,682 @@ +#include "algorithm.h" +#include <wx/intl.h> +#include <cmath> +#include <wx/filename.h> +#include <wx/log.h> +#include "library/resources.h" + +#ifdef FFS_WIN +#include <windows.h> +#endif //FFS_WIN + +using namespace FreeFileSync; + + +wxString FreeFileSync::formatFilesizeToShortString(const wxULongLong& filesize) +{ + return formatFilesizeToShortString(filesize.ToDouble()); +} + + +wxString FreeFileSync::formatFilesizeToShortString(const double filesize) +{ + double nrOfBytes = filesize; + + wxString unit = _(" Byte"); + if (nrOfBytes > 999) + { + nrOfBytes/= 1024; + unit = _(" kB"); + if (nrOfBytes > 999) + { + nrOfBytes/= 1024; + unit = _(" MB"); + if (nrOfBytes > 999) + { + nrOfBytes/= 1024; + unit = _(" GB"); + if (nrOfBytes > 999) + { + nrOfBytes/= 1024; + unit = _(" TB"); + if (nrOfBytes > 999) + { + nrOfBytes/= 1024; + unit = _(" PB"); + } + } + } + } + } + + wxString temp; + if (unit == _(" Byte")) //no decimal places in case of bytes + { + double integer = 0; + modf(nrOfBytes, &integer); //get integer part of nrOfBytes + temp = globalFunctions::numberToWxString(int(integer)); + } + else + { + nrOfBytes*= 100; //we want up to two decimal places + double integer = 0; + modf(nrOfBytes, &integer); //get integer part of nrOfBytes + + temp = globalFunctions::numberToWxString(int(integer)); + + int length = temp.Len(); + + switch (length) + { + case 0: + temp = _("Error"); + break; + case 1: + temp = wxString(wxT("0")) + GlobalResources::DECIMAL_POINT + wxT("0") + temp; + break; //0,01 + case 2: + temp = wxString(wxT("0")) + GlobalResources::DECIMAL_POINT + temp; + break; //0,11 + case 3: + temp.insert(1, GlobalResources::DECIMAL_POINT); + break; //1,11 + case 4: + temp = temp.substr(0, 3); + temp.insert(2, GlobalResources::DECIMAL_POINT); + break; //11,1 + case 5: + temp = temp.substr(0, 3); + break; //111 + default: + return _("Error"); + } + } + return (temp + unit); +} + + +wxString FreeFileSync::getFormattedDirectoryName(const wxString& dirname) +{ //Formatting is needed since functions in FreeFileSync.cpp expect the directory to end with '\' to be able to split the relative names. + //Also improves usability. + + wxString dirnameTmp = dirname; + dirnameTmp.Trim(true); //remove whitespace characters from right + dirnameTmp.Trim(false); //remove whitespace characters from left + + if (dirnameTmp.IsEmpty()) //an empty string is interpreted as "\"; this is not desired + return wxEmptyString; + + //let wxWidgets do the directory formatting, e.g. replace '/' with '\' for Windows + wxFileName directory = wxFileName::DirName(dirnameTmp); + wxString result = directory.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR); + + return result; +} + + +void FreeFileSync::swapGrids(FileCompareResult& grid) +{ + FileDescrLine tmp; + + for (FileCompareResult::iterator i = grid.begin(); i != grid.end(); ++i) + { + //swap compare result + if (i->cmpResult == FILE_LEFT_SIDE_ONLY) + i->cmpResult = FILE_RIGHT_SIDE_ONLY; + else if (i->cmpResult == FILE_RIGHT_SIDE_ONLY) + i->cmpResult = FILE_LEFT_SIDE_ONLY; + else if (i->cmpResult == FILE_RIGHT_NEWER) + i->cmpResult = FILE_LEFT_NEWER; + else if (i->cmpResult == FILE_LEFT_NEWER) + i->cmpResult = FILE_RIGHT_NEWER; + + //swap file descriptors + tmp = i->fileDescrLeft; + i->fileDescrLeft = i->fileDescrRight; + i->fileDescrRight = tmp; + } +} + + +void FreeFileSync::adjustModificationTimes(const wxString& parentDirectory, const int timeInSeconds, ErrorHandler* errorHandler) throw(AbortThisProcess) +{ +#ifndef __WXDEBUG__ + wxLogNull noWxLogs; //prevent wxWidgets logging +#endif + + if (timeInSeconds == 0) + return; + + wxArrayString fileList; + wxArrayString dirList; + + while (true) //should be executed in own scope so that directory access does not disturb deletion + { + try + { //get all files and folders from directory (and subdirectories) + FreeFileSync::getAllFilesAndDirs(parentDirectory, fileList, dirList); + break; + } + catch (const FileError& e) + { + ErrorHandler::Response rv = errorHandler->reportError(e.show()); + if (rv == ErrorHandler::CONTINUE_NEXT) + break; + else if (rv == ErrorHandler::RETRY) + ; //continue with loop + else + assert (false); + } + } + + //this part is only a bit slower than direct Windows API-access! + wxDateTime modTime; + for (unsigned int j = 0; j < fileList.GetCount(); ++j) + { + while (true) //own scope for directory access to not disturb file access! + { + try + { + wxFileName file(fileList[j]); + if (!file.GetTimes(NULL, &modTime, NULL)) //get modification time + throw FileError(wxString(_("Error changing modification time: ")) + wxT("\"") + fileList[j] + wxT("\"")); + + modTime.Add(wxTimeSpan(0, 0, timeInSeconds, 0)); + + if (!file.SetTimes(NULL, &modTime, NULL)) //get modification time + throw FileError(wxString(_("Error changing modification time: ")) + wxT("\"") + fileList[j] + wxT("\"")); + + break; + } + catch (const FileError& error) + { + ErrorHandler::Response rv = errorHandler->reportError(error.show()); + if (rv == ErrorHandler::CONTINUE_NEXT) + break; + else if (rv == ErrorHandler::RETRY) + ; //continue with loop + else + assert (false); + } + } + } +} + + +void compoundStringToTable(const wxString& compoundInput, const wxChar* delimiter, vector<wxString>& output) +{ + output.clear(); + wxString input(compoundInput); + + //make sure input ends with delimiter - no problem with empty strings here + if (!input.EndsWith(delimiter)) + input+= delimiter; + + unsigned int indexStart = 0; + unsigned int indexEnd = 0; + while ((indexEnd = input.find(delimiter, indexStart )) != string::npos) + { + if (indexStart != indexEnd) //do not add empty strings + { + wxString newEntry = input.substr(indexStart, indexEnd - indexStart); + + newEntry.Trim(true); //remove whitespace characters from right + newEntry.Trim(false); //remove whitespace characters from left + + if (!newEntry.IsEmpty()) + output.push_back(newEntry); + } + indexStart = indexEnd + 1; + } +} + + +inline +void formatFilterString(wxString& filter) +{ +#ifdef FFS_WIN + //Windows does NOT distinguish between upper/lower-case + filter.MakeLower(); +#elif defined FFS_LINUX + //Linux DOES distinguish between upper/lower-case +//nothing to do here +#else + adapt; +#endif +} + + +inline +void formatFilenameString(wxString& filename) +{ +#ifdef FFS_WIN + //Windows does NOT distinguish between upper/lower-case + filename.MakeLower(); +#elif defined FFS_LINUX + //Linux DOES distinguish between upper/lower-case +//nothing to do here +#else + adapt; +#endif +} + + +inline +void mergeVectors(vector<wxString>& changing, const vector<wxString>& input) +{ + for (vector<wxString>::const_iterator i = input.begin(); i != input.end(); ++i) + changing.push_back(*i); +} + + +vector<wxString> FreeFileSync::compoundStringToFilter(const wxString& filterString) +{ + //delimiters may be ';' or '\n' + vector<wxString> filterList; + vector<wxString> filterPreProcessing; + compoundStringToTable(filterString, wxT(";"), filterPreProcessing); + + for (vector<wxString>::const_iterator i = filterPreProcessing.begin(); i != filterPreProcessing.end(); ++i) + { + vector<wxString> newEntries; + compoundStringToTable(*i, wxT("\n"), newEntries); + mergeVectors(filterList, newEntries); + } + + return filterList; +} + + +void FreeFileSync::filterCurrentGridData(FileCompareResult& currentGridData, const wxString& includeFilter, const wxString& excludeFilter) +{ + //no need for regular expressions! In tests wxRegex was by factor of 10 slower than wxString::Matches()!! + + //load filter into vectors of strings + //delimiters may be ';' or '\n' + vector<wxString> includeList = FreeFileSync::compoundStringToFilter(includeFilter); + vector<wxString> excludeList = FreeFileSync::compoundStringToFilter(excludeFilter); + + //format entries + for (vector<wxString>::iterator i = includeList.begin(); i != includeList.end(); ++i) + formatFilterString(*i); + for (vector<wxString>::iterator i = excludeList.begin(); i != excludeList.end(); ++i) + formatFilterString(*i); + +//############################################################## + + //filter currentGridData + for (FileCompareResult::iterator i = currentGridData.begin(); i != currentGridData.end(); ++i) + { + wxString filenameLeft = i->fileDescrLeft.fullName; + wxString filenameRight = i->fileDescrRight.fullName; + + formatFilenameString(filenameLeft); + formatFilenameString(filenameRight); + + //process include filters + if (i->fileDescrLeft.objType != FileDescrLine::TYPE_NOTHING) + { + bool includedLeft = false; + for (vector<wxString>::const_iterator j = includeList.begin(); j != includeList.end(); ++j) + if (filenameLeft.Matches(*j)) + { + includedLeft = true; + break; + } + + if (!includedLeft) + { + i->selectedForSynchronization = false; + continue; + } + } + + if (i->fileDescrRight.objType != FileDescrLine::TYPE_NOTHING) + { + bool includedRight = false; + for (vector<wxString>::const_iterator j = includeList.begin(); j != includeList.end(); ++j) + if (filenameRight.Matches(*j)) + { + includedRight = true; + break; + } + + if (!includedRight) + { + i->selectedForSynchronization = false; + continue; + } + } + + //process exclude filters + if (i->fileDescrLeft.objType != FileDescrLine::TYPE_NOTHING) + { + bool excluded = false; + for (vector<wxString>::const_iterator j = excludeList.begin(); j != excludeList.end(); ++j) + if (filenameLeft.Matches(*j)) + { + excluded = true; + break; + } + + if (excluded) + { + i->selectedForSynchronization = false; + continue; + } + } + + if (i->fileDescrRight.objType != FileDescrLine::TYPE_NOTHING) + { + bool excluded = false; + for (vector<wxString>::const_iterator j = excludeList.begin(); j != excludeList.end(); ++j) + if (filenameRight.Matches(*j)) + { + excluded = true; + break; + } + + if (excluded) + { + i->selectedForSynchronization = false; + continue; + } + } + + i->selectedForSynchronization = true; + } +} + + +void FreeFileSync::removeFilterOnCurrentGridData(FileCompareResult& currentGridData) +{ + //remove all filters on currentGridData + for (FileCompareResult::iterator i = currentGridData.begin(); i != currentGridData.end(); ++i) + i->selectedForSynchronization = true; +} + + +//add(!) all files and subfolder gridlines that are dependent from the directory +void FreeFileSync::addSubElements(set<int>& subElements, const FileCompareResult& grid, const FileCompareLine& relevantRow) +{ + wxString relevantDirectory; + + if (relevantRow.fileDescrLeft.objType == FileDescrLine::TYPE_DIRECTORY) + relevantDirectory = relevantRow.fileDescrLeft.relativeName + GlobalResources::FILE_NAME_SEPARATOR; //FILE_NAME_SEPARATOR needed to exclude subfile/dirs only + else if (relevantRow.fileDescrRight.objType == FileDescrLine::TYPE_DIRECTORY) + relevantDirectory = relevantRow.fileDescrRight.relativeName + GlobalResources::FILE_NAME_SEPARATOR; + else + return; + + for (FileCompareResult::const_iterator i = grid.begin(); i != grid.end(); ++i) + if ( i->fileDescrLeft.relativeName.StartsWith(relevantDirectory) || + i->fileDescrRight.relativeName.StartsWith(relevantDirectory)) + subElements.insert(i - grid.begin()); +} + + +class AlwaysWriteToGrid //this class ensures, that the result of the method below is ALWAYS written on exit, even if exceptions are thrown! +{ +public: + AlwaysWriteToGrid(FileCompareResult& grid) : + gridToWrite(grid) + {} + + ~AlwaysWriteToGrid() + { + removeRowsFromVector(gridToWrite, rowsProcessed); + } + + void rowProcessedSuccessfully(int nr) + { + rowsProcessed.insert(nr); + } + +private: + FileCompareResult& gridToWrite; + set<int> rowsProcessed; +}; + + +void FreeFileSync::deleteOnGridAndHD(FileCompareResult& grid, const set<int>& rowsToDelete, ErrorHandler* errorHandler, const bool useRecycleBin) throw(AbortThisProcess) +{ + //remove deleted rows from grid + AlwaysWriteToGrid writeOutput(grid); //ensure that grid is always written to, even if method is exitted via exceptions + + //remove from hd + for (set<int>::iterator i = rowsToDelete.begin(); i != rowsToDelete.end(); ++i) + { + const FileCompareLine& currentCmpLine = grid[*i]; + + while (true) + { + try + { + if (currentCmpLine.fileDescrLeft.objType == FileDescrLine::TYPE_FILE) + FreeFileSync::removeFile(currentCmpLine.fileDescrLeft.fullName, useRecycleBin); + else if (currentCmpLine.fileDescrLeft.objType == FileDescrLine::TYPE_DIRECTORY) + FreeFileSync::removeDirectory(currentCmpLine.fileDescrLeft.fullName, useRecycleBin); + + if (currentCmpLine.fileDescrRight.objType == FileDescrLine::TYPE_FILE) + FreeFileSync::removeFile(currentCmpLine.fileDescrRight.fullName, useRecycleBin); + else if (currentCmpLine.fileDescrRight.objType == FileDescrLine::TYPE_DIRECTORY) + FreeFileSync::removeDirectory(currentCmpLine.fileDescrRight.fullName, useRecycleBin); + + //remove deleted row from grid + writeOutput.rowProcessedSuccessfully(*i); + + //retrieve all files and subfolder gridlines that are dependent from this deleted entry + set<int> additionalRowsToDelete; + addSubElements(additionalRowsToDelete, grid, grid[*i]); + + //...and remove them also + for (set<int>::iterator j = additionalRowsToDelete.begin(); j != additionalRowsToDelete.end(); ++j) + writeOutput.rowProcessedSuccessfully(*j); + + break; + } + catch (const FileError& error) + { + //if (updateClass) -> is mandatory + ErrorHandler::Response rv = errorHandler->reportError(error.show()); + + if (rv == ErrorHandler::CONTINUE_NEXT) + break; + + else if (rv == ErrorHandler::RETRY) + ; //continue in loop + else + assert (false); + } + } + } +} + + +bool FreeFileSync::sameFileTime(const wxULongLong& a, const wxULongLong& b) +{ + if (a < b) + return b - a <= FILE_TIME_PRECISION; + else + return a - b <= FILE_TIME_PRECISION; +} + +inline +wxString getDriveName(const wxString& directoryName) +{ + const wxString volumeName = wxFileName(directoryName).GetVolume(); + if (volumeName.IsEmpty()) + return wxEmptyString; + + return volumeName + wxFileName::GetVolumeSeparator() + GlobalResources::FILE_NAME_SEPARATOR; +} + + +#ifdef FFS_WIN +inline +bool isFatDrive(const wxString& directoryName) +{ + const wxString driveName = getDriveName(directoryName); + if (driveName.IsEmpty()) + return false; + + wxChar fileSystem[32] = wxT(""); + if (!GetVolumeInformation(driveName.c_str(), NULL, 0, NULL, NULL, NULL, fileSystem, 32)) + return false; + + return wxString(fileSystem).StartsWith(wxT("FAT")); +} + + +/*Statistical theory: detect daylight saving time (DST) switch by comparing files that exist on both sides (and have same filesizes). If there are "enough" +that have a shift by +-1h then assert that DST switch occured. +What is "enough" =: N? N should be large enough AND small enough that the following two errors remain small: + +Error 1: A DST switch is detected although there was none +Error 2: A DST switch is not detected although it took place + +Error 1 results in lower bound, error 2 in upper bound for N. + +Target: Choose N such that probability of error 1 and error 2 is lower than 0.001 (0.1%) + +Definitions: +p1: probability that a file with same filesize on both sides was changed nevertheless +p2: probability that a changed file has +1h shift in filetime due to a change + +M: number of files with same filesize on both sides in total +N: number of files with same filesize and time-diff +1h when DST check shall detect "true" + +X: number of files with same filesize that have a +1h difference after change + +Error 1 ("many files have +1h shift by chance") imposes: +Probability of error 1: (binomial distribution) + +P(X >= N) = 1 - P(X <= N - 1) = +1 - sum_i=0^N-1 p3^i * (1 - p3)^(M - i) (M above i) shall be <= 0.0005 + +with p3 := p1 * p2 + +Probability of error 2 also will be <= 0.0005 if we choose N as lowest number that satisfies the preceding formula. Proof is left to the reader. + +The function M |-> N behaves almost linearly and can be empirically approximated by: + +N(M) = + +2 for 0 <= M <= 500 +125/1000000 * M + 5 for 500 < M <= 50000 +77/1000000 * M + 10 for 50000 < M <= 400000 +60/1000000 * M + 35 for 400000 < M + +*/ + +unsigned int getThreshold(const unsigned filesWithSameSizeTotal) +{ + if (filesWithSameSizeTotal <= 500) + return 2; + else if (filesWithSameSizeTotal <= 50000) + return unsigned(125.0/1000000 * filesWithSameSizeTotal + 5.0); + else if (filesWithSameSizeTotal <= 400000) + return unsigned(77.0/1000000 * filesWithSameSizeTotal + 10.0); + else + return unsigned(60.0/1000000 * filesWithSameSizeTotal + 35.0); +} + + +void FreeFileSync::checkForDSTChange(const FileCompareResult& gridData, + const vector<FolderPair>& directoryPairsFormatted, + int& timeShift, wxString& driveName) +{ + driveName.Clear(); + timeShift = 0; + + TIME_ZONE_INFORMATION dummy; + DWORD rv = GetTimeZoneInformation(&dummy); + if (rv == TIME_ZONE_ID_UNKNOWN) return; + bool dstActive = rv == TIME_ZONE_ID_DAYLIGHT; + + for (vector<FolderPair>::const_iterator i = directoryPairsFormatted.begin(); i != directoryPairsFormatted.end(); ++i) + { + bool leftDirIsFat = isFatDrive(i->leftDirectory); + bool rightDirIsFat = isFatDrive(i->rightDirectory); + + if (leftDirIsFat || rightDirIsFat) + { + unsigned int filesTotal = 0; //total number of files (with same size on both sides) + unsigned int plusOneHourCount = 0; //number of files with +1h time shift + unsigned int minusOneHourCount = 0; // " + + for (FileCompareResult::const_iterator j = gridData.begin(); j != gridData.end(); ++j) + { + const FileDescrLine& leftFile = j->fileDescrLeft; + const FileDescrLine& rightFile = j->fileDescrRight; + + if ( leftFile.objType == FileDescrLine::TYPE_FILE && rightFile.objType == FileDescrLine::TYPE_FILE && + leftFile.fileSize == rightFile.fileSize && + +#ifdef FFS_WIN + //Windows does NOT distinguish between upper/lower-case + leftFile.directory.CmpNoCase(i->leftDirectory) == 0 && + rightFile.directory.CmpNoCase(i->rightDirectory) == 0 +#elif defined FFS_LINUX + //Linux DOES distinguish between upper/lower-case + leftFile.directory.Cmp(i->leftDirectory) == 0 && + rightFile.directory.Cmp(i->rightDirectory) == 0 +#endif + ) + { + ++filesTotal; + + if (sameFileTime(leftFile.lastWriteTimeRaw - 3600, rightFile.lastWriteTimeRaw)) + ++plusOneHourCount; + else if (sameFileTime(leftFile.lastWriteTimeRaw + 3600, rightFile.lastWriteTimeRaw)) + ++minusOneHourCount; + } + } + + unsigned int threshold = getThreshold(filesTotal); + if (plusOneHourCount >= threshold) + { + if (dstActive) + { + if (rightDirIsFat) //it should be FAT; else this were some kind of error + { + timeShift = 3600; + driveName = getDriveName(i->rightDirectory); + } + } + else + { + if (leftDirIsFat) //it should be FAT; else this were some kind of error + { + timeShift = -3600; + driveName = getDriveName(i->leftDirectory); + } + } + return; + } + else if (minusOneHourCount >= threshold) + { + if (dstActive) + { + if (leftDirIsFat) //it should be FAT; else this were some kind of error + { + timeShift = 3600; + driveName = getDriveName(i->leftDirectory); + } + } + else + { + if (rightDirIsFat) //it should be FAT; else this were some kind of error + { + timeShift = -3600; + driveName = getDriveName(i->rightDirectory); + } + } + return; + } + } + } +} +#endif //FFS_WIN + + diff --git a/algorithm.h b/algorithm.h new file mode 100644 index 00000000..93d28a9e --- /dev/null +++ b/algorithm.h @@ -0,0 +1,36 @@ +#ifndef ALGORITHM_H_INCLUDED +#define ALGORITHM_H_INCLUDED + +#include "FreeFileSync.h" + + +namespace FreeFileSync +{ + wxString formatFilesizeToShortString(const wxULongLong& filesize); + wxString formatFilesizeToShortString(const double filesize); + wxString getFormattedDirectoryName(const wxString& dirname); + + void swapGrids(FileCompareResult& grid); + + void adjustModificationTimes(const wxString& parentDirectory, const int timeInSeconds, ErrorHandler* errorHandler) throw(AbortThisProcess); + + void deleteOnGridAndHD(FileCompareResult& grid, const set<int>& rowsToDelete, ErrorHandler* errorHandler, const bool useRecycleBin) throw(AbortThisProcess); + void addSubElements(set<int>& subElements, const FileCompareResult& grid, const FileCompareLine& relevantRow); + + void filterCurrentGridData(FileCompareResult& currentGridData, const wxString& includeFilter, const wxString& excludeFilter); + void removeFilterOnCurrentGridData(FileCompareResult& currentGridData); + vector<wxString> compoundStringToFilter(const wxString& filterString); //convert compound string, separated by ';' or '\n' into formatted vector of wxStrings + + bool sameFileTime(const wxULongLong& a, const wxULongLong& b); + +#ifdef FFS_WIN +//detect if FAT/FAT32 drive needs a +-1h time shift after daylight saving time (DST) switch due to known windows bug: +//http://www.codeproject.com/KB/datetime/dstbugs.aspx + +//NO performance issue: debug build: 50 ms for 200000 files processed in for-loop + void checkForDSTChange(const FileCompareResult& gridData, const vector<FolderPair>& directoryPairsFormatted, int& timeShift, wxString& driveName); +#endif //FFS_WIN + +} + +#endif // ALGORITHM_H_INCLUDED diff --git a/comparison.cpp b/comparison.cpp new file mode 100644 index 00000000..255c5b07 --- /dev/null +++ b/comparison.cpp @@ -0,0 +1,739 @@ +#include "comparison.h" +#include "library/globalFunctions.h" +#include <wx/intl.h> +#include "library/globalFunctions.h" +#include <wx/ffile.h> +#include <wx/msgdlg.h> +#include <wx/log.h> +#include "library/multithreading.h" +#include "algorithm.h" + +#ifdef FFS_WIN +#include <windows.h> +#endif //FFS_WIN + +using namespace FreeFileSync; + +CompareProcess::CompareProcess(bool lineBreakOnMessages, StatusHandler* handler) : + statusUpdater(handler) +{ + if (lineBreakOnMessages) + optionalLineBreak = wxT("\n"); +} + + +struct FileInfo +{ + wxULongLong fileSize; //unit: bytes! + wxString lastWriteTime; + wxULongLong lastWriteTimeRaw; //unit: seconds! +}; + + +class GetAllFilesFull : public wxDirTraverser +{ +public: + GetAllFilesFull(DirectoryDescrType& output, wxString dirThatIsSearched, const wxString& optionalLineBreak, StatusHandler* updateClass = 0); + + wxDirTraverseResult OnFile(const wxString& filename); + + wxDirTraverseResult OnDir(const wxString& dirname); + + wxDirTraverseResult OnOpenError(const wxString& openerrorname); + +private: + DirectoryDescrType& m_output; + wxString directory; + int prefixLength; + FileInfo currentFileInfo; + FileDescrLine fileDescr; + const wxString m_optionalLineBreak; + StatusHandler* statusUpdater; +}; + + +inline +wxString formatTime(unsigned int number) +{ + assert (number < 100); + + if (number <= 9) + { + wxChar result[3]; + + *result = '0'; + result[1] = '0' + number; + result[2] = 0; + + return result; + } + else + { + wxString result; + if (result.Printf(wxT("%d"), number) < 0) + throw RuntimeException(_("Error when converting int to wxString")); + return result; + } +} + + +void getFileInformation(FileInfo& output, const wxString& filename) +{ +#ifdef FFS_WIN + WIN32_FIND_DATA winFileInfo; + FILETIME localFileTime; + SYSTEMTIME time; + HANDLE fileHandle; + + if ((fileHandle = FindFirstFile(filename.c_str(), &winFileInfo)) == INVALID_HANDLE_VALUE) + throw FileError(wxString(_("Could not retrieve file info for: ")) + wxT("\"") + filename + wxT("\"")); + + FindClose(fileHandle); + + if (FileTimeToLocalFileTime( + &winFileInfo.ftLastWriteTime, //pointer to UTC file time to convert + &localFileTime //pointer to converted file time + ) == 0) + throw RuntimeException(_("Error converting FILETIME to local FILETIME")); + + if (FileTimeToSystemTime( + &localFileTime, //pointer to file time to convert + &time //pointer to structure to receive system time + ) == 0) + throw RuntimeException(_("Error converting FILETIME to SYSTEMTIME")); + + output.lastWriteTime = globalFunctions::numberToWxString(time.wYear) + wxT("-") + + formatTime(time.wMonth) + wxT("-") + + formatTime(time.wDay) + wxT(" ") + + formatTime(time.wHour) + wxT(":") + + formatTime(time.wMinute) + wxT(":") + + formatTime(time.wSecond); + + //local time + output.lastWriteTimeRaw = wxULongLong(localFileTime.dwHighDateTime, localFileTime.dwLowDateTime); + + //reduce precision to 1 second (FILETIME has unit 10^-7 s) + output.lastWriteTimeRaw/= 10000000; // <- time is used for comparison only: unit switched to seconds + + output.fileSize = wxULongLong(winFileInfo.nFileSizeHigh, winFileInfo.nFileSizeLow); + +#else + struct stat fileInfo; + if (stat(filename.c_str(), &fileInfo) != 0) + throw FileError(wxString(_("Could not retrieve file info for: ")) + wxT("\"") + filename + wxT("\"")); + + tm* timeinfo; + timeinfo = localtime(&fileInfo.st_mtime); + char buffer [50]; + strftime(buffer,50,"%Y-%m-%d %H:%M:%S",timeinfo); + + //local time + output.lastWriteTime = buffer; + + //UTC time; unit: 1 second + output.lastWriteTimeRaw = fileInfo.st_mtime; + + output.fileSize = fileInfo.st_size; +#endif +} + + +struct MemoryAllocator +{ + MemoryAllocator() + { + buffer1 = new unsigned char[bufferSize]; + buffer2 = new unsigned char[bufferSize]; + } + + ~MemoryAllocator() + { + delete [] buffer1; + delete [] buffer2; + } + + static const unsigned int bufferSize = 1024 * 512; //512 kb seems to be the perfect buffer size + unsigned char* buffer1; + unsigned char* buffer2; +}; + + +bool filesHaveSameContent(const wxString& filename1, const wxString& filename2) +{ + static MemoryAllocator memory; + + wxFFile file1(filename1.c_str(), wxT("rb")); + if (!file1.IsOpened()) + throw FileError(wxString(_("Could not open file: ")) + wxT("\"") + filename1 + wxT("\"")); + + wxFFile file2(filename2.c_str(), wxT("rb")); + if (!file2.IsOpened()) //NO cleanup necessary for wxFFile + throw FileError(wxString(_("Could not open file: ")) + wxT("\"") + filename2 + wxT("\"")); + + do + { + size_t length1 = file1.Read(memory.buffer1, memory.bufferSize); + if (file1.Error()) throw FileError(wxString(_("Error reading file: ")) + wxT("\"") + filename1 + wxT("\"")); + + size_t length2 = file2.Read(memory.buffer2, memory.bufferSize); + if (file2.Error()) throw FileError(wxString(_("Error reading file: ")) + wxT("\"") + filename2 + wxT("\"")); + + if (length1 != length2 || memcmp(memory.buffer1, memory.buffer2, length1) != 0) + return false; + } + while (!file1.Eof()); + + if (!file2.Eof()) + return false; + + return true; +} + + +//handle execution of a method while updating the UI +class UpdateWhileComparing : public UpdateWhileExecuting +{ +public: + UpdateWhileComparing() {} + ~UpdateWhileComparing() {} + + wxString file1; + wxString file2; + bool success; + wxString errorMessage; + bool result; + +private: + void longRunner() //virtual method implementation + { + try + { + result = filesHaveSameContent(file1, file2); + success = true; + } + catch (FileError& error) + { + success = false; + errorMessage = error.show(); + } + } +}; + + +bool filesHaveSameContentMultithreaded(const wxString& filename1, const wxString& filename2, StatusHandler* updateClass) +{ + static UpdateWhileComparing cmpAndUpdate; //single instantiation: thread enters wait phase after each execution + + cmpAndUpdate.waitUntilReady(); + + //longRunner is called from thread, but no mutex needed here, since thread is in waiting state! + cmpAndUpdate.file1 = filename1; + cmpAndUpdate.file2 = filename2; + + cmpAndUpdate.execute(updateClass); + + //no mutex needed here since longRunner is finished + if (!cmpAndUpdate.success) + throw FileError(cmpAndUpdate.errorMessage); + + return cmpAndUpdate.result; +} + + +void calcTotalDataForCompare(int& objectsTotal, double& dataTotal, const FileCompareResult& grid, const set<int>& rowsToCompare) +{ + dataTotal = 0; + + for (set<int>::iterator i = rowsToCompare.begin(); i != rowsToCompare.end(); ++i) + { + const FileCompareLine& gridline = grid[*i]; + + dataTotal+= gridline.fileDescrLeft.fileSize.ToDouble(); + dataTotal+= gridline.fileDescrRight.fileSize.ToDouble(); + } + + objectsTotal = rowsToCompare.size() * 2; +} + + +void generateFileAndFolderDescriptions(DirectoryDescrType& output, const wxString& directory, const wxString& optionalLineBreak, StatusHandler* updateClass) +{ + assert (updateClass); + + while (true) + { + output.clear(); + + //get all files and folders from directory (and subdirectories) + information + GetAllFilesFull traverser(output, FreeFileSync::getFormattedDirectoryName(directory), optionalLineBreak, updateClass); + wxDir dir(directory); + + if (dir.Traverse(traverser) != (size_t)-1) + break; //traversed successfully + else + { + ErrorHandler::Response rv = updateClass->reportError(wxString(_("Error traversing directory ")) + wxT("\"") + directory + wxT("\"")); + if (rv == ErrorHandler::CONTINUE_NEXT) + break; + else if (rv == ErrorHandler::RETRY) + ; //continue with loop + else + assert (false); + } + } +} + + +struct DescrBufferLine +{ + wxString directoryName; + DirectoryDescrType* directoryDesc; + +#ifdef FFS_WIN + //Windows does NOT distinguish between upper/lower-case + bool operator>(const DescrBufferLine& b ) const + { + return (directoryName.CmpNoCase(b.directoryName) > 0); + } + bool operator<(const DescrBufferLine& b) const + { + return (directoryName.CmpNoCase(b.directoryName) < 0); + } + bool operator==(const DescrBufferLine& b) const + { + return (directoryName.CmpNoCase(b.directoryName) == 0); + } + +#elif defined FFS_LINUX + //Linux DOES distinguish between upper/lower-case + bool operator>(const DescrBufferLine& b ) const + { + return (directoryName.Cmp(b.directoryName) > 0); + } + bool operator<(const DescrBufferLine& b) const + { + return (directoryName.Cmp(b.directoryName) < 0); + } + bool operator==(const DescrBufferLine& b) const + { + return (directoryName.Cmp(b.directoryName) == 0); + } +#else + adapt this +#endif + +}; + + +class DirectoryDescrBuffer //buffer multiple scans of the same directories +{ +public: + ~DirectoryDescrBuffer() + { + //clean up + for (set<DescrBufferLine>::iterator i = buffer.begin(); i != buffer.end(); ++i) + delete i->directoryDesc; + } + + const DirectoryDescrType* getDirectoryDescription(const wxString& directory, const wxString& optionalLineBreak, StatusHandler* statusUpdater) + { + DescrBufferLine bufferEntry; + bufferEntry.directoryName = directory; + + set<DescrBufferLine>::iterator entryFound; + if ((entryFound = buffer.find(bufferEntry)) != buffer.end()) + { + //entry found in buffer; return + return entryFound->directoryDesc; + } + else + { + //entry not found; create new one + bufferEntry.directoryDesc = new DirectoryDescrType; + buffer.insert(bufferEntry); //exception safety: insert into buffer right after creation! + + generateFileAndFolderDescriptions(*bufferEntry.directoryDesc, directory, optionalLineBreak, statusUpdater); //exceptions may be thrown! + return bufferEntry.directoryDesc; + } + } + +private: + set<DescrBufferLine> buffer; +}; + + +void CompareProcess::startCompareProcess(const vector<FolderPair>& directoryPairsFormatted, + const CompareVariant cmpVar, + FileCompareResult& output) throw(AbortThisProcess) +{ +#ifndef __WXDEBUG__ + wxLogNull noWxLogs; //hide wxWidgets log messages in release build +#endif + assert (statusUpdater); + +//################################################################################################################################################ + + FileCompareResult output_tmp; //write to output not before END of process! + + try + { + //inform about the total amount of data that will be processed from now on + statusUpdater->initNewProcess(-1, 0, StatusHandler::PROCESS_SCANNING); //it's not known how many files will be scanned => -1 objects + + //do basis scan: only result lines of type FILE_UNDEFINED need to be determined + performBaseComparison(directoryPairsFormatted, + output_tmp); + + if (cmpVar == CMP_BY_TIME_SIZE) + { + for (FileCompareResult::iterator i = output_tmp.begin(); i != output_tmp.end(); ++i) + { + if (i->cmpResult == FILE_UNDEFINED) + { + //last write time may differ by up to 2 seconds (NTFS vs FAT32) + if (sameFileTime(i->fileDescrLeft.lastWriteTimeRaw, i->fileDescrRight.lastWriteTimeRaw)) + { + if (i->fileDescrLeft.fileSize == i->fileDescrRight.fileSize) + i->cmpResult = FILE_EQUAL; + else + i->cmpResult = FILE_DIFFERENT; + } + else + { + if (i->fileDescrLeft.lastWriteTimeRaw < i->fileDescrRight.lastWriteTimeRaw) + i->cmpResult = FILE_RIGHT_NEWER; + else + i->cmpResult = FILE_LEFT_NEWER; + } + } + } + } +//################################################################################################################################################ + else if (cmpVar == CMP_BY_CONTENT) + { + set<int> rowsToCompareBytewise; //compare of file content happens AFTER finding corresponding files + //in order to separate into two processes (scanning and comparing) + + //pre-check: files have different content if they have a different filesize + for (FileCompareResult::iterator i = output_tmp.begin(); i != output_tmp.end(); ++i) + { + if (i->cmpResult == FILE_UNDEFINED) + { + if (i->fileDescrLeft.fileSize != i->fileDescrRight.fileSize) + i->cmpResult = FILE_DIFFERENT; + else + rowsToCompareBytewise.insert(i - output_tmp.begin()); + } + } + + int objectsTotal = 0; + double dataTotal = 0; + calcTotalDataForCompare(objectsTotal, dataTotal, output_tmp, rowsToCompareBytewise); + + statusUpdater->initNewProcess(objectsTotal, dataTotal, StatusHandler::PROCESS_COMPARING_CONTENT); + + set<int> rowsToDelete; //if errors occur during file access and user skips, these rows need to be deleted from result + + //compare files (that have same size) bytewise... + for (set<int>::iterator i = rowsToCompareBytewise.begin(); i != rowsToCompareBytewise.end(); ++i) + { + FileCompareLine& gridline = output_tmp[*i]; + + statusUpdater->updateStatusText(wxString(_("Comparing content of files ")) + optionalLineBreak + wxT("\"") + gridline.fileDescrLeft.relativeName + wxT("\"")); + + //check files that exist in left and right model but have different content + while (true) + { + //trigger display refresh + statusUpdater->requestUiRefresh(); + + try + { + if (filesHaveSameContentMultithreaded(gridline.fileDescrLeft.fullName, gridline.fileDescrRight.fullName, statusUpdater)) + gridline.cmpResult = FILE_EQUAL; + else + gridline.cmpResult = FILE_DIFFERENT; + + statusUpdater->updateProcessedData(2, (gridline.fileDescrLeft.fileSize * 2).ToDouble()); + break; + } + catch (FileError& error) + { + ErrorHandler::Response rv = statusUpdater->reportError(error.show()); + if (rv == ErrorHandler::CONTINUE_NEXT) + { + rowsToDelete.insert(*i); + break; + } + else if (rv == ErrorHandler::RETRY) + ; //continue with loop + else + assert (false); + } + } + } + + //delete invalid rows that have no valid cmpResult + if (rowsToDelete.size() > 0) + removeRowsFromVector(output_tmp, rowsToDelete); + } + else assert(false); + + + statusUpdater->requestUiRefresh(); + } + catch (const RuntimeException& theException) + { + wxMessageBox(theException.show(), _("An exception occured!"), wxOK | wxICON_ERROR); + return; + } + catch (std::bad_alloc& e) + { + wxMessageBox(wxString(_("System out of memory!")) + wxT(" ") + wxString::From8BitData(e.what()), _("An exception occured!"), wxOK | wxICON_ERROR); + return; + } + + //only if everything was processed correctly output is written to! + output_tmp.swap(output); +} + + +void CompareProcess::performBaseComparison(const vector<FolderPair>& directoryPairsFormatted, + FileCompareResult& output) +{ + //buffer accesses to the same directories; useful when multiple folder pairs are used + DirectoryDescrBuffer descriptionBuffer; + + //process one folder pair after each other + for (vector<FolderPair>::const_iterator pair = directoryPairsFormatted.begin(); pair != directoryPairsFormatted.end(); ++pair) + { + //retrieve sets of files (with description data) + const DirectoryDescrType* directoryLeft = descriptionBuffer.getDirectoryDescription(pair->leftDirectory, optionalLineBreak, statusUpdater); + const DirectoryDescrType* directoryRight = descriptionBuffer.getDirectoryDescription(pair->rightDirectory, optionalLineBreak, statusUpdater); + + statusUpdater->forceUiRefresh(); + FileCompareLine newline; + + //find files/folders that exist in left file model but not in right model + for (DirectoryDescrType::iterator i = directoryLeft->begin(); i != directoryLeft->end(); ++i) + if (directoryRight->find(*i) == directoryRight->end()) + { + newline.fileDescrLeft = *i; + newline.fileDescrRight = FileDescrLine(); + newline.fileDescrRight.directory = pair->rightDirectory; + newline.cmpResult = FILE_LEFT_SIDE_ONLY; + output.push_back(newline); + } + + for (DirectoryDescrType::iterator j = directoryRight->begin(); j != directoryRight->end(); ++j) + { + DirectoryDescrType::iterator i; + + //find files/folders that exist in right file model but not in left model + if ((i = directoryLeft->find(*j)) == directoryLeft->end()) + { + newline.fileDescrLeft = FileDescrLine(); + newline.fileDescrLeft.directory = pair->leftDirectory; //directory info is needed when creating new directories + newline.fileDescrRight = *j; + newline.cmpResult = FILE_RIGHT_SIDE_ONLY; + output.push_back(newline); + } + //find files/folders that exist in left and right file model + else + { //files... + if (i->objType == FileDescrLine::TYPE_FILE && j->objType == FileDescrLine::TYPE_FILE) + { + newline.fileDescrLeft = *i; + newline.fileDescrRight = *j; + newline.cmpResult = FILE_UNDEFINED; //not yet determined! + output.push_back(newline); + } + //directories... + else if (i->objType == FileDescrLine::TYPE_DIRECTORY && j->objType == FileDescrLine::TYPE_DIRECTORY) + { + newline.fileDescrLeft = *i; + newline.fileDescrRight = *j; + newline.cmpResult = FILE_EQUAL; + output.push_back(newline); + } + //if we have a nameclash between a file and a directory: split into two separate rows + else if (i->objType != j->objType) + { + newline.fileDescrLeft = *i; + newline.fileDescrRight = FileDescrLine(); + newline.fileDescrRight.directory = pair->rightDirectory; + newline.cmpResult = FILE_LEFT_SIDE_ONLY; + output.push_back(newline); + + newline.fileDescrLeft = FileDescrLine(); + newline.fileDescrLeft.directory = pair->leftDirectory; + newline.fileDescrRight = *j; + newline.cmpResult = FILE_RIGHT_SIDE_ONLY; + output.push_back(newline); + } + else assert (false); + } + } + } + statusUpdater->requestUiRefresh(); +} + + +GetAllFilesFull::GetAllFilesFull(DirectoryDescrType& output, wxString dirThatIsSearched, const wxString& optionalLineBreak, StatusHandler* updateClass) : + m_output(output), + directory(dirThatIsSearched), + m_optionalLineBreak(optionalLineBreak), + statusUpdater(updateClass) +{ + assert(updateClass); + prefixLength = directory.Len(); +} + + +wxDirTraverseResult GetAllFilesFull::OnFile(const wxString& filename) +{ + fileDescr.fullName = filename; + fileDescr.directory = directory; + fileDescr.relativeName = filename.Mid(prefixLength); + while (true) + { + try + { + getFileInformation(currentFileInfo, filename); + break; + } + catch (FileError& error) + { + //if (updateClass) -> is mandatory + ErrorHandler::Response rv = statusUpdater->reportError(error.show()); + if ( rv == ErrorHandler::CONTINUE_NEXT) + return wxDIR_CONTINUE; + else if (rv == ErrorHandler::RETRY) + ; //continue with loop + else + assert (false); + } + } + + fileDescr.lastWriteTime = currentFileInfo.lastWriteTime; + fileDescr.lastWriteTimeRaw = currentFileInfo.lastWriteTimeRaw; + fileDescr.fileSize = currentFileInfo.fileSize; + fileDescr.objType = FileDescrLine::TYPE_FILE; + m_output.insert(fileDescr); + + //update UI/commandline status information + statusUpdater->updateStatusText(wxString(_("Scanning ")) + m_optionalLineBreak + wxT("\"") + filename + wxT("\"")); //NO performance issue at all + //add 1 element to the progress indicator + statusUpdater->updateProcessedData(1, 0); //NO performance issue at all + //trigger display refresh + statusUpdater->requestUiRefresh(); + + return wxDIR_CONTINUE; +} + + +wxDirTraverseResult GetAllFilesFull::OnDir(const wxString& dirname) +{ +#ifdef FFS_WIN + if ( dirname.EndsWith(wxT("\\RECYCLER")) || + dirname.EndsWith(wxT("\\System Volume Information"))) + return wxDIR_IGNORE; +#endif // FFS_WIN + + fileDescr.fullName = dirname; + fileDescr.directory = directory; + fileDescr.relativeName = dirname.Mid(prefixLength); + fileDescr.lastWriteTime = wxEmptyString; //irrelevant for directories + fileDescr.lastWriteTimeRaw = wxULongLong(0); //irrelevant for directories + fileDescr.fileSize = wxULongLong(0); //currently used by getBytesToTransfer + fileDescr.objType = FileDescrLine::TYPE_DIRECTORY; + m_output.insert(fileDescr); + + //update UI/commandline status information + statusUpdater->updateStatusText(wxString(_("Scanning ")) + m_optionalLineBreak + wxT("\"") + dirname + wxT("\"")); //NO performance issue at all + //add 1 element to the progress indicator + statusUpdater->updateProcessedData(1, 0); //NO performance issue at all + //trigger display refresh + statusUpdater->requestUiRefresh(); + + return wxDIR_CONTINUE; +} + + +wxDirTraverseResult GetAllFilesFull::OnOpenError(const wxString& openerrorname) +{ + wxMessageBox(openerrorname, _("Error")); + return wxDIR_IGNORE; +} + + +bool FreeFileSync::foldersAreValidForComparison(const vector<FolderPair>& folderPairs, wxString& errorMessage) +{ + errorMessage.Clear(); + + for (vector<FolderPair>::const_iterator i = folderPairs.begin(); i != folderPairs.end(); ++i) + { + const wxString leftFolderName = getFormattedDirectoryName(i->leftDirectory); + const wxString rightFolderName = getFormattedDirectoryName(i->rightDirectory); + + //check if folder name is empty + if (leftFolderName.IsEmpty() || rightFolderName.IsEmpty()) + { + errorMessage = _("Please fill all empty directory fields."); + return false; + } + + //check if folder exists + if (!wxDirExists(leftFolderName)) + { + errorMessage = wxString(_("Directory does not exist: ")) + wxT("\"") + leftFolderName + wxT("\""); + return false; + } + if (!wxDirExists(rightFolderName)) + { + errorMessage = wxString(_("Directory does not exist: ")) + wxT("\"") + rightFolderName + wxT("\""); + return false; + } + } + return true; +} + + +bool dependencyExists(const vector<wxString>& folders, const wxString& newFolder, wxString& warningMessage) +{ + warningMessage.Clear(); + + for (vector<wxString>::const_iterator i = folders.begin(); i != folders.end(); ++i) + if (newFolder.StartsWith(*i) || i->StartsWith(newFolder)) + { + warningMessage = wxString(_("Directories are dependent: ")) + + wxT("\"") + *i + wxT("\"") + wxT(", ") + wxT("\"") + newFolder + wxT("\""); + return true; + } + + return false; +} + + +bool FreeFileSync::foldersHaveDependencies(const vector<FolderPair>& folderPairs, wxString& warningMessage) +{ + warningMessage.Clear(); + + vector<wxString> folders; + for (vector<FolderPair>::const_iterator i = folderPairs.begin(); i != folderPairs.end(); ++i) + { + const wxString leftFolderName = getFormattedDirectoryName(i->leftDirectory); + const wxString rightFolderName = getFormattedDirectoryName(i->rightDirectory); + + if (dependencyExists(folders, leftFolderName, warningMessage)) + return true; + folders.push_back(leftFolderName); + + if (dependencyExists(folders, rightFolderName, warningMessage)) + return true; + folders.push_back(rightFolderName); + } + + return false; +} + diff --git a/comparison.h b/comparison.h new file mode 100644 index 00000000..cc80ea29 --- /dev/null +++ b/comparison.h @@ -0,0 +1,32 @@ +#ifndef COMPARISON_H_INCLUDED +#define COMPARISON_H_INCLUDED + +#include "FreeFileSync.h" + + +namespace FreeFileSync +{ + bool foldersAreValidForComparison(const vector<FolderPair>& folderPairs, wxString& errorMessage); + bool foldersHaveDependencies(const vector<FolderPair>& folderPairs, wxString& warningMessage); + + //class handling comparison process + class CompareProcess + { + public: + CompareProcess(bool lineBreakOnMessages, StatusHandler* handler); + + void startCompareProcess(const vector<FolderPair>& directoryPairsFormatted, + const CompareVariant cmpVar, + FileCompareResult& output) throw(AbortThisProcess); + + private: + //create comparison result table and fill relation except for files existing on both sides + void performBaseComparison(const vector<FolderPair>& directoryPairsFormatted, + FileCompareResult& output); + + StatusHandler* statusUpdater; + wxString optionalLineBreak; //optional line break for status messages (used by GUI mode only) + }; +} + +#endif // COMPARISON_H_INCLUDED @@ -1,7 +1,5 @@ MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - Time: - Tijd: Byte Byte GB @@ -54,8 +52,6 @@ &Annuleren &Compare &Vergelijken -&Continue -&Doorgaan &Create &Creëer &Create batch job @@ -68,14 +64,20 @@ &Bestand &Help &Help +&Ignore +&Negeren &Language &Taal +&Load configuration +&Laad de configuratie &OK &OK &Pause &Pause &Quit &Afsluiten +&Resolve +&Oplossen &Retry &Opnieuw proberen &Start @@ -106,8 +108,6 @@ - rechts is nieuwer - same date (different size) - zelfde datum (verschillende grootte) -------------------------------------------------- ------------------------------------------------------ ---------\n -----------\n -Open-Source file synchronization- @@ -138,6 +138,8 @@ == bestanden zijn gelijk\n\n >> right file is newer\n >> rechter bestand is nieuwer\n +A file time shift due to a daylight saving time change was detected for a FAT/FAT32 drive. +Een time shift, van een bestand, door zomertijd is gedetecteerd op een FAT/FAT32 schijf. Abort Afbreken Abort requested: Waiting for current operation to finish... @@ -160,8 +162,6 @@ All file times have been adjusted successfully! Alle bestandstijden zijn succesvol aangepast! All items have been synchronized! Alle bestanden zijn gesynchroniseerd! -An error occured -Er is een fout opgetreden An exception occured! Er heeft een uitzondering plaatsgevonden! Apply @@ -216,12 +216,10 @@ Configure your own synchronization rules. Configureer uw eigen synchronisatieregels. Confirm Bevestig +Consider this when setting up synchronization rules: You might want to avoid write access to these directories so that synchronization of both does not interfere. +Neem het volgende in overweging: U wilt misschien schrijfrechten op deze paden vermijden, zodat synchronisatie van bijde elkaar niet hindert. Continue Doorgaan -Continue on error -Doorgaan bij fout -Continue on next errors -Doorgaan bij volgende fouten Copy from left to right Kopieer van links naar rechts Copy from left to right overwriting @@ -230,6 +228,8 @@ Copy from right to left Kopieer van rechts naar links Copy from right to left overwriting Kopieer en overschrijf van rechts naar links +Copy new or updated files to right folder. +Kopieer nieuwe of geupdate bestanden naar de rechter map. Copy to clipboard\tCTRL+C Kopieer naar het klembord\tCTRL+C Copying file @@ -266,6 +266,10 @@ Data: Data: Date Datum +Date: +Datum: +Daylight saving time change detected for FAT/FAT32 drive. +Zomertijdverandering gedetecteerd voor een FAT/FAT32 schijf. Delete files/folders existing on left side only Verwijder bestanden/folders die alleen links bestaan Delete files/folders existing on right side only @@ -278,10 +282,14 @@ Deleting file Bestand wordt verwijderd Deleting folder Folder wordt verwijderd +Directories are dependent: +De volgende paden zijn afhankelijk van elkaar: Directory does not exist: Map bestaat niet: Do not show graphical status and error messages but write to a logfile instead Geef geen grafische status en foutmeldingen weer, maar sla het op in een logbestand +Do not show this warning again +Deze waarschuwing niet meer tonen Do nothing Geen actie ondernemen Do you really want to delete the following objects(s)? @@ -292,6 +300,8 @@ Donate with PayPal Doneer met PayPal Drag && drop Drag en drop +Drive: +Schijf: Email: Email: Error @@ -299,7 +309,7 @@ Fout Error adapting modification time of file Er is een fout opgetreden bij het wijzigen van de modificatietijd van het bestand Error changing modification time: -Er is een fout opgetreden bij het wijzigen van de bestandstijden +Er is een fout opgetreden bij het wijzigen van de bestandstijden Error converting FILETIME to SYSTEMTIME Er is een fout opgetreden bij het converteren van FILETIME naar SYSTEMTIME Error converting FILETIME to local FILETIME @@ -307,13 +317,13 @@ Er is een fout opgetreden bij het converteren van FILETIME naar (lokale) FILETIM Error copying file Er is een fout opgetreden bij het kopiëren van een bestand Error creating directory -Er is een fout opgetreden bij het aanmaken van een map -Error deleting directory -Er is een fout opgetreden bij het verwijderen van een map -Error deleting file +Er is een fout opgetreden bij het aanmaken van een pad +Error deleting directory: +Er is een fout opgetreden bij het verwijderen van een pad +Error deleting file: Er is een fout opgetreden bij het verwijderen van een bestand Error moving to recycle bin: -Er is een fout opgetreden bij verwijderen naar de prullenbak +Er is een fout opgetreden bij verwijderen naar de prullenbak Error parsing configuration file Er is een fout opgetreden bij het aanmaken van een configuratiebestand Error reading file: @@ -376,8 +386,6 @@ Filter view Bekijk het filter Folder pair Gekoppelde mappen -FreeFileSync (Date: -FreeFileSync (Datum: FreeFileSync - Folder Comparison and Synchronization FreeFileSync - Mappen vergelijken en synchroniseren FreeFileSync Batch Job @@ -404,8 +412,8 @@ Hide files that exist on right side only Verberg bestanden die alleen aan de rechterkant bestaan Hide filtered items Verberg gefilterde items -Hide further error messages during the current process and continue -Ga door en geef volgende foutmeldingen tijdens dit proces niet meer weer +Hide further error messages during the current process +Volgende foutmeldingen niet meer weergeven tijdens de huidige handeling Hides error messages during synchronization:\nThey are collected and shown as a list at the end of the process Verbergt foutmeldingen tijdens het synchroniseren:\nze worden verzameld en op het eind in een lijst getoond Hints: @@ -414,6 +422,14 @@ Homepage: Homepage: If you like FFS: Als het programma u bevalt: +Ignore errors +Negeer foutmeldingen +Ignore next errors +Negeer volgende foutmeldingen +Ignore this error, retry or abort comparison? +Negeer deze fout, opnieuw proberen of afbreken van deze vergelijking? +Ignore this error, retry or abort synchronization? +Negeer deze fout, opnieuw proberen of afbreken van deze synchronisatie? Include Gebruiken Include temporarily @@ -424,6 +440,8 @@ Info Info Information Informatie +Information: If you ignore the error or abort a re-compare will be necessary! +Informatie: als u de fout negeert of de handeling afbreekt is opnieuw vergelijken noodzakelijk! Initialization of Recycle Bin failed! It cannot be used! Initialiseren van de prullenbak is mislukt. Het kan niet worden gebruikt! It was not possible to initialize the Recycle Bin!\n\nIt's likely that you are not using Windows.\nIf you want this feature included, please contact the author. :) @@ -436,8 +454,10 @@ Load configuration via...\n - this list (press DEL to delete items)\n - Laad configuratie via...\n - deze lijst (druk op DEL om items te verwijderen)\n - drag en drop in dit venster\n - opstartparameter Load from file... Laad met behulp van... -Log-messages:\n------------- -Logberichten:\n--------------- +Log-messages: +Logberichten: +Mirror ->> +Spiegelen ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. Spiegel backup van de linkerkant: de rechterkant wordt overschreven en komt na synchronisatie exact overeen met de linkerkant. No valid configuration file specified: @@ -452,10 +472,8 @@ Number of files and directories that will be deleted Aantal mappen en bestanden die zullen worden verwijderd Number of files that will be overwritten Aantal bestanden dat zal worden overschreven -One way -> -Naar rechts -> -Only files/directories that pass filtering will be selected for synchronization.\nThe filter will be applied to the full name including path prefix. -Alleen de niet gefilterde bestanden worden geselecteerd voor synchronisatie.\nHet filter wordt toegepast op de volledige naam inclusief pad-voorvoegsel. +Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the full name including path prefix. +Alleen de niet gefilterde bestanden worden geselecteerd voor synchronisatie. Het filter wordt toegepast op de volledige naam inclusief pad-voorvoegsel. Open synchronization dialog Open de synchronisatie-instellingen Open with Explorer\tD-Click @@ -468,6 +486,8 @@ Pause Pause Please fill all empty directory fields. Vul alstublieft aan beide kanten een pad in. +Please restart synchronization! +Herstart het synchroniseren alstublieft! Press button to activate filter Druk op de knop om het filter te activeren. Preview @@ -484,6 +504,8 @@ Result Resultaat Right folder: Rechter map: +S&ave configuration +S&la de instellingen op Save current configuration to file Sla de huidige instellingen op in een bestand Saved aborted! @@ -548,14 +570,18 @@ System out of memory! Systeem heeft te weinig geheugen The selected file does not contain a valid configuration! Het geselecteerde bestand bevat geen geldige configuratie! -The selected file does not exist anymore! -Het geselecteerde bestand bestaat niet meer! +The selected file does not exist: +Het volgende geselecteerde bestand bestaat niet: This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. Notice that the file time is allowed to deviate by up to 2 seconds. This ensures synchronization with the lower-precision file system FAT32 works correctly. Deze variant ziet twee gelijknamige bestanden als gelijk wanneer ze dezelfde bestandsgrootte EN tijdstempel hebben. Merk op dat tijdstempel 2 seconden mag verschillen. Dit zorgt ervoor dat het minder nauwkeurige FAT-32 ook kan worden gesynchroniseerd. Time elapsed: Verstreken tijd: Time shift in seconds Timeshift in seconden +Time shift: +Timeshift: +Time: +Tijd: Total amount of data that will be transferred Hoeveelheid data die verplaatst word Total time: @@ -567,7 +593,9 @@ Niet mogelijk om een logbestand aan te maken! Unable to initialize Recycle Bin! De prullenbak kon niet worden geïnitialiseerd! Unresolved errors occured during operation! -Er is een onbekende fout opgetreden tijdens de handeling! +Er zijn niet oplosbare fouten opgetreden tijdens de handeling! +Update -> +Overschrijven -> Update: Overschrijven: Use Recycle Bin @@ -580,12 +608,8 @@ Warning: Synchronization failed for Attentie: synchronisatie mislukt voor When \"Compare\" is triggered with this option set the following decision tree is processed: Wanneer \"Compare\" met deze instelling aan wordt gebruikt zal de volgende beslissingsboom gebruikt worden: -\n\nContinue with next object, retry or abort comparison? -\n\nDoorgaan met volgende object, opnieuw proberen of het vergelijken afbreken? -\n\nContinue with next object, retry or abort synchronization? -\n\nDoorgaan met volgende object, opnieuw proberen of de synchronisatie afbreken? -\n\nInformation: If you skip the error and continue or abort a re-compare will be necessary! -\n\nInformatie: Als u de fout negeert en doorgaat of afbreekt zult u opnieuw moeten vergelijken! +You can adjust the file times accordingly to resolve the issue: +U kunt de bestandstijden aanpassen om het probleem op te lossen: different verschillend file exists on both sides @@ -1,7 +1,5 @@ MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE MinGW \t- Windows port de la GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - Time: - Heure: Byte Octet GB @@ -54,8 +52,6 @@ &Annuler &Compare &Comparer -&Continue -&Continuer &Create &Créer &Create batch job @@ -68,14 +64,20 @@ &Fichier &Help &Aide +&Ignore +&Ignorer &Language &Langue +&Load configuration +&Charger la configuration &OK &OK &Pause &Pause &Quit &Quitter +&Resolve +&Résoudre &Retry &Réessayer &Start @@ -106,16 +108,18 @@ - fichier de droite plus récent - same date (different size) - même date (taille différente) -------------------------------------------------- ------------------------------------------------------ ---------\n -----------\n -Open-Source file synchronization- -Synchronisation de fichiers Open-Source- . , +1. &Compare +1. &Comparer 1. Enter full file or directory names separated by ';' or a new line. 1. Entrez le nom complet des fichiers ou des dossier séparés par un ';' ou par un 'retour charit'. +2. &Synchronize... +2. &Synchroniser... 2. Use wildcard characters '*' and '?'. 2. Les caractères génériques '*' et '?' sont acceptés. 3. Exclude files directly on main grid via context menu. @@ -134,6 +138,8 @@ == Les fichiers sont identiques\n\n >> right file is newer\n >> le fichier de droite est plus récent\n +A file time shift due to a daylight saving time change was detected for a FAT/FAT32 drive. +Un décalage horaire du fichier du à l'heure d'été a été détecté sur un lecteur FAT/FAT32. Abort Abandon Abort requested: Waiting for current operation to finish... @@ -156,8 +162,6 @@ All file times have been adjusted successfully! Toutes les dates de fichiers ont été ajustées avec succès! All items have been synchronized! Tous les éléments ont été synchronisés! -An error occured -Une erreur s'est produite An exception occured! Une violation s'est produite! Apply @@ -212,12 +216,10 @@ Configure your own synchronization rules. Paramétrage de vos règles de synchronisation. Confirm Confirmation +Consider this when setting up synchronization rules: You might want to avoid write access to these directories so that synchronization of both does not interfere. +Lisez ceci lors de la mise à jour des règles de synchronisation : Vous voudrez peut-être éviter l'accès en écriture à ces répertoires pour que la synchronisation n'interfère pas. Continue Continuer -Continue on error -Continuer en cas d'erreur -Continue on next errors -Continuer sur les erreurs suivantes Copy from left to right Copie de gauche à droite Copy from left to right overwriting @@ -226,6 +228,8 @@ Copy from right to left Copie de droite à gauche Copy from right to left overwriting Copie de droite à gauche avec remplacement +Copy new or updated files to right folder. +Copie defichiers nouveaux ou modifiés dans le dossier de droite. Copy to clipboard\tCTRL+C Copier dans le presse-papiers\tCTRL+C Copying file @@ -262,6 +266,10 @@ Data: Données: Date Date +Date: +Date: +Daylight saving time change detected for FAT/FAT32 drive. +Changement Heure d'été détecté sur un lecteur FAT/FAT32. Delete files/folders existing on left side only Suppression des fichiers/répertoires n'existant que sur le côté gauche Delete files/folders existing on right side only @@ -274,10 +282,14 @@ Deleting file Suppression du fichier Deleting folder Suppression du répertoire +Directories are dependent: +Les dossiers sont liés: Directory does not exist: Le répertoire n'existe pas: Do not show graphical status and error messages but write to a logfile instead Ne pas afficher l'état graphique ni les messages mais les écrire sur un fichier log +Do not show this warning again +Ne plus afficher cet avertissement Do nothing Ne rien faire Do you really want to delete the following objects(s)? @@ -288,6 +300,8 @@ Donate with PayPal Faites un don avec PayPal Drag && drop Glisser && Déposer +Drive: +Lecteur: Email: Email: Error @@ -304,18 +318,16 @@ Error copying file Erreur lors de la copie du fichier Error creating directory Erreur lors de la création du répertoire -Error deleting directory -Erreur lors de la suppression du répertoire -Error deleting file -Erreur lors de la suppression du fichier +Error deleting directory: +Erreur lors de la suppression d'un répertoire: +Error deleting file: +Erreur lors de la suppression d'un fichier: Error moving to recycle bin: Erreur lors du déplacement vers la corbeille: Error parsing configuration file Erreur lors de l'analyse du fichier de configuration Error reading file: Erreur lors de la lecture du fichier: -Error scanning directory: -Erreur lors du parcours du répertoire: Error traversing directory Erreur lors du parcours du répertoire Error when converting int to wxString @@ -374,8 +386,6 @@ Filter view Filtrage de la vue Folder pair Couple de dossiers -FreeFileSync (Date: -FreeFileSync (Date: FreeFileSync - Folder Comparison and Synchronization FreeFileSync - Comparaison et synchronisation de répertoires FreeFileSync Batch Job @@ -402,8 +412,8 @@ Hide files that exist on right side only Masquer les fichiers n'existant qu'à droite Hide filtered items Masquer les éléments filtrés -Hide further error messages during the current process and continue -Masquer les messages d'erreur suivants de l'opération en cours et continuer +Hide further error messages during the current process +Masquer les messages d'erreur suivants pendant le traitement Hides error messages during synchronization:\nThey are collected and shown as a list at the end of the process Masquer les messages d'erreur pendant la synchronisation:\nIls sont collationnés et listés à la fin de l'opération Hints: @@ -412,6 +422,14 @@ Homepage: Page d'accueil: If you like FFS: Si vous aimez FFS: +Ignore errors +Ignorer les erreurs +Ignore next errors +Ignorer les erreurs suivantes +Ignore this error, retry or abort comparison? +Ignorer l'erreur, réessayer ou abandonner la comparaison ? +Ignore this error, retry or abort synchronization? +Ignorer l'erreur, réessayer ou abandonner la synchronisation ? Include Inclure Include temporarily @@ -422,6 +440,8 @@ Info Info Information Information +Information: If you ignore the error or abort a re-compare will be necessary! +Information: Si vous ignorez l'erreur ou abandonnez, il sera nécessaire de relancer la comparaison! Initialization of Recycle Bin failed! It cannot be used! Erreur lors de l'initialisation de la corbeille ! La corbeille ne peut être utilisée! It was not possible to initialize the Recycle Bin!\n\nIt's likely that you are not using Windows.\nIf you want this feature included, please contact the author. :) @@ -434,8 +454,10 @@ Load configuration via...\n - this list (press DEL to delete items)\n - Charger la configuration via...\n - cette liste (Appuyez sur Suppr pour supprimer des éléments),\n - un glisser-déposer vers cette fenêtre,\n - les paramètres de démarrage. Load from file... Chargement à partir du fichier... -Log-messages:\n------------- -Messages log:\n--------------- +Log-messages: +Messages log: +Mirror ->> +Mirroir ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. Sauvegarde miroir du répertoire de gauche : Le répertoire de droite sera écrasé et exactement identique au répertoire de gauche après la synchronisation. No valid configuration file specified: @@ -450,10 +472,8 @@ Number of files and directories that will be deleted Nombre de fichiers et de répertoires qui seront supprimés Number of files that will be overwritten Nombre de fichiers qui seront remplacés -One way -> -Vers la droite -> -Only files/directories that pass filtering will be selected for synchronization.\nThe filter will be applied to the full name including path prefix. -Seuls les fichiers/dossiers filtrés seront sélectionnés pour la synchronisation.\nLe filtre s'appliquera au nom complet incluant le chemin. +Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the full name including path prefix. +Seuls les fichiers/dossiers filtrés seront sélectionnés pour la synchronisation. Le filtre s'appliquera au nom complet incluant le chemin. Open synchronization dialog Ouvrir la boîte de dialogue de la synchronisation Open with Explorer\tD-Click @@ -466,6 +486,8 @@ Pause Pause Please fill all empty directory fields. Veuillez remplir tous les champs vides du répertoire. +Please restart synchronization! +Veuillez, s'il vous plaît, relancer la synchronisation! Press button to activate filter Cliquez pour activer le filtrage Preview @@ -482,6 +504,8 @@ Result Résultat Right folder: Répertoire de droite: +S&ave configuration +S&auvegarder le configuration. Save current configuration to file Enregistrer la configuration courante Saved aborted! @@ -546,14 +570,18 @@ System out of memory! Erreur mémoire système! The selected file does not contain a valid configuration! Le fichier sélectionné ne contient pas de configuration valide! -The selected file does not exist anymore! -Le fichier sélectionné n'existe plus! +The selected file does not exist: +Le fichier sélectionné n'existe pas: This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. Notice that the file time is allowed to deviate by up to 2 seconds. This ensures synchronization with the lower-precision file system FAT32 works correctly. Cette variante définit comme identiques deux fichiers de même nom lorsqu'ils ont la même taille et le même date et heure de modification. Attention : la précision de l'heure est mesurée à 2 secondes près. Cela permet d'assurer la synchronisation avec la précision du systéme de fichiers FAT32. Time elapsed: Temps écoulé: Time shift in seconds Décalage horaire en secondes +Time shift: +Décalage horaire: +Time: +Heure: Total amount of data that will be transferred Volume de données à transférer Total time: @@ -564,6 +592,10 @@ Unable to create logfile! Impossible de créer un fichier log! Unable to initialize Recycle Bin! Impossible d'initialiser la corbeille! +Unresolved errors occured during operation! +Des erreurs inattendues se sont produites pendant le traitement! +Update -> +Mise à Jour -> Update: Mises à jour: Use Recycle Bin @@ -576,12 +608,8 @@ Warning: Synchronization failed for Attention : la synchronisation a échoué à cause de When \"Compare\" is triggered with this option set the following decision tree is processed: Quand \"Compare\" est lancé avec cette option, l'arbre de décision suivant est éxécuté: -\n\nContinue with next object, retry or abort comparison? -\n\nVoulez-vous continuer avec l'objet suivant, réessayer ou annuler la comparaison? -\n\nContinue with next object, retry or abort synchronization? -\n\nVoulez-vous continuer avec l'objet suivant, réessayer ou annuler la synchronisation? -\n\nInformation: If you skip the error and continue or abort a re-compare will be necessary! -\n\nInformation: Si vous sautez cette erreur et continuer ou si vous annulez, il sera nécessaire d'effectuer une re-comparaison! +You can adjust the file times accordingly to resolve the issue: +Vous pouvez modifier l'heure des fichiers pour résoudre le problème: different fichiers différents file exists on both sides @@ -1,7 +1,5 @@ MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - Time: - Uhrzeit: Byte Byte GB @@ -54,8 +52,6 @@ &Abbruch &Compare &Vergleichen -&Continue -&Fortfahren &Create &Erzeugen &Create batch job @@ -63,19 +59,25 @@ &Default &Standard &Export file list -&Exportiere Dateiliste +E&xportiere Dateiliste &File &Datei &Help &Hilfe +&Ignore +&Ignorieren &Language &Sprache +&Load configuration +&Lade Konfiguration &OK &OK &Pause &Pause &Quit &Beenden +&Resolve +&Beheben &Retry &Wiederholen &Start @@ -106,16 +108,18 @@ - rechts neuer - same date (different size) - gleiches Datum (unterschiedliche Größe) -------------------------------------------------- ------------------------------------------------------ ---------\n -----------\n -Open-Source file synchronization- -Open-Source Datei-Synchronisation- . , +1. &Compare +1. &Vergleichen 1. Enter full file or directory names separated by ';' or a new line. 1. Komplette Datei- und Verzeichnisnamen getrennt durch ';' oder eine Neuzeile eingeben. +2. &Synchronize... +2. &Synchronisieren... 2. Use wildcard characters '*' and '?'. 2. Die Platzhalter '*' und '?' werden unterstützt. 3. Exclude files directly on main grid via context menu. @@ -134,6 +138,8 @@ == Dateien sind gleich\n\n >> right file is newer\n >> rechte Datei ist neuer\n +A file time shift due to a daylight saving time change was detected for a FAT/FAT32 drive. +Eine Verschiebung der Dateiänderungszeiten aufgrund der Sommer-/Winterzeitumstellung wurde auf einem FAT/FAT32 Laufwerk erkannt. Abort Abbruch Abort requested: Waiting for current operation to finish... @@ -151,15 +157,13 @@ Add to exclude filter: Adjust file times Dateizeiten ändern Adjust modification times of all files contained in the specified folder and its subfolders. This manual adaption might become necessary if you are synchronizing against a FAT32 drive and the daylight saving time is switched. For an overview about the issue see this article: -Passt die Änderungszeiten aller Datein im angegebenen Ordner einschließlich Unterordner an. Diese manuelle Änderung kann nötig sein, wenn gegen ein FAT32-Laufwerk synchronisiert und zwischen Sommer- und Winterzeit umgestellt wurde. Für eine Ãœbersicht der Problematik siehe: +Passt die Änderungszeiten aller Dateien im angegebenen Ordner einschließlich Unterordner an. Diese manuelle Änderung kann nötig sein, wenn gegen ein FAT32-Laufwerk synchronisiert und zwischen Sommer- und Winterzeit umgestellt wurde. Für eine Ãœbersicht der Problematik siehe: All file times have been adjusted successfully! Alle Dateien wurden erfolgreich angepasst! All items have been synchronized! Alle Elemente wurden synchronisiert! -An error occured -Fehler An exception occured! -Eine Exception wurde geworfen! +Eine Ausnahme ist aufgetreten! Apply Anwenden As a result 6 different status can be returned to categorize all files: @@ -212,12 +216,10 @@ Configure your own synchronization rules. Eigene Synchronisationsregeln definieren. Confirm Bestätigen +Consider this when setting up synchronization rules: You might want to avoid write access to these directories so that synchronization of both does not interfere. +Achtung beim Festlegen der Synchronisationseinstellungen: Ein Schreibzugriff auf diese Verzeichnisse sollte vermieden werden, so dass sich die Synchronization von beiden nicht gegenseitig beeinflusst. Continue Fortfahren -Continue on error -Fortfahren bei Fehler -Continue on next errors -Fortfahren bei nächsten Fehlern Copy from left to right Von links nach rechts kopieren Copy from left to right overwriting @@ -226,6 +228,8 @@ Copy from right to left Von rechts nach links kopieren Copy from right to left overwriting Von rechts nach links kopieren und überschreiben +Copy new or updated files to right folder. +Kopiere neue oder aktualisierte Dateien in den rechten Ordner. Copy to clipboard\tCTRL+C Kopiere in Zwischenablage\tCTRL+C Copying file @@ -237,7 +241,7 @@ Fehler beim Öffnen der Datei: Could not read language file Fehler beim Lesen der Sprachdatei Could not retrieve file info for: -Fehler beim Lesen der Dateiattribute von: +Fehler beim Lesen der Dateiattribute von: Could not set working directory to directory containing executable file! Arbeitsverzeichnisses konnte nicht auf Pfad der .exe-Datei gelegt werden! Could not write configuration file @@ -262,6 +266,10 @@ Data: Daten: Date Datum +Date: +Datum: +Daylight saving time change detected for FAT/FAT32 drive. +Sommer-/Winterzeitumstellung wurde für ein FAT/FAT32 Laufwerk erkannt. Delete files/folders existing on left side only Lösche Dateien/Ordner, die nur links existieren Delete files/folders existing on right side only @@ -274,10 +282,14 @@ Deleting file Lösche Datei Deleting folder Lösche Verzeichnis +Directories are dependent: +Die Verzeichnisse sind voneinander abhängig: Directory does not exist: Das Verzeichnis existiert nicht: Do not show graphical status and error messages but write to a logfile instead Keine graphischen Status- und Fehlermeldungen anzeigen, sondern eine Logdatei erstellen +Do not show this warning again +Diese Warnung nicht mehr anzeigen Do nothing Nichts tun Do you really want to delete the following objects(s)? @@ -288,6 +300,8 @@ Donate with PayPal Spenden mit PayPal Drag && drop Drag && Drop +Drive: +Laufwerk: Email: Email: Error @@ -304,18 +318,16 @@ Error copying file Fehler beim Kopieren der Datei Error creating directory Fehler beim Erstellen des Verzeichnisses -Error deleting directory -Fehler beim Löschen des Verzeichnisses -Error deleting file -Fehler beim Löschen der Datei +Error deleting directory: +Fehler beim Löschen des Verzeichnisses: +Error deleting file: +Fehler beim Löschen der Datei: Error moving to recycle bin: Fehler beim Verschieben in den Papierkorb: Error parsing configuration file Fehler beim Auswerten der Konfigurationsdatei Error reading file: Fehler beim Lesen der Datei: -Error scanning directory: -Fehler beim Lesen des Verzeichnisses: Error traversing directory Fehler beim Durchsuchen des Verzeichnisses Error when converting int to wxString @@ -374,8 +386,6 @@ Filter view Ansicht filtern Folder pair Verzeichnispaar -FreeFileSync (Date: -FreeFileSync (Datum: FreeFileSync - Folder Comparison and Synchronization FreeFileSync - Verzeichnisvergleich und -synchronisation FreeFileSync Batch Job @@ -402,8 +412,8 @@ Hide files that exist on right side only Blende Dateien aus, die nur rechts existieren Hide filtered items Gefilterte Elemente ausblenden -Hide further error messages during the current process and continue -Unterdrücke alle nachfolgenden Fehlermeldungen für den aktuellen Prozess und fahre fort +Hide further error messages during the current process +Weitere Fehlermeldungen während des aktuellen Prozesses ausblenden Hides error messages during synchronization:\nThey are collected and shown as a list at the end of the process Verhindert das Anzeigen von Fehlermeldungen während der Synchronisation:\nSie werden jedoch gesammelt und nach dem Vorgang als Liste angezeigt Hints: @@ -412,6 +422,14 @@ Homepage: Homepage: If you like FFS: FFS unterstützen: +Ignore errors +Fehler ignorieren +Ignore next errors +Weitere Fehler ignorieren +Ignore this error, retry or abort comparison? +Fehler ignorieren, wiederholen oder Vergleich abbrechen? +Ignore this error, retry or abort synchronization? +Fehler ignorieren, wiederholen oder Synchronisation abbrechen? Include Einschließen Include temporarily @@ -422,6 +440,8 @@ Info Info Information Information +Information: If you ignore the error or abort a re-compare will be necessary! +Information: Wenn der Fehler nicht behoben wird, muss der Vergleich erneut gestartet werden! Initialization of Recycle Bin failed! It cannot be used! Die Initialisierung des Papierkorbs ist fehlgeschlagen! Er kann nicht verwendet werden! It was not possible to initialize the Recycle Bin!\n\nIt's likely that you are not using Windows.\nIf you want this feature included, please contact the author. :) @@ -434,8 +454,10 @@ Load configuration via...\n - this list (press DEL to delete items)\n - Lade Konfiguration über...\n - diese Liste (DEL-Taste löscht Einträge)\n - Drag & Drop auf dieses Fenster\n - Startupparameter Load from file... Lade aus Datei... -Log-messages:\n------------- -Lognachrichten:\n--------------- +Log-messages: +Lognachrichten: +Mirror ->> +Spiegel ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. Spiegel-Backup des linken Ordners erstellen: Der rechte Ordner wird dabei überschrieben und nach der Synchronisation dem linken exakt gleichen. No valid configuration file specified: @@ -450,10 +472,8 @@ Number of files and directories that will be deleted Anzahl der Dateien und Verzeichnisse, die gelöscht werden Number of files that will be overwritten Anzahl der Dateien, die überschrieben werden -One way -> -Nach rechts -> -Only files/directories that pass filtering will be selected for synchronization.\nThe filter will be applied to the full name including path prefix. -Bei der Synchronisation werden nur die Dateien/Ordner berücksichtigt, die zu den Filtereinstellungen passen.\nDer Filter wird dabei auf den kompletten Dateinamen einschließlich Pfadprefix angewandt. +Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the full name including path prefix. +Bei der Synchronisation werden nur die Dateien/Ordner berücksichtigt, die zu den Filtereinstellungen passen. Der Filter wird dabei auf den kompletten Dateinamen einschließlich Pfadprefix angewandt. Open synchronization dialog Zeige Synchronisationseinstellungen Open with Explorer\tD-Click @@ -466,6 +486,8 @@ Pause Pause Please fill all empty directory fields. Bitte alle leeren Verzeichnisfelder füllen. +Please restart synchronization! +Synchronisation bitte erneut ausführen! Press button to activate filter Auswählen, um Filter zu aktivieren Preview @@ -482,6 +504,8 @@ Result Ergebnis Right folder: Rechter Ordner: +S&ave configuration +S&peichere Konfiguration Save current configuration to file Aktuelle Konfiguration in Datei sichern Saved aborted! @@ -546,14 +570,18 @@ System out of memory! Zu wenig freier Arbeitsspeicher! The selected file does not contain a valid configuration! Die ausgewählte Datei enthält keine gültige Konfiguration! -The selected file does not exist anymore! -Die gewählte Datei existiert nicht mehr! +The selected file does not exist: +Die ausgewählte Datei existiert nicht: This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. Notice that the file time is allowed to deviate by up to 2 seconds. This ensures synchronization with the lower-precision file system FAT32 works correctly. Diese Variante identifiziert zwei gleichnamige Dateien als gleich, wenn sie die gleiche Dateigröße haben UND der Zeitpunkt der letzten Änderung derselbe ist. Dabei wird eine Abweichung von bis zu zwei Sekunden toleriert. So ist sichergestellt, dass eine Synchronisation gegen ein FAT32 Dateisystem korrekt funktioniert. Time elapsed: Vergangene Zeit: Time shift in seconds Zeitverschiebung in Sekunden +Time shift: +Zeitverschiebung: +Time: +Zeit: Total amount of data that will be transferred Gesamtmenge der Daten, die übertragen werden Total time: @@ -564,6 +592,10 @@ Unable to create logfile! Fehler beim Erstellen der Logdatei! Unable to initialize Recycle Bin! Der Papierkorb konnte nicht initialisiert werden! +Unresolved errors occured during operation! +Es sind nichtbehobene Fehler aufgetreten! +Update -> +Update -> Update: Ãœberschreiben: Use Recycle Bin @@ -576,12 +608,8 @@ Warning: Synchronization failed for Warnung: Synchronisation fehlgeschlagen für When \"Compare\" is triggered with this option set the following decision tree is processed: Nachdem \"Compare\" mit dieser Einstellung gestartet wurde, wird der folgende Entscheidungsbaum abgearbeitet: -\n\nContinue with next object, retry or abort comparison? -\n\nMit nächstem Objekt fortfahren, wiederholen oder abbrechen? -\n\nContinue with next object, retry or abort synchronization? -\n\nMit nächstem Objekt fortsetzen, wiederholen oder abbrechen? -\n\nInformation: If you skip the error and continue or abort a re-compare will be necessary! -\n\nInformation: Wenn der Fehler nicht behoben wird, muss der Vergleich erneut gestartet werden! +You can adjust the file times accordingly to resolve the issue: +Die Dateizeiten können entsprechend angepasst werden, um den Fehler zu beheben: different verschieden file exists on both sides diff --git a/japanese.lng b/japanese.lng index 0f3d3d05..b6c0019f 100644 --- a/japanese.lng +++ b/japanese.lng @@ -1,7 +1,5 @@ MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE - Time: - 時間: Byte ãƒã‚¤ãƒˆ GB @@ -54,8 +52,6 @@ ã‚ャンセル(&C) &Compare 比較(&C) -&Continue -続行(&C) &Create 作æˆ(&C) &Create batch job @@ -68,14 +64,20 @@ ファイル(&F) &Help ヘルプ(&H) +&Ignore +無視(&I) &Language 使用言語(&L) +&Load configuration +構æˆè¨å®šã®èªã¿è¾¼ã¿(&L) &OK &OK &Pause 一時åœæ¢(&P) &Quit 終了(&Q) +&Resolve +決定(&R) &Retry å†è©¦è¡Œ(&R) &Start @@ -106,18 +108,20 @@ - å³å´ã®æ–¹ãŒæ–°ã—ã„ - same date (different size) - 日付ã¯åŒä¸€(サイズã«å·®ç•°ã‚ã‚Š) -------------------------------------------------- ------------------------------------------------- ---------\n -----------\n -Open-Source file synchronization- -Open-Source ファイルåŒæœŸãƒ„ール- . , +1. &Compare +1. 比較(&C) 1. Enter full file or directory names separated by ';' or a new line. -1.完全ãªãƒ•ã‚¡ã‚¤ãƒ«/ディレクトリåã‚’ ' ; ' ã§åŒºåˆ‡ã£ã¦å…¥åŠ›ã—ã¦ãã ã•ã„。 +1. 完全ãªãƒ•ã‚¡ã‚¤ãƒ«/ディレクトリåã‚’ ' ; ' ã§åŒºåˆ‡ã£ã¦å…¥åŠ›ã—ã¦ãã ã•ã„。 +2. &Synchronize... +2. åŒæœŸå‡¦ç†(&S)... 2. Use wildcard characters '*' and '?'. -2.ワイルドカード㫠' * ' 㨠' ? ' を使用出æ¥ã¾ã™ã€‚ +2. ワイルドカード㫠' * ' 㨠' ? ' を使用出æ¥ã¾ã™ã€‚ 3. Exclude files directly on main grid via context menu. 3. コンテã‚ストメニューã‹ã‚‰ç›´æŽ¥ãƒ•ã‚¡ã‚¤ãƒ«ã‚’除外出æ¥ã¾ã™ã€‚ 4. Keep the number of entries small for best performance. @@ -134,6 +138,8 @@ == åŒã˜å†…容ã®ãƒ•ã‚¡ã‚¤ãƒ«\n\n >> right file is newer\n >> å³å´ã®æ–¹ãŒæ–°ã—ã„\n +A file time shift due to a daylight saving time change was detected for a FAT/FAT32 drive. +FAT/FAT32 ドライブã«ãŠã„ã¦ã€å¤æ™‚é–“ã®å¤‰æ›´ã«ä¼´ã†æ™‚é–“ã®ã‚·ãƒ•ãƒˆãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸã€‚ Abort ä¸æ– Abort requested: Waiting for current operation to finish... @@ -156,8 +162,6 @@ All file times have been adjusted successfully! ファイルã®æ™‚間調整ãŒå®Œäº†ã—ã¾ã—ãŸ! All items have been synchronized! ã™ã¹ã¦ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯åŒæœŸã•ã‚Œã¾ã—ãŸ! -An error occured -エラーãŒç™ºç”Ÿ An exception occured! 例外ãŒç™ºç”Ÿã—ã¾ã—ãŸ! Apply @@ -212,12 +216,10 @@ Configure your own synchronization rules. ã‚ãªãŸã®è¨å®šã—ãŸåŒæœŸè¦å‰‡ Confirm ç¢ºèª +Consider this when setting up synchronization rules: You might want to avoid write access to these directories so that synchronization of both does not interfere. +åŒæœŸè¦å‰‡ã‚’è¨å®šã™ã‚‹æ™‚ã®å‚™è€ƒ: ディレクトリã®æ›¸ãè¾¼ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’回é¿ã™ã‚‹ã“ã¨ã§ã€ã“れら両方ã®åŒæœŸå‡¦ç†ãŒå¹²æ¸‰ã—ãªã„よã†ã«ã™ã‚‹ã“ã¨ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ Continue 続行 -Continue on error -エラーã§ã‚‚続行 -Continue on next errors -次ã®ã‚¨ãƒ©ãƒ¼ã¾ã§ç¶šè¡Œ Copy from left to right å·¦ã‹ã‚‰å³ã«ã‚³ãƒ”ー Copy from left to right overwriting @@ -226,6 +228,8 @@ Copy from right to left å³ã‹ã‚‰å·¦ã«ã‚³ãƒ”ー Copy from right to left overwriting å³ã‹ã‚‰å·¦ã«ä¸Šæ›¸ãコピー +Copy new or updated files to right folder. +æ–°ã—ã„(æ›´æ–°)ファイルをå³ãƒ•ã‚©ãƒ«ãƒ€ã«ã‚³ãƒ”ー Copy to clipboard\tCTRL+C クリップボードã«ã‚³ãƒ”ー\tCTRL+C Copying file @@ -262,6 +266,10 @@ Data: データ: Date データ +Date: +日付: +Daylight saving time change detected for FAT/FAT32 drive. +FAT/FAT32 ドライブã§æ¤œå‡ºã•ã‚ŒãŸå¤æ™‚é–“ã®å¤‰æ›´ Delete files/folders existing on left side only å·¦å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダを削除 Delete files/folders existing on right side only @@ -274,10 +282,14 @@ Deleting file ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å‰Šé™¤ä¸ Deleting folder ãƒ•ã‚©ãƒ«ãƒ€ã‚’å‰Šé™¤ä¸ +Directories are dependent: +ディレクトリã®ä¾å˜é–¢ä¿‚: Directory does not exist: ディレクトリãŒå˜åœ¨ã—ã¾ã›ã‚“: Do not show graphical status and error messages but write to a logfile instead 進æ—状æ³ã€åŠã³ã‚¨ãƒ©ãƒ¼ã‚’表示ã—ãªã„ã§ã€ä»£ã‚ã‚Šã«ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã込む +Do not show this warning again +次回ã‹ã‚‰ã“ã®è¦å‘Šã‚’表示ã—ãªã„ Do nothing 何もã—ãªã„ Do you really want to delete the following objects(s)? @@ -288,6 +300,8 @@ Donate with PayPal PayPal ã‹ã‚‰å¯„付ã™ã‚‹ Drag && drop ドラッグ && ドãƒãƒƒãƒ— +Drive: +ドライブ: Email: E-メール: Error @@ -304,18 +318,16 @@ Error copying file ファイルã®ã‚³ãƒ”ーã«å¤±æ•— Error creating directory ディレクトリã®ä½œæˆã«å¤±æ•— -Error deleting directory -ディレクトリã®å‰Šé™¤ã«å¤±æ•— -Error deleting file -ファイルã®å‰Šé™¤ã«å¤±æ•— +Error deleting directory: +ディレクトリã®å‰Šé™¤ã‚¨ãƒ©ãƒ¼: +Error deleting file: +ファイルã®å‰Šé™¤ã‚¨ãƒ©ãƒ¼: Error moving to recycle bin: ゴミ箱ã¸ã®ç§»å‹•ã«å¤±æ•—ã—ã¾ã—ãŸ: Error parsing configuration file 構æˆãƒ•ã‚¡ã‚¤ãƒ«ã®æ§‹æ–‡ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™ Error reading file: ファイルèªã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: -Error scanning directory: -ディレクトリã®èªã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼: Error traversing directory ディレクトリã®ç§»å‹•ã‚¨ãƒ©ãƒ¼ Error when converting int to wxString @@ -365,7 +377,7 @@ Files/folders that exist on left side only Files/folders that exist on right side only å³å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダ Filter -フィルター +フィルタ Filter active: Press again to deactivate フィルター有効化: å†åº¦æŠ¼ã™ã¨ç„¡åŠ¹åŒ– Filter files @@ -374,8 +386,6 @@ Filter view 表示フィルター Folder pair フォルダペア -FreeFileSync (Date: -FreeFileSync (日付: FreeFileSync - Folder Comparison and Synchronization FreeFileSync - Folder Comparison and Synchronization FreeFileSync Batch Job @@ -402,8 +412,8 @@ Hide files that exist on right side only å³å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º Hide filtered items é©åˆã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã‚’éžè¡¨ç¤ºã«ã™ã‚‹ -Hide further error messages during the current process and continue -ç¾åœ¨ã®å‡¦ç†ã‚’続行ã™ã‚‹é–“ã¯ã€ä»¥é™ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ãªã„ +Hide further error messages during the current process +ç¾åœ¨ã®å‡¦ç†ä¸ã¯ä»¥é™ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ãªã„ Hides error messages during synchronization:\nThey are collected and shown as a list at the end of the process åŒæœŸå‡¦ç†ä¸ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’éžè¡¨ç¤ºã«ã™ã‚‹:\néžè¡¨ç¤ºã«ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€å‡¦ç†ã®çµ‚了後ã«ä¸€è¦§è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ Hints: @@ -412,6 +422,14 @@ Homepage: ホームページ: If you like FFS: FFS ãŒæ°—ã«å…¥ã£ãŸå ´åˆ: +Ignore errors +エラーを無視 +Ignore next errors +次ã®ã‚¨ãƒ©ãƒ¼ã‚’無視 +Ignore this error, retry or abort comparison? +ã“ã®ã‚¨ãƒ©ãƒ¼ã‚’無視ã—ã¦å†è©¦è¡Œã€æˆ–ã„ã¯æ¯”較をä¸æ¢ã—ã¾ã™ã‹? +Ignore this error, retry or abort synchronization? +ã“ã®ã‚¨ãƒ©ãƒ¼ã‚’無視ã—ã¦å†è©¦è¡Œã€æˆ–ã„ã¯åŒæœŸã‚’ä¸æ¢ã—ã¾ã™ã‹? Include å«ã‚ã‚‹ Include temporarily @@ -422,6 +440,8 @@ Info æƒ…å ± Information インフォメーション +Information: If you ignore the error or abort a re-compare will be necessary! +インフォメーション: ã“ã®ã‚¨ãƒ©ãƒ¼ã‚’無視ã—ã¦ä¸æ–ã—ãŸå ´åˆã¯ã€å†æ¯”較ãŒå¿…è¦ã§ã™! Initialization of Recycle Bin failed! It cannot be used! ゴミ箱ã®åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ! 使用ã§ããªã„状態ã§ã™! It was not possible to initialize the Recycle Bin!\n\nIt's likely that you are not using Windows.\nIf you want this feature included, please contact the author. :) @@ -434,8 +454,10 @@ Load configuration via...\n - this list (press DEL to delete items)\n - 構æˆãƒ•ã‚¡ã‚¤ãƒ«ã®èªã¿è¾¼ã¿...\n - リスト (DEL-ã§ã‚¢ã‚¤ãƒ†ãƒ を削除)\n - ウィンドウã«ãƒ‰ãƒ©ãƒƒã‚° & ドãƒãƒƒãƒ—\n - 起動時ã®ãƒ‘ラメータ Load from file... ファイルã‹ã‚‰èªã¿è¾¼ã¿... -Log-messages:\n------------- -ãƒã‚°ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸:\n----------- +Log-messages: +ãƒã‚°ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸: +Mirror ->> +ミラー >> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. å·¦å´ãƒ•ã‚©ãƒ«ãƒ€ã‚’ミラーリングãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—: åŒæœŸå®Œäº†å¾Œã¯ã€å·¦å´ãƒ•ã‚©ãƒ«ãƒ€ã«åˆã‚ã›ã¦å³å´ãƒ•ã‚©ãƒ«ãƒ€ã¯ä¸Šæ›¸ãã•ã‚Œã¾ã™ã€‚ No valid configuration file specified: @@ -450,9 +472,7 @@ Number of files and directories that will be deleted 削除ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ•° Number of files that will be overwritten 上書ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«æ•° -One way -> -一方通行 -> -Only files/directories that pass filtering will be selected for synchronization.\nThe filter will be applied to the full name including path prefix. +Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the full name including path prefix. é¸æŠžã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«/ディレクトリをåŒæœŸå‡¦ç†ã™ã‚‹æ™‚ã ã‘フィルタリングã•ã‚Œã¾ã™ã€‚\nã“ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã¯ã€æŽ¥é 語をå«ã‚€ãƒ‘スã¨å®Œå…¨ãªåå‰ã«ã®ã¿é©ç”¨ã•ã‚Œã¾ã™ã€‚ Open synchronization dialog åŒæœŸãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’é–‹ã @@ -465,7 +485,9 @@ Operation: Pause 一時åœæ¢ Please fill all empty directory fields. -ã™ã¹ã¦ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«å…¥åŠ›ã—ã¦ãã ã•ã„。 +アイテムãŒé¸æŠžã•ã‚Œã¦ã„ã¾ã›ã‚“! +Please restart synchronization! +åŒæœŸå‡¦ç†ã‚’å†ã‚¹ã‚¿ãƒ¼ãƒˆã—ã¦ãã ã•ã„! Press button to activate filter ボタンをクリックã§æœ‰åŠ¹åŒ– Preview @@ -482,6 +504,8 @@ Result çµæžœ Right folder: å³å´ãƒ•ã‚©ãƒ«ãƒ€: +S&ave configuration +構æˆè¨å®šã‚’ä¿å˜(&A) Save current configuration to file ç¾åœ¨ã®è¨å®šã‚’ファイルã«ä¿å˜ Saved aborted! @@ -546,14 +570,18 @@ System out of memory! メモリãŒä¸è¶³ã—ã¦ã„ã¾ã™! The selected file does not contain a valid configuration! é¸æŠžã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã«ã¯æœ‰åŠ¹ãªæ§‹æˆãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“! -The selected file does not exist anymore! -é¸æŠžã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯ãれ以上å˜åœ¨ã—ã¾ã›ã‚“! +The selected file does not exist: +é¸æŠžã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯å˜åœ¨ã—ã¾ã›ã‚“: This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. Notice that the file time is allowed to deviate by up to 2 seconds. This ensures synchronization with the lower-precision file system FAT32 works correctly. ã“ã®å¤‰æ•°ã§ã¯ã€ãµãŸã¤ã®åŒåファイルãŒå˜åœ¨ã—ãŸå ´åˆã€ ãã‚Œãžã‚Œã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºã¨æœ€çµ‚更新日付/時間を比較ã—ã¾ã™ã€‚\nファイル時間ã®å·®ç•°ãŒ 2 秒以内ã®å ´åˆã¯æ¤œå‡ºã•ã‚Œãªã„ã¨ã„ã†ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。 (ã“ã‚Œã¯ã€FAT32システムã§æ£ç¢ºã«åŒæœŸã‚’è¡Œã†ã“ã¨ãŒã§ãる最å°å€¤ã§ã™) Time elapsed: 経éŽæ™‚é–“: Time shift in seconds タイムシフト(秒) +Time shift: +タイムシフト: +Time: +時間: Total amount of data that will be transferred 転é€ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã®ç·é‡ Total time: @@ -564,6 +592,10 @@ Unable to create logfile! ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆå‡ºæ¥ã¾ã›ã‚“! Unable to initialize Recycle Bin! ゴミ箱ã®åˆæœŸåŒ–ãŒå‡ºæ¥ã¾ã›ã‚“! +Unresolved errors occured during operation! +例外エラーãŒç™ºç”Ÿã—ã¾ã—ãŸ! +Update -> +æ›´æ–° -> Update: アップデート: Use Recycle Bin @@ -576,12 +608,8 @@ Warning: Synchronization failed for è¦å‘Š: åŒæœŸå‡¦ç†ã«å¤±æ•— When \"Compare\" is triggered with this option set the following decision tree is processed: ã“ã®è¨å®šã§ \"比較\" トリガãŒå®Ÿè¡Œã•ã‚ŒãŸå ´åˆã¯ã€ä»¥ä¸‹ã®ãƒ„リーã«å¾“ã£ã¦å‡¦ç†ã•ã‚Œã¦ã„ãã¾ã™ã€‚ -\n\nContinue with next object, retry or abort comparison? -\n\n次ã®ã‚ªãƒ–ジェクトã®æ¯”較を続行ã—ã¾ã™ã‹? ä¸æ–ã—ã¾ã™ã‹? -\n\nContinue with next object, retry or abort synchronization? -\n\n次ã®ã‚ªãƒ–ジェクトã®åŒæœŸã‚’続行ã—ã¾ã™ã‹? ä¸æ–ã—ã¾ã™ã‹? -\n\nInformation: If you skip the error and continue or abort a re-compare will be necessary! -\n\nインフォメーション: エラーをスã‚ップã—ã¦ç¶šè¡Œ/ä¸æ–ã—ãŸå ´åˆã€å†æ¯”較を行ã†å¿…è¦ãŒã‚ã‚Šã¾ã™! +You can adjust the file times accordingly to resolve the issue: +ã“ã®å•é¡Œã‚’解決ã™ã‚‹ãŸã‚ã«ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®æ™‚間を調整ã§ãã¾ã™: different 差異ã‚ã‚Š file exists on both sides diff --git a/library/CustomGrid.cpp b/library/CustomGrid.cpp index 3fdc5967..1abf73a7 100644 --- a/library/CustomGrid.cpp +++ b/library/CustomGrid.cpp @@ -114,9 +114,9 @@ public: switch (col) { case 0: //filename - return gridLine.fileDescrLeft.relativeName.AfterLast(GlobalResources::fileNameSeparator); + return gridLine.fileDescrLeft.relativeName.AfterLast(GlobalResources::FILE_NAME_SEPARATOR); case 1: //relative path - return gridLine.fileDescrLeft.relativeName.BeforeLast(GlobalResources::fileNameSeparator); + return gridLine.fileDescrLeft.relativeName.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR); case 2: //file size return globalFunctions::includeNumberSeparator(fileSize = gridLine.fileDescrLeft.fileSize.ToString()); case 3: //date @@ -148,9 +148,9 @@ public: switch (col) { case 0: //filename - return gridLine.fileDescrRight.relativeName.AfterLast(GlobalResources::fileNameSeparator); + return gridLine.fileDescrRight.relativeName.AfterLast(GlobalResources::FILE_NAME_SEPARATOR); case 1: //relative path - return gridLine.fileDescrRight.relativeName.BeforeLast(GlobalResources::fileNameSeparator); + return gridLine.fileDescrRight.relativeName.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR); case 2: //file size return globalFunctions::includeNumberSeparator(fileSize = gridLine.fileDescrRight.fileSize.ToString()); case 3: //date @@ -319,7 +319,7 @@ CustomGrid::CustomGrid(wxWindow *parent, const wxString& name) : wxGrid(parent, id, pos, size, style, name), scrollbarsEnabled(true), - m_grid1(0), m_grid2(0), m_grid3(0), + m_gridLeft(0), m_gridRight(0), m_gridMiddle(0), gridDataTable(0), currentSortColumn(-1), sortMarker(0) @@ -357,39 +357,39 @@ void CustomGrid::SetScrollbar(int orientation, int position, int thumbSize, int //ensure that all grids are properly aligned: add some extra window space to grids that have no horizontal scrollbar -void CustomGrid::adjustGridHeights() //m_grid1, m_grid2, m_grid3 are not NULL in this context +void CustomGrid::adjustGridHeights() //m_gridLeft, m_gridRight, m_gridMiddle are not NULL in this context { int y1 = 0; int y2 = 0; int y3 = 0; int dummy = 0; - m_grid1->GetViewStart(&dummy, &y1); - m_grid2->GetViewStart(&dummy, &y2); - m_grid3->GetViewStart(&dummy, &y3); + m_gridLeft->GetViewStart(&dummy, &y1); + m_gridRight->GetViewStart(&dummy, &y2); + m_gridMiddle->GetViewStart(&dummy, &y3); if (y1 != y2 || y2 != y3) { int yMax = max(y1, max(y2, y3)); if (leadingPanel == 1) //do not handle case (y1 == yMax) here!!! Avoid back coupling! - m_grid1->SetMargins(0, 0); + m_gridLeft->SetMargins(0, 0); else if (y1 < yMax) - m_grid1->SetMargins(0, 50); + m_gridLeft->SetMargins(0, 50); if (leadingPanel == 2) - m_grid2->SetMargins(0, 0); + m_gridRight->SetMargins(0, 0); else if (y2 < yMax) - m_grid2->SetMargins(0, 50); + m_gridRight->SetMargins(0, 50); if (leadingPanel == 3) - m_grid3->SetMargins(0, 0); + m_gridMiddle->SetMargins(0, 0); else if (y3 < yMax) - m_grid3->SetMargins(0, 50); + m_gridMiddle->SetMargins(0, 50); - m_grid1->ForceRefresh(); - m_grid2->ForceRefresh(); - m_grid3->ForceRefresh(); + m_gridLeft->ForceRefresh(); + m_gridRight->ForceRefresh(); + m_gridMiddle->ForceRefresh(); } } @@ -400,47 +400,47 @@ void CustomGrid::DoPrepareDC(wxDC& dc) wxScrollHelper::DoPrepareDC(dc); int x, y = 0; - if (leadingPanel == 1 && this == m_grid1) //avoid back coupling + if (leadingPanel == 1 && this == m_gridLeft) //avoid back coupling { GetViewStart(&x, &y); - m_grid2->Scroll(x, y); - m_grid3->Scroll(-1, y); //scroll in y-direction only - adjustGridHeights(); //keep here to ensure m_grid1, m_grid2, m_grid3 != NULL + m_gridRight->Scroll(x, y); + m_gridMiddle->Scroll(-1, y); //scroll in y-direction only + adjustGridHeights(); //keep here to ensure m_gridLeft, m_gridRight, m_gridMiddle != NULL } - else if (leadingPanel == 2 && this == m_grid2) //avoid back coupling + else if (leadingPanel == 2 && this == m_gridRight) //avoid back coupling { GetViewStart(&x, &y); - m_grid1->Scroll(x, y); - m_grid3->Scroll(-1, y); - adjustGridHeights(); //keep here to ensure m_grid1, m_grid2, m_grid3 != NULL + m_gridLeft->Scroll(x, y); + m_gridMiddle->Scroll(-1, y); + adjustGridHeights(); //keep here to ensure m_gridLeft, m_gridRight, m_gridMiddle != NULL } - else if (leadingPanel == 3 && this == m_grid3) //avoid back coupling + else if (leadingPanel == 3 && this == m_gridMiddle) //avoid back coupling { GetViewStart(&x, &y); - m_grid1->Scroll(-1, y); - m_grid2->Scroll(-1, y); - adjustGridHeights(); //keep here to ensure m_grid1, m_grid2, m_grid3 != NULL + m_gridLeft->Scroll(-1, y); + m_gridRight->Scroll(-1, y); + adjustGridHeights(); //keep here to ensure m_gridLeft, m_gridRight, m_gridMiddle != NULL } } //these classes will scroll together, hence the name ;) -void CustomGrid::setScrollFriends(CustomGrid* grid1, CustomGrid* grid2, CustomGrid* grid3) +void CustomGrid::setScrollFriends(CustomGrid* gridLeft, CustomGrid* gridRight, CustomGrid* gridMiddle) { - assert(grid1); - assert(grid2); - assert(grid3); + assert(gridLeft); + assert(gridRight); + assert(gridMiddle); - m_grid1 = grid1; - m_grid2 = grid2; - m_grid3 = grid3; + m_gridLeft = gridLeft; + m_gridRight = gridRight; + m_gridMiddle = gridMiddle; assert(gridDataTable); - if (this == m_grid1) + if (this == m_gridLeft) gridDataTable->SetGridIdentifier(1); - else if (this == m_grid2) + else if (this == m_gridRight) gridDataTable->SetGridIdentifier(2); - else if (this == m_grid3) + else if (this == m_gridMiddle) gridDataTable->SetGridIdentifier(3); else assert (false); diff --git a/library/CustomGrid.h b/library/CustomGrid.h index 8f22275b..3547b090 100644 --- a/library/CustomGrid.h +++ b/library/CustomGrid.h @@ -5,7 +5,8 @@ #include <wx/grid.h> #include "../FreeFileSync.h" -using namespace std; +using namespace FreeFileSync; + class CustomGridTableBase; @@ -35,7 +36,7 @@ public: //this method is called when grid view changes: useful for parallel updating of multiple grids void DoPrepareDC(wxDC& dc); - void setScrollFriends(CustomGrid* grid1, CustomGrid* grid2, CustomGrid* grid3); + void setScrollFriends(CustomGrid* gridLeft, CustomGrid* gridRight, CustomGrid* gridMiddle); void setGridDataTable(GridView* gridRefUI, FileCompareResult* gridData); @@ -51,9 +52,9 @@ private: bool scrollbarsEnabled; - CustomGrid* m_grid1; - CustomGrid* m_grid2; - CustomGrid* m_grid3; + CustomGrid* m_gridLeft; + CustomGrid* m_gridRight; + CustomGrid* m_gridMiddle; CustomGridTableBase* gridDataTable; diff --git a/library/fileHandling.cpp b/library/fileHandling.cpp new file mode 100644 index 00000000..e46a2b69 --- /dev/null +++ b/library/fileHandling.cpp @@ -0,0 +1,218 @@ +#include "fileHandling.h" +#include <wx/intl.h> +#include <wx/msgdlg.h> +#include "resources.h" + +#ifdef FFS_WIN +#include <windows.h> +#endif // FFS_WIN + + +class RecycleBin +{ +public: + RecycleBin() : + recycleBinAvailable(false) + { +#ifdef FFS_WIN + recycleBinAvailable = true; +#endif // FFS_WIN + } + + ~RecycleBin() {} + + bool recycleBinExists() + { + return recycleBinAvailable; + } + + bool moveToRecycleBin(const wxString& filename) + { + if (!recycleBinAvailable) //this method should ONLY be called if recycle bin is available + throw RuntimeException(_("Initialization of Recycle Bin failed! It cannot be used!")); + +#ifdef FFS_WIN + wxString filenameDoubleNull = filename + wxChar(0); + + SHFILEOPSTRUCT fileOp; + fileOp.hwnd = NULL; + fileOp.wFunc = FO_DELETE; + fileOp.pFrom = filenameDoubleNull.c_str(); + fileOp.pTo = NULL; + fileOp.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_SILENT; + fileOp.fAnyOperationsAborted = false; + fileOp.hNameMappings = NULL; + fileOp.lpszProgressTitle = NULL; + + if (SHFileOperation(&fileOp //pointer to an SHFILEOPSTRUCT structure that contains information the function needs to carry out + ) != 0 || fileOp.fAnyOperationsAborted) return false; +#else + assert(false); +#endif + + return true; + } + +private: + bool recycleBinAvailable; +}; + +//global instance of recycle bin +RecycleBin recyclerInstance; + + +bool FreeFileSync::recycleBinExists() +{ + return recyclerInstance.recycleBinExists(); +} + + +inline +bool moveToRecycleBin(const wxString& filename) throw(RuntimeException) +{ + return recyclerInstance.moveToRecycleBin(filename); +} + + +inline +void FreeFileSync::removeFile(const wxString& filename, const bool useRecycleBin) +{ + if (!wxFileExists(filename)) return; //this is NOT an error situation: the manual deletion relies on it! + + if (useRecycleBin) + { + if (!moveToRecycleBin(filename)) + throw FileError(wxString(_("Error moving to recycle bin: ")) + wxT("\"") + filename + wxT("\"")); + return; + } + +#ifdef FFS_WIN + if (!SetFileAttributes( + filename.c_str(), //address of filename + FILE_ATTRIBUTE_NORMAL //attributes to set + )) throw FileError(wxString(_("Error deleting file: ")) + wxT("\"") + filename + wxT("\"")); +#endif //FFS_WIN + + if (!wxRemoveFile(filename)) + throw FileError(wxString(_("Error deleting file: ")) + wxT("\"") + filename + wxT("\"")); +} + + +void FreeFileSync::removeDirectory(const wxString& directory, const bool useRecycleBin) +{ + if (!wxDirExists(directory)) return; //this is NOT an error situation: the manual deletion relies on it! + + if (useRecycleBin) + { + if (!moveToRecycleBin(directory)) + throw FileError(wxString(_("Error moving to recycle bin: ")) + wxT("\"") + directory + wxT("\"")); + return; + } + + wxArrayString fileList; + wxArrayString dirList; + + try + { + //should be executed in own scope so that directory access does not disturb deletion! + getAllFilesAndDirs(directory, fileList, dirList); + } + catch (const FileError& e) + { + throw FileError(wxString(_("Error deleting directory: ")) + wxT("\"") + directory + wxT("\"")); + } + + for (unsigned int j = 0; j < fileList.GetCount(); ++j) + removeFile(fileList[j], useRecycleBin); + + dirList.Insert(directory, 0); //this directory will be deleted last + + for (int j = int(dirList.GetCount()) - 1; j >= 0 ; --j) + { +#ifdef FFS_WIN + if (!SetFileAttributes( + dirList[j].c_str(), // address of directory name + FILE_ATTRIBUTE_NORMAL // attributes to set + )) throw FileError(wxString(_("Error deleting directory: ")) + wxT("\"") + dirList[j] + wxT("\"")); +#endif // FFS_WIN + + if (!wxRmdir(dirList[j])) + throw FileError(wxString(_("Error deleting directory: ")) + wxT("\"") + dirList[j] + wxT("\"")); + } +} + + +void FreeFileSync::createDirectory(const wxString& directory, int level) +{ + if (wxDirExists(directory)) + return; + + if (level == 50) //catch endless loop + return; + + //try to create directory + if (wxMkdir(directory)) + return; + + //if not successfull try to create containing folders first + wxString createFirstDir = wxDir(directory).GetName().BeforeLast(GlobalResources::FILE_NAME_SEPARATOR); + + //call function recursively + if (createFirstDir.IsEmpty()) return; + createDirectory(createFirstDir, level + 1); + + //now creation should be possible + if (!wxMkdir(directory)) + { + if (level == 0) + throw FileError(wxString(_("Error creating directory ")) + wxT("\"") + directory + wxT("\"")); + } +} + + +class GetAllFilesSimple : public wxDirTraverser +{ +public: + GetAllFilesSimple(wxArrayString& files, wxArrayString& subDirectories) : + m_files(files), + m_dirs(subDirectories) {} + + + wxDirTraverseResult OnDir(const wxString& dirname) + { + m_dirs.Add(dirname); + return wxDIR_CONTINUE; + } + + wxDirTraverseResult OnFile(const wxString& filename) + { + m_files.Add(filename); + return wxDIR_CONTINUE; + } + + wxDirTraverseResult OnOpenError(const wxString& openerrorname) + { + wxMessageBox(openerrorname, _("Error")); + return wxDIR_IGNORE; + } + +private: + wxArrayString& m_files; + wxArrayString& m_dirs; +}; + + +void FreeFileSync::getAllFilesAndDirs(const wxString& sourceDir, wxArrayString& files, wxArrayString& directories) throw(FileError) +{ + files.Clear(); + directories.Clear(); + + //get all files and directories from current directory (and subdirectories) + wxDir dir(sourceDir); + GetAllFilesSimple traverser(files, directories); + + if (dir.Traverse(traverser) == (size_t)-1) + throw FileError(wxString(_("Error traversing directory ")) + wxT("\"") + sourceDir + wxT("\"")); +} + + diff --git a/library/fileHandling.h b/library/fileHandling.h new file mode 100644 index 00000000..a4f43391 --- /dev/null +++ b/library/fileHandling.h @@ -0,0 +1,37 @@ +#ifndef RECYCLER_H_INCLUDED +#define RECYCLER_H_INCLUDED + +#include "globalFunctions.h" +#include <wx/dir.h> + + +class FileError //Exception class used to notify file/directory copy/delete errors +{ +public: + FileError(const wxString& txt) : errorMessage(txt) {} + + wxString show() const + { + return errorMessage; + } + +private: + wxString errorMessage; +}; + + +namespace FreeFileSync +{ + void getAllFilesAndDirs(const wxString& sourceDir, wxArrayString& files, wxArrayString& directories) throw(FileError); + + //recycler + bool recycleBinExists(); //test existence of Recycle Bin API on current system + + //file handling + void removeDirectory(const wxString& directory, const bool useRecycleBin); + void removeFile(const wxString& filename, const bool useRecycleBin); + void createDirectory(const wxString& directory, int level = 0); //level is used internally only +} + + +#endif // RECYCLER_H_INCLUDED diff --git a/library/globalFunctions.cpp b/library/globalFunctions.cpp index 07c34af0..7e99e036 100644 --- a/library/globalFunctions.cpp +++ b/library/globalFunctions.cpp @@ -91,7 +91,7 @@ double globalFunctions::wxStringToDouble(const wxString& number) wxString& globalFunctions::includeNumberSeparator(wxString& number) { for (int i = number.size() - 3; i > 0; i-= 3) - number.insert(i, GlobalResources::thousandsSeparator); + number.insert(i, GlobalResources::THOUSANDS_SEPARATOR); return number; } @@ -197,5 +197,5 @@ void DebugLog::write(const wxString& logText) wxString getCodeLocation(const wxString file, const int line) { - return wxString(file).AfterLast(GlobalResources::fileNameSeparator) + wxT(", LINE ") + globalFunctions::numberToWxString(line) + wxT(" | "); + return wxString(file).AfterLast(GlobalResources::FILE_NAME_SEPARATOR) + wxT(", LINE ") + globalFunctions::numberToWxString(line) + wxT(" | "); } diff --git a/library/globalFunctions.h b/library/globalFunctions.h index efbc42c7..add3c79d 100644 --- a/library/globalFunctions.h +++ b/library/globalFunctions.h @@ -4,6 +4,7 @@ #include <string> #include <algorithm> #include <vector> +#include <set> #include <wx/string.h> #include <fstream> #include <wx/stream.h> @@ -106,4 +107,33 @@ private: wxString errorMessage; }; + +//Note: the following lines are a performance optimization for deleting elements from a vector. It is incredibly faster to create a new +//vector and leave specific elements out than to delete row by row and force recopying of most elements for each single deletion (linear vs quadratic runtime) +template <class T> +void removeRowsFromVector(vector<T>& grid, const set<int>& rowsToRemove) +{ + vector<T> temp; + int rowToSkip = -1; //keep it an INT! + + set<int>::iterator rowToSkipIndex = rowsToRemove.begin(); + + if (rowToSkipIndex != rowsToRemove.end()) + rowToSkip = *rowToSkipIndex; + + for (int i = 0; i < int(grid.size()); ++i) + { + if (i != rowToSkip) + temp.push_back(grid[i]); + else + { + ++rowToSkipIndex; + if (rowToSkipIndex != rowsToRemove.end()) + rowToSkip = *rowToSkipIndex; + } + } + grid.swap(temp); +} + + #endif // GLOBALFUNCTIONS_H_INCLUDED diff --git a/library/misc.cpp b/library/misc.cpp index 0a850805..f7aea8bd 100644 --- a/library/misc.cpp +++ b/library/misc.cpp @@ -129,8 +129,8 @@ void CustomLocale::setLanguage(const int language) ; //if languageFile is empty texts will be english per default //these global variables need to be redetermined on language selection - GlobalResources::decimalPoint = _("."); - GlobalResources::thousandsSeparator = _(","); + GlobalResources::DECIMAL_POINT = _("."); + GlobalResources::THOUSANDS_SEPARATOR = _(","); } diff --git a/library/processXml.cpp b/library/processXml.cpp index e87ae9de..2ce22b3e 100644 --- a/library/processXml.cpp +++ b/library/processXml.cpp @@ -144,15 +144,15 @@ XmlBatchConfig xmlAccess::readBatchConfig(const wxString& filename) XmlGlobalSettings xmlAccess::readGlobalSettings() { //load XML - XmlConfigInput inputFile(FreeFileSync::FfsGlobalSettingsFile, XML_GLOBAL_SETTINGS); + XmlConfigInput inputFile(FreeFileSync::GLOBAL_CONFIG_FILE, XML_GLOBAL_SETTINGS); XmlGlobalSettings outputCfg; if (!inputFile.loadedSuccessfully()) - throw FileError(wxString(_("Could not open configuration file ")) + wxT("\"") + FreeFileSync::FfsGlobalSettingsFile + wxT("\"")); + throw FileError(wxString(_("Could not open configuration file ")) + wxT("\"") + FreeFileSync::GLOBAL_CONFIG_FILE + wxT("\"")); if (!inputFile.readXmlGlobalSettings(outputCfg)) - throw FileError(wxString(_("Error parsing configuration file ")) + wxT("\"") + FreeFileSync::FfsGlobalSettingsFile + wxT("\"")); + throw FileError(wxString(_("Error parsing configuration file ")) + wxT("\"") + FreeFileSync::GLOBAL_CONFIG_FILE + wxT("\"")); return outputCfg; } @@ -184,12 +184,12 @@ void xmlAccess::writeBatchConfig(const wxString& filename, const XmlBatchConfig& void xmlAccess::writeGlobalSettings(const XmlGlobalSettings& inputCfg) { - XmlConfigOutput outputFile(FreeFileSync::FfsGlobalSettingsFile, XML_GLOBAL_SETTINGS); + XmlConfigOutput outputFile(FreeFileSync::GLOBAL_CONFIG_FILE, XML_GLOBAL_SETTINGS); //populate and write XML tree if ( !outputFile.writeXmlGlobalSettings(inputCfg) || //add GUI layout configuration settings !outputFile.writeToFile()) //save XML - throw FileError(wxString(_("Could not write configuration file ")) + wxT("\"") + FreeFileSync::FfsGlobalSettingsFile + wxT("\"")); + throw FileError(wxString(_("Could not write configuration file ")) + wxT("\"") + FreeFileSync::GLOBAL_CONFIG_FILE + wxT("\"")); return; } @@ -365,8 +365,8 @@ bool XmlConfigInput::readXmlMainConfig(MainConfiguration& mainCfg, vector<Folder mainCfg.excludeFilter = wxString::FromUTF8(tempString.c_str()); //########################################################### //other - if (!readXmlElementValue(mainCfg.useRecycleBin, miscSettings, "Recycler")) return false; - if (!readXmlElementValue(mainCfg.continueOnError, miscSettings, "Continue")) return false; + readXmlElementValue(mainCfg.useRecycleBin, miscSettings, "UseRecycler"); + readXmlElementValue(mainCfg.ignoreErrors, miscSettings, "IgnoreErrors"); return true; } @@ -388,8 +388,7 @@ bool XmlConfigInput::readXmlGuiConfig(XmlGuiConfig& outputCfg) TiXmlElement* mainWindow = hRoot.FirstChild("GuiConfig").FirstChild("Windows").FirstChild("Main").ToElement(); if (mainWindow) { - if (!readXmlElementValue(outputCfg.hideFilteredElements, mainWindow, "HideFiltered")) - outputCfg.hideFilteredElements = false; + readXmlElementValue(outputCfg.hideFilteredElements, mainWindow, "HideFiltered"); } return true; @@ -413,8 +412,7 @@ bool XmlConfigInput::readXmlBatchConfig(XmlBatchConfig& outputCfg) if (batchConfig) { //read application window size and position - if (!readXmlElementValue(outputCfg.silent, batchConfig, "Silent")) - outputCfg.silent = false; + readXmlElementValue(outputCfg.silent, batchConfig, "Silent"); } return true; @@ -435,6 +433,14 @@ bool XmlConfigInput::readXmlGlobalSettings(XmlGlobalSettings& outputCfg) //program language readXmlElementValue(outputCfg.global.programLanguage, global, "Language"); +#ifdef FFS_WIN + //daylight saving time check + readXmlElementValue(outputCfg.global.dstCheckActive, global, "DaylightSavingTimeCheckActive"); +#endif + + //folder dependency check + readXmlElementValue(outputCfg.global.folderDependCheckActive, global, "FolderDependencyCheckActive"); + //gui specific global settings (optional) TiXmlElement* mainWindow = hRoot.FirstChild("Gui").FirstChild("Windows").FirstChild("Main").ToElement(); if (mainWindow) @@ -614,8 +620,8 @@ bool XmlConfigOutput::writeXmlMainConfig(const MainConfiguration& mainCfg, const addXmlElement(filter, "Exclude", string((mainCfg.excludeFilter).ToUTF8())); //other - addXmlElement(miscSettings, "Recycler", mainCfg.useRecycleBin); - addXmlElement(miscSettings, "Continue", mainCfg.continueOnError); + addXmlElement(miscSettings, "UseRecycler", mainCfg.useRecycleBin); + addXmlElement(miscSettings, "IgnoreErrors", mainCfg.ignoreErrors); //########################################################### return true; @@ -679,6 +685,14 @@ bool XmlConfigOutput::writeXmlGlobalSettings(const XmlGlobalSettings& inputCfg) //program language addXmlElement(global, "Language", inputCfg.global.programLanguage); +#ifdef FFS_WIN + //daylight saving time check + addXmlElement(global, "DaylightSavingTimeCheckActive", inputCfg.global.dstCheckActive); +#endif + + //folder dependency check + addXmlElement(global, "FolderDependencyCheckActive", inputCfg.global.folderDependCheckActive); + //################################################################### //write gui settings TiXmlElement* guiLayout = new TiXmlElement("Gui"); diff --git a/library/processXml.h b/library/processXml.h index abf5bfc6..e359e7b0 100644 --- a/library/processXml.h +++ b/library/processXml.h @@ -5,6 +5,8 @@ #include "tinyxml/tinyxml.h" #include <wx/intl.h> +using namespace FreeFileSync; + namespace xmlAccess { @@ -45,8 +47,18 @@ namespace xmlAccess { struct _Global { - _Global() : programLanguage(wxLocale::GetSystemLanguage()) {} + _Global() : + programLanguage(wxLocale::GetSystemLanguage()), +#ifdef FFS_WIN + dstCheckActive(true), +#endif + folderDependCheckActive(true) {} + int programLanguage; +#ifdef FFS_WIN + bool dstCheckActive; +#endif + bool folderDependCheckActive; } global; struct _Gui diff --git a/library/resources.cpp b/library/resources.cpp index 2156fd50..68eeb4d6 100644 --- a/library/resources.cpp +++ b/library/resources.cpp @@ -6,16 +6,16 @@ #include "globalFunctions.h" #ifdef FFS_WIN -const wxChar GlobalResources::fileNameSeparator = '\\'; +const wxChar GlobalResources::FILE_NAME_SEPARATOR = '\\'; #elif defined FFS_LINUX -const wxChar GlobalResources::fileNameSeparator = '/'; +const wxChar GlobalResources::FILE_NAME_SEPARATOR = '/'; #else assert(false); #endif //these two global variables are language-dependent => cannot be set statically! See CustomLocale -const wxChar* GlobalResources::decimalPoint = wxEmptyString; -const wxChar* GlobalResources::thousandsSeparator = wxEmptyString; +const wxChar* GlobalResources::DECIMAL_POINT = wxEmptyString; +const wxChar* GlobalResources::THOUSANDS_SEPARATOR = wxEmptyString; GlobalResources globalResource; //init resources on program startup @@ -84,6 +84,13 @@ GlobalResources::GlobalResources() bitmapResource[wxT("remove pair disabl.png")] = (bitmapRemoveFolderPairD = new wxBitmap(wxNullBitmap)); bitmapResource[wxT("link.png")] = (bitmapLink = new wxBitmap(wxNullBitmap)); bitmapResource[wxT("background.png")] = (bitmapBackground = new wxBitmap(wxNullBitmap)); + bitmapResource[wxT("compare_small.png")] = (bitmapCompareSmall = new wxBitmap(wxNullBitmap)); + bitmapResource[wxT("sync_small.png")] = (bitmapSyncSmall = new wxBitmap(wxNullBitmap)); + bitmapResource[wxT("clock_small.png")] = (bitmapClockSmall = new wxBitmap(wxNullBitmap)); + bitmapResource[wxT("clock.png")] = (bitmapClock = new wxBitmap(wxNullBitmap)); + bitmapResource[wxT("filter.png")] = (bitmapFilter = new wxBitmap(wxNullBitmap)); + bitmapResource[wxT("batch.png")] = (bitmapBatch = new wxBitmap(wxNullBitmap)); + bitmapResource[wxT("batch_small.png")] = (bitmapBatchSmall = new wxBitmap(wxNullBitmap)); //init all the other resource files animationMoney = new wxAnimation(wxNullAnimation); diff --git a/library/resources.h b/library/resources.h index c91b5cb7..d08ce0ce 100644 --- a/library/resources.h +++ b/library/resources.h @@ -16,11 +16,11 @@ public: void load(); - static const wxChar fileNameSeparator; + static const wxChar FILE_NAME_SEPARATOR; //language dependent global variables: need to be initialized by CustomLocale on program startup and language switch - static const wxChar* decimalPoint; - static const wxChar* thousandsSeparator; + static const wxChar* DECIMAL_POINT; + static const wxChar* THOUSANDS_SEPARATOR; //image resource objects wxBitmap* bitmapArrowLeft; @@ -85,6 +85,13 @@ public: wxBitmap* bitmapRemoveFolderPairD; wxBitmap* bitmapLink; wxBitmap* bitmapBackground; + wxBitmap* bitmapCompareSmall; + wxBitmap* bitmapSyncSmall; + wxBitmap* bitmapClockSmall; + wxBitmap* bitmapClock; + wxBitmap* bitmapFilter; + wxBitmap* bitmapBatch; + wxBitmap* bitmapBatchSmall; wxAnimation* animationMoney; wxAnimation* animationSync; diff --git a/library/sorting.h b/library/sorting.h index 0faa1bfd..bf643176 100644 --- a/library/sorting.h +++ b/library/sorting.h @@ -104,8 +104,8 @@ template <bool sortAscending, SideToSort side> inline bool sortByFileName(const FileCompareLine& a, const FileCompareLine& b) { - const FileDescrLine* descrLineA; - const FileDescrLine* descrLineB; + const FileDescrLine* descrLineA = NULL; + const FileDescrLine* descrLineB = NULL; getDescrLine<side>(a, b, descrLineA, descrLineB); //presort types: first files, then directories then empty rows @@ -124,7 +124,7 @@ bool sortByFileName(const FileCompareLine& a, const FileCompareLine& b) int lenghtA = 0; int lenghtB = 0; - int pos = descrLineA->relativeName.Find(GlobalResources::fileNameSeparator, true); //start search beginning from end + int pos = descrLineA->relativeName.Find(GlobalResources::FILE_NAME_SEPARATOR, true); //start search beginning from end if (pos == wxNOT_FOUND) { stringA = descrLineA->relativeName.c_str(); @@ -136,7 +136,7 @@ bool sortByFileName(const FileCompareLine& a, const FileCompareLine& b) lenghtA = descrLineA->relativeName.Len() - (pos + 1); } - pos = descrLineB->relativeName.Find(GlobalResources::fileNameSeparator, true); //start search beginning from end + pos = descrLineB->relativeName.Find(GlobalResources::FILE_NAME_SEPARATOR, true); //start search beginning from end if (pos == wxNOT_FOUND) { stringB = descrLineB->relativeName.c_str(); @@ -149,7 +149,7 @@ bool sortByFileName(const FileCompareLine& a, const FileCompareLine& b) } int rv = compareString(stringA, stringB, lenghtA, lenghtB); - return sortAscending ? (rv == -1) : (rv != -1); + return sortAscending ? (rv == -1) : (rv == 1); } } @@ -158,8 +158,8 @@ template <bool sortAscending, SideToSort side> inline bool sortByRelativeName(const FileCompareLine& a, const FileCompareLine& b) { - const FileDescrLine* descrLineA; - const FileDescrLine* descrLineB; + const FileDescrLine* descrLineA = NULL; + const FileDescrLine* descrLineB = NULL; getDescrLine<side>(a, b, descrLineA, descrLineB); //extract relative name and filename @@ -174,7 +174,7 @@ bool sortByRelativeName(const FileCompareLine& a, const FileCompareLine& b) } else if (descrLineA->objType == FileDescrLine::TYPE_FILE) { - relLenghtA = descrLineA->relativeName.Find(GlobalResources::fileNameSeparator, true); //start search beginning from end + relLenghtA = descrLineA->relativeName.Find(GlobalResources::FILE_NAME_SEPARATOR, true); //start search beginning from end if (relLenghtA == wxNOT_FOUND) { relLenghtA = 0; @@ -203,7 +203,7 @@ bool sortByRelativeName(const FileCompareLine& a, const FileCompareLine& b) } else if (descrLineB->objType == FileDescrLine::TYPE_FILE) { - relLenghtB = descrLineB->relativeName.Find(GlobalResources::fileNameSeparator, true); //start search beginning from end + relLenghtB = descrLineB->relativeName.Find(GlobalResources::FILE_NAME_SEPARATOR, true); //start search beginning from end if (relLenghtB == wxNOT_FOUND) { relLenghtB = 0; @@ -223,7 +223,7 @@ bool sortByRelativeName(const FileCompareLine& a, const FileCompareLine& b) //compare relative names without filenames first int rv = compareString(relStringA, relStringB, relLenghtA, relLenghtB); if (rv != 0) - return sortAscending ? (rv == -1) : (rv != -1); + return sortAscending ? (rv == -1) : (rv == 1); else //compare the filenames { if (descrLineB->objType == FileDescrLine::TYPE_DIRECTORY) //directories shall appear before files @@ -232,7 +232,7 @@ bool sortByRelativeName(const FileCompareLine& a, const FileCompareLine& b) return true; rv = compareString(fileStringA, fileStringB, fileLengthA, fileLengthB); - return sortAscending ? (rv == -1) : (rv != -1); + return sortAscending ? (rv == -1) : (rv == 1); } } @@ -241,8 +241,8 @@ template <bool sortAscending, SideToSort side> inline bool sortByFileSize(const FileCompareLine& a, const FileCompareLine& b) { - const FileDescrLine* descrLineA; - const FileDescrLine* descrLineB; + const FileDescrLine* descrLineA = NULL; + const FileDescrLine* descrLineB = NULL; getDescrLine<side>(a, b, descrLineA, descrLineB); //presort types: first files, then directories then empty rows @@ -263,8 +263,8 @@ template <bool sortAscending, SideToSort side> inline bool sortByDate(const FileCompareLine& a, const FileCompareLine& b) { - const FileDescrLine* descrLineA; - const FileDescrLine* descrLineB; + const FileDescrLine* descrLineA = NULL; + const FileDescrLine* descrLineB = NULL; getDescrLine<side>(a, b, descrLineA, descrLineB); return cmpString<sortAscending>(descrLineA->lastWriteTime, descrLineB->lastWriteTime); diff --git a/library/statusHandler.h b/library/statusHandler.h index ad4cb3a0..70f8c2d8 100644 --- a/library/statusHandler.h +++ b/library/statusHandler.h @@ -21,8 +21,8 @@ public: enum Response { - CONTINUE_NEXT = -1, - RETRY = -2 + CONTINUE_NEXT = 10, + RETRY }; virtual Response reportError(const wxString& text) = 0; }; @@ -32,7 +32,7 @@ class StatusHandler { public: StatusHandler() : - abortionRequested(false) {} + abortRequested(false) {} virtual ~StatusHandler() {} //identifiers of different processes @@ -47,7 +47,7 @@ public: //these methods have to be implemented in the derived classes to handle error and status information virtual void updateStatusText(const wxString& text) = 0; virtual void initNewProcess(int objectsTotal, double dataTotal, Process processID) = 0; //informs about the total amount of data that will be processed from now on - virtual void updateProcessedData(int objectsProcessed, double dataProcessed) = 0; //called periodically after data was processed + virtual void updateProcessedData(int objectsProcessed, double dataProcessed) = 0; //called periodically after data was processed virtual ErrorHandler::Response reportError(const wxString& text) = 0; //this method is triggered repeatedly by requestUiRefresh() and can be used to refresh the ui by dispatching pending events @@ -57,19 +57,19 @@ public: if (updateUiIsAllowed()) //test if specific time span between ui updates is over forceUiRefresh(); - if (abortionRequested && !asyncProcessActive) + if (abortRequested && !asyncProcessActive) abortThisProcess(); //abort can be triggered by requestAbortion() } void requestAbortion() //opportunity to abort must be implemented in a frequently executed method like requestUiRefresh() { //currently used by the UI status information screen, when button "Abort is pressed" - abortionRequested = true; + abortRequested = true; } protected: virtual void abortThisProcess() = 0; - bool abortionRequested; + bool abortRequested; }; diff --git a/synchronization.cpp b/synchronization.cpp new file mode 100644 index 00000000..9d9fd4d2 --- /dev/null +++ b/synchronization.cpp @@ -0,0 +1,563 @@ +#include "synchronization.h" +#include <wx/intl.h> +#include <wx/msgdlg.h> +#include <wx/log.h> +#include "library/multithreading.h" + +#ifdef FFS_LINUX +#include <utime.h> +#endif // FFS_LINUX + +using namespace FreeFileSync; + + +SyncProcess::SyncProcess(bool useRecycler, bool lineBreakOnMessages, StatusHandler* handler) : + useRecycleBin(useRecycler), + statusUpdater(handler) +{ + if (lineBreakOnMessages) + optionalLineBreak = wxT("\n"); +} + + +inline +SyncConfiguration::Direction getSyncDirection(const CompareFilesResult cmpResult, const SyncConfiguration& config) +{ + switch (cmpResult) + { + case FILE_LEFT_SIDE_ONLY: + return config.exLeftSideOnly; + break; + + case FILE_RIGHT_SIDE_ONLY: + return config.exRightSideOnly; + break; + + case FILE_RIGHT_NEWER: + return config.rightNewer; + break; + + case FILE_LEFT_NEWER: + return config.leftNewer; + break; + + case FILE_DIFFERENT: + return config.different; + break; + + default: + assert (false); + } + return SyncConfiguration::SYNC_DIR_NONE; +} + + +bool getBytesToTransfer(int& objectsToCreate, + int& objectsToOverwrite, + int& objectsToDelete, + double& dataToProcess, + const FileCompareLine& fileCmpLine, + const SyncConfiguration& config) +{ //false if nothing has to be done + + objectsToCreate = 0; //always initialize variables + objectsToOverwrite = 0; + objectsToDelete = 0; + dataToProcess = 0; + + //do not add filtered entries + if (!fileCmpLine.selectedForSynchronization) + return false; + + + switch (fileCmpLine.cmpResult) + { + case FILE_LEFT_SIDE_ONLY: + //get data to process + switch (getSyncDirection(fileCmpLine.cmpResult, config)) + { + case SyncConfiguration::SYNC_DIR_LEFT: //delete file on left + dataToProcess = 0; + objectsToDelete = 1; + break; + case SyncConfiguration::SYNC_DIR_RIGHT: //copy from left to right + dataToProcess = fileCmpLine.fileDescrLeft.fileSize.ToDouble(); + objectsToCreate = 1; + break; + case SyncConfiguration::SYNC_DIR_NONE: + return false; + } + break; + + case FILE_RIGHT_SIDE_ONLY: + switch (getSyncDirection(fileCmpLine.cmpResult, config)) + { + case SyncConfiguration::SYNC_DIR_LEFT: //copy from right to left + dataToProcess = fileCmpLine.fileDescrRight.fileSize.ToDouble();; + objectsToCreate = 1; + break; + case SyncConfiguration::SYNC_DIR_RIGHT: //delete file on right + dataToProcess = 0; + objectsToDelete = 1; + break; + case SyncConfiguration::SYNC_DIR_NONE: + return false; + } + break; + + case FILE_LEFT_NEWER: + case FILE_RIGHT_NEWER: + case FILE_DIFFERENT: + //get data to process + switch (getSyncDirection(fileCmpLine.cmpResult, config)) + { + case SyncConfiguration::SYNC_DIR_LEFT: //copy from right to left + dataToProcess = fileCmpLine.fileDescrRight.fileSize.ToDouble(); + objectsToOverwrite = 1; + break; + case SyncConfiguration::SYNC_DIR_RIGHT: //copy from left to right + dataToProcess = fileCmpLine.fileDescrLeft.fileSize.ToDouble(); + objectsToOverwrite = 1; + break; + case SyncConfiguration::SYNC_DIR_NONE: + return false; + } + break; + + case FILE_EQUAL: + return false; + default: + assert(false); + return false; + }; + + return true; +} + +void copyfileMultithreaded(const wxString& source, const wxString& target, StatusHandler* updateClass); + + +bool SyncProcess::synchronizeFile(const FileCompareLine& cmpLine, const SyncConfiguration& config) +{ //false if nothing was to be done + assert (statusUpdater); + + if (!cmpLine.selectedForSynchronization) return false; + + wxString target; + + //synchronize file: + switch (cmpLine.cmpResult) + { + case FILE_LEFT_SIDE_ONLY: + switch (config.exLeftSideOnly) + { + case SyncConfiguration::SYNC_DIR_LEFT: //delete files on left + statusUpdater->updateStatusText(wxString(_("Deleting file ")) + optionalLineBreak + wxT("\"") + cmpLine.fileDescrLeft.fullName + wxT("\"")); + removeFile(cmpLine.fileDescrLeft.fullName, useRecycleBin); + break; + case SyncConfiguration::SYNC_DIR_RIGHT: //copy files to right + target = cmpLine.fileDescrRight.directory + cmpLine.fileDescrLeft.relativeName; + statusUpdater->updateStatusText(wxString(_("Copying file ")) + optionalLineBreak + wxT("\"") + cmpLine.fileDescrLeft.fullName + wxT("\"") + + _(" to ") + optionalLineBreak + wxT("\"") + target + wxT("\"")); + + copyfileMultithreaded(cmpLine.fileDescrLeft.fullName, target, statusUpdater); + break; + case SyncConfiguration::SYNC_DIR_NONE: + return false; + default: + assert (false); + } + break; + + case FILE_RIGHT_SIDE_ONLY: + switch (config.exRightSideOnly) + { + case SyncConfiguration::SYNC_DIR_LEFT: //copy files to left + target = cmpLine.fileDescrLeft.directory + cmpLine.fileDescrRight.relativeName; + statusUpdater->updateStatusText(wxString(_("Copying file ")) + optionalLineBreak + wxT("\"") + cmpLine.fileDescrRight.fullName + wxT("\"") + + _(" to ") + optionalLineBreak + wxT("\"") + target + wxT("\"")); + + copyfileMultithreaded(cmpLine.fileDescrRight.fullName, target, statusUpdater); + break; + case SyncConfiguration::SYNC_DIR_RIGHT: //delete files on right + statusUpdater->updateStatusText(wxString(_("Deleting file ")) + optionalLineBreak + wxT("\"") + cmpLine.fileDescrRight.fullName + wxT("\"")); + removeFile(cmpLine.fileDescrRight.fullName, useRecycleBin); + break; + case SyncConfiguration::SYNC_DIR_NONE: + return false; + default: + assert (false); + } + break; + + case FILE_LEFT_NEWER: + case FILE_RIGHT_NEWER: + case FILE_DIFFERENT: + switch (getSyncDirection(cmpLine.cmpResult, config)) + { + case SyncConfiguration::SYNC_DIR_LEFT: //copy from right to left + statusUpdater->updateStatusText(wxString(_("Copying file ")) + optionalLineBreak + wxT("\"") + cmpLine.fileDescrRight.fullName + wxT("\"") + + _(" overwriting ") + optionalLineBreak + wxT("\"") + cmpLine.fileDescrLeft.fullName + wxT("\"")); + + removeFile(cmpLine.fileDescrLeft.fullName, useRecycleBin); //only used if switch activated by user, else file is simply deleted + copyfileMultithreaded(cmpLine.fileDescrRight.fullName, cmpLine.fileDescrLeft.fullName, statusUpdater); + break; + case SyncConfiguration::SYNC_DIR_RIGHT: //copy from left to right + statusUpdater->updateStatusText(wxString(_("Copying file ")) + optionalLineBreak + wxT("\"") + cmpLine.fileDescrLeft.fullName + wxT("\"") + + _(" overwriting ") + optionalLineBreak + wxT("\"") + cmpLine.fileDescrRight.fullName + wxT("\"")); + + removeFile(cmpLine.fileDescrRight.fullName, useRecycleBin); //only used if switch activated by user, else file is simply deleted + copyfileMultithreaded(cmpLine.fileDescrLeft.fullName, cmpLine.fileDescrRight.fullName, statusUpdater); + break; + case SyncConfiguration::SYNC_DIR_NONE: + return false; + default: + assert (false); + } + break; + + case FILE_EQUAL: + return false; + + default: + assert (false); + } + return true; +} + + +bool SyncProcess::synchronizeFolder(const FileCompareLine& cmpLine, const SyncConfiguration& config) +{ //false if nothing was to be done + assert (statusUpdater); + + if (!cmpLine.selectedForSynchronization) return false; + + wxString target; + + //synchronize folders: + switch (cmpLine.cmpResult) + { + case FILE_LEFT_SIDE_ONLY: + switch (config.exLeftSideOnly) + { + case SyncConfiguration::SYNC_DIR_LEFT: //delete folders on left + statusUpdater->updateStatusText(wxString(_("Deleting folder ")) + optionalLineBreak + wxT("\"") + cmpLine.fileDescrLeft.fullName + wxT("\"")); + removeDirectory(cmpLine.fileDescrLeft.fullName, useRecycleBin); + break; + case SyncConfiguration::SYNC_DIR_RIGHT: //create folders on right + target = cmpLine.fileDescrRight.directory + cmpLine.fileDescrLeft.relativeName; + statusUpdater->updateStatusText(wxString(_("Creating folder ")) + optionalLineBreak + wxT("\"") + target + wxT("\"")); + + //some check to catch the error that directory on source has been deleted externally after the "compare"... + if (!wxDirExists(cmpLine.fileDescrLeft.fullName)) + throw FileError(wxString(_("Error: Source directory does not exist anymore: ")) + wxT("\"") + cmpLine.fileDescrLeft.fullName + wxT("\"")); + createDirectory(target); + break; + case SyncConfiguration::SYNC_DIR_NONE: + return false; + default: + assert (false); + } + break; + + case FILE_RIGHT_SIDE_ONLY: + switch (config.exRightSideOnly) + { + case SyncConfiguration::SYNC_DIR_LEFT: //create folders on left + target = cmpLine.fileDescrLeft.directory + cmpLine.fileDescrRight.relativeName; + statusUpdater->updateStatusText(wxString(_("Creating folder ")) + optionalLineBreak + wxT("\"") + target + wxT("\"")); + + //some check to catch the error that directory on source has been deleted externally after the "compare"... + if (!wxDirExists(cmpLine.fileDescrRight.fullName)) + throw FileError(wxString(_("Error: Source directory does not exist anymore: ")) + wxT("\"") + cmpLine.fileDescrRight.fullName + wxT("\"")); + createDirectory(target); + break; + case SyncConfiguration::SYNC_DIR_RIGHT: //delete folders on right + statusUpdater->updateStatusText(wxString(_("Deleting folder ")) + optionalLineBreak + wxT("\"") + cmpLine.fileDescrRight.fullName + wxT("\"")); + removeDirectory(cmpLine.fileDescrRight.fullName, useRecycleBin); + break; + case SyncConfiguration::SYNC_DIR_NONE: + return false; + default: + assert (false); + } + break; + + case FILE_EQUAL: + return false; + case FILE_RIGHT_NEWER: + case FILE_LEFT_NEWER: + case FILE_DIFFERENT: + default: + assert (false); + } + return true; +} + + +inline +bool deletionImminent(const FileCompareLine& line, const SyncConfiguration& config) +{ //test if current sync-line will result in deletion of files -> used to avoid disc space bottlenecks + if ( (line.cmpResult == FILE_LEFT_SIDE_ONLY && config.exLeftSideOnly == SyncConfiguration::SYNC_DIR_LEFT) || + (line.cmpResult == FILE_RIGHT_SIDE_ONLY && config.exRightSideOnly == SyncConfiguration::SYNC_DIR_RIGHT)) + return true; + else + return false; +} + + +class AlwaysWriteToGrid //this class ensures, that the result of the method below is ALWAYS written on exit, even if exceptions are thrown! +{ +public: + AlwaysWriteToGrid(FileCompareResult& grid) : + gridToWrite(grid) + {} + + ~AlwaysWriteToGrid() + { + removeRowsFromVector(gridToWrite, rowsProcessed); + } + + void rowProcessedSuccessfully(int nr) + { + rowsProcessed.insert(nr); + } + +private: + FileCompareResult& gridToWrite; + set<int> rowsProcessed; +}; + + +//synchronizes while processing rows in grid and returns all rows that have not been synced +void SyncProcess::startSynchronizationProcess(FileCompareResult& grid, const SyncConfiguration& config) throw(AbortThisProcess) +{ + assert (statusUpdater); + +#ifndef __WXDEBUG__ + wxLogNull noWxLogs; //prevent wxWidgets logging +#endif + + AlwaysWriteToGrid writeOutput(grid); //ensure that grid is always written to, even if method is exitted via exceptions + + //inform about the total amount of data that will be processed from now on + int objectsToCreate = 0; + int objectsToOverwrite = 0; + int objectsToDelete = 0; + double dataToProcess = 0; + calcTotalBytesToSync(objectsToCreate, + objectsToOverwrite, + objectsToDelete, + dataToProcess, + grid, + config); + + statusUpdater->initNewProcess(objectsToCreate + objectsToOverwrite + objectsToDelete, dataToProcess, StatusHandler::PROCESS_SYNCHRONIZING); + + try + { + // it should never happen, that a directory on left side has same name as file on right side. startCompareProcess() should take care of this + // and split into two "exists on one side only" cases + // Note: this case is not handled by this tool as this is considered to be a bug and must be solved by the user + + //synchronize folders: + for (FileCompareResult::const_iterator i = grid.begin(); i != grid.end(); ++i) + { + if ( i->fileDescrLeft.objType == FileDescrLine::TYPE_DIRECTORY || + i->fileDescrRight.objType == FileDescrLine::TYPE_DIRECTORY) + { + + while (true) + { //trigger display refresh + statusUpdater->requestUiRefresh(); + + try + { + if (synchronizeFolder(*i, config)) + //progress indicator update + //indicator is updated only if directory is synched correctly (and if some sync was done)! + statusUpdater->updateProcessedData(1, 0); //each call represents one processed file/directory + + writeOutput.rowProcessedSuccessfully(i - grid.begin()); + break; + } + catch (FileError& error) + { + //if (updateClass) -> is mandatory + ErrorHandler::Response rv = statusUpdater->reportError(error.show()); + + if ( rv == ErrorHandler::CONTINUE_NEXT) + break; + else if (rv == ErrorHandler::RETRY) + ; //continue with loop + else + assert (false); + } + } + } + } + + //synchronize files: + bool deleteLoop = true; + for (int k = 0; k < 2; ++k) //loop over all files twice; reason: first delete, then copy (no sorting necessary: performance) + { + deleteLoop = !k; //-> first loop: delete files, second loop: copy files + + for (FileCompareResult::const_iterator i = grid.begin(); i != grid.end(); ++i) + { + if ( i->fileDescrLeft.objType == FileDescrLine::TYPE_FILE || + i->fileDescrRight.objType == FileDescrLine::TYPE_FILE) + { + if ( deleteLoop && deletionImminent(*i, config) || + !deleteLoop && !deletionImminent(*i, config)) + { + while (true) + { //trigger display refresh + statusUpdater->requestUiRefresh(); + + try + { + if (synchronizeFile(*i, config)) + { + //progress indicator update + //indicator is updated only if file is sync'ed correctly (and if some sync was done)! + int objectsToCreate = 0; + int objectsToOverwrite = 0; + int objectsToDelete = 0; + double dataToProcess = 0; + + if (getBytesToTransfer(objectsToCreate, + objectsToOverwrite, + objectsToDelete, + dataToProcess, + *i, + config)) //update status if some work was done (answer is always "yes" in this context) + statusUpdater->updateProcessedData(objectsToCreate + objectsToOverwrite + objectsToDelete, dataToProcess); + } + + writeOutput.rowProcessedSuccessfully(i - grid.begin()); + break; + } + catch (FileError& error) + { + //if (updateClass) -> is mandatory + ErrorHandler::Response rv = statusUpdater->reportError(error.show()); + + if ( rv == ErrorHandler::CONTINUE_NEXT) + break; + else if (rv == ErrorHandler::RETRY) + ; //continue with loop + else + assert (false); + } + } + } + } + } + } + } + catch (const RuntimeException& theException) + { + wxMessageBox(theException.show(), _("An exception occured!"), wxOK | wxICON_ERROR); + return; + } +} + + +//########################################################################################### + + +//handle execution of a method while updating the UI +class UpdateWhileCopying : public UpdateWhileExecuting +{ +public: + UpdateWhileCopying() {} + ~UpdateWhileCopying() {} + + wxString source; + wxString target; + bool success; + wxString errorMessage; + +private: + void longRunner() //virtual method implementation + { + if (!wxCopyFile(source, target, false)) //abort if file exists + { + success = false; + errorMessage = wxString(_("Error copying file ")) + wxT("\"") + source + wxT("\"") + _(" to ") + wxT("\"") + target + wxT("\""); + return; + } + +#ifdef FFS_LINUX //copying files with Linux does not preserve the modification time => adapt after copying + struct stat fileInfo; + if (stat(source.c_str(), &fileInfo) != 0) //read modification time from source file + { + success = false; + errorMessage = wxString(_("Could not retrieve file info for: ")) + wxT("\"") + source + wxT("\""); + return; + } + + utimbuf newTimes; + newTimes.actime = fileInfo.st_mtime; + newTimes.modtime = fileInfo.st_mtime; + + if (utime(target.c_str(), &newTimes) != 0) + { + success = false; + errorMessage = wxString(_("Error adapting modification time of file ")) + wxT("\"") + target + wxT("\""); + return; + } +#endif // FFS_LINUX + + success = true; + } +}; + + +void copyfileMultithreaded(const wxString& source, const wxString& target, StatusHandler* updateClass) +{ + static UpdateWhileCopying copyAndUpdate; //single instantiation: after each execution thread enters wait phase + + copyAndUpdate.waitUntilReady(); + + //longRunner is called from thread, but no mutex needed here, since thread is in waiting state! + copyAndUpdate.source = source; + copyAndUpdate.target = target; + + copyAndUpdate.execute(updateClass); + + //no mutex needed here since longRunner is finished + if (!copyAndUpdate.success) + throw FileError(copyAndUpdate.errorMessage); +} + + +void FreeFileSync::calcTotalBytesToSync(int& objectsToCreate, + int& objectsToOverwrite, + int& objectsToDelete, + double& dataToProcess, + const FileCompareResult& fileCmpResult, + const SyncConfiguration& config) +{ + objectsToCreate = 0; + objectsToOverwrite = 0; + objectsToDelete = 0; + dataToProcess = 0; + + int toCreate = 0; + int toOverwrite = 0; + int toDelete = 0; + double data = 0; + + for (FileCompareResult::const_iterator i = fileCmpResult.begin(); i != fileCmpResult.end(); ++i) + { //only sum up sizes of files AND directories + if (getBytesToTransfer(toCreate, toOverwrite, toDelete, data, *i, config)) + { + objectsToCreate+= toCreate; + objectsToOverwrite+= toOverwrite; + objectsToDelete+= toDelete; + dataToProcess+= data; + } + } +} diff --git a/synchronization.h b/synchronization.h new file mode 100644 index 00000000..7bd3d216 --- /dev/null +++ b/synchronization.h @@ -0,0 +1,34 @@ +#ifndef SYNCHRONIZATION_H_INCLUDED +#define SYNCHRONIZATION_H_INCLUDED + +#include "FreeFileSync.h" + + +namespace FreeFileSync +{ + void calcTotalBytesToSync(int& objectsToCreate, + int& objectsToOverwrite, + int& objectsToDelete, + double& dataToProcess, + const FileCompareResult& fileCmpResult, + const SyncConfiguration& config); + + //class handling synchronization process + class SyncProcess + { + public: + SyncProcess(bool useRecycler, bool lineBreakOnMessages, StatusHandler* handler); + + void startSynchronizationProcess(FileCompareResult& grid, const SyncConfiguration& config) throw(AbortThisProcess); + + private: + bool synchronizeFile(const FileCompareLine& cmpLine, const SyncConfiguration& config); //false if nothing had to be done + bool synchronizeFolder(const FileCompareLine& cmpLine, const SyncConfiguration& config); //false if nothing had to be done + + const bool useRecycleBin; + StatusHandler* statusUpdater; + wxString optionalLineBreak; //optional line break for status messages (used by GUI mode only) + }; +} + +#endif // SYNCHRONIZATION_H_INCLUDED diff --git a/ui/MainDialog.cpp b/ui/MainDialog.cpp index 3f845364..818eff1c 100644 --- a/ui/MainDialog.cpp +++ b/ui/MainDialog.cpp @@ -17,6 +17,9 @@ #include <algorithm> #include "../library/sorting.h" #include <wx/msgdlg.h> +#include "../comparison.h" +#include "../synchronization.h" +#include "../algorithm.h" using namespace globalFunctions; using namespace xmlAccess; @@ -32,7 +35,7 @@ MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale filteringPending(false), synchronizationEnabled(false), restartOnExit(false), - cmpStatusUpdaterTmp(0) + cmpStatusHandlerTmp(0) { m_bpButtonCompare->SetLabel(_("&Compare")); m_bpButtonSync->SetLabel(_("&Synchronize")); @@ -73,51 +76,74 @@ MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale m_bpButtonRemovePair->SetBitmapDisabled(*globalResource.bitmapRemoveFolderPairD); m_bitmap15->SetBitmap(*globalResource.bitmapStatusEdge); + //menu icons + m_menuItem10->SetBitmap(*globalResource.bitmapCompareSmall); + m_menuItem11->SetBitmap(*globalResource.bitmapSyncSmall); + m_menuItem7->SetBitmap(*globalResource.bitmapBatchSmall); + m_menuItemAdjustTimes->SetBitmap(*globalResource.bitmapClockSmall); + + //small hack to update menu items: actually this is a wxWidgets bug (affects Windows- and Linux-build) + m_menu1->Remove(m_menuItem10); + m_menu1->Remove(m_menuItem11); + m_menu1->Insert(0, m_menuItem10); + m_menu1->Insert(1, m_menuItem11); + m_menu3->Remove(m_menuItem7); + m_menu3->Remove(m_menuItemAdjustTimes); + m_menu3->Insert(2, m_menuItem7); + m_menu3->Insert(3, m_menuItemAdjustTimes); + +#ifdef FFS_LINUX //file time adjustment not needed for Linux build + m_menu3->Remove(m_menuItemAdjustTimes); +#endif + //prepare drag & drop m_panel1->SetDropTarget(new FileDropEvent(this, m_panel1)); m_panel2->SetDropTarget(new FileDropEvent(this, m_panel2)); + m_panel11->SetDropTarget(new FileDropEvent(this, m_panel1)); + m_panel12->SetDropTarget(new FileDropEvent(this, m_panel2)); + //initialize right-click context menu; will be dynamically re-created on each R-mouse-click contextMenu = new wxMenu; //support for CTRL + C and DEL - m_grid1->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MainDialog::onGrid1ButtonEvent), NULL, this); - m_grid2->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MainDialog::onGrid2ButtonEvent), NULL, this); - m_grid3->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MainDialog::onGrid3ButtonEvent), NULL, this); + m_gridLeft->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MainDialog::onGrid1ButtonEvent), NULL, this); + m_gridRight->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MainDialog::onGrid2ButtonEvent), NULL, this); + m_gridMiddle->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MainDialog::onGrid3ButtonEvent), NULL, this); //identify leading grid by keyboard input or scroll action - m_grid1->Connect(wxEVT_KEY_DOWN, wxEventHandler(MainDialog::onGrid1access), NULL, this); - m_grid1->Connect(wxEVT_SCROLLWIN_TOP, wxEventHandler(MainDialog::onGrid1access), NULL, this); - m_grid1->Connect(wxEVT_SCROLLWIN_BOTTOM, wxEventHandler(MainDialog::onGrid1access), NULL, this); - m_grid1->Connect(wxEVT_SCROLLWIN_LINEUP, wxEventHandler(MainDialog::onGrid1access), NULL, this); - m_grid1->Connect(wxEVT_SCROLLWIN_LINEDOWN, wxEventHandler(MainDialog::onGrid1access), NULL, this); - m_grid1->Connect(wxEVT_SCROLLWIN_PAGEUP, wxEventHandler(MainDialog::onGrid1access), NULL, this); - m_grid1->Connect(wxEVT_SCROLLWIN_PAGEDOWN, wxEventHandler(MainDialog::onGrid1access), NULL, this); - m_grid1->Connect(wxEVT_SCROLLWIN_THUMBTRACK, wxEventHandler(MainDialog::onGrid1access), NULL, this); - m_grid1->Connect(wxEVT_SCROLLWIN_THUMBRELEASE, wxEventHandler(MainDialog::onGrid1access), NULL, this); - m_grid1->Connect(wxEVT_GRID_LABEL_LEFT_CLICK, wxEventHandler(MainDialog::onGrid1access), NULL, this); - m_grid1->GetGridWindow()->Connect(wxEVT_LEFT_DOWN, wxEventHandler(MainDialog::onGrid1access), NULL, this); - - m_grid2->Connect(wxEVT_KEY_DOWN, wxEventHandler(MainDialog::onGrid2access), NULL, this); - m_grid2->Connect(wxEVT_SCROLLWIN_TOP, wxEventHandler(MainDialog::onGrid2access), NULL, this); - m_grid2->Connect(wxEVT_SCROLLWIN_BOTTOM, wxEventHandler(MainDialog::onGrid2access), NULL, this); - m_grid2->Connect(wxEVT_SCROLLWIN_LINEUP, wxEventHandler(MainDialog::onGrid2access), NULL, this); - m_grid2->Connect(wxEVT_SCROLLWIN_LINEDOWN, wxEventHandler(MainDialog::onGrid2access), NULL, this); - m_grid2->Connect(wxEVT_SCROLLWIN_PAGEUP, wxEventHandler(MainDialog::onGrid2access), NULL, this); - m_grid2->Connect(wxEVT_SCROLLWIN_PAGEDOWN, wxEventHandler(MainDialog::onGrid2access), NULL, this); - m_grid2->Connect(wxEVT_SCROLLWIN_THUMBTRACK, wxEventHandler(MainDialog::onGrid2access), NULL, this); - m_grid2->Connect(wxEVT_SCROLLWIN_THUMBRELEASE, wxEventHandler(MainDialog::onGrid2access), NULL, this); - m_grid2->Connect(wxEVT_GRID_LABEL_LEFT_CLICK, wxEventHandler(MainDialog::onGrid2access), NULL, this); - m_grid2->GetGridWindow()->Connect(wxEVT_LEFT_DOWN, wxEventHandler(MainDialog::onGrid2access), NULL, this); - - m_grid3->Connect(wxEVT_KEY_DOWN, wxEventHandler(MainDialog::onGrid3access), NULL, this); - m_grid3->Connect(wxEVT_SCROLLWIN_LINEUP, wxEventHandler(MainDialog::onGrid3access), NULL, this); - m_grid3->Connect(wxEVT_SCROLLWIN_LINEDOWN, wxEventHandler(MainDialog::onGrid3access), NULL, this); - m_grid3->GetGridWindow()->Connect(wxEVT_LEFT_DOWN, wxEventHandler(MainDialog::onGrid3access), NULL, this); + m_gridLeft->Connect(wxEVT_KEY_DOWN, wxEventHandler(MainDialog::onGrid1access), NULL, this); + m_gridLeft->Connect(wxEVT_SCROLLWIN_TOP, wxEventHandler(MainDialog::onGrid1access), NULL, this); + m_gridLeft->Connect(wxEVT_SCROLLWIN_BOTTOM, wxEventHandler(MainDialog::onGrid1access), NULL, this); + m_gridLeft->Connect(wxEVT_SCROLLWIN_LINEUP, wxEventHandler(MainDialog::onGrid1access), NULL, this); + m_gridLeft->Connect(wxEVT_SCROLLWIN_LINEDOWN, wxEventHandler(MainDialog::onGrid1access), NULL, this); + m_gridLeft->Connect(wxEVT_SCROLLWIN_PAGEUP, wxEventHandler(MainDialog::onGrid1access), NULL, this); + m_gridLeft->Connect(wxEVT_SCROLLWIN_PAGEDOWN, wxEventHandler(MainDialog::onGrid1access), NULL, this); + m_gridLeft->Connect(wxEVT_SCROLLWIN_THUMBTRACK, wxEventHandler(MainDialog::onGrid1access), NULL, this); + m_gridLeft->Connect(wxEVT_SCROLLWIN_THUMBRELEASE, wxEventHandler(MainDialog::onGrid1access), NULL, this); + m_gridLeft->Connect(wxEVT_GRID_LABEL_LEFT_CLICK, wxEventHandler(MainDialog::onGrid1access), NULL, this); + m_gridLeft->GetGridWindow()->Connect(wxEVT_LEFT_DOWN, wxEventHandler(MainDialog::onGrid1access), NULL, this); + + m_gridRight->Connect(wxEVT_KEY_DOWN, wxEventHandler(MainDialog::onGrid2access), NULL, this); + m_gridRight->Connect(wxEVT_SCROLLWIN_TOP, wxEventHandler(MainDialog::onGrid2access), NULL, this); + m_gridRight->Connect(wxEVT_SCROLLWIN_BOTTOM, wxEventHandler(MainDialog::onGrid2access), NULL, this); + m_gridRight->Connect(wxEVT_SCROLLWIN_LINEUP, wxEventHandler(MainDialog::onGrid2access), NULL, this); + m_gridRight->Connect(wxEVT_SCROLLWIN_LINEDOWN, wxEventHandler(MainDialog::onGrid2access), NULL, this); + m_gridRight->Connect(wxEVT_SCROLLWIN_PAGEUP, wxEventHandler(MainDialog::onGrid2access), NULL, this); + m_gridRight->Connect(wxEVT_SCROLLWIN_PAGEDOWN, wxEventHandler(MainDialog::onGrid2access), NULL, this); + m_gridRight->Connect(wxEVT_SCROLLWIN_THUMBTRACK, wxEventHandler(MainDialog::onGrid2access), NULL, this); + m_gridRight->Connect(wxEVT_SCROLLWIN_THUMBRELEASE, wxEventHandler(MainDialog::onGrid2access), NULL, this); + m_gridRight->Connect(wxEVT_GRID_LABEL_LEFT_CLICK, wxEventHandler(MainDialog::onGrid2access), NULL, this); + m_gridRight->GetGridWindow()->Connect(wxEVT_LEFT_DOWN, wxEventHandler(MainDialog::onGrid2access), NULL, this); + + m_gridMiddle->Connect(wxEVT_KEY_DOWN, wxEventHandler(MainDialog::onGrid3access), NULL, this); + m_gridMiddle->Connect(wxEVT_SCROLLWIN_LINEUP, wxEventHandler(MainDialog::onGrid3access), NULL, this); + m_gridMiddle->Connect(wxEVT_SCROLLWIN_LINEDOWN, wxEventHandler(MainDialog::onGrid3access), NULL, this); + m_gridMiddle->GetGridWindow()->Connect(wxEVT_LEFT_DOWN, wxEventHandler(MainDialog::onGrid3access), NULL, this); Connect(wxEVT_IDLE, wxEventHandler(MainDialog::OnIdleEvent), NULL, this); - m_grid3->GetGridWindow()->Connect(wxEVT_LEFT_UP, wxEventHandler(MainDialog::OnGrid3LeftMouseUp), NULL, this); - m_grid3->GetGridWindow()->Connect(wxEVT_LEFT_DOWN, wxEventHandler(MainDialog::OnGrid3LeftMouseDown), NULL, this); + m_gridMiddle->GetGridWindow()->Connect(wxEVT_LEFT_UP, wxEventHandler(MainDialog::OnGrid3LeftMouseUp), NULL, this); + m_gridMiddle->GetGridWindow()->Connect(wxEVT_LEFT_DOWN, wxEventHandler(MainDialog::OnGrid3LeftMouseDown), NULL, this); Connect(wxEVT_SIZE, wxEventHandler(MainDialog::onResizeMainWindow), NULL, this); Connect(wxEVT_MOVE, wxEventHandler(MainDialog::onResizeMainWindow), NULL, this); @@ -131,49 +157,49 @@ MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale _("!= files are different\n") + _("== files are equal\n\n") + _("(-) filtered out from sync-process\n"); - m_grid3->GetGridWindow()->SetToolTip(toolTip); + m_gridMiddle->GetGridWindow()->SetToolTip(toolTip); //enable parallel scrolling - m_grid1->setScrollFriends(m_grid1, m_grid2, m_grid3); - m_grid2->setScrollFriends(m_grid1, m_grid2, m_grid3); - m_grid3->setScrollFriends(m_grid1, m_grid2, m_grid3); + m_gridLeft->setScrollFriends(m_gridLeft, m_gridRight, m_gridMiddle); + m_gridRight->setScrollFriends(m_gridLeft, m_gridRight, m_gridMiddle); + m_gridMiddle->setScrollFriends(m_gridLeft, m_gridRight, m_gridMiddle); //share UI grid data with grids - m_grid1->setGridDataTable(&gridRefUI, ¤tGridData); - m_grid2->setGridDataTable(&gridRefUI, ¤tGridData); - m_grid3->setGridDataTable(&gridRefUI, ¤tGridData); + m_gridLeft->setGridDataTable(&gridRefUI, ¤tGridData); + m_gridRight->setGridDataTable(&gridRefUI, ¤tGridData); + m_gridMiddle->setGridDataTable(&gridRefUI, ¤tGridData); //disable sync button as long as "compare" hasn't been triggered. enableSynchronization(false); //make filesize right justified on grids - wxGridCellAttr* cellAttributes = m_grid1->GetOrCreateCellAttr(0, 2); + wxGridCellAttr* cellAttributes = m_gridLeft->GetOrCreateCellAttr(0, 2); cellAttributes->SetAlignment(wxALIGN_RIGHT,wxALIGN_CENTRE); - m_grid1->SetColAttr(2, cellAttributes); + m_gridLeft->SetColAttr(2, cellAttributes); - cellAttributes = m_grid2->GetOrCreateCellAttr(0, 2); //leave these two rows, might be necessary 'cause wxGridCellAttr is ref-counting + cellAttributes = m_gridRight->GetOrCreateCellAttr(0, 2); //leave these two rows, might be necessary 'cause wxGridCellAttr is ref-counting cellAttributes->SetAlignment(wxALIGN_RIGHT,wxALIGN_CENTRE); //and SetColAttr takes ownership (means: it will call DecRef()) - m_grid2->SetColAttr(2, cellAttributes); + m_gridRight->SetColAttr(2, cellAttributes); //as the name says: disable them - m_grid3->deactivateScrollbars(); + m_gridMiddle->deactivateScrollbars(); //mainly to update row label sizes... writeGrid(currentGridData); //select rows only - m_grid1->SetSelectionMode(wxGrid::wxGridSelectRows); - m_grid2->SetSelectionMode(wxGrid::wxGridSelectRows); - m_grid3->SetSelectionMode(wxGrid::wxGridSelectRows); + m_gridLeft->SetSelectionMode(wxGrid::wxGridSelectRows); + m_gridRight->SetSelectionMode(wxGrid::wxGridSelectRows); + m_gridMiddle->SetSelectionMode(wxGrid::wxGridSelectRows); //set color of selections wxColour darkBlue(40, 35, 140); - m_grid1->SetSelectionBackground(darkBlue); - m_grid2->SetSelectionBackground(darkBlue); - m_grid3->SetSelectionBackground(darkBlue); - m_grid1->SetSelectionForeground(*wxWHITE); - m_grid2->SetSelectionForeground(*wxWHITE); - m_grid3->SetSelectionForeground(*wxWHITE); + m_gridLeft->SetSelectionBackground(darkBlue); + m_gridRight->SetSelectionBackground(darkBlue); + m_gridMiddle->SetSelectionBackground(darkBlue); + m_gridLeft->SetSelectionForeground(*wxWHITE); + m_gridRight->SetSelectionForeground(*wxWHITE); + m_gridMiddle->SetSelectionForeground(*wxWHITE); enableSynchronization(false); @@ -202,10 +228,12 @@ MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale Layout(); //avoid screen flicker when panel is shown later compareStatus->Hide(); - //correct height of middle grid - wxSize dirPickersize = sbSizer2->GetSize(); - wxSize swapButtonsize = bSizer69->GetSize(); - bSizer18->Insert(1, 0, dirPickersize.GetY() - swapButtonsize.GetY(), 0); + //correct width of middle grid + wxSize source = m_gridMiddle->GetSize(); + wxSize target = bSizerMiddle->GetSize(); + int spaceToAdd = source.GetX() - target.GetX(); + bSizerMiddle->Insert(1, spaceToAdd / 2, 0, 0); + bSizerMiddle->Insert(0, spaceToAdd - (spaceToAdd / 2), 0, 0); //adjust folder pair buttons if (additionalFolderPairs.size() <= 0) @@ -215,12 +243,12 @@ MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale MainDialog::~MainDialog() { - m_grid1->setGridDataTable(0, 0); - m_grid2->setGridDataTable(0, 0); - m_grid3->setGridDataTable(0, 0); + m_gridLeft->setGridDataTable(0, 0); + m_gridRight->setGridDataTable(0, 0); + m_gridMiddle->setGridDataTable(0, 0); - m_grid1->setSortMarker(-1); - m_grid2->setSortMarker(-1); + m_gridLeft->setSortMarker(-1); + m_gridRight->setSortMarker(-1); //no need for event disconnect here; done automatically @@ -243,12 +271,12 @@ MainDialog::~MainDialog() delete cfgFileHistory; //save configuration - writeConfigurationToXml(FreeFileSync::FfsLastConfigFile); //don't trow exceptions in destructors + writeConfigurationToXml(FreeFileSync::LAST_CONFIG_FILE); //don't trow exceptions in destructors writeGlobalSettings(); if (restartOnExit) //this is needed so that restart happens AFTER configuration was written! { //create new dialog - MainDialog* frame = new MainDialog(NULL, FreeFileSync::FfsLastConfigFile, programLanguage, globalSettings); + MainDialog* frame = new MainDialog(NULL, FreeFileSync::LAST_CONFIG_FILE, programLanguage, globalSettings); frame->SetIcon(*globalResource.programIcon); //set application icon frame->Show(); } @@ -273,11 +301,11 @@ void MainDialog::readGlobalSettings() Maximize(globalSettings.gui.isMaximized); //read column widths - for (int i = 0; i < m_grid1->GetNumberCols() && i < int(globalSettings.gui.columnWidthLeft.size()); ++i) - m_grid1->SetColSize(i, globalSettings.gui.columnWidthLeft[i]); + for (int i = 0; i < m_gridLeft->GetNumberCols() && i < int(globalSettings.gui.columnWidthLeft.size()); ++i) + m_gridLeft->SetColSize(i, globalSettings.gui.columnWidthLeft[i]); - for (int i = 0; i < m_grid2->GetNumberCols() && i < int(globalSettings.gui.columnWidthRight.size()); ++i) - m_grid2->SetColSize(i, globalSettings.gui.columnWidthRight[i]); + for (int i = 0; i < m_gridRight->GetNumberCols() && i < int(globalSettings.gui.columnWidthRight.size()); ++i) + m_gridRight->SetColSize(i, globalSettings.gui.columnWidthRight[i]); } @@ -291,12 +319,12 @@ void MainDialog::writeGlobalSettings() globalSettings.gui.isMaximized = IsMaximized(); globalSettings.gui.columnWidthLeft.clear(); - for (int i = 0; i < m_grid1->GetNumberCols(); ++i) - globalSettings.gui.columnWidthLeft.push_back(m_grid1->GetColSize(i)); + for (int i = 0; i < m_gridLeft->GetNumberCols(); ++i) + globalSettings.gui.columnWidthLeft.push_back(m_gridLeft->GetColSize(i)); globalSettings.gui.columnWidthRight.clear(); - for (int i = 0; i < m_grid2->GetNumberCols(); ++i) - globalSettings.gui.columnWidthRight.push_back(m_grid2->GetColSize(i)); + for (int i = 0; i < m_gridRight->GetNumberCols(); ++i) + globalSettings.gui.columnWidthRight.push_back(m_gridRight->GetColSize(i)); } @@ -305,9 +333,9 @@ void MainDialog::onGrid1access(wxEvent& event) if (leadingPanel != 1) { leadingPanel = 1; - m_grid1->SetFocus(); + m_gridLeft->SetFocus(); - m_grid2->ClearSelection(); //clear selection on grid2 + m_gridRight->ClearSelection(); //clear selection on grid2 } event.Skip(); } @@ -318,9 +346,9 @@ void MainDialog::onGrid2access(wxEvent& event) if (leadingPanel != 2) { leadingPanel = 2; - m_grid2->SetFocus(); + m_gridRight->SetFocus(); - m_grid1->ClearSelection(); //clear selection on grid1 + m_gridLeft->ClearSelection(); //clear selection on grid1 } event.Skip(); } @@ -331,8 +359,8 @@ void MainDialog::onGrid3access(wxEvent& event) if (leadingPanel != 3) { leadingPanel = 3; - m_grid1->ClearSelection(); //clear selection on grid1 - m_grid2->ClearSelection(); //clear selection on grid1 + m_gridLeft->ClearSelection(); //clear selection on grid1 + m_gridRight->ClearSelection(); //clear selection on grid1 } event.Skip(); } @@ -389,9 +417,9 @@ void MainDialog::filterRangeTemp(const set<int>& rowsToFilterOnUI_View) currentGridData[*i].selectedForSynchronization = newSelection; //signal UI that grids need to be refreshed on next Update() - m_grid1->ForceRefresh(); - m_grid2->ForceRefresh(); - m_grid3->ForceRefresh(); + m_gridLeft->ForceRefresh(); + m_gridRight->ForceRefresh(); + m_gridMiddle->ForceRefresh(); Update(); //show changes resulting from ForceRefresh() if (hideFilteredElements) @@ -404,10 +432,10 @@ void MainDialog::filterRangeTemp(const set<int>& rowsToFilterOnUI_View) //clear selection on grids if (hideFilteredElements) { - m_grid1->ClearSelection(); - m_grid2->ClearSelection(); + m_gridLeft->ClearSelection(); + m_gridRight->ClearSelection(); } //exception for grid 3 - m_grid3->ClearSelection(); + m_gridMiddle->ClearSelection(); } @@ -484,13 +512,13 @@ void MainDialog::copySelectionToClipboard(const set<int>& selectedRows, int sele switch (selectedGrid) { case 1: - grid = m_grid1; + grid = m_gridLeft; break; case 2: - grid = m_grid2; + grid = m_gridRight; break; case 3: - grid = m_grid3; + grid = m_gridMiddle; break; default: return; @@ -543,13 +571,13 @@ set<int> MainDialog::getSelectedRows() switch (leadingPanel) { case 1: - grid = m_grid1; + grid = m_gridLeft; break; case 2: - grid = m_grid2; + grid = m_gridRight; break; case 3: - grid = m_grid3; + grid = m_gridMiddle; break; default: return set<int>(); @@ -607,27 +635,29 @@ set<int> MainDialog::getSelectedRows() class DeleteErrorHandler : public ErrorHandler { public: - DeleteErrorHandler(bool& unsolvedErrorOccured) : continueOnError(false), unsolvedErrors(unsolvedErrorOccured) {} + DeleteErrorHandler(wxWindow* parentWindow, bool& unsolvedErrorOccured) : + parent(parentWindow), + ignoreErrors(false), + unsolvedErrors(unsolvedErrorOccured) {} ~DeleteErrorHandler() {} Response reportError(const wxString& text) { - if (continueOnError) + if (ignoreErrors) { unsolvedErrors = true; return ErrorHandler::CONTINUE_NEXT; } - wxString errorMessage = text + _("\n\nInformation: If you skip the error and continue or abort a re-compare will be necessary!"); - - ErrorDlg* errorDlg = new ErrorDlg(errorMessage, continueOnError); + bool ignoreNextErrors = false; + wxString errorMessage = text + wxT("\n\n") + _("Information: If you ignore the error or abort a re-compare will be necessary!"); + ErrorDlg* errorDlg = new ErrorDlg(parent, errorMessage, ignoreNextErrors, 90); int rv = errorDlg->ShowModal(); - errorDlg->Destroy(); - switch (rv) { - case ErrorDlg::BUTTON_CONTINUE: + case ErrorDlg::BUTTON_IGNORE: + ignoreErrors = ignoreNextErrors; unsolvedErrors = true; return ErrorHandler::CONTINUE_NEXT; case ErrorDlg::BUTTON_RETRY: @@ -645,7 +675,8 @@ public: } private: - bool continueOnError; + wxWindow* parent; + bool ignoreErrors; bool& unsolvedErrors; }; @@ -690,7 +721,7 @@ void MainDialog::deleteFilesOnGrid(const set<int>& rowsToDeleteOnUI) try { //handle errors when deleting files/folders - DeleteErrorHandler errorHandler(unsolvedErrorOccured); + DeleteErrorHandler errorHandler(this, unsolvedErrorOccured); FreeFileSync::deleteOnGridAndHD(currentGridData, rowsToDeleteOnGrid, &errorHandler, cfg.useRecycleBin); } @@ -704,9 +735,9 @@ void MainDialog::deleteFilesOnGrid(const set<int>& rowsToDeleteOnUI) //redraw grid neccessary to update new dimensions and for UI-Backend data linkage writeGrid(currentGridData); - m_grid1->ClearSelection(); - m_grid2->ClearSelection(); - m_grid3->ClearSelection(); + m_gridLeft->ClearSelection(); + m_gridRight->ClearSelection(); + m_gridMiddle->ClearSelection(); } break; @@ -884,7 +915,7 @@ void MainDialog::OnOpenContextMenu(wxGridEvent& event) if (exFilterCandidateObj.size() > 0 && exFilterCandidateObj[0].type == FileDescrLine::TYPE_FILE) { - const wxString filename = exFilterCandidateObj[0].relativeName.AfterLast(GlobalResources::fileNameSeparator); + const wxString filename = exFilterCandidateObj[0].relativeName.AfterLast(GlobalResources::FILE_NAME_SEPARATOR); if (filename.Find(wxChar('.')) != wxNOT_FOUND) //be careful: AfterLast will return the whole string if '.' is not found! { exFilterCandidateExtension = filename.AfterLast(wxChar('.')); @@ -974,12 +1005,12 @@ void MainDialog::onContextMenuSelection(wxCommandEvent& event) if (i->type == FileDescrLine::TYPE_FILE) { - cfg.excludeFilter+= wxString(wxT("*")) + GlobalResources::fileNameSeparator + i->relativeName; + cfg.excludeFilter+= wxString(wxT("*")) + GlobalResources::FILE_NAME_SEPARATOR + i->relativeName; } else if (i->type == FileDescrLine::TYPE_DIRECTORY) { - cfg.excludeFilter+= wxString(wxT("*")) + GlobalResources::fileNameSeparator + i->relativeName + wxT("\n"); - cfg.excludeFilter+= wxString(wxT("*")) + GlobalResources::fileNameSeparator + i->relativeName + GlobalResources::fileNameSeparator + wxT("*"); + cfg.excludeFilter+= wxString(wxT("*")) + GlobalResources::FILE_NAME_SEPARATOR + i->relativeName + wxT("\n"); + cfg.excludeFilter+= wxString(wxT("*")) + GlobalResources::FILE_NAME_SEPARATOR + i->relativeName + GlobalResources::FILE_NAME_SEPARATOR + wxT("*"); } else assert(false); } @@ -1023,9 +1054,9 @@ void MainDialog::OnWriteDirManually(wxCommandEvent& event) //first check if event comes from main folder pair if (eventObj == (wxObject*)m_directoryLeft) - m_dirPicker1->SetPath(newDir); + m_dirPickerLeft->SetPath(newDir); else if (eventObj == (wxObject*)m_directoryRight) - m_dirPicker2->SetPath(newDir); + m_dirPickerRight->SetPath(newDir); else { //check if event comes from additional pairs @@ -1055,9 +1086,9 @@ void MainDialog::OnDirSelected(wxFileDirPickerEvent& event) wxObject* eventObj = event.GetEventObject(); //first check if event comes from main folder pair - if (eventObj == (wxObject*)m_dirPicker1) + if (eventObj == (wxObject*)m_dirPickerLeft) m_directoryLeft->SetValue(newPath); - else if (eventObj == (wxObject*)m_dirPicker2) + else if (eventObj == (wxObject*)m_dirPickerRight) m_directoryRight->SetValue(newPath); else //check if event comes from additional pairs { @@ -1104,10 +1135,10 @@ bool sameFileSpecified(const wxString& file1, const wxString& file2) wxString file2Full = file2; if (wxFileName(file1).GetPath() == wxEmptyString) - file1Full = wxFileName::GetCwd() + GlobalResources::fileNameSeparator + file1; + file1Full = wxFileName::GetCwd() + GlobalResources::FILE_NAME_SEPARATOR + file1; if (wxFileName(file2).GetPath() == wxEmptyString) - file2Full = wxFileName::GetCwd() + GlobalResources::fileNameSeparator + file2; + file2Full = wxFileName::GetCwd() + GlobalResources::FILE_NAME_SEPARATOR + file2; return (file1Full == file2Full); } @@ -1116,7 +1147,7 @@ bool sameFileSpecified(const wxString& file1, const wxString& file2) void MainDialog::addCfgFileToHistory(const wxString& filename) { //the default configFile should not be in the history - if (sameFileSpecified(FreeFileSync::FfsLastConfigFile, filename)) + if (sameFileSpecified(FreeFileSync::LAST_CONFIG_FILE, filename)) return; //only still existing files should be included in the list @@ -1197,10 +1228,10 @@ bool FileDropEvent::OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filen //test if main folder pair is drop target else if (dropTarget == mainDlg->m_panel1) - onFilesDropped(droppedFileName, mainDlg->m_directoryLeft, mainDlg->m_dirPicker1); + onFilesDropped(droppedFileName, mainDlg->m_directoryLeft, mainDlg->m_dirPickerLeft); else if (dropTarget == mainDlg->m_panel2) - onFilesDropped(droppedFileName, mainDlg->m_directoryRight, mainDlg->m_dirPicker2); + onFilesDropped(droppedFileName, mainDlg->m_directoryRight, mainDlg->m_dirPickerRight); else //test if additional folder pairs are drop targets { @@ -1237,7 +1268,6 @@ void MainDialog::OnSaveConfig(wxCommandEvent& event) wxFileDialog* filePicker = new wxFileDialog(this, wxEmptyString, wxEmptyString, defaultFileName, wxString(_("FreeFileSync configuration")) + wxT(" (*.ffs_gui)|*.ffs_gui"), wxFD_SAVE); - if (filePicker->ShowModal() == wxID_OK) { wxString newFileName = filePicker->GetPath(); @@ -1255,20 +1285,15 @@ void MainDialog::OnSaveConfig(wxCommandEvent& event) if (writeConfigurationToXml(newFileName)) pushStatusInformation(_("Configuration saved!")); } + event.Skip(); } -void MainDialog::OnLoadConfiguration(wxCommandEvent& event) +void MainDialog::OnLoadConfig(wxCommandEvent& event) { int selectedItem; if ((selectedItem = m_choiceLoad->GetSelection()) != wxNOT_FOUND) { - //clear grids - currentGridData.clear(); - writeGrid(currentGridData); - - wxString newCfgFile; - wxFileDialog* filePicker = NULL; switch (selectedItem) { @@ -1276,32 +1301,54 @@ void MainDialog::OnLoadConfiguration(wxCommandEvent& event) filePicker = new wxFileDialog(this, wxEmptyString, wxEmptyString, wxEmptyString, wxString(_("FreeFileSync configuration")) + wxT(" (*.ffs_gui)|*.ffs_gui"), wxFD_OPEN); if (filePicker->ShowModal() == wxID_OK) - newCfgFile = filePicker->GetPath(); - + loadConfiguration(filePicker->GetPath()); break; + default: if (1 <= selectedItem && unsigned(selectedItem) < m_choiceLoad->GetCount()) { if (unsigned(selectedItem - 1) < cfgFileNames.size()) - newCfgFile = cfgFileNames[selectedItem - 1]; + loadConfiguration(cfgFileNames[selectedItem - 1]); } break; } + } + event.Skip(); +} - if (!newCfgFile.IsEmpty()) - { - if (!wxFileExists(newCfgFile)) - wxMessageBox(_("The selected file does not exist anymore!"), _("Warning"), wxOK); - else if (xmlAccess::getXmlType(newCfgFile) != XML_GUI_CONFIG) - wxMessageBox(_("The selected file does not contain a valid configuration!"), _("Warning"), wxOK); - else - { - if (readConfigurationFromXml(newCfgFile)) - pushStatusInformation(_("Configuration loaded!")); - } + +void MainDialog::OnMenuSaveConfig(wxCommandEvent& event) +{ + OnSaveConfig(event); + event.Skip(); +} + + +void MainDialog::OnMenuLoadConfig(wxCommandEvent& event) +{ + wxFileDialog* filePicker = new wxFileDialog(this, wxEmptyString, wxEmptyString, wxEmptyString, wxString(_("FreeFileSync configuration")) + wxT(" (*.ffs_gui)|*.ffs_gui"), wxFD_OPEN); + if (filePicker->ShowModal() == wxID_OK) + loadConfiguration(filePicker->GetPath()); +} + + +void MainDialog::loadConfiguration(const wxString& filename) +{ + if (!filename.IsEmpty()) + { + if (!wxFileExists(filename)) + wxMessageBox(wxString(_("The selected file does not exist: ")) + filename, _("Warning"), wxOK); + else if (xmlAccess::getXmlType(filename) != XML_GUI_CONFIG) + wxMessageBox(_("The selected file does not contain a valid configuration!"), _("Warning"), wxOK); + else + { //clear grids + currentGridData.clear(); + writeGrid(currentGridData); + + if (readConfigurationFromXml(filename)) + pushStatusInformation(_("Configuration loaded!")); } } - event.Skip(); } @@ -1359,7 +1406,7 @@ bool MainDialog::readConfigurationFromXml(const wxString& filename, bool program } catch (const FileError& error) { - if (programStartup && filename == FreeFileSync::FfsLastConfigFile && !wxFileExists(filename)) //do not show error in this case + if (programStartup && filename == FreeFileSync::LAST_CONFIG_FILE && !wxFileExists(filename)) //do not show error in this case ; else if (!programStartup) { @@ -1388,12 +1435,12 @@ bool MainDialog::readConfigurationFromXml(const wxString& filename, bool program m_directoryLeft->SetValue(i->leftDirectory); wxString leftDirFormatted = FreeFileSync::getFormattedDirectoryName(i->leftDirectory); if (wxDirExists(leftDirFormatted)) - m_dirPicker1->SetPath(leftDirFormatted); + m_dirPickerLeft->SetPath(leftDirFormatted); m_directoryRight->SetValue(i->rightDirectory); wxString rightDirFormatted = FreeFileSync::getFormattedDirectoryName(i->rightDirectory); if (wxDirExists(rightDirFormatted)) - m_dirPicker2->SetPath(rightDirFormatted); + m_dirPickerRight->SetPath(rightDirFormatted); //set additional pairs for (vector<FolderPair>::const_iterator i = guiCfg.directoryPairs.begin() + 1; i != guiCfg.directoryPairs.end(); ++i) @@ -1417,7 +1464,7 @@ bool MainDialog::writeConfigurationToXml(const wxString& filename) //load structure with basic settings "mainCfg" guiCfg.mainCfg = cfg; - GetFolderPairs(guiCfg.directoryPairs); + getFolderPairs(guiCfg.directoryPairs); //load structure with gui settings guiCfg.hideFilteredElements = hideFilteredElements; @@ -1662,7 +1709,7 @@ void MainDialog::updateCompareButtons() } -void MainDialog::GetFolderPairs(vector<FolderPair>& output, bool formatted) +void MainDialog::getFolderPairs(vector<FolderPair>& output, bool formatted) { output.clear(); @@ -1704,7 +1751,7 @@ void MainDialog::OnCompare(wxCommandEvent &event) { //assemble vector of formatted folder pairs vector<FolderPair> directoryPairsFormatted; - GetFolderPairs(directoryPairsFormatted, true); + getFolderPairs(directoryPairsFormatted, true); //check if folders are valid wxString errorMessage; @@ -1713,6 +1760,25 @@ void MainDialog::OnCompare(wxCommandEvent &event) wxMessageBox(errorMessage, _("Warning")); return; } + + //check if folders have dependencies + if (globalSettings.global.folderDependCheckActive) + { + wxString warningMessage; + if (FreeFileSync::foldersHaveDependencies(directoryPairsFormatted, warningMessage)) + { + bool hideThisDialog = false; + wxString messageText = warningMessage + wxT("\n\n") + + _("Consider this when setting up synchronization rules: You might want to avoid write access to these directories so that synchronization of both does not interfere."); + + //show popup and ask user how to handle warning + WarningDlg* warningDlg = new WarningDlg(this, WarningDlg::BUTTON_IGNORE | WarningDlg::BUTTON_ABORT, messageText, hideThisDialog); + if (warningDlg->ShowModal() == WarningDlg::BUTTON_ABORT) + return; + else + globalSettings.global.folderDependCheckActive = !hideThisDialog; + } + } //---------------------------------------------- clearStatusBar(); @@ -1722,13 +1788,13 @@ void MainDialog::OnCompare(wxCommandEvent &event) bool aborted = false; try { //class handling status display and error messages - CompareStatusUpdater statusUpdater(this); - cmpStatusUpdaterTmp = &statusUpdater; + CompareStatusHandler statusHandler(this); + cmpStatusHandlerTmp = &statusHandler; - FreeFileSync::startCompareProcess(directoryPairsFormatted, - cfg.compareVar, - currentGridData, - &statusUpdater); + FreeFileSync::CompareProcess comparison(false, &statusHandler); + comparison.startCompareProcess(directoryPairsFormatted, + cfg.compareVar, + currentGridData); //filter currentGridData if option is set if (cfg.filterIsActive) @@ -1736,12 +1802,41 @@ void MainDialog::OnCompare(wxCommandEvent &event) writeGrid(currentGridData); //keep it in try/catch to not overwrite status information if compare is aborted - cmpStatusUpdaterTmp = 0; +#ifdef FFS_WIN + //check if DST time correction needs to be applied + if (globalSettings.global.dstCheckActive) + { + int timeShift = 0; + wxString driveName; + FreeFileSync::checkForDSTChange(currentGridData, directoryPairsFormatted, timeShift, driveName); + if (timeShift) + { + bool hideThisDialog = false; + wxString errorMessage = wxString(_("A file time shift due to a daylight saving time change was detected for a FAT/FAT32 drive.")) + wxT("\n") + + _("You can adjust the file times accordingly to resolve the issue:"); + errorMessage+= wxString(wxT("\n\n")) + _("Drive:") + wxT(" ") + driveName + wxT("\n") + + _("Time shift:") + wxT(" ") + globalFunctions::numberToWxString(timeShift); + + //show popup and ask user how to handle the DST change + WarningDlg* warningDlg = new WarningDlg(this, WarningDlg::BUTTON_RESOLVE | WarningDlg::BUTTON_IGNORE, errorMessage, hideThisDialog); + warningDlg->m_bitmap10->SetBitmap(*globalResource.bitmapClock); + if (warningDlg->ShowModal() == WarningDlg::BUTTON_RESOLVE) + { + ModifyFilesDlg* modifyDlg = new ModifyFilesDlg(this, driveName, timeShift); + if (modifyDlg->ShowModal() == ModifyFilesDlg::BUTTON_APPLY) + throw AbortThisProcess(); + } + else + globalSettings.global.dstCheckActive = !hideThisDialog; + } + } +#endif //FFS_WIN } catch (AbortThisProcess& theException) { aborted = true; } + cmpStatusHandlerTmp = 0; if (aborted) { //disable the sync button @@ -1754,8 +1849,8 @@ void MainDialog::OnCompare(wxCommandEvent &event) m_bpButtonSync->SetFocus(); //hide sort direction indicator on GUI grids - m_grid1->setSortMarker(-1); - m_grid2->setSortMarker(-1); + m_gridLeft->setSortMarker(-1); + m_gridRight->setSortMarker(-1); } wxEndBusyCursor(); @@ -1765,46 +1860,46 @@ void MainDialog::OnCompare(wxCommandEvent &event) void MainDialog::OnAbortCompare(wxCommandEvent& event) { - if (cmpStatusUpdaterTmp) - cmpStatusUpdaterTmp->requestAbortion(); + if (cmpStatusHandlerTmp) + cmpStatusHandlerTmp->requestAbortion(); event.Skip(); } void MainDialog::writeGrid(const FileCompareResult& gridData) { - m_grid1->BeginBatch(); - m_grid2->BeginBatch(); - m_grid3->BeginBatch(); + m_gridLeft->BeginBatch(); + m_gridRight->BeginBatch(); + m_gridMiddle->BeginBatch(); mapGridDataToUI(gridRefUI, gridData); //update gridRefUI updateStatusInformation(gridRefUI); //write status information for gridRefUI //all three grids retrieve their data directly via gridRefUI!!! //the only thing left to do is notify the grids to update their sizes (nr of rows), since this has to be communicated by the grids via messages - m_grid1->updateGridSizes(); - m_grid2->updateGridSizes(); - m_grid3->updateGridSizes(); + m_gridLeft->updateGridSizes(); + m_gridRight->updateGridSizes(); + m_gridMiddle->updateGridSizes(); //enlarge label width to display row numbers correctly - int nrOfRows = m_grid1->GetNumberRows(); + int nrOfRows = m_gridLeft->GetNumberRows(); if (nrOfRows >= 1) { int nrOfDigits = int(floor(log10(double(nrOfRows)) + 1)); - m_grid1->SetRowLabelSize(nrOfDigits * 8 + 4); - m_grid2->SetRowLabelSize(nrOfDigits * 8 + 4); + m_gridLeft->SetRowLabelSize(nrOfDigits * 8 + 4); + m_gridRight->SetRowLabelSize(nrOfDigits * 8 + 4); } - m_grid1->EndBatch(); - m_grid2->EndBatch(); - m_grid3->EndBatch(); + m_gridLeft->EndBatch(); + m_gridRight->EndBatch(); + m_gridMiddle->EndBatch(); } void MainDialog::OnSync(wxCommandEvent& event) { SyncDialog* syncDlg = new SyncDialog(this, currentGridData, cfg, synchronizationEnabled); - if (syncDlg->ShowModal() == SyncDialog::StartSynchronizationProcess) + if (syncDlg->ShowModal() == SyncDialog::BUTTON_START) { //check if there are files/folders to be sync'ed at all int objectsToCreate = 0; @@ -1830,10 +1925,11 @@ void MainDialog::OnSync(wxCommandEvent& event) try { //class handling status updates and error messages - SyncStatusUpdater statusUpdater(this, cfg.continueOnError); + SyncStatusHandler statusHandler(this, cfg.ignoreErrors); //start synchronization and return elements that were not sync'ed in currentGridData - FreeFileSync::startSynchronizationProcess(currentGridData, cfg.syncConfiguration, &statusUpdater, cfg.useRecycleBin); + FreeFileSync::SyncProcess synchronization(cfg.useRecycleBin, true, &statusHandler); + synchronization.startSynchronizationProcess(currentGridData, cfg.syncConfiguration); } catch (AbortThisProcess& theException) { //do NOT disable the sync button: user might want to try to sync the REMAINING rows @@ -1882,7 +1978,7 @@ void MainDialog::OnSortLeftGrid(wxGridEvent& event) if (currentSortColumn == 0) { - if (sortAscending) sort(currentGridData.begin(), currentGridData.end(), sortByFileName<true, SORT_ON_LEFT>); //probably faster than qsort(), since gridRefUI is vector<int> + if (sortAscending) sort(currentGridData.begin(), currentGridData.end(), sortByFileName<true, SORT_ON_LEFT>); else sort(currentGridData.begin(), currentGridData.end(), sortByFileName<false, SORT_ON_LEFT>); } else if (currentSortColumn == 1) @@ -1905,10 +2001,10 @@ void MainDialog::OnSortLeftGrid(wxGridEvent& event) //set sort direction indicator on UI if (sortAscending) - m_grid1->setSortMarker(currentSortColumn, globalResource.bitmapSmallUp); + m_gridLeft->setSortMarker(currentSortColumn, globalResource.bitmapSmallUp); else - m_grid1->setSortMarker(currentSortColumn, globalResource.bitmapSmallDown); - m_grid2->setSortMarker(-1); + m_gridLeft->setSortMarker(currentSortColumn, globalResource.bitmapSmallDown); + m_gridRight->setSortMarker(-1); sortAscending = !sortAscending; } @@ -1949,11 +2045,11 @@ void MainDialog::OnSortRightGrid(wxGridEvent& event) writeGrid(currentGridData); //needed to refresh gridRefUI references //set sort direction indicator on UI - m_grid1->setSortMarker(-1); + m_gridLeft->setSortMarker(-1); if (sortAscending) - m_grid2->setSortMarker(currentSortColumn, globalResource.bitmapSmallUp); + m_gridRight->setSortMarker(currentSortColumn, globalResource.bitmapSmallUp); else - m_grid2->setSortMarker(currentSortColumn, globalResource.bitmapSmallDown); + m_gridRight->setSortMarker(currentSortColumn, globalResource.bitmapSmallDown); sortAscending = !sortAscending; } @@ -2187,11 +2283,11 @@ void MainDialog::mapGridDataToUI(GridView& output, const FileCompareResult& file if (leftOnly || rightOnly || leftNewer || rightNewer || different || equal) { - m_panel12->Show(); - m_panel12->Layout(); + m_panel112->Show(); + m_panel112->Layout(); } else - m_panel12->Hide(); + m_panel112->Hide(); bSizer3->Layout(); @@ -2219,7 +2315,7 @@ void MainDialog::addFolderPair(const wxString& leftDir, const wxString& rightDir FolderPairGenerated* newPair = new FolderPairGenerated(m_scrolledWindowFolderPairs); newPair->m_bitmap23->SetBitmap(*globalResource.bitmapLink); - bSizerFolderPairs->Insert(0, newPair, 0, wxEXPAND, 5); + bSizerFolderPairs->Add(newPair, 0, wxEXPAND, 5); additionalFolderPairs.push_back(newPair); //set size of scrolled window @@ -2272,7 +2368,7 @@ void MainDialog::removeFolderPair(bool removeAll) FolderPairGenerated* pairToDelete = additionalFolderPairs.back(); pairSize = pairToDelete->GetSize(); - bSizerFolderPairs->Detach(pairToDelete); //Remove does not work on Window*, so do it manually + bSizerFolderPairs->Detach(pairToDelete); //Remove() does not work on Window*, so do it manually pairToDelete->Destroy(); // additionalFolderPairs.pop_back(); //remove last element in vector } @@ -2281,7 +2377,7 @@ void MainDialog::removeFolderPair(bool removeAll) //set size of scrolled window int additionalRows = additionalFolderPairs.size(); if (additionalRows <= 3) //up to 3 additional pairs shall be shown - m_scrolledWindowFolderPairs->SetMinSize(wxSize( -1, pairSize.GetHeight() * additionalRows)); + m_scrolledWindowFolderPairs->SetMinSize(wxSize(-1, pairSize.GetHeight() * additionalRows)); //adjust scrollbars (do not put in else clause) m_scrolledWindowFolderPairs->Fit(); @@ -2297,9 +2393,9 @@ void MainDialog::removeFolderPair(bool removeAll) //######################################################################################################## -CompareStatusUpdater::CompareStatusUpdater(MainDialog* dlg) : +CompareStatusHandler::CompareStatusHandler(MainDialog* dlg) : mainDialog(dlg), - continueOnError(false), + ignoreErrors(false), currentProcess(StatusHandler::PROCESS_NONE) { //prevent user input during "compare", do not disable maindialog since abort-button would also be disabled @@ -2310,8 +2406,8 @@ CompareStatusUpdater::CompareStatusUpdater(MainDialog* dlg) : mainDialog->m_hyperlinkCfgFilter->Disable(); mainDialog->m_checkBoxHideFilt->Disable(); mainDialog->m_bpButtonSync->Disable(); - mainDialog->m_dirPicker1->Disable(); - mainDialog->m_dirPicker2->Disable(); + mainDialog->m_dirPickerLeft->Disable(); + mainDialog->m_dirPickerRight->Disable(); mainDialog->m_bpButtonSwap->Disable(); mainDialog->m_bpButtonLeftOnly->Disable(); mainDialog->m_bpButtonLeftNewer->Disable(); @@ -2322,6 +2418,9 @@ CompareStatusUpdater::CompareStatusUpdater(MainDialog* dlg) : mainDialog->m_panel1->Disable(); mainDialog->m_panel2->Disable(); mainDialog->m_panel3->Disable(); + mainDialog->m_panel11->Disable(); + mainDialog->m_panel12->Disable(); + mainDialog->m_panel13->Disable(); mainDialog->m_bpButton201->Disable(); mainDialog->m_choiceLoad->Disable(); mainDialog->m_bpButton10->Disable(); @@ -2349,7 +2448,7 @@ CompareStatusUpdater::CompareStatusUpdater(MainDialog* dlg) : } -CompareStatusUpdater::~CompareStatusUpdater() +CompareStatusHandler::~CompareStatusHandler() { //reenable complete main dialog mainDialog->m_radioBtnSizeDate->Enable(); @@ -2358,8 +2457,8 @@ CompareStatusUpdater::~CompareStatusUpdater() mainDialog->m_hyperlinkCfgFilter->Enable(); mainDialog->m_checkBoxHideFilt->Enable(); mainDialog->m_bpButtonSync->Enable(); - mainDialog->m_dirPicker1->Enable(); - mainDialog->m_dirPicker2->Enable(); + mainDialog->m_dirPickerLeft->Enable(); + mainDialog->m_dirPickerRight->Enable(); mainDialog->m_bpButtonSwap->Enable(); mainDialog->m_bpButtonLeftOnly->Enable(); mainDialog->m_bpButtonLeftNewer->Enable(); @@ -2370,6 +2469,9 @@ CompareStatusUpdater::~CompareStatusUpdater() mainDialog->m_panel1->Enable(); mainDialog->m_panel2->Enable(); mainDialog->m_panel3->Enable(); + mainDialog->m_panel11->Enable(); + mainDialog->m_panel12->Enable(); + mainDialog->m_panel13->Enable(); mainDialog->m_bpButton201->Enable(); mainDialog->m_choiceLoad->Enable(); mainDialog->m_bpButton10->Enable(); @@ -2379,7 +2481,7 @@ CompareStatusUpdater::~CompareStatusUpdater() mainDialog->m_menubar1->EnableTop(1, true); mainDialog->m_menubar1->EnableTop(2, true); - if (abortionRequested) + if (abortRequested) mainDialog->pushStatusInformation(_("Operation aborted!")); mainDialog->m_buttonAbort->Disable(); @@ -2396,13 +2498,13 @@ CompareStatusUpdater::~CompareStatusUpdater() inline -void CompareStatusUpdater::updateStatusText(const wxString& text) +void CompareStatusHandler::updateStatusText(const wxString& text) { mainDialog->compareStatus->setStatusText_NoUpdate(text); } -void CompareStatusUpdater::initNewProcess(int objectsTotal, double dataTotal, Process processID) +void CompareStatusHandler::initNewProcess(int objectsTotal, double dataTotal, Process processID) { currentProcess = processID; @@ -2419,7 +2521,7 @@ void CompareStatusUpdater::initNewProcess(int objectsTotal, double dataTotal, Pr inline -void CompareStatusUpdater::updateProcessedData(int objectsProcessed, double dataProcessed) +void CompareStatusHandler::updateProcessedData(int objectsProcessed, double dataProcessed) { if (currentProcess == StatusHandler::PROCESS_SCANNING) mainDialog->compareStatus->incScannedObjects_NoUpdate(objectsProcessed); @@ -2429,29 +2531,28 @@ void CompareStatusUpdater::updateProcessedData(int objectsProcessed, double data } -ErrorHandler::Response CompareStatusUpdater::reportError(const wxString& text) +ErrorHandler::Response CompareStatusHandler::reportError(const wxString& text) { - if (continueOnError) + if (ignoreErrors) return ErrorHandler::CONTINUE_NEXT; mainDialog->compareStatus->updateStatusPanelNow(); - wxString errorMessage = text + _("\n\nContinue with next object, retry or abort comparison?"); - - ErrorDlg* errorDlg = new ErrorDlg(errorMessage, continueOnError); + bool ignoreNextErrors = false; + wxString errorMessage = text + wxT("\n\n") + _("Ignore this error, retry or abort comparison?"); + ErrorDlg* errorDlg = new ErrorDlg(mainDialog, errorMessage, ignoreNextErrors, 90); int rv = errorDlg->ShowModal(); - errorDlg->Destroy(); - switch (rv) { - case ErrorDlg::BUTTON_CONTINUE: + case ErrorDlg::BUTTON_IGNORE: + ignoreErrors = ignoreNextErrors; return ErrorHandler::CONTINUE_NEXT; case ErrorDlg::BUTTON_RETRY: return ErrorHandler::RETRY; case ErrorDlg::BUTTON_ABORT: { - abortionRequested = true; + abortRequested = true; throw AbortThisProcess(); } default: @@ -2463,21 +2564,21 @@ ErrorHandler::Response CompareStatusUpdater::reportError(const wxString& text) inline -void CompareStatusUpdater::forceUiRefresh() +void CompareStatusHandler::forceUiRefresh() { mainDialog->compareStatus->updateStatusPanelNow(); } -void CompareStatusUpdater::abortThisProcess() +void CompareStatusHandler::abortThisProcess() { throw AbortThisProcess(); //abort can be triggered by syncStatusFrame } //######################################################################################################## -SyncStatusUpdater::SyncStatusUpdater(wxWindow* dlg, bool continueOnError) : - continueError(continueOnError) +SyncStatusHandler::SyncStatusHandler(wxWindow* dlg, bool ignoreAllErrors) : + ignoreErrors(ignoreAllErrors) { syncStatusFrame = new SyncStatus(this, dlg); syncStatusFrame->Show(); @@ -2485,7 +2586,7 @@ SyncStatusUpdater::SyncStatusUpdater(wxWindow* dlg, bool continueOnError) : } -SyncStatusUpdater::~SyncStatusUpdater() +SyncStatusHandler::~SyncStatusHandler() { //print the results list unsigned int failedItems = unhandledErrors.GetCount(); @@ -2499,7 +2600,7 @@ SyncStatusUpdater::~SyncStatusUpdater() } //notify to syncStatusFrame that current process has ended - if (abortionRequested) + if (abortRequested) { result+= wxString(_("Synchronization aborted!")) + _(" You may try to synchronize remaining items again (WITHOUT having to re-compare)!"); syncStatusFrame->setStatusText_NoUpdate(result); @@ -2521,13 +2622,13 @@ SyncStatusUpdater::~SyncStatusUpdater() inline -void SyncStatusUpdater::updateStatusText(const wxString& text) +void SyncStatusHandler::updateStatusText(const wxString& text) { syncStatusFrame->setStatusText_NoUpdate(text); } -void SyncStatusUpdater::initNewProcess(int objectsTotal, double dataTotal, Process processID) +void SyncStatusHandler::initNewProcess(int objectsTotal, double dataTotal, Process processID) { assert (processID == StatusHandler::PROCESS_SYNCHRONIZING); @@ -2537,30 +2638,31 @@ void SyncStatusUpdater::initNewProcess(int objectsTotal, double dataTotal, Proce inline -void SyncStatusUpdater::updateProcessedData(int objectsProcessed, double dataProcessed) +void SyncStatusHandler::updateProcessedData(int objectsProcessed, double dataProcessed) { syncStatusFrame->incProgressIndicator_NoUpdate(objectsProcessed, dataProcessed); } -ErrorHandler::Response SyncStatusUpdater::reportError(const wxString& text) +ErrorHandler::Response SyncStatusHandler::reportError(const wxString& text) { - if (continueError) + if (ignoreErrors) { unhandledErrors.Add(text); return ErrorHandler::CONTINUE_NEXT; } - wxString errorMessage = text + _("\n\nContinue with next object, retry or abort synchronization?"); - ErrorDlg* errorDlg = new ErrorDlg(errorMessage, continueError); - syncStatusFrame->updateStatusDialogNow(); - int rv = errorDlg->ShowModal(); - errorDlg->Destroy(); //dialog is not connected to any window => needs to be deleted manually + bool ignoreNextErrors = false; + wxString errorMessage = text + wxT("\n\n") + _("Ignore this error, retry or abort synchronization?"); + ErrorDlg* errorDlg = new ErrorDlg(syncStatusFrame, errorMessage, ignoreNextErrors, 80); + + int rv = errorDlg->ShowModal(); switch (rv) { - case ErrorDlg::BUTTON_CONTINUE: + case ErrorDlg::BUTTON_IGNORE: + ignoreErrors = ignoreNextErrors; unhandledErrors.Add(text); return ErrorHandler::CONTINUE_NEXT; case ErrorDlg::BUTTON_RETRY: @@ -2568,7 +2670,7 @@ ErrorHandler::Response SyncStatusUpdater::reportError(const wxString& text) case ErrorDlg::BUTTON_ABORT: { unhandledErrors.Add(text); - abortionRequested = true; + abortRequested = true; throw AbortThisProcess(); } default: @@ -2578,13 +2680,13 @@ ErrorHandler::Response SyncStatusUpdater::reportError(const wxString& text) } -void SyncStatusUpdater::forceUiRefresh() +void SyncStatusHandler::forceUiRefresh() { syncStatusFrame->updateStatusDialogNow(); } -void SyncStatusUpdater::abortThisProcess() +void SyncStatusHandler::abortThisProcess() { throw AbortThisProcess(); //abort can be triggered by syncStatusFrame } @@ -2617,22 +2719,22 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event) wxString exportString; for (unsigned int i = 0; i < gridRefUI.size(); ++i) { - for (int k = 0; k < m_grid1->GetNumberCols(); ++k) + for (int k = 0; k < m_gridLeft->GetNumberCols(); ++k) { - exportString+= m_grid1->GetCellValue(i, k); + exportString+= m_gridLeft->GetCellValue(i, k); exportString+= '\t'; } - for (int k = 0; k < m_grid3->GetNumberCols(); ++k) + for (int k = 0; k < m_gridMiddle->GetNumberCols(); ++k) { - exportString+= m_grid3->GetCellValue(i, k); + exportString+= m_gridMiddle->GetCellValue(i, k); exportString+= '\t'; } - for (int k = 0; k < m_grid2->GetNumberCols(); ++k) + for (int k = 0; k < m_gridRight->GetNumberCols(); ++k) { - exportString+= m_grid2->GetCellValue(i, k); - if (k != m_grid2->GetNumberCols() - 1) + exportString+= m_gridRight->GetCellValue(i, k); + if (k != m_gridRight->GetNumberCols() - 1) exportString+= '\t'; } exportString+= '\n'; @@ -2659,7 +2761,11 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event) void MainDialog::OnMenuAdjustFileTimes(wxCommandEvent& event) { ModifyFilesDlg* modifyDlg = new ModifyFilesDlg(this, FreeFileSync::getFormattedDirectoryName(m_directoryLeft->GetValue()), 0); - modifyDlg->ShowModal(); + if (modifyDlg->ShowModal() == ModifyFilesDlg::BUTTON_APPLY) + { //disable the sync button + enableSynchronization(false); + m_bpButtonCompare->SetFocus(); + } event.Skip(); } @@ -2668,7 +2774,7 @@ void MainDialog::OnMenuAdjustFileTimes(wxCommandEvent& event) void MainDialog::OnMenuBatchJob(wxCommandEvent& event) { vector<FolderPair> folderPairs; - GetFolderPairs(folderPairs); + getFolderPairs(folderPairs); BatchDialog* batchDlg = new BatchDialog(this, cfg, folderPairs); if (batchDlg->ShowModal() == BatchDialog::batchFileCreated) diff --git a/ui/MainDialog.h b/ui/MainDialog.h index e3f72e03..46151521 100644 --- a/ui/MainDialog.h +++ b/ui/MainDialog.h @@ -11,7 +11,6 @@ #define MAINDIALOG_H #include "guiGenerated.h" -#include "../FreeFileSync.h" #include "syncDialog.h" #include "smallDialogs.h" #include "../library/resources.h" @@ -36,13 +35,13 @@ enum ContextItem extern int leadingPanel; //better keep this an int! event.GetEventObject() does NOT always return m_grid1, m_grid2, m_grid3! -class CompareStatusUpdater; +class CompareStatusHandler; class FileDropEvent; class TiXmlElement; class MainDialog : public GuiGenerated { - friend class CompareStatusUpdater; + friend class CompareStatusHandler; friend class FileDropEvent; public: @@ -118,7 +117,8 @@ private: void OnEqualFiles( wxCommandEvent& event); void OnSaveConfig( wxCommandEvent& event); - void OnLoadConfiguration( wxCommandEvent& event); + void OnLoadConfig( wxCommandEvent& event); + void loadConfiguration(const wxString& filename); void OnChoiceKeyEvent( wxKeyEvent& event ); void onResizeMainWindow( wxEvent& event); @@ -139,6 +139,8 @@ private: void OnRemoveFolderPair( wxCommandEvent& event); //menu events + void OnMenuSaveConfig( wxCommandEvent& event); + void OnMenuLoadConfig( wxCommandEvent& event); void OnMenuExportFileList( wxCommandEvent& event); void OnMenuAdjustFileTimes( wxCommandEvent& event); void OnMenuBatchJob( wxCommandEvent& event); @@ -181,7 +183,7 @@ private: //------------------------------------- //convenience method to get all folder pairs (unformatted) - void GetFolderPairs(vector<FolderPair>& output, bool formatted = false); + void getFolderPairs(vector<FolderPair>& output, bool formatted = false); //UI View Filter settings bool leftOnlyFilesActive; @@ -225,7 +227,7 @@ private: bool restartOnExit; //restart dialog on exit (currently used, when language is changed) - CompareStatusUpdater* cmpStatusUpdaterTmp; //used only by the abort button when comparing + CompareStatusHandler* cmpStatusHandlerTmp; //used only by the abort button when comparing }; //###################################################################################### @@ -253,11 +255,11 @@ private: //classes handling sync and compare error as well as status information -class CompareStatusUpdater : public StatusHandler +class CompareStatusHandler : public StatusHandler { public: - CompareStatusUpdater(MainDialog* dlg); - ~CompareStatusUpdater(); + CompareStatusHandler(MainDialog* dlg); + ~CompareStatusHandler(); void updateStatusText(const wxString& text); void initNewProcess(int objectsTotal, double dataTotal, Process processID); @@ -270,16 +272,16 @@ private: void abortThisProcess(); MainDialog* mainDialog; - bool continueOnError; + bool ignoreErrors; Process currentProcess; }; -class SyncStatusUpdater : public StatusHandler +class SyncStatusHandler : public StatusHandler { public: - SyncStatusUpdater(wxWindow* dlg, bool continueOnError); - ~SyncStatusUpdater(); + SyncStatusHandler(wxWindow* dlg, bool ignoreAllErrors); + ~SyncStatusHandler(); void updateStatusText(const wxString& text); void initNewProcess(int objectsTotal, double dataTotal, Process processID); @@ -292,7 +294,7 @@ private: void abortThisProcess(); SyncStatus* syncStatusFrame; - bool continueError; + bool ignoreErrors; wxArrayString unhandledErrors; //list of non-resolved errors }; diff --git a/ui/SmallDialogs.cpp b/ui/SmallDialogs.cpp index 0886bb03..3a2e239e 100644 --- a/ui/SmallDialogs.cpp +++ b/ui/SmallDialogs.cpp @@ -1,9 +1,10 @@ #include "smallDialogs.h" #include "../library/globalFunctions.h" #include "../library/resources.h" +#include "../algorithm.h" #include <wx/msgdlg.h> -using namespace globalFunctions; +using namespace FreeFileSync; AboutDlg::AboutDlg(wxWindow* window) : AboutDlgGenerated(window) @@ -52,6 +53,8 @@ HelpDlg::HelpDlg(wxWindow* window) : HelpDlgGenerated(window) { m_notebook1->SetFocus(); + m_bitmap25->SetBitmap(*globalResource.bitmapHelp); + //populate decision trees: "compare by date" wxTreeItemId treeRoot = m_treeCtrl1->AddRoot(_("DECISION TREE")); wxTreeItemId treeBothSides = m_treeCtrl1->AppendItem(treeRoot, _("file exists on both sides")); @@ -105,9 +108,9 @@ FilterDlg::FilterDlg(wxWindow* window, wxString& filterIncl, wxString& filterExc includeFilter(filterIncl), excludeFilter(filterExcl) { - m_bitmap8->SetBitmap(*globalResource.bitmapInclude); m_bitmap9->SetBitmap(*globalResource.bitmapExclude); + m_bitmap26->SetBitmap(*globalResource.bitmapFilter); m_bpButtonHelp->SetBitmapLabel(*globalResource.bitmapHelp); m_textCtrlInclude->SetValue(includeFilter); @@ -196,9 +199,9 @@ void DeleteDialog::OnClose(wxCloseEvent& event) //######################################################################################## -ErrorDlg::ErrorDlg(const wxString messageText, bool& continueError) : - ErrorDlgGenerated(NULL), - continueOnError(continueError) +ErrorDlg::ErrorDlg(wxWindow* parentWindow, const wxString messageText, bool& ignoreNextErrors, int dummy) : + ErrorDlgGenerated(parentWindow), + ignoreErrors(ignoreNextErrors) { m_bitmap10->SetBitmap(*globalResource.bitmapWarning); m_textCtrl8->SetValue(messageText); @@ -211,40 +214,104 @@ ErrorDlg::~ErrorDlg() {} void ErrorDlg::OnClose(wxCloseEvent& event) { - //continueOnError = m_checkBoxContinueError->GetValue(); -> not needed here + ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); EndModal(BUTTON_ABORT); } -void ErrorDlg::OnContinue(wxCommandEvent& event) +void ErrorDlg::OnIgnore(wxCommandEvent& event) { - continueOnError = m_checkBoxContinueError->GetValue(); - EndModal(BUTTON_CONTINUE); + ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); + EndModal(BUTTON_IGNORE); } void ErrorDlg::OnRetry(wxCommandEvent& event) { - //continueOnError = m_checkBoxContinueError->GetValue(); -> not needed here + ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); EndModal(BUTTON_RETRY); } void ErrorDlg::OnAbort(wxCommandEvent& event) { - //continueOnError = m_checkBoxContinueError->GetValue(); -> not needed here + ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); EndModal(BUTTON_ABORT); } +//######################################################################################## + + +WarningDlg::WarningDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool& dontShowDlgAgain) : + WarningDlgGenerated(parentWindow), + dontShowAgain(dontShowDlgAgain) +{ + m_bitmap10->SetBitmap(*globalResource.bitmapWarning); + m_textCtrl8->SetValue(messageText); + + if (~activeButtons & BUTTON_IGNORE) + m_buttonIgnore->Hide(); + + if (activeButtons & BUTTON_RESOLVE) + m_buttonResolve->SetFocus(); + else + m_buttonResolve->Hide(); + + if (~activeButtons & BUTTON_ABORT) + m_buttonAbort->Hide(); + if (activeButtons & BUTTON_OKAY) + m_buttonOK->SetFocus(); + else + m_buttonOK->Hide(); +} + +WarningDlg::~WarningDlg() {} + + +void WarningDlg::OnClose(wxCloseEvent& event) +{ + dontShowAgain = m_checkBoxDontShowAgain->GetValue(); + EndModal(BUTTON_ABORT); +} + + +void WarningDlg::OnIgnore(wxCommandEvent& event) +{ + dontShowAgain = m_checkBoxDontShowAgain->GetValue(); + EndModal(BUTTON_IGNORE); +} + +void WarningDlg::OnResolve(wxCommandEvent& event) +{ + dontShowAgain = m_checkBoxDontShowAgain->GetValue(); + EndModal(BUTTON_RESOLVE); +} + + +void WarningDlg::OnAbort(wxCommandEvent& event) +{ + dontShowAgain = m_checkBoxDontShowAgain->GetValue(); + EndModal(BUTTON_ABORT); +} + +void WarningDlg::OnOkay(wxCommandEvent& event) +{ + dontShowAgain = m_checkBoxDontShowAgain->GetValue(); + EndModal(BUTTON_OKAY); +} //######################################################################################## + + ModifyFilesDlg::ModifyFilesDlg(wxWindow* window, const wxString& parentDirectory, const int timeShift) : ModifyFilesDlgGenerated(window) { - m_dirPicker->SetPath(parentDirectory); + if (wxDirExists(parentDirectory)) + m_dirPicker->SetPath(parentDirectory); m_textCtrlDirectory->SetValue(parentDirectory); m_spinCtrlTimeShift->SetValue(timeShift); + m_bitmap24->SetBitmap(*globalResource.bitmapClock); m_buttonApply->SetFocus(); } @@ -255,28 +322,29 @@ ModifyFilesDlg::~ModifyFilesDlg() {} class ModifyErrorHandler : public ErrorHandler { public: - ModifyErrorHandler(bool& unsolvedErrorOccured) : - continueOnError(false), + ModifyErrorHandler(wxWindow* parentWindow, bool& unsolvedErrorOccured) : + parent(parentWindow), + ignoreErrors(false), unsolvedErrors(unsolvedErrorOccured) {} ~ModifyErrorHandler() {} Response reportError(const wxString& text) { - if (continueOnError) + if (ignoreErrors) { unsolvedErrors = true; return ErrorHandler::CONTINUE_NEXT; } - ErrorDlg* errorDlg = new ErrorDlg(text, continueOnError); - + bool ignoreNextErrors = false; + ErrorDlg* errorDlg = new ErrorDlg(parent, text, ignoreNextErrors, 90); int rv = errorDlg->ShowModal(); - errorDlg->Destroy(); switch (rv) { - case ErrorDlg::BUTTON_CONTINUE: + case ErrorDlg::BUTTON_IGNORE: + ignoreErrors = ignoreNextErrors; unsolvedErrors = true; return ErrorHandler::CONTINUE_NEXT; case ErrorDlg::BUTTON_RETRY: @@ -292,9 +360,10 @@ public: return ErrorHandler::CONTINUE_NEXT; //dummy return value } -private: - bool continueOnError; +private: + wxWindow* parent; + bool ignoreErrors; bool& unsolvedErrors; }; @@ -313,19 +382,19 @@ void ModifyFilesDlg::OnApply(wxCommandEvent& event) bool unsolvedErrorOccured = false; //if an error is skipped a re-compare will be necessary! try { - ModifyErrorHandler errorHandler(unsolvedErrorOccured); + ModifyErrorHandler errorHandler(this, unsolvedErrorOccured); FreeFileSync::adjustModificationTimes(parentDir, timeToShift, &errorHandler); } catch (const AbortThisProcess& theException) { - EndModal(0); + EndModal(BUTTON_APPLY); } if (unsolvedErrorOccured) - wxMessageBox(_("Unresolved errors occured during operation!"), _("Info"), wxOK); + wxMessageBox(_("Unresolved errors occured during operation!"), _("Information"), wxOK); else - wxMessageBox(_("All file times have been adjusted successfully!"), _("Info"), wxOK); - EndModal(0); + wxMessageBox(_("All file times have been adjusted successfully!"), _("Information"), wxOK); + EndModal(BUTTON_APPLY); } @@ -524,31 +593,36 @@ void SyncStatus::setStatusText_NoUpdate(const wxString& text) void SyncStatus::updateStatusDialogNow() { + bool screenChanged = false; //avoid screen flicker by calling layout() only if necessary + //progress indicator m_gauge1->SetValue(int(currentData * scalingFactor)); //status text - if (m_textCtrlInfo->GetValue() != currentStatusText) //avoid screen flicker + if (m_textCtrlInfo->GetValue() != currentStatusText && (screenChanged = true)) //avoid screen flicker m_textCtrlInfo->SetValue(currentStatusText); //remaining objects - const wxString remainingObjTmp = numberToWxString(totalObjects - currentObjects); - if (m_staticTextRemainingObj->GetLabel() != remainingObjTmp) //avoid screen flicker + const wxString remainingObjTmp = globalFunctions::numberToWxString(totalObjects - currentObjects); + if (m_staticTextRemainingObj->GetLabel() != remainingObjTmp && (screenChanged = true)) //avoid screen flicker m_staticTextRemainingObj->SetLabel(remainingObjTmp); //remaining bytes left for copy const wxString remainingBytesTmp = FreeFileSync::formatFilesizeToShortString(totalData - currentData); - if (m_staticTextDataRemaining->GetLabel() != remainingBytesTmp) //avoid screen flicker + if (m_staticTextDataRemaining->GetLabel() != remainingBytesTmp && (screenChanged = true)) //avoid screen flicker m_staticTextDataRemaining->SetLabel(remainingBytesTmp); //time elapsed const wxString timeElapsedTmp = (wxTimeSpan::Milliseconds(timeElapsed.Time())).Format(); - if (m_staticTextTimeElapsed->GetLabel() != timeElapsedTmp) //avoid screen flicker + if (m_staticTextTimeElapsed->GetLabel() != timeElapsedTmp && (screenChanged = true)) //avoid screen flicker m_staticTextTimeElapsed->SetLabel(timeElapsedTmp); //do the ui update - bSizer28->Layout(); - bSizer31->Layout(); + if (screenChanged) + { + bSizer28->Layout(); + bSizer31->Layout(); + } updateUiNow(); //support for pause button @@ -765,26 +839,28 @@ void CompareStatus::setStatusText_NoUpdate(const wxString& text) void CompareStatus::updateStatusPanelNow() { + bool screenChanged = false; //avoid screen flicker by calling layout() only if necessary + //status texts - if (m_textCtrlFilename->GetValue() != currentStatusText) //avoid screen flicker + if (m_textCtrlFilename->GetValue() != currentStatusText && (screenChanged = true)) //avoid screen flicker m_textCtrlFilename->SetValue(currentStatusText); //nr of scanned objects - const wxString scannedObjTmp = numberToWxString(scannedObjects); - if (m_staticTextScanned->GetLabel() != scannedObjTmp) //avoid screen flicker + const wxString scannedObjTmp = globalFunctions::numberToWxString(scannedObjects); + if (m_staticTextScanned->GetLabel() != scannedObjTmp && (screenChanged = true)) //avoid screen flicker m_staticTextScanned->SetLabel(scannedObjTmp); //progress indicator for "compare file content" m_gauge2->SetValue(int(processedCmpData * scalingFactorCmp)); //remaining files left for file comparison - const wxString filesToCompareTmp = numberToWxString(totalCmpObjects - processedCmpObjects); - if (m_staticTextFilesToCompare->GetLabel() != filesToCompareTmp) //avoid screen flicker + const wxString filesToCompareTmp = globalFunctions::numberToWxString(totalCmpObjects - processedCmpObjects); + if (m_staticTextFilesToCompare->GetLabel() != filesToCompareTmp && (screenChanged = true)) //avoid screen flicker m_staticTextFilesToCompare->SetLabel(filesToCompareTmp); //remaining bytes left for file comparison const wxString remainingBytesTmp = FreeFileSync::formatFilesizeToShortString(totalCmpData - processedCmpData); - if (m_staticTextDataToCompare->GetLabel() != remainingBytesTmp) //avoid screen flicker + if (m_staticTextDataToCompare->GetLabel() != remainingBytesTmp && (screenChanged = true)) //avoid screen flicker m_staticTextDataToCompare->SetLabel(remainingBytesTmp); /* @@ -798,10 +874,12 @@ void CompareStatus::updateStatusPanelNow() //time elapsed const wxString timeElapsedTmp = (wxTimeSpan::Milliseconds(timeElapsed.Time())).Format(); - if (m_staticTextTimeElapsed->GetLabel() != timeElapsedTmp) //avoid screen flicker + if (m_staticTextTimeElapsed->GetLabel() != timeElapsedTmp && (screenChanged = true)) //avoid screen flicker m_staticTextTimeElapsed->SetLabel(timeElapsedTmp); //do the ui update - bSizer42->Layout(); + if (screenChanged) + bSizer42->Layout(); + updateUiNow(); } diff --git a/ui/SmallDialogs.h b/ui/SmallDialogs.h index 7efb4dbe..c75a1b9a 100644 --- a/ui/SmallDialogs.h +++ b/ui/SmallDialogs.h @@ -74,23 +74,48 @@ private: class ErrorDlg : public ErrorDlgGenerated { public: - ErrorDlg(const wxString messageText, bool& continueError); + ErrorDlg(wxWindow* parentWindow, const wxString messageText, bool& ignoreNextErrors, int dummy); ~ErrorDlg(); enum { - BUTTON_CONTINUE, + BUTTON_IGNORE, BUTTON_RETRY, BUTTON_ABORT }; private: void OnClose(wxCloseEvent& event); - void OnContinue(wxCommandEvent& event); + void OnIgnore(wxCommandEvent& event); void OnRetry(wxCommandEvent& event); void OnAbort(wxCommandEvent& event); - bool& continueOnError; + bool& ignoreErrors; +}; + + +class WarningDlg : public WarningDlgGenerated +{ +public: + WarningDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool& dontShowAgain); + ~WarningDlg(); + + enum + { + BUTTON_IGNORE = 1, + BUTTON_RESOLVE = 2, + BUTTON_ABORT = 4, + BUTTON_OKAY = 8 + }; + +private: + void OnClose(wxCloseEvent& event); + void OnIgnore(wxCommandEvent& event); + void OnResolve(wxCommandEvent& event); + void OnAbort(wxCommandEvent& event); + void OnOkay(wxCommandEvent& event); + + bool& dontShowAgain; }; @@ -100,6 +125,11 @@ public: ModifyFilesDlg(wxWindow* window, const wxString& parentDirectory, const int timeShift); ~ModifyFilesDlg(); + enum + { + BUTTON_APPLY = 10 + }; + private: void OnApply(wxCommandEvent& event); void OnCancel(wxCommandEvent& event); diff --git a/ui/SyncDialog.cpp b/ui/SyncDialog.cpp index 7a1d4602..a26931fe 100644 --- a/ui/SyncDialog.cpp +++ b/ui/SyncDialog.cpp @@ -5,6 +5,8 @@ #include <wx/msgdlg.h> #include <wx/stdpaths.h> #include <wx/ffile.h> +#include "../synchronization.h" +#include "../algorithm.h" using namespace std; using namespace xmlAccess; @@ -21,7 +23,7 @@ SyncDialog::SyncDialog(wxWindow* window, //make working copy of mainDialog.cfg.syncConfiguration and recycler setting localSyncConfiguration = config.syncConfiguration; m_checkBoxUseRecycler->SetValue(cfg.useRecycleBin); - m_checkBoxContinueError->SetValue(cfg.continueOnError); + m_checkBoxIgnoreErrors->SetValue(cfg.ignoreErrors); //set sync config icons updateConfigIcons(m_bpButton5, m_bpButton6, m_bpButton7, m_bpButton8, m_bpButton9, localSyncConfiguration); @@ -54,9 +56,16 @@ SyncDialog::SyncDialog(wxWindow* window, m_radioBtn1->SetValue(true); //one way -> else if (localSyncConfiguration.exLeftSideOnly == SyncConfiguration::SYNC_DIR_RIGHT && - localSyncConfiguration.exRightSideOnly == SyncConfiguration::SYNC_DIR_LEFT && + localSyncConfiguration.exRightSideOnly == SyncConfiguration::SYNC_DIR_NONE && localSyncConfiguration.leftNewer == SyncConfiguration::SYNC_DIR_RIGHT && - localSyncConfiguration.rightNewer == SyncConfiguration::SYNC_DIR_LEFT && + localSyncConfiguration.rightNewer == SyncConfiguration::SYNC_DIR_NONE && + localSyncConfiguration.different == SyncConfiguration::SYNC_DIR_NONE) + m_radioBtnUpdate->SetValue(true); //Update -> + + else if (localSyncConfiguration.exLeftSideOnly == SyncConfiguration::SYNC_DIR_RIGHT && + localSyncConfiguration.exRightSideOnly == SyncConfiguration::SYNC_DIR_LEFT && + localSyncConfiguration.leftNewer == SyncConfiguration::SYNC_DIR_RIGHT && + localSyncConfiguration.rightNewer == SyncConfiguration::SYNC_DIR_LEFT && localSyncConfiguration.different == SyncConfiguration::SYNC_DIR_NONE) m_radioBtn2->SetValue(true); //two way <-> @@ -226,7 +235,7 @@ void SyncDialog::OnBack(wxCommandEvent& event) //write configuration to main dialog cfg.syncConfiguration = localSyncConfiguration; cfg.useRecycleBin = m_checkBoxUseRecycler->GetValue(); - cfg.continueOnError = m_checkBoxContinueError->GetValue(); + cfg.ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); EndModal(0); } @@ -236,9 +245,9 @@ void SyncDialog::OnStartSync(wxCommandEvent& event) //write configuration to main dialog cfg.syncConfiguration = localSyncConfiguration; cfg.useRecycleBin = m_checkBoxUseRecycler->GetValue(); - cfg.continueOnError = m_checkBoxContinueError->GetValue(); + cfg.ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); - EndModal(StartSynchronizationProcess); + EndModal(BUTTON_START); } @@ -271,6 +280,22 @@ void SyncDialog::OnSyncLeftToRight(wxCommandEvent& event) } +void SyncDialog::OnSyncUpdate(wxCommandEvent& event) +{ + localSyncConfiguration.exLeftSideOnly = SyncConfiguration::SYNC_DIR_RIGHT; + localSyncConfiguration.exRightSideOnly = SyncConfiguration::SYNC_DIR_NONE; + localSyncConfiguration.leftNewer = SyncConfiguration::SYNC_DIR_RIGHT; + localSyncConfiguration.rightNewer = SyncConfiguration::SYNC_DIR_NONE; + localSyncConfiguration.different = SyncConfiguration::SYNC_DIR_NONE; + + updateConfigIcons(m_bpButton5, m_bpButton6, m_bpButton7, m_bpButton8, m_bpButton9, localSyncConfiguration); + calculatePreview(); + + //if event is triggered by button + m_radioBtnUpdate->SetValue(true); +} + + void SyncDialog::OnSyncBothSides(wxCommandEvent& event) { localSyncConfiguration.exLeftSideOnly = SyncConfiguration::SYNC_DIR_RIGHT; @@ -299,6 +324,7 @@ void toggleSyncDirection(SyncConfiguration::Direction& current) assert (false); } + void SyncDialog::OnExLeftSideOnly( wxCommandEvent& event ) { toggleSyncDirection(localSyncConfiguration.exLeftSideOnly); @@ -308,6 +334,7 @@ void SyncDialog::OnExLeftSideOnly( wxCommandEvent& event ) m_radioBtn3->SetValue(true); } + void SyncDialog::OnExRightSideOnly( wxCommandEvent& event ) { toggleSyncDirection(localSyncConfiguration.exRightSideOnly); @@ -317,6 +344,7 @@ void SyncDialog::OnExRightSideOnly( wxCommandEvent& event ) m_radioBtn3->SetValue(true); } + void SyncDialog::OnLeftNewer( wxCommandEvent& event ) { toggleSyncDirection(localSyncConfiguration.leftNewer); @@ -326,6 +354,7 @@ void SyncDialog::OnLeftNewer( wxCommandEvent& event ) m_radioBtn3->SetValue(true); } + void SyncDialog::OnRightNewer( wxCommandEvent& event ) { toggleSyncDirection(localSyncConfiguration.rightNewer); @@ -335,6 +364,7 @@ void SyncDialog::OnRightNewer( wxCommandEvent& event ) m_radioBtn3->SetValue(true); } + void SyncDialog::OnDifferent( wxCommandEvent& event ) { toggleSyncDirection(localSyncConfiguration.different); @@ -343,7 +373,6 @@ void SyncDialog::OnDifferent( wxCommandEvent& event ) //set custom config button m_radioBtn3->SetValue(true); } - //################################################################################################################################### @@ -357,7 +386,7 @@ BatchDialog::BatchDialog(wxWindow* window, SyncDialog::updateConfigIcons(m_bpButton5, m_bpButton6, m_bpButton7, m_bpButton8, m_bpButton9, localSyncConfiguration); m_checkBoxUseRecycler->SetValue(config.useRecycleBin); - m_checkBoxContinueError->SetValue(config.continueOnError); + m_checkBoxIgnoreErrors->SetValue(config.ignoreErrors); switch (config.compareVar) { @@ -388,7 +417,7 @@ BatchDialog::BatchDialog(wxWindow* window, newPair->m_directoryLeft->SetValue(i->leftDirectory); newPair->m_directoryRight->SetValue(i->rightDirectory); - bSizerFolderPairs->Insert(0, newPair, 0, wxEXPAND, 5); + bSizerFolderPairs->Add( newPair, 0, wxEXPAND, 5); localFolderPairs.push_back(newPair); if (i == folderPairs.begin()) @@ -410,12 +439,14 @@ BatchDialog::BatchDialog(wxWindow* window, m_bitmap17->SetBitmap(*globalResource.bitmapDifferent); m_bitmap8->SetBitmap(*globalResource.bitmapInclude); m_bitmap9->SetBitmap(*globalResource.bitmapExclude); + m_bitmap27->SetBitmap(*globalResource.bitmapBatch); Fit(); Centre(); m_buttonCreate->SetFocus(); } + BatchDialog::~BatchDialog() {} @@ -563,7 +594,7 @@ bool BatchDialog::createBatchFile(const wxString& filename) batchCfg.mainCfg.includeFilter = m_textCtrlInclude->GetValue(); batchCfg.mainCfg.excludeFilter = m_textCtrlExclude->GetValue(); batchCfg.mainCfg.useRecycleBin = m_checkBoxUseRecycler->GetValue(); - batchCfg.mainCfg.continueOnError = m_checkBoxContinueError->GetValue(); + batchCfg.mainCfg.ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); for (unsigned int i = 0; i < localFolderPairs.size(); ++i) { diff --git a/ui/SyncDialog.h b/ui/SyncDialog.h index de00539e..036e9b6f 100644 --- a/ui/SyncDialog.h +++ b/ui/SyncDialog.h @@ -4,6 +4,9 @@ #include "../FreeFileSync.h" #include "guiGenerated.h" +using namespace FreeFileSync; + + class SyncDialog: public SyncDlgGenerated { public: @@ -14,7 +17,10 @@ public: ~SyncDialog(); - static const int StartSynchronizationProcess = 15; + enum + { + BUTTON_START = 15 + }; static void updateConfigIcons(wxBitmapButton* button1, wxBitmapButton* button2, @@ -29,6 +35,7 @@ private: void calculatePreview(); void OnSyncLeftToRight( wxCommandEvent& event); + void OnSyncUpdate( wxCommandEvent& event); void OnSyncBothSides( wxCommandEvent& event); void OnExLeftSideOnly( wxCommandEvent& event); diff --git a/ui/guiGenerated.cpp b/ui/guiGenerated.cpp index e78dc2e9..9daaecb4 100644 --- a/ui/guiGenerated.cpp +++ b/ui/guiGenerated.cpp @@ -13,692 +13,761 @@ GuiGenerated::GuiGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - m_menubar1 = new wxMenuBar( 0 ); - m_menu1 = new wxMenu(); - wxMenuItem* m_menuItem10; - m_menuItem10 = new wxMenuItem( m_menu1, wxID_ANY, wxString( _("1. &Compare") ) + wxT('\t') + wxT("ALT-C"), wxEmptyString, wxITEM_NORMAL ); - m_menu1->Append( m_menuItem10 ); - - wxMenuItem* m_menuItem11; - m_menuItem11 = new wxMenuItem( m_menu1, wxID_ANY, wxString( _("2. &Synchronize...") ) + wxT('\t') + wxT("ALT-S"), wxEmptyString, wxITEM_NORMAL ); - m_menu1->Append( m_menuItem11 ); - - m_menu1->AppendSeparator(); - - wxMenuItem* m_menuItem4; - m_menuItem4 = new wxMenuItem( m_menu1, wxID_EXIT, wxString( _("&Quit") ) + wxT('\t') + wxT("CTRL-Q"), wxEmptyString, wxITEM_NORMAL ); - m_menu1->Append( m_menuItem4 ); - - m_menubar1->Append( m_menu1, _("&File") ); - - m_menu3 = new wxMenu(); - m_menu31 = new wxMenu(); - m_menuItemGerman = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Deutsch") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemGerman ); - - m_menuItemEnglish = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("English") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemEnglish ); - - m_menuItemFrench = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Français") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemFrench ); - - m_menuItemDutch = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Nederlands") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemDutch ); - - m_menuItemJapanese = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("日本語") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemJapanese ); - - m_menu3->Append( -1, _("&Language"), m_menu31 ); - - m_menu3->AppendSeparator(); - - wxMenuItem* m_menuItem9; - m_menuItem9 = new wxMenuItem( m_menu3, wxID_ANY, wxString( _("&Adjust file times") ) , wxEmptyString, wxITEM_NORMAL ); - m_menu3->Append( m_menuItem9 ); - - wxMenuItem* m_menuItem7; - m_menuItem7 = new wxMenuItem( m_menu3, wxID_ANY, wxString( _("&Create batch job") ) , wxEmptyString, wxITEM_NORMAL ); - m_menu3->Append( m_menuItem7 ); - - wxMenuItem* m_menuItem5; - m_menuItem5 = new wxMenuItem( m_menu3, wxID_ANY, wxString( _("&Export file list") ) , wxEmptyString, wxITEM_NORMAL ); - m_menu3->Append( m_menuItem5 ); - - m_menubar1->Append( m_menu3, _("&Advanced") ); - - m_menu2 = new wxMenu(); - wxMenuItem* m_menuItem3; - m_menuItem3 = new wxMenuItem( m_menu2, wxID_ABOUT, wxString( _("&About...") ) + wxT('\t') + wxT("F1"), wxEmptyString, wxITEM_NORMAL ); - m_menu2->Append( m_menuItem3 ); - - m_menubar1->Append( m_menu2, _("&Help") ); - - this->SetMenuBar( m_menubar1 ); - - bSizer1 = new wxBoxSizer( wxVERTICAL ); - - m_panel71 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); - m_panel71->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_APPWORKSPACE ) ); - - bSizer6 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer6->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer30; - bSizer30 = new wxBoxSizer( wxHORIZONTAL ); - - m_bpButtonCompare = new wxBitmapButton( m_panel71, wxID_OK, wxNullBitmap, wxDefaultPosition, wxSize( 190,37 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); - m_bpButtonCompare->SetDefault(); - m_bpButtonCompare->SetToolTip( _("Compare both sides") ); - - m_bpButtonCompare->SetToolTip( _("Compare both sides") ); - - bSizer30->Add( m_bpButtonCompare, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonAbort = new wxButton( m_panel71, wxID_CANCEL, _("Abort"), wxDefaultPosition, wxSize( 190,37 ), 0 ); - m_buttonAbort->SetFont( wxFont( 14, 74, 90, 92, false, wxT("Tahoma") ) ); - m_buttonAbort->Enable( false ); - m_buttonAbort->Hide(); - - bSizer30->Add( m_buttonAbort, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); - - bSizer6->Add( bSizer30, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer55; - bSizer55 = new wxBoxSizer( wxVERTICAL ); - - wxStaticBoxSizer* sbSizer6; - sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( m_panel71, wxID_ANY, _("Compare by...") ), wxHORIZONTAL ); - - wxBoxSizer* bSizer45; - bSizer45 = new wxBoxSizer( wxVERTICAL ); - - m_radioBtnSizeDate = new wxRadioButton( m_panel71, wxID_ANY, _("File size and date"), wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnSizeDate->SetValue( true ); - m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same.") ); - - bSizer45->Add( m_radioBtnSizeDate, 0, 0, 5 ); - - m_radioBtnContent = new wxRadioButton( m_panel71, wxID_ANY, _("File content"), wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnContent->SetToolTip( _("Files are found equal if\n - file content\nis the same.") ); - - bSizer45->Add( m_radioBtnContent, 0, wxTOP, 5 ); - - sbSizer6->Add( bSizer45, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton14 = new wxBitmapButton( m_panel71, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - m_bpButton14->SetToolTip( _("Help") ); - - m_bpButton14->SetToolTip( _("Help") ); - - sbSizer6->Add( m_bpButton14, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - bSizer55->Add( sbSizer6, 0, wxALIGN_CENTER_VERTICAL, 2 ); - - - bSizer55->Add( 0, 4, 0, 0, 5 ); - - bSizer6->Add( bSizer55, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer6->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer56; - bSizer56 = new wxBoxSizer( wxVERTICAL ); - - wxStaticBoxSizer* sbSizer9; - sbSizer9 = new wxStaticBoxSizer( new wxStaticBox( m_panel71, wxID_ANY, _("Filter files") ), wxHORIZONTAL ); - - m_bpButtonFilter = new wxBitmapButton( m_panel71, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); - sbSizer9->Add( m_bpButtonFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - wxBoxSizer* bSizer23; - bSizer23 = new wxBoxSizer( wxVERTICAL ); - - m_hyperlinkCfgFilter = new wxHyperlinkCtrl( m_panel71, wxID_ANY, _("Configure filter..."), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - - m_hyperlinkCfgFilter->SetNormalColour( wxColour( 0, 0, 255 ) ); - m_hyperlinkCfgFilter->SetVisitedColour( wxColour( 0, 0, 255 ) ); - m_hyperlinkCfgFilter->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_APPWORKSPACE ) ); - - bSizer23->Add( m_hyperlinkCfgFilter, 0, wxALL, 5 ); - - m_checkBoxHideFilt = new wxCheckBox( m_panel71, wxID_ANY, _("Hide filtered items"), wxDefaultPosition, wxDefaultSize, 0 ); - - m_checkBoxHideFilt->SetToolTip( _("Choose to hide filtered files/directories from list") ); - - bSizer23->Add( m_checkBoxHideFilt, 0, 0, 5 ); - - sbSizer9->Add( bSizer23, 0, 0, 5 ); - - bSizer56->Add( sbSizer9, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer56->Add( 0, 4, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer6->Add( bSizer56, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonSync = new wxBitmapButton( m_panel71, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 190,37 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); - m_bpButtonSync->SetToolTip( _("Open synchronization dialog") ); - - m_bpButtonSync->SetToolTip( _("Open synchronization dialog") ); - - bSizer6->Add( m_bpButtonSync, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - - bSizer6->Add( 15, 0, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - m_panel71->SetSizer( bSizer6 ); - m_panel71->Layout(); - bSizer6->Fit( m_panel71 ); - bSizer1->Add( m_panel71, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_scrolledWindowFolderPairs = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxHSCROLL|wxVSCROLL ); - m_scrolledWindowFolderPairs->SetScrollRate( 5, 5 ); - m_scrolledWindowFolderPairs->SetMinSize( wxSize( -1,0 ) ); - - bSizerFolderPairs = new wxBoxSizer( wxVERTICAL ); - - m_scrolledWindowFolderPairs->SetSizer( bSizerFolderPairs ); - m_scrolledWindowFolderPairs->Layout(); - bSizerFolderPairs->Fit( m_scrolledWindowFolderPairs ); - bSizer1->Add( m_scrolledWindowFolderPairs, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - wxBoxSizer* bSizer2; - bSizer2 = new wxBoxSizer( wxHORIZONTAL ); - - m_panel1 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer7; - bSizer7 = new wxBoxSizer( wxVERTICAL ); - - sbSizer2 = new wxStaticBoxSizer( new wxStaticBox( m_panel1, wxID_ANY, _("Drag && drop") ), wxHORIZONTAL ); - - m_directoryLeft = new wxTextCtrl( m_panel1, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - sbSizer2->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_dirPicker1 = new wxDirPickerCtrl( m_panel1, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DIR_MUST_EXIST ); - sbSizer2->Add( m_dirPicker1, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer7->Add( sbSizer2, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); - - m_grid1 = new CustomGrid( m_panel1, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - - // Grid - m_grid1->CreateGrid( 15, 4 ); - m_grid1->EnableEditing( false ); - m_grid1->EnableGridLines( true ); - m_grid1->EnableDragGridSize( true ); - m_grid1->SetMargins( 0, 0 ); - - // Columns - m_grid1->SetColSize( 0, 138 ); - m_grid1->SetColSize( 1, 118 ); - m_grid1->SetColSize( 2, 67 ); - m_grid1->SetColSize( 3, 113 ); - m_grid1->EnableDragColMove( false ); - m_grid1->EnableDragColSize( true ); - m_grid1->SetColLabelSize( 20 ); - m_grid1->SetColLabelValue( 0, _("Filename") ); - m_grid1->SetColLabelValue( 1, _("Relative path") ); - m_grid1->SetColLabelValue( 2, _("Size") ); - m_grid1->SetColLabelValue( 3, _("Date") ); - m_grid1->SetColLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); - - // Rows - m_grid1->EnableDragRowSize( false ); - m_grid1->SetRowLabelSize( 38 ); - m_grid1->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); - - // Label Appearance - - // Cell Defaults - m_grid1->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); - bSizer7->Add( m_grid1, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 ); - - m_panel1->SetSizer( bSizer7 ); - m_panel1->Layout(); - bSizer7->Fit( m_panel1 ); - bSizer2->Add( m_panel1, 1, wxEXPAND, 5 ); - - m_panel3 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - bSizer18 = new wxBoxSizer( wxVERTICAL ); - - bSizer69 = new wxBoxSizer( wxVERTICAL ); - - m_bpButtonSwap = new wxBitmapButton( m_panel3, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - m_bpButtonSwap->SetToolTip( _("Swap sides") ); - - m_bpButtonSwap->SetToolTip( _("Swap sides") ); - - bSizer69->Add( m_bpButtonSwap, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 ); - - bSizer18->Add( bSizer69, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_grid3 = new CustomGrid( m_panel3, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - - // Grid - m_grid3->CreateGrid( 15, 1 ); - m_grid3->EnableEditing( false ); - m_grid3->EnableGridLines( true ); - m_grid3->EnableDragGridSize( false ); - m_grid3->SetMargins( 0, 0 ); - - // Columns - m_grid3->SetColSize( 0, 45 ); - m_grid3->EnableDragColMove( false ); - m_grid3->EnableDragColSize( false ); - m_grid3->SetColLabelSize( 20 ); - m_grid3->SetColLabelValue( 0, _("Filter") ); - m_grid3->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); - - // Rows - m_grid3->EnableDragRowSize( false ); - m_grid3->SetRowLabelSize( 0 ); - m_grid3->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); - - // Label Appearance - - // Cell Defaults - m_grid3->SetDefaultCellFont( wxFont( 12, 74, 90, 92, false, wxT("Arial") ) ); - m_grid3->SetDefaultCellAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); - bSizer18->Add( m_grid3, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxBOTTOM, 5 ); - - m_panel3->SetSizer( bSizer18 ); - m_panel3->Layout(); - bSizer18->Fit( m_panel3 ); - bSizer2->Add( m_panel3, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); - - m_panel2 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer10; - bSizer10 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer77; - bSizer77 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer781; - bSizer781 = new wxBoxSizer( wxVERTICAL ); - - - bSizer781->Add( 0, 3, 0, 0, 5 ); - - m_bpButtonAddPair = new wxBitmapButton( m_panel2, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 18,21 ), wxBU_AUTODRAW ); - m_bpButtonAddPair->SetToolTip( _("Add folder pair") ); - - m_bpButtonAddPair->SetToolTip( _("Add folder pair") ); - - bSizer781->Add( m_bpButtonAddPair, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonRemovePair = new wxBitmapButton( m_panel2, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 18,21 ), wxBU_AUTODRAW ); - m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); - - m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); - - bSizer781->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer77->Add( bSizer781, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - wxStaticBoxSizer* sbSizer3; - sbSizer3 = new wxStaticBoxSizer( new wxStaticBox( m_panel2, wxID_ANY, _("Drag && drop") ), wxHORIZONTAL ); - - m_directoryRight = new wxTextCtrl( m_panel2, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - sbSizer3->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_dirPicker2 = new wxDirPickerCtrl( m_panel2, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DIR_MUST_EXIST ); - sbSizer3->Add( m_dirPicker2, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer77->Add( sbSizer3, 1, wxRIGHT|wxLEFT, 5 ); - - bSizer10->Add( bSizer77, 0, wxEXPAND, 5 ); - - m_grid2 = new CustomGrid( m_panel2, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - - // Grid - m_grid2->CreateGrid( 15, 4 ); - m_grid2->EnableEditing( false ); - m_grid2->EnableGridLines( true ); - m_grid2->EnableDragGridSize( true ); - m_grid2->SetMargins( 0, 0 ); - - // Columns - m_grid2->SetColSize( 0, 138 ); - m_grid2->SetColSize( 1, 118 ); - m_grid2->SetColSize( 2, 67 ); - m_grid2->SetColSize( 3, 113 ); - m_grid2->EnableDragColMove( false ); - m_grid2->EnableDragColSize( true ); - m_grid2->SetColLabelSize( 20 ); - m_grid2->SetColLabelValue( 0, _("Filename") ); - m_grid2->SetColLabelValue( 1, _("Relative path") ); - m_grid2->SetColLabelValue( 2, _("Size") ); - m_grid2->SetColLabelValue( 3, _("Date") ); - m_grid2->SetColLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); - - // Rows - m_grid2->EnableDragRowSize( false ); - m_grid2->SetRowLabelSize( 38 ); - m_grid2->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); - - // Label Appearance - - // Cell Defaults - m_grid2->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); - bSizer10->Add( m_grid2, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 ); - - m_panel2->SetSizer( bSizer10 ); - m_panel2->Layout(); - bSizer10->Fit( m_panel2 ); - bSizer2->Add( m_panel2, 1, wxEXPAND, 5 ); - - bSizer1->Add( bSizer2, 1, wxEXPAND, 5 ); - - m_panel4 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - bSizer3 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer58; - bSizer58 = new wxBoxSizer( wxVERTICAL ); - - wxStaticBoxSizer* sbSizer16; - sbSizer16 = new wxStaticBoxSizer( new wxStaticBox( m_panel4, wxID_ANY, _("Configuration") ), wxHORIZONTAL ); - - m_bpButton201 = new wxBitmapButton( m_panel4, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - m_bpButton201->SetToolTip( _("Save current configuration to file") ); - - m_bpButton201->SetToolTip( _("Save current configuration to file") ); - - sbSizer16->Add( m_bpButton201, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - wxString m_choiceLoadChoices[] = { _("Load from file...") }; - int m_choiceLoadNChoices = sizeof( m_choiceLoadChoices ) / sizeof( wxString ); - m_choiceLoad = new wxChoice( m_panel4, wxID_ANY, wxDefaultPosition, wxSize( 140,-1 ), m_choiceLoadNChoices, m_choiceLoadChoices, 0 ); - m_choiceLoad->SetSelection( 0 ); - m_choiceLoad->SetToolTip( _("Load configuration via...\n - this list (press DEL to delete items)\n - drag & drop to this window\n - startup parameter") ); - - sbSizer16->Add( m_choiceLoad, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer58->Add( sbSizer16, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - - bSizer58->Add( 0, 4, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer3->Add( bSizer58, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panel12 = new wxPanel( m_panel4, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer64; - bSizer64 = new wxBoxSizer( wxVERTICAL ); - - wxStaticBoxSizer* sbSizer31; - sbSizer31 = new wxStaticBoxSizer( new wxStaticBox( m_panel12, wxID_ANY, _("Filter view") ), wxHORIZONTAL ); - - sbSizer31->SetMinSize( wxSize( 100,-1 ) ); - - sbSizer31->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_bpButtonLeftOnly = new wxBitmapButton( m_panel12, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - sbSizer31->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonLeftNewer = new wxBitmapButton( m_panel12, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - sbSizer31->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonEqual = new wxBitmapButton( m_panel12, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - sbSizer31->Add( m_bpButtonEqual, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonDifferent = new wxBitmapButton( m_panel12, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - sbSizer31->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonRightNewer = new wxBitmapButton( m_panel12, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - sbSizer31->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonRightOnly = new wxBitmapButton( m_panel12, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - sbSizer31->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - sbSizer31->Add( 0, 0, 1, wxEXPAND, 5 ); - - bSizer64->Add( sbSizer31, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_panel12->SetSizer( bSizer64 ); - m_panel12->Layout(); - bSizer64->Fit( m_panel12 ); - bSizer3->Add( m_panel12, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 4 ); - - wxBoxSizer* bSizer66; - bSizer66 = new wxBoxSizer( wxVERTICAL ); - - m_bpButton10 = new wxBitmapButton( m_panel4, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 50,50 ), wxBU_AUTODRAW ); - m_bpButton10->SetToolTip( _("Quit") ); - - m_bpButton10->SetToolTip( _("Quit") ); - - bSizer66->Add( m_bpButton10, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); - - bSizer3->Add( bSizer66, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panel4->SetSizer( bSizer3 ); - m_panel4->Layout(); - bSizer3->Fit( m_panel4 ); - bSizer1->Add( m_panel4, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_panel7 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer451; - bSizer451 = new wxBoxSizer( wxHORIZONTAL ); - - bSizer451->SetMinSize( wxSize( -1,22 ) ); - wxBoxSizer* bSizer53; - bSizer53 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextStatusLeft = new wxStaticText( m_panel7, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusLeft->Wrap( -1 ); - bSizer53->Add( m_staticTextStatusLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer451->Add( bSizer53, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticline9 = new wxStaticLine( m_panel7, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer451->Add( m_staticline9, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxEXPAND, 2 ); - - - bSizer451->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextStatusMiddle = new wxStaticText( m_panel7, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusMiddle->Wrap( -1 ); - bSizer451->Add( m_staticTextStatusMiddle, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer451->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticline10 = new wxStaticLine( m_panel7, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer451->Add( m_staticline10, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP, 2 ); - - wxBoxSizer* bSizer52; - bSizer52 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextStatusRight = new wxStaticText( m_panel7, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusRight->Wrap( -1 ); - bSizer52->Add( m_staticTextStatusRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer50; - bSizer50 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer50->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap15 = new wxStaticBitmap( m_panel7, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 10,10 ), 0 ); - bSizer50->Add( m_bitmap15, 0, wxALIGN_BOTTOM, 2 ); - - bSizer52->Add( bSizer50, 1, wxALIGN_BOTTOM|wxEXPAND, 5 ); - - bSizer451->Add( bSizer52, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - m_panel7->SetSizer( bSizer451 ); - m_panel7->Layout(); - bSizer451->Fit( m_panel7 ); - bSizer1->Add( m_panel7, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - this->SetSizer( bSizer1 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GuiGenerated::OnClose ) ); - this->Connect( m_menuItem10->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnCompare ) ); - this->Connect( m_menuItem11->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnSync ) ); - this->Connect( m_menuItem4->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuQuit ) ); - this->Connect( m_menuItemGerman->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangGerman ) ); - this->Connect( m_menuItemEnglish->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangEnglish ) ); - this->Connect( m_menuItemFrench->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangFrench ) ); - this->Connect( m_menuItemDutch->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangDutch ) ); - this->Connect( m_menuItemJapanese->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangJapanese ) ); - this->Connect( m_menuItem9->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuAdjustFileTimes ) ); - this->Connect( m_menuItem7->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuBatchJob ) ); - this->Connect( m_menuItem5->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuExportFileList ) ); - this->Connect( m_menuItem3->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuAbout ) ); - m_bpButtonCompare->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnCompare ), NULL, this ); - m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnAbortCompare ), NULL, this ); - m_radioBtnSizeDate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( GuiGenerated::OnCompareByTimeSize ), NULL, this ); - m_radioBtnContent->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( GuiGenerated::OnCompareByContent ), NULL, this ); - m_bpButton14->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnShowHelpDialog ), NULL, this ); - m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnFilterButton ), NULL, this ); - m_hyperlinkCfgFilter->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( GuiGenerated::OnConfigureFilter ), NULL, this ); - m_checkBoxHideFilt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( GuiGenerated::OnHideFilteredButton ), NULL, this ); - m_bpButtonSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnSync ), NULL, this ); - m_directoryLeft->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( GuiGenerated::OnWriteDirManually ), NULL, this ); - m_dirPicker1->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( GuiGenerated::OnDirSelected ), NULL, this ); - m_grid1->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( GuiGenerated::OnLeftGridDoubleClick ), NULL, this ); - m_grid1->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( GuiGenerated::OnOpenContextMenu ), NULL, this ); - m_grid1->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( GuiGenerated::OnSortLeftGrid ), NULL, this ); - m_bpButtonSwap->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnSwapDirs ), NULL, this ); - m_grid3->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( GuiGenerated::OnOpenContextMenu ), NULL, this ); - m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnAddFolderPair ), NULL, this ); - m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnRemoveFolderPair ), NULL, this ); - m_directoryRight->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( GuiGenerated::OnWriteDirManually ), NULL, this ); - m_dirPicker2->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( GuiGenerated::OnDirSelected ), NULL, this ); - m_grid2->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( GuiGenerated::OnRightGridDoubleClick ), NULL, this ); - m_grid2->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( GuiGenerated::OnOpenContextMenu ), NULL, this ); - m_grid2->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( GuiGenerated::OnSortRightGrid ), NULL, this ); - m_bpButton201->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnSaveConfig ), NULL, this ); - m_choiceLoad->Connect( wxEVT_CHAR, wxKeyEventHandler( GuiGenerated::OnChoiceKeyEvent ), NULL, this ); - m_choiceLoad->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( GuiGenerated::OnLoadConfiguration ), NULL, this ); - m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnLeftOnlyFiles ), NULL, this ); - m_bpButtonLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnLeftNewerFiles ), NULL, this ); - m_bpButtonEqual->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnEqualFiles ), NULL, this ); - m_bpButtonDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnDifferentFiles ), NULL, this ); - m_bpButtonRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnRightNewerFiles ), NULL, this ); - m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnRightOnlyFiles ), NULL, this ); - m_bpButton10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnQuit ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + m_menubar1 = new wxMenuBar( 0 ); + m_menu1 = new wxMenu(); + m_menuItem10 = new wxMenuItem( m_menu1, wxID_ANY, wxString( _("1. &Compare") ) + wxT('\t') + wxT("ALT-C"), wxEmptyString, wxITEM_NORMAL ); + m_menu1->Append( m_menuItem10 ); + + m_menuItem11 = new wxMenuItem( m_menu1, wxID_ANY, wxString( _("2. &Synchronize...") ) + wxT('\t') + wxT("ALT-S"), wxEmptyString, wxITEM_NORMAL ); + m_menu1->Append( m_menuItem11 ); + + m_menu1->AppendSeparator(); + + wxMenuItem* m_menuItem14; + m_menuItem14 = new wxMenuItem( m_menu1, wxID_ANY, wxString( _("S&ave configuration") ) + wxT('\t') + wxT("CTRL-S"), wxEmptyString, wxITEM_NORMAL ); + m_menu1->Append( m_menuItem14 ); + + wxMenuItem* m_menuItem13; + m_menuItem13 = new wxMenuItem( m_menu1, wxID_ANY, wxString( _("&Load configuration") ) + wxT('\t') + wxT("CTRL-L"), wxEmptyString, wxITEM_NORMAL ); + m_menu1->Append( m_menuItem13 ); + + m_menu1->AppendSeparator(); + + wxMenuItem* m_menuItem4; + m_menuItem4 = new wxMenuItem( m_menu1, wxID_EXIT, wxString( _("&Quit") ) + wxT('\t') + wxT("CTRL-Q"), wxEmptyString, wxITEM_NORMAL ); + m_menu1->Append( m_menuItem4 ); + + m_menubar1->Append( m_menu1, _("&File") ); + + m_menu3 = new wxMenu(); + m_menu31 = new wxMenu(); + m_menuItemGerman = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Deutsch") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemGerman ); + + m_menuItemEnglish = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("English") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemEnglish ); + + m_menuItemFrench = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Français") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemFrench ); + + m_menuItemDutch = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Nederlands") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemDutch ); + + m_menuItemJapanese = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("日本語") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemJapanese ); + + m_menu3->Append( -1, _("&Language"), m_menu31 ); + + m_menu3->AppendSeparator(); + + m_menuItem7 = new wxMenuItem( m_menu3, wxID_ANY, wxString( _("&Create batch job") ) , wxEmptyString, wxITEM_NORMAL ); + m_menu3->Append( m_menuItem7 ); + + m_menuItemAdjustTimes = new wxMenuItem( m_menu3, wxID_ANY, wxString( _("&Adjust file times") ) , wxEmptyString, wxITEM_NORMAL ); + m_menu3->Append( m_menuItemAdjustTimes ); + + wxMenuItem* m_menuItem5; + m_menuItem5 = new wxMenuItem( m_menu3, wxID_ANY, wxString( _("&Export file list") ) , wxEmptyString, wxITEM_NORMAL ); + m_menu3->Append( m_menuItem5 ); + + m_menubar1->Append( m_menu3, _("&Advanced") ); + + m_menu2 = new wxMenu(); + wxMenuItem* m_menuItem3; + m_menuItem3 = new wxMenuItem( m_menu2, wxID_ABOUT, wxString( _("&About...") ) + wxT('\t') + wxT("F1"), wxEmptyString, wxITEM_NORMAL ); + m_menu2->Append( m_menuItem3 ); + + m_menubar1->Append( m_menu2, _("&Help") ); + + this->SetMenuBar( m_menubar1 ); + + bSizer1 = new wxBoxSizer( wxVERTICAL ); + + m_panel71 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER|wxTAB_TRAVERSAL ); + bSizer6 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer6->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer30; + bSizer30 = new wxBoxSizer( wxHORIZONTAL ); + + m_bpButtonCompare = new wxBitmapButton( m_panel71, wxID_OK, wxNullBitmap, wxDefaultPosition, wxSize( 190,37 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); + m_bpButtonCompare->SetDefault(); + m_bpButtonCompare->SetToolTip( _("Compare both sides") ); + + m_bpButtonCompare->SetToolTip( _("Compare both sides") ); + + bSizer30->Add( m_bpButtonCompare, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonAbort = new wxButton( m_panel71, wxID_CANCEL, _("Abort"), wxDefaultPosition, wxSize( 190,37 ), 0 ); + m_buttonAbort->SetFont( wxFont( 14, 74, 90, 92, false, wxT("Tahoma") ) ); + m_buttonAbort->Enable( false ); + m_buttonAbort->Hide(); + + bSizer30->Add( m_buttonAbort, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); + + bSizer6->Add( bSizer30, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer55; + bSizer55 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* sbSizer6; + sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( m_panel71, wxID_ANY, _("Compare by...") ), wxHORIZONTAL ); + + wxBoxSizer* bSizer45; + bSizer45 = new wxBoxSizer( wxVERTICAL ); + + m_radioBtnSizeDate = new wxRadioButton( m_panel71, wxID_ANY, _("File size and date"), wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtnSizeDate->SetValue( true ); + m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same.") ); + + bSizer45->Add( m_radioBtnSizeDate, 0, 0, 5 ); + + m_radioBtnContent = new wxRadioButton( m_panel71, wxID_ANY, _("File content"), wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtnContent->SetToolTip( _("Files are found equal if\n - file content\nis the same.") ); + + bSizer45->Add( m_radioBtnContent, 0, wxTOP, 5 ); + + sbSizer6->Add( bSizer45, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton14 = new wxBitmapButton( m_panel71, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButton14->SetToolTip( _("Help") ); + + m_bpButton14->SetToolTip( _("Help") ); + + sbSizer6->Add( m_bpButton14, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + bSizer55->Add( sbSizer6, 0, wxALIGN_CENTER_VERTICAL, 2 ); + + + bSizer55->Add( 0, 4, 0, 0, 5 ); + + bSizer6->Add( bSizer55, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer6->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer56; + bSizer56 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* sbSizer9; + sbSizer9 = new wxStaticBoxSizer( new wxStaticBox( m_panel71, wxID_ANY, _("Filter files") ), wxHORIZONTAL ); + + m_bpButtonFilter = new wxBitmapButton( m_panel71, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); + sbSizer9->Add( m_bpButtonFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + wxBoxSizer* bSizer23; + bSizer23 = new wxBoxSizer( wxVERTICAL ); + + m_hyperlinkCfgFilter = new wxHyperlinkCtrl( m_panel71, wxID_ANY, _("Configure filter..."), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + + m_hyperlinkCfgFilter->SetNormalColour( wxColour( 0, 0, 255 ) ); + m_hyperlinkCfgFilter->SetVisitedColour( wxColour( 0, 0, 255 ) ); + bSizer23->Add( m_hyperlinkCfgFilter, 0, wxALL, 5 ); + + m_checkBoxHideFilt = new wxCheckBox( m_panel71, wxID_ANY, _("Hide filtered items"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_checkBoxHideFilt->SetToolTip( _("Choose to hide filtered files/directories from list") ); + + bSizer23->Add( m_checkBoxHideFilt, 0, 0, 5 ); + + sbSizer9->Add( bSizer23, 0, 0, 5 ); + + bSizer56->Add( sbSizer9, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer56->Add( 0, 4, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer6->Add( bSizer56, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonSync = new wxBitmapButton( m_panel71, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 190,37 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); + m_bpButtonSync->SetToolTip( _("Open synchronization dialog") ); + + m_bpButtonSync->SetToolTip( _("Open synchronization dialog") ); + + bSizer6->Add( m_bpButtonSync, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + + bSizer6->Add( 15, 0, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + m_panel71->SetSizer( bSizer6 ); + m_panel71->Layout(); + bSizer6->Fit( m_panel71 ); + bSizer1->Add( m_panel71, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + wxBoxSizer* bSizer91; + bSizer91 = new wxBoxSizer( wxHORIZONTAL ); + + m_panel11 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer92; + bSizer92 = new wxBoxSizer( wxVERTICAL ); + + sbSizer2 = new wxStaticBoxSizer( new wxStaticBox( m_panel11, wxID_ANY, _("Drag && drop") ), wxHORIZONTAL ); + + m_directoryLeft = new wxTextCtrl( m_panel11, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + sbSizer2->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_dirPickerLeft = new wxDirPickerCtrl( m_panel11, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DIR_MUST_EXIST ); + sbSizer2->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer92->Add( sbSizer2, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); + + m_panel11->SetSizer( bSizer92 ); + m_panel11->Layout(); + bSizer92->Fit( m_panel11 ); + bSizer91->Add( m_panel11, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panel13 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer93; + bSizer93 = new wxBoxSizer( wxVERTICAL ); + + + bSizer93->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizerMiddle = new wxBoxSizer( wxHORIZONTAL ); + + m_bpButtonSwap = new wxBitmapButton( m_panel13, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + m_bpButtonSwap->SetToolTip( _("Swap sides") ); + + m_bpButtonSwap->SetToolTip( _("Swap sides") ); + + bSizerMiddle->Add( m_bpButtonSwap, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer93->Add( bSizerMiddle, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + + bSizer93->Add( 0, 0, 0, 0, 5 ); + + m_panel13->SetSizer( bSizer93 ); + m_panel13->Layout(); + bSizer93->Fit( m_panel13 ); + bSizer91->Add( m_panel13, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_panel12 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer94; + bSizer94 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer77; + bSizer77 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer781; + bSizer781 = new wxBoxSizer( wxVERTICAL ); + + + bSizer781->Add( 0, 3, 0, 0, 5 ); + + m_bpButtonRemovePair = new wxBitmapButton( m_panel12, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 18,21 ), wxBU_AUTODRAW ); + m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); + + m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); + + bSizer781->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonAddPair = new wxBitmapButton( m_panel12, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 18,21 ), wxBU_AUTODRAW ); + m_bpButtonAddPair->SetToolTip( _("Add folder pair") ); + + m_bpButtonAddPair->SetToolTip( _("Add folder pair") ); + + bSizer781->Add( m_bpButtonAddPair, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer77->Add( bSizer781, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxStaticBoxSizer* sbSizer3; + sbSizer3 = new wxStaticBoxSizer( new wxStaticBox( m_panel12, wxID_ANY, _("Drag && drop") ), wxHORIZONTAL ); + + m_directoryRight = new wxTextCtrl( m_panel12, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + sbSizer3->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_dirPickerRight = new wxDirPickerCtrl( m_panel12, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DIR_MUST_EXIST ); + sbSizer3->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer77->Add( sbSizer3, 1, wxRIGHT|wxLEFT, 5 ); + + bSizer94->Add( bSizer77, 0, wxEXPAND, 5 ); + + m_panel12->SetSizer( bSizer94 ); + m_panel12->Layout(); + bSizer94->Fit( m_panel12 ); + bSizer91->Add( m_panel12, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer1->Add( bSizer91, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_scrolledWindowFolderPairs = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxHSCROLL|wxVSCROLL ); + m_scrolledWindowFolderPairs->SetScrollRate( 5, 5 ); + m_scrolledWindowFolderPairs->SetMinSize( wxSize( -1,0 ) ); + + bSizerFolderPairs = new wxBoxSizer( wxVERTICAL ); + + m_scrolledWindowFolderPairs->SetSizer( bSizerFolderPairs ); + m_scrolledWindowFolderPairs->Layout(); + bSizerFolderPairs->Fit( m_scrolledWindowFolderPairs ); + bSizer1->Add( m_scrolledWindowFolderPairs, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer2; + bSizer2 = new wxBoxSizer( wxHORIZONTAL ); + + m_panel1 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer7; + bSizer7 = new wxBoxSizer( wxVERTICAL ); + + m_gridLeft = new CustomGrid( m_panel1, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + + // Grid + m_gridLeft->CreateGrid( 15, 4 ); + m_gridLeft->EnableEditing( false ); + m_gridLeft->EnableGridLines( true ); + m_gridLeft->EnableDragGridSize( true ); + m_gridLeft->SetMargins( 0, 0 ); + + // Columns + m_gridLeft->SetColSize( 0, 138 ); + m_gridLeft->SetColSize( 1, 118 ); + m_gridLeft->SetColSize( 2, 67 ); + m_gridLeft->SetColSize( 3, 113 ); + m_gridLeft->EnableDragColMove( false ); + m_gridLeft->EnableDragColSize( true ); + m_gridLeft->SetColLabelSize( 20 ); + m_gridLeft->SetColLabelValue( 0, _("Filename") ); + m_gridLeft->SetColLabelValue( 1, _("Relative path") ); + m_gridLeft->SetColLabelValue( 2, _("Size") ); + m_gridLeft->SetColLabelValue( 3, _("Date") ); + m_gridLeft->SetColLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); + + // Rows + m_gridLeft->EnableDragRowSize( false ); + m_gridLeft->SetRowLabelSize( 38 ); + m_gridLeft->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Label Appearance + + // Cell Defaults + m_gridLeft->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); + bSizer7->Add( m_gridLeft, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 ); + + m_panel1->SetSizer( bSizer7 ); + m_panel1->Layout(); + bSizer7->Fit( m_panel1 ); + bSizer2->Add( m_panel1, 1, wxEXPAND, 5 ); + + m_panel3 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer18; + bSizer18 = new wxBoxSizer( wxVERTICAL ); + + m_gridMiddle = new CustomGrid( m_panel3, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + + // Grid + m_gridMiddle->CreateGrid( 15, 1 ); + m_gridMiddle->EnableEditing( false ); + m_gridMiddle->EnableGridLines( true ); + m_gridMiddle->EnableDragGridSize( false ); + m_gridMiddle->SetMargins( 0, 0 ); + + // Columns + m_gridMiddle->SetColSize( 0, 45 ); + m_gridMiddle->EnableDragColMove( false ); + m_gridMiddle->EnableDragColSize( false ); + m_gridMiddle->SetColLabelSize( 20 ); + m_gridMiddle->SetColLabelValue( 0, _("Filter") ); + m_gridMiddle->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Rows + m_gridMiddle->EnableDragRowSize( false ); + m_gridMiddle->SetRowLabelSize( 0 ); + m_gridMiddle->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Label Appearance + + // Cell Defaults + m_gridMiddle->SetDefaultCellFont( wxFont( 12, 74, 90, 92, false, wxT("Arial") ) ); + m_gridMiddle->SetDefaultCellAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + bSizer18->Add( m_gridMiddle, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxBOTTOM, 5 ); + + m_panel3->SetSizer( bSizer18 ); + m_panel3->Layout(); + bSizer18->Fit( m_panel3 ); + bSizer2->Add( m_panel3, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_panel2 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer10; + bSizer10 = new wxBoxSizer( wxVERTICAL ); + + m_gridRight = new CustomGrid( m_panel2, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + + // Grid + m_gridRight->CreateGrid( 15, 4 ); + m_gridRight->EnableEditing( false ); + m_gridRight->EnableGridLines( true ); + m_gridRight->EnableDragGridSize( true ); + m_gridRight->SetMargins( 0, 0 ); + + // Columns + m_gridRight->SetColSize( 0, 138 ); + m_gridRight->SetColSize( 1, 118 ); + m_gridRight->SetColSize( 2, 67 ); + m_gridRight->SetColSize( 3, 113 ); + m_gridRight->EnableDragColMove( false ); + m_gridRight->EnableDragColSize( true ); + m_gridRight->SetColLabelSize( 20 ); + m_gridRight->SetColLabelValue( 0, _("Filename") ); + m_gridRight->SetColLabelValue( 1, _("Relative path") ); + m_gridRight->SetColLabelValue( 2, _("Size") ); + m_gridRight->SetColLabelValue( 3, _("Date") ); + m_gridRight->SetColLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); + + // Rows + m_gridRight->EnableDragRowSize( false ); + m_gridRight->SetRowLabelSize( 38 ); + m_gridRight->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Label Appearance + + // Cell Defaults + m_gridRight->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); + bSizer10->Add( m_gridRight, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 ); + + m_panel2->SetSizer( bSizer10 ); + m_panel2->Layout(); + bSizer10->Fit( m_panel2 ); + bSizer2->Add( m_panel2, 1, wxEXPAND, 5 ); + + bSizer1->Add( bSizer2, 1, wxEXPAND, 5 ); + + wxPanel* m_panel4; + m_panel4 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + bSizer3 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer58; + bSizer58 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* sbSizer16; + sbSizer16 = new wxStaticBoxSizer( new wxStaticBox( m_panel4, wxID_ANY, _("Configuration") ), wxHORIZONTAL ); + + m_bpButton201 = new wxBitmapButton( m_panel4, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButton201->SetToolTip( _("Save current configuration to file") ); + + m_bpButton201->SetToolTip( _("Save current configuration to file") ); + + sbSizer16->Add( m_bpButton201, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + wxString m_choiceLoadChoices[] = { _("Load from file...") }; + int m_choiceLoadNChoices = sizeof( m_choiceLoadChoices ) / sizeof( wxString ); + m_choiceLoad = new wxChoice( m_panel4, wxID_ANY, wxDefaultPosition, wxSize( 140,-1 ), m_choiceLoadNChoices, m_choiceLoadChoices, 0 ); + m_choiceLoad->SetSelection( 0 ); + m_choiceLoad->SetToolTip( _("Load configuration via...\n - this list (press DEL to delete items)\n - drag & drop to this window\n - startup parameter") ); + + sbSizer16->Add( m_choiceLoad, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer58->Add( sbSizer16, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + + bSizer58->Add( 0, 4, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer3->Add( bSizer58, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panel112 = new wxPanel( m_panel4, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer64; + bSizer64 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* sbSizer31; + sbSizer31 = new wxStaticBoxSizer( new wxStaticBox( m_panel112, wxID_ANY, _("Filter view") ), wxHORIZONTAL ); + + sbSizer31->SetMinSize( wxSize( 100,-1 ) ); + + sbSizer31->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_bpButtonLeftOnly = new wxBitmapButton( m_panel112, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + sbSizer31->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonLeftNewer = new wxBitmapButton( m_panel112, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + sbSizer31->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonEqual = new wxBitmapButton( m_panel112, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + sbSizer31->Add( m_bpButtonEqual, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonDifferent = new wxBitmapButton( m_panel112, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + sbSizer31->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonRightNewer = new wxBitmapButton( m_panel112, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + sbSizer31->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonRightOnly = new wxBitmapButton( m_panel112, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + sbSizer31->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + sbSizer31->Add( 0, 0, 1, wxEXPAND, 5 ); + + bSizer64->Add( sbSizer31, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_panel112->SetSizer( bSizer64 ); + m_panel112->Layout(); + bSizer64->Fit( m_panel112 ); + bSizer3->Add( m_panel112, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 4 ); + + wxBoxSizer* bSizer66; + bSizer66 = new wxBoxSizer( wxVERTICAL ); + + m_bpButton10 = new wxBitmapButton( m_panel4, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 50,50 ), wxBU_AUTODRAW ); + m_bpButton10->SetToolTip( _("Quit") ); + + m_bpButton10->SetToolTip( _("Quit") ); + + bSizer66->Add( m_bpButton10, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); + + bSizer3->Add( bSizer66, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panel4->SetSizer( bSizer3 ); + m_panel4->Layout(); + bSizer3->Fit( m_panel4 ); + bSizer1->Add( m_panel4, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_panel7 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer451; + bSizer451 = new wxBoxSizer( wxHORIZONTAL ); + + bSizer451->SetMinSize( wxSize( -1,22 ) ); + wxBoxSizer* bSizer53; + bSizer53 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextStatusLeft = new wxStaticText( m_panel7, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusLeft->Wrap( -1 ); + bSizer53->Add( m_staticTextStatusLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer451->Add( bSizer53, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticline9 = new wxStaticLine( m_panel7, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer451->Add( m_staticline9, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxEXPAND, 2 ); + + + bSizer451->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextStatusMiddle = new wxStaticText( m_panel7, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusMiddle->Wrap( -1 ); + bSizer451->Add( m_staticTextStatusMiddle, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer451->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticline10 = new wxStaticLine( m_panel7, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer451->Add( m_staticline10, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP, 2 ); + + wxBoxSizer* bSizer52; + bSizer52 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextStatusRight = new wxStaticText( m_panel7, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusRight->Wrap( -1 ); + bSizer52->Add( m_staticTextStatusRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer50; + bSizer50 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer50->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap15 = new wxStaticBitmap( m_panel7, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 10,10 ), 0 ); + bSizer50->Add( m_bitmap15, 0, wxALIGN_BOTTOM, 2 ); + + bSizer52->Add( bSizer50, 1, wxALIGN_BOTTOM|wxEXPAND, 5 ); + + bSizer451->Add( bSizer52, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + m_panel7->SetSizer( bSizer451 ); + m_panel7->Layout(); + bSizer451->Fit( m_panel7 ); + bSizer1->Add( m_panel7, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + this->SetSizer( bSizer1 ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GuiGenerated::OnClose ) ); + this->Connect( m_menuItem10->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnCompare ) ); + this->Connect( m_menuItem11->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnSync ) ); + this->Connect( m_menuItem14->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuSaveConfig ) ); + this->Connect( m_menuItem13->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLoadConfig ) ); + this->Connect( m_menuItem4->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuQuit ) ); + this->Connect( m_menuItemGerman->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangGerman ) ); + this->Connect( m_menuItemEnglish->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangEnglish ) ); + this->Connect( m_menuItemFrench->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangFrench ) ); + this->Connect( m_menuItemDutch->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangDutch ) ); + this->Connect( m_menuItemJapanese->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangJapanese ) ); + this->Connect( m_menuItem7->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuBatchJob ) ); + this->Connect( m_menuItemAdjustTimes->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuAdjustFileTimes ) ); + this->Connect( m_menuItem5->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuExportFileList ) ); + this->Connect( m_menuItem3->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuAbout ) ); + m_bpButtonCompare->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnCompare ), NULL, this ); + m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnAbortCompare ), NULL, this ); + m_radioBtnSizeDate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( GuiGenerated::OnCompareByTimeSize ), NULL, this ); + m_radioBtnContent->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( GuiGenerated::OnCompareByContent ), NULL, this ); + m_bpButton14->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnShowHelpDialog ), NULL, this ); + m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnFilterButton ), NULL, this ); + m_hyperlinkCfgFilter->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( GuiGenerated::OnConfigureFilter ), NULL, this ); + m_checkBoxHideFilt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( GuiGenerated::OnHideFilteredButton ), NULL, this ); + m_bpButtonSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnSync ), NULL, this ); + m_directoryLeft->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( GuiGenerated::OnWriteDirManually ), NULL, this ); + m_dirPickerLeft->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( GuiGenerated::OnDirSelected ), NULL, this ); + m_bpButtonSwap->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnSwapDirs ), NULL, this ); + m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnRemoveFolderPair ), NULL, this ); + m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnAddFolderPair ), NULL, this ); + m_directoryRight->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( GuiGenerated::OnWriteDirManually ), NULL, this ); + m_dirPickerRight->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( GuiGenerated::OnDirSelected ), NULL, this ); + m_gridLeft->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( GuiGenerated::OnLeftGridDoubleClick ), NULL, this ); + m_gridLeft->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( GuiGenerated::OnOpenContextMenu ), NULL, this ); + m_gridLeft->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( GuiGenerated::OnSortLeftGrid ), NULL, this ); + m_gridMiddle->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( GuiGenerated::OnOpenContextMenu ), NULL, this ); + m_gridRight->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( GuiGenerated::OnRightGridDoubleClick ), NULL, this ); + m_gridRight->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( GuiGenerated::OnOpenContextMenu ), NULL, this ); + m_gridRight->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( GuiGenerated::OnSortRightGrid ), NULL, this ); + m_bpButton201->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnSaveConfig ), NULL, this ); + m_choiceLoad->Connect( wxEVT_CHAR, wxKeyEventHandler( GuiGenerated::OnChoiceKeyEvent ), NULL, this ); + m_choiceLoad->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( GuiGenerated::OnLoadConfig ), NULL, this ); + m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnLeftOnlyFiles ), NULL, this ); + m_bpButtonLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnLeftNewerFiles ), NULL, this ); + m_bpButtonEqual->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnEqualFiles ), NULL, this ); + m_bpButtonDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnDifferentFiles ), NULL, this ); + m_bpButtonRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnRightNewerFiles ), NULL, this ); + m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnRightOnlyFiles ), NULL, this ); + m_bpButton10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnQuit ), NULL, this ); } GuiGenerated::~GuiGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GuiGenerated::OnClose ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnCompare ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnSync ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuQuit ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangGerman ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangEnglish ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangFrench ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangDutch ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangJapanese ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuAdjustFileTimes ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuBatchJob ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuExportFileList ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuAbout ) ); - m_bpButtonCompare->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnCompare ), NULL, this ); - m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnAbortCompare ), NULL, this ); - m_radioBtnSizeDate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( GuiGenerated::OnCompareByTimeSize ), NULL, this ); - m_radioBtnContent->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( GuiGenerated::OnCompareByContent ), NULL, this ); - m_bpButton14->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnShowHelpDialog ), NULL, this ); - m_bpButtonFilter->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnFilterButton ), NULL, this ); - m_hyperlinkCfgFilter->Disconnect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( GuiGenerated::OnConfigureFilter ), NULL, this ); - m_checkBoxHideFilt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( GuiGenerated::OnHideFilteredButton ), NULL, this ); - m_bpButtonSync->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnSync ), NULL, this ); - m_directoryLeft->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( GuiGenerated::OnWriteDirManually ), NULL, this ); - m_dirPicker1->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( GuiGenerated::OnDirSelected ), NULL, this ); - m_grid1->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( GuiGenerated::OnLeftGridDoubleClick ), NULL, this ); - m_grid1->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( GuiGenerated::OnOpenContextMenu ), NULL, this ); - m_grid1->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( GuiGenerated::OnSortLeftGrid ), NULL, this ); - m_bpButtonSwap->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnSwapDirs ), NULL, this ); - m_grid3->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( GuiGenerated::OnOpenContextMenu ), NULL, this ); - m_bpButtonAddPair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnAddFolderPair ), NULL, this ); - m_bpButtonRemovePair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnRemoveFolderPair ), NULL, this ); - m_directoryRight->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( GuiGenerated::OnWriteDirManually ), NULL, this ); - m_dirPicker2->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( GuiGenerated::OnDirSelected ), NULL, this ); - m_grid2->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( GuiGenerated::OnRightGridDoubleClick ), NULL, this ); - m_grid2->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( GuiGenerated::OnOpenContextMenu ), NULL, this ); - m_grid2->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( GuiGenerated::OnSortRightGrid ), NULL, this ); - m_bpButton201->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnSaveConfig ), NULL, this ); - m_choiceLoad->Disconnect( wxEVT_CHAR, wxKeyEventHandler( GuiGenerated::OnChoiceKeyEvent ), NULL, this ); - m_choiceLoad->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( GuiGenerated::OnLoadConfiguration ), NULL, this ); - m_bpButtonLeftOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnLeftOnlyFiles ), NULL, this ); - m_bpButtonLeftNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnLeftNewerFiles ), NULL, this ); - m_bpButtonEqual->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnEqualFiles ), NULL, this ); - m_bpButtonDifferent->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnDifferentFiles ), NULL, this ); - m_bpButtonRightNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnRightNewerFiles ), NULL, this ); - m_bpButtonRightOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnRightOnlyFiles ), NULL, this ); - m_bpButton10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnQuit ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GuiGenerated::OnClose ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnCompare ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnSync ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuSaveConfig ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLoadConfig ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuQuit ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangGerman ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangEnglish ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangFrench ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangDutch ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangJapanese ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuBatchJob ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuAdjustFileTimes ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuExportFileList ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuAbout ) ); + m_bpButtonCompare->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnCompare ), NULL, this ); + m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnAbortCompare ), NULL, this ); + m_radioBtnSizeDate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( GuiGenerated::OnCompareByTimeSize ), NULL, this ); + m_radioBtnContent->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( GuiGenerated::OnCompareByContent ), NULL, this ); + m_bpButton14->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnShowHelpDialog ), NULL, this ); + m_bpButtonFilter->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnFilterButton ), NULL, this ); + m_hyperlinkCfgFilter->Disconnect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( GuiGenerated::OnConfigureFilter ), NULL, this ); + m_checkBoxHideFilt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( GuiGenerated::OnHideFilteredButton ), NULL, this ); + m_bpButtonSync->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnSync ), NULL, this ); + m_directoryLeft->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( GuiGenerated::OnWriteDirManually ), NULL, this ); + m_dirPickerLeft->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( GuiGenerated::OnDirSelected ), NULL, this ); + m_bpButtonSwap->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnSwapDirs ), NULL, this ); + m_bpButtonRemovePair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnRemoveFolderPair ), NULL, this ); + m_bpButtonAddPair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnAddFolderPair ), NULL, this ); + m_directoryRight->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( GuiGenerated::OnWriteDirManually ), NULL, this ); + m_dirPickerRight->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( GuiGenerated::OnDirSelected ), NULL, this ); + m_gridLeft->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( GuiGenerated::OnLeftGridDoubleClick ), NULL, this ); + m_gridLeft->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( GuiGenerated::OnOpenContextMenu ), NULL, this ); + m_gridLeft->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( GuiGenerated::OnSortLeftGrid ), NULL, this ); + m_gridMiddle->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( GuiGenerated::OnOpenContextMenu ), NULL, this ); + m_gridRight->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( GuiGenerated::OnRightGridDoubleClick ), NULL, this ); + m_gridRight->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( GuiGenerated::OnOpenContextMenu ), NULL, this ); + m_gridRight->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( GuiGenerated::OnSortRightGrid ), NULL, this ); + m_bpButton201->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnSaveConfig ), NULL, this ); + m_choiceLoad->Disconnect( wxEVT_CHAR, wxKeyEventHandler( GuiGenerated::OnChoiceKeyEvent ), NULL, this ); + m_choiceLoad->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( GuiGenerated::OnLoadConfig ), NULL, this ); + m_bpButtonLeftOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnLeftOnlyFiles ), NULL, this ); + m_bpButtonLeftNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnLeftNewerFiles ), NULL, this ); + m_bpButtonEqual->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnEqualFiles ), NULL, this ); + m_bpButtonDifferent->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnDifferentFiles ), NULL, this ); + m_bpButtonRightNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnRightNewerFiles ), NULL, this ); + m_bpButtonRightOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnRightOnlyFiles ), NULL, this ); + m_bpButton10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnQuit ), NULL, this ); } FolderPairGenerated::FolderPairGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) { - wxBoxSizer* bSizer74; - bSizer74 = new wxBoxSizer( wxHORIZONTAL ); - - m_panelLeft = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxStaticBoxSizer* sbSizer21; - sbSizer21 = new wxStaticBoxSizer( new wxStaticBox( m_panelLeft, wxID_ANY, _("Drag && drop") ), wxHORIZONTAL ); - - m_directoryLeft = new wxTextCtrl( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - sbSizer21->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_dirPickerLeft = new wxDirPickerCtrl( m_panelLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DIR_MUST_EXIST ); - sbSizer21->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelLeft->SetSizer( sbSizer21 ); - m_panelLeft->Layout(); - sbSizer21->Fit( m_panelLeft ); - bSizer74->Add( m_panelLeft, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - wxBoxSizer* bSizer78; - bSizer78 = new wxBoxSizer( wxVERTICAL ); - - - bSizer78->Add( 0, 12, 0, 0, 5 ); - - m_bitmap23 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 52,17 ), 0 ); - m_bitmap23->SetToolTip( _("Folder pair") ); - - bSizer78->Add( m_bitmap23, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer74->Add( bSizer78, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxStaticBoxSizer* sbSizer23; - sbSizer23 = new wxStaticBoxSizer( new wxStaticBox( m_panelRight, wxID_ANY, _("Drag && drop") ), wxHORIZONTAL ); - - m_directoryRight = new wxTextCtrl( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - sbSizer23->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_dirPickerRight = new wxDirPickerCtrl( m_panelRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DIR_MUST_EXIST ); - sbSizer23->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelRight->SetSizer( sbSizer23 ); - m_panelRight->Layout(); - sbSizer23->Fit( m_panelRight ); - bSizer74->Add( m_panelRight, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - this->SetSizer( bSizer74 ); - this->Layout(); - bSizer74->Fit( this ); + wxBoxSizer* bSizer74; + bSizer74 = new wxBoxSizer( wxHORIZONTAL ); + + m_panelLeft = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxStaticBoxSizer* sbSizer21; + sbSizer21 = new wxStaticBoxSizer( new wxStaticBox( m_panelLeft, wxID_ANY, _("Drag && drop") ), wxHORIZONTAL ); + + m_directoryLeft = new wxTextCtrl( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + sbSizer21->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_dirPickerLeft = new wxDirPickerCtrl( m_panelLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DIR_MUST_EXIST ); + sbSizer21->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panelLeft->SetSizer( sbSizer21 ); + m_panelLeft->Layout(); + sbSizer21->Fit( m_panelLeft ); + bSizer74->Add( m_panelLeft, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + m_panel20 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel20->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_APPWORKSPACE ) ); + + wxBoxSizer* bSizer95; + bSizer95 = new wxBoxSizer( wxHORIZONTAL ); + + m_panel21 = new wxPanel( m_panel20, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel21->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + + wxBoxSizer* bSizer96; + bSizer96 = new wxBoxSizer( wxVERTICAL ); + + + bSizer96->Add( 0, 12, 1, 0, 5 ); + + + bSizer96->Add( 0, 12, 0, 0, 5 ); + + m_bitmap23 = new wxStaticBitmap( m_panel21, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,17 ), 0 ); + m_bitmap23->SetToolTip( _("Folder pair") ); + + bSizer96->Add( m_bitmap23, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer96->Add( 0, 0, 1, 0, 5 ); + + m_panel21->SetSizer( bSizer96 ); + m_panel21->Layout(); + bSizer96->Fit( m_panel21 ); + bSizer95->Add( m_panel21, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_panel20->SetSizer( bSizer95 ); + m_panel20->Layout(); + bSizer95->Fit( m_panel20 ); + bSizer74->Add( m_panel20, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxStaticBoxSizer* sbSizer23; + sbSizer23 = new wxStaticBoxSizer( new wxStaticBox( m_panelRight, wxID_ANY, _("Drag && drop") ), wxHORIZONTAL ); + + m_directoryRight = new wxTextCtrl( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + sbSizer23->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_dirPickerRight = new wxDirPickerCtrl( m_panelRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DIR_MUST_EXIST ); + sbSizer23->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panelRight->SetSizer( sbSizer23 ); + m_panelRight->Layout(); + sbSizer23->Fit( m_panelRight ); + bSizer74->Add( m_panelRight, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + this->SetSizer( bSizer74 ); + this->Layout(); + bSizer74->Fit( this ); } FolderPairGenerated::~FolderPairGenerated() @@ -707,468 +776,479 @@ FolderPairGenerated::~FolderPairGenerated() BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer54; - bSizer54 = new wxBoxSizer( wxVERTICAL ); - - bSizer69 = new wxBoxSizer( wxVERTICAL ); - - m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); - m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxVERTICAL ); - - m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Create a batch job"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText56->Wrap( -1 ); - m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer72->Add( m_staticText56, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_panel8->SetSizer( bSizer72 ); - m_panel8->Layout(); - bSizer72->Fit( m_panel8 ); - bSizer69->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer69->Add( 0, 5, 0, 0, 5 ); - - m_staticText54 = new wxStaticText( this, wxID_ANY, _("Assemble a batch file with the following settings. To start synchronization in batch mode simply execute this file or schedule it in your operating system's task planner."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText54->Wrap( 380 ); - m_staticText54->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxT("Tahoma") ) ); - - bSizer69->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - - - bSizer69->Add( 0, 5, 0, 0, 5 ); - - m_staticline10 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer69->Add( m_staticline10, 0, wxEXPAND|wxTOP, 5 ); - - m_staticText531 = new wxStaticText( this, wxID_ANY, _("Configuration overview:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText531->Wrap( -1 ); - m_staticText531->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Arial Black") ) ); - - bSizer69->Add( m_staticText531, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_scrolledWindow6 = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); - m_scrolledWindow6->SetScrollRate( 5, 5 ); - bSizerFolderPairs = new wxBoxSizer( wxVERTICAL ); - - m_scrolledWindow6->SetSizer( bSizerFolderPairs ); - m_scrolledWindow6->Layout(); - bSizerFolderPairs->Fit( m_scrolledWindow6 ); - bSizer69->Add( m_scrolledWindow6, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - - wxBoxSizer* bSizer67; - bSizer67 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer57; - bSizer57 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer71; - bSizer71 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer721; - bSizer721 = new wxBoxSizer( wxVERTICAL ); - - wxStaticBoxSizer* sbSizer6; - sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Compare by...") ), wxVERTICAL ); - - m_radioBtnSizeDate = new wxRadioButton( this, wxID_ANY, _("File size and date"), wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnSizeDate->SetValue( true ); - m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same.") ); - - sbSizer6->Add( m_radioBtnSizeDate, 0, 0, 5 ); - - m_radioBtnContent = new wxRadioButton( this, wxID_ANY, _("File content"), wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnContent->SetToolTip( _("Files are found equal if\n - file content\nis the same.") ); - - sbSizer6->Add( m_radioBtnContent, 0, wxTOP, 5 ); - - bSizer721->Add( sbSizer6, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer721->Add( 0, 10, 1, 0, 5 ); - - wxBoxSizer* bSizer38; - bSizer38 = new wxBoxSizer( wxVERTICAL ); - - m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("Use Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); - - m_checkBoxUseRecycler->SetToolTip( _("Use Recycle Bin when deleting or overwriting files during synchronization") ); - - bSizer38->Add( m_checkBoxUseRecycler, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_checkBoxContinueError = new wxCheckBox( this, wxID_ANY, _("Continue on error"), wxDefaultPosition, wxDefaultSize, 0 ); - - m_checkBoxContinueError->SetToolTip( _("Hides error messages during synchronization:\nThey are collected and shown as a list at the end of the process") ); - - bSizer38->Add( m_checkBoxContinueError, 0, wxALL, 5 ); - - m_checkBoxSilent = new wxCheckBox( this, wxID_ANY, _("Silent mode"), wxDefaultPosition, wxDefaultSize, 0 ); - - m_checkBoxSilent->SetToolTip( _("Do not show graphical status and error messages but write to a logfile instead") ); - - bSizer38->Add( m_checkBoxSilent, 0, wxALL, 5 ); - - bSizer721->Add( bSizer38, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer721->Add( 0, 10, 1, 0, 5 ); - - bSizer71->Add( bSizer721, 0, wxEXPAND, 5 ); - - - bSizer71->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_bpButtonFilter = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); - bSizer71->Add( m_bpButtonFilter, 0, wxALIGN_BOTTOM|wxRIGHT, 5 ); - - bSizer57->Add( bSizer71, 0, wxEXPAND, 5 ); - - wxStaticBoxSizer* sbSizer8; - sbSizer8 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); - - wxBoxSizer* bSizer671; - bSizer671 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer681; - bSizer681 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap8 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); - bSizer681->Add( m_bitmap8, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_staticText15 = new wxStaticText( this, wxID_ANY, _("Include"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText15->Wrap( -1 ); - m_staticText15->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer681->Add( m_staticText15, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer671->Add( bSizer681, 1, wxEXPAND, 5 ); - - m_textCtrlInclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 250,-1 ), wxTE_MULTILINE ); - bSizer671->Add( m_textCtrlInclude, 0, wxALL|wxEXPAND, 5 ); - - sbSizer8->Add( bSizer671, 0, 0, 5 ); - - - sbSizer8->Add( 0, 10, 0, 0, 5 ); - - wxBoxSizer* bSizer691; - bSizer691 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer70; - bSizer70 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap9 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); - bSizer70->Add( m_bitmap9, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_staticText16 = new wxStaticText( this, wxID_ANY, _("Exclude"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText16->Wrap( -1 ); - m_staticText16->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer70->Add( m_staticText16, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - bSizer691->Add( bSizer70, 1, wxEXPAND, 5 ); - - m_textCtrlExclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 250,-1 ), wxTE_MULTILINE ); - bSizer691->Add( m_textCtrlExclude, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - sbSizer8->Add( bSizer691, 0, 0, 5 ); - - bSizer57->Add( sbSizer8, 0, 0, 5 ); - - bSizer67->Add( bSizer57, 0, 0, 5 ); - - - bSizer67->Add( 10, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxStaticBoxSizer* sbSizer61; - sbSizer61 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Configuration") ), wxVERTICAL ); - - wxGridSizer* gSizer3; - gSizer3 = new wxGridSizer( 1, 2, 0, 5 ); - - m_staticText211 = new wxStaticText( this, wxID_ANY, _("Result"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText211->Wrap( -1 ); - m_staticText211->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - - gSizer3->Add( m_staticText211, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText311 = new wxStaticText( this, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText311->Wrap( -1 ); - m_staticText311->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - - gSizer3->Add( m_staticText311, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer61->Add( gSizer3, 0, wxEXPAND, 5 ); - - m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - sbSizer61->Add( m_staticline3, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxBOTTOM, 5 ); - - wxGridSizer* gSizer1; - gSizer1 = new wxGridSizer( 5, 2, 0, 5 ); - - m_bitmap13 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap13->SetToolTip( _("Files/folders that exist on left side only") ); - - gSizer1->Add( m_bitmap13, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton5 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - gSizer1->Add( m_bpButton5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap14 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap14->SetToolTip( _("Files/folders that exist on right side only") ); - - gSizer1->Add( m_bitmap14, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton6 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - gSizer1->Add( m_bpButton6, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap15 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap15->SetToolTip( _("Files that exist on both sides, left one is newer") ); - - gSizer1->Add( m_bitmap15, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton7 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - gSizer1->Add( m_bpButton7, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap16 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap16->SetToolTip( _("Files that exist on both sides, right one is newer") ); - - gSizer1->Add( m_bitmap16, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton8 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - gSizer1->Add( m_bpButton8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap17 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap17->SetToolTip( _("dummy") ); - - gSizer1->Add( m_bitmap17, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton9 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - gSizer1->Add( m_bpButton9, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer61->Add( gSizer1, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - bSizer67->Add( sbSizer61, 0, 0, 5 ); - - bSizer69->Add( bSizer67, 0, wxALL, 5 ); - - m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer69->Add( m_staticline9, 0, wxTOP|wxBOTTOM|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - wxBoxSizer* bSizer68; - bSizer68 = new wxBoxSizer( wxHORIZONTAL ); - - m_button6 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button6->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer68->Add( m_button6, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonCreate = new wxButton( this, wxID_ANY, _("&Create"), wxDefaultPosition, wxSize( 120,35 ), 0 ); - m_buttonCreate->SetDefault(); - m_buttonCreate->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer68->Add( m_buttonCreate, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer69->Add( bSizer68, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer54->Add( bSizer69, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - - this->SetSizer( bSizer54 ); - this->Layout(); - bSizer54->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); - m_radioBtnSizeDate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeCompareVar ), NULL, this ); - m_radioBtnContent->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeCompareVar ), NULL, this ); - m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSelectRecycleBin ), NULL, this ); - m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnFilterButton ), NULL, this ); - m_bpButton5->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnExLeftSideOnly ), NULL, this ); - m_bpButton6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnExRightSideOnly ), NULL, this ); - m_bpButton7->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLeftNewer ), NULL, this ); - m_bpButton8->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnRightNewer ), NULL, this ); - m_bpButton9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnDifferent ), NULL, this ); - m_button6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); - m_buttonCreate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCreateBatchJob ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer54; + bSizer54 = new wxBoxSizer( wxVERTICAL ); + + bSizer69 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer87; + bSizer87 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap27 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); + bSizer87->Add( m_bitmap27, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); + m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); + + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxVERTICAL ); + + m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Create a batch job"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText56->Wrap( -1 ); + m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer72->Add( m_staticText56, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_panel8->SetSizer( bSizer72 ); + m_panel8->Layout(); + bSizer72->Fit( m_panel8 ); + bSizer87->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer87->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer69->Add( bSizer87, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer69->Add( 0, 5, 0, 0, 5 ); + + m_staticText54 = new wxStaticText( this, wxID_ANY, _("Assemble a batch file with the following settings. To start synchronization in batch mode simply execute this file or schedule it in your operating system's task planner."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText54->Wrap( 380 ); + m_staticText54->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxT("Tahoma") ) ); + + bSizer69->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + + bSizer69->Add( 0, 5, 0, 0, 5 ); + + m_staticline10 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer69->Add( m_staticline10, 0, wxEXPAND|wxTOP, 5 ); + + m_staticText531 = new wxStaticText( this, wxID_ANY, _("Configuration overview:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText531->Wrap( -1 ); + m_staticText531->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Arial Black") ) ); + + bSizer69->Add( m_staticText531, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_scrolledWindow6 = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_scrolledWindow6->SetScrollRate( 5, 5 ); + bSizerFolderPairs = new wxBoxSizer( wxVERTICAL ); + + m_scrolledWindow6->SetSizer( bSizerFolderPairs ); + m_scrolledWindow6->Layout(); + bSizerFolderPairs->Fit( m_scrolledWindow6 ); + bSizer69->Add( m_scrolledWindow6, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + wxBoxSizer* bSizer67; + bSizer67 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer57; + bSizer57 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer71; + bSizer71 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer721; + bSizer721 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* sbSizer6; + sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Compare by...") ), wxVERTICAL ); + + m_radioBtnSizeDate = new wxRadioButton( this, wxID_ANY, _("File size and date"), wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtnSizeDate->SetValue( true ); + m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same.") ); + + sbSizer6->Add( m_radioBtnSizeDate, 0, 0, 5 ); + + m_radioBtnContent = new wxRadioButton( this, wxID_ANY, _("File content"), wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtnContent->SetToolTip( _("Files are found equal if\n - file content\nis the same.") ); + + sbSizer6->Add( m_radioBtnContent, 0, wxTOP, 5 ); + + bSizer721->Add( sbSizer6, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer721->Add( 0, 10, 1, 0, 5 ); + + wxBoxSizer* bSizer38; + bSizer38 = new wxBoxSizer( wxVERTICAL ); + + m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("Use Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_checkBoxUseRecycler->SetToolTip( _("Use Recycle Bin when deleting or overwriting files during synchronization") ); + + bSizer38->Add( m_checkBoxUseRecycler, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_checkBoxIgnoreErrors = new wxCheckBox( this, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_checkBoxIgnoreErrors->SetToolTip( _("Hides error messages during synchronization:\nThey are collected and shown as a list at the end of the process") ); + + bSizer38->Add( m_checkBoxIgnoreErrors, 0, wxALL, 5 ); + + m_checkBoxSilent = new wxCheckBox( this, wxID_ANY, _("Silent mode"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_checkBoxSilent->SetToolTip( _("Do not show graphical status and error messages but write to a logfile instead") ); + + bSizer38->Add( m_checkBoxSilent, 0, wxALL, 5 ); + + bSizer721->Add( bSizer38, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer721->Add( 0, 10, 1, 0, 5 ); + + bSizer71->Add( bSizer721, 0, wxEXPAND, 5 ); + + + bSizer71->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_bpButtonFilter = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); + bSizer71->Add( m_bpButtonFilter, 0, wxALIGN_BOTTOM|wxRIGHT, 5 ); + + bSizer57->Add( bSizer71, 0, wxEXPAND, 5 ); + + wxStaticBoxSizer* sbSizer8; + sbSizer8 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); + + wxBoxSizer* bSizer671; + bSizer671 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer681; + bSizer681 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap8 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); + bSizer681->Add( m_bitmap8, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_staticText15 = new wxStaticText( this, wxID_ANY, _("Include"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText15->Wrap( -1 ); + m_staticText15->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer681->Add( m_staticText15, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer671->Add( bSizer681, 1, wxEXPAND, 5 ); + + m_textCtrlInclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 250,-1 ), wxTE_MULTILINE ); + bSizer671->Add( m_textCtrlInclude, 0, wxALL, 5 ); + + sbSizer8->Add( bSizer671, 0, 0, 5 ); + + + sbSizer8->Add( 0, 10, 0, 0, 5 ); + + wxBoxSizer* bSizer691; + bSizer691 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer70; + bSizer70 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap9 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); + bSizer70->Add( m_bitmap9, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_staticText16 = new wxStaticText( this, wxID_ANY, _("Exclude"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText16->Wrap( -1 ); + m_staticText16->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer70->Add( m_staticText16, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + bSizer691->Add( bSizer70, 1, wxEXPAND, 5 ); + + m_textCtrlExclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 250,-1 ), wxTE_MULTILINE ); + bSizer691->Add( m_textCtrlExclude, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer8->Add( bSizer691, 0, 0, 5 ); + + bSizer57->Add( sbSizer8, 0, 0, 5 ); + + bSizer67->Add( bSizer57, 0, 0, 5 ); + + + bSizer67->Add( 10, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBoxSizer* sbSizer61; + sbSizer61 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Configuration") ), wxVERTICAL ); + + wxGridSizer* gSizer3; + gSizer3 = new wxGridSizer( 1, 2, 0, 5 ); + + m_staticText211 = new wxStaticText( this, wxID_ANY, _("Result"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText211->Wrap( -1 ); + m_staticText211->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + gSizer3->Add( m_staticText211, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText311 = new wxStaticText( this, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText311->Wrap( -1 ); + m_staticText311->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + gSizer3->Add( m_staticText311, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer61->Add( gSizer3, 0, wxEXPAND, 5 ); + + m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + sbSizer61->Add( m_staticline3, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxBOTTOM, 5 ); + + wxGridSizer* gSizer1; + gSizer1 = new wxGridSizer( 5, 2, 0, 5 ); + + m_bitmap13 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap13->SetToolTip( _("Files/folders that exist on left side only") ); + + gSizer1->Add( m_bitmap13, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton5 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + gSizer1->Add( m_bpButton5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap14 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap14->SetToolTip( _("Files/folders that exist on right side only") ); + + gSizer1->Add( m_bitmap14, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton6 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + gSizer1->Add( m_bpButton6, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap15 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap15->SetToolTip( _("Files that exist on both sides, left one is newer") ); + + gSizer1->Add( m_bitmap15, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton7 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + gSizer1->Add( m_bpButton7, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap16 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap16->SetToolTip( _("Files that exist on both sides, right one is newer") ); + + gSizer1->Add( m_bitmap16, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton8 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + gSizer1->Add( m_bpButton8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap17 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap17->SetToolTip( _("dummy") ); + + gSizer1->Add( m_bitmap17, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton9 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + gSizer1->Add( m_bpButton9, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer61->Add( gSizer1, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + bSizer67->Add( sbSizer61, 0, 0, 5 ); + + bSizer69->Add( bSizer67, 0, wxALL, 5 ); + + m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer69->Add( m_staticline9, 0, wxTOP|wxBOTTOM|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer68; + bSizer68 = new wxBoxSizer( wxHORIZONTAL ); + + m_button6 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button6->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer68->Add( m_button6, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonCreate = new wxButton( this, wxID_ANY, _("&Create"), wxDefaultPosition, wxSize( 120,35 ), 0 ); + m_buttonCreate->SetDefault(); + m_buttonCreate->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer68->Add( m_buttonCreate, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer69->Add( bSizer68, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer54->Add( bSizer69, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + this->SetSizer( bSizer54 ); + this->Layout(); + bSizer54->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); + m_radioBtnSizeDate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeCompareVar ), NULL, this ); + m_radioBtnContent->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeCompareVar ), NULL, this ); + m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSelectRecycleBin ), NULL, this ); + m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnFilterButton ), NULL, this ); + m_bpButton5->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnExLeftSideOnly ), NULL, this ); + m_bpButton6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnExRightSideOnly ), NULL, this ); + m_bpButton7->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLeftNewer ), NULL, this ); + m_bpButton8->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnRightNewer ), NULL, this ); + m_bpButton9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnDifferent ), NULL, this ); + m_button6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); + m_buttonCreate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCreateBatchJob ), NULL, this ); } BatchDlgGenerated::~BatchDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); - m_radioBtnSizeDate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeCompareVar ), NULL, this ); - m_radioBtnContent->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeCompareVar ), NULL, this ); - m_checkBoxUseRecycler->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSelectRecycleBin ), NULL, this ); - m_bpButtonFilter->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnFilterButton ), NULL, this ); - m_bpButton5->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnExLeftSideOnly ), NULL, this ); - m_bpButton6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnExRightSideOnly ), NULL, this ); - m_bpButton7->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLeftNewer ), NULL, this ); - m_bpButton8->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnRightNewer ), NULL, this ); - m_bpButton9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnDifferent ), NULL, this ); - m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); - m_buttonCreate->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCreateBatchJob ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); + m_radioBtnSizeDate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeCompareVar ), NULL, this ); + m_radioBtnContent->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeCompareVar ), NULL, this ); + m_checkBoxUseRecycler->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSelectRecycleBin ), NULL, this ); + m_bpButtonFilter->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnFilterButton ), NULL, this ); + m_bpButton5->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnExLeftSideOnly ), NULL, this ); + m_bpButton6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnExRightSideOnly ), NULL, this ); + m_bpButton7->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLeftNewer ), NULL, this ); + m_bpButton8->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnRightNewer ), NULL, this ); + m_bpButton9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnDifferent ), NULL, this ); + m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); + m_buttonCreate->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCreateBatchJob ), NULL, this ); } BatchFolderPairGenerated::BatchFolderPairGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) { - wxStaticBoxSizer* sbSizer20; - sbSizer20 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); - - wxFlexGridSizer* fgSizer9; - fgSizer9 = new wxFlexGridSizer( 2, 2, 5, 5 ); - fgSizer9->AddGrowableCol( 1 ); - fgSizer9->SetFlexibleDirection( wxHORIZONTAL ); - fgSizer9->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_staticText53 = new wxStaticText( this, wxID_ANY, _("Left folder:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText53->Wrap( -1 ); - m_staticText53->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer9->Add( m_staticText53, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - m_directoryLeft = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - fgSizer9->Add( m_directoryLeft, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticText541 = new wxStaticText( this, wxID_ANY, _("Right folder:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText541->Wrap( -1 ); - m_staticText541->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer9->Add( m_staticText541, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - m_directoryRight = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - fgSizer9->Add( m_directoryRight, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - sbSizer20->Add( fgSizer9, 0, wxEXPAND, 5 ); - - this->SetSizer( sbSizer20 ); - this->Layout(); - sbSizer20->Fit( this ); - - // Connect Events - m_directoryLeft->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchFolderPairGenerated::OnEnterLeftDir ), NULL, this ); - m_directoryRight->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchFolderPairGenerated::OnEnterRightDir ), NULL, this ); + wxStaticBoxSizer* sbSizer20; + sbSizer20 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); + + wxFlexGridSizer* fgSizer9; + fgSizer9 = new wxFlexGridSizer( 2, 2, 5, 5 ); + fgSizer9->AddGrowableCol( 1 ); + fgSizer9->SetFlexibleDirection( wxHORIZONTAL ); + fgSizer9->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_staticText53 = new wxStaticText( this, wxID_ANY, _("Left folder:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText53->Wrap( -1 ); + m_staticText53->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer9->Add( m_staticText53, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + m_directoryLeft = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + fgSizer9->Add( m_directoryLeft, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticText541 = new wxStaticText( this, wxID_ANY, _("Right folder:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText541->Wrap( -1 ); + m_staticText541->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer9->Add( m_staticText541, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + m_directoryRight = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + fgSizer9->Add( m_directoryRight, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + sbSizer20->Add( fgSizer9, 0, wxEXPAND, 5 ); + + this->SetSizer( sbSizer20 ); + this->Layout(); + sbSizer20->Fit( this ); + + // Connect Events + m_directoryLeft->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchFolderPairGenerated::OnEnterLeftDir ), NULL, this ); + m_directoryRight->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchFolderPairGenerated::OnEnterRightDir ), NULL, this ); } BatchFolderPairGenerated::~BatchFolderPairGenerated() { - // Disconnect Events - m_directoryLeft->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchFolderPairGenerated::OnEnterLeftDir ), NULL, this ); - m_directoryRight->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchFolderPairGenerated::OnEnterRightDir ), NULL, this ); + // Disconnect Events + m_directoryLeft->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchFolderPairGenerated::OnEnterLeftDir ), NULL, this ); + m_directoryRight->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchFolderPairGenerated::OnEnterRightDir ), NULL, this ); } CompareStatusGenerated::CompareStatusGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) { - wxBoxSizer* bSizer40; - bSizer40 = new wxBoxSizer( wxVERTICAL ); - - bSizer42 = new wxBoxSizer( wxHORIZONTAL ); - - wxStaticBoxSizer* sbSizer10; - sbSizer10 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxHORIZONTAL ); - - m_staticText321 = new wxStaticText( this, wxID_ANY, _("Files/folders scanned:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText321->Wrap( -1 ); - m_staticText321->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - sbSizer10->Add( m_staticText321, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); - - m_staticTextScanned = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextScanned->Wrap( -1 ); - m_staticTextScanned->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - sbSizer10->Add( m_staticTextScanned, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer42->Add( sbSizer10, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); - - sbSizer13 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Comparing content") ), wxVERTICAL ); - - wxFlexGridSizer* fgSizer8; - fgSizer8 = new wxFlexGridSizer( 2, 2, 3, 0 ); - fgSizer8->SetFlexibleDirection( wxBOTH ); - fgSizer8->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_staticText46 = new wxStaticText( this, wxID_ANY, _("Files remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText46->Wrap( -1 ); - m_staticText46->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - fgSizer8->Add( m_staticText46, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_staticTextFilesToCompare = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextFilesToCompare->Wrap( -1 ); - m_staticTextFilesToCompare->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer8->Add( m_staticTextFilesToCompare, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText32 = new wxStaticText( this, wxID_ANY, _("Data remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText32->Wrap( -1 ); - m_staticText32->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - fgSizer8->Add( m_staticText32, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_staticTextDataToCompare = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDataToCompare->Wrap( -1 ); - m_staticTextDataToCompare->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer8->Add( m_staticTextDataToCompare, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer13->Add( fgSizer8, 0, 0, 5 ); - - bSizer42->Add( sbSizer13, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); - - wxStaticBoxSizer* sbSizer131; - sbSizer131 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxHORIZONTAL ); - - m_staticText37 = new wxStaticText( this, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText37->Wrap( -1 ); - m_staticText37->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - sbSizer131->Add( m_staticText37, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_staticTextTimeElapsed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeElapsed->Wrap( -1 ); - m_staticTextTimeElapsed->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - sbSizer131->Add( m_staticTextTimeElapsed, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer42->Add( sbSizer131, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - bSizer40->Add( bSizer42, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL, 5 ); - - wxBoxSizer* bSizer48; - bSizer48 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText30 = new wxStaticText( this, wxID_ANY, _("Operation:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText30->Wrap( -1 ); - m_staticText30->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer48->Add( m_staticText30, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlFilename = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); - m_textCtrlFilename->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); - - bSizer48->Add( m_textCtrlFilename, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer40->Add( bSizer48, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - m_gauge2 = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,20 ), wxGA_HORIZONTAL ); - bSizer40->Add( m_gauge2, 0, wxALL|wxEXPAND, 5 ); - - this->SetSizer( bSizer40 ); - this->Layout(); - bSizer40->Fit( this ); + wxBoxSizer* bSizer40; + bSizer40 = new wxBoxSizer( wxVERTICAL ); + + bSizer42 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBoxSizer* sbSizer10; + sbSizer10 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxHORIZONTAL ); + + m_staticText321 = new wxStaticText( this, wxID_ANY, _("Files/folders scanned:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText321->Wrap( -1 ); + m_staticText321->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + sbSizer10->Add( m_staticText321, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); + + m_staticTextScanned = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextScanned->Wrap( -1 ); + m_staticTextScanned->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + sbSizer10->Add( m_staticTextScanned, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer42->Add( sbSizer10, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); + + sbSizer13 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Comparing content") ), wxVERTICAL ); + + wxFlexGridSizer* fgSizer8; + fgSizer8 = new wxFlexGridSizer( 2, 2, 3, 0 ); + fgSizer8->SetFlexibleDirection( wxBOTH ); + fgSizer8->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_staticText46 = new wxStaticText( this, wxID_ANY, _("Files remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText46->Wrap( -1 ); + m_staticText46->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + fgSizer8->Add( m_staticText46, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_staticTextFilesToCompare = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextFilesToCompare->Wrap( -1 ); + m_staticTextFilesToCompare->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer8->Add( m_staticTextFilesToCompare, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText32 = new wxStaticText( this, wxID_ANY, _("Data remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText32->Wrap( -1 ); + m_staticText32->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + fgSizer8->Add( m_staticText32, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_staticTextDataToCompare = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDataToCompare->Wrap( -1 ); + m_staticTextDataToCompare->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer8->Add( m_staticTextDataToCompare, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer13->Add( fgSizer8, 0, 0, 5 ); + + bSizer42->Add( sbSizer13, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); + + wxStaticBoxSizer* sbSizer131; + sbSizer131 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxHORIZONTAL ); + + m_staticText37 = new wxStaticText( this, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText37->Wrap( -1 ); + m_staticText37->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + sbSizer131->Add( m_staticText37, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_staticTextTimeElapsed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeElapsed->Wrap( -1 ); + m_staticTextTimeElapsed->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + sbSizer131->Add( m_staticTextTimeElapsed, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer42->Add( sbSizer131, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + bSizer40->Add( bSizer42, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL, 5 ); + + wxBoxSizer* bSizer48; + bSizer48 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText30 = new wxStaticText( this, wxID_ANY, _("Operation:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText30->Wrap( -1 ); + m_staticText30->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer48->Add( m_staticText30, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlFilename = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); + m_textCtrlFilename->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); + + bSizer48->Add( m_textCtrlFilename, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer40->Add( bSizer48, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_gauge2 = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,20 ), wxGA_HORIZONTAL ); + bSizer40->Add( m_gauge2, 0, wxALL|wxEXPAND, 5 ); + + this->SetSizer( bSizer40 ); + this->Layout(); + bSizer40->Fit( this ); } CompareStatusGenerated::~CompareStatusGenerated() @@ -1177,1358 +1257,1491 @@ CompareStatusGenerated::~CompareStatusGenerated() SyncDlgGenerated::SyncDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer7; - bSizer7 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer181; - bSizer181 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer29; - bSizer29 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer201; - bSizer201 = new wxBoxSizer( wxHORIZONTAL ); - - m_bpButton18 = new wxBitmapButton( this, wxID_OK, wxNullBitmap, wxDefaultPosition, wxSize( 140,58 ), wxBU_AUTODRAW ); - m_bpButton18->SetDefault(); - m_bpButton18->SetToolTip( _("Start synchronization") ); - - m_bpButton18->SetToolTip( _("Start synchronization") ); - - bSizer201->Add( m_bpButton18, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer201->Add( 18, 0, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer38; - bSizer38 = new wxBoxSizer( wxVERTICAL ); - - m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("Use Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); - - m_checkBoxUseRecycler->SetToolTip( _("Use Recycle Bin when deleting or overwriting files during synchronization") ); - - bSizer38->Add( m_checkBoxUseRecycler, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_checkBoxContinueError = new wxCheckBox( this, wxID_ANY, _("Continue on error"), wxDefaultPosition, wxDefaultSize, 0 ); - - m_checkBoxContinueError->SetToolTip( _("Hides error messages during synchronization:\nThey are collected and shown as a list at the end of the process") ); - - bSizer38->Add( m_checkBoxContinueError, 0, wxALL, 5 ); - - bSizer201->Add( bSizer38, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer29->Add( bSizer201, 1, 0, 5 ); - - - bSizer29->Add( 0, 5, 0, 0, 5 ); - - wxStaticBoxSizer* sbSizer7; - sbSizer7 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); - - m_staticText1 = new wxStaticText( this, wxID_ANY, _("Select variant:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText1->Wrap( -1 ); - m_staticText1->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - sbSizer7->Add( m_staticText1, 0, wxALL, 5 ); - - wxFlexGridSizer* fgSizer1; - fgSizer1 = new wxFlexGridSizer( 3, 3, 8, 5 ); - fgSizer1->SetFlexibleDirection( wxHORIZONTAL ); - fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_radioBtn1 = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtn1->SetValue( true ); - m_radioBtn1->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer1->Add( m_radioBtn1, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonOneWay = new wxButton( this, wxID_ANY, _("One way ->"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonOneWay->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer1->Add( m_buttonOneWay, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticText8 = new wxStaticText( this, wxID_ANY, _("Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText8->Wrap( 300 ); - fgSizer1->Add( m_staticText8, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_radioBtn2 = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtn2->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer1->Add( m_radioBtn2, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonTwoWay = new wxButton( this, wxID_ANY, _("Two way <->"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonTwoWay->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer1->Add( m_buttonTwoWay, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText10 = new wxStaticText( this, wxID_ANY, _("Synchronize both sides simultaneously: Copy new or updated files in both directions."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText10->Wrap( 300 ); - fgSizer1->Add( m_staticText10, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - m_radioBtn3 = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtn3->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer1->Add( m_radioBtn3, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer65; - bSizer65 = new wxBoxSizer( wxVERTICAL ); - - - bSizer65->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_staticText23 = new wxStaticText( this, wxID_ANY, _("Custom"), wxDefaultPosition, wxSize( -1,-1 ), wxALIGN_CENTRE|wxSTATIC_BORDER ); - m_staticText23->Wrap( -1 ); - m_staticText23->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer65->Add( m_staticText23, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer65->Add( 0, 0, 1, wxEXPAND, 5 ); - - fgSizer1->Add( bSizer65, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticText9 = new wxStaticText( this, wxID_ANY, _("Configure your own synchronization rules."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText9->Wrap( 300 ); - fgSizer1->Add( m_staticText9, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - sbSizer7->Add( fgSizer1, 0, 0, 5 ); - - bSizer29->Add( sbSizer7, 0, wxEXPAND, 5 ); - - - bSizer29->Add( 0, 5, 0, 0, 5 ); - - wxBoxSizer* bSizer291; - bSizer291 = new wxBoxSizer( wxHORIZONTAL ); - - m_button6 = new wxButton( this, wxID_ANY, _("&Back"), wxDefaultPosition, wxSize( 100,32 ), 0 ); - m_button6->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer291->Add( m_button6, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_button16 = new wxButton( this, wxID_CANCEL, _("dummy"), wxDefaultPosition, wxSize( 0,0 ), 0 ); - bSizer291->Add( m_button16, 0, wxALIGN_BOTTOM, 5 ); - - - bSizer291->Add( 20, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - wxStaticBoxSizer* sbSizer16; - sbSizer16 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Preview") ), wxHORIZONTAL ); - - wxFlexGridSizer* fgSizer5; - fgSizer5 = new wxFlexGridSizer( 2, 2, 0, 5 ); - fgSizer5->SetFlexibleDirection( wxHORIZONTAL ); - fgSizer5->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_staticText37 = new wxStaticText( this, wxID_ANY, _("Create:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText37->Wrap( -1 ); - m_staticText37->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); - m_staticText37->SetToolTip( _("Number of files and directories that will be created") ); - - fgSizer5->Add( m_staticText37, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlCreate = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY ); - m_textCtrlCreate->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); - m_textCtrlCreate->SetBackgroundColour( wxColour( 222, 222, 236 ) ); - m_textCtrlCreate->SetToolTip( _("Number of files and directories that will be created") ); - - fgSizer5->Add( m_textCtrlCreate, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText14 = new wxStaticText( this, wxID_ANY, _("Delete:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText14->Wrap( -1 ); - m_staticText14->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); - m_staticText14->SetToolTip( _("Number of files and directories that will be deleted") ); - - fgSizer5->Add( m_staticText14, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlDelete = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY ); - m_textCtrlDelete->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); - m_textCtrlDelete->SetBackgroundColour( wxColour( 222, 222, 236 ) ); - m_textCtrlDelete->SetToolTip( _("Number of files and directories that will be deleted") ); - - fgSizer5->Add( m_textCtrlDelete, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer16->Add( fgSizer5, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - wxFlexGridSizer* fgSizer6; - fgSizer6 = new wxFlexGridSizer( 2, 2, 0, 5 ); - fgSizer6->SetFlexibleDirection( wxHORIZONTAL ); - fgSizer6->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_staticText42 = new wxStaticText( this, wxID_ANY, _("Update:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText42->Wrap( -1 ); - m_staticText42->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); - m_staticText42->SetToolTip( _("Number of files that will be overwritten") ); - - fgSizer6->Add( m_staticText42, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlUpdate = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY ); - m_textCtrlUpdate->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); - m_textCtrlUpdate->SetBackgroundColour( wxColour( 222, 222, 236 ) ); - m_textCtrlUpdate->SetToolTip( _("Number of files that will be overwritten") ); - - fgSizer6->Add( m_textCtrlUpdate, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText43 = new wxStaticText( this, wxID_ANY, _("Data:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText43->Wrap( -1 ); - m_staticText43->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); - m_staticText43->SetToolTip( _("Total amount of data that will be transferred") ); - - fgSizer6->Add( m_staticText43, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlData = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY ); - m_textCtrlData->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); - m_textCtrlData->SetBackgroundColour( wxColour( 222, 222, 236 ) ); - m_textCtrlData->SetToolTip( _("Total amount of data that will be transferred") ); - - fgSizer6->Add( m_textCtrlData, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer16->Add( fgSizer6, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - bSizer291->Add( sbSizer16, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - bSizer29->Add( bSizer291, 0, wxEXPAND, 5 ); - - bSizer181->Add( bSizer29, 0, 0, 5 ); - - - bSizer181->Add( 10, 0, 0, 0, 5 ); - - wxStaticBoxSizer* sbSizer6; - sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Configuration") ), wxVERTICAL ); - - wxGridSizer* gSizer3; - gSizer3 = new wxGridSizer( 1, 2, 0, 5 ); - - m_staticText21 = new wxStaticText( this, wxID_ANY, _("Result"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText21->Wrap( -1 ); - m_staticText21->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - - gSizer3->Add( m_staticText21, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText31 = new wxStaticText( this, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText31->Wrap( -1 ); - m_staticText31->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - - gSizer3->Add( m_staticText31, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer6->Add( gSizer3, 0, wxEXPAND, 5 ); - - m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - sbSizer6->Add( m_staticline3, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxBOTTOM, 5 ); - - wxGridSizer* gSizer1; - gSizer1 = new wxGridSizer( 5, 2, 0, 5 ); - - m_bitmap13 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap13->SetToolTip( _("Files/folders that exist on left side only") ); - - gSizer1->Add( m_bitmap13, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton5 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - gSizer1->Add( m_bpButton5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap14 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap14->SetToolTip( _("Files/folders that exist on right side only") ); - - gSizer1->Add( m_bitmap14, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton6 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - gSizer1->Add( m_bpButton6, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap15 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap15->SetToolTip( _("Files that exist on both sides, left one is newer") ); - - gSizer1->Add( m_bitmap15, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton7 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - gSizer1->Add( m_bpButton7, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap16 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap16->SetToolTip( _("Files that exist on both sides, right one is newer") ); - - gSizer1->Add( m_bitmap16, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton8 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - gSizer1->Add( m_bpButton8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap17 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap17->SetToolTip( _("dummy") ); - - gSizer1->Add( m_bitmap17, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton9 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - gSizer1->Add( m_bpButton9, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer6->Add( gSizer1, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - bSizer181->Add( sbSizer6, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_BOTTOM, 5 ); - - bSizer7->Add( bSizer181, 0, wxALL, 5 ); - - this->SetSizer( bSizer7 ); - this->Layout(); - bSizer7->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncDlgGenerated::OnClose ) ); - m_bpButton18->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnStartSync ), NULL, this ); - m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSelectRecycleBin ), NULL, this ); - m_radioBtn1->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncLeftToRight ), NULL, this ); - m_buttonOneWay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncLeftToRight ), NULL, this ); - m_radioBtn2->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncBothSides ), NULL, this ); - m_buttonTwoWay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncBothSides ), NULL, this ); - m_radioBtn3->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncCostum ), NULL, this ); - m_button6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnBack ), NULL, this ); - m_button16->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnCancel ), NULL, this ); - m_bpButton5->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnExLeftSideOnly ), NULL, this ); - m_bpButton6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnExRightSideOnly ), NULL, this ); - m_bpButton7->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnLeftNewer ), NULL, this ); - m_bpButton8->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnRightNewer ), NULL, this ); - m_bpButton9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnDifferent ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer7; + bSizer7 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer181; + bSizer181 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer29; + bSizer29 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer201; + bSizer201 = new wxBoxSizer( wxHORIZONTAL ); + + m_bpButton18 = new wxBitmapButton( this, wxID_OK, wxNullBitmap, wxDefaultPosition, wxSize( 140,58 ), wxBU_AUTODRAW ); + m_bpButton18->SetDefault(); + m_bpButton18->SetToolTip( _("Start synchronization") ); + + m_bpButton18->SetToolTip( _("Start synchronization") ); + + bSizer201->Add( m_bpButton18, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer201->Add( 18, 0, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer38; + bSizer38 = new wxBoxSizer( wxVERTICAL ); + + m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("Use Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_checkBoxUseRecycler->SetToolTip( _("Use Recycle Bin when deleting or overwriting files during synchronization") ); + + bSizer38->Add( m_checkBoxUseRecycler, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_checkBoxIgnoreErrors = new wxCheckBox( this, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_checkBoxIgnoreErrors->SetToolTip( _("Hides error messages during synchronization:\nThey are collected and shown as a list at the end of the process") ); + + bSizer38->Add( m_checkBoxIgnoreErrors, 0, wxALL, 5 ); + + bSizer201->Add( bSizer38, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer29->Add( bSizer201, 1, 0, 5 ); + + + bSizer29->Add( 0, 5, 0, 0, 5 ); + + wxStaticBoxSizer* sbSizer7; + sbSizer7 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); + + m_staticText1 = new wxStaticText( this, wxID_ANY, _("Select variant:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText1->Wrap( -1 ); + m_staticText1->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + sbSizer7->Add( m_staticText1, 0, wxALL, 5 ); + + wxFlexGridSizer* fgSizer1; + fgSizer1 = new wxFlexGridSizer( 4, 3, 8, 5 ); + fgSizer1->SetFlexibleDirection( wxHORIZONTAL ); + fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_radioBtn1 = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtn1->SetValue( true ); + m_radioBtn1->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer1->Add( m_radioBtn1, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonOneWay = new wxButton( this, wxID_ANY, _("Mirror ->>"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonOneWay->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer1->Add( m_buttonOneWay, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticText8 = new wxStaticText( this, wxID_ANY, _("Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText8->Wrap( 300 ); + fgSizer1->Add( m_staticText8, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_radioBtnUpdate = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtnUpdate->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer1->Add( m_radioBtnUpdate, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonUpdate = new wxButton( this, wxID_ANY, _("Update ->"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonUpdate->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer1->Add( m_buttonUpdate, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticText101 = new wxStaticText( this, wxID_ANY, _("Copy new or updated files to right folder."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText101->Wrap( 300 ); + fgSizer1->Add( m_staticText101, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + m_radioBtn2 = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtn2->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer1->Add( m_radioBtn2, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonTwoWay = new wxButton( this, wxID_ANY, _("Two way <->"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonTwoWay->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer1->Add( m_buttonTwoWay, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText10 = new wxStaticText( this, wxID_ANY, _("Synchronize both sides simultaneously: Copy new or updated files in both directions."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText10->Wrap( 300 ); + fgSizer1->Add( m_staticText10, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + m_radioBtn3 = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtn3->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer1->Add( m_radioBtn3, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer65; + bSizer65 = new wxBoxSizer( wxVERTICAL ); + + + bSizer65->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_staticText23 = new wxStaticText( this, wxID_ANY, _("Custom"), wxDefaultPosition, wxSize( -1,-1 ), wxALIGN_CENTRE|wxSTATIC_BORDER ); + m_staticText23->Wrap( -1 ); + m_staticText23->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer65->Add( m_staticText23, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizer65->Add( 0, 0, 1, wxEXPAND, 5 ); + + fgSizer1->Add( bSizer65, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticText9 = new wxStaticText( this, wxID_ANY, _("Configure your own synchronization rules."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText9->Wrap( 300 ); + fgSizer1->Add( m_staticText9, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + sbSizer7->Add( fgSizer1, 0, 0, 5 ); + + bSizer29->Add( sbSizer7, 0, wxEXPAND, 5 ); + + + bSizer29->Add( 0, 5, 0, 0, 5 ); + + wxBoxSizer* bSizer291; + bSizer291 = new wxBoxSizer( wxHORIZONTAL ); + + m_button6 = new wxButton( this, wxID_ANY, _("&Back"), wxDefaultPosition, wxSize( 100,32 ), 0 ); + m_button6->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer291->Add( m_button6, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_button16 = new wxButton( this, wxID_CANCEL, _("dummy"), wxDefaultPosition, wxSize( 0,0 ), 0 ); + bSizer291->Add( m_button16, 0, wxALIGN_BOTTOM, 5 ); + + + bSizer291->Add( 20, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBoxSizer* sbSizer16; + sbSizer16 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Preview") ), wxHORIZONTAL ); + + wxFlexGridSizer* fgSizer5; + fgSizer5 = new wxFlexGridSizer( 2, 2, 0, 5 ); + fgSizer5->SetFlexibleDirection( wxHORIZONTAL ); + fgSizer5->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_staticText37 = new wxStaticText( this, wxID_ANY, _("Create:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText37->Wrap( -1 ); + m_staticText37->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); + m_staticText37->SetToolTip( _("Number of files and directories that will be created") ); + + fgSizer5->Add( m_staticText37, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlCreate = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY ); + m_textCtrlCreate->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); + m_textCtrlCreate->SetBackgroundColour( wxColour( 222, 222, 236 ) ); + m_textCtrlCreate->SetToolTip( _("Number of files and directories that will be created") ); + + fgSizer5->Add( m_textCtrlCreate, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText14 = new wxStaticText( this, wxID_ANY, _("Delete:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText14->Wrap( -1 ); + m_staticText14->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); + m_staticText14->SetToolTip( _("Number of files and directories that will be deleted") ); + + fgSizer5->Add( m_staticText14, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlDelete = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY ); + m_textCtrlDelete->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); + m_textCtrlDelete->SetBackgroundColour( wxColour( 222, 222, 236 ) ); + m_textCtrlDelete->SetToolTip( _("Number of files and directories that will be deleted") ); + + fgSizer5->Add( m_textCtrlDelete, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer16->Add( fgSizer5, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + wxFlexGridSizer* fgSizer6; + fgSizer6 = new wxFlexGridSizer( 2, 2, 0, 5 ); + fgSizer6->SetFlexibleDirection( wxHORIZONTAL ); + fgSizer6->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_staticText42 = new wxStaticText( this, wxID_ANY, _("Update:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText42->Wrap( -1 ); + m_staticText42->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); + m_staticText42->SetToolTip( _("Number of files that will be overwritten") ); + + fgSizer6->Add( m_staticText42, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlUpdate = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY ); + m_textCtrlUpdate->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); + m_textCtrlUpdate->SetBackgroundColour( wxColour( 222, 222, 236 ) ); + m_textCtrlUpdate->SetToolTip( _("Number of files that will be overwritten") ); + + fgSizer6->Add( m_textCtrlUpdate, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText43 = new wxStaticText( this, wxID_ANY, _("Data:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText43->Wrap( -1 ); + m_staticText43->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); + m_staticText43->SetToolTip( _("Total amount of data that will be transferred") ); + + fgSizer6->Add( m_staticText43, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlData = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY ); + m_textCtrlData->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); + m_textCtrlData->SetBackgroundColour( wxColour( 222, 222, 236 ) ); + m_textCtrlData->SetToolTip( _("Total amount of data that will be transferred") ); + + fgSizer6->Add( m_textCtrlData, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer16->Add( fgSizer6, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + bSizer291->Add( sbSizer16, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + bSizer29->Add( bSizer291, 0, wxEXPAND, 5 ); + + bSizer181->Add( bSizer29, 0, 0, 5 ); + + + bSizer181->Add( 10, 0, 0, 0, 5 ); + + wxStaticBoxSizer* sbSizer6; + sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Configuration") ), wxVERTICAL ); + + wxGridSizer* gSizer3; + gSizer3 = new wxGridSizer( 1, 2, 0, 5 ); + + m_staticText21 = new wxStaticText( this, wxID_ANY, _("Result"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText21->Wrap( -1 ); + m_staticText21->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + gSizer3->Add( m_staticText21, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText31 = new wxStaticText( this, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText31->Wrap( -1 ); + m_staticText31->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + gSizer3->Add( m_staticText31, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer6->Add( gSizer3, 0, wxEXPAND, 5 ); + + m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + sbSizer6->Add( m_staticline3, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxBOTTOM, 5 ); + + wxGridSizer* gSizer1; + gSizer1 = new wxGridSizer( 5, 2, 0, 5 ); + + m_bitmap13 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap13->SetToolTip( _("Files/folders that exist on left side only") ); + + gSizer1->Add( m_bitmap13, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton5 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + gSizer1->Add( m_bpButton5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap14 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap14->SetToolTip( _("Files/folders that exist on right side only") ); + + gSizer1->Add( m_bitmap14, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton6 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + gSizer1->Add( m_bpButton6, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap15 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap15->SetToolTip( _("Files that exist on both sides, left one is newer") ); + + gSizer1->Add( m_bitmap15, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton7 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + gSizer1->Add( m_bpButton7, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap16 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap16->SetToolTip( _("Files that exist on both sides, right one is newer") ); + + gSizer1->Add( m_bitmap16, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton8 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + gSizer1->Add( m_bpButton8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap17 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap17->SetToolTip( _("dummy") ); + + gSizer1->Add( m_bitmap17, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton9 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + gSizer1->Add( m_bpButton9, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer6->Add( gSizer1, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + bSizer181->Add( sbSizer6, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_BOTTOM, 5 ); + + bSizer7->Add( bSizer181, 0, wxALL, 5 ); + + this->SetSizer( bSizer7 ); + this->Layout(); + bSizer7->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncDlgGenerated::OnClose ) ); + m_bpButton18->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnStartSync ), NULL, this ); + m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSelectRecycleBin ), NULL, this ); + m_radioBtn1->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncLeftToRight ), NULL, this ); + m_buttonOneWay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncLeftToRight ), NULL, this ); + m_radioBtnUpdate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncUpdate ), NULL, this ); + m_buttonUpdate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncUpdate ), NULL, this ); + m_radioBtn2->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncBothSides ), NULL, this ); + m_buttonTwoWay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncBothSides ), NULL, this ); + m_radioBtn3->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncCostum ), NULL, this ); + m_button6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnBack ), NULL, this ); + m_button16->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnCancel ), NULL, this ); + m_bpButton5->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnExLeftSideOnly ), NULL, this ); + m_bpButton6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnExRightSideOnly ), NULL, this ); + m_bpButton7->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnLeftNewer ), NULL, this ); + m_bpButton8->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnRightNewer ), NULL, this ); + m_bpButton9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnDifferent ), NULL, this ); } SyncDlgGenerated::~SyncDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncDlgGenerated::OnClose ) ); - m_bpButton18->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnStartSync ), NULL, this ); - m_checkBoxUseRecycler->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSelectRecycleBin ), NULL, this ); - m_radioBtn1->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncLeftToRight ), NULL, this ); - m_buttonOneWay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncLeftToRight ), NULL, this ); - m_radioBtn2->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncBothSides ), NULL, this ); - m_buttonTwoWay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncBothSides ), NULL, this ); - m_radioBtn3->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncCostum ), NULL, this ); - m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnBack ), NULL, this ); - m_button16->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnCancel ), NULL, this ); - m_bpButton5->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnExLeftSideOnly ), NULL, this ); - m_bpButton6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnExRightSideOnly ), NULL, this ); - m_bpButton7->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnLeftNewer ), NULL, this ); - m_bpButton8->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnRightNewer ), NULL, this ); - m_bpButton9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnDifferent ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncDlgGenerated::OnClose ) ); + m_bpButton18->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnStartSync ), NULL, this ); + m_checkBoxUseRecycler->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSelectRecycleBin ), NULL, this ); + m_radioBtn1->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncLeftToRight ), NULL, this ); + m_buttonOneWay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncLeftToRight ), NULL, this ); + m_radioBtnUpdate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncUpdate ), NULL, this ); + m_buttonUpdate->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncUpdate ), NULL, this ); + m_radioBtn2->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncBothSides ), NULL, this ); + m_buttonTwoWay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncBothSides ), NULL, this ); + m_radioBtn3->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncCostum ), NULL, this ); + m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnBack ), NULL, this ); + m_button16->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnCancel ), NULL, this ); + m_bpButton5->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnExLeftSideOnly ), NULL, this ); + m_bpButton6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnExRightSideOnly ), NULL, this ); + m_bpButton7->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnLeftNewer ), NULL, this ); + m_bpButton8->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnRightNewer ), NULL, this ); + m_bpButton9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnDifferent ), NULL, this ); } SyncStatusDlgGenerated::SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer27; - bSizer27 = new wxBoxSizer( wxVERTICAL ); - - - bSizer27->Add( 0, 15, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer37; - bSizer37 = new wxBoxSizer( wxHORIZONTAL ); - - m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); - m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxVERTICAL ); - - m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Synchronization status"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText56->Wrap( -1 ); - m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - - m_panel8->SetSizer( bSizer72 ); - m_panel8->Layout(); - bSizer72->Fit( m_panel8 ); - bSizer37->Add( m_panel8, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_animationControl1 = new wxAnimationCtrl(this, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxSize( 45,45 )); - bSizer37->Add( m_animationControl1, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer27->Add( bSizer37, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - wxBoxSizer* bSizer42; - bSizer42 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_bitmapStatus = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 28,28 ), 0 ); - bSizer42->Add( m_bitmapStatus, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatus->Wrap( -1 ); - m_staticTextStatus->SetFont( wxFont( 14, 74, 93, 90, false, wxT("Tahoma") ) ); - - bSizer42->Add( m_staticTextStatus, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - - bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); - - bSizer27->Add( bSizer42, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer31 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText21 = new wxStaticText( this, wxID_ANY, _("Current operation:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText21->Wrap( -1 ); - m_staticText21->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer31->Add( m_staticText21, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer31->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_staticText55 = new wxStaticText( this, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText55->Wrap( -1 ); - m_staticText55->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); - - bSizer31->Add( m_staticText55, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); - - m_staticTextTimeElapsed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeElapsed->Wrap( -1 ); - m_staticTextTimeElapsed->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer31->Add( m_staticTextTimeElapsed, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer27->Add( bSizer31, 0, wxEXPAND, 5 ); - - m_textCtrlInfo = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY ); - m_textCtrlInfo->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); - - bSizer27->Add( m_textCtrlInfo, 3, wxALL|wxEXPAND, 5 ); - - m_gauge1 = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,20 ), wxGA_HORIZONTAL ); - bSizer27->Add( m_gauge1, 0, wxALL|wxEXPAND, 5 ); - - bSizer28 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer33; - bSizer33 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText25 = new wxStaticText( this, wxID_ANY, _("Files/folders remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText25->Wrap( -1 ); - m_staticText25->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); - - bSizer33->Add( m_staticText25, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_staticTextRemainingObj = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_staticTextRemainingObj->Wrap( -1 ); - m_staticTextRemainingObj->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer33->Add( m_staticTextRemainingObj, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer28->Add( bSizer33, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer28->Add( 0, 0, 1, 0, 5 ); - - m_buttonOK = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( 100,32 ), 0 ); - m_buttonOK->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - m_buttonOK->Hide(); - - bSizer28->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_buttonPause = new wxButton( this, wxID_ANY, _("&Pause"), wxDefaultPosition, wxSize( 100,32 ), 0 ); - m_buttonPause->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer28->Add( m_buttonPause, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_buttonAbort = new wxButton( this, wxID_CANCEL, _("&Abort"), wxDefaultPosition, wxSize( 100,32 ), 0 ); - m_buttonAbort->SetDefault(); - m_buttonAbort->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer28->Add( m_buttonAbort, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer28->Add( 0, 0, 1, 0, 5 ); - - wxBoxSizer* bSizer32; - bSizer32 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText26 = new wxStaticText( this, wxID_ANY, _("Data remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText26->Wrap( -1 ); - m_staticText26->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); - - bSizer32->Add( m_staticText26, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_staticTextDataRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDataRemaining->Wrap( -1 ); - m_staticTextDataRemaining->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer32->Add( m_staticTextDataRemaining, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - bSizer28->Add( bSizer32, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer27->Add( bSizer28, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - - bSizer27->Add( 0, 5, 0, wxEXPAND, 5 ); - - this->SetSizer( bSizer27 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncStatusDlgGenerated::OnClose ) ); - m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnOkay ), NULL, this ); - m_buttonPause->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnPause ), NULL, this ); - m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnAbort ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer27; + bSizer27 = new wxBoxSizer( wxVERTICAL ); + + + bSizer27->Add( 0, 15, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer37; + bSizer37 = new wxBoxSizer( wxHORIZONTAL ); + + m_animationControl1 = new wxAnimationCtrl(this, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxSize( 45,45 )); + bSizer37->Add( m_animationControl1, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); + m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); + + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxVERTICAL ); + + m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Synchronization status"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText56->Wrap( -1 ); + m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + m_panel8->SetSizer( bSizer72 ); + m_panel8->Layout(); + bSizer72->Fit( m_panel8 ); + bSizer37->Add( m_panel8, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer27->Add( bSizer37, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxBoxSizer* bSizer42; + bSizer42 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_bitmapStatus = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 28,28 ), 0 ); + bSizer42->Add( m_bitmapStatus, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatus->Wrap( -1 ); + m_staticTextStatus->SetFont( wxFont( 14, 74, 93, 90, false, wxT("Tahoma") ) ); + + bSizer42->Add( m_staticTextStatus, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + + bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); + + bSizer27->Add( bSizer42, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer31 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText21 = new wxStaticText( this, wxID_ANY, _("Current operation:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText21->Wrap( -1 ); + m_staticText21->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer31->Add( m_staticText21, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer31->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_staticText55 = new wxStaticText( this, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText55->Wrap( -1 ); + m_staticText55->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); + + bSizer31->Add( m_staticText55, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); + + m_staticTextTimeElapsed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeElapsed->Wrap( -1 ); + m_staticTextTimeElapsed->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer31->Add( m_staticTextTimeElapsed, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer27->Add( bSizer31, 0, wxEXPAND, 5 ); + + m_textCtrlInfo = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY ); + m_textCtrlInfo->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); + + bSizer27->Add( m_textCtrlInfo, 3, wxALL|wxEXPAND, 5 ); + + m_gauge1 = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,20 ), wxGA_HORIZONTAL ); + bSizer27->Add( m_gauge1, 0, wxALL|wxEXPAND, 5 ); + + bSizer28 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer33; + bSizer33 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText25 = new wxStaticText( this, wxID_ANY, _("Files/folders remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText25->Wrap( -1 ); + m_staticText25->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); + + bSizer33->Add( m_staticText25, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_staticTextRemainingObj = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_staticTextRemainingObj->Wrap( -1 ); + m_staticTextRemainingObj->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer33->Add( m_staticTextRemainingObj, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer28->Add( bSizer33, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer28->Add( 0, 0, 1, 0, 5 ); + + m_buttonOK = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( 100,32 ), 0 ); + m_buttonOK->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + m_buttonOK->Hide(); + + bSizer28->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_buttonPause = new wxButton( this, wxID_ANY, _("&Pause"), wxDefaultPosition, wxSize( 100,32 ), 0 ); + m_buttonPause->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer28->Add( m_buttonPause, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_buttonAbort = new wxButton( this, wxID_CANCEL, _("&Abort"), wxDefaultPosition, wxSize( 100,32 ), 0 ); + m_buttonAbort->SetDefault(); + m_buttonAbort->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer28->Add( m_buttonAbort, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer28->Add( 0, 0, 1, 0, 5 ); + + wxBoxSizer* bSizer32; + bSizer32 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText26 = new wxStaticText( this, wxID_ANY, _("Data remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText26->Wrap( -1 ); + m_staticText26->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); + + bSizer32->Add( m_staticText26, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_staticTextDataRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDataRemaining->Wrap( -1 ); + m_staticTextDataRemaining->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer32->Add( m_staticTextDataRemaining, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + bSizer28->Add( bSizer32, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer27->Add( bSizer28, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + + bSizer27->Add( 0, 5, 0, wxEXPAND, 5 ); + + this->SetSizer( bSizer27 ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncStatusDlgGenerated::OnClose ) ); + m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnOkay ), NULL, this ); + m_buttonPause->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnPause ), NULL, this ); + m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnAbort ), NULL, this ); } SyncStatusDlgGenerated::~SyncStatusDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncStatusDlgGenerated::OnClose ) ); - m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnOkay ), NULL, this ); - m_buttonPause->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnPause ), NULL, this ); - m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnAbort ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncStatusDlgGenerated::OnClose ) ); + m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnOkay ), NULL, this ); + m_buttonPause->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnPause ), NULL, this ); + m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnAbort ), NULL, this ); } HelpDlgGenerated::HelpDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer20; - bSizer20 = new wxBoxSizer( wxVERTICAL ); - - - bSizer20->Add( 0, 10, 0, wxEXPAND, 5 ); - - m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); - m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer72->Add( 20, 0, 0, 0, 5 ); - - m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Help"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText56->Wrap( -1 ); - m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer72->Add( 20, 0, 0, 0, 5 ); - - m_panel8->SetSizer( bSizer72 ); - m_panel8->Layout(); - bSizer72->Fit( m_panel8 ); - bSizer20->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer20->Add( 0, 5, 0, wxEXPAND, 5 ); - - m_notebook1 = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_scrolledWindow1 = new wxScrolledWindow( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxSIMPLE_BORDER|wxVSCROLL ); - m_scrolledWindow1->SetScrollRate( 5, 5 ); - m_scrolledWindow1->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_INACTIVEBORDER ) ); - - wxBoxSizer* bSizer70; - bSizer70 = new wxBoxSizer( wxVERTICAL ); - - m_staticText59 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("Compare by \"File size and date\""), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText59->Wrap( 500 ); - m_staticText59->SetFont( wxFont( 10, 74, 90, 92, true, wxT("Tahoma") ) ); - - bSizer70->Add( m_staticText59, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_staticText60 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. Notice that the file time is allowed to deviate by up to 2 seconds. This ensures synchronization with the lower-precision file system FAT32 works correctly."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText60->Wrap( 500 ); - bSizer70->Add( m_staticText60, 0, wxALL, 5 ); - - m_staticText61 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("When \"Compare\" is triggered with this option set the following decision tree is processed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText61->Wrap( 500 ); - bSizer70->Add( m_staticText61, 0, wxALL, 5 ); - - m_treeCtrl1 = new wxTreeCtrl( m_scrolledWindow1, wxID_ANY, wxDefaultPosition, wxSize( -1,180 ), wxTR_DEFAULT_STYLE ); - m_treeCtrl1->SetBackgroundColour( wxColour( 237, 236, 235 ) ); - - bSizer70->Add( m_treeCtrl1, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_staticText63 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("As a result 6 different status can be returned to categorize all files:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText63->Wrap( 500 ); - bSizer70->Add( m_staticText63, 0, wxALL, 5 ); - - m_staticText75 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- equal"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText75->Wrap( -1 ); - bSizer70->Add( m_staticText75, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText76 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- left newer"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText76->Wrap( -1 ); - bSizer70->Add( m_staticText76, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText77 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- right newer"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText77->Wrap( -1 ); - bSizer70->Add( m_staticText77, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText78 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- different (same date, different size)"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText78->Wrap( -1 ); - bSizer70->Add( m_staticText78, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText79 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- exists left only"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText79->Wrap( -1 ); - bSizer70->Add( m_staticText79, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText80 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- exists right only"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText80->Wrap( -1 ); - bSizer70->Add( m_staticText80, 0, wxRIGHT|wxLEFT, 5 ); - - m_scrolledWindow1->SetSizer( bSizer70 ); - m_scrolledWindow1->Layout(); - bSizer70->Fit( m_scrolledWindow1 ); - m_notebook1->AddPage( m_scrolledWindow1, _("File size and date"), true ); - m_scrolledWindow5 = new wxScrolledWindow( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); - m_scrolledWindow5->SetScrollRate( 5, 5 ); - m_scrolledWindow5->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_INACTIVEBORDER ) ); - - wxBoxSizer* bSizer74; - bSizer74 = new wxBoxSizer( wxVERTICAL ); - - m_staticText65 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("Compare by \"File content\""), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText65->Wrap( 500 ); - m_staticText65->SetFont( wxFont( 10, 74, 90, 92, true, wxT("Tahoma") ) ); - - bSizer74->Add( m_staticText65, 0, wxALL, 5 ); - - m_staticText66 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText66->Wrap( 500 ); - bSizer74->Add( m_staticText66, 0, wxALL, 5 ); - - m_treeCtrl2 = new wxTreeCtrl( m_scrolledWindow5, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE ); - m_treeCtrl2->SetBackgroundColour( wxColour( 237, 236, 235 ) ); - m_treeCtrl2->SetMinSize( wxSize( -1,130 ) ); - - bSizer74->Add( m_treeCtrl2, 0, wxALL|wxEXPAND, 5 ); - - m_staticText69 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("As a result the files are separated into the following categories:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText69->Wrap( 500 ); - bSizer74->Add( m_staticText69, 0, wxALL, 5 ); - - m_staticText81 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- equal"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText81->Wrap( -1 ); - bSizer74->Add( m_staticText81, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText82 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- different"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText82->Wrap( -1 ); - bSizer74->Add( m_staticText82, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText83 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- exists left only"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText83->Wrap( -1 ); - bSizer74->Add( m_staticText83, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText84 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- exists right only"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText84->Wrap( -1 ); - bSizer74->Add( m_staticText84, 0, wxRIGHT|wxLEFT, 5 ); - - m_scrolledWindow5->SetSizer( bSizer74 ); - m_scrolledWindow5->Layout(); - bSizer74->Fit( m_scrolledWindow5 ); - m_notebook1->AddPage( m_scrolledWindow5, _("File content"), false ); - - bSizer20->Add( m_notebook1, 1, wxEXPAND | wxALL, 5 ); - - m_button8 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( 100,32 ), 0 ); - m_button8->SetDefault(); - m_button8->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer20->Add( m_button8, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - this->SetSizer( bSizer20 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( HelpDlgGenerated::OnClose ) ); - m_button8->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( HelpDlgGenerated::OnOK ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer20; + bSizer20 = new wxBoxSizer( wxVERTICAL ); + + + bSizer20->Add( 0, 10, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer85; + bSizer85 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap25 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); + bSizer85->Add( m_bitmap25, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); + m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); + + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer72->Add( 20, 0, 0, 0, 5 ); + + m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Help"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText56->Wrap( -1 ); + m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer72->Add( 20, 0, 0, 0, 5 ); + + m_panel8->SetSizer( bSizer72 ); + m_panel8->Layout(); + bSizer72->Fit( m_panel8 ); + bSizer85->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer85->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer20->Add( bSizer85, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_notebook1 = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_scrolledWindow1 = new wxScrolledWindow( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxSIMPLE_BORDER|wxVSCROLL ); + m_scrolledWindow1->SetScrollRate( 5, 5 ); + m_scrolledWindow1->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_INACTIVEBORDER ) ); + + wxBoxSizer* bSizer70; + bSizer70 = new wxBoxSizer( wxVERTICAL ); + + m_staticText59 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("Compare by \"File size and date\""), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText59->Wrap( 500 ); + m_staticText59->SetFont( wxFont( 10, 74, 90, 92, true, wxT("Tahoma") ) ); + + bSizer70->Add( m_staticText59, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_staticText60 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. Notice that the file time is allowed to deviate by up to 2 seconds. This ensures synchronization with the lower-precision file system FAT32 works correctly."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText60->Wrap( 500 ); + bSizer70->Add( m_staticText60, 0, wxALL, 5 ); + + m_staticText61 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("When \"Compare\" is triggered with this option set the following decision tree is processed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText61->Wrap( 500 ); + bSizer70->Add( m_staticText61, 0, wxALL, 5 ); + + m_treeCtrl1 = new wxTreeCtrl( m_scrolledWindow1, wxID_ANY, wxDefaultPosition, wxSize( -1,180 ), wxTR_DEFAULT_STYLE ); + m_treeCtrl1->SetBackgroundColour( wxColour( 237, 236, 235 ) ); + + bSizer70->Add( m_treeCtrl1, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_staticText63 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("As a result 6 different status can be returned to categorize all files:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText63->Wrap( 500 ); + bSizer70->Add( m_staticText63, 0, wxALL, 5 ); + + m_staticText75 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- equal"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText75->Wrap( -1 ); + bSizer70->Add( m_staticText75, 0, wxRIGHT|wxLEFT, 5 ); + + m_staticText76 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- left newer"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText76->Wrap( -1 ); + bSizer70->Add( m_staticText76, 0, wxRIGHT|wxLEFT, 5 ); + + m_staticText77 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- right newer"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText77->Wrap( -1 ); + bSizer70->Add( m_staticText77, 0, wxRIGHT|wxLEFT, 5 ); + + m_staticText78 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- different (same date, different size)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText78->Wrap( -1 ); + bSizer70->Add( m_staticText78, 0, wxRIGHT|wxLEFT, 5 ); + + m_staticText79 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- exists left only"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText79->Wrap( -1 ); + bSizer70->Add( m_staticText79, 0, wxRIGHT|wxLEFT, 5 ); + + m_staticText80 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- exists right only"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText80->Wrap( -1 ); + bSizer70->Add( m_staticText80, 0, wxRIGHT|wxLEFT, 5 ); + + m_scrolledWindow1->SetSizer( bSizer70 ); + m_scrolledWindow1->Layout(); + bSizer70->Fit( m_scrolledWindow1 ); + m_notebook1->AddPage( m_scrolledWindow1, _("File size and date"), true ); + m_scrolledWindow5 = new wxScrolledWindow( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_scrolledWindow5->SetScrollRate( 5, 5 ); + m_scrolledWindow5->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_INACTIVEBORDER ) ); + + wxBoxSizer* bSizer74; + bSizer74 = new wxBoxSizer( wxVERTICAL ); + + m_staticText65 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("Compare by \"File content\""), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText65->Wrap( 500 ); + m_staticText65->SetFont( wxFont( 10, 74, 90, 92, true, wxT("Tahoma") ) ); + + bSizer74->Add( m_staticText65, 0, wxALL, 5 ); + + m_staticText66 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText66->Wrap( 500 ); + bSizer74->Add( m_staticText66, 0, wxALL, 5 ); + + m_treeCtrl2 = new wxTreeCtrl( m_scrolledWindow5, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE ); + m_treeCtrl2->SetBackgroundColour( wxColour( 237, 236, 235 ) ); + m_treeCtrl2->SetMinSize( wxSize( -1,130 ) ); + + bSizer74->Add( m_treeCtrl2, 0, wxALL|wxEXPAND, 5 ); + + m_staticText69 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("As a result the files are separated into the following categories:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText69->Wrap( 500 ); + bSizer74->Add( m_staticText69, 0, wxALL, 5 ); + + m_staticText81 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- equal"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText81->Wrap( -1 ); + bSizer74->Add( m_staticText81, 0, wxRIGHT|wxLEFT, 5 ); + + m_staticText82 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- different"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText82->Wrap( -1 ); + bSizer74->Add( m_staticText82, 0, wxRIGHT|wxLEFT, 5 ); + + m_staticText83 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- exists left only"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText83->Wrap( -1 ); + bSizer74->Add( m_staticText83, 0, wxRIGHT|wxLEFT, 5 ); + + m_staticText84 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- exists right only"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText84->Wrap( -1 ); + bSizer74->Add( m_staticText84, 0, wxRIGHT|wxLEFT, 5 ); + + m_scrolledWindow5->SetSizer( bSizer74 ); + m_scrolledWindow5->Layout(); + bSizer74->Fit( m_scrolledWindow5 ); + m_notebook1->AddPage( m_scrolledWindow5, _("File content"), false ); + + bSizer20->Add( m_notebook1, 1, wxEXPAND | wxALL, 5 ); + + m_button8 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( 100,32 ), 0 ); + m_button8->SetDefault(); + m_button8->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer20->Add( m_button8, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + this->SetSizer( bSizer20 ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( HelpDlgGenerated::OnClose ) ); + m_button8->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( HelpDlgGenerated::OnOK ), NULL, this ); } HelpDlgGenerated::~HelpDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( HelpDlgGenerated::OnClose ) ); - m_button8->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( HelpDlgGenerated::OnOK ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( HelpDlgGenerated::OnClose ) ); + m_button8->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( HelpDlgGenerated::OnOK ), NULL, this ); } AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer31; - bSizer31 = new wxBoxSizer( wxVERTICAL ); - - - bSizer31->Add( 0, 5, 0, 0, 5 ); - - m_panel5 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); - m_panel5->SetBackgroundColour( wxColour( 255, 255, 255 ) ); - - wxBoxSizer* bSizer36; - bSizer36 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap11 = new wxStaticBitmap( m_panel5, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 404,55 ), 0 ); - bSizer36->Add( m_bitmap11, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panel5->SetSizer( bSizer36 ); - m_panel5->Layout(); - bSizer36->Fit( m_panel5 ); - bSizer31->Add( m_panel5, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_staticText15 = new wxStaticText( this, wxID_ANY, _("-Open-Source file synchronization-"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText15->Wrap( -1 ); - m_staticText15->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer31->Add( m_staticText15, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - m_build = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_build->Wrap( -1 ); - m_build->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer31->Add( m_build, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer31->Add( 0, 10, 0, 0, 5 ); - - wxBoxSizer* bSizer53; - bSizer53 = new wxBoxSizer( wxVERTICAL ); - - m_scrolledWindow4 = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDOUBLE_BORDER|wxHSCROLL|wxVSCROLL ); - m_scrolledWindow4->SetScrollRate( 5, 5 ); - m_scrolledWindow4->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); - m_scrolledWindow4->SetMinSize( wxSize( -1,125 ) ); - - wxBoxSizer* bSizer73; - bSizer73 = new wxBoxSizer( wxVERTICAL ); - - m_staticText72 = new wxStaticText( m_scrolledWindow4, wxID_ANY, _("Source code written completely in C++ utilizing:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText72->Wrap( -1 ); - m_staticText72->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer73->Add( m_staticText72, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_staticText73 = new wxStaticText( m_scrolledWindow4, wxID_ANY, _(" MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText73->Wrap( -1 ); - bSizer73->Add( m_staticText73, 0, wxALL|wxEXPAND, 5 ); - - m_staticText74 = new wxStaticText( m_scrolledWindow4, wxID_ANY, _("- ZenJu -"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText74->Wrap( -1 ); - m_staticText74->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); - - bSizer73->Add( m_staticText74, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_scrolledWindow4->SetSizer( bSizer73 ); - m_scrolledWindow4->Layout(); - bSizer73->Fit( m_scrolledWindow4 ); - bSizer53->Add( m_scrolledWindow4, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM, 10 ); - - m_scrolledWindow3 = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxDOUBLE_BORDER|wxHSCROLL|wxVSCROLL ); - m_scrolledWindow3->SetScrollRate( 5, 5 ); - m_scrolledWindow3->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); - m_scrolledWindow3->SetMinSize( wxSize( -1,90 ) ); - m_scrolledWindow3->SetMaxSize( wxSize( -1,100 ) ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxVERTICAL ); - - m_staticText54 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Big thanks for localizing FreeFileSync goes out to:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText54->Wrap( -1 ); - m_staticText54->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer72->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 5 ); - - wxFlexGridSizer* fgSizer9; - fgSizer9 = new wxFlexGridSizer( 2, 2, 5, 20 ); - fgSizer9->SetFlexibleDirection( wxBOTH ); - fgSizer9->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_staticText68 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Jean-François Hartmann"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText68->Wrap( -1 ); - fgSizer9->Add( m_staticText68, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText69 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Français"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText69->Wrap( -1 ); - fgSizer9->Add( m_staticText69, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText70 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Tilt"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText70->Wrap( -1 ); - fgSizer9->Add( m_staticText70, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText71 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("日本語"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText71->Wrap( -1 ); - fgSizer9->Add( m_staticText71, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText711 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("M.D. Vrakking"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText711->Wrap( -1 ); - fgSizer9->Add( m_staticText711, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText712 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Nederlands"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText712->Wrap( -1 ); - fgSizer9->Add( m_staticText712, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer72->Add( fgSizer9, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM, 5 ); - - m_scrolledWindow3->SetSizer( bSizer72 ); - m_scrolledWindow3->Layout(); - bSizer72->Fit( m_scrolledWindow3 ); - bSizer53->Add( m_scrolledWindow3, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - bSizer31->Add( bSizer53, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 30 ); - - m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer31->Add( m_staticline3, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); - - wxStaticBoxSizer* sbSizer7; - sbSizer7 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); - - m_staticText131 = new wxStaticText( this, wxID_ANY, _("Feedback and suggestions are welcome at:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText131->Wrap( -1 ); - m_staticText131->SetFont( wxFont( 11, 74, 93, 92, false, wxT("Tahoma") ) ); - - sbSizer7->Add( m_staticText131, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer31->Add( sbSizer7, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - wxFlexGridSizer* fgSizer2; - fgSizer2 = new wxFlexGridSizer( 3, 3, 0, 0 ); - fgSizer2->SetFlexibleDirection( wxHORIZONTAL ); - fgSizer2->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_bitmap9 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - fgSizer2->Add( m_bitmap9, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_staticText11 = new wxStaticText( this, wxID_ANY, _("Homepage:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText11->Wrap( -1 ); - m_staticText11->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer2->Add( m_staticText11, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_hyperlink1 = new wxHyperlinkCtrl( this, wxID_ANY, _("FreeFileSync at Sourceforge"), wxT("http://sourceforge.net/projects/freefilesync/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink1->SetToolTip( _("http://sourceforge.net/projects/freefilesync/") ); - - fgSizer2->Add( m_hyperlink1, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - fgSizer2->Add( m_bitmap10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - m_staticText13 = new wxStaticText( this, wxID_ANY, _("Email:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText13->Wrap( -1 ); - m_staticText13->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer2->Add( m_staticText13, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_hyperlink2 = new wxHyperlinkCtrl( this, wxID_ANY, _("zhnmju123@gmx.de"), wxT("mailto:zhnmju123@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - fgSizer2->Add( m_hyperlink2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_animationControl1 = new wxAnimationCtrl(this, wxID_ANY, wxNullAnimation); - m_animationControl1->Hide(); - - fgSizer2->Add( m_animationControl1, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_staticText151 = new wxStaticText( this, wxID_ANY, _("If you like FFS:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText151->Wrap( -1 ); - m_staticText151->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer2->Add( m_staticText151, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_hyperlink3 = new wxHyperlinkCtrl( this, wxID_ANY, _("Donate with PayPal"), wxT("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zhnmju123%40gmx%2ede&no_shipping=0&no_note=1&tax=0¤cy_code=EUR&lc=EN&bn=PP%2dDonationsBF&charset=UTF%2d8"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - fgSizer2->Add( m_hyperlink3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer31->Add( fgSizer2, 0, wxLEFT|wxEXPAND, 10 ); - - m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer31->Add( m_staticline2, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); - - wxStaticBoxSizer* sbSizer14; - sbSizer14 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Published under the GNU General Public License:") ), wxHORIZONTAL ); - - - sbSizer14->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap13 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 88,31 ), 0 ); - sbSizer14->Add( m_bitmap13, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_hyperlink5 = new wxHyperlinkCtrl( this, wxID_ANY, _("http://www.gnu.org/licenses/gpl.html"), wxT("http://www.gnu.org/licenses/gpl.html"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - sbSizer14->Add( m_hyperlink5, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - sbSizer14->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer31->Add( sbSizer14, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); - - m_button8 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( 100,32 ), 0 ); - m_button8->SetDefault(); - m_button8->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer31->Add( m_button8, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - - this->SetSizer( bSizer31 ); - this->Layout(); - bSizer31->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) ); - m_button8->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer31; + bSizer31 = new wxBoxSizer( wxVERTICAL ); + + + bSizer31->Add( 0, 5, 0, 0, 5 ); + + m_panel5 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); + m_panel5->SetBackgroundColour( wxColour( 255, 255, 255 ) ); + + wxBoxSizer* bSizer36; + bSizer36 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap11 = new wxStaticBitmap( m_panel5, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 404,55 ), 0 ); + bSizer36->Add( m_bitmap11, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panel5->SetSizer( bSizer36 ); + m_panel5->Layout(); + bSizer36->Fit( m_panel5 ); + bSizer31->Add( m_panel5, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_staticText15 = new wxStaticText( this, wxID_ANY, _("-Open-Source file synchronization-"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText15->Wrap( -1 ); + m_staticText15->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer31->Add( m_staticText15, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_build = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_build->Wrap( -1 ); + m_build->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer31->Add( m_build, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer31->Add( 0, 10, 0, 0, 5 ); + + wxBoxSizer* bSizer53; + bSizer53 = new wxBoxSizer( wxVERTICAL ); + + m_scrolledWindow4 = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDOUBLE_BORDER|wxHSCROLL|wxVSCROLL ); + m_scrolledWindow4->SetScrollRate( 5, 5 ); + m_scrolledWindow4->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); + m_scrolledWindow4->SetMinSize( wxSize( -1,125 ) ); + + wxBoxSizer* bSizer73; + bSizer73 = new wxBoxSizer( wxVERTICAL ); + + m_staticText72 = new wxStaticText( m_scrolledWindow4, wxID_ANY, _("Source code written completely in C++ utilizing:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText72->Wrap( -1 ); + m_staticText72->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer73->Add( m_staticText72, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_staticText73 = new wxStaticText( m_scrolledWindow4, wxID_ANY, _(" MinGW \t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText73->Wrap( -1 ); + bSizer73->Add( m_staticText73, 0, wxALL|wxEXPAND, 5 ); + + m_staticText74 = new wxStaticText( m_scrolledWindow4, wxID_ANY, _("- ZenJu -"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText74->Wrap( -1 ); + m_staticText74->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); + + bSizer73->Add( m_staticText74, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_scrolledWindow4->SetSizer( bSizer73 ); + m_scrolledWindow4->Layout(); + bSizer73->Fit( m_scrolledWindow4 ); + bSizer53->Add( m_scrolledWindow4, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM, 10 ); + + m_scrolledWindow3 = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxDOUBLE_BORDER|wxHSCROLL|wxVSCROLL ); + m_scrolledWindow3->SetScrollRate( 5, 5 ); + m_scrolledWindow3->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); + m_scrolledWindow3->SetMinSize( wxSize( -1,90 ) ); + m_scrolledWindow3->SetMaxSize( wxSize( -1,100 ) ); + + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxVERTICAL ); + + m_staticText54 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Big thanks for localizing FreeFileSync goes out to:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText54->Wrap( -1 ); + m_staticText54->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer72->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 5 ); + + wxFlexGridSizer* fgSizer9; + fgSizer9 = new wxFlexGridSizer( 2, 2, 5, 20 ); + fgSizer9->SetFlexibleDirection( wxBOTH ); + fgSizer9->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_staticText68 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Jean-François Hartmann"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText68->Wrap( -1 ); + fgSizer9->Add( m_staticText68, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText69 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Français"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText69->Wrap( -1 ); + fgSizer9->Add( m_staticText69, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText70 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Tilt"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText70->Wrap( -1 ); + fgSizer9->Add( m_staticText70, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText71 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("日本語"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText71->Wrap( -1 ); + fgSizer9->Add( m_staticText71, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText711 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("M.D. Vrakking"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText711->Wrap( -1 ); + fgSizer9->Add( m_staticText711, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText712 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Nederlands"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText712->Wrap( -1 ); + fgSizer9->Add( m_staticText712, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer72->Add( fgSizer9, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM, 5 ); + + m_scrolledWindow3->SetSizer( bSizer72 ); + m_scrolledWindow3->Layout(); + bSizer72->Fit( m_scrolledWindow3 ); + bSizer53->Add( m_scrolledWindow3, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + bSizer31->Add( bSizer53, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 30 ); + + m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer31->Add( m_staticline3, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); + + wxStaticBoxSizer* sbSizer7; + sbSizer7 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); + + m_staticText131 = new wxStaticText( this, wxID_ANY, _("Feedback and suggestions are welcome at:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText131->Wrap( -1 ); + m_staticText131->SetFont( wxFont( 11, 74, 93, 92, false, wxT("Tahoma") ) ); + + sbSizer7->Add( m_staticText131, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer31->Add( sbSizer7, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + wxFlexGridSizer* fgSizer2; + fgSizer2 = new wxFlexGridSizer( 3, 3, 0, 0 ); + fgSizer2->SetFlexibleDirection( wxHORIZONTAL ); + fgSizer2->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_bitmap9 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + fgSizer2->Add( m_bitmap9, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_staticText11 = new wxStaticText( this, wxID_ANY, _("Homepage:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText11->Wrap( -1 ); + m_staticText11->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer2->Add( m_staticText11, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_hyperlink1 = new wxHyperlinkCtrl( this, wxID_ANY, _("FreeFileSync at Sourceforge"), wxT("http://sourceforge.net/projects/freefilesync/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink1->SetToolTip( _("http://sourceforge.net/projects/freefilesync/") ); + + fgSizer2->Add( m_hyperlink1, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + fgSizer2->Add( m_bitmap10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + m_staticText13 = new wxStaticText( this, wxID_ANY, _("Email:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText13->Wrap( -1 ); + m_staticText13->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer2->Add( m_staticText13, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_hyperlink2 = new wxHyperlinkCtrl( this, wxID_ANY, _("zhnmju123@gmx.de"), wxT("mailto:zhnmju123@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + fgSizer2->Add( m_hyperlink2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_animationControl1 = new wxAnimationCtrl(this, wxID_ANY, wxNullAnimation); + m_animationControl1->Hide(); + + fgSizer2->Add( m_animationControl1, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_staticText151 = new wxStaticText( this, wxID_ANY, _("If you like FFS:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText151->Wrap( -1 ); + m_staticText151->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer2->Add( m_staticText151, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_hyperlink3 = new wxHyperlinkCtrl( this, wxID_ANY, _("Donate with PayPal"), wxT("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zhnmju123%40gmx%2ede&no_shipping=0&no_note=1&tax=0¤cy_code=EUR&lc=EN&bn=PP%2dDonationsBF&charset=UTF%2d8"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + fgSizer2->Add( m_hyperlink3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer31->Add( fgSizer2, 0, wxLEFT|wxEXPAND, 10 ); + + m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer31->Add( m_staticline2, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); + + wxStaticBoxSizer* sbSizer14; + sbSizer14 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Published under the GNU General Public License:") ), wxHORIZONTAL ); + + + sbSizer14->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap13 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 88,31 ), 0 ); + sbSizer14->Add( m_bitmap13, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_hyperlink5 = new wxHyperlinkCtrl( this, wxID_ANY, _("http://www.gnu.org/licenses/gpl.html"), wxT("http://www.gnu.org/licenses/gpl.html"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + sbSizer14->Add( m_hyperlink5, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + sbSizer14->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer31->Add( sbSizer14, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); + + m_button8 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( 100,32 ), 0 ); + m_button8->SetDefault(); + m_button8->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer31->Add( m_button8, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + this->SetSizer( bSizer31 ); + this->Layout(); + bSizer31->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) ); + m_button8->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this ); } AboutDlgGenerated::~AboutDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) ); - m_button8->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) ); + m_button8->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this ); } ErrorDlgGenerated::ErrorDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer24; - bSizer24 = new wxBoxSizer( wxVERTICAL ); - - - bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer26; - bSizer26 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - bSizer26->Add( m_bitmap10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY ); - m_textCtrl8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); - - bSizer26->Add( m_textCtrl8, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - bSizer24->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - - bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); - - m_checkBoxContinueError = new wxCheckBox( this, wxID_ANY, _("Continue on next errors"), wxDefaultPosition, wxDefaultSize, 0 ); - - m_checkBoxContinueError->SetToolTip( _("Hide further error messages during the current process and continue") ); - - bSizer24->Add( m_checkBoxContinueError, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer25; - bSizer25 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonContinue = new wxButton( this, wxID_OK, _("&Continue"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonContinue->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer25->Add( m_buttonContinue, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_buttonRetry = new wxButton( this, wxID_RETRY, _("&Retry"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonRetry->SetDefault(); - m_buttonRetry->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer25->Add( m_buttonRetry, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_buttonAbort = new wxButton( this, wxID_CANCEL, _("&Abort"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonAbort->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer25->Add( m_buttonAbort, 0, wxALL, 5 ); - - bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - this->SetSizer( bSizer24 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ErrorDlgGenerated::OnClose ) ); - m_buttonContinue->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnContinue ), NULL, this ); - m_buttonRetry->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnRetry ), NULL, this ); - m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnAbort ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer24; + bSizer24 = new wxBoxSizer( wxVERTICAL ); + + + bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer26; + bSizer26 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + bSizer26->Add( m_bitmap10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY ); + m_textCtrl8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); + + bSizer26->Add( m_textCtrl8, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + bSizer24->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + + bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); + + m_checkBoxIgnoreErrors = new wxCheckBox( this, wxID_ANY, _("Ignore next errors"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_checkBoxIgnoreErrors->SetToolTip( _("Hide further error messages during the current process") ); + + bSizer24->Add( m_checkBoxIgnoreErrors, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer25; + bSizer25 = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonIgnore = new wxButton( this, wxID_OK, _("&Ignore"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonIgnore->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer25->Add( m_buttonIgnore, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_buttonRetry = new wxButton( this, wxID_RETRY, _("&Retry"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonRetry->SetDefault(); + m_buttonRetry->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer25->Add( m_buttonRetry, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_buttonAbort = new wxButton( this, wxID_CANCEL, _("&Abort"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonAbort->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer25->Add( m_buttonAbort, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + + bSizer25->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + this->SetSizer( bSizer24 ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ErrorDlgGenerated::OnClose ) ); + m_buttonIgnore->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnIgnore ), NULL, this ); + m_buttonRetry->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnRetry ), NULL, this ); + m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnAbort ), NULL, this ); } ErrorDlgGenerated::~ErrorDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ErrorDlgGenerated::OnClose ) ); - m_buttonContinue->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnContinue ), NULL, this ); - m_buttonRetry->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnRetry ), NULL, this ); - m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnAbort ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ErrorDlgGenerated::OnClose ) ); + m_buttonIgnore->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnIgnore ), NULL, this ); + m_buttonRetry->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnRetry ), NULL, this ); + m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnAbort ), NULL, this ); } -DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +WarningDlgGenerated::WarningDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer24; - bSizer24 = new wxBoxSizer( wxVERTICAL ); - - - bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer41; - bSizer41 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer41->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_bitmap12 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); - bSizer41->Add( m_bitmap12, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextHeader->Wrap( -1 ); - m_staticTextHeader->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer41->Add( m_staticTextHeader, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer41->Add( 0, 0, 1, wxEXPAND, 5 ); - - bSizer24->Add( bSizer41, 0, wxEXPAND, 5 ); - - m_textCtrlMessage = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY ); - m_textCtrlMessage->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); - - bSizer24->Add( m_textCtrlMessage, 1, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - wxBoxSizer* bSizer25; - bSizer25 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonOK = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonOK->SetDefault(); - m_buttonOK->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer25->Add( m_buttonOK, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonCancel->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer25->Add( m_buttonCancel, 0, wxALL, 5 ); - - bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer24; + bSizer24 = new wxBoxSizer( wxVERTICAL ); + + + bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer26; + bSizer26 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + bSizer26->Add( m_bitmap10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY ); + m_textCtrl8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); + + bSizer26->Add( m_textCtrl8, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + bSizer24->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + + bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); + + m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("Do not show this warning again"), wxDefaultPosition, wxDefaultSize, 0 ); + + bSizer24->Add( m_checkBoxDontShowAgain, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer25; + bSizer25 = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonIgnore = new wxButton( this, wxID_IGNORE, _("&Ignore"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonIgnore->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer25->Add( m_buttonIgnore, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_buttonResolve = new wxButton( this, wxID_ANY, _("&Resolve"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonResolve->SetDefault(); + m_buttonResolve->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer25->Add( m_buttonResolve, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_buttonAbort = new wxButton( this, wxID_CANCEL, _("&Abort"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonAbort->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer25->Add( m_buttonAbort, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_buttonOK = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonOK->SetDefault(); + m_buttonOK->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer25->Add( m_buttonOK, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + + bSizer25->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + this->SetSizer( bSizer24 ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( WarningDlgGenerated::OnClose ) ); + m_buttonIgnore->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnIgnore ), NULL, this ); + m_buttonResolve->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnResolve ), NULL, this ); + m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnAbort ), NULL, this ); + m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnOkay ), NULL, this ); +} - this->SetSizer( bSizer24 ); - this->Layout(); +WarningDlgGenerated::~WarningDlgGenerated() +{ + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( WarningDlgGenerated::OnClose ) ); + m_buttonIgnore->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnIgnore ), NULL, this ); + m_buttonResolve->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnResolve ), NULL, this ); + m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnAbort ), NULL, this ); + m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnOkay ), NULL, this ); +} - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) ); - m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this ); +DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer24; + bSizer24 = new wxBoxSizer( wxVERTICAL ); + + + bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer41; + bSizer41 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer41->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_bitmap12 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); + bSizer41->Add( m_bitmap12, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHeader->Wrap( -1 ); + m_staticTextHeader->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer41->Add( m_staticTextHeader, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer41->Add( 0, 0, 1, wxEXPAND, 5 ); + + bSizer24->Add( bSizer41, 0, wxEXPAND, 5 ); + + m_textCtrlMessage = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY ); + m_textCtrlMessage->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); + + bSizer24->Add( m_textCtrlMessage, 1, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer25; + bSizer25 = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonOK = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonOK->SetDefault(); + m_buttonOK->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer25->Add( m_buttonOK, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonCancel->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer25->Add( m_buttonCancel, 0, wxALL, 5 ); + + bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + this->SetSizer( bSizer24 ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) ); + m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this ); } DeleteDlgGenerated::~DeleteDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) ); - m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this ); - m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) ); + m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this ); + m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this ); } FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer21; - bSizer21 = new wxBoxSizer( wxVERTICAL ); - - m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); - m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxVERTICAL ); - - m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Set filter for synchronization"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText56->Wrap( -1 ); - m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - - m_panel8->SetSizer( bSizer72 ); - m_panel8->Layout(); - bSizer72->Fit( m_panel8 ); - bSizer21->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10 ); - - wxBoxSizer* bSizer70; - bSizer70 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText44 = new wxStaticText( this, wxID_ANY, _("Only files/directories that pass filtering will be selected for synchronization.\nThe filter will be applied to the full name including path prefix."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText44->Wrap( 400 ); - bSizer70->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonHelp = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - m_bpButtonHelp->SetToolTip( _("Help") ); - - m_bpButtonHelp->SetToolTip( _("Help") ); - - bSizer70->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - bSizer21->Add( bSizer70, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer21->Add( 0, 5, 0, 0, 5 ); - - m_panel13 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer69; - bSizer69 = new wxBoxSizer( wxVERTICAL ); - - m_staticline10 = new wxStaticLine( m_panel13, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer69->Add( m_staticline10, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); - - wxBoxSizer* bSizer52; - bSizer52 = new wxBoxSizer( wxVERTICAL ); - - m_staticText45 = new wxStaticText( m_panel13, wxID_ANY, _("Hints:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText45->Wrap( -1 ); - m_staticText45->SetFont( wxFont( 10, 74, 90, 92, true, wxT("Tahoma") ) ); - - bSizer52->Add( m_staticText45, 0, wxBOTTOM, 5 ); - - m_staticText83 = new wxStaticText( m_panel13, wxID_ANY, _("1. Enter full file or directory names separated by ';' or a new line."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText83->Wrap( -1 ); - bSizer52->Add( m_staticText83, 0, 0, 5 ); - - m_staticText84 = new wxStaticText( m_panel13, wxID_ANY, _("2. Use wildcard characters '*' and '?'."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText84->Wrap( -1 ); - bSizer52->Add( m_staticText84, 0, 0, 5 ); - - m_staticText85 = new wxStaticText( m_panel13, wxID_ANY, _("3. Exclude files directly on main grid via context menu."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText85->Wrap( -1 ); - bSizer52->Add( m_staticText85, 0, 0, 5 ); - - m_staticText86 = new wxStaticText( m_panel13, wxID_ANY, _("4. Keep the number of entries small for best performance."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText86->Wrap( -1 ); - bSizer52->Add( m_staticText86, 0, wxBOTTOM, 5 ); - - bSizer69->Add( bSizer52, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - wxStaticBoxSizer* sbSizer21; - sbSizer21 = new wxStaticBoxSizer( new wxStaticBox( m_panel13, wxID_ANY, _("Example") ), wxVERTICAL ); - - wxBoxSizer* bSizer66; - bSizer66 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText181 = new wxStaticText( m_panel13, wxID_ANY, _("Include: *.doc;*.zip;*.exe\nExclude: *\\temp\\*"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText181->Wrap( -1 ); - bSizer66->Add( m_staticText181, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText1811 = new wxStaticText( m_panel13, wxID_ANY, _("Synchronize all .doc, .zip and .exe files except everything from folder \"temp\"."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText1811->Wrap( 250 ); - m_staticText1811->SetFont( wxFont( 8, 74, 93, 90, false, wxT("Tahoma") ) ); - - bSizer66->Add( m_staticText1811, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - sbSizer21->Add( bSizer66, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 ); - - bSizer69->Add( sbSizer21, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_panel13->SetSizer( bSizer69 ); - m_panel13->Layout(); - bSizer69->Fit( m_panel13 ); - bSizer21->Add( m_panel13, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM, 5 ); - - wxStaticBoxSizer* sbSizer8; - sbSizer8 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); - - wxFlexGridSizer* fgSizer3; - fgSizer3 = new wxFlexGridSizer( 2, 2, 0, 0 ); - fgSizer3->SetFlexibleDirection( wxBOTH ); - fgSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - - fgSizer3->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_staticText15 = new wxStaticText( this, wxID_ANY, _("Include"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText15->Wrap( -1 ); - m_staticText15->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer3->Add( m_staticText15, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_bitmap8 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); - fgSizer3->Add( m_bitmap8, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_textCtrlInclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 400,-1 ), wxTE_MULTILINE ); - fgSizer3->Add( m_textCtrlInclude, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - sbSizer8->Add( fgSizer3, 0, 0, 5 ); - - wxFlexGridSizer* fgSizer4; - fgSizer4 = new wxFlexGridSizer( 2, 2, 0, 0 ); - fgSizer4->SetFlexibleDirection( wxBOTH ); - fgSizer4->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - - fgSizer4->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_staticText16 = new wxStaticText( this, wxID_ANY, _("Exclude"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText16->Wrap( -1 ); - m_staticText16->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer4->Add( m_staticText16, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_bitmap9 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); - fgSizer4->Add( m_bitmap9, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_textCtrlExclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 400,-1 ), wxTE_MULTILINE ); - fgSizer4->Add( m_textCtrlExclude, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - sbSizer8->Add( fgSizer4, 0, 0, 5 ); - - bSizer21->Add( sbSizer8, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - - - bSizer21->Add( 0, 0, 0, 0, 5 ); - - wxBoxSizer* bSizer22; - bSizer22 = new wxBoxSizer( wxHORIZONTAL ); - - m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button9->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer22->Add( m_button9, 0, wxALL, 5 ); - - - bSizer22->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_button17 = new wxButton( this, wxID_CANCEL, _("dummy"), wxDefaultPosition, wxSize( 0,0 ), 0 ); - bSizer22->Add( m_button17, 0, wxALIGN_BOTTOM, 5 ); - - m_button10 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button10->SetDefault(); - m_button10->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer22->Add( m_button10, 0, wxALL, 5 ); - - bSizer21->Add( bSizer22, 0, wxEXPAND|wxTOP, 5 ); - - this->SetSizer( bSizer21 ); - this->Layout(); - bSizer21->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) ); - m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this ); - m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnDefault ), NULL, this ); - m_button17->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this ); - m_button10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnOK ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer21; + bSizer21 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer86; + bSizer86 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap26 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); + bSizer86->Add( m_bitmap26, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); + m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); + + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxVERTICAL ); + + m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Set filter for synchronization"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText56->Wrap( -1 ); + m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + m_panel8->SetSizer( bSizer72 ); + m_panel8->Layout(); + bSizer72->Fit( m_panel8 ); + bSizer86->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer86->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer21->Add( bSizer86, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM, 5 ); + + + bSizer21->Add( 0, 0, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxBoxSizer* bSizer70; + bSizer70 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText44 = new wxStaticText( this, wxID_ANY, _("Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the full name including path prefix."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText44->Wrap( 400 ); + bSizer70->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonHelp = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButtonHelp->SetToolTip( _("Help") ); + + m_bpButtonHelp->SetToolTip( _("Help") ); + + bSizer70->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + bSizer21->Add( bSizer70, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 ); + + + bSizer21->Add( 0, 5, 0, 0, 5 ); + + m_panel13 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer69; + bSizer69 = new wxBoxSizer( wxVERTICAL ); + + m_staticline10 = new wxStaticLine( m_panel13, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer69->Add( m_staticline10, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); + + wxBoxSizer* bSizer52; + bSizer52 = new wxBoxSizer( wxVERTICAL ); + + m_staticText45 = new wxStaticText( m_panel13, wxID_ANY, _("Hints:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText45->Wrap( -1 ); + m_staticText45->SetFont( wxFont( 10, 74, 90, 92, true, wxT("Tahoma") ) ); + + bSizer52->Add( m_staticText45, 0, wxBOTTOM, 5 ); + + m_staticText83 = new wxStaticText( m_panel13, wxID_ANY, _("1. Enter full file or directory names separated by ';' or a new line."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText83->Wrap( -1 ); + bSizer52->Add( m_staticText83, 0, 0, 5 ); + + m_staticText84 = new wxStaticText( m_panel13, wxID_ANY, _("2. Use wildcard characters '*' and '?'."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText84->Wrap( -1 ); + bSizer52->Add( m_staticText84, 0, 0, 5 ); + + m_staticText85 = new wxStaticText( m_panel13, wxID_ANY, _("3. Exclude files directly on main grid via context menu."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText85->Wrap( -1 ); + bSizer52->Add( m_staticText85, 0, 0, 5 ); + + m_staticText86 = new wxStaticText( m_panel13, wxID_ANY, _("4. Keep the number of entries small for best performance."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText86->Wrap( -1 ); + bSizer52->Add( m_staticText86, 0, wxBOTTOM, 5 ); + + bSizer69->Add( bSizer52, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxStaticBoxSizer* sbSizer21; + sbSizer21 = new wxStaticBoxSizer( new wxStaticBox( m_panel13, wxID_ANY, _("Example") ), wxVERTICAL ); + + wxBoxSizer* bSizer66; + bSizer66 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText181 = new wxStaticText( m_panel13, wxID_ANY, _("Include: *.doc;*.zip;*.exe\nExclude: *\\temp\\*"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText181->Wrap( -1 ); + bSizer66->Add( m_staticText181, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText1811 = new wxStaticText( m_panel13, wxID_ANY, _("Synchronize all .doc, .zip and .exe files except everything from folder \"temp\"."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText1811->Wrap( 250 ); + m_staticText1811->SetFont( wxFont( 8, 74, 93, 90, false, wxT("Tahoma") ) ); + + bSizer66->Add( m_staticText1811, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + sbSizer21->Add( bSizer66, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 ); + + bSizer69->Add( sbSizer21, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_panel13->SetSizer( bSizer69 ); + m_panel13->Layout(); + bSizer69->Fit( m_panel13 ); + bSizer21->Add( m_panel13, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxEXPAND, 5 ); + + wxStaticBoxSizer* sbSizer8; + sbSizer8 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); + + wxFlexGridSizer* fgSizer3; + fgSizer3 = new wxFlexGridSizer( 2, 2, 0, 0 ); + fgSizer3->SetFlexibleDirection( wxBOTH ); + fgSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + + fgSizer3->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_staticText15 = new wxStaticText( this, wxID_ANY, _("Include"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText15->Wrap( -1 ); + m_staticText15->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer3->Add( m_staticText15, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_bitmap8 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); + fgSizer3->Add( m_bitmap8, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_textCtrlInclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 400,-1 ), wxTE_MULTILINE ); + fgSizer3->Add( m_textCtrlInclude, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer8->Add( fgSizer3, 0, 0, 5 ); + + wxFlexGridSizer* fgSizer4; + fgSizer4 = new wxFlexGridSizer( 2, 2, 0, 0 ); + fgSizer4->SetFlexibleDirection( wxBOTH ); + fgSizer4->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + + fgSizer4->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_staticText16 = new wxStaticText( this, wxID_ANY, _("Exclude"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText16->Wrap( -1 ); + m_staticText16->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer4->Add( m_staticText16, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_bitmap9 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); + fgSizer4->Add( m_bitmap9, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_textCtrlExclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 400,-1 ), wxTE_MULTILINE ); + fgSizer4->Add( m_textCtrlExclude, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer8->Add( fgSizer4, 0, 0, 5 ); + + bSizer21->Add( sbSizer8, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizer21->Add( 0, 0, 0, 0, 5 ); + + wxBoxSizer* bSizer22; + bSizer22 = new wxBoxSizer( wxHORIZONTAL ); + + m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button9->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer22->Add( m_button9, 0, wxALL, 5 ); + + + bSizer22->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_button17 = new wxButton( this, wxID_CANCEL, _("dummy"), wxDefaultPosition, wxSize( 0,0 ), 0 ); + bSizer22->Add( m_button17, 0, wxALIGN_BOTTOM, 5 ); + + m_button10 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button10->SetDefault(); + m_button10->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer22->Add( m_button10, 0, wxALL, 5 ); + + bSizer21->Add( bSizer22, 0, wxEXPAND|wxTOP, 5 ); + + this->SetSizer( bSizer21 ); + this->Layout(); + bSizer21->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) ); + m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this ); + m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnDefault ), NULL, this ); + m_button17->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this ); + m_button10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnOK ), NULL, this ); } FilterDlgGenerated::~FilterDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) ); - m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this ); - m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnDefault ), NULL, this ); - m_button17->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this ); - m_button10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnOK ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) ); + m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this ); + m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnDefault ), NULL, this ); + m_button17->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this ); + m_button10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnOK ), NULL, this ); } ModifyFilesDlgGenerated::ModifyFilesDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer80; - bSizer80 = new wxBoxSizer( wxVERTICAL ); - - m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); - m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxVERTICAL ); - - - bSizer72->Add( 20, 0, 0, 0, 5 ); - - m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Adjust file times"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText56->Wrap( -1 ); - m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer72->Add( 20, 0, 0, 0, 5 ); - - m_panel8->SetSizer( bSizer72 ); - m_panel8->Layout(); - bSizer72->Fit( m_panel8 ); - bSizer80->Add( m_panel8, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer80->Add( 0, 5, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer84; - bSizer84 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer84->Add( 10, 0, 0, wxEXPAND, 5 ); - - m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("Adjust modification times of all files contained in the specified folder and its subfolders. This manual adaption might become necessary if you are synchronizing against a FAT32 drive and the daylight saving time is switched. For an overview about the issue see this article:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextHeader->Wrap( 400 ); - m_staticTextHeader->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer84->Add( m_staticTextHeader, 0, wxALL, 5 ); - - - bSizer84->Add( 10, 0, 0, wxEXPAND, 5 ); - - bSizer80->Add( bSizer84, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_hyperlink6 = new wxHyperlinkCtrl( this, wxID_ANY, _("http://www.codeproject.com/KB/datetime/dstbugs.aspx"), wxT("http://www.codeproject.com/KB/datetime/dstbugs.aspx"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - bSizer80->Add( m_hyperlink6, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer80->Add( 0, 5, 0, wxEXPAND, 5 ); - - wxStaticBoxSizer* sbSizer24; - sbSizer24 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Select folder") ), wxHORIZONTAL ); - - m_textCtrlDirectory = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - sbSizer24->Add( m_textCtrlDirectory, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - m_dirPicker = new wxDirPickerCtrl( this, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DIR_MUST_EXIST ); - sbSizer24->Add( m_dirPicker, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - bSizer80->Add( sbSizer24, 0, wxEXPAND|wxALL, 5 ); - - wxStaticBoxSizer* sbSizer23; - sbSizer23 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Time shift in seconds") ), wxVERTICAL ); - - m_spinCtrlTimeShift = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, -2100000000, 2100000000, 0 ); - sbSizer23->Add( m_spinCtrlTimeShift, 0, wxRIGHT|wxLEFT, 5 ); - - bSizer80->Add( sbSizer23, 0, wxALL|wxEXPAND, 5 ); - - wxBoxSizer* bSizer83; - bSizer83 = new wxBoxSizer( wxHORIZONTAL ); - - m_button21 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button21->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer83->Add( m_button21, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonApply = new wxButton( this, wxID_ANY, _("Apply"), wxDefaultPosition, wxSize( -1,35 ), 0 ); - m_buttonApply->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer83->Add( m_buttonApply, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer80->Add( bSizer83, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - this->SetSizer( bSizer80 ); - this->Layout(); - bSizer80->Fit( this ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ModifyFilesDlgGenerated::OnClose ) ); - m_textCtrlDirectory->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( ModifyFilesDlgGenerated::OnWriteDirManually ), NULL, this ); - m_dirPicker->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( ModifyFilesDlgGenerated::OnDirSelected ), NULL, this ); - m_button21->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ModifyFilesDlgGenerated::OnCancel ), NULL, this ); - m_buttonApply->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ModifyFilesDlgGenerated::OnApply ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer80; + bSizer80 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer841; + bSizer841 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap24 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); + bSizer841->Add( m_bitmap24, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); + m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); + + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxVERTICAL ); + + m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Adjust file times"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText56->Wrap( -1 ); + m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_panel8->SetSizer( bSizer72 ); + m_panel8->Layout(); + bSizer72->Fit( m_panel8 ); + bSizer841->Add( m_panel8, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer841->Add( 0, 0, 1, 0, 5 ); + + bSizer80->Add( bSizer841, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM, 5 ); + + + bSizer80->Add( 0, 5, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer84; + bSizer84 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer84->Add( 10, 0, 0, wxEXPAND, 5 ); + + m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("Adjust modification times of all files contained in the specified folder and its subfolders. This manual adaption might become necessary if you are synchronizing against a FAT32 drive and the daylight saving time is switched. For an overview about the issue see this article:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHeader->Wrap( 400 ); + m_staticTextHeader->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer84->Add( m_staticTextHeader, 0, wxALL, 5 ); + + + bSizer84->Add( 10, 0, 0, wxEXPAND, 5 ); + + bSizer80->Add( bSizer84, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_hyperlink6 = new wxHyperlinkCtrl( this, wxID_ANY, _("http://www.codeproject.com/KB/datetime/dstbugs.aspx"), wxT("http://www.codeproject.com/KB/datetime/dstbugs.aspx"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + bSizer80->Add( m_hyperlink6, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer80->Add( 0, 5, 0, wxEXPAND, 5 ); + + wxStaticBoxSizer* sbSizer24; + sbSizer24 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Select folder") ), wxHORIZONTAL ); + + m_textCtrlDirectory = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + sbSizer24->Add( m_textCtrlDirectory, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + m_dirPicker = new wxDirPickerCtrl( this, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DIR_MUST_EXIST ); + sbSizer24->Add( m_dirPicker, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + bSizer80->Add( sbSizer24, 0, wxEXPAND|wxALL, 5 ); + + wxStaticBoxSizer* sbSizer23; + sbSizer23 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Time shift in seconds") ), wxVERTICAL ); + + m_spinCtrlTimeShift = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, -2100000000, 2100000000, 0 ); + sbSizer23->Add( m_spinCtrlTimeShift, 0, wxRIGHT|wxLEFT, 5 ); + + bSizer80->Add( sbSizer23, 0, wxALL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer83; + bSizer83 = new wxBoxSizer( wxHORIZONTAL ); + + m_button21 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button21->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer83->Add( m_button21, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonApply = new wxButton( this, wxID_APPLY, _("Apply"), wxDefaultPosition, wxSize( -1,35 ), 0 ); + m_buttonApply->SetDefault(); + m_buttonApply->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer83->Add( m_buttonApply, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer80->Add( bSizer83, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + this->SetSizer( bSizer80 ); + this->Layout(); + bSizer80->Fit( this ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ModifyFilesDlgGenerated::OnClose ) ); + m_textCtrlDirectory->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( ModifyFilesDlgGenerated::OnWriteDirManually ), NULL, this ); + m_dirPicker->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( ModifyFilesDlgGenerated::OnDirSelected ), NULL, this ); + m_button21->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ModifyFilesDlgGenerated::OnCancel ), NULL, this ); + m_buttonApply->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ModifyFilesDlgGenerated::OnApply ), NULL, this ); } ModifyFilesDlgGenerated::~ModifyFilesDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ModifyFilesDlgGenerated::OnClose ) ); - m_textCtrlDirectory->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( ModifyFilesDlgGenerated::OnWriteDirManually ), NULL, this ); - m_dirPicker->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( ModifyFilesDlgGenerated::OnDirSelected ), NULL, this ); - m_button21->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ModifyFilesDlgGenerated::OnCancel ), NULL, this ); - m_buttonApply->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ModifyFilesDlgGenerated::OnApply ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ModifyFilesDlgGenerated::OnClose ) ); + m_textCtrlDirectory->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( ModifyFilesDlgGenerated::OnWriteDirManually ), NULL, this ); + m_dirPicker->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( ModifyFilesDlgGenerated::OnDirSelected ), NULL, this ); + m_button21->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ModifyFilesDlgGenerated::OnCancel ), NULL, this ); + m_buttonApply->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ModifyFilesDlgGenerated::OnApply ), NULL, this ); } diff --git a/ui/guiGenerated.h b/ui/guiGenerated.h index 81875ec6..fd3e9c0f 100644 --- a/ui/guiGenerated.h +++ b/ui/guiGenerated.h @@ -29,9 +29,9 @@ class CustomGrid; #include <wx/hyperlink.h> #include <wx/checkbox.h> #include <wx/panel.h> -#include <wx/scrolwin.h> #include <wx/textctrl.h> #include <wx/filepicker.h> +#include <wx/scrolwin.h> #include <wx/grid.h> #include <wx/choice.h> #include <wx/stattext.h> @@ -51,929 +51,714 @@ class CustomGrid; /////////////////////////////////////////////////////////////////////////////// /// Class GuiGenerated /////////////////////////////////////////////////////////////////////////////// -class GuiGenerated : public wxFrame +class GuiGenerated : public wxFrame { -private: - -protected: - wxMenuBar* m_menubar1; - wxMenu* m_menu1; - wxMenu* m_menu3; - wxMenu* m_menu31; - wxMenuItem* m_menuItemGerman; - wxMenuItem* m_menuItemEnglish; - wxMenuItem* m_menuItemFrench; - wxMenuItem* m_menuItemDutch; - wxMenuItem* m_menuItemJapanese; - wxMenu* m_menu2; - wxBoxSizer* bSizer1; - wxPanel* m_panel71; - wxBoxSizer* bSizer6; - - wxBitmapButton* m_bpButtonCompare; - wxButton* m_buttonAbort; - wxRadioButton* m_radioBtnSizeDate; - wxRadioButton* m_radioBtnContent; - wxBitmapButton* m_bpButton14; - - - wxBitmapButton* m_bpButtonFilter; - wxHyperlinkCtrl* m_hyperlinkCfgFilter; - wxCheckBox* m_checkBoxHideFilt; - - wxBitmapButton* m_bpButtonSync; - - wxScrolledWindow* m_scrolledWindowFolderPairs; - wxBoxSizer* bSizerFolderPairs; - wxPanel* m_panel1; - wxStaticBoxSizer* sbSizer2; - wxTextCtrl* m_directoryLeft; - wxDirPickerCtrl* m_dirPicker1; - CustomGrid* m_grid1; - wxPanel* m_panel3; - wxBoxSizer* bSizer18; - wxBoxSizer* bSizer69; - wxBitmapButton* m_bpButtonSwap; - CustomGrid* m_grid3; - wxPanel* m_panel2; - - wxBitmapButton* m_bpButtonAddPair; - wxBitmapButton* m_bpButtonRemovePair; - wxTextCtrl* m_directoryRight; - wxDirPickerCtrl* m_dirPicker2; - CustomGrid* m_grid2; - wxPanel* m_panel4; - wxBoxSizer* bSizer3; - wxBitmapButton* m_bpButton201; - wxChoice* m_choiceLoad; - - wxPanel* m_panel12; - - wxBitmapButton* m_bpButtonLeftOnly; - wxBitmapButton* m_bpButtonLeftNewer; - wxBitmapButton* m_bpButtonEqual; - wxBitmapButton* m_bpButtonDifferent; - wxBitmapButton* m_bpButtonRightNewer; - wxBitmapButton* m_bpButtonRightOnly; - - wxBitmapButton* m_bpButton10; - wxPanel* m_panel7; - - wxStaticText* m_staticTextStatusLeft; - - wxStaticLine* m_staticline9; - - wxStaticText* m_staticTextStatusMiddle; - - wxStaticLine* m_staticline10; - - wxStaticText* m_staticTextStatusRight; - - wxStaticBitmap* m_bitmap15; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnCompare( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnSync( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuQuit( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuLangGerman( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuLangEnglish( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuLangFrench( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuLangDutch( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuLangJapanese( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuAdjustFileTimes( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuBatchJob( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuExportFileList( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuAbout( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnAbortCompare( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnCompareByTimeSize( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnCompareByContent( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnShowHelpDialog( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnFilterButton( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnConfigureFilter( wxHyperlinkEvent& event ) - { - event.Skip(); - } - virtual void OnHideFilteredButton( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnWriteDirManually( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnDirSelected( wxFileDirPickerEvent& event ) - { - event.Skip(); - } - virtual void OnLeftGridDoubleClick( wxGridEvent& event ) - { - event.Skip(); - } - virtual void OnOpenContextMenu( wxGridEvent& event ) - { - event.Skip(); - } - virtual void OnSortLeftGrid( wxGridEvent& event ) - { - event.Skip(); - } - virtual void OnSwapDirs( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnAddFolderPair( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnRemoveFolderPair( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnRightGridDoubleClick( wxGridEvent& event ) - { - event.Skip(); - } - virtual void OnSortRightGrid( wxGridEvent& event ) - { - event.Skip(); - } - virtual void OnSaveConfig( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnChoiceKeyEvent( wxKeyEvent& event ) - { - event.Skip(); - } - virtual void OnLoadConfiguration( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnLeftOnlyFiles( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnLeftNewerFiles( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnEqualFiles( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnDifferentFiles( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnRightNewerFiles( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnRightOnlyFiles( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnQuit( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - GuiGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("FreeFileSync - Folder Comparison and Synchronization"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 933,612 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); - ~GuiGenerated(); - + private: + + protected: + wxMenuBar* m_menubar1; + wxMenu* m_menu1; + wxMenuItem* m_menuItem10; + wxMenuItem* m_menuItem11; + wxMenu* m_menu3; + wxMenu* m_menu31; + wxMenuItem* m_menuItemGerman; + wxMenuItem* m_menuItemEnglish; + wxMenuItem* m_menuItemFrench; + wxMenuItem* m_menuItemDutch; + wxMenuItem* m_menuItemJapanese; + wxMenuItem* m_menuItem7; + wxMenuItem* m_menuItemAdjustTimes; + wxMenu* m_menu2; + wxBoxSizer* bSizer1; + wxPanel* m_panel71; + wxBoxSizer* bSizer6; + + wxBitmapButton* m_bpButtonCompare; + wxButton* m_buttonAbort; + wxRadioButton* m_radioBtnSizeDate; + wxRadioButton* m_radioBtnContent; + wxBitmapButton* m_bpButton14; + + + wxBitmapButton* m_bpButtonFilter; + wxHyperlinkCtrl* m_hyperlinkCfgFilter; + wxCheckBox* m_checkBoxHideFilt; + + wxBitmapButton* m_bpButtonSync; + + wxPanel* m_panel11; + wxStaticBoxSizer* sbSizer2; + wxTextCtrl* m_directoryLeft; + wxDirPickerCtrl* m_dirPickerLeft; + wxPanel* m_panel13; + + wxBoxSizer* bSizerMiddle; + wxBitmapButton* m_bpButtonSwap; + + wxPanel* m_panel12; + + wxBitmapButton* m_bpButtonRemovePair; + wxBitmapButton* m_bpButtonAddPair; + wxTextCtrl* m_directoryRight; + wxDirPickerCtrl* m_dirPickerRight; + wxScrolledWindow* m_scrolledWindowFolderPairs; + wxBoxSizer* bSizerFolderPairs; + wxPanel* m_panel1; + CustomGrid* m_gridLeft; + wxPanel* m_panel3; + CustomGrid* m_gridMiddle; + wxPanel* m_panel2; + CustomGrid* m_gridRight; + wxBoxSizer* bSizer3; + wxBitmapButton* m_bpButton201; + wxChoice* m_choiceLoad; + + wxPanel* m_panel112; + + wxBitmapButton* m_bpButtonLeftOnly; + wxBitmapButton* m_bpButtonLeftNewer; + wxBitmapButton* m_bpButtonEqual; + wxBitmapButton* m_bpButtonDifferent; + wxBitmapButton* m_bpButtonRightNewer; + wxBitmapButton* m_bpButtonRightOnly; + + wxBitmapButton* m_bpButton10; + wxPanel* m_panel7; + + wxStaticText* m_staticTextStatusLeft; + + wxStaticLine* m_staticline9; + + wxStaticText* m_staticTextStatusMiddle; + + wxStaticLine* m_staticline10; + + wxStaticText* m_staticTextStatusRight; + + wxStaticBitmap* m_bitmap15; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnCompare( wxCommandEvent& event ){ event.Skip(); } + virtual void OnSync( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuSaveConfig( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLoadConfig( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuQuit( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLangGerman( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLangEnglish( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLangFrench( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLangDutch( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLangJapanese( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuBatchJob( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuAdjustFileTimes( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuExportFileList( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuAbout( wxCommandEvent& event ){ event.Skip(); } + virtual void OnAbortCompare( wxCommandEvent& event ){ event.Skip(); } + virtual void OnCompareByTimeSize( wxCommandEvent& event ){ event.Skip(); } + virtual void OnCompareByContent( wxCommandEvent& event ){ event.Skip(); } + virtual void OnShowHelpDialog( wxCommandEvent& event ){ event.Skip(); } + virtual void OnFilterButton( wxCommandEvent& event ){ event.Skip(); } + virtual void OnConfigureFilter( wxHyperlinkEvent& event ){ event.Skip(); } + virtual void OnHideFilteredButton( wxCommandEvent& event ){ event.Skip(); } + virtual void OnWriteDirManually( wxCommandEvent& event ){ event.Skip(); } + virtual void OnDirSelected( wxFileDirPickerEvent& event ){ event.Skip(); } + virtual void OnSwapDirs( wxCommandEvent& event ){ event.Skip(); } + virtual void OnRemoveFolderPair( wxCommandEvent& event ){ event.Skip(); } + virtual void OnAddFolderPair( wxCommandEvent& event ){ event.Skip(); } + virtual void OnLeftGridDoubleClick( wxGridEvent& event ){ event.Skip(); } + virtual void OnOpenContextMenu( wxGridEvent& event ){ event.Skip(); } + virtual void OnSortLeftGrid( wxGridEvent& event ){ event.Skip(); } + virtual void OnRightGridDoubleClick( wxGridEvent& event ){ event.Skip(); } + virtual void OnSortRightGrid( wxGridEvent& event ){ event.Skip(); } + virtual void OnSaveConfig( wxCommandEvent& event ){ event.Skip(); } + virtual void OnChoiceKeyEvent( wxKeyEvent& event ){ event.Skip(); } + virtual void OnLoadConfig( wxCommandEvent& event ){ event.Skip(); } + virtual void OnLeftOnlyFiles( wxCommandEvent& event ){ event.Skip(); } + virtual void OnLeftNewerFiles( wxCommandEvent& event ){ event.Skip(); } + virtual void OnEqualFiles( wxCommandEvent& event ){ event.Skip(); } + virtual void OnDifferentFiles( wxCommandEvent& event ){ event.Skip(); } + virtual void OnRightNewerFiles( wxCommandEvent& event ){ event.Skip(); } + virtual void OnRightOnlyFiles( wxCommandEvent& event ){ event.Skip(); } + virtual void OnQuit( wxCommandEvent& event ){ event.Skip(); } + + + public: + GuiGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("FreeFileSync - Folder Comparison and Synchronization"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 933,612 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); + ~GuiGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class FolderPairGenerated /////////////////////////////////////////////////////////////////////////////// -class FolderPairGenerated : public wxPanel +class FolderPairGenerated : public wxPanel { -private: - -protected: - - -public: - wxPanel* m_panelLeft; - wxTextCtrl* m_directoryLeft; - wxDirPickerCtrl* m_dirPickerLeft; - wxStaticBitmap* m_bitmap23; - wxPanel* m_panelRight; - wxTextCtrl* m_directoryRight; - wxDirPickerCtrl* m_dirPickerRight; - FolderPairGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); - ~FolderPairGenerated(); - + private: + + protected: + wxPanel* m_panel20; + wxPanel* m_panel21; + + + + + public: + wxPanel* m_panelLeft; + wxTextCtrl* m_directoryLeft; + wxDirPickerCtrl* m_dirPickerLeft; + wxStaticBitmap* m_bitmap23; + wxPanel* m_panelRight; + wxTextCtrl* m_directoryRight; + wxDirPickerCtrl* m_dirPickerRight; + FolderPairGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); + ~FolderPairGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class BatchDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class BatchDlgGenerated : public wxDialog +class BatchDlgGenerated : public wxDialog { -private: - -protected: - wxBoxSizer* bSizer69; - wxPanel* m_panel8; - wxStaticText* m_staticText56; - - wxStaticText* m_staticText54; - - wxStaticLine* m_staticline10; - wxStaticText* m_staticText531; - wxScrolledWindow* m_scrolledWindow6; - wxBoxSizer* bSizerFolderPairs; - wxRadioButton* m_radioBtnSizeDate; - wxRadioButton* m_radioBtnContent; - - wxCheckBox* m_checkBoxUseRecycler; - wxCheckBox* m_checkBoxContinueError; - wxCheckBox* m_checkBoxSilent; - - - wxBitmapButton* m_bpButtonFilter; - wxStaticBitmap* m_bitmap8; - wxStaticText* m_staticText15; - wxTextCtrl* m_textCtrlInclude; - - wxStaticBitmap* m_bitmap9; - wxStaticText* m_staticText16; - wxTextCtrl* m_textCtrlExclude; - - wxStaticText* m_staticText211; - wxStaticText* m_staticText311; - wxStaticLine* m_staticline3; - wxStaticBitmap* m_bitmap13; - wxBitmapButton* m_bpButton5; - wxStaticBitmap* m_bitmap14; - wxBitmapButton* m_bpButton6; - wxStaticBitmap* m_bitmap15; - wxBitmapButton* m_bpButton7; - wxStaticBitmap* m_bitmap16; - wxBitmapButton* m_bpButton8; - wxStaticBitmap* m_bitmap17; - wxBitmapButton* m_bpButton9; - wxStaticLine* m_staticline9; - wxButton* m_button6; - wxButton* m_buttonCreate; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnChangeCompareVar( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnSelectRecycleBin( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnFilterButton( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnExLeftSideOnly( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnExRightSideOnly( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnLeftNewer( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnRightNewer( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnDifferent( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnCancel( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnCreateBatchJob( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - BatchDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); - ~BatchDlgGenerated(); - + private: + + protected: + wxBoxSizer* bSizer69; + wxStaticBitmap* m_bitmap27; + wxPanel* m_panel8; + wxStaticText* m_staticText56; + + + wxStaticText* m_staticText54; + + wxStaticLine* m_staticline10; + wxStaticText* m_staticText531; + wxScrolledWindow* m_scrolledWindow6; + wxBoxSizer* bSizerFolderPairs; + wxRadioButton* m_radioBtnSizeDate; + wxRadioButton* m_radioBtnContent; + + wxCheckBox* m_checkBoxUseRecycler; + wxCheckBox* m_checkBoxIgnoreErrors; + wxCheckBox* m_checkBoxSilent; + + + wxBitmapButton* m_bpButtonFilter; + wxStaticBitmap* m_bitmap8; + wxStaticText* m_staticText15; + wxTextCtrl* m_textCtrlInclude; + + wxStaticBitmap* m_bitmap9; + wxStaticText* m_staticText16; + wxTextCtrl* m_textCtrlExclude; + + wxStaticText* m_staticText211; + wxStaticText* m_staticText311; + wxStaticLine* m_staticline3; + wxStaticBitmap* m_bitmap13; + wxBitmapButton* m_bpButton5; + wxStaticBitmap* m_bitmap14; + wxBitmapButton* m_bpButton6; + wxStaticBitmap* m_bitmap15; + wxBitmapButton* m_bpButton7; + wxStaticBitmap* m_bitmap16; + wxBitmapButton* m_bpButton8; + wxStaticBitmap* m_bitmap17; + wxBitmapButton* m_bpButton9; + wxStaticLine* m_staticline9; + wxButton* m_button6; + wxButton* m_buttonCreate; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnChangeCompareVar( wxCommandEvent& event ){ event.Skip(); } + virtual void OnSelectRecycleBin( wxCommandEvent& event ){ event.Skip(); } + virtual void OnFilterButton( wxCommandEvent& event ){ event.Skip(); } + virtual void OnExLeftSideOnly( wxCommandEvent& event ){ event.Skip(); } + virtual void OnExRightSideOnly( wxCommandEvent& event ){ event.Skip(); } + virtual void OnLeftNewer( wxCommandEvent& event ){ event.Skip(); } + virtual void OnRightNewer( wxCommandEvent& event ){ event.Skip(); } + virtual void OnDifferent( wxCommandEvent& event ){ event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ){ event.Skip(); } + virtual void OnCreateBatchJob( wxCommandEvent& event ){ event.Skip(); } + + + public: + BatchDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); + ~BatchDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class BatchFolderPairGenerated /////////////////////////////////////////////////////////////////////////////// -class BatchFolderPairGenerated : public wxPanel +class BatchFolderPairGenerated : public wxPanel { -private: - -protected: - wxStaticText* m_staticText53; - wxStaticText* m_staticText541; - - // Virtual event handlers, overide them in your derived class - virtual void OnEnterLeftDir( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnEnterRightDir( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - wxTextCtrl* m_directoryLeft; - wxTextCtrl* m_directoryRight; - BatchFolderPairGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); - ~BatchFolderPairGenerated(); - + private: + + protected: + wxStaticText* m_staticText53; + wxStaticText* m_staticText541; + + // Virtual event handlers, overide them in your derived class + virtual void OnEnterLeftDir( wxCommandEvent& event ){ event.Skip(); } + virtual void OnEnterRightDir( wxCommandEvent& event ){ event.Skip(); } + + + public: + wxTextCtrl* m_directoryLeft; + wxTextCtrl* m_directoryRight; + BatchFolderPairGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); + ~BatchFolderPairGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class CompareStatusGenerated /////////////////////////////////////////////////////////////////////////////// -class CompareStatusGenerated : public wxPanel +class CompareStatusGenerated : public wxPanel { -private: - -protected: - wxBoxSizer* bSizer42; - wxStaticText* m_staticText321; - wxStaticText* m_staticTextScanned; - - wxStaticBoxSizer* sbSizer13; - wxStaticText* m_staticText46; - wxStaticText* m_staticTextFilesToCompare; - wxStaticText* m_staticText32; - wxStaticText* m_staticTextDataToCompare; - - wxStaticText* m_staticText37; - wxStaticText* m_staticTextTimeElapsed; - wxStaticText* m_staticText30; - wxTextCtrl* m_textCtrlFilename; - wxGauge* m_gauge2; - -public: - CompareStatusGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); - ~CompareStatusGenerated(); - + private: + + protected: + wxBoxSizer* bSizer42; + wxStaticText* m_staticText321; + wxStaticText* m_staticTextScanned; + + wxStaticBoxSizer* sbSizer13; + wxStaticText* m_staticText46; + wxStaticText* m_staticTextFilesToCompare; + wxStaticText* m_staticText32; + wxStaticText* m_staticTextDataToCompare; + + wxStaticText* m_staticText37; + wxStaticText* m_staticTextTimeElapsed; + wxStaticText* m_staticText30; + wxTextCtrl* m_textCtrlFilename; + wxGauge* m_gauge2; + + public: + CompareStatusGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); + ~CompareStatusGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class SyncDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class SyncDlgGenerated : public wxDialog +class SyncDlgGenerated : public wxDialog { -private: - -protected: - wxBitmapButton* m_bpButton18; - - wxCheckBox* m_checkBoxUseRecycler; - wxCheckBox* m_checkBoxContinueError; - - wxStaticText* m_staticText1; - wxRadioButton* m_radioBtn1; - wxButton* m_buttonOneWay; - wxStaticText* m_staticText8; - wxRadioButton* m_radioBtn2; - wxButton* m_buttonTwoWay; - wxStaticText* m_staticText10; - wxRadioButton* m_radioBtn3; - - wxStaticText* m_staticText23; - - wxStaticText* m_staticText9; - - wxButton* m_button6; - wxButton* m_button16; - - wxStaticText* m_staticText37; - wxTextCtrl* m_textCtrlCreate; - wxStaticText* m_staticText14; - wxTextCtrl* m_textCtrlDelete; - wxStaticText* m_staticText42; - wxTextCtrl* m_textCtrlUpdate; - wxStaticText* m_staticText43; - wxTextCtrl* m_textCtrlData; - - wxStaticText* m_staticText21; - wxStaticText* m_staticText31; - wxStaticLine* m_staticline3; - wxStaticBitmap* m_bitmap13; - wxBitmapButton* m_bpButton5; - wxStaticBitmap* m_bitmap14; - wxBitmapButton* m_bpButton6; - wxStaticBitmap* m_bitmap15; - wxBitmapButton* m_bpButton7; - wxStaticBitmap* m_bitmap16; - wxBitmapButton* m_bpButton8; - wxStaticBitmap* m_bitmap17; - wxBitmapButton* m_bpButton9; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnStartSync( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnSelectRecycleBin( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnSyncLeftToRight( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnSyncBothSides( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnSyncCostum( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnBack( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnCancel( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnExLeftSideOnly( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnExRightSideOnly( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnLeftNewer( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnRightNewer( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnDifferent( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - SyncDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Synchronization settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); - ~SyncDlgGenerated(); - + private: + + protected: + wxBitmapButton* m_bpButton18; + + wxCheckBox* m_checkBoxUseRecycler; + wxCheckBox* m_checkBoxIgnoreErrors; + + wxStaticText* m_staticText1; + wxRadioButton* m_radioBtn1; + wxButton* m_buttonOneWay; + wxStaticText* m_staticText8; + wxRadioButton* m_radioBtnUpdate; + wxButton* m_buttonUpdate; + wxStaticText* m_staticText101; + wxRadioButton* m_radioBtn2; + wxButton* m_buttonTwoWay; + wxStaticText* m_staticText10; + wxRadioButton* m_radioBtn3; + + wxStaticText* m_staticText23; + + wxStaticText* m_staticText9; + + wxButton* m_button6; + wxButton* m_button16; + + wxStaticText* m_staticText37; + wxTextCtrl* m_textCtrlCreate; + wxStaticText* m_staticText14; + wxTextCtrl* m_textCtrlDelete; + wxStaticText* m_staticText42; + wxTextCtrl* m_textCtrlUpdate; + wxStaticText* m_staticText43; + wxTextCtrl* m_textCtrlData; + + wxStaticText* m_staticText21; + wxStaticText* m_staticText31; + wxStaticLine* m_staticline3; + wxStaticBitmap* m_bitmap13; + wxBitmapButton* m_bpButton5; + wxStaticBitmap* m_bitmap14; + wxBitmapButton* m_bpButton6; + wxStaticBitmap* m_bitmap15; + wxBitmapButton* m_bpButton7; + wxStaticBitmap* m_bitmap16; + wxBitmapButton* m_bpButton8; + wxStaticBitmap* m_bitmap17; + wxBitmapButton* m_bpButton9; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnStartSync( wxCommandEvent& event ){ event.Skip(); } + virtual void OnSelectRecycleBin( wxCommandEvent& event ){ event.Skip(); } + virtual void OnSyncLeftToRight( wxCommandEvent& event ){ event.Skip(); } + virtual void OnSyncUpdate( wxCommandEvent& event ){ event.Skip(); } + virtual void OnSyncBothSides( wxCommandEvent& event ){ event.Skip(); } + virtual void OnSyncCostum( wxCommandEvent& event ){ event.Skip(); } + virtual void OnBack( wxCommandEvent& event ){ event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ){ event.Skip(); } + virtual void OnExLeftSideOnly( wxCommandEvent& event ){ event.Skip(); } + virtual void OnExRightSideOnly( wxCommandEvent& event ){ event.Skip(); } + virtual void OnLeftNewer( wxCommandEvent& event ){ event.Skip(); } + virtual void OnRightNewer( wxCommandEvent& event ){ event.Skip(); } + virtual void OnDifferent( wxCommandEvent& event ){ event.Skip(); } + + + public: + SyncDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Synchronization settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); + ~SyncDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class SyncStatusDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class SyncStatusDlgGenerated : public wxDialog +class SyncStatusDlgGenerated : public wxDialog { -private: - -protected: - - wxPanel* m_panel8; - wxStaticText* m_staticText56; - wxAnimationCtrl* m_animationControl1; - - wxStaticBitmap* m_bitmapStatus; - wxStaticText* m_staticTextStatus; - - wxBoxSizer* bSizer31; - wxStaticText* m_staticText21; - - wxStaticText* m_staticText55; - wxStaticText* m_staticTextTimeElapsed; - wxTextCtrl* m_textCtrlInfo; - wxBoxSizer* bSizer28; - wxStaticText* m_staticText25; - wxStaticText* m_staticTextRemainingObj; - - wxButton* m_buttonOK; - wxButton* m_buttonPause; - wxButton* m_buttonAbort; - - wxStaticText* m_staticText26; - wxStaticText* m_staticTextDataRemaining; - - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnOkay( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnPause( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnAbort( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - wxGauge* m_gauge1; - SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 614,371 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~SyncStatusDlgGenerated(); - + private: + + protected: + + wxAnimationCtrl* m_animationControl1; + wxPanel* m_panel8; + wxStaticText* m_staticText56; + + wxStaticBitmap* m_bitmapStatus; + wxStaticText* m_staticTextStatus; + + wxBoxSizer* bSizer31; + wxStaticText* m_staticText21; + + wxStaticText* m_staticText55; + wxStaticText* m_staticTextTimeElapsed; + wxTextCtrl* m_textCtrlInfo; + wxBoxSizer* bSizer28; + wxStaticText* m_staticText25; + wxStaticText* m_staticTextRemainingObj; + + wxButton* m_buttonOK; + wxButton* m_buttonPause; + wxButton* m_buttonAbort; + + wxStaticText* m_staticText26; + wxStaticText* m_staticTextDataRemaining; + + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnOkay( wxCommandEvent& event ){ event.Skip(); } + virtual void OnPause( wxCommandEvent& event ){ event.Skip(); } + virtual void OnAbort( wxCommandEvent& event ){ event.Skip(); } + + + public: + wxGauge* m_gauge1; + SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 614,371 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~SyncStatusDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class HelpDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class HelpDlgGenerated : public wxDialog +class HelpDlgGenerated : public wxDialog { -private: - -protected: - - wxPanel* m_panel8; - - wxStaticText* m_staticText56; - - - wxNotebook* m_notebook1; - wxScrolledWindow* m_scrolledWindow1; - wxStaticText* m_staticText59; - wxStaticText* m_staticText60; - wxStaticText* m_staticText61; - wxTreeCtrl* m_treeCtrl1; - wxStaticText* m_staticText63; - wxStaticText* m_staticText75; - wxStaticText* m_staticText76; - wxStaticText* m_staticText77; - wxStaticText* m_staticText78; - wxStaticText* m_staticText79; - wxStaticText* m_staticText80; - wxScrolledWindow* m_scrolledWindow5; - wxStaticText* m_staticText65; - wxStaticText* m_staticText66; - wxTreeCtrl* m_treeCtrl2; - wxStaticText* m_staticText69; - wxStaticText* m_staticText81; - wxStaticText* m_staticText82; - wxStaticText* m_staticText83; - wxStaticText* m_staticText84; - wxButton* m_button8; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnOK( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - HelpDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 565,501 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~HelpDlgGenerated(); - + private: + + protected: + + wxStaticBitmap* m_bitmap25; + wxPanel* m_panel8; + + wxStaticText* m_staticText56; + + + wxNotebook* m_notebook1; + wxScrolledWindow* m_scrolledWindow1; + wxStaticText* m_staticText59; + wxStaticText* m_staticText60; + wxStaticText* m_staticText61; + wxTreeCtrl* m_treeCtrl1; + wxStaticText* m_staticText63; + wxStaticText* m_staticText75; + wxStaticText* m_staticText76; + wxStaticText* m_staticText77; + wxStaticText* m_staticText78; + wxStaticText* m_staticText79; + wxStaticText* m_staticText80; + wxScrolledWindow* m_scrolledWindow5; + wxStaticText* m_staticText65; + wxStaticText* m_staticText66; + wxTreeCtrl* m_treeCtrl2; + wxStaticText* m_staticText69; + wxStaticText* m_staticText81; + wxStaticText* m_staticText82; + wxStaticText* m_staticText83; + wxStaticText* m_staticText84; + wxButton* m_button8; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnOK( wxCommandEvent& event ){ event.Skip(); } + + + public: + HelpDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 565,501 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~HelpDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class AboutDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class AboutDlgGenerated : public wxDialog +class AboutDlgGenerated : public wxDialog { -private: - -protected: - - wxPanel* m_panel5; - wxStaticBitmap* m_bitmap11; - wxStaticText* m_staticText15; - wxStaticText* m_build; - - wxScrolledWindow* m_scrolledWindow4; - wxStaticText* m_staticText72; - wxStaticText* m_staticText73; - wxStaticText* m_staticText74; - wxScrolledWindow* m_scrolledWindow3; - wxStaticText* m_staticText54; - wxStaticText* m_staticText68; - wxStaticText* m_staticText69; - wxStaticText* m_staticText70; - wxStaticText* m_staticText71; - wxStaticText* m_staticText711; - wxStaticText* m_staticText712; - wxStaticLine* m_staticline3; - wxStaticText* m_staticText131; - wxStaticBitmap* m_bitmap9; - wxStaticText* m_staticText11; - wxHyperlinkCtrl* m_hyperlink1; - wxStaticBitmap* m_bitmap10; - wxStaticText* m_staticText13; - wxHyperlinkCtrl* m_hyperlink2; - wxAnimationCtrl* m_animationControl1; - wxStaticText* m_staticText151; - wxHyperlinkCtrl* m_hyperlink3; - wxStaticLine* m_staticline2; - - wxStaticBitmap* m_bitmap13; - wxHyperlinkCtrl* m_hyperlink5; - - wxButton* m_button8; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnOK( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - AboutDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); - ~AboutDlgGenerated(); - + private: + + protected: + + wxPanel* m_panel5; + wxStaticBitmap* m_bitmap11; + wxStaticText* m_staticText15; + wxStaticText* m_build; + + wxScrolledWindow* m_scrolledWindow4; + wxStaticText* m_staticText72; + wxStaticText* m_staticText73; + wxStaticText* m_staticText74; + wxScrolledWindow* m_scrolledWindow3; + wxStaticText* m_staticText54; + wxStaticText* m_staticText68; + wxStaticText* m_staticText69; + wxStaticText* m_staticText70; + wxStaticText* m_staticText71; + wxStaticText* m_staticText711; + wxStaticText* m_staticText712; + wxStaticLine* m_staticline3; + wxStaticText* m_staticText131; + wxStaticBitmap* m_bitmap9; + wxStaticText* m_staticText11; + wxHyperlinkCtrl* m_hyperlink1; + wxStaticBitmap* m_bitmap10; + wxStaticText* m_staticText13; + wxHyperlinkCtrl* m_hyperlink2; + wxAnimationCtrl* m_animationControl1; + wxStaticText* m_staticText151; + wxHyperlinkCtrl* m_hyperlink3; + wxStaticLine* m_staticline2; + + wxStaticBitmap* m_bitmap13; + wxHyperlinkCtrl* m_hyperlink5; + + wxButton* m_button8; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnOK( wxCommandEvent& event ){ event.Skip(); } + + + public: + AboutDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); + ~AboutDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class ErrorDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class ErrorDlgGenerated : public wxDialog +class ErrorDlgGenerated : public wxDialog { -private: - -protected: - - wxStaticBitmap* m_bitmap10; - wxTextCtrl* m_textCtrl8; - - wxCheckBox* m_checkBoxContinueError; - - wxButton* m_buttonContinue; - wxButton* m_buttonRetry; - wxButton* m_buttonAbort; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnContinue( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnRetry( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnAbort( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - ErrorDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("An error occured"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 445,293 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~ErrorDlgGenerated(); + private: + + protected: + + wxStaticBitmap* m_bitmap10; + wxTextCtrl* m_textCtrl8; + + wxCheckBox* m_checkBoxIgnoreErrors; + + wxButton* m_buttonIgnore; + wxButton* m_buttonRetry; + wxButton* m_buttonAbort; + + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnIgnore( wxCommandEvent& event ){ event.Skip(); } + virtual void OnRetry( wxCommandEvent& event ){ event.Skip(); } + virtual void OnAbort( wxCommandEvent& event ){ event.Skip(); } + + + public: + ErrorDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Error"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 445,293 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~ErrorDlgGenerated(); + +}; +/////////////////////////////////////////////////////////////////////////////// +/// Class WarningDlgGenerated +/////////////////////////////////////////////////////////////////////////////// +class WarningDlgGenerated : public wxDialog +{ + private: + + protected: + + wxTextCtrl* m_textCtrl8; + + wxCheckBox* m_checkBoxDontShowAgain; + + wxButton* m_buttonIgnore; + wxButton* m_buttonResolve; + wxButton* m_buttonAbort; + wxButton* m_buttonOK; + + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnIgnore( wxCommandEvent& event ){ event.Skip(); } + virtual void OnResolve( wxCommandEvent& event ){ event.Skip(); } + virtual void OnAbort( wxCommandEvent& event ){ event.Skip(); } + virtual void OnOkay( wxCommandEvent& event ){ event.Skip(); } + + + public: + wxStaticBitmap* m_bitmap10; + WarningDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Warning"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 382,249 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~WarningDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class DeleteDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class DeleteDlgGenerated : public wxDialog +class DeleteDlgGenerated : public wxDialog { -private: - -protected: - - - wxStaticBitmap* m_bitmap12; - wxStaticText* m_staticTextHeader; - - wxTextCtrl* m_textCtrlMessage; - wxButton* m_buttonOK; - wxButton* m_buttonCancel; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnOK( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnCancel( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - DeleteDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Confirm"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 553,336 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~DeleteDlgGenerated(); - + private: + + protected: + + + wxStaticBitmap* m_bitmap12; + wxStaticText* m_staticTextHeader; + + wxTextCtrl* m_textCtrlMessage; + wxButton* m_buttonOK; + wxButton* m_buttonCancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnOK( wxCommandEvent& event ){ event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ){ event.Skip(); } + + + public: + DeleteDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Confirm"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 553,336 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~DeleteDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class FilterDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class FilterDlgGenerated : public wxDialog +class FilterDlgGenerated : public wxDialog { -private: - -protected: - wxPanel* m_panel8; - wxStaticText* m_staticText56; - wxStaticText* m_staticText44; - wxBitmapButton* m_bpButtonHelp; - - wxPanel* m_panel13; - wxStaticLine* m_staticline10; - wxStaticText* m_staticText45; - wxStaticText* m_staticText83; - wxStaticText* m_staticText84; - wxStaticText* m_staticText85; - wxStaticText* m_staticText86; - wxStaticText* m_staticText181; - wxStaticText* m_staticText1811; - - wxStaticText* m_staticText15; - wxStaticBitmap* m_bitmap8; - wxTextCtrl* m_textCtrlInclude; - - wxStaticText* m_staticText16; - wxStaticBitmap* m_bitmap9; - wxTextCtrl* m_textCtrlExclude; - - wxButton* m_button9; - - wxButton* m_button17; - wxButton* m_button10; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnHelp( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnDefault( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnCancel( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnOK( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - FilterDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Configure filter"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); - ~FilterDlgGenerated(); - + private: + + protected: + wxStaticBitmap* m_bitmap26; + wxPanel* m_panel8; + wxStaticText* m_staticText56; + + + wxStaticText* m_staticText44; + wxBitmapButton* m_bpButtonHelp; + + wxPanel* m_panel13; + wxStaticLine* m_staticline10; + wxStaticText* m_staticText45; + wxStaticText* m_staticText83; + wxStaticText* m_staticText84; + wxStaticText* m_staticText85; + wxStaticText* m_staticText86; + wxStaticText* m_staticText181; + wxStaticText* m_staticText1811; + + wxStaticText* m_staticText15; + wxStaticBitmap* m_bitmap8; + wxTextCtrl* m_textCtrlInclude; + + wxStaticText* m_staticText16; + wxStaticBitmap* m_bitmap9; + wxTextCtrl* m_textCtrlExclude; + + wxButton* m_button9; + + wxButton* m_button17; + wxButton* m_button10; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnHelp( wxCommandEvent& event ){ event.Skip(); } + virtual void OnDefault( wxCommandEvent& event ){ event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ){ event.Skip(); } + virtual void OnOK( wxCommandEvent& event ){ event.Skip(); } + + + public: + FilterDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Configure filter"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); + ~FilterDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class ModifyFilesDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class ModifyFilesDlgGenerated : public wxDialog +class ModifyFilesDlgGenerated : public wxDialog { -private: - -protected: - wxPanel* m_panel8; - - wxStaticText* m_staticText56; - - - - wxStaticText* m_staticTextHeader; - - wxHyperlinkCtrl* m_hyperlink6; - - wxTextCtrl* m_textCtrlDirectory; - wxDirPickerCtrl* m_dirPicker; - wxSpinCtrl* m_spinCtrlTimeShift; - wxButton* m_button21; - wxButton* m_buttonApply; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnWriteDirManually( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnDirSelected( wxFileDirPickerEvent& event ) - { - event.Skip(); - } - virtual void OnCancel( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnApply( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - ModifyFilesDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - ~ModifyFilesDlgGenerated(); - + private: + + protected: + wxStaticBitmap* m_bitmap24; + wxPanel* m_panel8; + wxStaticText* m_staticText56; + + + + wxStaticText* m_staticTextHeader; + + wxHyperlinkCtrl* m_hyperlink6; + + wxTextCtrl* m_textCtrlDirectory; + wxDirPickerCtrl* m_dirPicker; + wxSpinCtrl* m_spinCtrlTimeShift; + wxButton* m_button21; + wxButton* m_buttonApply; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnWriteDirManually( wxCommandEvent& event ){ event.Skip(); } + virtual void OnDirSelected( wxFileDirPickerEvent& event ){ event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ){ event.Skip(); } + virtual void OnApply( wxCommandEvent& event ){ event.Skip(); } + + + public: + ModifyFilesDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + ~ModifyFilesDlgGenerated(); + }; #endif //__guiGenerated__ |