From 9084fa27f0f43cfa31dbc3a7ef87e2600c2dc3ca Mon Sep 17 00:00:00 2001 From: Daniel Wilhelm Date: Fri, 18 Apr 2014 16:56:34 +0200 Subject: 1.16 --- Application.cpp | 498 ++-- Application.h | 47 +- Changelog.txt | 30 + FreeFileSync.h | 7 +- Languages/dutch.lng | 134 +- Languages/french.lng | 92 +- Languages/german.lng | 90 +- Languages/italian.lng | 90 +- Languages/japanese.lng | 92 +- Languages/polish.lng | 106 +- Languages/portuguese.lng | 90 +- Makefile | 2 +- Readme.txt | 50 +- Resources.dat | Bin 150657 -> 162136 bytes algorithm.cpp | 352 ++- algorithm.h | 37 +- comparison.cpp | 609 ++--- comparison.h | 25 +- library/CustomGrid.cpp | 252 +- library/CustomGrid.h | 17 +- library/customButton.cpp | 20 +- library/customButton.h | 6 +- library/fileHandling.cpp | 342 ++- library/fileHandling.h | 35 +- library/globalFunctions.cpp | 2 +- library/misc.cpp | 12 +- library/processXml.cpp | 216 +- library/processXml.h | 90 +- library/resources.cpp | 6 + library/resources.h | 4 + library/sorting.h | 109 +- library/statusHandler.h | 13 +- library/zstring.cpp | 28 +- library/zstring.h | 9 +- synchronization.cpp | 284 ++- synchronization.h | 5 +- ui/MainDialog.cpp | 1340 ++++++----- ui/MainDialog.h | 108 +- ui/SmallDialogs.cpp | 151 +- ui/SmallDialogs.h | 39 +- ui/SyncDialog.cpp | 284 ++- ui/SyncDialog.h | 33 +- ui/guiGenerated.cpp | 5563 ++++++++++++++++++++++--------------------- ui/guiGenerated.h | 1695 +++++++------ 44 files changed, 7570 insertions(+), 5444 deletions(-) diff --git a/Application.cpp b/Application.cpp index 0ae28d66..87086d8a 100644 --- a/Application.cpp +++ b/Application.cpp @@ -1,10 +1,8 @@ /*******#include ******************************************************** - * Name: FreeFileSyncApp.cpp * Purpose: Code for Application Class * Author: ZenJu (zhnmju123@gmx.de) * Created: 2008-07-16 * Copyright: ZenJu () - * License: **************************************************************/ #include "application.h" @@ -19,8 +17,8 @@ #include "comparison.h" #include "synchronization.h" #include "algorithm.h" - -using namespace xmlAccess; +#include +#include "ui/smallDialogs.h" IMPLEMENT_APP(Application); @@ -68,7 +66,7 @@ bool Application::OnInit() //set program language: needs to happen after working directory has been set! SetExitOnFrameDelete(false); //prevent error messagebox from becoming top-level window - programLanguage.setLanguage(globalSettings.global.programLanguage); + programLanguage.setLanguage(globalSettings.shared.programLanguage); SetExitOnFrameDelete(true); //load image resources from file: must be called after working directory has been set @@ -83,16 +81,30 @@ void Application::initialize() //test if FFS is to be started on UI with config file passed as commandline parameter if (argc > 1) { - XmlType xmlConfigType = xmlAccess::getXmlType(argv[1]); - if (xmlConfigType == XML_GUI_CONFIG) //start in GUI mode (configuration file specified) + //load file specified by %1 parameter: + wxString filename; + if (wxFileExists(argv[1])) + filename = argv[1]; + else if (wxFileExists(wxString(argv[1]) + wxT(".ffs_batch"))) + filename = wxString(argv[1]) + wxT(".ffs_batch"); + else if (wxFileExists(wxString(argv[1]) + wxT(".ffs_gui"))) + filename = wxString(argv[1]) + wxT(".ffs_gui"); + else + { + wxMessageBox(wxString(_("The file does not exist:")) + wxT(" \"") + argv[1] + wxT("\""), _("Error"), wxOK | wxICON_ERROR); + return; + } + + xmlAccess::XmlType xmlConfigType = xmlAccess::getXmlType(filename); + if (xmlConfigType == xmlAccess::XML_GUI_CONFIG) //start in GUI mode (configuration file specified) { - MainDialog* frame = new MainDialog(NULL, argv[1], &programLanguage, globalSettings); + MainDialog* frame = new MainDialog(NULL, filename, &programLanguage, globalSettings); frame->SetIcon(*globalResource.programIcon); //set application icon frame->Show(); } - else if (xmlConfigType == XML_BATCH_CONFIG) //start in commandline mode + else if (xmlConfigType == xmlAccess::XML_BATCH_CONFIG) //start in commandline mode { - runBatchMode(argv[1], globalSettings); + runBatchMode(filename, globalSettings); if (wxApp::GetTopWindow() == NULL) //if no windows are shown program won't exit automatically ExitMainLoop(); @@ -100,7 +112,7 @@ void Application::initialize() } else { - wxMessageBox(wxString(_("The file does not contain a valid configuration:")) + wxT(" \"") + argv[1] + wxT("\""), _("Error"), wxOK | wxICON_ERROR); + wxMessageBox(wxString(_("The file does not contain a valid configuration:")) + wxT(" \"") + filename + wxT("\""), _("Error"), wxOK | wxICON_ERROR); return; } } @@ -143,7 +155,7 @@ int Application::OnRun() int Application::OnExit() { //get program language - globalSettings.global.programLanguage = programLanguage.getLanguage(); + globalSettings.shared.programLanguage = programLanguage.getLanguage(); try //save global settings to XML { @@ -174,8 +186,11 @@ public: logFile.Open(logfileName.c_str(), wxT("w")); readyToWrite = logFile.IsOpened(); if (readyToWrite) - { //"Date" is used at other places too - wxString headerLine = wxString(wxT("FreeFileSync (")) + _("Date") + wxT(": ") + wxDateTime::Now().FormatDate() + wxT(" ") + _("Time:") + wxT(" ") + wxDateTime::Now().FormatTime() + wxT(")"); + { + wxString headerLine = wxString(wxT("FreeFileSync - ")) + + _("Batch execution") + wxT(" (") + + _("Date") + wxT(": ") + wxDateTime::Now().FormatDate() + wxT(" ") + //"Date" is used at other places too + _("Time") + wxT(":") + wxT(" ") + wxDateTime::Now().FormatTime() + wxT(")"); logFile.Write(headerLine + wxChar('\n')); logFile.Write(wxString().Pad(headerLine.Len(), wxChar('-')) + wxChar('\n') + wxChar('\n')); @@ -207,7 +222,13 @@ public: if (problemType != wxEmptyString) logFile.Write(problemType + wxT(": ")); - logFile.Write(logText + wxChar('\n')); + //remove linebreaks + wxString formattedText = logText; + for (wxString::iterator i = formattedText.begin(); i != formattedText.end(); ++i) + if (*i == wxChar('\n')) + *i = wxChar(' '); + + logFile.Write(formattedText + wxChar('\n')); } private: @@ -233,7 +254,7 @@ private: void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSettings& globalSettings) { //load XML settings - XmlBatchConfig batchCfg; //structure to receive gui settings + xmlAccess::XmlBatchConfig batchCfg; //structure to receive gui settings try { batchCfg = xmlAccess::readBatchConfig(filename); @@ -245,98 +266,46 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet } //all settings have been read successfully... - //format directory names - for (std::vector::iterator i = batchCfg.directoryPairs.begin(); i != batchCfg.directoryPairs.end(); ++i) - { - i->leftDirectory = FreeFileSync::getFormattedDirectoryName(i->leftDirectory); - i->rightDirectory = FreeFileSync::getFormattedDirectoryName(i->rightDirectory); - } - - //init logfile - std::auto_ptr log; //delete log object on exit (if not NULL) - if (batchCfg.silent) - { - log = std::auto_ptr(new LogFile); - if (!log->isOkay()) - { //handle error: file load - wxMessageBox(_("Unable to create logfile!"), _("Error"), wxOK | wxICON_ERROR); - return; - } - } - - //begin of synchronization process (all in one try-catch block) - try + try //begin of synchronization process (all in one try-catch block) { //class handling status updates and error messages std::auto_ptr statusHandler; //delete object automatically if (batchCfg.silent) - statusHandler = std::auto_ptr(new BatchStatusHandlerSilent(batchCfg.mainCfg.ignoreErrors, log.get(), returnValue)); + statusHandler = std::auto_ptr(new BatchStatusHandlerSilent(batchCfg.handleError, returnValue)); else - statusHandler = std::auto_ptr(new BatchStatusHandlerGui(batchCfg.mainCfg.ignoreErrors, returnValue)); - - //test existence of Recycle Bin - if (batchCfg.mainCfg.useRecycleBin) - { - if (!FreeFileSync::recycleBinExists()) - statusHandler->exitAndSetStatus(_("Unable to initialize Recycle Bin!"), BatchStatusHandler::ABORTED); - } - - //check if directories are valid - wxString errorMessage; - if (!FreeFileSync::foldersAreValidForComparison(batchCfg.directoryPairs, errorMessage)) - statusHandler->exitAndSetStatus(errorMessage, BatchStatusHandler::ABORTED); - - - //check if folders have dependencies - if (globalSettings.global.folderDependCheckActive) - { - wxString warningMessage; - if (FreeFileSync::foldersHaveDependencies(batchCfg.directoryPairs, warningMessage)) - { - //abort if in silent mode - if (batchCfg.silent) - statusHandler->exitAndSetStatus(warningMessage, BatchStatusHandler::ABORTED); - - //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(NULL, WarningDlg::BUTTON_IGNORE | WarningDlg::BUTTON_ABORT, messageText, hideThisDialog); - const int rv = warningDlg->ShowModal(); - warningDlg->Destroy(); - if (rv == WarningDlg::BUTTON_ABORT) - statusHandler->exitAndSetStatus(warningMessage, BatchStatusHandler::ABORTED); - else - globalSettings.global.folderDependCheckActive = !hideThisDialog; - } - } - + statusHandler = std::auto_ptr(new BatchStatusHandlerGui(batchCfg.handleError, returnValue)); //COMPARE DIRECTORIES FileCompareResult currentGridData; - bool lineBreakOnMessages = !batchCfg.silent; - - #ifdef FFS_WIN - FreeFileSync::CompareProcess comparison(lineBreakOnMessages, globalSettings.global.handleDstOnFat32, statusHandler.get()); - #elif defined FFS_LINUX - FreeFileSync::CompareProcess comparison(lineBreakOnMessages, false, statusHandler.get()); - #endif +#ifdef FFS_WIN + FreeFileSync::CompareProcess comparison(globalSettings.shared.traverseSymbolicLinks, + globalSettings.shared.handleDstOnFat32, + globalSettings.shared.warningDependentFolders, + statusHandler.get()); +#elif defined FFS_LINUX + FreeFileSync::CompareProcess comparison(globalSettings.shared.traverseSymbolicLinks, + false, + globalSettings.shared.warningDependentFolders, + statusHandler.get()); +#endif comparison.startCompareProcess(batchCfg.directoryPairs, batchCfg.mainCfg.compareVar, currentGridData); //APPLY FILTERS if (batchCfg.mainCfg.filterIsActive) - FreeFileSync::filterCurrentGridData(currentGridData, batchCfg.mainCfg.includeFilter, batchCfg.mainCfg.excludeFilter); + FreeFileSync::filterGridData(currentGridData, batchCfg.mainCfg.includeFilter, batchCfg.mainCfg.excludeFilter); //check if there are files/folders to be sync'ed at all if (!synchronizationNeeded(currentGridData, batchCfg.mainCfg.syncConfiguration)) statusHandler->exitAndSetStatus(_("Nothing to synchronize according to configuration!"), BatchStatusHandler::FINISHED); //inform about this special case //START SYNCHRONIZATION - FreeFileSync::SyncProcess synchronization(batchCfg.mainCfg.useRecycleBin, lineBreakOnMessages, statusHandler.get()); + FreeFileSync::SyncProcess synchronization( + batchCfg.mainCfg.useRecycleBin, + globalSettings.shared.warningSignificantDifference, + statusHandler.get()); + synchronization.startSynchronizationProcess(currentGridData, batchCfg.mainCfg.syncConfiguration); } catch (AbortThisProcess&) //exit used by statusHandler @@ -349,24 +318,120 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet //###################################################################################################### -BatchStatusHandlerSilent::BatchStatusHandlerSilent(bool ignoreAllErrors, LogFile* log, int& returnVal) : - ignoreErrors(ignoreAllErrors), + +class FfsTrayIcon : public wxTaskBarIcon +{ +public: + FfsTrayIcon(StatusHandler* statusHandler) : + m_statusHandler(statusHandler), + processPaused(false) + { + running.reset(new wxIcon(*globalResource.programIcon)); + paused.reset(new wxIcon); + paused->CopyFromBitmap(*globalResource.bitmapFFSPaused); + + wxTaskBarIcon::SetIcon(*running); + } + + ~FfsTrayIcon() {} + + enum + { + CONTEXT_PAUSE, + CONTEXT_ABORT, + CONTEXT_ABOUT + }; + + virtual wxMenu* CreatePopupMenu() + { + wxMenu* contextMenu = new wxMenu; + contextMenu->Append(CONTEXT_PAUSE, _("&Pause"), wxEmptyString, wxITEM_CHECK); + contextMenu->Check(CONTEXT_PAUSE, processPaused); + contextMenu->Append(CONTEXT_ABORT, _("&Abort")); + contextMenu->AppendSeparator(); + contextMenu->Append(CONTEXT_ABOUT, _("&About...")); + //event handling + contextMenu->Connect(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(FfsTrayIcon::onContextMenuSelection), NULL, this); + + return contextMenu; //ownership transferred to library + } + + void onContextMenuSelection(wxCommandEvent& event) + { + int eventId = event.GetId(); + if (eventId == CONTEXT_PAUSE) + { + processPaused = !processPaused; + if (processPaused) + wxTaskBarIcon::SetIcon(*paused); + else + wxTaskBarIcon::SetIcon(*running); + } + else if (eventId == CONTEXT_ABORT) + { + processPaused = false; + wxTaskBarIcon::SetIcon(*running); + m_statusHandler->requestAbortion(); + } + else if (eventId == CONTEXT_ABOUT) + { + AboutDlg* aboutDlg = new AboutDlg(NULL); + aboutDlg->ShowModal(); + aboutDlg->Destroy(); + } + } + + void updateSysTray() + { + updateUiNow(); + + //support for pause button + while (processPaused) + { + wxMilliSleep(UI_UPDATE_INTERVAL); + updateUiNow(); + } + } + +private: + StatusHandler* m_statusHandler; + bool processPaused; + std::auto_ptr running; + std::auto_ptr paused; +}; + + +BatchStatusHandlerSilent::BatchStatusHandlerSilent(const xmlAccess::OnError handleError, int& returnVal) : + m_handleError(handleError), currentProcess(StatusHandler::PROCESS_NONE), returnValue(returnVal), - m_log(log) {} + trayIcon(new FfsTrayIcon(this)), + m_log(new LogFile) +{ + //test if log was instantiated successfully + if (!m_log->isOkay()) + { //handle error: file load + wxMessageBox(_("Unable to create logfile!"), _("Error"), wxOK | wxICON_ERROR); + throw AbortThisProcess(); + } +} BatchStatusHandlerSilent::~BatchStatusHandlerSilent() { unsigned int failedItems = unhandledErrors.GetCount(); - if (failedItems) - returnValue = -5; //write result if (abortRequested) + { + returnValue = -4; m_log->write(_("Synchronization aborted!"), _("Error")); + } else if (failedItems) - m_log->write(_("Synchronization completed with errors!"), _("Error")); + { + returnValue = -5; + m_log->write(_("Synchronization completed with errors!"), _("Info")); + } else m_log->write(_("Synchronization completed successfully!"), _("Info")); } @@ -387,25 +452,132 @@ void BatchStatusHandlerSilent::initNewProcess(int objectsTotal, double dataTotal } -ErrorHandler::Response BatchStatusHandlerSilent::reportError(const Zstring& text) +ErrorHandler::Response BatchStatusHandlerSilent::reportError(const Zstring& errorMessage) { - if (ignoreErrors) + switch (m_handleError) + { + case xmlAccess::ON_ERROR_POPUP: { - unhandledErrors.Add(text.c_str()); - m_log->write(text.c_str(), _("Error")); + bool ignoreNextErrors = false; + ErrorDlg* errorDlg = new ErrorDlg(NULL, + ErrorDlg::BUTTON_IGNORE | ErrorDlg::BUTTON_RETRY | ErrorDlg::BUTTON_ABORT, + wxString(errorMessage) + wxT("\n\n") + _("Ignore this error, retry or abort?"), + ignoreNextErrors); + const int rv = errorDlg->ShowModal(); + errorDlg->Destroy(); + switch (rv) + { + case ErrorDlg::BUTTON_IGNORE: + if (ignoreNextErrors) //falsify only + m_handleError = xmlAccess::ON_ERROR_IGNORE; + unhandledErrors.Add(errorMessage.c_str()); + m_log->write(errorMessage.c_str(), _("Error")); + return ErrorHandler::IGNORE_ERROR; + + case ErrorDlg::BUTTON_RETRY: + return ErrorHandler::RETRY; + + case ErrorDlg::BUTTON_ABORT: + unhandledErrors.Add(errorMessage.c_str()); + m_log->write(errorMessage.c_str(), _("Error")); + abortThisProcess(); + } + } + break; //used if last switch didn't find a match + + case xmlAccess::ON_ERROR_EXIT: //abort + unhandledErrors.Add(errorMessage.c_str()); + m_log->write(errorMessage.c_str(), _("Error")); + abortThisProcess(); + + case xmlAccess::ON_ERROR_IGNORE: + unhandledErrors.Add(errorMessage.c_str()); + m_log->write(errorMessage.c_str(), _("Error")); return ErrorHandler::IGNORE_ERROR; } - else + + assert(false); + return ErrorHandler::IGNORE_ERROR; //dummy value +} + + +void BatchStatusHandlerSilent::reportFatalError(const Zstring& errorMessage) +{ + switch (m_handleError) { - unhandledErrors.Add(text.c_str()); - m_log->write(text.c_str(), _("Error")); - abortRequested = true; - throw AbortThisProcess(); + case xmlAccess::ON_ERROR_POPUP: + { + bool dummy = false; + ErrorDlg* errorDlg = new ErrorDlg(NULL, + ErrorDlg::BUTTON_ABORT, + errorMessage.c_str(), dummy); + errorDlg->ShowModal(); + errorDlg->Destroy(); } + break; + + case xmlAccess::ON_ERROR_EXIT: + break; + + case xmlAccess::ON_ERROR_IGNORE: + break; + } + + unhandledErrors.Add(errorMessage.c_str()); + m_log->write(errorMessage.c_str(), _("Error")); + abortThisProcess(); } -void BatchStatusHandlerSilent::abortThisProcess() //not used in this context! +void BatchStatusHandlerSilent::reportWarning(const Zstring& warningMessage, bool& dontShowAgain) +{ + switch (m_handleError) + { + case xmlAccess::ON_ERROR_POPUP: + { + //show popup and ask user how to handle warning + bool dontWarnAgain = false; + WarningDlg* warningDlg = new WarningDlg(NULL, + WarningDlg::BUTTON_IGNORE | WarningDlg::BUTTON_ABORT, + warningMessage.c_str(), + dontWarnAgain); + const int rv = warningDlg->ShowModal(); + warningDlg->Destroy(); + switch (rv) + { + case WarningDlg::BUTTON_ABORT: + unhandledErrors.Add(warningMessage.c_str()); + m_log->write(warningMessage.c_str(), _("Warning")); + abortThisProcess(); + case WarningDlg::BUTTON_IGNORE: //no unhandled error situation! + dontShowAgain = dontWarnAgain; + m_log->write(warningMessage.c_str(), _("Warning")); + return; + } + } + break; //keep it! last switch might not find match + + case xmlAccess::ON_ERROR_EXIT: //abort + unhandledErrors.Add(warningMessage.c_str()); + m_log->write(warningMessage.c_str(), _("Warning")); + abortThisProcess(); + + case xmlAccess::ON_ERROR_IGNORE: //no unhandled error situation! + m_log->write(warningMessage.c_str(), _("Warning")); + return; + } + + assert(false); +} + + +void BatchStatusHandlerSilent::forceUiRefresh() +{ + trayIcon->updateSysTray(); //needed by sys-tray icon only +} + + +void BatchStatusHandlerSilent::abortThisProcess() //used by sys-tray menu { abortRequested = true; throw AbortThisProcess(); @@ -421,12 +593,10 @@ void BatchStatusHandlerSilent::exitAndSetStatus(const wxString& message, ExitCod m_log->write(message, _("Error")); abortRequested = true; throw AbortThisProcess(); - break; case BatchStatusHandler::FINISHED: m_log->write(message, _("Info")); throw AbortThisProcess(); - break; default: assert(false); } @@ -434,8 +604,8 @@ void BatchStatusHandlerSilent::exitAndSetStatus(const wxString& message, ExitCod //###################################################################################################### -BatchStatusHandlerGui::BatchStatusHandlerGui(bool ignoreAllErrors, int& returnVal) : - ignoreErrors(ignoreAllErrors), +BatchStatusHandlerGui::BatchStatusHandlerGui(const xmlAccess::OnError handleError, int& returnVal) : + m_handleError(handleError), currentProcess(StatusHandler::PROCESS_NONE), returnValue(returnVal) { @@ -452,14 +622,19 @@ BatchStatusHandlerGui::~BatchStatusHandlerGui() unsigned int failedItems = unhandledErrors.GetCount(); if (failedItems) { - returnValue = -5; - finalMessage = wxString(_("Warning: Synchronization failed for %x item(s):")) + wxT("\n\n"); finalMessage.Replace(wxT("%x"), globalFunctions::numberToWxString(failedItems), false); for (unsigned int j = 0; j < failedItems; ++j) - finalMessage+= unhandledErrors[j] + wxT("\n"); - finalMessage+= wxT("\n"); + { //remove linebreaks + wxString errorMessage = unhandledErrors[j]; + for (wxString::iterator i = errorMessage.begin(); i != errorMessage.end(); ++i) + if (*i == wxChar('\n')) + *i = wxChar(' '); + + finalMessage += errorMessage + wxT("\n"); + } + finalMessage += wxT("\n"); } if (!additionalStatusInfo.IsEmpty()) @@ -468,19 +643,21 @@ BatchStatusHandlerGui::~BatchStatusHandlerGui() //notify to syncStatusFrame that current process has ended if (abortRequested) { - finalMessage+= _("Synchronization aborted!"); + returnValue = -4; + finalMessage += _("Synchronization aborted!"); syncStatusFrame->setStatusText_NoUpdate(finalMessage.c_str()); syncStatusFrame->processHasFinished(SyncStatus::ABORTED); //enable okay and close events } else if (failedItems) { - finalMessage+= _("Synchronization completed with errors!"); + returnValue = -5; + finalMessage += _("Synchronization completed with errors!"); syncStatusFrame->setStatusText_NoUpdate(finalMessage.c_str()); syncStatusFrame->processHasFinished(SyncStatus::FINISHED_WITH_ERROR); } else { - finalMessage+= _("Synchronization completed successfully!"); + finalMessage += _("Synchronization completed successfully!"); syncStatusFrame->setStatusText_NoUpdate(finalMessage.c_str()); syncStatusFrame->processHasFinished(SyncStatus::FINISHED_WITH_SUCCESS); } @@ -529,40 +706,95 @@ void BatchStatusHandlerGui::updateProcessedData(int objectsProcessed, double dat } -ErrorHandler::Response BatchStatusHandlerGui::reportError(const Zstring& text) +ErrorHandler::Response BatchStatusHandlerGui::reportError(const Zstring& errorMessage) { - if (ignoreErrors) //this option can be set from commandline or by the user in the error dialog on UI + //add current time before error message + wxString errorWithTime = wxString(wxT("[")) + wxDateTime::Now().FormatTime() + wxT("] ") + errorMessage.c_str(); + + switch (m_handleError) { - unhandledErrors.Add(text.c_str()); - return ErrorHandler::IGNORE_ERROR; - } - else + case xmlAccess::ON_ERROR_POPUP: { syncStatusFrame->updateStatusDialogNow(); bool ignoreNextErrors = false; - wxString errorMessage = wxString(text) + wxT("\n\n") + _("Ignore this error, retry or abort?"); - ErrorDlg* errorDlg = new ErrorDlg(syncStatusFrame, errorMessage, ignoreNextErrors); - + ErrorDlg* errorDlg = new ErrorDlg(syncStatusFrame, + ErrorDlg::BUTTON_IGNORE | ErrorDlg::BUTTON_RETRY | ErrorDlg::BUTTON_ABORT, + wxString(errorMessage) + wxT("\n\n") + _("Ignore this error, retry or abort?"), + ignoreNextErrors); switch (errorDlg->ShowModal()) { case ErrorDlg::BUTTON_IGNORE: - ignoreErrors = ignoreNextErrors; - unhandledErrors.Add(text.c_str()); + if (ignoreNextErrors) //falsify only + m_handleError = xmlAccess::ON_ERROR_IGNORE; + unhandledErrors.Add(errorWithTime); return ErrorHandler::IGNORE_ERROR; case ErrorDlg::BUTTON_RETRY: return ErrorHandler::RETRY; case ErrorDlg::BUTTON_ABORT: - { - unhandledErrors.Add(text.c_str()); - abortRequested = true; - throw AbortThisProcess(); + unhandledErrors.Add(errorWithTime); + abortThisProcess(); } - default: - assert (false); - return ErrorHandler::IGNORE_ERROR; + } + break; //used IF last switch didn't find a match + + case xmlAccess::ON_ERROR_EXIT: //abort + unhandledErrors.Add(errorWithTime); + abortThisProcess(); + + case xmlAccess::ON_ERROR_IGNORE: + unhandledErrors.Add(errorWithTime); + return ErrorHandler::IGNORE_ERROR; + } + + assert(false); + return ErrorHandler::IGNORE_ERROR; //dummy value +} + + +void BatchStatusHandlerGui::reportFatalError(const Zstring& errorMessage) +{ //add current time before error message + wxString errorWithTime = wxString(wxT("[")) + wxDateTime::Now().FormatTime() + wxT("] ") + errorMessage.c_str(); + + unhandledErrors.Add(errorWithTime); + abortThisProcess(); +} + + +void BatchStatusHandlerGui::reportWarning(const Zstring& warningMessage, bool& dontShowAgain) +{ //add current time before warning message + wxString warningWithTime = wxString(wxT("[")) + wxDateTime::Now().FormatTime() + wxT("] ") + warningMessage.c_str(); + + switch (m_handleError) + { + case xmlAccess::ON_ERROR_POPUP: + case xmlAccess::ON_ERROR_EXIT: //show popup in this case also + { + //show popup and ask user how to handle warning + bool dontWarnAgain = false; + WarningDlg* warningDlg = new WarningDlg(NULL, + WarningDlg::BUTTON_IGNORE | WarningDlg::BUTTON_ABORT, + warningMessage.c_str(), + dontWarnAgain); + const int rv = warningDlg->ShowModal(); + warningDlg->Destroy(); + switch (rv) + { + case WarningDlg::BUTTON_IGNORE: //no unhandled error situation! + dontShowAgain = dontWarnAgain; + return; + case WarningDlg::BUTTON_ABORT: + unhandledErrors.Add(warningWithTime); + abortThisProcess(); } } + break; //keep it! last switch might not find match + + case xmlAccess::ON_ERROR_IGNORE: //no unhandled error situation! + return; + } + + assert(false); } diff --git a/Application.h b/Application.h index e1b12172..60b8fbe7 100644 --- a/Application.h +++ b/Application.h @@ -54,51 +54,60 @@ public: class LogFile; +class FfsTrayIcon; + class BatchStatusHandlerSilent : public BatchStatusHandler { public: - BatchStatusHandlerSilent(bool ignoreAllErrors, LogFile* log, int& returnVal); + BatchStatusHandlerSilent(const xmlAccess::OnError handleError, int& returnVal); ~BatchStatusHandlerSilent(); - void updateStatusText(const Zstring& text); //virtual impl. - void initNewProcess(int objectsTotal, double dataTotal, Process processID); //virtual impl. - void updateProcessedData(int objectsProcessed, double dataProcessed) {} //virtual impl. - ErrorHandler::Response reportError(const Zstring& text); //virtual impl. - void forceUiRefresh() {} //virtual impl. + virtual void updateStatusText(const Zstring& text); + virtual void initNewProcess(int objectsTotal, double dataTotal, Process processID); + virtual void updateProcessedData(int objectsProcessed, double dataProcessed) {} + virtual void forceUiRefresh(); + + virtual ErrorHandler::Response reportError(const Zstring& errorMessage); + virtual void reportFatalError(const Zstring& errorMessage); + virtual void reportWarning(const Zstring& warningMessage, bool& dontShowAgain); - void exitAndSetStatus(const wxString& message, ExitCode code); //abort externally //virtual impl. + virtual void exitAndSetStatus(const wxString& message, ExitCode code); //abort externally private: - void abortThisProcess(); //virtual impl. + virtual void abortThisProcess(); - bool ignoreErrors; + xmlAccess::OnError m_handleError; wxArrayString unhandledErrors; //list of non-resolved errors Process currentProcess; int& returnValue; + std::auto_ptr trayIcon; - LogFile* m_log; + std::auto_ptr m_log; }; class BatchStatusHandlerGui : public BatchStatusHandler { public: - BatchStatusHandlerGui(bool ignoreAllErrors, int& returnVal); + BatchStatusHandlerGui(const xmlAccess::OnError handleError, int& returnVal); ~BatchStatusHandlerGui(); - void updateStatusText(const Zstring& text); //virtual impl. - void initNewProcess(int objectsTotal, double dataTotal, Process processID); //virtual impl. - void updateProcessedData(int objectsProcessed, double dataProcessed); //virtual impl. - ErrorHandler::Response reportError(const Zstring& text); //virtual impl. - void forceUiRefresh(); //virtual impl. + virtual void updateStatusText(const Zstring& text); + virtual void initNewProcess(int objectsTotal, double dataTotal, Process processID); + virtual void updateProcessedData(int objectsProcessed, double dataProcessed); + virtual void forceUiRefresh(); + + virtual ErrorHandler::Response reportError(const Zstring& errorMessage); + virtual void reportFatalError(const Zstring& errorMessage); + virtual void reportWarning(const Zstring& warningMessage, bool& dontShowAgain); - void exitAndSetStatus(const wxString& message, ExitCode code); //abort externally //virtual impl. + virtual void exitAndSetStatus(const wxString& message, ExitCode code); //abort externally private: - void abortThisProcess(); //virtual impl. + virtual void abortThisProcess(); - bool ignoreErrors; + xmlAccess::OnError m_handleError; wxArrayString unhandledErrors; //list of non-resolved errors Process currentProcess; int& returnValue; diff --git a/Changelog.txt b/Changelog.txt index 5ccec069..32f6d074 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,36 @@ FreeFileSync ------------ +Changelog v1.16 +--------------- +Support for \\?\ path prefix for unrestricted path length (directory names > 255 characters) (windows only) +Copy files even if target folder does not exist +Fixed occasional error when switching languages +Added sys-tray icon for silent batch mode (pause, abort, about) +Support for numeric del-key +Avoid endless loops with Vista symbolic links (don't traverse into symbolic links - configurable) +New functionality for loading batch files (load button or drag & drop to main/batch window) +New options for batch file error handling: "popup, ignore errors, exit with returncode < 0" +New option to reset all warning messages +Allow marking both sides of the main grid via CTRL + mouse-click +Allow manual deletion of files on both or one side only (respecting selections on both sides) +Special recylcer option for manual deletion +New optional grid column: Full name +Fixed locale related issue when comparing. Big thanks to Persson Henric for providing support! +New check if more than 50% of files will be overwritten/deleted +Save memory by clearing old results before re-comparing +Usability improvements: + - name of config file in window title + - refresh view filters on configuration load + - default to ascending sort when changing column + - maximum length of config file history customizable through xml + - new "load configuration" button + - check/uncheck option for middle grid + - support for CTRL + A (select all) + - enhanced error messages (windows only) +Updated translation files + + Changelog v1.15 --------------- Fixed performance bottleneck in batch mode (non-silent) diff --git a/FreeFileSync.h b/FreeFileSync.h index c4771171..4d140769 100644 --- a/FreeFileSync.h +++ b/FreeFileSync.h @@ -47,8 +47,7 @@ namespace FreeFileSync 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) {} + useRecycleBin(FreeFileSync::recycleBinExists()) {} //enable if OS supports it; else user will have to activate first and then get an error message //Compare setting CompareVariant compareVar; @@ -61,10 +60,8 @@ namespace FreeFileSync wxString includeFilter; wxString excludeFilter; - //misc options bool useRecycleBin; //use Recycle bin when deleting or overwriting files while synchronizing - bool ignoreErrors; //hides error messages during synchronization }; @@ -97,7 +94,7 @@ namespace FreeFileSync if (aLength != bLength) return aLength < bLength; #ifdef FFS_WIN //Windows does NOT distinguish between upper/lower-case - return relativeName.CmpNoCase(b.relativeName) < 0; //implementing a (reverse) comparison manually is a lot slower! + return FreeFileSync::compareStringsWin32(relativeName.c_str(), b.relativeName.c_str()) < 0; //implementing a (reverse) comparison manually is a lot slower! #elif defined FFS_LINUX //Linux DOES distinguish between upper/lower-case return relativeName.Cmp(b.relativeName) < 0; #endif diff --git a/Languages/dutch.lng b/Languages/dutch.lng index a731bb32..227f6cad 100644 --- a/Languages/dutch.lng +++ b/Languages/dutch.lng @@ -28,8 +28,8 @@ &Informatie... &Advanced &Geavanceerd -&Back -&Terug +&Apply +&Toepassen &Cancel &Annuleren &Compare @@ -42,12 +42,16 @@ &Exporteer bestandslijst &File &Bestand +&Global settings +&Algemene instellingen &Help &Help &Ignore &Negeren &Language &Taal +&Load +&Laden &Load configuration &Laad de configuratie &OK @@ -56,12 +60,14 @@ &Pause &Quit &Afsluiten -&Resolve -&Oplossen &Retry &Opnieuw proberen +&Save +&Opslaan &Start &Start +&Synchronize... +&Synchroniseer... , . - different @@ -108,6 +114,8 @@ << linker bestand is nieuwer\n + + <| file on left side only\n @@ -126,6 +134,8 @@ About Informatie Action Actie +Active for FAT/FAT32 drives only: When comparing filetimes treat files that differ by less or equal than 1 hour as equal. This ensures daylight saving time switches are handled properly. +Aleen van toepassing voor FAT/FAT32-schijven: wanneer bestandstijden worden vergeleken, de bestanden die verschillen met 1 of minder dan 1 uur als gelijk behandelen. Dit zorgt ervoor dat zomertijd veranderingen juist worden afgehandeld. Add folder pair Voeg 1 paar gekoppelde mappen toe All items have been synchronized! @@ -136,14 +146,22 @@ As a result the files are separated into the following categories: Hierdoor worden de bestanden gescheiden in de volgende categorieën: 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: Zoals de naam suggereert, worden twee bestanden met dezelfde naam alleen gemarkeerd als gelijk, als ze precies dezelfde inhoud hebben. Deze optie is handig voor een consistentiecontrole in plaats van back-up handelingen. Daarom worden de tijdstempels niet bekeken.\n\n Met deze optie aan is de beslissingsboom korter: -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. -Creëer een batchbestand met de volgende instellingen. Om synchronisatie\nin batchmodus uit te voeren kunt u dit bestand uitvoeren of opnemen in de taakplanner van het systeem. +Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe . This can also be scheduled in your operating system's task planner. +Assembleer een batchbestand voor automatische synchronisatie. Om te starten in batchmodus is het voldoende om de bestandsnaam achter de FreeFileSync toepassing te zetten: FreeFileSync.exe . Het is mogelijk dit in te plannen in de systeemplanner. +Batch execution +Batch taak uitvoeren Batch file created successfully! Batchbestand is succesvol aangemaakt! +Batch job +Batch taak Big thanks for localizing FreeFileSync goes out to: Extra dank voor het vertalen van FreeFileSync gaat naar: Build: Gebouwd: +Cancel +Annuleren +Check all +Alles controleren Choose to hide filtered files/directories from list Gefilterde bestanden niet/wel weergeven Comma separated list @@ -180,8 +198,6 @@ 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 Conversion error: @@ -216,6 +232,8 @@ Current operation: Huidige operatie: Custom Gebruik +Customize columns +Aanpassen kolommen DECISION TREE BESLISSINGSBOOM Data remaining: @@ -230,14 +248,18 @@ Delete files/folders existing on right side only Verwijder bestanden/folders die alleen rechts bestaan Delete files\tDEL Verwijder bestanden\tDEL +Delete on both sides +Verwijder aan beide kanten +Delete on both sides even if the file is selected on one side only +Verwijder aan beide kanten ookal is het bestand maar aan één kant geselecteerd Delete: Verwijderen: Deleting file %x Bestand %x wordt verwijderd Deleting folder %x Map %x wordt verwijderd -Directories are dependent: -De volgende paden zijn afhankelijk van elkaar: +Directories are dependent! Be careful when setting up synchronization rules: +Mappen zijn afhankelijk van elkaar! Wees voorzichtig met het maken van synchronisatieregels: Directory does not exist: Map bestaat niet: Do not show graphical status and error messages but write to a logfile instead @@ -248,8 +270,8 @@ Do nothing Geen actie ondernemen Do you really want to delete the following objects(s)? Weet u zeker dat u de volgende bestanden wilt verwijderen? -Do you really want to move the following objects(s) to the recycle bin? -Weet u zeker dat u de volgende bestanden naar de prullenbak wilt verplaatsen? +Do you really want to move the following objects(s) to the Recycle Bin? +Weet u zeker dat u de/het volgende bestand(en) wilt verplaatsen naar de prullenbak? Donate with PayPal Doneer met PayPal Drag && drop @@ -268,24 +290,42 @@ Error deleting directory: Er is een fout opgetreden bij het verwijderen van pad: Error deleting file: Er is een fout opgetreden bij het verwijderen van bestand: -Error moving to recycle bin: -Er is een fout opgetreden bij verwijderen naar de prullenbak: +Error handling +Fout afhandeling +Error moving to Recycle Bin: +Er is een fout opgetreden bij het verplaatsen naar de prullenbak: Error parsing configuration file: Er is een fout opgetreden bij het aanmaken van configuratiebestand: Error reading file: Er is een fout opgetreden bij het lezen van het bestand: +Error reading folder attributes: +Er is een fout opgetreden bij het lezen van de map-eigenschappen: Error traversing directory: Er is een fout opgetreden bij het doorzoeken van map: Error writing file: Er is een fout opgetreden bij het schrijven naar bestand: +Error writing folder attributes: +Er is een fout opgetreden bij het schrijven van de map-eigenschappen: Error: Source directory does not exist anymore: Er is een fout opgetreden. De oorspronkelijke map bestaat niet meer: Example Voorbeeld Exclude Uitsluiten +Exclude temporarily +Tijdelijk uitsluiten +Exclude via filter: +Uitsluiten door filter: +Exit immediately and set returncode < 0 +Onmiddelijk afsluiten en zet de returncode < 0 +Exit with RC < 0 +Afsluiten met RC < 0 +FAT32: Handle Daylight Saving Time +FAT32: Gebruik zomertijd Feedback and suggestions are welcome at: Tips en suggesties zijn welkom op: +File Manager integration: +Integratie bestandsbeheer: File already exists. Overwrite? Het bestand bestaat al. Overschrijven? File content @@ -318,14 +358,14 @@ Files/folders that exist on left side only Bestanden/mappen die alleen aan de linkerkant bestaan Files/folders that exist on right side only Bestanden/mappen die alleen aan de rechterkant bestaan -Filter -Filter Filter active: Press again to deactivate Filter actief: nogmaals klikken om uit te zetten Filter files Filter bestanden Filter view Bekijk het filter +Folder Comparison and Synchronization +Mappen vergelijken en synchroniseren Folder pair Gekoppelde mappen FreeFileSync - Folder Comparison and Synchronization @@ -338,8 +378,16 @@ FreeFileSync batch file FreeFileSync batchbestand FreeFileSync configuration FreeFileSync configuratie +Full name +Volledige naam +Generating file list... +Bestandslijst genereren... +Global settings +Algemene instellingen Help Help +Hide all error and warning messages +Verberg alle foutmeldingen en waarschuwingen Hide files that are different Verberg bestanden die verschillend zijn Hide files that are equal @@ -366,22 +414,22 @@ If you like FFS: Als het programma u bevalt: Ignore errors Negeer foutmeldingen -Ignore next errors -Negeer volgende foutmeldingen +Ignore subsequent errors +Negeer verdere foutmeldingen Ignore this error, retry or abort synchronization? Negeer deze fout, opnieuw proberen of afbreken van deze synchronisatie? Ignore this error, retry or abort? Negeer deze fout, opnieuw proberen of de handeling afbreken? Include Gebruiken +Include temporarily +Tijdelijk bijsluiten Include: *.doc;*.zip;*.exe\nExclude: *\\temp\\* Gebruiken: *.doc;*.zip;*.exe\nUitsluiten: *\\temp\\* 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! Initialiseren van de prullenbak is mislukt. 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. :) @@ -390,16 +438,20 @@ Left folder: Linker map: Legend Legenda -Load configuration via...\n - this list (press DEL to delete items)\n - drag & drop to this window\n - startup parameter -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... +Load configuration from file +Laad configuratie uit bestand +Load configuration history (press DEL to delete items) +Laad configuratiegeschiedenis (druk op DEL om items te verwijderen) 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. +Move column down +Verplaats kolom naar beneden +Move column up +Verplaats kolom naar boven Not all items were synchronized! Have a look at the list. Niet alle bestanden zijn gesynchroniseerd! Bekijk de lijst. Nothing to synchronize according to configuration! @@ -410,10 +462,14 @@ 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 +OK +OKE 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 File Manager\tD-Click +Openen met bestandsbeheerder\tD-klik Operation aborted! Operatie afgebroken! Operation: @@ -434,6 +490,12 @@ Relative path Relatieve pad Remove folder pair Verwijder 1 paar gekoppelde mappen +Reset +Reset +Reset all warning messages? +Reset alle waarschuwingen? +Resets all warning messages +Reset alle waarschuwingen Result Resultaat Right folder: @@ -464,10 +526,18 @@ Show files that exist on left side only Geef bestanden weer die alleen bestaan aan de linkerkant Show files that exist on right side only Geef bestanden weer die alleen bestaan aan de rechterkant +Show popup +Pop-up weergeven +Show popup on errors or warnings +Pop-up weergeven bij foutmeldingen of waarschuwingen +Significant difference detected: More than 50% of files will be overwritten/deleted! +Significant verschil gedetecteerd: meer dan 50% van de bestanden zal worden overschreven/verwijderd! Silent mode Stille modus Size Grootte +Sorting file list... +Bestandslijst sorteren... Source code written completely in C++ utilizing: Broncode compleet geschreven in C++ met behulp van: Start @@ -484,6 +554,8 @@ Synchronization completed successfully! Synchronisatie succesvol afgerond! Synchronization completed with errors! Synchronisatie afgerond. Er zijn fouten opgetreden. +Synchronization filter +Synchronisatie filter Synchronization settings Synchronisatie instellingen Synchronization status @@ -498,14 +570,18 @@ System out of memory! Systeem heeft te weinig geheugen The file does not contain a valid configuration: Het bestand bevat geen geldige configuratie: -The selected file does not exist: -Het volgende geselecteerde bestand bestaat niet: +The file does not exist: +Het bestand bestaat niet: +This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file. +Deze opdrachtregel wordt bij elke dubbelklik op een bestandsnaam uitgevoerd. %name doet dienst als plaatshouder voor het betreffende bestand. +This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file. +Deze opdrachtregel zal elke keer dat u dubbelklikt op een bestandsnaam, worden uitgevoerd. %x doet dienst als opslagplaats voor het geselecteerde bestand. 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 +Tijd Time elapsed: Verstreken tijd: -Time: -Tijd: Total amount of data that will be transferred Hoeveelheid data die verplaatst word Total time: @@ -516,6 +592,8 @@ Unable to create logfile! Niet mogelijk om een logbestand aan te maken! Unable to initialize Recycle Bin! De prullenbak kon niet worden geïnitialiseerd! +Uncheck all +Alles uitvinken Update -> Overschrijven -> Update: diff --git a/Languages/french.lng b/Languages/french.lng index c4f6207c..600257ca 100644 --- a/Languages/french.lng +++ b/Languages/french.lng @@ -28,8 +28,8 @@ &A propos de... &Advanced &Avancé -&Back -&Quitter +&Apply +&Appliquer &Cancel &Annuler &Compare @@ -50,6 +50,8 @@ &Ignorer &Language &Langue +&Load +&Charger &Load configuration &Charger la configuration &OK @@ -58,8 +60,6 @@ &Pause &Quit &Quitter -&Resolve -&Résoudre &Retry &Réessayer &Save @@ -114,6 +114,8 @@ << le fichier de gauche est plus récent\n + + <| file on left side only\n @@ -144,8 +146,10 @@ As a result the files are separated into the following categories: En conclusion, les fichiers sont répartis dans les catégories suivantes: 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: Comme le nom le suggère, deux fichiers qui ont le même nom sont considérés comme identiques si, et seulement si, leur contenu est identique. Cette option est utile pour les contrôles de cohérence plutôt que pour les opérations de sauvegarde. Toutefois, les dates et heures ne sont pas du tout prises en compte.\n\nAvec cette option, l'arbre de décision est plus simple: -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. -Créer un fichier de commandes avec les paramètres suivants. Pour lancer la synchronisation en mode batch, exécutez ce fichier ou paramétrez-le dans le planificateur de tâches. +Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe . This can also be scheduled in your operating system's task planner. +Créer un fichier de commandespour une synchronisation automatique. Pour démarrer en mode batch, indiquer le nom du fichier à l'exécutable FreeFileSync: freefilesync.exe . Ceci peut aussi être programmé dans le plannificateur de tâches. +Batch execution +Exécution du fichier de commandes Batch file created successfully! Fichier de commandes créé avec succès! Batch job @@ -156,6 +160,8 @@ Build: Créé: Cancel Annuler +Check all +Cocher tout Choose to hide filtered files/directories from list Masquer les fichiers/répertoires filtrés Comma separated list @@ -192,8 +198,6 @@ 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 Conversion error: @@ -244,14 +248,18 @@ Delete files/folders existing on right side only Suppression des fichiers/répertoires n'existant que sur le côté droit Delete files\tDEL Suppression des fichiers\tDEL +Delete on both sides +Suppression des deux côtés +Delete on both sides even if the file is selected on one side only +Suppression des deux côtés même si le fichier est sélectionné d'un seul côté Delete: Suppressions: Deleting file %x Suppression du fichier %x Deleting folder %x Suppression du dossier %x -Directories are dependent: -Les dossiers sont liés: +Directories are dependent! Be careful when setting up synchronization rules: +Les dossiers sont imbriqués! Attention à la mise à jour des règles de synchronisation: Directory does not exist: Le répertoire n'existe pas: Do not show graphical status and error messages but write to a logfile instead @@ -262,8 +270,8 @@ Do nothing Ne rien faire Do you really want to delete the following objects(s)? Voulez-vous vraiment supprimer les objets suivants ? -Do you really want to move the following objects(s) to the recycle bin? -Voulez-vous vraiment envoyer les objets suivants dans la corbeille ? +Do you really want to move the following objects(s) to the Recycle Bin? +Voulez-vous vraiment déplacer les objets suivants dans la corbeille? Donate with PayPal Faites un don avec PayPal Drag && drop @@ -282,16 +290,22 @@ 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 handling +Erreur de gestion de fichiers +Error moving to Recycle Bin: +Erreur lors du déplacement dans 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 reading folder attributes: +Erreur lors de la lecture des attributs du dossier Error traversing directory: Erreur lors du parcours du répertoire: Error writing file: Erreur lors de l'écriture du fichier: +Error writing folder attributes: +Erreur lors de l'écriture des attributs du dossier Error: Source directory does not exist anymore: Erreur: le répertoire source n'existe plus: Example @@ -302,6 +316,10 @@ Exclude temporarily Exclure temporairement Exclude via filter: Exclure à l'aide du filtre: +Exit immediately and set returncode < 0 +Sortie immédiate avec le returncode < 0 +Exit with RC < 0 +Sortie avec RC < 0 FAT32: Handle Daylight Saving Time FAT32: Traitement de l'heure d'été Feedback and suggestions are welcome at: @@ -340,14 +358,14 @@ Files/folders that exist on left side only Fichiers/répertoires existants seulement à gauche Files/folders that exist on right side only Fichiers/répertoires existants seulement à droite -Filter -Filtrage Filter active: Press again to deactivate Filtrage actif: Cliquez de nouveau pour le désactiver Filter files Filtrage des fichiers Filter view Filtrage de la vue +Folder Comparison and Synchronization +Comparaison de Dossiers et Synchronisation Folder pair Couple de dossiers FreeFileSync - Folder Comparison and Synchronization @@ -360,12 +378,16 @@ FreeFileSync batch file FreeFileSync fichier de commandes FreeFileSync configuration FreeFileSync configuration +Full name +Nom complet Generating file list... Génération de la liste des fichiers... Global settings Paramètres généraux Help Aide +Hide all error and warning messages +Masquer tous les messages d'erreurs et les avertissements Hide files that are different Masquer les fichiers différents Hide files that are equal @@ -392,8 +414,8 @@ If you like FFS: Si vous aimez FFS: Ignore errors Ignorer les erreurs -Ignore next errors -Ignorer les erreurs suivantes +Ignore subsequent errors +Ignorer les erreurs ultérieures Ignore this error, retry or abort synchronization? Ignorer l'erreur, réessayer ou abandonner la synchronisation ? Ignore this error, retry or abort? @@ -408,8 +430,6 @@ 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! Erreur lors de l'initialisation de la corbeille ! 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. :) @@ -418,10 +438,10 @@ Left folder: Répertoire de gauche: Legend Legende -Load configuration via...\n - this list (press DEL to delete items)\n - drag & drop to this window\n - startup parameter -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... +Load configuration from file +Charger la configuration à partir du fichier +Load configuration history (press DEL to delete items) +Charger l'historique des configuration (appuyez sur Suppr pour supprimer des éléments) Log-messages: Messages log: Mirror ->> @@ -470,6 +490,12 @@ Relative path Chemin Remove folder pair Supprimer le couple de dossiers +Reset +Réinitialiser +Reset all warning messages? +Réinitialiser tous les avertissements? +Resets all warning messages +Réinitialise tous les avertissements Result Situation Right folder: @@ -500,6 +526,12 @@ Show files that exist on left side only Afficher les fichiers existants seulement à gauche Show files that exist on right side only Afficher les fichiers existants seulement à droite +Show popup +Affich +Show popup on errors or warnings +Affiche une boîte de dialogue pour chaque erreur ou avertissement +Significant difference detected: More than 50% of files will be overwritten/deleted! +Différence significative détectée: Plus de 50% des fichiers seront écrasés ou détruits! Silent mode Mode silencieux Size @@ -538,16 +570,18 @@ System out of memory! Erreur mémoire système! The file does not contain a valid configuration: Le fichier ne contient pas de configuration valide -The selected file does not exist: -Le fichier sélectionné n'existe pas: +The file does not exist: +Le fichier n'existe pas: +This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file. +Cette ligne de commandes sera exécutée chaque fois que vous double-cliquerez sur un fichier. %name sert d'emplacement pour le fichier sélectionné. This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file. Cette commande sera exécutée à chaque fois que vous double-cliquez sur un nom de fichier. %x est un espace réservé pour le fichier sélectionné. 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 +Heure Time elapsed: Temps écoulé: -Time: -Heure: Total amount of data that will be transferred Volume de données à transférer Total time: @@ -558,6 +592,8 @@ Unable to create logfile! Impossible de créer un fichier log! Unable to initialize Recycle Bin! Impossible d'initialiser la corbeille! +Uncheck all +Décocher tout Update -> Mise à Jour -> Update: diff --git a/Languages/german.lng b/Languages/german.lng index 9df728a1..ab1b336c 100644 --- a/Languages/german.lng +++ b/Languages/german.lng @@ -28,8 +28,8 @@ &Über... &Advanced &Erweitert -&Back -&Zurück +&Apply +&Übernehmen &Cancel &Abbrechen &Compare @@ -50,6 +50,8 @@ Dateiliste e&xportieren &Ignorieren &Language &Sprache +&Load +&Laden &Load configuration Konfiguration &laden &OK @@ -58,8 +60,6 @@ Konfiguration &laden &Pause &Quit &Beenden -&Resolve -&Beheben &Retry &Wiederholen &Save @@ -114,6 +114,8 @@ Konfiguration &laden << Linke Datei ist neuer\n + + <| file on left side only\n @@ -144,8 +146,10 @@ As a result the files are separated into the following categories: Das Ergebnis ist eine Aufteilung in folgende Kategorien: 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: Wie der Name andeutet, werden zwei Dateien mit gleichem Namen genau dann als gleich angesehen, wenn sie den gleichen Dateiinhalt haben. Diese Einstellung ist eher für Konsistenzprüfungen geeignet als für Backup-Operationen. Aus diesem Grund wird der Zeitpunkt der letzten Änderung der Dateien nicht berücksichtigt.\n\nDer Entscheidungsbaum ist in diesem Fall kleiner: -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. -Erzeuge eine Batchdatei mit den folgenden Parametern. Um im Batch-Modus zu synchronisieren, kann diese einfach gestartet oder in den Task-Planer des Betriebssystems eingetragen werden. +Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe . This can also be scheduled in your operating system's task planner. +Erzeuge eine Batchdatei für die automatisierte Synchronisation. Um den Batch-Modus zu starten, muss nur der Dateiname an die Programmdatei übergeben werden: FreeFileSync.exe . Dies kann auch in den Taskplaner des Betriebssystems eingetragen werden. +Batch execution +Batchlauf Batch file created successfully! Batchdatei wurde erfolgreich erstellt! Batch job @@ -156,6 +160,8 @@ Build: Build: Cancel Abbrechen +Check all +Alles auswählen Choose to hide filtered files/directories from list Gefilterte Dateien bzw. Verzeichnisse ein-/ausblenden Comma separated list @@ -192,8 +198,6 @@ 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 Conversion error: @@ -244,14 +248,18 @@ Delete files/folders existing on right side only Nur rechts existierende Dateien/Verzeichnisse löschen Delete files\tDEL Dateien löschen\tDEL +Delete on both sides +Auf beiden Seiten löschen +Delete on both sides even if the file is selected on one side only +Lösche auf beiden Seiten, auch wenn die Datei nur auf einer Seite markiert ist Delete: Löschen: Deleting file %x Lösche Datei %x Deleting folder %x Lösche Verzeichnis %x -Directories are dependent: -Die Verzeichnisse sind voneinander abhängig: +Directories are dependent! Be careful when setting up synchronization rules: +Die Verzeichnisse sind voneinander abhängig! Achtung beim Festlegen der Synchronisationseinstellungen: Directory does not exist: Das Verzeichnis existiert nicht: Do not show graphical status and error messages but write to a logfile instead @@ -262,7 +270,7 @@ Do nothing Nichts tun Do you really want to delete the following objects(s)? Sollen folgende Elemente wirklich gelöscht werden? -Do you really want to move the following objects(s) to the recycle bin? +Do you really want to move the following objects(s) to the Recycle Bin? Sollen folgende Elemente wirklich in den Papierkorb verschoben werden? Donate with PayPal Mit PayPal spenden @@ -282,7 +290,9 @@ Error deleting directory: Fehler beim Löschen des Verzeichnisses: Error deleting file: Fehler beim Löschen der Datei: -Error moving to recycle bin: +Error handling +Fehlerbehandlung +Error moving to Recycle Bin: Fehler beim Verschieben in den Papierkorb: Error parsing configuration file: Fehler beim Lesen der Konfigurationsdatei: @@ -306,6 +316,10 @@ Exclude temporarily Temporär ausschließen Exclude via filter: Über Filter ausschließen: +Exit immediately and set returncode < 0 +Sofort beenden und Returncode < 0 setzen +Exit with RC < 0 +Beenden mit RC < 0 FAT32: Handle Daylight Saving Time FAT32: Sommer-/Winterzeitumstellung berücksichtigen Feedback and suggestions are welcome at: @@ -344,14 +358,14 @@ Files/folders that exist on left side only Nur links exisitierende Dateien/Verzeichnisse Files/folders that exist on right side only Nur rechts exisitierende Dateien/Verzeichnisse -Filter -Filter Filter active: Press again to deactivate Filter aktiviert: Zum Deaktivieren erneut anwählen Filter files Dateien filtern Filter view Ansicht filtern +Folder Comparison and Synchronization +Verzeichnisvergleich und Synchronisation Folder pair Verzeichnispaar FreeFileSync - Folder Comparison and Synchronization @@ -364,12 +378,16 @@ FreeFileSync batch file FreeFileSync Batchdatei FreeFileSync configuration FreeFileSync Konfiguration +Full name +Absoluter Name Generating file list... Erzeuge Dateiliste... Global settings Globale Einstellungen Help Hilfe +Hide all error and warning messages +Alle Fehler- und Warnmeldungen werden unterdrückt Hide files that are different Ungleiche Dateien ausblenden Hide files that are equal @@ -387,7 +405,7 @@ Gefilterte Elemente ausblenden Hide further error messages during the current process Weitere Fehlermeldungen während des laufenden 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 Vorgangsende als Liste angezeigt +Verhindert das Anzeigen von Fehlermeldungen während der Synchronisation:\nSie werden jedoch gesammelt und am Ende als Liste angezeigt Hints: Tipps: Homepage: @@ -396,8 +414,8 @@ If you like FFS: FFS unterstützen: Ignore errors Fehler ignorieren -Ignore next errors -Weitere Fehler ignorieren +Ignore subsequent errors +Nachfolgende Fehler ignorieren Ignore this error, retry or abort synchronization? Fehler ignorieren, wiederholen oder Synchronisation abbrechen? Ignore this error, retry or abort? @@ -412,8 +430,6 @@ Info Info Information Information -Information: If you ignore the error or abort a re-compare will be necessary! -Information: Wenn der Fehler ignoriert oder der Vorgang abgebrochen wird, ist ein neuer Vergleich erforderlich! Initialization of Recycle Bin failed! Die Initialisierung des Papierkorbs ist fehlgeschlagen! 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. :) @@ -422,12 +438,12 @@ Left folder: Linkes Verzeichnis: Legend Legende -Load configuration via...\n - this list (press DEL to delete items)\n - drag & drop to this window\n - startup parameter -Konfiguration laden über...\n - diese Liste (DEL-Taste löscht Einträge)\n - Drag & Drop auf dieses Fenster\n - Startupparameter -Load from file... -Von Datei laden... +Load configuration from file +Konfiguration aus Datei laden +Load configuration history (press DEL to delete items) +Lade Konfigurationshistorie (DEL-Taste löscht Einträge) Log-messages: -Protokollmitteilungen: +Protokollmeldungen: Mirror ->> Spiegeln ->> Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. @@ -451,7 +467,7 @@ OK Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the full name including path prefix. Für die Synchronisation werden nur die Dateien/Verzeichnisse berücksichtigt, die den Filtereinstellungen entsprechen. Der Filter wird dabei auf den kompletten Dateinamen einschließlich Pfadprefix angewandt. Open synchronization dialog -Zeige Synchronisationseinstellungen +Synchronisationseinstellungen zeigen Open with File Manager\tD-Click Mit Dateimanager öffnen\tD-Click Operation aborted! @@ -474,6 +490,12 @@ Relative path Relativer Pfad Remove folder pair Verzeichnispaar entfernen +Reset +Zurücksetzen +Reset all warning messages? +Sollen alle Warnmeldungen zurückgesetzt werden? +Resets all warning messages +Setzt alle Warnmeldungen zurück Result Ergebnis Right folder: @@ -504,6 +526,12 @@ Show files that exist on left side only Nur links existierende Dateien anzeigen Show files that exist on right side only Nur rechts existierende Dateien anzeigen +Show popup +Popup zeigen +Show popup on errors or warnings +Zeigt ein Auswahlfenster bei Fehlern oder Warnungen an +Significant difference detected: More than 50% of files will be overwritten/deleted! +Ein erheblicher Unterschied wurde festgestellt: Mehr als 50% der Dateien werden überschrieben/gelöscht! Silent mode Stiller Modus Size @@ -542,16 +570,18 @@ System out of memory! Zu wenig freier Arbeitsspeicher! The file does not contain a valid configuration: Die Datei enthält keine gültige Konfiguration: -The selected file does not exist: -Die ausgewählte Datei existiert nicht: +The file does not exist: +Die Datei existiert nicht: +This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file. +Diese Kommandozeile wird bei jedem Doppelklick auf einen Dateinamen ausgeführt. %name dient dabei als Platzhalter für die ausgewählte Datei. This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file. Diese Befehlszeile wird ausgeführt, wenn ein Doppelklick auf einen Dateinamen erfolgt. %x ist hierbei der Platzhalter für die ausgewählte Datei. 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 +Uhrzeit Time elapsed: Vergangene Zeit: -Time: -Zeit: Total amount of data that will be transferred Gesamtmenge der zu übertragenden Daten Total time: @@ -562,6 +592,8 @@ Unable to create logfile! Die Protokolldatei konnte nicht erstellt werden! Unable to initialize Recycle Bin! Der Papierkorb konnte nicht initialisiert werden! +Uncheck all +Nichts auswählen Update -> Aktualisieren -> Update: diff --git a/Languages/italian.lng b/Languages/italian.lng index 54a84bf9..7d685ee9 100644 --- a/Languages/italian.lng +++ b/Languages/italian.lng @@ -25,11 +25,11 @@ &Abort &Abbandona &About... -&A proposito di... +&Informazioni... &Advanced &Avanzate -&Back -&Indietro +&Apply +&Applica &Cancel &Annulla &Compare @@ -50,6 +50,8 @@ &Ignora &Language &Lingua +&Load +&Carica &Load configuration &Carica la configurazione &OK @@ -58,8 +60,6 @@ &Pausa &Quit &Esci -&Resolve -&Risolvi &Retry &Riprova &Save @@ -114,6 +114,8 @@ << il file di sinistra è più recente\n + + <| file on left side only\n @@ -144,8 +146,10 @@ As a result the files are separated into the following categories: I file risultano infine ripartiti nelle seguenti categorie: 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: Come suggerisce il nome, due file con lo stesso nome sono considerati come identici se, e solamente se, il loro contenuto è identico. Questa opzione è utile sia per i contrlli di coerenza che per le operazioni di backup. Tuttavia, data e ora vengono ignorate.\n\nAbilitando questa opzione l'albero delle decisioni è semplificato: -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. -Creare un file batch con i seguenti parametri. Per lanciare la sincronizzazione in modalità batch, eseguire questo file o schedularlo nelle operazioni pianificate del sistema operativo. +Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe . This can also be scheduled in your operating system's task planner. +Componi un file batch per la sincronia automatica. Per partire in modalità batch fai semplicemente seguire il nome del file all'eseguibile di FreeFileSync: FreeFileSync.exe . Puoi anche schedulare l'operazione nelle operazioni pianificate del sistema operativo. +Batch execution +Esecuzione in batch Batch file created successfully! Creazione batch file riuscita! Batch job @@ -156,6 +160,8 @@ Build: Build: Cancel Annulla +Check all +Seleziona tutto Choose to hide filtered files/directories from list Nascondi i files/directories dalla lista Comma separated list @@ -192,8 +198,6 @@ Configure your own synchronization rules. Configura le tue regole di sincronizzazione. Confirm Conferma -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. -Da considerare per il settaggio delle regole di sincronizzazione: Per non interferire con la sincronizzazione potrebbe essere utile bloccare l'accesso in scrittura a queste directory. Continue Continua Conversion error: @@ -244,14 +248,18 @@ Delete files/folders existing on right side only Elimina files/cartelle esistenti solo a destra Delete files\tDEL Elimina file\tDEL +Delete on both sides +Cancella su entrambi i lati +Delete on both sides even if the file is selected on one side only +Cancella su entrambi i lati anche se il file è selezionato su un solo lato. Delete: Elimina: Deleting file %x Eliminazione file %x Deleting folder %x Eliminazione cartella %x -Directories are dependent: -Le directory sono dipendenti: +Directories are dependent! Be careful when setting up synchronization rules: +Le directory sono dipendenti! Fai attenzione quando configuri le regole di sincronizzazione: Directory does not exist: La directory non esiste: Do not show graphical status and error messages but write to a logfile instead @@ -262,8 +270,8 @@ Do nothing Non fare nulla Do you really want to delete the following objects(s)? Vuoi veramente eliminare i seguenti oggetti? -Do you really want to move the following objects(s) to the recycle bin? -Vuoi veramente eliminare i seguenti oggetti dal cestino? +Do you really want to move the following objects(s) to the Recycle Bin? +Vuoi veramente spostare i seguenti oggetti nel Cestino? Donate with PayPal Fai una donazione con PayPal Drag && drop @@ -282,8 +290,10 @@ Error deleting directory: Errore durante l'eliminazione delle directory: Error deleting file: Errore durante l'eliminazione del file: -Error moving to recycle bin: -Errore durante lo spostamento nel cestino: +Error handling +Errore nella gestione +Error moving to Recycle Bin: +Errore durante lo spostamento nel Cestino: Error parsing configuration file: Errore durante l'analisi del file di configurazione: Error reading file: @@ -306,6 +316,10 @@ Exclude temporarily Escludi temporaneamente Exclude via filter: Escludi tramite filtro: +Exit immediately and set returncode < 0 +Esci immediatamente ed imposta returncode < 0 +Exit with RC < 0 +Esci con RC < 0 FAT32: Handle Daylight Saving Time FAT32: Gestisci Ora di Modifica Feedback and suggestions are welcome at: @@ -344,14 +358,14 @@ Files/folders that exist on left side only Files/cartelle esistenti solo a sinistra Files/folders that exist on right side only Files/cartelle esistenti solo a destra -Filter -Filtro Filter active: Press again to deactivate Filtro attivo: Clicca nuovamente per disattivare Filter files Filtro dei files Filter view Filtro della vista +Folder Comparison and Synchronization +Comparazione di Cartelle e Sincronizzazione Folder pair Coppia di cartelle FreeFileSync - Folder Comparison and Synchronization @@ -364,12 +378,16 @@ FreeFileSync batch file FreeFileSync batch file FreeFileSync configuration FreeFileSync configurazione +Full name +Nome completo Generating file list... Generazione lista dei file... Global settings Preferenze Help Aiuto +Hide all error and warning messages +Nascondi tutti gli errori e i messaggi d'avviso Hide files that are different Nascondi i file differenti Hide files that are equal @@ -396,7 +414,7 @@ If you like FFS: Se ti piace FFS: Ignore errors Ignora gli errori -Ignore next errors +Ignore subsequent errors Ignora gli errori successivi Ignore this error, retry or abort synchronization? Ignora questo errore, riprova o abbandona la sincronizzazione? @@ -412,8 +430,6 @@ Info Info Information Informazioni -Information: If you ignore the error or abort a re-compare will be necessary! -Informazioni: Ignorando l'errore o abbandonando, sarà necessario far ripartire la comparazione! Initialization of Recycle Bin failed! Inizializzazione del Cestino fallita! 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. :) @@ -422,10 +438,10 @@ Left folder: Cartella di sinistra: Legend Legenda -Load configuration via...\n - this list (press DEL to delete items)\n - drag & drop to this window\n - startup parameter -Carica la configurazione da...\n - questa lista (premi DEL per eliminare elementi),\n - trascina e rilascia in questa finestra,\n - i parametri di partenza. -Load from file... -Carica da file... +Load configuration from file +Carica configurazione da file +Load configuration history (press DEL to delete items) +Carica la cronologia delle configurazioni (premi DEL per eliminare elementi) Log-messages: Log-messages: Mirror ->> @@ -474,6 +490,12 @@ Relative path Percorso relativo Remove folder pair Elimina la coppia di cartelle +Reset +Reset +Reset all warning messages? +Resettare tutti gli avvisi? +Resets all warning messages +Resetta tutti gli avvisi Result Risultato Right folder: @@ -504,6 +526,12 @@ Show files that exist on left side only Mostra file esistenti solo a sinistra Show files that exist on right side only Mostra file esistenti solo a destra +Show popup +Mostra popup +Show popup on errors or warnings +Mostra popup degli errori o avvisi +Significant difference detected: More than 50% of files will be overwritten/deleted! +Riscontrate differenze significative: Più del 50% dei file saranno sovrascritti/cancellati! Silent mode Modalità Silenziosa Size @@ -542,16 +570,18 @@ System out of memory! Memoria di sistema esaurita! The file does not contain a valid configuration: Il file non contiene una configurazione valida -The selected file does not exist: -Il file selezionato non esiste: +The file does not exist: +Il file non esiste: +This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file. +Questa riga di comando verrà eseguita ad ogni doppio click sul nome di un file. %name é lo spazio riservato per il file selezionato. This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file. -Questa commandline verrà eseguita ad ogni doppio click sul nome di un file. %x é lo spazio riservato per il file selezionato. +Questa riga di comando verrà eseguita ad ogni doppio click sul nome di un file. %x é lo spazio riservato per il file selezionato. 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. Questa variante definisce identici due file con lo stesso nome quando hanno la stessa dimensione E la stessa data e ora. Attenzione: la precisione dell'ora è di circa 2 secondi. Ciò assicura il corretto funzionamneto della sincronizzazione con la precisione del file system FAT32. +Time +Ora Time elapsed: Tempo trascorso: -Time: -Ora: Total amount of data that will be transferred Volume dei dati che verranno trasferiti Total time: @@ -562,6 +592,8 @@ Unable to create logfile! Impossibile creaer il file di log! Unable to initialize Recycle Bin! Impossibile inizializzare il Cestino! +Uncheck all +Deseleziona tutto Update -> Aggiorna -> Update: diff --git a/Languages/japanese.lng b/Languages/japanese.lng index ede371f5..4e2bcb88 100644 --- a/Languages/japanese.lng +++ b/Languages/japanese.lng @@ -28,8 +28,8 @@ 情報(&A)... &Advanced 拡張(&A) -&Back -戻る(&B) +&Apply +適用(&A) &Cancel キャンセル(&C) &Compare @@ -50,6 +50,8 @@ 無視(&I) &Language 使用言語(&L) +&Load +読み込み(&L) &Load configuration 構成設定の読み込み(&L) &OK @@ -58,8 +60,6 @@ 一時停止(&P) &Quit 終了(&Q) -&Resolve -決定(&R) &Retry 再試行(&R) &Save @@ -114,6 +114,8 @@ << 左側の方が新しい\n <ディレクトリ> + +<最後のセッション> <複数選択> <| file on left side only\n @@ -144,8 +146,10 @@ As a result the files are separated into the following categories: ファイルは以下のカテゴリに分類されます: 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: このオプションでは、同じ名前を共有するファイルで内容が同じ場合は、同一として扱われます。 バックアップ操作より、むしろ整合性のチェックを行う時に役立つオプションです。 従ってファイルの日時については全く考慮されていません。\n\n設定が有効な時は、ツリー表示が小さくなります。 -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. -以下の設定で一括処理(バッチ)ファイルを作成します。使用方法は、そのままファイルを実行するか、OS のタスクスケジューラを利用して実行することもできます。 +Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe . This can also be scheduled in your operating system's task planner. +一括で同期処理を行うためのバッチファイルを作成します。一括モードを開始するときは、ファイルのパス名を実行ファイル\n< FreeFileSync.exe> \nにバッチファイルで渡すだけです。また、この操作はOSのタスクスケジューラから実行することができます。 +Batch execution +一括処理を実行 Batch file created successfully! バッチファイルが作成されました! Batch job @@ -156,6 +160,8 @@ Build: ビルド: Cancel 中止 +Check all +すべて選択 Choose to hide filtered files/directories from list リストから除外したいファイル/ディレクトリを選択 Comma separated list @@ -192,8 +198,6 @@ 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 続行 Conversion error: @@ -244,14 +248,18 @@ Delete files/folders existing on right side only 右側のみに存在するファイル/フォルダを削除 Delete files\tDEL ファイルを削除\tDEL +Delete on both sides +両方を削除 +Delete on both sides even if the file is selected on one side only +片側のペインのみ選択されている場合でも両方を削除する Delete: 削除: Deleting file %x ファイル %x を削除中 Deleting folder %x フォルダ %x を削除中 -Directories are dependent: -ディレクトリの依存関係: +Directories are dependent! Be careful when setting up synchronization rules: +ディレクトリが依存関係にあります! 同期規則の設定時には注意してください: Directory does not exist: ディレクトリが存在しません: Do not show graphical status and error messages but write to a logfile instead @@ -262,8 +270,8 @@ Do nothing 何もしない Do you really want to delete the following objects(s)? 本当に以下のオブジェクトを削除しますか? -Do you really want to move the following objects(s) to the recycle bin? -本当に以下のオブジェクトをゴミ箱に移動しますか? +Do you really want to move the following objects(s) to the Recycle Bin? +本当に以下のオブジェクト(複)をゴミ箱に移動しますか? Donate with PayPal PayPal から寄付する Drag && drop @@ -282,16 +290,22 @@ Error deleting directory: ディレクトリの削除エラー: Error deleting file: ファイルの削除エラー: -Error moving to recycle bin: -ゴミ箱への移動に失敗しました: +Error handling +ハンドリングのエラー +Error moving to Recycle Bin: +ゴミ箱への移動に失敗: Error parsing configuration file: 構成ファイルの構文に誤りがあります: Error reading file: ファイル読み込みエラー: +Error reading folder attributes: +フォルダ属性の読み取りエラー: Error traversing directory: ディレクトリの移動エラー: Error writing file: ファイル書き込みエラー: +Error writing folder attributes: +フォルダ属性の書き込みエラー: Error: Source directory does not exist anymore: エラー: ソースディレクトリが存在しません: Example @@ -302,6 +316,10 @@ Exclude temporarily 一時フォルダを除外 Exclude via filter: フィルターを通して除外 +Exit immediately and set returncode < 0 +すぐに終了する場合の戻り値設定 < 0 +Exit with RC < 0 +RC で終了 < 0 FAT32: Handle Daylight Saving Time FAT32: 夏時間の取り扱いを有効 Feedback and suggestions are welcome at: @@ -340,14 +358,14 @@ 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 ファイルフィルター Filter view 表示フィルター +Folder Comparison and Synchronization +フォルダの比較と同期 Folder pair フォルダペア FreeFileSync - Folder Comparison and Synchronization @@ -360,12 +378,16 @@ FreeFileSync batch file FreeFileSync バッチファイル FreeFileSync configuration FreeFileSync 構成設定 +Full name +完全な名前 Generating file list... ファイル一覧を作成中... Global settings 全般的な設定 Help ヘルプ +Hide all error and warning messages +すべてのエラーと警告メッセージを非表示 Hide files that are different 異なるファイルを非表示 Hide files that are equal @@ -392,8 +414,8 @@ If you like FFS: FFS が気に入った場合: Ignore errors エラーを無視 -Ignore next errors -次のエラーを無視 +Ignore subsequent errors +以降のエラーを無視 Ignore this error, retry or abort synchronization? このエラーを無視して再試行、或いは同期を中止しますか? Ignore this error, retry or abort? @@ -408,8 +430,6 @@ Info 情報 Information インフォメーション -Information: If you ignore the error or abort a re-compare will be necessary! -インフォメーション: このエラーを無視して中断した場合は、再比較が必要です! Initialization of Recycle Bin failed! ゴミ箱の初期化に失敗しました! 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. :) @@ -418,10 +438,10 @@ Left folder: 左側フォルダ: Legend 履歴 -Load configuration via...\n - this list (press DEL to delete items)\n - drag & drop to this window\n - startup parameter -構成ファイルの読み込み...\n - リスト (DEL-でアイテムを削除)\n - ウィンドウにドラッグ & ドロップ\n - 起動時のパラメータ -Load from file... -ファイルから読み込み... +Load configuration from file +外部ファイルから構成設定を読み込みます +Load configuration history (press DEL to delete items) +構成設定履歴の読み込み(DELキーでアイテムを削除) Log-messages: ログメッセージ: Mirror ->> @@ -470,6 +490,12 @@ Relative path 相対パス Remove folder pair フォルダペアを除去 +Reset +リセット +Reset all warning messages? +すべての警告をリセットしますか? +Resets all warning messages +すべての警告をリセット Result 結果 Right folder: @@ -500,6 +526,12 @@ Show files that exist on left side only 左側のみに存在するファイルを表示 Show files that exist on right side only 右側のみに存在するファイルを表示 +Show popup +ポップアップ表示 +Show popup on errors or warnings +エラー/警告をポップアップ表示 +Significant difference detected: More than 50% of files will be overwritten/deleted! +大幅な差異の検出: 50%以上のファイルが上書き、または削除されています! Silent mode サイレントモード Size @@ -538,16 +570,18 @@ System out of memory! メモリが不足しています! The file does not contain a valid configuration: このファイルには有効な構成が含まれていません: -The selected file does not exist: -選択されたファイルは存在しません: +The file does not exist: +ファイルが存在しません: +This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file. +ファイル名をダブルクリックする度に、このコマンドが実行されます。%name は選択ファイルのプレースフォルダとして機能します。 This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file. ファイル名をダブルクリックする度に、このコマンドが実行されます。%x は選択ファイルのプレースフォルダとして機能します。 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 +時間 Time elapsed: 経過時間: -Time: -時間: Total amount of data that will be transferred 転送されたデータの総量 Total time: @@ -558,6 +592,8 @@ Unable to create logfile! ログファイルを作成出来ません! Unable to initialize Recycle Bin! ゴミ箱の初期化が出来ません! +Uncheck all +すべて解除 Update -> 更新 -> Update: diff --git a/Languages/polish.lng b/Languages/polish.lng index 803b7a48..93b1ef1f 100644 --- a/Languages/polish.lng +++ b/Languages/polish.lng @@ -1,4 +1,4 @@ - 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 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 Byte Bajt @@ -28,8 +28,8 @@ &O Programie... &Advanced &Zaawansowane -&Back -&Cofnij +&Apply +&Zastosuj &Cancel &Anuluj &Compare @@ -50,6 +50,8 @@ &Ignoruj &Language &Język +&Load +&Wczytaj &Load configuration &Ładuj konfigurację &OK @@ -57,9 +59,7 @@ &Pause &Pauza &Quit -&Zamnkij -&Resolve -&Rozwiąż +&Zamknij &Retry &Powtórz &Save @@ -114,6 +114,8 @@ << lewy plik jest nowszy\n + + <| file on left side only\n @@ -125,7 +127,7 @@ Abort Przerwij Abort requested: Waiting for current operation to finish... -Rządanie przerwania: Czekaj na koniec aktualnie wykonywanego zadania... +Żądanie przerwania: Czekaj na koniec aktualnie wykonywanego zadania... Aborted Przerwana About @@ -144,8 +146,8 @@ As a result the files are separated into the following categories: W rezultacie pliki zostały podzielone na następujące kategorie: 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: Jak wskazuje nazwa, dwa pliki o tej samej nazwie są równe tylko i wyłącznie jeżeli ich zawartość jest jednakowa. Czas modyfikacji nie jest brany pod uwagę. Ta opcja jest raczej użyteczna do sprawdzania spójności plików niż zadań kopii zapasowej.\n\nDrzewko decyzyjne dla tej opcji jest mniejsze: -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. -Utwórz zadanie batch z tymi ustawieniami. Aby rozpocząć synchronizację w tym trybie zwyczajnie uruchom plik lub dodaj go do zadań zaplanowanych Twojego systemu. +Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe . This can also be scheduled in your operating system's task planner. +Twórz zadanie batch dla automatyzacji procesu. By rozpocząć prace w tym trybie zwyczajnie uruchom plik z zadaniem batch lub dodaj go do zadań zaplanowanych Twojego systemu. Plik batch może być również przekazywany jako parametr do programu w postaci: FreeFileSync.exe . Batch file created successfully! Plik Batch utworzony pomyślnie! Batch job @@ -156,6 +158,8 @@ Build: Buduj: Cancel Anuluj +Check all +Sprawdź wszystko Choose to hide filtered files/directories from list Zaznacz aby ukryć przefiltrowane pliki/katalogi z listy Comma separated list @@ -192,8 +196,6 @@ Configure your own synchronization rules. Skonfiguruj swoje własne zasady synchronizacji. Confirm Potwierdź -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. -Pamiętaj: Możesz zastrzec prawo do zapisu dla tych katalogów aby uniknąć ewentualej kolizji podczas synchronizacji. Continue Kontynuuj Conversion error: @@ -205,7 +207,7 @@ Kopiuj z lewej do prawej nadpisując Copy from right to left Kopiuj z prawej do lewej Copy from right to left overwriting -Kopij z prawej do lewej nadpisując +Kopiuj z prawej do lewej nadpisując Copy new or updated files to right folder. Kopiuj nowe lub aktualniejsze pliki na prawą stronę. Copy to clipboard\tCTRL+C @@ -244,14 +246,18 @@ Delete files/folders existing on right side only Usuń pliki/foldery istniejące tylko po prawej stronie Delete files\tDEL Usuń\tDEL +Delete on both sides +Usuń po obu stronach +Delete on both sides even if the file is selected on one side only +Usuń po obu stronach nawet jeżeli plik zaznaczony jest tylko po jednej stronie Delete: Usuń: Deleting file %x Usuwanie pliku %x Deleting folder %x Usuwanie folderu %x -Directories are dependent: -Katalogi są zależne: +Directories are dependent! Be careful when setting up synchronization rules: +Katalogi są zależne! Pamiętaj o tym podczas ustawiania zasad synchronizacji: Directory does not exist: Katalog nie istnieje: Do not show graphical status and error messages but write to a logfile instead @@ -262,8 +268,8 @@ Do nothing Nic nie rób Do you really want to delete the following objects(s)? Czy na pewno chcesz usunąć wybrane obiekty? -Do you really want to move the following objects(s) to the recycle bin? -Czy na pewno chesz przenieść wybrane obiekty do kosza? +Do you really want to move the following objects(s) to the Recycle Bin? +Czy na pewno chcesz przenieść wybrane pliki do kosza? Donate with PayPal Wesprzyj z PayPal Drag && drop @@ -282,16 +288,22 @@ Error deleting directory: Błąd podczas usuwania katalogu: Error deleting file: Błąd podczas usuwania pliku: -Error moving to recycle bin: +Error handling +Obsługa błędów +Error moving to Recycle Bin: Błąd podczas przenoszenia do kosza: Error parsing configuration file: Błąd podczas parsowania pliku konfiguracyjnego: Error reading file: Błąd podczas odczytu pliku: +Error reading folder attributes: +Błąd odczytu atrybutów folderu: Error traversing directory: Błąd podczas odczytywania katalogu: Error writing file: Błąd podczas zapisu do pliku: +Error writing folder attributes: +Błąd zapisu atrybutów folderu: Error: Source directory does not exist anymore: Błąd: Katalog źródłowy nie istnieje: Example @@ -302,6 +314,10 @@ Exclude temporarily Wyklucz tymczasowo Exclude via filter: Dodaj filtr: +Exit immediately and set returncode < 0 +Zakończ natychmiastowo i zwróć wartość < 0 +Exit with RC < 0 +Zakończ z RC < 0 FAT32: Handle Daylight Saving Time FAT32: Uwzględnij przesunięcie czasu Feedback and suggestions are welcome at: @@ -340,14 +356,14 @@ Files/folders that exist on left side only Pliki/katalogi istniejące tylko po lewej stronie Files/folders that exist on right side only Pliki/katalogi istniejące tylko po prawej stronie -Filter -Filtr Filter active: Press again to deactivate Filtr aktywny: Kliknij ponownie aby wyłączyć Filter files Filtruj pliki Filter view Filtr podglądu +Folder Comparison and Synchronization +Porównywanie i Synchronizacja folderów Folder pair Para folderów FreeFileSync - Folder Comparison and Synchronization @@ -360,12 +376,16 @@ FreeFileSync batch file FreeFileSync plik batch FreeFileSync configuration Konfiguracja FreeFileSync +Full name +Pełna nazwa Generating file list... Generowanie listy plików... Global settings Ustawienia globalne Help Pomoc +Hide all error and warning messages +Ukryj wszystkie informacje błędach i ostrzeżeniach Hide files that are different Ukryj pliki, które są różne Hide files that are equal @@ -392,12 +412,12 @@ If you like FFS: Jeżeli Ci się podoba: Ignore errors Ignoruj błędy -Ignore next errors +Ignore subsequent errors Ignoruj kolejne błędy Ignore this error, retry or abort synchronization? Ignoruj, powtórz albo przerwij synchronizacje. Ignore this error, retry or abort? -Ignorować błąd, powtórzć albo zakończyć? +Ignorować błąd, powtórzyć albo zakończyć? Include Dołącz Include temporarily @@ -408,8 +428,6 @@ Info Info Information Informacja -Information: If you ignore the error or abort a re-compare will be necessary! -Informacja: Jeśli zignorujesz błąd albo zakończysz konieczne będzie ponowne porównanie! Initialization of Recycle Bin failed! Niepowodzenie inicjalizacji Kosza! 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. :) @@ -418,10 +436,10 @@ Left folder: Lewy folder: Legend Legenda -Load configuration via...\n - this list (press DEL to delete items)\n - drag & drop to this window\n - startup parameter -Ładuj konfigurację przez...\n - ta lista (DEL aby usunąć element)\n - przeciągnij i upuść na to okno\n - parametry startowe -Load from file... -Ładuj z pliku... +Load configuration from file +Wczytaj konfigurację z pliku +Load configuration history (press DEL to delete items) +Wczytaj historie konfiguracji (naciśnij Del aby usunąć element) Log-messages: Logi: Mirror ->> @@ -433,7 +451,7 @@ Przesuń kolumnę w dół Move column up Przesuń kolumnę do góry Not all items were synchronized! Have a look at the list. -Nie wszysktkie elementy zostały zsynchronizowane! Lista pominiętych plików. +Nie wszystkie elementy zostały zsynchronizowane! Lista pominiętych plików. Nothing to synchronize according to configuration! Brak elementów do synchronizacji! Number of files and directories that will be created @@ -470,6 +488,12 @@ Relative path Relatywna ścieżka Remove folder pair Usuń parę folderów +Reset +Resetuj +Reset all warning messages? +Zresetować wszystkie ostrzeżenia? +Resets all warning messages +Zresetuj wszystkie ostrzeżenia Result Rezultat Right folder: @@ -491,7 +515,7 @@ Wybierz wariant: Show files that are different Pokaż pliki, które się różnią Show files that are equal -Pokaż pliki, ktore są równe +Pokaż pliki, które są równe Show files that are newer on left Pokaż pliki nowsze po lewej stronie Show files that are newer on right @@ -500,6 +524,12 @@ Show files that exist on left side only Pokaż pliki istniejące tylko po lewej stronie Show files that exist on right side only Pokaż pliki istniejące tylko po prawej stronie +Show popup +Pokaż okno popup +Show popup on errors or warnings +Pokaż okno popup dla błędów i ostrzeżeń +Significant difference detected: More than 50% of files will be overwritten/deleted! +Wykryto znaczące zmiany: Ponad 50% plików zostanie nadpisane/usunięte! Silent mode Tryb Cichy Size @@ -533,21 +563,23 @@ Synchronizuj wszystkie pliki .doc, .zip i .exe z wyjątkiem folderu \"temp\". Synchronize both sides simultaneously: Copy new or updated files in both directions. Synchronizuj obie strony jednocześnie: Kopiuj nowe albo uaktualniaj w obu folderach. Synchronizing... -Synchronizuje... +Synchronizuję... System out of memory! Brak pamięci! The file does not contain a valid configuration: Nieprawidłowy format pliku: -The selected file does not exist: -Zaznaczony plik nie istnieje: +The file does not exist: +Plik nie istnieje: +This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file. +Ta komenda będzie wykonywana za każdym razem jak klikniesz dwa razy na dany plik. %name jest wskaźnikiem na katalog zaznaczonego pliku. This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file. -Ta linia będzie wykonywana za każdym razem jak będziesz eksplorował plik. %x jest wskaźnikiem na katalog zaznaczonego pliku. +Ta komenda będzie wykonywana za każdym razem jak klikniesz dwa razy na dany plik. %x jest wskaźnikiem na katalog zaznaczonego pliku. 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. -Ten wariant traktuje dwa pliki jako równe w przypadku gdy mają jednakowy rozmiar oraz tą samą datę i czas ostatniej modyfikacji. Miej na uwadzę, że czas pliku może odbiegać od rzeczywistego o 2 sekundy. Jest to konieczne podczas synchronizacji dla plików w systemie FAT32. +Ten wariant traktuje dwa pliki jako równe w przypadku gdy mają jednakowy rozmiar oraz tą samą datę i czas ostatniej modyfikacji. Miej na uwadze, że czas pliku może odbiegać od rzeczywistego o 2 sekundy. Jest to konieczne podczas synchronizacji dla plików w systemie FAT32. +Time +Czas Time elapsed: Czas: -Time: -Czas: Total amount of data that will be transferred Liczba danych do przekopiowania Total time: @@ -558,6 +590,8 @@ Unable to create logfile! Nie można utworzyć pliku z logami! Unable to initialize Recycle Bin! Nie można zainicjalizować Kosz! +Uncheck all +Odznacz wszystko Update -> Uaktualnij -> Update: diff --git a/Languages/portuguese.lng b/Languages/portuguese.lng index 818ef2f7..a613c96d 100644 --- a/Languages/portuguese.lng +++ b/Languages/portuguese.lng @@ -1,4 +1,4 @@ - 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 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 Byte Byte @@ -28,8 +28,8 @@ &Sobre... &Advanced &Avançado -&Back -&Atrás +&Apply +&Aplicar &Cancel &Cancelar &Compare @@ -50,6 +50,8 @@ &Ignorar &Language &Língua +&Load +&Carregar &Load configuration &Carregar configuração &OK @@ -58,8 +60,6 @@ &Pausa &Quit &Sair -&Resolve -&Resolve &Retry &Tentar de Novo &Save @@ -114,6 +114,8 @@ << ficheiro à esquerda mais recente\n + +<Última Sessão> <| file on left side only\n @@ -144,8 +146,10 @@ As a result the files are separated into the following categories: Como resultado, os ficheiros foram separados nas seguintes categorias: 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: Como o nome sugere, dois ficheiros com o mesmo nome são assinalados iguais se e só se o seu conteúdo for idêntico. Esta opção é útil para controles de consistência mais do que para efeitos de backup. Portanto, a data dos ficheiros não é tomada em conta.\n\nCom esta opção, a arvoré de decisão é menor: -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. -Criar um ficheiro batch com as seguintes opções. Para iniciar a sincronização no modo batch, execute o ficheiro ou junte-o ao programador de tarefas do sistema operativo. +Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe . This can also be scheduled in your operating system's task planner. +Criar um batch para sincronização automática. Para iniciar o modo batch, passar o nome do ficheiro para o executável do FreeFileSync: FreeFileSync.exe . Também pode ser calendarizado no programador de tarefas. +Batch execution +Execução do batch Batch file created successfully! Ficheiro batch criado com sucesso! Batch job @@ -156,6 +160,8 @@ Build: Criado: Cancel Cancelar +Check all +Verificar tudo Choose to hide filtered files/directories from list Ocultar itens filtrados da lista Comma separated list @@ -192,8 +198,6 @@ Configure your own synchronization rules. Configure as suas regras de sincronização. Confirm Confirmar -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. -A considerar ao escolher as regras de sincronização: Pode querer evitar escrever sobre estas pastas para que a sincronização ocorra sem problemas. Continue Continuar Conversion error: @@ -244,14 +248,18 @@ Delete files/folders existing on right side only Eliminar itens existentes apenas no lado direito Delete files\tDEL Eliminar ficheiros\tDEL +Delete on both sides +Eliminar em ambos os lados +Delete on both sides even if the file is selected on one side only +Eliminar em ambos os lados mesmo se o ficheiro só está seleccionado num lado Delete: Eliminar: Deleting file %x Apagar ficheiro %x Deleting folder %x Apagar pasta %x -Directories are dependent: -As pastas são dependentes: +Directories are dependent! Be careful when setting up synchronization rules: +Directórios são dependentes! Cuidado ao definir as regras de sincronização: Directory does not exist: A pasta não existe: Do not show graphical status and error messages but write to a logfile instead @@ -262,8 +270,8 @@ Do nothing Não fazer nada Do you really want to delete the following objects(s)? Quer mesmo eliminar o(s) seguinte(s) item(s) ? -Do you really want to move the following objects(s) to the recycle bin? -Quer mesmo enviar o(s) seguinte(s) item(s) para a Reciclagem? +Do you really want to move the following objects(s) to the Recycle Bin? +Quer mesmo mover o(s) seguinte(s) objecto(s) para a Reciclagem? Donate with PayPal Doar usando PayPal Drag && drop @@ -282,8 +290,10 @@ Error deleting directory: Erro ao eliminar a pasta: Error deleting file: Erro ao eliminar o ficheiro: -Error moving to recycle bin: -Erro ao mover para a Reciclagem: +Error handling +Controlador de erros +Error moving to Recycle Bin: +Erro ao mover para Reciclagem: Error parsing configuration file: Erro de leitura do ficheiro de configuração: Error reading file: @@ -306,6 +316,10 @@ Exclude temporarily Excluir temporariamente Exclude via filter: Excluir por filtro: +Exit immediately and set returncode < 0 +Sair imediatamente e enviar o código < 0 +Exit with RC < 0 +Sair com RC < 0 FAT32: Handle Daylight Saving Time FAT32: Tratar Hora de Verão Feedback and suggestions are welcome at: @@ -344,14 +358,14 @@ Files/folders that exist on left side only Ficheiros/pastas existentes somente à esquerda Files/folders that exist on right side only Ficheiros/pastas existentes somente à direita -Filter -Filtro Filter active: Press again to deactivate Filtro activo: Clique aqui para desactivar Filter files Filtrar ficheiros Filter view Filtrar vista +Folder Comparison and Synchronization +Comparação e Sincronização de pastas Folder pair Par de pastas FreeFileSync - Folder Comparison and Synchronization @@ -364,12 +378,16 @@ FreeFileSync batch file FreeFileSync Ficheiro batch FreeFileSync configuration FreeFileSync configuração +Full name +Nome completo Generating file list... A gerar lista ficheiros... Global settings Opções Help Ajuda +Hide all error and warning messages +Ocultar todas as mensagens de erro ou aviso Hide files that are different Ocultar ficheiros diferentes Hide files that are equal @@ -396,8 +414,8 @@ If you like FFS: SE gosta de FFS: Ignore errors Ignorar erros -Ignore next errors -Ignorar erros seguintes +Ignore subsequent errors +Ignorar erros subsequentes Ignore this error, retry or abort synchronization? Ignorar erro, tentar de novo ou abortar a sincronização? Ignore this error, retry or abort? @@ -412,8 +430,6 @@ Info Info Information Informação -Information: If you ignore the error or abort a re-compare will be necessary! -Informação: Se ignorar o erro ou abortar, será necessário voltar a comparar! Initialization of Recycle Bin failed! Início da Reciclagem falhou! 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. :) @@ -422,10 +438,10 @@ Left folder: Pasta esquerda: Legend Legenda -Load configuration via...\n - this list (press DEL to delete items)\n - drag & drop to this window\n - startup parameter -Carregar configuração via...\n - esta lista (pressione DEL para apagar itens),\n - pegar & largar para esta janela,\n - parâmetros de arranque. -Load from file... -Carregar a partir de ficheiro... +Load configuration from file +Carregar configuração do ficheiro +Load configuration history (press DEL to delete items) +Carregar histórico de configuração (pressione DEL para apagar itens) Log-messages: Log de mensagens: Mirror ->> @@ -474,6 +490,12 @@ Relative path Caminho Remove folder pair Remover o par de pastas +Reset +Reiniciar +Reset all warning messages? +Reiniciar mensagens de aviso? +Resets all warning messages +Reinicia mensagens de aviso Result Resultado Right folder: @@ -504,6 +526,12 @@ Show files that exist on left side only Mostrar ficheiros existentes somente à esquerda Show files that exist on right side only Mostrar ficheiros existentes somente à direita +Show popup +Mostrar popups +Show popup on errors or warnings +Mostrar popup c/ erros ou avisos +Significant difference detected: More than 50% of files will be overwritten/deleted! +Diferença significativa detectada: Mais de 50% dos ficheiros serão substituídos/apagados! Silent mode Modo silencioso Size @@ -542,16 +570,18 @@ System out of memory! Sistema sem memória! The file does not contain a valid configuration: O ficheiro não contém uma configuração válida: -The selected file does not exist: -O ficheiro seleccionado não existe: +The file does not exist: +O ficheiro não existe: +This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file. +Esta linha de comandos será executada cada vez que fizer duplo click num ficheiro. %name serve para reservar o lugar do ficheiro seleccionado. This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file. Esta linha de comandos será executada cada vez que fizer duplo click num ficheiro. %x serve para reservar o lugar do ficheiro seleccionado. 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. Esta variante avalia dois ficheiros de nome igual como iguais quando têm o mesmo tamanho e a mesma data e hora de modificação. Atenção: É permitido um desvio de 2 segundos na hora, de maneira a assegurar a sincronização com sistema de ficheiros de baixa precisão FAT32. +Time +Hora Time elapsed: Tempo passado: -Time: -Hora: Total amount of data that will be transferred Volume de dados a ser transferido Total time: @@ -562,6 +592,8 @@ Unable to create logfile! Não é possível criar ficheiro log! Unable to initialize Recycle Bin! Não é possível iniciar a Reciclagem! +Uncheck all +Deseleccionar todos Update -> Actualizar -> Update: diff --git a/Makefile b/Makefile index a17c92a6..e7d63992 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ ENDFLAGS=`wx-config --libs` -lwx_gtk2_aui-2.8 -O3 -pthread all: FreeFileSync init: - mkdir obj + if [ ! -d obj ]; then mkdir obj; fi obj/algorithm.o: algorithm.cpp g++ $(CPPFLAGS) algorithm.cpp -o obj/algorithm.o diff --git a/Readme.txt b/Readme.txt index be27f379..6e6df63d 100644 --- a/Readme.txt +++ b/Readme.txt @@ -1,4 +1,4 @@ -FreeFileSync v1.15 +FreeFileSync v1.16 ------------------ Usage @@ -13,17 +13,17 @@ Key Features 2. No limitations: An arbitrary number of files can be synchronized. 3. Unicode support. 4. Network support. -5. Lean & easy accessible UI: Highly optimized for speed and huge sets of data. +5. Lean & easily accessible UI: Highly optimized for speed and huge sets of data. 6. Algorithms coded in C++ completely. 7. Progress indicators are updated only every 100ms for optimal performance! 8. Subfolders are also synchronized, including empty folders. 9. Support for multiple folder pairs -10. Create Batch Jobs for automated synchronization via GUI. +10. Create Batch Jobs for automated synchronization with or without GUI. 11. Focus on usability: - Only necessary functionality on UI: no overloaded menus or icon jungle. - Select folders via drag & drop. - Last configuration and screen settings are saved automatically. - - Maintain and load different configurations by drag&drop, load-button or while startup. + - Maintain and load different configurations by drag&drop, load-button or during startup. - Double-click to show file in explorer. (Windows only) - Copy & paste support to export file-lists. - Delete superfluous/temporary files directly on main grid. @@ -31,7 +31,7 @@ Key Features - Status information and error reporting - Sort file-lists by name, size or date. - Display statistical data: total filesizes, amount of bytes that will be transfered with the current settings. -12. Support for filesizes > 4 GB. +12. Support for filesizes larger than 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 versions for many languages are available. @@ -41,6 +41,44 @@ Key Features 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 +22. Portable version (.zip) available +23. No Windows registry entries for portable version +24. Support for \\?\ path prefix for unrestricted path length (windows only) + + +Advanced topics +--------------- +1.) Synchronize in Batch Mode and send error notification via email: + +- Create a FreeFileSync batch file using "silent mode". +- Set error handling to "Exit with Returncode < 0" or "ignore errors" to avoid having a popup stop the program flow. + In case errors occur FreeFileSync will abort with a returncode < 0 which can be checked via the ERRORLEVEL command. +- Create a *.cmd or *.bat file and specify the location of FreeFileSync.exe and pass the name of the FreeFileSync batch file as %1 parameter; e.g.: + + C:\Program Files\FreeFileSync\FreeFileSync.exe C:\SyncJob.ffs_batch + IF NOT ERRORLEVEL 0 echo An error occurred! && pause + +- Instead of displaying "An error occurred!" you can specify any other command like sending an email notification (using a third party tool). + + +2.) Schedule Batch Job in Windows Task Planner + +- Create a FreeFileSync batch file. (E.g. C:\SyncJob.ffs_batch) +- Create a new task in Windows Task planner for FreeFileSync.exe. +- Modify the task and adapt the execute-command specifying the path to the batch file; e.g.: + + C:\Program Files\FreeFileSync\FreeFileSync.exe C:\SyncJob.ffs_batch + + +3.) Drag & drop support + +FreeFileSync has a big focus on usability. Therefore drag & drop is supported in various situations: + +You can: - drag & drop any directory onto the main window to set the directory for comparison + - drag & drop any file onto the main window to set the directory for comparison + - drag & drop *.ffs_gui files onto the main window to load the configuration within + - drag & drop *.ffs_batch files onto the main window to display and edit the batch configuration + - drag & drop *.ffs_batch files onto the batch dialog to display and edit the batch configuration Links @@ -55,7 +93,7 @@ Contact For feedback, suggestions or bug-reports you can write an email to: zhnmju123 [at] gmx [dot] de -or directly report to: +or report directly to: http://sourceforge.net/projects/freefilesync/ diff --git a/Resources.dat b/Resources.dat index c9df6978..39fe68d3 100644 Binary files a/Resources.dat and b/Resources.dat differ diff --git a/algorithm.cpp b/algorithm.cpp index 87f7837f..c245e5ca 100644 --- a/algorithm.cpp +++ b/algorithm.cpp @@ -1,7 +1,6 @@ #include "algorithm.h" #include #include -#include #include #include "library/resources.h" @@ -96,7 +95,7 @@ wxString FreeFileSync::formatFilesizeToShortString(const double filesize) Zstring FreeFileSync::getFormattedDirectoryName(const Zstring& dirname) -{ //Formatting is needed since functions in FreeFileSync.cpp expect the directory to end with '\' to be able to split the relative names. +{ //Formatting is needed since functions expect the directory to end with '\' to be able to split the relative names. //Also improves usability. Zstring dirnameTmp = dirname; @@ -106,17 +105,16 @@ Zstring FreeFileSync::getFormattedDirectoryName(const Zstring& dirname) if (dirnameTmp.empty()) //an empty string is interpreted as "\"; this is not desired return Zstring(); - //let wxWidgets do the directory formatting, e.g. replace '/' with '\' for Windows - wxFileName directory = wxFileName::DirName(dirnameTmp.c_str()); + if (!endsWithPathSeparator(dirnameTmp)) + dirnameTmp += GlobalResources::FILE_NAME_SEPARATOR; - return Zstring(directory.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR)); + //don't do directory formatting with wxFileName, as it doesn't respect //?/ - prefix + return dirnameTmp; } void FreeFileSync::swapGrids(FileCompareResult& grid) { - FileDescrLine tmp; - for (FileCompareResult::iterator i = grid.begin(); i != grid.end(); ++i) { //swap compare result @@ -130,13 +128,11 @@ void FreeFileSync::swapGrids(FileCompareResult& grid) i->cmpResult = FILE_RIGHT_NEWER; //swap file descriptors - tmp = i->fileDescrLeft; - i->fileDescrLeft = i->fileDescrRight; - i->fileDescrRight = tmp; + std::swap(i->fileDescrLeft, i->fileDescrRight); } } - +/* void FreeFileSync::adjustModificationTimes(const Zstring& parentDirectory, const int timeInSeconds, ErrorHandler* errorHandler) throw(AbortThisProcess) { #ifndef __WXDEBUG__ @@ -200,7 +196,7 @@ void FreeFileSync::adjustModificationTimes(const Zstring& parentDirectory, const } } } - +*/ void compoundStringToTable(const Zstring& compoundInput, const DefaultChar* delimiter, std::vector& output) { @@ -271,7 +267,7 @@ void formatFilterString(Zstring& filter) } -void FreeFileSync::filterCurrentGridData(FileCompareResult& currentGridData, const wxString& includeFilter, const wxString& excludeFilter) +void FreeFileSync::filterGridData(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()!! @@ -372,7 +368,7 @@ void FreeFileSync::filterCurrentGridData(FileCompareResult& currentGridData, con } -void FreeFileSync::removeFilterOnCurrentGridData(FileCompareResult& currentGridData) +void FreeFileSync::includeAllRowsOnGrid(FileCompareResult& currentGridData) { //remove all filters on currentGridData for (FileCompareResult::iterator i = currentGridData.begin(); i != currentGridData.end(); ++i) @@ -380,38 +376,147 @@ void FreeFileSync::removeFilterOnCurrentGridData(FileCompareResult& currentGridD } +void FreeFileSync::excludeAllRowsOnGrid(FileCompareResult& currentGridData) +{ + //exclude all rows on currentGridData + for (FileCompareResult::iterator i = currentGridData.begin(); i != currentGridData.end(); ++i) + i->selectedForSynchronization = false; +} + + //add(!) all files and subfolder gridlines that are dependent from the directory -void FreeFileSync::addSubElements(std::set& subElements, const FileCompareResult& grid, const FileCompareLine& relevantRow) +template +void addSubElementsOneSide(const FileCompareResult& grid, const FileCompareLine& relevantRow, std::set& subElements) { Zstring 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; + const FileDescrLine* fileDescr = NULL; //get descriptor for file to be deleted; evaluated at compile time + if (searchLeftSide) + fileDescr = &relevantRow.fileDescrLeft; + else + fileDescr = &relevantRow.fileDescrRight; + + if (fileDescr->objType == FileDescrLine::TYPE_DIRECTORY) + relevantDirectory = fileDescr->relativeName + GlobalResources::FILE_NAME_SEPARATOR; //FILE_NAME_SEPARATOR needed to exclude subfile/dirs only 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()); + { + if (searchLeftSide) //evaluated at compile time + { + if (i->fileDescrLeft.relativeName.StartsWith(relevantDirectory)) + subElements.insert(i - grid.begin()); + } + else + { + if (i->fileDescrRight.relativeName.StartsWith(relevantDirectory)) + subElements.insert(i - grid.begin()); + } + } +} + + +//add(!) all files and subfolder gridlines that are dependent from the directory +void FreeFileSync::addSubElements(const FileCompareResult& grid, const FileCompareLine& relevantRow, std::set& subElements) +{ + addSubElementsOneSide(grid, relevantRow, subElements); + addSubElementsOneSide(grid, relevantRow, subElements); } -class AlwaysWriteToGrid //this class ensures, that the result of the method below is ALWAYS written on exit, even if exceptions are thrown! +//############################################################################################################ +struct SortedFileName +{ + unsigned position; + Zstring name; + + bool operator < (const SortedFileName& b) const + { + return position < b.position; + } +}; + + +//assemble message containing all files to be deleted +wxString FreeFileSync::deleteFromGridAndHDPreview(const FileCompareResult& grid, + const std::set& rowsToDeleteOnLeft, + const std::set& rowsToDeleteOnRight, + const bool deleteOnBothSides) +{ + if (deleteOnBothSides) + { + //mix selected rows from left and right + std::set rowsToDelete = rowsToDeleteOnLeft; + for (std::set::const_iterator i = rowsToDeleteOnRight.begin(); i != rowsToDeleteOnRight.end(); ++i) + rowsToDelete.insert(*i); + + wxString filesToDelete; + for (std::set::const_iterator i = rowsToDelete.begin(); i != rowsToDelete.end(); ++i) + { + const FileCompareLine& currentCmpLine = grid[*i]; + + if (currentCmpLine.fileDescrLeft.objType != FileDescrLine::TYPE_NOTHING) + filesToDelete += (currentCmpLine.fileDescrLeft.fullName + wxT("\n")).c_str(); + + if (currentCmpLine.fileDescrRight.objType != FileDescrLine::TYPE_NOTHING) + filesToDelete += (currentCmpLine.fileDescrRight.fullName + wxT("\n")).c_str(); + + filesToDelete+= wxT("\n"); + } + + return filesToDelete; + } + else //delete selected files only + { + std::set outputTable; //sort selected files from left and right ascending by row number + + SortedFileName newEntry; + for (std::set::const_iterator i = rowsToDeleteOnLeft.begin(); i != rowsToDeleteOnLeft.end(); ++i) + { + const FileCompareLine& currentCmpLine = grid[*i]; + + if (currentCmpLine.fileDescrLeft.objType != FileDescrLine::TYPE_NOTHING) + { + newEntry.position = *i * 10; + newEntry.name = currentCmpLine.fileDescrLeft.fullName; + outputTable.insert(newEntry); + } + } + + for (std::set::const_iterator i = rowsToDeleteOnRight.begin(); i != rowsToDeleteOnRight.end(); ++i) + { + const FileCompareLine& currentCmpLine = grid[*i]; + + if (currentCmpLine.fileDescrRight.objType != FileDescrLine::TYPE_NOTHING) + { + newEntry.position = *i * 10 + 1; //ensure files on left are before files on right for the same row number + newEntry.name = currentCmpLine.fileDescrRight.fullName; + outputTable.insert(newEntry); + } + } + + wxString filesToDelete; + for (std::set::iterator i = outputTable.begin(); i != outputTable.end(); ++i) + filesToDelete += (i->name + wxT("\n")).c_str(); + + return filesToDelete; + } +} + + +class RemoveAtExit //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) - {} + RemoveAtExit(FileCompareResult& grid) : + gridToWrite(grid) {} - ~AlwaysWriteToGrid() + ~RemoveAtExit() { removeRowsFromVector(gridToWrite, rowsProcessed); } - void rowProcessedSuccessfully(int nr) + void removeRow(int nr) { rowsProcessed.insert(nr); } @@ -422,40 +527,84 @@ private: }; -void FreeFileSync::deleteOnGridAndHD(FileCompareResult& grid, const std::set& rowsToDelete, ErrorHandler* errorHandler, const bool useRecycleBin) throw(AbortThisProcess) +template //update compareGrid row information after deletion from leftSide (or !leftSide) +inline +void updateCmpLineAfterDeletion(FileCompareLine& relevantRow, const int rowNr, RemoveAtExit& markForRemoval) { - //remove deleted rows from grid - AlwaysWriteToGrid writeOutput(grid); //ensure that grid is always written to, even if method is exitted via exceptions + FileDescrLine* fileDescr = NULL; //get descriptor for file to be deleted; evaluated at compile time + FileDescrLine* fileDescrPartner = NULL; //file descriptor for "other side" + if (leftSide) + { + fileDescr = &relevantRow.fileDescrLeft; + fileDescrPartner = &relevantRow.fileDescrRight; + } + else + { + fileDescr = &relevantRow.fileDescrRight; + fileDescrPartner = &relevantRow.fileDescrLeft; + } + - //remove from hd - for (std::set::iterator i = rowsToDelete.begin(); i != rowsToDelete.end(); ++i) + //remove deleted entries from grid + if (fileDescrPartner->objType == FileDescrLine::TYPE_NOTHING) + markForRemoval.removeRow(rowNr); + else { - const FileCompareLine& currentCmpLine = grid[*i]; + //initialize fileDescr for deleted file/folder + const Zstring saveDir = fileDescr->directory; + *fileDescr = FileDescrLine(); + fileDescr->directory = saveDir; + + //adapt the compare result + if (leftSide) //again evaluated at compile time + relevantRow.cmpResult = FILE_RIGHT_SIDE_ONLY; + else + relevantRow.cmpResult = FILE_LEFT_SIDE_ONLY; + } +} + + +template +void deleteFromGridAndHDOneSide(FileCompareResult& grid, + const std::set& rowsToDeleteOneSide, + const bool useRecycleBin, + RemoveAtExit& markForRemoval, + ErrorHandler* errorHandler) +{ + for (std::set::iterator i = rowsToDeleteOneSide.begin(); i != rowsToDeleteOneSide.end(); ++i) + { + FileCompareLine& currentCmpLine = grid[*i]; + + FileDescrLine* fileDescr = NULL; //get descriptor for file to be deleted; evaluated at compile time + if (leftSide) + fileDescr = ¤tCmpLine.fileDescrLeft; + else + fileDescr = ¤tCmpLine.fileDescrRight; 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); + if (fileDescr->objType == FileDescrLine::TYPE_FILE) + FreeFileSync::removeFile(fileDescr->fullName, useRecycleBin); + else if (fileDescr->objType == FileDescrLine::TYPE_DIRECTORY) + FreeFileSync::removeDirectory(fileDescr->fullName, useRecycleBin); + else if (fileDescr->objType == FileDescrLine::TYPE_NOTHING) + break; //nothing to do + else + { + assert(false); + break; + } //retrieve all files and subfolder gridlines that are dependent from this deleted entry - std::set additionalRowsToDelete; - addSubElements(additionalRowsToDelete, grid, grid[*i]); + std::set rowsToDelete; + rowsToDelete.insert(*i); + addSubElementsOneSide(grid, grid[*i], rowsToDelete); - //...and remove them also - for (std::set::iterator j = additionalRowsToDelete.begin(); j != additionalRowsToDelete.end(); ++j) - writeOutput.rowProcessedSuccessfully(*j); + //remove deleted entries from grid (or adapt it if deleted from one side only) + for (std::set::iterator j = rowsToDelete.begin(); j != rowsToDelete.end(); ++j) + updateCmpLineAfterDeletion(grid[*j], *j, markForRemoval); break; } @@ -477,6 +626,53 @@ void FreeFileSync::deleteOnGridAndHD(FileCompareResult& grid, const std::set& rowsToDeleteOnLeft, + const std::set& rowsToDeleteOnRight, + const bool deleteOnBothSides, + const bool useRecycleBin, + ErrorHandler* errorHandler) +{ + //remove deleted rows from grid (AFTER all rows to be deleted are known: consider row references! + RemoveAtExit markForRemoval(grid); //ensure that grid is always written to, even if method is exitted via exceptions + + if (deleteOnBothSides) + { + //mix selected rows from left and right + std::set rowsToDeleteBothSides = rowsToDeleteOnLeft; + for (std::set::const_iterator i = rowsToDeleteOnRight.begin(); i != rowsToDeleteOnRight.end(); ++i) + rowsToDeleteBothSides.insert(*i); + + deleteFromGridAndHDOneSide(grid, + rowsToDeleteBothSides, + useRecycleBin, + markForRemoval, + errorHandler); + + deleteFromGridAndHDOneSide(grid, + rowsToDeleteBothSides, + useRecycleBin, + markForRemoval, + errorHandler); + } + else + { + deleteFromGridAndHDOneSide(grid, + rowsToDeleteOnLeft, + useRecycleBin, + markForRemoval, + errorHandler); + + deleteFromGridAndHDOneSide(grid, + rowsToDeleteOnRight, + useRecycleBin, + markForRemoval, + errorHandler); + } +} +//############################################################################################################ + + inline void writeTwoDigitNumber(unsigned int number, wxChar*& position) { @@ -565,43 +761,23 @@ wxString FreeFileSync::utcTimeToLocalString(const time_t utcTime) #ifdef FFS_WIN -inline -Zstring getDriveName(const Zstring& directoryName) //GetVolume() doesn't work under Linux! -{ - const Zstring volumeName = wxFileName(directoryName.c_str()).GetVolume().c_str(); - if (volumeName.empty()) - return Zstring(); - - return volumeName + wxFileName::GetVolumeSeparator().c_str() + GlobalResources::FILE_NAME_SEPARATOR; -} -#endif //FFS_WIN - - -#ifdef FFS_WIN -bool FreeFileSync::isFatDrive(const Zstring& directoryName) +Zstring FreeFileSync::getLastErrorFormatted(const unsigned long lastError) //try to get additional windows error information { - const Zstring driveName = getDriveName(directoryName); - if (driveName.empty()) - return false; + unsigned long lastErrorCode = lastError; + //determine error code if none was specified + if (lastErrorCode == 0) + lastErrorCode = GetLastError(); - wxChar fileSystem[32]; - if (!GetVolumeInformation(driveName.c_str(), NULL, 0, NULL, NULL, NULL, fileSystem, 32)) - return false; + Zstring output = Zstring(wxT("Windows Error Code ")) + wxString::Format(wxT("%u"), lastErrorCode).c_str(); - return Zstring(fileSystem).StartsWith(wxT("FAT")); + WCHAR buffer[1001]; + if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, lastErrorCode, 0, buffer, 1001, NULL) != 0) + output += Zstring(wxT(": ")) + buffer; + return output; } #endif -inline -bool sameFileTime(const time_t a, const time_t b) -{ - if (a < b) - return b - a <= FILE_TIME_PRECISION; - else - return a - b <= FILE_TIME_PRECISION; -} - /*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. @@ -642,7 +818,16 @@ N(M) = 77/1000000 * M + 10 for 50000 < M <= 400000 60/1000000 * M + 35 for 400000 < M -*/ + +inline +bool sameFileTime(const time_t a, const time_t b) +{ + if (a < b) + return b - a <= FILE_TIME_PRECISION; + else + return a - b <= FILE_TIME_PRECISION; +} + #ifdef FFS_WIN unsigned int getThreshold(const unsigned filesWithSameSizeTotal) @@ -745,5 +930,4 @@ void FreeFileSync::checkForDSTChange(const FileCompareResult& gridData, } } #endif //FFS_WIN - - +*/ diff --git a/algorithm.h b/algorithm.h index 31c7e9ca..ab4129db 100644 --- a/algorithm.h +++ b/algorithm.h @@ -3,6 +3,7 @@ #include "FreeFileSync.h" #include "library/statusHandler.h" +#include "library/resources.h" namespace FreeFileSync @@ -11,15 +12,28 @@ namespace FreeFileSync wxString formatFilesizeToShortString(const double filesize); Zstring getFormattedDirectoryName(const Zstring& dirname); + bool endsWithPathSeparator(const Zstring& name); + void swapGrids(FileCompareResult& grid); - void adjustModificationTimes(const Zstring& parentDirectory, const int timeInSeconds, ErrorHandler* errorHandler) throw(AbortThisProcess); + void addSubElements(const FileCompareResult& grid, const FileCompareLine& relevantRow, std::set& subElements); + + //manual deletion of files on main grid + wxString deleteFromGridAndHDPreview(const FileCompareResult& grid, + const std::set& rowsToDeleteOnLeft, + const std::set& rowsToDeleteOnRight, + const bool deleteOnBothSides); - void deleteOnGridAndHD(FileCompareResult& grid, const std::set& rowsToDelete, ErrorHandler* errorHandler, const bool useRecycleBin) throw(AbortThisProcess); - void addSubElements(std::set& subElements, const FileCompareResult& grid, const FileCompareLine& relevantRow); + void deleteFromGridAndHD(FileCompareResult& grid, + const std::set& rowsToDeleteOnLeft, + const std::set& rowsToDeleteOnRight, + const bool deleteOnBothSides, + const bool useRecycleBin, + ErrorHandler* errorHandler); - void filterCurrentGridData(FileCompareResult& currentGridData, const wxString& includeFilter, const wxString& excludeFilter); - void removeFilterOnCurrentGridData(FileCompareResult& currentGridData); + void filterGridData(FileCompareResult& currentGridData, const wxString& includeFilter, const wxString& excludeFilter); + void includeAllRowsOnGrid(FileCompareResult& currentGridData); + void excludeAllRowsOnGrid(FileCompareResult& currentGridData); wxString utcTimeToLocalString(const time_t utcTime); @@ -28,14 +42,14 @@ namespace FreeFileSync ForwardIterator custom_binary_search (ForwardIterator first, ForwardIterator last, const T& value) { first = lower_bound(first, last, value); - if (first!=last && !(value<*first)) + if (first != last && !(value < *first)) return first; else return last; } #ifdef FFS_WIN - bool isFatDrive(const Zstring& directoryName); + Zstring getLastErrorFormatted(const unsigned long lastError = 0); //try to get additional windows error information //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 @@ -47,4 +61,13 @@ namespace FreeFileSync } +inline +bool FreeFileSync::endsWithPathSeparator(const Zstring& name) +{ + const size_t len = name.length(); + return len && (name[len - 1] == GlobalResources::FILE_NAME_SEPARATOR); +} + + + #endif // ALGORITHM_H_INCLUDED diff --git a/comparison.cpp b/comparison.cpp index 0ad2e1fb..f90b47de 100644 --- a/comparison.cpp +++ b/comparison.cpp @@ -15,160 +15,25 @@ using namespace FreeFileSync; -CompareProcess::CompareProcess(bool lineBreakOnMessages, bool handleDstOnFat32Drives, StatusHandler* handler) : - includeLineBreak(lineBreakOnMessages), - handleDstOnFat32(handleDstOnFat32Drives), - statusUpdater(handler), - txtComparingContentOfFiles(_("Comparing content of files %x")) -{ - if (includeLineBreak) - txtComparingContentOfFiles.Replace(wxT("%x"), wxT("\n\"%x\""), false); - else - txtComparingContentOfFiles.Replace(wxT("%x"), wxT("\"%x\""), false); -} - - -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 Zstring& filename1, const Zstring& filename2) -{ - static MemoryAllocator memory; - - wxFFile file1(filename1.c_str(), wxT("rb")); - if (!file1.IsOpened()) - throw FileError(Zstring(_("Error reading file:")) + wxT(" \"") + filename1 + wxT("\"")); - - wxFFile file2(filename2.c_str(), wxT("rb")); - if (!file2.IsOpened()) //NO cleanup necessary for (wxFFile) file1 - throw FileError(Zstring(_("Error reading file:")) + wxT(" \"") + filename2 + wxT("\"")); - - do - { - size_t length1 = file1.Read(memory.buffer1, memory.bufferSize); - if (file1.Error()) throw FileError(Zstring(_("Error reading file:")) + wxT(" \"") + filename1 + wxT("\"")); - - size_t length2 = file2.Read(memory.buffer2, memory.bufferSize); - if (file2.Error()) throw FileError(Zstring(_("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() {} - - Zstring file1; - Zstring file2; - bool success; - Zstring 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 Zstring& filename1, const Zstring& 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 std::set& rowsToCompare) -{ - dataTotal = 0; - - for (std::set::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; -} - - -inline -void writeText(const wxChar* text, const int length, wxChar*& currentPos) -{ - memcpy(currentPos, text, length * sizeof(wxChar)); - currentPos+=length; -} - class GetAllFilesFull : public FullDetailFileTraverser { public: - GetAllFilesFull(DirectoryDescrType& output, Zstring dirThatIsSearched, const bool includeLineBreak, StatusHandler* updateClass) : + GetAllFilesFull(DirectoryDescrType& output, Zstring dirThatIsSearched, StatusHandler* handler) : m_output(output), directory(dirThatIsSearched), - statusUpdater(updateClass) + statusHandler(handler) { - assert(updateClass); prefixLength = directory.length(); + textScanning = Zstring(_("Scanning:")) + wxT(" \n"); //performance optimization + } - if (includeLineBreak) - textScanning = Zstring(_("Scanning:")) + wxT("\n"); //performance optimization - else - textScanning = Zstring(_("Scanning:")) + wxT(" "); //performance optimization + + inline + void writeText(const wxChar* text, const int length, wxChar*& currentPos) + { + memcpy(currentPos, text, length * sizeof(wxChar)); + currentPos+=length; } @@ -197,11 +62,11 @@ public: *position = 0; //update UI/commandline status information - statusUpdater->updateStatusText(statusText); + statusHandler->updateStatusText(statusText); //add 1 element to the progress indicator - statusUpdater->updateProcessedData(1, 0); //NO performance issue at all + statusHandler->updateProcessedData(1, 0); //NO performance issue at all //trigger display refresh - statusUpdater->requestUiRefresh(); + statusHandler->requestUiRefresh(); return wxDIR_CONTINUE; } @@ -238,11 +103,11 @@ public: *position = 0; //update UI/commandline status information - statusUpdater->updateStatusText(statusText); + statusHandler->updateStatusText(statusText); //add 1 element to the progress indicator - statusUpdater->updateProcessedData(1, 0); //NO performance issue at all + statusHandler->updateProcessedData(1, 0); //NO performance issue at all //trigger display refresh - statusUpdater->requestUiRefresh(); + statusHandler->requestUiRefresh(); return wxDIR_CONTINUE; } @@ -250,7 +115,20 @@ public: wxDirTraverseResult GetAllFilesFull::OnError(const Zstring& errorText) //virtual impl. { - wxMessageBox(errorText.c_str(), _("Error")); + while (true) + { + ErrorHandler::Response rv = statusHandler->reportError(errorText); + if (rv == ErrorHandler::IGNORE_ERROR) + return wxDIR_CONTINUE; + else if (rv == ErrorHandler::RETRY) + ; //I have to admit "retry" is a bit of a fake here... at least the user has opportunity to abort! + else + { + assert (false); + return wxDIR_CONTINUE; + } + } + return wxDIR_CONTINUE; } @@ -259,25 +137,10 @@ private: Zstring directory; int prefixLength; Zstring textScanning; - StatusHandler* statusUpdater; + StatusHandler* statusHandler; }; -void generateFileAndFolderDescriptions(DirectoryDescrType& output, const Zstring& directory, const bool includeLineBreak, StatusHandler* updateClass) -{ - assert (updateClass); - - output.clear(); - - //get all files and folders from directory (and subdirectories) + information - const Zstring directoryFormatted = FreeFileSync::getFormattedDirectoryName(directory); - - GetAllFilesFull traverser(output, directoryFormatted, includeLineBreak, updateClass); - - traverseInDetail(directoryFormatted, &traverser); -} - - struct DescrBufferLine { Zstring directoryName; @@ -294,9 +157,13 @@ struct DescrBufferLine }; -class DirectoryDescrBuffer //buffer multiple scans of the same directories +class FreeFileSync::DirectoryDescrBuffer //buffer multiple scans of the same directories { public: + DirectoryDescrBuffer(const bool traverseSymbolicLinks, StatusHandler* statusUpdater) : + m_traverseSymbolicLinks(traverseSymbolicLinks), + m_statusUpdater(statusUpdater) {} + ~DirectoryDescrBuffer() { //clean up @@ -304,13 +171,13 @@ public: delete i->directoryDesc; } - DirectoryDescrType* getDirectoryDescription(const Zstring& directory, const bool includeLineBreak, StatusHandler* statusUpdater) + DirectoryDescrType* getDirectoryDescription(const Zstring& directoryFormatted) { DescrBufferLine bufferEntry; - bufferEntry.directoryName = directory; + bufferEntry.directoryName = directoryFormatted; - std::set::iterator entryFound; - if ((entryFound = buffer.find(bufferEntry)) != buffer.end()) + std::set::iterator entryFound = buffer.find(bufferEntry); + if (entryFound != buffer.end()) { //entry found in buffer; return return entryFound->directoryDesc; @@ -321,18 +188,234 @@ public: bufferEntry.directoryDesc = new DirectoryDescrType; buffer.insert(bufferEntry); //exception safety: insert into buffer right after creation! - bufferEntry.directoryDesc->reserve(400000); //reserve space for up to 400000 files to avoid vector reallocations + bufferEntry.directoryDesc->reserve(400000); //reserve space for up to 400000 files to avoid too many vector reallocations + + //get all files and folders from directoryFormatted (and subdirectories) + GetAllFilesFull traverser(*bufferEntry.directoryDesc, directoryFormatted, m_statusUpdater); //exceptions may be thrown! + traverseInDetail(directoryFormatted, m_traverseSymbolicLinks, &traverser); - generateFileAndFolderDescriptions(*bufferEntry.directoryDesc, directory, includeLineBreak, statusUpdater); //exceptions may be thrown! return bufferEntry.directoryDesc; } } private: std::set buffer; + + const bool m_traverseSymbolicLinks; + StatusHandler* m_statusUpdater; }; +bool foldersAreValidForComparison(const std::vector& folderPairs, wxString& errorMessage) +{ + errorMessage.Clear(); + + for (std::vector::const_iterator i = folderPairs.begin(); i != folderPairs.end(); ++i) + { + const Zstring leftFolderName = getFormattedDirectoryName(i->leftDirectory); + const Zstring rightFolderName = getFormattedDirectoryName(i->rightDirectory); + + //check if folder name is empty + if (leftFolderName.empty() || rightFolderName.empty()) + { + 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 std::vector& folders, const Zstring& newFolder, wxString& warningMessage) +{ + warningMessage.Clear(); + + for (std::vector::const_iterator i = folders.begin(); i != folders.end(); ++i) + if (newFolder.StartsWith(*i) || i->StartsWith(newFolder)) + { + warningMessage = wxString(_("Directories are dependent! Be careful when setting up synchronization rules:\n")) + + wxT("\"") + *i + wxT("\",\n") + + wxT("\"") + newFolder + wxT("\""); + return true; + } + return false; +} + + +bool foldersHaveDependencies(const std::vector& folderPairs, wxString& warningMessage) +{ + warningMessage.Clear(); + + std::vector folders; + for (std::vector::const_iterator i = folderPairs.begin(); i != folderPairs.end(); ++i) + { + const Zstring leftFolderName = getFormattedDirectoryName(i->leftDirectory); + const Zstring 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; +} + + +CompareProcess::CompareProcess(const bool traverseSymLinks, + const bool handleDstOnFat32Drives, + bool& warningDependentFolders, + StatusHandler* handler) : + traverseSymbolicLinks(traverseSymLinks), + handleDstOnFat32(handleDstOnFat32Drives), + m_warningDependentFolders(warningDependentFolders), + statusUpdater(handler), + txtComparingContentOfFiles(_("Comparing content of files %x")) +{ + descriptionBuffer = new DirectoryDescrBuffer(traverseSymLinks, handler); + txtComparingContentOfFiles.Replace(wxT("%x"), wxT("\n\"%x\""), false); +} + + +CompareProcess::~CompareProcess() +{ + delete descriptionBuffer; +} + + +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 Zstring& filename1, const Zstring& filename2) +{ + static MemoryAllocator memory; + + wxFFile file1(filename1.c_str(), wxT("rb")); + if (!file1.IsOpened()) + throw FileError(Zstring(_("Error reading file:")) + wxT(" \"") + filename1 + wxT("\"")); + + wxFFile file2(filename2.c_str(), wxT("rb")); + if (!file2.IsOpened()) //NO cleanup necessary for (wxFFile) file1 + throw FileError(Zstring(_("Error reading file:")) + wxT(" \"") + filename2 + wxT("\"")); + + do + { + size_t length1 = file1.Read(memory.buffer1, memory.bufferSize); + if (file1.Error()) throw FileError(Zstring(_("Error reading file:")) + wxT(" \"") + filename1 + wxT("\"")); + + size_t length2 = file2.Read(memory.buffer2, memory.bufferSize); + if (file2.Error()) throw FileError(Zstring(_("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() {} + + Zstring file1; + Zstring file2; + bool success; + Zstring errorMessage; + bool sameContent; + +private: + void longRunner() //virtual method implementation + { + try + { + sameContent = filesHaveSameContent(file1, file2); + success = true; + } + catch (FileError& error) + { + success = false; + errorMessage = error.show(); + } + } +}; + + +bool filesHaveSameContentMultithreaded(const Zstring& filename1, const Zstring& 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.sameContent; +} + + +void calcTotalDataForCompare(int& objectsTotal, double& dataTotal, const FileCompareResult& grid, const std::set& rowsToCompare) +{ + dataTotal = 0; + + for (std::set::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; +} + + inline bool sameFileTime(const time_t a, const time_t b, const time_t tolerance) { @@ -343,39 +426,70 @@ bool sameFileTime(const time_t a, const time_t b, const time_t tolerance) } -void CompareProcess::startCompareProcess(const std::vector& directoryPairsFormatted, +void CompareProcess::startCompareProcess(const std::vector& directoryPairs, 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! + + //format directory pairs + std::vector directoryPairsFormatted; + + for (std::vector::const_iterator i = directoryPairs.begin(); i != directoryPairs.end(); ++i) + { + FolderPair newEntry; + newEntry.leftDirectory = FreeFileSync::getFormattedDirectoryName(i->leftDirectory); + newEntry.rightDirectory = FreeFileSync::getFormattedDirectoryName(i->rightDirectory); + directoryPairsFormatted.push_back(newEntry); + } + + //some basic checks: + + //check if folders are valid + wxString errorMessage; + if (!foldersAreValidForComparison(directoryPairsFormatted, errorMessage)) + { + statusUpdater->reportFatalError(errorMessage.c_str()); + return; //should be obsolete! + } + + //check if folders have dependencies + if (m_warningDependentFolders) //test if check should be executed + { + wxString warningMessage; + if (foldersHaveDependencies(directoryPairsFormatted, warningMessage)) + { + bool dontShowAgain = false; + statusUpdater->reportWarning(warningMessage.c_str(), + dontShowAgain); + m_warningDependentFolders = !dontShowAgain; + } + } try { + FileCompareResult output_tmp; //write to output not before END of process! if (cmpVar == CMP_BY_TIME_SIZE) compareByTimeSize(directoryPairsFormatted, output_tmp); else if (cmpVar == CMP_BY_CONTENT) compareByContent(directoryPairsFormatted, output_tmp); else assert(false); + + //only if everything was processed correctly output is written to! output mustn't change to be in sync with GUI grid view!!! + output_tmp.swap(output); } catch (const RuntimeException& theException) { - wxMessageBox(theException.show(), _("An exception occured!"), wxOK | wxICON_ERROR); - statusUpdater->requestAbortion(); - return; + statusUpdater->reportFatalError(theException.show().c_str()); + return; //should be obsolete! } catch (std::bad_alloc& e) { - wxMessageBox(wxString(_("System out of memory!")) + wxT(" ") + wxString::From8BitData(e.what()), _("An exception occured!"), wxOK | wxICON_ERROR); - statusUpdater->requestAbortion(); - return; + statusUpdater->reportFatalError((wxString(_("System out of memory!")) + wxT(" ") + wxString::From8BitData(e.what())).c_str()); + return; //should be obsolete! } - - //only if everything was processed correctly output is written to! - output_tmp.swap(output); } @@ -384,20 +498,17 @@ void CompareProcess::compareByTimeSize(const std::vector& directoryP //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 - //buffer accesses to the same directories; useful when multiple folder pairs are used - DirectoryDescrBuffer descriptionBuffer; - //process one folder pair after each other unsigned tableSizeOld = 0; for (std::vector::const_iterator pair = directoryPairsFormatted.begin(); pair != directoryPairsFormatted.end(); ++pair) { //do basis scan: only result lines of type FILE_UNDEFINED (files that exist on both sides) need to be determined after this call - this->performBaseComparison(*pair, descriptionBuffer, output); + this->performBaseComparison(*pair, output); //add some tolerance if one of the folders is FAT/FAT32 time_t tolerance = 0; #ifdef FFS_WIN - if (handleDstOnFat32 && (isFatDrive(pair->leftDirectory) || isFatDrive(pair->leftDirectory))) + if (handleDstOnFat32 && (isFatDrive(pair->leftDirectory) || isFatDrive(pair->rightDirectory))) tolerance = FILE_TIME_PRECISION + 3600; //tolerate filetime diff <= 1 h to handle daylight saving time issues else tolerance = FILE_TIME_PRECISION; @@ -437,14 +548,11 @@ void CompareProcess::compareByContent(const std::vector& directoryPa //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 - //buffer accesses to the same directories; useful when multiple folder pairs are used - DirectoryDescrBuffer descriptionBuffer; - //process one folder pair after each other for (std::vector::const_iterator pair = directoryPairsFormatted.begin(); pair != directoryPairsFormatted.end(); ++pair) { //do basis scan: only result lines of type FILE_UNDEFINED (files that exist on both sides) need to be determined after this call - this->performBaseComparison(*pair, descriptionBuffer, output); + this->performBaseComparison(*pair, output); } @@ -526,7 +634,7 @@ public: m_directory(directory) { if (Create() != wxTHREAD_NO_ERROR) - throw RuntimeException(wxString(wxT("Error starting thread for sorting!"))); + throw RuntimeException(wxString(wxT("Error creating thread for sorting!"))); } ~ThreadSorting() {} @@ -543,12 +651,12 @@ private: }; -void CompareProcess::performBaseComparison(const FolderPair& pair, DirectoryDescrBuffer& descriptionBuffer, FileCompareResult& output) +void CompareProcess::performBaseComparison(const FolderPair& pair, FileCompareResult& output) { //PERF_START; //retrieve sets of files (with description data) - DirectoryDescrType* directoryLeft = descriptionBuffer.getDirectoryDescription(pair.leftDirectory, includeLineBreak, statusUpdater); - DirectoryDescrType* directoryRight = descriptionBuffer.getDirectoryDescription(pair.rightDirectory, includeLineBreak, statusUpdater); + DirectoryDescrType* directoryLeft = descriptionBuffer->getDirectoryDescription(pair.leftDirectory); + DirectoryDescrType* directoryRight = descriptionBuffer->getDirectoryDescription(pair.rightDirectory); statusUpdater->updateStatusText(_("Generating file list...")); statusUpdater->forceUiRefresh(); //keep total number of scanned files up to date @@ -559,16 +667,23 @@ void CompareProcess::performBaseComparison(const FolderPair& pair, DirectoryDesc { //no synchronization (multithreading) needed here: directoryLeft and directoryRight are disjunct //reference counting Zstring also shouldn't be an issue, as no strings are deleted during std::sort() - ThreadSorting sortLeft(directoryLeft); - ThreadSorting sortRight(directoryRight); + std::auto_ptr sortLeft(new ThreadSorting(directoryLeft)); + std::auto_ptr sortRight(new ThreadSorting(directoryRight)); + + if (sortLeft->Run() != wxTHREAD_NO_ERROR) + throw RuntimeException(wxString(wxT("Error starting thread for sorting!"))); - sortLeft.Run(); if (directoryLeft != directoryRight) //attention: might point to the same vector because of buffer! { - sortRight.Run(); - sortRight.Wait(); + if (sortRight->Run() != wxTHREAD_NO_ERROR) + throw RuntimeException(wxString(wxT("Error starting thread for sorting!"))); + + if (sortRight->Wait() != 0) + throw RuntimeException(wxString(wxT("Error waiting for thread (sorting)!"))); } - sortLeft.Wait(); + + if (sortLeft->Wait() != 0) + throw RuntimeException(wxString(wxT("Error waiting for thread (sorting)!"))); } else //single threaded { @@ -579,14 +694,14 @@ void CompareProcess::performBaseComparison(const FolderPair& pair, DirectoryDesc } //PERF_STOP; - //reserve some space to avoid vector reallocations + //reserve some space to avoid too many vector reallocations output.reserve(output.size() + unsigned(std::max(directoryLeft->size(), directoryRight->size()) * 1.2)); //begin base comparison FileCompareLine newline; DirectoryDescrType::iterator j; - for (DirectoryDescrType::iterator i = directoryLeft->begin(); i != directoryLeft->end(); ++i) - { //find files/folders that exist in left file model but not in right model + for (DirectoryDescrType::const_iterator i = directoryLeft->begin(); i != directoryLeft->end(); ++i) + { //find files/folders that exist in left file tree but not in right one if ((j = custom_binary_search(directoryRight->begin(), directoryRight->end(), *i)) == directoryRight->end()) { newline.fileDescrLeft = *i; @@ -595,7 +710,7 @@ void CompareProcess::performBaseComparison(const FolderPair& pair, DirectoryDesc newline.cmpResult = FILE_LEFT_SIDE_ONLY; output.push_back(newline); } - //find files/folders that exist in left and right file model + //find files/folders that exist on left and right side else { const FileDescrLine::ObjectType typeLeft = i->objType; @@ -638,7 +753,7 @@ void CompareProcess::performBaseComparison(const FolderPair& pair, DirectoryDesc } - for (DirectoryDescrType::iterator j = directoryRight->begin(); j != directoryRight->end(); ++j) + for (DirectoryDescrType::const_iterator j = directoryRight->begin(); j != directoryRight->end(); ++j) { //find files/folders that exist in right file model but not in left model if (custom_binary_search(directoryLeft->begin(), directoryLeft->end(), *j) == directoryLeft->end()) @@ -653,75 +768,3 @@ void CompareProcess::performBaseComparison(const FolderPair& pair, DirectoryDesc //PERF_STOP } - - -bool FreeFileSync::foldersAreValidForComparison(const std::vector& folderPairs, wxString& errorMessage) -{ - errorMessage.Clear(); - - for (std::vector::const_iterator i = folderPairs.begin(); i != folderPairs.end(); ++i) - { - const Zstring leftFolderName = getFormattedDirectoryName(i->leftDirectory); - const Zstring rightFolderName = getFormattedDirectoryName(i->rightDirectory); - - //check if folder name is empty - if (leftFolderName.empty() || rightFolderName.empty()) - { - 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 std::vector& folders, const Zstring& newFolder, wxString& warningMessage) -{ - warningMessage.Clear(); - - for (std::vector::const_iterator i = folders.begin(); i != folders.end(); ++i) - if (newFolder.StartsWith(*i) || i->StartsWith(newFolder)) - { - warningMessage = wxString(_("Directories are dependent:")) + - wxT(" \n\"") + *i + wxT("\"") + wxT(", \n") + wxT("\"") + newFolder + wxT("\""); - return true; - } - - return false; -} - - -bool FreeFileSync::foldersHaveDependencies(const std::vector& folderPairs, wxString& warningMessage) -{ - warningMessage.Clear(); - - std::vector folders; - for (std::vector::const_iterator i = folderPairs.begin(); i != folderPairs.end(); ++i) - { - const Zstring leftFolderName = getFormattedDirectoryName(i->leftDirectory); - const Zstring 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 index bbd93f9a..8e6bb9d3 100644 --- a/comparison.h +++ b/comparison.h @@ -4,20 +4,22 @@ #include "FreeFileSync.h" #include "library/statusHandler.h" -class DirectoryDescrBuffer; - namespace FreeFileSync { - bool foldersAreValidForComparison(const std::vector& folderPairs, wxString& errorMessage); - bool foldersHaveDependencies( const std::vector& folderPairs, wxString& warningMessage); + class DirectoryDescrBuffer; //class handling comparison process class CompareProcess { public: - CompareProcess(bool lineBreakOnMessages, bool handleDstOnFat32Drives, StatusHandler* handler); + CompareProcess(const bool traverseSymLinks, + const bool handleDstOnFat32Drives, + bool& warningDependentFolders, + StatusHandler* handler); + + ~CompareProcess(); - void startCompareProcess(const std::vector& directoryPairsFormatted, + void startCompareProcess(const std::vector& directoryPairs, const CompareVariant cmpVar, FileCompareResult& output) throw(AbortThisProcess); @@ -27,12 +29,15 @@ namespace FreeFileSync void compareByContent(const std::vector& directoryPairsFormatted, FileCompareResult& output); //create comparison result table and fill relation except for files existing on both sides - void performBaseComparison(const FolderPair& pair, - DirectoryDescrBuffer& descriptionBuffer, - FileCompareResult& output); + void performBaseComparison(const FolderPair& pair, FileCompareResult& output); - const bool includeLineBreak; //optional line break for status messages (used by GUI mode only) + //buffer accesses to the same directories; useful when multiple folder pairs are used + DirectoryDescrBuffer* descriptionBuffer; + + const bool traverseSymbolicLinks; const bool handleDstOnFat32; + bool& m_warningDependentFolders; + StatusHandler* statusUpdater; Zstring txtComparingContentOfFiles; }; diff --git a/library/CustomGrid.cpp b/library/CustomGrid.cpp index 95300a2b..cf9adc6e 100644 --- a/library/CustomGrid.cpp +++ b/library/CustomGrid.cpp @@ -5,8 +5,6 @@ #include "../algorithm.h" #include "resources.h" -using namespace xmlAccess; - const unsigned int MIN_ROW_COUNT = 15; @@ -16,8 +14,11 @@ class CustomGridTable : public wxGridTableBase public: CustomGridTable() : wxGridTableBase(), - lightBlue(80, 110, 255), - lightGrey(212, 208, 200), + blue(80, 110, 255), + grey(212, 208, 200), + lightRed(235, 57, 61), + lightBlue(63, 206, 233), + lightGreen(54, 218, 2), gridRefUI(NULL), gridData(NULL), lastNrRows(0), @@ -186,29 +187,32 @@ public: } - void setupColumns(const std::vector& positions) + void setupColumns(const std::vector& positions) { columnPositions = positions; updateGridSizes(); //add or remove columns } - XmlGlobalSettings::ColumnTypes getTypeAtPos(unsigned pos) const + xmlAccess::ColumnTypes getTypeAtPos(unsigned pos) const { if (pos < columnPositions.size()) return columnPositions[pos]; else - return XmlGlobalSettings::ColumnTypes(1000); + return xmlAccess::ColumnTypes(1000); } protected: virtual const wxColour& getRowColor(int row) = 0; //rows that are filtered out are shown in different color - std::vector columnPositions; + std::vector columnPositions; + wxColour blue; + wxColour grey; + wxColour lightRed; wxColour lightBlue; - wxColour lightGrey; + wxColour lightGreen; GridView* gridRefUI; //(very fast) access to underlying grid data :) FileCompareResult* gridData; int lastNrRows; @@ -230,10 +234,10 @@ public: //mark filtered rows if (!cmpLine.selectedForSynchronization) - return lightBlue; + return blue; //mark directories else if (cmpLine.fileDescrLeft.objType == FileDescrLine::TYPE_DIRECTORY) - return lightGrey; + return grey; else return *wxWHITE; } @@ -254,13 +258,15 @@ public: { switch (getTypeAtPos(col)) { - case XmlGlobalSettings::FILENAME: //filename + case xmlAccess::FULL_NAME: + return gridLine.fileDescrLeft.fullName.c_str(); + case xmlAccess::FILENAME: //filename return wxEmptyString; - case XmlGlobalSettings::REL_PATH: //relative path + case xmlAccess::REL_PATH: //relative path return gridLine.fileDescrLeft.relativeName.c_str(); - case XmlGlobalSettings::SIZE: //file size + case xmlAccess::SIZE: //file size return _(""); - case XmlGlobalSettings::DATE: //date + case xmlAccess::DATE: //date return wxEmptyString; } } @@ -268,16 +274,18 @@ public: { switch (getTypeAtPos(col)) { - case XmlGlobalSettings::FILENAME: //filename + case xmlAccess::FULL_NAME: + return gridLine.fileDescrLeft.fullName.c_str(); + case xmlAccess::FILENAME: //filename return gridLine.fileDescrLeft.relativeName.AfterLast(GlobalResources::FILE_NAME_SEPARATOR).c_str(); - case XmlGlobalSettings::REL_PATH: //relative path + case xmlAccess::REL_PATH: //relative path return gridLine.fileDescrLeft.relativeName.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR).c_str(); - case XmlGlobalSettings::SIZE: //file size + case xmlAccess::SIZE: //file size { wxString fileSize = gridLine.fileDescrLeft.fileSize.ToString(); //tmp string return globalFunctions::includeNumberSeparator(fileSize); } - case XmlGlobalSettings::DATE: //date + case xmlAccess::DATE: //date return FreeFileSync::utcTimeToLocalString(gridLine.fileDescrLeft.lastWriteTimeRaw); } } @@ -320,8 +328,7 @@ public: } - //virtual impl. - const wxColour& getRowColor(int row) //rows that are filtered out are shown in different color + virtual const wxColour& getRowColor(int row) //rows that are filtered out are shown in different color { if (gridRefUI && unsigned(row) < gridRefUI->size()) { @@ -329,15 +336,27 @@ public: //mark filtered rows if (!cmpLine.selectedForSynchronization) - return lightBlue; + return blue; else - return *wxWHITE; + switch (cmpLine.cmpResult) + { + case FILE_LEFT_SIDE_ONLY: + case FILE_RIGHT_SIDE_ONLY: + return lightGreen; + case FILE_LEFT_NEWER: + case FILE_RIGHT_NEWER: + return lightBlue; + case FILE_DIFFERENT: + return lightRed; + default: + return *wxWHITE; + } } return *wxWHITE; } - //virtual impl. - wxString GetValue(int row, int col) + + virtual wxString GetValue(int row, int col) { if (gridRefUI) { @@ -377,8 +396,7 @@ public: CustomGridTableRight() : CustomGridTable() {} ~CustomGridTableRight() {} - //virtual impl. - const wxColour& getRowColor(int row) //rows that are filtered out are shown in different color + virtual const wxColour& getRowColor(int row) //rows that are filtered out are shown in different color { if (gridRefUI && unsigned(row) < gridRefUI->size()) { @@ -386,10 +404,10 @@ public: //mark filtered rows if (!cmpLine.selectedForSynchronization) - return lightBlue; + return blue; //mark directories else if (cmpLine.fileDescrRight.objType == FileDescrLine::TYPE_DIRECTORY) - return lightGrey; + return grey; else return *wxWHITE; } @@ -409,13 +427,15 @@ public: { switch (getTypeAtPos(col)) { - case XmlGlobalSettings::FILENAME: //filename + case xmlAccess::FULL_NAME: + return gridLine.fileDescrRight.fullName.c_str(); + case xmlAccess::FILENAME: //filename return wxEmptyString; - case XmlGlobalSettings::REL_PATH: //relative path + case xmlAccess::REL_PATH: //relative path return gridLine.fileDescrRight.relativeName.c_str(); - case XmlGlobalSettings::SIZE: //file size + case xmlAccess::SIZE: //file size return _(""); - case XmlGlobalSettings::DATE: //date + case xmlAccess::DATE: //date return wxEmptyString; } } @@ -423,16 +443,18 @@ public: { switch (getTypeAtPos(col)) { - case XmlGlobalSettings::FILENAME: //filename + case xmlAccess::FULL_NAME: + return gridLine.fileDescrRight.fullName.c_str(); + case xmlAccess::FILENAME: //filename return gridLine.fileDescrRight.relativeName.AfterLast(GlobalResources::FILE_NAME_SEPARATOR).c_str(); - case XmlGlobalSettings::REL_PATH: //relative path + case xmlAccess::REL_PATH: //relative path return gridLine.fileDescrRight.relativeName.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR).c_str(); - case XmlGlobalSettings::SIZE: //file size + case xmlAccess::SIZE: //file size { wxString fileSize = gridLine.fileDescrRight.fileSize.ToString(); //tmp string return globalFunctions::includeNumberSeparator(fileSize); } - case XmlGlobalSettings::DATE: //date + case xmlAccess::DATE: //date return FreeFileSync::utcTimeToLocalString(gridLine.fileDescrRight.lastWriteTimeRaw); } } @@ -454,6 +476,7 @@ CustomGrid::CustomGrid(wxWindow *parent, long style, const wxString& name) : wxGrid(parent, id, pos, size, style, name), + leadGrid(NULL), scrollbarsEnabled(true), m_gridLeft(NULL), m_gridRight(NULL), m_gridMiddle(NULL), gridDataTable(NULL), @@ -514,17 +537,17 @@ void CustomGrid::adjustGridHeights() //m_gridLeft, m_gridRight, m_gridMiddle are { int yMax = std::max(y1, std::max(y2, y3)); - if (::leadGrid == m_gridLeft) //do not handle case (y1 == yMax) here!!! Avoid back coupling! + if (leadGrid == m_gridLeft) //do not handle case (y1 == yMax) here!!! Avoid back coupling! m_gridLeft->SetMargins(0, 0); else if (y1 < yMax) m_gridLeft->SetMargins(0, 50); - if (::leadGrid == m_gridRight) + if (leadGrid == m_gridRight) m_gridRight->SetMargins(0, 0); else if (y2 < yMax) m_gridRight->SetMargins(0, 50); - if (::leadGrid == m_gridMiddle) + if (leadGrid == m_gridMiddle) m_gridMiddle->SetMargins(0, 0); else if (y3 < yMax) m_gridMiddle->SetMargins(0, 50); @@ -536,6 +559,12 @@ void CustomGrid::adjustGridHeights() //m_gridLeft, m_gridRight, m_gridMiddle are } +void CustomGrid::setLeadGrid(const wxGrid* newLead) +{ + leadGrid = newLead; +} + + void CustomGrid::updateGridSizes() { assert(gridDataTable); @@ -559,11 +588,66 @@ void CustomGrid::DrawColLabel(wxDC& dc, int col) } -void CustomGrid::setColumnAttributes(const xmlAccess::XmlGlobalSettings::ColumnAttributes& attr) +xmlAccess::ColumnAttributes CustomGrid::getDefaultColumnAttributes() +{ + xmlAccess::ColumnAttributes defaultColumnSettings; + + xmlAccess::ColumnAttrib newEntry; + + newEntry.type = xmlAccess::FULL_NAME; + newEntry.visible = false; + newEntry.position = 0; + newEntry.width = 150; + defaultColumnSettings.push_back(newEntry); + + newEntry.type = xmlAccess::FILENAME; + newEntry.visible = true; + newEntry.position = 1; + newEntry.width = 138; + defaultColumnSettings.push_back(newEntry); + + newEntry.type = xmlAccess::REL_PATH; + newEntry.position = 2; + newEntry.width = 118; + defaultColumnSettings.push_back(newEntry); + + newEntry.type = xmlAccess::SIZE; + newEntry.position = 3; + newEntry.width = 67; + defaultColumnSettings.push_back(newEntry); + + newEntry.type = xmlAccess::DATE; + newEntry.position = 4; + newEntry.width = 113; + defaultColumnSettings.push_back(newEntry); + + return defaultColumnSettings; +} + + +xmlAccess::ColumnAttributes CustomGrid::getColumnAttributes() +{ + std::sort(columnSettings.begin(), columnSettings.end(), xmlAccess::sortByPositionAndVisibility); + + xmlAccess::ColumnAttributes output; + xmlAccess::ColumnAttrib newEntry; + for (unsigned int i = 0; i < columnSettings.size(); ++i) + { + newEntry = columnSettings[i]; + if (newEntry.visible) + newEntry.width = GetColSize(i); //hidden columns are sorted to the end of vector! + output.push_back(newEntry); + } + + return output; +} + + +void CustomGrid::setColumnAttributes(const xmlAccess::ColumnAttributes& attr) { //remove special alignment for column "size" for (int i = 0; i < GetNumberCols(); ++i) - if (getTypeAtPos(i) == XmlGlobalSettings::SIZE) + if (getTypeAtPos(i) == xmlAccess::SIZE) { wxGridCellAttr* cellAttributes = GetOrCreateCellAttr(0, i); cellAttributes->SetAlignment(wxALIGN_LEFT,wxALIGN_CENTRE); @@ -571,44 +655,23 @@ void CustomGrid::setColumnAttributes(const xmlAccess::XmlGlobalSettings::ColumnA break; } //---------------------------------------------------------------------------------- - setSortMarker(-1); //clear sorting marker columnSettings.clear(); if (attr.size() == 0) { //default settings: - xmlAccess::XmlGlobalSettings::ColumnAttrib newEntry; - newEntry.type = xmlAccess::XmlGlobalSettings::FILENAME; - newEntry.visible = true; - newEntry.position = 0; - newEntry.width = 138; - columnSettings.push_back(newEntry); - - newEntry.type = xmlAccess::XmlGlobalSettings::REL_PATH; - newEntry.position = 1; - newEntry.width = 118; - columnSettings.push_back(newEntry); - - newEntry.type = xmlAccess::XmlGlobalSettings::SIZE; - newEntry.position = 2; - newEntry.width = 67; - columnSettings.push_back(newEntry); - - newEntry.type = xmlAccess::XmlGlobalSettings::DATE; - newEntry.position = 3; - newEntry.width = 113; - columnSettings.push_back(newEntry); + columnSettings = getDefaultColumnAttributes(); } else { - for (unsigned int i = 0; i < COLUMN_TYPE_COUNT; ++i) + for (unsigned int i = 0; i < xmlAccess::COLUMN_TYPE_COUNT; ++i) { - XmlGlobalSettings::ColumnAttrib newEntry; + xmlAccess::ColumnAttrib newEntry; if (i < attr.size()) newEntry = attr[i]; else { - newEntry.type = xmlAccess::XmlGlobalSettings::FILENAME; + newEntry.type = xmlAccess::FILENAME; newEntry.visible = true; newEntry.position = i; newEntry.width = 100; @@ -616,18 +679,17 @@ void CustomGrid::setColumnAttributes(const xmlAccess::XmlGlobalSettings::ColumnA columnSettings.push_back(newEntry); } - sort(columnSettings.begin(), columnSettings.end(), xmlAccess::sortByType); - for (unsigned int i = 0; i < COLUMN_TYPE_COUNT; ++i) //just be sure that each type exists only once - columnSettings[i].type = XmlGlobalSettings::ColumnTypes(i); + std::sort(columnSettings.begin(), columnSettings.end(), xmlAccess::sortByType); + for (unsigned int i = 0; i < xmlAccess::COLUMN_TYPE_COUNT; ++i) //just be sure that each type exists only once + columnSettings[i].type = xmlAccess::ColumnTypes(i); - sort(columnSettings.begin(), columnSettings.end(), xmlAccess::sortByPositionOnly); - for (unsigned int i = 0; i < COLUMN_TYPE_COUNT; ++i) //just be sure that positions are numbered correctly + std::sort(columnSettings.begin(), columnSettings.end(), xmlAccess::sortByPositionOnly); + for (unsigned int i = 0; i < xmlAccess::COLUMN_TYPE_COUNT; ++i) //just be sure that positions are numbered correctly columnSettings[i].position = i; - - sort(columnSettings.begin(), columnSettings.end(), xmlAccess::sortByPositionAndVisibility); } - std::vector newPositions; + std::sort(columnSettings.begin(), columnSettings.end(), xmlAccess::sortByPositionAndVisibility); + std::vector newPositions; for (unsigned int i = 0; i < columnSettings.size() && columnSettings[i].visible; ++i) //hidden columns are sorted to the end of vector! newPositions.push_back(columnSettings[i].type); @@ -642,7 +704,7 @@ void CustomGrid::setColumnAttributes(const xmlAccess::XmlGlobalSettings::ColumnA //-------------------------------------------------------------------------------------------------------- //set special alignment for column "size" for (int i = 0; i < GetNumberCols(); ++i) - if (getTypeAtPos(i) == XmlGlobalSettings::SIZE) + if (getTypeAtPos(i) == xmlAccess::SIZE) { wxGridCellAttr* cellAttributes = GetOrCreateCellAttr(0, i); cellAttributes->SetAlignment(wxALIGN_RIGHT,wxALIGN_CENTRE); @@ -655,42 +717,26 @@ void CustomGrid::setColumnAttributes(const xmlAccess::XmlGlobalSettings::ColumnA } -xmlAccess::XmlGlobalSettings::ColumnAttributes CustomGrid::getColumnAttributes() -{ - sort(columnSettings.begin(), columnSettings.end(), xmlAccess::sortByPositionAndVisibility); - - xmlAccess::XmlGlobalSettings::ColumnAttributes output; - xmlAccess::XmlGlobalSettings::ColumnAttrib newEntry; - for (unsigned int i = 0; i < columnSettings.size(); ++i) - { - newEntry = columnSettings[i]; - if (newEntry.visible) //hidden columns are sorted to the end of vector! - newEntry.width = GetColSize(i); - output.push_back(newEntry); - } - - return output; -} - - -XmlGlobalSettings::ColumnTypes CustomGrid::getTypeAtPos(unsigned pos) const +xmlAccess::ColumnTypes CustomGrid::getTypeAtPos(unsigned pos) const { assert(gridDataTable); return gridDataTable->getTypeAtPos(pos); } -wxString CustomGrid::getTypeName(XmlGlobalSettings::ColumnTypes colType) +wxString CustomGrid::getTypeName(xmlAccess::ColumnTypes colType) { switch (colType) { - case XmlGlobalSettings::FILENAME: + case xmlAccess::FULL_NAME: + return _("Full name"); + case xmlAccess::FILENAME: return _("Filename"); - case XmlGlobalSettings::REL_PATH: + case xmlAccess::REL_PATH: return _("Relative path"); - case XmlGlobalSettings::SIZE: + case xmlAccess::SIZE: return _("Size"); - case XmlGlobalSettings::DATE: + case xmlAccess::DATE: return _("Date"); default: return wxEmptyString; @@ -725,7 +771,7 @@ void CustomGridLeft::DoPrepareDC(wxDC& dc) wxScrollHelper::DoPrepareDC(dc); int x, y = 0; - if (this == ::leadGrid) //avoid back coupling + if (this == leadGrid) //avoid back coupling { GetViewStart(&x, &y); m_gridMiddle->Scroll(-1, y); //scroll in y-direction only @@ -764,7 +810,7 @@ void CustomGridMiddle::DoPrepareDC(wxDC& dc) wxScrollHelper::DoPrepareDC(dc); int x, y = 0; - if (this == ::leadGrid) //avoid back coupling + if (this == leadGrid) //avoid back coupling { GetViewStart(&x, &y); m_gridLeft->Scroll(-1, y); @@ -836,7 +882,7 @@ void CustomGridRight::DoPrepareDC(wxDC& dc) wxScrollHelper::DoPrepareDC(dc); int x, y = 0; - if (this == ::leadGrid) //avoid back coupling + if (this == leadGrid) //avoid back coupling { GetViewStart(&x, &y); m_gridLeft->Scroll(x, y); diff --git a/library/CustomGrid.h b/library/CustomGrid.h index 97642159..8f392975 100644 --- a/library/CustomGrid.h +++ b/library/CustomGrid.h @@ -13,8 +13,6 @@ class CustomGridTable; class CustomGridTableMiddle; //################################################################################## -extern const wxGrid* leadGrid; //this global variable is not very nice... - class CustomGrid : public wxGrid { public: @@ -46,22 +44,23 @@ public: void setSortMarker(const int sortColumn, const wxBitmap* bitmap = &wxNullBitmap); //set visibility, position and width of columns - void setColumnAttributes(const xmlAccess::XmlGlobalSettings::ColumnAttributes& attr); - xmlAccess::XmlGlobalSettings::ColumnAttributes getColumnAttributes(); + static xmlAccess::ColumnAttributes getDefaultColumnAttributes(); + xmlAccess::ColumnAttributes getColumnAttributes(); + void setColumnAttributes(const xmlAccess::ColumnAttributes& attr); - xmlAccess::XmlGlobalSettings::ColumnTypes getTypeAtPos(unsigned pos) const; + xmlAccess::ColumnTypes getTypeAtPos(unsigned pos) const; - static wxString getTypeName(xmlAccess::XmlGlobalSettings::ColumnTypes colType); + static wxString getTypeName(xmlAccess::ColumnTypes colType); - static const unsigned COLUMN_TYPE_COUNT = 4; + void setLeadGrid(const wxGrid* newLead); protected: //set visibility, position and width of columns - xmlAccess::XmlGlobalSettings::ColumnAttributes columnSettings; - + xmlAccess::ColumnAttributes columnSettings; void adjustGridHeights(); + const wxGrid* leadGrid; //grid that has user focus bool scrollbarsEnabled; CustomGrid* m_gridLeft; CustomGrid* m_gridRight; diff --git a/library/customButton.cpp b/library/customButton.cpp index 5cfa8a5a..02cfdad0 100644 --- a/library/customButton.cpp +++ b/library/customButton.cpp @@ -10,15 +10,18 @@ wxButtonWithImage::wxButtonWithImage(wxWindow *parent, long style, const wxValidator& validator, const wxString& name) : - wxBitmapButton(parent, id, wxNullBitmap, pos, size, style | wxBU_AUTODRAW, validator, name) + wxBitmapButton(parent, id, wxNullBitmap, pos, size, style | wxBU_AUTODRAW, validator, name), + m_spaceAfter(0), + m_spaceBefore(0) { setTextLabel(label); } -void wxButtonWithImage::setBitmapFront(const wxBitmap& bitmap) +void wxButtonWithImage::setBitmapFront(const wxBitmap& bitmap, unsigned spaceAfter) { - bitmapFront = bitmap; + bitmapFront = bitmap; + m_spaceAfter = spaceAfter; refreshButtonLabel(); } @@ -31,9 +34,10 @@ void wxButtonWithImage::setTextLabel(const wxString& text) } -void wxButtonWithImage::setBitmapBack(const wxBitmap& bitmap) +void wxButtonWithImage::setBitmapBack(const wxBitmap& bitmap, unsigned spaceBefore) { - bitmapBack = bitmap; + bitmapBack = bitmap; + m_spaceBefore = spaceBefore; refreshButtonLabel(); } @@ -258,7 +262,7 @@ void wxButtonWithImage::refreshButtonLabel() //calculate dimensions of new button const int height = std::max(std::max(bitmapFront.GetHeight(), bitmapText.GetHeight()), bitmapBack.GetHeight()); - const int width = bitmapFront.GetWidth() + bitmapText.GetWidth() + bitmapBack.GetWidth(); + const int width = bitmapFront.GetWidth() + m_spaceAfter + bitmapText.GetWidth() + m_spaceBefore + bitmapBack.GetWidth(); //create a transparent image wxImage transparentImage(width, height, false); @@ -274,12 +278,12 @@ void wxButtonWithImage::refreshButtonLabel() if (bitmapText.IsOk()) writeToImage(wxImage(bitmapText.ConvertToImage()), - wxPoint(bitmapFront.GetWidth(), (transparentImage.GetHeight() - bitmapText.GetHeight()) / 2), + wxPoint(bitmapFront.GetWidth() + m_spaceAfter, (transparentImage.GetHeight() - bitmapText.GetHeight()) / 2), transparentImage); if (bitmapBack.IsOk()) writeToImage(wxImage(bitmapBack.ConvertToImage()), - wxPoint(bitmapFront.GetWidth() + bitmapText.GetWidth(), (transparentImage.GetHeight() - bitmapBack.GetHeight()) / 2), + wxPoint(bitmapFront.GetWidth() + m_spaceAfter + bitmapText.GetWidth() + m_spaceBefore, (transparentImage.GetHeight() - bitmapBack.GetHeight()) / 2), transparentImage); //adjust button size diff --git a/library/customButton.h b/library/customButton.h index 1f3f50ec..ce43828a 100644 --- a/library/customButton.h +++ b/library/customButton.h @@ -23,16 +23,18 @@ public: const wxValidator& validator = wxDefaultValidator, const wxString& name = wxButtonNameStr); - void setBitmapFront(const wxBitmap& bitmap); + void setBitmapFront(const wxBitmap& bitmap, unsigned spaceAfter = 0); void setTextLabel( const wxString& text); - void setBitmapBack( const wxBitmap& bitmap); + void setBitmapBack( const wxBitmap& bitmap, unsigned spaceBefore = 0); private: wxBitmap createBitmapFromText(const wxString& text); void refreshButtonLabel(); wxBitmap bitmapFront; + unsigned m_spaceAfter; wxString textLabel; + unsigned m_spaceBefore; wxBitmap bitmapBack; }; diff --git a/library/fileHandling.cpp b/library/fileHandling.cpp index 688d3640..cda81ef5 100644 --- a/library/fileHandling.cpp +++ b/library/fileHandling.cpp @@ -1,19 +1,13 @@ #include "fileHandling.h" #include #include -#include "resources.h" +#include "../algorithm.h" +#include #ifdef FFS_WIN #include //includes "windows.h" #endif // FFS_WIN -inline -bool endsWithPathSeparator(const Zstring& name) -{ - const size_t len = name.length(); - return len && (name[len - 1] == GlobalResources::FILE_NAME_SEPARATOR); -} - class RecycleBin { @@ -89,19 +83,30 @@ void FreeFileSync::removeFile(const Zstring& filename, const bool useRecycleBin) if (useRecycleBin) { if (!moveToRecycleBin(filename)) - throw FileError(Zstring(_("Error moving to recycle bin:")) + wxT(" \"") + filename + wxT("\"")); + throw FileError(Zstring(_("Error moving to Recycle Bin:")) + wxT("\n\"") + filename + wxT("\"")); return; } #ifdef FFS_WIN + //initialize file attributes if (!SetFileAttributes( - filename.c_str(), //address of filename - FILE_ATTRIBUTE_NORMAL //attributes to set - )) throw FileError(Zstring(_("Error deleting file:")) + wxT(" \"") + filename + wxT("\"")); -#endif //FFS_WIN + filename.c_str(), //address of filename + FILE_ATTRIBUTE_NORMAL)) //attributes to set + { + Zstring errorMessage = Zstring(_("Error deleting file:")) + wxT("\n\"") + filename + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } + //remove file, support for \\?\-prefix + if (DeleteFile(filename.c_str()) == 0) + { + Zstring errorMessage = Zstring(_("Error deleting file:")) + wxT("\n\"") + filename + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } +#else if (!wxRemoveFile(filename.c_str())) - throw FileError(Zstring(_("Error deleting file:")) + wxT(" \"") + filename + wxT("\"")); + throw FileError(Zstring(_("Error deleting file:")) + wxT("\n\"") + filename + wxT("\"")); +#endif } @@ -112,53 +117,65 @@ void FreeFileSync::removeDirectory(const Zstring& directory, const bool useRecyc if (useRecycleBin) { if (!moveToRecycleBin(directory)) - throw FileError(Zstring(_("Error moving to recycle bin:")) + wxT(" \"") + directory + wxT("\"")); + throw FileError(Zstring(_("Error moving to Recycle Bin:")) + wxT("\n\"") + directory + wxT("\"")); return; } std::vector fileList; std::vector 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(Zstring(_("Error deleting directory:")) + wxT(" \"") + directory + wxT("\"")); - } + getAllFilesAndDirs(directory, fileList, dirList); for (unsigned int j = 0; j < fileList.size(); ++j) removeFile(fileList[j], false); - dirList.insert(dirList.begin(), directory); //this directory will be deleted last + dirList.insert(dirList.begin(), directory); //parent directory will be deleted last for (int j = int(dirList.size()) - 1; j >= 0 ; --j) { #ifdef FFS_WIN + //initialize file attributes if (!SetFileAttributes( dirList[j].c_str(), // address of directory name FILE_ATTRIBUTE_NORMAL)) // attributes to set - throw FileError(Zstring(_("Error deleting directory:")) + wxT(" \"") + dirList[j] + wxT("\"")); -#endif // FFS_WIN + { + Zstring errorMessage = Zstring(_("Error deleting directory:")) + wxT("\n\"") + dirList[j] + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } + //remove directory, support for \\?\-prefix + if (RemoveDirectory(dirList[j].c_str()) == 0) + { + Zstring errorMessage = Zstring(_("Error deleting directory:")) + wxT("\n\"") + dirList[j] + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } +#else if (!wxRmdir(dirList[j].c_str())) - throw FileError(Zstring(_("Error deleting directory:")) + wxT(" \"") + dirList[j] + wxT("\"")); + throw FileError(Zstring(_("Error deleting directory:")) + wxT("\n\"") + dirList[j] + wxT("\"")); +#endif } } void FreeFileSync::createDirectory(const Zstring& directory, const int level) { - if (wxDirExists(directory)) + if (wxDirExists(directory.c_str())) return; if (level == 50) //catch endless recursion return; - //try to create directory - if (wxMkdir(directory.c_str())) + //try to create directory, support for \\?\-prefix +#ifdef FFS_WIN + if (CreateDirectory( + directory.c_str(), // pointer to a directory path string + NULL // pointer to a security descriptor + ) != 0) + return; +#else + if (wxMkdir(directory.c_str())) //wxMkDir has different signature under Linux! return; +#endif //if not successfull try to create parent folders first Zstring parentDir; @@ -176,11 +193,25 @@ void FreeFileSync::createDirectory(const Zstring& directory, const int level) createDirectory(parentDir, level + 1); //now creation should be possible - if (!wxMkdir(directory.c_str())) +#ifdef FFS_WIN + if (CreateDirectory( + directory.c_str(), // pointer to a directory path string + NULL // pointer to a security descriptor + ) == 0) + { + if (level == 0) + { + Zstring errorMessage = Zstring(_("Error creating directory:")) + wxT("\n\"") + directory + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } + } +#else + if (!wxMkdir(directory.c_str())) //wxMkDir has different signature under Linux! { if (level == 0) - throw FileError(Zstring(_("Error creating directory:")) + wxT(" \"") + directory + wxT("\"")); + throw FileError(Zstring(_("Error creating directory:")) + wxT("\n\"") + directory + wxT("\"")); } +#endif } @@ -189,41 +220,44 @@ void FreeFileSync::copyFolderAttributes(const Zstring& source, const Zstring& ta #ifdef FFS_WIN DWORD attr = GetFileAttributes(source.c_str()); // address of the name of a file or directory if (attr == 0xFFFFFFFF) - throw FileError(Zstring(_("Error reading folder attributes:")) + wxT(" \"") + source + wxT("\"")); + { + Zstring errorMessage = Zstring(_("Error reading folder attributes:")) + wxT("\n\"") + source + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } if (!SetFileAttributes( target.c_str(), // address of filename attr)) // address of attributes to set - throw FileError(Zstring(_("Error writing folder attributes:")) + wxT(" \"") + target + wxT("\"")); + { + Zstring errorMessage = Zstring(_("Error writing folder attributes:")) + wxT("\n\"") + target + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } #elif defined FFS_LINUX //Linux doesn't use attributes for files or folders #endif } -class GetAllFilesSimple : public wxDirTraverser +class FilesDirsOnlyTraverser : public FreeFileSync::FullDetailFileTraverser { public: - GetAllFilesSimple(std::vector& files, std::vector& subDirectories) : + FilesDirsOnlyTraverser(std::vector& files, std::vector& dirs) : m_files(files), - m_dirs(subDirectories) {} + m_dirs(dirs) {} - wxDirTraverseResult OnDir(const wxString& dirname) + virtual wxDirTraverseResult OnFile(const Zstring& filename, const FreeFileSync::FileInfo& details) { - m_dirs.push_back(dirname.c_str()); + m_files.push_back(filename); return wxDIR_CONTINUE; } - - wxDirTraverseResult OnFile(const wxString& filename) + virtual wxDirTraverseResult OnDir(const Zstring& dirname) { - m_files.push_back(filename.c_str()); + m_dirs.push_back(dirname); return wxDIR_CONTINUE; } - - wxDirTraverseResult OnOpenError(const wxString& openerrorname) + virtual wxDirTraverseResult OnError(const Zstring& errorText) { - wxMessageBox(openerrorname, _("Error")); - return wxDIR_IGNORE; + throw FileError(errorText); } private: @@ -238,11 +272,8 @@ void FreeFileSync::getAllFilesAndDirs(const Zstring& sourceDir, std::vectorOnError(Zstring(_("Could not retrieve file info for:")) + wxT(" \"") + filename.c_str() + wxT("\"")); + return m_sink->OnError(Zstring(_("Could not retrieve file info for:")) + wxT("\n\"") + filename.c_str() + wxT("\"")); FreeFileSync::FileInfo details; details.lastWriteTimeRaw = fileInfo.st_mtime; //UTC time(ANSI C format); unit: 1 second @@ -310,115 +341,162 @@ private: #endif -bool FreeFileSync::traverseInDetail(const Zstring& directory, FullDetailFileTraverser* sink, const int level) +class TraverseRecursively { -#ifdef FFS_WIN - if (level == 50) //catch endless recursion +public: + TraverseRecursively(const bool traverseSymbolicLinks, FreeFileSync::FullDetailFileTraverser* sink) : + m_traverseSymbolicLinks(traverseSymbolicLinks), + m_sink(sink) {} + + bool traverse(const Zstring& directory, const int level) { - if (sink->OnError(Zstring(_("Error traversing directory:")) + wxT(" ") + directory) == wxDIR_STOP) - return false; - else - return true; - } +#ifdef FFS_WIN + if (level == 50) //catch endless recursion + { + if (m_sink->OnError(Zstring(_("Error traversing directory:")) + wxT("\n\"") + directory + wxT("\"")) == wxDIR_STOP) + return false; + else + return true; + } - Zstring directoryFormatted = directory; - if (!endsWithPathSeparator(directoryFormatted)) - directoryFormatted += GlobalResources::FILE_NAME_SEPARATOR; + Zstring directoryFormatted = directory; + if (!FreeFileSync::endsWithPathSeparator(directoryFormatted)) + directoryFormatted += GlobalResources::FILE_NAME_SEPARATOR; - const Zstring filespec = directoryFormatted + wxT("*.*"); + const Zstring filespec = directoryFormatted + DefaultChar('*'); - WIN32_FIND_DATA fileMetaData; - HANDLE searchHandle = FindFirstFile(filespec.c_str(), //pointer to name of file to search for - &fileMetaData); //pointer to returned information + WIN32_FIND_DATA fileMetaData; + HANDLE searchHandle = FindFirstFile(filespec.c_str(), //pointer to name of file to search for + &fileMetaData); //pointer to returned information - if (searchHandle == INVALID_HANDLE_VALUE) - { - if (GetLastError() == ERROR_FILE_NOT_FOUND) - return true; - //else: we have a problem... - if (sink->OnError(Zstring(_("Error traversing directory:")) + wxT(" ") + directoryFormatted) == wxDIR_STOP) - return false; - else - return true; - } - CloseOnExit dummy(searchHandle); - - do - { //don't return "." and ".." - const wxChar* name = fileMetaData.cFileName; - if ( name[0] == wxChar('.') && - ((name[1] == wxChar('.') && name[2] == wxChar('\0')) || - name[1] == wxChar('\0'))) - continue; - - const Zstring fullName = directoryFormatted + name; - if (fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //a directory... + if (searchHandle == INVALID_HANDLE_VALUE) { - switch (sink->OnDir(fullName)) + const DWORD lastError = GetLastError(); + if (lastError == ERROR_FILE_NOT_FOUND) + return true; + + //else: we have a problem... report it: + Zstring errorMessage = Zstring(_("Error traversing directory:")) + wxT("\n\"") + directory + wxT("\" ") ; + if (m_sink->OnError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted(lastError)) == wxDIR_STOP) + return false; + else + return true; + } + CloseOnExit dummy(searchHandle); + + do + { //don't return "." and ".." + const wxChar* name = fileMetaData.cFileName; + if ( name[0] == wxChar('.') && + ((name[1] == wxChar('.') && name[2] == wxChar('\0')) || + name[1] == wxChar('\0'))) + continue; + + const Zstring fullName = directoryFormatted + name; + + if (fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //a directory... { - case wxDIR_IGNORE: - break; - case wxDIR_CONTINUE: - if (!traverseInDetail(fullName, sink, level + 1)) + switch (m_sink->OnDir(fullName)) + { + case wxDIR_IGNORE: + break; + case wxDIR_CONTINUE: + //traverse into symbolic links, junctions, etc. if requested only: + if (m_traverseSymbolicLinks || (~fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) + if (!this->traverse(fullName, level + 1)) + return false; + break; + case wxDIR_STOP: return false; - else + default: + assert(false); break; - case wxDIR_STOP: - return false; - default: - assert(false); - break; + } } - } - else //a file... - { - FileInfo details; - getWin32FileInformation(fileMetaData, details); - - switch (sink->OnFile(fullName, details)) + else //a file... { - case wxDIR_IGNORE: - case wxDIR_CONTINUE: - break; - case wxDIR_STOP: - return false; - default: - assert(false); - break; + FreeFileSync::FileInfo details; + getWin32FileInformation(fileMetaData, details); + + switch (m_sink->OnFile(fullName, details)) + { + case wxDIR_IGNORE: + case wxDIR_CONTINUE: + break; + case wxDIR_STOP: + return false; + default: + assert(false); + break; + } } } - } - while (FindNextFile(searchHandle, // handle to search - &fileMetaData)); // pointer to structure for data on found file + while (FindNextFile(searchHandle, // handle to search + &fileMetaData)); // pointer to structure for data on found file - if (GetLastError() == ERROR_NO_MORE_FILES) - return true; //everything okay - else //an error occured - { - if (sink->OnError(Zstring(_("Error traversing directory:")) + wxT(" ") + directoryFormatted) == wxDIR_STOP) + const DWORD lastError = GetLastError(); + if (lastError == ERROR_NO_MORE_FILES) + return true; //everything okay + + //else: we have a problem... report it: + Zstring errorMessage = Zstring(_("Error traversing directory:")) + wxT("\n\"") + directory + wxT("\" ") ; + if (m_sink->OnError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted(lastError)) == wxDIR_STOP) return false; else return true; - } #elif defined FFS_LINUX - //use standard file traverser and enrich output with additional file information - //could be improved with custom traversing algorithm for optimized performance - EnhancedFileTraverser traverser(sink); + //use standard file traverser and enrich output with additional file information + //could be improved with custom traversing algorithm for optimized performance + EnhancedFileTraverser traverser(m_sink); - wxDir dir(directory.c_str()); - if (dir.IsOpened()) - dir.Traverse(traverser); + wxDir dir(directory.c_str()); + if (dir.IsOpened()) + dir.Traverse(traverser); - return true; + return true; #else - adapt this + adapt this #endif + } + +private: + const bool m_traverseSymbolicLinks; + FreeFileSync::FullDetailFileTraverser* m_sink; +}; + + +void FreeFileSync::traverseInDetail(const Zstring& directory, + const bool traverseSymbolicLinks, + FullDetailFileTraverser* sink) +{ + TraverseRecursively filewalker(traverseSymbolicLinks, sink); + filewalker.traverse(directory, 0); } +#ifdef FFS_WIN +inline +Zstring getDriveName(const Zstring& directoryName) //GetVolume() doesn't work under Linux! +{ + const Zstring volumeName = wxFileName(directoryName.c_str()).GetVolume().c_str(); + if (volumeName.empty()) + return Zstring(); + return volumeName + wxFileName::GetVolumeSeparator().c_str() + GlobalResources::FILE_NAME_SEPARATOR; +} +bool FreeFileSync::isFatDrive(const Zstring& directoryName) +{ + const Zstring driveName = getDriveName(directoryName); + if (driveName.empty()) + return false; + wxChar fileSystem[32]; + if (!GetVolumeInformation(driveName.c_str(), NULL, 0, NULL, NULL, NULL, fileSystem, 32)) + return false; + return Zstring(fileSystem).StartsWith(wxT("FAT")); +} +#endif //FFS_WIN diff --git a/library/fileHandling.h b/library/fileHandling.h index 5578ce91..7a1b1842 100644 --- a/library/fileHandling.h +++ b/library/fileHandling.h @@ -8,7 +8,8 @@ class FileError //Exception class used to notify file/directory copy/delete errors { public: - FileError(const Zstring& txt) : errorMessage(txt) {} + FileError(const Zstring& message) : + errorMessage(message) {} Zstring show() const { @@ -22,20 +23,6 @@ private: namespace FreeFileSync { - void getAllFilesAndDirs(const Zstring& sourceDir, std::vector& files, std::vector& directories) throw(FileError); - - //recycler - bool recycleBinExists(); //test existence of Recycle Bin API on current system - - //file handling - void removeDirectory(const Zstring& directory, const bool useRecycleBin); - void removeFile(const Zstring& filename, const bool useRecycleBin); - void createDirectory(const Zstring& directory, const int level = 0); //level is used internally only - void copyFolderAttributes(const Zstring& source, const Zstring& target); - -//################################ - //custom traverser with detail information about files - struct FileInfo { wxULongLong fileSize; //unit: bytes! @@ -52,8 +39,22 @@ namespace FreeFileSync virtual wxDirTraverseResult OnError(const Zstring& errorText) = 0; }; - bool traverseInDetail(const Zstring& directory, FullDetailFileTraverser* sink, const int level = 0); //return value and level are used internally only -//################################ + //custom traverser with detail information about files + void traverseInDetail(const Zstring& directory, const bool traverseSymbolicLinks, FullDetailFileTraverser* sink); + void getAllFilesAndDirs(const Zstring& sourceDir, std::vector& files, std::vector& directories) throw(FileError); + + //recycler + bool recycleBinExists(); //test existence of Recycle Bin API on current system + + //file handling + void removeDirectory(const Zstring& directory, const bool useRecycleBin); + void removeFile(const Zstring& filename, const bool useRecycleBin); + void createDirectory(const Zstring& directory, const int level = 0); //level is used internally only + void copyFolderAttributes(const Zstring& source, const Zstring& target); + +#ifdef FFS_WIN + bool isFatDrive(const Zstring& directoryName); +#endif //FFS_WIN } diff --git a/library/globalFunctions.cpp b/library/globalFunctions.cpp index eed6dfe9..aeeeed45 100644 --- a/library/globalFunctions.cpp +++ b/library/globalFunctions.cpp @@ -179,7 +179,7 @@ wxString DebugLog::assembleFileName() void DebugLog::write(const wxString& logText) { ++lineCount; - if (lineCount % 10000 == 0) //prevent logfile from becoming too big + if (lineCount % 50000 == 0) //prevent logfile from becoming too big { logFile->Close(); wxRemoveFile(logfileName); diff --git a/library/misc.cpp b/library/misc.cpp index f5c562c7..0b0bf60b 100644 --- a/library/misc.cpp +++ b/library/misc.cpp @@ -25,23 +25,23 @@ void exchangeEscapeChars(wxString& data) switch (value) { case wxChar('\\'): - output+= wxChar('\\'); + output += wxChar('\\'); break; case wxChar('n'): - output+= wxChar('\n'); + output += wxChar('\n'); break; case wxChar('t'): - output+= wxChar('\t'); + output += wxChar('\t'); break; case wxChar('\"'): - output+= wxChar('\"'); + output += wxChar('\"'); break; default: - output+= value; + output += value; } } else - output+= value; + output += value; ++input; } diff --git a/library/processXml.cpp b/library/processXml.cpp index 80ac190b..84783452 100644 --- a/library/processXml.cpp +++ b/library/processXml.cpp @@ -4,8 +4,6 @@ #include #include "globalFunctions.h" -using namespace globalFunctions; -using namespace xmlAccess; //small helper functions bool readXmlElementValue(std::string& output, const TiXmlElement* parent, const std::string& name); @@ -23,7 +21,7 @@ void addXmlElement(TiXmlElement* parent, const std::string& name, const bool val class XmlConfigInput { public: - XmlConfigInput(const wxString& fileName, const XmlType type); + XmlConfigInput(const wxString& fileName, const xmlAccess::XmlType type); ~XmlConfigInput() {} bool loadedSuccessfully() @@ -32,11 +30,11 @@ public: } //read gui settings, all values retrieved are optional, so check for initial values! (== -1) - bool readXmlGuiConfig(XmlGuiConfig& outputCfg); + bool readXmlGuiConfig(xmlAccess::XmlGuiConfig& outputCfg); //read batch settings, all values retrieved are optional - bool readXmlBatchConfig(XmlBatchConfig& outputCfg); + bool readXmlBatchConfig(xmlAccess::XmlBatchConfig& outputCfg); //read global settings, valid for both GUI and batch mode, independent from configuration - bool readXmlGlobalSettings(XmlGlobalSettings& outputCfg); + bool readXmlGlobalSettings(xmlAccess::XmlGlobalSettings& outputCfg); private: //read basic FreefileSync settings (used by commandline and GUI), return true if ALL values have been retrieved successfully @@ -50,17 +48,17 @@ private: class XmlConfigOutput { public: - XmlConfigOutput(const wxString& fileName, const XmlType type); + XmlConfigOutput(const wxString& fileName, const xmlAccess::XmlType type); ~XmlConfigOutput() {} bool writeToFile(); //write gui settings - bool writeXmlGuiConfig(const XmlGuiConfig& outputCfg); + bool writeXmlGuiConfig(const xmlAccess::XmlGuiConfig& outputCfg); //write batch settings - bool writeXmlBatchConfig(const XmlBatchConfig& outputCfg); + bool writeXmlBatchConfig(const xmlAccess::XmlBatchConfig& outputCfg); //write global settings - bool writeXmlGlobalSettings(const XmlGlobalSettings& outputCfg); + bool writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& outputCfg); private: //write basic FreefileSync settings (used by commandline and GUI), return true if everything was written successfully @@ -71,7 +69,7 @@ private: }; -XmlType xmlAccess::getXmlType(const wxString& filename) +xmlAccess::XmlType xmlAccess::getXmlType(const wxString& filename) { if (!wxFileExists(filename)) return XML_OTHER; @@ -107,9 +105,12 @@ XmlType xmlAccess::getXmlType(const wxString& filename) } -XmlGuiConfig xmlAccess::readGuiConfig(const wxString& filename) +xmlAccess::XmlGuiConfig xmlAccess::readGuiConfig(const wxString& filename) { //load XML + if (!wxFileExists(filename)) + throw FileError(Zstring(_("The file does not exist:")) + wxT(" \"") + filename.c_str() + wxT("\"")); + XmlConfigInput inputFile(filename, XML_GUI_CONFIG); XmlGuiConfig outputCfg; @@ -124,9 +125,12 @@ XmlGuiConfig xmlAccess::readGuiConfig(const wxString& filename) } -XmlBatchConfig xmlAccess::readBatchConfig(const wxString& filename) +xmlAccess::XmlBatchConfig xmlAccess::readBatchConfig(const wxString& filename) { //load XML + if (!wxFileExists(filename)) + throw FileError(Zstring(_("The file does not exist:")) + wxT(" \"") + filename.c_str() + wxT("\"")); + XmlConfigInput inputFile(filename, XML_BATCH_CONFIG); XmlBatchConfig outputCfg; @@ -141,9 +145,12 @@ XmlBatchConfig xmlAccess::readBatchConfig(const wxString& filename) } -XmlGlobalSettings xmlAccess::readGlobalSettings() +xmlAccess::XmlGlobalSettings xmlAccess::readGlobalSettings() { //load XML + if (!wxFileExists(FreeFileSync::GLOBAL_CONFIG_FILE)) + throw FileError(Zstring(_("The file does not exist:")) + wxT(" \"") + FreeFileSync::GLOBAL_CONFIG_FILE.c_str() + wxT("\"")); + XmlConfigInput inputFile(FreeFileSync::GLOBAL_CONFIG_FILE, XML_GLOBAL_SETTINGS); XmlGlobalSettings outputCfg; @@ -175,7 +182,7 @@ void xmlAccess::writeBatchConfig(const wxString& filename, const XmlBatchConfig& XmlConfigOutput outputFile(filename, XML_BATCH_CONFIG); //populate and write XML tree - if ( !outputFile.writeXmlBatchConfig(outputCfg) || //add GUI layout configuration settings + if ( !outputFile.writeXmlBatchConfig(outputCfg) || //add batch configuration settings !outputFile.writeToFile()) //save XML throw FileError(Zstring(_("Error writing file:")) + wxT(" \"") + filename.c_str() + wxT("\"")); return; @@ -194,7 +201,7 @@ void xmlAccess::writeGlobalSettings(const XmlGlobalSettings& outputCfg) } -XmlConfigInput::XmlConfigInput(const wxString& fileName, const XmlType type) : +XmlConfigInput::XmlConfigInput(const wxString& fileName, const xmlAccess::XmlType type) : loadSuccess(false) { if (!wxFileExists(fileName)) //avoid wxWidgets error message when wxFFile receives not existing file @@ -217,11 +224,11 @@ XmlConfigInput::XmlConfigInput(const wxString& fileName, const XmlType type) : const char* cfgType = root->Attribute("XmlType"); if (cfgType) { - if (type == XML_GUI_CONFIG) + if (type == xmlAccess::XML_GUI_CONFIG) loadSuccess = std::string(cfgType) == "GUI"; - else if (type == XML_BATCH_CONFIG) + else if (type == xmlAccess::XML_BATCH_CONFIG) loadSuccess = std::string(cfgType) == "BATCH"; - else if (type == XML_GLOBAL_SETTINGS) + else if (type == xmlAccess::XML_GLOBAL_SETTINGS) loadSuccess = std::string(cfgType) == "GLOBAL"; } } @@ -255,7 +262,7 @@ bool readXmlElementValue(int& output, const TiXmlElement* parent, const std::str std::string temp; if (readXmlElementValue(temp, parent, name)) { - output = stringToInt(temp); + output = globalFunctions::stringToInt(temp); return true; } else @@ -308,6 +315,25 @@ bool readXmlElementValue(bool& output, const TiXmlElement* parent, const std::st } +bool readXmlElementValue(xmlAccess::OnError& output, const TiXmlElement* parent, const std::string& name) +{ + std::string dummy; + if (readXmlElementValue(dummy, parent, name)) + { + if (dummy == "Ignore") + output = xmlAccess::ON_ERROR_IGNORE; + else if (dummy == "Exit") + output = xmlAccess::ON_ERROR_EXIT; + else //treat all other input as popup + output = xmlAccess::ON_ERROR_POPUP; + + return true; + } + else + return false; +} + + bool XmlConfigInput::readXmlMainConfig(MainConfiguration& mainCfg, std::vector& directoryPairs) { TiXmlElement* root = doc.RootElement(); @@ -366,13 +392,12 @@ bool XmlConfigInput::readXmlMainConfig(MainConfiguration& mainCfg, std::vectorAttribute("MaximumSize"); + if (histSizeMax) //may be NULL! + outputCfg.gui.cfgHistoryMaxItems = globalFunctions::stringToInt(histSizeMax); + + //load history elements TiXmlElement* cfgFile = TiXmlHandle(cfgHistory).FirstChild("File").ToElement(); while (cfgFile) { @@ -540,7 +592,7 @@ bool XmlConfigInput::readXmlGlobalSettings(XmlGlobalSettings& outputCfg) } -XmlConfigOutput::XmlConfigOutput(const wxString& fileName, const XmlType type) : +XmlConfigOutput::XmlConfigOutput(const wxString& fileName, const xmlAccess::XmlType type) : m_fileName(fileName) { TiXmlBase::SetCondenseWhiteSpace(false); //do not condense whitespace characters @@ -549,11 +601,11 @@ XmlConfigOutput::XmlConfigOutput(const wxString& fileName, const XmlType type) : doc.LinkEndChild(decl); TiXmlElement* root = new TiXmlElement("FreeFileSync"); - if (type == XML_GUI_CONFIG) + if (type == xmlAccess::XML_GUI_CONFIG) root->SetAttribute("XmlType", "GUI"); //xml configuration type - else if (type == XML_BATCH_CONFIG) + else if (type == xmlAccess::XML_BATCH_CONFIG) root->SetAttribute("XmlType", "BATCH"); - else if (type == XML_GLOBAL_SETTINGS) + else if (type == xmlAccess::XML_GLOBAL_SETTINGS) root->SetAttribute("XmlType", "GLOBAL"); else assert(false); @@ -587,7 +639,7 @@ void addXmlElement(TiXmlElement* parent, const std::string& name, const std::str void addXmlElement(TiXmlElement* parent, const std::string& name, const int value) { - addXmlElement(parent, name, numberToString(value)); + addXmlElement(parent, name, globalFunctions::numberToString(value)); } @@ -613,6 +665,19 @@ void addXmlElement(TiXmlElement* parent, const std::string& name, const bool val } +void addXmlElement(TiXmlElement* parent, const std::string& name, const xmlAccess::OnError value) +{ + if (value == xmlAccess::ON_ERROR_IGNORE) + addXmlElement(parent, name, std::string("Ignore")); + else if (value == xmlAccess::ON_ERROR_EXIT) + addXmlElement(parent, name, std::string("Exit")); + else if (value == xmlAccess::ON_ERROR_POPUP) + addXmlElement(parent, name, std::string("Popup")); + else + assert(false); +} + + bool XmlConfigOutput::writeXmlMainConfig(const MainConfiguration& mainCfg, const std::vector& directoryPairs) { TiXmlElement* root = doc.RootElement(); @@ -670,14 +735,13 @@ bool XmlConfigOutput::writeXmlMainConfig(const MainConfiguration& mainCfg, const //other addXmlElement(miscSettings, "UseRecycler", mainCfg.useRecycleBin); - addXmlElement(miscSettings, "IgnoreErrors", mainCfg.ignoreErrors); //########################################################### return true; } -bool XmlConfigOutput::writeXmlGuiConfig(const XmlGuiConfig& outputCfg) +bool XmlConfigOutput::writeXmlGuiConfig(const xmlAccess::XmlGuiConfig& outputCfg) { //write main config if (!writeXmlMainConfig(outputCfg.mainCfg, outputCfg.directoryPairs)) @@ -687,22 +751,24 @@ bool XmlConfigOutput::writeXmlGuiConfig(const XmlGuiConfig& outputCfg) TiXmlElement* root = doc.RootElement(); if (!root) return false; - TiXmlElement* guiLayout = new TiXmlElement("GuiConfig"); - root->LinkEndChild(guiLayout); + TiXmlElement* guiConfig = new TiXmlElement("GuiConfig"); + root->LinkEndChild(guiConfig); TiXmlElement* windows = new TiXmlElement("Windows"); - guiLayout->LinkEndChild(windows); + guiConfig->LinkEndChild(windows); TiXmlElement* mainWindow = new TiXmlElement("Main"); windows->LinkEndChild(mainWindow); addXmlElement(mainWindow, "HideFiltered", outputCfg.hideFilteredElements); + addXmlElement(guiConfig, "IgnoreErrors", outputCfg.ignoreErrors); + return true; } -bool XmlConfigOutput::writeXmlBatchConfig(const XmlBatchConfig& outputCfg) +bool XmlConfigOutput::writeXmlBatchConfig(const xmlAccess::XmlBatchConfig& outputCfg) { //write main config if (!writeXmlMainConfig(outputCfg.mainCfg, outputCfg.directoryPairs)) @@ -716,31 +782,42 @@ bool XmlConfigOutput::writeXmlBatchConfig(const XmlBatchConfig& outputCfg) root->LinkEndChild(batchConfig); addXmlElement(batchConfig, "Silent", outputCfg.silent); + addXmlElement(batchConfig, "HandleError", outputCfg.handleError); return true; } -bool XmlConfigOutput::writeXmlGlobalSettings(const XmlGlobalSettings& outputCfg) +bool XmlConfigOutput::writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& outputCfg) { TiXmlElement* root = doc.RootElement(); if (!root) return false; //################################################################### //write global settings - TiXmlElement* global = new TiXmlElement("Global"); + TiXmlElement* global = new TiXmlElement("Shared"); root->LinkEndChild(global); //program language - addXmlElement(global, "Language", outputCfg.global.programLanguage); + addXmlElement(global, "Language", outputCfg.shared.programLanguage); #ifdef FFS_WIN //daylight saving time check - addXmlElement(global, "HandleDaylightSavingTimeOnFAT", outputCfg.global.handleDstOnFat32); + addXmlElement(global, "HandleDaylightSavingTimeOnFAT", outputCfg.shared.handleDstOnFat32); #endif - //folder dependency check - addXmlElement(global, "FolderDependencyCheckActive", outputCfg.global.folderDependCheckActive); + //traverse into symbolic links (to folders) + addXmlElement(global, "TraverseSymbolicLinks", outputCfg.shared.traverseSymbolicLinks); + + //warnings + TiXmlElement* warnings = new TiXmlElement("Warnings"); + global->LinkEndChild(warnings); + + //warning: dependent folders + addXmlElement(warnings, "CheckForDependentFolders", outputCfg.shared.warningDependentFolders); + + //significant difference check + addXmlElement(warnings, "CheckForSignificantDifference", outputCfg.shared.warningSignificantDifference); //################################################################### @@ -763,17 +840,20 @@ bool XmlConfigOutput::writeXmlGlobalSettings(const XmlGlobalSettings& outputCfg) addXmlElement(mainWindow, "PosY", outputCfg.gui.posYNotMaximized); addXmlElement(mainWindow, "Maximized", outputCfg.gui.isMaximized); + addXmlElement(mainWindow, "ManualDeletionOnBothSides", outputCfg.gui.deleteOnBothSides); + addXmlElement(mainWindow, "ManualDeletionUseRecycler", outputCfg.gui.useRecyclerForManualDeletion); + //write column attributes TiXmlElement* leftColumn = new TiXmlElement("LeftColumns"); mainWindow->LinkEndChild(leftColumn); - XmlGlobalSettings::ColumnAttributes columnAtrribLeftCopy = outputCfg.gui.columnAttribLeft; //can't change const vector + xmlAccess::ColumnAttributes columnAtrribLeftCopy = outputCfg.gui.columnAttribLeft; //can't change const vector sort(columnAtrribLeftCopy.begin(), columnAtrribLeftCopy.end(), xmlAccess::sortByType); for (unsigned int i = 0; i < columnAtrribLeftCopy.size(); ++i) { TiXmlElement* subElement = new TiXmlElement("Column"); leftColumn->LinkEndChild(subElement); - const XmlGlobalSettings::ColumnAttrib& colAttrib = columnAtrribLeftCopy[i]; + const xmlAccess::ColumnAttrib& colAttrib = columnAtrribLeftCopy[i]; if (colAttrib.visible) subElement->SetAttribute("Visible", "true"); else subElement->SetAttribute("Visible", "false"); subElement->SetAttribute("Position", colAttrib.position); @@ -782,14 +862,14 @@ bool XmlConfigOutput::writeXmlGlobalSettings(const XmlGlobalSettings& outputCfg) TiXmlElement* rightColumn = new TiXmlElement("RightColumns"); mainWindow->LinkEndChild(rightColumn); - XmlGlobalSettings::ColumnAttributes columnAtrribRightCopy = outputCfg.gui.columnAttribRight; + xmlAccess::ColumnAttributes columnAtrribRightCopy = outputCfg.gui.columnAttribRight; sort(columnAtrribRightCopy.begin(), columnAtrribRightCopy.end(), xmlAccess::sortByType); for (unsigned int i = 0; i < columnAtrribRightCopy.size(); ++i) { TiXmlElement* subElement = new TiXmlElement("Column"); rightColumn->LinkEndChild(subElement); - const XmlGlobalSettings::ColumnAttrib& colAttrib = columnAtrribRightCopy[i]; + const xmlAccess::ColumnAttrib& colAttrib = columnAtrribRightCopy[i]; if (colAttrib.visible) subElement->SetAttribute("Visible", "true"); else subElement->SetAttribute("Visible", "false"); subElement->SetAttribute("Position", colAttrib.position); @@ -803,10 +883,11 @@ bool XmlConfigOutput::writeXmlGlobalSettings(const XmlGlobalSettings& outputCfg) TiXmlElement* cfgHistory = new TiXmlElement("History"); gui->LinkEndChild(cfgHistory); + cfgHistory->SetAttribute("MaximumSize", globalFunctions::numberToString(outputCfg.gui.cfgHistoryMaxItems)); + for (unsigned int i = 0; i < outputCfg.gui.cfgFileHistory.size(); ++i) addXmlElement(cfgHistory, "File", std::string(outputCfg.gui.cfgFileHistory[i].ToUTF8())); - //################################################################### //write global batch settings @@ -863,9 +944,14 @@ int xmlAccess::retrieveSystemLanguage() //case wxLANGUAGE_JAPANESE: //case wxLANGUAGE_POLISH: - default: - //all the rest: wxLANGUAGE_ENGLISH; return lang; } } + + +void xmlAccess::XmlGlobalSettings::_Shared::resetWarnings() +{ + warningDependentFolders = true; + warningSignificantDifference = true; +} diff --git a/library/processXml.h b/library/processXml.h index 5f3f8ef9..7b838958 100644 --- a/library/processXml.h +++ b/library/processXml.h @@ -9,6 +9,13 @@ using namespace FreeFileSync; namespace xmlAccess { + enum OnError + { + ON_ERROR_POPUP, + ON_ERROR_IGNORE, + ON_ERROR_EXIT + }; + enum XmlType { XML_GUI_CONFIG, @@ -17,28 +24,49 @@ namespace xmlAccess XML_OTHER }; - XmlType getXmlType(const wxString& filename); + enum ColumnTypes + { + FILENAME = 0, + REL_PATH, + SIZE, + DATE, + FULL_NAME + }; + const unsigned COLUMN_TYPE_COUNT = 5; + struct ColumnAttrib + { + ColumnTypes type; + bool visible; + unsigned position; + int width; + }; + typedef std::vector ColumnAttributes; + + XmlType getXmlType(const wxString& filename); +//--------------------------------------------------------------------- struct XmlGuiConfig { - XmlGuiConfig() : hideFilteredElements(false) {} //initialize values + XmlGuiConfig() : hideFilteredElements(false), ignoreErrors(false) {} //initialize values MainConfiguration mainCfg; std::vector directoryPairs; bool hideFilteredElements; + bool ignoreErrors; //reaction on error situation during synchronization }; struct XmlBatchConfig { - XmlBatchConfig() : silent(false) {} + XmlBatchConfig() : silent(false), handleError(ON_ERROR_POPUP) {} MainConfiguration mainCfg; std::vector directoryPairs; bool silent; + OnError handleError; //reaction on error situation during synchronization }; int retrieveSystemLanguage(); @@ -47,40 +75,30 @@ namespace xmlAccess struct XmlGlobalSettings { //--------------------------------------------------------------------- -//internal structures: - enum ColumnTypes - { - FILENAME = 0, - REL_PATH, - SIZE, - DATE - }; - - struct ColumnAttrib - { - ColumnTypes type; - bool visible; - unsigned position; - int width; - }; - typedef std::vector ColumnAttributes; - -//--------------------------------------------------------------------- - struct _Global + struct _Shared { - _Global() : + _Shared() : programLanguage(retrieveSystemLanguage()), #ifdef FFS_WIN handleDstOnFat32(true), #endif - folderDependCheckActive(true) {} + traverseSymbolicLinks(false) + { + resetWarnings(); + } int programLanguage; #ifdef FFS_WIN bool handleDstOnFat32; #endif - bool folderDependCheckActive; - } global; + bool traverseSymbolicLinks; + + //warnings + void resetWarnings(); + + bool warningDependentFolders; + bool warningSignificantDifference; + } shared; //--------------------------------------------------------------------- struct _Gui @@ -92,10 +110,13 @@ namespace xmlAccess posYNotMaximized(wxDefaultCoord), isMaximized(false), #ifdef FFS_WIN - commandLineFileManager(wxT("explorer /select, %x")) + commandLineFileManager(wxT("explorer /select, %name")), #elif defined FFS_LINUX - commandLineFileManager(wxT("konqueror \"%path\"")) + commandLineFileManager(wxT("konqueror \"%path\"")), #endif + cfgHistoryMaxItems(10), + deleteOnBothSides(false), + useRecyclerForManualDeletion(FreeFileSync::recycleBinExists()) //enable if OS supports it; else user will have to activate first and then get an error message {} int widthNotMaximized; @@ -106,8 +127,11 @@ namespace xmlAccess ColumnAttributes columnAttribLeft; ColumnAttributes columnAttribRight; - std::vector cfgFileHistory; wxString commandLineFileManager; + std::vector cfgFileHistory; + unsigned cfgHistoryMaxItems; + bool deleteOnBothSides; + bool useRecyclerForManualDeletion; } gui; //--------------------------------------------------------------------- @@ -116,21 +140,21 @@ namespace xmlAccess inline - bool sortByType(const XmlGlobalSettings::ColumnAttrib& a, const XmlGlobalSettings::ColumnAttrib& b) + bool sortByType(const ColumnAttrib& a, const ColumnAttrib& b) { return a.type < b.type; } inline - bool sortByPositionOnly(const XmlGlobalSettings::ColumnAttrib& a, const XmlGlobalSettings::ColumnAttrib& b) + bool sortByPositionOnly(const ColumnAttrib& a, const ColumnAttrib& b) { return a.position < b.position; } inline - bool sortByPositionAndVisibility(const XmlGlobalSettings::ColumnAttrib& a, const XmlGlobalSettings::ColumnAttrib& b) + bool sortByPositionAndVisibility(const ColumnAttrib& a, const ColumnAttrib& b) { if (a.visible == false) //hidden elements shall appear at end of vector return false; diff --git a/library/resources.cpp b/library/resources.cpp index c60c259c..4a9d0369 100644 --- a/library/resources.cpp +++ b/library/resources.cpp @@ -64,10 +64,14 @@ GlobalResources::GlobalResources() bitmapResource[wxT("filter active.png")] = (bitmapFilterOn = new wxBitmap(wxNullBitmap)); bitmapResource[wxT("filter not active.png")] = (bitmapFilterOff = new wxBitmap(wxNullBitmap)); bitmapResource[wxT("warning.png")] = (bitmapWarning = new wxBitmap(wxNullBitmap)); + bitmapResource[wxT("warningSmall.png")] = (bitmapWarningSmall = new wxBitmap(wxNullBitmap)); + bitmapResource[wxT("error.png")] = (bitmapError = new wxBitmap(wxNullBitmap)); bitmapResource[wxT("small arrow up.png"]) = (bitmapSmallUp = new wxBitmap(wxNullBitmap)); bitmapResource[wxT("small arrow down.png")] = (bitmapSmallDown = new wxBitmap(wxNullBitmap)); bitmapResource[wxT("save.png")] = (bitmapSave = new wxBitmap(wxNullBitmap)); + bitmapResource[wxT("load.png")] = (bitmapLoad = new wxBitmap(wxNullBitmap)); bitmapResource[wxT("FFS.png")] = (bitmapFFS = new wxBitmap(wxNullBitmap)); + bitmapResource[wxT("FFS paused.png")] = (bitmapFFSPaused = new wxBitmap(wxNullBitmap)); bitmapResource[wxT("deleteFile.png")] = (bitmapDeleteFile = new wxBitmap(wxNullBitmap)); bitmapResource[wxT("gpl.png")] = (bitmapGPL = new wxBitmap(wxNullBitmap)); bitmapResource[wxT("statusPause.png")] = (bitmapStatusPause = new wxBitmap(wxNullBitmap)); @@ -102,6 +106,8 @@ GlobalResources::GlobalResources() //init all the other resource files animationMoney = new wxAnimation(wxNullAnimation); animationSync = new wxAnimation(wxNullAnimation); + + programIcon = &wxNullIcon; } diff --git a/library/resources.h b/library/resources.h index 4eec185e..24e8d027 100644 --- a/library/resources.h +++ b/library/resources.h @@ -63,10 +63,14 @@ public: wxBitmap* bitmapFilterOn; wxBitmap* bitmapFilterOff; wxBitmap* bitmapWarning; + wxBitmap* bitmapWarningSmall; + wxBitmap* bitmapError; wxBitmap* bitmapSmallUp; wxBitmap* bitmapSmallDown; wxBitmap* bitmapSave; + wxBitmap* bitmapLoad; wxBitmap* bitmapFFS; + wxBitmap* bitmapFFSPaused; wxBitmap* bitmapDeleteFile; wxBitmap* bitmapGPL; wxBitmap* bitmapStatusPause; diff --git a/library/sorting.h b/library/sorting.h index fabdad1f..23c219b9 100644 --- a/library/sorting.h +++ b/library/sorting.h @@ -106,24 +106,34 @@ bool sortByFileName(const FileCompareLine& a, const FileCompareLine& b) return false; //empty rows always last else if (descrLineB->objType == FileDescrLine::TYPE_NOTHING) return true; //empty rows always last - else if (descrLineA->objType == FileDescrLine::TYPE_DIRECTORY) - return false; - else if (descrLineB->objType == FileDescrLine::TYPE_DIRECTORY) - return true; + + + if (descrLineA->objType == FileDescrLine::TYPE_DIRECTORY) //sort directories by relative name + { + if (descrLineB->objType == FileDescrLine::TYPE_DIRECTORY) + return stringSmallerThan(descrLineA->relativeName.c_str(), descrLineB->relativeName.c_str()); + else + return false; + } else { - const wxChar* stringA = descrLineA->relativeName.c_str(); - const wxChar* stringB = descrLineB->relativeName.c_str(); + if (descrLineB->objType == FileDescrLine::TYPE_DIRECTORY) + return true; + else + { + const wxChar* stringA = descrLineA->relativeName.c_str(); + const wxChar* stringB = descrLineB->relativeName.c_str(); - size_t pos = descrLineA->relativeName.Find(GlobalResources::FILE_NAME_SEPARATOR, true); //start search beginning from end - if (pos != std::string::npos) - stringA += pos + 1; + size_t pos = descrLineA->relativeName.Find(GlobalResources::FILE_NAME_SEPARATOR, true); //start search beginning from end + if (pos != std::string::npos) + stringA += pos + 1; - pos = descrLineB->relativeName.Find(GlobalResources::FILE_NAME_SEPARATOR, true); //start search beginning from end - if (pos != std::string::npos) - stringB += pos + 1; + pos = descrLineB->relativeName.Find(GlobalResources::FILE_NAME_SEPARATOR, true); //start search beginning from end + if (pos != std::string::npos) + stringB += pos + 1; - return stringSmallerThan(stringA, stringB); + return stringSmallerThan(stringA, stringB); + } } } @@ -205,7 +215,7 @@ bool sortByRelativeName(const FileCompareLine& a, const FileCompareLine& b) template inline -bool sortByFileSize(const FileCompareLine& a, const FileCompareLine& b) +bool sortByFullName(const FileCompareLine& a, const FileCompareLine& b) { const FileDescrLine* descrLineA = NULL; const FileDescrLine* descrLineB = NULL; @@ -216,14 +226,50 @@ bool sortByFileSize(const FileCompareLine& a, const FileCompareLine& b) return false; //empty rows always last else if (descrLineB->objType == FileDescrLine::TYPE_NOTHING) return true; //empty rows always last - else if (descrLineA->objType == FileDescrLine::TYPE_DIRECTORY) - return false; - else if (descrLineB->objType == FileDescrLine::TYPE_DIRECTORY) - return true; else +#ifdef FFS_WIN //case-insensitive comparison! + return sortAscending ? + FreeFileSync::compareStringsWin32(descrLineA->fullName.c_str(), descrLineB->fullName.c_str()) < 0 : //way faster than wxString::CmpNoCase() in windows build!!! + FreeFileSync::compareStringsWin32(descrLineA->fullName.c_str(), descrLineB->fullName.c_str()) > 0; +#else return sortAscending ? - descrLineA->fileSize < descrLineB->fileSize : - descrLineA->fileSize > descrLineB->fileSize; + descrLineA->fullName.Cmp(descrLineB->fullName) < 0 : + descrLineA->fullName.Cmp(descrLineB->fullName) > 0; +#endif +} + + +template +inline +bool sortByFileSize(const FileCompareLine& a, const FileCompareLine& b) +{ + const FileDescrLine* descrLineA = NULL; + const FileDescrLine* descrLineB = NULL; + getDescrLine(a, b, descrLineA, descrLineB); + + //presort types: first files, then directories then empty rows + if (descrLineA->objType == FileDescrLine::TYPE_NOTHING) + return false; //empty rows always last + else if (descrLineB->objType == FileDescrLine::TYPE_NOTHING) + return true; //empty rows always last + + + if (descrLineA->objType == FileDescrLine::TYPE_DIRECTORY) //sort directories by relative name + { + if (descrLineB->objType == FileDescrLine::TYPE_DIRECTORY) + return stringSmallerThan(descrLineA->relativeName.c_str(), descrLineB->relativeName.c_str()); + else + return false; + } + else + { + if (descrLineB->objType == FileDescrLine::TYPE_DIRECTORY) + return true; + else + return sortAscending ? + descrLineA->fileSize > descrLineB->fileSize : //sortAscending == true shall result in list beginning with largest files first + descrLineA->fileSize < descrLineB->fileSize; + } } @@ -240,14 +286,23 @@ bool sortByDate(const FileCompareLine& a, const FileCompareLine& b) return false; //empty rows always last else if (descrLineB->objType == FileDescrLine::TYPE_NOTHING) return true; //empty rows always last - else if (descrLineA->objType == FileDescrLine::TYPE_DIRECTORY) - return false; - else if (descrLineB->objType == FileDescrLine::TYPE_DIRECTORY) - return true; + + if (descrLineA->objType == FileDescrLine::TYPE_DIRECTORY) //sort directories by relative name + { + if (descrLineB->objType == FileDescrLine::TYPE_DIRECTORY) + return stringSmallerThan(descrLineA->relativeName.c_str(), descrLineB->relativeName.c_str()); + else + return false; + } else - return sortAscending ? - descrLineA->lastWriteTimeRaw < descrLineB->lastWriteTimeRaw : - descrLineA->lastWriteTimeRaw > descrLineB->lastWriteTimeRaw; + { + if (descrLineB->objType == FileDescrLine::TYPE_DIRECTORY) + return true; + else + return sortAscending ? + descrLineA->lastWriteTimeRaw < descrLineB->lastWriteTimeRaw : + descrLineA->lastWriteTimeRaw > descrLineB->lastWriteTimeRaw; + } } diff --git a/library/statusHandler.h b/library/statusHandler.h index bae1de8e..208a2df8 100644 --- a/library/statusHandler.h +++ b/library/statusHandler.h @@ -10,7 +10,7 @@ bool updateUiIsAllowed(); //test if a specific amount of time is over void updateUiNow(); //do the updating -//interfaces for status updates (can be implemented by UI or commandline) +//interfaces for status updates (can be implemented by GUI or Batch mode) //overwrite virtual methods for respective functionality class ErrorHandler @@ -24,15 +24,14 @@ public: IGNORE_ERROR = 10, RETRY }; - virtual Response reportError(const Zstring& text) = 0; + virtual Response reportError(const Zstring& errorMessage) = 0; }; class StatusHandler { public: - StatusHandler() : - abortRequested(false) {} + StatusHandler() : abortRequested(false) {} virtual ~StatusHandler() {} //identifiers of different processes @@ -48,7 +47,6 @@ public: virtual void updateStatusText(const Zstring& 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 ErrorHandler::Response reportError(const Zstring& text) = 0; //this method is triggered repeatedly by requestUiRefresh() and can be used to refresh the ui by dispatching pending events virtual void forceUiRefresh() = 0; @@ -66,6 +64,11 @@ public: abortRequested = true; } + //error handling: + virtual ErrorHandler::Response reportError(const Zstring& errorMessage) = 0; //recoverable error situation + virtual void reportFatalError(const Zstring& errorMessage) = 0; //non-recoverable error situation, implement abort! + virtual void reportWarning(const Zstring& warningMessage, bool& dontShowAgain) = 0; + protected: virtual void abortThisProcess() = 0; diff --git a/library/zstring.cpp b/library/zstring.cpp index 35704b01..27633392 100644 --- a/library/zstring.cpp +++ b/library/zstring.cpp @@ -24,29 +24,23 @@ void testZstringForMemoryLeak() #ifdef FFS_WIN -int FreeFileSync::compareStringsWin32(const wchar_t* a, const wchar_t* b) -{ - return lstrcmpi( - a, //address of first string - b); //address of second string -} - - -//equivalent implementation, but slightly(!!!) slower: int FreeFileSync::compareStringsWin32(const wchar_t* a, const wchar_t* b, const int aCount, const int bCount) { - int rv = CompareString( - LOCALE_USER_DEFAULT, //locale identifier - NORM_IGNORECASE, //comparison-style options - a, //pointer to first string - aCount, //size, in bytes or characters, of first string - b, //pointer to second string - bCount); //size, in bytes or characters, of second string + //DON'T use lstrcmpi() here! It uses word sort, which unfortunately is NOT always a strict weak sorting function for some locales (e.g. swedish) + //Use CompareString() with "SORT_STRINGSORT" instead!!! + + const int rv = CompareString( + LOCALE_USER_DEFAULT, //locale identifier + NORM_IGNORECASE | SORT_STRINGSORT, //comparison-style options + a, //pointer to first string + aCount, //size, in bytes or characters, of first string + b, //pointer to second string + bCount); //size, in bytes or characters, of second string if (rv == 0) throw RuntimeException(wxString(wxT("Error comparing strings!"))); else - return rv - 2; + return rv - 2; //convert to C-style string compare result } #endif diff --git a/library/zstring.h b/library/zstring.h index 9013dd22..60ba464c 100644 --- a/library/zstring.h +++ b/library/zstring.h @@ -14,8 +14,7 @@ namespace FreeFileSync { #ifdef FFS_WIN //super fast case-insensitive string comparison: way faster than wxString::CmpNoCase()!!! - int compareStringsWin32(const wchar_t* a, const wchar_t* b); - int compareStringsWin32(const wchar_t* a, const wchar_t* b, const int aCount, const int bCount); + int compareStringsWin32(const wchar_t* a, const wchar_t* b, const int aCount = -1, const int bCount = -1); #endif //FFS_WIN } @@ -322,11 +321,11 @@ void Zstring::incRef() const inline void Zstring::decRef() { - assert(descr && descr->refCount >= 1); + assert(descr && descr->refCount >= 1); //descr points to the begin of the allocated memory block if (--descr->refCount == 0) { - assert(descr); //descr points to the begin of the allocated memory block free(descr); //this must NEVER be changed!! E.g. Trim() relies on descr being start of allocated memory block + descr = 0; #ifdef __WXDEBUG__ --allocCount; //test Zstring for memory leaks #endif @@ -345,7 +344,7 @@ int Zstring::CmpNoCase(const DefaultChar* other) const inline int Zstring::CmpNoCase(const Zstring& other) const { - return FreeFileSync::compareStringsWin32(c_str(), other.c_str()); //way faster than wxString::CmpNoCase()!! + return FreeFileSync::compareStringsWin32(c_str(), other.c_str(), length(), other.length()); //way faster than wxString::CmpNoCase()!! } #endif diff --git a/synchronization.cpp b/synchronization.cpp index 487bceb9..d54101fd 100644 --- a/synchronization.cpp +++ b/synchronization.cpp @@ -3,46 +3,18 @@ #include #include #include "library/multithreading.h" +#include "library/resources.h" +#include "algorithm.h" -#ifdef FFS_LINUX +#ifdef FFS_WIN +#include //includes "windows.h" +#elif defined FFS_LINUX #include #endif // FFS_LINUX using namespace FreeFileSync; -SyncProcess::SyncProcess(bool useRecycler, bool lineBreakOnMessages, StatusHandler* handler) : - useRecycleBin(useRecycler), - statusUpdater(handler), - txtCopyingFile(_("Copying file %x to %y")), - txtOverwritingFile(_("Copying file %x overwriting %y")), - txtCreatingFolder(_("Creating folder %x")), - txtDeletingFile(_("Deleting file %x")), - txtDeletingFolder(_("Deleting folder %x")) -{ - if (lineBreakOnMessages) - { - txtCopyingFile.Replace( wxT("%x"), wxT("\n\"%x\""), false); - txtCopyingFile.Replace( wxT("%y"), wxT("\n\"%y\""), false); - txtOverwritingFile.Replace(wxT("%x"), wxT("\n\"%x\""), false); - txtOverwritingFile.Replace(wxT("%y"), wxT("\n\"%y\""), false); - txtCreatingFolder.Replace( wxT("%x"), wxT("\n\"%x\""), false); - txtDeletingFile.Replace( wxT("%x"), wxT("\n\"%x\""), false); - txtDeletingFolder.Replace( wxT("%x"), wxT("\n\"%x\""), false); - } - else - { - txtCopyingFile.Replace( wxT("%x"), wxT("\"%x\""), false); - txtCopyingFile.Replace( wxT("%y"), wxT("\"%y\""), false); - txtOverwritingFile.Replace(wxT("%x"), wxT("\"%x\""), false); - txtOverwritingFile.Replace(wxT("%y"), wxT("\"%y\""), false); - txtCreatingFolder.Replace( wxT("%x"), wxT("\"%x\""), false); - txtDeletingFile.Replace( wxT("%x"), wxT("\"%x\""), false); - txtDeletingFolder.Replace( wxT("%x"), wxT("\"%x\""), false); - } -} - - inline SyncConfiguration::Direction getSyncDirection(const CompareFilesResult cmpResult, const SyncConfiguration& config) { @@ -75,6 +47,7 @@ SyncConfiguration::Direction getSyncDirection(const CompareFilesResult cmpResult } +inline bool getBytesToTransfer(int& objectsToCreate, int& objectsToOverwrite, int& objectsToDelete, @@ -157,9 +130,97 @@ bool getBytesToTransfer(int& objectsToCreate, return true; } + +void FreeFileSync::calcTotalBytesToSync(const FileCompareResult& fileCmpResult, + const SyncConfiguration& config, + int& objectsToCreate, + int& objectsToOverwrite, + int& objectsToDelete, + double& dataToProcess) +{ + 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::synchronizationNeeded(const FileCompareResult& fileCmpResult, const SyncConfiguration& config) +{ + int objectsToCreate = 0; + int objectsToOverwrite = 0; + int objectsToDelete = 0; + double dataToProcess = 0; + FreeFileSync::calcTotalBytesToSync(fileCmpResult, + config, + objectsToCreate, + objectsToOverwrite, + objectsToDelete, + dataToProcess); + return objectsToCreate + objectsToOverwrite + objectsToDelete != 0; +} + + +//test if more then 50% of files will be deleted/overwritten +bool significantDifferenceDetected(const FileCompareResult& fileCmpResult, const SyncConfiguration& config) +{ + int objectsToCreate = 0; + int objectsToOverwrite = 0; + int objectsToDelete = 0; + double dataToProcess = 0; + FreeFileSync::calcTotalBytesToSync(fileCmpResult, + config, + objectsToCreate, + objectsToOverwrite, + objectsToDelete, + dataToProcess); + + const int changedFiles = objectsToOverwrite + objectsToDelete; + + return changedFiles >= 10 && changedFiles > .5 * fileCmpResult.size(); +} + + +SyncProcess::SyncProcess(const bool useRecycler, bool& warningSignificantDifference, StatusHandler* handler) : + useRecycleBin(useRecycler), + m_warningSignificantDifference(warningSignificantDifference), + statusUpdater(handler), + txtCopyingFile(_("Copying file %x to %y")), + txtOverwritingFile(_("Copying file %x overwriting %y")), + txtCreatingFolder(_("Creating folder %x")), + txtDeletingFile(_("Deleting file %x")), + txtDeletingFolder(_("Deleting folder %x")) +{ + txtCopyingFile.Replace( wxT("%x"), wxT("\n\"%x\""), false); + txtCopyingFile.Replace( wxT("%y"), wxT("\n\"%y\""), false); + txtOverwritingFile.Replace(wxT("%x"), wxT("\n\"%x\""), false); + txtOverwritingFile.Replace(wxT("%y"), wxT("\n\"%y\""), false); + txtCreatingFolder.Replace( wxT("%x"), wxT("\n\"%x\""), false); + txtDeletingFile.Replace( wxT("%x"), wxT("\n\"%x\""), false); + txtDeletingFolder.Replace( wxT("%x"), wxT("\n\"%x\""), false); +} + + void copyfileMultithreaded(const Zstring& source, const Zstring& target, StatusHandler* updateClass); +inline bool SyncProcess::synchronizeFile(const FileCompareLine& cmpLine, const SyncConfiguration& config) { //return false if nothing had to be done @@ -186,7 +247,7 @@ bool SyncProcess::synchronizeFile(const FileCompareLine& cmpLine, const SyncConf statusText = txtCopyingFile; statusText.Replace(wxT("%x"), cmpLine.fileDescrLeft.fullName, false); - statusText.Replace(wxT("%y"), cmpLine.fileDescrRight.directory, false); + statusText.Replace(wxT("%y"), target, false); statusUpdater->updateStatusText(statusText); copyfileMultithreaded(cmpLine.fileDescrLeft.fullName, target, statusUpdater); @@ -206,7 +267,7 @@ bool SyncProcess::synchronizeFile(const FileCompareLine& cmpLine, const SyncConf statusText = txtCopyingFile; statusText.Replace(wxT("%x"), cmpLine.fileDescrRight.fullName, false); - statusText.Replace(wxT("%y"), cmpLine.fileDescrLeft.directory, false); + statusText.Replace(wxT("%y"), target, false); statusUpdater->updateStatusText(statusText); copyfileMultithreaded(cmpLine.fileDescrRight.fullName, target, statusUpdater); @@ -265,6 +326,7 @@ bool SyncProcess::synchronizeFile(const FileCompareLine& cmpLine, const SyncConf } +inline bool SyncProcess::synchronizeFolder(const FileCompareLine& cmpLine, const SyncConfiguration& config) { //false if nothing was to be done assert (statusUpdater); @@ -296,7 +358,7 @@ bool SyncProcess::synchronizeFolder(const FileCompareLine& cmpLine, const SyncCo //some check to catch the error that directory on source has been deleted externally after "compare"... if (!wxDirExists(cmpLine.fileDescrLeft.fullName)) - throw FileError(Zstring(_("Error: Source directory does not exist anymore:")) + wxT(" \"") + cmpLine.fileDescrLeft.fullName + wxT("\"")); + throw FileError(Zstring(_("Error: Source directory does not exist anymore:")) + wxT("\n\"") + cmpLine.fileDescrLeft.fullName + wxT("\"")); createDirectory(target); copyFolderAttributes(cmpLine.fileDescrLeft.fullName, target); break; @@ -319,7 +381,7 @@ bool SyncProcess::synchronizeFolder(const FileCompareLine& cmpLine, const SyncCo //some check to catch the error that directory on source has been deleted externally after "compare"... if (!wxDirExists(cmpLine.fileDescrRight.fullName)) - throw FileError(Zstring(_("Error: Source directory does not exist anymore:")) + wxT(" \"") + cmpLine.fileDescrRight.fullName + wxT("\"")); + throw FileError(Zstring(_("Error: Source directory does not exist anymore:")) + wxT("\n\"") + cmpLine.fileDescrRight.fullName + wxT("\"")); createDirectory(target); copyFolderAttributes(cmpLine.fileDescrRight.fullName, target); break; @@ -352,27 +414,26 @@ bool SyncProcess::synchronizeFolder(const FileCompareLine& cmpLine, const SyncCo 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)) + 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! +class RemoveAtExit //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) - {} + RemoveAtExit(FileCompareResult& grid) : + gridToWrite(grid) {} - ~AlwaysWriteToGrid() + ~RemoveAtExit() { removeRowsFromVector(gridToWrite, rowsProcessed); } - void rowProcessedSuccessfully(int nr) + void removeRow(int nr) { rowsProcessed.insert(nr); } @@ -392,7 +453,28 @@ void SyncProcess::startSynchronizationProcess(FileCompareResult& grid, const Syn wxLogNull noWxLogs; //prevent wxWidgets logging #endif - AlwaysWriteToGrid writeOutput(grid); //ensure that grid is always written to, even if method is exitted via exceptions + //some basic checks: + //test existence of Recycle Bin + if (useRecycleBin && !FreeFileSync::recycleBinExists()) + { + statusUpdater->reportFatalError(_("Unable to initialize Recycle Bin!")); + return; //should be obsolete! + } + + //check if more than 50% of files/dirs are to be overwritten/deleted + if (m_warningSignificantDifference) //test if check should be executed + { + if (significantDifferenceDetected(grid, config)) + { + bool dontShowAgain = false; + statusUpdater->reportWarning(_("Significant difference detected: More than 50% of files will be overwritten/deleted!"), + dontShowAgain); + m_warningSignificantDifference = !dontShowAgain; + } + } + + + RemoveAtExit markForRemoval(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; @@ -414,7 +496,7 @@ void SyncProcess::startSynchronizationProcess(FileCompareResult& grid, const Syn // 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: + //synchronize folders first; advantage: in case of deletions the whole folder is moved to recycle bin instead of single files for (FileCompareResult::const_iterator i = grid.begin(); i != grid.end(); ++i) { if ( i->fileDescrLeft.objType == FileDescrLine::TYPE_DIRECTORY || @@ -429,15 +511,14 @@ void SyncProcess::startSynchronizationProcess(FileCompareResult& grid, const Syn { if (synchronizeFolder(*i, config)) //progress indicator update - //indicator is updated only if directory is synched correctly (and if some sync was done)! + //indicator is updated only if directory is sync'ed correctly (and if some work was done)! statusUpdater->updateProcessedData(1, 0); //each call represents one processed file/directory - writeOutput.rowProcessedSuccessfully(i - grid.begin()); + markForRemoval.removeRow(i - grid.begin()); break; } catch (FileError& error) { - //if (updateClass) -> is mandatory ErrorHandler::Response rv = statusUpdater->reportError(error.show()); if ( rv == ErrorHandler::IGNORE_ERROR) @@ -451,6 +532,8 @@ void SyncProcess::startSynchronizationProcess(FileCompareResult& grid, const Syn } } + //PERF_START; + //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) @@ -489,12 +572,11 @@ void SyncProcess::startSynchronizationProcess(FileCompareResult& grid, const Syn statusUpdater->updateProcessedData(objectsToCreate + objectsToOverwrite + objectsToDelete, dataToProcess); } - writeOutput.rowProcessedSuccessfully(i - grid.begin()); + markForRemoval.removeRow(i - grid.begin()); break; } catch (FileError& error) { - //if (updateClass) -> is mandatory ErrorHandler::Response rv = statusUpdater->reportError(error.show()); if ( rv == ErrorHandler::IGNORE_ERROR) @@ -512,9 +594,8 @@ void SyncProcess::startSynchronizationProcess(FileCompareResult& grid, const Syn } catch (const RuntimeException& theException) { - wxMessageBox(theException.show(), _("An exception occured!"), wxOK | wxICON_ERROR); - statusUpdater->requestAbortion(); - return; + statusUpdater->reportFatalError(theException.show().c_str()); + return; //should be obsolete! } } @@ -535,21 +616,56 @@ public: Zstring errorMessage; private: - void longRunner() //virtual impl. + virtual void longRunner() { + //create folders first (see http://sourceforge.net/tracker/index.php?func=detail&aid=2628943&group_id=234430&atid=1093080) + try + { + const Zstring targetDir = target.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR); + if (!wxDirExists(targetDir.c_str())) + { + FreeFileSync::createDirectory(targetDir); + } + } + catch (FileError& e) + { + success = false; + errorMessage = e.show(); + return; + } + + +#ifdef FFS_WIN +//const DWORD COPY_FILE_COPY_SYMLINK = 0x00000800; + + if (!CopyFileEx( //same performance as CopyFile() + source.c_str(), + target.c_str(), + NULL, + NULL, + NULL, + COPY_FILE_FAIL_IF_EXISTS)) + { + success = false; + errorMessage = Zstring(_("Error copying file:")) + wxT("\n\"") + source + wxT("\" -> \"") + target + wxT("\""); + errorMessage += Zstring(wxT("\n\n")); + errorMessage += FreeFileSync::getLastErrorFormatted(); //some additional windows error information + return; + } + +#elif defined FFS_LINUX //copying files with Linux does not preserve the modification time => adapt after copying if (!wxCopyFile(source.c_str(), target.c_str(), false)) //abort if file exists { success = false; - errorMessage = Zstring(_("Error copying file:")) + wxT(" \"") + source + wxT("\" -> \"") + target + wxT("\""); + errorMessage = Zstring(_("Error copying file:")) + wxT("\n\"") + source + 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 = Zstring(_("Could not retrieve file info for:")) + wxT(" \"") + source + wxT("\""); + errorMessage = Zstring(_("Could not retrieve file info for:")) + wxT("\n\"") + source + wxT("\""); return; } @@ -560,7 +676,7 @@ private: if (utime(target.c_str(), &newTimes) != 0) { success = false; - errorMessage = Zstring(_("Error changing modification time:")) + wxT(" \"") + target + wxT("\""); + errorMessage = Zstring(_("Error changing modification time:")) + wxT("\n\"") + target + wxT("\""); return; } #endif // FFS_LINUX @@ -572,7 +688,7 @@ private: void copyfileMultithreaded(const Zstring& source, const Zstring& target, StatusHandler* updateClass) { - static UpdateWhileCopying copyAndUpdate; //single instantiation: after each execution thread enters wait phase + static UpdateWhileCopying copyAndUpdate; //single instantiation: thread enters wait phase after each execution copyAndUpdate.waitUntilReady(); @@ -586,49 +702,3 @@ void copyfileMultithreaded(const Zstring& source, const Zstring& target, StatusH if (!copyAndUpdate.success) throw FileError(copyAndUpdate.errorMessage); } - - -void FreeFileSync::calcTotalBytesToSync(const FileCompareResult& fileCmpResult, - const SyncConfiguration& config, - int& objectsToCreate, - int& objectsToOverwrite, - int& objectsToDelete, - double& dataToProcess) -{ - 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::synchronizationNeeded(const FileCompareResult& fileCmpResult, const SyncConfiguration& config) -{ - int objectsToCreate = 0; - int objectsToOverwrite = 0; - int objectsToDelete = 0; - double dataToProcess = 0; - FreeFileSync::calcTotalBytesToSync(fileCmpResult, - config, - objectsToCreate, - objectsToOverwrite, - objectsToDelete, - dataToProcess); - return objectsToCreate + objectsToOverwrite + objectsToDelete != 0; -} diff --git a/synchronization.h b/synchronization.h index 7e80dc7b..e7d6f474 100644 --- a/synchronization.h +++ b/synchronization.h @@ -20,7 +20,9 @@ namespace FreeFileSync class SyncProcess { public: - SyncProcess(bool useRecycler, bool lineBreakOnMessages, StatusHandler* handler); + SyncProcess(const bool useRecycler, + bool& warningSignificantDifference, + StatusHandler* handler); void startSynchronizationProcess(FileCompareResult& grid, const SyncConfiguration& config) throw(AbortThisProcess); @@ -29,6 +31,7 @@ namespace FreeFileSync bool synchronizeFolder(const FileCompareLine& cmpLine, const SyncConfiguration& config); //false if nothing had to be done const bool useRecycleBin; + bool& m_warningSignificantDifference; StatusHandler* statusUpdater; //preload status texts diff --git a/ui/MainDialog.cpp b/ui/MainDialog.cpp index ead2084f..aa630122 100644 --- a/ui/MainDialog.cpp +++ b/ui/MainDialog.cpp @@ -1,10 +1,8 @@ /*************************************************************** - * Name: FreeFileSyncMain.cpp - * Purpose: Code for Application Frame + * Purpose: Code for main dialog * Author: ZenJu (zhnmju123@gmx.de) * Created: 2008-07-16 * Copyright: ZenJu () - * License: **************************************************************/ #include "mainDialog.h" @@ -22,41 +20,33 @@ #include "../synchronization.h" #include "../algorithm.h" -using namespace globalFunctions; -using namespace xmlAccess; - - -extern const wxGrid* leadGrid = NULL; MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale* language, xmlAccess::XmlGlobalSettings& settings) : MainDialogGenerated(frame), globalSettings(settings), + contextMenu(new wxMenu), //initialize right-click context menu; will be dynamically re-created on each R-mouse-click programLanguage(language), filteringInitialized(false), filteringPending(false), synchronizationEnabled(false), - restartOnExit(false), - cmpStatusHandlerTmp(0) + cmpStatusHandlerTmp(0), + cleanedUp(false), + lastSortColumn(-1), + lastSortGrid(NULL), + leadGrid(NULL) { //initialize and load configuration readGlobalSettings(); readConfigurationFromXml(cfgFileName, true); - leftOnlyFilesActive = true; - leftNewerFilesActive = true; - differentFilesActive = true; - rightNewerFilesActive = true; //do not save/load these bool values from harddisk! - rightOnlyFilesActive = true; //it's more convenient to have them defaulted at startup - equalFilesActive = false; - updateViewFilterButtons(); - //set icons for this dialog m_bpButton10->SetBitmapLabel(*globalResource.bitmapExit); m_buttonCompare->setBitmapFront(*globalResource.bitmapCompare); m_buttonSync->setBitmapFront(*globalResource.bitmapSync); m_bpButtonSwap->SetBitmapLabel(*globalResource.bitmapSwap); m_bpButton14->SetBitmapLabel(*globalResource.bitmapHelp); - m_bpButton201->SetBitmapLabel(*globalResource.bitmapSave); + m_bpButtonSave->SetBitmapLabel(*globalResource.bitmapSave); + m_bpButtonLoad->SetBitmapLabel(*globalResource.bitmapLoad); m_bpButtonAddPair->SetBitmapLabel(*globalResource.bitmapAddFolderPair); m_bpButtonRemovePair->SetBitmapLabel(*globalResource.bitmapRemoveFolderPair); m_bpButtonRemovePair->SetBitmapDisabled(*globalResource.bitmapRemoveFolderPairD); @@ -81,14 +71,14 @@ MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale m_menu3->Insert(3, m_menuItemGlobSett); //prepare drag & drop - m_panel1->SetDropTarget(new FileDropEvent(this, m_panel1)); - m_panel2->SetDropTarget(new FileDropEvent(this, m_panel2)); + m_panel1->SetDropTarget(new MainWindowDropTarget(this, m_panel1)); + m_panel2->SetDropTarget(new MainWindowDropTarget(this, m_panel2)); - m_panel11->SetDropTarget(new FileDropEvent(this, m_panel1)); - m_panel12->SetDropTarget(new FileDropEvent(this, m_panel2)); + m_panel11->SetDropTarget(new MainWindowDropTarget(this, m_panel1)); + m_panel12->SetDropTarget(new MainWindowDropTarget(this, m_panel2)); - //initialize right-click context menu; will be dynamically re-created on each R-mouse-click - contextMenu = new wxMenu; + //redirect drag & drop event back to main window + Connect(FFS_DROP_FILE_EVENT, FfsFileDropEventHandler(MainDialog::OnFilesDropped), NULL, this); //support for CTRL + C and DEL m_gridLeft->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MainDialog::onGridLeftButtonEvent), NULL, this); @@ -199,37 +189,26 @@ MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale int spaceToAdd = source.GetX() - target.GetX(); bSizerMiddle->Insert(1, spaceToAdd / 2, 0, 0); bSizerMiddle->Insert(0, spaceToAdd - (spaceToAdd / 2), 0, 0); - - { //set minimum width for choice load - wxSize old; - if ((old = m_choiceLoad->GetSize()).x < 140) - { - old.x = 140; - m_choiceLoad->SetMinSize(old); - bSizer58->Layout(); - } - } } MainDialog::~MainDialog() { - m_gridLeft->setSortMarker(-1); - m_gridRight->setSortMarker(-1); + cleanUp(); //do NOT include any other code here! cleanUp() is re-used when switching languages +} - //no need for event disconnect here; done automatically - delete contextMenu; +void MainDialog::cleanUp() +{ + if (!cleanedUp) + { + cleanedUp = true; - //save configuration - writeConfigurationToXml(FreeFileSync::LAST_CONFIG_FILE); //don't trow exceptions in destructors - writeGlobalSettings(); + //no need for event disconnect here; done automatically - if (restartOnExit) //this is needed so that restart happens AFTER configuration was written! - { //create new dialog - MainDialog* frame = new MainDialog(NULL, FreeFileSync::LAST_CONFIG_FILE, programLanguage, globalSettings); - frame->SetIcon(*globalResource.programIcon); //set application icon - frame->Show(); + //save configuration + writeConfigurationToXml(FreeFileSync::LAST_CONFIG_FILE); //don't trow exceptions in destructors + writeGlobalSettings(); } } @@ -260,7 +239,7 @@ void MainDialog::readGlobalSettings() i != globalSettings.gui.cfgFileHistory.rend(); ++i) addCfgFileToHistory(*i); - m_choiceLoad->SetSelection(0); + m_choiceHistory->SetSelection(0); } @@ -283,15 +262,69 @@ void MainDialog::writeGlobalSettings() } +inline +bool gridShouldBeCleared(const wxEvent& event) +{ + try //test if CTRL was pressed during a mouse event + { + const wxMouseEvent& mouseEvent = dynamic_cast (event); + if (mouseEvent.ButtonDown(wxMOUSE_BTN_LEFT) && !mouseEvent.ControlDown() && !mouseEvent.ShiftDown()) + return true; + else + return false; + } + catch (std::bad_cast&) {} + + try //test if CTRL was pressed during a key event + { + const wxKeyEvent& keyEvent = dynamic_cast (event); + + if (keyEvent.ShiftDown()) + return false; + + switch (keyEvent.GetKeyCode()) + { + case WXK_SPACE: + case WXK_TAB: + case WXK_RETURN: + case WXK_ESCAPE: + case WXK_NUMPAD_ENTER: + case WXK_LEFT: + case WXK_UP: + case WXK_RIGHT: + case WXK_DOWN: + return true; + + default: + return false; + } + } + catch (std::bad_cast&) {} + + return false; +} + + void MainDialog::onGridLeftAccess(wxEvent& event) { if (leadGrid != m_gridLeft) { leadGrid = m_gridLeft; + + //notify grids of new user focus + m_gridLeft->setLeadGrid(leadGrid); + m_gridMiddle->setLeadGrid(leadGrid); + m_gridRight->setLeadGrid(leadGrid); + m_gridLeft->SetFocus(); + } + if (gridShouldBeCleared(event)) + { + m_gridLeft->ClearSelection(); m_gridRight->ClearSelection(); } + event.Skip(); } @@ -301,10 +334,21 @@ void MainDialog::onGridRightAccess(wxEvent& event) if (leadGrid != m_gridRight) { leadGrid = m_gridRight; + + //notify grids of new user focus + m_gridLeft->setLeadGrid(leadGrid); + m_gridMiddle->setLeadGrid(leadGrid); + m_gridRight->setLeadGrid(leadGrid); + m_gridRight->SetFocus(); + } + if (gridShouldBeCleared(event)) + { m_gridLeft->ClearSelection(); + m_gridRight->ClearSelection(); } + event.Skip(); } @@ -314,9 +358,21 @@ void MainDialog::onGridMiddleAccess(wxEvent& event) if (leadGrid != m_gridMiddle) { leadGrid = m_gridMiddle; + + //notify grids of new user focus + m_gridLeft->setLeadGrid(leadGrid); + m_gridMiddle->setLeadGrid(leadGrid); + m_gridRight->setLeadGrid(leadGrid); + + m_gridMiddle->SetFocus(); + } + + if (gridShouldBeCleared(event)) + { m_gridLeft->ClearSelection(); m_gridRight->ClearSelection(); } + event.Skip(); } @@ -363,9 +419,8 @@ void MainDialog::filterRangeManually(const std::set& rowsToFilterOnUiTable) if (0 <= *i && *i < gridSizeUI) { unsigned int gridIndex = gridRefUI[*i]; - rowsToFilterOnGridData.insert(gridIndex); - FreeFileSync::addSubElements(rowsToFilterOnGridData, currentGridData, currentGridData[gridIndex]); + FreeFileSync::addSubElements(currentGridData, currentGridData[gridIndex], rowsToFilterOnGridData); } } @@ -437,8 +492,8 @@ void MainDialog::OnIdleEvent(wxEvent& event) { //a mouse up event, but no mouse down! (e.g. when window is maximized and cursor is on grid3) filteringInitialized = false; - if (leadGrid) - filterRangeManually(getSelectedRows(leadGrid)); + if (m_gridMiddle) + filterRangeManually(getSelectedRows(m_gridMiddle)); } } @@ -499,7 +554,7 @@ void removeInvalidRows(std::set& rows, const int currentUiTableSize) for (std::set::iterator i = rows.begin(); i != rows.end(); ++i) if (0 <= *i) { - if (*i >= currentUiTableSize) //set is sorted, so no need to continue here + if (*i >= currentUiTableSize) //set is sorted, so no need to continue here break; validRows.insert(*i); } @@ -521,7 +576,7 @@ std::set MainDialog::getSelectedRows(const wxGrid* grid) if (!grid->GetSelectedCols().IsEmpty()) //if a column is selected this is means all rows are marked for deletion { - for (int k = 0; k < const_cast(grid)->GetNumberRows(); ++k) + for (int k = 0; k < const_cast(grid)->GetNumberRows(); ++k) //messy wxGrid implementation... output.insert(k); } @@ -552,6 +607,10 @@ std::set MainDialog::getSelectedRows(const wxGrid* grid) } } + //some exception: also add current cursor row to selection if there are no others... hopefully improving usability + if (output.empty() && grid == leadGrid) + output.insert(const_cast(grid)->GetCursorRow()); //messy wxGrid implementation... + removeInvalidRows(output, gridRefUI.size()); return output; @@ -561,115 +620,86 @@ std::set MainDialog::getSelectedRows(const wxGrid* grid) class DeleteErrorHandler : public ErrorHandler { public: - DeleteErrorHandler(wxWindow* parentWindow, bool& unsolvedErrorOccured) : - parent(parentWindow), - ignoreErrors(false), - unsolvedErrors(unsolvedErrorOccured) {} + DeleteErrorHandler() : + ignoreErrors(false) {} + ~DeleteErrorHandler() {} - Response reportError(const Zstring& text) + Response reportError(const Zstring& errorMessage) { if (ignoreErrors) - { - unsolvedErrors = true; return ErrorHandler::IGNORE_ERROR; - } bool ignoreNextErrors = false; - wxString errorMessage = wxString(text.c_str()) + wxT("\n\n") + _("Information: If you ignore the error or abort a re-compare will be necessary!"); - ErrorDlg* errorDlg = new ErrorDlg(parent, errorMessage, ignoreNextErrors); - + ErrorDlg* errorDlg = new ErrorDlg(NULL, + ErrorDlg::BUTTON_IGNORE | ErrorDlg::BUTTON_RETRY | ErrorDlg::BUTTON_ABORT, + errorMessage.c_str(), ignoreNextErrors); int rv = errorDlg->ShowModal(); + errorDlg->Destroy(); switch (rv) { case ErrorDlg::BUTTON_IGNORE: ignoreErrors = ignoreNextErrors; - unsolvedErrors = true; return ErrorHandler::IGNORE_ERROR; case ErrorDlg::BUTTON_RETRY: return ErrorHandler::RETRY; case ErrorDlg::BUTTON_ABORT: - { - unsolvedErrors = true; throw AbortThisProcess(); - } default: assert (false); + return ErrorHandler::IGNORE_ERROR; //dummy return value } - - return ErrorHandler::IGNORE_ERROR; //dummy return value } -private: - wxWindow* parent; +private: bool ignoreErrors; - bool& unsolvedErrors; }; -void MainDialog::deleteFilesOnGrid(const std::set& rowsToDeleteOnUI) +void MainDialog::deleteFilesOnGrid(const std::set& selectedRowsLeft, const std::set& selectedRowsRight) { - if (rowsToDeleteOnUI.size()) + if (selectedRowsLeft.size() + selectedRowsRight.size()) { //map grid lines from UI to grid lines in backend (gridData) - std::set rowsToDeleteOnGrid; - for (std::set::iterator i = rowsToDeleteOnUI.begin(); i != rowsToDeleteOnUI.end(); ++i) - rowsToDeleteOnGrid.insert(gridRefUI[*i]); - - wxString headerText; - wxString filesToDelete; - - if (cfg.useRecycleBin) - headerText = _("Do you really want to move the following objects(s) to the recycle bin?"); - else - headerText = _("Do you really want to delete the following objects(s)?"); - - for (std::set::iterator i = rowsToDeleteOnGrid.begin(); i != rowsToDeleteOnGrid.end(); ++i) + std::set rowsOnGridLeft; + for (std::set::iterator i = selectedRowsLeft.begin(); i != selectedRowsLeft.end(); ++i) + rowsOnGridLeft.insert(gridRefUI[*i]); + + std::set rowsOnGridRight; + for (std::set::iterator i = selectedRowsRight.begin(); i != selectedRowsRight.end(); ++i) + rowsOnGridRight.insert(gridRefUI[*i]); + + DeleteDialog* confirmDeletion = new DeleteDialog(this, //no destruction needed; attached to main window + currentGridData, + rowsOnGridLeft, + rowsOnGridRight, + globalSettings.gui.deleteOnBothSides, + globalSettings.gui.useRecyclerForManualDeletion); + if (confirmDeletion->ShowModal() == DeleteDialog::BUTTON_OKAY) { - const FileCompareLine& currentCmpLine = currentGridData[*i]; - - if (currentCmpLine.fileDescrLeft.objType != FileDescrLine::TYPE_NOTHING) - filesToDelete += (currentCmpLine.fileDescrLeft.fullName + wxT("\n")).c_str(); - - if (currentCmpLine.fileDescrRight.objType != FileDescrLine::TYPE_NOTHING) - filesToDelete += (currentCmpLine.fileDescrRight.fullName + wxT("\n")).c_str(); - - filesToDelete+= wxT("\n"); - } - - DeleteDialog* confirmDeletion = new DeleteDialog(headerText, filesToDelete, this); //no destruction needed; attached to main window - - switch (confirmDeletion->ShowModal()) - { - case DeleteDialog::BUTTON_OKAY: - { - bool unsolvedErrorOccured = false; //if an error is skipped a re-compare will be necessary! + //Attention! Modifying the grid is highly critical! There MUST NOT BE any accesses to gridRefUI until this reference table is updated + //by writeGrid()!! This is easily missed, e.g. when ClearSelection() or ShowModal() or possibly any other wxWidgets function is called + //that might want to redraw the UI (which implicitly uses the information in gridRefUI and currentGridData (see CustomGrid) try { //handle errors when deleting files/folders - DeleteErrorHandler errorHandler(this, unsolvedErrorOccured); - - FreeFileSync::deleteOnGridAndHD(currentGridData, rowsToDeleteOnGrid, &errorHandler, cfg.useRecycleBin); + DeleteErrorHandler errorHandler; + + FreeFileSync::deleteFromGridAndHD(currentGridData, + rowsOnGridLeft, + rowsOnGridRight, + globalSettings.gui.deleteOnBothSides, + globalSettings.gui.useRecyclerForManualDeletion, + &errorHandler); } - catch (AbortThisProcess& theException) - {} - - //disable the sync button if errors occured during deletion - if (unsolvedErrorOccured) - enableSynchronization(false); + catch (AbortThisProcess&) {} //redraw grid neccessary to update new dimensions and for UI-Backend data linkage - writeGrid(currentGridData); + writeGrid(currentGridData); //call immediately after deleteFromGridAndHD!!! m_gridLeft->ClearSelection(); - m_gridRight->ClearSelection(); m_gridMiddle->ClearSelection(); - } - break; - - case DeleteDialog::BUTTON_CANCEL: - default: - break; + m_gridRight->ClearSelection(); } } } @@ -701,11 +731,20 @@ void MainDialog::openWithFileManager(int rowNumber, const wxGrid* grid) return; } - if (fileDescr && fileDescr->objType != FileDescrLine::TYPE_NOTHING) + if (fileDescr) { - command = globalSettings.gui.commandLineFileManager; - command.Replace(wxT("%x"), fileDescr->fullName.c_str()); - command.Replace(wxT("%path"), wxFileName(fileDescr->fullName.c_str()).GetPath()); + if (fileDescr->objType == FileDescrLine::TYPE_FILE) + { + command = globalSettings.gui.commandLineFileManager; + command.Replace(wxT("%name"), fileDescr->fullName.c_str()); + command.Replace(wxT("%path"), fileDescr->relativeName.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR).c_str()); + } + else if (fileDescr->objType == FileDescrLine::TYPE_DIRECTORY) + { + command = globalSettings.gui.commandLineFileManager; + command.Replace(wxT("%name"), fileDescr->fullName.c_str()); + command.Replace(wxT("%path"), fileDescr->relativeName.c_str()); + } } if (!command.empty()) @@ -716,10 +755,8 @@ void MainDialog::openWithFileManager(int rowNumber, const wxGrid* grid) void MainDialog::pushStatusInformation(const wxString& text) { lastStatusChange = wxGetLocalTimeMillis(); - stackObjects.push(m_staticTextStatusMiddle->GetLabel()); m_staticTextStatusMiddle->SetLabel(text); - m_panel7->Layout(); } @@ -762,158 +799,182 @@ void MainDialog::onResizeMainWindow(wxEvent& event) void MainDialog::onGridLeftButtonEvent(wxKeyEvent& event) { - //CTRL + C || CTRL + INS - if ( event.ControlDown() && event.GetKeyCode() == 67 || - event.ControlDown() && event.GetKeyCode() == WXK_INSERT) - copySelectionToClipboard(m_gridLeft); + const int keyCode = event.GetKeyCode(); - else if (event.GetKeyCode() == WXK_DELETE) - deleteFilesOnGrid(getSelectedRows(m_gridLeft)); + if (event.ControlDown()) + { + if (keyCode == 67 || keyCode == WXK_INSERT) //CTRL + C || CTRL + INS + copySelectionToClipboard(m_gridLeft); + else if (keyCode == 65) //CTRL + A + m_gridLeft->SelectAll(); + } + else if (keyCode == WXK_DELETE || keyCode == WXK_NUMPAD_DELETE) + deleteFilesOnGrid(getSelectedRows(m_gridLeft), getSelectedRows(m_gridRight)); event.Skip(); } -void MainDialog::onGridRightButtonEvent(wxKeyEvent& event) +void MainDialog::onGridMiddleButtonEvent(wxKeyEvent& event) { - //CTRL + C || CTRL + INS - if ( event.ControlDown() && event.GetKeyCode() == 67 || - event.ControlDown() && event.GetKeyCode() == WXK_INSERT) - copySelectionToClipboard(m_gridRight); + const int keyCode = event.GetKeyCode(); - else if (event.GetKeyCode() == WXK_DELETE) - deleteFilesOnGrid(getSelectedRows(m_gridRight)); + if (event.ControlDown()) + { + if (keyCode == 67 || keyCode == WXK_INSERT) //CTRL + C || CTRL + INS + copySelectionToClipboard(m_gridMiddle); + } event.Skip(); } -void MainDialog::onGridMiddleButtonEvent(wxKeyEvent& event) +void MainDialog::onGridRightButtonEvent(wxKeyEvent& event) { - //CTRL + C || CTRL + INS - if ( event.ControlDown() && event.GetKeyCode() == 67 || - event.ControlDown() && event.GetKeyCode() == WXK_INSERT) - copySelectionToClipboard(m_gridMiddle); + const int keyCode = event.GetKeyCode(); - else if (event.GetKeyCode() == WXK_DELETE) - deleteFilesOnGrid(getSelectedRows(m_gridMiddle)); + if (event.ControlDown()) + { + if (keyCode == 67 || keyCode == WXK_INSERT) //CTRL + C || CTRL + INS + copySelectionToClipboard(m_gridRight); + else if (keyCode == 65) //CTRL + A + m_gridRight->SelectAll(); + } + else if (keyCode == WXK_DELETE || keyCode == WXK_NUMPAD_DELETE) + deleteFilesOnGrid(getSelectedRows(m_gridLeft), getSelectedRows(m_gridRight)); event.Skip(); } -void MainDialog::OnOpenContextMenu(wxGridEvent& event) +void MainDialog::OnContextMenu(wxGridEvent& event) { - std::set selection; - - if (leadGrid) - selection = getSelectedRows(leadGrid); - - exFilterCandidateExtension.Clear(); - exFilterCandidateObj.clear(); + std::set selectionLeft = getSelectedRows(m_gridLeft); + std::set selectionRight = getSelectedRows(m_gridRight); //####################################################### -//re-create context menu - delete contextMenu; - contextMenu = new wxMenu; + //re-create context menu + contextMenu.reset(new wxMenu); - //dynamic filter determination - if (selection.size() > 0) + //CONTEXT_FILTER_TEMP + if (selectionLeft.size() + selectionRight.size() > 0) { - const FileCompareLine& firstLine = currentGridData[gridRefUI[*selection.begin()]]; + int selectionBegin = 0; + if (!selectionLeft.size()) + selectionBegin = *selectionRight.begin(); + else if (!selectionRight.size()) + selectionBegin = *selectionLeft.begin(); + else + selectionBegin = std::min(*selectionLeft.begin(), *selectionRight.begin()); + + const FileCompareLine& firstLine = currentGridData[gridRefUI[selectionBegin]]; if (firstLine.selectedForSynchronization) contextMenu->Append(CONTEXT_FILTER_TEMP, _("Exclude temporarily")); else contextMenu->Append(CONTEXT_FILTER_TEMP, _("Include temporarily")); + } + else + { + contextMenu->Append(CONTEXT_FILTER_TEMP, _("Exclude temporarily")); //this element should always be visible + contextMenu->Enable(CONTEXT_FILTER_TEMP, false); + } - //get list of relative file/dir-names into vectors - FilterObject newFilterEntry; - if (leadGrid == m_gridLeft) - for (std::set::iterator i = selection.begin(); i != selection.end(); ++i) - { - const FileCompareLine& line = currentGridData[gridRefUI[*i]]; - newFilterEntry.relativeName = line.fileDescrLeft.relativeName.c_str(); - newFilterEntry.type = line.fileDescrLeft.objType; - if (!newFilterEntry.relativeName.IsEmpty()) - exFilterCandidateObj.push_back(newFilterEntry); - } - else if (leadGrid == m_gridRight) - for (std::set::iterator i = selection.begin(); i != selection.end(); ++i) - { - const FileCompareLine& line = currentGridData[gridRefUI[*i]]; - newFilterEntry.relativeName = line.fileDescrRight.relativeName.c_str(); - newFilterEntry.type = line.fileDescrRight.objType; - if (!newFilterEntry.relativeName.IsEmpty()) - exFilterCandidateObj.push_back(newFilterEntry); - } - +//############################################################################################### + //get list of relative file/dir-names for filtering + exFilterCandidateObj.clear(); + FilterObject newFilterEntry; + for (std::set::iterator i = selectionLeft.begin(); i != selectionLeft.end(); ++i) + { + const FileCompareLine& line = currentGridData[gridRefUI[*i]]; + newFilterEntry.relativeName = line.fileDescrLeft.relativeName.c_str(); + newFilterEntry.type = line.fileDescrLeft.objType; + if (!newFilterEntry.relativeName.IsEmpty()) + exFilterCandidateObj.push_back(newFilterEntry); + } + for (std::set::iterator i = selectionRight.begin(); i != selectionRight.end(); ++i) + { + const FileCompareLine& line = currentGridData[gridRefUI[*i]]; + newFilterEntry.relativeName = line.fileDescrRight.relativeName.c_str(); + newFilterEntry.type = line.fileDescrRight.objType; + if (!newFilterEntry.relativeName.IsEmpty()) + exFilterCandidateObj.push_back(newFilterEntry); + } +//############################################################################################### - if (exFilterCandidateObj.size() > 0 && exFilterCandidateObj[0].type == FileDescrLine::TYPE_FILE) + //CONTEXT_EXCLUDE_EXT + exFilterCandidateExtension.clear(); + if (exFilterCandidateObj.size() > 0 && exFilterCandidateObj[0].type == FileDescrLine::TYPE_FILE) + { + 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! { - 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('.')); - contextMenu->Append(CONTEXT_EXCLUDE_EXT, wxString(_("Exclude via filter:")) + wxT(" ") + wxT("*.") + exFilterCandidateExtension); - } + exFilterCandidateExtension = filename.AfterLast(wxChar('.')); + contextMenu->Append(CONTEXT_EXCLUDE_EXT, wxString(_("Exclude via filter:")) + wxT(" ") + wxT("*.") + exFilterCandidateExtension); } - - if (exFilterCandidateObj.size() == 1) - contextMenu->Append(CONTEXT_EXCLUDE_OBJ, wxString(_("Exclude via filter:")) + wxT(" ") + exFilterCandidateObj[0].relativeName.AfterLast(GlobalResources::FILE_NAME_SEPARATOR)); - else if (exFilterCandidateObj.size() > 1) - contextMenu->Append(CONTEXT_EXCLUDE_OBJ, wxString(_("Exclude via filter:")) + wxT(" ") + _("")); } - else - contextMenu->Append(CONTEXT_FILTER_TEMP, _("Exclude temporarily")); //this element should always be visible - contextMenu->AppendSeparator(); - contextMenu->Append(CONTEXT_CLIPBOARD, _("Copy to clipboard\tCTRL+C")); - contextMenu->Append(CONTEXT_EXPLORER, _("Open with File Manager\tD-Click")); + //CONTEXT_EXCLUDE_OBJ + if (exFilterCandidateObj.size() == 1) + contextMenu->Append(CONTEXT_EXCLUDE_OBJ, wxString(_("Exclude via filter:")) + wxT(" ") + exFilterCandidateObj[0].relativeName.AfterLast(GlobalResources::FILE_NAME_SEPARATOR)); + else if (exFilterCandidateObj.size() > 1) + contextMenu->Append(CONTEXT_EXCLUDE_OBJ, wxString(_("Exclude via filter:")) + wxT(" ") + _("")); contextMenu->AppendSeparator(); - contextMenu->Append(CONTEXT_DELETE_FILES, _("Delete files\tDEL")); - contextMenu->Connect(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::onContextMenuSelection), NULL, this); -//####################################################### -//enable/disable context menu entries - if (selection.size() > 0) - { - contextMenu->Enable(CONTEXT_FILTER_TEMP, true); + //CONTEXT_CLIPBOARD + contextMenu->Append(CONTEXT_CLIPBOARD, _("Copy to clipboard\tCTRL+C")); + + if (leadGrid == m_gridLeft && selectionLeft.size() || leadGrid == m_gridRight && selectionRight.size()) contextMenu->Enable(CONTEXT_CLIPBOARD, true); - contextMenu->Enable(CONTEXT_DELETE_FILES, true); - } else - { - contextMenu->Enable(CONTEXT_FILTER_TEMP, false); contextMenu->Enable(CONTEXT_CLIPBOARD, false); - contextMenu->Enable(CONTEXT_DELETE_FILES, false); - } - if ((leadGrid == m_gridLeft || leadGrid == m_gridRight) && selection.size() <= 1) + + //CONTEXT_EXPLORER + contextMenu->Append(CONTEXT_EXPLORER, _("Open with File Manager\tD-Click")); + + if (leadGrid == m_gridLeft && selectionLeft.size() <= 1 || leadGrid == m_gridRight && selectionRight.size() <= 1) contextMenu->Enable(CONTEXT_EXPLORER, true); else contextMenu->Enable(CONTEXT_EXPLORER, false); -//show context menu - PopupMenu(contextMenu); + contextMenu->AppendSeparator(); + + + //CONTEXT_DELETE_FILES + contextMenu->Append(CONTEXT_DELETE_FILES, _("Delete files\tDEL")); + + if (selectionLeft.size() + selectionRight.size() == 0) + contextMenu->Enable(CONTEXT_DELETE_FILES, false); + + +//############################################################################################### + + contextMenu->Connect(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextMenuSelection), NULL, this); + + //show context menu + PopupMenu(contextMenu.get()); event.Skip(); } -void MainDialog::onContextMenuSelection(wxCommandEvent& event) +void MainDialog::OnContextMenuSelection(wxCommandEvent& event) { int eventId = event.GetId(); if (eventId == CONTEXT_FILTER_TEMP) { - if (leadGrid) - { - std::set selection = getSelectedRows(leadGrid); - filterRangeManually(selection); - } + //merge selections from left and right grid + std::set selection = getSelectedRows(m_gridLeft); + std::set additional = getSelectedRows(m_gridRight); + for (std::set::const_iterator i = additional.begin(); i != additional.end(); ++i) + selection.insert(*i); + + filterRangeManually(selection); } + else if (eventId == CONTEXT_EXCLUDE_EXT) { if (!exFilterCandidateExtension.IsEmpty()) @@ -926,7 +987,7 @@ void MainDialog::onContextMenuSelection(wxCommandEvent& event) cfg.filterIsActive = true; updateFilterButton(m_bpButtonFilter, cfg.filterIsActive); - FreeFileSync::filterCurrentGridData(currentGridData, cfg.includeFilter, cfg.excludeFilter); + FreeFileSync::filterGridData(currentGridData, cfg.includeFilter, cfg.excludeFilter); writeGrid(currentGridData); if (hideFilteredElements) @@ -937,6 +998,7 @@ void MainDialog::onContextMenuSelection(wxCommandEvent& event) } } } + else if (eventId == CONTEXT_EXCLUDE_OBJ) { if (exFilterCandidateObj.size() > 0) //check needed to determine if filtering is needed @@ -961,7 +1023,7 @@ void MainDialog::onContextMenuSelection(wxCommandEvent& event) cfg.filterIsActive = true; updateFilterButton(m_bpButtonFilter, cfg.filterIsActive); - FreeFileSync::filterCurrentGridData(currentGridData, cfg.includeFilter, cfg.excludeFilter); + FreeFileSync::filterGridData(currentGridData, cfg.includeFilter, cfg.excludeFilter); writeGrid(currentGridData); if (hideFilteredElements) @@ -972,11 +1034,13 @@ void MainDialog::onContextMenuSelection(wxCommandEvent& event) } } } + else if (eventId == CONTEXT_CLIPBOARD) { - if (leadGrid) + if (leadGrid == m_gridLeft || leadGrid == m_gridRight) copySelectionToClipboard(leadGrid); } + else if (eventId == CONTEXT_EXPLORER) { if (leadGrid == m_gridLeft || leadGrid == m_gridRight) @@ -989,61 +1053,102 @@ void MainDialog::onContextMenuSelection(wxCommandEvent& event) openWithFileManager(-1, leadGrid); } } + else if (eventId == CONTEXT_DELETE_FILES) { - if (leadGrid) - { - std::set selection = getSelectedRows(leadGrid); - deleteFilesOnGrid(selection); - } - } - else if (eventId == CONTEXT_CUSTOMIZE_COLUMN_LEFT) - { - XmlGlobalSettings::ColumnAttributes colAttr = m_gridLeft->getColumnAttributes(); - CustomizeColsDlg* customizeDlg = new CustomizeColsDlg(this, colAttr); - if (customizeDlg->ShowModal() == CustomizeColsDlg::BUTTON_OKAY) - { - m_gridLeft->setColumnAttributes(colAttr); - } + deleteFilesOnGrid(getSelectedRows(m_gridLeft), getSelectedRows(m_gridRight)); } - else if (eventId == CONTEXT_CUSTOMIZE_COLUMN_RIGHT) +} + + +void MainDialog::OnContextMenuMiddle(wxGridEvent& event) +{ + contextMenu.reset(new wxMenu); //re-create context menu + contextMenu->Append(CONTEXT_CHECK_ALL, _("Check all")); + contextMenu->Append(CONTEXT_UNCHECK_ALL, _("Uncheck all")); + + if (currentGridData.size() == 0) { - XmlGlobalSettings::ColumnAttributes colAttr = m_gridRight->getColumnAttributes(); - CustomizeColsDlg* customizeDlg = new CustomizeColsDlg(this, colAttr); - if (customizeDlg->ShowModal() == CustomizeColsDlg::BUTTON_OKAY) - { - m_gridRight->setColumnAttributes(colAttr); - } + contextMenu->Enable(CONTEXT_CHECK_ALL, false); + contextMenu->Enable(CONTEXT_UNCHECK_ALL, false); } + contextMenu->Connect(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextMenuMiddleSelection), NULL, this); + PopupMenu(contextMenu.get()); //show context menu + event.Skip(); } -void MainDialog::OnColumnMenuLeft(wxGridEvent& event) +void MainDialog::OnContextMenuMiddleSelection(wxCommandEvent& event) +{ + int eventId = event.GetId(); + if (eventId == CONTEXT_CHECK_ALL) + { + FreeFileSync::includeAllRowsOnGrid(currentGridData); + writeGrid(currentGridData); + } + else if (eventId == CONTEXT_UNCHECK_ALL) + { + FreeFileSync::excludeAllRowsOnGrid(currentGridData); + writeGrid(currentGridData); + } +} + + +void MainDialog::OnContextColumnLeft(wxGridEvent& event) { - delete contextMenu; - contextMenu = new wxMenu; //re-create context menu + contextMenu.reset(new wxMenu); //re-create context menu contextMenu->Append(CONTEXT_CUSTOMIZE_COLUMN_LEFT, _("Customize columns")); - contextMenu->Connect(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::onContextMenuSelection), NULL, this); - PopupMenu(contextMenu); //show context menu + contextMenu->Connect(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextColumnSelection), NULL, this); + PopupMenu(contextMenu.get()); //show context menu event.Skip(); } -void MainDialog::OnColumnMenuRight(wxGridEvent& event) +void MainDialog::OnContextColumnRight(wxGridEvent& event) { - delete contextMenu; - contextMenu = new wxMenu; //re-create context menu + contextMenu.reset(new wxMenu); //re-create context menu contextMenu->Append(CONTEXT_CUSTOMIZE_COLUMN_RIGHT, _("Customize columns")); - contextMenu->Connect(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::onContextMenuSelection), NULL, this); - PopupMenu(contextMenu); //show context menu + contextMenu->Connect(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextColumnSelection), NULL, this); + PopupMenu(contextMenu.get()); //show context menu event.Skip(); } +void MainDialog::OnContextColumnSelection(wxCommandEvent& event) +{ + int eventId = event.GetId(); + if (eventId == CONTEXT_CUSTOMIZE_COLUMN_LEFT) + { + xmlAccess::ColumnAttributes colAttr = m_gridLeft->getColumnAttributes(); + CustomizeColsDlg* customizeDlg = new CustomizeColsDlg(this, colAttr); + if (customizeDlg->ShowModal() == CustomizeColsDlg::BUTTON_OKAY) + { + m_gridLeft->setColumnAttributes(colAttr); + + m_gridLeft->setSortMarker(-1); //hide sort direction indicator on GUI grids + m_gridMiddle->setSortMarker(-1); + m_gridRight->setSortMarker(-1); + } + } + else if (eventId == CONTEXT_CUSTOMIZE_COLUMN_RIGHT) + { + xmlAccess::ColumnAttributes colAttr = m_gridRight->getColumnAttributes(); + CustomizeColsDlg* customizeDlg = new CustomizeColsDlg(this, colAttr); + if (customizeDlg->ShowModal() == CustomizeColsDlg::BUTTON_OKAY) + { + m_gridRight->setColumnAttributes(colAttr); + m_gridLeft->setSortMarker(-1); //hide sort direction indicator on GUI grids + m_gridMiddle->setSortMarker(-1); + m_gridRight->setSortMarker(-1); + } + } +} + + void MainDialog::OnWriteDirManually(wxCommandEvent& event) { wxString newDir = FreeFileSync::getFormattedDirectoryName(event.GetString().c_str()).c_str(); @@ -1161,38 +1266,53 @@ private: void MainDialog::addCfgFileToHistory(const wxString& filename) { - //the default config file should not be in the history - if (sameFileSpecified(FreeFileSync::LAST_CONFIG_FILE, filename)) - return; - - //only still existing files should be included in the list + //only (still) existing files should be included in the list if (!wxFileExists(filename)) return; - std::vector::const_iterator i; if ((i = find_if(cfgFileNames.begin(), cfgFileNames.end(), FindDuplicates(filename))) != cfgFileNames.end()) { //if entry is in the list, then jump to element - m_choiceLoad->SetSelection(i - cfgFileNames.begin() + 1); + m_choiceHistory->SetSelection(i - cfgFileNames.begin()); } else { cfgFileNames.insert(cfgFileNames.begin(), filename); - m_choiceLoad->Insert(getFormattedHistoryElement(filename), 1); //insert after "Load configuration..." - m_choiceLoad->SetSelection(1); + + //the default config file should receive another name on GUI + if (sameFileSpecified(FreeFileSync::LAST_CONFIG_FILE, filename)) + m_choiceHistory->Insert(getFormattedHistoryElement(_("")), 0); //insert at beginning of list + else + m_choiceHistory->Insert(getFormattedHistoryElement(filename), 0); //insert at beginning of list + + m_choiceHistory->SetSelection(0); } //keep maximal size of history list - if (cfgFileNames.size() > CFG_HISTORY_LENGTH) + if (cfgFileNames.size() > globalSettings.gui.cfgHistoryMaxItems) { //delete last rows cfgFileNames.pop_back(); - m_choiceLoad->Delete(CFG_HISTORY_LENGTH); //don't forget: m_choiceLoad has (CFG_HISTORY_LENGTH + 1) elements + m_choiceHistory->Delete(globalSettings.gui.cfgHistoryMaxItems); } } -void onFilesDropped(const wxString& elementName, wxTextCtrl* txtCtrl, wxDirPickerCtrl* dirPicker) +bool MainWindowDropTarget::OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames) +{ + if (!filenames.IsEmpty()) + { + const wxString droppedFileName = filenames[0]; + + //create a custom event on main window: execute event after file dropping is completed! (e.g. after mouse is released) + FfsFileDropEvent evt(droppedFileName, dropTarget); + mainDlg->GetEventHandler()->AddPendingEvent(evt); + } + return false; +} + + +void setDirectoryFromDrop(const wxString& elementName, wxTextCtrl* txtCtrl, wxDirPickerCtrl* dirPicker) { wxString fileName = elementName; @@ -1213,52 +1333,57 @@ void onFilesDropped(const wxString& elementName, wxTextCtrl* txtCtrl, wxDirPicke } -bool FileDropEvent::OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames) +void MainDialog::OnFilesDropped(FfsFileDropEvent& event) { - if (!filenames.IsEmpty()) - { - //disable the sync button - mainDlg->enableSynchronization(false); + const wxString droppedFileName = event.m_nameDropped; + const wxPanel* dropTarget = event.m_dropTarget; - //clear grids - mainDlg->currentGridData.clear(); - mainDlg->writeGrid(mainDlg->currentGridData); + //disable the sync button + enableSynchronization(false); - const wxString droppedFileName = filenames[0]; + //clear grids + currentGridData.clear(); + writeGrid(currentGridData); - //test if ffs config file has been dropped - if (xmlAccess::getXmlType(droppedFileName) == XML_GUI_CONFIG) - { - if (mainDlg->readConfigurationFromXml(droppedFileName)) - mainDlg->pushStatusInformation(_("Configuration loaded!")); - } + xmlAccess::XmlType fileType = xmlAccess::getXmlType(droppedFileName); - //test if main folder pair is drop target - else if (dropTarget == mainDlg->m_panel1) - onFilesDropped(droppedFileName, mainDlg->m_directoryLeft, mainDlg->m_dirPickerLeft); + //test if ffs config file has been dropped + if (fileType == xmlAccess::XML_GUI_CONFIG) + { + if (readConfigurationFromXml(droppedFileName)) + pushStatusInformation(_("Configuration loaded!")); + } + //...or a ffs batch file + else if (fileType == xmlAccess::XML_BATCH_CONFIG) + { + BatchDialog* batchDlg = new BatchDialog(this, droppedFileName); + if (batchDlg->ShowModal() == BatchDialog::BATCH_FILE_SAVED) + pushStatusInformation(_("Batch file created successfully!")); + } + //test if main folder pair is drop target + else if (dropTarget == m_panel1) + setDirectoryFromDrop(droppedFileName, m_directoryLeft, m_dirPickerLeft); - else if (dropTarget == mainDlg->m_panel2) - onFilesDropped(droppedFileName, mainDlg->m_directoryRight, mainDlg->m_dirPickerRight); + else if (dropTarget == m_panel2) + setDirectoryFromDrop(droppedFileName, m_directoryRight, m_dirPickerRight); - else //test if additional folder pairs are drop targets + else //test if additional folder pairs are drop targets + { + for (std::vector::const_iterator i = additionalFolderPairs.begin(); i != additionalFolderPairs.end(); ++i) { - for (std::vector::const_iterator i = mainDlg->additionalFolderPairs.begin(); i != mainDlg->additionalFolderPairs.end(); ++i) + FolderPairGenerated* dirPair = *i; + if (dropTarget == (dirPair->m_panelLeft)) { - FolderPairGenerated* dirPair = *i; - if (dropTarget == (dirPair->m_panelLeft)) - { - onFilesDropped(droppedFileName, dirPair->m_directoryLeft, dirPair->m_dirPickerLeft); - break; - } - else if (dropTarget == (dirPair->m_panelRight)) - { - onFilesDropped(droppedFileName, dirPair->m_directoryRight, dirPair->m_dirPickerRight); - break; - } + setDirectoryFromDrop(droppedFileName, dirPair->m_directoryLeft, dirPair->m_dirPickerLeft); + break; + } + else if (dropTarget == (dirPair->m_panelRight)) + { + setDirectoryFromDrop(droppedFileName, dirPair->m_directoryRight, dirPair->m_dirPickerRight); + break; } } } - return false; } @@ -1266,13 +1391,8 @@ void MainDialog::OnSaveConfig(wxCommandEvent& event) { wxString defaultFileName = wxT("SyncSettings.ffs_gui"); - //try to use currently selected configuration file as default - int selectedItem; - if ((selectedItem = m_choiceLoad->GetSelection()) != wxNOT_FOUND) - if (1 <= selectedItem && unsigned(selectedItem) < m_choiceLoad->GetCount()) - if (unsigned(selectedItem - 1) < cfgFileNames.size()) - defaultFileName = cfgFileNames[selectedItem - 1]; - + if (!proposedConfigFileName.empty()) + defaultFileName = proposedConfigFileName; wxFileDialog* filePicker = new wxFileDialog(this, wxEmptyString, wxEmptyString, defaultFileName, wxString(_("FreeFileSync configuration")) + wxT(" (*.ffs_gui)|*.ffs_gui"), wxFD_SAVE); if (filePicker->ShowModal() == wxID_OK) @@ -1292,86 +1412,64 @@ void MainDialog::OnSaveConfig(wxCommandEvent& event) if (writeConfigurationToXml(newFileName)) pushStatusInformation(_("Configuration saved!")); } - event.Skip(); } void MainDialog::OnLoadConfig(wxCommandEvent& event) { - int selectedItem; - if ((selectedItem = m_choiceLoad->GetSelection()) != wxNOT_FOUND) - { - wxFileDialog* filePicker = NULL; - switch (selectedItem) - { - case 0: //load config from file - filePicker = new wxFileDialog(this, wxEmptyString, wxEmptyString, wxEmptyString, wxString(_("FreeFileSync configuration")) + wxT(" (*.ffs_gui)|*.ffs_gui"), wxFD_OPEN); + 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()); +} - if (filePicker->ShowModal() == wxID_OK) - loadConfiguration(filePicker->GetPath()); - break; - default: - if (1 <= selectedItem && unsigned(selectedItem) < m_choiceLoad->GetCount()) - { - if (unsigned(selectedItem - 1) < cfgFileNames.size()) - loadConfiguration(cfgFileNames[selectedItem - 1]); - } - break; - } - } - event.Skip(); +void MainDialog::OnLoadFromHistory(wxCommandEvent& event) +{ + const int selectedItem = m_choiceHistory->GetSelection(); + if (0 <= selectedItem && unsigned(selectedItem) < cfgFileNames.size()) + loadConfiguration(cfgFileNames[selectedItem]); } 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()); + OnLoadConfig(event); } void MainDialog::loadConfiguration(const wxString& filename) { if (!filename.IsEmpty()) - { - if (!wxFileExists(filename)) - wxMessageBox(wxString(_("The selected file does not exist:")) + wxT(" \"") + filename + wxT("\""), _("Warning"), wxOK); - else if (xmlAccess::getXmlType(filename) != XML_GUI_CONFIG) - wxMessageBox(wxString(_("The file does not contain a valid configuration:")) + wxT(" \"") + filename + wxT("\""), _("Warning"), wxOK); - else - { //clear grids - currentGridData.clear(); - writeGrid(currentGridData); + { //clear grids + currentGridData.clear(); + writeGrid(currentGridData); - if (readConfigurationFromXml(filename)) - pushStatusInformation(_("Configuration loaded!")); - } + if (readConfigurationFromXml(filename)) + pushStatusInformation(_("Configuration loaded!")); } } void MainDialog::OnChoiceKeyEvent(wxKeyEvent& event) { - if (event.GetKeyCode() == WXK_DELETE) + const int keyCode = event.GetKeyCode(); + if (keyCode == WXK_DELETE || keyCode == WXK_NUMPAD_DELETE) { //try to delete the currently selected config history item - int selectedItem; - if ((selectedItem = m_choiceLoad->GetCurrentSelection()) != wxNOT_FOUND) - if (1 <= selectedItem && unsigned(selectedItem) < m_choiceLoad->GetCount()) - if (unsigned(selectedItem - 1) < cfgFileNames.size()) - { //delete selected row - cfgFileNames.erase(cfgFileNames.begin() + selectedItem - 1); - m_choiceLoad->Delete(selectedItem); - m_choiceLoad->SetSelection(0); - } + const int selectedItem = m_choiceHistory->GetCurrentSelection(); + if ( 0 <= selectedItem && + unsigned(selectedItem) < m_choiceHistory->GetCount() && + unsigned(selectedItem) < cfgFileNames.size()) + { //delete selected row + cfgFileNames.erase(cfgFileNames.begin() + selectedItem); + m_choiceHistory->Delete(selectedItem); + m_choiceHistory->SetSelection(0); + } } event.Skip(); } @@ -1405,8 +1503,17 @@ void MainDialog::OnQuit(wxCommandEvent &event) bool MainDialog::readConfigurationFromXml(const wxString& filename, bool programStartup) { + leftOnlyFilesActive = true; + leftNewerFilesActive = true; + differentFilesActive = true; + rightNewerFilesActive = true; //do not save/load these bool values from harddisk! + rightOnlyFilesActive = true; //it's more convenient to have them defaulted at startup + equalFilesActive = false; + updateViewFilterButtons(); + + //load XML - XmlGuiConfig guiCfg; //structure to receive gui settings, already defaulted!! + xmlAccess::XmlGuiConfig guiCfg; //structure to receive gui settings, already defaulted!! try { guiCfg = xmlAccess::readGuiConfig(filename); @@ -1469,28 +1576,43 @@ bool MainDialog::readConfigurationFromXml(const wxString& filename, bool program m_bpButtonRemovePair->Disable(); } - //read GUI layout (optional!) + //read GUI layout hideFilteredElements = guiCfg.hideFilteredElements; m_checkBoxHideFilt->SetValue(hideFilteredElements); + ignoreErrors = guiCfg.ignoreErrors; //########################################################### addCfgFileToHistory(filename); //put filename on list of last used config files + + if (filename == FreeFileSync::LAST_CONFIG_FILE) //set title + { + SetTitle(wxString(wxT("FreeFileSync - ")) + _("Folder Comparison and Synchronization")); + proposedConfigFileName.clear(); + } + else + { + SetTitle(wxString(wxT("FreeFileSync - ")) + filename); + proposedConfigFileName = filename; + } + return true; } bool MainDialog::writeConfigurationToXml(const wxString& filename) { - XmlGuiConfig guiCfg; + xmlAccess::XmlGuiConfig guiCfg; //load structure with basic settings "mainCfg" guiCfg.mainCfg = cfg; - getFolderPairs(guiCfg.directoryPairs); + guiCfg.directoryPairs = getFolderPairs(); //load structure with gui settings guiCfg.hideFilteredElements = hideFilteredElements; + guiCfg.ignoreErrors = ignoreErrors; + //write config to XML try { @@ -1504,6 +1626,18 @@ bool MainDialog::writeConfigurationToXml(const wxString& filename) //put filename on list of last used config files addCfgFileToHistory(filename); + + if (filename == FreeFileSync::LAST_CONFIG_FILE) //set title + { + SetTitle(wxString(wxT("FreeFileSync - ")) + _("Folder Comparison and Synchronization")); + proposedConfigFileName.clear(); + } + else + { + SetTitle(wxString(wxT("FreeFileSync - ")) + filename); + proposedConfigFileName = filename; + } + return true; } @@ -1512,7 +1646,6 @@ void MainDialog::OnShowHelpDialog(wxCommandEvent &event) { HelpDlg* helpDlg = new HelpDlg(this); helpDlg->ShowModal(); - event.Skip(); } @@ -1523,12 +1656,11 @@ void MainDialog::OnFilterButton(wxCommandEvent &event) updateFilterButton(m_bpButtonFilter, cfg.filterIsActive); if (cfg.filterIsActive) - FreeFileSync::filterCurrentGridData(currentGridData, cfg.includeFilter, cfg.excludeFilter); + FreeFileSync::filterGridData(currentGridData, cfg.includeFilter, cfg.excludeFilter); else - FreeFileSync::removeFilterOnCurrentGridData(currentGridData); + FreeFileSync::includeAllRowsOnGrid(currentGridData); writeGrid(currentGridData); - event.Skip(); } @@ -1538,6 +1670,9 @@ void MainDialog::OnHideFilteredButton(wxCommandEvent &event) //make sure, checkbox and "hideFiltered" are in sync m_checkBoxHideFilt->SetValue(hideFilteredElements); + m_gridLeft->ClearSelection(); + m_gridRight->ClearSelection(); + writeGrid(currentGridData); event.Skip(); @@ -1558,12 +1693,12 @@ void MainDialog::OnConfigureFilter(wxHyperlinkEvent &event) if (afterImage == (wxString(wxT("*")) + wxChar(1))) //default { cfg.filterIsActive = false; - FreeFileSync::removeFilterOnCurrentGridData(currentGridData); + FreeFileSync::includeAllRowsOnGrid(currentGridData); } else { cfg.filterIsActive = true; - FreeFileSync::filterCurrentGridData(currentGridData, cfg.includeFilter, cfg.excludeFilter); + FreeFileSync::filterGridData(currentGridData, cfg.includeFilter, cfg.excludeFilter); } updateFilterButton(m_bpButtonFilter, cfg.filterIsActive); @@ -1580,7 +1715,6 @@ void MainDialog::OnLeftOnlyFiles(wxCommandEvent& event) leftOnlyFilesActive = !leftOnlyFilesActive; updateViewFilterButtons(); writeGrid(currentGridData); - event.Skip(); }; void MainDialog::OnLeftNewerFiles(wxCommandEvent& event) @@ -1588,7 +1722,6 @@ void MainDialog::OnLeftNewerFiles(wxCommandEvent& event) leftNewerFilesActive = !leftNewerFilesActive; updateViewFilterButtons(); writeGrid(currentGridData); - event.Skip(); }; void MainDialog::OnDifferentFiles(wxCommandEvent& event) @@ -1596,7 +1729,6 @@ void MainDialog::OnDifferentFiles(wxCommandEvent& event) differentFilesActive = !differentFilesActive; updateViewFilterButtons(); writeGrid(currentGridData); - event.Skip(); }; void MainDialog::OnRightNewerFiles(wxCommandEvent& event) @@ -1604,7 +1736,6 @@ void MainDialog::OnRightNewerFiles(wxCommandEvent& event) rightNewerFilesActive = !rightNewerFilesActive; updateViewFilterButtons(); writeGrid(currentGridData); - event.Skip(); }; void MainDialog::OnRightOnlyFiles(wxCommandEvent& event) @@ -1612,7 +1743,6 @@ void MainDialog::OnRightOnlyFiles(wxCommandEvent& event) rightOnlyFilesActive = !rightOnlyFilesActive; updateViewFilterButtons(); writeGrid(currentGridData); - event.Skip(); }; void MainDialog::OnEqualFiles(wxCommandEvent& event) @@ -1620,9 +1750,9 @@ void MainDialog::OnEqualFiles(wxCommandEvent& event) equalFilesActive = !equalFilesActive; updateViewFilterButtons(); writeGrid(currentGridData); - event.Skip(); }; + void MainDialog::updateViewFilterButtons() { if (leftOnlyFilesActive) @@ -1731,82 +1861,39 @@ void MainDialog::updateCompareButtons() } -void MainDialog::getFolderPairs(std::vector& output, bool formatted) +std::vector MainDialog::getFolderPairs() { - output.clear(); + std::vector output; //add main pair FolderPair newPair; - if (formatted) - { - newPair.leftDirectory = FreeFileSync::getFormattedDirectoryName(m_directoryLeft->GetValue().c_str()); - newPair.rightDirectory = FreeFileSync::getFormattedDirectoryName(m_directoryRight->GetValue().c_str()); - } - else - { - newPair.leftDirectory = m_directoryLeft->GetValue().c_str(); - newPair.rightDirectory = m_directoryRight->GetValue().c_str(); - } + newPair.leftDirectory = m_directoryLeft->GetValue().c_str(); + newPair.rightDirectory = m_directoryRight->GetValue().c_str(); output.push_back(newPair); //add additional pairs for (std::vector::const_iterator i = additionalFolderPairs.begin(); i != additionalFolderPairs.end(); ++i) { FolderPairGenerated* dirPair = *i; - if (formatted) - { - newPair.leftDirectory = FreeFileSync::getFormattedDirectoryName(dirPair->m_directoryLeft->GetValue().c_str()); - newPair.rightDirectory = FreeFileSync::getFormattedDirectoryName(dirPair->m_directoryRight->GetValue().c_str()); - } - else - { - newPair.leftDirectory = dirPair->m_directoryLeft->GetValue().c_str(); - newPair.rightDirectory = dirPair->m_directoryRight->GetValue().c_str(); - } - + newPair.leftDirectory = dirPair->m_directoryLeft->GetValue().c_str(); + newPair.rightDirectory = dirPair->m_directoryRight->GetValue().c_str(); output.push_back(newPair); } + + return output; } void MainDialog::OnCompare(wxCommandEvent &event) { - //assemble vector of formatted folder pairs - std::vector directoryPairsFormatted; - getFolderPairs(directoryPairsFormatted, true); - - //check if folders are valid - wxString errorMessage; - if (!FreeFileSync::foldersAreValidForComparison(directoryPairsFormatted, errorMessage)) - { - 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(); wxBusyCursor dummy; //show hourglass cursor + //save memory by clearing old result list + currentGridData.clear(); + writeGrid(currentGridData); //refresh GUI grid + bool aborted = false; try { //class handling status display and error messages @@ -1814,24 +1901,28 @@ void MainDialog::OnCompare(wxCommandEvent &event) cmpStatusHandlerTmp = &statusHandler; #ifdef FFS_WIN - FreeFileSync::CompareProcess comparison(false, globalSettings.global.handleDstOnFat32, &statusHandler); + FreeFileSync::CompareProcess comparison(globalSettings.shared.traverseSymbolicLinks, + globalSettings.shared.handleDstOnFat32, + globalSettings.shared.warningDependentFolders, + &statusHandler); #elif defined FFS_LINUX - FreeFileSync::CompareProcess comparison(false, false, &statusHandler); + FreeFileSync::CompareProcess comparison(globalSettings.shared.traverseSymbolicLinks, + false, + globalSettings.shared.warningDependentFolders, + &statusHandler); #endif - comparison.startCompareProcess(directoryPairsFormatted, + comparison.startCompareProcess(getFolderPairs(), cfg.compareVar, currentGridData); //if (output.size < 50000) statusHandler.updateStatusText(_("Sorting file list...")); statusHandler.forceUiRefresh(); //keep total number of scanned files up to date - sort(currentGridData.begin(), currentGridData.end(), sortByRelativeName); + std::sort(currentGridData.begin(), currentGridData.end(), sortByRelativeName); //filter currentGridData if option is set if (cfg.filterIsActive) - FreeFileSync::filterCurrentGridData(currentGridData, cfg.includeFilter, cfg.excludeFilter); - - writeGrid(currentGridData); //keep it in try/catch to not overwrite status information if compare is aborted + FreeFileSync::filterGridData(currentGridData, cfg.includeFilter, cfg.excludeFilter); } catch (AbortThisProcess& theException) { @@ -1851,10 +1942,20 @@ void MainDialog::OnCompare(wxCommandEvent &event) //hide sort direction indicator on GUI grids m_gridLeft->setSortMarker(-1); + m_gridMiddle->setSortMarker(-1); m_gridRight->setSortMarker(-1); + + //reset last sort selection: used for determining sort direction + lastSortColumn = -1; + lastSortGrid = NULL; + + m_gridLeft->ClearSelection(); + m_gridMiddle->ClearSelection(); + m_gridRight->ClearSelection(); } - event.Skip(); + //refresh grid in ANY case! (also on abort) + writeGrid(currentGridData); } @@ -1862,7 +1963,6 @@ void MainDialog::OnAbortCompare(wxCommandEvent& event) { if (cmpStatusHandlerTmp) cmpStatusHandlerTmp->requestAbortion(); - event.Skip(); } @@ -1898,7 +1998,7 @@ void MainDialog::writeGrid(const FileCompareResult& gridData) void MainDialog::OnSync(wxCommandEvent& event) { - SyncDialog* syncDlg = new SyncDialog(this, currentGridData, cfg, synchronizationEnabled); + SyncDialog* syncDlg = new SyncDialog(this, currentGridData, cfg, ignoreErrors, synchronizationEnabled); if (syncDlg->ShowModal() == SyncDialog::BUTTON_START) { //check if there are files/folders to be sync'ed at all @@ -1915,10 +2015,14 @@ void MainDialog::OnSync(wxCommandEvent& event) try { //class handling status updates and error messages - SyncStatusHandler statusHandler(this, cfg.ignoreErrors); + SyncStatusHandler statusHandler(this, ignoreErrors); //start synchronization and return elements that were not sync'ed in currentGridData - FreeFileSync::SyncProcess synchronization(cfg.useRecycleBin, true, &statusHandler); + FreeFileSync::SyncProcess synchronization( + cfg.useRecycleBin, + globalSettings.shared.warningSignificantDifference, + &statusHandler); + synchronization.startSynchronizationProcess(currentGridData, cfg.syncConfiguration); } catch (AbortThisProcess& theException) @@ -1926,9 +2030,14 @@ void MainDialog::OnSync(wxCommandEvent& event) } //enableSynchronization(false); - //display files that were not processed + //show remaining files that have not been processed: put DIRECTLY after startSynchronizationProcess() and DON'T call any wxWidgets functions + //in between! Else CustomGrid might access the obsolete gridRefUI! writeGrid(currentGridData); + m_gridLeft->ClearSelection(); + m_gridMiddle->ClearSelection(); + m_gridRight->ClearSelection(); + if (currentGridData.size() > 0) pushStatusInformation(_("Not all items were synchronized! Have a look at the list.")); else @@ -1937,7 +2046,6 @@ void MainDialog::OnSync(wxCommandEvent& event) enableSynchronization(false); } } - event.Skip(); } @@ -1957,34 +2065,47 @@ void MainDialog::OnRightGridDoubleClick(wxGridEvent& event) void MainDialog::OnSortLeftGrid(wxGridEvent& event) { - static bool columnSortAscending[CustomGrid::COLUMN_TYPE_COUNT] = {true, true, false, true}; - - int currentSortColumn = event.GetCol(); - if (0 <= currentSortColumn < CustomGrid::COLUMN_TYPE_COUNT) + //determine direction for std::sort() + const int currentSortColumn = event.GetCol(); + if (0 <= currentSortColumn && currentSortColumn < int(xmlAccess::COLUMN_TYPE_COUNT)) { - bool& sortAscending = columnSortAscending[currentSortColumn]; - XmlGlobalSettings::ColumnTypes columnType = m_gridLeft->getTypeAtPos(currentSortColumn); + static bool sortAscending = true; + if (lastSortColumn != currentSortColumn || lastSortGrid != m_gridLeft) + sortAscending = true; + else + sortAscending = !sortAscending; + + lastSortColumn = currentSortColumn; + lastSortGrid = m_gridLeft; - if (columnType == XmlGlobalSettings::FILENAME) + //start sort + xmlAccess::ColumnTypes columnType = m_gridLeft->getTypeAtPos(currentSortColumn); + if (columnType == xmlAccess::FULL_NAME) { - if (sortAscending) sort(currentGridData.begin(), currentGridData.end(), sortByFileName); - else sort(currentGridData.begin(), currentGridData.end(), sortByFileName); + if (sortAscending) std::sort(currentGridData.begin(), currentGridData.end(), sortByRelativeName); //sort by rel name here too! + else std::sort(currentGridData.begin(), currentGridData.end(), sortByRelativeName); } - else if (columnType == XmlGlobalSettings::REL_PATH) + else if (columnType == xmlAccess::FILENAME) { - if (sortAscending) sort(currentGridData.begin(), currentGridData.end(), sortByRelativeName); - else sort(currentGridData.begin(), currentGridData.end(), sortByRelativeName); + if (sortAscending) std::sort(currentGridData.begin(), currentGridData.end(), sortByFileName); + else std::sort(currentGridData.begin(), currentGridData.end(), sortByFileName); } - else if (columnType == XmlGlobalSettings::SIZE) + else if (columnType == xmlAccess::REL_PATH) { - if (sortAscending) sort(currentGridData.begin(), currentGridData.end(), sortByFileSize); - else sort(currentGridData.begin(), currentGridData.end(), sortByFileSize); + if (sortAscending) std::sort(currentGridData.begin(), currentGridData.end(), sortByRelativeName); + else std::sort(currentGridData.begin(), currentGridData.end(), sortByRelativeName); } - else if (columnType == XmlGlobalSettings::DATE) + else if (columnType == xmlAccess::SIZE) { - if (sortAscending) sort(currentGridData.begin(), currentGridData.end(), sortByDate); - else sort(currentGridData.begin(), currentGridData.end(), sortByDate); + if (sortAscending) std::sort(currentGridData.begin(), currentGridData.end(), sortByFileSize); + else std::sort(currentGridData.begin(), currentGridData.end(), sortByFileSize); } + else if (columnType == xmlAccess::DATE) + { + if (sortAscending) std::sort(currentGridData.begin(), currentGridData.end(), sortByDate); + else std::sort(currentGridData.begin(), currentGridData.end(), sortByDate); + } + else assert(false); writeGrid(currentGridData); //needed to refresh gridRefUI references @@ -1995,8 +2116,6 @@ void MainDialog::OnSortLeftGrid(wxGridEvent& event) m_gridLeft->setSortMarker(currentSortColumn, globalResource.bitmapSmallUp); else m_gridLeft->setSortMarker(currentSortColumn, globalResource.bitmapSmallDown); - - sortAscending = !sortAscending; } event.Skip(); } @@ -2004,34 +2123,47 @@ void MainDialog::OnSortLeftGrid(wxGridEvent& event) void MainDialog::OnSortRightGrid(wxGridEvent& event) { - static bool columnSortAscending[CustomGrid::COLUMN_TYPE_COUNT] = {true, true, false, true}; - - int currentSortColumn = event.GetCol(); - if (0 <= currentSortColumn < CustomGrid::COLUMN_TYPE_COUNT) + //determine direction for std::sort() + const int currentSortColumn = event.GetCol(); + if (0 <= currentSortColumn && currentSortColumn < int(xmlAccess::COLUMN_TYPE_COUNT)) { - bool& sortAscending = columnSortAscending[currentSortColumn]; - XmlGlobalSettings::ColumnTypes columnType = m_gridRight->getTypeAtPos(currentSortColumn); + static bool sortAscending = true; + if (lastSortColumn != currentSortColumn || lastSortGrid != m_gridRight) + sortAscending = true; + else + sortAscending = !sortAscending; - if (columnType == XmlGlobalSettings::FILENAME) + lastSortColumn = currentSortColumn; + lastSortGrid = m_gridRight; + + //start sort + xmlAccess::ColumnTypes columnType = m_gridRight->getTypeAtPos(currentSortColumn); + if (columnType == xmlAccess::FULL_NAME) { - if (sortAscending) sort(currentGridData.begin(), currentGridData.end(), sortByFileName); - else sort(currentGridData.begin(), currentGridData.end(), sortByFileName); + if (sortAscending) std::sort(currentGridData.begin(), currentGridData.end(), sortByRelativeName); //sort by rel name here too! + else std::sort(currentGridData.begin(), currentGridData.end(), sortByRelativeName); } - else if (columnType == XmlGlobalSettings::REL_PATH) + else if (columnType == xmlAccess::FILENAME) { - if (sortAscending) sort(currentGridData.begin(), currentGridData.end(), sortByRelativeName); - else sort(currentGridData.begin(), currentGridData.end(), sortByRelativeName); + if (sortAscending) std::sort(currentGridData.begin(), currentGridData.end(), sortByFileName); + else std::sort(currentGridData.begin(), currentGridData.end(), sortByFileName); } - else if (columnType == XmlGlobalSettings::SIZE) + else if (columnType == xmlAccess::REL_PATH) { - if (sortAscending) sort(currentGridData.begin(), currentGridData.end(), sortByFileSize); - else sort(currentGridData.begin(), currentGridData.end(), sortByFileSize); + if (sortAscending) std::sort(currentGridData.begin(), currentGridData.end(), sortByRelativeName); + else std::sort(currentGridData.begin(), currentGridData.end(), sortByRelativeName); } - else if (columnType == XmlGlobalSettings::DATE) + else if (columnType == xmlAccess::SIZE) { - if (sortAscending) sort(currentGridData.begin(), currentGridData.end(), sortByDate); - else sort(currentGridData.begin(), currentGridData.end(), sortByDate); + if (sortAscending) std::sort(currentGridData.begin(), currentGridData.end(), sortByFileSize); + else std::sort(currentGridData.begin(), currentGridData.end(), sortByFileSize); } + else if (columnType == xmlAccess::DATE) + { + if (sortAscending) std::sort(currentGridData.begin(), currentGridData.end(), sortByDate); + else std::sort(currentGridData.begin(), currentGridData.end(), sortByDate); + } + else assert(false); writeGrid(currentGridData); //needed to refresh gridRefUI references @@ -2042,8 +2174,6 @@ void MainDialog::OnSortRightGrid(wxGridEvent& event) m_gridRight->setSortMarker(currentSortColumn, globalResource.bitmapSmallUp); else m_gridRight->setSortMarker(currentSortColumn, globalResource.bitmapSmallDown); - - sortAscending = !sortAscending; } event.Skip(); } @@ -2051,23 +2181,29 @@ void MainDialog::OnSortRightGrid(wxGridEvent& event) void MainDialog::OnSortMiddleGrid(wxGridEvent& event) { - static bool columnSortAscending = true; + //determine direction for std::sort() + static bool sortAscending = true; + if (lastSortColumn != 0 || lastSortGrid != m_gridMiddle) + sortAscending = true; + else + sortAscending = !sortAscending; + lastSortColumn = 0; + lastSortGrid = m_gridMiddle; - if (columnSortAscending) sort(currentGridData.begin(), currentGridData.end(), sortByCmpResult); - else sort(currentGridData.begin(), currentGridData.end(), sortByCmpResult); + //start sort + if (sortAscending) std::sort(currentGridData.begin(), currentGridData.end(), sortByCmpResult); + else std::sort(currentGridData.begin(), currentGridData.end(), sortByCmpResult); writeGrid(currentGridData); //needed to refresh gridRefUI references //set sort direction indicator on UI m_gridLeft->setSortMarker(-1); m_gridRight->setSortMarker(-1); - if (columnSortAscending) + if (sortAscending) m_gridMiddle->setSortMarker(0, globalResource.bitmapSmallUp); else m_gridMiddle->setSortMarker(0, globalResource.bitmapSmallDown); - columnSortAscending = !columnSortAscending; - event.Skip(); } @@ -2088,6 +2224,11 @@ void MainDialog::OnSwapDirs( wxCommandEvent& event ) dirPair->m_directoryRight->SetValue(tmp); } + //swap view filter + std::swap(leftOnlyFilesActive, rightOnlyFilesActive); + std::swap(leftNewerFilesActive, rightNewerFilesActive); + updateViewFilterButtons(); + //swap grid information FreeFileSync::swapGrids(currentGridData); writeGrid(currentGridData); @@ -2142,7 +2283,7 @@ void MainDialog::updateStatusInformation(const GridView& visibleGrid) statusLeftNew+= _("1 directory"); else { - wxString folderCount = numberToWxString(foldersOnLeftView); + wxString folderCount = globalFunctions::numberToWxString(foldersOnLeftView); globalFunctions::includeNumberSeparator(folderCount); wxString outputString = _("%x directories"); @@ -2160,7 +2301,7 @@ void MainDialog::updateStatusInformation(const GridView& visibleGrid) statusLeftNew+= _("1 file,"); else { - wxString fileCount = numberToWxString(filesOnLeftView); + wxString fileCount = globalFunctions::numberToWxString(filesOnLeftView); globalFunctions::includeNumberSeparator(fileCount); wxString outputString = _("%x files,"); @@ -2171,7 +2312,7 @@ void MainDialog::updateStatusInformation(const GridView& visibleGrid) statusLeftNew+= FreeFileSync::formatFilesizeToShortString(filesizeLeftView); } - wxString objectsView = numberToWxString(visibleGrid.size()); + wxString objectsView = globalFunctions::numberToWxString(visibleGrid.size()); globalFunctions::includeNumberSeparator(objectsView); if (currentGridData.size() == 1) { @@ -2181,7 +2322,7 @@ void MainDialog::updateStatusInformation(const GridView& visibleGrid) } else { - wxString objectsTotal = numberToWxString(currentGridData.size()); + wxString objectsTotal = globalFunctions::numberToWxString(currentGridData.size()); globalFunctions::includeNumberSeparator(objectsTotal); wxString outputString = _("%x of %y rows in view"); @@ -2196,7 +2337,7 @@ void MainDialog::updateStatusInformation(const GridView& visibleGrid) statusRightNew+= _("1 directory"); else { - wxString folderCount = numberToWxString(foldersOnRightView); + wxString folderCount = globalFunctions::numberToWxString(foldersOnRightView); globalFunctions::includeNumberSeparator(folderCount); wxString outputString = _("%x directories"); @@ -2214,7 +2355,7 @@ void MainDialog::updateStatusInformation(const GridView& visibleGrid) statusRightNew+= _("1 file,"); else { - wxString fileCount = numberToWxString(filesOnRightView); + wxString fileCount = globalFunctions::numberToWxString(filesOnRightView); globalFunctions::includeNumberSeparator(fileCount); wxString outputString = _("%x files,"); @@ -2377,8 +2518,8 @@ void MainDialog::addFolderPair(const wxString& leftDir, const wxString& rightDir newPair->m_directoryRight->Connect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(MainDialog::OnWriteDirManually), NULL, this ); //prepare drag & drop - newPair->m_panelLeft->SetDropTarget(new FileDropEvent(this, newPair->m_panelLeft)); - newPair->m_panelRight->SetDropTarget(new FileDropEvent(this, newPair->m_panelRight)); + newPair->m_panelLeft->SetDropTarget(new MainWindowDropTarget(this, newPair->m_panelLeft)); //ownership passed + newPair->m_panelRight->SetDropTarget(new MainWindowDropTarget(this, newPair->m_panelRight)); //insert directory names if provided newPair->m_directoryLeft->SetValue(leftDir); @@ -2456,8 +2597,9 @@ CompareStatusHandler::CompareStatusHandler(MainDialog* dlg) : mainDialog->m_panel11->Disable(); mainDialog->m_panel12->Disable(); mainDialog->m_panel13->Disable(); - mainDialog->m_bpButton201->Disable(); - mainDialog->m_choiceLoad->Disable(); + mainDialog->m_bpButtonSave->Disable(); + mainDialog->m_bpButtonLoad->Disable(); + mainDialog->m_choiceHistory->Disable(); mainDialog->m_bpButton10->Disable(); mainDialog->m_bpButton14->Disable(); mainDialog->m_scrolledWindowFolderPairs->Disable(); @@ -2509,8 +2651,9 @@ CompareStatusHandler::~CompareStatusHandler() mainDialog->m_panel11->Enable(); mainDialog->m_panel12->Enable(); mainDialog->m_panel13->Enable(); - mainDialog->m_bpButton201->Enable(); - mainDialog->m_choiceLoad->Enable(); + mainDialog->m_bpButtonSave->Enable(); + mainDialog->m_bpButtonLoad->Enable(); + mainDialog->m_choiceHistory->Enable(); mainDialog->m_bpButton10->Enable(); mainDialog->m_bpButton14->Enable(); mainDialog->m_scrolledWindowFolderPairs->Enable(); @@ -2578,29 +2721,68 @@ ErrorHandler::Response CompareStatusHandler::reportError(const Zstring& text) bool ignoreNextErrors = false; wxString errorMessage = wxString(text.c_str()) + wxT("\n\n") + _("Ignore this error, retry or abort?"); - ErrorDlg* errorDlg = new ErrorDlg(mainDialog, errorMessage, ignoreNextErrors); - + ErrorDlg* errorDlg = new ErrorDlg(mainDialog, + ErrorDlg::BUTTON_IGNORE | ErrorDlg::BUTTON_RETRY | ErrorDlg::BUTTON_ABORT, + errorMessage, ignoreNextErrors); int rv = errorDlg->ShowModal(); switch (rv) { case ErrorDlg::BUTTON_IGNORE: ignoreErrors = ignoreNextErrors; return ErrorHandler::IGNORE_ERROR; + case ErrorDlg::BUTTON_RETRY: return ErrorHandler::RETRY; + case ErrorDlg::BUTTON_ABORT: - { - abortRequested = true; - throw AbortThisProcess(); - } - default: - assert (false); + abortThisProcess(); } + assert(false); return ErrorHandler::IGNORE_ERROR; //dummy return value } +void CompareStatusHandler::reportFatalError(const Zstring& errorMessage) +{ + mainDialog->compareStatus->updateStatusPanelNow(); + + bool dummy = false; + ErrorDlg* errorDlg = new ErrorDlg(mainDialog, + ErrorDlg::BUTTON_ABORT, + errorMessage.c_str(), dummy); + errorDlg->ShowModal(); + abortThisProcess(); +} + + +void CompareStatusHandler::reportWarning(const Zstring& warningMessage, bool& dontShowAgain) +{ + if (ignoreErrors) //if errors are ignored, then warnings should also + return; + + mainDialog->compareStatus->updateStatusPanelNow(); + + //show popup and ask user how to handle warning + bool dontWarnAgain = false; + WarningDlg* warningDlg = new WarningDlg(mainDialog, + WarningDlg::BUTTON_IGNORE | WarningDlg::BUTTON_ABORT, + warningMessage.c_str(), + dontWarnAgain); + switch (warningDlg->ShowModal()) + { + case WarningDlg::BUTTON_ABORT: + abortThisProcess(); + + case WarningDlg::BUTTON_IGNORE: + dontShowAgain = dontWarnAgain; + return; + } + + assert(false); +} + + inline void CompareStatusHandler::forceUiRefresh() { @@ -2610,6 +2792,7 @@ void CompareStatusHandler::forceUiRefresh() void CompareStatusHandler::abortThisProcess() { + abortRequested = true; throw AbortThisProcess(); //abort can be triggered by syncStatusFrame } //######################################################################################################## @@ -2635,7 +2818,14 @@ SyncStatusHandler::~SyncStatusHandler() result.Replace(wxT("%x"), globalFunctions::numberToWxString(failedItems), false); for (unsigned int j = 0; j < failedItems; ++j) - result+= unhandledErrors[j] + wxT("\n"); + { //remove linebreaks + wxString errorMessage = unhandledErrors[j]; + for (wxString::iterator i = errorMessage.begin(); i != errorMessage.end(); ++i) + if (*i == wxChar('\n')) + *i = wxChar(' '); + + result += errorMessage + wxT("\n"); + } result+= wxT("\n"); } @@ -2686,37 +2876,80 @@ void SyncStatusHandler::updateProcessedData(int objectsProcessed, double dataPro ErrorHandler::Response SyncStatusHandler::reportError(const Zstring& text) { + //add current time before error message + wxString errorWithTime = wxString(wxT("[")) + wxDateTime::Now().FormatTime() + wxT("] ") + text.c_str(); + if (ignoreErrors) { - unhandledErrors.Add(text.c_str()); + unhandledErrors.Add(errorWithTime); return ErrorHandler::IGNORE_ERROR; } syncStatusFrame->updateStatusDialogNow(); bool ignoreNextErrors = false; - wxString errorMessage = wxString(text.c_str()) + wxT("\n\n") + _("Ignore this error, retry or abort synchronization?"); - ErrorDlg* errorDlg = new ErrorDlg(syncStatusFrame, errorMessage, ignoreNextErrors); - + ErrorDlg* errorDlg = new ErrorDlg(syncStatusFrame, + ErrorDlg::BUTTON_IGNORE | ErrorDlg::BUTTON_RETRY | ErrorDlg::BUTTON_ABORT, + wxString(text) + wxT("\n\n") + _("Ignore this error, retry or abort synchronization?"), + ignoreNextErrors); int rv = errorDlg->ShowModal(); switch (rv) { case ErrorDlg::BUTTON_IGNORE: ignoreErrors = ignoreNextErrors; - unhandledErrors.Add(text.c_str()); + unhandledErrors.Add(errorWithTime); return ErrorHandler::IGNORE_ERROR; + case ErrorDlg::BUTTON_RETRY: return ErrorHandler::RETRY; + case ErrorDlg::BUTTON_ABORT: - { - unhandledErrors.Add(text.c_str()); - abortRequested = true; - throw AbortThisProcess(); + unhandledErrors.Add(errorWithTime); + abortThisProcess(); } - default: - assert (false); - return ErrorHandler::IGNORE_ERROR; + + assert (false); + unhandledErrors.Add(errorWithTime); + return ErrorHandler::IGNORE_ERROR; +} + + +void SyncStatusHandler::reportFatalError(const Zstring& errorMessage) +{ //add current time before error message + wxString errorWithTime = wxString(wxT("[")) + wxDateTime::Now().FormatTime() + wxT("] ") + errorMessage.c_str(); + + unhandledErrors.Add(errorWithTime); + abortThisProcess(); +} + + +void SyncStatusHandler::reportWarning(const Zstring& warningMessage, bool& dontShowAgain) +{ //add current time before warning message + wxString warningWithTime = wxString(wxT("[")) + wxDateTime::Now().FormatTime() + wxT("] ") + warningMessage.c_str(); + + if (ignoreErrors) //if errors are ignored, then warnings should also + return; //no unhandled error situation! + + syncStatusFrame->updateStatusDialogNow(); + + //show popup and ask user how to handle warning + bool dontWarnAgain = false; + WarningDlg* warningDlg = new WarningDlg(syncStatusFrame, + WarningDlg::BUTTON_IGNORE | WarningDlg::BUTTON_ABORT, + warningMessage.c_str(), + dontWarnAgain); + switch (warningDlg->ShowModal()) + { + case WarningDlg::BUTTON_IGNORE: //no unhandled error situation! + dontShowAgain = dontWarnAgain; + return; + + case WarningDlg::BUTTON_ABORT: + unhandledErrors.Add(warningWithTime); + abortThisProcess(); } + + assert(false); } @@ -2728,6 +2961,7 @@ void SyncStatusHandler::forceUiRefresh() void SyncStatusHandler::abortThisProcess() { + abortRequested = true; throw AbortThisProcess(); //abort can be triggered by syncStatusFrame } //######################################################################################################## @@ -2759,7 +2993,6 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event) if (messageDlg->ShowModal() != wxID_OK) { pushStatusInformation(_("Save aborted!")); - event.Skip(); return; } } @@ -2801,21 +3034,25 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event) wxMessageBox(wxString(_("Error writing file:")) + wxT(" \"") + fileName + wxT("\""), _("Error"), wxOK | wxICON_ERROR); } } - - event.Skip(); } void MainDialog::OnMenuBatchJob(wxCommandEvent& event) { - std::vector folderPairs; - getFolderPairs(folderPairs); + //fill batch config structure + xmlAccess::XmlBatchConfig batchCfg; + batchCfg.mainCfg = cfg; + batchCfg.directoryPairs = getFolderPairs(); + batchCfg.silent = false; - BatchDialog* batchDlg = new BatchDialog(this, cfg, folderPairs); - if (batchDlg->ShowModal() == BatchDialog::batchFileCreated) - pushStatusInformation(_("Batch file created successfully!")); + if (ignoreErrors) + batchCfg.handleError = xmlAccess::ON_ERROR_IGNORE; + else + batchCfg.handleError = xmlAccess::ON_ERROR_POPUP; - event.Skip(); + BatchDialog* batchDlg = new BatchDialog(this, batchCfg); + if (batchDlg->ShowModal() == BatchDialog::BATCH_FILE_SAVED) + pushStatusInformation(_("Batch file created successfully!")); } @@ -2837,73 +3074,72 @@ void MainDialog::OnMenuQuit(wxCommandEvent& event) //######################################################################################################### //language selection -void MainDialog::changeProgramLanguage(const int langID) +void MainDialog::switchProgramLanguage(const int langID) { programLanguage->setLanguage(langID); //language is a global attribute - restartOnExit = true; + + //create new main window and delete old one + cleanUp(); //destructor's code: includes writing settings to HD + + //create new dialog with respect to new language + MainDialog* frame = new MainDialog(NULL, FreeFileSync::LAST_CONFIG_FILE, programLanguage, globalSettings); + frame->SetIcon(*globalResource.programIcon); //set application icon + frame->Show(); + Destroy(); } void MainDialog::OnMenuLangChineseSimp(wxCommandEvent& event) { - changeProgramLanguage(wxLANGUAGE_CHINESE_SIMPLIFIED); - event.Skip(); + switchProgramLanguage(wxLANGUAGE_CHINESE_SIMPLIFIED); } void MainDialog::OnMenuLangDutch(wxCommandEvent& event) { - changeProgramLanguage(wxLANGUAGE_DUTCH); - event.Skip(); + switchProgramLanguage(wxLANGUAGE_DUTCH); } void MainDialog::OnMenuLangEnglish(wxCommandEvent& event) { - changeProgramLanguage(wxLANGUAGE_ENGLISH); - event.Skip(); + switchProgramLanguage(wxLANGUAGE_ENGLISH); } void MainDialog::OnMenuLangFrench(wxCommandEvent& event) { - changeProgramLanguage(wxLANGUAGE_FRENCH); - event.Skip(); + switchProgramLanguage(wxLANGUAGE_FRENCH); } void MainDialog::OnMenuLangGerman(wxCommandEvent& event) { - changeProgramLanguage(wxLANGUAGE_GERMAN); - event.Skip(); + switchProgramLanguage(wxLANGUAGE_GERMAN); } void MainDialog::OnMenuLangItalian(wxCommandEvent& event) { - changeProgramLanguage(wxLANGUAGE_ITALIAN); - event.Skip(); + switchProgramLanguage(wxLANGUAGE_ITALIAN); } void MainDialog::OnMenuLangJapanese(wxCommandEvent& event) { - changeProgramLanguage(wxLANGUAGE_JAPANESE); - event.Skip(); + switchProgramLanguage(wxLANGUAGE_JAPANESE); } void MainDialog::OnMenuLangPolish(wxCommandEvent& event) { - changeProgramLanguage(wxLANGUAGE_POLISH); - event.Skip(); + switchProgramLanguage(wxLANGUAGE_POLISH); } void MainDialog::OnMenuLangPortuguese(wxCommandEvent& event) { - changeProgramLanguage(wxLANGUAGE_PORTUGUESE); - event.Skip(); + switchProgramLanguage(wxLANGUAGE_PORTUGUESE); } diff --git a/ui/MainDialog.h b/ui/MainDialog.h index 6c594b14..fe5471a1 100644 --- a/ui/MainDialog.h +++ b/ui/MainDialog.h @@ -1,10 +1,8 @@ /*************************************************************** - * Name: FreeFileSyncMain.h + * Name: mainDialog.h * Purpose: Defines Application Frame * Author: ZenJu (zhnmju123@gmx.de) * Created: 2008-07-16 - * Copyright: ZenJu () - * License: **************************************************************/ #ifndef MAINDIALOG_H @@ -18,10 +16,11 @@ #include #include #include "../library/processXml.h" +#include //IDs for context menu items -enum ContextItem +enum //context menu for left and right grids { CONTEXT_FILTER_TEMP = 10, CONTEXT_EXCLUDE_EXT, @@ -29,14 +28,23 @@ enum ContextItem CONTEXT_CLIPBOARD, CONTEXT_EXPLORER, CONTEXT_DELETE_FILES, +}; + +enum //context menu for middle grid +{ + CONTEXT_CHECK_ALL, + CONTEXT_UNCHECK_ALL +}; + +enum //context menu for column settings +{ CONTEXT_CUSTOMIZE_COLUMN_LEFT, CONTEXT_CUSTOMIZE_COLUMN_RIGHT }; -extern const wxGrid* leadGrid; //point to grid that is in focus - class CompareStatusHandler; class FileDropEvent; +class FfsFileDropEvent; class MainDialog : public MainDialogGenerated { @@ -48,6 +56,8 @@ public: ~MainDialog(); private: + void cleanUp(); + //configuration load/save bool readConfigurationFromXml(const wxString& filename, bool programStartup = false); bool writeConfigurationToXml(const wxString& filename); @@ -74,7 +84,7 @@ private: void filterRangeManually(const std::set& rowsToFilterOnUiTable); void copySelectionToClipboard(const wxGrid* selectedGrid); void openWithFileManager(int rowNumber, const wxGrid* grid); - void deleteFilesOnGrid(const std::set& rowsToDeleteOnUI); + void deleteFilesOnGrid(const std::set& selectedRowsLeft, const std::set& selectedRowsRight); //work to be done in idle time void OnIdleEvent(wxEvent& event); @@ -91,9 +101,13 @@ private: void onGridLeftButtonEvent(wxKeyEvent& event); void onGridRightButtonEvent(wxKeyEvent& event); void onGridMiddleButtonEvent(wxKeyEvent& event); - void OnOpenContextMenu(wxGridEvent& event); - void OnColumnMenuLeft(wxGridEvent& event); - void OnColumnMenuRight(wxGridEvent& event); + void OnContextMenu(wxGridEvent& event); + void OnContextMenuSelection(wxCommandEvent& event); + void OnContextMenuMiddle(wxGridEvent& event); + void OnContextMenuMiddleSelection(wxCommandEvent& event); + void OnContextColumnLeft(wxGridEvent& event); + void OnContextColumnRight(wxGridEvent& event); + void OnContextColumnSelection(wxCommandEvent& event); void OnWriteDirManually(wxCommandEvent& event); void OnDirSelected(wxFileDirPickerEvent& event); @@ -103,8 +117,6 @@ private: void OnGrid3LeftMouseUp(wxEvent& event); void OnGrid3LeftMouseDown(wxEvent& event); - void onContextMenuSelection(wxCommandEvent& event); - void OnLeftGridDoubleClick( wxGridEvent& event); void OnRightGridDoubleClick(wxGridEvent& event); void OnSortLeftGrid( wxGridEvent& event); @@ -120,9 +132,11 @@ private: void OnSaveConfig( wxCommandEvent& event); void OnLoadConfig( wxCommandEvent& event); + void OnLoadFromHistory( wxCommandEvent& event); void loadConfiguration(const wxString& filename); void OnChoiceKeyEvent( wxKeyEvent& event ); + void OnFilesDropped( FfsFileDropEvent& event); void onResizeMainWindow( wxEvent& event); void OnAbortCompare( wxCommandEvent& event); void OnFilterButton( wxCommandEvent& event); @@ -158,7 +172,7 @@ private: void OnMenuLangPolish( wxCommandEvent& event); void OnMenuLangPortuguese( wxCommandEvent& event); - void changeProgramLanguage(const int langID); + void switchProgramLanguage(const int langID); void enableSynchronization(bool value); //*********************************************** @@ -187,10 +201,11 @@ private: int posXNotMaximized; int posYNotMaximized; bool hideFilteredElements; + bool ignoreErrors; //------------------------------------- //convenience method to get all folder pairs (unformatted) - void getFolderPairs(std::vector& output, bool formatted = false); + std::vector getFolderPairs(); //UI View Filter settings bool leftOnlyFilesActive; @@ -201,7 +216,7 @@ private: bool rightOnlyFilesActive; //*********************************************** - wxMenu* contextMenu; + std::auto_ptr contextMenu; CustomLocale* programLanguage; @@ -212,9 +227,11 @@ private: //compare status panel (hidden on start, shown when comparing) CompareStatus* compareStatus; - //save the last used config filenames + //save the last used config filename history std::vector cfgFileNames; - static const unsigned int CFG_HISTORY_LENGTH = 10; + + //used when saving configuration + wxString proposedConfigFileName; //variables for filtering of m_grid3 bool filteringInitialized; @@ -231,26 +248,51 @@ private: bool synchronizationEnabled; //determines whether synchronization should be allowed - bool restartOnExit; //restart dialog on exit (currently used, when language is changed) - CompareStatusHandler* cmpStatusHandlerTmp; //used only by the abort button when comparing + + bool cleanedUp; //determines if destructor code was already executed + + //remember last sort executed (for determination of sort order) + int lastSortColumn; + const wxGrid* lastSortGrid; + + const wxGrid* leadGrid; //point to grid that is in focus }; //###################################################################################### +//define new event type +const wxEventType FFS_DROP_FILE_EVENT = wxNewEventType(); +typedef void (wxEvtHandler::*FffsFileDropEventFunction)(FfsFileDropEvent&); +#define FfsFileDropEventHandler(func) \ + (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(FffsFileDropEventFunction, &func) -class FileDropEvent : public wxFileDropTarget +class FfsFileDropEvent : public wxCommandEvent { public: - FileDropEvent(MainDialog* dlg, const wxPanel* obj) : - mainDlg(dlg), - dropTarget(obj) - {} + FfsFileDropEvent(const wxString& nameDropped, const wxPanel* dropTarget) : + wxCommandEvent(FFS_DROP_FILE_EVENT), + m_nameDropped(nameDropped), + m_dropTarget(dropTarget) {} - ~FileDropEvent() {} + virtual wxEvent* Clone() const + { + return new FfsFileDropEvent(m_nameDropped, m_dropTarget); + } + + const wxString m_nameDropped; + const wxPanel* m_dropTarget; +}; + + +class MainWindowDropTarget : public wxFileDropTarget +{ +public: + MainWindowDropTarget(MainDialog* dlg, const wxPanel* obj) : + mainDlg(dlg), + dropTarget(obj) {} - //overwritten virtual method - bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames); + virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames); private: MainDialog* mainDlg; @@ -270,10 +312,12 @@ public: void updateStatusText(const Zstring& text); void initNewProcess(int objectsTotal, double dataTotal, Process processID); void updateProcessedData(int objectsProcessed, double dataProcessed); - ErrorHandler::Response reportError(const Zstring& text); - void forceUiRefresh(); + ErrorHandler::Response reportError(const Zstring& text); + void reportFatalError(const Zstring& errorMessage); + void reportWarning(const Zstring& warningMessage, bool& dontShowAgain); + private: void abortThisProcess(); @@ -292,10 +336,12 @@ public: void updateStatusText(const Zstring& text); void initNewProcess(int objectsTotal, double dataTotal, Process processID); void updateProcessedData(int objectsProcessed, double dataProcessed); - ErrorHandler::Response reportError(const Zstring& text); - void forceUiRefresh(); + ErrorHandler::Response reportError(const Zstring& text); + void reportFatalError(const Zstring& errorMessage); + void reportWarning(const Zstring& warningMessage, bool& dontShowAgain); + private: void abortThisProcess(); diff --git a/ui/SmallDialogs.cpp b/ui/SmallDialogs.cpp index f451c1fd..69952f67 100644 --- a/ui/SmallDialogs.cpp +++ b/ui/SmallDialogs.cpp @@ -4,6 +4,7 @@ #include "../algorithm.h" #include #include "../library/customGrid.h" +#include "../library/customButton.h" using namespace FreeFileSync; @@ -39,13 +40,13 @@ AboutDlg::~AboutDlg() {} void AboutDlg::OnClose(wxCloseEvent& event) { - Destroy(); + EndModal(0); } void AboutDlg::OnOK(wxCommandEvent& event) { - Destroy(); + EndModal(0); } //######################################################################################## @@ -168,19 +169,48 @@ void FilterDlg::OnClose(wxCloseEvent& event) { EndModal(0); } + + //######################################################################################## +DeleteDialog::DeleteDialog(wxWindow* main, + const FileCompareResult& grid, + const std::set& rowsOnLeft, + const std::set& rowsOnRight, + bool& deleteOnBothSides, + bool& useRecycleBin) : + DeleteDlgGenerated(main), + mainGrid(grid), + rowsToDeleteOnLeft(rowsOnLeft), + rowsToDeleteOnRight(rowsOnRight), + m_deleteOnBothSides(deleteOnBothSides), + m_useRecycleBin(useRecycleBin) +{ + m_checkBoxDeleteBothSides->SetValue(deleteOnBothSides); + m_checkBoxUseRecycler->SetValue(useRecycleBin); + updateTexts(); -DeleteDialog::DeleteDialog(const wxString& headerText, const wxString& messageText, wxWindow* main) : - DeleteDlgGenerated(main) -{ - m_staticTextHeader->SetLabel(headerText); - m_textCtrlMessage->SetValue(messageText); m_bitmap12->SetBitmap(*globalResource.bitmapDeleteFile); - m_buttonOK->SetFocus(); } -DeleteDialog::~DeleteDialog() {} + +void DeleteDialog::updateTexts() +{ + wxString headerText; + if (m_checkBoxUseRecycler->GetValue()) + headerText = _("Do you really want to move the following objects(s) to the Recycle Bin?"); + else + headerText = _("Do you really want to delete the following objects(s)?"); + m_staticTextHeader->SetLabel(headerText); + + wxString filesToDelete = FreeFileSync::deleteFromGridAndHDPreview(mainGrid, + rowsToDeleteOnLeft, + rowsToDeleteOnRight, + m_checkBoxDeleteBothSides->GetValue()); + m_textCtrlMessage->SetValue(filesToDelete); + + Layout(); +} void DeleteDialog::OnOK(wxCommandEvent& event) @@ -197,17 +227,50 @@ void DeleteDialog::OnClose(wxCloseEvent& event) { EndModal(BUTTON_CANCEL); } + +void DeleteDialog::OnDelOnBothSides(wxCommandEvent& event) +{ + m_deleteOnBothSides = m_checkBoxDeleteBothSides->GetValue(); + updateTexts(); +} + +void DeleteDialog::OnUseRecycler(wxCommandEvent& event) +{ + if (m_checkBoxUseRecycler->GetValue()) + { + if (!FreeFileSync::recycleBinExists()) + { + wxMessageBox(_("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. :)"), _("Error") , wxOK | wxICON_ERROR); + m_checkBoxUseRecycler->SetValue(false); + } + } + + m_useRecycleBin = m_checkBoxUseRecycler->GetValue(); + updateTexts(); +} //######################################################################################## -ErrorDlg::ErrorDlg(wxWindow* parentWindow, const wxString messageText, bool& ignoreNextErrors) : +ErrorDlg::ErrorDlg(wxWindow* parentWindow, const int activeButtons, const wxString messageText, bool& ignoreNextErrors) : ErrorDlgGenerated(parentWindow), ignoreErrors(ignoreNextErrors) { - m_bitmap10->SetBitmap(*globalResource.bitmapWarning); + m_bitmap10->SetBitmap(*globalResource.bitmapError); m_textCtrl8->SetValue(messageText); - m_buttonRetry->SetFocus(); + if (~activeButtons & BUTTON_IGNORE) + { + m_buttonIgnore->Hide(); + m_checkBoxIgnoreErrors->Hide(); + } + + if (activeButtons & BUTTON_RETRY) + m_buttonRetry->SetFocus(); + else + m_buttonRetry->Hide(); + + if (~activeButtons & BUTTON_ABORT) + m_buttonAbort->Hide(); } ErrorDlg::~ErrorDlg() {} @@ -250,20 +313,13 @@ WarningDlg::WarningDlg(wxWindow* parentWindow, int activeButtons, const wxStrin m_textCtrl8->SetValue(messageText); if (~activeButtons & BUTTON_IGNORE) + { m_buttonIgnore->Hide(); - - if (activeButtons & BUTTON_RESOLVE) - m_buttonResolve->SetFocus(); - else - m_buttonResolve->Hide(); + m_checkBoxDontShowAgain->Hide(); + } if (~activeButtons & BUTTON_ABORT) m_buttonAbort->Hide(); - - if (activeButtons & BUTTON_OKAY) - m_buttonOK->SetFocus(); - else - m_buttonOK->Hide(); } WarningDlg::~WarningDlg() {} @@ -283,45 +339,32 @@ void WarningDlg::OnIgnore(wxCommandEvent& event) } -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); -} - - //######################################################################################## -CustomizeColsDlg::CustomizeColsDlg(wxWindow* window, xmlAccess::XmlGlobalSettings::ColumnAttributes& attr) : +CustomizeColsDlg::CustomizeColsDlg(wxWindow* window, xmlAccess::ColumnAttributes& attr) : CustomizeColsDlgGenerated(window), output(attr) { m_bpButton29->SetBitmapLabel(*globalResource.bitmapMoveUp); m_bpButton30->SetBitmapLabel(*globalResource.bitmapMoveDown); - xmlAccess::XmlGlobalSettings::ColumnAttributes columnSettings = attr; + xmlAccess::ColumnAttributes columnSettings = attr; sort(columnSettings.begin(), columnSettings.end(), xmlAccess::sortByPositionOnly); - for (xmlAccess::XmlGlobalSettings::ColumnAttributes::const_iterator i = columnSettings.begin(); i != columnSettings.end(); ++i) //love these iterators! + for (xmlAccess::ColumnAttributes::const_iterator i = columnSettings.begin(); i != columnSettings.end(); ++i) //love these iterators! { m_checkListColumns->Append(CustomGrid::getTypeName(i->type)); m_checkListColumns->Check(i - columnSettings.begin(), i->visible); } m_checkListColumns->SetSelection(0); + Fit(); } @@ -330,7 +373,7 @@ void CustomizeColsDlg::OnOkay(wxCommandEvent& event) for (int i = 0; i < int(m_checkListColumns->GetCount()); ++i) { const wxString label = m_checkListColumns->GetString(i); - for (xmlAccess::XmlGlobalSettings::ColumnAttributes::iterator j = output.begin(); j != output.end(); ++j) + for (xmlAccess::ColumnAttributes::iterator j = output.begin(); j != output.end(); ++j) { if (CustomGrid::getTypeName(j->type) == label) //not nice but short and no performance issue { @@ -347,10 +390,13 @@ void CustomizeColsDlg::OnOkay(wxCommandEvent& event) void CustomizeColsDlg::OnDefault(wxCommandEvent& event) { - for (unsigned i = 0; i < m_checkListColumns->GetCount(); ++i) + xmlAccess::ColumnAttributes defaultColumnAttr = CustomGrid::getDefaultColumnAttributes(); + + m_checkListColumns->Clear(); + for (xmlAccess::ColumnAttributes::const_iterator i = defaultColumnAttr.begin(); i != defaultColumnAttr.end(); ++i) { - m_checkListColumns->SetString(i, CustomGrid::getTypeName(xmlAccess::XmlGlobalSettings::ColumnTypes(i))); - m_checkListColumns->Check(i, true); + m_checkListColumns->Append(CustomGrid::getTypeName(i->type)); + m_checkListColumns->Check(i - defaultColumnAttr.begin(), i->visible); } } @@ -381,7 +427,6 @@ void CustomizeColsDlg::OnMoveUp(wxCommandEvent& event) m_checkListColumns->Check(pos - 1, checked); m_checkListColumns->Select(pos - 1); } - event.Skip(); } @@ -399,7 +444,6 @@ void CustomizeColsDlg::OnMoveDown(wxCommandEvent& event) m_checkListColumns->Check(pos + 1, checked); m_checkListColumns->Select(pos + 1); } - event.Skip(); } //######################################################################################## @@ -408,13 +452,16 @@ GlobalSettingsDlg::GlobalSettingsDlg(wxWindow* window, xmlAccess::XmlGlobalSetti settings(globalSettings) { m_bitmapSettings->SetBitmap(*globalResource.bitmapSettings); + m_buttonResetWarnings->setBitmapFront(*globalResource.bitmapWarningSmall, 5); #ifdef FFS_WIN - m_checkBoxHandleDstFat->SetValue(globalSettings.global.handleDstOnFat32); + m_checkBoxHandleDstFat->SetValue(globalSettings.shared.handleDstOnFat32); #else m_checkBoxHandleDstFat->Hide(); #endif m_textCtrlFileManager->SetValue(globalSettings.gui.commandLineFileManager); + + Fit(); } @@ -422,7 +469,7 @@ void GlobalSettingsDlg::OnOkay(wxCommandEvent& event) { //write global settings only when okay-button is pressed! #ifdef FFS_WIN - settings.global.handleDstOnFat32 = m_checkBoxHandleDstFat->GetValue(); + settings.shared.handleDstOnFat32 = m_checkBoxHandleDstFat->GetValue(); #endif settings.gui.commandLineFileManager = m_textCtrlFileManager->GetValue(); @@ -430,11 +477,19 @@ void GlobalSettingsDlg::OnOkay(wxCommandEvent& event) } +void GlobalSettingsDlg::OnResetWarnings(wxCommandEvent& event) +{ + wxMessageDialog* messageDlg = new wxMessageDialog(this, _("Reset all warning messages?"), _("Warning") , wxOK | wxCANCEL); + if (messageDlg->ShowModal() == wxID_OK) + settings.shared.resetWarnings(); +} + + void GlobalSettingsDlg::OnDefault(wxCommandEvent& event) { m_checkBoxHandleDstFat->SetValue(true); #ifdef FFS_WIN - m_textCtrlFileManager->SetValue(wxT("explorer /select, %x")); + m_textCtrlFileManager->SetValue(wxT("explorer /select, %name")); #elif defined FFS_LINUX m_textCtrlFileManager->SetValue(wxT("konqueror \"%path\"")); #endif diff --git a/ui/SmallDialogs.h b/ui/SmallDialogs.h index 5be461d2..1425d822 100644 --- a/ui/SmallDialogs.h +++ b/ui/SmallDialogs.h @@ -57,8 +57,14 @@ private: class DeleteDialog : public DeleteDlgGenerated { public: - DeleteDialog(const wxString& headerText, const wxString& messageText, wxWindow* main); - ~DeleteDialog(); + DeleteDialog(wxWindow* main, + const FileCompareResult& grid, + const std::set& rowsOnLeft, + const std::set& rowsOnRight, + bool& deleteOnBothSides, + bool& useRecycleBin); + + ~DeleteDialog() {} enum { @@ -70,20 +76,30 @@ private: void OnOK(wxCommandEvent& event); void OnCancel(wxCommandEvent& event); void OnClose(wxCloseEvent& event); + void OnDelOnBothSides(wxCommandEvent& event); + void OnUseRecycler(wxCommandEvent& event); + + void updateTexts(); + + const FileCompareResult& mainGrid; + const std::set& rowsToDeleteOnLeft; + const std::set& rowsToDeleteOnRight; + bool& m_deleteOnBothSides; + bool& m_useRecycleBin; }; class ErrorDlg : public ErrorDlgGenerated { public: - ErrorDlg(wxWindow* parentWindow, const wxString messageText, bool& ignoreNextErrors); + ErrorDlg(wxWindow* parentWindow, const int activeButtons, const wxString messageText, bool& ignoreNextErrors); ~ErrorDlg(); enum { - BUTTON_IGNORE, - BUTTON_RETRY, - BUTTON_ABORT + BUTTON_IGNORE = 1, + BUTTON_RETRY = 2, + BUTTON_ABORT = 4 }; private: @@ -99,15 +115,13 @@ private: class WarningDlg : public WarningDlgGenerated { public: - WarningDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool& dontShowAgain); + WarningDlg(wxWindow* parentWindow, int activeButtons, const wxString messageText, bool& dontShowAgain); ~WarningDlg(); enum { BUTTON_IGNORE = 1, - BUTTON_RESOLVE = 2, - BUTTON_ABORT = 4, - BUTTON_OKAY = 8 + BUTTON_ABORT = 2 }; private: @@ -124,7 +138,7 @@ private: class CustomizeColsDlg : public CustomizeColsDlgGenerated { public: - CustomizeColsDlg(wxWindow* window, xmlAccess::XmlGlobalSettings::ColumnAttributes& attr); + CustomizeColsDlg(wxWindow* window, xmlAccess::ColumnAttributes& attr); ~CustomizeColsDlg() {} enum @@ -141,7 +155,7 @@ private: void OnMoveUp(wxCommandEvent& event); void OnMoveDown(wxCommandEvent& event); - xmlAccess::XmlGlobalSettings::ColumnAttributes& output; + xmlAccess::ColumnAttributes& output; }; @@ -158,6 +172,7 @@ public: private: void OnOkay(wxCommandEvent& event); + void OnResetWarnings(wxCommandEvent& event); void OnDefault(wxCommandEvent& event); void OnCancel(wxCommandEvent& event); void OnClose(wxCloseEvent& event); diff --git a/ui/SyncDialog.cpp b/ui/SyncDialog.cpp index f630abc3..99c7dfde 100644 --- a/ui/SyncDialog.cpp +++ b/ui/SyncDialog.cpp @@ -1,30 +1,29 @@ #include "syncDialog.h" #include "../library/globalFunctions.h" #include "../library/resources.h" -#include "../library/processXml.h" #include #include #include #include "../library/customButton.h" #include "../synchronization.h" #include "../algorithm.h" - - -using namespace xmlAccess; +#include SyncDialog::SyncDialog(wxWindow* window, const FileCompareResult& gridDataRef, MainConfiguration& config, + bool& ignoreErrors, bool synchronizationEnabled) : SyncDlgGenerated(window), gridData(gridDataRef), - cfg(config) + cfg(config), + m_ignoreErrors(ignoreErrors) { //make working copy of mainDialog.cfg.syncConfiguration and recycler setting localSyncConfiguration = config.syncConfiguration; m_checkBoxUseRecycler->SetValue(cfg.useRecycleBin); - m_checkBoxIgnoreErrors->SetValue(cfg.ignoreErrors); + m_checkBoxIgnoreErrors->SetValue(m_ignoreErrors); //set sync config icons updateConfigIcons(m_bpButton5, m_bpButton6, m_bpButton7, m_bpButton8, m_bpButton9, localSyncConfiguration); @@ -241,7 +240,7 @@ void SyncDialog::OnBack(wxCommandEvent& event) //write configuration to main dialog cfg.syncConfiguration = localSyncConfiguration; cfg.useRecycleBin = m_checkBoxUseRecycler->GetValue(); - cfg.ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); + m_ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); EndModal(0); } @@ -251,7 +250,7 @@ void SyncDialog::OnStartSync(wxCommandEvent& event) //write configuration to main dialog cfg.syncConfiguration = localSyncConfiguration; cfg.useRecycleBin = m_checkBoxUseRecycler->GetValue(); - cfg.ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); + m_ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); EndModal(BUTTON_START); } @@ -382,61 +381,53 @@ void SyncDialog::OnDifferent( wxCommandEvent& event ) //################################################################################################################################### -BatchDialog::BatchDialog(wxWindow* window, - const MainConfiguration& config, - const std::vector& folderPairs) : - BatchDlgGenerated(window) +class BatchFileDropEvent : public wxFileDropTarget { - //make working copy of mainDialog.cfg.syncConfiguration and recycler setting - localSyncConfiguration = config.syncConfiguration; - SyncDialog::updateConfigIcons(m_bpButton5, m_bpButton6, m_bpButton7, m_bpButton8, m_bpButton9, localSyncConfiguration); - - m_checkBoxUseRecycler->SetValue(config.useRecycleBin); - m_checkBoxIgnoreErrors->SetValue(config.ignoreErrors); +public: + BatchFileDropEvent(BatchDialog* dlg) : + batchDlg(dlg) {} - switch (config.compareVar) + virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames) { - case CMP_BY_TIME_SIZE: - m_radioBtnSizeDate->SetValue(true); - break; - case CMP_BY_CONTENT: - m_radioBtnContent->SetValue(true); - break; - default: - assert (false); - } - //adjust toolTip - SyncDialog::adjustToolTips(m_bitmap17, config.compareVar); + if (!filenames.IsEmpty()) + { + const wxString droppedFileName = filenames[0]; - filterIsActive = config.filterIsActive; - updateFilterButton(); + xmlAccess::XmlType fileType = xmlAccess::getXmlType(droppedFileName); - m_textCtrlInclude->SetValue(config.includeFilter); - m_textCtrlExclude->SetValue(config.excludeFilter); + //test if ffs batch file has been dropped + if (fileType == xmlAccess::XML_BATCH_CONFIG) + batchDlg->loadBatchFile(droppedFileName); + } + return false; + } +private: + BatchDialog* batchDlg; +}; - //add folder pairs - int scrWindowHeight = 0; - for (std::vector::const_iterator i = folderPairs.begin(); i != folderPairs.end(); ++i) - { - BatchFolderPairGenerated* newPair = new BatchFolderPairGenerated(m_scrolledWindow6); - newPair->m_directoryLeft->SetValue(i->leftDirectory.c_str()); - newPair->m_directoryRight->SetValue(i->rightDirectory.c_str()); - bSizerFolderPairs->Add( newPair, 0, wxEXPAND, 5); - localFolderPairs.push_back(newPair); +BatchDialog::BatchDialog(wxWindow* window, const xmlAccess::XmlBatchConfig& batchCfg) : + BatchDlgGenerated(window) +{ + init(); + loadBatchCfg(batchCfg); +} - if (i == folderPairs.begin()) - scrWindowHeight = newPair->GetSize().GetHeight(); - } - //set size of scrolled window - int pairCount = std::min(localFolderPairs.size(), size_t(3)); //up to 3 additional pairs shall be shown - m_scrolledWindow6->SetMinSize(wxSize( -1, scrWindowHeight * pairCount)); - m_scrolledWindow6->Fit(); - m_scrolledWindow6->Layout(); +BatchDialog::BatchDialog(wxWindow* window, const wxString& filename) : + BatchDlgGenerated(window) +{ + init(); + loadBatchFile(filename); +} +void BatchDialog::init() +{ + //prepare drag & drop + SetDropTarget(new BatchFileDropEvent(this)); + //set icons for this dialog m_bitmap13->SetBitmap(*globalResource.bitmapLeftOnly); m_bitmap14->SetBitmap(*globalResource.bitmapRightOnly); @@ -446,17 +437,9 @@ BatchDialog::BatchDialog(wxWindow* window, m_bitmap8->SetBitmap(*globalResource.bitmapInclude); m_bitmap9->SetBitmap(*globalResource.bitmapExclude); m_bitmap27->SetBitmap(*globalResource.bitmapBatch); - - Fit(); - Centre(); - m_buttonCreate->SetFocus(); } -BatchDialog::~BatchDialog() -{} - - void BatchDialog::updateFilterButton() { if (filterIsActive) @@ -478,30 +461,104 @@ void BatchDialog::updateFilterButton() } +xmlAccess::OnError BatchDialog::getSelectionHandleError() +{ + switch (m_choiceHandleError->GetSelection()) + { + case 0: + return xmlAccess::ON_ERROR_POPUP; + case 1: + return xmlAccess::ON_ERROR_IGNORE; + case 2: + return xmlAccess::ON_ERROR_EXIT; + default: + assert(false); + return xmlAccess::ON_ERROR_POPUP; + } +} + + +void updateToolTip(wxChoice* choiceHandleError, const xmlAccess::OnError value) +{ + switch (value) + { + case xmlAccess::ON_ERROR_POPUP: + choiceHandleError->SetToolTip(_("Show popup on errors or warnings")); + break; + case xmlAccess::ON_ERROR_IGNORE: + choiceHandleError->SetToolTip(_("Hide all error and warning messages")); + break; + case xmlAccess::ON_ERROR_EXIT: + choiceHandleError->SetToolTip(_("Exit immediately and set returncode < 0")); + break; + default: + assert(false); + choiceHandleError->SetToolTip(wxEmptyString); + } +} + + +void BatchDialog::setSelectionHandleError(const xmlAccess::OnError value) +{ + m_choiceHandleError->Clear(); + m_choiceHandleError->Append(_("Show popup")); + m_choiceHandleError->Append(_("Ignore errors")); + m_choiceHandleError->Append(_("Exit with RC < 0")); + + switch (value) + { + case xmlAccess::ON_ERROR_POPUP: + m_choiceHandleError->SetSelection(0); + break; + case xmlAccess::ON_ERROR_IGNORE: + m_choiceHandleError->SetSelection(1); + break; + case xmlAccess::ON_ERROR_EXIT: + m_choiceHandleError->SetSelection(2); + break; + default: + assert(false); + m_choiceHandleError->SetSelection(0); + } + + updateToolTip(m_choiceHandleError, getSelectionHandleError()); +} + + +void BatchDialog::OnChangeErrorHandling(wxCommandEvent& event) +{ + updateToolTip(m_choiceHandleError, getSelectionHandleError()); +} + + void BatchDialog::OnExLeftSideOnly(wxCommandEvent& event) { toggleSyncDirection(localSyncConfiguration.exLeftSideOnly); SyncDialog::updateConfigIcons(m_bpButton5, m_bpButton6, m_bpButton7, m_bpButton8, m_bpButton9, localSyncConfiguration); } + void BatchDialog::OnExRightSideOnly(wxCommandEvent& event) { toggleSyncDirection(localSyncConfiguration.exRightSideOnly); SyncDialog::updateConfigIcons(m_bpButton5, m_bpButton6, m_bpButton7, m_bpButton8, m_bpButton9, localSyncConfiguration); } + void BatchDialog::OnLeftNewer(wxCommandEvent& event) { toggleSyncDirection(localSyncConfiguration.leftNewer); SyncDialog::updateConfigIcons(m_bpButton5, m_bpButton6, m_bpButton7, m_bpButton8, m_bpButton9, localSyncConfiguration); } + void BatchDialog::OnRightNewer(wxCommandEvent& event) { toggleSyncDirection(localSyncConfiguration.rightNewer); SyncDialog::updateConfigIcons(m_bpButton5, m_bpButton6, m_bpButton7, m_bpButton8, m_bpButton9, localSyncConfiguration); } + void BatchDialog::OnDifferent(wxCommandEvent& event) { toggleSyncDirection(localSyncConfiguration.different); @@ -518,7 +575,7 @@ void BatchDialog::OnFilterButton(wxCommandEvent& event) void BatchDialog::OnSelectRecycleBin(wxCommandEvent& event) { - if (event.IsChecked()) + if (m_checkBoxUseRecycler->GetValue()) { if (!FreeFileSync::recycleBinExists()) { @@ -562,7 +619,11 @@ void BatchDialog::OnCancel(wxCommandEvent& event) void BatchDialog::OnSaveBatchJob(wxCommandEvent& event) { //get a filename - wxString fileName = _("SyncJob.ffs_batch"); //proposal + wxString fileName = wxT("SyncJob.ffs_batch"); //proposal + + if (!proposedBatchFileName.empty()) + fileName = proposedBatchFileName; + wxFileDialog* filePicker = new wxFileDialog(this, wxEmptyString, wxEmptyString, fileName, wxString(_("FreeFileSync batch file")) + wxT(" (*.ffs_batch)|*.ffs_batch"), wxFD_SAVE); if (filePicker->ShowModal() == wxID_OK) @@ -578,14 +639,22 @@ void BatchDialog::OnSaveBatchJob(wxCommandEvent& event) //create batch file if (saveBatchFile(fileName)) - EndModal(batchFileCreated); + EndModal(BATCH_FILE_SAVED); } } +void BatchDialog::OnLoadBatchJob(wxCommandEvent& event) +{ + wxFileDialog* filePicker = new wxFileDialog(this, wxEmptyString, wxEmptyString, wxEmptyString, wxString(_("FreeFileSync batch file")) + wxT(" (*.ffs_batch)|*.ffs_batch"), wxFD_OPEN);; + if (filePicker->ShowModal() == wxID_OK) + loadBatchFile(filePicker->GetPath()); +} + + bool BatchDialog::saveBatchFile(const wxString& filename) { - XmlBatchConfig batchCfg; + xmlAccess::XmlBatchConfig batchCfg; //load structure with basic settings "mainCfg" if (m_radioBtnSizeDate->GetValue()) @@ -600,7 +669,7 @@ bool BatchDialog::saveBatchFile(const wxString& filename) batchCfg.mainCfg.includeFilter = m_textCtrlInclude->GetValue(); batchCfg.mainCfg.excludeFilter = m_textCtrlExclude->GetValue(); batchCfg.mainCfg.useRecycleBin = m_checkBoxUseRecycler->GetValue(); - batchCfg.mainCfg.ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); + batchCfg.handleError = getSelectionHandleError(); for (unsigned int i = 0; i < localFolderPairs.size(); ++i) { @@ -624,10 +693,97 @@ bool BatchDialog::saveBatchFile(const wxString& filename) wxMessageBox(error.show().c_str(), _("Error"), wxOK | wxICON_ERROR); return false; } + + SetTitle(wxString(_("Create a batch job")) + wxT(" - ") + filename); + proposedBatchFileName = filename; //may be used on next save + return true; } +void BatchDialog::loadBatchFile(const wxString& filename) +{ + //load XML settings + xmlAccess::XmlBatchConfig batchCfg; //structure to receive gui settings + try + { + batchCfg = xmlAccess::readBatchConfig(filename); + } + catch (const FileError& error) + { + wxMessageBox(error.show().c_str(), _("Error"), wxOK | wxICON_ERROR); + return; + } + + SetTitle(wxString(_("Create a batch job")) + wxT(" - ") + filename); + proposedBatchFileName = filename; //may be used on next save + + this->loadBatchCfg(batchCfg); +} + + +void BatchDialog::loadBatchCfg(const xmlAccess::XmlBatchConfig& batchCfg) +{ + //make working copy of mainDialog.cfg.syncConfiguration and recycler setting + localSyncConfiguration = batchCfg.mainCfg.syncConfiguration; + SyncDialog::updateConfigIcons(m_bpButton5, m_bpButton6, m_bpButton7, m_bpButton8, m_bpButton9, localSyncConfiguration); + + m_checkBoxUseRecycler->SetValue(batchCfg.mainCfg.useRecycleBin); + setSelectionHandleError(batchCfg.handleError); + + switch (batchCfg.mainCfg.compareVar) + { + case CMP_BY_TIME_SIZE: + m_radioBtnSizeDate->SetValue(true); + break; + case CMP_BY_CONTENT: + m_radioBtnContent->SetValue(true); + break; + default: + assert (false); + } + //adjust toolTip + SyncDialog::adjustToolTips(m_bitmap17, batchCfg.mainCfg.compareVar); + + filterIsActive = batchCfg.mainCfg.filterIsActive; + updateFilterButton(); + + m_textCtrlInclude->SetValue(batchCfg.mainCfg.includeFilter); + m_textCtrlExclude->SetValue(batchCfg.mainCfg.excludeFilter); + + m_checkBoxSilent->SetValue(batchCfg.silent); + + //remove existing folder pairs + localFolderPairs.clear(); + bSizerFolderPairs->Clear(true); + + //add folder pairs + int scrWindowHeight = 0; + for (std::vector::const_iterator i = batchCfg.directoryPairs.begin(); i != batchCfg.directoryPairs.end(); ++i) + { + BatchFolderPairGenerated* newPair = new BatchFolderPairGenerated(m_scrolledWindow6); + newPair->m_directoryLeft->SetValue(i->leftDirectory.c_str()); + newPair->m_directoryRight->SetValue(i->rightDirectory.c_str()); + + bSizerFolderPairs->Add( newPair, 0, wxEXPAND, 5); + localFolderPairs.push_back(newPair); + + if (i == batchCfg.directoryPairs.begin()) + scrWindowHeight = newPair->GetSize().GetHeight(); + } + //set size of scrolled window + int pairCount = std::min(localFolderPairs.size(), size_t(3)); //up to 3 additional pairs shall be shown + m_scrolledWindow6->SetMinSize(wxSize( -1, scrWindowHeight * pairCount)); + + m_scrolledWindow6->Layout(); + //m_scrolledWindow6->Fit(); + + Fit(); + Centre(); + m_buttonSave->SetFocus(); +} + + /* #ifdef FFS_WIN #include //includes "windows.h" diff --git a/ui/SyncDialog.h b/ui/SyncDialog.h index 2f6c5a53..05a2d65b 100644 --- a/ui/SyncDialog.h +++ b/ui/SyncDialog.h @@ -3,6 +3,7 @@ #include "../FreeFileSync.h" #include "guiGenerated.h" +#include "../library/processXml.h" using namespace FreeFileSync; @@ -13,6 +14,7 @@ public: SyncDialog(wxWindow* window, const FileCompareResult& gridDataRef, MainConfiguration& config, + bool& ignoreErrors, bool synchronizationEnabled); ~SyncDialog(); @@ -55,21 +57,32 @@ private: SyncConfiguration localSyncConfiguration; const FileCompareResult& gridData; MainConfiguration& cfg; + bool& m_ignoreErrors; }; +class BatchFileDropEvent; + + class BatchDialog: public BatchDlgGenerated { -public: - BatchDialog(wxWindow* window, - const MainConfiguration& config, - const std::vector& folderPairs); + friend class BatchFileDropEvent; - ~BatchDialog(); +public: + BatchDialog(wxWindow* window, const xmlAccess::XmlBatchConfig& batchCfg); + BatchDialog(wxWindow* window, const wxString& filename); + ~BatchDialog() {}; - static const int batchFileCreated = 15; + enum + { + BATCH_FILE_SAVED = 15 + }; private: + void init(); + + void OnChangeErrorHandling(wxCommandEvent& event); + void OnExLeftSideOnly( wxCommandEvent& event); void OnExRightSideOnly( wxCommandEvent& event); void OnLeftNewer( wxCommandEvent& event); @@ -83,15 +96,23 @@ private: void OnClose( wxCloseEvent& event); void OnCancel( wxCommandEvent& event); void OnSaveBatchJob( wxCommandEvent& event); + void OnLoadBatchJob( wxCommandEvent& event); void updateFilterButton(); + xmlAccess::OnError getSelectionHandleError(); + void setSelectionHandleError(const xmlAccess::OnError value); bool saveBatchFile(const wxString& filename); + void loadBatchFile(const wxString& filename); + void loadBatchCfg(const xmlAccess::XmlBatchConfig& batchCfg); SyncConfiguration localSyncConfiguration; std::vector localFolderPairs; bool filterIsActive; + + //used when saving batch file + wxString proposedBatchFileName; }; #endif // SYNCDIALOG_H_INCLUDED diff --git a/ui/guiGenerated.cpp b/ui/guiGenerated.cpp index e1f76b38..7be9b488 100644 --- a/ui/guiGenerated.cpp +++ b/ui/guiGenerated.cpp @@ -14,2846 +14,2875 @@ MainDialogGenerated::MainDialogGenerated( 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(); - 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_menuItemItalian = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Italiano") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemItalian ); - - m_menuItemPolish = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Język Polski") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemPolish ); - - m_menuItemDutch = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Nederlands") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemDutch ); - - m_menuItemPortuguese = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Português") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemPortuguese ); - - m_menuItemJapanese = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("日本語") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemJapanese ); - - m_menuItemChineseSimple = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("简体中文") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemChineseSimple ); - - m_menu3->Append( -1, _("&Language"), m_menu31 ); - - m_menu3->AppendSeparator(); - - m_menuItemGlobSett = new wxMenuItem( m_menu3, wxID_ANY, wxString( _("&Global settings") ) , wxEmptyString, wxITEM_NORMAL ); - m_menu3->Append( m_menuItemGlobSett ); - - 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, wxRAISED_BORDER|wxTAB_TRAVERSAL ); - bSizer6 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer6->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer30; - bSizer30 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonCompare = new wxButtonWithImage( m_panel71, wxID_OK, _("&Compare"), wxDefaultPosition, wxSize( 180,37 ), 0 ); - m_buttonCompare->SetDefault(); - m_buttonCompare->SetFont( wxFont( 14, 74, 90, 92, false, wxT("Arial Black") ) ); - m_buttonCompare->SetToolTip( _("Compare both sides") ); - - bSizer30->Add( m_buttonCompare, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 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_buttonSync = new wxButtonWithImage( m_panel71, wxID_ANY, _("&Synchronize..."), wxDefaultPosition, wxSize( 180,37 ), 0 ); - m_buttonSync->SetFont( wxFont( 14, 74, 90, 92, false, wxT("Arial Black") ) ); - m_buttonSync->SetToolTip( _("Open synchronization dialog") ); - - bSizer6->Add( m_buttonSync, 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 CustomGridLeft( 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->EnableDragColMove( false ); - m_gridLeft->EnableDragColSize( true ); - m_gridLeft->SetColLabelSize( 20 ); - 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 CustomGridMiddle( 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 CustomGridRight( 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->EnableDragColMove( false ); - m_gridRight->EnableDragColSize( true ); - m_gridRight->SetColLabelSize( 20 ); - 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 ); - - 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( -1,-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, 1, 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( MainDialogGenerated::OnClose ) ); - this->Connect( m_menuItem10->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) ); - this->Connect( m_menuItem11->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSync ) ); - this->Connect( m_menuItem14->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuSaveConfig ) ); - this->Connect( m_menuItem13->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLoadConfig ) ); - this->Connect( m_menuItem4->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) ); - this->Connect( m_menuItemGerman->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangGerman ) ); - this->Connect( m_menuItemEnglish->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangEnglish ) ); - this->Connect( m_menuItemFrench->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangFrench ) ); - this->Connect( m_menuItemItalian->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangItalian ) ); - this->Connect( m_menuItemPolish->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangPolish ) ); - this->Connect( m_menuItemDutch->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangDutch ) ); - this->Connect( m_menuItemPortuguese->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangPortuguese ) ); - this->Connect( m_menuItemJapanese->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangJapanese ) ); - this->Connect( m_menuItemChineseSimple->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangChineseSimp ) ); - this->Connect( m_menuItemGlobSett->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) ); - this->Connect( m_menuItem7->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuBatchJob ) ); - this->Connect( m_menuItem5->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) ); - this->Connect( m_menuItem3->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) ); - m_buttonCompare->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompare ), NULL, this ); - m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAbortCompare ), NULL, this ); - m_radioBtnSizeDate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompareByTimeSize ), NULL, this ); - m_radioBtnContent->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompareByContent ), NULL, this ); - m_bpButton14->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowHelpDialog ), NULL, this ); - m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnFilterButton ), NULL, this ); - m_hyperlinkCfgFilter->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this ); - m_checkBoxHideFilt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideFilteredButton ), NULL, this ); - m_buttonSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSync ), NULL, this ); - m_directoryLeft->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( MainDialogGenerated::OnWriteDirManually ), NULL, this ); - m_dirPickerLeft->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); - m_bpButtonSwap->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapDirs ), NULL, this ); - m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRemoveFolderPair ), NULL, this ); - m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this ); - m_directoryRight->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( MainDialogGenerated::OnWriteDirManually ), NULL, this ); - m_dirPickerRight->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); - m_gridLeft->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnLeftGridDoubleClick ), NULL, this ); - m_gridLeft->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnOpenContextMenu ), NULL, this ); - m_gridLeft->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortLeftGrid ), NULL, this ); - m_gridLeft->Connect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnColumnMenuLeft ), NULL, this ); - m_gridMiddle->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnOpenContextMenu ), NULL, this ); - m_gridMiddle->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortMiddleGrid ), NULL, this ); - m_gridRight->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnRightGridDoubleClick ), NULL, this ); - m_gridRight->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnOpenContextMenu ), NULL, this ); - m_gridRight->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortRightGrid ), NULL, this ); - m_gridRight->Connect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnColumnMenuRight ), NULL, this ); - m_bpButton201->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ), NULL, this ); - m_choiceLoad->Connect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnChoiceKeyEvent ), NULL, this ); - m_choiceLoad->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ), NULL, this ); - m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftOnlyFiles ), NULL, this ); - m_bpButtonLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftNewerFiles ), NULL, this ); - m_bpButtonEqual->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnEqualFiles ), NULL, this ); - m_bpButtonDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnDifferentFiles ), NULL, this ); - m_bpButtonRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightNewerFiles ), NULL, this ); - m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightOnlyFiles ), NULL, this ); - m_bpButton10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::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_menuItemItalian = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Italiano") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemItalian ); + + m_menuItemPolish = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Język Polski") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemPolish ); + + m_menuItemDutch = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Nederlands") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemDutch ); + + m_menuItemPortuguese = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Português") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemPortuguese ); + + m_menuItemJapanese = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("日本語") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemJapanese ); + + m_menuItemChineseSimple = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("简体中文") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemChineseSimple ); + + m_menu3->Append( -1, _("&Language"), m_menu31 ); + + m_menu3->AppendSeparator(); + + m_menuItemGlobSett = new wxMenuItem( m_menu3, wxID_ANY, wxString( _("&Global settings") ) , wxEmptyString, wxITEM_NORMAL ); + m_menu3->Append( m_menuItemGlobSett ); + + 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, wxRAISED_BORDER|wxTAB_TRAVERSAL ); + bSizer6 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer6->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer30; + bSizer30 = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonCompare = new wxButtonWithImage( m_panel71, wxID_OK, _("&Compare"), wxDefaultPosition, wxSize( 180,37 ), 0 ); + m_buttonCompare->SetDefault(); + m_buttonCompare->SetFont( wxFont( 14, 74, 90, 92, false, wxT("Arial Black") ) ); + m_buttonCompare->SetToolTip( _("Compare both sides") ); + + bSizer30->Add( m_buttonCompare, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_buttonAbort = new wxButton( m_panel71, wxID_CANCEL, _("Abort"), wxDefaultPosition, wxSize( 180,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_buttonSync = new wxButtonWithImage( m_panel71, wxID_ANY, _("&Synchronize..."), wxDefaultPosition, wxSize( 180,37 ), 0 ); + m_buttonSync->SetFont( wxFont( 14, 74, 90, 92, false, wxT("Arial Black") ) ); + m_buttonSync->SetToolTip( _("Open synchronization dialog") ); + + bSizer6->Add( m_buttonSync, 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 CustomGridLeft( 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->EnableDragColMove( false ); + m_gridLeft->EnableDragColSize( true ); + m_gridLeft->SetColLabelSize( 20 ); + 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 CustomGridMiddle( 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->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 CustomGridRight( 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->EnableDragColMove( false ); + m_gridRight->EnableDragColSize( true ); + m_gridRight->SetColLabelSize( 20 ); + 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 ); + + bSizer58 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* sbSizer16; + sbSizer16 = new wxStaticBoxSizer( new wxStaticBox( m_panel4, wxID_ANY, _("Configuration") ), wxHORIZONTAL ); + + m_bpButtonSave = new wxBitmapButton( m_panel4, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButtonSave->SetToolTip( _("Save current configuration to file") ); + + m_bpButtonSave->SetToolTip( _("Save current configuration to file") ); + + sbSizer16->Add( m_bpButtonSave, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_bpButtonLoad = new wxBitmapButton( m_panel4, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButtonLoad->SetToolTip( _("Load configuration from file") ); + + m_bpButtonLoad->SetToolTip( _("Load configuration from file") ); + + sbSizer16->Add( m_bpButtonLoad, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + wxArrayString m_choiceHistoryChoices; + m_choiceHistory = new wxChoice( m_panel4, wxID_ANY, wxDefaultPosition, wxSize( 150,-1 ), m_choiceHistoryChoices, 0 ); + m_choiceHistory->SetSelection( 0 ); + m_choiceHistory->SetToolTip( _("Load configuration history (press DEL to delete items)") ); + + sbSizer16->Add( m_choiceHistory, 1, 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 ); + m_staticTextStatusLeft->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + 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 ); + m_staticTextStatusMiddle->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + 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 ); + m_staticTextStatusRight->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + 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( MainDialogGenerated::OnClose ) ); + this->Connect( m_menuItem10->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) ); + this->Connect( m_menuItem11->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSync ) ); + this->Connect( m_menuItem14->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuSaveConfig ) ); + this->Connect( m_menuItem13->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLoadConfig ) ); + this->Connect( m_menuItem4->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) ); + this->Connect( m_menuItemGerman->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangGerman ) ); + this->Connect( m_menuItemEnglish->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangEnglish ) ); + this->Connect( m_menuItemFrench->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangFrench ) ); + this->Connect( m_menuItemItalian->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangItalian ) ); + this->Connect( m_menuItemPolish->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangPolish ) ); + this->Connect( m_menuItemDutch->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangDutch ) ); + this->Connect( m_menuItemPortuguese->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangPortuguese ) ); + this->Connect( m_menuItemJapanese->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangJapanese ) ); + this->Connect( m_menuItemChineseSimple->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangChineseSimp ) ); + this->Connect( m_menuItemGlobSett->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) ); + this->Connect( m_menuItem7->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuBatchJob ) ); + this->Connect( m_menuItem5->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) ); + this->Connect( m_menuItem3->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) ); + m_buttonCompare->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompare ), NULL, this ); + m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAbortCompare ), NULL, this ); + m_radioBtnSizeDate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompareByTimeSize ), NULL, this ); + m_radioBtnContent->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompareByContent ), NULL, this ); + m_bpButton14->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowHelpDialog ), NULL, this ); + m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnFilterButton ), NULL, this ); + m_hyperlinkCfgFilter->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this ); + m_checkBoxHideFilt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideFilteredButton ), NULL, this ); + m_buttonSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSync ), NULL, this ); + m_directoryLeft->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( MainDialogGenerated::OnWriteDirManually ), NULL, this ); + m_dirPickerLeft->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); + m_bpButtonSwap->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapDirs ), NULL, this ); + m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRemoveFolderPair ), NULL, this ); + m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this ); + m_directoryRight->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( MainDialogGenerated::OnWriteDirManually ), NULL, this ); + m_dirPickerRight->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); + m_gridLeft->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnLeftGridDoubleClick ), NULL, this ); + m_gridLeft->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMenu ), NULL, this ); + m_gridLeft->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortLeftGrid ), NULL, this ); + m_gridLeft->Connect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextColumnLeft ), NULL, this ); + m_gridMiddle->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMenuMiddle ), NULL, this ); + m_gridMiddle->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortMiddleGrid ), NULL, this ); + m_gridRight->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnRightGridDoubleClick ), NULL, this ); + m_gridRight->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMenu ), NULL, this ); + m_gridRight->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortRightGrid ), NULL, this ); + m_gridRight->Connect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextColumnRight ), NULL, this ); + m_bpButtonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ), NULL, this ); + m_bpButtonLoad->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ), NULL, this ); + m_choiceHistory->Connect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnChoiceKeyEvent ), NULL, this ); + m_choiceHistory->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this ); + m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftOnlyFiles ), NULL, this ); + m_bpButtonLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftNewerFiles ), NULL, this ); + m_bpButtonEqual->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnEqualFiles ), NULL, this ); + m_bpButtonDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnDifferentFiles ), NULL, this ); + m_bpButtonRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightNewerFiles ), NULL, this ); + m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightOnlyFiles ), NULL, this ); + m_bpButton10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnQuit ), NULL, this ); } MainDialogGenerated::~MainDialogGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSync ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuSaveConfig ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLoadConfig ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangGerman ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangEnglish ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangFrench ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangItalian ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangPolish ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangDutch ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangPortuguese ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangJapanese ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangChineseSimp ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuBatchJob ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) ); - m_buttonCompare->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompare ), NULL, this ); - m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAbortCompare ), NULL, this ); - m_radioBtnSizeDate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompareByTimeSize ), NULL, this ); - m_radioBtnContent->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompareByContent ), NULL, this ); - m_bpButton14->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowHelpDialog ), NULL, this ); - m_bpButtonFilter->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnFilterButton ), NULL, this ); - m_hyperlinkCfgFilter->Disconnect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this ); - m_checkBoxHideFilt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideFilteredButton ), NULL, this ); - m_buttonSync->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSync ), NULL, this ); - m_directoryLeft->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( MainDialogGenerated::OnWriteDirManually ), NULL, this ); - m_dirPickerLeft->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); - m_bpButtonSwap->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapDirs ), NULL, this ); - m_bpButtonRemovePair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRemoveFolderPair ), NULL, this ); - m_bpButtonAddPair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this ); - m_directoryRight->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( MainDialogGenerated::OnWriteDirManually ), NULL, this ); - m_dirPickerRight->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); - m_gridLeft->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnLeftGridDoubleClick ), NULL, this ); - m_gridLeft->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnOpenContextMenu ), NULL, this ); - m_gridLeft->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortLeftGrid ), NULL, this ); - m_gridLeft->Disconnect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnColumnMenuLeft ), NULL, this ); - m_gridMiddle->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnOpenContextMenu ), NULL, this ); - m_gridMiddle->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortMiddleGrid ), NULL, this ); - m_gridRight->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnRightGridDoubleClick ), NULL, this ); - m_gridRight->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnOpenContextMenu ), NULL, this ); - m_gridRight->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortRightGrid ), NULL, this ); - m_gridRight->Disconnect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnColumnMenuRight ), NULL, this ); - m_bpButton201->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ), NULL, this ); - m_choiceLoad->Disconnect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnChoiceKeyEvent ), NULL, this ); - m_choiceLoad->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ), NULL, this ); - m_bpButtonLeftOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftOnlyFiles ), NULL, this ); - m_bpButtonLeftNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftNewerFiles ), NULL, this ); - m_bpButtonEqual->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnEqualFiles ), NULL, this ); - m_bpButtonDifferent->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnDifferentFiles ), NULL, this ); - m_bpButtonRightNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightNewerFiles ), NULL, this ); - m_bpButtonRightOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightOnlyFiles ), NULL, this ); - m_bpButton10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnQuit ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSync ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuSaveConfig ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLoadConfig ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangGerman ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangEnglish ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangFrench ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangItalian ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangPolish ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangDutch ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangPortuguese ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangJapanese ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangChineseSimp ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuBatchJob ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) ); + m_buttonCompare->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompare ), NULL, this ); + m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAbortCompare ), NULL, this ); + m_radioBtnSizeDate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompareByTimeSize ), NULL, this ); + m_radioBtnContent->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompareByContent ), NULL, this ); + m_bpButton14->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowHelpDialog ), NULL, this ); + m_bpButtonFilter->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnFilterButton ), NULL, this ); + m_hyperlinkCfgFilter->Disconnect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this ); + m_checkBoxHideFilt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideFilteredButton ), NULL, this ); + m_buttonSync->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSync ), NULL, this ); + m_directoryLeft->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( MainDialogGenerated::OnWriteDirManually ), NULL, this ); + m_dirPickerLeft->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); + m_bpButtonSwap->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapDirs ), NULL, this ); + m_bpButtonRemovePair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRemoveFolderPair ), NULL, this ); + m_bpButtonAddPair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this ); + m_directoryRight->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( MainDialogGenerated::OnWriteDirManually ), NULL, this ); + m_dirPickerRight->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); + m_gridLeft->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnLeftGridDoubleClick ), NULL, this ); + m_gridLeft->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMenu ), NULL, this ); + m_gridLeft->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortLeftGrid ), NULL, this ); + m_gridLeft->Disconnect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextColumnLeft ), NULL, this ); + m_gridMiddle->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMenuMiddle ), NULL, this ); + m_gridMiddle->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortMiddleGrid ), NULL, this ); + m_gridRight->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnRightGridDoubleClick ), NULL, this ); + m_gridRight->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMenu ), NULL, this ); + m_gridRight->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortRightGrid ), NULL, this ); + m_gridRight->Disconnect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextColumnRight ), NULL, this ); + m_bpButtonSave->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ), NULL, this ); + m_bpButtonLoad->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ), NULL, this ); + m_choiceHistory->Disconnect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnChoiceKeyEvent ), NULL, this ); + m_choiceHistory->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this ); + m_bpButtonLeftOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftOnlyFiles ), NULL, this ); + m_bpButtonLeftNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftNewerFiles ), NULL, this ); + m_bpButtonEqual->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnEqualFiles ), NULL, this ); + m_bpButtonDifferent->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnDifferentFiles ), NULL, this ); + m_bpButtonRightNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightNewerFiles ), NULL, this ); + m_bpButtonRightOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightOnlyFiles ), NULL, this ); + m_bpButton10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::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 ); - - 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 ); + 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, wxEmptyString ), 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, 15, 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 ); + + 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, wxEmptyString ), 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() +{ } -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 ); + + 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, _("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 for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe . This can also be scheduled in your operating system's task planner."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText54->Wrap( 520 ); + 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 ); + + wxBoxSizer* bSizer67; + bSizer67 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer100; + bSizer100 = new wxBoxSizer( wxVERTICAL ); + + 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 ); + bSizer100->Add( m_scrolledWindow6, 0, wxEXPAND, 5 ); + + + bSizer100->Add( 0, 10, 0, 0, 5 ); + + wxBoxSizer* bSizer57; + bSizer57 = new wxBoxSizer( wxHORIZONTAL ); + + 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|wxEXPAND, 5 ); + + + bSizer721->Add( 0, 10, 0, 0, 5 ); + + wxStaticBoxSizer* sbSizer25; + sbSizer25 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Error handling") ), wxVERTICAL ); + + wxArrayString m_choiceHandleErrorChoices; + m_choiceHandleError = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleErrorChoices, 0 ); + m_choiceHandleError->SetSelection( 0 ); + sbSizer25->Add( m_choiceHandleError, 0, wxALL, 5 ); + + bSizer721->Add( sbSizer25, 1, wxEXPAND, 5 ); + + + bSizer721->Add( 0, 10, 0, 0, 5 ); + + wxStaticBoxSizer* sbSizer24; + sbSizer24 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), 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") ); + + sbSizer24->Add( m_checkBoxUseRecycler, 0, wxALIGN_CENTER_VERTICAL|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") ); + + sbSizer24->Add( m_checkBoxSilent, 0, wxALL, 5 ); + + bSizer721->Add( sbSizer24, 0, wxEXPAND, 5 ); + + bSizer71->Add( bSizer721, 0, 0, 5 ); + + bSizer57->Add( bSizer71, 0, wxEXPAND, 5 ); + + + bSizer57->Add( 10, 0, 1, wxEXPAND, 5 ); + + wxStaticBoxSizer* sbSizer8; + sbSizer8 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Filter files") ), wxHORIZONTAL ); + + m_bpButtonFilter = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); + sbSizer8->Add( m_bpButtonFilter, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer101; + bSizer101 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer671; + bSizer671 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap8 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); + m_bitmap8->SetToolTip( _("Include") ); + + bSizer671->Add( m_bitmap8, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_textCtrlInclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 250,-1 ), wxTE_MULTILINE ); + bSizer671->Add( m_textCtrlInclude, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer101->Add( bSizer671, 0, 0, 5 ); + + + bSizer101->Add( 0, 10, 0, 0, 5 ); + + wxBoxSizer* bSizer691; + bSizer691 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap9 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); + m_bitmap9->SetToolTip( _("Exclude") ); + + bSizer691->Add( m_bitmap9, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 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 ); + + bSizer101->Add( bSizer691, 0, 0, 5 ); + + sbSizer8->Add( bSizer101, 1, wxEXPAND, 5 ); + + bSizer57->Add( sbSizer8, 0, 0, 5 ); + + bSizer100->Add( bSizer57, 0, 0, 5 ); + + bSizer67->Add( bSizer100, 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, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 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_buttonSave = new wxButton( this, wxID_SAVE, _("&Save"), wxDefaultPosition, wxSize( 120,35 ), 0 ); + m_buttonSave->SetDefault(); + m_buttonSave->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer68->Add( m_buttonSave, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonLoad = new wxButton( this, wxID_OPEN, _("&Load"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonLoad->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer68->Add( m_buttonLoad, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + 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 ); + + 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_choiceHandleError->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeErrorHandling ), 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_buttonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this ); + m_buttonLoad->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLoadBatchJob ), NULL, this ); + m_button6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), 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_choiceHandleError->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeErrorHandling ), 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_buttonSave->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this ); + m_buttonLoad->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLoadBatchJob ), NULL, this ); + m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), 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 ); +} + +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 ); +} + +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 ); +} + +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 ); + + bSizer201 = new wxBoxSizer( wxHORIZONTAL ); + + m_button18 = new wxButtonWithImage( this, wxID_OK, _("&Start"), wxDefaultPosition, wxSize( 140,58 ), 0 ); + m_button18->SetDefault(); + m_button18->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Arial Black") ) ); + m_button18->SetToolTip( _("Start synchronization") ); + + bSizer201->Add( m_button18, 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_APPLY, _("&Apply"), wxDefaultPosition, wxSize( 100,32 ), 0 ); + m_button6->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer291->Add( m_button6, 0, wxALIGN_BOTTOM, 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_button18->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_button18->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_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 ); +} + +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 ); + + 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 the files are separated into the following categories:"), 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 ); +} + +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, wxEXPAND|wxALL, 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( 1, 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 ); + + m_staticText91 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Misty Wu"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText91->Wrap( -1 ); + fgSizer9->Add( m_staticText91, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText92 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("简体中文"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText92->Wrap( -1 ); + fgSizer9->Add( m_staticText92, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText911 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Wojtek Pietruszewski"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText911->Wrap( -1 ); + fgSizer9->Add( m_staticText911, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText921 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Język Polski"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText921->Wrap( -1 ); + fgSizer9->Add( m_staticText921, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText9211 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("QuestMark"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText9211->Wrap( -1 ); + fgSizer9->Add( m_staticText9211, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText9212 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Português"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText9212->Wrap( -1 ); + fgSizer9->Add( m_staticText9212, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText92121 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Emmo"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText92121->Wrap( -1 ); + fgSizer9->Add( m_staticText92121, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText92122 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Italiano"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText92122->Wrap( -1 ); + fgSizer9->Add( m_staticText92122, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer72->Add( fgSizer9, 0, wxALIGN_CENTER_HORIZONTAL, 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|wxEXPAND|wxRIGHT|wxLEFT, 25 ); + + 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 ); -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 ); - - 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, _("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_buttonCreate = new wxButton( this, wxID_ANY, _("&Save"), 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 ); - - 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 ); - - 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_buttonCreate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this ); - m_button6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); -} + bSizer31->Add( fgSizer2, 0, wxLEFT|wxEXPAND, 10 ); -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_buttonCreate->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this ); - m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); -} + m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer31->Add( m_staticline2, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); -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* sbSizer14; + sbSizer14 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Published under the GNU General Public License:") ), wxHORIZONTAL ); -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 ); -} -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 ); -} + sbSizer14->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); -CompareStatusGenerated::~CompareStatusGenerated() -{ -} + m_bitmap13 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 88,31 ), 0 ); + sbSizer14->Add( m_bitmap13, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); -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 ); - - bSizer201 = new wxBoxSizer( wxHORIZONTAL ); - - m_button18 = new wxButtonWithImage( this, wxID_OK, _("&Start"), wxDefaultPosition, wxSize( 140,58 ), 0 ); - m_button18->SetDefault(); - m_button18->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Arial Black") ) ); - m_button18->SetToolTip( _("Start synchronization") ); - - bSizer201->Add( m_button18, 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_button18->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 ); -} + 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 ); -SyncDlgGenerated::~SyncDlgGenerated() -{ - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncDlgGenerated::OnClose ) ); - m_button18->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_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 ); -} + sbSizer14->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); -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 ); -} + bSizer31->Add( sbSizer14, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); -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 ); - - 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 the files are separated into the following categories:"), 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 ); -} + 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") ) ); -HelpDlgGenerated::~HelpDlgGenerated() -{ - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( HelpDlgGenerated::OnClose ) ); - m_button8->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( HelpDlgGenerated::OnOK ), NULL, this ); -} + bSizer31->Add( m_button8, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); -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, wxEXPAND|wxALL, 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( 1, 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 ); - - m_staticText91 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Misty Wu"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText91->Wrap( -1 ); - fgSizer9->Add( m_staticText91, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText92 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("简体中文"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText92->Wrap( -1 ); - fgSizer9->Add( m_staticText92, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText911 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Wojtek Pietruszewski"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText911->Wrap( -1 ); - fgSizer9->Add( m_staticText911, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText921 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Język Polski"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText921->Wrap( -1 ); - fgSizer9->Add( m_staticText921, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText9211 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("QuestMark"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText9211->Wrap( -1 ); - fgSizer9->Add( m_staticText9211, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText9212 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Português"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText9212->Wrap( -1 ); - fgSizer9->Add( m_staticText9212, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText92121 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Emmo"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText92121->Wrap( -1 ); - fgSizer9->Add( m_staticText92121, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText92122 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Italiano"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText92122->Wrap( -1 ); - fgSizer9->Add( m_staticText92122, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer72->Add( fgSizer9, 0, wxALIGN_CENTER_HORIZONTAL, 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|wxEXPAND|wxRIGHT|wxLEFT, 25 ); - - 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->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_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 ); + 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|wxBOTTOM, 5 ); + + m_checkBoxIgnoreErrors = new wxCheckBox( this, wxID_ANY, _("Ignore subsequent 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_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 ); + // 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 ); } 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* 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_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 ); - - 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( 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_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnOkay ), NULL, this ); - m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::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_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->SetDefault(); + m_buttonIgnore->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer25->Add( m_buttonIgnore, 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( WarningDlgGenerated::OnClose ) ); + m_buttonIgnore->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnIgnore ), NULL, this ); + m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnAbort ), NULL, this ); } 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_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnOkay ), NULL, this ); - m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnAbort ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( WarningDlgGenerated::OnClose ) ); + m_buttonIgnore->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnIgnore ), NULL, this ); + m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::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 ) { - 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 ); + 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, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer41->Add( 0, 0, 1, wxEXPAND, 5 ); + + bSizer24->Add( bSizer41, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer99; + bSizer99 = new wxBoxSizer( wxHORIZONTAL ); + + m_checkBoxDeleteBothSides = new wxCheckBox( this, wxID_ANY, _("Delete on both sides"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_checkBoxDeleteBothSides->SetToolTip( _("Delete on both sides even if the file is selected on one side only") ); + + bSizer99->Add( m_checkBoxDeleteBothSides, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer99->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("Use Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxUseRecycler->SetValue(true); + + bSizer99->Add( m_checkBoxUseRecycler, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer24->Add( bSizer99, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 10 ); + + 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_checkBoxDeleteBothSides->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnDelOnBothSides ), NULL, this ); + m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnUseRecycler ), NULL, this ); + 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_checkBoxDeleteBothSides->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnDelOnBothSides ), NULL, this ); + m_checkBoxUseRecycler->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnUseRecycler ), NULL, this ); + 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 ); - - 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, _("Synchronization filter"), 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_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 ); - - m_button17 = new wxButton( this, wxID_CANCEL, _("dummy"), wxDefaultPosition, wxSize( 0,0 ), 0 ); - bSizer22->Add( m_button17, 0, wxALIGN_BOTTOM, 5 ); - - bSizer21->Add( bSizer22, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 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_button10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnOK ), NULL, this ); - m_button17->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), 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, _("Synchronization filter"), 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_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 ); + + m_button17 = new wxButton( this, wxID_CANCEL, _("dummy"), wxDefaultPosition, wxSize( 0,0 ), 0 ); + bSizer22->Add( m_button17, 0, wxALIGN_BOTTOM, 5 ); + + bSizer21->Add( bSizer22, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 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_button10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnOK ), NULL, this ); + m_button17->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), 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_button10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnOK ), NULL, this ); - m_button17->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), 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_button10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnOK ), NULL, this ); + m_button17->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this ); } CustomizeColsDlgGenerated::CustomizeColsDlgGenerated( 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* bSizer96; - bSizer96 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer99; - bSizer99 = new wxBoxSizer( wxHORIZONTAL ); - - wxArrayString m_checkListColumnsChoices; - m_checkListColumns = new wxCheckListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_checkListColumnsChoices, 0 ); - bSizer99->Add( m_checkListColumns, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer98; - bSizer98 = new wxBoxSizer( wxVERTICAL ); - - m_bpButton29 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - m_bpButton29->SetToolTip( _("Move column up") ); - - m_bpButton29->SetToolTip( _("Move column up") ); - - bSizer98->Add( m_bpButton29, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_bpButton30 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - m_bpButton30->SetToolTip( _("Move column down") ); - - m_bpButton30->SetToolTip( _("Move column down") ); - - bSizer98->Add( m_bpButton30, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - bSizer99->Add( bSizer98, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer96->Add( bSizer99, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - wxBoxSizer* bSizer97; - bSizer97 = new wxBoxSizer( wxHORIZONTAL ); - - m_button28 = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button28->SetDefault(); - m_button28->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer97->Add( m_button28, 0, wxALL, 5 ); - - m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button9->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer97->Add( m_button9, 0, wxALL, 5 ); - - m_button29 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button29->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer97->Add( m_button29, 0, wxALL, 5 ); - - bSizer96->Add( bSizer97, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - - bSizer96->Add( 0, 0, 0, wxALIGN_CENTER_HORIZONTAL, 20 ); - - this->SetSizer( bSizer96 ); - this->Layout(); - bSizer96->Fit( this ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CustomizeColsDlgGenerated::OnClose ) ); - m_bpButton29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveUp ), NULL, this ); - m_bpButton30->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveDown ), NULL, this ); - m_button28->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnOkay ), NULL, this ); - m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnDefault ), NULL, this ); - m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnCancel ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer96; + bSizer96 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer99; + bSizer99 = new wxBoxSizer( wxHORIZONTAL ); + + wxArrayString m_checkListColumnsChoices; + m_checkListColumns = new wxCheckListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_checkListColumnsChoices, 0 ); + bSizer99->Add( m_checkListColumns, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer98; + bSizer98 = new wxBoxSizer( wxVERTICAL ); + + m_bpButton29 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButton29->SetToolTip( _("Move column up") ); + + m_bpButton29->SetToolTip( _("Move column up") ); + + bSizer98->Add( m_bpButton29, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_bpButton30 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButton30->SetToolTip( _("Move column down") ); + + m_bpButton30->SetToolTip( _("Move column down") ); + + bSizer98->Add( m_bpButton30, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + bSizer99->Add( bSizer98, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer96->Add( bSizer99, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxBoxSizer* bSizer97; + bSizer97 = new wxBoxSizer( wxHORIZONTAL ); + + m_button28 = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button28->SetDefault(); + m_button28->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer97->Add( m_button28, 0, wxALL, 5 ); + + m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button9->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer97->Add( m_button9, 0, wxALL, 5 ); + + m_button29 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button29->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer97->Add( m_button29, 0, wxALL, 5 ); + + bSizer96->Add( bSizer97, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + bSizer96->Add( 0, 0, 0, wxALIGN_CENTER_HORIZONTAL, 20 ); + + this->SetSizer( bSizer96 ); + this->Layout(); + bSizer96->Fit( this ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CustomizeColsDlgGenerated::OnClose ) ); + m_bpButton29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveUp ), NULL, this ); + m_bpButton30->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveDown ), NULL, this ); + m_button28->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnOkay ), NULL, this ); + m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnDefault ), NULL, this ); + m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnCancel ), NULL, this ); } CustomizeColsDlgGenerated::~CustomizeColsDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CustomizeColsDlgGenerated::OnClose ) ); - m_bpButton29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveUp ), NULL, this ); - m_bpButton30->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveDown ), NULL, this ); - m_button28->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnOkay ), NULL, this ); - m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnDefault ), NULL, this ); - m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnCancel ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CustomizeColsDlgGenerated::OnClose ) ); + m_bpButton29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveUp ), NULL, this ); + m_bpButton30->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveDown ), NULL, this ); + m_button28->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnOkay ), NULL, this ); + m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnDefault ), NULL, this ); + m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnCancel ), NULL, this ); } GlobalSettingsDlgGenerated::GlobalSettingsDlgGenerated( 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* bSizer95; - bSizer95 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer86; - bSizer86 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapSettings = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); - bSizer86->Add( m_bitmapSettings, 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, _("Global settings"), 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 ); - - bSizer95->Add( bSizer86, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer95->Add( 0, 10, 0, 0, 5 ); - - wxStaticBoxSizer* sbSizer23; - sbSizer23 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); - - m_checkBoxHandleDstFat = new wxCheckBox( this, wxID_ANY, _("FAT32: Handle Daylight Saving Time"), wxDefaultPosition, wxDefaultSize, 0 ); - - m_checkBoxHandleDstFat->SetToolTip( _("Active for FAT/FAT32 drives only: When comparing filetimes treat files that differ by less or equal than 1 hour as equal. This ensures daylight saving time switches are handled properly.") ); - - sbSizer23->Add( m_checkBoxHandleDstFat, 0, wxALL, 5 ); - - wxBoxSizer* bSizer104; - bSizer104 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText97 = new wxStaticText( this, wxID_ANY, _("File Manager integration:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText97->Wrap( -1 ); - m_staticText97->SetToolTip( _("This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file.") ); - - bSizer104->Add( m_staticText97, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlFileManager = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 150,-1 ), 0 ); - m_textCtrlFileManager->SetToolTip( _("This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file.") ); - - bSizer104->Add( m_textCtrlFileManager, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer23->Add( bSizer104, 1, wxEXPAND, 5 ); - - bSizer95->Add( sbSizer23, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 ); - - - bSizer95->Add( 0, 10, 0, 0, 5 ); - - wxBoxSizer* bSizer97; - bSizer97 = new wxBoxSizer( wxHORIZONTAL ); - - m_button28 = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button28->SetDefault(); - m_button28->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer97->Add( m_button28, 0, wxALL, 5 ); - - m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button9->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer97->Add( m_button9, 0, wxALL, 5 ); - - m_button29 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button29->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer97->Add( m_button29, 0, wxALL, 5 ); - - bSizer95->Add( bSizer97, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - this->SetSizer( bSizer95 ); - this->Layout(); - bSizer95->Fit( this ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GlobalSettingsDlgGenerated::OnClose ) ); - m_button28->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); - m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this ); - m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer95; + bSizer95 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer86; + bSizer86 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapSettings = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); + bSizer86->Add( m_bitmapSettings, 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, _("Global settings"), 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 ); + + bSizer95->Add( bSizer86, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer95->Add( 0, 10, 0, 0, 5 ); + + wxStaticBoxSizer* sbSizer23; + sbSizer23 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); + + m_checkBoxHandleDstFat = new wxCheckBox( this, wxID_ANY, _("FAT32: Handle Daylight Saving Time"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxHandleDstFat->SetValue(true); + + m_checkBoxHandleDstFat->SetToolTip( _("Active for FAT/FAT32 drives only: When comparing filetimes treat files that differ by less or equal than 1 hour as equal. This ensures daylight saving time switches are handled properly.") ); + + sbSizer23->Add( m_checkBoxHandleDstFat, 0, wxALL, 5 ); + + wxBoxSizer* bSizer104; + bSizer104 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText97 = new wxStaticText( this, wxID_ANY, _("File Manager integration:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText97->Wrap( -1 ); + m_staticText97->SetToolTip( _("This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file.") ); + + bSizer104->Add( m_staticText97, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlFileManager = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 150,-1 ), 0 ); + m_textCtrlFileManager->SetToolTip( _("This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file.") ); + + bSizer104->Add( m_textCtrlFileManager, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer23->Add( bSizer104, 1, wxEXPAND, 5 ); + + m_buttonResetWarnings = new wxButtonWithImage( this, wxID_ANY, _("Reset"), wxDefaultPosition, wxSize( 80,-1 ), 0 ); + m_buttonResetWarnings->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + m_buttonResetWarnings->SetToolTip( _("Resets all warning messages") ); + + sbSizer23->Add( m_buttonResetWarnings, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 ); + + bSizer95->Add( sbSizer23, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 ); + + + bSizer95->Add( 0, 10, 0, 0, 5 ); + + wxBoxSizer* bSizer97; + bSizer97 = new wxBoxSizer( wxHORIZONTAL ); + + m_button28 = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button28->SetDefault(); + m_button28->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer97->Add( m_button28, 0, wxALL, 5 ); + + m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button9->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer97->Add( m_button9, 0, wxALL, 5 ); + + m_button29 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button29->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer97->Add( m_button29, 0, wxALL, 5 ); + + bSizer95->Add( bSizer97, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + this->SetSizer( bSizer95 ); + this->Layout(); + bSizer95->Fit( this ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GlobalSettingsDlgGenerated::OnClose ) ); + m_buttonResetWarnings->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnResetWarnings ), NULL, this ); + m_button28->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); + m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this ); + m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this ); } GlobalSettingsDlgGenerated::~GlobalSettingsDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GlobalSettingsDlgGenerated::OnClose ) ); - m_button28->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); - m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this ); - m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GlobalSettingsDlgGenerated::OnClose ) ); + m_buttonResetWarnings->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnResetWarnings ), NULL, this ); + m_button28->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); + m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this ); + m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this ); } diff --git a/ui/guiGenerated.h b/ui/guiGenerated.h index 75f0fb28..fc40b404 100644 --- a/ui/guiGenerated.h +++ b/ui/guiGenerated.h @@ -54,762 +54,1115 @@ class wxButtonWithImage; /////////////////////////////////////////////////////////////////////////////// /// Class MainDialogGenerated /////////////////////////////////////////////////////////////////////////////// -class MainDialogGenerated : public wxFrame +class MainDialogGenerated : public wxFrame { - 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_menuItemItalian; - wxMenuItem* m_menuItemPolish; - wxMenuItem* m_menuItemDutch; - wxMenuItem* m_menuItemPortuguese; - wxMenuItem* m_menuItemJapanese; - wxMenuItem* m_menuItemChineseSimple; - wxMenuItem* m_menuItemGlobSett; - wxMenuItem* m_menuItem7; - wxMenu* m_menu2; - wxBoxSizer* bSizer1; - wxPanel* m_panel71; - wxBoxSizer* bSizer6; - - wxButtonWithImage* m_buttonCompare; - wxButton* m_buttonAbort; - wxRadioButton* m_radioBtnSizeDate; - wxRadioButton* m_radioBtnContent; - wxBitmapButton* m_bpButton14; - - - wxBitmapButton* m_bpButtonFilter; - wxHyperlinkCtrl* m_hyperlinkCfgFilter; - wxCheckBox* m_checkBoxHideFilt; - - wxButtonWithImage* m_buttonSync; - - 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; - CustomGridLeft* m_gridLeft; - wxPanel* m_panel3; - CustomGridMiddle* m_gridMiddle; - wxPanel* m_panel2; - CustomGridRight* m_gridRight; - wxBoxSizer* bSizer3; - wxBoxSizer* bSizer58; - 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 OnMenuLangItalian( wxCommandEvent& event ){ event.Skip(); } - virtual void OnMenuLangPolish( wxCommandEvent& event ){ event.Skip(); } - virtual void OnMenuLangDutch( wxCommandEvent& event ){ event.Skip(); } - virtual void OnMenuLangPortuguese( wxCommandEvent& event ){ event.Skip(); } - virtual void OnMenuLangJapanese( wxCommandEvent& event ){ event.Skip(); } - virtual void OnMenuLangChineseSimp( wxCommandEvent& event ){ event.Skip(); } - virtual void OnMenuGlobalSettings( 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 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 OnColumnMenuLeft( wxGridEvent& event ){ event.Skip(); } - virtual void OnSortMiddleGrid( wxGridEvent& event ){ event.Skip(); } - virtual void OnRightGridDoubleClick( wxGridEvent& event ){ event.Skip(); } - virtual void OnSortRightGrid( wxGridEvent& event ){ event.Skip(); } - virtual void OnColumnMenuRight( 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: - MainDialogGenerated( 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 ); - ~MainDialogGenerated(); - +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_menuItemItalian; + wxMenuItem* m_menuItemPolish; + wxMenuItem* m_menuItemDutch; + wxMenuItem* m_menuItemPortuguese; + wxMenuItem* m_menuItemJapanese; + wxMenuItem* m_menuItemChineseSimple; + wxMenuItem* m_menuItemGlobSett; + wxMenuItem* m_menuItem7; + wxMenu* m_menu2; + wxBoxSizer* bSizer1; + wxPanel* m_panel71; + wxBoxSizer* bSizer6; + + wxButtonWithImage* m_buttonCompare; + wxButton* m_buttonAbort; + wxRadioButton* m_radioBtnSizeDate; + wxRadioButton* m_radioBtnContent; + wxBitmapButton* m_bpButton14; + + + wxBitmapButton* m_bpButtonFilter; + wxHyperlinkCtrl* m_hyperlinkCfgFilter; + wxCheckBox* m_checkBoxHideFilt; + + wxButtonWithImage* m_buttonSync; + + 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; + CustomGridLeft* m_gridLeft; + wxPanel* m_panel3; + CustomGridMiddle* m_gridMiddle; + wxPanel* m_panel2; + CustomGridRight* m_gridRight; + wxBoxSizer* bSizer3; + wxBoxSizer* bSizer58; + wxBitmapButton* m_bpButtonSave; + wxBitmapButton* m_bpButtonLoad; + wxChoice* m_choiceHistory; + + 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 OnMenuLangItalian( wxCommandEvent& event ) + { + event.Skip(); + } + virtual void OnMenuLangPolish( wxCommandEvent& event ) + { + event.Skip(); + } + virtual void OnMenuLangDutch( wxCommandEvent& event ) + { + event.Skip(); + } + virtual void OnMenuLangPortuguese( wxCommandEvent& event ) + { + event.Skip(); + } + virtual void OnMenuLangJapanese( wxCommandEvent& event ) + { + event.Skip(); + } + virtual void OnMenuLangChineseSimp( wxCommandEvent& event ) + { + event.Skip(); + } + virtual void OnMenuGlobalSettings( 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 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 OnContextMenu( wxGridEvent& event ) + { + event.Skip(); + } + virtual void OnSortLeftGrid( wxGridEvent& event ) + { + event.Skip(); + } + virtual void OnContextColumnLeft( wxGridEvent& event ) + { + event.Skip(); + } + virtual void OnContextMenuMiddle( wxGridEvent& event ) + { + event.Skip(); + } + virtual void OnSortMiddleGrid( wxGridEvent& event ) + { + event.Skip(); + } + virtual void OnRightGridDoubleClick( wxGridEvent& event ) + { + event.Skip(); + } + virtual void OnSortRightGrid( wxGridEvent& event ) + { + event.Skip(); + } + virtual void OnContextColumnRight( wxGridEvent& event ) + { + event.Skip(); + } + virtual void OnSaveConfig( wxCommandEvent& event ) + { + event.Skip(); + } + virtual void OnLoadConfig( wxCommandEvent& event ) + { + event.Skip(); + } + virtual void OnChoiceKeyEvent( wxKeyEvent& event ) + { + event.Skip(); + } + virtual void OnLoadFromHistory( 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: + MainDialogGenerated( 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 ); + ~MainDialogGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class FolderPairGenerated /////////////////////////////////////////////////////////////////////////////// -class FolderPairGenerated : public wxPanel +class FolderPairGenerated : public wxPanel { - 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(); - +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; - 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_buttonCreate; - wxButton* m_button6; - - // 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 OnSaveBatchJob( wxCommandEvent& event ){ event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ){ event.Skip(); } - - - public: - BatchDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Create a batch job"), 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; + + wxChoice* m_choiceHandleError; + + wxCheckBox* m_checkBoxUseRecycler; + wxCheckBox* m_checkBoxSilent; + + wxBitmapButton* m_bpButtonFilter; + wxStaticBitmap* m_bitmap8; + wxTextCtrl* m_textCtrlInclude; + + wxStaticBitmap* m_bitmap9; + 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_buttonSave; + wxButton* m_buttonLoad; + wxButton* m_button6; + + // 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 OnChangeErrorHandling( 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 OnSaveBatchJob( wxCommandEvent& event ) + { + event.Skip(); + } + virtual void OnLoadBatchJob( wxCommandEvent& event ) + { + event.Skip(); + } + virtual void OnCancel( wxCommandEvent& event ) + { + event.Skip(); + } + + +public: + BatchDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Create a batch job"), 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: - wxBoxSizer* bSizer201; - wxButtonWithImage* m_button18; - - 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(); - +private: + +protected: + wxBoxSizer* bSizer201; + wxButtonWithImage* m_button18; + + 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: - - 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(); - +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: - - 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(); - +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; - wxStaticText* m_staticText91; - wxStaticText* m_staticText92; - wxStaticText* m_staticText911; - wxStaticText* m_staticText921; - wxStaticText* m_staticText9211; - wxStaticText* m_staticText9212; - wxStaticText* m_staticText92121; - wxStaticText* m_staticText92122; - 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; + wxStaticText* m_staticText91; + wxStaticText* m_staticText92; + wxStaticText* m_staticText911; + wxStaticText* m_staticText921; + wxStaticText* m_staticText9211; + wxStaticText* m_staticText9212; + wxStaticText* m_staticText92121; + wxStaticText* m_staticText92122; + 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_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(); - +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( 404,268 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~ErrorDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class WarningDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class WarningDlgGenerated : public wxDialog +class WarningDlgGenerated : public wxDialog { - private: - - protected: - - wxTextCtrl* m_textCtrl8; - - wxCheckBox* m_checkBoxDontShowAgain; - - wxButton* m_buttonIgnore; - wxButton* m_buttonResolve; - wxButton* m_buttonOK; - 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 OnResolve( wxCommandEvent& event ){ event.Skip(); } - virtual void OnOkay( wxCommandEvent& event ){ event.Skip(); } - virtual void OnAbort( 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(); - +private: + +protected: + + wxTextCtrl* m_textCtrl8; + + wxCheckBox* m_checkBoxDontShowAgain; + + wxButton* m_buttonIgnore; + 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 OnAbort( 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; + + wxCheckBox* m_checkBoxDeleteBothSides; + + wxCheckBox* m_checkBoxUseRecycler; + 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 OnDelOnBothSides( wxCommandEvent& event ) + { + event.Skip(); + } + virtual void OnUseRecycler( wxCommandEvent& 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: - 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_button10; - wxButton* m_button17; - - // 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 OnOK( wxCommandEvent& event ){ event.Skip(); } - virtual void OnCancel( 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_button10; + wxButton* m_button17; + + // 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 OnOK( wxCommandEvent& event ) + { + event.Skip(); + } + virtual void OnCancel( 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 CustomizeColsDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class CustomizeColsDlgGenerated : public wxDialog +class CustomizeColsDlgGenerated : public wxDialog { - private: - - protected: - wxCheckListBox* m_checkListColumns; - wxBitmapButton* m_bpButton29; - wxBitmapButton* m_bpButton30; - wxButton* m_button28; - wxButton* m_button9; - wxButton* m_button29; - - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } - virtual void OnMoveUp( wxCommandEvent& event ){ event.Skip(); } - virtual void OnMoveDown( wxCommandEvent& event ){ event.Skip(); } - virtual void OnOkay( wxCommandEvent& event ){ event.Skip(); } - virtual void OnDefault( wxCommandEvent& event ){ event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ){ event.Skip(); } - - - public: - CustomizeColsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Customize columns"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - ~CustomizeColsDlgGenerated(); - +private: + +protected: + wxCheckListBox* m_checkListColumns; + wxBitmapButton* m_bpButton29; + wxBitmapButton* m_bpButton30; + wxButton* m_button28; + wxButton* m_button9; + wxButton* m_button29; + + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) + { + event.Skip(); + } + virtual void OnMoveUp( wxCommandEvent& event ) + { + event.Skip(); + } + virtual void OnMoveDown( wxCommandEvent& event ) + { + event.Skip(); + } + virtual void OnOkay( wxCommandEvent& event ) + { + event.Skip(); + } + virtual void OnDefault( wxCommandEvent& event ) + { + event.Skip(); + } + virtual void OnCancel( wxCommandEvent& event ) + { + event.Skip(); + } + + +public: + CustomizeColsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Customize columns"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + ~CustomizeColsDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class GlobalSettingsDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class GlobalSettingsDlgGenerated : public wxDialog +class GlobalSettingsDlgGenerated : public wxDialog { - private: - - protected: - wxStaticBitmap* m_bitmapSettings; - wxPanel* m_panel8; - wxStaticText* m_staticText56; - - - wxCheckBox* m_checkBoxHandleDstFat; - wxStaticText* m_staticText97; - wxTextCtrl* m_textCtrlFileManager; - - wxButton* m_button28; - wxButton* m_button9; - wxButton* m_button29; - - // 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 OnDefault( wxCommandEvent& event ){ event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ){ event.Skip(); } - - - public: - GlobalSettingsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Global settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - ~GlobalSettingsDlgGenerated(); - +private: + +protected: + wxStaticBitmap* m_bitmapSettings; + wxPanel* m_panel8; + wxStaticText* m_staticText56; + + + wxCheckBox* m_checkBoxHandleDstFat; + wxStaticText* m_staticText97; + wxTextCtrl* m_textCtrlFileManager; + wxButtonWithImage* m_buttonResetWarnings; + + wxButton* m_button28; + wxButton* m_button9; + wxButton* m_button29; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) + { + event.Skip(); + } + virtual void OnResetWarnings( wxCommandEvent& event ) + { + event.Skip(); + } + virtual void OnOkay( wxCommandEvent& event ) + { + event.Skip(); + } + virtual void OnDefault( wxCommandEvent& event ) + { + event.Skip(); + } + virtual void OnCancel( wxCommandEvent& event ) + { + event.Skip(); + } + + +public: + GlobalSettingsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Global settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + ~GlobalSettingsDlgGenerated(); + }; #endif //__guiGenerated__ -- cgit