diff options
96 files changed, 7432 insertions, 6567 deletions
diff --git a/Changelog.txt b/Changelog.txt index 9da83eaf..50d6e0af 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,17 @@ +FreeFileSync 12.5 [2023-07-21] +------------------------------ +Merge logs of individual steps (comparison, manual operation, sync) +Show total percentage in progress dialog header +Log and report errors during cleanup or exception handling +Skip folder traversal if existence check fails for other side of the pair +Automatically adapt batch options to prevent hanging a non-interactive process (Windows) +Support path lists for external applications: %item_paths%, %local_paths%, %item_names%, %parent_paths% +Create directory lock files with hidden attribute +Don't clear other side when right-clicking file selection +Fixed passive FTP when using different IP than control connection +Work around FTP servers silently renaming unsupported characters of temporary file + + FreeFileSync 12.4 [2023-06-20] ------------------------------ Show dynamic error and warning count in progress dialogs diff --git a/FreeFileSync/Build/Resources/Icons.zip b/FreeFileSync/Build/Resources/Icons.zip Binary files differindex 19dafa61..12822e10 100644 --- a/FreeFileSync/Build/Resources/Icons.zip +++ b/FreeFileSync/Build/Resources/Icons.zip diff --git a/FreeFileSync/Build/Resources/Languages.zip b/FreeFileSync/Build/Resources/Languages.zip Binary files differindex 3ff3de8f..8a828e86 100644 --- a/FreeFileSync/Build/Resources/Languages.zip +++ b/FreeFileSync/Build/Resources/Languages.zip diff --git a/FreeFileSync/Source/Makefile b/FreeFileSync/Source/Makefile index 5d253171..f49b9ff6 100644 --- a/FreeFileSync/Source/Makefile +++ b/FreeFileSync/Source/Makefile @@ -1,7 +1,7 @@ CXX ?= g++ exeName = FreeFileSync_$(shell arch) -CXXFLAGS += -std=c++2b -pipe -DWXINTL_NO_GETTEXT_MACRO -I../.. -I../../zenXml -include "zen/i18n.h" -include "zen/warn_static.h" \ +CXXFLAGS += -std=c++23 -pipe -DWXINTL_NO_GETTEXT_MACRO -I../.. -I../../zenXml -include "zen/i18n.h" -include "zen/warn_static.h" \ -Wall -Wfatal-errors -Wmissing-include-dirs -Wswitch-enum -Wcast-align -Wnon-virtual-dtor -Wno-unused-function -Wshadow -Wno-maybe-uninitialized \ -O3 -DNDEBUG `wx-config --cxxflags --debug=no` -pthread @@ -44,6 +44,7 @@ cppFiles+=base/db_file.cpp cppFiles+=base/dir_lock.cpp cppFiles+=base/file_hierarchy.cpp cppFiles+=base/icon_loader.cpp +cppFiles+=base/multi_rename.cpp cppFiles+=base/parallel_scan.cpp cppFiles+=base/path_filter.cpp cppFiles+=base/speed_test.cpp @@ -72,6 +73,7 @@ cppFiles+=ui/gui_generated.cpp cppFiles+=ui/gui_status_handler.cpp cppFiles+=ui/main_dlg.cpp cppFiles+=ui/progress_indicator.cpp +cppFiles+=ui/rename_dlg.cpp cppFiles+=ui/search_grid.cpp cppFiles+=ui/small_dlgs.cpp cppFiles+=ui/sync_cfg.cpp diff --git a/FreeFileSync/Source/RealTimeSync/Makefile b/FreeFileSync/Source/RealTimeSync/Makefile index 661b6b78..bac4de39 100644 --- a/FreeFileSync/Source/RealTimeSync/Makefile +++ b/FreeFileSync/Source/RealTimeSync/Makefile @@ -1,7 +1,7 @@ CXX ?= g++ exeName = RealTimeSync_$(shell arch) -CXXFLAGS += -std=c++2b -pipe -DWXINTL_NO_GETTEXT_MACRO -I../../.. -I../../../zenXml -include "zen/i18n.h" -include "zen/warn_static.h" \ +CXXFLAGS += -std=c++23 -pipe -DWXINTL_NO_GETTEXT_MACRO -I../../.. -I../../../zenXml -include "zen/i18n.h" -include "zen/warn_static.h" \ -Wall -Wfatal-errors -Wmissing-include-dirs -Wswitch-enum -Wcast-align -Wnon-virtual-dtor -Wno-unused-function -Wshadow -Wno-maybe-uninitialized \ -O3 -DNDEBUG `wx-config --cxxflags --debug=no` -pthread diff --git a/FreeFileSync/Source/RealTimeSync/application.cpp b/FreeFileSync/Source/RealTimeSync/application.cpp index 6add53b9..1558ea33 100644 --- a/FreeFileSync/Source/RealTimeSync/application.cpp +++ b/FreeFileSync/Source/RealTimeSync/application.cpp @@ -27,6 +27,7 @@ using namespace zen; using namespace rts; +using fff::FfsExitCode; #ifdef __WXGTK3__ //deprioritize Wayland: see FFS' application.cpp GLOBAL_RUN_ONCE(::gdk_set_allowed_backends("x11,*")); //call *before* gtk_init() @@ -37,29 +38,10 @@ IMPLEMENT_APP(Application) namespace { -using fff::FfsExitCode; - -void notifyAppError(const std::wstring& msg, FfsExitCode rc) +void notifyAppError(const std::wstring& msg) { - //raiseExitCode(exitCode_, rc); - - const std::wstring msgType = [&] - { - switch (rc) - { - //*INDENT-OFF* - case FfsExitCode::success: break; - case FfsExitCode::warning: return _("Warning"); - case FfsExitCode::error: return _("Error"); - case FfsExitCode::aborted: return _("Error"); - case FfsExitCode::exception: return _("An exception occurred"); - //*INDENT-ON* - } - assert(false); - return std::wstring{}; - }(); //error handling strategy unknown and no sync log output available at this point! - std::cerr << utfTo<std::string>(msgType + L": " + msg) + '\n'; + std::cerr << utfTo<std::string>(_("Error") + L": " + msg) + '\n'; //alternative0: std::wcerr: cannot display non-ASCII at all, so why does it exist??? //alternative1: wxSafeShowMessage => NO console output on Debian x86, WTF! //alternative2: wxMessageBox() => works, but we probably shouldn't block during command line usage @@ -71,16 +53,24 @@ bool Application::OnInit() { //do not call wxApp::OnInit() to avoid using wxWidgets command line parser + initExtraLog([](const ErrorLog& log) //don't call functions depending on global state (which might be destroyed already!) + { + std::wstring msg; + for (const LogEntry& e : log) + msg += utfTo<std::wstring>(formatMessage(e)); + trim(msg); + notifyAppError(msg); + }); + try { imageResourcesInit(appendPath(fff::getResourceDirPath(), Zstr("Icons.zip"))); } - catch (const FileError& e) { notifyAppError(e.toString(), FfsExitCode::warning); } - //errors are not really critical in this context + catch (const FileError& e) { logExtraError(e.toString()); } //not critical in this context //GTK should already have been initialized by wxWidgets (see \src\gtk\app.cpp:wxApp::Initialize) #if GTK_MAJOR_VERSION == 2 ::gtk_rc_parse(appendPath(fff::getResourceDirPath(), "Gtk2Styles.rc").c_str()); //fix hang on Ubuntu 19.10 (see FFS's application.cpp) - g_vfs_get_default(); //returns unowned GVfs* + [[maybe_unused]] GVfs* defaultFs = ::g_vfs_get_default(); //not owned by us! #elif GTK_MAJOR_VERSION == 3 auto loadCSS = [&](const char* fileName) @@ -91,14 +81,14 @@ bool Application::OnInit() GError* error = nullptr; ZEN_ON_SCOPE_EXIT(if (error) ::g_error_free(error)); - ::gtk_css_provider_load_from_path(provider, //GtkCssProvider* css_provider, - appendPath(fff::getResourceDirPath(), fileName).c_str(), //const gchar* path, + ::gtk_css_provider_load_from_path(provider, //GtkCssProvider* css_provider + appendPath(fff::getResourceDirPath(), fileName).c_str(), //const gchar* path &error); //GError** error if (error) throw SysError(formatGlibError("gtk_css_provider_load_from_path", error)); - ::gtk_style_context_add_provider_for_screen(::gdk_screen_get_default(), //GdkScreen* screen, - GTK_STYLE_PROVIDER(provider), //GtkStyleProvider* provider, + ::gtk_style_context_add_provider_for_screen(::gdk_screen_get_default(), //GdkScreen* screen + GTK_STYLE_PROVIDER(provider), //GtkStyleProvider* provider GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); //guint priority }; try @@ -112,30 +102,26 @@ bool Application::OnInit() { loadCSS("Gtk3Styles.old.css"); //throw SysError } - catch (const SysError& e2) { notifyAppError(e2.toString(), FfsExitCode::warning); } + catch (const SysError& e3) { logExtraError(_("Error during process initialization.") + L"\n\n" + e3.toString()); } } #else #error unknown GTK version! #endif - try - { - /* we're a GUI app: ignore SIGHUP when the parent terminal quits! (or process is killed!) + /* we're a GUI app: ignore SIGHUP when the parent terminal quits! (or process is killed!) => the FFS launcher will still be killed => fine => macOS: apparently not needed! interestingly the FFS launcher does receive SIGHUP and *is* killed */ - if (sighandler_t oldHandler = ::signal(SIGHUP, SIG_IGN); - oldHandler == SIG_ERR) - THROW_LAST_SYS_ERROR("signal(SIGHUP)"); - else assert(!oldHandler); - } - catch (const SysError& e) { notifyAppError(e.toString(), FfsExitCode::warning); } + if (sighandler_t oldHandler = ::signal(SIGHUP, SIG_IGN); + oldHandler == SIG_ERR) + logExtraError(_("Error during process initialization.") + L"\n\n" + formatSystemError("signal(SIGHUP)", getLastError())); + else assert(!oldHandler); //Windows User Experience Interaction Guidelines: tool tips should have 5s timeout, info tips no timeout => compromise: wxToolTip::Enable(true); //wxWidgets screw-up: wxToolTip::SetAutoPop is no-op if global tooltip window is not yet constructed: wxToolTip::Enable creates it wxToolTip::SetAutoPop(15'000); //https://docs.microsoft.com/en-us/windows/win32/uxguide/ctrl-tooltips-and-infotips - SetAppName(L"RealTimeSync"); + SetAppName(L"RealTimeSync"); //if not set, defaults to executable name try @@ -143,25 +129,21 @@ bool Application::OnInit() fff::localizationInit(appendPath(fff::getResourceDirPath(), Zstr("Languages.zip"))); //throw FileError fff::setLanguage(getProgramLanguage()); //throw FileError } - catch (const FileError& e) { notifyAppError(e.toString(), FfsExitCode::warning); } + catch (const FileError& e) { logExtraError(e.toString()); } auto onSystemShutdown = [](int /*unused*/ = 0) { onSystemShutdownRunTasks(); //it's futile to try and clean up while the process is in full swing (CRASH!) => just terminate! - terminateProcess(static_cast<int>(FfsExitCode::aborted)); + terminateProcess(static_cast<int>(FfsExitCode::cancelled)); }; Bind(wxEVT_QUERY_END_SESSION, [onSystemShutdown](wxCloseEvent& event) { onSystemShutdown(); }); //can veto Bind(wxEVT_END_SESSION, [onSystemShutdown](wxCloseEvent& event) { onSystemShutdown(); }); //can *not* veto - try - { - if (auto /*sighandler_t n.a. on macOS*/ oldHandler = ::signal(SIGTERM, onSystemShutdown);//"graceful" exit requested, unlike SIGKILL - oldHandler == SIG_ERR) - THROW_LAST_SYS_ERROR("signal(SIGTERM)"); - else assert(!oldHandler); - } - catch (const SysError& e) { notifyAppError(e.toString(), FfsExitCode::warning); } + if (auto /*sighandler_t n.a. on macOS*/ oldHandler = ::signal(SIGTERM, onSystemShutdown);//"graceful" exit requested, unlike SIGKILL + oldHandler == SIG_ERR) + logExtraError(_("Error during process initialization.") + L"\n\n" + formatSystemError("signal(SIGTERM)", getLastError())); + else assert(!oldHandler); //Note: app start is deferred: -> see FreeFileSync CallAfter([&] { onEnterEventLoop(); }); @@ -207,7 +189,7 @@ void Application::onEnterEventLoop() } catch (const FileError& e) { - notifyAppError(e.toString(), FfsExitCode::exception); + notifyAppError(e.toString()); } } @@ -240,7 +222,7 @@ void Application::OnUnhandledException() //handles both wxApp::OnInit() + wxApp: } catch (const std::bad_alloc& e) //the only kind of exception we don't want crash dumps for { - notifyAppError(utfTo<std::wstring>(e.what()), FfsExitCode::exception); + notifyAppError(utfTo<std::wstring>(e.what())); terminateProcess(static_cast<int>(FfsExitCode::exception)); } //catch (...) -> Windows: let it crash and create mini dump!!! Linux/macOS: std::exception::what() logged to console diff --git a/FreeFileSync/Source/RealTimeSync/config.cpp b/FreeFileSync/Source/RealTimeSync/config.cpp index 951aabd2..066bb3c5 100644 --- a/FreeFileSync/Source/RealTimeSync/config.cpp +++ b/FreeFileSync/Source/RealTimeSync/config.cpp @@ -73,7 +73,7 @@ void writeConfig(const XmlRealConfig& cfg, XmlOut& out) } -void rts::readConfig(const Zstring& filePath, XmlRealConfig& cfg, std::wstring& warningMsg) //throw FileError +std::pair<XmlRealConfig, std::wstring /*warningMsg*/> rts::readConfig(const Zstring& filePath) //throw FileError { XmlDoc doc = loadXml(filePath); //throw FileError @@ -84,23 +84,23 @@ void rts::readConfig(const Zstring& filePath, XmlRealConfig& cfg, std::wstring& /*bool success =*/ doc.root().getAttribute("XmlFormat", formatVer); XmlIn in(doc); + XmlRealConfig cfg; ::readConfig(in, cfg, formatVer); - try - { - checkXmlMappingErrors(in); //throw FileError - - //(try to) migrate old configuration automatically + std::wstring warningMsg; + if (const std::wstring& errors = in.getErrors(); + !errors.empty()) + warningMsg = replaceCpy(_("Configuration file %x is incomplete. The missing elements have been set to their default values."), L"%x", fmtPath(filePath)) + L"\n\n" + + _("The following XML elements could not be read:") + L'\n' + errors; + else //(try to) migrate old configuration automatically if (formatVer < XML_FORMAT_RTS_CFG) - try { rts::writeConfig(cfg, filePath); /*throw FileError*/ } - catch (FileError&) { assert(false); } //don't bother user! - warn_static("at least log on failure!") - } - catch (const FileError& e) - { - warningMsg = replaceCpy(_("Configuration file %x is incomplete. The missing elements have been set to their default values."), L"%x", fmtPath(filePath)) + - L"\n\n" + e.toString(); - } + try + { + rts::writeConfig(cfg, filePath); //throw FileError + } + catch (const FileError& e) { warningMsg = e.toString(); } + + return {cfg, warningMsg}; } @@ -117,7 +117,7 @@ void rts::writeConfig(const XmlRealConfig& cfg, const Zstring& filePath) //throw } -void rts::readRealOrBatchConfig(const Zstring& filePath, XmlRealConfig& cfg, std::wstring& warningMsg) //throw FileError +std::pair<XmlRealConfig, std::wstring /*warningMsg*/> rts::readRealOrBatchConfig(const Zstring& filePath) //throw FileError { XmlDoc doc = loadXml(filePath); //throw FileError //quick exit if file is not an FFS XML @@ -130,8 +130,10 @@ void rts::readRealOrBatchConfig(const Zstring& filePath, XmlRealConfig& cfg, std //read folder pairs std::set<Zstring, LessNativePath> uniqueFolders; - for (XmlIn inPair = in["FolderPairs"]["Pair"]; inPair; inPair.next()) + in["FolderPairs"].visitChildren([&](const XmlIn& inPair) { + assert(*inPair.getName() == "Pair"); + Zstring folderPathPhraseLeft; Zstring folderPathPhraseRight; inPair["Left" ](folderPathPhraseLeft); @@ -139,21 +141,40 @@ void rts::readRealOrBatchConfig(const Zstring& filePath, XmlRealConfig& cfg, std uniqueFolders.insert(folderPathPhraseLeft); uniqueFolders.insert(folderPathPhraseRight); - } + }); + + if (const std::wstring& errors = in.getErrors(); + !errors.empty()) + throw FileError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtPath(filePath)), + _("The following XML elements could not be read:") + L'\n' + errors); - try - { - checkXmlMappingErrors(in); //throw FileError - } - catch (const FileError& e) { throw FileError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtPath(filePath)) + L"\n\n" + e.toString()); } //--------------------------------------------------------------------------------------- std::erase_if(uniqueFolders, [](const Zstring& str) { return trimCpy(str).empty(); }); - cfg.directories.assign(uniqueFolders.begin(), uniqueFolders.end()); - cfg.commandline = escapeCommandArg(fff::getFreeFileSyncLauncherPath()) + Zstr(' ') + escapeCommandArg(filePath); + + std::wstring warningMsg; + const Zstring ffsLaunchPath = [&]() -> Zstring + { + try + { + return fff::getFreeFileSyncLauncherPath(); //throw FileError + } + catch (const FileError& e) + { + warningMsg = e.toString(); + return Zstr("FreeFileSync"); //fallback: at least give some hint... + } + }(); + + XmlRealConfig cfg + { + .directories = {uniqueFolders.begin(), uniqueFolders.end()}, + .commandline = escapeCommandArg(ffsLaunchPath) + Zstr(' ') + escapeCommandArg(filePath), + }; + return {cfg, warningMsg}; } else - return readConfig(filePath, cfg, warningMsg); //throw FileError + return readConfig(filePath); //throw FileError } @@ -181,11 +202,11 @@ wxLanguage rts::getProgramLanguage() //throw FileError wxLanguage lng = wxLANGUAGE_UNKNOWN; in["Language"].attribute("Code", lng); - try - { - checkXmlMappingErrors(in); //throw FileError - } - catch (const FileError& e) { throw FileError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtPath(filePath)) + L"\n\n" + e.toString()); } + + if (const std::wstring& errors = in.getErrors(); + !errors.empty()) + throw FileError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtPath(filePath)), + _("The following XML elements could not be read:") + L'\n' + errors); return lng; } diff --git a/FreeFileSync/Source/RealTimeSync/config.h b/FreeFileSync/Source/RealTimeSync/config.h index b7b36514..3afc72f2 100644 --- a/FreeFileSync/Source/RealTimeSync/config.h +++ b/FreeFileSync/Source/RealTimeSync/config.h @@ -20,12 +20,12 @@ struct XmlRealConfig unsigned int delay = 10; }; -void readConfig(const Zstring& filePath, XmlRealConfig& config, std::wstring& warningMsg); //throw FileError +std::pair<XmlRealConfig, std::wstring /*warningMsg*/> readConfig(const Zstring& filePath); //throw FileError void writeConfig(const XmlRealConfig& config, const Zstring& filePath); //throw FileError //reuse (some of) FreeFileSync's xml files -void readRealOrBatchConfig(const Zstring& filePath, XmlRealConfig& config, std::wstring& warningMsg); //throw FileError +std::pair<XmlRealConfig, std::wstring /*warningMsg*/> readRealOrBatchConfig(const Zstring& filePath); //throw FileError wxLanguage getProgramLanguage(); //throw FileError } diff --git a/FreeFileSync/Source/RealTimeSync/main_dlg.cpp b/FreeFileSync/Source/RealTimeSync/main_dlg.cpp index 796920e5..9eb80b51 100644 --- a/FreeFileSync/Source/RealTimeSync/main_dlg.cpp +++ b/FreeFileSync/Source/RealTimeSync/main_dlg.cpp @@ -120,7 +120,7 @@ MainDialog::MainDialog(const Zstring& cfgFilePath) : try { std::wstring warningMsg; - readRealOrBatchConfig(currentConfigFile, newConfig, warningMsg); //throw FileError + std::tie(newConfig, warningMsg) = readRealOrBatchConfig(currentConfigFile); //throw FileError if (!warningMsg.empty()) showNotificationDialog(this, DialogInfoType::warning, PopupDialogCfg().setDetailInstructions(warningMsg)); @@ -176,9 +176,8 @@ MainDialog::~MainDialog() void MainDialog::onBeforeSystemShutdown() { - try { writeConfig(getConfiguration(), lastRunConfigPath_); } //throw FileError - catch (FileError&) { assert(false); } - warn_static("log, maybe?") + try { writeConfig(getConfiguration(), lastRunConfigPath_); } + catch (const FileError& e) { logExtraError(e.toString()); } } @@ -225,15 +224,15 @@ void MainDialog::onStart(wxCommandEvent& event) switch (runFolderMonitor(currentCfg, ::extractJobName(activeCfgFilePath))) { - case AbortReason::REQUEST_EXIT: + case CancelReason::requestExit: Close(); return; - case AbortReason::REQUEST_GUI: + case CancelReason::requestGui: break; } - Show(); //don't show for AbortReason::REQUEST_EXIT + Show(); //don't show for CancelReason::requestExit Raise(); m_buttonStart->SetFocus(); } @@ -283,7 +282,7 @@ void MainDialog::loadConfig(const Zstring& filepath) try { std::wstring warningMsg; - readRealOrBatchConfig(filepath, newConfig, warningMsg); //throw FileError + std::tie(newConfig, warningMsg) = readRealOrBatchConfig(filepath); //throw FileError if (!warningMsg.empty()) showNotificationDialog(this, DialogInfoType::warning, PopupDialogCfg().setDetailInstructions(warningMsg)); diff --git a/FreeFileSync/Source/RealTimeSync/tray_menu.cpp b/FreeFileSync/Source/RealTimeSync/tray_menu.cpp index ad445b15..2209385c 100644 --- a/FreeFileSync/Source/RealTimeSync/tray_menu.cpp +++ b/FreeFileSync/Source/RealTimeSync/tray_menu.cpp @@ -69,7 +69,7 @@ public: //require polling: bool resumeIsRequested() const { return resumeRequested_; } - bool abortIsRequested () const { return abortRequested_; } + bool abortIsRequested () const { return cancelRequested_; } //during TrayMode::error those two functions are available: void clearShowErrorRequested() { assert(mode_ == TrayMode::error); showErrorMsgRequested_ = false; } @@ -145,7 +145,7 @@ private: contextMenu->AppendSeparator(); wxMenuItem* itemAbort = contextMenu->Append(wxID_ANY, _("&Quit")); - contextMenu->Bind(wxEVT_COMMAND_MENU_SELECTED, [this](wxCommandEvent& event) { abortRequested_ = true; }, itemAbort->GetId()); + contextMenu->Bind(wxEVT_COMMAND_MENU_SELECTED, [this](wxCommandEvent& event) { cancelRequested_ = true; }, itemAbort->GetId()); return contextMenu; //ownership transferred to caller } @@ -165,7 +165,7 @@ private: } bool resumeRequested_ = false; - bool abortRequested_ = false; + bool cancelRequested_ = false; bool showErrorMsgRequested_ = false; TrayMode mode_ = TrayMode::waiting; @@ -182,8 +182,8 @@ private: struct AbortMonitoring //exception class { - AbortMonitoring(AbortReason reasonCode) : reasonCode_(reasonCode) {} - AbortReason reasonCode_; + AbortMonitoring(CancelReason reasonCode) : reasonCode_(reasonCode) {} + CancelReason reasonCode_; }; @@ -208,10 +208,10 @@ public: //advantage of polling vs callbacks: we can throw exceptions! if (trayObj_->resumeIsRequested()) - throw AbortMonitoring(AbortReason::REQUEST_GUI); + throw AbortMonitoring(CancelReason::requestGui); if (trayObj_->abortIsRequested()) - throw AbortMonitoring(AbortReason::REQUEST_EXIT); + throw AbortMonitoring(CancelReason::requestExit); } void setMode(TrayMode m, const Zstring& missingFolderPath) { trayObj_->setMode(m, missingFolderPath); } @@ -227,7 +227,7 @@ private: } -rts::AbortReason rts::runFolderMonitor(const XmlRealConfig& config, const wxString& jobname) +rts::CancelReason rts::runFolderMonitor(const XmlRealConfig& config, const wxString& jobname) { std::vector<Zstring> dirNamesNonFmt = config.directories; std::erase_if(dirNamesNonFmt, [](const Zstring& str) { return trimCpy(str).empty(); }); //remove empty entries WITHOUT formatting paths yet! @@ -235,7 +235,7 @@ rts::AbortReason rts::runFolderMonitor(const XmlRealConfig& config, const wxStri if (dirNamesNonFmt.empty()) { showNotificationDialog(nullptr, DialogInfoType::error, PopupDialogCfg().setMainInstructions(_("A folder input field is empty."))); - return AbortReason::REQUEST_GUI; + return CancelReason::requestGui; } const Zstring cmdLine = trimCpy(config.commandline); @@ -243,7 +243,7 @@ rts::AbortReason rts::runFolderMonitor(const XmlRealConfig& config, const wxStri if (cmdLine.empty()) { showNotificationDialog(nullptr, DialogInfoType::error, PopupDialogCfg().setMainInstructions(replaceCpy(_("Command %x failed."), L"%x", fmtPath(cmdLine)))); - return AbortReason::REQUEST_GUI; + return CancelReason::requestGui; } @@ -251,10 +251,8 @@ rts::AbortReason rts::runFolderMonitor(const XmlRealConfig& config, const wxStri auto executeExternalCommand = [&](const Zstring& changedItemPath, const std::wstring& actionName) //throw FileError { - warn_static("maybe not a good idea!? job for execve? https://rachelbythebay.com/w/2017/01/30/env/") ::wxSetEnv(L"change_path", utfTo<wxString>(changedItemPath)); //crude way to report changed file ::wxSetEnv(L"change_action", actionName); // - warn_static("caveat: %change_path% is not subsituted 'thanks' to our *static* env variables! luckily there's a workaround") //https://freefilesync.org/forum/viewtopic.php?t=10160 auto cmdLineExp = expandMacros(cmdLine); try @@ -296,7 +294,7 @@ rts::AbortReason rts::runFolderMonitor(const XmlRealConfig& config, const wxStri return; case ConfirmationButton::cancel: - throw AbortMonitoring(AbortReason::REQUEST_GUI); + throw AbortMonitoring(CancelReason::requestGui); } std::this_thread::sleep_for(UI_UPDATE_INTERVAL); } @@ -310,7 +308,7 @@ rts::AbortReason rts::runFolderMonitor(const XmlRealConfig& config, const wxStri reportError, // UI_UPDATE_INTERVAL / 2); assert(false); - return AbortReason::REQUEST_GUI; + return CancelReason::requestGui; } catch (const AbortMonitoring& ab) { diff --git a/FreeFileSync/Source/RealTimeSync/tray_menu.h b/FreeFileSync/Source/RealTimeSync/tray_menu.h index 9c18fa08..cf8b4341 100644 --- a/FreeFileSync/Source/RealTimeSync/tray_menu.h +++ b/FreeFileSync/Source/RealTimeSync/tray_menu.h @@ -13,12 +13,12 @@ namespace rts { -enum class AbortReason +enum class CancelReason { - REQUEST_GUI, - REQUEST_EXIT + requestGui, + requestExit }; -AbortReason runFolderMonitor(const XmlRealConfig& config, const wxString& jobname); //jobname may be empty +CancelReason runFolderMonitor(const XmlRealConfig& config, const wxString& jobname); //jobname may be empty } #endif //TRAY_MENU_H_3967857420987534253245 diff --git a/FreeFileSync/Source/afs/abstract.cpp b/FreeFileSync/Source/afs/abstract.cpp index c7f20a92..11e5626d 100644 --- a/FreeFileSync/Source/afs/abstract.cpp +++ b/FreeFileSync/Source/afs/abstract.cpp @@ -139,9 +139,8 @@ AFS::FileCopyResult AFS::copyFileAsStream(const AfsPath& sourcePath, const Strea const FinalizeResult finResult = streamOut->finalize(notifyUnbufferedWrite); //throw FileError, X - ZEN_ON_SCOPE_FAIL(try { removeFilePlain(targetPath); /*throw FileError*/ } - catch (FileError&) {}); //after finalize(): not guarded by ~AFS::OutputStream() anymore! - warn_static("log it!") + ZEN_ON_SCOPE_FAIL(try { removeFilePlain(targetPath); } + catch (const FileError& e) { logExtraError(e.toString()); }); //after finalize(): not guarded by ~AFS::OutputStream() anymore! //catch file I/O bugs + read/write conflicts: (note: different check than inside AFS::OutputStream::finalize() => checks notifyUnbufferedIO()!) if (totalBytesWritten != totalBytesRead) @@ -155,7 +154,7 @@ AFS::FileCopyResult AFS::copyFileAsStream(const AfsPath& sourcePath, const Strea .sourceFilePrint = attrSourceNew.filePrint, .targetFilePrint = finResult.filePrint, .errorModTime = finResult.errorModTime, - /* Failing to set modification time is not a serious problem from synchronization perspective (treat like external update) + /* Failing to set modification time is not a fatal error from synchronization perspective (treat like external update) => Support additional scenarios: - GVFS failing to set modTime for FTP: https://freefilesync.org/forum/viewtopic.php?t=2372 - GVFS failing to set modTime for MTP: https://freefilesync.org/forum/viewtopic.php?t=2803 @@ -207,15 +206,15 @@ AFS::FileCopyResult AFS::copyFileTransactional(const AbstractPath& sourcePath, c const Zstring& shortGuid = printNumber<Zstring>(Zstr("%04x"), static_cast<unsigned int>(getCrc16(generateGUID()))); - const AbstractPath targetPathTmp = appendRelPath(*parentPath, tmpName + Zstr('~') + shortGuid + TEMP_FILE_ENDING); + const AbstractPath targetPathTmp = appendRelPath(*parentPath, tmpName + Zstr('-') + //don't use '~': some FTP servers *silently* replace it with '_'! + shortGuid + TEMP_FILE_ENDING); //------------------------------------------------------------------------------------------- const FileCopyResult result = copyFilePlain(targetPathTmp); //throw FileError, ErrorFileLocked //transactional behavior: ensure cleanup; not needed before copyFilePlain() which is already transactional ZEN_ON_SCOPE_FAIL( try { removeFilePlain(targetPathTmp); } - catch (FileError&) {}); - warn_static("log it!") + catch (const FileError& e) { logExtraError(e.toString()); }); //have target file deleted (after read access on source and target has been confirmed) => allow for almost transactional overwrite if (onDeleteTargetFile) diff --git a/FreeFileSync/Source/afs/abstract.h b/FreeFileSync/Source/afs/abstract.h index 72161695..4a94d1cf 100644 --- a/FreeFileSync/Source/afs/abstract.h +++ b/FreeFileSync/Source/afs/abstract.h @@ -263,7 +263,7 @@ struct AbstractFileSystem //THREAD-SAFETY: "const" member functions must model t //Note: it MAY happen that copyFileTransactional() leaves temp files behind, e.g. temporary network drop. // => clean them up at an appropriate time (automatically set sync directions to delete them). They have the following ending: - static inline const ZstringView TEMP_FILE_ENDING = Zstr(".ffs_tmp"); //don't use Zstring as global constant: avoid static initialization order problem in global namespace! + static inline constexpr ZstringView TEMP_FILE_ENDING = Zstr(".ffs_tmp"); //don't use Zstring as global constant: avoid static initialization order problem in global namespace! // caveat: ending is hard-coded by RealTimeSync struct FileCopyResult @@ -474,8 +474,7 @@ AbstractFileSystem::OutputStream::~OutputStream() //- needed for Google Drive: e.g. user might cancel during OutputStreamImpl::finalize(), just after file was written transactionally //- also for Native: setFileTime() may fail *after* FileOutput::finalize() try { AbstractFileSystem::removeFilePlain(filePath_); /*throw FileError*/ } - catch (zen::FileError&) {} - warn_static("log on error") + catch (const zen::FileError& e) { zen::logExtraError(e.toString()); } } diff --git a/FreeFileSync/Source/afs/concrete.cpp b/FreeFileSync/Source/afs/concrete.cpp index ff2fd6be..b7001832 100644 --- a/FreeFileSync/Source/afs/concrete.cpp +++ b/FreeFileSync/Source/afs/concrete.cpp @@ -23,12 +23,11 @@ void fff::initAfs(const AfsConfig& cfg) } -std::wstring /*warningMsg*/ fff::teardownAfs() +void fff::teardownAfs() { - std::wstring warningMsg = gdriveTeardown(); + gdriveTeardown(); sftpTeardown(); ftpTeardown(); - return warningMsg; } diff --git a/FreeFileSync/Source/afs/concrete.h b/FreeFileSync/Source/afs/concrete.h index c627e58b..81e29103 100644 --- a/FreeFileSync/Source/afs/concrete.h +++ b/FreeFileSync/Source/afs/concrete.h @@ -17,7 +17,7 @@ struct AfsConfig Zstring configDirPath; //directory to store AFS-specific files }; void initAfs(const AfsConfig& cfg); -[[nodiscard]] std::wstring /*warningMsg*/ teardownAfs(); +void teardownAfs(); AbstractPath getNullPath(); AbstractPath createAbstractPath(const Zstring& itemPathPhrase); //noexcept diff --git a/FreeFileSync/Source/afs/ftp.cpp b/FreeFileSync/Source/afs/ftp.cpp index bf21cf4d..283ca3ec 100644 --- a/FreeFileSync/Source/afs/ftp.cpp +++ b/FreeFileSync/Source/afs/ftp.cpp @@ -35,7 +35,7 @@ const size_t FTP_BLOCK_SIZE_UPLOAD = 64 * 1024; //libcurl requests blocks of 6 const size_t FTP_STREAM_BUFFER_SIZE = 1024 * 1024; //unit: [byte] //stream buffer should be big enough to facilitate prefetching during alternating read/write operations => e.g. see serialize.h::unbufferedStreamCopy() -const ZstringView ftpPrefix = Zstr("ftp:"); +constexpr ZstringView ftpPrefix = Zstr("ftp:"); enum class ServerEncoding @@ -331,10 +331,16 @@ public: else ::curl_easy_reset(easyHandle_); - std::vector<CurlOption> options; + auto setCurlOption = [easyHandle = easyHandle_](const CurlOption& curlOpt) //throw SysError + { + if (const CURLcode rc = ::curl_easy_setopt(easyHandle, curlOpt.option, curlOpt.value); + rc != CURLE_OK) + throw SysError(formatSystemError("curl_easy_setopt(" + numberTo<std::string>(static_cast<int>(curlOpt.option)) + ")", + formatCurlStatusCode(rc), utfTo<std::wstring>(::curl_easy_strerror(rc)))); + }; char curlErrorBuf[CURL_ERROR_SIZE] = {}; - options.emplace_back(CURLOPT_ERRORBUFFER, curlErrorBuf); + setCurlOption({CURLOPT_ERRORBUFFER, curlErrorBuf}); //throw SysError std::string headerData; curl_write_callback onHeaderReceived = [](/*const*/ char* buffer, size_t size, size_t nitems, void* callbackData) @@ -343,50 +349,59 @@ public: output.append(buffer, size * nitems); return size * nitems; }; - options.emplace_back(CURLOPT_HEADERDATA, &headerData); - options.emplace_back(CURLOPT_HEADERFUNCTION, onHeaderReceived); + setCurlOption({CURLOPT_HEADERDATA, &headerData}); //throw SysError + setCurlOption({CURLOPT_HEADERFUNCTION, onHeaderReceived}); //throw SysError - //lifetime: keep alive until after curl_easy_setopt() below - const std::string curlPath = getCurlUrlPath(itemPath, isDir); //throw SysError - options.emplace_back(CURLOPT_URL, curlPath.c_str()); + setCurlOption({CURLOPT_URL, getCurlUrlPath(itemPath, isDir).c_str()}); //throw SysError assert(pathMethod != CURLFTPMETHOD_MULTICWD); //too slow! - options.emplace_back(CURLOPT_FTP_FILEMETHOD, pathMethod); - - //ANSI or UTF encoding? - // "modern" FTP servers (implementing RFC 2640) have UTF8 enabled by default => pray and hope for the best. - // What about ANSI-FTP servers and "Microsoft FTP Service" which requires "OPTS UTF8 ON"? => *psh* - // CURLOPT_PREQUOTE to the rescue? Nope, issued long after USER/PASS - const auto& username = utfTo<std::string>(sessionCfg_.deviceId.username); - const auto& password = utfTo<std::string>(sessionCfg_.password); - if (!username.empty()) //else: libcurl will default to CURL_DEFAULT_USER("anonymous") and CURL_DEFAULT_PASSWORD("ftp@example.com") - { - options.emplace_back(CURLOPT_USERNAME, username.c_str()); - options.emplace_back(CURLOPT_PASSWORD, password.c_str()); //curious: libcurl will *not* default to CURL_DEFAULT_USER when setting password but no username + setCurlOption({CURLOPT_FTP_FILEMETHOD, pathMethod}); //throw SysError + + if (!sessionCfg_.deviceId.username.empty()) //else: libcurl will default to CURL_DEFAULT_USER("anonymous") and CURL_DEFAULT_PASSWORD("ftp@example.com") + { + //ANSI or UTF encoding? + // "modern" FTP servers (implementing RFC 2640) have UTF8 enabled by default => pray and hope for the best. + // What about ANSI-FTP servers and "Microsoft FTP Service" which requires "OPTS UTF8 ON"? => *psh* + // CURLOPT_PREQUOTE to the rescue? Nope, issued long after USER/PASS + setCurlOption({CURLOPT_USERNAME, utfTo<std::string>(sessionCfg_.deviceId.username).c_str()}); //throw SysError + setCurlOption({CURLOPT_PASSWORD, utfTo<std::string>(sessionCfg_.password ).c_str()}); //throw SysError + //curious: libcurl will *not* default to CURL_DEFAULT_USER when setting password but no username } - options.emplace_back(CURLOPT_PORT, sessionCfg_.deviceId.port); + setCurlOption({CURLOPT_PORT, sessionCfg_.deviceId.port}); //throw SysError + + //thread-safety: https://curl.haxx.se/libcurl/c/threadsafe.html + setCurlOption({CURLOPT_NOSIGNAL, 1}); //throw SysError + + //allow PASV IP: some FTP servers really use IP different from control connection + setCurlOption({CURLOPT_FTP_SKIP_PASV_IP, 0}); //throw SysError + //let's not hold our breath until Curl adds a reasonable PASV handling => patch libcurl accordingly! + //https://github.com/curl/curl/issues/1455 + //https://github.com/curl/curl/pull/1470 + //support broken servers like this one: https://freefilesync.org/forum/viewtopic.php?t=4301 - options.emplace_back(CURLOPT_NOSIGNAL, 1); //thread-safety: https://curl.haxx.se/libcurl/c/threadsafe.html const std::shared_ptr<int> timeoutSec = timeoutSec_.lock(); assert(timeoutSec); if (!timeoutSec) throw std::runtime_error(std::string(__FILE__) + '[' + numberTo<std::string>(__LINE__) + "] FtpSession: Timeout duration was not set."); - options.emplace_back(CURLOPT_CONNECTTIMEOUT, *timeoutSec); + setCurlOption({CURLOPT_CONNECTTIMEOUT, *timeoutSec}); //throw SysError //CURLOPT_TIMEOUT: "Since this puts a hard limit for how long time a request is allowed to take, it has limited use in dynamic use cases with varying transfer times." - options.emplace_back(CURLOPT_LOW_SPEED_TIME, *timeoutSec); - options.emplace_back(CURLOPT_LOW_SPEED_LIMIT, 1); //[bytes], can't use "0" which means "inactive", so use some low number + setCurlOption({CURLOPT_LOW_SPEED_TIME, *timeoutSec}); //throw SysError + setCurlOption({CURLOPT_LOW_SPEED_LIMIT, 1}); //throw SysError + ; //[bytes], can't use "0" which means "inactive", so use some low number //unlike CURLOPT_TIMEOUT, this one is NOT a limit on the total transfer time - options.emplace_back(CURLOPT_SERVER_RESPONSE_TIMEOUT, *timeoutSec); //== alias of CURLOPT_SERVER_RESPONSE_TIMEOUT + setCurlOption({CURLOPT_SERVER_RESPONSE_TIMEOUT, *timeoutSec}); //throw SysError + //== alias of CURLOPT_SERVER_RESPONSE_TIMEOUT //CURLOPT_ACCEPTTIMEOUT_MS? => only relevant for "active" FTP connections //long-running file uploads require us to send keep-alives for the TCP control connection: https://freefilesync.org/forum/viewtopic.php?t=6928 - options.emplace_back(CURLOPT_TCP_KEEPALIVE, 1); //=> CURLOPT_TCP_KEEPIDLE (=delay) and CURLOPT_TCP_KEEPINTVL both default to 60 sec + setCurlOption({CURLOPT_TCP_KEEPALIVE, 1}); //throw SysError + //=> CURLOPT_TCP_KEEPIDLE (=delay) and CURLOPT_TCP_KEEPINTVL both default to 60 sec std::optional<SysError> socketException; @@ -409,8 +424,8 @@ public: return (*clientp)(curlfd, purpose); //free this poor little C-API from its shackles and redirect to a proper lambda }; - options.emplace_back(CURLOPT_SOCKOPTFUNCTION, onSocketCreateWrapper); - options.emplace_back(CURLOPT_SOCKOPTDATA, &onSocketCreate); + setCurlOption({CURLOPT_SOCKOPTFUNCTION, onSocketCreateWrapper}); //throw SysError + setCurlOption({CURLOPT_SOCKOPTDATA, &onSocketCreate}); //throw SysError //Use share interface? https://curl.haxx.se/libcurl/c/libcurl-share.html //perf test, 4 and 8 parallel threads: @@ -475,37 +490,35 @@ public: return cs; }(); //CURLSHcode ::curl_share_cleanup(curlShare); - options.emplace_back(CURLOPT_SHARE, curlShare); + setCurlOption({CURLOPT_SHARE, curlShare}); //throw SysError #endif //TODO: FTP option to require certificate checking? #if 0 - options.emplace_back(CURLOPT_CAINFO, "cacert.pem"); //hopefully latest version from https://curl.haxx.se/docs/caextract.html + setCurlOption({CURLOPT_CAINFO, "cacert.pem"}); //throw SysError + //hopefully latest version from https://curl.haxx.se/docs/caextract.html //libcurl forwards this char-string to OpenSSL as is, which (thank god) accepts UTF8 #else - options.emplace_back(CURLOPT_CAINFO, 0); //be explicit: "even when [CURLOPT_SSL_VERIFYPEER] is disabled [...] curl may still load the certificate file specified in CURLOPT_CAINFO." + setCurlOption({CURLOPT_CAINFO, 0}); //throw SysError + //be explicit: "even when [CURLOPT_SSL_VERIFYPEER] is disabled [...] curl may still load the certificate file specified in CURLOPT_CAINFO." //check if server certificate can be trusted? (Default: 1L) // => may fail with: "CURLE_PEER_FAILED_VERIFICATION: SSL certificate problem: certificate has expired" - options.emplace_back(CURLOPT_SSL_VERIFYPEER, 0); + setCurlOption({CURLOPT_SSL_VERIFYPEER, 0}); //throw SysError //check that server name matches the name in the certificate? (Default: 2L) // => may fail with: "CURLE_PEER_FAILED_VERIFICATION: SSL: no alternative certificate subject name matches target host name 'freefilesync.org'" - options.emplace_back(CURLOPT_SSL_VERIFYHOST, 0); + setCurlOption({CURLOPT_SSL_VERIFYHOST, 0}); //throw SysError #endif if (sessionCfg_.useTls) //https://tools.ietf.org/html/rfc4217 { - options.emplace_back(CURLOPT_USE_SSL, CURLUSESSL_ALL); //require SSL for both control and data - options.emplace_back(CURLOPT_FTPSSLAUTH, CURLFTPAUTH_TLS); //try TLS first, then SSL (currently: CURLFTPAUTH_DEFAULT == CURLFTPAUTH_SSL) + //require SSL for both control and data: + setCurlOption({CURLOPT_USE_SSL, CURLUSESSL_ALL}); //throw SysError + //try TLS first, then SSL (currently: CURLFTPAUTH_DEFAULT == CURLFTPAUTH_SSL): + setCurlOption({CURLOPT_FTPSSLAUTH, CURLFTPAUTH_TLS}); //throw SysError } - //let's not hold our breath until Curl adds a reasonable PASV handling => patch libcurl accordingly! - //https://github.com/curl/curl/issues/1455 - //https://github.com/curl/curl/pull/1470 - //support broken servers like this one: https://freefilesync.org/forum/viewtopic.php?t=4301 - - append(options, extraOptions); - - applyCurlOptions(easyHandle_, options); //throw SysError + for (const CurlOption& option : extraOptions) + setCurlOption(option); //throw SysError //======================================================================================================= const CURLcode rcPerf = ::curl_easy_perform(easyHandle_); @@ -857,11 +870,11 @@ private: if (!featureCache_) { static constinit FunStatGlobal<Protected<FeatureList>> globalServerFeatures; - globalServerFeatures.initOnce([] { return std::make_unique<Protected<FeatureList>>(); }); + globalServerFeatures.setOnce([] { return std::make_unique<Protected<FeatureList>>(); }); const auto sf = globalServerFeatures.get(); if (!sf) - throw SysError(formatSystemError("FtpSession::getFeatureSupport", L"", L"Function call not allowed during init/shutdown.")); + throw SysError(formatSystemError("FtpSession::getFeatureSupport", L"", L"Function call not allowed during application shutdown.")); sf->access([&](const FeatureList& featList) { @@ -2210,7 +2223,7 @@ private: const Zstring itemName = getItemName(itemPath); assert(!itemName.empty()); //is the underlying file system case-sensitive? we don't know => assume "case-sensitive" - //all path components (except the base folder part!) can be expected to have the right case anyway after traversal + //all path components (except the base folder part!) can be expected to have the right case anyway after directory traversal for (const FtpItem& item : items) if (item.itemName == itemName) return item.type; diff --git a/FreeFileSync/Source/afs/gdrive.cpp b/FreeFileSync/Source/afs/gdrive.cpp index 668a45db..25c0255b 100644 --- a/FreeFileSync/Source/afs/gdrive.cpp +++ b/FreeFileSync/Source/afs/gdrive.cpp @@ -82,7 +82,7 @@ const size_t GDRIVE_BLOCK_SIZE_UPLOAD = 64 * 1024; //libcurl requests blocks const size_t GDRIVE_STREAM_BUFFER_SIZE = 1024 * 1024; //unit: [byte] //stream buffer should be big enough to facilitate prefetching during alternating read/write operations => e.g. see serialize.h::unbufferedStreamCopy() -const Zchar gdrivePrefix[] = Zstr("gdrive:"); +constexpr ZstringView gdrivePrefix = Zstr("gdrive:"); const char gdriveFolderMimeType [] = "application/vnd.google-apps.folder"; const char gdriveShortcutMimeType[] = "application/vnd.google-apps.shortcut"; //= symbolic link! @@ -488,7 +488,6 @@ GdriveAccessInfo gdriveAuthorizeAccess(const std::string& gdriveLoginHint, const if (testSocket == invalidSocket) THROW_LAST_SYS_ERROR_WSA("socket"); ZEN_ON_SCOPE_FAIL(closeSocket(testSocket)); - warn_static("log on error!") if (::bind(testSocket, ai.ai_addr, static_cast<int>(ai.ai_addrlen)) != 0) THROW_LAST_SYS_ERROR_WSA("bind"); @@ -893,7 +892,7 @@ std::vector<StarredFolderDetails> getStarredFolders(const GdriveAccess& access) if (!itemId || itemId->empty() || !itemName || itemName->empty()) throw SysError(formatGdriveErrorRaw(serializeJson(childVal))); - starredFolders.push_back({std::move(*itemId), + starredFolders.push_back({*itemId, utfTo<Zstring>(*itemName), driveId ? *driveId : ""}); } @@ -2884,8 +2883,7 @@ private: { try //let's not lose Google Drive data due to unexpected system shutdown: { saveActiveSessions(); } //throw FileError - catch (FileError&) { assert(false); } - warn_static("at least log on failure!") + catch (const FileError& e) { logExtraError(e.toString()); } }); }; //========================================================================================== @@ -3949,23 +3947,20 @@ void fff::gdriveInit(const Zstring& configDirPath, const Zstring& caCertFilePath } -std::wstring /*warningMsg*/ fff::gdriveTeardown() +void fff::gdriveTeardown() { - std::wstring warningMsg; try //don't use ~GdrivePersistentSessions() to save! Might never happen, e.g. detached thread waiting for Google Drive authentication; terminated on exit! { if (const std::shared_ptr<GdrivePersistentSessions> gps = globalGdriveSessions.get()) gps->saveActiveSessions(); //throw FileError } - catch (const FileError& e) { warningMsg = e.toString(); } + catch (const FileError& e) { logExtraError(e.toString()); } assert(globalGdriveSessions.get()); globalGdriveSessions.set(nullptr); assert(globalHttpSessionManager.get()); globalHttpSessionManager.set(nullptr); - - return warningMsg; } diff --git a/FreeFileSync/Source/afs/gdrive.h b/FreeFileSync/Source/afs/gdrive.h index a5ebbba8..78f7d31c 100644 --- a/FreeFileSync/Source/afs/gdrive.h +++ b/FreeFileSync/Source/afs/gdrive.h @@ -16,7 +16,7 @@ AbstractPath createItemPathGdrive (const Zstring& itemPathPhrase); //noexc void gdriveInit(const Zstring& configDirPath, //directory to store Google-Drive-specific files const Zstring& caCertFilePath); //cacert.pem -[[nodiscard]] std::wstring /*warningMsg*/ gdriveTeardown(); +void gdriveTeardown(); //------------------------------------------------------- diff --git a/FreeFileSync/Source/afs/init_curl_libssh2.cpp b/FreeFileSync/Source/afs/init_curl_libssh2.cpp index c1cbf754..40026a9a 100644 --- a/FreeFileSync/Source/afs/init_curl_libssh2.cpp +++ b/FreeFileSync/Source/afs/init_curl_libssh2.cpp @@ -26,12 +26,8 @@ void libsshCurlUnifiedInit() libcurlInit(); //includes WSAStartup() also needed by libssh2 - [[maybe_unused]] const int rc2 = ::libssh2_init(0); - assert(rc2 == 0); //libssh2 unconditionally returns 0 => why then have a return value in first place??? - /* we need libssh2's crypto init: - - there is other OpenSSL-related initialization which might be needed (and hopefully won't hurt...) */ - - warn_static("log on error") + [[maybe_unused]] const int rc = ::libssh2_init(0); //includes OpenSSL-related initialization which might be needed (and hopefully won't hurt...) + assert(rc == 0); //libssh2 unconditionally returns 0 => why then have a return value in first place??? } diff --git a/FreeFileSync/Source/afs/native.cpp b/FreeFileSync/Source/afs/native.cpp index 1c23d688..46b2bb4d 100644 --- a/FreeFileSync/Source/afs/native.cpp +++ b/FreeFileSync/Source/afs/native.cpp @@ -566,8 +566,7 @@ private: //at this point we know we created a new file, so it's fine to delete it for cleanup! ZEN_ON_SCOPE_FAIL(try { zen::removeFilePlain(nativePathTarget); } - catch (FileError&) {}); - warn_static("log it!") + catch (const FileError& e) { logExtraError(e.toString()); }); if (copyFilePermissions) copyItemPermissions(getNativePath(sourcePath), nativePathTarget, ProcSymlink::follow); //throw FileError @@ -613,9 +612,8 @@ private: initComForThread(); //throw FileError zen::copySymlink(getNativePath(sourcePath), targetPathNative); //throw FileError - ZEN_ON_SCOPE_FAIL(try { zen::removeSymlinkPlain(targetPathNative); /*throw FileError*/ } - catch (FileError&) {}); - warn_static("log it!") + ZEN_ON_SCOPE_FAIL(try { zen::removeSymlinkPlain(targetPathNative); } + catch (const FileError& e) { logExtraError(e.toString()); }); if (copyFilePermissions) copyItemPermissions(getNativePath(sourcePath), targetPathNative, ProcSymlink::asLink); //throw FileError diff --git a/FreeFileSync/Source/afs/sftp.cpp b/FreeFileSync/Source/afs/sftp.cpp index 1221db24..4787b668 100644 --- a/FreeFileSync/Source/afs/sftp.cpp +++ b/FreeFileSync/Source/afs/sftp.cpp @@ -47,7 +47,7 @@ OpenSSL supports the same ciphers like WinCNG plus the following: cast128-cbc blowfish-cbc */ -const ZstringView sftpPrefix = Zstr("sftp:"); +constexpr ZstringView sftpPrefix = Zstr("sftp:"); constexpr std::chrono::seconds SFTP_SESSION_MAX_IDLE_TIME (20); constexpr std::chrono::seconds SFTP_SESSION_CLEANUP_INTERVAL (4); //facilitate default of 5-seconds delay for error retry @@ -658,19 +658,23 @@ private: { for (SftpChannelInfo& ci : sftpChannels_) //ci.nbInfo.commandPending? => may "legitimately" happen when an SFTP command times out - ::libssh2_sftp_shutdown(ci.sftpChannel); + if (::libssh2_sftp_shutdown(ci.sftpChannel) != LIBSSH2_ERROR_NONE) + assert(false); if (sshSession_) { + //*INDENT-OFF* if (!nbInfo_.commandPending && std::all_of(sftpChannels_.begin(), sftpChannels_.end(), - [](const SftpChannelInfo& ci) { return !ci.nbInfo.commandPending; })) - ::libssh2_session_disconnect(sshSession_, "FreeFileSync says \"bye\"!"); //= server notification only! no local cleanup apparently + [](const SftpChannelInfo& ci) { return !ci.nbInfo.commandPending; })) + if (::libssh2_session_disconnect(sshSession_, "FreeFileSync says \"bye\"!") != LIBSSH2_ERROR_NONE) //= server notification only! no local cleanup apparently + assert(false); //else: avoid further stress on the broken SSH session and take French leave //nbInfo_.commandPending? => have to clean up, no matter what! - ::libssh2_session_free(sshSession_); + if (::libssh2_session_free(sshSession_) != LIBSSH2_ERROR_NONE) + assert(false); + //*INDENT-ON* } - warn_static("log on error!") } std::wstring formatLastSshError(const char* functionName, LIBSSH2_SFTP* sftpChannel /*optional*/) const @@ -787,19 +791,9 @@ public: return session_->tryNonBlocking(channelNo, commandStartTime, functionName, sftpCommand, timeoutSec_); //throw SysError, SysErrorSftpProtocol } - void finishBlocking(size_t channelNo, std::chrono::steady_clock::time_point commandStartTime, const char* functionName, - const std::function<int(const SshSession::Details& sd)>& sftpCommand /*noexcept!*/) + void waitForTraffic() //throw SysError { - for (;;) - try - { - if (session_->tryNonBlocking(channelNo, commandStartTime, functionName, sftpCommand, timeoutSec_)) //throw SysError, SysErrorSftpProtocol - return; - else //pending - SshSession::waitForTraffic({session_.get()}, timeoutSec_); //throw SysError - } - catch (SysError&) { return; } - warn_static("log on error!") + SshSession::waitForTraffic({session_.get()}, timeoutSec_); //throw SysError } size_t getSftpChannelCount() const { return session_->getSftpChannelCount(); } @@ -1148,8 +1142,7 @@ std::vector<SftpItem> getDirContentFlat(const SftpLogin& login, const AfsPath& d runSftpCommand(login, "libssh2_sftp_closedir", //throw SysError, SysErrorSftpProtocol [&](const SshSession::Details& sd) { return ::libssh2_sftp_closedir(dirHandle); }); //noexcept! } - catch (SysError&) {}); - warn_static("log on error!") + catch (const SysError& e) { logExtraError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtPath(getSftpDisplayPath(login, dirPath))) + L"\n\n" + e.toString()); }); std::vector<SftpItem> output; for (;;) @@ -1340,8 +1333,7 @@ struct InputStreamSftp : public AFS::InputStream session_->executeBlocking("libssh2_sftp_close", //throw SysError, SysErrorSftpProtocol [&](const SshSession::Details& sd) { return ::libssh2_sftp_close(fileHandle_); }); //noexcept! } - catch (const SysError&) {} - warn_static("log on error?") + catch (const SysError& e) { logExtraError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(displayPath_)) + L"\n\n" + e.toString()); } } size_t getBlockSize() override { return SFTP_OPTIMAL_BLOCK_SIZE_READ; } //throw (FileError); non-zero block size is AFS contract! @@ -1364,8 +1356,7 @@ struct InputStreamSftp : public AFS::InputStream return static_cast<int>(bytesRead); }); - if (makeUnsigned(bytesRead) > bytesToRead) //better safe than sorry - throw SysError(formatSystemError("libssh2_sftp_read", L"", L"Buffer overflow.")); //user should never see this + ASSERT_SYSERROR(makeUnsigned(bytesRead) <= bytesToRead); //better safe than sorry (user should never see this) } catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(displayPath_)), e.toString()); } @@ -1424,8 +1415,7 @@ struct OutputStreamSftp : public AFS::OutputStreamImpl { close(); //throw FileError } - catch (FileError&) {} - warn_static("log!?") + catch (const FileError& e) { logExtraError(e.toString()); } } size_t getBlockSize() override { return SFTP_OPTIMAL_BLOCK_SIZE_WRITE; } //throw (FileError) @@ -1450,8 +1440,7 @@ struct OutputStreamSftp : public AFS::OutputStreamImpl return static_cast<int>(bytesWritten); }); - if (makeUnsigned(bytesWritten) > bytesToWrite) //better safe than sorry - throw SysError(formatSystemError("libssh2_sftp_write", L"", L"Buffer overflow.")); + ASSERT_SYSERROR(makeUnsigned(bytesWritten) <= bytesToWrite); //better safe than sorry } catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(displayPath_)), e.toString()); } @@ -1755,8 +1744,7 @@ private: runSftpCommand(sftpFs.login_, "libssh2_sftp_readlink", //throw SysError, SysErrorSftpProtocol [&](const SshSession::Details& sd) { return rc = ::libssh2_sftp_readlink(sd.sftpChannel, getLibssh2Path(linkPath), buf.data(), buf.size()); }); //noexcept! - if (makeUnsigned(rc) > buf.size()) //better safe than sorry - throw SysError(formatSystemError("libssh2_sftp_readlink", L"", L"Buffer overflow.")); //user should never see this + ASSERT_SYSERROR(makeUnsigned(rc) <= buf.size()); //better safe than sorry } catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtPath(sftpFs.getDisplayPath(linkPath))), e.toString()); } diff --git a/FreeFileSync/Source/application.cpp b/FreeFileSync/Source/application.cpp index 1dad6e07..272fed83 100644 --- a/FreeFileSync/Source/application.cpp +++ b/FreeFileSync/Source/application.cpp @@ -11,6 +11,7 @@ #include <zen/shutdown.h> #include <zen/process_exec.h> #include <zen/resolve_path.h> +#include <zen/sys_info.h> #include <wx/clipbrd.h> #include <wx/tooltip.h> #include <wx/log.h> @@ -88,35 +89,15 @@ void showSyntaxHelp() _("global config file:") + L'\n' + _("Path to an alternate GlobalSettings.xml file."))); } -} -void Application::notifyAppError(const std::wstring& msg, FfsExitCode rc) +void notifyAppError(const std::wstring& msg) { - raiseExitCode(exitCode_, rc); - - const std::wstring msgType = [&] - { - switch (rc) - { - //*INDENT-OFF* - case FfsExitCode::success: break; - case FfsExitCode::warning: return _("Warning"); - case FfsExitCode::error: return _("Error"); - case FfsExitCode::aborted: return _("Error"); - case FfsExitCode::exception: return _("An exception occurred"); - //*INDENT-ON* - } - assert(false); - return std::wstring{}; - }(); - //error handling strategy unknown and no sync log output available at this point! - std::cerr << utfTo<std::string>(msgType + L": " + msg) + '\n'; + std::cerr << utfTo<std::string>(_("Error") + L": " + msg) + '\n'; //alternative0: std::wcerr: cannot display non-ASCII at all, so why does it exist??? //alternative1: wxSafeShowMessage => NO console output on Debian x86, WTF! //alternative2: wxMessageBox() => works, but we probably shouldn't block during command line usage - - warn_static(" show message box on linux/macos, too!?") +} } //################################################################################################################## @@ -125,10 +106,23 @@ bool Application::OnInit() { //do not call wxApp::OnInit() to avoid using wxWidgets command line parser + const auto now = std::chrono::system_clock::now(); //e.g. "ErrorLog 2023-07-05 105207.073.xml" + initExtraLog([logFilePath = appendPath(getConfigDirPath(), Zstr("ErrorLog ") + + formatTime(Zstr("%Y-%m-%d %H%M%S"), getLocalTime(std::chrono::system_clock::to_time_t(now))) + Zstr('.') + + printNumber<Zstring>(Zstr("%03d"), //[ms] should yield a fairly unique name + static_cast<int>(std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count() % 1000)) + + Zstr(".xml"))](const ErrorLog& log) + { + try //don't call functions depending on global state (which might be destroyed already!) + { + saveErrorLog(log, logFilePath); //throw FileError + } + catch (const FileError& e) { assert(false); notifyAppError(e.toString()); } + }); + //parallel xBRZ-scaling! => run as early as possible try { imageResourcesInit(appendPath(getResourceDirPath(), Zstr("Icons.zip"))); } - catch (const FileError& e) { notifyAppError(e.toString(), FfsExitCode::warning); } - //errors are not really critical in this context + catch (const FileError& e) { logExtraError(e.toString()); } //not critical in this context //GTK should already have been initialized by wxWidgets (see \src\gtk\app.cpp:wxApp::Initialize) #if GTK_MAJOR_VERSION == 2 @@ -141,7 +135,7 @@ bool Application::OnInit() // std::cerr << utfTo<std::string>(formatSystemError("setenv(GIO_USE_VFS)", errno)) + '\n'; // //=> work around 2: - g_vfs_get_default(); //returns unowned GVfs* + [[maybe_unused]] GVfs* defaultFs = ::g_vfs_get_default(); //not owned by us! //no such issue on GTK3! #elif GTK_MAJOR_VERSION == 3 @@ -153,8 +147,8 @@ bool Application::OnInit() GError* error = nullptr; ZEN_ON_SCOPE_EXIT(if (error) ::g_error_free(error)); - ::gtk_css_provider_load_from_path(provider, //GtkCssProvider* css_provider, - appendPath(getResourceDirPath(), fileName).c_str(), //const gchar* path, + ::gtk_css_provider_load_from_path(provider, //GtkCssProvider* css_provider + appendPath(getResourceDirPath(), fileName).c_str(), //const gchar* path &error); //GError** error if (error) throw SysError(formatGlibError("gtk_css_provider_load_from_path", error)); @@ -174,35 +168,31 @@ bool Application::OnInit() { loadCSS("Gtk3Styles.old.css"); //throw SysError } - catch (const SysError& e2) { notifyAppError(e2.toString(), FfsExitCode::warning); } + catch (const SysError& e2) { logExtraError(_("Error during process initialization.") + L"\n\n" + e2.toString()); } } #else #error unknown GTK version! #endif - try - { - /* we're a GUI app: ignore SIGHUP when the parent terminal quits! (or process is killed!) - => the FFS launcher will still be killed => fine - => macOS: apparently not needed! interestingly the FFS launcher does receive SIGHUP and *is* killed */ - if (sighandler_t oldHandler = ::signal(SIGHUP, SIG_IGN); - oldHandler == SIG_ERR) - THROW_LAST_SYS_ERROR("signal(SIGHUP)"); - else assert(!oldHandler); - } - catch (const SysError& e) { notifyAppError(e.toString(), FfsExitCode::warning); } + /* we're a GUI app: ignore SIGHUP when the parent terminal quits! (or process is killed!) + => the FFS launcher will still be killed => fine + => macOS: apparently not needed! interestingly the FFS launcher does receive SIGHUP and *is* killed */ + if (sighandler_t oldHandler = ::signal(SIGHUP, SIG_IGN); + oldHandler == SIG_ERR) + logExtraError(_("Error during process initialization.") + L"\n\n" + formatSystemError("signal(SIGHUP)", getLastError())); + else assert(!oldHandler); //Windows User Experience Interaction Guidelines: tool tips should have 5s timeout, info tips no timeout => compromise: wxToolTip::Enable(true); //wxWidgets screw-up: wxToolTip::SetAutoPop is no-op if global tooltip window is not yet constructed: wxToolTip::Enable creates it wxToolTip::SetAutoPop(15'000); //https://docs.microsoft.com/en-us/windows/win32/uxguide/ctrl-tooltips-and-infotips - SetAppName(L"FreeFileSync"); //if not set, the default is the executable's name! + SetAppName(L"FreeFileSync"); //if not set, defaults to executable name //tentatively set program language to OS default until GlobalSettings.xml is read later try { localizationInit(appendPath(getResourceDirPath(), Zstr("Languages.zip"))); } //throw FileError - catch (const FileError& e) { notifyAppError(e.toString(), FfsExitCode::warning); } + catch (const FileError& e) { logExtraError(e.toString()); } initAfs({getResourceDirPath(), getConfigDirPath()}); //bonus: using FTP Gdrive implicitly inits OpenSSL (used in runSanityChecks() on Linux) already during globals init @@ -214,7 +204,7 @@ bool Application::OnInit() //- it's futile to try and clean up while the process is in full swing (CRASH!) => just terminate! //- system sends close events to all open dialogs: If one of these calls wxCloseEvent::Veto(), // e.g. user clicking cancel on save prompt, this would cancel the shutdown - terminateProcess(static_cast<int>(FfsExitCode::aborted)); + terminateProcess(static_cast<int>(FfsExitCode::cancelled)); }; Bind(wxEVT_QUERY_END_SESSION, [onSystemShutdown](wxCloseEvent& event) { onSystemShutdown(); }); //can veto Bind(wxEVT_END_SESSION, [onSystemShutdown](wxCloseEvent& event) { onSystemShutdown(); }); //can *not* veto @@ -223,14 +213,10 @@ bool Application::OnInit() //- Windows sends WM_QUERYENDSESSION, WM_ENDSESSION during log off, *not* WM_CLOSE https://devblogs.microsoft.com/oldnewthing/20080421-00/?p=22663 // => taskkill sending WM_CLOSE (without /f) is a misguided app simulating a button-click on X // -> should send WM_QUERYENDSESSION instead! - try - { - if (auto /*sighandler_t n.a. on macOS*/ oldHandler = ::signal(SIGTERM, onSystemShutdown);//"graceful" exit requested, unlike SIGKILL - oldHandler == SIG_ERR) - THROW_LAST_SYS_ERROR("signal(SIGTERM)"); - else assert(!oldHandler); - } - catch (const SysError& e) { notifyAppError(e.toString(), FfsExitCode::warning); } + if (auto /*sighandler_t n.a. on macOS*/ oldHandler = ::signal(SIGTERM, onSystemShutdown);//"graceful" exit requested, unlike SIGKILL + oldHandler == SIG_ERR) + logExtraError(_("Error during process initialization.") + L"\n\n" + formatSystemError("signal(SIGTERM)", getLastError())); + else assert(!oldHandler); //Note: app start is deferred: batch mode requires the wxApp eventhandler to be established for UI update events. This is not the case at the time of OnInit()! CallAfter([&] { onEnterEventLoop(); }); @@ -245,10 +231,7 @@ int Application::OnExit() //assert(rv); -> fails if clipboard wasn't used localizationCleanup(); imageResourcesCleanup(); - - const std::wstring& warningMsg = teardownAfs(); - if (!warningMsg.empty()) - notifyAppError(warningMsg, FfsExitCode::warning); + teardownAfs(); return wxApp::OnExit(); } @@ -272,7 +255,7 @@ void Application::OnUnhandledException() //handles both wxApp::OnInit() + wxApp: } catch (const std::bad_alloc& e) //the only kind of exception we don't want crash dumps for { - notifyAppError(utfTo<std::wstring>(e.what()), FfsExitCode::exception); + notifyAppError(utfTo<std::wstring>(e.what())); terminateProcess(static_cast<int>(FfsExitCode::exception)); } //catch (...) -> Windows: let it crash and create mini dump!!! Linux/macOS: std::exception::what() logged to console @@ -488,7 +471,8 @@ void Application::onEnterEventLoop() } catch (const FileError& e) { - notifyAppError(e.toString(), FfsExitCode::exception); + raiseExitCode(exitCode_, FfsExitCode::exception); + notifyAppError(e.toString()); } } @@ -507,6 +491,9 @@ void Application::runGuiMode(const Zstring& globalConfigFilePath, void Application::runBatchMode(const Zstring& globalConfigFilePath, const XmlBatchConfig& batchCfg, const Zstring& cfgFilePath) { + const bool allowUserInteraction = !batchCfg.batchExCfg.autoCloseSummary || + (!batchCfg.guiCfg.mainCfg.ignoreErrors && batchCfg.batchExCfg.batchErrorHandling == BatchErrorHandling::showPopup); + XmlGlobalSettings globalCfg; try { @@ -527,7 +514,14 @@ void Application::runBatchMode(const Zstring& globalConfigFilePath, const XmlBat } catch (const FileError& e3) { - return notifyAppError(e3.toString(), FfsExitCode::exception); + raiseExitCode(exitCode_, FfsExitCode::exception); + + if (allowUserInteraction) + showNotificationDialog(nullptr, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e3.toString())); + else + logExtraError(e3.toString()); + + return; } } @@ -535,11 +529,7 @@ void Application::runBatchMode(const Zstring& globalConfigFilePath, const XmlBat { setLanguage(globalCfg.programLanguage); //throw FileError } - catch (const FileError& e) - { - notifyAppError(e.toString(), FfsExitCode::warning); - //continue! - } + catch (const FileError& e) { logExtraError(e.toString()); } //all settings have been read successfully... @@ -573,19 +563,16 @@ void Application::runBatchMode(const Zstring& globalConfigFilePath, const XmlBat globalCfg.soundFileAlertPending, progressDim, batchCfg.batchExCfg.autoCloseSummary, - batchCfg.batchExCfg.postSyncAction, + batchCfg.batchExCfg.postBatchAction, batchCfg.batchExCfg.batchErrorHandling); - const bool allowUserInteraction = !batchCfg.batchExCfg.autoCloseSummary || - (!batchCfg.guiCfg.mainCfg.ignoreErrors && batchCfg.batchExCfg.batchErrorHandling == BatchErrorHandling::showPopup); - - AFS::RequestPasswordFun requestPassword; //throw AbortProcess + AFS::RequestPasswordFun requestPassword; //throw CancelProcess if (allowUserInteraction) requestPassword = [&, password = Zstring()](const std::wstring& msg, const std::wstring& lastErrorMsg) mutable { assert(runningOnMainThread()); if (showPasswordPrompt(statusHandler.getWindowIfVisible(), msg, lastErrorMsg, password) != ConfirmationButton::accept) - statusHandler.abortProcessNow(AbortTrigger::user); //throw AbortProcess + statusHandler.cancelProcessNow(CancelReason::user); //throw CancelProcess return password; }; @@ -593,12 +580,11 @@ void Application::runBatchMode(const Zstring& globalConfigFilePath, const XmlBat try { //inform about (important) non-default global settings - logNonDefaultSettings(globalCfg, statusHandler); //throw AbortProcess + logNonDefaultSettings(globalCfg, statusHandler); //throw CancelProcess //batch mode: place directory locks on directories during both comparison AND synchronization std::unique_ptr<LockHolder> dirLocks; - //COMPARE DIRECTORIES FolderComparison cmpResult = compare(globalCfg.warnDlgs, globalCfg.fileTimeTolerance, requestPassword, @@ -606,8 +592,7 @@ void Application::runBatchMode(const Zstring& globalConfigFilePath, const XmlBat globalCfg.createLockFile, dirLocks, extractCompareCfg(batchCfg.guiCfg.mainCfg), - statusHandler); //throw AbortProcess - //START SYNCHRONIZATION + statusHandler); //throw CancelProcess if (!cmpResult.empty()) synchronize(syncStartTime, globalCfg.verifyFileCopy, @@ -618,9 +603,13 @@ void Application::runBatchMode(const Zstring& globalConfigFilePath, const XmlBat extractSyncCfg(batchCfg.guiCfg.mainCfg), cmpResult, globalCfg.warnDlgs, - statusHandler); //throw AbortProcess + statusHandler); //throw CancelProcess } - catch (AbortProcess&) {} //exit used by statusHandler + catch (CancelProcess&) {} + + //------------------------------------------------------------------- + BatchStatusHandler::Result r = statusHandler.prepareResult(); + AbstractPath logFolderPath = createAbstractPath(batchCfg.guiCfg.mainCfg.altLogFolderPathPhrase); //optional if (AFS::isNullPath(logFolderPath)) @@ -629,76 +618,168 @@ void Application::runBatchMode(const Zstring& globalConfigFilePath, const XmlBat if (AFS::isNullPath(logFolderPath)) logFolderPath = createAbstractPath(getLogFolderDefaultPath()); - BatchStatusHandler::Result r = statusHandler.reportResults(batchCfg.guiCfg.mainCfg.postSyncCommand, batchCfg.guiCfg.mainCfg.postSyncCondition, - logFolderPath, globalCfg.logfilesMaxAgeDays, globalCfg.logFormat, logFilePathsToKeep, - batchCfg.guiCfg.mainCfg.emailNotifyAddress, batchCfg.guiCfg.mainCfg.emailNotifyCondition); //noexcept - //---------------------------------------------------------------------- - switch (r.summary.syncResult) + AbstractPath logFilePath = AFS::appendRelPath(logFolderPath, generateLogFileName(globalCfg.logFormat, r.summary)); + //e.g. %AppData%\FreeFileSync\Logs\Backup FreeFileSync 2013-09-15 015052.123 [Error].log + + auto notifyStatusNoThrow = [&](std::wstring&& msg) { try { statusHandler.updateStatus(std::move(msg)); /*throw CancelProcess*/ } catch (CancelProcess&) {} }; + + + if (statusHandler.taskCancelled() && *statusHandler.taskCancelled() == CancelReason::user) + ; /* user cancelled => don't run post sync command + => don't send email notification + => don't play sound notification + => don't run post sync action */ + else { - //*INDENT-OFF* - case SyncResult::finishedSuccess: raiseExitCode(exitCode_, FfsExitCode::success); break; - case SyncResult::finishedWarning: raiseExitCode(exitCode_, FfsExitCode::warning); break; - case SyncResult::finishedError: raiseExitCode(exitCode_, FfsExitCode::error ); break; - case SyncResult::aborted: raiseExitCode(exitCode_, FfsExitCode::aborted); break; - //*INDENT-ON* + //--------------------- post sync command ---------------------- + if (const Zstring cmdLine = trimCpy(expandMacros(batchCfg.guiCfg.mainCfg.postSyncCommand)); + !cmdLine.empty()) + if (batchCfg.guiCfg.mainCfg.postSyncCondition == PostSyncCondition::completion || + (batchCfg.guiCfg.mainCfg.postSyncCondition == PostSyncCondition::errors) == (r.summary.result == TaskResult::cancelled || + r.summary.result == TaskResult::error)) + try + { + //give consoleExecute() some "time to fail", but not too long to hang our process + const int DEFAULT_APP_TIMEOUT_MS = 100; + + if (const auto& [exitCode, output] = consoleExecute(cmdLine, DEFAULT_APP_TIMEOUT_MS); //throw SysError, SysErrorTimeOut + exitCode != 0) + throw SysError(formatSystemError("", replaceCpy(_("Exit code %x"), L"%x", numberTo<std::wstring>(exitCode)), utfTo<std::wstring>(output))); + + logMsg(r.errorLog.ref(), _("Executing command:") + L' ' + utfTo<std::wstring>(cmdLine) + L" [" + replaceCpy(_("Exit code %x"), L"%x", L"0") + L']', MSG_TYPE_INFO); + } + catch (SysErrorTimeOut&) //child process not failed yet => probably fine :> + { + logMsg(r.errorLog.ref(), _("Executing command:") + L' ' + utfTo<std::wstring>(cmdLine), MSG_TYPE_INFO); + } + catch (const SysError& e) + { + logMsg(r.errorLog.ref(), replaceCpy(_("Command %x failed."), L"%x", fmtPath(cmdLine)) + L"\n\n" + e.toString(), MSG_TYPE_ERROR); + } + + //--------------------- email notification ---------------------- + if (const std::string notifyEmail = trimCpy(batchCfg.guiCfg.mainCfg.emailNotifyAddress); + !notifyEmail.empty()) + if (batchCfg.guiCfg.mainCfg.emailNotifyCondition == ResultsNotification::always || + (batchCfg.guiCfg.mainCfg.emailNotifyCondition == ResultsNotification::errorWarning && (r.summary.result == TaskResult::cancelled || + r.summary.result == TaskResult::error || + r.summary.result == TaskResult::warning)) || + (batchCfg.guiCfg.mainCfg.emailNotifyCondition == ResultsNotification::errorOnly && (r.summary.result == TaskResult::cancelled || + r.summary.result == TaskResult::error))) + try + { + logMsg(r.errorLog.ref(), replaceCpy(_("Sending email notification to %x"), L"%x", utfTo<std::wstring>(notifyEmail)), MSG_TYPE_INFO); + sendLogAsEmail(notifyEmail, r.summary, r.errorLog.ref(), logFilePath, notifyStatusNoThrow); //throw FileError + } + catch (const FileError& e) { logMsg(r.errorLog.ref(), e.toString(), MSG_TYPE_ERROR); } } - globalCfg.dpiLayouts[getDpiScalePercent()].progressDlg.size = r.dlgDim.size; //=> ignore r.dim.pos - globalCfg.dpiLayouts[getDpiScalePercent()].progressDlg.isMaximized = r.dlgDim.isMaximized; + //--------------------- save log file ---------------------- + try //create not before destruction: 1. avoid issues with FFS trying to sync open log file 2. include status in log file name without extra rename + { + //do NOT use tryReportingError()! saving log files should not be cancellable! + saveLogFile(logFilePath, r.summary, r.errorLog.ref(), globalCfg.logfilesMaxAgeDays, globalCfg.logFormat, logFilePathsToKeep, notifyStatusNoThrow); //throw FileError + } + catch (const FileError& e) + { + logMsg(r.errorLog.ref(), e.toString(), MSG_TYPE_ERROR); - //email sending, or saving log file failed? at least this should affect the exit code: - if (r.logStats.error > 0) - raiseExitCode(exitCode_, FfsExitCode::error); - else if (r.logStats.warning > 0) - raiseExitCode(exitCode_, FfsExitCode::warning); + const AbstractPath logFileDefaultPath = AFS::appendRelPath(createAbstractPath(getLogFolderDefaultPath()), generateLogFileName(globalCfg.logFormat, r.summary)); + if (logFilePath != logFileDefaultPath) //fallback: log file *must* be saved no matter what! + try + { + logFilePath = logFileDefaultPath; + saveLogFile(logFileDefaultPath, r.summary, r.errorLog.ref(), globalCfg.logfilesMaxAgeDays, globalCfg.logFormat, logFilePathsToKeep, notifyStatusNoThrow); //throw FileError + } + catch (const FileError& e2) { logMsg(r.errorLog.ref(), e2.toString(), MSG_TYPE_ERROR); assert(false); } //should never happen!!! + } + //--------- update last sync stats for the selected cfg files --------- + const ErrorLogStats& logStats = getStats(r.errorLog.ref()); - //update last sync stats for the selected cfg file for (ConfigFileItem& cfi : globalCfg.mainDlg.config.fileHistory) if (equalNativePath(cfi.cfgFilePath, cfgFilePath)) { - assert(!AFS::isNullPath(r.logFilePath)); + assert(!AFS::isNullPath(logFilePath)); assert(r.summary.startTime == syncStartTime); cfi.lastRunStats = { - r.logFilePath, + logFilePath, std::chrono::system_clock::to_time_t(r.summary.startTime), - r.summary.syncResult, + r.summary.result, r.summary.statsProcessed.items, r.summary.statsProcessed.bytes, r.summary.totalTime, - r.logStats.error, - r.logStats.warning, + logStats.error, + logStats.warning, }; break; } //--------------------------------------------------------------------------- + const BatchStatusHandler::DlgOptions dlgOpt = statusHandler.showResult(); + + globalCfg.dpiLayouts[getDpiScalePercent()].progressDlg.size = dlgOpt.dim.size; //=> ignore dim.pos + globalCfg.dpiLayouts[getDpiScalePercent()].progressDlg.isMaximized = dlgOpt.dim.isMaximized; + + //---------------------------------------------------------------------- + switch (r.summary.result) + { + //*INDENT-OFF* + case TaskResult::success: raiseExitCode(exitCode_, FfsExitCode::success); break; + case TaskResult::warning: raiseExitCode(exitCode_, FfsExitCode::warning); break; + case TaskResult::error: raiseExitCode(exitCode_, FfsExitCode::error ); break; + case TaskResult::cancelled: raiseExitCode(exitCode_, FfsExitCode::cancelled); break; + //*INDENT-ON* + } + + //email sending, or saving log file failed? at least this should affect the exit code: + if (logStats.error > 0) + raiseExitCode(exitCode_, FfsExitCode::error); + else if (logStats.warning > 0) + raiseExitCode(exitCode_, FfsExitCode::warning); + + //--------------------------------------------------------------------------- try //save global settings to XML: e.g. ignored warnings, last sync stats { writeConfig(globalCfg, globalConfigFilePath); //FileError } catch (const FileError& e) { - notifyAppError(e.toString(), FfsExitCode::warning); + //raiseExitCode(exitCode_, FfsExitCode::error); -> sync successful + if (allowUserInteraction) + showNotificationDialog(nullptr, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); + else + logExtraError(e.toString()); } + //--------------------------------------------------------------------------- + //run shutdown *after* saving global config! https://freefilesync.org/forum/viewtopic.php?t=5761 using FinalRequest = BatchStatusHandler::FinalRequest; - switch (r.finalRequest) + switch (dlgOpt.finalRequest) { case FinalRequest::none: break; + case FinalRequest::switchGui: //open new top-level window *after* progress dialog is gone => run on main event loop MainDialog::create(globalConfigFilePath, &globalCfg, batchCfg.guiCfg, {cfgFilePath}, true /*startComparison*/); break; - case FinalRequest::shutdown: //run *after* last sync stats were updated and saved! https://freefilesync.org/forum/viewtopic.php?t=5761 + + case FinalRequest::shutdown: try { shutdownSystem(); //throw FileError - terminateProcess(static_cast<int>(exitCode_)); //no point in continuing and saving cfg again in onSystemShutdown() while the OS will kill us anytime! + terminateProcess(static_cast<int>(exitCode_)); //better exit in a controlled manner rather than letting the OS kill us any time! + } + catch (const FileError& e) + { + //raiseExitCode(exitCode_, FfsExitCode::error); -> no! sync was successful + if (allowUserInteraction) + showNotificationDialog(nullptr, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); + else + logExtraError(e.toString()); } - catch (const FileError& e) { notifyAppError(e.toString(), FfsExitCode::error); } break; } } diff --git a/FreeFileSync/Source/application.h b/FreeFileSync/Source/application.h index 1eaf8fe1..aa3b570f 100644 --- a/FreeFileSync/Source/application.h +++ b/FreeFileSync/Source/application.h @@ -24,7 +24,6 @@ private: int OnExit() override; bool OnExceptionInMainLoop() override { throw; } //just re-throw and avoid display of additional messagebox: it will be caught in OnUnhandledException() void OnUnhandledException () override; - void notifyAppError(const std::wstring& msg, FfsExitCode rc); wxLayoutDirection GetLayoutDirection() const override; void onEnterEventLoop(); diff --git a/FreeFileSync/Source/base/algorithm.cpp b/FreeFileSync/Source/base/algorithm.cpp index b22c7802..5ff1cfbc 100644 --- a/FreeFileSync/Source/base/algorithm.cpp +++ b/FreeFileSync/Source/base/algorithm.cpp @@ -1468,7 +1468,7 @@ void fff::deleteFromGridAndHD(const std::vector<FileSystemObject*>& rowsToDelete //ensure cleanup: redetermination of sync-directions and removal of invalid rows auto updateDirection = [&] { - //update sync direction: we cannot do a full redetermination since the user may already have entered manual changes + //update sync direction: we cannot do a full redetermination since the user may have manual changes applied already std::vector<FileSystemObject*> rowsToDelete; append(rowsToDelete, deleteLeft); append(rowsToDelete, deleteRight); @@ -1566,8 +1566,7 @@ TempFileBuffer::~TempFileBuffer() { removeDirectoryPlainRecursion(tempFolderPath_); //throw FileError } - catch (FileError&) { assert(false); } - warn_static("log, maybe?") + catch (const FileError& e) { logExtraError(e.toString()); } } diff --git a/FreeFileSync/Source/base/comparison.cpp b/FreeFileSync/Source/base/comparison.cpp index 2b5273ba..8c1c9544 100644 --- a/FreeFileSync/Source/base/comparison.cpp +++ b/FreeFileSync/Source/base/comparison.cpp @@ -186,44 +186,61 @@ ResolvedBaseFolders initializeBaseFolders(const std::vector<FolderPairCfg>& fpCf class ComparisonBuffer { public: - ComparisonBuffer(const std::set<DirectoryKey>& folderKeys, - const FolderStatus& baseFolderStatus, + ComparisonBuffer(const FolderStatus& folderStatus, int fileTimeTolerance, - ProcessCallback& callback); + ProcessCallback& callback) : + fileTimeTolerance_(fileTimeTolerance), + folderStatus_(folderStatus), + cb_(callback) {} - //create comparison result table and fill category except for files existing on both sides: undefinedFiles and undefinedSymlinks are appended! - SharedRef<BaseFolderPair> compareByTimeSize(const ResolvedFolderPair& fp, const FolderPairCfg& fpConfig) const; - SharedRef<BaseFolderPair> compareBySize (const ResolvedFolderPair& fp, const FolderPairCfg& fpConfig) const; - std::vector<SharedRef<BaseFolderPair>> compareByContent(const std::vector<std::pair<ResolvedFolderPair, FolderPairCfg>>& workLoad) const; + FolderComparison execute(const std::vector<std::pair<ResolvedFolderPair, FolderPairCfg>>& workLoad); private: ComparisonBuffer (const ComparisonBuffer&) = delete; ComparisonBuffer& operator=(const ComparisonBuffer&) = delete; + //create comparison result table and fill category except for files existing on both sides: undefinedFiles and undefinedSymlinks are appended! + SharedRef<BaseFolderPair> compareByTimeSize(const ResolvedFolderPair& fp, const FolderPairCfg& fpConfig) const; + SharedRef<BaseFolderPair> compareBySize (const ResolvedFolderPair& fp, const FolderPairCfg& fpConfig) const; + std::vector<SharedRef<BaseFolderPair>> compareByContent(const std::vector<std::pair<ResolvedFolderPair, FolderPairCfg>>& workLoad) const; + SharedRef<BaseFolderPair> performComparison(const ResolvedFolderPair& fp, - const FolderPairCfg& fpCfg, - std::vector<FilePair*>& undefinedFiles, - std::vector<SymlinkPair*>& undefinedSymlinks) const; + const FolderPairCfg& fpCfg, + std::vector<FilePair*>& undefinedFiles, + std::vector<SymlinkPair*>& undefinedSymlinks) const; + + BaseFolderStatus getBaseFolderStatus(const AbstractPath& folderPath) const + { + if (folderStatus_.existing.contains(folderPath)) + return BaseFolderStatus::existing; + if (folderStatus_.notExisting.contains(folderPath)) + return BaseFolderStatus::notExisting; + if (folderStatus_.failedChecks.contains(folderPath)) + return BaseFolderStatus::failure; + assert(AFS::isNullPath(folderPath)); + return BaseFolderStatus::notExisting; + }; - std::map<DirectoryKey, DirectoryValue> folderBuffer_; //contains entries for *all* scanned folders! const int fileTimeTolerance_; const FolderStatus& folderStatus_; + std::map<DirectoryKey, DirectoryValue> folderBuffer_; //contains entries for *all* scanned folders! ProcessCallback& cb_; }; -ComparisonBuffer::ComparisonBuffer(const std::set<DirectoryKey>& folderKeys, - const FolderStatus& folderStatus, - int fileTimeTolerance, - ProcessCallback& callback) : - fileTimeTolerance_(fileTimeTolerance), - folderStatus_(folderStatus), - cb_(callback) +FolderComparison ComparisonBuffer::execute(const std::vector<std::pair<ResolvedFolderPair, FolderPairCfg>>& workLoad) { std::set<DirectoryKey> foldersToRead; - for (const DirectoryKey& folderKey : folderKeys) - if (folderStatus.existing.contains(folderKey.folderPath)) - foldersToRead.insert(folderKey); //only traverse *existing* folders + for (const auto& [folderPair, fpCfg] : workLoad) + if (getBaseFolderStatus(folderPair.folderPathLeft ) != BaseFolderStatus::failure && //no need to list or display one-sided results if + getBaseFolderStatus(folderPair.folderPathRight) != BaseFolderStatus::failure) //*either* folder existence check fails + { + //+ only traverse *existing* folders + if (getBaseFolderStatus(folderPair.folderPathLeft) == BaseFolderStatus::existing) + foldersToRead.emplace(DirectoryKey({folderPair.folderPathLeft, fpCfg.filter.nameFilter, fpCfg.handleSymlinks})); + if (getBaseFolderStatus(folderPair.folderPathRight) == BaseFolderStatus::existing) + foldersToRead.emplace(DirectoryKey({folderPair.folderPathRight, fpCfg.filter.nameFilter, fpCfg.handleSymlinks})); + } //------------------------------------------------------------------ const std::chrono::steady_clock::time_point compareStartTime = std::chrono::steady_clock::now(); @@ -231,37 +248,54 @@ ComparisonBuffer::ComparisonBuffer(const std::set<DirectoryKey>& folderKeys, auto onStatusUpdate = [&, textScanning = _("Scanning:") + L' '](const std::wstring& statusLine, int itemsTotal) { - callback.updateDataProcessed(itemsTotal - itemsReported, 0); //noexcept + cb_.updateDataProcessed(itemsTotal - itemsReported, 0); //noexcept itemsReported = itemsTotal; - callback.updateStatus(textScanning + statusLine); //throw X + cb_.updateStatus(textScanning + statusLine); //throw X }; + //PERF_START; folderBuffer_ = parallelDeviceTraversal(foldersToRead, - [&](const PhaseCallback::ErrorInfo& errorInfo) { return callback.reportError(errorInfo); }, //throw X + [&](const PhaseCallback::ErrorInfo& errorInfo) { return cb_.reportError(errorInfo); }, //throw X onStatusUpdate, //throw X UI_UPDATE_INTERVAL / 2); //every ~50 ms + //PERF_STOP; const int64_t totalTimeSec = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now() - compareStartTime).count(); - callback.logMessage(_("Comparison finished:") + L' ' + - _P("1 item found", "%x items found", itemsReported) + SPACED_DASH + - _("Time elapsed:") + L' ' + utfTo<std::wstring>(formatTimeSpan(totalTimeSec)), - PhaseCallback::MsgType::info); //throw X + cb_.logMessage(_("Comparison finished:") + L' ' + + _P("1 item found", "%x items found", itemsReported) + SPACED_DASH + + _("Time elapsed:") + L' ' + utfTo<std::wstring>(formatTimeSpan(totalTimeSec)), + PhaseCallback::MsgType::info); //throw X //------------------------------------------------------------------ - //folderStatus_.existing already in buffer, now create entries for the rest: - for (const DirectoryKey& folderKey : folderKeys) - if (auto it = folderStatus_.failedChecks.find(folderKey.folderPath); - it != folderStatus_.failedChecks.end()) - //make sure all items are disabled => avoid user panicking: https://freefilesync.org/forum/viewtopic.php?t=7582 - folderBuffer_[folderKey].failedFolderReads[Zstring() /*empty string for root*/] = utfTo<Zstringc>(it->second.toString()); - else + //process binary comparison as one junk + std::vector<std::pair<ResolvedFolderPair, FolderPairCfg>> workLoadByContent; + for (const auto& [folderPair, fpCfg] : workLoad) + if (fpCfg.compareVar == CompareVariant::content) + workLoadByContent.push_back({folderPair, fpCfg}); + + std::vector<SharedRef<BaseFolderPair>> outputByContent = compareByContent(workLoadByContent); + auto itOByC = outputByContent.begin(); + + FolderComparison output; + + //write output in expected order + for (const auto& [folderPair, fpCfg] : workLoad) + switch (fpCfg.compareVar) { - folderBuffer_[folderKey]; - assert(folderStatus_.existing .contains(folderKey.folderPath) || - folderStatus_.notExisting.contains(folderKey.folderPath) || - AFS::isNullPath(folderKey.folderPath)); + case CompareVariant::timeSize: + output.push_back(compareByTimeSize(folderPair, fpCfg)); + break; + case CompareVariant::size: + output.push_back(compareBySize(folderPair, fpCfg)); + break; + case CompareVariant::content: + assert(itOByC != outputByContent.end()); + if (itOByC != outputByContent.end()) + output.push_back(*itOByC++); + break; } + return output; } @@ -617,7 +651,7 @@ std::vector<SharedRef<BaseFolderPair>> ComparisonBuffer::compareByContent(const } //finish categorization: compare files (that have same size) bytewise... - if (!fpWorkload.empty()) //run ProcessPhase::comparingContent only when needed + if (!fpWorkload.empty()) //run ProcessPhase::binaryCompare only when needed { int itemsTotal = 0; uint64_t bytesTotal = 0; @@ -628,7 +662,7 @@ std::vector<SharedRef<BaseFolderPair>> ComparisonBuffer::compareByContent(const for (const FilePair* file : bwl.filesToCompareBytewise) bytesTotal += file->getFileSize<SelectSide::left>(); //left and right file sizes are equal } - cb_.initNewPhase(itemsTotal, bytesTotal, ProcessPhase::comparingContent); //throw X + cb_.initNewPhase(itemsTotal, bytesTotal, ProcessPhase::binaryCompare); //throw X //PERF_START; @@ -733,7 +767,7 @@ const Zstringc* MergeSides::checkFailedRead(FileSystemObject& fsObj, const Zstri it != errorsByRelPath_.end()) errorMsg = &it->second; - if (errorMsg) + if (errorMsg) //make sure all items are disabled => avoid user panicking: https://freefilesync.org/forum/viewtopic.php?t=7582 { fsObj.setActive(false); fsObj.setCategoryConflict(*errorMsg); //peak memory: Zstringc is ref-counted, unlike std::string! @@ -866,7 +900,7 @@ void MergeSides::mergeTwoSides(const FolderContainer& lhs, const FolderContainer matchFolders(lhs.files, rhs.files, [&](const FileData& fileLeft, const Zstringc* conflictMsg) { - FilePair& newItem = output.addFile<SelectSide::left >(fileLeft .first, fileLeft .second); + FilePair& newItem = output.addFile<SelectSide::left >(fileLeft.first, fileLeft.second); checkFailedRead(newItem, conflictMsg ? conflictMsg : errorMsg); }, [&](const FileData& fileRight, const Zstringc* conflictMsg) @@ -891,7 +925,7 @@ void MergeSides::mergeTwoSides(const FolderContainer& lhs, const FolderContainer matchFolders(lhs.symlinks, rhs.symlinks, [&](const SymlinkData& symlinkLeft, const Zstringc* conflictMsg) { - SymlinkPair& newItem = output.addLink<SelectSide::left >(symlinkLeft .first, symlinkLeft .second); + SymlinkPair& newItem = output.addLink<SelectSide::left >(symlinkLeft.first, symlinkLeft.second); checkFailedRead(newItem, conflictMsg ? conflictMsg : errorMsg); }, [&](const SymlinkData& symlinkRight, const Zstringc* conflictMsg) @@ -969,38 +1003,64 @@ void stripExcludedDirectories(ContainerObject& hierObj, const PathFilter& filter //create comparison result table and fill category except for files existing on both sides: undefinedFiles and undefinedSymlinks are appended! SharedRef<BaseFolderPair> ComparisonBuffer::performComparison(const ResolvedFolderPair& fp, - const FolderPairCfg& fpCfg, - std::vector<FilePair*>& undefinedFiles, - std::vector<SymlinkPair*>& undefinedSymlinks) const + const FolderPairCfg& fpCfg, + std::vector<FilePair*>& undefinedFiles, + std::vector<SymlinkPair*>& undefinedSymlinks) const { cb_.updateStatus(_("Generating file list...")); //throw X cb_.requestUiUpdate(true /*force*/); //throw X + const BaseFolderStatus folderStatusL = getBaseFolderStatus(fp.folderPathLeft); + const BaseFolderStatus folderStatusR = getBaseFolderStatus(fp.folderPathRight); + + std::unordered_map<ZstringNoCase, Zstringc> failedReads; //base-relative paths or empty if read-error for whole base directory + const FolderContainer* folderContL = nullptr; + const FolderContainer* folderContR = nullptr; + - auto evalFolderContent = [&](const AbstractPath& folderPath) -> const FolderContainer& + const FolderContainer empty; + if (folderStatusL == BaseFolderStatus::failure || + folderStatusR == BaseFolderStatus::failure) { - const DirectoryValue& dirVal = folderBuffer_.find({folderPath, fpCfg.filter.nameFilter, fpCfg.handleSymlinks})->second; - //contract: folderBuffer_ has entries for *all* folders (existing or not) + auto it = folderStatus_.failedChecks.find(fp.folderPathLeft); + if (it == folderStatus_.failedChecks.end()) + it = folderStatus_.failedChecks.find(fp.folderPathRight); + + failedReads[Zstring() /*empty string for root*/] = utfTo<Zstringc>(it->second.toString()); - //mix failedFolderReads with failedItemReads: - //associate folder traversing errors with folder (instead of child items only) to show on GUI! See "MergeSides" - //=> minor pessimization for "excludefilterFailedRead" which needlessly excludes parent folders, too - auto append = [&](const std::unordered_map<Zstring, Zstringc>& c) + folderContL = ∅ //no need to list or display one-sided results if + folderContR = ∅ //*any* folder existence check fails (even if other side would have been in folderBuffer_!) + } + else + { + auto evalBuffer = [&](const AbstractPath& folderPath, const FolderContainer*& folderCont) { - for (const auto& [relPath, errorMsg] : c) - failedReads.emplace(relPath, errorMsg); - }; - append(dirVal.failedFolderReads); - append(dirVal.failedItemReads); + auto it = folderBuffer_.find({folderPath, fpCfg.filter.nameFilter, fpCfg.handleSymlinks}); + if (it != folderBuffer_.end()) + { + const DirectoryValue& dirVal = it->second; - return dirVal.folderCont; - }; + //mix failedFolderReads with failedItemReads: + //associate folder traversing errors with folder (instead of child items only) to show on GUI! See "MergeSides" + //=> minor pessimization for "excludefilterFailedRead" which needlessly excludes parent folders, too + failedReads.insert(dirVal.failedFolderReads.begin(), dirVal.failedFolderReads.end()); + failedReads.insert(dirVal.failedItemReads .begin(), dirVal.failedItemReads .end()); + + assert(getBaseFolderStatus(folderPath) == BaseFolderStatus::existing); + folderCont = &dirVal.folderCont; + } + else + { + assert(getBaseFolderStatus(folderPath) == BaseFolderStatus::notExisting); //including AFS::isNullPath() + folderCont = ∅ + } + }; + evalBuffer(fp.folderPathLeft, folderContL); + evalBuffer(fp.folderPathRight, folderContR); + } - const FolderContainer& folderContL = evalFolderContent(fp.folderPathLeft); - const FolderContainer& folderContR = evalFolderContent(fp.folderPathRight); - //*after* evalFolderContent(): Zstring excludefilterFailedRead; if (failedReads.contains(Zstring())) //empty path if read-error for whole base directory excludefilterFailedRead += Zstr("*\n"); @@ -1014,28 +1074,16 @@ SharedRef<BaseFolderPair> ComparisonBuffer::performComparison(const ResolvedFold if constexpr (FILE_NAME_SEPARATOR != Zstr('\\')) replace(excludefilterFailedRead, Zstr('\\'), Zstr('?')); - auto getBaseFolderStatus = [&](const AbstractPath& folderPath) - { - if (folderStatus_.existing.contains(folderPath)) - return BaseFolderStatus::existing; - if (folderStatus_.notExisting.contains(folderPath)) - return BaseFolderStatus::notExisting; - if (folderStatus_.failedChecks.contains(folderPath)) - return BaseFolderStatus::failure; - assert(AFS::isNullPath(folderPath)); - return BaseFolderStatus::notExisting; - }; - SharedRef<BaseFolderPair> output = makeSharedRef<BaseFolderPair>(fp.folderPathLeft, - getBaseFolderStatus(fp.folderPathLeft), //dir existence must be checked only once! - fp.folderPathRight, - getBaseFolderStatus(fp.folderPathRight), - fpCfg.filter.nameFilter.ref().copyFilterAddingExclusion(excludefilterFailedRead), - fpCfg.compareVar, - fileTimeTolerance_, - fpCfg.ignoreTimeShiftMinutes); + folderStatusL, //check folder existence only once! + fp.folderPathRight, + folderStatusR, // + fpCfg.filter.nameFilter.ref().copyFilterAddingExclusion(excludefilterFailedRead), + fpCfg.compareVar, + fileTimeTolerance_, + fpCfg.ignoreTimeShiftMinutes); //PERF_START; - MergeSides(failedReads, undefinedFiles, undefinedSymlinks).execute(folderContL, folderContR, output.ref()); + MergeSides(failedReads, undefinedFiles, undefinedSymlinks).execute(*folderContL, *folderContR, output.ref()); //PERF_STOP; //##################### in/exclude rows according to filtering ##################### @@ -1063,11 +1111,9 @@ FolderComparison fff::compare(WarningDialogs& warnings, const std::vector<FolderPairCfg>& fpCfgList, ProcessCallback& callback /*throw X*/) //throw X { - //PERF_START; - //indicator at the very beginning of the log to make sense of "total time" //init process: keep at beginning so that all gui elements are initialized properly - callback.initNewPhase(-1, -1, ProcessPhase::scanning); //throw X; it's unknown how many files will be scanned => -1 objects + callback.initNewPhase(-1, -1, ProcessPhase::scan); //throw X; it's unknown how many files will be scanned => -1 objects //callback.logInfo(Comparison started")); -> still useful? //------------------------------------------------------------------------------- @@ -1165,44 +1211,11 @@ FolderComparison fff::compare(WarningDialogs& warnings, //reduce peak memory by restricting lifetime of ComparisonBuffer to have ended when loading potentially huge InSyncFolder instance in redetermineSyncDirection() { //------------------- fill directory buffer: traverse/read folders -------------------------- - std::set<DirectoryKey> folderKeys; - for (const auto& [folderPair, fpCfg] : workLoad) - { - folderKeys.emplace(DirectoryKey({folderPair.folderPathLeft, fpCfg.filter.nameFilter, fpCfg.handleSymlinks})); - folderKeys.emplace(DirectoryKey({folderPair.folderPathRight, fpCfg.filter.nameFilter, fpCfg.handleSymlinks})); - } - + ComparisonBuffer cmpBuf(resInfo.baseFolderStatus, + fileTimeTolerance, callback); //PERF_START; - ComparisonBuffer cmpBuff(folderKeys, - resInfo.baseFolderStatus, - fileTimeTolerance, callback); + output = cmpBuf.execute(workLoad); //PERF_STOP; - - //process binary comparison as one junk - std::vector<std::pair<ResolvedFolderPair, FolderPairCfg>> workLoadByContent; - for (const auto& [folderPair, fpCfg] : workLoad) - if (fpCfg.compareVar == CompareVariant::content) - workLoadByContent.push_back({folderPair, fpCfg}); - - std::vector<SharedRef<BaseFolderPair>> outputByContent = cmpBuff.compareByContent(workLoadByContent); - auto itOByC = outputByContent.begin(); - - //write output in expected order - for (const auto& [folderPair, fpCfg] : workLoad) - switch (fpCfg.compareVar) - { - case CompareVariant::timeSize: - output.push_back(cmpBuff.compareByTimeSize(folderPair, fpCfg)); - break; - case CompareVariant::size: - output.push_back(cmpBuff.compareBySize(folderPair, fpCfg)); - break; - case CompareVariant::content: - assert(itOByC != outputByContent.end()); - if (itOByC != outputByContent.end()) - output.push_back(*itOByC++); - break; - } } assert(output.size() == fpCfgList.size()); diff --git a/FreeFileSync/Source/base/db_file.cpp b/FreeFileSync/Source/base/db_file.cpp index d0037dec..193abe7a 100644 --- a/FreeFileSync/Source/base/db_file.cpp +++ b/FreeFileSync/Source/base/db_file.cpp @@ -980,11 +980,10 @@ void fff::saveLastSynchronousState(const BaseFolderPair& baseFolder, bool transa ZEN_ON_SCOPE_EXIT ( //*INDENT-OFF* - if (dbPathTmpL) try { AFS::removeFilePlain(*dbPathTmpL); } catch (FileError&) {} - if (dbPathTmpR) try { AFS::removeFilePlain(*dbPathTmpR); } catch (FileError&) {} + if (dbPathTmpL) try { AFS::removeFilePlain(*dbPathTmpL); } catch (const FileError& e) { logExtraError(e.toString()); } + if (dbPathTmpR) try { AFS::removeFilePlain(*dbPathTmpR); } catch (const FileError& e) { logExtraError(e.toString()); } //*INDENT-ON* ) - warn_static("log it!") std::vector<std::pair<AbstractPath, ParallelWorkItem>> parallelWorkloadSave, parallelWorkloadMove; @@ -1037,9 +1036,8 @@ void fff::saveLastSynchronousState(const BaseFolderPair& baseFolder, bool transa massParallelExecute(parallelWorkloadSave, Zstr("Save sync.ffs_db"), callback /*throw X*/); //throw X - + //---------------------------------------------------------------- if (saveSuccessL && saveSuccessR) massParallelExecute(parallelWorkloadMove, Zstr("Move sync.ffs_db"), callback /*throw X*/); //throw X - //---------------------------------------------------------------- } diff --git a/FreeFileSync/Source/base/db_file.h b/FreeFileSync/Source/base/db_file.h index 98d681b8..67be33fa 100644 --- a/FreeFileSync/Source/base/db_file.h +++ b/FreeFileSync/Source/base/db_file.h @@ -15,7 +15,7 @@ namespace fff { -const ZstringView SYNC_DB_FILE_ENDING = Zstr(".ffs_db"); //don't use Zstring as global constant: avoid static initialization order problem in global namespace! +constexpr ZstringView SYNC_DB_FILE_ENDING = Zstr(".ffs_db"); //don't use Zstring as global constant: avoid static initialization order problem in global namespace! struct InSyncDescrFile //subset of FileAttributes { diff --git a/FreeFileSync/Source/base/dir_lock.cpp b/FreeFileSync/Source/base/dir_lock.cpp index 5c6450ef..0486ccd3 100644 --- a/FreeFileSync/Source/base/dir_lock.cpp +++ b/FreeFileSync/Source/base/dir_lock.cpp @@ -37,23 +37,15 @@ const int ABANDONED_LOCK_LEVEL_MAX = 10; } -Zstring fff::impl::getLockFilePathForAbandonedLock(const Zstring& lockFilePath) //throw FileError +Zstring fff::impl::getAbandonedLockFileName(const Zstring& lockFileName) //throw SysError { - auto it = zen::findLast(lockFilePath.begin(), lockFilePath.end(), FILE_NAME_SEPARATOR); - if (it == lockFilePath.end()) - it = lockFilePath.begin(); - else - ++it; - - const Zstring prefix (lockFilePath.begin(), it); - /**/ Zstring fileName( it, lockFilePath.end()); + Zstring fileName = lockFileName; int level = 0; //recursive abandoned locks!? (almost) impossible, except for file system bugs: https://freefilesync.org/forum/viewtopic.php?t=6568 - if (startsWith(fileName, Zstr("Delete."))) //e.g. Delete.1.sync.ffs_lock + const Zstring tmp = afterFirst(fileName, Zstr("Delete."), IfNotFoundReturn::none); //e.g. Delete.1.sync.ffs_lock + if (!tmp.empty()) { - const Zstring tmp = afterFirst(fileName, Zstr('.'), IfNotFoundReturn::none); - const Zstring levelStr = beforeFirst(tmp, Zstr('.'), IfNotFoundReturn::none); if (!levelStr.empty() && std::all_of(levelStr.begin(), levelStr.end(), [](Zchar c) { return zen::isDigit(c); })) { @@ -61,11 +53,11 @@ Zstring fff::impl::getLockFilePathForAbandonedLock(const Zstring& lockFilePath) level = stringTo<int>(levelStr) + 1; if (level >= ABANDONED_LOCK_LEVEL_MAX) - throw FileError(replaceCpy(_("Cannot delete file %x."), L"%x", fmtPath(lockFilePath)), L"Endless recursion."); + throw SysError(L"Endless recursion."); } } - return prefix + Zstr("Delete.") + numberTo<Zstring>(level) + Zstr(".") + fileName; //preserve lock file extension! + return Zstr("Delete.") + numberTo<Zstring>(level) + Zstr(".") + fileName; //preserve lock file extension! } @@ -113,22 +105,18 @@ private: offset == -1) THROW_LAST_SYS_ERROR("lseek"); #endif - if (const ssize_t bytesWritten = ::write(fdLockFile, " ", 1); //writes *up to* count bytes - bytesWritten <= 0) + const ssize_t bytesWritten = ::write(fdLockFile, " ", 1); //writes *up to* count bytes + if (bytesWritten <= 0) { if (bytesWritten == 0) //comment in safe-read.c suggests to treat this as an error due to buggy drivers errno = ENOSPC; THROW_LAST_SYS_ERROR("write"); } - else if (bytesWritten > 1) //better safe than sorry - throw SysError(formatSystemError("write", L"", L"Buffer overflow.")); + ASSERT_SYSERROR(bytesWritten == 1); //better safe than sorry } catch (const SysError& e) { - const std::wstring logMsg = replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(lockFilePath_)) + L' ' + e.toString(); - std::cerr << utfTo<std::string>(logMsg) + '\n'; - - warn_static("log on failure!") + logExtraError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(lockFilePath_)) + L"\n\n" + e.toString()); } } @@ -373,7 +361,16 @@ void waitOnDirLock(const Zstring& lockFilePath, const DirLockCallback& notifySta if (lockOwnderDead || //no need to wait any longer... lastCheckTime >= lastLifeSign + DETECT_ABANDONED_INTERVAL) { - DirLock guardDeletion(fff::impl::getLockFilePathForAbandonedLock(lockFilePath), notifyStatus, cbInterval); //throw FileError + const Zstring lockFileName = [&] + { + try + { + return fff::impl::getAbandonedLockFileName(getItemName(lockFilePath)); //throw SysError + } + catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot delete file %x."), L"%x", fmtPath(lockFilePath)), e.toString()); } + }(); + + DirLock guardDeletion(*getParentFolderPath(lockFilePath), lockFileName, notifyStatus, cbInterval); //throw FileError //now that the lock is in place check existence again: meanwhile another process may have deleted and created a new lock! std::string currentLockId; @@ -388,7 +385,7 @@ void waitOnDirLock(const Zstring& lockFilePath, const DirLockCallback& notifySta if (getLockFileSize(lockFilePath) != fileSizeOld) //throw FileError, ErrorFileNotExisting return; //late life sign (or maybe even a different lock if retrieveLockId() failed!) } - catch (ErrorFileNotExisting&) { return; } //what we are waiting for... + catch (ErrorFileNotExisting&) { return; } //what we are waiting for anyway... removeFilePlain(lockFilePath); //throw FileError return; @@ -480,8 +477,7 @@ public: { ::releaseLock(lockFilePath_); //throw FileError } - catch (FileError&) {} - warn_static("log!!! at the very least") //https://freefilesync.org/forum/viewtopic.php?t=7655 + catch (const FileError& e) { logExtraError(e.toString()); } //inform user about remnant lock files *somehow*! } private: @@ -560,7 +556,7 @@ private: }; -DirLock::DirLock(const Zstring& lockFilePath, const DirLockCallback& notifyStatus, std::chrono::milliseconds cbInterval) //throw FileError +DirLock::DirLock(const Zstring& folderPath, const Zstring& fileName, const DirLockCallback& notifyStatus, std::chrono::milliseconds cbInterval) //throw FileError { - sharedLock_ = LockAdmin::instance().retrieve(lockFilePath, notifyStatus, cbInterval); //throw FileError + sharedLock_ = LockAdmin::instance().retrieve(appendPath(folderPath, fileName), notifyStatus, cbInterval); //throw FileError } diff --git a/FreeFileSync/Source/base/dir_lock.h b/FreeFileSync/Source/base/dir_lock.h index 87b3a7e6..31da3dbc 100644 --- a/FreeFileSync/Source/base/dir_lock.h +++ b/FreeFileSync/Source/base/dir_lock.h @@ -24,15 +24,24 @@ namespace fff - race-free (Windows, almost on Linux(NFS)) - NOT thread-safe! (1. global LockAdmin 2. locks for directory aliases should be created sequentially to detect duplicate locks!) */ +//intermediate locks created by DirLock use this extension, too: +constexpr ZstringView LOCK_FILE_ENDING = Zstr(".ffs_lock"); //don't use Zstring as global constant: avoid static initialization order problem in global namespace! + //while waiting for the lock using DirLockCallback = std::function<void(std::wstring&& msg)>; //throw X class DirLock { public: - DirLock(const Zstring& lockFilePath, //throw FileError - const DirLockCallback& notifyStatus, //callback only used during construction - std::chrono::milliseconds cbInterval); // + DirLock(const Zstring& folderPath, + const DirLockCallback& notifyStatus, //callback only used during construction + std::chrono::milliseconds cbInterval) : + DirLock(folderPath, Zstring(Zstr("sync")) + LOCK_FILE_ENDING, notifyStatus, cbInterval) {} //throw FileError + + DirLock(const Zstring& folderPath, + const Zstring& fileName, + const DirLockCallback& notifyStatus, + std::chrono::milliseconds cbInterval); //throw FileError private: class LockAdmin; @@ -43,7 +52,7 @@ private: namespace impl //declare for unit tests: { -Zstring getLockFilePathForAbandonedLock(const Zstring& lockFilePath); //throw FileError +Zstring getAbandonedLockFileName(const Zstring& lockFilePath); //throw FileError } } diff --git a/FreeFileSync/Source/base/lock_holder.h b/FreeFileSync/Source/base/lock_holder.h index e7d28c6a..e6a9eedc 100644 --- a/FreeFileSync/Source/base/lock_holder.h +++ b/FreeFileSync/Source/base/lock_holder.h @@ -9,8 +9,6 @@ namespace fff { -//intermediate locks created by DirLock use this extension, too: -const ZstringView LOCK_FILE_ENDING = Zstr(".ffs_lock"); //don't use Zstring as global constant: avoid static initialization order problem in global namespace! //Attention: 1. call after having checked directory existence! // 2. perf: remove folder aliases (e.g. case differences) *before* calling this function!!! @@ -28,8 +26,8 @@ public: for (const Zstring& folderPath : folderPaths) try { - //lock file creation is synchronous and may block noticeably for very slow devices (USB sticks, mapped cloud storage) - lockHolder_.emplace_back(appendPath(folderPath, Zstring(Zstr("sync")) + LOCK_FILE_ENDING), + //lock file creation is synchronous and may block noticeably for slow devices (USB sticks, mapped cloud storage) + lockHolder_.emplace_back(folderPath, [&](std::wstring&& msg) { pcb.updateStatus(std::move(msg)); /*throw X*/ }, UI_UPDATE_INTERVAL / 2); //throw FileError } diff --git a/FreeFileSync/Source/base/multi_rename.cpp b/FreeFileSync/Source/base/multi_rename.cpp new file mode 100644 index 00000000..bc1e48ad --- /dev/null +++ b/FreeFileSync/Source/base/multi_rename.cpp @@ -0,0 +1,180 @@ +// ***************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: https://www.gnu.org/licenses/gpl-3.0 * +// * Copyright (C) Zenju (zenju AT freefilesync DOT org) - All Rights Reserved * +// ***************************************************************************** + +#include "multi_rename.h" +#include <zen/string_tools.h> + +using namespace zen; +using namespace fff; + + +namespace +{ +std::wstring_view findLongestSubstring(const std::vector<std::wstring_view>& strings) +{ + if (strings.empty()) + return {}; + + const std::wstring_view strMin = *std::min_element(strings.begin(), strings.end(), + /**/[](const std::wstring_view lhs, const std::wstring_view rhs) { return lhs.size() < rhs.size(); }); + + for (size_t sz = strMin.size(); sz > 0; --sz) //iterate over size, descending + for (size_t i = 0; i + sz <= strMin.size(); ++i) + { + const std::wstring_view substr(strMin.data() + i, sz); + //perf: duplicate substrings, especially für size = 1? + + const bool isCommon = [&] + { + for (const std::wstring_view str : strings) + if (str.data() != strMin.data()) //sufficient check: an extension of strMin wouldn't prune anyway + if (!contains(str, substr)) + return false; + return true; + }(); + + if (isCommon) + return substr; //*first* occuring substring of maximum size + } + + return {}; +} + + +struct StringPart +{ + std::vector<std::wstring_view> diff; //may be empty, but only at beginning + std::wstring_view common; //may be empty, but only at end +}; + +std::vector<StringPart> getStringParts(std::vector<std::wstring_view>&& strings) +{ + std::wstring_view substr = findLongestSubstring(strings); + if (!substr.empty()) + { + std::vector<std::wstring_view> head; + std::vector<std::wstring_view> tail; + + for (const std::wstring_view str : strings) + { + head.push_back(beforeFirst(str, substr, IfNotFoundReturn::none)); + tail.push_back(afterFirst (str, substr, IfNotFoundReturn::none)); + } + + std::vector<StringPart> np = getStringParts(std::move(head)); + assert(np.empty() || np.back().common.empty()); //otherwise we could construct an even longer substring! + + if (np.empty()) + np.push_back({{}, substr}); + else + np.back().common = substr; + + const std::vector<StringPart> npTail = getStringParts(std::move(tail)); + assert(npTail.empty() || !npTail.front().diff.empty()); //otherwise we could construct an even longer substring! + + append(np, npTail); + return np; + } + else + { + if (std::all_of(strings.begin(), strings.end(), [](const std::wstring_view str) { return str.empty(); })) + /**/return {}; + + return {{std::move(strings), {}}}; + } +} + + +constexpr wchar_t placeholders[] = //http://xahlee.info/comp/unicode_circled_numbers.html +{ + //L'\u24FF', //⓿ <- rendered bigger than the rest (same for ⓫) on Centos Linux + L'\u2776', //❶ + L'\u2777', //❷ + L'\u2778', //❸ + L'\u2779', //❹ + L'\u277A', //❺ + L'\u277B', //❻ + L'\u277C', //❼ + L'\u277D', //❽ + L'\u277E', //❾ + L'\u277F', //❿ -> last one is special: represents "all the rest" +}; + + +inline +size_t getPlaceholderIndex(wchar_t c) +{ + static_assert(std::size(placeholders) == 10); + if (placeholders[0] <= c && c <= placeholders[9]) + return static_cast<size_t>(c - placeholders[0]); + + return static_cast<size_t>(-1); +} +} + +struct fff::RenameBuf +{ + explicit RenameBuf(const std::vector<std::wstring>& s) : strings(s) {} + + std::vector<std::wstring> strings; + std::vector<StringPart> parts = getStringParts({strings.begin(), strings.end()}); +}; + + +//e.g. "Season ❶, Episode ❷ - ❸.avi" +std::pair<std::wstring /*phrase*/, SharedRef<const RenameBuf>> fff::getPlaceholderPhrase(const std::vector<std::wstring>& strings) +{ + auto renameBuf = makeSharedRef<const RenameBuf>(strings); + + std::wstring phrase; + size_t placeIdx = 0; + + for (const StringPart& p : renameBuf.ref().parts) + { + if (!p.diff.empty()) + { + phrase += placeholders[placeIdx++]; + + if (placeIdx >= std::size(placeholders)) + break; //represent "all the rest" with last placeholder + } + phrase += p.common; //TODO: what if common part already contains placeholder character!? + } + return {phrase, renameBuf}; +} + + +const std::vector<std::wstring> fff::resolvePlaceholderPhrase(const std::wstring_view phrase, const RenameBuf& buf) +{ + std::vector<std::vector<std::wstring_view>> diffByIdx; + + for (const StringPart& p : buf.parts) + if (!p.diff.empty()) + diffByIdx.push_back(std::move(p.diff)), assert(diffByIdx.back().size() == buf.strings.size()); + + std::vector<std::wstring> output; + + for (size_t i = 0; i < buf.strings.size(); ++i) + { + std::wstring resolved; + + for (const wchar_t c : phrase) + if (const size_t placeIdx = getPlaceholderIndex(c); + placeIdx < diffByIdx.size()) + { + if (placeIdx == std::size(placeholders) - 1) //last placeholder represents "all the rest" + resolved.append(diffByIdx[placeIdx][i].data(), buf.strings[i].data() + buf.strings[i].size()); + else + resolved += diffByIdx[placeIdx][i]; + } + else + resolved += c; + + output.push_back(std::move(resolved)); + } + + return output; +} diff --git a/FreeFileSync/Source/base/multi_rename.h b/FreeFileSync/Source/base/multi_rename.h new file mode 100644 index 00000000..40139049 --- /dev/null +++ b/FreeFileSync/Source/base/multi_rename.h @@ -0,0 +1,23 @@ +// ***************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: https://www.gnu.org/licenses/gpl-3.0 * +// * Copyright (C) Zenju (zenju AT freefilesync DOT org) - All Rights Reserved * +// ***************************************************************************** + +#ifndef MULTI_RENAME_H_489572039485723453425 +#define MULTI_RENAME_H_489572039485723453425 + +//#include <span> +//#include <string> +//#include <vector> +#include <zen/stl_tools.h> + +namespace fff +{ +struct RenameBuf; + +std::pair<std::wstring /*phrase*/, zen::SharedRef<const RenameBuf>> getPlaceholderPhrase(const std::vector<std::wstring>& strings); +const std::vector<std::wstring> resolvePlaceholderPhrase(const std::wstring_view phrase, const RenameBuf& buf); +} + +#endif //MULTI_RENAME_H_489572039485723453425 diff --git a/FreeFileSync/Source/base/process_callback.h b/FreeFileSync/Source/base/process_callback.h index 5bd75439..6d57b2d2 100644 --- a/FreeFileSync/Source/base/process_callback.h +++ b/FreeFileSync/Source/base/process_callback.h @@ -76,9 +76,9 @@ constexpr std::chrono::milliseconds UI_UPDATE_INTERVAL(100); //perform ui update enum class ProcessPhase { none, //initial status - scanning, - comparingContent, - synchronizing + scan, + binaryCompare, + sync }; //report status during comparison and synchronization diff --git a/FreeFileSync/Source/base/status_handler_impl.h b/FreeFileSync/Source/base/status_handler_impl.h index 0504e649..e0bf44ad 100644 --- a/FreeFileSync/Source/base/status_handler_impl.h +++ b/FreeFileSync/Source/base/status_handler_impl.h @@ -459,7 +459,7 @@ private: /**/ return 4; }(); //const int decPlaces = expectedSteps <= 100 ? 0 : static_cast<int>(std::ceil(std::log10(expectedSteps))) - 2; -> overkill? - return zen::formatProgressPercent(fraction, decPlaces); + return zen::formatProgressPercent(fraction, decPlaces); } bool showPercent_ = false; diff --git a/FreeFileSync/Source/base/synchronization.cpp b/FreeFileSync/Source/base/synchronization.cpp index c36da571..1d686900 100644 --- a/FreeFileSync/Source/base/synchronization.cpp +++ b/FreeFileSync/Source/base/synchronization.cpp @@ -598,72 +598,69 @@ void checkPathRaceCondition(const BaseFolderPair& baseFolderP, const BaseFolderP const AbstractPath basePathP = baseFolderP.getAbstractPath<sideP>(); //parent/child notion is tentative at this point const AbstractPath basePathC = baseFolderC.getAbstractPath<sideC>(); //=> will be swapped if necessary - if (!AFS::isNullPath(basePathP) && !AFS::isNullPath(basePathC)) - if (basePathP.afsDevice == basePathC.afsDevice) - { - if (basePathP.afsPath.value.size() > basePathC.afsPath.value.size()) - return checkPathRaceCondition<sideC, sideP>(baseFolderC, baseFolderP, pathRaceItems); + assert(!AFS::isNullPath(basePathP) && !AFS::isNullPath(basePathC)); + if (basePathP.afsDevice == basePathC.afsDevice) + { + if (basePathP.afsPath.value.size() > basePathC.afsPath.value.size()) + return checkPathRaceCondition<sideC, sideP>(baseFolderC, baseFolderP, pathRaceItems); + + const std::vector<Zstring> relPathP = splitCpy(basePathP.afsPath.value, FILE_NAME_SEPARATOR, SplitOnEmpty::skip); + const std::vector<Zstring> relPathC = splitCpy(basePathC.afsPath.value, FILE_NAME_SEPARATOR, SplitOnEmpty::skip); - const std::vector<Zstring> relPathP = splitCpy(basePathP.afsPath.value, FILE_NAME_SEPARATOR, SplitOnEmpty::skip); - const std::vector<Zstring> relPathC = splitCpy(basePathC.afsPath.value, FILE_NAME_SEPARATOR, SplitOnEmpty::skip); + if (relPathP.size() <= relPathC.size() && + /**/std::equal(relPathP.begin(), relPathP.end(), relPathC.begin(), [](const Zstring& lhs, const Zstring& rhs) { return equalNoCase(lhs, rhs); })) + { + //=> at this point parent/child folders are confirmed + //now find child folder match inside baseFolderP + //e.g. C:\folder <-> C:\folder\sub => find "sub" inside C:\folder + std::vector<const ContainerObject*> childFolderP{&baseFolderP}; - if (relPathP.size() <= relPathC.size() && - /**/std::equal(relPathP.begin(), relPathP.end(), relPathC.begin(), [](const Zstring& lhs, const Zstring& rhs) { return equalNoCase(lhs, rhs); })) + std::for_each(relPathC.begin() + relPathP.size(), relPathC.end(), [&](const Zstring& itemName) { - //=> at this point parent/child folders are confirmed - //now find child folder match inside baseFolderP - //e.g. C:\folder <-> C:\folder\sub => find "sub" inside C:\folder - std::vector<const ContainerObject*> childFolderP{&baseFolderP}; + std::vector<const ContainerObject*> childFolderP2; - std::for_each(relPathC.begin() + relPathP.size(), relPathC.end(), [&](const Zstring& itemName) - { - std::vector<const ContainerObject*> childFolderP2; + for (const ContainerObject* childFolder : childFolderP) + for (const FolderPair& folder : childFolder->refSubFolders()) + if (equalNoCase(folder.getItemName<sideP>(), itemName)) + childFolderP2.push_back(&folder); + //no "break": yes, weird, but there could be more than one (for case-sensitive file system) - for (const ContainerObject* childFolder : childFolderP) - for (const FolderPair& folder : childFolder->refSubFolders()) - if (equalNoCase(folder.getItemName<sideP>(), itemName)) - childFolderP2.push_back(&folder); - //no "break": yes, weird, but there could be more than one (for case-sensitive file system) + childFolderP = std::move(childFolderP2); + }); - childFolderP = std::move(childFolderP2); - }); + std::vector<ChildPathRef> pathRefsP; + for (const ContainerObject* childFolder : childFolderP) + append(pathRefsP, GetChildItemsHashed<sideP>::execute(*childFolder)); - std::vector<ChildPathRef> pathRefsP; - for (const ContainerObject* childFolder : childFolderP) - append(pathRefsP, GetChildItemsHashed<sideP>::execute(*childFolder)); - - std::vector<ChildPathRef> pathRefsC = GetChildItemsHashed<sideC>::execute(baseFolderC); - - //--------------------------------------------------------------------------------------------------- - //case-sensitive comparison because items were scanned by FFS (=> no messy user input)? - //not good enough! E.g. not-yet-existing files are set to be created with different case! - // + (weird) a file and a folder are set to be created with same name - // => (throw hands in the air) fine, check path only and don't consider case - sortAndRemoveDuplicates<sideP>(pathRefsP); - sortAndRemoveDuplicates<sideC>(pathRefsC); - - mergeTraversal(pathRefsP.begin(), pathRefsP.end(), - pathRefsC.begin(), pathRefsC.end(), - [](const ChildPathRef&) {} /*left only*/, - [&](const ChildPathRef& lhs, const ChildPathRef& rhs) + std::vector<ChildPathRef> pathRefsC = GetChildItemsHashed<sideC>::execute(baseFolderC); + + //--------------------------------------------------------------------------------------------------- + //case-sensitive comparison because items were scanned by FFS (=> no messy user input)? + //not good enough! E.g. not-yet-existing files are set to be created with different case! + // + (weird) a file and a folder are set to be created with same name + // => (throw hands in the air) fine, check path only and don't consider case + sortAndRemoveDuplicates<sideP>(pathRefsP); + sortAndRemoveDuplicates<sideC>(pathRefsC); + + mergeTraversal(pathRefsP.begin(), pathRefsP.end(), + pathRefsC.begin(), pathRefsC.end(), + [](const ChildPathRef&) {} /*left only*/, + [&](const ChildPathRef& lhs, const ChildPathRef& rhs) + { + if (plannedWriteAccess<sideP>(*lhs.fsObj) || + plannedWriteAccess<sideC>(*rhs.fsObj)) { - if (plannedWriteAccess<sideP>(*lhs.fsObj) || - plannedWriteAccess<sideC>(*rhs.fsObj)) - { - pathRaceItems.push_back({lhs.fsObj, sideP}); - pathRaceItems.push_back({rhs.fsObj, sideC}); - } - }, - [](const ChildPathRef&) {} /*right only*/, compareHashedPathNoCase<sideP, sideC>); - } + pathRaceItems.push_back({lhs.fsObj, sideP}); + pathRaceItems.push_back({rhs.fsObj, sideC}); + } + }, + [](const ChildPathRef&) {} /*right only*/, compareHashedPathNoCase<sideP, sideC>); } + } } //################################################################################################################# -warn_static("review: does flushFileBuffers() make sense?") -//https://devblogs.microsoft.com/oldnewthing/20221007-00/?p=107261 - //--------------------- data verification ------------------------- void flushFileBuffers(const Zstring& nativeFilePath) //throw FileError { @@ -2485,7 +2482,7 @@ void fff::synchronize(const std::chrono::system_clock::time_point& syncStartTime //keep at beginning so that all gui elements are initialized properly callback.initNewPhase(itemsTotal, //throw X bytesTotal, - ProcessPhase::synchronizing); + ProcessPhase::sync); } //------------------------------------------------------------------------------- @@ -2532,6 +2529,9 @@ void fff::synchronize(const std::chrono::system_clock::time_point& syncStartTime const FolderPairSyncCfg& folderPairCfg = syncConfig[folderIndex]; const SyncStatistics& folderPairStat = folderPairStats[folderIndex]; + //=============== start with checks that may SKIP folder pairs =============== + //============================================================================ + //exclude a few pathological cases, e.g. empty folder pair if (baseFolder.getAbstractPath<SelectSide::left >() == baseFolder.getAbstractPath<SelectSide::right>()) @@ -2540,54 +2540,19 @@ void fff::synchronize(const std::chrono::system_clock::time_point& syncStartTime continue; } - //prepare conflict preview: - if (folderPairStat.conflictCount() > 0) - checkUnresolvedConflicts.emplace_back(&baseFolder, folderPairStat.conflictCount(), folderPairStat.getConflictsPreview()); - - //consider *all* paths that might be used during versioning limit at some time - const AbstractPath versioningFolderPath = createAbstractPath(folderPairCfg.versioningFolderPhrase); - - if (folderPairCfg.handleDeletion == DeletionVariant::versioning && - folderPairCfg.versioningStyle != VersioningStyle::replace) - if (folderPairCfg.versionMaxAgeDays > 0 || folderPairCfg.versionCountMax > 0) //same check as in applyVersioningLimit() - checkVersioningLimitPaths.insert(versioningFolderPath); - - const bool writeLeft = folderPairStat.createCount<SelectSide::left>() + - folderPairStat.updateCount<SelectSide::left>() + - folderPairStat.deleteCount<SelectSide::left>() > 0; - - const bool writeRight = folderPairStat.createCount<SelectSide::right>() + - folderPairStat.updateCount<SelectSide::right>() + - folderPairStat.deleteCount<SelectSide::right>() > 0; - - //prepare: check if some files are used by multiple pairs in read/write access - checkBaseFolderRaceCondition.emplace_back(&baseFolder, SelectSide::left, writeLeft); - checkBaseFolderRaceCondition.emplace_back(&baseFolder, SelectSide::right, writeRight); - - //prepare: check if versioning path itself will be synchronized (and was not excluded via filter) - if (folderPairCfg.handleDeletion == DeletionVariant::versioning) - checkVersioningPaths.insert(versioningFolderPath); - - checkVersioningBasePaths.emplace_back(baseFolder.getAbstractPath<SelectSide::left >(), &baseFolder.getFilter()); - checkVersioningBasePaths.emplace_back(baseFolder.getAbstractPath<SelectSide::right>(), &baseFolder.getFilter()); - - //=============================================================================== - //================ begin of checks that may SKIP folder pairs =================== - //=============================================================================== - - //skip folder pair if there is nothing to do (except when DB files need to be updated for two-way mode and move-detection) - //=> avoid redundant errors in checkBaseFolderStatus() if base folder existence test failed during comparison - if (getCUD(folderPairStat) == 0 && !folderPairCfg.saveSyncDB) + //synchronization with only one folder selected, doesn't make sense => don't support "deletion via empty source folder" + if (AFS::isNullPath(baseFolder.getAbstractPath<SelectSide::left >()) || + AFS::isNullPath(baseFolder.getAbstractPath<SelectSide::right>())) { + callback.reportFatalError(_("A folder input field is empty.")); skipFolderPair[folderIndex] = true; continue; } - //check for empty target folder paths: this only makes sense if empty field is source (and no DB files need to be created) - if ((AFS::isNullPath(baseFolder.getAbstractPath<SelectSide::left >()) && (writeLeft || folderPairCfg.saveSyncDB)) || - (AFS::isNullPath(baseFolder.getAbstractPath<SelectSide::right>()) && (writeRight || folderPairCfg.saveSyncDB))) + //skip folder pair if there is nothing to do (except when DB files need to be updated for two-way mode and move-detection) + //=> avoid redundant errors in checkBaseFolderStatus() if base folder existence test failed during comparison + if (getCUD(folderPairStat) == 0 && !folderPairCfg.saveSyncDB) { - callback.reportFatalError(_("Target folder input field must not be empty.")); skipFolderPair[folderIndex] = true; continue; } @@ -2605,16 +2570,15 @@ void fff::synchronize(const std::chrono::system_clock::time_point& syncStartTime //allow propagation of deletions only from *empty* or *existing* source folder: auto sourceFolderMissing = [&](const AbstractPath& baseFolderPath, BaseFolderStatus folderStatus) //we need to evaluate existence status from time of comparison! { - if (!AFS::isNullPath(baseFolderPath)) - //PERMANENT network drop: avoid data loss when source directory is not found AND user chose to ignore errors (else we wouldn't arrive here) - if (folderPairStat.deleteCount() > 0) //check deletions only... (respect filtered items!) - //folderPairStat.conflictCount() == 0 && -> there COULD be conflicts for <Two way> variant if directory existence check fails, but loading sync.ffs_db succeeds - //https://sourceforge.net/tracker/?func=detail&atid=1093080&aid=3531351&group_id=234430 -> fixed, but still better not consider conflicts! - if (folderStatus != BaseFolderStatus::existing) //avoid race-condition: we need to evaluate existence status from time of comparison! - { - callback.reportFatalError(replaceCpy(_("Source folder %x not found."), L"%x", fmtPath(AFS::getDisplayPath(baseFolderPath)))); - return true; - } + //PERMANENT network drop: avoid data loss when source directory is not found AND user chose to ignore errors (else we wouldn't arrive here) + if (folderPairStat.deleteCount() > 0) //check deletions only... (respect filtered items!) + //folderPairStat.conflictCount() == 0 && -> there COULD be conflicts for <Two way> variant if directory existence check fails, but loading sync.ffs_db succeeds + //https://sourceforge.net/tracker/?func=detail&atid=1093080&aid=3531351&group_id=234430 -> fixed, but still better not consider conflicts! + if (folderStatus != BaseFolderStatus::existing) //avoid race-condition: we need to evaluate existence status from time of comparison! + { + callback.reportFatalError(replaceCpy(_("Source folder %x not found."), L"%x", fmtPath(AFS::getDisplayPath(baseFolderPath)))); + return true; + } return false; }; if (sourceFolderMissing(baseFolder.getAbstractPath<SelectSide::left >(), baseFolder.getFolderStatus<SelectSide:: left>()) || @@ -2625,6 +2589,8 @@ void fff::synchronize(const std::chrono::system_clock::time_point& syncStartTime } //check if user-defined directory for deletion was specified + const AbstractPath versioningFolderPath = createAbstractPath(folderPairCfg.versioningFolderPhrase); + if (folderPairCfg.handleDeletion == DeletionVariant::versioning) if (AFS::isNullPath(versioningFolderPath)) { @@ -2633,17 +2599,47 @@ void fff::synchronize(const std::chrono::system_clock::time_point& syncStartTime continue; } + //============ Warnings (*after* potential folder pair skips) ============ + //======================================================================== + + //prepare conflict preview: + if (folderPairStat.conflictCount() > 0) + checkUnresolvedConflicts.emplace_back(&baseFolder, folderPairStat.conflictCount(), folderPairStat.getConflictsPreview()); + + //prepare: check if some files are used by multiple pairs in read/write access + const bool writeLeft = folderPairStat.createCount<SelectSide::left>() + + folderPairStat.updateCount<SelectSide::left>() + + folderPairStat.deleteCount<SelectSide::left>() > 0; + + const bool writeRight = folderPairStat.createCount<SelectSide::right>() + + folderPairStat.updateCount<SelectSide::right>() + + folderPairStat.deleteCount<SelectSide::right>() > 0; + + checkBaseFolderRaceCondition.emplace_back(&baseFolder, SelectSide::left, writeLeft); + checkBaseFolderRaceCondition.emplace_back(&baseFolder, SelectSide::right, writeRight); + + //prepare: check if versioning path itself will be synchronized (and was not excluded via filter) + if (folderPairCfg.handleDeletion == DeletionVariant::versioning) + checkVersioningPaths.insert(versioningFolderPath); + + checkVersioningBasePaths.emplace_back(baseFolder.getAbstractPath<SelectSide::left >(), &baseFolder.getFilter()); + checkVersioningBasePaths.emplace_back(baseFolder.getAbstractPath<SelectSide::right>(), &baseFolder.getFilter()); + + //prepare: versioning folder paths differing only in case + if (folderPairCfg.handleDeletion == DeletionVariant::versioning && + folderPairCfg.versioningStyle != VersioningStyle::replace) + if (folderPairCfg.versionMaxAgeDays > 0 || folderPairCfg.versionCountMax > 0) //same check as in applyVersioningLimit() + checkVersioningLimitPaths.insert(versioningFolderPath); + //check if more than 50% of total number of files/dirs are to be created/overwritten/deleted - if (!AFS::isNullPath(baseFolder.getAbstractPath<SelectSide::left >()) && - !AFS::isNullPath(baseFolder.getAbstractPath<SelectSide::right>())) - if (significantDifferenceDetected(folderPairStat)) - checkSignificantDiffPairs.emplace_back(baseFolder.getAbstractPath<SelectSide::left >(), - baseFolder.getAbstractPath<SelectSide::right>()); + if (significantDifferenceDetected(folderPairStat)) + checkSignificantDiffPairs.emplace_back(baseFolder.getAbstractPath<SelectSide::left >(), + baseFolder.getAbstractPath<SelectSide::right>()); //check for sufficient free diskspace (folderPath might not yet exist!) auto checkSpace = [&](const AbstractPath& baseFolderPath, int64_t minSpaceNeeded) { - if (!AFS::isNullPath(baseFolderPath) && minSpaceNeeded > 0) + if (minSpaceNeeded > 0) try { const int64_t freeSpace = AFS::getFreeDiskSpace(baseFolderPath); //throw FileError, returns < 0 if not available @@ -2823,14 +2819,14 @@ break2: msg += L"\n\n" + _("Selected folder:") + L" \t" + AFS::getDisplayPath(folderPath) + L'\n' + _("Versioning folder:") + L" \t" + AFS::getDisplayPath(versioningFolderPath); - if (pd->folderPathParent == folderPath) //else: probably fine? :> - if (!pd->relPath.empty()) + + if (pd->folderPathParent == folderPath) //if versioning folder is a subfolder of a base folder + if (!pd->relPath.empty()) //this can be fixed via an exclude filter { shouldExclude = true; msg += std::wstring() + L'\n' + L"⇒ " + _("Exclude:") + L" \t" + utfTo<std::wstring>(FILE_NAME_SEPARATOR + pd->relPath + FILE_NAME_SEPARATOR); } - warn_static("else: ???") } } if (!msg.empty()) @@ -2935,8 +2931,6 @@ break2: tryReportingError([&] { copyPermissionsFp = copyFilePermissions && //copy permissions only if asked for and supported by *both* sides! - !AFS::isNullPath(baseFolder.getAbstractPath<SelectSide::left >()) && //scenario: directory selected on one side only - !AFS::isNullPath(baseFolder.getAbstractPath<SelectSide::right>()) && // AFS::supportPermissionCopy(baseFolder.getAbstractPath<SelectSide::left>(), baseFolder.getAbstractPath<SelectSide::right>()); //throw FileError }, callback); //throw X diff --git a/FreeFileSync/Source/base_tools.cpp b/FreeFileSync/Source/base_tools.cpp index 8ab91efd..179ecdab 100644 --- a/FreeFileSync/Source/base_tools.cpp +++ b/FreeFileSync/Source/base_tools.cpp @@ -12,7 +12,7 @@ using namespace zen; using namespace fff; -std::vector<unsigned int> fff::fromTimeShiftPhrase(const std::wstring& timeShiftPhrase) +std::vector<unsigned int> fff::fromTimeShiftPhrase(const std::wstring_view timeShiftPhrase) { std::vector<unsigned int> minutes; diff --git a/FreeFileSync/Source/base_tools.h b/FreeFileSync/Source/base_tools.h index f67a1940..1ea3e65e 100644 --- a/FreeFileSync/Source/base_tools.h +++ b/FreeFileSync/Source/base_tools.h @@ -15,7 +15,7 @@ namespace fff { //convert "ignoreTimeShiftMinutes" into compact format: -std::vector<unsigned int> fromTimeShiftPhrase(const std::wstring& timeShiftPhrase); +std::vector<unsigned int> fromTimeShiftPhrase(const std::wstring_view timeShiftPhrase); std::wstring toTimeShiftPhrase (const std::vector<unsigned int>& ignoreTimeShiftMinutes); //inform about (important) non-default global settings related to comparison and synchronization diff --git a/FreeFileSync/Source/config.cpp b/FreeFileSync/Source/config.cpp index 36ce5cf2..45c20daa 100644 --- a/FreeFileSync/Source/config.cpp +++ b/FreeFileSync/Source/config.cpp @@ -266,32 +266,32 @@ bool readText(const std::string& input, PostSyncCondition& value) template <> inline -void writeText(const PostSyncAction& value, std::string& output) +void writeText(const PostBatchAction& value, std::string& output) { switch (value) { - case PostSyncAction::none: + case PostBatchAction::none: output = "None"; break; - case PostSyncAction::sleep: + case PostBatchAction::sleep: output = "Sleep"; break; - case PostSyncAction::shutdown: + case PostBatchAction::shutdown: output = "Shutdown"; break; } } template <> inline -bool readText(const std::string& input, PostSyncAction& value) +bool readText(const std::string& input, PostBatchAction& value) { const std::string tmp = trimCpy(input); if (tmp == "None") - value = PostSyncAction::none; + value = PostBatchAction::none; else if (tmp == "Sleep") - value = PostSyncAction::sleep; + value = PostBatchAction::sleep; else if (tmp == "Shutdown") - value = PostSyncAction::shutdown; + value = PostBatchAction::shutdown; else return false; return true; @@ -820,37 +820,37 @@ bool readStruc(const XmlElement& input, ExternalApp& value) template <> inline -void writeText(const SyncResult& value, std::string& output) +void writeText(const TaskResult& value, std::string& output) { switch (value) { - case SyncResult::finishedSuccess: + case TaskResult::success: output = "Success"; break; - case SyncResult::finishedWarning: + case TaskResult::warning: output = "Warning"; break; - case SyncResult::finishedError: + case TaskResult::error: output = "Error"; break; - case SyncResult::aborted: + case TaskResult::cancelled: output = "Stopped"; break; } } template <> inline -bool readText(const std::string& input, SyncResult& value) +bool readText(const std::string& input, TaskResult& value) { const std::string tmp = trimCpy(input); if (tmp == "Success") - value = SyncResult::finishedSuccess; + value = TaskResult::success; else if (tmp == "Warning") - value = SyncResult::finishedWarning; + value = TaskResult::warning; else if (tmp == "Error") - value = SyncResult::finishedError; + value = TaskResult::error; else if (tmp == "Stopped") - value = SyncResult::aborted; + value = TaskResult::cancelled; else return false; return true; @@ -915,7 +915,7 @@ template <> inline bool readStruc(const XmlElement& input, ConfigFileItem& value) { bool success = true; - success = input.getAttribute("LastSync", value.lastRunStats.syncTime) && success; + success = input.getAttribute("LastSync", value.lastRunStats.startTime) && success; success = input.getAttribute("Result", value.lastRunStats.syncResult) && success; if (input.hasAttribute("CfgPath")) //TODO: remove after migration! 2020-02-09 @@ -971,18 +971,18 @@ bool readStruc(const XmlElement& input, ConfigFileItem& value) template <> inline void writeStruc(const ConfigFileItem& value, XmlElement& output) { - output.setAttribute("LastSync", value.lastRunStats.syncTime); + output.setAttribute("LastSync", value.lastRunStats.startTime); output.setAttribute("Result", value.lastRunStats.syncResult); output.setAttribute("Config", makePortablePath(value.cfgFilePath)); - output.setAttribute("Log", makePortablePath(AFS::getInitPathPhrase(value.lastRunStats.logFilePath))); + output.setAttribute("Log", makePortablePath(AFS::getInitPathPhrase(value.lastRunStats.logFilePath))); output.setAttribute("Items", value.lastRunStats.itemsProcessed); output.setAttribute("Bytes", value.lastRunStats.bytesProcessed); output.setAttribute("TotalTime", value.lastRunStats.totalTime); - output.setAttribute("Errors", value.lastRunStats.errors); + output.setAttribute("Errors", value.lastRunStats.errors); output.setAttribute("Warnings", value.lastRunStats.warnings); if (value.backColor.IsOk()) @@ -1151,8 +1151,10 @@ void readConfig(const XmlIn& in, MainConfiguration& mainCfg, int formatVer) //########################################################### //read folder pairs bool firstItem = true; - for (XmlIn inPair = in["FolderPairs"]["Pair"]; inPair; inPair.next()) + in["FolderPairs"].visitChildren([&](const XmlIn& inPair) { + assert(*inPair.getName() == "Pair"); + LocalPairConfig lpc; readConfig(inPair, lpc, mainCfg.deviceParallelOps, formatVer); @@ -1164,7 +1166,7 @@ void readConfig(const XmlIn& in, MainConfiguration& mainCfg, int formatVer) } else mainCfg.additionalPairs.push_back(lpc); - } + }); in["Errors"].attribute("Ignore", mainCfg.ignoreErrors); in["Errors"].attribute("Retry", mainCfg.autoRetryCount); @@ -1230,7 +1232,7 @@ void readConfig(const XmlIn& in, XmlBatchConfig& cfg, int formatVer) inBatch["ProgressDialog"].attribute("Minimized", cfg.batchExCfg.runMinimized); inBatch["ProgressDialog"].attribute("AutoClose", cfg.batchExCfg.autoCloseSummary); inBatch["ErrorDialog"](cfg.batchExCfg.batchErrorHandling); - inBatch["PostSyncAction"](cfg.batchExCfg.postSyncAction); + inBatch["PostSyncAction"](cfg.batchExCfg.postBatchAction); } @@ -1669,7 +1671,9 @@ void readConfig(const XmlIn& in, XmlGlobalSettings& cfg, int formatVer) //cfg.dpiLayouts.clear(); -> NO: honor migration code above! - for (XmlIn inLayout = in["DpiLayouts"]["Layout"]; inLayout; inLayout.next()) + in["DpiLayouts"].visitChildren([&](const XmlIn& inLayout) + { + assert(*inLayout.getName() == "Layout"); if (std::string scaleTxt; inLayout.attribute("Scale", scaleTxt)) { @@ -1741,6 +1745,7 @@ void readConfig(const XmlIn& in, XmlGlobalSettings& cfg, int formatVer) cfg.dpiLayouts.emplace(scalePercent, std::move(layout)); } + }); } @@ -1755,21 +1760,18 @@ std::pair<ConfigType, std::wstring /*warningMsg*/> parseConfig(const XmlDoc& doc readConfig(in, cfg, formatVer); std::wstring warningMsg; - try - { - checkXmlMappingErrors(in); //throw FileError - //(try to) migrate old configuration if needed + if (const std::wstring& errors = in.getErrors(); + !errors.empty()) + warningMsg = replaceCpy(_("Configuration file %x is incomplete. The missing elements have been set to their default values."), L"%x", fmtPath(filePath)) + L"\n\n" + + _("The following XML elements could not be read:") + L'\n' + errors; + else //(try to) migrate old configuration if needed if (formatVer < currentXmlFormatVer) - try { fff::writeConfig(cfg, filePath); /*throw FileError*/ } - catch (FileError&) { assert(false); } //don't bother user! - warn_static("at least log on failure!") - } - catch (const FileError& e) - { - warningMsg = replaceCpy(_("Configuration file %x is incomplete. The missing elements have been set to their default values."), L"%x", fmtPath(filePath)) + - L"\n\n" + e.toString(); - } + try + { + fff::writeConfig(cfg, filePath); //throw FileError + } + catch (const FileError& e) { warningMsg = e.toString(); } return {cfg, warningMsg}; } @@ -2022,7 +2024,7 @@ void writeConfig(const XmlBatchConfig& cfg, XmlOut& out) outBatch["ProgressDialog"].attribute("Minimized", cfg.batchExCfg.runMinimized); outBatch["ProgressDialog"].attribute("AutoClose", cfg.batchExCfg.autoCloseSummary); outBatch["ErrorDialog" ](cfg.batchExCfg.batchErrorHandling); - outBatch["PostSyncAction"](cfg.batchExCfg.postSyncAction); + outBatch["PostSyncAction"](cfg.batchExCfg.postBatchAction); } @@ -2258,17 +2260,63 @@ std::optional<FilterConfig> fff::parseFilterBuf(const std::string& filterBuf) try { XmlDoc doc = parseXml(filterBuf); //throw XmlParsingError - XmlIn in(doc); + FilterConfig filterCfg; ::readConfig(in, filterCfg); - - checkXmlMappingErrors(in); //throw FileError - - return filterCfg; + if (in.getErrors().empty()) + return filterCfg; } catch (XmlParsingError&) {} - catch (FileError&) {} return std::nullopt; } + + +void fff::saveErrorLog(const ErrorLog& log, const Zstring& filePath) //throw FileError +{ + XmlDoc doc("Log"); + doc.setEncoding(""); + + XmlOut out(doc); + + for (const LogEntry& e : log) + { + XmlOut outMsg = out.addChild(e.type == MessageType::MSG_TYPE_ERROR ? "Error" : (e.type == MessageType::MSG_TYPE_WARNING ? "Warning" : "Info")); + outMsg.attribute("Time", formatTime(formatIsoDateTimeTag, getLocalTime(e.time))); + outMsg(e.message); + } + + saveXml(doc, filePath); //throw FileError +} + + +ErrorLog fff::loadErrorLog(const Zstring& filePath) //throw FileError +{ + XmlDoc doc = loadXml(filePath); //throw FileError + + XmlIn in(doc); + ErrorLog log; + + in.visitChildren([&](const XmlIn& inMsg) + { + Zstring timeStr; + inMsg.attribute("Time", timeStr); + + Zstringc msg; + inMsg(msg); + + log.push_back( + { + .time = localToTimeT(parseTime(formatIsoDateTimeTag, timeStr)).first, + .type = *inMsg.getName() == "Error" ? MessageType::MSG_TYPE_ERROR : (*inMsg.getName() == "Warning" ? MessageType::MSG_TYPE_WARNING : MessageType::MSG_TYPE_INFO), + .message = std::move(msg), + }); + }); + + if (const std::wstring& errors = in.getErrors(); + !errors.empty()) + throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(filePath)), + _("The following XML elements could not be read:") + L'\n' + errors); + return log; +} diff --git a/FreeFileSync/Source/config.h b/FreeFileSync/Source/config.h index d7c65d72..6193effd 100644 --- a/FreeFileSync/Source/config.h +++ b/FreeFileSync/Source/config.h @@ -27,7 +27,7 @@ enum class BatchErrorHandling }; -enum class PostSyncAction +enum class PostBatchAction { none, sleep, @@ -58,7 +58,7 @@ struct BatchExclusiveConfig bool runMinimized = false; bool autoCloseSummary = false; BatchErrorHandling batchErrorHandling = BatchErrorHandling::showPopup; - PostSyncAction postSyncAction = PostSyncAction::none; + PostBatchAction postBatchAction = PostBatchAction::none; }; @@ -271,6 +271,9 @@ std::wstring extractJobName(const Zstring& cfgFilePath); //human-readable/editable format suitable for clipboard std::string serializeFilter(const FilterConfig& filterCfg); std::optional<FilterConfig> parseFilterBuf(const std::string& filterBuf); + +void saveErrorLog(const zen::ErrorLog& log, const Zstring& filePath); //throw FileError +zen::ErrorLog loadErrorLog(const Zstring& filePath); //throw FileError } #endif //PROCESS_XML_H_28345825704254262435 diff --git a/FreeFileSync/Source/ffs_paths.cpp b/FreeFileSync/Source/ffs_paths.cpp index 751a3739..f1f6cd00 100644 --- a/FreeFileSync/Source/ffs_paths.cpp +++ b/FreeFileSync/Source/ffs_paths.cpp @@ -83,12 +83,8 @@ Zstring fff::getConfigDirPath() { createDirectoryIfMissingRecursion(configPath); //throw FileError } - catch (const FileError& e) - { - assert(false); - std::cerr << utfTo<std::string>(e.toString()) + '\n'; - warn_static("at least log on failure!") - } + catch (const FileError& e) { logExtraError(e.toString()); } + return configPath; }(); return ffsConfigPath; @@ -96,7 +92,7 @@ Zstring fff::getConfigDirPath() //this function is called by RealTimeSync!!! -Zstring fff::getFreeFileSyncLauncherPath() +Zstring fff::getFreeFileSyncLauncherPath() //throw FileError { return appendPath(getInstallDirPath(), Zstr("FreeFileSync")); diff --git a/FreeFileSync/Source/ffs_paths.h b/FreeFileSync/Source/ffs_paths.h index c2d63252..6cf122f1 100644 --- a/FreeFileSync/Source/ffs_paths.h +++ b/FreeFileSync/Source/ffs_paths.h @@ -22,7 +22,8 @@ Zstring getConfigDirPath(); Zstring getInstallDirPath(); -Zstring getFreeFileSyncLauncherPath(); //full path to application launcher C:\...\FreeFileSync.exe +Zstring getFreeFileSyncLauncherPath(); //throw FileError +//full path to application launcher C:\...\FreeFileSync.exe } #endif //FFS_PATHS_H_842759083425342534253 diff --git a/FreeFileSync/Source/icon_buffer.cpp b/FreeFileSync/Source/icon_buffer.cpp index baaa31f1..f4851b06 100644 --- a/FreeFileSync/Source/icon_buffer.cpp +++ b/FreeFileSync/Source/icon_buffer.cpp @@ -46,6 +46,7 @@ std::variant<ImageHolder, FileIconHolder> getDisplayIcon(const AbstractPath& ite return ih; } catch (FileError&) {} + //else: fallback to non-thumbnail icon break; } @@ -141,7 +142,7 @@ public: { if (*ih) //if not yet converted... { - idata.iconFmt = std::make_unique<wxImage>(extractWxImage(std::move(*ih))); //convert in main thread! + idata.iconImg = std::make_unique<wxImage>(extractWxImage(std::move(*ih))); //convert in main thread! assert(!*ih); } } @@ -149,13 +150,13 @@ public: { if (FileIconHolder& fih = std::get<FileIconHolder>(idata.iconHolder)) //if not yet converted... { - idata.iconFmt = std::make_unique<wxImage>(extractWxImage(std::move(fih))); //convert in main thread! + idata.iconImg = std::make_unique<wxImage>(extractWxImage(std::move(fih))); //convert in main thread! assert(!fih); - //!idata.iconFmt->IsOk(): extractWxImage() might fail if icon theme is missing a MIME type! + //!idata.iconImg->IsOk(): extractWxImage() might fail if icon theme is missing a MIME type! } } - return idata.iconFmt ? *idata.iconFmt : wxNullImage; //idata.iconHolder may be inserted as empty from worker thread! + return idata.iconImg ? *idata.iconImg : wxNullImage; //idata.iconHolder may be inserted as empty from worker thread! } //called by main and worker thread: @@ -253,11 +254,11 @@ private: struct IconData { IconData() {} - IconData(IconData&& tmp) noexcept : iconHolder(std::move(tmp.iconHolder)), iconFmt(std::move(tmp.iconFmt)), prev(tmp.prev), next(tmp.next) {} + IconData(IconData&& tmp) noexcept : iconHolder(std::move(tmp.iconHolder)), iconImg(std::move(tmp.iconImg)), prev(tmp.prev), next(tmp.next) {} std::variant<ImageHolder, FileIconHolder> iconHolder; //native icon representation: may be used by any thread - std::unique_ptr<wxImage> iconFmt; //use ONLY from main thread! + std::unique_ptr<wxImage> iconImg; //use ONLY from main thread! //wxImage is NOT thread-safe: non-atomic ref-count just to begin with... //- prohibit implicit calls to wxImage() //- prohibit calls to ~wxImage() and transitively ~IconData() diff --git a/FreeFileSync/Source/localization.cpp b/FreeFileSync/Source/localization.cpp index 6bb2f376..7c6fa18a 100644 --- a/FreeFileSync/Source/localization.cpp +++ b/FreeFileSync/Source/localization.cpp @@ -156,8 +156,14 @@ std::vector<TranslationInfo> loadTranslations(const Zstring& zipPath) //throw Fi .lngStream = std::move(stream), }); } - catch (lng::ParsingError&) { assert(false); } - warn_static("at least log on failure!") + catch (const lng::ParsingError& e) + { + throw FileError(replaceCpy(replaceCpy(replaceCpy(_("Error parsing file %x, row %y, column %z."), + L"%x", fmtPath(fileName)), + L"%y", formatNumber(e.row + 1)), + L"%z", formatNumber(e.col + 1)) + + L"\n\n" + e.msg); + } std::sort(translations.begin(), translations.end(), [](const TranslationInfo& lhs, const TranslationInfo& rhs) { @@ -376,7 +382,7 @@ void fff::setLanguage(wxLanguage lng) //throw FileError { setTranslator(std::make_unique<FFSTranslation>(lngStream)); //throw lng::ParsingError, plural::ParsingError } - catch (lng::ParsingError& e) + catch (const lng::ParsingError& e) { throw FileError(replaceCpy(replaceCpy(replaceCpy(_("Error parsing file %x, row %y, column %z."), L"%x", fmtPath(lngFileName)), diff --git a/FreeFileSync/Source/log_file.cpp b/FreeFileSync/Source/log_file.cpp index d5231ca6..b8f4021b 100644 --- a/FreeFileSync/Source/log_file.cpp +++ b/FreeFileSync/Source/log_file.cpp @@ -46,7 +46,7 @@ std::string generateLogHeaderTxt(const ProcessSummary& s, const ErrorLog& log, i //assemble summary box std::vector<std::string> summary; summary.emplace_back(); - summary.push_back(tabSpace + utfTo<std::string>(getSyncResultLabel(s.syncResult))); + summary.push_back(tabSpace + utfTo<std::string>(getSyncResultLabel(s.result))); summary.emplace_back(); const ErrorLogStats logCount = getStats(log); @@ -192,12 +192,12 @@ std::wstring generateLogTitle(const ProcessSummary& s) if (!jobNamesFmt.empty()) title += jobNamesFmt + L' '; - switch (s.syncResult) + switch (s.result) { - case SyncResult::finishedSuccess: title += utfTo<std::wstring>("\xe2\x9c\x94" "\xef\xb8\x8f"); break; //✔️ - case SyncResult::finishedWarning: title += utfTo<std::wstring>("\xe2\x9a\xa0" "\xef\xb8\x8f"); break; //⚠️ - case SyncResult::finishedError: //efb88f (U+FE0F): variation selector-16 to prefer emoji over text rendering - case SyncResult::aborted: title += utfTo<std::wstring>("\xe2\x9d\x8c" "\xef\xb8\x8f"); break; //❌️ + case TaskResult::success: title += utfTo<std::wstring>("\xe2\x9c\x94" "\xef\xb8\x8f"); break; //✔️ + case TaskResult::warning: title += utfTo<std::wstring>("\xe2\x9a\xa0" "\xef\xb8\x8f"); break; //⚠️ + case TaskResult::error: //efb88f (U+FE0F): variation selector-16 to prefer emoji over text rendering + case TaskResult::cancelled: title += utfTo<std::wstring>("\xe2\x9d\x8c" "\xef\xb8\x8f"); break; //❌️ } return title; } @@ -205,6 +205,7 @@ std::wstring generateLogTitle(const ProcessSummary& s) std::string generateLogHeaderHtml(const ProcessSummary& s, const ErrorLog& log, int logPreviewMax) { + //caveat: non-inline CSS is often ignored by email clients! std::string output = R"(<!DOCTYPE html> <html lang="en"> <head> @@ -212,7 +213,6 @@ std::string generateLogHeaderHtml(const ProcessSummary& s, const ErrorLog& log, <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>)" + htmlTxt(generateLogTitle(s)) + R"(</title> <style> -)" + /*caveat: non-inline CSS is often ignored by email clients!*/ R"( .summary-table td:nth-child(1) { padding-right: 10px; } .summary-table td:nth-child(2) { padding-right: 5px; } .summary-table img { display: block; } @@ -235,18 +235,18 @@ std::string generateLogHeaderHtml(const ProcessSummary& s, const ErrorLog& log, htmlTxt(formatTime(formatDateTag, tc)) + " " + htmlTxt(formatTime(formatTimeTag, tc)) + "</span></div>\n"; std::string resultsStatusImage; - switch (s.syncResult) + switch (s.result) { - case SyncResult::finishedSuccess: resultsStatusImage = "result-succes.png"; break; - case SyncResult::finishedWarning: resultsStatusImage = "result-warning.png"; break; - case SyncResult::finishedError: - case SyncResult::aborted: resultsStatusImage = "result-error.png"; break; + case TaskResult::success: resultsStatusImage = "result-succes.png"; break; + case TaskResult::warning: resultsStatusImage = "result-warning.png"; break; + case TaskResult::error: + case TaskResult::cancelled: resultsStatusImage = "result-error.png"; break; } output += R"( <div style="margin:10px 0; display:inline-block; border-radius:7px; background:#f8f8f8; box-shadow:1px 1px 4px #888; overflow:hidden;"> <div style="background-color:white; border-bottom:1px solid #AAA; font-size:larger; padding:10px;"> <img src="https://freefilesync.org/images/log/)" + resultsStatusImage + R"(" width="32" height="32" alt="" style="vertical-align:middle;"> - <span style="font-weight:600; vertical-align:middle;">)" + htmlTxt(getSyncResultLabel(s.syncResult)) + R"(</span> + <span style="font-weight:600; vertical-align:middle;">)" + htmlTxt(getSyncResultLabel(s.result)) + R"(</span> </div> <table role="presentation" class="summary-table" style="border-spacing:0; margin-left:10px; padding:5px 10px;">)"; @@ -603,12 +603,12 @@ Zstring fff::generateLogFileName(LogFileFormat logFormat, const ProcessSummary& const std::wstring failStatus = [&] { - switch (summary.syncResult) + switch (summary.result) { - case SyncResult::finishedSuccess: break; - case SyncResult::finishedWarning: return _("Warning"); - case SyncResult::finishedError: return _("Error"); - case SyncResult::aborted: return _("Stopped"); + case TaskResult::success: break; + case TaskResult::warning: return _("Warning"); + case TaskResult::error: return _("Error"); + case TaskResult::cancelled: return _("Stopped"); } return std::wstring(); }(); @@ -619,7 +619,7 @@ Zstring fff::generateLogFileName(LogFileFormat logFormat, const ProcessSummary& logFileName += Zstr(' '); logFileName += formatTime(Zstr("%Y-%m-%d %H%M%S"), tc) + - Zstr(".") + printNumber<Zstring>(Zstr("%03d"), static_cast<int>(timeMs)); //[ms] should yield a fairly unique name + Zstr('.') + printNumber<Zstring>(Zstr("%03d"), static_cast<int>(timeMs)); //[ms] should yield a fairly unique name static_assert(TIME_STAMP_LENGTH == 21); if (!failStatus.empty()) diff --git a/FreeFileSync/Source/return_codes.h b/FreeFileSync/Source/return_codes.h index 07e51e40..0070bb5a 100644 --- a/FreeFileSync/Source/return_codes.h +++ b/FreeFileSync/Source/return_codes.h @@ -17,7 +17,7 @@ enum class FfsExitCode //as returned on process exit success = 0, warning, error, - aborted, + cancelled, exception, }; @@ -30,25 +30,25 @@ void raiseExitCode(FfsExitCode& rc, FfsExitCode rcProposed) } -enum class SyncResult +enum class TaskResult { - finishedSuccess, - finishedWarning, - finishedError, - aborted, + success, + warning, + error, + cancelled, }; inline -std::wstring getSyncResultLabel(SyncResult syncResult) +std::wstring getSyncResultLabel(TaskResult syncResult) { switch (syncResult) { //*INDENT-OFF* - case SyncResult::finishedSuccess: return _("Completed successfully"); - case SyncResult::finishedWarning: return _("Completed with warnings"); - case SyncResult::finishedError: return _("Completed with errors"); - case SyncResult::aborted: return _("Stopped"); + case TaskResult::success: return _("Completed successfully"); + case TaskResult::warning: return _("Completed with warnings"); + case TaskResult::error: return _("Completed with errors"); + case TaskResult::cancelled: return _("Stopped"); //*INDENT-ON* } assert(false); diff --git a/FreeFileSync/Source/status_handler.cpp b/FreeFileSync/Source/status_handler.cpp index 6530ed48..3ed82b6c 100644 --- a/FreeFileSync/Source/status_handler.cpp +++ b/FreeFileSync/Source/status_handler.cpp @@ -6,7 +6,7 @@ #include "status_handler.h" #include <zen/basic_math.h> -#include <zen/process_exec.h> +//#include <zen/process_exec.h> using namespace zen; @@ -30,30 +30,6 @@ bool fff::uiUpdateDue(bool force) } -void fff::runCommandAndLogErrors(const Zstring& cmdLine, ErrorLog& errorLog) -{ - try - { - //give consoleExecute() some "time to fail", but not too long to hang our process - const int DEFAULT_APP_TIMEOUT_MS = 100; - - if (const auto& [exitCode, output] = consoleExecute(cmdLine, DEFAULT_APP_TIMEOUT_MS); //throw SysError, SysErrorTimeOut - exitCode != 0) - throw SysError(formatSystemError("", replaceCpy(_("Exit code %x"), L"%x", numberTo<std::wstring>(exitCode)), utfTo<std::wstring>(output))); - - logMsg(errorLog, _("Executing command:") + L' ' + utfTo<std::wstring>(cmdLine) + L" [" + replaceCpy(_("Exit code %x"), L"%x", L"0") + L']', MSG_TYPE_INFO); - } - catch (SysErrorTimeOut&) //child process not failed yet => probably fine :> - { - logMsg(errorLog, _("Executing command:") + L' ' + utfTo<std::wstring>(cmdLine), MSG_TYPE_INFO); - } - catch (const SysError& e) - { - logMsg(errorLog, replaceCpy(_("Command %x failed."), L"%x", fmtPath(cmdLine)) + L"\n\n" + e.toString(), MSG_TYPE_ERROR); - } -} - - void fff::delayAndCountDown(std::chrono::steady_clock::time_point delayUntil, const std::function<void(const std::wstring& timeRemMsg)>& notifyStatus) { assert(notifyStatus); diff --git a/FreeFileSync/Source/status_handler.h b/FreeFileSync/Source/status_handler.h index 89a2b38e..469e4d01 100644 --- a/FreeFileSync/Source/status_handler.h +++ b/FreeFileSync/Source/status_handler.h @@ -22,20 +22,20 @@ bool uiUpdateDue(bool force = false); //test if a specific amount of time is ove - Synchronization 0.74 ms (despite complex graph control!) */ //Exception class used to abort the "compare" and "sync" process -class AbortProcess {}; +class CancelProcess {}; -enum class AbortTrigger +enum class CancelReason { user, - program, + firstError, }; //GUI may want to abort process -struct AbortCallback +struct CancelCallback { - virtual ~AbortCallback() {} - virtual void userRequestAbort() = 0; + virtual ~CancelCallback() {} + virtual void userRequestCancel() = 0; }; @@ -65,7 +65,7 @@ struct Statistics }; virtual ErrorStats getErrorStats() const = 0; - virtual std::optional<AbortTrigger> getAbortStatus() const = 0; + virtual std::optional<CancelReason> taskCancelled() const = 0; virtual const std::wstring& currentStatusText() const = 0; }; @@ -73,7 +73,7 @@ struct Statistics struct ProcessSummary { std::chrono::system_clock::time_point startTime; - SyncResult syncResult = SyncResult::aborted; + TaskResult result = TaskResult::cancelled; std::vector<std::wstring> jobNames; //may be empty ProgressStats statsProcessed; ProgressStats statsTotal; @@ -82,7 +82,7 @@ struct ProcessSummary //partial callback implementation with common functionality for "batch", "GUI/Compare" and "GUI/Sync" -class StatusHandler : public ProcessCallback, public AbortCallback, public Statistics +class StatusHandler : public ProcessCallback, public CancelCallback, public Statistics { public: //StatusHandler() {} @@ -99,49 +99,49 @@ public: void updateDataProcessed(int itemsDelta, int64_t bytesDelta) override { updateData(statsCurrent_, itemsDelta, bytesDelta); } //note: these methods MUST NOT throw in order void updateDataTotal (int itemsDelta, int64_t bytesDelta) override { updateData(statsTotal_, itemsDelta, bytesDelta); } //to allow usage within destructors! - void requestUiUpdate(bool force) final //throw AbortProcess + void requestUiUpdate(bool force) final //throw CancelProcess { if (uiUpdateDue(force)) { - const bool abortRequestedBefore = static_cast<bool>(abortRequested_); + const bool abortRequestedBefore = static_cast<bool>(cancelRequested_); forceUiUpdateNoThrow(); - //triggered by userRequestAbort() + //triggered by userRequestCancel() // => sufficient to evaluate occasionally when uiUpdateDue()! // => refresh *before* throwing: support requestUiUpdate() during destruction - if (abortRequested_) + if (cancelRequested_) { if (!abortRequestedBefore) - forceUiUpdateNoThrow(); //just once to immediately show the "Stop requested..." status after user clicks cancel - throw AbortProcess(); + forceUiUpdateNoThrow(); //immediately show the "Stop requested..." status after user clicked cancel + throw CancelProcess(); } } } virtual void forceUiUpdateNoThrow() = 0; //noexcept - void updateStatus(std::wstring&& msg) final //throw AbortProcess + void updateStatus(std::wstring&& msg) final //throw CancelProcess { //assert(!msg.empty()); -> possible, e.g. start of parallel scan statusText_ = std::move(msg); //update *before* running operations that can throw - requestUiUpdate(false /*force*/); //throw AbortProcess + requestUiUpdate(false /*force*/); //throw CancelProcess } - [[noreturn]] void abortProcessNow(AbortTrigger trigger) + [[noreturn]] void cancelProcessNow(CancelReason reason) { - if (!abortRequested_ || trigger == AbortTrigger::user) //AbortTrigger::USER overwrites AbortTrigger::program - abortRequested_ = trigger; + if (!cancelRequested_ || reason == CancelReason::user) //CancelReason::user overwrites CancelReason::firstError + cancelRequested_ = reason; forceUiUpdateNoThrow(); //flush GUI to show new cancelled state - throw AbortProcess(); + throw CancelProcess(); } - //implement AbortCallback - void userRequestAbort() final + //implement CancelCallback + void userRequestCancel() final { - abortRequested_ = AbortTrigger::user; //may overwrite AbortTrigger::program - } //called from GUI code: this does NOT call abortProcessNow() immediately, but later when we're out of the C GUI call stack + cancelRequested_ = CancelReason::user; //may overwrite CancelReason::firstError + } //called from GUI code: this does NOT call cancelProcessNow() immediately, but later when we're out of the C GUI call stack //=> don't call forceUiUpdateNoThrow() here! //implement Statistics @@ -152,7 +152,7 @@ public: const std::wstring& currentStatusText() const override { return statusText_; } - std::optional<AbortTrigger> getAbortStatus() const override { return abortRequested_; } + std::optional<CancelReason> taskCancelled() const override { return cancelRequested_; } private: void updateData(ProgressStats& stats, int itemsDelta, int64_t bytesDelta) @@ -168,12 +168,11 @@ private: ProgressStats statsTotal_ {-1, -1}; std::wstring statusText_; - std::optional<AbortTrigger> abortRequested_; + std::optional<CancelReason> cancelRequested_; }; void delayAndCountDown(std::chrono::steady_clock::time_point delayUntil, const std::function<void(const std::wstring& timeRemMsg)>& notifyStatus); -void runCommandAndLogErrors(const Zstring& cmdLine, zen::ErrorLog& errorLog); } #endif //STATUS_HANDLER_H_81704805908341534 diff --git a/FreeFileSync/Source/ui/batch_config.cpp b/FreeFileSync/Source/ui/batch_config.cpp index a61b14f0..13dae8f2 100644 --- a/FreeFileSync/Source/ui/batch_config.cpp +++ b/FreeFileSync/Source/ui/batch_config.cpp @@ -56,7 +56,7 @@ private: //output-only parameters BatchDialogConfig& dlgCfgOut_; - EnumDescrList<PostSyncAction> enumPostSyncAction_; + EnumDescrList<PostBatchAction> enumPostBatchAction_; }; //################################################################################################################################### @@ -72,10 +72,10 @@ BatchDialog::BatchDialog(wxWindow* parent, BatchDialogConfig& dlgCfg) : setImage(*m_bitmapBatchJob, loadImage("cfg_batch")); - enumPostSyncAction_. - add(PostSyncAction::none, L""). - add(PostSyncAction::sleep, _("System: Sleep")). - add(PostSyncAction::shutdown, _("System: Shut down")); + enumPostBatchAction_. + add(PostBatchAction::none, L""). + add(PostBatchAction::sleep, _("System: Sleep")). + add(PostBatchAction::shutdown, _("System: Shut down")); setConfig(dlgCfg); @@ -125,7 +125,7 @@ void BatchDialog::setConfig(const BatchDialogConfig& dlgCfg) m_checkBoxRunMinimized->SetValue(dlgCfg.batchExCfg.runMinimized); m_checkBoxAutoClose ->SetValue(dlgCfg.batchExCfg.autoCloseSummary); - setEnumVal(enumPostSyncAction_, *m_choicePostSyncAction, dlgCfg.batchExCfg.postSyncAction); + setEnumVal(enumPostBatchAction_, *m_choicePostSyncAction, dlgCfg.batchExCfg.postBatchAction); updateGui(); //re-evaluate gui after config changes } @@ -140,7 +140,7 @@ BatchDialogConfig BatchDialog::getConfig() const .runMinimized = m_checkBoxRunMinimized->GetValue(), .autoCloseSummary = m_checkBoxAutoClose ->GetValue(), .batchErrorHandling = m_radioBtnErrorDialogCancel->GetValue() ? BatchErrorHandling::cancel : BatchErrorHandling::showPopup, - .postSyncAction = getEnumVal(enumPostSyncAction_, *m_choicePostSyncAction), + .postBatchAction = getEnumVal(enumPostBatchAction_, *m_choicePostSyncAction), }, .ignoreErrors = m_checkBoxIgnoreErrors->GetValue(), }; diff --git a/FreeFileSync/Source/ui/batch_status_handler.cpp b/FreeFileSync/Source/ui/batch_status_handler.cpp index 872ca846..a1898af8 100644 --- a/FreeFileSync/Source/ui/batch_status_handler.cpp +++ b/FreeFileSync/Source/ui/batch_status_handler.cpp @@ -6,12 +6,13 @@ #include "batch_status_handler.h" #include <zen/shutdown.h> -#include <zen/resolve_path.h> +//#include <zen/process_exec.h> +//#include <zen/resolve_path.h> #include <wx+/popup_dlg.h> #include <wx/app.h> #include <wx/sound.h> -#include "../afs/concrete.h" -#include "../config.h" +//#include "../afs/concrete.h" +//#include "../config.h" //#include "../log_file.h" using namespace zen; @@ -28,7 +29,7 @@ BatchStatusHandler::BatchStatusHandler(bool showProgress, const Zstring& soundFileAlertPending, const WindowLayout::Dimensions& dims, bool autoCloseDialog, - PostSyncAction postSyncAction, + PostBatchAction postBatchAction, BatchErrorHandling batchErrorHandling) : jobName_(jobName), startTime_(startTime), @@ -39,20 +40,20 @@ BatchStatusHandler::BatchStatusHandler(bool showProgress, batchErrorHandling_(batchErrorHandling) { //set *after* initializer list => callbacks during construction to getErrorStats()! - progressDlg_ = SyncProgressDialog::create(dims, [this] { userRequestAbort(); }, *this, nullptr /*parentWindow*/, showProgress, autoCloseDialog, + progressDlg_ = SyncProgressDialog::create(dims, [this] { userRequestCancel(); }, *this, nullptr /*parentWindow*/, showProgress, autoCloseDialog, {jobName}, std::chrono::system_clock::to_time_t(startTime), ignoreErrors, autoRetryCount, [&] { - switch (postSyncAction) + switch (postBatchAction) { - case PostSyncAction::none: - return PostSyncAction2::none; - case PostSyncAction::sleep: - return PostSyncAction2::sleep; - case PostSyncAction::shutdown: - return PostSyncAction2::shutdown; + case PostBatchAction::none: + return PostSyncAction::none; + case PostBatchAction::sleep: + return PostSyncAction::sleep; + case PostBatchAction::shutdown: + return PostSyncAction::shutdown; } assert(false); - return PostSyncAction2::none; + return PostSyncAction::none; }()); //ATTENTION: "progressDlg_" is an unmanaged resource!!! However, at this point we already consider construction complete! => //ZEN_ON_SCOPE_FAIL( cleanup(); ); //destructor call would lead to member double clean-up!!! @@ -61,130 +62,117 @@ BatchStatusHandler::BatchStatusHandler(bool showProgress, BatchStatusHandler::~BatchStatusHandler() { - if (progressDlg_) //reportResults() was not called! + if (progressDlg_) //prepareResult() was not called! std::abort(); } -BatchStatusHandler::Result BatchStatusHandler::reportResults(const Zstring& postSyncCommand, PostSyncCondition postSyncCondition, - const AbstractPath& logFolderPath, int logfilesMaxAgeDays, LogFileFormat logFormat, - const std::set<AbstractPath>& logFilePathsToKeep, - const std::string& emailNotifyAddress, ResultsNotification emailNotifyCondition) //noexcept!! +BatchStatusHandler::Result BatchStatusHandler::prepareResult() { //keep correct summary window stats considering count down timer, system sleep const std::chrono::milliseconds totalTime = progressDlg_->pauseAndGetTotalTime(); + //append "extra" log for sync errors that could not otherwise be reported: + if (const ErrorLog extraLog = fetchExtraLog(); + !extraLog.empty()) + { + append(errorLog_.ref(), extraLog); + std::stable_sort(errorLog_.ref().begin(), errorLog_.ref().end(), [](const LogEntry& lhs, const LogEntry& rhs) { return lhs.time < rhs.time; }); + } + //determine post-sync status irrespective of further errors during tear-down - const SyncResult syncResult = [&] + assert(!syncResult_); + syncResult_ = [&] { - if (getAbortStatus()) + if (taskCancelled()) { - logMsg(errorLog_.ref(), _("Stopped"), MSG_TYPE_ERROR); //= user cancel - return SyncResult::aborted; + logMsg(errorLog_.ref(), _("Stopped"), MSG_TYPE_ERROR); //= user cancel or "stop on first error" + return TaskResult::cancelled; } const ErrorLogStats logCount = getStats(errorLog_.ref()); if (logCount.error > 0) - return SyncResult::finishedError; + return TaskResult::error; else if (logCount.warning > 0) - return SyncResult::finishedWarning; + return TaskResult::warning; if (getTotalStats() == ProgressStats()) logMsg(errorLog_.ref(), _("Nothing to synchronize"), MSG_TYPE_INFO); - return SyncResult::finishedSuccess; + return TaskResult::success; }(); - assert(syncResult == SyncResult::aborted || currentPhase() == ProcessPhase::synchronizing); + assert(*syncResult_ == TaskResult::cancelled || currentPhase() == ProcessPhase::sync); const ProcessSummary summary { - startTime_, syncResult, {jobName_}, + startTime_, *syncResult_, {jobName_}, getCurrentStats(), getTotalStats (), totalTime }; - AbstractPath logFilePath = AFS::appendRelPath(logFolderPath, generateLogFileName(logFormat, summary)); - //e.g. %AppData%\FreeFileSync\Logs\Backup FreeFileSync 2013-09-15 015052.123 [Error].log + return {summary, errorLog_}; +} - auto notifyStatusNoThrow = [&](std::wstring&& msg) { try { updateStatus(std::move(msg)); /*throw AbortProcess*/ } catch (AbortProcess&) {} }; +BatchStatusHandler::DlgOptions BatchStatusHandler::showResult() +{ bool autoClose = false; - FinalRequest finalRequest = FinalRequest::none; bool suspend = false; + FinalRequest finalRequest = FinalRequest::none; - if (getAbortStatus() && *getAbortStatus() == AbortTrigger::user) - ; /* user cancelled => don't run post sync command - => don't send email notification - => don't run post sync action - => don't play sound notification */ + if (taskCancelled() && *taskCancelled() == CancelReason::user) + { + /* user cancelled => don't run post sync command + => don't send email notification + => don't play sound notification + => don't run post sync action */ + if (switchToGuiRequested_) //-> avoid recursive yield() calls, thous switch not before ending batch mode + { + autoClose = true; + finalRequest = FinalRequest::switchGui; + } + } else { - //--------------------- post sync command ---------------------- - if (const Zstring cmdLine = trimCpy(postSyncCommand); - !cmdLine.empty()) - if (postSyncCondition == PostSyncCondition::completion || - (postSyncCondition == PostSyncCondition::errors) == (syncResult == SyncResult::aborted || - syncResult == SyncResult::finishedError)) - ////---------------------------------------------------------------------- - //::wxSetEnv(L"logfile_path", AFS::getDisplayPath(logFilePath)); - ////---------------------------------------------------------------------- - runCommandAndLogErrors(expandMacros(cmdLine), errorLog_.ref()); - - //--------------------- email notification ---------------------- - if (const std::string notifyEmail = trimCpy(emailNotifyAddress); - !notifyEmail.empty()) - if (emailNotifyCondition == ResultsNotification::always || - (emailNotifyCondition == ResultsNotification::errorWarning && (syncResult == SyncResult::aborted || - syncResult == SyncResult::finishedError || - syncResult == SyncResult::finishedWarning)) || - (emailNotifyCondition == ResultsNotification::errorOnly && (syncResult == SyncResult::aborted || - syncResult == SyncResult::finishedError))) - try - { - logMsg(errorLog_.ref(), replaceCpy(_("Sending email notification to %x"), L"%x", utfTo<std::wstring>(notifyEmail)), MSG_TYPE_INFO); - sendLogAsEmail(notifyEmail, summary, errorLog_.ref(), logFilePath, notifyStatusNoThrow); //throw FileError - } - catch (const FileError& e) { logMsg(errorLog_.ref(), e.toString(), MSG_TYPE_ERROR); } - //--------------------- post sync actions ---------------------- auto proceedWithShutdown = [&](const std::wstring& operationName) { if (progressDlg_->getWindowIfVisible()) try { - assert(!zen::endsWith(operationName, L".")); + assert(!endsWith(operationName, L".")); auto notifyStatusThrowOnCancel = [&](const std::wstring& timeRemMsg) { - try { updateStatus(operationName + L"... " + timeRemMsg); /*throw AbortProcess*/ } - catch (AbortProcess&) + try { updateStatus(operationName + L"... " + timeRemMsg); /*throw CancelProcess*/ } + catch (CancelProcess&) { - if (getAbortStatus() && *getAbortStatus() == AbortTrigger::user) + if (taskCancelled() && *taskCancelled() == CancelReason::user) throw; } }; - delayAndCountDown(std::chrono::steady_clock::now() + std::chrono::seconds(10), notifyStatusThrowOnCancel); //throw AbortProcess + delayAndCountDown(std::chrono::steady_clock::now() + std::chrono::seconds(10), notifyStatusThrowOnCancel); //throw CancelProcess } - catch (AbortProcess&) { return false; } + catch (CancelProcess&) { return false; } return true; }; switch (progressDlg_->getOptionPostSyncAction()) { - case PostSyncAction2::none: + case PostSyncAction::none: autoClose = progressDlg_->getOptionAutoCloseDialog(); break; - case PostSyncAction2::exit: + case PostSyncAction::exit: assert(false); break; - case PostSyncAction2::sleep: + case PostSyncAction::sleep: if (proceedWithShutdown(_("System: Sleep"))) { autoClose = progressDlg_->getOptionAutoCloseDialog(); suspend = true; } break; - case PostSyncAction2::shutdown: + case PostSyncAction::shutdown: if (proceedWithShutdown(_("System: Shut down"))) { autoClose = true; @@ -192,42 +180,8 @@ BatchStatusHandler::Result BatchStatusHandler::reportResults(const Zstring& post } break; } - - //--------------------- sound notification ---------------------- - if (!autoClose) //only play when showing results dialog - if (!soundFileSyncComplete_.empty()) - { - //wxWidgets shows modal error dialog by default => "no, wxWidgets, NO!" - wxLog* oldLogTarget = wxLog::SetActiveTarget(new wxLogStderr); //transfer and receive ownership! - ZEN_ON_SCOPE_EXIT(delete wxLog::SetActiveTarget(oldLogTarget)); - - wxSound::Play(utfTo<wxString>(soundFileSyncComplete_), wxSOUND_ASYNC); - } - //if (::GetForegroundWindow() != GetHWND()) - // RequestUserAttention(); -> probably too much since task bar is already colorized with Taskbar::STATUS_ERROR or STATUS_NORMAL } - //--------------------- save log file ---------------------- - try //create not before destruction: 1. avoid issues with FFS trying to sync open log file 2. include status in log file name without extra rename - { - //do NOT use tryReportingError()! saving log files should not be cancellable! - saveLogFile(logFilePath, summary, errorLog_.ref(), logfilesMaxAgeDays, logFormat, logFilePathsToKeep, notifyStatusNoThrow); //throw FileError - } - catch (const FileError& e) - { - logMsg(errorLog_.ref(), e.toString(), MSG_TYPE_ERROR); - - const AbstractPath logFileDefaultPath = AFS::appendRelPath(createAbstractPath(getLogFolderDefaultPath()), generateLogFileName(logFormat, summary)); - if (logFilePath != logFileDefaultPath) //fallback: log file *must* be saved no matter what! - try - { - logFilePath = logFileDefaultPath; - saveLogFile(logFileDefaultPath, summary, errorLog_.ref(), logfilesMaxAgeDays, logFormat, logFilePathsToKeep, notifyStatusNoThrow); //throw FileError - } - catch (const FileError& e2) { logMsg(errorLog_.ref(), e2.toString(), MSG_TYPE_ERROR); } - } - //---------------------------------------------------------- - if (suspend) //...*before* results dialog is shown try { @@ -235,19 +189,28 @@ BatchStatusHandler::Result BatchStatusHandler::reportResults(const Zstring& post } catch (const FileError& e) { logMsg(errorLog_.ref(), e.toString(), MSG_TYPE_ERROR); } - if (switchToGuiRequested_) //-> avoid recursive yield() calls, thous switch not before ending batch mode + //--------------------- sound notification ---------------------- + if (taskCancelled() && *taskCancelled() == CancelReason::user) + ; + else if (!suspend && !autoClose && //only play when actually showing results dialog + !soundFileSyncComplete_.empty()) { - autoClose = true; - finalRequest = FinalRequest::switchGui; + //wxWidgets shows modal error dialog by default => "no, wxWidgets, NO!" + wxLog* oldLogTarget = wxLog::SetActiveTarget(new wxLogStderr); //transfer and receive ownership! + ZEN_ON_SCOPE_EXIT(delete wxLog::SetActiveTarget(oldLogTarget)); + + wxSound::Play(utfTo<wxString>(soundFileSyncComplete_), wxSOUND_ASYNC); } + //if (::GetForegroundWindow() != GetHWND()) + // RequestUserAttention(); -> probably too much since task bar is already colorized with Taskbar::Status::error or Status::normal - const auto [autoCloseDialog, dims] = progressDlg_->destroy(autoClose, - true /*restoreParentFrame: n/a here*/, - syncResult, errorLog_); + const auto [autoCloseDialog, dim] = progressDlg_->destroy(autoClose, + true /*restoreParentFrame: n/a here*/, + *syncResult_, errorLog_); //caveat: calls back to getErrorStats() => share errorLog_ progressDlg_ = nullptr; - return {summary, getStats(errorLog_.ref()), finalRequest, logFilePath, dims}; + return {dim, finalRequest}; } @@ -263,7 +226,7 @@ void BatchStatusHandler::initNewPhase(int itemsTotal, int64_t bytesTotal, Proces progressDlg_->initNewPhase(); //call after "StatusHandler::initNewPhase" //macOS needs a full yield to update GUI and get rid of "dummy" texts - requestUiUpdate(true /*force*/); //throw AbortProcess + requestUiUpdate(true /*force*/); //throw CancelProcess } @@ -292,7 +255,7 @@ void BatchStatusHandler::logMessage(const std::wstring& msg, MsgType type) assert(false); return MSG_TYPE_ERROR; }()); - requestUiUpdate(false /*force*/); //throw AbortProcess + requestUiUpdate(false /*force*/); //throw CancelProcess } @@ -326,17 +289,17 @@ void BatchStatusHandler::reportWarning(const std::wstring& msg, bool& warningAct case QuestionButton2::no: //switch logMsg(errorLog_.ref(), _("Switching to FreeFileSync's main window"), MSG_TYPE_INFO); switchToGuiRequested_ = true; //treat as a special kind of cancel - abortProcessNow(AbortTrigger::user); //throw AbortProcess + cancelProcessNow(CancelReason::user); //throw CancelProcess case QuestionButton2::cancel: - abortProcessNow(AbortTrigger::user); //throw AbortProcess + cancelProcessNow(CancelReason::user); //throw CancelProcess break; } } break; //keep it! last switch might not find match case BatchErrorHandling::cancel: - abortProcessNow(AbortTrigger::program); //throw AbortProcess + cancelProcessNow(CancelReason::firstError); //throw CancelProcess break; } } @@ -357,7 +320,7 @@ ProcessCallback::Response BatchStatusHandler::reportError(const ErrorInfo& error [&, statusPrefix = _("Automatic retry") + (errorInfo.retryNumber == 0 ? L"" : L' ' + formatNumber(errorInfo.retryNumber + 1)) + SPACED_DASH, statusPostfix = SPACED_DASH + _("Error") + L": " + replaceCpy(errorInfo.msg, L'\n', L' ')](const std::wstring& timeRemMsg) - { this->updateStatus(statusPrefix + timeRemMsg + statusPostfix); }); //throw AbortProcess + { this->updateStatus(statusPrefix + timeRemMsg + statusPostfix); }); //throw CancelProcess return ProcessCallback::retry; } @@ -390,14 +353,14 @@ ProcessCallback::Response BatchStatusHandler::reportError(const ErrorInfo& error return ProcessCallback::retry; case ConfirmationButton3::cancel: - abortProcessNow(AbortTrigger::user); //throw AbortProcess + cancelProcessNow(CancelReason::user); //throw CancelProcess break; } } break; //used if last switch didn't find a match case BatchErrorHandling::cancel: - abortProcessNow(AbortTrigger::program); //throw AbortProcess + cancelProcessNow(CancelReason::firstError); //throw CancelProcess break; } } @@ -435,14 +398,14 @@ void BatchStatusHandler::reportFatalError(const std::wstring& msg) break; case ConfirmationButton2::cancel: - abortProcessNow(AbortTrigger::user); //throw AbortProcess + cancelProcessNow(CancelReason::user); //throw CancelProcess break; } } break; case BatchErrorHandling::cancel: - abortProcessNow(AbortTrigger::program); //throw AbortProcess + cancelProcessNow(CancelReason::firstError); //throw CancelProcess break; } } diff --git a/FreeFileSync/Source/ui/batch_status_handler.h b/FreeFileSync/Source/ui/batch_status_handler.h index 7bfafe04..4809850f 100644 --- a/FreeFileSync/Source/ui/batch_status_handler.h +++ b/FreeFileSync/Source/ui/batch_status_handler.h @@ -7,7 +7,7 @@ #ifndef BATCH_STATUS_HANDLER_H_857390451451234566 #define BATCH_STATUS_HANDLER_H_857390451451234566 -#include <chrono> +//#include <chrono> #include <zen/error_log.h> #include "progress_indicator.h" #include "../config.h" @@ -31,13 +31,13 @@ public: const Zstring& soundFileAlertPending, const zen::WindowLayout::Dimensions& dim, bool autoCloseDialog, - PostSyncAction postSyncAction, + PostBatchAction postBatchAction, BatchErrorHandling batchErrorHandling); //noexcept!! ~BatchStatusHandler(); void initNewPhase (int itemsTotal, int64_t bytesTotal, ProcessPhase phaseID) override; // void logMessage (const std::wstring& msg, MsgType type) override; // - void reportWarning (const std::wstring& msg, bool& warningActive) override; //throw AbortProcess + void reportWarning (const std::wstring& msg, bool& warningActive) override; //throw CancelProcess Response reportError (const ErrorInfo& errorInfo) override; // void reportFatalError(const std::wstring& msg) override; // ErrorStats getErrorStats() const override; @@ -45,23 +45,25 @@ public: void updateDataProcessed(int itemsDelta, int64_t bytesDelta) override; //noexcept void forceUiUpdateNoThrow() override; // + struct Result + { + ProcessSummary summary; + zen::SharedRef<zen::ErrorLog> errorLog; + }; + Result prepareResult(); + enum class FinalRequest { none, switchGui, shutdown }; - struct Result + struct DlgOptions { - ProcessSummary summary; - zen::ErrorLogStats logStats; + zen::WindowLayout::Dimensions dim; FinalRequest finalRequest; - AbstractPath logFilePath; - zen::WindowLayout::Dimensions dlgDim; }; - Result reportResults(const Zstring& postSyncCommand, PostSyncCondition postSyncCondition, - const AbstractPath& logFolderPath, int logfilesMaxAgeDays, LogFileFormat logFormat, const std::set<AbstractPath>& logFilePathsToKeep, - const std::string& emailNotifyAddress, ResultsNotification emailNotifyCondition); //noexcept!! + DlgOptions showResult(); wxWindow* getWindowIfVisible(); @@ -79,6 +81,7 @@ private: mutable size_t errorStatsRowsChecked_ = 0; const BatchErrorHandling batchErrorHandling_; bool switchToGuiRequested_ = false; + std::optional<TaskResult> syncResult_; }; } diff --git a/FreeFileSync/Source/ui/cfg_grid.cpp b/FreeFileSync/Source/ui/cfg_grid.cpp index f7a3183a..859c4044 100644 --- a/FreeFileSync/Source/ui/cfg_grid.cpp +++ b/FreeFileSync/Source/ui/cfg_grid.cpp @@ -186,7 +186,7 @@ void ConfigView::setLastInSyncTime(const std::vector<Zstring>& filePaths, time_t auto it = cfgList_.find(filePath); assert(it != cfgList_.end()); if (it != cfgList_.end()) - it->second.cfgItem.lastRunStats.syncTime = lastRunTime; + it->second.cfgItem.lastRunStats.startTime = lastRunTime; } if (sortColumn_ != ColumnTypeCfg::name) @@ -258,8 +258,8 @@ void ConfigView::sortListViewImpl() return lhs->second.isLastRunCfg < rhs->second.isLastRunCfg; //"last session" label should be (always) last return makeSortDirection(std::greater(), std::bool_constant<ascending>())( - lhs->second.cfgItem.lastRunStats.syncTime, - rhs->second.cfgItem.lastRunStats.syncTime); + lhs->second.cfgItem.lastRunStats.startTime, + rhs->second.cfgItem.lastRunStats.startTime); //[!] ascending lastSync shows lowest "days past" first <=> highest lastSyncTime first }; @@ -268,8 +268,8 @@ void ConfigView::sortListViewImpl() if (lhs->second.isLastRunCfg != rhs->second.isLastRunCfg) return lhs->second.isLastRunCfg < rhs->second.isLastRunCfg; //"last session" label should be (always) last - const bool wasRunL = lhs->second.cfgItem.lastRunStats.syncTime != 0; - const bool wasRunR = rhs->second.cfgItem.lastRunStats.syncTime != 0; + const bool wasRunL = lhs->second.cfgItem.lastRunStats.startTime != 0; + const bool wasRunR = rhs->second.cfgItem.lastRunStats.startTime != 0; if (wasRunL != wasRunR) return wasRunL > wasRunR; //move sync jobs that were never run to the back @@ -337,7 +337,7 @@ public: static int getRowDefaultHeight(const Grid& grid) { - return std::max(getDefaultMenuIconSize(), grid.getMainWin().GetCharHeight()) + fastFromDIP(1); //+ some space + return std::max(getDefaultMenuIconSize(), grid.getMainWin().GetCharHeight()) + fastFromDIP(1) /*extra space*/; } int getSyncOverdueDays() const { return syncOverdueDays_; } @@ -376,21 +376,21 @@ private: case ColumnTypeCfg::lastSync: if (!item->isLastRunCfg) { - if (item->cfgItem.lastRunStats.syncTime == 0) + if (item->cfgItem.lastRunStats.startTime == 0) return std::wstring(1, EN_DASH); - //return utfTo<std::wstring>(formatTime(formatDateTimeTag, getLocalTime(item->cfgItem.lastRunStats.syncTime))); + //return utfTo<std::wstring>(formatTime(formatDateTimeTag, getLocalTime(item->cfgItem.lastRunStats.startTime))); - const int daysPast = getDaysPast(item->cfgItem.lastRunStats.syncTime); + const int daysPast = getDaysPast(item->cfgItem.lastRunStats.startTime); return daysPast == 0 ? - utfTo<std::wstring>(formatTime(Zstr("%R") /*equivalent to "%H:%M"*/, getLocalTime(item->cfgItem.lastRunStats.syncTime))) : + utfTo<std::wstring>(formatTime(Zstr("%R") /*equivalent to "%H:%M"*/, getLocalTime(item->cfgItem.lastRunStats.startTime))) : //_("Today") : _P("1 day", "%x days", daysPast); } break; case ColumnTypeCfg::lastLog: - if (!item->isLastRunCfg && item->cfgItem.lastRunStats.syncTime != 0) + if (!item->isLastRunCfg && item->cfgItem.lastRunStats.startTime != 0) return getSyncResultLabel(item->cfgItem.lastRunStats.syncResult); break; } @@ -498,7 +498,7 @@ private: { wxDCTextColourChanger textColor2(dc); if (syncOverdueDays_ > 0) - if (getDaysPast(item->cfgItem.lastRunStats.syncTime) >= syncOverdueDays_) + if (getDaysPast(item->cfgItem.lastRunStats.startTime) >= syncOverdueDays_) textColor2.Set(*wxRED); drawCellText(dc, rect, getValue(row, colType), wxALIGN_CENTER); @@ -506,18 +506,18 @@ private: break; case ColumnTypeCfg::lastLog: - if (!item->isLastRunCfg && item->cfgItem.lastRunStats.syncTime != 0) + if (!item->isLastRunCfg && item->cfgItem.lastRunStats.startTime != 0) { const wxImage statusIcon = [&] { switch (item->cfgItem.lastRunStats.syncResult) { - case SyncResult::finishedSuccess: + case TaskResult::success: return loadImage("msg_success", getDefaultMenuIconSize()); - case SyncResult::finishedWarning: + case TaskResult::warning: return loadImage("msg_warning", getDefaultMenuIconSize()); - case SyncResult::finishedError: - case SyncResult::aborted: + case TaskResult::error: + case TaskResult::cancelled: return loadImage("msg_error", getDefaultMenuIconSize()); } assert(false); @@ -654,7 +654,7 @@ private: break; case ColumnTypeCfg::lastLog: - if (!item->isLastRunCfg && item->cfgItem.lastRunStats.syncTime != 0) + if (!item->isLastRunCfg && item->cfgItem.lastRunStats.startTime != 0) { std::wstring tooltip = getSyncResultLabel(item->cfgItem.lastRunStats.syncResult) + L"\n"; diff --git a/FreeFileSync/Source/ui/cfg_grid.h b/FreeFileSync/Source/ui/cfg_grid.h index c9598f3c..97589a56 100644 --- a/FreeFileSync/Source/ui/cfg_grid.h +++ b/FreeFileSync/Source/ui/cfg_grid.h @@ -19,8 +19,8 @@ namespace fff struct LastRunStats { AbstractPath logFilePath = getNullPath(); //optional - time_t syncTime = 0; - SyncResult syncResult = SyncResult::aborted; + time_t startTime = 0; + TaskResult syncResult = TaskResult::cancelled; int itemsProcessed = 0; int64_t bytesProcessed = 0; std::chrono::milliseconds totalTime{}; diff --git a/FreeFileSync/Source/ui/file_grid.cpp b/FreeFileSync/Source/ui/file_grid.cpp index d4805e8a..ebadc892 100644 --- a/FreeFileSync/Source/ui/file_grid.cpp +++ b/FreeFileSync/Source/ui/file_grid.cpp @@ -986,7 +986,7 @@ private: rectGroupItems.width -= 2 * gapSize_; wxDCPenChanger dummy(dc, wxPen(getColorGridLine(), fastFromDIP(1))); - dc.DrawLine(rectGroupItems.GetTopLeft(), rectGroupItems.GetBottomLeft() + wxPoint(0, 1)); //draws half-open range! + dc.DrawLine(rectGroupItems.GetTopLeft(), rectGroupItems.GetBottomLeft() + wxPoint(0, 1)); //doesn't draw last pixel! rectGroupItems.x += fastFromDIP(1); rectGroupItems.width -= fastFromDIP(1); @@ -1722,13 +1722,13 @@ public: gridR_.Bind(EVENT_GRID_MOUSE_LEFT_DOWN, [this](GridClickEvent& event) { onGridClickRim(event, gridR_); }); //clear selection of other grid when selecting on + gridL_.Bind(EVENT_GRID_MOUSE_LEFT_DOWN, [this]( GridClickEvent& event) { onGridLeftClick(event, gridR_); }); //clear immediately, + gridL_.Bind(EVENT_GRID_MOUSE_RIGHT_DOWN, [this]( GridClickEvent& event) { onGridRightClick(event, gridR_, gridL_); }); //don't wait for GridSelectEvent gridL_.Bind(EVENT_GRID_SELECT_RANGE, [this](GridSelectEvent& event) { onGridSelection(event, gridR_); }); - gridL_.Bind(EVENT_GRID_MOUSE_LEFT_DOWN, [this]( GridClickEvent& event) { onGridSelection(event, gridR_); }); //clear immediately, - gridL_.Bind(EVENT_GRID_MOUSE_RIGHT_DOWN, [this]( GridClickEvent& event) { onGridSelection(event, gridR_); }); //don't wait for GridSelectEvent + gridR_.Bind(EVENT_GRID_MOUSE_LEFT_DOWN, [this]( GridClickEvent& event) { onGridLeftClick(event, gridL_); }); + gridR_.Bind(EVENT_GRID_MOUSE_RIGHT_DOWN, [this]( GridClickEvent& event) { onGridRightClick(event, gridL_, gridR_); }); gridR_.Bind(EVENT_GRID_SELECT_RANGE, [this](GridSelectEvent& event) { onGridSelection(event, gridL_); }); - gridR_.Bind(EVENT_GRID_MOUSE_LEFT_DOWN, [this]( GridClickEvent& event) { onGridSelection(event, gridL_); }); - gridR_.Bind(EVENT_GRID_MOUSE_RIGHT_DOWN, [this]( GridClickEvent& event) { onGridSelection(event, gridL_); }); //parallel grid scrolling: do NOT use DoPrepareDC() to align grids! GDI resource leak! Use regular paint event instead: gridL_.getMainWin().Bind(wxEVT_PAINT, [this](wxPaintEvent& event) { onPaintGrid(gridL_); event.Skip(); }); @@ -1828,9 +1828,28 @@ private: event.Skip(); } - void onGridSelection(wxEvent& event, Grid& gridOther) + void onGridLeftClick(GridClickEvent& event, Grid& gridOther) { - if (!wxGetKeyState(WXK_CONTROL)) //clear other grid unless user is holding CTRL + //see grid.cpp Grid::MainWin::onMouseDown(): + if (!wxGetKeyState(WXK_CONTROL) && !wxGetKeyState(WXK_SHIFT)) //clear other grid unless user is holding CTRL, or SHIFT + gridOther.clearSelection(GridEventPolicy::deny); //don't emit event, prevent recursion! + event.Skip(); + } + + void onGridRightClick(GridClickEvent& event, Grid& gridOther, Grid& gridThis) + { + const std::vector<size_t>& selectedRows = gridThis.getSelectedRows(); + const bool rowSelected = std::find(selectedRows.begin(), selectedRows.end(), makeUnsigned(event.row_)) != selectedRows.end(); + + //clear other grid unless GridContextMenuEvent is about to happen, or user is holding CTRL, or SHIFT + if (!rowSelected && !wxGetKeyState(WXK_CONTROL) && !wxGetKeyState(WXK_SHIFT)) + gridOther.clearSelection(GridEventPolicy::deny); //don't emit event, prevent recursion! + event.Skip(); + } + + void onGridSelection(GridSelectEvent& event, Grid& gridOther) + { + if (!event.mouseClick_ && !wxGetKeyState(WXK_SHIFT)) //clear other grid during keyboard selection, unless user is holding SHIFT gridOther.clearSelection(GridEventPolicy::deny); //don't emit event, prevent recursion! event.Skip(); } diff --git a/FreeFileSync/Source/ui/gui_generated.cpp b/FreeFileSync/Source/ui/gui_generated.cpp index e22fc4a2..02d078e2 100644 --- a/FreeFileSync/Source/ui/gui_generated.cpp +++ b/FreeFileSync/Source/ui/gui_generated.cpp @@ -11,1189 +11,1189 @@ 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 ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - m_menubar = new wxMenuBar( 0 ); - m_menuFile = new wxMenu(); - m_menuItemNew = new wxMenuItem( m_menuFile, wxID_NEW, wxString( _("&New") ) + wxT('\t') + wxT("Ctrl+N"), wxEmptyString, wxITEM_NORMAL ); - m_menuFile->Append( m_menuItemNew ); + m_menubar = new wxMenuBar( 0 ); + m_menuFile = new wxMenu(); + m_menuItemNew = new wxMenuItem( m_menuFile, wxID_NEW, wxString( _("&New") ) + wxT('\t') + wxT("Ctrl+N"), wxEmptyString, wxITEM_NORMAL ); + m_menuFile->Append( m_menuItemNew ); - m_menuItemLoad = new wxMenuItem( m_menuFile, wxID_OPEN, wxString( _("&Open...") ) + wxT('\t') + wxT("Ctrl+O"), wxEmptyString, wxITEM_NORMAL ); - m_menuFile->Append( m_menuItemLoad ); + m_menuItemLoad = new wxMenuItem( m_menuFile, wxID_OPEN, wxString( _("&Open...") ) + wxT('\t') + wxT("Ctrl+O"), wxEmptyString, wxITEM_NORMAL ); + m_menuFile->Append( m_menuItemLoad ); - m_menuFile->AppendSeparator(); + m_menuFile->AppendSeparator(); - m_menuItemSave = new wxMenuItem( m_menuFile, wxID_SAVE, wxString( _("&Save") ) + wxT('\t') + wxT("Ctrl+S"), wxEmptyString, wxITEM_NORMAL ); - m_menuFile->Append( m_menuItemSave ); + m_menuItemSave = new wxMenuItem( m_menuFile, wxID_SAVE, wxString( _("&Save") ) + wxT('\t') + wxT("Ctrl+S"), wxEmptyString, wxITEM_NORMAL ); + m_menuFile->Append( m_menuItemSave ); - m_menuItemSaveAs = new wxMenuItem( m_menuFile, wxID_SAVEAS, wxString( _("Save &as...") ), wxEmptyString, wxITEM_NORMAL ); - m_menuFile->Append( m_menuItemSaveAs ); + m_menuItemSaveAs = new wxMenuItem( m_menuFile, wxID_SAVEAS, wxString( _("Save &as...") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuFile->Append( m_menuItemSaveAs ); - m_menuItemSaveAsBatch = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("Save as &batch job...") ), wxEmptyString, wxITEM_NORMAL ); - m_menuFile->Append( m_menuItemSaveAsBatch ); + m_menuItemSaveAsBatch = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("Save as &batch job...") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuFile->Append( m_menuItemSaveAsBatch ); - m_menuFile->AppendSeparator(); + m_menuFile->AppendSeparator(); - m_menuItemQuit = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("E&xit") ), wxEmptyString, wxITEM_NORMAL ); - m_menuFile->Append( m_menuItemQuit ); + m_menuItemQuit = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("E&xit") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuFile->Append( m_menuItemQuit ); - m_menubar->Append( m_menuFile, _("&File") ); + m_menubar->Append( m_menuFile, _("&File") ); - m_menuActions = new wxMenu(); - m_menuItemShowLog = new wxMenuItem( m_menuActions, wxID_ANY, wxString( _("Show &log") ) + wxT('\t') + wxT("F4"), wxEmptyString, wxITEM_NORMAL ); - m_menuActions->Append( m_menuItemShowLog ); + m_menuActions = new wxMenu(); + m_menuItemShowLog = new wxMenuItem( m_menuActions, wxID_ANY, wxString( _("Show &log") ) + wxT('\t') + wxT("F4"), wxEmptyString, wxITEM_NORMAL ); + m_menuActions->Append( m_menuItemShowLog ); - m_menuActions->AppendSeparator(); + m_menuActions->AppendSeparator(); - m_menuItemCompare = new wxMenuItem( m_menuActions, wxID_ANY, wxString( _("Start &comparison") ) + wxT('\t') + wxT("F5"), wxEmptyString, wxITEM_NORMAL ); - m_menuActions->Append( m_menuItemCompare ); + m_menuItemCompare = new wxMenuItem( m_menuActions, wxID_ANY, wxString( _("Start &comparison") ) + wxT('\t') + wxT("F5"), wxEmptyString, wxITEM_NORMAL ); + m_menuActions->Append( m_menuItemCompare ); - m_menuActions->AppendSeparator(); + m_menuActions->AppendSeparator(); - m_menuItemCompSettings = new wxMenuItem( m_menuActions, wxID_ANY, wxString( _("C&omparison settings") ) + wxT('\t') + wxT("F6"), wxEmptyString, wxITEM_NORMAL ); - m_menuActions->Append( m_menuItemCompSettings ); + m_menuItemCompSettings = new wxMenuItem( m_menuActions, wxID_ANY, wxString( _("C&omparison settings") ) + wxT('\t') + wxT("F6"), wxEmptyString, wxITEM_NORMAL ); + m_menuActions->Append( m_menuItemCompSettings ); - m_menuItemFilter = new wxMenuItem( m_menuActions, wxID_ANY, wxString( _("&Filter settings") ) + wxT('\t') + wxT("F7"), wxEmptyString, wxITEM_NORMAL ); - m_menuActions->Append( m_menuItemFilter ); + m_menuItemFilter = new wxMenuItem( m_menuActions, wxID_ANY, wxString( _("&Filter settings") ) + wxT('\t') + wxT("F7"), wxEmptyString, wxITEM_NORMAL ); + m_menuActions->Append( m_menuItemFilter ); - m_menuItemSyncSettings = new wxMenuItem( m_menuActions, wxID_ANY, wxString( _("S&ynchronization settings") ) + wxT('\t') + wxT("F8"), wxEmptyString, wxITEM_NORMAL ); - m_menuActions->Append( m_menuItemSyncSettings ); + m_menuItemSyncSettings = new wxMenuItem( m_menuActions, wxID_ANY, wxString( _("S&ynchronization settings") ) + wxT('\t') + wxT("F8"), wxEmptyString, wxITEM_NORMAL ); + m_menuActions->Append( m_menuItemSyncSettings ); - m_menuActions->AppendSeparator(); + m_menuActions->AppendSeparator(); - m_menuItemSynchronize = new wxMenuItem( m_menuActions, wxID_ANY, wxString( _("Start &synchronization") ) + wxT('\t') + wxT("F9"), wxEmptyString, wxITEM_NORMAL ); - m_menuActions->Append( m_menuItemSynchronize ); + m_menuItemSynchronize = new wxMenuItem( m_menuActions, wxID_ANY, wxString( _("Start &synchronization") ) + wxT('\t') + wxT("F9"), wxEmptyString, wxITEM_NORMAL ); + m_menuActions->Append( m_menuItemSynchronize ); - m_menubar->Append( m_menuActions, _("&Actions") ); + m_menubar->Append( m_menuActions, _("&Actions") ); - m_menuTools = new wxMenu(); - m_menuItemOptions = new wxMenuItem( m_menuTools, wxID_PREFERENCES, wxString( _("&Preferences") ) + wxT('\t') + wxT("Ctrl+,"), wxEmptyString, wxITEM_NORMAL ); - m_menuTools->Append( m_menuItemOptions ); + m_menuTools = new wxMenu(); + m_menuItemOptions = new wxMenuItem( m_menuTools, wxID_PREFERENCES, wxString( _("&Preferences") ) + wxT('\t') + wxT("Ctrl+,"), wxEmptyString, wxITEM_NORMAL ); + m_menuTools->Append( m_menuItemOptions ); - m_menuLanguages = new wxMenu(); - wxMenuItem* m_menuLanguagesItem = new wxMenuItem( m_menuTools, wxID_ANY, _("&Language"), wxEmptyString, wxITEM_NORMAL, m_menuLanguages ); - m_menuTools->Append( m_menuLanguagesItem ); + m_menuLanguages = new wxMenu(); + wxMenuItem* m_menuLanguagesItem = new wxMenuItem( m_menuTools, wxID_ANY, _("&Language"), wxEmptyString, wxITEM_NORMAL, m_menuLanguages ); + m_menuTools->Append( m_menuLanguagesItem ); - m_menuTools->AppendSeparator(); + m_menuTools->AppendSeparator(); - m_menuItemFind = new wxMenuItem( m_menuTools, wxID_FIND, wxString( _("&Find...") ) + wxT('\t') + wxT("Ctrl+F"), wxEmptyString, wxITEM_NORMAL ); - m_menuTools->Append( m_menuItemFind ); + m_menuItemFind = new wxMenuItem( m_menuTools, wxID_FIND, wxString( _("&Find...") ) + wxT('\t') + wxT("Ctrl+F"), wxEmptyString, wxITEM_NORMAL ); + m_menuTools->Append( m_menuItemFind ); - m_menuItemExportList = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("&Export file list") ), wxEmptyString, wxITEM_NORMAL ); - m_menuTools->Append( m_menuItemExportList ); + m_menuItemExportList = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("&Export file list") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuTools->Append( m_menuItemExportList ); - m_menuTools->AppendSeparator(); + m_menuTools->AppendSeparator(); - m_menuItemResetLayout = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("&Reset layout") ), wxEmptyString, wxITEM_NORMAL ); - m_menuTools->Append( m_menuItemResetLayout ); + m_menuItemResetLayout = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("&Reset layout") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuTools->Append( m_menuItemResetLayout ); - m_menuItemShowMain = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("dummy") ), wxEmptyString, wxITEM_NORMAL ); - m_menuTools->Append( m_menuItemShowMain ); + m_menuItemShowMain = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("dummy") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuTools->Append( m_menuItemShowMain ); - m_menuItemShowFolders = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("dummy") ), wxEmptyString, wxITEM_NORMAL ); - m_menuTools->Append( m_menuItemShowFolders ); + m_menuItemShowFolders = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("dummy") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuTools->Append( m_menuItemShowFolders ); - m_menuItemShowViewFilter = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("dummy") ), wxEmptyString, wxITEM_NORMAL ); - m_menuTools->Append( m_menuItemShowViewFilter ); + m_menuItemShowViewFilter = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("dummy") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuTools->Append( m_menuItemShowViewFilter ); - m_menuItemShowConfig = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("dummy") ), wxEmptyString, wxITEM_NORMAL ); - m_menuTools->Append( m_menuItemShowConfig ); + m_menuItemShowConfig = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("dummy") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuTools->Append( m_menuItemShowConfig ); - m_menuItemShowOverview = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("dummy") ), wxEmptyString, wxITEM_NORMAL ); - m_menuTools->Append( m_menuItemShowOverview ); + m_menuItemShowOverview = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("dummy") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuTools->Append( m_menuItemShowOverview ); - m_menubar->Append( m_menuTools, _("&Tools") ); + m_menubar->Append( m_menuTools, _("&Tools") ); - m_menuHelp = new wxMenu(); - m_menuItemHelp = new wxMenuItem( m_menuHelp, wxID_HELP, wxString( _("&View help") ) + wxT('\t') + wxT("F1"), wxEmptyString, wxITEM_NORMAL ); - m_menuHelp->Append( m_menuItemHelp ); + m_menuHelp = new wxMenu(); + m_menuItemHelp = new wxMenuItem( m_menuHelp, wxID_HELP, wxString( _("&View help") ) + wxT('\t') + wxT("F1"), wxEmptyString, wxITEM_NORMAL ); + m_menuHelp->Append( m_menuItemHelp ); - m_menuHelp->AppendSeparator(); + m_menuHelp->AppendSeparator(); - m_menuItemCheckVersionNow = new wxMenuItem( m_menuHelp, wxID_ANY, wxString( _("&Check for updates now") ), wxEmptyString, wxITEM_NORMAL ); - m_menuHelp->Append( m_menuItemCheckVersionNow ); + m_menuItemCheckVersionNow = new wxMenuItem( m_menuHelp, wxID_ANY, wxString( _("&Check for updates now") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuHelp->Append( m_menuItemCheckVersionNow ); - m_menuItemCheckVersionAuto = new wxMenuItem( m_menuHelp, wxID_ANY, wxString( _("Check &automatically once a week") ), wxEmptyString, wxITEM_CHECK ); - m_menuHelp->Append( m_menuItemCheckVersionAuto ); - m_menuItemCheckVersionAuto->Check( true ); + m_menuItemCheckVersionAuto = new wxMenuItem( m_menuHelp, wxID_ANY, wxString( _("Check &automatically once a week") ) , wxEmptyString, wxITEM_CHECK ); + m_menuHelp->Append( m_menuItemCheckVersionAuto ); + m_menuItemCheckVersionAuto->Check( true ); - m_menuHelp->AppendSeparator(); + m_menuHelp->AppendSeparator(); - m_menuItemAbout = new wxMenuItem( m_menuHelp, wxID_ABOUT, wxString( _("&About") ) + wxT('\t') + wxT("Shift+F1"), wxEmptyString, wxITEM_NORMAL ); - m_menuHelp->Append( m_menuItemAbout ); + m_menuItemAbout = new wxMenuItem( m_menuHelp, wxID_ABOUT, wxString( _("&About") ) + wxT('\t') + wxT("Shift+F1"), wxEmptyString, wxITEM_NORMAL ); + m_menuHelp->Append( m_menuItemAbout ); - m_menubar->Append( m_menuHelp, _("&Help") ); + m_menubar->Append( m_menuHelp, _("&Help") ); - this->SetMenuBar( m_menubar ); + this->SetMenuBar( m_menubar ); - bSizerPanelHolder = new wxBoxSizer( wxVERTICAL ); + bSizerPanelHolder = new wxBoxSizer( wxVERTICAL ); - m_panelTopButtons = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelTopButtons->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panelTopButtons = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelTopButtons->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer1791; - bSizer1791 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer1791; + bSizer1791 = new wxBoxSizer( wxHORIZONTAL ); - bSizerTopButtons = new wxBoxSizer( wxHORIZONTAL ); + bSizerTopButtons = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer261; - bSizer261 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer261; + bSizer261 = new wxBoxSizer( wxHORIZONTAL ); - bSizer261->Add( 0, 0, 1, 0, 5 ); + bSizer261->Add( 0, 0, 1, 0, 5 ); - m_buttonCancel = new wxButton( m_panelTopButtons, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_buttonCancel->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - m_buttonCancel->Enable( false ); - m_buttonCancel->Hide(); + m_buttonCancel = new wxButton( m_panelTopButtons, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonCancel->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonCancel->Enable( false ); + m_buttonCancel->Hide(); - bSizer261->Add( m_buttonCancel, 0, wxEXPAND, 5 ); + bSizer261->Add( m_buttonCancel, 0, wxEXPAND, 5 ); - m_buttonCompare = new zen::BitmapTextButton( m_panelTopButtons, wxID_ANY, _("Compare"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_buttonCompare->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - m_buttonCompare->SetToolTip( _("dummy") ); + m_buttonCompare = new zen::BitmapTextButton( m_panelTopButtons, wxID_ANY, _("Compare"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonCompare->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonCompare->SetToolTip( _("dummy") ); - bSizer261->Add( m_buttonCompare, 0, wxEXPAND, 5 ); + bSizer261->Add( m_buttonCompare, 0, wxEXPAND, 5 ); - bSizerTopButtons->Add( bSizer261, 1, wxEXPAND, 5 ); + bSizerTopButtons->Add( bSizer261, 1, wxEXPAND, 5 ); - bSizerTopButtons->Add( 8, 8, 0, 0, 5 ); + bSizerTopButtons->Add( 8, 8, 0, 0, 5 ); - wxBoxSizer* bSizer2942; - bSizer2942 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer2942; + bSizer2942 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonCmpConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonCmpConfig->SetToolTip( _("dummy") ); + m_bpButtonCmpConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonCmpConfig->SetToolTip( _("dummy") ); - bSizer2942->Add( m_bpButtonCmpConfig, 0, wxEXPAND, 5 ); + bSizer2942->Add( m_bpButtonCmpConfig, 0, wxEXPAND, 5 ); - m_bpButtonCmpContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizer2942->Add( m_bpButtonCmpContext, 0, wxEXPAND, 5 ); + m_bpButtonCmpContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizer2942->Add( m_bpButtonCmpContext, 0, wxEXPAND, 5 ); - bSizer2942->Add( 0, 0, 1, 0, 5 ); + bSizer2942->Add( 0, 0, 1, 0, 5 ); - bSizer2942->Add( 8, 0, 0, 0, 5 ); + bSizer2942->Add( 8, 0, 0, 0, 5 ); - m_bpButtonFilter = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0|wxFULL_REPAINT_ON_RESIZE ); - m_bpButtonFilter->SetToolTip( _("dummy") ); + m_bpButtonFilter = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0|wxFULL_REPAINT_ON_RESIZE ); + m_bpButtonFilter->SetToolTip( _("dummy") ); - bSizer2942->Add( m_bpButtonFilter, 0, wxEXPAND, 5 ); + bSizer2942->Add( m_bpButtonFilter, 0, wxEXPAND, 5 ); - m_bpButtonFilterContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizer2942->Add( m_bpButtonFilterContext, 0, wxEXPAND, 5 ); + m_bpButtonFilterContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizer2942->Add( m_bpButtonFilterContext, 0, wxEXPAND, 5 ); - bSizer2942->Add( 8, 0, 0, 0, 5 ); + bSizer2942->Add( 8, 0, 0, 0, 5 ); - bSizer2942->Add( 0, 0, 1, 0, 5 ); + bSizer2942->Add( 0, 0, 1, 0, 5 ); - m_bpButtonSyncConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonSyncConfig->SetToolTip( _("dummy") ); + m_bpButtonSyncConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonSyncConfig->SetToolTip( _("dummy") ); - bSizer2942->Add( m_bpButtonSyncConfig, 0, wxEXPAND, 5 ); + bSizer2942->Add( m_bpButtonSyncConfig, 0, wxEXPAND, 5 ); - m_bpButtonSyncContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizer2942->Add( m_bpButtonSyncContext, 0, wxEXPAND, 5 ); + m_bpButtonSyncContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizer2942->Add( m_bpButtonSyncContext, 0, wxEXPAND, 5 ); - bSizerTopButtons->Add( bSizer2942, 1, wxEXPAND, 5 ); + bSizerTopButtons->Add( bSizer2942, 1, wxEXPAND, 5 ); - bSizerTopButtons->Add( 8, 8, 0, 0, 5 ); + bSizerTopButtons->Add( 8, 8, 0, 0, 5 ); - wxBoxSizer* bSizer262; - bSizer262 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer262; + bSizer262 = new wxBoxSizer( wxHORIZONTAL ); - m_buttonSync = new zen::BitmapTextButton( m_panelTopButtons, wxID_ANY, _("Synchronize"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_buttonSync->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - m_buttonSync->SetToolTip( _("dummy") ); + m_buttonSync = new zen::BitmapTextButton( m_panelTopButtons, wxID_ANY, _("Synchronize"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonSync->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonSync->SetToolTip( _("dummy") ); - bSizer262->Add( m_buttonSync, 0, wxEXPAND, 5 ); + bSizer262->Add( m_buttonSync, 0, wxEXPAND, 5 ); - bSizerTopButtons->Add( bSizer262, 1, wxEXPAND, 5 ); + bSizerTopButtons->Add( bSizer262, 1, wxEXPAND, 5 ); - bSizer1791->Add( bSizerTopButtons, 1, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer1791->Add( bSizerTopButtons, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_panelTopButtons->SetSizer( bSizer1791 ); - m_panelTopButtons->Layout(); - bSizer1791->Fit( m_panelTopButtons ); - bSizerPanelHolder->Add( m_panelTopButtons, 0, wxEXPAND, 5 ); + m_panelTopButtons->SetSizer( bSizer1791 ); + m_panelTopButtons->Layout(); + bSizer1791->Fit( m_panelTopButtons ); + bSizerPanelHolder->Add( m_panelTopButtons, 0, wxEXPAND, 5 ); - m_panelDirectoryPairs = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL|wxBORDER_STATIC ); - wxBoxSizer* bSizer1601; - bSizer1601 = new wxBoxSizer( wxVERTICAL ); + m_panelDirectoryPairs = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL|wxBORDER_STATIC ); + wxBoxSizer* bSizer1601; + bSizer1601 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer91; - bSizer91 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer91; + bSizer91 = new wxBoxSizer( wxHORIZONTAL ); - m_panelTopLeft = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelTopLeft->SetMinSize( wxSize( 1, -1 ) ); + m_panelTopLeft = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelTopLeft->SetMinSize( wxSize( 1,-1 ) ); - wxFlexGridSizer* fgSizer8; - fgSizer8 = new wxFlexGridSizer( 0, 2, 0, 0 ); - fgSizer8->AddGrowableCol( 1 ); - fgSizer8->SetFlexibleDirection( wxBOTH ); - fgSizer8->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_ALL ); + wxFlexGridSizer* fgSizer8; + fgSizer8 = new wxFlexGridSizer( 0, 2, 0, 0 ); + fgSizer8->AddGrowableCol( 1 ); + fgSizer8->SetFlexibleDirection( wxBOTH ); + fgSizer8->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_ALL ); - fgSizer8->Add( 0, 0, 1, wxEXPAND, 5 ); + fgSizer8->Add( 0, 0, 1, wxEXPAND, 5 ); - m_staticTextResolvedPathL = new wxStaticText( m_panelTopLeft, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextResolvedPathL->Wrap( -1 ); - fgSizer8->Add( m_staticTextResolvedPathL, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 ); + m_staticTextResolvedPathL = new wxStaticText( m_panelTopLeft, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextResolvedPathL->Wrap( -1 ); + fgSizer8->Add( m_staticTextResolvedPathL, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 ); - wxBoxSizer* bSizer159; - bSizer159 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer159; + bSizer159 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonAddPair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonAddPair->SetToolTip( _("Add folder pair") ); + m_bpButtonAddPair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonAddPair->SetToolTip( _("Add folder pair") ); - bSizer159->Add( m_bpButtonAddPair, 0, wxEXPAND, 5 ); + bSizer159->Add( m_bpButtonAddPair, 0, wxEXPAND, 5 ); - m_bpButtonRemovePair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); + m_bpButtonRemovePair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); - bSizer159->Add( m_bpButtonRemovePair, 0, wxEXPAND, 5 ); + bSizer159->Add( m_bpButtonRemovePair, 0, wxEXPAND, 5 ); - fgSizer8->Add( bSizer159, 0, wxEXPAND, 5 ); + fgSizer8->Add( bSizer159, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer182; - bSizer182 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer182; + bSizer182 = new wxBoxSizer( wxHORIZONTAL ); - m_folderPathLeft = new fff::FolderHistoryBox( m_panelTopLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer182->Add( m_folderPathLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); + m_folderPathLeft = new fff::FolderHistoryBox( m_panelTopLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer182->Add( m_folderPathLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_buttonSelectFolderLeft = new wxButton( m_panelTopLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectFolderLeft->SetToolTip( _("Select a folder") ); + m_buttonSelectFolderLeft = new wxButton( m_panelTopLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectFolderLeft->SetToolTip( _("Select a folder") ); - bSizer182->Add( m_buttonSelectFolderLeft, 0, wxEXPAND, 5 ); + bSizer182->Add( m_buttonSelectFolderLeft, 0, wxEXPAND, 5 ); - m_bpButtonSelectAltFolderLeft = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonSelectAltFolderLeft->SetToolTip( _("Access online storage") ); + m_bpButtonSelectAltFolderLeft = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonSelectAltFolderLeft->SetToolTip( _("Access online storage") ); - bSizer182->Add( m_bpButtonSelectAltFolderLeft, 0, wxEXPAND, 5 ); + bSizer182->Add( m_bpButtonSelectAltFolderLeft, 0, wxEXPAND, 5 ); - fgSizer8->Add( bSizer182, 0, wxEXPAND, 5 ); + fgSizer8->Add( bSizer182, 0, wxEXPAND, 5 ); - m_panelTopLeft->SetSizer( fgSizer8 ); - m_panelTopLeft->Layout(); - fgSizer8->Fit( m_panelTopLeft ); - bSizer91->Add( m_panelTopLeft, 1, wxLEFT|wxALIGN_BOTTOM, 5 ); + m_panelTopLeft->SetSizer( fgSizer8 ); + m_panelTopLeft->Layout(); + fgSizer8->Fit( m_panelTopLeft ); + bSizer91->Add( m_panelTopLeft, 1, wxLEFT|wxALIGN_BOTTOM, 5 ); - m_panelTopCenter = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer1771; - bSizer1771 = new wxBoxSizer( wxVERTICAL ); + m_panelTopCenter = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer1771; + bSizer1771 = new wxBoxSizer( wxVERTICAL ); - m_bpButtonSwapSides = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonSwapSides->SetToolTip( _("dummy") ); + m_bpButtonSwapSides = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonSwapSides->SetToolTip( _("dummy") ); - bSizer1771->Add( m_bpButtonSwapSides, 0, wxEXPAND, 5 ); + bSizer1771->Add( m_bpButtonSwapSides, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer160; - bSizer160 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer160; + bSizer160 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonLocalCompCfg = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonLocalCompCfg->SetToolTip( _("dummy") ); + m_bpButtonLocalCompCfg = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonLocalCompCfg->SetToolTip( _("dummy") ); - bSizer160->Add( m_bpButtonLocalCompCfg, 0, wxEXPAND, 5 ); + bSizer160->Add( m_bpButtonLocalCompCfg, 0, wxEXPAND, 5 ); - m_bpButtonLocalFilter = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonLocalFilter->SetToolTip( _("dummy") ); + m_bpButtonLocalFilter = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonLocalFilter->SetToolTip( _("dummy") ); - bSizer160->Add( m_bpButtonLocalFilter, 0, wxEXPAND, 5 ); + bSizer160->Add( m_bpButtonLocalFilter, 0, wxEXPAND, 5 ); - m_bpButtonLocalSyncCfg = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonLocalSyncCfg->SetToolTip( _("dummy") ); + m_bpButtonLocalSyncCfg = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonLocalSyncCfg->SetToolTip( _("dummy") ); - bSizer160->Add( m_bpButtonLocalSyncCfg, 0, wxEXPAND, 5 ); + bSizer160->Add( m_bpButtonLocalSyncCfg, 0, wxEXPAND, 5 ); - bSizer1771->Add( bSizer160, 1, wxALIGN_CENTER_HORIZONTAL, 5 ); + bSizer1771->Add( bSizer160, 1, wxALIGN_CENTER_HORIZONTAL, 5 ); - m_panelTopCenter->SetSizer( bSizer1771 ); - m_panelTopCenter->Layout(); - bSizer1771->Fit( m_panelTopCenter ); - bSizer91->Add( m_panelTopCenter, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + m_panelTopCenter->SetSizer( bSizer1771 ); + m_panelTopCenter->Layout(); + bSizer1771->Fit( m_panelTopCenter ); + bSizer91->Add( m_panelTopCenter, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - m_panelTopRight = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelTopRight->SetMinSize( wxSize( 1, -1 ) ); + m_panelTopRight = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelTopRight->SetMinSize( wxSize( 1,-1 ) ); - wxBoxSizer* bSizer183; - bSizer183 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer183; + bSizer183 = new wxBoxSizer( wxVERTICAL ); - m_staticTextResolvedPathR = new wxStaticText( m_panelTopRight, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextResolvedPathR->Wrap( -1 ); - bSizer183->Add( m_staticTextResolvedPathR, 0, wxALL, 2 ); + m_staticTextResolvedPathR = new wxStaticText( m_panelTopRight, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextResolvedPathR->Wrap( -1 ); + bSizer183->Add( m_staticTextResolvedPathR, 0, wxALL, 2 ); - wxBoxSizer* bSizer179; - bSizer179 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer179; + bSizer179 = new wxBoxSizer( wxHORIZONTAL ); - m_folderPathRight = new fff::FolderHistoryBox( m_panelTopRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer179->Add( m_folderPathRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); + m_folderPathRight = new fff::FolderHistoryBox( m_panelTopRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer179->Add( m_folderPathRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_buttonSelectFolderRight = new wxButton( m_panelTopRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectFolderRight->SetToolTip( _("Select a folder") ); + m_buttonSelectFolderRight = new wxButton( m_panelTopRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectFolderRight->SetToolTip( _("Select a folder") ); - bSizer179->Add( m_buttonSelectFolderRight, 0, wxEXPAND, 5 ); + bSizer179->Add( m_buttonSelectFolderRight, 0, wxEXPAND, 5 ); - m_bpButtonSelectAltFolderRight = new wxBitmapButton( m_panelTopRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonSelectAltFolderRight->SetToolTip( _("Access online storage") ); + m_bpButtonSelectAltFolderRight = new wxBitmapButton( m_panelTopRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonSelectAltFolderRight->SetToolTip( _("Access online storage") ); - bSizer179->Add( m_bpButtonSelectAltFolderRight, 0, wxEXPAND, 5 ); + bSizer179->Add( m_bpButtonSelectAltFolderRight, 0, wxEXPAND, 5 ); - bSizer183->Add( bSizer179, 0, wxEXPAND, 5 ); + bSizer183->Add( bSizer179, 0, wxEXPAND, 5 ); - m_panelTopRight->SetSizer( bSizer183 ); - m_panelTopRight->Layout(); - bSizer183->Fit( m_panelTopRight ); - bSizer91->Add( m_panelTopRight, 1, wxRIGHT|wxALIGN_BOTTOM, 5 ); + m_panelTopRight->SetSizer( bSizer183 ); + m_panelTopRight->Layout(); + bSizer183->Fit( m_panelTopRight ); + bSizer91->Add( m_panelTopRight, 1, wxRIGHT|wxALIGN_BOTTOM, 5 ); - bSizer1601->Add( bSizer91, 0, wxEXPAND, 5 ); + bSizer1601->Add( bSizer91, 0, wxEXPAND, 5 ); - m_scrolledWindowFolderPairs = new wxScrolledWindow( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxSize( -1, -1 ), wxHSCROLL|wxVSCROLL ); - m_scrolledWindowFolderPairs->SetScrollRate( 5, 5 ); - m_scrolledWindowFolderPairs->SetMinSize( wxSize( -1, 0 ) ); + m_scrolledWindowFolderPairs = new wxScrolledWindow( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxHSCROLL|wxVSCROLL ); + m_scrolledWindowFolderPairs->SetScrollRate( 5, 5 ); + m_scrolledWindowFolderPairs->SetMinSize( wxSize( -1,0 ) ); - bSizerAddFolderPairs = new wxBoxSizer( wxVERTICAL ); + bSizerAddFolderPairs = new wxBoxSizer( wxVERTICAL ); - m_scrolledWindowFolderPairs->SetSizer( bSizerAddFolderPairs ); - m_scrolledWindowFolderPairs->Layout(); - bSizerAddFolderPairs->Fit( m_scrolledWindowFolderPairs ); - bSizer1601->Add( m_scrolledWindowFolderPairs, 1, wxEXPAND, 5 ); + m_scrolledWindowFolderPairs->SetSizer( bSizerAddFolderPairs ); + m_scrolledWindowFolderPairs->Layout(); + bSizerAddFolderPairs->Fit( m_scrolledWindowFolderPairs ); + bSizer1601->Add( m_scrolledWindowFolderPairs, 1, wxEXPAND, 5 ); - m_panelDirectoryPairs->SetSizer( bSizer1601 ); - m_panelDirectoryPairs->Layout(); - bSizer1601->Fit( m_panelDirectoryPairs ); - bSizerPanelHolder->Add( m_panelDirectoryPairs, 0, wxEXPAND, 5 ); + m_panelDirectoryPairs->SetSizer( bSizer1601 ); + m_panelDirectoryPairs->Layout(); + bSizer1601->Fit( m_panelDirectoryPairs ); + bSizerPanelHolder->Add( m_panelDirectoryPairs, 0, wxEXPAND, 5 ); - m_gridOverview = new zen::Grid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); - m_gridOverview->SetScrollRate( 5, 5 ); - bSizerPanelHolder->Add( m_gridOverview, 0, 0, 5 ); + m_gridOverview = new zen::Grid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_gridOverview->SetScrollRate( 5, 5 ); + bSizerPanelHolder->Add( m_gridOverview, 0, 0, 5 ); - m_panelCenter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer1711; - bSizer1711 = new wxBoxSizer( wxVERTICAL ); + m_panelCenter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer1711; + bSizer1711 = new wxBoxSizer( wxVERTICAL ); - m_splitterMain = new fff::TripleSplitter( m_panelCenter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer1781; - bSizer1781 = new wxBoxSizer( wxHORIZONTAL ); + m_splitterMain = new fff::TripleSplitter( m_panelCenter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer1781; + bSizer1781 = new wxBoxSizer( wxHORIZONTAL ); - m_gridMainL = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); - m_gridMainL->SetScrollRate( 5, 5 ); - bSizer1781->Add( m_gridMainL, 1, wxEXPAND, 5 ); + m_gridMainL = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_gridMainL->SetScrollRate( 5, 5 ); + bSizer1781->Add( m_gridMainL, 1, wxEXPAND, 5 ); - m_gridMainC = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); - m_gridMainC->SetScrollRate( 5, 5 ); - bSizer1781->Add( m_gridMainC, 0, wxEXPAND, 5 ); + m_gridMainC = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_gridMainC->SetScrollRate( 5, 5 ); + bSizer1781->Add( m_gridMainC, 0, wxEXPAND, 5 ); - m_gridMainR = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); - m_gridMainR->SetScrollRate( 5, 5 ); - bSizer1781->Add( m_gridMainR, 1, wxEXPAND, 5 ); + m_gridMainR = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_gridMainR->SetScrollRate( 5, 5 ); + bSizer1781->Add( m_gridMainR, 1, wxEXPAND, 5 ); - m_splitterMain->SetSizer( bSizer1781 ); - m_splitterMain->Layout(); - bSizer1781->Fit( m_splitterMain ); - bSizer1711->Add( m_splitterMain, 1, wxEXPAND, 5 ); + m_splitterMain->SetSizer( bSizer1781 ); + m_splitterMain->Layout(); + bSizer1781->Fit( m_splitterMain ); + bSizer1711->Add( m_splitterMain, 1, wxEXPAND, 5 ); - m_panelStatusBar = new wxPanel( m_panelCenter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL|wxBORDER_STATIC ); - wxBoxSizer* bSizer451; - bSizer451 = new wxBoxSizer( wxHORIZONTAL ); + m_panelStatusBar = new wxPanel( m_panelCenter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL|wxBORDER_STATIC ); + wxBoxSizer* bSizer451; + bSizer451 = new wxBoxSizer( wxHORIZONTAL ); - bSizerFileStatus = new wxBoxSizer( wxHORIZONTAL ); + bSizerFileStatus = new wxBoxSizer( wxHORIZONTAL ); - bSizerStatusLeft = new wxBoxSizer( wxHORIZONTAL ); + bSizerStatusLeft = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer53; - bSizer53 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer53; + bSizer53 = new wxBoxSizer( wxHORIZONTAL ); - bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatusLeftDirectories = new wxBoxSizer( wxHORIZONTAL ); + bSizerStatusLeftDirectories = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapSmallDirectoryLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizerStatusLeftDirectories->Add( m_bitmapSmallDirectoryLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapSmallDirectoryLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerStatusLeftDirectories->Add( m_bitmapSmallDirectoryLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatusLeftDirectories->Add( 2, 0, 0, 0, 5 ); + bSizerStatusLeftDirectories->Add( 2, 0, 0, 0, 5 ); - m_staticTextStatusLeftDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusLeftDirs->Wrap( -1 ); - bSizerStatusLeftDirectories->Add( m_staticTextStatusLeftDirs, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + m_staticTextStatusLeftDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusLeftDirs->Wrap( -1 ); + bSizerStatusLeftDirectories->Add( m_staticTextStatusLeftDirs, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizer53->Add( bSizerStatusLeftDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer53->Add( bSizerStatusLeftDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatusLeftFiles = new wxBoxSizer( wxHORIZONTAL ); + bSizerStatusLeftFiles = new wxBoxSizer( wxHORIZONTAL ); - bSizerStatusLeftFiles->Add( 10, 0, 0, 0, 5 ); + bSizerStatusLeftFiles->Add( 10, 0, 0, 0, 5 ); - m_bitmapSmallFileLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizerStatusLeftFiles->Add( m_bitmapSmallFileLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapSmallFileLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerStatusLeftFiles->Add( m_bitmapSmallFileLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatusLeftFiles->Add( 2, 0, 0, 0, 5 ); + bSizerStatusLeftFiles->Add( 2, 0, 0, 0, 5 ); - m_staticTextStatusLeftFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusLeftFiles->Wrap( -1 ); - bSizerStatusLeftFiles->Add( m_staticTextStatusLeftFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + m_staticTextStatusLeftFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusLeftFiles->Wrap( -1 ); + bSizerStatusLeftFiles->Add( m_staticTextStatusLeftFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatusLeftFiles->Add( 4, 0, 0, 0, 5 ); + bSizerStatusLeftFiles->Add( 4, 0, 0, 0, 5 ); - m_staticTextStatusLeftBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusLeftBytes->Wrap( -1 ); - bSizerStatusLeftFiles->Add( m_staticTextStatusLeftBytes, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_staticTextStatusLeftBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusLeftBytes->Wrap( -1 ); + bSizerStatusLeftFiles->Add( m_staticTextStatusLeftBytes, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer53->Add( bSizerStatusLeftFiles, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer53->Add( bSizerStatusLeftFiles, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatusLeft->Add( bSizer53, 1, wxEXPAND, 5 ); + bSizerStatusLeft->Add( bSizer53, 1, wxEXPAND, 5 ); - m_staticline9 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizerStatusLeft->Add( m_staticline9, 0, wxEXPAND|wxTOP, 2 ); + m_staticline9 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizerStatusLeft->Add( m_staticline9, 0, wxEXPAND|wxTOP, 2 ); - bSizerFileStatus->Add( bSizerStatusLeft, 1, wxEXPAND, 5 ); + bSizerFileStatus->Add( bSizerStatusLeft, 1, wxEXPAND, 5 ); - bSizerFileStatus->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizerFileStatus->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextStatusCenter = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusCenter->Wrap( -1 ); - bSizerFileStatus->Add( m_staticTextStatusCenter, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + m_staticTextStatusCenter = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusCenter->Wrap( -1 ); + bSizerFileStatus->Add( m_staticTextStatusCenter, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizerFileStatus->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizerFileStatus->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatusRight = new wxBoxSizer( wxHORIZONTAL ); + bSizerStatusRight = new wxBoxSizer( wxHORIZONTAL ); - m_staticline10 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizerStatusRight->Add( m_staticline10, 0, wxEXPAND|wxTOP, 2 ); + m_staticline10 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizerStatusRight->Add( m_staticline10, 0, wxEXPAND|wxTOP, 2 ); - wxBoxSizer* bSizer52; - bSizer52 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer52; + bSizer52 = new wxBoxSizer( wxHORIZONTAL ); - bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatusRightDirectories = new wxBoxSizer( wxHORIZONTAL ); + bSizerStatusRightDirectories = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapSmallDirectoryRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizerStatusRightDirectories->Add( m_bitmapSmallDirectoryRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapSmallDirectoryRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerStatusRightDirectories->Add( m_bitmapSmallDirectoryRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatusRightDirectories->Add( 2, 0, 0, 0, 5 ); + bSizerStatusRightDirectories->Add( 2, 0, 0, 0, 5 ); - m_staticTextStatusRightDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusRightDirs->Wrap( -1 ); - bSizerStatusRightDirectories->Add( m_staticTextStatusRightDirs, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + m_staticTextStatusRightDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusRightDirs->Wrap( -1 ); + bSizerStatusRightDirectories->Add( m_staticTextStatusRightDirs, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer52->Add( bSizerStatusRightDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer52->Add( bSizerStatusRightDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatusRightFiles = new wxBoxSizer( wxHORIZONTAL ); + bSizerStatusRightFiles = new wxBoxSizer( wxHORIZONTAL ); - bSizerStatusRightFiles->Add( 10, 0, 0, 0, 5 ); + bSizerStatusRightFiles->Add( 10, 0, 0, 0, 5 ); - m_bitmapSmallFileRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizerStatusRightFiles->Add( m_bitmapSmallFileRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapSmallFileRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerStatusRightFiles->Add( m_bitmapSmallFileRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatusRightFiles->Add( 2, 0, 0, 0, 5 ); + bSizerStatusRightFiles->Add( 2, 0, 0, 0, 5 ); - m_staticTextStatusRightFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusRightFiles->Wrap( -1 ); - bSizerStatusRightFiles->Add( m_staticTextStatusRightFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + m_staticTextStatusRightFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusRightFiles->Wrap( -1 ); + bSizerStatusRightFiles->Add( m_staticTextStatusRightFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatusRightFiles->Add( 4, 0, 0, 0, 5 ); + bSizerStatusRightFiles->Add( 4, 0, 0, 0, 5 ); - m_staticTextStatusRightBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusRightBytes->Wrap( -1 ); - bSizerStatusRightFiles->Add( m_staticTextStatusRightBytes, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_staticTextStatusRightBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusRightBytes->Wrap( -1 ); + bSizerStatusRightFiles->Add( m_staticTextStatusRightBytes, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer52->Add( bSizerStatusRightFiles, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer52->Add( bSizerStatusRightFiles, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatusRight->Add( bSizer52, 1, wxEXPAND, 5 ); + bSizerStatusRight->Add( bSizer52, 1, wxEXPAND, 5 ); - bSizerFileStatus->Add( bSizerStatusRight, 1, wxEXPAND, 5 ); + bSizerFileStatus->Add( bSizerStatusRight, 1, wxEXPAND, 5 ); - bSizer451->Add( bSizerFileStatus, 1, wxEXPAND, 5 ); + bSizer451->Add( bSizerFileStatus, 1, wxEXPAND, 5 ); - m_staticTextFullStatus = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextFullStatus->Wrap( -1 ); - m_staticTextFullStatus->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_staticTextFullStatus = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextFullStatus->Wrap( -1 ); + m_staticTextFullStatus->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer451->Add( m_staticTextFullStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + bSizer451->Add( m_staticTextFullStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_panelStatusBar->SetSizer( bSizer451 ); - m_panelStatusBar->Layout(); - bSizer451->Fit( m_panelStatusBar ); - bSizer1711->Add( m_panelStatusBar, 0, wxEXPAND, 5 ); + m_panelStatusBar->SetSizer( bSizer451 ); + m_panelStatusBar->Layout(); + bSizer451->Fit( m_panelStatusBar ); + bSizer1711->Add( m_panelStatusBar, 0, wxEXPAND, 5 ); - m_panelCenter->SetSizer( bSizer1711 ); - m_panelCenter->Layout(); - bSizer1711->Fit( m_panelCenter ); - bSizerPanelHolder->Add( m_panelCenter, 1, wxEXPAND, 5 ); + m_panelCenter->SetSizer( bSizer1711 ); + m_panelCenter->Layout(); + bSizer1711->Fit( m_panelCenter ); + bSizerPanelHolder->Add( m_panelCenter, 1, wxEXPAND, 5 ); - m_panelSearch = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer1713; - bSizer1713 = new wxBoxSizer( wxHORIZONTAL ); + m_panelSearch = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer1713; + bSizer1713 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonHideSearch = new wxBitmapButton( m_panelSearch, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonHideSearch->SetToolTip( _("Close search bar") ); + m_bpButtonHideSearch = new wxBitmapButton( m_panelSearch, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonHideSearch->SetToolTip( _("Close search bar") ); - bSizer1713->Add( m_bpButtonHideSearch, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer1713->Add( m_bpButtonHideSearch, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticText101 = new wxStaticText( m_panelSearch, wxID_ANY, _("Find:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText101->Wrap( -1 ); - bSizer1713->Add( m_staticText101, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_staticText101 = new wxStaticText( m_panelSearch, wxID_ANY, _("Find:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText101->Wrap( -1 ); + bSizer1713->Add( m_staticText101, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_textCtrlSearchTxt = new wxTextCtrl( m_panelSearch, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxTE_PROCESS_ENTER|wxWANTS_CHARS ); - bSizer1713->Add( m_textCtrlSearchTxt, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + m_textCtrlSearchTxt = new wxTextCtrl( m_panelSearch, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_PROCESS_ENTER|wxWANTS_CHARS ); + bSizer1713->Add( m_textCtrlSearchTxt, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - m_checkBoxMatchCase = new wxCheckBox( m_panelSearch, wxID_ANY, _("Match case"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer1713->Add( m_checkBoxMatchCase, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + m_checkBoxMatchCase = new wxCheckBox( m_panelSearch, wxID_ANY, _("Match case"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer1713->Add( m_checkBoxMatchCase, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_panelSearch->SetSizer( bSizer1713 ); - m_panelSearch->Layout(); - bSizer1713->Fit( m_panelSearch ); - bSizerPanelHolder->Add( m_panelSearch, 0, 0, 5 ); + m_panelSearch->SetSizer( bSizer1713 ); + m_panelSearch->Layout(); + bSizer1713->Fit( m_panelSearch ); + bSizerPanelHolder->Add( m_panelSearch, 0, 0, 5 ); - m_panelLog = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelLog->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panelLog = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelLog->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - bSizerLog = new wxBoxSizer( wxVERTICAL ); + bSizerLog = new wxBoxSizer( wxVERTICAL ); - bSizer42 = new wxBoxSizer( wxHORIZONTAL ); + bSizer42 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapSyncResult = new wxStaticBitmap( m_panelLog, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer42->Add( m_bitmapSyncResult, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + m_bitmapSyncResult = new wxStaticBitmap( m_panelLog, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer42->Add( m_bitmapSyncResult, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_staticTextSyncResult = new wxStaticText( m_panelLog, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextSyncResult->Wrap( -1 ); - m_staticTextSyncResult->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_staticTextSyncResult = new wxStaticText( m_panelLog, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextSyncResult->Wrap( -1 ); + m_staticTextSyncResult->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer42->Add( m_staticTextSyncResult, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); + bSizer42->Add( m_staticTextSyncResult, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); - bSizer42->Add( 10, 0, 0, 0, 5 ); + bSizer42->Add( 10, 0, 0, 0, 5 ); - ffgSizer11 = new wxFlexGridSizer( 2, 0, 5, 5 ); - ffgSizer11->SetFlexibleDirection( wxBOTH ); - ffgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + ffgSizer11 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer11->SetFlexibleDirection( wxBOTH ); + ffgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_staticTextProcessed = new wxStaticText( m_panelLog, wxID_ANY, _("Processed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextProcessed->Wrap( -1 ); - ffgSizer11->Add( m_staticTextProcessed, 0, wxALIGN_RIGHT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + m_staticTextProcessed = new wxStaticText( m_panelLog, wxID_ANY, _("Processed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextProcessed->Wrap( -1 ); + ffgSizer11->Add( m_staticTextProcessed, 0, wxALIGN_RIGHT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextRemaining = new wxStaticText( m_panelLog, wxID_ANY, _("Remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextRemaining->Wrap( -1 ); - ffgSizer11->Add( m_staticTextRemaining, 0, wxALIGN_RIGHT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + m_staticTextRemaining = new wxStaticText( m_panelLog, wxID_ANY, _("Remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextRemaining->Wrap( -1 ); + ffgSizer11->Add( m_staticTextRemaining, 0, wxALIGN_RIGHT|wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer42->Add( ffgSizer11, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 10 ); + bSizer42->Add( ffgSizer11, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 10 ); - m_panelItemStats = new wxPanel( m_panelLog, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelItemStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + m_panelItemStats = new wxPanel( m_panelLog, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_panelItemStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer291; - bSizer291 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer291; + bSizer291 = new wxBoxSizer( wxVERTICAL ); - ffgSizer111 = new wxFlexGridSizer( 0, 2, 5, 5 ); - ffgSizer111->SetFlexibleDirection( wxBOTH ); - ffgSizer111->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + ffgSizer111 = new wxFlexGridSizer( 0, 2, 5, 5 ); + ffgSizer111->SetFlexibleDirection( wxBOTH ); + ffgSizer111->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - wxBoxSizer* bSizer293; - bSizer293 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer293; + bSizer293 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapItemStat = new wxStaticBitmap( m_panelItemStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer293->Add( m_bitmapItemStat, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapItemStat = new wxStaticBitmap( m_panelItemStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer293->Add( m_bitmapItemStat, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer293->Add( 0, 0, 1, 0, 5 ); + bSizer293->Add( 0, 0, 1, 0, 5 ); - m_staticTextItemsProcessed = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_staticTextItemsProcessed->Wrap( -1 ); - m_staticTextItemsProcessed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_staticTextItemsProcessed = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_staticTextItemsProcessed->Wrap( -1 ); + m_staticTextItemsProcessed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer293->Add( m_staticTextItemsProcessed, 0, wxALIGN_BOTTOM, 5 ); + bSizer293->Add( m_staticTextItemsProcessed, 0, wxALIGN_BOTTOM, 5 ); - ffgSizer111->Add( bSizer293, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + ffgSizer111->Add( bSizer293, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - m_staticTextBytesProcessed = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextBytesProcessed->Wrap( -1 ); - ffgSizer111->Add( m_staticTextBytesProcessed, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); + m_staticTextBytesProcessed = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextBytesProcessed->Wrap( -1 ); + ffgSizer111->Add( m_staticTextBytesProcessed, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); - m_staticTextItemsRemaining = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_staticTextItemsRemaining->Wrap( -1 ); - m_staticTextItemsRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_staticTextItemsRemaining = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_staticTextItemsRemaining->Wrap( -1 ); + m_staticTextItemsRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - ffgSizer111->Add( m_staticTextItemsRemaining, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); + ffgSizer111->Add( m_staticTextItemsRemaining, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); - m_staticTextBytesRemaining = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextBytesRemaining->Wrap( -1 ); - ffgSizer111->Add( m_staticTextBytesRemaining, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); + m_staticTextBytesRemaining = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextBytesRemaining->Wrap( -1 ); + ffgSizer111->Add( m_staticTextBytesRemaining, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); - bSizer291->Add( ffgSizer111, 0, wxALL, 5 ); + bSizer291->Add( ffgSizer111, 0, wxALL, 5 ); - m_panelItemStats->SetSizer( bSizer291 ); - m_panelItemStats->Layout(); - bSizer291->Fit( m_panelItemStats ); - bSizer42->Add( m_panelItemStats, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); + m_panelItemStats->SetSizer( bSizer291 ); + m_panelItemStats->Layout(); + bSizer291->Fit( m_panelItemStats ); + bSizer42->Add( m_panelItemStats, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); - m_panelTimeStats = new wxPanel( m_panelLog, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelTimeStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + m_panelTimeStats = new wxPanel( m_panelLog, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_panelTimeStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer292; - bSizer292 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer292; + bSizer292 = new wxBoxSizer( wxVERTICAL ); - ffgSizer112 = new wxFlexGridSizer( 0, 1, 5, 5 ); - ffgSizer112->SetFlexibleDirection( wxBOTH ); - ffgSizer112->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + ffgSizer112 = new wxFlexGridSizer( 0, 1, 5, 5 ); + ffgSizer112->SetFlexibleDirection( wxBOTH ); + ffgSizer112->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - wxBoxSizer* bSizer294; - bSizer294 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer294; + bSizer294 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapTimeStat = new wxStaticBitmap( m_panelTimeStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer294->Add( m_bitmapTimeStat, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_bitmapTimeStat = new wxStaticBitmap( m_panelTimeStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer294->Add( m_bitmapTimeStat, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - bSizer294->Add( 0, 0, 1, 0, 5 ); + bSizer294->Add( 0, 0, 1, 0, 5 ); - m_staticTextTimeElapsed = new wxStaticText( m_panelTimeStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeElapsed->Wrap( -1 ); - m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_staticTextTimeElapsed = new wxStaticText( m_panelTimeStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeElapsed->Wrap( -1 ); + m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer294->Add( m_staticTextTimeElapsed, 0, wxALIGN_BOTTOM, 5 ); + bSizer294->Add( m_staticTextTimeElapsed, 0, wxALIGN_BOTTOM, 5 ); - ffgSizer112->Add( bSizer294, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + ffgSizer112->Add( bSizer294, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - bSizer292->Add( ffgSizer112, 0, wxALL, 5 ); + bSizer292->Add( ffgSizer112, 0, wxALL, 5 ); - m_panelTimeStats->SetSizer( bSizer292 ); - m_panelTimeStats->Layout(); - bSizer292->Fit( m_panelTimeStats ); - bSizer42->Add( m_panelTimeStats, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); + m_panelTimeStats->SetSizer( bSizer292 ); + m_panelTimeStats->Layout(); + bSizer292->Fit( m_panelTimeStats ); + bSizer42->Add( m_panelTimeStats, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); - bSizerLog->Add( bSizer42, 0, wxLEFT, 5 ); + bSizerLog->Add( bSizer42, 0, wxLEFT, 5 ); - m_staticline70 = new wxStaticLine( m_panelLog, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizerLog->Add( m_staticline70, 0, wxEXPAND, 5 ); + m_staticline70 = new wxStaticLine( m_panelLog, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerLog->Add( m_staticline70, 0, wxEXPAND, 5 ); - m_panelLog->SetSizer( bSizerLog ); - m_panelLog->Layout(); - bSizerLog->Fit( m_panelLog ); - bSizerPanelHolder->Add( m_panelLog, 0, 0, 5 ); + m_panelLog->SetSizer( bSizerLog ); + m_panelLog->Layout(); + bSizerLog->Fit( m_panelLog ); + bSizerPanelHolder->Add( m_panelLog, 0, 0, 5 ); - m_panelConfig = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelConfig->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panelConfig = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelConfig->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - bSizerConfig = new wxBoxSizer( wxVERTICAL ); + bSizerConfig = new wxBoxSizer( wxVERTICAL ); - bSizerCfgHistoryButtons = new wxBoxSizer( wxHORIZONTAL ); + bSizerCfgHistoryButtons = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer17611; - bSizer17611 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer17611; + bSizer17611 = new wxBoxSizer( wxVERTICAL ); - m_bpButtonNew = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonNew->SetToolTip( _("dummy") ); + m_bpButtonNew = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonNew->SetToolTip( _("dummy") ); - bSizer17611->Add( m_bpButtonNew, 0, wxEXPAND, 5 ); + bSizer17611->Add( m_bpButtonNew, 0, wxEXPAND, 5 ); - m_staticText951 = new wxStaticText( m_panelConfig, wxID_ANY, _("New"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText951->Wrap( -1 ); - bSizer17611->Add( m_staticText951, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 2 ); + m_staticText951 = new wxStaticText( m_panelConfig, wxID_ANY, _("New"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText951->Wrap( -1 ); + bSizer17611->Add( m_staticText951, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 2 ); - bSizerCfgHistoryButtons->Add( bSizer17611, 0, 0, 5 ); + bSizerCfgHistoryButtons->Add( bSizer17611, 0, 0, 5 ); - wxBoxSizer* bSizer1761; - bSizer1761 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer1761; + bSizer1761 = new wxBoxSizer( wxVERTICAL ); - m_bpButtonOpen = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonOpen->SetToolTip( _("dummy") ); + m_bpButtonOpen = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonOpen->SetToolTip( _("dummy") ); - bSizer1761->Add( m_bpButtonOpen, 0, wxEXPAND, 5 ); + bSizer1761->Add( m_bpButtonOpen, 0, wxEXPAND, 5 ); - m_staticText95 = new wxStaticText( m_panelConfig, wxID_ANY, _("Open..."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText95->Wrap( -1 ); - bSizer1761->Add( m_staticText95, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 2 ); + m_staticText95 = new wxStaticText( m_panelConfig, wxID_ANY, _("Open..."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText95->Wrap( -1 ); + bSizer1761->Add( m_staticText95, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 2 ); - bSizerCfgHistoryButtons->Add( bSizer1761, 0, 0, 5 ); + bSizerCfgHistoryButtons->Add( bSizer1761, 0, 0, 5 ); - wxBoxSizer* bSizer175; - bSizer175 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer175; + bSizer175 = new wxBoxSizer( wxVERTICAL ); - m_bpButtonSave = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonSave->SetToolTip( _("dummy") ); + m_bpButtonSave = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonSave->SetToolTip( _("dummy") ); - bSizer175->Add( m_bpButtonSave, 0, wxEXPAND, 5 ); + bSizer175->Add( m_bpButtonSave, 0, wxEXPAND, 5 ); - m_staticText961 = new wxStaticText( m_panelConfig, wxID_ANY, _("Save"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText961->Wrap( -1 ); - bSizer175->Add( m_staticText961, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 2 ); + m_staticText961 = new wxStaticText( m_panelConfig, wxID_ANY, _("Save"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText961->Wrap( -1 ); + bSizer175->Add( m_staticText961, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 2 ); - bSizerCfgHistoryButtons->Add( bSizer175, 0, 0, 5 ); + bSizerCfgHistoryButtons->Add( bSizer175, 0, 0, 5 ); - wxBoxSizer* bSizer174; - bSizer174 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer174; + bSizer174 = new wxBoxSizer( wxVERTICAL ); - bSizerSaveAs = new wxBoxSizer( wxHORIZONTAL ); + bSizerSaveAs = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonSaveAs = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonSaveAs->SetToolTip( _("dummy") ); + m_bpButtonSaveAs = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonSaveAs->SetToolTip( _("dummy") ); - bSizerSaveAs->Add( m_bpButtonSaveAs, 1, 0, 5 ); + bSizerSaveAs->Add( m_bpButtonSaveAs, 1, 0, 5 ); - m_bpButtonSaveAsBatch = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonSaveAsBatch->SetToolTip( _("dummy") ); + m_bpButtonSaveAsBatch = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonSaveAsBatch->SetToolTip( _("dummy") ); - bSizerSaveAs->Add( m_bpButtonSaveAsBatch, 1, 0, 5 ); + bSizerSaveAs->Add( m_bpButtonSaveAsBatch, 1, 0, 5 ); - bSizer174->Add( bSizerSaveAs, 0, wxEXPAND, 5 ); + bSizer174->Add( bSizerSaveAs, 0, wxEXPAND, 5 ); - m_staticText97 = new wxStaticText( m_panelConfig, wxID_ANY, _("Save as..."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText97->Wrap( -1 ); - bSizer174->Add( m_staticText97, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 2 ); + m_staticText97 = new wxStaticText( m_panelConfig, wxID_ANY, _("Save as..."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText97->Wrap( -1 ); + bSizer174->Add( m_staticText97, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 2 ); - bSizerCfgHistoryButtons->Add( bSizer174, 0, 0, 5 ); + bSizerCfgHistoryButtons->Add( bSizer174, 0, 0, 5 ); - bSizerConfig->Add( bSizerCfgHistoryButtons, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + bSizerConfig->Add( bSizerCfgHistoryButtons, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - m_staticline81 = new wxStaticLine( m_panelConfig, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizerConfig->Add( m_staticline81, 0, wxEXPAND|wxTOP, 5 ); + m_staticline81 = new wxStaticLine( m_panelConfig, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerConfig->Add( m_staticline81, 0, wxEXPAND|wxTOP, 5 ); - bSizerConfig->Add( 10, 0, 0, 0, 5 ); + bSizerConfig->Add( 10, 0, 0, 0, 5 ); - m_gridCfgHistory = new zen::Grid( m_panelConfig, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); - m_gridCfgHistory->SetScrollRate( 5, 5 ); - bSizerConfig->Add( m_gridCfgHistory, 1, wxEXPAND, 5 ); + m_gridCfgHistory = new zen::Grid( m_panelConfig, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_gridCfgHistory->SetScrollRate( 5, 5 ); + bSizerConfig->Add( m_gridCfgHistory, 1, wxEXPAND, 5 ); - m_panelConfig->SetSizer( bSizerConfig ); - m_panelConfig->Layout(); - bSizerConfig->Fit( m_panelConfig ); - bSizerPanelHolder->Add( m_panelConfig, 0, 0, 5 ); + m_panelConfig->SetSizer( bSizerConfig ); + m_panelConfig->Layout(); + bSizerConfig->Fit( m_panelConfig ); + bSizerPanelHolder->Add( m_panelConfig, 0, 0, 5 ); - m_panelViewFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelViewFilter->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panelViewFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelViewFilter->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - bSizerViewFilter = new wxBoxSizer( wxHORIZONTAL ); + bSizerViewFilter = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonToggleLog = new wxBitmapButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 ); - bSizerViewFilter->Add( m_bpButtonToggleLog, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + m_bpButtonToggleLog = new wxBitmapButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 ); + bSizerViewFilter->Add( m_bpButtonToggleLog, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 ); - bSizerViewButtons = new wxBoxSizer( wxHORIZONTAL ); + bSizerViewButtons = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonViewType = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizerViewButtons->Add( m_bpButtonViewType, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + m_bpButtonViewType = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizerViewButtons->Add( m_bpButtonViewType, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizerViewButtons->Add( 10, 10, 0, 0, 5 ); + bSizerViewButtons->Add( 10, 10, 0, 0, 5 ); - m_bpButtonShowExcluded = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizerViewButtons->Add( m_bpButtonShowExcluded, 0, wxEXPAND, 5 ); + m_bpButtonShowExcluded = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizerViewButtons->Add( m_bpButtonShowExcluded, 0, wxEXPAND, 5 ); - bSizerViewButtons->Add( 10, 10, 0, 0, 5 ); + bSizerViewButtons->Add( 10, 10, 0, 0, 5 ); - m_bpButtonShowDeleteLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizerViewButtons->Add( m_bpButtonShowDeleteLeft, 0, wxEXPAND, 5 ); + m_bpButtonShowDeleteLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizerViewButtons->Add( m_bpButtonShowDeleteLeft, 0, wxEXPAND, 5 ); - m_bpButtonShowUpdateLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizerViewButtons->Add( m_bpButtonShowUpdateLeft, 0, wxEXPAND, 5 ); + m_bpButtonShowUpdateLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizerViewButtons->Add( m_bpButtonShowUpdateLeft, 0, wxEXPAND, 5 ); - m_bpButtonShowCreateLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizerViewButtons->Add( m_bpButtonShowCreateLeft, 0, wxEXPAND, 5 ); + m_bpButtonShowCreateLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizerViewButtons->Add( m_bpButtonShowCreateLeft, 0, wxEXPAND, 5 ); - m_bpButtonShowLeftOnly = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizerViewButtons->Add( m_bpButtonShowLeftOnly, 0, wxEXPAND, 5 ); + m_bpButtonShowLeftOnly = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizerViewButtons->Add( m_bpButtonShowLeftOnly, 0, wxEXPAND, 5 ); - m_bpButtonShowLeftNewer = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizerViewButtons->Add( m_bpButtonShowLeftNewer, 0, wxEXPAND, 5 ); + m_bpButtonShowLeftNewer = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizerViewButtons->Add( m_bpButtonShowLeftNewer, 0, wxEXPAND, 5 ); - m_bpButtonShowEqual = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizerViewButtons->Add( m_bpButtonShowEqual, 0, wxEXPAND, 5 ); + m_bpButtonShowEqual = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizerViewButtons->Add( m_bpButtonShowEqual, 0, wxEXPAND, 5 ); - m_bpButtonShowDoNothing = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizerViewButtons->Add( m_bpButtonShowDoNothing, 0, wxEXPAND, 5 ); + m_bpButtonShowDoNothing = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizerViewButtons->Add( m_bpButtonShowDoNothing, 0, wxEXPAND, 5 ); - m_bpButtonShowDifferent = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizerViewButtons->Add( m_bpButtonShowDifferent, 0, wxEXPAND, 5 ); + m_bpButtonShowDifferent = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizerViewButtons->Add( m_bpButtonShowDifferent, 0, wxEXPAND, 5 ); - m_bpButtonShowRightNewer = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizerViewButtons->Add( m_bpButtonShowRightNewer, 0, wxEXPAND, 5 ); + m_bpButtonShowRightNewer = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizerViewButtons->Add( m_bpButtonShowRightNewer, 0, wxEXPAND, 5 ); - m_bpButtonShowRightOnly = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizerViewButtons->Add( m_bpButtonShowRightOnly, 0, wxEXPAND, 5 ); + m_bpButtonShowRightOnly = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizerViewButtons->Add( m_bpButtonShowRightOnly, 0, wxEXPAND, 5 ); - m_bpButtonShowCreateRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizerViewButtons->Add( m_bpButtonShowCreateRight, 0, wxEXPAND, 5 ); + m_bpButtonShowCreateRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizerViewButtons->Add( m_bpButtonShowCreateRight, 0, wxEXPAND, 5 ); - m_bpButtonShowUpdateRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizerViewButtons->Add( m_bpButtonShowUpdateRight, 0, wxEXPAND, 5 ); + m_bpButtonShowUpdateRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizerViewButtons->Add( m_bpButtonShowUpdateRight, 0, wxEXPAND, 5 ); - m_bpButtonShowDeleteRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizerViewButtons->Add( m_bpButtonShowDeleteRight, 0, wxEXPAND, 5 ); + m_bpButtonShowDeleteRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizerViewButtons->Add( m_bpButtonShowDeleteRight, 0, wxEXPAND, 5 ); - m_bpButtonShowConflict = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizerViewButtons->Add( m_bpButtonShowConflict, 0, wxEXPAND, 5 ); + m_bpButtonShowConflict = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizerViewButtons->Add( m_bpButtonShowConflict, 0, wxEXPAND, 5 ); - m_bpButtonViewFilterContext = new wxBitmapButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizerViewButtons->Add( m_bpButtonViewFilterContext, 0, wxEXPAND, 5 ); + m_bpButtonViewFilterContext = new wxBitmapButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizerViewButtons->Add( m_bpButtonViewFilterContext, 0, wxEXPAND, 5 ); - bSizerViewFilter->Add( bSizerViewButtons, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + bSizerViewFilter->Add( bSizerViewButtons, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 ); - m_staticText96 = new wxStaticText( m_panelViewFilter, wxID_ANY, _("Statistics:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText96->Wrap( -1 ); - bSizerViewFilter->Add( m_staticText96, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + m_staticText96 = new wxStaticText( m_panelViewFilter, wxID_ANY, _("Statistics:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText96->Wrap( -1 ); + bSizerViewFilter->Add( m_staticText96, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_panelStatistics = new wxPanel( m_panelViewFilter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL|wxBORDER_SUNKEN ); - m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panelStatistics = new wxPanel( m_panelViewFilter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL|wxBORDER_SUNKEN ); + m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - bSizer1801 = new wxBoxSizer( wxVERTICAL ); + bSizer1801 = new wxBoxSizer( wxVERTICAL ); - bSizerStatistics = new wxBoxSizer( wxHORIZONTAL ); + bSizerStatistics = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer173; - bSizer173 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer173; + bSizer173 = new wxBoxSizer( wxVERTICAL ); - m_bitmapDeleteLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") ); + m_bitmapDeleteLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") ); - bSizer173->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer173->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer173->Add( 5, 2, 0, 0, 5 ); + bSizer173->Add( 5, 2, 0, 0, 5 ); - bSizer173->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer173->Add( 0, 0, 1, wxEXPAND, 5 ); - m_staticTextDeleteLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDeleteLeft->Wrap( -1 ); - m_staticTextDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") ); + m_staticTextDeleteLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDeleteLeft->Wrap( -1 ); + m_staticTextDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") ); - bSizer173->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer173->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatistics->Add( bSizer173, 0, wxEXPAND, 5 ); + bSizerStatistics->Add( bSizer173, 0, wxEXPAND, 5 ); - bSizerStatistics->Add( 5, 5, 0, 0, 5 ); + bSizerStatistics->Add( 5, 5, 0, 0, 5 ); - wxBoxSizer* bSizer172; - bSizer172 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer172; + bSizer172 = new wxBoxSizer( wxVERTICAL ); - m_bitmapUpdateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapUpdateLeft->SetToolTip( _("Number of files that will be updated") ); + m_bitmapUpdateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapUpdateLeft->SetToolTip( _("Number of files that will be updated") ); - bSizer172->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer172->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer172->Add( 5, 2, 0, 0, 5 ); + bSizer172->Add( 5, 2, 0, 0, 5 ); - bSizer172->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer172->Add( 0, 0, 1, wxEXPAND, 5 ); - m_staticTextUpdateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextUpdateLeft->Wrap( -1 ); - m_staticTextUpdateLeft->SetToolTip( _("Number of files that will be updated") ); + m_staticTextUpdateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextUpdateLeft->Wrap( -1 ); + m_staticTextUpdateLeft->SetToolTip( _("Number of files that will be updated") ); - bSizer172->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + bSizer172->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizerStatistics->Add( bSizer172, 0, wxEXPAND, 5 ); + bSizerStatistics->Add( bSizer172, 0, wxEXPAND, 5 ); - bSizerStatistics->Add( 5, 5, 0, 0, 5 ); + bSizerStatistics->Add( 5, 5, 0, 0, 5 ); - wxBoxSizer* bSizer1712; - bSizer1712 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer1712; + bSizer1712 = new wxBoxSizer( wxVERTICAL ); - m_bitmapCreateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapCreateLeft->SetToolTip( _("Number of files and folders that will be created") ); + m_bitmapCreateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapCreateLeft->SetToolTip( _("Number of files and folders that will be created") ); - bSizer1712->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + bSizer1712->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizer1712->Add( 5, 2, 0, 0, 5 ); + bSizer1712->Add( 5, 2, 0, 0, 5 ); - bSizer1712->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer1712->Add( 0, 0, 1, wxEXPAND, 5 ); - m_staticTextCreateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextCreateLeft->Wrap( -1 ); - m_staticTextCreateLeft->SetToolTip( _("Number of files and folders that will be created") ); + m_staticTextCreateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextCreateLeft->Wrap( -1 ); + m_staticTextCreateLeft->SetToolTip( _("Number of files and folders that will be created") ); - bSizer1712->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + bSizer1712->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizerStatistics->Add( bSizer1712, 0, wxEXPAND, 5 ); + bSizerStatistics->Add( bSizer1712, 0, wxEXPAND, 5 ); - bSizerStatistics->Add( 5, 5, 0, 0, 5 ); + bSizerStatistics->Add( 5, 5, 0, 0, 5 ); - bSizerData = new wxBoxSizer( wxVERTICAL ); + bSizerData = new wxBoxSizer( wxVERTICAL ); - m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapData->SetToolTip( _("Total bytes to copy") ); + m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapData->SetToolTip( _("Total bytes to copy") ); - bSizerData->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + bSizerData->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizerData->Add( 5, 2, 0, 0, 5 ); + bSizerData->Add( 5, 2, 0, 0, 5 ); - bSizerData->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizerData->Add( 0, 0, 1, wxEXPAND, 5 ); - m_staticTextData = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextData->Wrap( -1 ); - m_staticTextData->SetToolTip( _("Total bytes to copy") ); + m_staticTextData = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextData->Wrap( -1 ); + m_staticTextData->SetToolTip( _("Total bytes to copy") ); - bSizerData->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizerData->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatistics->Add( bSizerData, 0, wxEXPAND, 5 ); + bSizerStatistics->Add( bSizerData, 0, wxEXPAND, 5 ); - bSizerStatistics->Add( 5, 5, 0, 0, 5 ); + bSizerStatistics->Add( 5, 5, 0, 0, 5 ); - wxBoxSizer* bSizer178; - bSizer178 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer178; + bSizer178 = new wxBoxSizer( wxVERTICAL ); - m_bitmapCreateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapCreateRight->SetToolTip( _("Number of files and folders that will be created") ); + m_bitmapCreateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapCreateRight->SetToolTip( _("Number of files and folders that will be created") ); - bSizer178->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + bSizer178->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizer178->Add( 5, 2, 0, 0, 5 ); + bSizer178->Add( 5, 2, 0, 0, 5 ); - bSizer178->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer178->Add( 0, 0, 1, wxEXPAND, 5 ); - m_staticTextCreateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextCreateRight->Wrap( -1 ); - m_staticTextCreateRight->SetToolTip( _("Number of files and folders that will be created") ); + m_staticTextCreateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextCreateRight->Wrap( -1 ); + m_staticTextCreateRight->SetToolTip( _("Number of files and folders that will be created") ); - bSizer178->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer178->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatistics->Add( bSizer178, 0, wxEXPAND, 5 ); + bSizerStatistics->Add( bSizer178, 0, wxEXPAND, 5 ); - bSizerStatistics->Add( 5, 5, 0, 0, 5 ); + bSizerStatistics->Add( 5, 5, 0, 0, 5 ); - wxBoxSizer* bSizer177; - bSizer177 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer177; + bSizer177 = new wxBoxSizer( wxVERTICAL ); - m_bitmapUpdateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapUpdateRight->SetToolTip( _("Number of files that will be updated") ); + m_bitmapUpdateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapUpdateRight->SetToolTip( _("Number of files that will be updated") ); - bSizer177->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + bSizer177->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizer177->Add( 5, 2, 0, 0, 5 ); + bSizer177->Add( 5, 2, 0, 0, 5 ); - bSizer177->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer177->Add( 0, 0, 1, wxEXPAND, 5 ); - m_staticTextUpdateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextUpdateRight->Wrap( -1 ); - m_staticTextUpdateRight->SetToolTip( _("Number of files that will be updated") ); + m_staticTextUpdateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextUpdateRight->Wrap( -1 ); + m_staticTextUpdateRight->SetToolTip( _("Number of files that will be updated") ); - bSizer177->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer177->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatistics->Add( bSizer177, 0, wxEXPAND, 5 ); + bSizerStatistics->Add( bSizer177, 0, wxEXPAND, 5 ); - bSizerStatistics->Add( 5, 5, 0, 0, 5 ); + bSizerStatistics->Add( 5, 5, 0, 0, 5 ); - wxBoxSizer* bSizer176; - bSizer176 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer176; + bSizer176 = new wxBoxSizer( wxVERTICAL ); - m_bitmapDeleteRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") ); + m_bitmapDeleteRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") ); - bSizer176->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer176->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer176->Add( 5, 2, 0, 0, 5 ); + bSizer176->Add( 5, 2, 0, 0, 5 ); - bSizer176->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer176->Add( 0, 0, 1, wxEXPAND, 5 ); - m_staticTextDeleteRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDeleteRight->Wrap( -1 ); - m_staticTextDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") ); + m_staticTextDeleteRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDeleteRight->Wrap( -1 ); + m_staticTextDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") ); - bSizer176->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer176->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatistics->Add( bSizer176, 0, wxEXPAND, 5 ); + bSizerStatistics->Add( bSizer176, 0, wxEXPAND, 5 ); - bSizer1801->Add( bSizerStatistics, 0, wxALL, 4 ); + bSizer1801->Add( bSizerStatistics, 0, wxALL, 4 ); - m_panelStatistics->SetSizer( bSizer1801 ); - m_panelStatistics->Layout(); - bSizer1801->Fit( m_panelStatistics ); - bSizerViewFilter->Add( m_panelStatistics, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + m_panelStatistics->SetSizer( bSizer1801 ); + m_panelStatistics->Layout(); + bSizer1801->Fit( m_panelStatistics ); + bSizerViewFilter->Add( m_panelStatistics, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_panelViewFilter->SetSizer( bSizerViewFilter ); - m_panelViewFilter->Layout(); - bSizerViewFilter->Fit( m_panelViewFilter ); - bSizerPanelHolder->Add( m_panelViewFilter, 0, 0, 5 ); + m_panelViewFilter->SetSizer( bSizerViewFilter ); + m_panelViewFilter->Layout(); + bSizerViewFilter->Fit( m_panelViewFilter ); + bSizerPanelHolder->Add( m_panelViewFilter, 0, 0, 5 ); - this->SetSizer( bSizerPanelHolder ); - this->Layout(); - bSizerPanelHolder->Fit( this ); + this->SetSizer( bSizerPanelHolder ); + this->Layout(); + bSizerPanelHolder->Fit( this ); - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::onClose ) ); - m_menuFile->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onConfigNew ), this, m_menuItemNew->GetId()); - m_menuFile->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onConfigLoad ), this, m_menuItemLoad->GetId()); - m_menuFile->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onConfigSave ), this, m_menuItemSave->GetId()); - m_menuFile->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onConfigSaveAs ), this, m_menuItemSaveAs->GetId()); - m_menuFile->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onSaveAsBatchJob ), this, m_menuItemSaveAsBatch->GetId()); - m_menuFile->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onMenuQuit ), this, m_menuItemQuit->GetId()); - m_menuActions->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onToggleLog ), this, m_menuItemShowLog->GetId()); - m_menuActions->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onCompare ), this, m_menuItemCompare->GetId()); - m_menuActions->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onCmpSettings ), this, m_menuItemCompSettings->GetId()); - m_menuActions->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onConfigureFilter ), this, m_menuItemFilter->GetId()); - m_menuActions->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onSyncSettings ), this, m_menuItemSyncSettings->GetId()); - m_menuActions->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onStartSync ), this, m_menuItemSynchronize->GetId()); - m_menuTools->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onMenuOptions ), this, m_menuItemOptions->GetId()); - m_menuTools->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onMenuFindItem ), this, m_menuItemFind->GetId()); - m_menuTools->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onMenuExportFileList ), this, m_menuItemExportList->GetId()); - m_menuTools->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onMenuResetLayout ), this, m_menuItemResetLayout->GetId()); - m_menuHelp->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onShowHelp ), this, m_menuItemHelp->GetId()); - m_menuHelp->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onMenuCheckVersion ), this, m_menuItemCheckVersionNow->GetId()); - m_menuHelp->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onMenuCheckVersionAutomatically ), this, m_menuItemCheckVersionAuto->GetId()); - m_menuHelp->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onMenuAbout ), this, m_menuItemAbout->GetId()); - m_buttonCompare->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onCompare ), NULL, this ); - m_bpButtonCmpConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onCmpSettings ), NULL, this ); - m_bpButtonCmpConfig->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onCompSettingsContextMouse ), NULL, this ); - m_bpButtonCmpContext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onCompSettingsContext ), NULL, this ); - m_bpButtonCmpContext->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onCompSettingsContextMouse ), NULL, this ); - m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onConfigureFilter ), NULL, this ); - m_bpButtonFilter->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onGlobalFilterContextMouse ), NULL, this ); - m_bpButtonFilterContext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onGlobalFilterContext ), NULL, this ); - m_bpButtonFilterContext->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onGlobalFilterContextMouse ), NULL, this ); - m_bpButtonSyncConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onSyncSettings ), NULL, this ); - m_bpButtonSyncConfig->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onSyncSettingsContextMouse ), NULL, this ); - m_bpButtonSyncContext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onSyncSettingsContext ), NULL, this ); - m_bpButtonSyncContext->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onSyncSettingsContextMouse ), NULL, this ); - m_buttonSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onStartSync ), NULL, this ); - m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onTopFolderPairAdd ), NULL, this ); - m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onTopFolderPairRemove ), NULL, this ); - m_bpButtonSwapSides->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onSwapSides ), NULL, this ); - m_bpButtonLocalCompCfg->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onTopLocalCompCfg ), NULL, this ); - m_bpButtonLocalFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onTopLocalFilterCfg ), NULL, this ); - m_bpButtonLocalSyncCfg->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onTopLocalSyncCfg ), NULL, this ); - m_bpButtonHideSearch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onHideSearchPanel ), NULL, this ); - m_textCtrlSearchTxt->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( MainDialogGenerated::onSearchGridEnter ), NULL, this ); - m_bpButtonNew->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onConfigNew ), NULL, this ); - m_bpButtonOpen->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onConfigLoad ), NULL, this ); - m_bpButtonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onConfigSave ), NULL, this ); - m_bpButtonSaveAs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onConfigSaveAs ), NULL, this ); - m_bpButtonSaveAsBatch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onSaveAsBatchJob ), NULL, this ); - m_bpButtonToggleLog->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleLog ), NULL, this ); - m_bpButtonViewType->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewType ), NULL, this ); - m_bpButtonViewType->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewTypeContextMouse ), NULL, this ); - m_bpButtonShowExcluded->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); - m_bpButtonShowExcluded->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); - m_bpButtonShowDeleteLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); - m_bpButtonShowDeleteLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); - m_bpButtonShowUpdateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); - m_bpButtonShowUpdateLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); - m_bpButtonShowCreateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); - m_bpButtonShowCreateLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); - m_bpButtonShowLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); - m_bpButtonShowLeftOnly->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); - m_bpButtonShowLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); - m_bpButtonShowLeftNewer->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); - m_bpButtonShowEqual->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); - m_bpButtonShowEqual->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); - m_bpButtonShowDoNothing->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); - m_bpButtonShowDoNothing->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); - m_bpButtonShowDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); - m_bpButtonShowDifferent->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); - m_bpButtonShowRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); - m_bpButtonShowRightNewer->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); - m_bpButtonShowRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); - m_bpButtonShowRightOnly->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); - m_bpButtonShowCreateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); - m_bpButtonShowCreateRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); - m_bpButtonShowUpdateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); - m_bpButtonShowUpdateRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); - m_bpButtonShowDeleteRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); - m_bpButtonShowDeleteRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); - m_bpButtonShowConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); - m_bpButtonShowConflict->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); - m_bpButtonViewFilterContext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onViewFilterContext ), NULL, this ); - m_bpButtonViewFilterContext->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::onClose ) ); + m_menuFile->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onConfigNew ), this, m_menuItemNew->GetId()); + m_menuFile->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onConfigLoad ), this, m_menuItemLoad->GetId()); + m_menuFile->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onConfigSave ), this, m_menuItemSave->GetId()); + m_menuFile->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onConfigSaveAs ), this, m_menuItemSaveAs->GetId()); + m_menuFile->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onSaveAsBatchJob ), this, m_menuItemSaveAsBatch->GetId()); + m_menuFile->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onMenuQuit ), this, m_menuItemQuit->GetId()); + m_menuActions->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onToggleLog ), this, m_menuItemShowLog->GetId()); + m_menuActions->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onCompare ), this, m_menuItemCompare->GetId()); + m_menuActions->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onCmpSettings ), this, m_menuItemCompSettings->GetId()); + m_menuActions->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onConfigureFilter ), this, m_menuItemFilter->GetId()); + m_menuActions->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onSyncSettings ), this, m_menuItemSyncSettings->GetId()); + m_menuActions->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onStartSync ), this, m_menuItemSynchronize->GetId()); + m_menuTools->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onMenuOptions ), this, m_menuItemOptions->GetId()); + m_menuTools->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onMenuFindItem ), this, m_menuItemFind->GetId()); + m_menuTools->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onMenuExportFileList ), this, m_menuItemExportList->GetId()); + m_menuTools->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onMenuResetLayout ), this, m_menuItemResetLayout->GetId()); + m_menuHelp->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onShowHelp ), this, m_menuItemHelp->GetId()); + m_menuHelp->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onMenuCheckVersion ), this, m_menuItemCheckVersionNow->GetId()); + m_menuHelp->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onMenuCheckVersionAutomatically ), this, m_menuItemCheckVersionAuto->GetId()); + m_menuHelp->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::onMenuAbout ), this, m_menuItemAbout->GetId()); + m_buttonCompare->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onCompare ), NULL, this ); + m_bpButtonCmpConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onCmpSettings ), NULL, this ); + m_bpButtonCmpConfig->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onCompSettingsContextMouse ), NULL, this ); + m_bpButtonCmpContext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onCompSettingsContext ), NULL, this ); + m_bpButtonCmpContext->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onCompSettingsContextMouse ), NULL, this ); + m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onConfigureFilter ), NULL, this ); + m_bpButtonFilter->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onGlobalFilterContextMouse ), NULL, this ); + m_bpButtonFilterContext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onGlobalFilterContext ), NULL, this ); + m_bpButtonFilterContext->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onGlobalFilterContextMouse ), NULL, this ); + m_bpButtonSyncConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onSyncSettings ), NULL, this ); + m_bpButtonSyncConfig->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onSyncSettingsContextMouse ), NULL, this ); + m_bpButtonSyncContext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onSyncSettingsContext ), NULL, this ); + m_bpButtonSyncContext->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onSyncSettingsContextMouse ), NULL, this ); + m_buttonSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onStartSync ), NULL, this ); + m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onTopFolderPairAdd ), NULL, this ); + m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onTopFolderPairRemove ), NULL, this ); + m_bpButtonSwapSides->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onSwapSides ), NULL, this ); + m_bpButtonLocalCompCfg->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onTopLocalCompCfg ), NULL, this ); + m_bpButtonLocalFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onTopLocalFilterCfg ), NULL, this ); + m_bpButtonLocalSyncCfg->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onTopLocalSyncCfg ), NULL, this ); + m_bpButtonHideSearch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onHideSearchPanel ), NULL, this ); + m_textCtrlSearchTxt->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( MainDialogGenerated::onSearchGridEnter ), NULL, this ); + m_bpButtonNew->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onConfigNew ), NULL, this ); + m_bpButtonOpen->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onConfigLoad ), NULL, this ); + m_bpButtonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onConfigSave ), NULL, this ); + m_bpButtonSaveAs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onConfigSaveAs ), NULL, this ); + m_bpButtonSaveAsBatch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onSaveAsBatchJob ), NULL, this ); + m_bpButtonToggleLog->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleLog ), NULL, this ); + m_bpButtonViewType->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewType ), NULL, this ); + m_bpButtonViewType->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewTypeContextMouse ), NULL, this ); + m_bpButtonShowExcluded->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); + m_bpButtonShowExcluded->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); + m_bpButtonShowDeleteLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); + m_bpButtonShowDeleteLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); + m_bpButtonShowUpdateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); + m_bpButtonShowUpdateLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); + m_bpButtonShowCreateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); + m_bpButtonShowCreateLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); + m_bpButtonShowLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); + m_bpButtonShowLeftOnly->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); + m_bpButtonShowLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); + m_bpButtonShowLeftNewer->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); + m_bpButtonShowEqual->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); + m_bpButtonShowEqual->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); + m_bpButtonShowDoNothing->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); + m_bpButtonShowDoNothing->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); + m_bpButtonShowDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); + m_bpButtonShowDifferent->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); + m_bpButtonShowRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); + m_bpButtonShowRightNewer->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); + m_bpButtonShowRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); + m_bpButtonShowRightOnly->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); + m_bpButtonShowCreateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); + m_bpButtonShowCreateRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); + m_bpButtonShowUpdateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); + m_bpButtonShowUpdateRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); + m_bpButtonShowDeleteRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); + m_bpButtonShowDeleteRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); + m_bpButtonShowConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onToggleViewButton ), NULL, this ); + m_bpButtonShowConflict->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); + m_bpButtonViewFilterContext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::onViewFilterContext ), NULL, this ); + m_bpButtonViewFilterContext->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::onViewFilterContextMouse ), NULL, this ); } MainDialogGenerated::~MainDialogGenerated() @@ -1202,97 +1202,97 @@ MainDialogGenerated::~MainDialogGenerated() FolderPairPanelGenerated::FolderPairPanelGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxPanel( parent, id, pos, size, style, name ) { - wxBoxSizer* bSizer74; - bSizer74 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer74; + bSizer74 = new wxBoxSizer( wxHORIZONTAL ); - m_panelLeft = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelLeft->SetMinSize( wxSize( 1, -1 ) ); + m_panelLeft = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelLeft->SetMinSize( wxSize( 1,-1 ) ); - wxBoxSizer* bSizer134; - bSizer134 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer134; + bSizer134 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonFolderPairOptions = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonFolderPairOptions->SetToolTip( _("Arrange folder pair") ); + m_bpButtonFolderPairOptions = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonFolderPairOptions->SetToolTip( _("Arrange folder pair") ); - bSizer134->Add( m_bpButtonFolderPairOptions, 0, wxEXPAND, 5 ); + bSizer134->Add( m_bpButtonFolderPairOptions, 0, wxEXPAND, 5 ); - m_bpButtonRemovePair = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); + m_bpButtonRemovePair = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); - bSizer134->Add( m_bpButtonRemovePair, 0, wxEXPAND, 5 ); + bSizer134->Add( m_bpButtonRemovePair, 0, wxEXPAND, 5 ); - m_folderPathLeft = new fff::FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer134->Add( m_folderPathLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); + m_folderPathLeft = new fff::FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer134->Add( m_folderPathLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_buttonSelectFolderLeft = new wxButton( m_panelLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_buttonSelectFolderLeft->SetToolTip( _("Select a folder") ); + m_buttonSelectFolderLeft = new wxButton( m_panelLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonSelectFolderLeft->SetToolTip( _("Select a folder") ); - bSizer134->Add( m_buttonSelectFolderLeft, 0, wxEXPAND, 5 ); + bSizer134->Add( m_buttonSelectFolderLeft, 0, wxEXPAND, 5 ); - m_bpButtonSelectAltFolderLeft = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonSelectAltFolderLeft->SetToolTip( _("Access online storage") ); + m_bpButtonSelectAltFolderLeft = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonSelectAltFolderLeft->SetToolTip( _("Access online storage") ); - bSizer134->Add( m_bpButtonSelectAltFolderLeft, 0, wxEXPAND, 5 ); + bSizer134->Add( m_bpButtonSelectAltFolderLeft, 0, wxEXPAND, 5 ); - m_panelLeft->SetSizer( bSizer134 ); - m_panelLeft->Layout(); - bSizer134->Fit( m_panelLeft ); - bSizer74->Add( m_panelLeft, 0, wxLEFT|wxEXPAND, 5 ); + m_panelLeft->SetSizer( bSizer134 ); + m_panelLeft->Layout(); + bSizer134->Fit( m_panelLeft ); + bSizer74->Add( m_panelLeft, 0, wxLEFT|wxEXPAND, 5 ); - m_panel20 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer95; - bSizer95 = new wxBoxSizer( wxHORIZONTAL ); + m_panel20 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer95; + bSizer95 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonLocalCompCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonLocalCompCfg->SetToolTip( _("dummy") ); + m_bpButtonLocalCompCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonLocalCompCfg->SetToolTip( _("dummy") ); - bSizer95->Add( m_bpButtonLocalCompCfg, 0, wxEXPAND, 5 ); + bSizer95->Add( m_bpButtonLocalCompCfg, 0, wxEXPAND, 5 ); - m_bpButtonLocalFilter = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonLocalFilter->SetToolTip( _("dummy") ); + m_bpButtonLocalFilter = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonLocalFilter->SetToolTip( _("dummy") ); - bSizer95->Add( m_bpButtonLocalFilter, 0, wxEXPAND, 5 ); + bSizer95->Add( m_bpButtonLocalFilter, 0, wxEXPAND, 5 ); - m_bpButtonLocalSyncCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonLocalSyncCfg->SetToolTip( _("dummy") ); + m_bpButtonLocalSyncCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonLocalSyncCfg->SetToolTip( _("dummy") ); - bSizer95->Add( m_bpButtonLocalSyncCfg, 0, wxEXPAND, 5 ); + bSizer95->Add( m_bpButtonLocalSyncCfg, 0, wxEXPAND, 5 ); - m_panel20->SetSizer( bSizer95 ); - m_panel20->Layout(); - bSizer95->Fit( m_panel20 ); - bSizer74->Add( m_panel20, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); + m_panel20->SetSizer( bSizer95 ); + m_panel20->Layout(); + bSizer95->Fit( m_panel20 ); + bSizer74->Add( m_panel20, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); - m_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelRight->SetMinSize( wxSize( 1, -1 ) ); + m_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelRight->SetMinSize( wxSize( 1,-1 ) ); - wxBoxSizer* bSizer135; - bSizer135 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer135; + bSizer135 = new wxBoxSizer( wxHORIZONTAL ); - m_folderPathRight = new fff::FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer135->Add( m_folderPathRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); + m_folderPathRight = new fff::FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer135->Add( m_folderPathRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_buttonSelectFolderRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectFolderRight->SetToolTip( _("Select a folder") ); + m_buttonSelectFolderRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectFolderRight->SetToolTip( _("Select a folder") ); - bSizer135->Add( m_buttonSelectFolderRight, 0, wxEXPAND, 5 ); + bSizer135->Add( m_buttonSelectFolderRight, 0, wxEXPAND, 5 ); - m_bpButtonSelectAltFolderRight = new wxBitmapButton( m_panelRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonSelectAltFolderRight->SetToolTip( _("Access online storage") ); + m_bpButtonSelectAltFolderRight = new wxBitmapButton( m_panelRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonSelectAltFolderRight->SetToolTip( _("Access online storage") ); - bSizer135->Add( m_bpButtonSelectAltFolderRight, 0, wxEXPAND, 5 ); + bSizer135->Add( m_bpButtonSelectAltFolderRight, 0, wxEXPAND, 5 ); - m_panelRight->SetSizer( bSizer135 ); - m_panelRight->Layout(); - bSizer135->Fit( m_panelRight ); - bSizer74->Add( m_panelRight, 1, wxRIGHT|wxEXPAND, 5 ); + m_panelRight->SetSizer( bSizer135 ); + m_panelRight->Layout(); + bSizer135->Fit( m_panelRight ); + bSizer74->Add( m_panelRight, 1, wxRIGHT|wxEXPAND, 5 ); - this->SetSizer( bSizer74 ); - this->Layout(); + this->SetSizer( bSizer74 ); + this->Layout(); } FolderPairPanelGenerated::~FolderPairPanelGenerated() @@ -1301,1330 +1301,1330 @@ FolderPairPanelGenerated::~FolderPairPanelGenerated() ConfigDlgGenerated::ConfigDlgGenerated( 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 ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer7; - bSizer7 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer7; + bSizer7 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer190; - bSizer190 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer190; + bSizer190 = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer1911; - bSizer1911 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer1911; + bSizer1911 = new wxBoxSizer( wxVERTICAL ); - m_staticTextFolderPairLabel = new wxStaticText( this, wxID_ANY, _("Folder pair:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextFolderPairLabel->Wrap( -1 ); - bSizer1911->Add( m_staticTextFolderPairLabel, 0, wxALL, 5 ); + m_staticTextFolderPairLabel = new wxStaticText( this, wxID_ANY, _("Folder pair:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextFolderPairLabel->Wrap( -1 ); + bSizer1911->Add( m_staticTextFolderPairLabel, 0, wxALL, 5 ); - m_listBoxFolderPair = new wxListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_NEEDED_SB ); - bSizer1911->Add( m_listBoxFolderPair, 1, 0, 5 ); + m_listBoxFolderPair = new wxListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_NEEDED_SB ); + bSizer1911->Add( m_listBoxFolderPair, 1, 0, 5 ); - bSizer190->Add( bSizer1911, 0, wxEXPAND, 5 ); + bSizer190->Add( bSizer1911, 0, wxEXPAND, 5 ); - m_notebook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_NOPAGETHEME ); - m_panelCompSettingsTab = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelCompSettingsTab->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_notebook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_NOPAGETHEME ); + m_panelCompSettingsTab = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelCompSettingsTab->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer275; - bSizer275 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer275; + bSizer275 = new wxBoxSizer( wxVERTICAL ); - bSizerHeaderCompSettings = new wxBoxSizer( wxVERTICAL ); + bSizerHeaderCompSettings = new wxBoxSizer( wxVERTICAL ); - m_staticTextMainCompSettings = new wxStaticText( m_panelCompSettingsTab, wxID_ANY, _("Main settings:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextMainCompSettings->Wrap( -1 ); - bSizerHeaderCompSettings->Add( m_staticTextMainCompSettings, 0, wxALL, 10 ); + m_staticTextMainCompSettings = new wxStaticText( m_panelCompSettingsTab, wxID_ANY, _("Main settings:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextMainCompSettings->Wrap( -1 ); + bSizerHeaderCompSettings->Add( m_staticTextMainCompSettings, 0, wxALL, 10 ); - m_checkBoxUseLocalCmpOptions = new wxCheckBox( m_panelCompSettingsTab, wxID_ANY, _("Use local settings:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxUseLocalCmpOptions->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_checkBoxUseLocalCmpOptions = new wxCheckBox( m_panelCompSettingsTab, wxID_ANY, _("Use local settings:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxUseLocalCmpOptions->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - bSizerHeaderCompSettings->Add( m_checkBoxUseLocalCmpOptions, 0, wxALL|wxEXPAND, 10 ); + bSizerHeaderCompSettings->Add( m_checkBoxUseLocalCmpOptions, 0, wxALL|wxEXPAND, 10 ); - m_staticlineCompHeader = new wxStaticLine( m_panelCompSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizerHeaderCompSettings->Add( m_staticlineCompHeader, 0, wxEXPAND, 5 ); + m_staticlineCompHeader = new wxStaticLine( m_panelCompSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerHeaderCompSettings->Add( m_staticlineCompHeader, 0, wxEXPAND, 5 ); - bSizer275->Add( bSizerHeaderCompSettings, 0, wxEXPAND, 5 ); + bSizer275->Add( bSizerHeaderCompSettings, 0, wxEXPAND, 5 ); - m_panelComparisonSettings = new wxPanel( m_panelCompSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelComparisonSettings->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panelComparisonSettings = new wxPanel( m_panelCompSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelComparisonSettings->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer2561; - bSizer2561 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer2561; + bSizer2561 = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer159; - bSizer159 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer159; + bSizer159 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer178; - bSizer178 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer178; + bSizer178 = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer182; - bSizer182 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer182; + bSizer182 = new wxBoxSizer( wxVERTICAL ); - m_staticText91 = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("Select a variant:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText91->Wrap( -1 ); - bSizer182->Add( m_staticText91, 0, wxALL, 5 ); + m_staticText91 = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("Select a variant:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText91->Wrap( -1 ); + bSizer182->Add( m_staticText91, 0, wxALL, 5 ); - wxGridSizer* gSizer2; - gSizer2 = new wxGridSizer( 0, 1, 0, 0 ); + wxGridSizer* gSizer2; + gSizer2 = new wxGridSizer( 0, 1, 0, 0 ); - m_buttonByTimeSize = new zen::ToggleButton( m_panelComparisonSettings, wxID_ANY, _("File time and size"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonByTimeSize = new zen::ToggleButton( m_panelComparisonSettings, wxID_ANY, _("File time and size"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonByTimeSize->SetDefault(); - m_buttonByTimeSize->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - m_buttonByTimeSize->SetToolTip( _("dummy") ); + m_buttonByTimeSize->SetDefault(); + m_buttonByTimeSize->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonByTimeSize->SetToolTip( _("dummy") ); - gSizer2->Add( m_buttonByTimeSize, 0, wxEXPAND, 5 ); + gSizer2->Add( m_buttonByTimeSize, 0, wxEXPAND, 5 ); - m_buttonByContent = new zen::ToggleButton( m_panelComparisonSettings, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonByContent = new zen::ToggleButton( m_panelComparisonSettings, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonByContent->SetDefault(); - m_buttonByContent->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - m_buttonByContent->SetToolTip( _("dummy") ); + m_buttonByContent->SetDefault(); + m_buttonByContent->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonByContent->SetToolTip( _("dummy") ); - gSizer2->Add( m_buttonByContent, 0, wxEXPAND, 5 ); + gSizer2->Add( m_buttonByContent, 0, wxEXPAND, 5 ); - m_buttonBySize = new zen::ToggleButton( m_panelComparisonSettings, wxID_ANY, _("File size"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonBySize = new zen::ToggleButton( m_panelComparisonSettings, wxID_ANY, _("File size"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonBySize->SetDefault(); - m_buttonBySize->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - m_buttonBySize->SetToolTip( _("dummy") ); + m_buttonBySize->SetDefault(); + m_buttonBySize->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonBySize->SetToolTip( _("dummy") ); - gSizer2->Add( m_buttonBySize, 0, wxEXPAND, 5 ); + gSizer2->Add( m_buttonBySize, 0, wxEXPAND, 5 ); - bSizer182->Add( gSizer2, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + bSizer182->Add( gSizer2, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - bSizer178->Add( bSizer182, 0, wxALL, 5 ); + bSizer178->Add( bSizer182, 0, wxALL, 5 ); - wxBoxSizer* bSizer2371; - bSizer2371 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer2371; + bSizer2371 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapCompVariant = new wxStaticBitmap( m_panelComparisonSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer2371->Add( m_bitmapCompVariant, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapCompVariant = new wxStaticBitmap( m_panelComparisonSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer2371->Add( m_bitmapCompVariant, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextCompVarDescription = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextCompVarDescription->Wrap( -1 ); - m_staticTextCompVarDescription->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticTextCompVarDescription = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextCompVarDescription->Wrap( -1 ); + m_staticTextCompVarDescription->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer2371->Add( m_staticTextCompVarDescription, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer2371->Add( m_staticTextCompVarDescription, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer178->Add( bSizer2371, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + bSizer178->Add( bSizer2371, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - bSizer159->Add( bSizer178, 0, wxEXPAND, 5 ); + bSizer159->Add( bSizer178, 0, wxEXPAND, 5 ); - m_staticline33 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer159->Add( m_staticline33, 0, wxEXPAND, 5 ); + m_staticline33 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer159->Add( m_staticline33, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer1734; - bSizer1734 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer1734; + bSizer1734 = new wxBoxSizer( wxHORIZONTAL ); - bSizer1734->Add( 0, 0, 1, 0, 5 ); + bSizer1734->Add( 0, 0, 1, 0, 5 ); - wxBoxSizer* bSizer1721; - bSizer1721 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer1721; + bSizer1721 = new wxBoxSizer( wxVERTICAL ); - m_checkBoxSymlinksInclude = new wxCheckBox( m_panelComparisonSettings, wxID_ANY, _("Include &symbolic links:"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer1721->Add( m_checkBoxSymlinksInclude, 0, wxALL, 5 ); + m_checkBoxSymlinksInclude = new wxCheckBox( m_panelComparisonSettings, wxID_ANY, _("Include &symbolic links:"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer1721->Add( m_checkBoxSymlinksInclude, 0, wxALL, 5 ); - wxBoxSizer* bSizer176; - bSizer176 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer176; + bSizer176 = new wxBoxSizer( wxVERTICAL ); - m_radioBtnSymlinksFollow = new wxRadioButton( m_panelComparisonSettings, wxID_ANY, _("&Follow"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); - m_radioBtnSymlinksFollow->SetValue( true ); - bSizer176->Add( m_radioBtnSymlinksFollow, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + m_radioBtnSymlinksFollow = new wxRadioButton( m_panelComparisonSettings, wxID_ANY, _("&Follow"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); + m_radioBtnSymlinksFollow->SetValue( true ); + bSizer176->Add( m_radioBtnSymlinksFollow, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - m_radioBtnSymlinksDirect = new wxRadioButton( m_panelComparisonSettings, wxID_ANY, _("As &link"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer176->Add( m_radioBtnSymlinksDirect, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + m_radioBtnSymlinksDirect = new wxRadioButton( m_panelComparisonSettings, wxID_ANY, _("As &link"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer176->Add( m_radioBtnSymlinksDirect, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - bSizer1721->Add( bSizer176, 0, wxLEFT|wxEXPAND, 15 ); + bSizer1721->Add( bSizer176, 0, wxLEFT|wxEXPAND, 15 ); - bSizer1721->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer1721->Add( 0, 0, 1, wxEXPAND, 5 ); - m_hyperlink24 = new wxHyperlinkCtrl( m_panelComparisonSettings, wxID_ANY, _("More information"), wxT("https://freefilesync.org/manual.php?topic=comparison-settings"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink24->SetToolTip( _("https://freefilesync.org/manual.php?topic=comparison-settings") ); + m_hyperlink24 = new wxHyperlinkCtrl( m_panelComparisonSettings, wxID_ANY, _("More information"), wxT("https://freefilesync.org/manual.php?topic=comparison-settings"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink24->SetToolTip( _("https://freefilesync.org/manual.php?topic=comparison-settings") ); - bSizer1721->Add( m_hyperlink24, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + bSizer1721->Add( m_hyperlink24, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - bSizer1734->Add( bSizer1721, 0, wxALL|wxEXPAND, 5 ); + bSizer1734->Add( bSizer1721, 0, wxALL|wxEXPAND, 5 ); - bSizer1734->Add( 0, 0, 1, 0, 5 ); + bSizer1734->Add( 0, 0, 1, 0, 5 ); - m_staticline44 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer1734->Add( m_staticline44, 0, wxEXPAND, 5 ); + m_staticline44 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer1734->Add( m_staticline44, 0, wxEXPAND, 5 ); - bSizer1734->Add( 0, 0, 1, 0, 5 ); + bSizer1734->Add( 0, 0, 1, 0, 5 ); - wxBoxSizer* bSizer1733; - bSizer1733 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer1733; + bSizer1733 = new wxBoxSizer( wxVERTICAL ); - m_staticText112 = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("&Ignore time shift [hh:mm]"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText112->Wrap( -1 ); - bSizer1733->Add( m_staticText112, 0, wxALL, 5 ); + m_staticText112 = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("&Ignore time shift [hh:mm]"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText112->Wrap( -1 ); + bSizer1733->Add( m_staticText112, 0, wxALL, 5 ); - m_textCtrlTimeShift = new wxTextCtrl( m_panelComparisonSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_textCtrlTimeShift->SetToolTip( _("List of file time offsets to ignore") ); + m_textCtrlTimeShift = new wxTextCtrl( m_panelComparisonSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_textCtrlTimeShift->SetToolTip( _("List of file time offsets to ignore") ); - bSizer1733->Add( m_textCtrlTimeShift, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + bSizer1733->Add( m_textCtrlTimeShift, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - wxBoxSizer* bSizer197; - bSizer197 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer197; + bSizer197 = new wxBoxSizer( wxHORIZONTAL ); - m_staticText1381 = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("Example:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText1381->Wrap( -1 ); - m_staticText1381->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText1381 = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("Example:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText1381->Wrap( -1 ); + m_staticText1381->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer197->Add( m_staticText1381, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + bSizer197->Add( m_staticText1381, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - m_staticText13811 = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("1, 2, 4:30"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText13811->Wrap( -1 ); - m_staticText13811->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText13811 = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("1, 2, 4:30"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText13811->Wrap( -1 ); + m_staticText13811->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer197->Add( m_staticText13811, 0, wxBOTTOM|wxRIGHT, 5 ); + bSizer197->Add( m_staticText13811, 0, wxBOTTOM|wxRIGHT, 5 ); - bSizer1733->Add( bSizer197, 0, 0, 5 ); + bSizer1733->Add( bSizer197, 0, 0, 5 ); - bSizer1733->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer1733->Add( 0, 0, 1, wxEXPAND, 5 ); - m_hyperlink241 = new wxHyperlinkCtrl( m_panelComparisonSettings, wxID_ANY, _("Handle daylight saving time"), wxT("https://freefilesync.org/manual.php?topic=daylight-saving-time"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink241->SetToolTip( _("https://freefilesync.org/manual.php?topic=daylight-saving-time") ); + m_hyperlink241 = new wxHyperlinkCtrl( m_panelComparisonSettings, wxID_ANY, _("Handle daylight saving time"), wxT("https://freefilesync.org/manual.php?topic=daylight-saving-time"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink241->SetToolTip( _("https://freefilesync.org/manual.php?topic=daylight-saving-time") ); - bSizer1733->Add( m_hyperlink241, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + bSizer1733->Add( m_hyperlink241, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - bSizer1734->Add( bSizer1733, 0, wxALL|wxEXPAND, 5 ); + bSizer1734->Add( bSizer1733, 0, wxALL|wxEXPAND, 5 ); - bSizer1734->Add( 0, 0, 1, 0, 5 ); + bSizer1734->Add( 0, 0, 1, 0, 5 ); - bSizer159->Add( bSizer1734, 0, wxEXPAND, 5 ); + bSizer159->Add( bSizer1734, 0, wxEXPAND, 5 ); - m_staticline331 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer159->Add( m_staticline331, 0, wxEXPAND, 5 ); + m_staticline331 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer159->Add( m_staticline331, 0, wxEXPAND, 5 ); - bSizer159->Add( 0, 0, 1, 0, 5 ); + bSizer159->Add( 0, 0, 1, 0, 5 ); - bSizerCompMisc = new wxBoxSizer( wxVERTICAL ); + bSizerCompMisc = new wxBoxSizer( wxVERTICAL ); - m_staticline3311 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizerCompMisc->Add( m_staticline3311, 0, wxEXPAND, 5 ); + m_staticline3311 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerCompMisc->Add( m_staticline3311, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer2781; - bSizer2781 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer2781; + bSizer2781 = new wxBoxSizer( wxHORIZONTAL ); - wxFlexGridSizer* fgSizer61; - fgSizer61 = new wxFlexGridSizer( 0, 2, 5, 5 ); - fgSizer61->SetFlexibleDirection( wxBOTH ); - fgSizer61->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + wxFlexGridSizer* fgSizer61; + fgSizer61 = new wxFlexGridSizer( 0, 2, 5, 5 ); + fgSizer61->SetFlexibleDirection( wxBOTH ); + fgSizer61->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_bitmapIgnoreErrors = new wxStaticBitmap( m_panelComparisonSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - fgSizer61->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapIgnoreErrors = new wxStaticBitmap( m_panelComparisonSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + fgSizer61->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_checkBoxIgnoreErrors = new wxCheckBox( m_panelComparisonSettings, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - fgSizer61->Add( m_checkBoxIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + m_checkBoxIgnoreErrors = new wxCheckBox( m_panelComparisonSettings, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + fgSizer61->Add( m_checkBoxIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - m_bitmapRetryErrors = new wxStaticBitmap( m_panelComparisonSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - fgSizer61->Add( m_bitmapRetryErrors, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + m_bitmapRetryErrors = new wxStaticBitmap( m_panelComparisonSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + fgSizer61->Add( m_bitmapRetryErrors, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_checkBoxAutoRetry = new wxCheckBox( m_panelComparisonSettings, wxID_ANY, _("Automatic retry"), wxDefaultPosition, wxDefaultSize, 0 ); - fgSizer61->Add( m_checkBoxAutoRetry, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + m_checkBoxAutoRetry = new wxCheckBox( m_panelComparisonSettings, wxID_ANY, _("Automatic retry"), wxDefaultPosition, wxDefaultSize, 0 ); + fgSizer61->Add( m_checkBoxAutoRetry, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - bSizer2781->Add( fgSizer61, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 ); + bSizer2781->Add( fgSizer61, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 ); - fgSizerAutoRetry = new wxFlexGridSizer( 0, 2, 5, 10 ); - fgSizerAutoRetry->SetFlexibleDirection( wxBOTH ); - fgSizerAutoRetry->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + fgSizerAutoRetry = new wxFlexGridSizer( 0, 2, 5, 10 ); + fgSizerAutoRetry->SetFlexibleDirection( wxBOTH ); + fgSizerAutoRetry->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_staticText96 = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("Retry count:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText96->Wrap( -1 ); - fgSizerAutoRetry->Add( m_staticText96, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_staticText96 = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("Retry count:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText96->Wrap( -1 ); + fgSizerAutoRetry->Add( m_staticText96, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextAutoRetryDelay = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("Delay (in seconds):"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextAutoRetryDelay->Wrap( -1 ); - fgSizerAutoRetry->Add( m_staticTextAutoRetryDelay, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_staticTextAutoRetryDelay = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("Delay (in seconds):"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextAutoRetryDelay->Wrap( -1 ); + fgSizerAutoRetry->Add( m_staticTextAutoRetryDelay, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_spinCtrlAutoRetryCount = new wxSpinCtrl( m_panelComparisonSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); - fgSizerAutoRetry->Add( m_spinCtrlAutoRetryCount, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_spinCtrlAutoRetryCount = new wxSpinCtrl( m_panelComparisonSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); + fgSizerAutoRetry->Add( m_spinCtrlAutoRetryCount, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_spinCtrlAutoRetryDelay = new wxSpinCtrl( m_panelComparisonSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 0, 2000000000, 0 ); - fgSizerAutoRetry->Add( m_spinCtrlAutoRetryDelay, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_spinCtrlAutoRetryDelay = new wxSpinCtrl( m_panelComparisonSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxSP_ARROW_KEYS, 0, 2000000000, 0 ); + fgSizerAutoRetry->Add( m_spinCtrlAutoRetryDelay, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer2781->Add( fgSizerAutoRetry, 0, wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_VERTICAL, 10 ); + bSizer2781->Add( fgSizerAutoRetry, 0, wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_VERTICAL, 10 ); - bSizerCompMisc->Add( bSizer2781, 0, wxEXPAND, 5 ); + bSizerCompMisc->Add( bSizer2781, 0, wxEXPAND, 5 ); - bSizer159->Add( bSizerCompMisc, 0, wxEXPAND, 5 ); + bSizer159->Add( bSizerCompMisc, 0, wxEXPAND, 5 ); - bSizer2561->Add( bSizer159, 0, wxEXPAND, 5 ); + bSizer2561->Add( bSizer159, 0, wxEXPAND, 5 ); - m_staticline751 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer2561->Add( m_staticline751, 0, wxEXPAND, 5 ); + m_staticline751 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer2561->Add( m_staticline751, 0, wxEXPAND, 5 ); - bSizerPerformance = new wxBoxSizer( wxVERTICAL ); + bSizerPerformance = new wxBoxSizer( wxVERTICAL ); - m_panel57 = new wxPanel( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel57->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + m_panel57 = new wxPanel( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel57->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer2191; - bSizer2191 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer2191; + bSizer2191 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapPerf = new wxStaticBitmap( m_panel57, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer2191->Add( m_bitmapPerf, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + m_bitmapPerf = new wxStaticBitmap( m_panel57, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer2191->Add( m_bitmapPerf, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_staticText13611 = new wxStaticText( m_panel57, wxID_ANY, _("Performance improvements:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText13611->Wrap( -1 ); - bSizer2191->Add( m_staticText13611, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); + m_staticText13611 = new wxStaticText( m_panel57, wxID_ANY, _("Performance improvements:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText13611->Wrap( -1 ); + bSizer2191->Add( m_staticText13611, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); - m_panel57->SetSizer( bSizer2191 ); - m_panel57->Layout(); - bSizer2191->Fit( m_panel57 ); - bSizerPerformance->Add( m_panel57, 0, wxEXPAND, 5 ); + m_panel57->SetSizer( bSizer2191 ); + m_panel57->Layout(); + bSizer2191->Fit( m_panel57 ); + bSizerPerformance->Add( m_panel57, 0, wxEXPAND, 5 ); - wxStaticLine* m_staticline75; - m_staticline75 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizerPerformance->Add( m_staticline75, 0, wxEXPAND, 5 ); + wxStaticLine* m_staticline75; + m_staticline75 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerPerformance->Add( m_staticline75, 0, wxEXPAND, 5 ); - m_hyperlinkPerfDeRequired = new wxHyperlinkCtrl( m_panelComparisonSettings, wxID_ANY, _("Requires FreeFileSync Donation Edition"), wxT("https://freefilesync.org/faq.php#donation-edition"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlinkPerfDeRequired->SetToolTip( _("https://freefilesync.org/faq.php#donation-edition") ); + m_hyperlinkPerfDeRequired = new wxHyperlinkCtrl( m_panelComparisonSettings, wxID_ANY, _("Requires FreeFileSync Donation Edition"), wxT("https://freefilesync.org/faq.php#donation-edition"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlinkPerfDeRequired->SetToolTip( _("https://freefilesync.org/faq.php#donation-edition") ); - bSizerPerformance->Add( m_hyperlinkPerfDeRequired, 0, wxALL, 10 ); + bSizerPerformance->Add( m_hyperlinkPerfDeRequired, 0, wxALL, 10 ); - bSizer260 = new wxBoxSizer( wxVERTICAL ); + bSizer260 = new wxBoxSizer( wxVERTICAL ); - m_staticTextPerfParallelOps = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("Parallel file operations:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextPerfParallelOps->Wrap( -1 ); - bSizer260->Add( m_staticTextPerfParallelOps, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + m_staticTextPerfParallelOps = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("Parallel file operations:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextPerfParallelOps->Wrap( -1 ); + bSizer260->Add( m_staticTextPerfParallelOps, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - m_scrolledWindowPerf = new wxScrolledWindow( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); - m_scrolledWindowPerf->SetScrollRate( 5, 5 ); - m_scrolledWindowPerf->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_scrolledWindowPerf = new wxScrolledWindow( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_scrolledWindowPerf->SetScrollRate( 5, 5 ); + m_scrolledWindowPerf->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - fgSizerPerf = new wxFlexGridSizer( 0, 2, 5, 5 ); - fgSizerPerf->SetFlexibleDirection( wxBOTH ); - fgSizerPerf->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + fgSizerPerf = new wxFlexGridSizer( 0, 2, 5, 5 ); + fgSizerPerf->SetFlexibleDirection( wxBOTH ); + fgSizerPerf->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_scrolledWindowPerf->SetSizer( fgSizerPerf ); - m_scrolledWindowPerf->Layout(); - fgSizerPerf->Fit( m_scrolledWindowPerf ); - bSizer260->Add( m_scrolledWindowPerf, 1, wxALL|wxEXPAND, 5 ); + m_scrolledWindowPerf->SetSizer( fgSizerPerf ); + m_scrolledWindowPerf->Layout(); + fgSizerPerf->Fit( m_scrolledWindowPerf ); + bSizer260->Add( m_scrolledWindowPerf, 1, wxALL|wxEXPAND, 5 ); - bSizerPerformance->Add( bSizer260, 1, wxALL|wxEXPAND, 5 ); + bSizerPerformance->Add( bSizer260, 1, wxALL|wxEXPAND, 5 ); - m_hyperlink1711 = new wxHyperlinkCtrl( m_panelComparisonSettings, wxID_ANY, _("How to get the best performance?"), wxT("https://freefilesync.org/manual.php?topic=performance"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink1711->SetToolTip( _("https://freefilesync.org/manual.php?topic=performance") ); + m_hyperlink1711 = new wxHyperlinkCtrl( m_panelComparisonSettings, wxID_ANY, _("How to get the best performance?"), wxT("https://freefilesync.org/manual.php?topic=performance"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink1711->SetToolTip( _("https://freefilesync.org/manual.php?topic=performance") ); - bSizerPerformance->Add( m_hyperlink1711, 0, wxBOTTOM|wxRIGHT|wxLEFT, 10 ); + bSizerPerformance->Add( m_hyperlink1711, 0, wxBOTTOM|wxRIGHT|wxLEFT, 10 ); - bSizer2561->Add( bSizerPerformance, 1, wxEXPAND, 5 ); + bSizer2561->Add( bSizerPerformance, 1, wxEXPAND, 5 ); - m_panelComparisonSettings->SetSizer( bSizer2561 ); - m_panelComparisonSettings->Layout(); - bSizer2561->Fit( m_panelComparisonSettings ); - bSizer275->Add( m_panelComparisonSettings, 1, wxEXPAND, 5 ); + m_panelComparisonSettings->SetSizer( bSizer2561 ); + m_panelComparisonSettings->Layout(); + bSizer2561->Fit( m_panelComparisonSettings ); + bSizer275->Add( m_panelComparisonSettings, 1, wxEXPAND, 5 ); - m_panelCompSettingsTab->SetSizer( bSizer275 ); - m_panelCompSettingsTab->Layout(); - bSizer275->Fit( m_panelCompSettingsTab ); - m_notebook->AddPage( m_panelCompSettingsTab, _("dummy"), false ); - m_panelFilterSettingsTab = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelFilterSettingsTab->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panelCompSettingsTab->SetSizer( bSizer275 ); + m_panelCompSettingsTab->Layout(); + bSizer275->Fit( m_panelCompSettingsTab ); + m_notebook->AddPage( m_panelCompSettingsTab, _("dummy"), true ); + m_panelFilterSettingsTab = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelFilterSettingsTab->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer278; - bSizer278 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer278; + bSizer278 = new wxBoxSizer( wxVERTICAL ); - bSizerHeaderFilterSettings = new wxBoxSizer( wxVERTICAL ); + bSizerHeaderFilterSettings = new wxBoxSizer( wxVERTICAL ); - m_staticTextMainFilterSettings = new wxStaticText( m_panelFilterSettingsTab, wxID_ANY, _("Main settings:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextMainFilterSettings->Wrap( -1 ); - bSizerHeaderFilterSettings->Add( m_staticTextMainFilterSettings, 0, wxALL, 10 ); + m_staticTextMainFilterSettings = new wxStaticText( m_panelFilterSettingsTab, wxID_ANY, _("Main settings:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextMainFilterSettings->Wrap( -1 ); + bSizerHeaderFilterSettings->Add( m_staticTextMainFilterSettings, 0, wxALL, 10 ); - m_staticTextLocalFilterSettings = new wxStaticText( m_panelFilterSettingsTab, wxID_ANY, _("Local settings:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextLocalFilterSettings->Wrap( -1 ); - bSizerHeaderFilterSettings->Add( m_staticTextLocalFilterSettings, 0, wxALL, 10 ); + m_staticTextLocalFilterSettings = new wxStaticText( m_panelFilterSettingsTab, wxID_ANY, _("Local settings:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextLocalFilterSettings->Wrap( -1 ); + bSizerHeaderFilterSettings->Add( m_staticTextLocalFilterSettings, 0, wxALL, 10 ); - m_staticlineFilterHeader = new wxStaticLine( m_panelFilterSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizerHeaderFilterSettings->Add( m_staticlineFilterHeader, 0, wxEXPAND, 5 ); + m_staticlineFilterHeader = new wxStaticLine( m_panelFilterSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerHeaderFilterSettings->Add( m_staticlineFilterHeader, 0, wxEXPAND, 5 ); - bSizer278->Add( bSizerHeaderFilterSettings, 0, wxEXPAND, 5 ); + bSizer278->Add( bSizerHeaderFilterSettings, 0, wxEXPAND, 5 ); - m_panel571 = new wxPanel( m_panelFilterSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel571->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panel571 = new wxPanel( m_panelFilterSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel571->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer307; - bSizer307 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer307; + bSizer307 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer301; - bSizer301 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer301; + bSizer301 = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer166; - bSizer166 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer166; + bSizer166 = new wxBoxSizer( wxVERTICAL ); - bSizer166->Add( 0, 10, 0, 0, 5 ); + bSizer166->Add( 0, 10, 0, 0, 5 ); - wxBoxSizer* bSizer1661; - bSizer1661 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer1661; + bSizer1661 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapInclude = new wxStaticBitmap( m_panel571, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer1661->Add( m_bitmapInclude, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + m_bitmapInclude = new wxStaticBitmap( m_panel571, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer1661->Add( m_bitmapInclude, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - wxBoxSizer* bSizer1731; - bSizer1731 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer1731; + bSizer1731 = new wxBoxSizer( wxVERTICAL ); - m_staticText78 = new wxStaticText( m_panel571, wxID_ANY, _("Include:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText78->Wrap( -1 ); - bSizer1731->Add( m_staticText78, 0, 0, 5 ); + m_staticText78 = new wxStaticText( m_panel571, wxID_ANY, _("Include:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText78->Wrap( -1 ); + bSizer1731->Add( m_staticText78, 0, 0, 5 ); - m_textCtrlInclude = new wxTextCtrl( m_panel571, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxTE_MULTILINE ); - bSizer1731->Add( m_textCtrlInclude, 1, wxEXPAND|wxTOP, 5 ); + m_textCtrlInclude = new wxTextCtrl( m_panel571, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE ); + bSizer1731->Add( m_textCtrlInclude, 1, wxEXPAND|wxTOP, 5 ); - bSizer1661->Add( bSizer1731, 1, wxEXPAND, 5 ); + bSizer1661->Add( bSizer1731, 1, wxEXPAND, 5 ); - bSizer166->Add( bSizer1661, 3, wxEXPAND|wxLEFT, 5 ); + bSizer166->Add( bSizer1661, 3, wxEXPAND|wxLEFT, 5 ); - bSizer166->Add( 0, 10, 0, 0, 5 ); + bSizer166->Add( 0, 10, 0, 0, 5 ); - wxBoxSizer* bSizer1651; - bSizer1651 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer1651; + bSizer1651 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapExclude = new wxStaticBitmap( m_panel571, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer1651->Add( m_bitmapExclude, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + m_bitmapExclude = new wxStaticBitmap( m_panel571, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer1651->Add( m_bitmapExclude, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - wxBoxSizer* bSizer1742; - bSizer1742 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer1742; + bSizer1742 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer189; - bSizer189 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer189; + bSizer189 = new wxBoxSizer( wxHORIZONTAL ); - m_staticText77 = new wxStaticText( m_panel571, wxID_ANY, _("Exclude:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText77->Wrap( -1 ); - bSizer189->Add( m_staticText77, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_staticText77 = new wxStaticText( m_panel571, wxID_ANY, _("Exclude:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText77->Wrap( -1 ); + bSizer189->Add( m_staticText77, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer189->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer189->Add( 0, 0, 1, wxEXPAND, 5 ); - m_hyperlink171 = new wxHyperlinkCtrl( m_panel571, wxID_ANY, _("Show examples"), wxT("https://freefilesync.org/manual.php?topic=exclude-files"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink171->SetToolTip( _("https://freefilesync.org/manual.php?topic=exclude-files") ); + m_hyperlink171 = new wxHyperlinkCtrl( m_panel571, wxID_ANY, _("Show examples"), wxT("https://freefilesync.org/manual.php?topic=exclude-files"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink171->SetToolTip( _("https://freefilesync.org/manual.php?topic=exclude-files") ); - bSizer189->Add( m_hyperlink171, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + bSizer189->Add( m_hyperlink171, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - bSizer1742->Add( bSizer189, 0, wxEXPAND, 5 ); + bSizer1742->Add( bSizer189, 0, wxEXPAND, 5 ); - m_textCtrlExclude = new wxTextCtrl( m_panel571, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxTE_MULTILINE ); - bSizer1742->Add( m_textCtrlExclude, 1, wxEXPAND|wxTOP, 5 ); + m_textCtrlExclude = new wxTextCtrl( m_panel571, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE ); + bSizer1742->Add( m_textCtrlExclude, 1, wxEXPAND|wxTOP, 5 ); - bSizer1651->Add( bSizer1742, 1, wxEXPAND, 5 ); + bSizer1651->Add( bSizer1742, 1, wxEXPAND, 5 ); - bSizer166->Add( bSizer1651, 5, wxEXPAND|wxLEFT, 5 ); + bSizer166->Add( bSizer1651, 5, wxEXPAND|wxLEFT, 5 ); - bSizer301->Add( bSizer166, 1, wxEXPAND, 5 ); + bSizer301->Add( bSizer166, 1, wxEXPAND, 5 ); - m_staticline24 = new wxStaticLine( m_panel571, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer301->Add( m_staticline24, 0, wxEXPAND, 5 ); + m_staticline24 = new wxStaticLine( m_panel571, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer301->Add( m_staticline24, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer160; - bSizer160 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer160; + bSizer160 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer168; - bSizer168 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer168; + bSizer168 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapFilterSize = new wxStaticBitmap( m_panel571, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer168->Add( m_bitmapFilterSize, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + m_bitmapFilterSize = new wxStaticBitmap( m_panel571, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer168->Add( m_bitmapFilterSize, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - wxBoxSizer* bSizer158; - bSizer158 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer158; + bSizer158 = new wxBoxSizer( wxVERTICAL ); - m_staticText80 = new wxStaticText( m_panel571, wxID_ANY, _("File size:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText80->Wrap( -1 ); - bSizer158->Add( m_staticText80, 0, wxBOTTOM, 5 ); + m_staticText80 = new wxStaticText( m_panel571, wxID_ANY, _("File size:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText80->Wrap( -1 ); + bSizer158->Add( m_staticText80, 0, wxBOTTOM, 5 ); - wxBoxSizer* bSizer162; - bSizer162 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer162; + bSizer162 = new wxBoxSizer( wxVERTICAL ); - m_staticText101 = new wxStaticText( m_panel571, wxID_ANY, _("Minimum:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText101->Wrap( -1 ); - bSizer162->Add( m_staticText101, 0, wxBOTTOM, 2 ); + m_staticText101 = new wxStaticText( m_panel571, wxID_ANY, _("Minimum:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText101->Wrap( -1 ); + bSizer162->Add( m_staticText101, 0, wxBOTTOM, 2 ); - m_spinCtrlMinSize = new wxSpinCtrl( m_panel571, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); - bSizer162->Add( m_spinCtrlMinSize, 0, wxEXPAND, 5 ); + m_spinCtrlMinSize = new wxSpinCtrl( m_panel571, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); + bSizer162->Add( m_spinCtrlMinSize, 0, wxEXPAND, 5 ); - wxArrayString m_choiceUnitMinSizeChoices; - m_choiceUnitMinSize = new wxChoice( m_panel571, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMinSizeChoices, 0 ); - m_choiceUnitMinSize->SetSelection( 0 ); - bSizer162->Add( m_choiceUnitMinSize, 0, wxEXPAND, 5 ); + wxArrayString m_choiceUnitMinSizeChoices; + m_choiceUnitMinSize = new wxChoice( m_panel571, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMinSizeChoices, 0 ); + m_choiceUnitMinSize->SetSelection( 0 ); + bSizer162->Add( m_choiceUnitMinSize, 0, wxEXPAND, 5 ); - bSizer158->Add( bSizer162, 0, wxEXPAND, 5 ); + bSizer158->Add( bSizer162, 0, wxEXPAND, 5 ); - bSizer158->Add( 0, 10, 0, 0, 5 ); + bSizer158->Add( 0, 10, 0, 0, 5 ); - wxBoxSizer* bSizer163; - bSizer163 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer163; + bSizer163 = new wxBoxSizer( wxVERTICAL ); - m_staticText102 = new wxStaticText( m_panel571, wxID_ANY, _("Maximum:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText102->Wrap( -1 ); - bSizer163->Add( m_staticText102, 0, wxBOTTOM, 2 ); + m_staticText102 = new wxStaticText( m_panel571, wxID_ANY, _("Maximum:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText102->Wrap( -1 ); + bSizer163->Add( m_staticText102, 0, wxBOTTOM, 2 ); - m_spinCtrlMaxSize = new wxSpinCtrl( m_panel571, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); - bSizer163->Add( m_spinCtrlMaxSize, 0, wxEXPAND, 5 ); + m_spinCtrlMaxSize = new wxSpinCtrl( m_panel571, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); + bSizer163->Add( m_spinCtrlMaxSize, 0, wxEXPAND, 5 ); - wxArrayString m_choiceUnitMaxSizeChoices; - m_choiceUnitMaxSize = new wxChoice( m_panel571, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMaxSizeChoices, 0 ); - m_choiceUnitMaxSize->SetSelection( 0 ); - bSizer163->Add( m_choiceUnitMaxSize, 0, wxEXPAND, 5 ); + wxArrayString m_choiceUnitMaxSizeChoices; + m_choiceUnitMaxSize = new wxChoice( m_panel571, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMaxSizeChoices, 0 ); + m_choiceUnitMaxSize->SetSelection( 0 ); + bSizer163->Add( m_choiceUnitMaxSize, 0, wxEXPAND, 5 ); - bSizer158->Add( bSizer163, 0, wxEXPAND, 5 ); + bSizer158->Add( bSizer163, 0, wxEXPAND, 5 ); - bSizer168->Add( bSizer158, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + bSizer168->Add( bSizer158, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer160->Add( bSizer168, 2, wxEXPAND|wxALL, 5 ); + bSizer160->Add( bSizer168, 2, wxEXPAND|wxALL, 5 ); - m_staticline23 = new wxStaticLine( m_panel571, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer160->Add( m_staticline23, 0, wxEXPAND, 5 ); + m_staticline23 = new wxStaticLine( m_panel571, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer160->Add( m_staticline23, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer167; - bSizer167 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer167; + bSizer167 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapFilterDate = new wxStaticBitmap( m_panel571, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer167->Add( m_bitmapFilterDate, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + m_bitmapFilterDate = new wxStaticBitmap( m_panel571, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer167->Add( m_bitmapFilterDate, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - wxBoxSizer* bSizer165; - bSizer165 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer165; + bSizer165 = new wxBoxSizer( wxVERTICAL ); - m_staticText79 = new wxStaticText( m_panel571, wxID_ANY, _("Time span:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText79->Wrap( -1 ); - bSizer165->Add( m_staticText79, 0, wxBOTTOM, 5 ); + m_staticText79 = new wxStaticText( m_panel571, wxID_ANY, _("Time span:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText79->Wrap( -1 ); + bSizer165->Add( m_staticText79, 0, wxBOTTOM, 5 ); - wxArrayString m_choiceUnitTimespanChoices; - m_choiceUnitTimespan = new wxChoice( m_panel571, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitTimespanChoices, 0 ); - m_choiceUnitTimespan->SetSelection( 0 ); - bSizer165->Add( m_choiceUnitTimespan, 0, wxEXPAND, 5 ); + wxArrayString m_choiceUnitTimespanChoices; + m_choiceUnitTimespan = new wxChoice( m_panel571, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitTimespanChoices, 0 ); + m_choiceUnitTimespan->SetSelection( 0 ); + bSizer165->Add( m_choiceUnitTimespan, 0, wxEXPAND, 5 ); - m_spinCtrlTimespan = new wxSpinCtrl( m_panel571, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); - bSizer165->Add( m_spinCtrlTimespan, 0, wxEXPAND, 5 ); + m_spinCtrlTimespan = new wxSpinCtrl( m_panel571, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); + bSizer165->Add( m_spinCtrlTimespan, 0, wxEXPAND, 5 ); - bSizer167->Add( bSizer165, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + bSizer167->Add( bSizer165, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer160->Add( bSizer167, 1, wxEXPAND|wxALL, 5 ); + bSizer160->Add( bSizer167, 1, wxEXPAND|wxALL, 5 ); - m_staticline231 = new wxStaticLine( m_panel571, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer160->Add( m_staticline231, 0, wxEXPAND, 5 ); + m_staticline231 = new wxStaticLine( m_panel571, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer160->Add( m_staticline231, 0, wxEXPAND, 5 ); - bSizer301->Add( bSizer160, 0, wxEXPAND, 5 ); + bSizer301->Add( bSizer160, 0, wxEXPAND, 5 ); - bSizer307->Add( bSizer301, 1, wxEXPAND, 5 ); + bSizer307->Add( bSizer301, 1, wxEXPAND, 5 ); - wxBoxSizer* bSizer302; - bSizer302 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer302; + bSizer302 = new wxBoxSizer( wxHORIZONTAL ); - m_staticTextFilterDescr = new wxStaticText( m_panel571, wxID_ANY, _("Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair."), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_staticTextFilterDescr->Wrap( -1 ); - m_staticTextFilterDescr->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticTextFilterDescr = new wxStaticText( m_panel571, wxID_ANY, _("Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair."), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_staticTextFilterDescr->Wrap( -1 ); + m_staticTextFilterDescr->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer302->Add( m_staticTextFilterDescr, 1, wxALL|wxALIGN_CENTER_VERTICAL, 10 ); + bSizer302->Add( m_staticTextFilterDescr, 1, wxALL|wxALIGN_CENTER_VERTICAL, 10 ); - wxBoxSizer* bSizer303; - bSizer303 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer303; + bSizer303 = new wxBoxSizer( wxHORIZONTAL ); - m_buttonDefault = new wxButton( m_panel571, wxID_ANY, _("&Default"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer303->Add( m_buttonDefault, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_buttonDefault = new wxButton( m_panel571, wxID_ANY, _("&Default"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer303->Add( m_buttonDefault, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_bpButtonDefaultContext = new wxBitmapButton( m_panel571, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizer303->Add( m_bpButtonDefaultContext, 0, wxEXPAND, 5 ); + m_bpButtonDefaultContext = new wxBitmapButton( m_panel571, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizer303->Add( m_bpButtonDefaultContext, 0, wxEXPAND, 5 ); - bSizer302->Add( bSizer303, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 10 ); + bSizer302->Add( bSizer303, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 10 ); - m_buttonClear = new wxButton( m_panel571, wxID_ANY, _("C&lear"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer302->Add( m_buttonClear, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 ); + m_buttonClear = new wxButton( m_panel571, wxID_ANY, _("C&lear"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer302->Add( m_buttonClear, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 ); - bSizer307->Add( bSizer302, 0, wxEXPAND, 5 ); + bSizer307->Add( bSizer302, 0, wxEXPAND, 5 ); - m_panel571->SetSizer( bSizer307 ); - m_panel571->Layout(); - bSizer307->Fit( m_panel571 ); - bSizer278->Add( m_panel571, 1, wxEXPAND, 5 ); + m_panel571->SetSizer( bSizer307 ); + m_panel571->Layout(); + bSizer307->Fit( m_panel571 ); + bSizer278->Add( m_panel571, 1, wxEXPAND, 5 ); - m_panelFilterSettingsTab->SetSizer( bSizer278 ); - m_panelFilterSettingsTab->Layout(); - bSizer278->Fit( m_panelFilterSettingsTab ); - m_notebook->AddPage( m_panelFilterSettingsTab, _("dummy"), false ); - m_panelSyncSettingsTab = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelSyncSettingsTab->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panelFilterSettingsTab->SetSizer( bSizer278 ); + m_panelFilterSettingsTab->Layout(); + bSizer278->Fit( m_panelFilterSettingsTab ); + m_notebook->AddPage( m_panelFilterSettingsTab, _("dummy"), false ); + m_panelSyncSettingsTab = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelSyncSettingsTab->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer276; - bSizer276 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer276; + bSizer276 = new wxBoxSizer( wxVERTICAL ); - bSizerHeaderSyncSettings = new wxBoxSizer( wxVERTICAL ); + bSizerHeaderSyncSettings = new wxBoxSizer( wxVERTICAL ); - m_staticTextMainSyncSettings = new wxStaticText( m_panelSyncSettingsTab, wxID_ANY, _("Main settings:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextMainSyncSettings->Wrap( -1 ); - bSizerHeaderSyncSettings->Add( m_staticTextMainSyncSettings, 0, wxALL, 10 ); + m_staticTextMainSyncSettings = new wxStaticText( m_panelSyncSettingsTab, wxID_ANY, _("Main settings:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextMainSyncSettings->Wrap( -1 ); + bSizerHeaderSyncSettings->Add( m_staticTextMainSyncSettings, 0, wxALL, 10 ); - m_checkBoxUseLocalSyncOptions = new wxCheckBox( m_panelSyncSettingsTab, wxID_ANY, _("Use local settings:"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizerHeaderSyncSettings->Add( m_checkBoxUseLocalSyncOptions, 0, wxALL|wxEXPAND, 10 ); + m_checkBoxUseLocalSyncOptions = new wxCheckBox( m_panelSyncSettingsTab, wxID_ANY, _("Use local settings:"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizerHeaderSyncSettings->Add( m_checkBoxUseLocalSyncOptions, 0, wxALL|wxEXPAND, 10 ); - m_staticlineSyncHeader = new wxStaticLine( m_panelSyncSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizerHeaderSyncSettings->Add( m_staticlineSyncHeader, 0, wxEXPAND, 5 ); + m_staticlineSyncHeader = new wxStaticLine( m_panelSyncSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerHeaderSyncSettings->Add( m_staticlineSyncHeader, 0, wxEXPAND, 5 ); - bSizer276->Add( bSizerHeaderSyncSettings, 0, wxEXPAND, 5 ); + bSizer276->Add( bSizerHeaderSyncSettings, 0, wxEXPAND, 5 ); - m_panelSyncSettings = new wxPanel( m_panelSyncSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelSyncSettings->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panelSyncSettings = new wxPanel( m_panelSyncSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelSyncSettings->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer232; - bSizer232 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer232; + bSizer232 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer237; - bSizer237 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer237; + bSizer237 = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer235; - bSizer235 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer235; + bSizer235 = new wxBoxSizer( wxVERTICAL ); - m_staticText86 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Select a variant:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText86->Wrap( -1 ); - bSizer235->Add( m_staticText86, 0, wxALL, 5 ); + m_staticText86 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Select a variant:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText86->Wrap( -1 ); + bSizer235->Add( m_staticText86, 0, wxALL, 5 ); - wxGridSizer* gSizer1; - gSizer1 = new wxGridSizer( 0, 1, 0, 0 ); + wxGridSizer* gSizer1; + gSizer1 = new wxGridSizer( 0, 1, 0, 0 ); - m_buttonTwoWay = new zen::ToggleButton( m_panelSyncSettings, wxID_ANY, _("Two way"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonTwoWay = new zen::ToggleButton( m_panelSyncSettings, wxID_ANY, _("Two way"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonTwoWay->SetDefault(); - m_buttonTwoWay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - m_buttonTwoWay->SetToolTip( _("dummy") ); + m_buttonTwoWay->SetDefault(); + m_buttonTwoWay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonTwoWay->SetToolTip( _("dummy") ); - gSizer1->Add( m_buttonTwoWay, 0, wxEXPAND, 5 ); + gSizer1->Add( m_buttonTwoWay, 0, wxEXPAND, 5 ); - m_buttonMirror = new zen::ToggleButton( m_panelSyncSettings, wxID_ANY, _("Mirror"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonMirror = new zen::ToggleButton( m_panelSyncSettings, wxID_ANY, _("Mirror"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonMirror->SetDefault(); - m_buttonMirror->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - m_buttonMirror->SetToolTip( _("dummy") ); + m_buttonMirror->SetDefault(); + m_buttonMirror->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonMirror->SetToolTip( _("dummy") ); - gSizer1->Add( m_buttonMirror, 0, wxEXPAND, 5 ); + gSizer1->Add( m_buttonMirror, 0, wxEXPAND, 5 ); - m_buttonUpdate = new zen::ToggleButton( m_panelSyncSettings, wxID_ANY, _("Update"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonUpdate = new zen::ToggleButton( m_panelSyncSettings, wxID_ANY, _("Update"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonUpdate->SetDefault(); - m_buttonUpdate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - m_buttonUpdate->SetToolTip( _("dummy") ); + m_buttonUpdate->SetDefault(); + m_buttonUpdate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonUpdate->SetToolTip( _("dummy") ); - gSizer1->Add( m_buttonUpdate, 0, wxEXPAND, 5 ); + gSizer1->Add( m_buttonUpdate, 0, wxEXPAND, 5 ); - m_buttonCustom = new zen::ToggleButton( m_panelSyncSettings, wxID_ANY, _("Custom"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonCustom = new zen::ToggleButton( m_panelSyncSettings, wxID_ANY, _("Custom"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonCustom->SetDefault(); - m_buttonCustom->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - m_buttonCustom->SetToolTip( _("dummy") ); + m_buttonCustom->SetDefault(); + m_buttonCustom->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonCustom->SetToolTip( _("dummy") ); - gSizer1->Add( m_buttonCustom, 0, wxEXPAND, 5 ); + gSizer1->Add( m_buttonCustom, 0, wxEXPAND, 5 ); - bSizer235->Add( gSizer1, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + bSizer235->Add( gSizer1, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - bSizer237->Add( bSizer235, 0, wxALL, 5 ); + bSizer237->Add( bSizer235, 0, wxALL, 5 ); - bSizer237->Add( 10, 0, 0, 0, 5 ); + bSizer237->Add( 10, 0, 0, 0, 5 ); - wxBoxSizer* bSizer238; - bSizer238 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer238; + bSizer238 = new wxBoxSizer( wxVERTICAL ); - bSizer238->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer238->Add( 0, 0, 1, wxEXPAND, 5 ); - bSizerSyncDirHolder = new wxBoxSizer( wxHORIZONTAL ); + bSizerSyncDirHolder = new wxBoxSizer( wxHORIZONTAL ); - bSizerSyncDirections = new wxBoxSizer( wxVERTICAL ); + bSizerSyncDirections = new wxBoxSizer( wxVERTICAL ); - m_staticText184 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Difference"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText184->Wrap( -1 ); - bSizerSyncDirections->Add( m_staticText184, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + m_staticText184 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Difference"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText184->Wrap( -1 ); + bSizerSyncDirections->Add( m_staticText184, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - ffgSizer11 = new wxFlexGridSizer( 2, 0, 5, 5 ); - ffgSizer11->SetFlexibleDirection( wxBOTH ); - ffgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + ffgSizer11 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer11->SetFlexibleDirection( wxBOTH ); + ffgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_bitmapLeftOnly = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_bitmapLeftOnly->SetToolTip( _("Item exists on left side only") ); + m_bitmapLeftOnly = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_bitmapLeftOnly->SetToolTip( _("Item exists on left side only") ); - ffgSizer11->Add( m_bitmapLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + ffgSizer11->Add( m_bitmapLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bitmapLeftNewer = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_bitmapLeftNewer->SetToolTip( _("Left side is newer") ); + m_bitmapLeftNewer = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_bitmapLeftNewer->SetToolTip( _("Left side is newer") ); - ffgSizer11->Add( m_bitmapLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + ffgSizer11->Add( m_bitmapLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bitmapDifferent = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_bitmapDifferent->SetToolTip( _("Items have different content") ); + m_bitmapDifferent = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_bitmapDifferent->SetToolTip( _("Items have different content") ); - ffgSizer11->Add( m_bitmapDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + ffgSizer11->Add( m_bitmapDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bitmapConflict = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_bitmapConflict->SetToolTip( _("Conflict/item cannot be categorized") ); + m_bitmapConflict = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_bitmapConflict->SetToolTip( _("Conflict/item cannot be categorized") ); - ffgSizer11->Add( m_bitmapConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + ffgSizer11->Add( m_bitmapConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bitmapRightNewer = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_bitmapRightNewer->SetToolTip( _("Right side is newer") ); + m_bitmapRightNewer = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_bitmapRightNewer->SetToolTip( _("Right side is newer") ); - ffgSizer11->Add( m_bitmapRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + ffgSizer11->Add( m_bitmapRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bitmapRightOnly = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_bitmapRightOnly->SetToolTip( _("Item exists on right side only") ); + m_bitmapRightOnly = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_bitmapRightOnly->SetToolTip( _("Item exists on right side only") ); - ffgSizer11->Add( m_bitmapRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + ffgSizer11->Add( m_bitmapRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bpButtonLeftOnly = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - ffgSizer11->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + m_bpButtonLeftOnly = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + ffgSizer11->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bpButtonLeftNewer = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - ffgSizer11->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + m_bpButtonLeftNewer = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + ffgSizer11->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bpButtonDifferent = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - ffgSizer11->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + m_bpButtonDifferent = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + ffgSizer11->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bpButtonConflict = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - ffgSizer11->Add( m_bpButtonConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + m_bpButtonConflict = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + ffgSizer11->Add( m_bpButtonConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bpButtonRightNewer = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - ffgSizer11->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + m_bpButtonRightNewer = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + ffgSizer11->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bpButtonRightOnly = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - ffgSizer11->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + m_bpButtonRightOnly = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + ffgSizer11->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizerSyncDirections->Add( ffgSizer11, 0, 0, 5 ); + bSizerSyncDirections->Add( ffgSizer11, 0, 0, 5 ); - m_staticText120 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText120->Wrap( -1 ); - bSizerSyncDirections->Add( m_staticText120, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 ); + m_staticText120 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText120->Wrap( -1 ); + bSizerSyncDirections->Add( m_staticText120, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 ); - bSizerSyncDirHolder->Add( bSizerSyncDirections, 0, 0, 5 ); + bSizerSyncDirHolder->Add( bSizerSyncDirections, 0, 0, 5 ); - bSizerDatabase = new wxBoxSizer( wxVERTICAL ); + bSizerDatabase = new wxBoxSizer( wxVERTICAL ); - m_bitmapDatabase = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizerDatabase->Add( m_bitmapDatabase, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + m_bitmapDatabase = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerDatabase->Add( m_bitmapDatabase, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizerDatabase->Add( 0, 3, 0, 0, 5 ); + bSizerDatabase->Add( 0, 3, 0, 0, 5 ); - m_staticText145 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("sync.ffs_db"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText145->Wrap( -1 ); - m_staticText145->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_ITALIC, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) ); - m_staticText145->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText145 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("sync.ffs_db"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText145->Wrap( -1 ); + m_staticText145->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_ITALIC, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) ); + m_staticText145->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizerDatabase->Add( m_staticText145, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + bSizerDatabase->Add( m_staticText145, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizerSyncDirHolder->Add( bSizerDatabase, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + bSizerSyncDirHolder->Add( bSizerDatabase, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextSyncVarDescription = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_staticTextSyncVarDescription->Wrap( -1 ); - m_staticTextSyncVarDescription->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticTextSyncVarDescription = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_staticTextSyncVarDescription->Wrap( -1 ); + m_staticTextSyncVarDescription->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizerSyncDirHolder->Add( m_staticTextSyncVarDescription, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 ); + bSizerSyncDirHolder->Add( m_staticTextSyncVarDescription, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 ); - bSizer238->Add( bSizerSyncDirHolder, 0, wxTOP|wxBOTTOM|wxRIGHT, 10 ); + bSizer238->Add( bSizerSyncDirHolder, 0, wxTOP|wxBOTTOM|wxRIGHT, 10 ); - bSizer238->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer238->Add( 0, 0, 1, wxEXPAND, 5 ); - m_staticline431 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer238->Add( m_staticline431, 0, wxEXPAND, 5 ); + m_staticline431 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer238->Add( m_staticline431, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer201; - bSizer201 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer201; + bSizer201 = new wxBoxSizer( wxHORIZONTAL ); - m_staticline72 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer201->Add( m_staticline72, 0, wxEXPAND, 5 ); + m_staticline72 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer201->Add( m_staticline72, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer249; - bSizer249 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer249; + bSizer249 = new wxBoxSizer( wxHORIZONTAL ); - m_checkBoxDetectMove = new wxCheckBox( m_panelSyncSettings, wxID_ANY, _("Detect moved files"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxDetectMove->SetToolTip( _("- Not supported by all file systems\n- Requires and creates database files\n- Detection not available for first sync") ); + m_checkBoxDetectMove = new wxCheckBox( m_panelSyncSettings, wxID_ANY, _("Detect moved files"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxDetectMove->SetToolTip( _("- Not supported by all file systems\n- Requires and creates database files\n- Detection not available for first sync") ); - bSizer249->Add( m_checkBoxDetectMove, 0, wxALL|wxEXPAND, 5 ); + bSizer249->Add( m_checkBoxDetectMove, 0, wxALL|wxEXPAND, 5 ); - m_hyperlink242 = new wxHyperlinkCtrl( m_panelSyncSettings, wxID_ANY, _("More information"), wxT("https://freefilesync.org/manual.php?topic=synchronization-settings"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink242->SetToolTip( _("https://freefilesync.org/manual.php?topic=synchronization-settings") ); + m_hyperlink242 = new wxHyperlinkCtrl( m_panelSyncSettings, wxID_ANY, _("More information"), wxT("https://freefilesync.org/manual.php?topic=synchronization-settings"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink242->SetToolTip( _("https://freefilesync.org/manual.php?topic=synchronization-settings") ); - bSizer249->Add( m_hyperlink242, 0, wxTOP|wxBOTTOM|wxRIGHT, 5 ); + bSizer249->Add( m_hyperlink242, 0, wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer201->Add( bSizer249, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer201->Add( bSizer249, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer238->Add( bSizer201, 0, 0, 5 ); + bSizer238->Add( bSizer201, 0, 0, 5 ); - bSizer237->Add( bSizer238, 1, wxEXPAND, 5 ); + bSizer237->Add( bSizer238, 1, wxEXPAND, 5 ); - bSizer232->Add( bSizer237, 0, wxEXPAND, 5 ); + bSizer232->Add( bSizer237, 0, wxEXPAND, 5 ); - m_staticline54 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer232->Add( m_staticline54, 0, wxEXPAND, 5 ); + m_staticline54 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer232->Add( m_staticline54, 0, wxEXPAND, 5 ); - bSizer2361 = new wxBoxSizer( wxHORIZONTAL ); + bSizer2361 = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer202; - bSizer202 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer202; + bSizer202 = new wxBoxSizer( wxVERTICAL ); - m_staticText87 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Delete and overwrite:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText87->Wrap( -1 ); - bSizer202->Add( m_staticText87, 0, wxALL, 5 ); + m_staticText87 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Delete and overwrite:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText87->Wrap( -1 ); + bSizer202->Add( m_staticText87, 0, wxALL, 5 ); - wxBoxSizer* bSizer234; - bSizer234 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer234; + bSizer234 = new wxBoxSizer( wxVERTICAL ); - m_buttonRecycler = new zen::ToggleButton( m_panelSyncSettings, wxID_ANY, _("&Recycle bin"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonRecycler = new zen::ToggleButton( m_panelSyncSettings, wxID_ANY, _("&Recycle bin"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonRecycler->SetDefault(); - m_buttonRecycler->SetToolTip( _("dummy") ); + m_buttonRecycler->SetDefault(); + m_buttonRecycler->SetToolTip( _("dummy") ); - bSizer234->Add( m_buttonRecycler, 0, wxEXPAND, 5 ); + bSizer234->Add( m_buttonRecycler, 0, wxEXPAND, 5 ); - m_buttonPermanent = new zen::ToggleButton( m_panelSyncSettings, wxID_ANY, _("&Permanent"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonPermanent = new zen::ToggleButton( m_panelSyncSettings, wxID_ANY, _("&Permanent"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonPermanent->SetDefault(); - m_buttonPermanent->SetToolTip( _("dummy") ); + m_buttonPermanent->SetDefault(); + m_buttonPermanent->SetToolTip( _("dummy") ); - bSizer234->Add( m_buttonPermanent, 0, wxEXPAND, 5 ); + bSizer234->Add( m_buttonPermanent, 0, wxEXPAND, 5 ); - m_buttonVersioning = new zen::ToggleButton( m_panelSyncSettings, wxID_ANY, _("&Versioning"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonVersioning = new zen::ToggleButton( m_panelSyncSettings, wxID_ANY, _("&Versioning"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonVersioning->SetDefault(); - m_buttonVersioning->SetToolTip( _("dummy") ); + m_buttonVersioning->SetDefault(); + m_buttonVersioning->SetToolTip( _("dummy") ); - bSizer234->Add( m_buttonVersioning, 0, wxEXPAND, 5 ); + bSizer234->Add( m_buttonVersioning, 0, wxEXPAND, 5 ); - bSizer202->Add( bSizer234, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + bSizer202->Add( bSizer234, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - bSizer2361->Add( bSizer202, 0, wxALL, 5 ); + bSizer2361->Add( bSizer202, 0, wxALL, 5 ); - bSizerVersioningHolder = new wxBoxSizer( wxVERTICAL ); + bSizerVersioningHolder = new wxBoxSizer( wxVERTICAL ); - bSizerVersioningHolder->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizerVersioningHolder->Add( 0, 0, 1, wxEXPAND, 5 ); - wxBoxSizer* bSizer2331; - bSizer2331 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer2331; + bSizer2331 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapDeletionType = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer2331->Add( m_bitmapDeletionType, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + m_bitmapDeletionType = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer2331->Add( m_bitmapDeletionType, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_staticTextDeletionTypeDescription = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDeletionTypeDescription->Wrap( -1 ); - m_staticTextDeletionTypeDescription->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticTextDeletionTypeDescription = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDeletionTypeDescription->Wrap( -1 ); + m_staticTextDeletionTypeDescription->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer2331->Add( m_staticTextDeletionTypeDescription, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + bSizer2331->Add( m_staticTextDeletionTypeDescription, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - bSizerVersioningHolder->Add( bSizer2331, 0, wxALL|wxEXPAND, 5 ); + bSizerVersioningHolder->Add( bSizer2331, 0, wxALL|wxEXPAND, 5 ); - m_panelVersioning = new wxPanel( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelVersioning->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panelVersioning = new wxPanel( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelVersioning->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer191; - bSizer191 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer191; + bSizer191 = new wxBoxSizer( wxVERTICAL ); - bSizer191->Add( 0, 5, 0, 0, 5 ); + bSizer191->Add( 0, 5, 0, 0, 5 ); - wxBoxSizer* bSizer252; - bSizer252 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer252; + bSizer252 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapVersioning = new wxStaticBitmap( m_panelVersioning, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer252->Add( m_bitmapVersioning, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + m_bitmapVersioning = new wxStaticBitmap( m_panelVersioning, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer252->Add( m_bitmapVersioning, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - wxBoxSizer* bSizer253; - bSizer253 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer253; + bSizer253 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer254; - bSizer254 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer254; + bSizer254 = new wxBoxSizer( wxHORIZONTAL ); - m_staticText155 = new wxStaticText( m_panelVersioning, wxID_ANY, _("Move files to a user-defined folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText155->Wrap( -1 ); - m_staticText155->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText155 = new wxStaticText( m_panelVersioning, wxID_ANY, _("Move files to a user-defined folder"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText155->Wrap( -1 ); + m_staticText155->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer254->Add( m_staticText155, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + bSizer254->Add( m_staticText155, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - bSizer254->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer254->Add( 0, 0, 1, wxEXPAND, 5 ); - m_hyperlink243 = new wxHyperlinkCtrl( m_panelVersioning, wxID_ANY, _("Show examples"), wxT("https://freefilesync.org/manual.php?topic=versioning"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink243->SetToolTip( _("https://freefilesync.org/manual.php?topic=versioning") ); + m_hyperlink243 = new wxHyperlinkCtrl( m_panelVersioning, wxID_ANY, _("Show examples"), wxT("https://freefilesync.org/manual.php?topic=versioning"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink243->SetToolTip( _("https://freefilesync.org/manual.php?topic=versioning") ); - bSizer254->Add( m_hyperlink243, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + bSizer254->Add( m_hyperlink243, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); - bSizer253->Add( bSizer254, 0, wxEXPAND|wxBOTTOM, 5 ); + bSizer253->Add( bSizer254, 0, wxEXPAND|wxBOTTOM, 5 ); - wxBoxSizer* bSizer156; - bSizer156 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer156; + bSizer156 = new wxBoxSizer( wxHORIZONTAL ); - m_versioningFolderPath = new fff::FolderHistoryBox( m_panelVersioning, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer156->Add( m_versioningFolderPath, 1, wxALIGN_CENTER_VERTICAL, 5 ); + m_versioningFolderPath = new fff::FolderHistoryBox( m_panelVersioning, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer156->Add( m_versioningFolderPath, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_buttonSelectVersioningFolder = new wxButton( m_panelVersioning, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectVersioningFolder->SetToolTip( _("Select a folder") ); + m_buttonSelectVersioningFolder = new wxButton( m_panelVersioning, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectVersioningFolder->SetToolTip( _("Select a folder") ); - bSizer156->Add( m_buttonSelectVersioningFolder, 0, wxEXPAND, 5 ); + bSizer156->Add( m_buttonSelectVersioningFolder, 0, wxEXPAND, 5 ); - m_bpButtonSelectVersioningAltFolder = new wxBitmapButton( m_panelVersioning, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonSelectVersioningAltFolder->SetToolTip( _("Access online storage") ); + m_bpButtonSelectVersioningAltFolder = new wxBitmapButton( m_panelVersioning, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonSelectVersioningAltFolder->SetToolTip( _("Access online storage") ); - bSizer156->Add( m_bpButtonSelectVersioningAltFolder, 0, wxEXPAND, 5 ); + bSizer156->Add( m_bpButtonSelectVersioningAltFolder, 0, wxEXPAND, 5 ); - bSizer253->Add( bSizer156, 0, wxEXPAND, 5 ); + bSizer253->Add( bSizer156, 0, wxEXPAND, 5 ); - bSizer252->Add( bSizer253, 1, wxRIGHT, 5 ); + bSizer252->Add( bSizer253, 1, wxRIGHT, 5 ); - bSizer191->Add( bSizer252, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); + bSizer191->Add( bSizer252, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); - wxBoxSizer* bSizer198; - bSizer198 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer198; + bSizer198 = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer255; - bSizer255 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer255; + bSizer255 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer256; - bSizer256 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer256; + bSizer256 = new wxBoxSizer( wxHORIZONTAL ); - m_staticText93 = new wxStaticText( m_panelVersioning, wxID_ANY, _("Naming convention:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText93->Wrap( -1 ); - bSizer256->Add( m_staticText93, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_staticText93 = new wxStaticText( m_panelVersioning, wxID_ANY, _("Naming convention:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText93->Wrap( -1 ); + bSizer256->Add( m_staticText93, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - wxArrayString m_choiceVersioningStyleChoices; - m_choiceVersioningStyle = new wxChoice( m_panelVersioning, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceVersioningStyleChoices, 0 ); - m_choiceVersioningStyle->SetSelection( 0 ); - bSizer256->Add( m_choiceVersioningStyle, 0, wxALIGN_CENTER_VERTICAL, 5 ); + wxArrayString m_choiceVersioningStyleChoices; + m_choiceVersioningStyle = new wxChoice( m_panelVersioning, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceVersioningStyleChoices, 0 ); + m_choiceVersioningStyle->SetSelection( 0 ); + bSizer256->Add( m_choiceVersioningStyle, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer255->Add( bSizer256, 0, wxALL, 5 ); + bSizer255->Add( bSizer256, 0, wxALL, 5 ); - wxBoxSizer* bSizer257; - bSizer257 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer257; + bSizer257 = new wxBoxSizer( wxHORIZONTAL ); - m_staticTextNamingCvtPart1 = new wxStaticText( m_panelVersioning, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextNamingCvtPart1->Wrap( -1 ); - m_staticTextNamingCvtPart1->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticTextNamingCvtPart1 = new wxStaticText( m_panelVersioning, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextNamingCvtPart1->Wrap( -1 ); + m_staticTextNamingCvtPart1->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer257->Add( m_staticTextNamingCvtPart1, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer257->Add( m_staticTextNamingCvtPart1, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextNamingCvtPart2Bold = new wxStaticText( m_panelVersioning, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextNamingCvtPart2Bold->Wrap( -1 ); - m_staticTextNamingCvtPart2Bold->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - m_staticTextNamingCvtPart2Bold->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticTextNamingCvtPart2Bold = new wxStaticText( m_panelVersioning, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextNamingCvtPart2Bold->Wrap( -1 ); + m_staticTextNamingCvtPart2Bold->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_staticTextNamingCvtPart2Bold->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer257->Add( m_staticTextNamingCvtPart2Bold, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer257->Add( m_staticTextNamingCvtPart2Bold, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextNamingCvtPart3 = new wxStaticText( m_panelVersioning, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextNamingCvtPart3->Wrap( -1 ); - m_staticTextNamingCvtPart3->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticTextNamingCvtPart3 = new wxStaticText( m_panelVersioning, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextNamingCvtPart3->Wrap( -1 ); + m_staticTextNamingCvtPart3->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer257->Add( m_staticTextNamingCvtPart3, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer257->Add( m_staticTextNamingCvtPart3, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer255->Add( bSizer257, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + bSizer255->Add( bSizer257, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - bSizer198->Add( bSizer255, 0, wxALL, 5 ); + bSizer198->Add( bSizer255, 0, wxALL, 5 ); - m_staticline69 = new wxStaticLine( m_panelVersioning, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer198->Add( m_staticline69, 0, wxEXPAND, 5 ); + m_staticline69 = new wxStaticLine( m_panelVersioning, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer198->Add( m_staticline69, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer258; - bSizer258 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer258; + bSizer258 = new wxBoxSizer( wxVERTICAL ); - m_staticTextLimitVersions = new wxStaticText( m_panelVersioning, wxID_ANY, _("Limit file versions:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextLimitVersions->Wrap( -1 ); - bSizer258->Add( m_staticTextLimitVersions, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + m_staticTextLimitVersions = new wxStaticText( m_panelVersioning, wxID_ANY, _("Limit file versions:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextLimitVersions->Wrap( -1 ); + bSizer258->Add( m_staticTextLimitVersions, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - fgSizer15 = new wxFlexGridSizer( 0, 3, 5, 10 ); - fgSizer15->SetFlexibleDirection( wxBOTH ); - fgSizer15->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + fgSizer15 = new wxFlexGridSizer( 0, 3, 5, 10 ); + fgSizer15->SetFlexibleDirection( wxBOTH ); + fgSizer15->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_checkBoxVersionMaxDays = new wxCheckBox( m_panelVersioning, wxID_ANY, _("Last x days:"), wxDefaultPosition, wxDefaultSize, 0 ); - fgSizer15->Add( m_checkBoxVersionMaxDays, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_checkBoxVersionMaxDays = new wxCheckBox( m_panelVersioning, wxID_ANY, _("Last x days:"), wxDefaultPosition, wxDefaultSize, 0 ); + fgSizer15->Add( m_checkBoxVersionMaxDays, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_checkBoxVersionCountMin = new wxCheckBox( m_panelVersioning, wxID_ANY, _("Minimum:"), wxDefaultPosition, wxDefaultSize, 0 ); - fgSizer15->Add( m_checkBoxVersionCountMin, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_checkBoxVersionCountMin = new wxCheckBox( m_panelVersioning, wxID_ANY, _("Minimum:"), wxDefaultPosition, wxDefaultSize, 0 ); + fgSizer15->Add( m_checkBoxVersionCountMin, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_checkBoxVersionCountMax = new wxCheckBox( m_panelVersioning, wxID_ANY, _("Maximum:"), wxDefaultPosition, wxDefaultSize, 0 ); - fgSizer15->Add( m_checkBoxVersionCountMax, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_checkBoxVersionCountMax = new wxCheckBox( m_panelVersioning, wxID_ANY, _("Maximum:"), wxDefaultPosition, wxDefaultSize, 0 ); + fgSizer15->Add( m_checkBoxVersionCountMax, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_spinCtrlVersionMaxDays = new wxSpinCtrl( m_panelVersioning, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); - fgSizer15->Add( m_spinCtrlVersionMaxDays, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_spinCtrlVersionMaxDays = new wxSpinCtrl( m_panelVersioning, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); + fgSizer15->Add( m_spinCtrlVersionMaxDays, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_spinCtrlVersionCountMin = new wxSpinCtrl( m_panelVersioning, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); - fgSizer15->Add( m_spinCtrlVersionCountMin, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_spinCtrlVersionCountMin = new wxSpinCtrl( m_panelVersioning, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); + fgSizer15->Add( m_spinCtrlVersionCountMin, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_spinCtrlVersionCountMax = new wxSpinCtrl( m_panelVersioning, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 2000000000, 1 ); - fgSizer15->Add( m_spinCtrlVersionCountMax, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_spinCtrlVersionCountMax = new wxSpinCtrl( m_panelVersioning, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 2000000000, 1 ); + fgSizer15->Add( m_spinCtrlVersionCountMax, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer258->Add( fgSizer15, 0, wxALL, 5 ); + bSizer258->Add( fgSizer15, 0, wxALL, 5 ); - bSizer198->Add( bSizer258, 0, wxALL, 5 ); + bSizer198->Add( bSizer258, 0, wxALL, 5 ); - bSizer191->Add( bSizer198, 0, wxEXPAND, 5 ); + bSizer191->Add( bSizer198, 0, wxEXPAND, 5 ); - m_panelVersioning->SetSizer( bSizer191 ); - m_panelVersioning->Layout(); - bSizer191->Fit( m_panelVersioning ); - bSizerVersioningHolder->Add( m_panelVersioning, 0, wxEXPAND, 5 ); + m_panelVersioning->SetSizer( bSizer191 ); + m_panelVersioning->Layout(); + bSizer191->Fit( m_panelVersioning ); + bSizerVersioningHolder->Add( m_panelVersioning, 0, wxEXPAND, 5 ); - bSizerVersioningHolder->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizerVersioningHolder->Add( 0, 0, 1, wxEXPAND, 5 ); - bSizer2361->Add( bSizerVersioningHolder, 1, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer2361->Add( bSizerVersioningHolder, 1, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer232->Add( bSizer2361, 0, wxEXPAND, 5 ); + bSizer232->Add( bSizer2361, 0, wxEXPAND, 5 ); - m_staticline582 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer232->Add( m_staticline582, 0, wxEXPAND, 5 ); + m_staticline582 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer232->Add( m_staticline582, 0, wxEXPAND, 5 ); - bSizerSyncMisc = new wxBoxSizer( wxHORIZONTAL ); + bSizerSyncMisc = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer292; - bSizer292 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer292; + bSizer292 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer287; - bSizer287 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer287; + bSizer287 = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer290; - bSizer290 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer290; + bSizer290 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer291; - bSizer291 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer291; + bSizer291 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapEmail = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer291->Add( m_bitmapEmail, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapEmail = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer291->Add( m_bitmapEmail, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_checkBoxSendEmail = new wxCheckBox( m_panelSyncSettings, wxID_ANY, _("Send email notification:"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer291->Add( m_checkBoxSendEmail, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + m_checkBoxSendEmail = new wxCheckBox( m_panelSyncSettings, wxID_ANY, _("Send email notification:"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer291->Add( m_checkBoxSendEmail, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - bSizer290->Add( bSizer291, 0, 0, 5 ); + bSizer290->Add( bSizer291, 0, 0, 5 ); - m_comboBoxEmail = new fff::CommandBox( m_panelSyncSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer290->Add( m_comboBoxEmail, 0, wxEXPAND|wxTOP, 5 ); + m_comboBoxEmail = new fff::CommandBox( m_panelSyncSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer290->Add( m_comboBoxEmail, 0, wxEXPAND|wxTOP, 5 ); - bSizer287->Add( bSizer290, 1, wxRIGHT, 5 ); + bSizer287->Add( bSizer290, 1, wxRIGHT, 5 ); - wxBoxSizer* bSizer289; - bSizer289 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer289; + bSizer289 = new wxBoxSizer( wxVERTICAL ); - m_bpButtonEmailAlways = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 ); - bSizer289->Add( m_bpButtonEmailAlways, 0, 0, 5 ); + m_bpButtonEmailAlways = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 ); + bSizer289->Add( m_bpButtonEmailAlways, 0, 0, 5 ); - m_bpButtonEmailErrorWarning = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 ); - bSizer289->Add( m_bpButtonEmailErrorWarning, 0, 0, 5 ); + m_bpButtonEmailErrorWarning = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 ); + bSizer289->Add( m_bpButtonEmailErrorWarning, 0, 0, 5 ); - m_bpButtonEmailErrorOnly = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 ); - bSizer289->Add( m_bpButtonEmailErrorOnly, 0, 0, 5 ); + m_bpButtonEmailErrorOnly = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 ); + bSizer289->Add( m_bpButtonEmailErrorOnly, 0, 0, 5 ); - bSizer287->Add( bSizer289, 0, wxLEFT, 5 ); + bSizer287->Add( bSizer289, 0, wxLEFT, 5 ); - bSizer292->Add( bSizer287, 0, wxEXPAND, 5 ); + bSizer292->Add( bSizer287, 0, wxEXPAND, 5 ); - m_hyperlinkPerfDeRequired2 = new wxHyperlinkCtrl( m_panelSyncSettings, wxID_ANY, _("Requires FreeFileSync Donation Edition"), wxT("https://freefilesync.org/faq.php#donation-edition"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlinkPerfDeRequired2->SetToolTip( _("https://freefilesync.org/faq.php#donation-edition") ); + m_hyperlinkPerfDeRequired2 = new wxHyperlinkCtrl( m_panelSyncSettings, wxID_ANY, _("Requires FreeFileSync Donation Edition"), wxT("https://freefilesync.org/faq.php#donation-edition"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlinkPerfDeRequired2->SetToolTip( _("https://freefilesync.org/faq.php#donation-edition") ); - bSizer292->Add( m_hyperlinkPerfDeRequired2, 0, wxALL, 5 ); + bSizer292->Add( m_hyperlinkPerfDeRequired2, 0, wxALL, 5 ); - bSizerSyncMisc->Add( bSizer292, 0, wxEXPAND|wxALL, 10 ); + bSizerSyncMisc->Add( bSizer292, 0, wxEXPAND|wxALL, 10 ); - m_staticline57 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizerSyncMisc->Add( m_staticline57, 0, wxEXPAND, 5 ); + m_staticline57 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizerSyncMisc->Add( m_staticline57, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer293; - bSizer293 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer293; + bSizer293 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer2372; - bSizer2372 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer2372; + bSizer2372 = new wxBoxSizer( wxHORIZONTAL ); - m_panelLogfile = new wxPanel( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelLogfile->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panelLogfile = new wxPanel( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelLogfile->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer1912; - bSizer1912 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer1912; + bSizer1912 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer279; - bSizer279 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer279; + bSizer279 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapLogFile = new wxStaticBitmap( m_panelLogfile, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer279->Add( m_bitmapLogFile, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapLogFile = new wxStaticBitmap( m_panelLogfile, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer279->Add( m_bitmapLogFile, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_checkBoxOverrideLogPath = new wxCheckBox( m_panelLogfile, wxID_ANY, _("&Change log folder:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxOverrideLogPath->SetValue(true); - bSizer279->Add( m_checkBoxOverrideLogPath, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + m_checkBoxOverrideLogPath = new wxCheckBox( m_panelLogfile, wxID_ANY, _("&Change log folder:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxOverrideLogPath->SetValue(true); + bSizer279->Add( m_checkBoxOverrideLogPath, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - bSizer279->Add( 0, 0, 1, 0, 5 ); + bSizer279->Add( 0, 0, 1, 0, 5 ); - m_bpButtonShowLogFolder = new wxBitmapButton( m_panelLogfile, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonShowLogFolder->SetToolTip( _("dummy") ); + m_bpButtonShowLogFolder = new wxBitmapButton( m_panelLogfile, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonShowLogFolder->SetToolTip( _("dummy") ); - bSizer279->Add( m_bpButtonShowLogFolder, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer279->Add( m_bpButtonShowLogFolder, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer1912->Add( bSizer279, 0, wxEXPAND, 5 ); + bSizer1912->Add( bSizer279, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer297; - bSizer297 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer297; + bSizer297 = new wxBoxSizer( wxHORIZONTAL ); - m_logFolderPath = new fff::FolderHistoryBox( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer297->Add( m_logFolderPath, 1, wxALIGN_CENTER_VERTICAL, 5 ); + m_logFolderPath = new fff::FolderHistoryBox( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer297->Add( m_logFolderPath, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_buttonSelectLogFolder = new wxButton( m_panelLogfile, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectLogFolder->SetToolTip( _("Select a folder") ); + m_buttonSelectLogFolder = new wxButton( m_panelLogfile, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectLogFolder->SetToolTip( _("Select a folder") ); - bSizer297->Add( m_buttonSelectLogFolder, 0, wxEXPAND, 5 ); + bSizer297->Add( m_buttonSelectLogFolder, 0, wxEXPAND, 5 ); - m_bpButtonSelectAltLogFolder = new wxBitmapButton( m_panelLogfile, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonSelectAltLogFolder->SetToolTip( _("Access online storage") ); + m_bpButtonSelectAltLogFolder = new wxBitmapButton( m_panelLogfile, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonSelectAltLogFolder->SetToolTip( _("Access online storage") ); - bSizer297->Add( m_bpButtonSelectAltLogFolder, 0, wxEXPAND, 5 ); + bSizer297->Add( m_bpButtonSelectAltLogFolder, 0, wxEXPAND, 5 ); - bSizer1912->Add( bSizer297, 0, wxEXPAND|wxTOP, 5 ); + bSizer1912->Add( bSizer297, 0, wxEXPAND|wxTOP, 5 ); - m_panelLogfile->SetSizer( bSizer1912 ); - m_panelLogfile->Layout(); - bSizer1912->Fit( m_panelLogfile ); - bSizer2372->Add( m_panelLogfile, 1, 0, 5 ); + m_panelLogfile->SetSizer( bSizer1912 ); + m_panelLogfile->Layout(); + bSizer1912->Fit( m_panelLogfile ); + bSizer2372->Add( m_panelLogfile, 1, 0, 5 ); - bSizer293->Add( bSizer2372, 0, wxALL|wxEXPAND, 10 ); + bSizer293->Add( bSizer2372, 0, wxALL|wxEXPAND, 10 ); - m_staticline80 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer293->Add( m_staticline80, 0, wxEXPAND, 5 ); + m_staticline80 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer293->Add( m_staticline80, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer247; - bSizer247 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer247; + bSizer247 = new wxBoxSizer( wxHORIZONTAL ); - m_staticTextPostSync = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Run a command:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextPostSync->Wrap( -1 ); - bSizer247->Add( m_staticTextPostSync, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + m_staticTextPostSync = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Run a command:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextPostSync->Wrap( -1 ); + bSizer247->Add( m_staticTextPostSync, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - wxArrayString m_choicePostSyncConditionChoices; - m_choicePostSyncCondition = new wxChoice( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choicePostSyncConditionChoices, 0 ); - m_choicePostSyncCondition->SetSelection( 0 ); - bSizer247->Add( m_choicePostSyncCondition, 0, wxALIGN_CENTER_VERTICAL, 5 ); + wxArrayString m_choicePostSyncConditionChoices; + m_choicePostSyncCondition = new wxChoice( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choicePostSyncConditionChoices, 0 ); + m_choicePostSyncCondition->SetSelection( 0 ); + bSizer247->Add( m_choicePostSyncCondition, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_comboBoxPostSyncCommand = new fff::CommandBox( m_panelSyncSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer247->Add( m_comboBoxPostSyncCommand, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + m_comboBoxPostSyncCommand = new fff::CommandBox( m_panelSyncSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer247->Add( m_comboBoxPostSyncCommand, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer293->Add( bSizer247, 0, wxALL|wxEXPAND, 10 ); + bSizer293->Add( bSizer247, 0, wxALL|wxEXPAND, 10 ); - bSizerSyncMisc->Add( bSizer293, 1, 0, 5 ); + bSizerSyncMisc->Add( bSizer293, 1, 0, 5 ); - bSizer232->Add( bSizerSyncMisc, 1, wxEXPAND, 5 ); + bSizer232->Add( bSizerSyncMisc, 1, wxEXPAND, 5 ); - m_panelSyncSettings->SetSizer( bSizer232 ); - m_panelSyncSettings->Layout(); - bSizer232->Fit( m_panelSyncSettings ); - bSizer276->Add( m_panelSyncSettings, 1, wxEXPAND, 5 ); + m_panelSyncSettings->SetSizer( bSizer232 ); + m_panelSyncSettings->Layout(); + bSizer232->Fit( m_panelSyncSettings ); + bSizer276->Add( m_panelSyncSettings, 1, wxEXPAND, 5 ); - m_panelSyncSettingsTab->SetSizer( bSizer276 ); - m_panelSyncSettingsTab->Layout(); - bSizer276->Fit( m_panelSyncSettingsTab ); - m_notebook->AddPage( m_panelSyncSettingsTab, _("dummy"), true ); + m_panelSyncSettingsTab->SetSizer( bSizer276 ); + m_panelSyncSettingsTab->Layout(); + bSizer276->Fit( m_panelSyncSettingsTab ); + m_notebook->AddPage( m_panelSyncSettingsTab, _("dummy"), false ); - bSizer190->Add( m_notebook, 1, wxEXPAND, 5 ); + bSizer190->Add( m_notebook, 1, wxEXPAND, 5 ); - bSizer7->Add( bSizer190, 1, wxEXPAND, 5 ); + bSizer7->Add( bSizer190, 1, wxEXPAND, 5 ); - m_panelNotes = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelNotes->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panelNotes = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelNotes->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer3021; - bSizer3021 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer3021; + bSizer3021 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer17311; - bSizer17311 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer17311; + bSizer17311 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapNotes = new wxStaticBitmap( m_panelNotes, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer17311->Add( m_bitmapNotes, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); + m_bitmapNotes = new wxStaticBitmap( m_panelNotes, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer17311->Add( m_bitmapNotes, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); - m_staticText781 = new wxStaticText( m_panelNotes, wxID_ANY, _("Notes:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText781->Wrap( -1 ); - bSizer17311->Add( m_staticText781, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + m_staticText781 = new wxStaticText( m_panelNotes, wxID_ANY, _("Notes:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText781->Wrap( -1 ); + bSizer17311->Add( m_staticText781, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_textCtrNotes = new wxTextCtrl( m_panelNotes, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxTE_MULTILINE ); - bSizer17311->Add( m_textCtrNotes, 1, wxEXPAND, 5 ); + m_textCtrNotes = new wxTextCtrl( m_panelNotes, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE ); + bSizer17311->Add( m_textCtrNotes, 1, wxEXPAND, 5 ); - bSizer3021->Add( bSizer17311, 1, wxEXPAND, 5 ); + bSizer3021->Add( bSizer17311, 1, wxEXPAND, 5 ); - m_staticline83 = new wxStaticLine( m_panelNotes, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer3021->Add( m_staticline83, 0, wxEXPAND, 5 ); + m_staticline83 = new wxStaticLine( m_panelNotes, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer3021->Add( m_staticline83, 0, wxEXPAND, 5 ); - m_panelNotes->SetSizer( bSizer3021 ); - m_panelNotes->Layout(); - bSizer3021->Fit( m_panelNotes ); - bSizer7->Add( m_panelNotes, 0, wxEXPAND, 5 ); + m_panelNotes->SetSizer( bSizer3021 ); + m_panelNotes->Layout(); + bSizer3021->Fit( m_panelNotes ); + bSizer7->Add( m_panelNotes, 0, wxEXPAND, 5 ); - bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); - m_buttonAddNotes = new zen::BitmapTextButton( this, wxID_ANY, _("Add ¬es"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizerStdButtons->Add( m_buttonAddNotes, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + m_buttonAddNotes = new zen::BitmapTextButton( this, wxID_ANY, _("Add ¬es"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerStdButtons->Add( m_buttonAddNotes, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 ); - m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonOkay->SetDefault(); - m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonOkay->SetDefault(); + m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer7->Add( bSizerStdButtons, 0, wxEXPAND, 5 ); + bSizer7->Add( bSizerStdButtons, 0, wxEXPAND, 5 ); - this->SetSizer( bSizer7 ); - this->Layout(); - bSizer7->Fit( this ); + this->SetSizer( bSizer7 ); + this->Layout(); + bSizer7->Fit( this ); - this->Centre( wxBOTH ); + this->Centre( wxBOTH ); - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ConfigDlgGenerated::onClose ) ); - m_listBoxFolderPair->Connect( wxEVT_KEY_DOWN, wxKeyEventHandler( ConfigDlgGenerated::onListBoxKeyEvent ), NULL, this ); - m_listBoxFolderPair->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::onSelectFolderPair ), NULL, this ); - m_checkBoxUseLocalCmpOptions->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleLocalCompSettings ), NULL, this ); - m_buttonByTimeSize->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onCompByTimeSize ), NULL, this ); - m_buttonByTimeSize->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::onCompByTimeSizeDouble ), NULL, this ); - m_buttonByContent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onCompByContent ), NULL, this ); - m_buttonByContent->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::onCompByContentDouble ), NULL, this ); - m_buttonBySize->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onCompBySize ), NULL, this ); - m_buttonBySize->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::onCompBySizeDouble ), NULL, this ); - m_checkBoxSymlinksInclude->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onChangeCompOption ), NULL, this ); - m_checkBoxIgnoreErrors->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleIgnoreErrors ), NULL, this ); - m_checkBoxAutoRetry->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleAutoRetry ), NULL, this ); - m_textCtrlInclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( ConfigDlgGenerated::onChangeFilterOption ), NULL, this ); - m_textCtrlExclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( ConfigDlgGenerated::onChangeFilterOption ), NULL, this ); - m_choiceUnitMinSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::onChangeFilterOption ), NULL, this ); - m_choiceUnitMaxSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::onChangeFilterOption ), NULL, this ); - m_choiceUnitTimespan->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::onChangeFilterOption ), NULL, this ); - m_buttonDefault->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onFilterDefault ), NULL, this ); - m_buttonDefault->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( ConfigDlgGenerated::onFilterDefaultContextMouse ), NULL, this ); - m_bpButtonDefaultContext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onFilterDefaultContext ), NULL, this ); - m_bpButtonDefaultContext->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( ConfigDlgGenerated::onFilterDefaultContextMouse ), NULL, this ); - m_buttonClear->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onFilterClear ), NULL, this ); - m_checkBoxUseLocalSyncOptions->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleLocalSyncSettings ), NULL, this ); - m_buttonTwoWay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onSyncTwoWay ), NULL, this ); - m_buttonTwoWay->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::onSyncTwoWayDouble ), NULL, this ); - m_buttonMirror->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onSyncMirror ), NULL, this ); - m_buttonMirror->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::onSyncMirrorDouble ), NULL, this ); - m_buttonUpdate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onSyncUpdate ), NULL, this ); - m_buttonUpdate->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::onSyncUpdateDouble ), NULL, this ); - m_buttonCustom->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onSyncCustom ), NULL, this ); - m_buttonCustom->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::onSyncCustomDouble ), NULL, this ); - m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onExLeftSideOnly ), NULL, this ); - m_bpButtonLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onLeftNewer ), NULL, this ); - m_bpButtonDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onDifferent ), NULL, this ); - m_bpButtonConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onConflict ), NULL, this ); - m_bpButtonRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onRightNewer ), NULL, this ); - m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onExRightSideOnly ), NULL, this ); - m_checkBoxDetectMove->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleDetectMovedFiles ), NULL, this ); - m_buttonRecycler->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onDeletionRecycler ), NULL, this ); - m_buttonPermanent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onDeletionPermanent ), NULL, this ); - m_buttonVersioning->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onDeletionVersioning ), NULL, this ); - m_choiceVersioningStyle->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::onChanegVersioningStyle ), NULL, this ); - m_checkBoxVersionMaxDays->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleVersioningLimit ), NULL, this ); - m_checkBoxVersionCountMin->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleVersioningLimit ), NULL, this ); - m_checkBoxVersionCountMax->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleVersioningLimit ), NULL, this ); - m_checkBoxSendEmail->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleMiscEmail ), NULL, this ); - m_bpButtonEmailAlways->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onEmailAlways ), NULL, this ); - m_bpButtonEmailErrorWarning->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onEmailErrorWarning ), NULL, this ); - m_bpButtonEmailErrorOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onEmailErrorOnly ), NULL, this ); - m_checkBoxOverrideLogPath->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleMiscOption ), NULL, this ); - m_bpButtonShowLogFolder->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onShowLogFolder ), NULL, this ); - m_buttonAddNotes->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onAddNotes ), NULL, this ); - m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onOkay ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onCancel ), NULL, this ); + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ConfigDlgGenerated::onClose ) ); + m_listBoxFolderPair->Connect( wxEVT_KEY_DOWN, wxKeyEventHandler( ConfigDlgGenerated::onListBoxKeyEvent ), NULL, this ); + m_listBoxFolderPair->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::onSelectFolderPair ), NULL, this ); + m_checkBoxUseLocalCmpOptions->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleLocalCompSettings ), NULL, this ); + m_buttonByTimeSize->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onCompByTimeSize ), NULL, this ); + m_buttonByTimeSize->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::onCompByTimeSizeDouble ), NULL, this ); + m_buttonByContent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onCompByContent ), NULL, this ); + m_buttonByContent->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::onCompByContentDouble ), NULL, this ); + m_buttonBySize->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onCompBySize ), NULL, this ); + m_buttonBySize->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::onCompBySizeDouble ), NULL, this ); + m_checkBoxSymlinksInclude->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onChangeCompOption ), NULL, this ); + m_checkBoxIgnoreErrors->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleIgnoreErrors ), NULL, this ); + m_checkBoxAutoRetry->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleAutoRetry ), NULL, this ); + m_textCtrlInclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( ConfigDlgGenerated::onChangeFilterOption ), NULL, this ); + m_textCtrlExclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( ConfigDlgGenerated::onChangeFilterOption ), NULL, this ); + m_choiceUnitMinSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::onChangeFilterOption ), NULL, this ); + m_choiceUnitMaxSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::onChangeFilterOption ), NULL, this ); + m_choiceUnitTimespan->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::onChangeFilterOption ), NULL, this ); + m_buttonDefault->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onFilterDefault ), NULL, this ); + m_buttonDefault->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( ConfigDlgGenerated::onFilterDefaultContextMouse ), NULL, this ); + m_bpButtonDefaultContext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onFilterDefaultContext ), NULL, this ); + m_bpButtonDefaultContext->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( ConfigDlgGenerated::onFilterDefaultContextMouse ), NULL, this ); + m_buttonClear->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onFilterClear ), NULL, this ); + m_checkBoxUseLocalSyncOptions->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleLocalSyncSettings ), NULL, this ); + m_buttonTwoWay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onSyncTwoWay ), NULL, this ); + m_buttonTwoWay->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::onSyncTwoWayDouble ), NULL, this ); + m_buttonMirror->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onSyncMirror ), NULL, this ); + m_buttonMirror->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::onSyncMirrorDouble ), NULL, this ); + m_buttonUpdate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onSyncUpdate ), NULL, this ); + m_buttonUpdate->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::onSyncUpdateDouble ), NULL, this ); + m_buttonCustom->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onSyncCustom ), NULL, this ); + m_buttonCustom->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::onSyncCustomDouble ), NULL, this ); + m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onExLeftSideOnly ), NULL, this ); + m_bpButtonLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onLeftNewer ), NULL, this ); + m_bpButtonDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onDifferent ), NULL, this ); + m_bpButtonConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onConflict ), NULL, this ); + m_bpButtonRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onRightNewer ), NULL, this ); + m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onExRightSideOnly ), NULL, this ); + m_checkBoxDetectMove->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleDetectMovedFiles ), NULL, this ); + m_buttonRecycler->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onDeletionRecycler ), NULL, this ); + m_buttonPermanent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onDeletionPermanent ), NULL, this ); + m_buttonVersioning->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onDeletionVersioning ), NULL, this ); + m_choiceVersioningStyle->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::onChanegVersioningStyle ), NULL, this ); + m_checkBoxVersionMaxDays->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleVersioningLimit ), NULL, this ); + m_checkBoxVersionCountMin->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleVersioningLimit ), NULL, this ); + m_checkBoxVersionCountMax->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleVersioningLimit ), NULL, this ); + m_checkBoxSendEmail->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleMiscEmail ), NULL, this ); + m_bpButtonEmailAlways->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onEmailAlways ), NULL, this ); + m_bpButtonEmailErrorWarning->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onEmailErrorWarning ), NULL, this ); + m_bpButtonEmailErrorOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onEmailErrorOnly ), NULL, this ); + m_checkBoxOverrideLogPath->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onToggleMiscOption ), NULL, this ); + m_bpButtonShowLogFolder->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onShowLogFolder ), NULL, this ); + m_buttonAddNotes->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onAddNotes ), NULL, this ); + m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onOkay ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::onCancel ), NULL, this ); } ConfigDlgGenerated::~ConfigDlgGenerated() @@ -2633,543 +2633,543 @@ ConfigDlgGenerated::~ConfigDlgGenerated() CloudSetupDlgGenerated::CloudSetupDlgGenerated( 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 ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer134; - bSizer134 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer134; + bSizer134 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapCloud = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer72->Add( m_bitmapCloud, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); + m_bitmapCloud = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer72->Add( m_bitmapCloud, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); - wxBoxSizer* bSizer272; - bSizer272 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer272; + bSizer272 = new wxBoxSizer( wxVERTICAL ); - m_staticText136 = new wxStaticText( this, wxID_ANY, _("Connection type:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText136->Wrap( -1 ); - bSizer272->Add( m_staticText136, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + m_staticText136 = new wxStaticText( this, wxID_ANY, _("Connection type:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText136->Wrap( -1 ); + bSizer272->Add( m_staticText136, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - wxBoxSizer* bSizer231; - bSizer231 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer231; + bSizer231 = new wxBoxSizer( wxHORIZONTAL ); - m_toggleBtnGdrive = new wxToggleButton( this, wxID_ANY, _("Google Drive"), wxDefaultPosition, wxDefaultSize, 0 ); - m_toggleBtnGdrive->SetValue( true ); - m_toggleBtnGdrive->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_toggleBtnGdrive = new wxToggleButton( this, wxID_ANY, _("Google Drive"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnGdrive->SetValue( true ); + m_toggleBtnGdrive->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer231->Add( m_toggleBtnGdrive, 0, wxTOP|wxBOTTOM|wxLEFT|wxEXPAND, 5 ); + bSizer231->Add( m_toggleBtnGdrive, 0, wxTOP|wxBOTTOM|wxLEFT|wxEXPAND, 5 ); - m_toggleBtnSftp = new wxToggleButton( this, wxID_ANY, _("SFTP"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_toggleBtnSftp->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_toggleBtnSftp = new wxToggleButton( this, wxID_ANY, _("SFTP"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_toggleBtnSftp->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer231->Add( m_toggleBtnSftp, 0, wxTOP|wxBOTTOM|wxLEFT|wxEXPAND, 5 ); + bSizer231->Add( m_toggleBtnSftp, 0, wxTOP|wxBOTTOM|wxLEFT|wxEXPAND, 5 ); - m_toggleBtnFtp = new wxToggleButton( this, wxID_ANY, _("FTP"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_toggleBtnFtp->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_toggleBtnFtp = new wxToggleButton( this, wxID_ANY, _("FTP"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_toggleBtnFtp->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer231->Add( m_toggleBtnFtp, 0, wxALL|wxEXPAND, 5 ); + bSizer231->Add( m_toggleBtnFtp, 0, wxALL|wxEXPAND, 5 ); - bSizer272->Add( bSizer231, 0, 0, 5 ); + bSizer272->Add( bSizer231, 0, 0, 5 ); - bSizer72->Add( bSizer272, 0, wxALL, 5 ); + bSizer72->Add( bSizer272, 0, wxALL, 5 ); - bSizer134->Add( bSizer72, 0, wxEXPAND, 5 ); + bSizer134->Add( bSizer72, 0, wxEXPAND, 5 ); - m_staticline371 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxSize( -1, -1 ), wxLI_HORIZONTAL ); - bSizer134->Add( m_staticline371, 0, wxEXPAND, 5 ); + m_staticline371 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxLI_HORIZONTAL ); + bSizer134->Add( m_staticline371, 0, wxEXPAND, 5 ); - m_panel41 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel41->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panel41 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel41->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer185; - bSizer185 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer185; + bSizer185 = new wxBoxSizer( wxVERTICAL ); - bSizerGdrive = new wxBoxSizer( wxVERTICAL ); + bSizerGdrive = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer284; - bSizer284 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer284; + bSizer284 = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer307; - bSizer307 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer307; + bSizer307 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer306; - bSizer306 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer306; + bSizer306 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapGdriveUser = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer306->Add( m_bitmapGdriveUser, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_bitmapGdriveUser = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer306->Add( m_bitmapGdriveUser, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - m_staticText166 = new wxStaticText( m_panel41, wxID_ANY, _("Connected user accounts:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText166->Wrap( -1 ); - bSizer306->Add( m_staticText166, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_staticText166 = new wxStaticText( m_panel41, wxID_ANY, _("Connected user accounts:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText166->Wrap( -1 ); + bSizer306->Add( m_staticText166, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer307->Add( bSizer306, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + bSizer307->Add( bSizer306, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_listBoxGdriveUsers = new wxListBox( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_NEEDED_SB|wxLB_SINGLE|wxLB_SORT ); - bSizer307->Add( m_listBoxGdriveUsers, 1, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + m_listBoxGdriveUsers = new wxListBox( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_NEEDED_SB|wxLB_SINGLE|wxLB_SORT ); + bSizer307->Add( m_listBoxGdriveUsers, 1, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - wxBoxSizer* bSizer3002; - bSizer3002 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer3002; + bSizer3002 = new wxBoxSizer( wxHORIZONTAL ); - m_buttonGdriveAddUser = new zen::BitmapTextButton( m_panel41, wxID_ANY, _("&Add connection"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer3002->Add( m_buttonGdriveAddUser, 1, wxALIGN_CENTER_VERTICAL, 5 ); + m_buttonGdriveAddUser = new zen::BitmapTextButton( m_panel41, wxID_ANY, _("&Add connection"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer3002->Add( m_buttonGdriveAddUser, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_buttonGdriveRemoveUser = new zen::BitmapTextButton( m_panel41, wxID_ANY, _("&Disconnect"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer3002->Add( m_buttonGdriveRemoveUser, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + m_buttonGdriveRemoveUser = new zen::BitmapTextButton( m_panel41, wxID_ANY, _("&Disconnect"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer3002->Add( m_buttonGdriveRemoveUser, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - bSizer307->Add( bSizer3002, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 ); + bSizer307->Add( bSizer3002, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizer284->Add( bSizer307, 0, wxALL|wxEXPAND, 5 ); + bSizer284->Add( bSizer307, 0, wxALL|wxEXPAND, 5 ); - m_staticline841 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer284->Add( m_staticline841, 0, wxEXPAND, 5 ); + m_staticline841 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer284->Add( m_staticline841, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer3041; - bSizer3041 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer3041; + bSizer3041 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer305; - bSizer305 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer305; + bSizer305 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapGdriveDrive = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer305->Add( m_bitmapGdriveDrive, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapGdriveDrive = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer305->Add( m_bitmapGdriveDrive, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticText186 = new wxStaticText( m_panel41, wxID_ANY, _("Select drive:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText186->Wrap( -1 ); - bSizer305->Add( m_staticText186, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_staticText186 = new wxStaticText( m_panel41, wxID_ANY, _("Select drive:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText186->Wrap( -1 ); + bSizer305->Add( m_staticText186, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer3041->Add( bSizer305, 0, wxALL, 5 ); + bSizer3041->Add( bSizer305, 0, wxALL, 5 ); - m_listBoxGdriveDrives = new wxListBox( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_NEEDED_SB|wxLB_SINGLE ); - bSizer3041->Add( m_listBoxGdriveDrives, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + m_listBoxGdriveDrives = new wxListBox( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_NEEDED_SB|wxLB_SINGLE ); + bSizer3041->Add( m_listBoxGdriveDrives, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - bSizer284->Add( bSizer3041, 1, wxALL|wxEXPAND, 5 ); + bSizer284->Add( bSizer3041, 1, wxALL|wxEXPAND, 5 ); - bSizerGdrive->Add( bSizer284, 1, wxEXPAND, 5 ); + bSizerGdrive->Add( bSizer284, 1, wxEXPAND, 5 ); - m_staticline73 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizerGdrive->Add( m_staticline73, 0, wxEXPAND, 5 ); + m_staticline73 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerGdrive->Add( m_staticline73, 0, wxEXPAND, 5 ); - bSizer185->Add( bSizerGdrive, 1, wxEXPAND, 5 ); + bSizer185->Add( bSizerGdrive, 1, wxEXPAND, 5 ); - bSizerServer = new wxBoxSizer( wxVERTICAL ); + bSizerServer = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer276; - bSizer276 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer276; + bSizer276 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapServer = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer276->Add( m_bitmapServer, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapServer = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer276->Add( m_bitmapServer, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticText12311 = new wxStaticText( m_panel41, wxID_ANY, _("Server name or IP address:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText12311->Wrap( -1 ); - bSizer276->Add( m_staticText12311, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + m_staticText12311 = new wxStaticText( m_panel41, wxID_ANY, _("Server name or IP address:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText12311->Wrap( -1 ); + bSizer276->Add( m_staticText12311, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - m_textCtrlServer = new wxTextCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer276->Add( m_textCtrlServer, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + m_textCtrlServer = new wxTextCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer276->Add( m_textCtrlServer, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticText1233 = new wxStaticText( m_panel41, wxID_ANY, _("Port:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText1233->Wrap( -1 ); - bSizer276->Add( m_staticText1233, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + m_staticText1233 = new wxStaticText( m_panel41, wxID_ANY, _("Port:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText1233->Wrap( -1 ); + bSizer276->Add( m_staticText1233, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - m_textCtrlPort = new wxTextCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer276->Add( m_textCtrlPort, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + m_textCtrlPort = new wxTextCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer276->Add( m_textCtrlPort, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizerServer->Add( bSizer276, 0, wxALL|wxEXPAND, 5 ); + bSizerServer->Add( bSizer276, 0, wxALL|wxEXPAND, 5 ); - m_staticline58 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizerServer->Add( m_staticline58, 0, wxEXPAND, 5 ); + m_staticline58 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerServer->Add( m_staticline58, 0, wxEXPAND, 5 ); - bSizer185->Add( bSizerServer, 0, wxEXPAND, 5 ); + bSizer185->Add( bSizerServer, 0, wxEXPAND, 5 ); - bSizerAuth = new wxBoxSizer( wxVERTICAL ); + bSizerAuth = new wxBoxSizer( wxVERTICAL ); - bSizerAuthInner = new wxBoxSizer( wxHORIZONTAL ); + bSizerAuthInner = new wxBoxSizer( wxHORIZONTAL ); - bSizerFtpEncrypt = new wxBoxSizer( wxHORIZONTAL ); + bSizerFtpEncrypt = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer2181; - bSizer2181 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer2181; + bSizer2181 = new wxBoxSizer( wxVERTICAL ); - m_staticText1251 = new wxStaticText( m_panel41, wxID_ANY, _("Encryption:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText1251->Wrap( -1 ); - bSizer2181->Add( m_staticText1251, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + m_staticText1251 = new wxStaticText( m_panel41, wxID_ANY, _("Encryption:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText1251->Wrap( -1 ); + bSizer2181->Add( m_staticText1251, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - m_radioBtnEncryptNone = new wxRadioButton( m_panel41, wxID_ANY, _("&Disabled"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); - m_radioBtnEncryptNone->SetValue( true ); - bSizer2181->Add( m_radioBtnEncryptNone, 0, wxEXPAND|wxALL, 5 ); + m_radioBtnEncryptNone = new wxRadioButton( m_panel41, wxID_ANY, _("&Disabled"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); + m_radioBtnEncryptNone->SetValue( true ); + bSizer2181->Add( m_radioBtnEncryptNone, 0, wxEXPAND|wxALL, 5 ); - m_radioBtnEncryptSsl = new wxRadioButton( m_panel41, wxID_ANY, _("&Explicit SSL/TLS"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer2181->Add( m_radioBtnEncryptSsl, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + m_radioBtnEncryptSsl = new wxRadioButton( m_panel41, wxID_ANY, _("&Explicit SSL/TLS"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer2181->Add( m_radioBtnEncryptSsl, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - bSizerFtpEncrypt->Add( bSizer2181, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizerFtpEncrypt->Add( bSizer2181, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticline5721 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizerFtpEncrypt->Add( m_staticline5721, 0, wxEXPAND, 5 ); + m_staticline5721 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizerFtpEncrypt->Add( m_staticline5721, 0, wxEXPAND, 5 ); - bSizerAuthInner->Add( bSizerFtpEncrypt, 0, wxEXPAND, 5 ); + bSizerAuthInner->Add( bSizerFtpEncrypt, 0, wxEXPAND, 5 ); - bSizerSftpAuth = new wxBoxSizer( wxHORIZONTAL ); + bSizerSftpAuth = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer218; - bSizer218 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer218; + bSizer218 = new wxBoxSizer( wxVERTICAL ); - m_staticText125 = new wxStaticText( m_panel41, wxID_ANY, _("Authentication:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText125->Wrap( -1 ); - bSizer218->Add( m_staticText125, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + m_staticText125 = new wxStaticText( m_panel41, wxID_ANY, _("Authentication:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText125->Wrap( -1 ); + bSizer218->Add( m_staticText125, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - m_radioBtnPassword = new wxRadioButton( m_panel41, wxID_ANY, _("&Password"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); - m_radioBtnPassword->SetValue( true ); - bSizer218->Add( m_radioBtnPassword, 0, wxEXPAND|wxALL, 5 ); + m_radioBtnPassword = new wxRadioButton( m_panel41, wxID_ANY, _("&Password"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); + m_radioBtnPassword->SetValue( true ); + bSizer218->Add( m_radioBtnPassword, 0, wxEXPAND|wxALL, 5 ); - m_radioBtnKeyfile = new wxRadioButton( m_panel41, wxID_ANY, _("&Key file"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer218->Add( m_radioBtnKeyfile, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + m_radioBtnKeyfile = new wxRadioButton( m_panel41, wxID_ANY, _("&Key file"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer218->Add( m_radioBtnKeyfile, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - m_radioBtnAgent = new wxRadioButton( m_panel41, wxID_ANY, _("&SSH agent"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer218->Add( m_radioBtnAgent, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + m_radioBtnAgent = new wxRadioButton( m_panel41, wxID_ANY, _("&SSH agent"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer218->Add( m_radioBtnAgent, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - bSizerSftpAuth->Add( bSizer218, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizerSftpAuth->Add( bSizer218, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticline572 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizerSftpAuth->Add( m_staticline572, 0, wxEXPAND, 5 ); + m_staticline572 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizerSftpAuth->Add( m_staticline572, 0, wxEXPAND, 5 ); - bSizerAuthInner->Add( bSizerSftpAuth, 0, wxEXPAND, 5 ); + bSizerAuthInner->Add( bSizerSftpAuth, 0, wxEXPAND, 5 ); - m_panelAuth = new wxPanel( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelAuth->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panelAuth = new wxPanel( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelAuth->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer221; - bSizer221 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer221; + bSizer221 = new wxBoxSizer( wxVERTICAL ); - wxFlexGridSizer* fgSizer161; - fgSizer161 = new wxFlexGridSizer( 0, 2, 0, 0 ); - fgSizer161->AddGrowableCol( 1 ); - fgSizer161->SetFlexibleDirection( wxBOTH ); - fgSizer161->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + wxFlexGridSizer* fgSizer161; + fgSizer161 = new wxFlexGridSizer( 0, 2, 0, 0 ); + fgSizer161->AddGrowableCol( 1 ); + fgSizer161->SetFlexibleDirection( wxBOTH ); + fgSizer161->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_staticText123 = new wxStaticText( m_panelAuth, wxID_ANY, _("Username:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText123->Wrap( -1 ); - fgSizer161->Add( m_staticText123, 0, wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + m_staticText123 = new wxStaticText( m_panelAuth, wxID_ANY, _("Username:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText123->Wrap( -1 ); + fgSizer161->Add( m_staticText123, 0, wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - m_textCtrlUserName = new wxTextCtrl( m_panelAuth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - fgSizer161->Add( m_textCtrlUserName, 0, wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + m_textCtrlUserName = new wxTextCtrl( m_panelAuth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + fgSizer161->Add( m_textCtrlUserName, 0, wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextKeyfile = new wxStaticText( m_panelAuth, wxID_ANY, _("Private key file:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextKeyfile->Wrap( -1 ); - fgSizer161->Add( m_staticTextKeyfile, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); + m_staticTextKeyfile = new wxStaticText( m_panelAuth, wxID_ANY, _("Private key file:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextKeyfile->Wrap( -1 ); + fgSizer161->Add( m_staticTextKeyfile, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); - bSizerKeyFile = new wxBoxSizer( wxHORIZONTAL ); + bSizerKeyFile = new wxBoxSizer( wxHORIZONTAL ); - m_textCtrlKeyfilePath = new wxTextCtrl( m_panelAuth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - bSizerKeyFile->Add( m_textCtrlKeyfilePath, 1, wxALIGN_CENTER_VERTICAL, 5 ); + m_textCtrlKeyfilePath = new wxTextCtrl( m_panelAuth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerKeyFile->Add( m_textCtrlKeyfilePath, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_buttonSelectKeyfile = new wxButton( m_panelAuth, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectKeyfile->SetToolTip( _("Select a folder") ); + m_buttonSelectKeyfile = new wxButton( m_panelAuth, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectKeyfile->SetToolTip( _("Select a folder") ); - bSizerKeyFile->Add( m_buttonSelectKeyfile, 0, wxEXPAND, 5 ); + bSizerKeyFile->Add( m_buttonSelectKeyfile, 0, wxEXPAND, 5 ); - fgSizer161->Add( bSizerKeyFile, 0, wxALL|wxEXPAND, 5 ); + fgSizer161->Add( bSizerKeyFile, 0, wxALL|wxEXPAND, 5 ); - m_staticTextPassword = new wxStaticText( m_panelAuth, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextPassword->Wrap( -1 ); - fgSizer161->Add( m_staticTextPassword, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + m_staticTextPassword = new wxStaticText( m_panelAuth, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextPassword->Wrap( -1 ); + fgSizer161->Add( m_staticTextPassword, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - bSizerPassword = new wxBoxSizer( wxHORIZONTAL ); + bSizerPassword = new wxBoxSizer( wxHORIZONTAL ); - m_textCtrlPasswordVisible = new wxTextCtrl( m_panelAuth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - bSizerPassword->Add( m_textCtrlPasswordVisible, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + m_textCtrlPasswordVisible = new wxTextCtrl( m_panelAuth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerPassword->Add( m_textCtrlPasswordVisible, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - m_textCtrlPasswordHidden = new wxTextCtrl( m_panelAuth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD ); - bSizerPassword->Add( m_textCtrlPasswordHidden, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + m_textCtrlPasswordHidden = new wxTextCtrl( m_panelAuth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD ); + bSizerPassword->Add( m_textCtrlPasswordHidden, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - m_checkBoxShowPassword = new wxCheckBox( m_panelAuth, wxID_ANY, _("&Show password"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizerPassword->Add( m_checkBoxShowPassword, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + m_checkBoxShowPassword = new wxCheckBox( m_panelAuth, wxID_ANY, _("&Show password"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizerPassword->Add( m_checkBoxShowPassword, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_checkBoxPasswordPrompt = new wxCheckBox( m_panelAuth, wxID_ANY, _("Enter at login"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizerPassword->Add( m_checkBoxPasswordPrompt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + m_checkBoxPasswordPrompt = new wxCheckBox( m_panelAuth, wxID_ANY, _("Enter at login"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizerPassword->Add( m_checkBoxPasswordPrompt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - fgSizer161->Add( bSizerPassword, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + fgSizer161->Add( bSizerPassword, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - bSizer221->Add( fgSizer161, 0, wxALL|wxEXPAND, 5 ); + bSizer221->Add( fgSizer161, 0, wxALL|wxEXPAND, 5 ); - m_panelAuth->SetSizer( bSizer221 ); - m_panelAuth->Layout(); - bSizer221->Fit( m_panelAuth ); - bSizerAuthInner->Add( m_panelAuth, 1, wxALIGN_CENTER_VERTICAL, 5 ); + m_panelAuth->SetSizer( bSizer221 ); + m_panelAuth->Layout(); + bSizer221->Fit( m_panelAuth ); + bSizerAuthInner->Add( m_panelAuth, 1, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerAuth->Add( bSizerAuthInner, 0, wxEXPAND, 5 ); + bSizerAuth->Add( bSizerAuthInner, 0, wxEXPAND, 5 ); - m_staticline581 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizerAuth->Add( m_staticline581, 0, wxEXPAND, 5 ); + m_staticline581 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerAuth->Add( m_staticline581, 0, wxEXPAND, 5 ); - bSizer185->Add( bSizerAuth, 0, wxEXPAND, 5 ); + bSizer185->Add( bSizerAuth, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer269; - bSizer269 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer269; + bSizer269 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer3051; - bSizer3051 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer3051; + bSizer3051 = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer270; - bSizer270 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer270; + bSizer270 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapServerDir = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer270->Add( m_bitmapServerDir, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapServerDir = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer270->Add( m_bitmapServerDir, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticText1232 = new wxStaticText( m_panel41, wxID_ANY, _("Directory on server:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText1232->Wrap( -1 ); - bSizer270->Add( m_staticText1232, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + m_staticText1232 = new wxStaticText( m_panel41, wxID_ANY, _("Directory on server:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText1232->Wrap( -1 ); + bSizer270->Add( m_staticText1232, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer3051->Add( bSizer270, 0, wxTOP|wxRIGHT|wxLEFT|wxALIGN_BOTTOM, 5 ); + bSizer3051->Add( bSizer270, 0, wxTOP|wxRIGHT|wxLEFT|wxALIGN_BOTTOM, 5 ); - bSizer3051->Add( 0, 0, 1, 0, 5 ); + bSizer3051->Add( 0, 0, 1, 0, 5 ); - wxBoxSizer* bSizer3031; - bSizer3031 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer3031; + bSizer3031 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer303; - bSizer303 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer303; + bSizer303 = new wxBoxSizer( wxHORIZONTAL ); - m_staticline83 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer303->Add( m_staticline83, 0, wxEXPAND, 5 ); + m_staticline83 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer303->Add( m_staticline83, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer3042; - bSizer3042 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer3042; + bSizer3042 = new wxBoxSizer( wxHORIZONTAL ); - m_staticTextTimeout = new wxStaticText( m_panel41, wxID_ANY, _("Access timeout (in seconds):"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeout->Wrap( -1 ); - bSizer3042->Add( m_staticTextTimeout, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + m_staticTextTimeout = new wxStaticText( m_panel41, wxID_ANY, _("Access timeout (in seconds):"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeout->Wrap( -1 ); + bSizer3042->Add( m_staticTextTimeout, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - m_spinCtrlTimeout = new wxSpinCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); - bSizer3042->Add( m_spinCtrlTimeout, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + m_spinCtrlTimeout = new wxSpinCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); + bSizer3042->Add( m_spinCtrlTimeout, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer303->Add( bSizer3042, 0, wxALL, 5 ); + bSizer303->Add( bSizer3042, 0, wxALL, 5 ); - bSizer3031->Add( bSizer303, 0, wxALIGN_RIGHT, 5 ); + bSizer3031->Add( bSizer303, 0, wxALIGN_RIGHT, 5 ); - m_staticline82 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer3031->Add( m_staticline82, 0, wxEXPAND, 5 ); + m_staticline82 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer3031->Add( m_staticline82, 0, wxEXPAND, 5 ); - bSizer3051->Add( bSizer3031, 0, wxBOTTOM, 10 ); + bSizer3051->Add( bSizer3031, 0, wxBOTTOM, 10 ); - bSizer269->Add( bSizer3051, 0, wxEXPAND, 5 ); + bSizer269->Add( bSizer3051, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer217; - bSizer217 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer217; + bSizer217 = new wxBoxSizer( wxHORIZONTAL ); - m_textCtrlServerPath = new wxTextCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer217->Add( m_textCtrlServerPath, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + m_textCtrlServerPath = new wxTextCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer217->Add( m_textCtrlServerPath, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - m_buttonSelectFolder = new wxButton( m_panel41, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectFolder->SetToolTip( _("Select a folder") ); + m_buttonSelectFolder = new wxButton( m_panel41, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectFolder->SetToolTip( _("Select a folder") ); - bSizer217->Add( m_buttonSelectFolder, 0, wxRIGHT|wxEXPAND, 5 ); + bSizer217->Add( m_buttonSelectFolder, 0, wxRIGHT|wxEXPAND, 5 ); - bSizer269->Add( bSizer217, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); + bSizer269->Add( bSizer217, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); - bSizer269->Add( 0, 10, 0, 0, 5 ); + bSizer269->Add( 0, 10, 0, 0, 5 ); - bSizer185->Add( bSizer269, 0, wxEXPAND, 5 ); + bSizer185->Add( bSizer269, 0, wxEXPAND, 5 ); - m_panel41->SetSizer( bSizer185 ); - m_panel41->Layout(); - bSizer185->Fit( m_panel41 ); - bSizer134->Add( m_panel41, 1, wxEXPAND, 5 ); + m_panel41->SetSizer( bSizer185 ); + m_panel41->Layout(); + bSizer185->Fit( m_panel41 ); + bSizer134->Add( m_panel41, 1, wxEXPAND, 5 ); - m_staticline571 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer134->Add( m_staticline571, 0, wxEXPAND, 5 ); + m_staticline571 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer134->Add( m_staticline571, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer219; - bSizer219 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer219; + bSizer219 = new wxBoxSizer( wxHORIZONTAL ); - bSizer219->Add( 5, 0, 0, 0, 5 ); + bSizer219->Add( 5, 0, 0, 0, 5 ); - m_bitmapPerf = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer219->Add( m_bitmapPerf, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + m_bitmapPerf = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer219->Add( m_bitmapPerf, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_staticText1361 = new wxStaticText( this, wxID_ANY, _("Performance improvements:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText1361->Wrap( -1 ); - bSizer219->Add( m_staticText1361, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); + m_staticText1361 = new wxStaticText( this, wxID_ANY, _("Performance improvements:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText1361->Wrap( -1 ); + bSizer219->Add( m_staticText1361, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); - bSizer219->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer219->Add( 0, 0, 1, wxEXPAND, 5 ); - m_hyperlink171 = new wxHyperlinkCtrl( this, wxID_ANY, _("How to get the best performance?"), wxT("https://freefilesync.org/manual.php?topic=ftp-setup"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink171->SetToolTip( _("https://freefilesync.org/manual.php?topic=ftp-setup") ); + m_hyperlink171 = new wxHyperlinkCtrl( this, wxID_ANY, _("How to get the best performance?"), wxT("https://freefilesync.org/manual.php?topic=ftp-setup"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink171->SetToolTip( _("https://freefilesync.org/manual.php?topic=ftp-setup") ); - bSizer219->Add( m_hyperlink171, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 ); + bSizer219->Add( m_hyperlink171, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 ); - bSizer134->Add( bSizer219, 0, wxEXPAND, 5 ); + bSizer134->Add( bSizer219, 0, wxEXPAND, 5 ); - m_staticline57 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer134->Add( m_staticline57, 0, wxEXPAND, 5 ); + m_staticline57 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer134->Add( m_staticline57, 0, wxEXPAND, 5 ); - m_panel411 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel411->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panel411 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel411->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer1851; - bSizer1851 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer1851; + bSizer1851 = new wxBoxSizer( wxVERTICAL ); - wxFlexGridSizer* fgSizer1611; - fgSizer1611 = new wxFlexGridSizer( 0, 2, 0, 0 ); - fgSizer1611->AddGrowableCol( 1 ); - fgSizer1611->SetFlexibleDirection( wxBOTH ); - fgSizer1611->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + wxFlexGridSizer* fgSizer1611; + fgSizer1611 = new wxFlexGridSizer( 0, 2, 0, 0 ); + fgSizer1611->AddGrowableCol( 1 ); + fgSizer1611->SetFlexibleDirection( wxBOTH ); + fgSizer1611->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - bSizerConnectionsLabel = new wxBoxSizer( wxVERTICAL ); + bSizerConnectionsLabel = new wxBoxSizer( wxVERTICAL ); - m_staticTextConnectionsLabel = new wxStaticText( m_panel411, wxID_ANY, _("Parallel file operations:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextConnectionsLabel->Wrap( -1 ); - bSizerConnectionsLabel->Add( m_staticTextConnectionsLabel, 0, 0, 5 ); + m_staticTextConnectionsLabel = new wxStaticText( m_panel411, wxID_ANY, _("Parallel file operations:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextConnectionsLabel->Wrap( -1 ); + bSizerConnectionsLabel->Add( m_staticTextConnectionsLabel, 0, 0, 5 ); - m_staticTextConnectionsLabelSub = new wxStaticText( m_panel411, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextConnectionsLabelSub->Wrap( -1 ); - bSizerConnectionsLabel->Add( m_staticTextConnectionsLabelSub, 0, wxALIGN_RIGHT, 5 ); + m_staticTextConnectionsLabelSub = new wxStaticText( m_panel411, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextConnectionsLabelSub->Wrap( -1 ); + bSizerConnectionsLabel->Add( m_staticTextConnectionsLabelSub, 0, wxALIGN_RIGHT, 5 ); - fgSizer1611->Add( bSizerConnectionsLabel, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer1611->Add( bSizerConnectionsLabel, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - wxBoxSizer* bSizer300; - bSizer300 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer300; + bSizer300 = new wxBoxSizer( wxHORIZONTAL ); - m_spinCtrlConnectionCount = new wxSpinCtrl( m_panel411, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); - bSizer300->Add( m_spinCtrlConnectionCount, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + m_spinCtrlConnectionCount = new wxSpinCtrl( m_panel411, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); + bSizer300->Add( m_spinCtrlConnectionCount, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextConnectionCountDescr = new wxStaticText( m_panel411, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextConnectionCountDescr->Wrap( -1 ); - m_staticTextConnectionCountDescr->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticTextConnectionCountDescr = new wxStaticText( m_panel411, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextConnectionCountDescr->Wrap( -1 ); + m_staticTextConnectionCountDescr->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer300->Add( m_staticTextConnectionCountDescr, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + bSizer300->Add( m_staticTextConnectionCountDescr, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_hyperlinkDeRequired = new wxHyperlinkCtrl( m_panel411, wxID_ANY, _("Requires FreeFileSync Donation Edition"), wxT("https://freefilesync.org/faq.php#donation-edition"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlinkDeRequired->SetToolTip( _("https://freefilesync.org/faq.php#donation-edition") ); + m_hyperlinkDeRequired = new wxHyperlinkCtrl( m_panel411, wxID_ANY, _("Requires FreeFileSync Donation Edition"), wxT("https://freefilesync.org/faq.php#donation-edition"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlinkDeRequired->SetToolTip( _("https://freefilesync.org/faq.php#donation-edition") ); - bSizer300->Add( m_hyperlinkDeRequired, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer300->Add( m_hyperlinkDeRequired, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - fgSizer1611->Add( bSizer300, 0, wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer1611->Add( bSizer300, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextChannelCountSftp = new wxStaticText( m_panel411, wxID_ANY, _("SFTP channels per connection:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextChannelCountSftp->Wrap( -1 ); - fgSizer1611->Add( m_staticTextChannelCountSftp, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT, 5 ); + m_staticTextChannelCountSftp = new wxStaticText( m_panel411, wxID_ANY, _("SFTP channels per connection:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextChannelCountSftp->Wrap( -1 ); + fgSizer1611->Add( m_staticTextChannelCountSftp, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT, 5 ); - wxBoxSizer* bSizer3001; - bSizer3001 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer3001; + bSizer3001 = new wxBoxSizer( wxHORIZONTAL ); - m_spinCtrlChannelCountSftp = new wxSpinCtrl( m_panel411, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); - bSizer3001->Add( m_spinCtrlChannelCountSftp, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + m_spinCtrlChannelCountSftp = new wxSpinCtrl( m_panel411, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); + bSizer3001->Add( m_spinCtrlChannelCountSftp, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - m_buttonChannelCountSftp = new wxButton( m_panel411, wxID_ANY, _("Detect server limit"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer3001->Add( m_buttonChannelCountSftp, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + m_buttonChannelCountSftp = new wxButton( m_panel411, wxID_ANY, _("Detect server limit"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer3001->Add( m_buttonChannelCountSftp, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - fgSizer1611->Add( bSizer3001, 0, wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer1611->Add( bSizer3001, 0, wxALIGN_CENTER_VERTICAL, 5 ); - fgSizer1611->Add( 0, 0, 0, 0, 5 ); + fgSizer1611->Add( 0, 0, 0, 0, 5 ); - wxBoxSizer* bSizer304; - bSizer304 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer304; + bSizer304 = new wxBoxSizer( wxHORIZONTAL ); - m_checkBoxAllowZlib = new wxCheckBox( m_panel411, wxID_ANY, _("Enable &compression"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer304->Add( m_checkBoxAllowZlib, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + m_checkBoxAllowZlib = new wxCheckBox( m_panel411, wxID_ANY, _("Enable &compression"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer304->Add( m_checkBoxAllowZlib, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_staticTextZlibDescr = new wxStaticText( m_panel411, wxID_ANY, _("(zlib)"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextZlibDescr->Wrap( -1 ); - m_staticTextZlibDescr->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticTextZlibDescr = new wxStaticText( m_panel411, wxID_ANY, _("(zlib)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextZlibDescr->Wrap( -1 ); + m_staticTextZlibDescr->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer304->Add( m_staticTextZlibDescr, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + bSizer304->Add( m_staticTextZlibDescr, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - fgSizer1611->Add( bSizer304, 0, wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer1611->Add( bSizer304, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer1851->Add( fgSizer1611, 0, wxALL, 5 ); + bSizer1851->Add( fgSizer1611, 0, wxALL, 5 ); - m_panel411->SetSizer( bSizer1851 ); - m_panel411->Layout(); - bSizer1851->Fit( m_panel411 ); - bSizer134->Add( m_panel411, 0, wxEXPAND, 5 ); + m_panel411->SetSizer( bSizer1851 ); + m_panel411->Layout(); + bSizer1851->Fit( m_panel411 ); + bSizer134->Add( m_panel411, 0, wxEXPAND, 5 ); - m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer134->Add( m_staticline12, 0, wxEXPAND, 5 ); + m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer134->Add( m_staticline12, 0, wxEXPAND, 5 ); - bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); - m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonOkay->SetDefault(); - m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonOkay->SetDefault(); + m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizerStdButtons->Add( m_buttonOkay, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizerStdButtons->Add( m_buttonOkay, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer134->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); + bSizer134->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); - this->SetSizer( bSizer134 ); - this->Layout(); - bSizer134->Fit( this ); + this->SetSizer( bSizer134 ); + this->Layout(); + bSizer134->Fit( this ); - this->Centre( wxBOTH ); + this->Centre( wxBOTH ); - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CloudSetupDlgGenerated::onClose ) ); - m_toggleBtnGdrive->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onConnectionGdrive ), NULL, this ); - m_toggleBtnSftp->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onConnectionSftp ), NULL, this ); - m_toggleBtnFtp->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onConnectionFtp ), NULL, this ); - m_listBoxGdriveUsers->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( CloudSetupDlgGenerated::onGdriveUserSelect ), NULL, this ); - m_buttonGdriveAddUser->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onGdriveUserAdd ), NULL, this ); - m_buttonGdriveRemoveUser->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onGdriveUserRemove ), NULL, this ); - m_radioBtnPassword->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CloudSetupDlgGenerated::onAuthPassword ), NULL, this ); - m_radioBtnKeyfile->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CloudSetupDlgGenerated::onAuthKeyfile ), NULL, this ); - m_radioBtnAgent->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CloudSetupDlgGenerated::onAuthAgent ), NULL, this ); - m_buttonSelectKeyfile->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onSelectKeyfile ), NULL, this ); - m_textCtrlPasswordVisible->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( CloudSetupDlgGenerated::onTypingPassword ), NULL, this ); - m_textCtrlPasswordHidden->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( CloudSetupDlgGenerated::onTypingPassword ), NULL, this ); - m_checkBoxShowPassword->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onToggleShowPassword ), NULL, this ); - m_checkBoxPasswordPrompt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onTogglePasswordPrompt ), NULL, this ); - m_buttonSelectFolder->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onBrowseCloudFolder ), NULL, this ); - m_buttonChannelCountSftp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onDetectServerChannelLimit ), NULL, this ); - m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onOkay ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onCancel ), NULL, this ); + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CloudSetupDlgGenerated::onClose ) ); + m_toggleBtnGdrive->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onConnectionGdrive ), NULL, this ); + m_toggleBtnSftp->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onConnectionSftp ), NULL, this ); + m_toggleBtnFtp->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onConnectionFtp ), NULL, this ); + m_listBoxGdriveUsers->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( CloudSetupDlgGenerated::onGdriveUserSelect ), NULL, this ); + m_buttonGdriveAddUser->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onGdriveUserAdd ), NULL, this ); + m_buttonGdriveRemoveUser->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onGdriveUserRemove ), NULL, this ); + m_radioBtnPassword->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CloudSetupDlgGenerated::onAuthPassword ), NULL, this ); + m_radioBtnKeyfile->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CloudSetupDlgGenerated::onAuthKeyfile ), NULL, this ); + m_radioBtnAgent->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CloudSetupDlgGenerated::onAuthAgent ), NULL, this ); + m_buttonSelectKeyfile->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onSelectKeyfile ), NULL, this ); + m_textCtrlPasswordVisible->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( CloudSetupDlgGenerated::onTypingPassword ), NULL, this ); + m_textCtrlPasswordHidden->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( CloudSetupDlgGenerated::onTypingPassword ), NULL, this ); + m_checkBoxShowPassword->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onToggleShowPassword ), NULL, this ); + m_checkBoxPasswordPrompt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onTogglePasswordPrompt ), NULL, this ); + m_buttonSelectFolder->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onBrowseCloudFolder ), NULL, this ); + m_buttonChannelCountSftp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onDetectServerChannelLimit ), NULL, this ); + m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onOkay ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::onCancel ), NULL, this ); } CloudSetupDlgGenerated::~CloudSetupDlgGenerated() @@ -3178,61 +3178,61 @@ CloudSetupDlgGenerated::~CloudSetupDlgGenerated() AbstractFolderPickerGenerated::AbstractFolderPickerGenerated( 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 ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer134; - bSizer134 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer134; + bSizer134 = new wxBoxSizer( wxVERTICAL ); - m_panel41 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel41->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panel41 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel41->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer185; - bSizer185 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer185; + bSizer185 = new wxBoxSizer( wxVERTICAL ); - m_staticTextStatus = new wxStaticText( m_panel41, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatus->Wrap( -1 ); - bSizer185->Add( m_staticTextStatus, 0, wxALL, 5 ); + m_staticTextStatus = new wxStaticText( m_panel41, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatus->Wrap( -1 ); + bSizer185->Add( m_staticTextStatus, 0, wxALL, 5 ); - m_treeCtrlFileSystem = new wxTreeCtrl( m_panel41, wxID_ANY, wxDefaultPosition, wxSize( -1, -1 ), wxTR_FULL_ROW_HIGHLIGHT|wxTR_HAS_BUTTONS|wxTR_LINES_AT_ROOT|wxTR_NO_LINES|wxBORDER_NONE ); - bSizer185->Add( m_treeCtrlFileSystem, 1, wxEXPAND, 5 ); + m_treeCtrlFileSystem = new wxTreeCtrl( m_panel41, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxTR_FULL_ROW_HIGHLIGHT|wxTR_HAS_BUTTONS|wxTR_LINES_AT_ROOT|wxTR_NO_LINES|wxBORDER_NONE ); + bSizer185->Add( m_treeCtrlFileSystem, 1, wxEXPAND, 5 ); - m_panel41->SetSizer( bSizer185 ); - m_panel41->Layout(); - bSizer185->Fit( m_panel41 ); - bSizer134->Add( m_panel41, 1, wxEXPAND, 5 ); + m_panel41->SetSizer( bSizer185 ); + m_panel41->Layout(); + bSizer185->Fit( m_panel41 ); + bSizer134->Add( m_panel41, 1, wxEXPAND, 5 ); - m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer134->Add( m_staticline12, 0, wxEXPAND, 5 ); + m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer134->Add( m_staticline12, 0, wxEXPAND, 5 ); - bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); - m_buttonOkay = new wxButton( this, wxID_OK, _("Select Folder"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonOkay = new wxButton( this, wxID_OK, _("Select Folder"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonOkay->SetDefault(); - m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonOkay->SetDefault(); + m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizerStdButtons->Add( m_buttonOkay, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizerStdButtons->Add( m_buttonOkay, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer134->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); + bSizer134->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); - this->SetSizer( bSizer134 ); - this->Layout(); - bSizer134->Fit( this ); + this->SetSizer( bSizer134 ); + this->Layout(); + bSizer134->Fit( this ); - this->Centre( wxBOTH ); + this->Centre( wxBOTH ); - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AbstractFolderPickerGenerated::onClose ) ); - m_treeCtrlFileSystem->Connect( wxEVT_COMMAND_TREE_ITEM_EXPANDING, wxTreeEventHandler( AbstractFolderPickerGenerated::onExpandNode ), NULL, this ); - m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AbstractFolderPickerGenerated::onOkay ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AbstractFolderPickerGenerated::onCancel ), NULL, this ); + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AbstractFolderPickerGenerated::onClose ) ); + m_treeCtrlFileSystem->Connect( wxEVT_COMMAND_TREE_ITEM_EXPANDING, wxTreeEventHandler( AbstractFolderPickerGenerated::onExpandNode ), NULL, this ); + m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AbstractFolderPickerGenerated::onOkay ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AbstractFolderPickerGenerated::onCancel ), NULL, this ); } AbstractFolderPickerGenerated::~AbstractFolderPickerGenerated() @@ -3241,225 +3241,225 @@ AbstractFolderPickerGenerated::~AbstractFolderPickerGenerated() SyncConfirmationDlgGenerated::SyncConfirmationDlgGenerated( 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 ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer134; - bSizer134 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer134; + bSizer134 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapSync = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer72->Add( m_bitmapSync, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); + m_bitmapSync = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer72->Add( m_bitmapSync, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); - m_staticTextCaption = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextCaption->Wrap( -1 ); - bSizer72->Add( m_staticTextCaption, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 ); + m_staticTextCaption = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextCaption->Wrap( -1 ); + bSizer72->Add( m_staticTextCaption, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 ); - bSizer134->Add( bSizer72, 0, 0, 5 ); + bSizer134->Add( bSizer72, 0, 0, 5 ); - m_staticline371 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer134->Add( m_staticline371, 0, wxEXPAND, 5 ); + m_staticline371 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer134->Add( m_staticline371, 0, wxEXPAND, 5 ); - m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer185; - bSizer185 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer185; + bSizer185 = new wxBoxSizer( wxHORIZONTAL ); - bSizer185->Add( 40, 0, 0, 0, 5 ); + bSizer185->Add( 40, 0, 0, 0, 5 ); - bSizer185->Add( 0, 0, 1, 0, 5 ); + bSizer185->Add( 0, 0, 1, 0, 5 ); - m_staticline38 = new wxStaticLine( m_panelStatistics, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer185->Add( m_staticline38, 0, wxEXPAND, 5 ); + m_staticline38 = new wxStaticLine( m_panelStatistics, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer185->Add( m_staticline38, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer162; - bSizer162 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer162; + bSizer162 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer182; - bSizer182 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer182; + bSizer182 = new wxBoxSizer( wxHORIZONTAL ); - m_staticText84 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Variant:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText84->Wrap( -1 ); - bSizer182->Add( m_staticText84, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + m_staticText84 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Variant:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText84->Wrap( -1 ); + bSizer182->Add( m_staticText84, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - bSizer182->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer182->Add( 0, 0, 1, wxEXPAND, 5 ); - m_staticTextSyncVar = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextSyncVar->Wrap( -1 ); - m_staticTextSyncVar->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_staticTextSyncVar = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextSyncVar->Wrap( -1 ); + m_staticTextSyncVar->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer182->Add( m_staticTextSyncVar, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + bSizer182->Add( m_staticTextSyncVar, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_bitmapSyncVar = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer182->Add( m_bitmapSyncVar, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + m_bitmapSyncVar = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer182->Add( m_bitmapSyncVar, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer182->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizer182->Add( 0, 0, 1, wxEXPAND, 5 ); - bSizer162->Add( bSizer182, 0, wxALL|wxEXPAND, 5 ); + bSizer162->Add( bSizer182, 0, wxALL|wxEXPAND, 5 ); - m_staticline14 = new wxStaticLine( m_panelStatistics, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer162->Add( m_staticline14, 0, wxEXPAND, 5 ); + m_staticline14 = new wxStaticLine( m_panelStatistics, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer162->Add( m_staticline14, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer181; - bSizer181 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer181; + bSizer181 = new wxBoxSizer( wxVERTICAL ); - m_staticText83 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Statistics:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText83->Wrap( -1 ); - bSizer181->Add( m_staticText83, 0, wxALL, 5 ); + m_staticText83 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Statistics:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText83->Wrap( -1 ); + bSizer181->Add( m_staticText83, 0, wxALL, 5 ); - wxFlexGridSizer* fgSizer11; - fgSizer11 = new wxFlexGridSizer( 2, 7, 2, 5 ); - fgSizer11->SetFlexibleDirection( wxBOTH ); - fgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + wxFlexGridSizer* fgSizer11; + fgSizer11 = new wxFlexGridSizer( 2, 7, 2, 5 ); + fgSizer11->SetFlexibleDirection( wxBOTH ); + fgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_bitmapDeleteLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") ); + m_bitmapDeleteLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") ); - fgSizer11->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer11->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bitmapUpdateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapUpdateLeft->SetToolTip( _("Number of files that will be updated") ); + m_bitmapUpdateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapUpdateLeft->SetToolTip( _("Number of files that will be updated") ); - fgSizer11->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer11->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_bitmapCreateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapCreateLeft->SetToolTip( _("Number of files and folders that will be created") ); + m_bitmapCreateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapCreateLeft->SetToolTip( _("Number of files and folders that will be created") ); - fgSizer11->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + fgSizer11->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapData->SetToolTip( _("Total bytes to copy") ); + m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapData->SetToolTip( _("Total bytes to copy") ); - fgSizer11->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + fgSizer11->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bitmapCreateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapCreateRight->SetToolTip( _("Number of files and folders that will be created") ); + m_bitmapCreateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapCreateRight->SetToolTip( _("Number of files and folders that will be created") ); - fgSizer11->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + fgSizer11->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bitmapUpdateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapUpdateRight->SetToolTip( _("Number of files that will be updated") ); + m_bitmapUpdateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapUpdateRight->SetToolTip( _("Number of files that will be updated") ); - fgSizer11->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + fgSizer11->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bitmapDeleteRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") ); + m_bitmapDeleteRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") ); - fgSizer11->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer11->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextDeleteLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDeleteLeft->Wrap( -1 ); - m_staticTextDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") ); + m_staticTextDeleteLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDeleteLeft->Wrap( -1 ); + m_staticTextDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") ); - fgSizer11->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer11->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextUpdateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextUpdateLeft->Wrap( -1 ); - m_staticTextUpdateLeft->SetToolTip( _("Number of files that will be updated") ); + m_staticTextUpdateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextUpdateLeft->Wrap( -1 ); + m_staticTextUpdateLeft->SetToolTip( _("Number of files that will be updated") ); - fgSizer11->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + fgSizer11->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_staticTextCreateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextCreateLeft->Wrap( -1 ); - m_staticTextCreateLeft->SetToolTip( _("Number of files and folders that will be created") ); + m_staticTextCreateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextCreateLeft->Wrap( -1 ); + m_staticTextCreateLeft->SetToolTip( _("Number of files and folders that will be created") ); - fgSizer11->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + fgSizer11->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_staticTextData = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextData->Wrap( -1 ); - m_staticTextData->SetToolTip( _("Total bytes to copy") ); + m_staticTextData = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextData->Wrap( -1 ); + m_staticTextData->SetToolTip( _("Total bytes to copy") ); - fgSizer11->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer11->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextCreateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextCreateRight->Wrap( -1 ); - m_staticTextCreateRight->SetToolTip( _("Number of files and folders that will be created") ); + m_staticTextCreateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextCreateRight->Wrap( -1 ); + m_staticTextCreateRight->SetToolTip( _("Number of files and folders that will be created") ); - fgSizer11->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer11->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextUpdateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextUpdateRight->Wrap( -1 ); - m_staticTextUpdateRight->SetToolTip( _("Number of files that will be updated") ); + m_staticTextUpdateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextUpdateRight->Wrap( -1 ); + m_staticTextUpdateRight->SetToolTip( _("Number of files that will be updated") ); - fgSizer11->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer11->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextDeleteRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDeleteRight->Wrap( -1 ); - m_staticTextDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") ); + m_staticTextDeleteRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDeleteRight->Wrap( -1 ); + m_staticTextDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") ); - fgSizer11->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer11->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer181->Add( fgSizer11, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + bSizer181->Add( fgSizer11, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - bSizer162->Add( bSizer181, 0, wxEXPAND|wxALL, 5 ); + bSizer162->Add( bSizer181, 0, wxEXPAND|wxALL, 5 ); - bSizer185->Add( bSizer162, 0, 0, 5 ); + bSizer185->Add( bSizer162, 0, 0, 5 ); - m_staticline381 = new wxStaticLine( m_panelStatistics, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer185->Add( m_staticline381, 0, wxEXPAND, 5 ); + m_staticline381 = new wxStaticLine( m_panelStatistics, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer185->Add( m_staticline381, 0, wxEXPAND, 5 ); - bSizer185->Add( 0, 0, 1, 0, 5 ); + bSizer185->Add( 0, 0, 1, 0, 5 ); - bSizer185->Add( 40, 0, 0, 0, 5 ); + bSizer185->Add( 40, 0, 0, 0, 5 ); - m_panelStatistics->SetSizer( bSizer185 ); - m_panelStatistics->Layout(); - bSizer185->Fit( m_panelStatistics ); - bSizer134->Add( m_panelStatistics, 0, wxEXPAND, 5 ); + m_panelStatistics->SetSizer( bSizer185 ); + m_panelStatistics->Layout(); + bSizer185->Fit( m_panelStatistics ); + bSizer134->Add( m_panelStatistics, 0, wxEXPAND, 5 ); - m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer134->Add( m_staticline12, 0, wxEXPAND, 5 ); + m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer134->Add( m_staticline12, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer164; - bSizer164 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer164; + bSizer164 = new wxBoxSizer( wxVERTICAL ); - m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("&Don't show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer164->Add( m_checkBoxDontShowAgain, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("&Don't show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer164->Add( m_checkBoxDontShowAgain, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); - m_buttonStartSync = new wxButton( this, wxID_OK, _("Start"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonStartSync = new wxButton( this, wxID_OK, _("Start"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonStartSync->SetDefault(); - m_buttonStartSync->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonStartSync->SetDefault(); + m_buttonStartSync->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizerStdButtons->Add( m_buttonStartSync, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + bSizerStdButtons->Add( m_buttonStartSync, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 5 ); + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 5 ); - bSizer164->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); + bSizer164->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); - bSizer134->Add( bSizer164, 1, wxEXPAND, 5 ); + bSizer134->Add( bSizer164, 1, wxEXPAND, 5 ); - this->SetSizer( bSizer134 ); - this->Layout(); - bSizer134->Fit( this ); + this->SetSizer( bSizer134 ); + this->Layout(); + bSizer134->Fit( this ); - this->Centre( wxBOTH ); + this->Centre( wxBOTH ); - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncConfirmationDlgGenerated::onClose ) ); - m_buttonStartSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncConfirmationDlgGenerated::onStartSync ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncConfirmationDlgGenerated::onCancel ), NULL, this ); + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncConfirmationDlgGenerated::onClose ) ); + m_buttonStartSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncConfirmationDlgGenerated::onStartSync ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncConfirmationDlgGenerated::onCancel ), NULL, this ); } SyncConfirmationDlgGenerated::~SyncConfirmationDlgGenerated() @@ -3468,257 +3468,257 @@ SyncConfirmationDlgGenerated::~SyncConfirmationDlgGenerated() CompareProgressDlgGenerated::CompareProgressDlgGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxPanel( parent, id, pos, size, style, name ) { - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer1811; - bSizer1811 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer1811; + bSizer1811 = new wxBoxSizer( wxVERTICAL ); - bSizer1811->Add( 0, 0, 1, 0, 5 ); + bSizer1811->Add( 0, 0, 1, 0, 5 ); - m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatus->Wrap( -1 ); - bSizer1811->Add( m_staticTextStatus, 0, wxTOP|wxRIGHT|wxLEFT, 10 ); + m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatus->Wrap( -1 ); + bSizer1811->Add( m_staticTextStatus, 0, wxTOP|wxRIGHT|wxLEFT, 10 ); - wxBoxSizer* bSizer199; - bSizer199 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer199; + bSizer199 = new wxBoxSizer( wxHORIZONTAL ); - bSizer199->Add( 10, 0, 0, 0, 5 ); + bSizer199->Add( 10, 0, 0, 0, 5 ); - ffgSizer11 = new wxFlexGridSizer( 2, 0, 5, 5 ); - ffgSizer11->SetFlexibleDirection( wxBOTH ); - ffgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + ffgSizer11 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer11->SetFlexibleDirection( wxBOTH ); + ffgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_staticTextProcessed = new wxStaticText( this, wxID_ANY, _("Processed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextProcessed->Wrap( -1 ); - ffgSizer11->Add( m_staticTextProcessed, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT, 5 ); + m_staticTextProcessed = new wxStaticText( this, wxID_ANY, _("Processed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextProcessed->Wrap( -1 ); + ffgSizer11->Add( m_staticTextProcessed, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT, 5 ); - m_staticTextRemaining = new wxStaticText( this, wxID_ANY, _("Remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextRemaining->Wrap( -1 ); - ffgSizer11->Add( m_staticTextRemaining, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_staticTextRemaining = new wxStaticText( this, wxID_ANY, _("Remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextRemaining->Wrap( -1 ); + ffgSizer11->Add( m_staticTextRemaining, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - bSizer199->Add( ffgSizer11, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 10 ); + bSizer199->Add( ffgSizer11, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 10 ); - m_panelItemStats = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelItemStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + m_panelItemStats = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_panelItemStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer291; - bSizer291 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer291; + bSizer291 = new wxBoxSizer( wxHORIZONTAL ); - ffgSizer111 = new wxFlexGridSizer( 0, 2, 5, 5 ); - ffgSizer111->SetFlexibleDirection( wxBOTH ); - ffgSizer111->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + ffgSizer111 = new wxFlexGridSizer( 0, 2, 5, 5 ); + ffgSizer111->SetFlexibleDirection( wxBOTH ); + ffgSizer111->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - wxBoxSizer* bSizer293; - bSizer293 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer293; + bSizer293 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapItemStat = new wxStaticBitmap( m_panelItemStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer293->Add( m_bitmapItemStat, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_bitmapItemStat = new wxStaticBitmap( m_panelItemStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer293->Add( m_bitmapItemStat, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - bSizer293->Add( 0, 0, 1, 0, 5 ); + bSizer293->Add( 0, 0, 1, 0, 5 ); - m_staticTextItemsProcessed = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_staticTextItemsProcessed->Wrap( -1 ); - m_staticTextItemsProcessed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_staticTextItemsProcessed = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_staticTextItemsProcessed->Wrap( -1 ); + m_staticTextItemsProcessed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer293->Add( m_staticTextItemsProcessed, 0, wxALIGN_BOTTOM, 5 ); + bSizer293->Add( m_staticTextItemsProcessed, 0, wxALIGN_BOTTOM, 5 ); - ffgSizer111->Add( bSizer293, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + ffgSizer111->Add( bSizer293, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - m_staticTextBytesProcessed = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextBytesProcessed->Wrap( -1 ); - ffgSizer111->Add( m_staticTextBytesProcessed, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); + m_staticTextBytesProcessed = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextBytesProcessed->Wrap( -1 ); + ffgSizer111->Add( m_staticTextBytesProcessed, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); - m_staticTextItemsRemaining = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_staticTextItemsRemaining->Wrap( -1 ); - m_staticTextItemsRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_staticTextItemsRemaining = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_staticTextItemsRemaining->Wrap( -1 ); + m_staticTextItemsRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - ffgSizer111->Add( m_staticTextItemsRemaining, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); + ffgSizer111->Add( m_staticTextItemsRemaining, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); - m_staticTextBytesRemaining = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextBytesRemaining->Wrap( -1 ); - ffgSizer111->Add( m_staticTextBytesRemaining, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); + m_staticTextBytesRemaining = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextBytesRemaining->Wrap( -1 ); + ffgSizer111->Add( m_staticTextBytesRemaining, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); - bSizer291->Add( ffgSizer111, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer291->Add( ffgSizer111, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - m_panelItemStats->SetSizer( bSizer291 ); - m_panelItemStats->Layout(); - bSizer291->Fit( m_panelItemStats ); - bSizer199->Add( m_panelItemStats, 0, wxTOP|wxBOTTOM|wxRIGHT|wxEXPAND, 10 ); + m_panelItemStats->SetSizer( bSizer291 ); + m_panelItemStats->Layout(); + bSizer291->Fit( m_panelItemStats ); + bSizer199->Add( m_panelItemStats, 0, wxTOP|wxBOTTOM|wxRIGHT|wxEXPAND, 10 ); - m_panelTimeStats = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelTimeStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + m_panelTimeStats = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_panelTimeStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer292; - bSizer292 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer292; + bSizer292 = new wxBoxSizer( wxHORIZONTAL ); - ffgSizer112 = new wxFlexGridSizer( 0, 1, 5, 5 ); - ffgSizer112->SetFlexibleDirection( wxBOTH ); - ffgSizer112->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + ffgSizer112 = new wxFlexGridSizer( 0, 1, 5, 5 ); + ffgSizer112->SetFlexibleDirection( wxBOTH ); + ffgSizer112->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - wxBoxSizer* bSizer294; - bSizer294 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer294; + bSizer294 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapTimeStat = new wxStaticBitmap( m_panelTimeStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer294->Add( m_bitmapTimeStat, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_bitmapTimeStat = new wxStaticBitmap( m_panelTimeStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer294->Add( m_bitmapTimeStat, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - bSizer294->Add( 0, 0, 1, 0, 5 ); + bSizer294->Add( 0, 0, 1, 0, 5 ); - m_staticTextTimeElapsed = new wxStaticText( m_panelTimeStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeElapsed->Wrap( -1 ); - m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_staticTextTimeElapsed = new wxStaticText( m_panelTimeStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeElapsed->Wrap( -1 ); + m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer294->Add( m_staticTextTimeElapsed, 0, wxALIGN_BOTTOM, 5 ); + bSizer294->Add( m_staticTextTimeElapsed, 0, wxALIGN_BOTTOM, 5 ); - ffgSizer112->Add( bSizer294, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + ffgSizer112->Add( bSizer294, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - m_staticTextTimeRemaining = new wxStaticText( m_panelTimeStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeRemaining->Wrap( -1 ); - m_staticTextTimeRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_staticTextTimeRemaining = new wxStaticText( m_panelTimeStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeRemaining->Wrap( -1 ); + m_staticTextTimeRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - ffgSizer112->Add( m_staticTextTimeRemaining, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); + ffgSizer112->Add( m_staticTextTimeRemaining, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); - bSizer292->Add( ffgSizer112, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer292->Add( ffgSizer112, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - m_panelTimeStats->SetSizer( bSizer292 ); - m_panelTimeStats->Layout(); - bSizer292->Fit( m_panelTimeStats ); - bSizer199->Add( m_panelTimeStats, 0, wxTOP|wxBOTTOM|wxRIGHT|wxEXPAND, 10 ); + m_panelTimeStats->SetSizer( bSizer292 ); + m_panelTimeStats->Layout(); + bSizer292->Fit( m_panelTimeStats ); + bSizer199->Add( m_panelTimeStats, 0, wxTOP|wxBOTTOM|wxRIGHT|wxEXPAND, 10 ); - ffgSizer114 = new wxFlexGridSizer( 2, 0, 5, 5 ); - ffgSizer114->SetFlexibleDirection( wxBOTH ); - ffgSizer114->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + ffgSizer114 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer114->SetFlexibleDirection( wxBOTH ); + ffgSizer114->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_staticTextErrors = new wxStaticText( this, wxID_ANY, _("Errors:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextErrors->Wrap( -1 ); - ffgSizer114->Add( m_staticTextErrors, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT, 5 ); + m_staticTextErrors = new wxStaticText( this, wxID_ANY, _("Errors:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextErrors->Wrap( -1 ); + ffgSizer114->Add( m_staticTextErrors, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT, 5 ); - m_staticTextWarnings = new wxStaticText( this, wxID_ANY, _("Warnings:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextWarnings->Wrap( -1 ); - ffgSizer114->Add( m_staticTextWarnings, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_staticTextWarnings = new wxStaticText( this, wxID_ANY, _("Warnings:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextWarnings->Wrap( -1 ); + ffgSizer114->Add( m_staticTextWarnings, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - bSizer199->Add( ffgSizer114, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 10 ); + bSizer199->Add( ffgSizer114, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 10 ); - m_panelErrorStats = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelErrorStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + m_panelErrorStats = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_panelErrorStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer2921; - bSizer2921 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer2921; + bSizer2921 = new wxBoxSizer( wxHORIZONTAL ); - ffgSizer1121 = new wxFlexGridSizer( 0, 2, 5, 5 ); - ffgSizer1121->SetFlexibleDirection( wxBOTH ); - ffgSizer1121->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + ffgSizer1121 = new wxFlexGridSizer( 0, 2, 5, 5 ); + ffgSizer1121->SetFlexibleDirection( wxBOTH ); + ffgSizer1121->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_bitmapErrors = new wxStaticBitmap( m_panelErrorStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - ffgSizer1121->Add( m_bitmapErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapErrors = new wxStaticBitmap( m_panelErrorStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + ffgSizer1121->Add( m_bitmapErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextErrorCount = new wxStaticText( m_panelErrorStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextErrorCount->Wrap( -1 ); - m_staticTextErrorCount->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_staticTextErrorCount = new wxStaticText( m_panelErrorStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextErrorCount->Wrap( -1 ); + m_staticTextErrorCount->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - ffgSizer1121->Add( m_staticTextErrorCount, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); + ffgSizer1121->Add( m_staticTextErrorCount, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); - m_bitmapWarnings = new wxStaticBitmap( m_panelErrorStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - ffgSizer1121->Add( m_bitmapWarnings, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapWarnings = new wxStaticBitmap( m_panelErrorStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + ffgSizer1121->Add( m_bitmapWarnings, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextWarningCount = new wxStaticText( m_panelErrorStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextWarningCount->Wrap( -1 ); - m_staticTextWarningCount->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_staticTextWarningCount = new wxStaticText( m_panelErrorStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextWarningCount->Wrap( -1 ); + m_staticTextWarningCount->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - ffgSizer1121->Add( m_staticTextWarningCount, 0, wxALIGN_BOTTOM|wxALIGN_RIGHT, 5 ); + ffgSizer1121->Add( m_staticTextWarningCount, 0, wxALIGN_BOTTOM|wxALIGN_RIGHT, 5 ); - bSizer2921->Add( ffgSizer1121, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer2921->Add( ffgSizer1121, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - m_panelErrorStats->SetSizer( bSizer2921 ); - m_panelErrorStats->Layout(); - bSizer2921->Fit( m_panelErrorStats ); - bSizer199->Add( m_panelErrorStats, 0, wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT, 10 ); + m_panelErrorStats->SetSizer( bSizer2921 ); + m_panelErrorStats->Layout(); + bSizer2921->Fit( m_panelErrorStats ); + bSizer199->Add( m_panelErrorStats, 0, wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT, 10 ); - ffgSizer1141 = new wxFlexGridSizer( 2, 0, 5, 5 ); - ffgSizer1141->SetFlexibleDirection( wxBOTH ); - ffgSizer1141->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + ffgSizer1141 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer1141->SetFlexibleDirection( wxBOTH ); + ffgSizer1141->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - bSizerErrorsRetry = new wxBoxSizer( wxHORIZONTAL ); + bSizerErrorsRetry = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapRetryErrors = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizerErrorsRetry->Add( m_bitmapRetryErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapRetryErrors = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerErrorsRetry->Add( m_bitmapRetryErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticText1461 = new wxStaticText( this, wxID_ANY, _("Automatic retry"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText1461->Wrap( -1 ); - bSizerErrorsRetry->Add( m_staticText1461, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + m_staticText1461 = new wxStaticText( this, wxID_ANY, _("Automatic retry"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText1461->Wrap( -1 ); + bSizerErrorsRetry->Add( m_staticText1461, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - m_staticTextRetryCount = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextRetryCount->Wrap( -1 ); - bSizerErrorsRetry->Add( m_staticTextRetryCount, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + m_staticTextRetryCount = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextRetryCount->Wrap( -1 ); + bSizerErrorsRetry->Add( m_staticTextRetryCount, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - ffgSizer1141->Add( bSizerErrorsRetry, 0, wxALIGN_CENTER_VERTICAL, 10 ); + ffgSizer1141->Add( bSizerErrorsRetry, 0, wxALIGN_CENTER_VERTICAL, 10 ); - bSizerErrorsIgnore = new wxBoxSizer( wxHORIZONTAL ); + bSizerErrorsIgnore = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapIgnoreErrors = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizerErrorsIgnore->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapIgnoreErrors = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerErrorsIgnore->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticText146 = new wxStaticText( this, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText146->Wrap( -1 ); - bSizerErrorsIgnore->Add( m_staticText146, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + m_staticText146 = new wxStaticText( this, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText146->Wrap( -1 ); + bSizerErrorsIgnore->Add( m_staticText146, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - ffgSizer1141->Add( bSizerErrorsIgnore, 0, wxALIGN_CENTER_VERTICAL, 10 ); + ffgSizer1141->Add( bSizerErrorsIgnore, 0, wxALIGN_CENTER_VERTICAL, 10 ); - bSizer199->Add( ffgSizer1141, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); + bSizer199->Add( ffgSizer1141, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); - bSizerProgressGraph = new wxBoxSizer( wxHORIZONTAL ); + bSizerProgressGraph = new wxBoxSizer( wxHORIZONTAL ); - ffgSizer113 = new wxFlexGridSizer( 2, 0, 5, 5 ); - ffgSizer113->SetFlexibleDirection( wxBOTH ); - ffgSizer113->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + ffgSizer113 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer113->SetFlexibleDirection( wxBOTH ); + ffgSizer113->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - wxStaticText* m_staticText99; - m_staticText99 = new wxStaticText( this, wxID_ANY, _("Bytes:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText99->Wrap( -1 ); - ffgSizer113->Add( m_staticText99, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + wxStaticText* m_staticText99; + m_staticText99 = new wxStaticText( this, wxID_ANY, _("Bytes:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText99->Wrap( -1 ); + ffgSizer113->Add( m_staticText99, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - wxStaticText* m_staticText100; - m_staticText100 = new wxStaticText( this, wxID_ANY, _("Items:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText100->Wrap( -1 ); - ffgSizer113->Add( m_staticText100, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + wxStaticText* m_staticText100; + m_staticText100 = new wxStaticText( this, wxID_ANY, _("Items:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText100->Wrap( -1 ); + ffgSizer113->Add( m_staticText100, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - bSizerProgressGraph->Add( ffgSizer113, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); + bSizerProgressGraph->Add( ffgSizer113, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); - m_panelProgressGraph = new zen::Graph2D( this, wxID_ANY, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_panelProgressGraph->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + m_panelProgressGraph = new zen::Graph2D( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_panelProgressGraph->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - bSizerProgressGraph->Add( m_panelProgressGraph, 1, wxEXPAND, 5 ); + bSizerProgressGraph->Add( m_panelProgressGraph, 1, wxEXPAND, 5 ); - bSizer199->Add( bSizerProgressGraph, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); + bSizer199->Add( bSizerProgressGraph, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); - bSizer1811->Add( bSizer199, 0, wxEXPAND, 5 ); + bSizer1811->Add( bSizer199, 0, wxEXPAND, 5 ); - bSizer1811->Add( 0, 0, 1, 0, 5 ); + bSizer1811->Add( 0, 0, 1, 0, 5 ); - this->SetSizer( bSizer1811 ); - this->Layout(); - bSizer1811->Fit( this ); + this->SetSizer( bSizer1811 ); + this->Layout(); + bSizer1811->Fit( this ); } CompareProgressDlgGenerated::~CompareProgressDlgGenerated() @@ -3727,394 +3727,404 @@ CompareProgressDlgGenerated::~CompareProgressDlgGenerated() SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxPanel( parent, id, pos, size, style, name ) { - bSizerRoot = new wxBoxSizer( wxVERTICAL ); + bSizerRoot = new wxBoxSizer( wxVERTICAL ); - m_panel53 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel53->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panel53 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel53->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer301; - bSizer301 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer301; + bSizer301 = new wxBoxSizer( wxVERTICAL ); - bSizer42 = new wxBoxSizer( wxHORIZONTAL ); + bSizer42 = new wxBoxSizer( wxHORIZONTAL ); - bSizer42->Add( 0, 0, 1, 0, 5 ); + bSizer42->Add( 0, 0, 1, 0, 5 ); - m_bitmapStatus = new wxStaticBitmap( m_panel53, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer42->Add( m_bitmapStatus, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapStatus = new wxStaticBitmap( m_panel53, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer42->Add( m_bitmapStatus, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextPhase = new wxStaticText( m_panel53, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextPhase->Wrap( -1 ); - m_staticTextPhase->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + wxBoxSizer* bSizer305; + bSizer305 = new wxBoxSizer( wxHORIZONTAL ); - bSizer42->Add( m_staticTextPhase, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + m_staticTextPhase = new wxStaticText( m_panel53, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextPhase->Wrap( -1 ); + m_staticTextPhase->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - wxBoxSizer* bSizer247; - bSizer247 = new wxBoxSizer( wxHORIZONTAL ); + bSizer305->Add( m_staticTextPhase, 0, wxALIGN_BOTTOM, 5 ); + m_staticTextPercentTotal = new wxStaticText( m_panel53, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextPercentTotal->Wrap( -1 ); + bSizer305->Add( m_staticTextPercentTotal, 0, wxALIGN_BOTTOM, 5 ); - bSizer247->Add( 0, 0, 1, 0, 5 ); - m_bpButtonMinimizeToTray = new wxBitmapButton( m_panel53, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonMinimizeToTray->SetToolTip( _("Minimize to notification area") ); + bSizer42->Add( bSizer305, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - bSizer247->Add( m_bpButtonMinimizeToTray, 0, wxALIGN_CENTER_VERTICAL, 5 ); + wxBoxSizer* bSizer247; + bSizer247 = new wxBoxSizer( wxHORIZONTAL ); - bSizer42->Add( bSizer247, 1, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer247->Add( 0, 0, 1, 0, 5 ); + m_bpButtonMinimizeToTray = new wxBitmapButton( m_panel53, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonMinimizeToTray->SetToolTip( _("Minimize to notification area") ); - bSizer301->Add( bSizer42, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); + bSizer247->Add( m_bpButtonMinimizeToTray, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatusText = new wxBoxSizer( wxVERTICAL ); - m_staticTextStatus = new wxStaticText( m_panel53, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatus->Wrap( -1 ); - bSizerStatusText->Add( m_staticTextStatus, 0, wxEXPAND|wxLEFT, 15 ); + bSizer42->Add( bSizer247, 1, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStatusText->Add( 0, 10, 0, 0, 5 ); + bSizer301->Add( bSizer42, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); + bSizerStatusText = new wxBoxSizer( wxVERTICAL ); - bSizer301->Add( bSizerStatusText, 0, wxEXPAND, 5 ); + m_staticTextStatus = new wxStaticText( m_panel53, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatus->Wrap( -1 ); + bSizerStatusText->Add( m_staticTextStatus, 0, wxEXPAND|wxLEFT, 15 ); - m_panel53->SetSizer( bSizer301 ); - m_panel53->Layout(); - bSizer301->Fit( m_panel53 ); - bSizerRoot->Add( m_panel53, 0, wxEXPAND, 5 ); + bSizerStatusText->Add( 0, 10, 0, 0, 5 ); - m_panelProgress = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelProgress->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer173; - bSizer173 = new wxBoxSizer( wxHORIZONTAL ); + bSizer301->Add( bSizerStatusText, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer161; - bSizer161 = new wxBoxSizer( wxVERTICAL ); - m_panelGraphBytes = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_panelGraphBytes->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panel53->SetSizer( bSizer301 ); + m_panel53->Layout(); + bSizer301->Fit( m_panel53 ); + bSizerRoot->Add( m_panel53, 0, wxEXPAND, 5 ); - bSizer161->Add( m_panelGraphBytes, 1, wxEXPAND|wxLEFT, 10 ); + m_panelProgress = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelProgress->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer232; - bSizer232 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer173; + bSizer173 = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer233; - bSizer233 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer161; + bSizer161 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer175; - bSizer175 = new wxBoxSizer( wxHORIZONTAL ); + m_panelGraphBytes = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_panelGraphBytes->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - m_bitmapGraphKeyBytes = new wxStaticBitmap( m_panelProgress, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer175->Add( m_bitmapGraphKeyBytes, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + bSizer161->Add( m_panelGraphBytes, 1, wxEXPAND|wxLEFT, 10 ); - wxStaticText* m_staticText99; - m_staticText99 = new wxStaticText( m_panelProgress, wxID_ANY, _("Bytes"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText99->Wrap( -1 ); - bSizer175->Add( m_staticText99, 0, wxALIGN_CENTER_VERTICAL, 5 ); + wxBoxSizer* bSizer232; + bSizer232 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer233; + bSizer233 = new wxBoxSizer( wxVERTICAL ); - bSizer233->Add( bSizer175, 0, wxALL, 5 ); + wxBoxSizer* bSizer175; + bSizer175 = new wxBoxSizer( wxHORIZONTAL ); + m_bitmapGraphKeyBytes = new wxStaticBitmap( m_panelProgress, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer175->Add( m_bitmapGraphKeyBytes, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - bSizer233->Add( 0, 0, 1, 0, 5 ); + wxStaticText* m_staticText99; + m_staticText99 = new wxStaticText( m_panelProgress, wxID_ANY, _("Bytes"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText99->Wrap( -1 ); + bSizer175->Add( m_staticText99, 0, wxALIGN_CENTER_VERTICAL, 5 ); - wxBoxSizer* bSizer174; - bSizer174 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapGraphKeyItems = new wxStaticBitmap( m_panelProgress, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer174->Add( m_bitmapGraphKeyItems, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + bSizer233->Add( bSizer175, 0, wxALL, 5 ); - wxStaticText* m_staticText100; - m_staticText100 = new wxStaticText( m_panelProgress, wxID_ANY, _("Items"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText100->Wrap( -1 ); - bSizer174->Add( m_staticText100, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer233->Add( 0, 0, 1, 0, 5 ); - bSizer233->Add( bSizer174, 0, wxALL, 5 ); + wxBoxSizer* bSizer174; + bSizer174 = new wxBoxSizer( wxHORIZONTAL ); + m_bitmapGraphKeyItems = new wxStaticBitmap( m_panelProgress, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer174->Add( m_bitmapGraphKeyItems, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - bSizer232->Add( bSizer233, 1, wxEXPAND|wxRIGHT|wxLEFT, 5 ); + wxStaticText* m_staticText100; + m_staticText100 = new wxStaticText( m_panelProgress, wxID_ANY, _("Items"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText100->Wrap( -1 ); + bSizer174->Add( m_staticText100, 0, wxALIGN_CENTER_VERTICAL, 5 ); - wxBoxSizer* bSizer304; - bSizer304 = new wxBoxSizer( wxHORIZONTAL ); - ffgSizer11 = new wxFlexGridSizer( 2, 0, 5, 5 ); - ffgSizer11->SetFlexibleDirection( wxBOTH ); - ffgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + bSizer233->Add( bSizer174, 0, wxALL, 5 ); - m_staticTextProcessed = new wxStaticText( m_panelProgress, wxID_ANY, _("Processed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextProcessed->Wrap( -1 ); - ffgSizer11->Add( m_staticTextProcessed, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT, 5 ); - m_staticTextRemaining = new wxStaticText( m_panelProgress, wxID_ANY, _("Remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextRemaining->Wrap( -1 ); - ffgSizer11->Add( m_staticTextRemaining, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + bSizer232->Add( bSizer233, 1, wxEXPAND|wxRIGHT|wxLEFT, 5 ); + wxBoxSizer* bSizer304; + bSizer304 = new wxBoxSizer( wxHORIZONTAL ); - bSizer304->Add( ffgSizer11, 0, wxTOP|wxBOTTOM|wxALIGN_CENTER_VERTICAL, 10 ); + ffgSizer11 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer11->SetFlexibleDirection( wxBOTH ); + ffgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_panelItemStats = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelItemStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + m_staticTextProcessed = new wxStaticText( m_panelProgress, wxID_ANY, _("Processed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextProcessed->Wrap( -1 ); + ffgSizer11->Add( m_staticTextProcessed, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT, 5 ); - wxBoxSizer* bSizer291; - bSizer291 = new wxBoxSizer( wxHORIZONTAL ); + m_staticTextRemaining = new wxStaticText( m_panelProgress, wxID_ANY, _("Remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextRemaining->Wrap( -1 ); + ffgSizer11->Add( m_staticTextRemaining, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - ffgSizer111 = new wxFlexGridSizer( 2, 0, 5, 5 ); - ffgSizer111->SetFlexibleDirection( wxBOTH ); - ffgSizer111->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - wxBoxSizer* bSizer293; - bSizer293 = new wxBoxSizer( wxHORIZONTAL ); + bSizer304->Add( ffgSizer11, 0, wxTOP|wxBOTTOM|wxALIGN_CENTER_VERTICAL, 10 ); - m_bitmapItemStat = new wxStaticBitmap( m_panelItemStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer293->Add( m_bitmapItemStat, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_panelItemStats = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_panelItemStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + wxBoxSizer* bSizer291; + bSizer291 = new wxBoxSizer( wxHORIZONTAL ); - bSizer293->Add( 0, 0, 1, 0, 5 ); + ffgSizer111 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer111->SetFlexibleDirection( wxBOTH ); + ffgSizer111->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_staticTextItemsProcessed = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_staticTextItemsProcessed->Wrap( -1 ); - m_staticTextItemsProcessed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + wxBoxSizer* bSizer293; + bSizer293 = new wxBoxSizer( wxHORIZONTAL ); - bSizer293->Add( m_staticTextItemsProcessed, 0, wxALIGN_BOTTOM, 5 ); + m_bitmapItemStat = new wxStaticBitmap( m_panelItemStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer293->Add( m_bitmapItemStat, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - ffgSizer111->Add( bSizer293, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + bSizer293->Add( 0, 0, 1, 0, 5 ); - m_staticTextBytesProcessed = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextBytesProcessed->Wrap( -1 ); - ffgSizer111->Add( m_staticTextBytesProcessed, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); + m_staticTextItemsProcessed = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_staticTextItemsProcessed->Wrap( -1 ); + m_staticTextItemsProcessed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - m_staticTextItemsRemaining = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_staticTextItemsRemaining->Wrap( -1 ); - m_staticTextItemsRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + bSizer293->Add( m_staticTextItemsProcessed, 0, wxALIGN_BOTTOM, 5 ); - ffgSizer111->Add( m_staticTextItemsRemaining, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); - m_staticTextBytesRemaining = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextBytesRemaining->Wrap( -1 ); - ffgSizer111->Add( m_staticTextBytesRemaining, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); + ffgSizer111->Add( bSizer293, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + m_staticTextBytesProcessed = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextBytesProcessed->Wrap( -1 ); + ffgSizer111->Add( m_staticTextBytesProcessed, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); - bSizer291->Add( ffgSizer111, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + m_staticTextItemsRemaining = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_staticTextItemsRemaining->Wrap( -1 ); + m_staticTextItemsRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + ffgSizer111->Add( m_staticTextItemsRemaining, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); - m_panelItemStats->SetSizer( bSizer291 ); - m_panelItemStats->Layout(); - bSizer291->Fit( m_panelItemStats ); - bSizer304->Add( m_panelItemStats, 0, wxTOP|wxBOTTOM|wxRIGHT|wxEXPAND, 10 ); + m_staticTextBytesRemaining = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextBytesRemaining->Wrap( -1 ); + ffgSizer111->Add( m_staticTextBytesRemaining, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); - m_panelTimeStats = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelTimeStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer292; - bSizer292 = new wxBoxSizer( wxHORIZONTAL ); + bSizer291->Add( ffgSizer111, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - ffgSizer112 = new wxFlexGridSizer( 2, 0, 5, 5 ); - ffgSizer112->SetFlexibleDirection( wxBOTH ); - ffgSizer112->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - wxBoxSizer* bSizer294; - bSizer294 = new wxBoxSizer( wxHORIZONTAL ); + m_panelItemStats->SetSizer( bSizer291 ); + m_panelItemStats->Layout(); + bSizer291->Fit( m_panelItemStats ); + bSizer304->Add( m_panelItemStats, 0, wxTOP|wxBOTTOM|wxRIGHT|wxEXPAND, 10 ); - m_bitmapTimeStat = new wxStaticBitmap( m_panelTimeStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer294->Add( m_bitmapTimeStat, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_panelTimeStats = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_panelTimeStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + wxBoxSizer* bSizer292; + bSizer292 = new wxBoxSizer( wxHORIZONTAL ); - bSizer294->Add( 0, 0, 1, 0, 5 ); + ffgSizer112 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer112->SetFlexibleDirection( wxBOTH ); + ffgSizer112->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_staticTextTimeElapsed = new wxStaticText( m_panelTimeStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeElapsed->Wrap( -1 ); - m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + wxBoxSizer* bSizer294; + bSizer294 = new wxBoxSizer( wxHORIZONTAL ); - bSizer294->Add( m_staticTextTimeElapsed, 0, wxALIGN_BOTTOM, 5 ); + m_bitmapTimeStat = new wxStaticBitmap( m_panelTimeStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer294->Add( m_bitmapTimeStat, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - ffgSizer112->Add( bSizer294, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + bSizer294->Add( 0, 0, 1, 0, 5 ); - m_staticTextTimeRemaining = new wxStaticText( m_panelTimeStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeRemaining->Wrap( -1 ); - m_staticTextTimeRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_staticTextTimeElapsed = new wxStaticText( m_panelTimeStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeElapsed->Wrap( -1 ); + m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - ffgSizer112->Add( m_staticTextTimeRemaining, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); + bSizer294->Add( m_staticTextTimeElapsed, 0, wxALIGN_BOTTOM, 5 ); - bSizer292->Add( ffgSizer112, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + ffgSizer112->Add( bSizer294, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + m_staticTextTimeRemaining = new wxStaticText( m_panelTimeStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeRemaining->Wrap( -1 ); + m_staticTextTimeRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - m_panelTimeStats->SetSizer( bSizer292 ); - m_panelTimeStats->Layout(); - bSizer292->Fit( m_panelTimeStats ); - bSizer304->Add( m_panelTimeStats, 0, wxTOP|wxBOTTOM|wxRIGHT|wxEXPAND, 10 ); + ffgSizer112->Add( m_staticTextTimeRemaining, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); - ffgSizer114 = new wxFlexGridSizer( 2, 0, 5, 5 ); - ffgSizer114->SetFlexibleDirection( wxBOTH ); - ffgSizer114->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_staticTextErrors = new wxStaticText( m_panelProgress, wxID_ANY, _("Errors:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextErrors->Wrap( -1 ); - ffgSizer114->Add( m_staticTextErrors, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT, 5 ); + bSizer292->Add( ffgSizer112, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextWarnings = new wxStaticText( m_panelProgress, wxID_ANY, _("Warnings:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextWarnings->Wrap( -1 ); - ffgSizer114->Add( m_staticTextWarnings, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_panelTimeStats->SetSizer( bSizer292 ); + m_panelTimeStats->Layout(); + bSizer292->Fit( m_panelTimeStats ); + bSizer304->Add( m_panelTimeStats, 0, wxTOP|wxBOTTOM|wxRIGHT|wxEXPAND, 10 ); - bSizer304->Add( ffgSizer114, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 10 ); + ffgSizer114 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer114->SetFlexibleDirection( wxBOTH ); + ffgSizer114->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_panelErrorStats = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelErrorStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + m_staticTextErrors = new wxStaticText( m_panelProgress, wxID_ANY, _("Errors:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextErrors->Wrap( -1 ); + ffgSizer114->Add( m_staticTextErrors, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT, 5 ); - wxBoxSizer* bSizer2921; - bSizer2921 = new wxBoxSizer( wxHORIZONTAL ); + m_staticTextWarnings = new wxStaticText( m_panelProgress, wxID_ANY, _("Warnings:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextWarnings->Wrap( -1 ); + ffgSizer114->Add( m_staticTextWarnings, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - ffgSizer1121 = new wxFlexGridSizer( 0, 2, 5, 5 ); - ffgSizer1121->SetFlexibleDirection( wxBOTH ); - ffgSizer1121->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_bitmapErrors = new wxStaticBitmap( m_panelErrorStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - ffgSizer1121->Add( m_bitmapErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer304->Add( ffgSizer114, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 10 ); - m_staticTextErrorCount = new wxStaticText( m_panelErrorStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextErrorCount->Wrap( -1 ); - m_staticTextErrorCount->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_panelErrorStats = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_panelErrorStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - ffgSizer1121->Add( m_staticTextErrorCount, 0, wxALIGN_BOTTOM|wxALIGN_RIGHT, 5 ); + wxBoxSizer* bSizer2921; + bSizer2921 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapWarnings = new wxStaticBitmap( m_panelErrorStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - ffgSizer1121->Add( m_bitmapWarnings, 0, wxALIGN_CENTER_VERTICAL, 5 ); + ffgSizer1121 = new wxFlexGridSizer( 0, 2, 5, 5 ); + ffgSizer1121->SetFlexibleDirection( wxBOTH ); + ffgSizer1121->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_staticTextWarningCount = new wxStaticText( m_panelErrorStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextWarningCount->Wrap( -1 ); - m_staticTextWarningCount->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_bitmapErrors = new wxStaticBitmap( m_panelErrorStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + ffgSizer1121->Add( m_bitmapErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); - ffgSizer1121->Add( m_staticTextWarningCount, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); + m_staticTextErrorCount = new wxStaticText( m_panelErrorStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextErrorCount->Wrap( -1 ); + m_staticTextErrorCount->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + ffgSizer1121->Add( m_staticTextErrorCount, 0, wxALIGN_BOTTOM|wxALIGN_RIGHT, 5 ); - bSizer2921->Add( ffgSizer1121, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapWarnings = new wxStaticBitmap( m_panelErrorStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + ffgSizer1121->Add( m_bitmapWarnings, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_staticTextWarningCount = new wxStaticText( m_panelErrorStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextWarningCount->Wrap( -1 ); + m_staticTextWarningCount->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - m_panelErrorStats->SetSizer( bSizer2921 ); - m_panelErrorStats->Layout(); - bSizer2921->Fit( m_panelErrorStats ); - bSizer304->Add( m_panelErrorStats, 0, wxTOP|wxBOTTOM|wxRIGHT|wxEXPAND, 10 ); + ffgSizer1121->Add( m_staticTextWarningCount, 0, wxALIGN_RIGHT|wxALIGN_BOTTOM, 5 ); - bSizer232->Add( bSizer304, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer2921->Add( ffgSizer1121, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer232->Add( 0, 0, 1, 0, 5 ); + m_panelErrorStats->SetSizer( bSizer2921 ); + m_panelErrorStats->Layout(); + bSizer2921->Fit( m_panelErrorStats ); + bSizer304->Add( m_panelErrorStats, 0, wxTOP|wxBOTTOM|wxRIGHT|wxEXPAND, 10 ); - bSizerDynSpace = new wxBoxSizer( wxVERTICAL ); + bSizer232->Add( bSizer304, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerDynSpace->Add( 0, 0, 0, 0, 5 ); + bSizer232->Add( 0, 0, 1, 0, 5 ); - bSizer232->Add( bSizerDynSpace, 0, 0, 5 ); + bSizerDynSpace = new wxBoxSizer( wxVERTICAL ); - bSizer161->Add( bSizer232, 0, wxEXPAND, 5 ); + bSizerDynSpace->Add( 0, 0, 0, 0, 5 ); - m_panelGraphItems = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_panelGraphItems->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - bSizer161->Add( m_panelGraphItems, 1, wxEXPAND|wxLEFT, 10 ); + bSizer232->Add( bSizerDynSpace, 0, 0, 5 ); - bSizerProgressFooter = new wxBoxSizer( wxHORIZONTAL ); - bSizerErrorsRetry = new wxBoxSizer( wxHORIZONTAL ); + bSizer161->Add( bSizer232, 0, wxEXPAND, 5 ); - m_bitmapRetryErrors = new wxStaticBitmap( m_panelProgress, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizerErrorsRetry->Add( m_bitmapRetryErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_panelGraphItems = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_panelGraphItems->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - m_staticText1461 = new wxStaticText( m_panelProgress, wxID_ANY, _("Automatic retry"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText1461->Wrap( -1 ); - bSizerErrorsRetry->Add( m_staticText1461, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + bSizer161->Add( m_panelGraphItems, 1, wxEXPAND|wxLEFT, 10 ); - m_staticTextRetryCount = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextRetryCount->Wrap( -1 ); - bSizerErrorsRetry->Add( m_staticTextRetryCount, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + bSizerProgressFooter = new wxBoxSizer( wxHORIZONTAL ); + bSizerErrorsRetry = new wxBoxSizer( wxHORIZONTAL ); - bSizerProgressFooter->Add( bSizerErrorsRetry, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_bitmapRetryErrors = new wxStaticBitmap( m_panelProgress, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerErrorsRetry->Add( m_bitmapRetryErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerErrorsIgnore = new wxBoxSizer( wxHORIZONTAL ); + m_staticText1461 = new wxStaticText( m_panelProgress, wxID_ANY, _("Automatic retry"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText1461->Wrap( -1 ); + bSizerErrorsRetry->Add( m_staticText1461, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - m_bitmapIgnoreErrors = new wxStaticBitmap( m_panelProgress, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizerErrorsIgnore->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_staticTextRetryCount = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextRetryCount->Wrap( -1 ); + bSizerErrorsRetry->Add( m_staticTextRetryCount, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - m_staticText146 = new wxStaticText( m_panelProgress, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText146->Wrap( -1 ); - bSizerErrorsIgnore->Add( m_staticText146, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + bSizerProgressFooter->Add( bSizerErrorsRetry, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - bSizerProgressFooter->Add( bSizerErrorsIgnore, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + bSizerErrorsIgnore = new wxBoxSizer( wxHORIZONTAL ); + m_bitmapIgnoreErrors = new wxStaticBitmap( m_panelProgress, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerErrorsIgnore->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerProgressFooter->Add( 0, 0, 1, wxEXPAND, 5 ); + m_staticText146 = new wxStaticText( m_panelProgress, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText146->Wrap( -1 ); + bSizerErrorsIgnore->Add( m_staticText146, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - m_staticText137 = new wxStaticText( m_panelProgress, wxID_ANY, _("When finished:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText137->Wrap( -1 ); - bSizerProgressFooter->Add( m_staticText137, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - wxArrayString m_choicePostSyncActionChoices; - m_choicePostSyncAction = new wxChoice( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choicePostSyncActionChoices, 0 ); - m_choicePostSyncAction->SetSelection( 0 ); - bSizerProgressFooter->Add( m_choicePostSyncAction, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizerProgressFooter->Add( bSizerErrorsIgnore, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - bSizer161->Add( bSizerProgressFooter, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 10 ); + bSizerProgressFooter->Add( 0, 0, 1, wxEXPAND, 5 ); + m_staticText137 = new wxStaticText( m_panelProgress, wxID_ANY, _("When finished:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText137->Wrap( -1 ); + bSizerProgressFooter->Add( m_staticText137, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - bSizer173->Add( bSizer161, 1, wxEXPAND|wxLEFT, 5 ); + wxArrayString m_choicePostSyncActionChoices; + m_choicePostSyncAction = new wxChoice( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choicePostSyncActionChoices, 0 ); + m_choicePostSyncAction->SetSelection( 0 ); + bSizerProgressFooter->Add( m_choicePostSyncAction, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_panelProgress->SetSizer( bSizer173 ); - m_panelProgress->Layout(); - bSizer173->Fit( m_panelProgress ); - bSizerRoot->Add( m_panelProgress, 1, wxEXPAND, 5 ); + bSizer161->Add( bSizerProgressFooter, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 10 ); - m_notebookResult = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_FIXEDWIDTH ); - m_notebookResult->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + bSizer173->Add( bSizer161, 1, wxEXPAND|wxLEFT, 5 ); - bSizerRoot->Add( m_notebookResult, 1, wxEXPAND, 5 ); - m_staticlineFooter = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizerRoot->Add( m_staticlineFooter, 0, wxEXPAND, 5 ); + m_panelProgress->SetSizer( bSizer173 ); + m_panelProgress->Layout(); + bSizer173->Fit( m_panelProgress ); + bSizerRoot->Add( m_panelProgress, 1, wxEXPAND, 5 ); - bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + m_notebookResult = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_FIXEDWIDTH ); + m_notebookResult->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizerRoot->Add( m_notebookResult, 1, wxEXPAND, 5 ); - m_checkBoxAutoClose = new wxCheckBox( this, wxID_ANY, _("Auto-close"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizerStdButtons->Add( m_checkBoxAutoClose, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + m_staticlineFooter = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerRoot->Add( m_staticlineFooter, 0, wxEXPAND, 5 ); - m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); - m_buttonClose->SetDefault(); - m_buttonClose->Enable( false ); - bSizerStdButtons->Add( m_buttonClose, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 ); - m_buttonPause = new wxButton( this, wxID_ANY, _("&Pause"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizerStdButtons->Add( m_buttonPause, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + m_checkBoxAutoClose = new wxCheckBox( this, wxID_ANY, _("Auto-close"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizerStdButtons->Add( m_checkBoxAutoClose, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - m_buttonStop = new wxButton( this, wxID_CANCEL, _("Stop"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizerStdButtons->Add( m_buttonStop, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonClose->SetDefault(); + m_buttonClose->Enable( false ); - bSizerRoot->Add( bSizerStdButtons, 0, wxEXPAND, 5 ); + bSizerStdButtons->Add( m_buttonClose, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + m_buttonPause = new wxButton( this, wxID_ANY, _("&Pause"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerStdButtons->Add( m_buttonPause, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - this->SetSizer( bSizerRoot ); - this->Layout(); - bSizerRoot->Fit( this ); + m_buttonStop = new wxButton( this, wxID_CANCEL, _("Stop"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerStdButtons->Add( m_buttonStop, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + + bSizerRoot->Add( bSizerStdButtons, 0, wxEXPAND, 5 ); + + + this->SetSizer( bSizerRoot ); + this->Layout(); + bSizerRoot->Fit( this ); } SyncProgressPanelGenerated::~SyncProgressPanelGenerated() @@ -4123,42 +4133,42 @@ SyncProgressPanelGenerated::~SyncProgressPanelGenerated() LogPanelGenerated::LogPanelGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxPanel( parent, id, pos, size, style, name ) { - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer153; - bSizer153 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer153; + bSizer153 = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer154; - bSizer154 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer154; + bSizer154 = new wxBoxSizer( wxVERTICAL ); - m_bpButtonErrors = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizer154->Add( m_bpButtonErrors, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + m_bpButtonErrors = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizer154->Add( m_bpButtonErrors, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonWarnings = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizer154->Add( m_bpButtonWarnings, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + m_bpButtonWarnings = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizer154->Add( m_bpButtonWarnings, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - m_bpButtonInfo = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizer154->Add( m_bpButtonInfo, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + m_bpButtonInfo = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizer154->Add( m_bpButtonInfo, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizer153->Add( bSizer154, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + bSizer153->Add( bSizer154, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - m_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer153->Add( m_staticline13, 0, wxEXPAND, 5 ); + m_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer153->Add( m_staticline13, 0, wxEXPAND, 5 ); - m_gridMessages = new zen::Grid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); - m_gridMessages->SetScrollRate( 5, 5 ); - bSizer153->Add( m_gridMessages, 1, wxEXPAND, 5 ); + m_gridMessages = new zen::Grid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_gridMessages->SetScrollRate( 5, 5 ); + bSizer153->Add( m_gridMessages, 1, wxEXPAND, 5 ); - this->SetSizer( bSizer153 ); - this->Layout(); - bSizer153->Fit( this ); + this->SetSizer( bSizer153 ); + this->Layout(); + bSizer153->Fit( this ); - // Connect Events - m_bpButtonErrors->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::onErrors ), NULL, this ); - m_bpButtonWarnings->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::onWarnings ), NULL, this ); - m_bpButtonInfo->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::onInfo ), NULL, this ); + // Connect Events + m_bpButtonErrors->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::onErrors ), NULL, this ); + m_bpButtonWarnings->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::onWarnings ), NULL, this ); + m_bpButtonInfo->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::onInfo ), NULL, this ); } LogPanelGenerated::~LogPanelGenerated() @@ -4167,173 +4177,173 @@ LogPanelGenerated::~LogPanelGenerated() 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( wxSize( -1, -1 ), wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer54; - bSizer54 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer54; + bSizer54 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapBatchJob = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer72->Add( m_bitmapBatchJob, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); + m_bitmapBatchJob = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer72->Add( m_bitmapBatchJob, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); - m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextHeader->Wrap( -1 ); - bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 ); + m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHeader->Wrap( -1 ); + bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 ); - bSizer54->Add( bSizer72, 0, 0, 5 ); + bSizer54->Add( bSizer72, 0, 0, 5 ); - m_staticline18 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer54->Add( m_staticline18, 0, wxEXPAND, 5 ); + m_staticline18 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer54->Add( m_staticline18, 0, wxEXPAND, 5 ); - m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer172; - bSizer172 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer172; + bSizer172 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer180; - bSizer180 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer180; + bSizer180 = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer2361; - bSizer2361 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer2361; + bSizer2361 = new wxBoxSizer( wxVERTICAL ); - m_staticText146 = new wxStaticText( m_panel35, wxID_ANY, _("Progress dialog:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText146->Wrap( -1 ); - bSizer2361->Add( m_staticText146, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + m_staticText146 = new wxStaticText( m_panel35, wxID_ANY, _("Progress dialog:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText146->Wrap( -1 ); + bSizer2361->Add( m_staticText146, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - ffgSizer11 = new wxFlexGridSizer( 0, 2, 5, 5 ); - ffgSizer11->SetFlexibleDirection( wxBOTH ); - ffgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + ffgSizer11 = new wxFlexGridSizer( 0, 2, 5, 5 ); + ffgSizer11->SetFlexibleDirection( wxBOTH ); + ffgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_bitmapMinimizeToTray = new wxStaticBitmap( m_panel35, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - ffgSizer11->Add( m_bitmapMinimizeToTray, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapMinimizeToTray = new wxStaticBitmap( m_panel35, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + ffgSizer11->Add( m_bitmapMinimizeToTray, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_checkBoxRunMinimized = new wxCheckBox( m_panel35, wxID_ANY, _("Run minimized"), wxDefaultPosition, wxDefaultSize, 0 ); - ffgSizer11->Add( m_checkBoxRunMinimized, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + m_checkBoxRunMinimized = new wxCheckBox( m_panel35, wxID_ANY, _("Run minimized"), wxDefaultPosition, wxDefaultSize, 0 ); + ffgSizer11->Add( m_checkBoxRunMinimized, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - ffgSizer11->Add( 0, 0, 1, wxEXPAND, 5 ); + ffgSizer11->Add( 0, 0, 1, wxEXPAND, 5 ); - m_checkBoxAutoClose = new wxCheckBox( m_panel35, wxID_ANY, _("Auto-close"), wxDefaultPosition, wxDefaultSize, 0 ); - ffgSizer11->Add( m_checkBoxAutoClose, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + m_checkBoxAutoClose = new wxCheckBox( m_panel35, wxID_ANY, _("Auto-close"), wxDefaultPosition, wxDefaultSize, 0 ); + ffgSizer11->Add( m_checkBoxAutoClose, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - bSizer2361->Add( ffgSizer11, 0, wxEXPAND|wxALL, 5 ); + bSizer2361->Add( ffgSizer11, 0, wxEXPAND|wxALL, 5 ); - bSizer180->Add( bSizer2361, 0, wxALL, 5 ); + bSizer180->Add( bSizer2361, 0, wxALL, 5 ); - m_staticline26 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer180->Add( m_staticline26, 0, wxEXPAND, 5 ); + m_staticline26 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer180->Add( m_staticline26, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer242; - bSizer242 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer242; + bSizer242 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer243; - bSizer243 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer243; + bSizer243 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapIgnoreErrors = new wxStaticBitmap( m_panel35, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer243->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapIgnoreErrors = new wxStaticBitmap( m_panel35, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer243->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_checkBoxIgnoreErrors = new wxCheckBox( m_panel35, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer243->Add( m_checkBoxIgnoreErrors, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + m_checkBoxIgnoreErrors = new wxCheckBox( m_panel35, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer243->Add( m_checkBoxIgnoreErrors, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - bSizer242->Add( bSizer243, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + bSizer242->Add( bSizer243, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - wxBoxSizer* bSizer246; - bSizer246 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer246; + bSizer246 = new wxBoxSizer( wxVERTICAL ); - m_radioBtnErrorDialogShow = new wxRadioButton( m_panel35, wxID_ANY, _("&Show error message"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); - m_radioBtnErrorDialogShow->SetValue( true ); - m_radioBtnErrorDialogShow->SetToolTip( _("Show pop-up on errors or warnings") ); + m_radioBtnErrorDialogShow = new wxRadioButton( m_panel35, wxID_ANY, _("&Show error message"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); + m_radioBtnErrorDialogShow->SetValue( true ); + m_radioBtnErrorDialogShow->SetToolTip( _("Show pop-up on errors or warnings") ); - bSizer246->Add( m_radioBtnErrorDialogShow, 0, wxALL|wxEXPAND, 5 ); + bSizer246->Add( m_radioBtnErrorDialogShow, 0, wxALL|wxEXPAND, 5 ); - m_radioBtnErrorDialogCancel = new wxRadioButton( m_panel35, wxID_ANY, _("&Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnErrorDialogCancel->SetToolTip( _("Stop synchronization at first error") ); + m_radioBtnErrorDialogCancel = new wxRadioButton( m_panel35, wxID_ANY, _("&Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtnErrorDialogCancel->SetToolTip( _("Stop synchronization at first error") ); - bSizer246->Add( m_radioBtnErrorDialogCancel, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + bSizer246->Add( m_radioBtnErrorDialogCancel, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - bSizer242->Add( bSizer246, 0, wxALIGN_CENTER_HORIZONTAL|wxLEFT, 15 ); + bSizer242->Add( bSizer246, 0, wxALIGN_CENTER_HORIZONTAL|wxLEFT, 15 ); - bSizer180->Add( bSizer242, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer180->Add( bSizer242, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticline261 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer180->Add( m_staticline261, 0, wxEXPAND, 5 ); + m_staticline261 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer180->Add( m_staticline261, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer247; - bSizer247 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer247; + bSizer247 = new wxBoxSizer( wxVERTICAL ); - m_staticText137 = new wxStaticText( m_panel35, wxID_ANY, _("When finished:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText137->Wrap( -1 ); - bSizer247->Add( m_staticText137, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + m_staticText137 = new wxStaticText( m_panel35, wxID_ANY, _("When finished:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText137->Wrap( -1 ); + bSizer247->Add( m_staticText137, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - wxArrayString m_choicePostSyncActionChoices; - m_choicePostSyncAction = new wxChoice( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choicePostSyncActionChoices, 0 ); - m_choicePostSyncAction->SetSelection( 0 ); - bSizer247->Add( m_choicePostSyncAction, 0, wxALL, 5 ); + wxArrayString m_choicePostSyncActionChoices; + m_choicePostSyncAction = new wxChoice( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choicePostSyncActionChoices, 0 ); + m_choicePostSyncAction->SetSelection( 0 ); + bSizer247->Add( m_choicePostSyncAction, 0, wxALL, 5 ); - bSizer180->Add( bSizer247, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer180->Add( bSizer247, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticline262 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer180->Add( m_staticline262, 0, wxEXPAND, 5 ); + m_staticline262 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer180->Add( m_staticline262, 0, wxEXPAND, 5 ); - bSizer172->Add( bSizer180, 0, 0, 5 ); + bSizer172->Add( bSizer180, 0, 0, 5 ); - m_staticline25 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer172->Add( m_staticline25, 0, wxEXPAND, 5 ); + m_staticline25 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer172->Add( m_staticline25, 0, wxEXPAND, 5 ); - m_hyperlink17 = new wxHyperlinkCtrl( m_panel35, wxID_ANY, _("How can I schedule a batch job?"), wxT("https://freefilesync.org/manual.php?topic=schedule-a-batch-job"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink17->SetToolTip( _("https://freefilesync.org/manual.php?topic=schedule-a-batch-job") ); + m_hyperlink17 = new wxHyperlinkCtrl( m_panel35, wxID_ANY, _("How can I schedule a batch job?"), wxT("https://freefilesync.org/manual.php?topic=schedule-a-batch-job"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink17->SetToolTip( _("https://freefilesync.org/manual.php?topic=schedule-a-batch-job") ); - bSizer172->Add( m_hyperlink17, 0, wxALL, 10 ); + bSizer172->Add( m_hyperlink17, 0, wxALL, 10 ); - m_panel35->SetSizer( bSizer172 ); - m_panel35->Layout(); - bSizer172->Fit( m_panel35 ); - bSizer54->Add( m_panel35, 1, wxEXPAND, 5 ); + m_panel35->SetSizer( bSizer172 ); + m_panel35->Layout(); + bSizer172->Fit( m_panel35 ); + bSizer54->Add( m_panel35, 1, wxEXPAND, 5 ); - m_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer54->Add( m_staticline13, 0, wxEXPAND, 5 ); + m_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer54->Add( m_staticline13, 0, wxEXPAND, 5 ); - bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); - m_buttonSaveAs = new wxButton( this, wxID_SAVE, _("Save &as..."), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonSaveAs = new wxButton( this, wxID_SAVE, _("Save &as..."), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonSaveAs->SetDefault(); - m_buttonSaveAs->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonSaveAs->SetDefault(); + m_buttonSaveAs->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizerStdButtons->Add( m_buttonSaveAs, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + bSizerStdButtons->Add( m_buttonSaveAs, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer54->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); + bSizer54->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); - this->SetSizer( bSizer54 ); - this->Layout(); - bSizer54->Fit( this ); + this->SetSizer( bSizer54 ); + this->Layout(); + bSizer54->Fit( this ); - this->Centre( wxBOTH ); + this->Centre( wxBOTH ); - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::onClose ) ); - m_checkBoxRunMinimized->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::onToggleRunMinimized ), NULL, this ); - m_checkBoxIgnoreErrors->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::onToggleIgnoreErrors ), NULL, this ); - m_buttonSaveAs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::onSaveBatchJob ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::onCancel ), NULL, this ); + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::onClose ) ); + m_checkBoxRunMinimized->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::onToggleRunMinimized ), NULL, this ); + m_checkBoxIgnoreErrors->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::onToggleIgnoreErrors ), NULL, this ); + m_buttonSaveAs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::onSaveBatchJob ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::onCancel ), NULL, this ); } BatchDlgGenerated::~BatchDlgGenerated() @@ -4342,85 +4352,85 @@ BatchDlgGenerated::~BatchDlgGenerated() 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( wxSize( -1, -1 ), wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer24; - bSizer24 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer24; + bSizer24 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapDeleteType = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer72->Add( m_bitmapDeleteType, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); + m_bitmapDeleteType = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer72->Add( m_bitmapDeleteType, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); - m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextHeader->Wrap( -1 ); - bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 ); + m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHeader->Wrap( -1 ); + bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 ); - bSizer24->Add( bSizer72, 0, 0, 5 ); + bSizer24->Add( bSizer72, 0, 0, 5 ); - m_staticline91 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer24->Add( m_staticline91, 0, wxEXPAND, 5 ); + m_staticline91 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer24->Add( m_staticline91, 0, wxEXPAND, 5 ); - m_panel31 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel31->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panel31 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel31->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer185; - bSizer185 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer185; + bSizer185 = new wxBoxSizer( wxHORIZONTAL ); - bSizer185->Add( 60, 0, 0, 0, 5 ); + bSizer185->Add( 60, 0, 0, 0, 5 ); - m_staticline42 = new wxStaticLine( m_panel31, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer185->Add( m_staticline42, 0, wxEXPAND, 5 ); + m_staticline42 = new wxStaticLine( m_panel31, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer185->Add( m_staticline42, 0, wxEXPAND, 5 ); - m_textCtrlFileList = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxBORDER_NONE ); - bSizer185->Add( m_textCtrlFileList, 1, wxEXPAND, 5 ); + m_textCtrlFileList = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxBORDER_NONE ); + bSizer185->Add( m_textCtrlFileList, 1, wxEXPAND, 5 ); - m_panel31->SetSizer( bSizer185 ); - m_panel31->Layout(); - bSizer185->Fit( m_panel31 ); - bSizer24->Add( m_panel31, 1, wxEXPAND, 5 ); + m_panel31->SetSizer( bSizer185 ); + m_panel31->Layout(); + bSizer185->Fit( m_panel31 ); + bSizer24->Add( m_panel31, 1, wxEXPAND, 5 ); - m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer24->Add( m_staticline9, 0, wxEXPAND, 5 ); + m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer24->Add( m_staticline9, 0, wxEXPAND, 5 ); - bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); - m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("&Recycle bin"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizerStdButtons->Add( m_checkBoxUseRecycler, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("&Recycle bin"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizerStdButtons->Add( m_checkBoxUseRecycler, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 ); - m_buttonOK = new wxButton( this, wxID_OK, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonOK = new wxButton( this, wxID_OK, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonOK->SetDefault(); - m_buttonOK->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonOK->SetDefault(); + m_buttonOK->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizerStdButtons->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + bSizerStdButtons->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer24->Add( bSizerStdButtons, 0, wxEXPAND, 5 ); + bSizer24->Add( bSizerStdButtons, 0, wxEXPAND, 5 ); - this->SetSizer( bSizer24 ); - this->Layout(); - bSizer24->Fit( this ); + this->SetSizer( bSizer24 ); + this->Layout(); + bSizer24->Fit( this ); - this->Centre( wxBOTH ); + this->Centre( wxBOTH ); - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::onClose ) ); - m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::onUseRecycler ), NULL, this ); - m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::onOkay ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::onCancel ), NULL, this ); + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::onClose ) ); + m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::onUseRecycler ), NULL, this ); + m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::onOkay ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::onCancel ), NULL, this ); } DeleteDlgGenerated::~DeleteDlgGenerated() @@ -4429,705 +4439,784 @@ DeleteDlgGenerated::~DeleteDlgGenerated() CopyToDlgGenerated::CopyToDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxSize( -1, -1 ), wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer24; - bSizer24 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer24; + bSizer24 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapCopyTo = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer72->Add( m_bitmapCopyTo, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); + m_bitmapCopyTo = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer72->Add( m_bitmapCopyTo, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); - m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextHeader->Wrap( -1 ); - bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 ); + m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHeader->Wrap( -1 ); + bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 ); - bSizer24->Add( bSizer72, 0, 0, 5 ); + bSizer24->Add( bSizer72, 0, 0, 5 ); - m_staticline91 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer24->Add( m_staticline91, 0, wxEXPAND, 5 ); + m_staticline91 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer24->Add( m_staticline91, 0, wxEXPAND, 5 ); - m_panel31 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel31->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panel31 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel31->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer242; - bSizer242 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer242; + bSizer242 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer185; - bSizer185 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer185; + bSizer185 = new wxBoxSizer( wxHORIZONTAL ); - bSizer185->Add( 60, 0, 0, 0, 5 ); + bSizer185->Add( 60, 0, 0, 0, 5 ); - m_staticline42 = new wxStaticLine( m_panel31, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer185->Add( m_staticline42, 0, wxEXPAND, 5 ); + m_staticline42 = new wxStaticLine( m_panel31, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer185->Add( m_staticline42, 0, wxEXPAND, 5 ); - m_textCtrlFileList = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxBORDER_NONE ); - bSizer185->Add( m_textCtrlFileList, 1, wxEXPAND, 5 ); + m_textCtrlFileList = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxBORDER_NONE ); + bSizer185->Add( m_textCtrlFileList, 1, wxEXPAND, 5 ); - bSizer242->Add( bSizer185, 1, wxEXPAND, 5 ); + bSizer242->Add( bSizer185, 1, wxEXPAND, 5 ); - wxBoxSizer* bSizer182; - bSizer182 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer182; + bSizer182 = new wxBoxSizer( wxHORIZONTAL ); - m_targetFolderPath = new fff::FolderHistoryBox( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer182->Add( m_targetFolderPath, 1, wxALIGN_CENTER_VERTICAL, 5 ); + m_targetFolderPath = new fff::FolderHistoryBox( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer182->Add( m_targetFolderPath, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_buttonSelectTargetFolder = new wxButton( m_panel31, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectTargetFolder->SetToolTip( _("Select a folder") ); + m_buttonSelectTargetFolder = new wxButton( m_panel31, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectTargetFolder->SetToolTip( _("Select a folder") ); - bSizer182->Add( m_buttonSelectTargetFolder, 0, wxEXPAND, 5 ); + bSizer182->Add( m_buttonSelectTargetFolder, 0, wxEXPAND, 5 ); - m_bpButtonSelectAltTargetFolder = new wxBitmapButton( m_panel31, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonSelectAltTargetFolder->SetToolTip( _("Access online storage") ); + m_bpButtonSelectAltTargetFolder = new wxBitmapButton( m_panel31, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonSelectAltTargetFolder->SetToolTip( _("Access online storage") ); - bSizer182->Add( m_bpButtonSelectAltTargetFolder, 0, wxEXPAND, 5 ); + bSizer182->Add( m_bpButtonSelectAltTargetFolder, 0, wxEXPAND, 5 ); - bSizer242->Add( bSizer182, 0, wxALL|wxEXPAND, 10 ); + bSizer242->Add( bSizer182, 0, wxALL|wxEXPAND, 10 ); - m_panel31->SetSizer( bSizer242 ); - m_panel31->Layout(); - bSizer242->Fit( m_panel31 ); - bSizer24->Add( m_panel31, 1, wxEXPAND, 5 ); + m_panel31->SetSizer( bSizer242 ); + m_panel31->Layout(); + bSizer242->Fit( m_panel31 ); + bSizer24->Add( m_panel31, 1, wxEXPAND, 5 ); - m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer24->Add( m_staticline9, 0, wxEXPAND, 5 ); + m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer24->Add( m_staticline9, 0, wxEXPAND, 5 ); - bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer189; - bSizer189 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer189; + bSizer189 = new wxBoxSizer( wxVERTICAL ); - m_checkBoxKeepRelPath = new wxCheckBox( this, wxID_ANY, _("&Keep relative paths"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxKeepRelPath->SetValue(true); - bSizer189->Add( m_checkBoxKeepRelPath, 0, wxALL|wxEXPAND, 5 ); + m_checkBoxKeepRelPath = new wxCheckBox( this, wxID_ANY, _("&Keep relative paths"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxKeepRelPath->SetValue(true); + bSizer189->Add( m_checkBoxKeepRelPath, 0, wxALL|wxEXPAND, 5 ); - m_checkBoxOverwriteIfExists = new wxCheckBox( this, wxID_ANY, _("&Overwrite existing files"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxOverwriteIfExists->SetValue(true); - bSizer189->Add( m_checkBoxOverwriteIfExists, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + m_checkBoxOverwriteIfExists = new wxCheckBox( this, wxID_ANY, _("&Overwrite existing files"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxOverwriteIfExists->SetValue(true); + bSizer189->Add( m_checkBoxOverwriteIfExists, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - bSizerStdButtons->Add( bSizer189, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizerStdButtons->Add( bSizer189, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 ); + bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 ); - m_buttonOK = new wxButton( this, wxID_OK, _("Copy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonOK = new wxButton( this, wxID_OK, _("Copy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonOK->SetDefault(); - m_buttonOK->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonOK->SetDefault(); + m_buttonOK->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizerStdButtons->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + bSizerStdButtons->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer24->Add( bSizerStdButtons, 0, wxEXPAND, 5 ); + bSizer24->Add( bSizerStdButtons, 0, wxEXPAND, 5 ); - this->SetSizer( bSizer24 ); - this->Layout(); - bSizer24->Fit( this ); + this->SetSizer( bSizer24 ); + this->Layout(); + bSizer24->Fit( this ); - this->Centre( wxBOTH ); + this->Centre( wxBOTH ); - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CopyToDlgGenerated::onClose ) ); - m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CopyToDlgGenerated::onOkay ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CopyToDlgGenerated::onCancel ), NULL, this ); + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CopyToDlgGenerated::onClose ) ); + m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CopyToDlgGenerated::onOkay ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CopyToDlgGenerated::onCancel ), NULL, this ); } CopyToDlgGenerated::~CopyToDlgGenerated() { } +RenameDlgGenerated::RenameDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + + wxBoxSizer* bSizer24; + bSizer24 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapRename = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer72->Add( m_bitmapRename, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); + + m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHeader->Wrap( -1 ); + bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 ); + + + bSizer24->Add( bSizer72, 0, 0, 5 ); + + m_staticline91 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer24->Add( m_staticline91, 0, wxEXPAND, 5 ); + + m_panel31 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel31->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + wxBoxSizer* bSizer242; + bSizer242 = new wxBoxSizer( wxVERTICAL ); + + m_gridRenamePreview = new zen::Grid( m_panel31, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_gridRenamePreview->SetScrollRate( 5, 5 ); + bSizer242->Add( m_gridRenamePreview, 1, wxEXPAND, 5 ); + + m_textCtrlNewName = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer242->Add( m_textCtrlNewName, 0, wxEXPAND|wxALL, 10 ); + + + m_panel31->SetSizer( bSizer242 ); + m_panel31->Layout(); + bSizer242->Fit( m_panel31 ); + bSizer24->Add( m_panel31, 1, wxEXPAND, 5 ); + + m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer24->Add( m_staticline9, 0, wxEXPAND, 5 ); + + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonOK = new wxButton( this, wxID_OK, _("Rename"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + + m_buttonOK->SetDefault(); + m_buttonOK->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + + bSizerStdButtons->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + + bSizer24->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); + + + this->SetSizer( bSizer24 ); + this->Layout(); + bSizer24->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( RenameDlgGenerated::onClose ) ); + m_textCtrlNewName->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( RenameDlgGenerated::onTypingName ), NULL, this ); + m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( RenameDlgGenerated::onOkay ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( RenameDlgGenerated::onCancel ), NULL, this ); +} + +RenameDlgGenerated::~RenameDlgGenerated() +{ +} + OptionsDlgGenerated::OptionsDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxSize( -1, -1 ), wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer95; - bSizer95 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer95; + bSizer95 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapSettings = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer72->Add( m_bitmapSettings, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); + m_bitmapSettings = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer72->Add( m_bitmapSettings, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); - m_staticText44 = new wxStaticText( this, wxID_ANY, _("The following settings are used for all synchronization jobs."), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_staticText44->Wrap( -1 ); - bSizer72->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 ); + m_staticText44 = new wxStaticText( this, wxID_ANY, _("The following settings are used for all synchronization jobs."), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_staticText44->Wrap( -1 ); + bSizer72->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 ); - bSizer95->Add( bSizer72, 0, 0, 5 ); + bSizer95->Add( bSizer72, 0, 0, 5 ); - m_staticline20 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer95->Add( m_staticline20, 0, wxEXPAND, 5 ); + m_staticline20 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer95->Add( m_staticline20, 0, wxEXPAND, 5 ); - m_panel39 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel39->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panel39 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel39->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer166; - bSizer166 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer166; + bSizer166 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer186; - bSizer186 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer186; + bSizer186 = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer160; - bSizer160 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer160; + bSizer160 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer176; - bSizer176 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer176; + bSizer176 = new wxBoxSizer( wxHORIZONTAL ); - m_checkBoxFailSafe = new wxCheckBox( m_panel39, wxID_ANY, _("Fail-safe file copy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxFailSafe->SetValue(true); - m_checkBoxFailSafe->SetToolTip( _("Copy to a temporary file (*.ffs_tmp) before overwriting target.\nThis guarantees a consistent state even in case of a serious error.") ); + m_checkBoxFailSafe = new wxCheckBox( m_panel39, wxID_ANY, _("Fail-safe file copy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxFailSafe->SetValue(true); + m_checkBoxFailSafe->SetToolTip( _("Copy to a temporary file (*.ffs_tmp) before overwriting target.\nThis guarantees a consistent state even in case of a serious error.") ); - bSizer176->Add( m_checkBoxFailSafe, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer176->Add( m_checkBoxFailSafe, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticText911 = new wxStaticText( m_panel39, wxID_ANY, _("("), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText911->Wrap( -1 ); - m_staticText911->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText911 = new wxStaticText( m_panel39, wxID_ANY, _("("), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText911->Wrap( -1 ); + m_staticText911->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer176->Add( m_staticText911, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); + bSizer176->Add( m_staticText911, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); - m_staticText91 = new wxStaticText( m_panel39, wxID_ANY, _("recommended"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText91->Wrap( -1 ); - m_staticText91->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText91 = new wxStaticText( m_panel39, wxID_ANY, _("recommended"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText91->Wrap( -1 ); + m_staticText91->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer176->Add( m_staticText91, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); + bSizer176->Add( m_staticText91, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); - m_staticText9111 = new wxStaticText( m_panel39, wxID_ANY, _(")"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText9111->Wrap( -1 ); - m_staticText9111->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText9111 = new wxStaticText( m_panel39, wxID_ANY, _(")"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText9111->Wrap( -1 ); + m_staticText9111->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer176->Add( m_staticText9111, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + bSizer176->Add( m_staticText9111, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer160->Add( bSizer176, 0, wxEXPAND, 5 ); + bSizer160->Add( bSizer176, 0, wxEXPAND, 5 ); - bSizerLockedFiles = new wxBoxSizer( wxHORIZONTAL ); + bSizerLockedFiles = new wxBoxSizer( wxHORIZONTAL ); - m_checkBoxCopyLocked = new wxCheckBox( m_panel39, wxID_ANY, _("Copy locked files"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxCopyLocked->SetValue(true); - m_checkBoxCopyLocked->SetToolTip( _("Copy shared or locked files using the Volume Shadow Copy Service.") ); + m_checkBoxCopyLocked = new wxCheckBox( m_panel39, wxID_ANY, _("Copy locked files"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxCopyLocked->SetValue(true); + m_checkBoxCopyLocked->SetToolTip( _("Copy shared or locked files using the Volume Shadow Copy Service.") ); - bSizerLockedFiles->Add( m_checkBoxCopyLocked, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizerLockedFiles->Add( m_checkBoxCopyLocked, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticText921 = new wxStaticText( m_panel39, wxID_ANY, _("("), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText921->Wrap( -1 ); - m_staticText921->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText921 = new wxStaticText( m_panel39, wxID_ANY, _("("), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText921->Wrap( -1 ); + m_staticText921->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizerLockedFiles->Add( m_staticText921, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); + bSizerLockedFiles->Add( m_staticText921, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); - m_staticText92 = new wxStaticText( m_panel39, wxID_ANY, _("requires administrator rights"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText92->Wrap( -1 ); - m_staticText92->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText92 = new wxStaticText( m_panel39, wxID_ANY, _("requires administrator rights"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText92->Wrap( -1 ); + m_staticText92->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizerLockedFiles->Add( m_staticText92, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); + bSizerLockedFiles->Add( m_staticText92, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); - m_staticText922 = new wxStaticText( m_panel39, wxID_ANY, _(")"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText922->Wrap( -1 ); - m_staticText922->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText922 = new wxStaticText( m_panel39, wxID_ANY, _(")"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText922->Wrap( -1 ); + m_staticText922->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizerLockedFiles->Add( m_staticText922, 0, wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + bSizerLockedFiles->Add( m_staticText922, 0, wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer160->Add( bSizerLockedFiles, 0, wxEXPAND, 5 ); + bSizer160->Add( bSizerLockedFiles, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer178; - bSizer178 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer178; + bSizer178 = new wxBoxSizer( wxHORIZONTAL ); - m_checkBoxCopyPermissions = new wxCheckBox( m_panel39, wxID_ANY, _("Copy file access permissions"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxCopyPermissions->SetValue(true); - m_checkBoxCopyPermissions->SetToolTip( _("Transfer file and folder permissions.") ); + m_checkBoxCopyPermissions = new wxCheckBox( m_panel39, wxID_ANY, _("Copy file access permissions"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxCopyPermissions->SetValue(true); + m_checkBoxCopyPermissions->SetToolTip( _("Transfer file and folder permissions.") ); - bSizer178->Add( m_checkBoxCopyPermissions, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + bSizer178->Add( m_checkBoxCopyPermissions, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_staticText931 = new wxStaticText( m_panel39, wxID_ANY, _("("), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText931->Wrap( -1 ); - m_staticText931->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText931 = new wxStaticText( m_panel39, wxID_ANY, _("("), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText931->Wrap( -1 ); + m_staticText931->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer178->Add( m_staticText931, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); + bSizer178->Add( m_staticText931, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); - m_staticText93 = new wxStaticText( m_panel39, wxID_ANY, _("requires administrator rights"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText93->Wrap( -1 ); - m_staticText93->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText93 = new wxStaticText( m_panel39, wxID_ANY, _("requires administrator rights"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText93->Wrap( -1 ); + m_staticText93->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer178->Add( m_staticText93, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); + bSizer178->Add( m_staticText93, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); - m_staticText932 = new wxStaticText( m_panel39, wxID_ANY, _(")"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText932->Wrap( -1 ); - m_staticText932->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText932 = new wxStaticText( m_panel39, wxID_ANY, _(")"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText932->Wrap( -1 ); + m_staticText932->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer178->Add( m_staticText932, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + bSizer178->Add( m_staticText932, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer160->Add( bSizer178, 0, wxEXPAND, 5 ); + bSizer160->Add( bSizer178, 0, wxEXPAND, 5 ); - bSizer186->Add( bSizer160, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + bSizer186->Add( bSizer160, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_staticline39 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer186->Add( m_staticline39, 0, wxEXPAND, 5 ); + m_staticline39 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer186->Add( m_staticline39, 0, wxEXPAND, 5 ); - bSizer166->Add( bSizer186, 0, wxEXPAND, 5 ); + bSizer166->Add( bSizer186, 0, wxEXPAND, 5 ); - m_staticline191 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer166->Add( m_staticline191, 0, wxEXPAND, 5 ); + m_staticline191 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer166->Add( m_staticline191, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer292; - bSizer292 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer292; + bSizer292 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapWarnings = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer292->Add( m_bitmapWarnings, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_bitmapWarnings = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer292->Add( m_bitmapWarnings, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - m_staticText182 = new wxStaticText( m_panel39, wxID_ANY, _("Show hidden dialogs and warning messages again:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText182->Wrap( -1 ); - bSizer292->Add( m_staticText182, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_staticText182 = new wxStaticText( m_panel39, wxID_ANY, _("Show hidden dialogs and warning messages again:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText182->Wrap( -1 ); + bSizer292->Add( m_staticText182, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextHiddenDialogsCount = new wxStaticText( m_panel39, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextHiddenDialogsCount->Wrap( -1 ); - m_staticTextHiddenDialogsCount->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticTextHiddenDialogsCount = new wxStaticText( m_panel39, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHiddenDialogsCount->Wrap( -1 ); + m_staticTextHiddenDialogsCount->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer292->Add( m_staticTextHiddenDialogsCount, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer292->Add( m_staticTextHiddenDialogsCount, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - m_buttonShowHiddenDialogs = new wxButton( m_panel39, wxID_ANY, _("&Show details"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer292->Add( m_buttonShowHiddenDialogs, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + m_buttonShowHiddenDialogs = new wxButton( m_panel39, wxID_ANY, _("&Show details"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer292->Add( m_buttonShowHiddenDialogs, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - bSizer166->Add( bSizer292, 0, wxALL, 10 ); + bSizer166->Add( bSizer292, 0, wxALL, 10 ); - wxArrayString m_checkListHiddenDialogsChoices; - m_checkListHiddenDialogs = new wxCheckListBox( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_checkListHiddenDialogsChoices, wxLB_EXTENDED ); - bSizer166->Add( m_checkListHiddenDialogs, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 10 ); + wxArrayString m_checkListHiddenDialogsChoices; + m_checkListHiddenDialogs = new wxCheckListBox( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_checkListHiddenDialogsChoices, wxLB_EXTENDED ); + bSizer166->Add( m_checkListHiddenDialogs, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 10 ); - m_staticline1911 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer166->Add( m_staticline1911, 0, wxEXPAND, 5 ); + m_staticline1911 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer166->Add( m_staticline1911, 0, wxEXPAND, 5 ); - wxFlexGridSizer* fgSizer25111; - fgSizer25111 = new wxFlexGridSizer( 0, 2, 0, 0 ); - fgSizer25111->AddGrowableCol( 1 ); - fgSizer25111->AddGrowableRow( 0 ); - fgSizer25111->SetFlexibleDirection( wxBOTH ); - fgSizer25111->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + wxFlexGridSizer* fgSizer25111; + fgSizer25111 = new wxFlexGridSizer( 0, 2, 0, 0 ); + fgSizer25111->AddGrowableCol( 1 ); + fgSizer25111->AddGrowableRow( 0 ); + fgSizer25111->SetFlexibleDirection( wxBOTH ); + fgSizer25111->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_bitmapLogFile = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - fgSizer25111->Add( m_bitmapLogFile, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapLogFile = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + fgSizer25111->Add( m_bitmapLogFile, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - wxBoxSizer* bSizer296; - bSizer296 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer296; + bSizer296 = new wxBoxSizer( wxHORIZONTAL ); - m_staticText163 = new wxStaticText( m_panel39, wxID_ANY, _("Default log folder:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText163->Wrap( -1 ); - bSizer296->Add( m_staticText163, 1, wxALIGN_CENTER_VERTICAL, 5 ); + m_staticText163 = new wxStaticText( m_panel39, wxID_ANY, _("Default log folder:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText163->Wrap( -1 ); + bSizer296->Add( m_staticText163, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_bpButtonShowLogFolder = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonShowLogFolder->SetToolTip( _("dummy") ); + m_bpButtonShowLogFolder = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonShowLogFolder->SetToolTip( _("dummy") ); - bSizer296->Add( m_bpButtonShowLogFolder, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer296->Add( m_bpButtonShowLogFolder, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - fgSizer25111->Add( bSizer296, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + fgSizer25111->Add( bSizer296, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - fgSizer25111->Add( 0, 0, 0, 0, 5 ); + fgSizer25111->Add( 0, 0, 0, 0, 5 ); - m_panelLogfile = new wxPanel( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelLogfile->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panelLogfile = new wxPanel( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelLogfile->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer279; - bSizer279 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer279; + bSizer279 = new wxBoxSizer( wxHORIZONTAL ); - m_logFolderPath = new fff::FolderHistoryBox( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer279->Add( m_logFolderPath, 1, wxALIGN_CENTER_VERTICAL, 5 ); + m_logFolderPath = new fff::FolderHistoryBox( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer279->Add( m_logFolderPath, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_buttonSelectLogFolder = new wxButton( m_panelLogfile, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectLogFolder->SetToolTip( _("Select a folder") ); + m_buttonSelectLogFolder = new wxButton( m_panelLogfile, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectLogFolder->SetToolTip( _("Select a folder") ); - bSizer279->Add( m_buttonSelectLogFolder, 0, wxEXPAND, 5 ); + bSizer279->Add( m_buttonSelectLogFolder, 0, wxEXPAND, 5 ); - m_bpButtonSelectAltLogFolder = new wxBitmapButton( m_panelLogfile, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - m_bpButtonSelectAltLogFolder->SetToolTip( _("Access online storage") ); + m_bpButtonSelectAltLogFolder = new wxBitmapButton( m_panelLogfile, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + m_bpButtonSelectAltLogFolder->SetToolTip( _("Access online storage") ); - bSizer279->Add( m_bpButtonSelectAltLogFolder, 0, wxEXPAND, 5 ); + bSizer279->Add( m_bpButtonSelectAltLogFolder, 0, wxEXPAND, 5 ); - m_panelLogfile->SetSizer( bSizer279 ); - m_panelLogfile->Layout(); - bSizer279->Fit( m_panelLogfile ); - fgSizer25111->Add( m_panelLogfile, 0, wxEXPAND, 5 ); + m_panelLogfile->SetSizer( bSizer279 ); + m_panelLogfile->Layout(); + bSizer279->Fit( m_panelLogfile ); + fgSizer25111->Add( m_panelLogfile, 0, wxEXPAND, 5 ); - fgSizer25111->Add( 0, 0, 0, 0, 5 ); + fgSizer25111->Add( 0, 0, 0, 0, 5 ); - wxBoxSizer* bSizer297; - bSizer297 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer297; + bSizer297 = new wxBoxSizer( wxHORIZONTAL ); - m_checkBoxLogFilesMaxAge = new wxCheckBox( m_panel39, wxID_ANY, _("&Delete logs after x days:"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer297->Add( m_checkBoxLogFilesMaxAge, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_checkBoxLogFilesMaxAge = new wxCheckBox( m_panel39, wxID_ANY, _("&Delete logs after x days:"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer297->Add( m_checkBoxLogFilesMaxAge, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_spinCtrlLogFilesMaxAge = new wxSpinCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); - bSizer297->Add( m_spinCtrlLogFilesMaxAge, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + m_spinCtrlLogFilesMaxAge = new wxSpinCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); + bSizer297->Add( m_spinCtrlLogFilesMaxAge, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - m_staticline81 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer297->Add( m_staticline81, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); + m_staticline81 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer297->Add( m_staticline81, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); - m_staticText184 = new wxStaticText( m_panel39, wxID_ANY, _("Log file format:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText184->Wrap( -1 ); - bSizer297->Add( m_staticText184, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + m_staticText184 = new wxStaticText( m_panel39, wxID_ANY, _("Log file format:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText184->Wrap( -1 ); + bSizer297->Add( m_staticText184, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - wxFlexGridSizer* fgSizer251; - fgSizer251 = new wxFlexGridSizer( 0, 1, 5, 0 ); - fgSizer251->SetFlexibleDirection( wxBOTH ); - fgSizer251->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + wxFlexGridSizer* fgSizer251; + fgSizer251 = new wxFlexGridSizer( 0, 1, 5, 0 ); + fgSizer251->SetFlexibleDirection( wxBOTH ); + fgSizer251->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_radioBtnLogHtml = new wxRadioButton( m_panel39, wxID_ANY, _("&HTML"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); - m_radioBtnLogHtml->SetValue( true ); - fgSizer251->Add( m_radioBtnLogHtml, 0, wxEXPAND, 5 ); + m_radioBtnLogHtml = new wxRadioButton( m_panel39, wxID_ANY, _("&HTML"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); + m_radioBtnLogHtml->SetValue( true ); + fgSizer251->Add( m_radioBtnLogHtml, 0, wxEXPAND, 5 ); - m_radioBtnLogText = new wxRadioButton( m_panel39, wxID_ANY, _("&Plain text"), wxDefaultPosition, wxDefaultSize, 0 ); - fgSizer251->Add( m_radioBtnLogText, 0, wxEXPAND, 5 ); + m_radioBtnLogText = new wxRadioButton( m_panel39, wxID_ANY, _("&Plain text"), wxDefaultPosition, wxDefaultSize, 0 ); + fgSizer251->Add( m_radioBtnLogText, 0, wxEXPAND, 5 ); - bSizer297->Add( fgSizer251, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer297->Add( fgSizer251, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - fgSizer25111->Add( bSizer297, 0, wxTOP, 5 ); + fgSizer25111->Add( bSizer297, 0, wxTOP, 5 ); - bSizer166->Add( fgSizer25111, 0, wxALL|wxEXPAND, 10 ); + bSizer166->Add( fgSizer25111, 0, wxALL|wxEXPAND, 10 ); - m_staticline361 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer166->Add( m_staticline361, 0, wxEXPAND, 5 ); + m_staticline361 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer166->Add( m_staticline361, 0, wxEXPAND, 5 ); - wxFlexGridSizer* fgSizer251111; - fgSizer251111 = new wxFlexGridSizer( 0, 2, 0, 0 ); - fgSizer251111->AddGrowableCol( 1 ); - fgSizer251111->AddGrowableRow( 0 ); - fgSizer251111->SetFlexibleDirection( wxBOTH ); - fgSizer251111->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + wxFlexGridSizer* fgSizer251111; + fgSizer251111 = new wxFlexGridSizer( 0, 2, 0, 0 ); + fgSizer251111->AddGrowableCol( 1 ); + fgSizer251111->AddGrowableRow( 0 ); + fgSizer251111->SetFlexibleDirection( wxBOTH ); + fgSizer251111->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_bitmapNotificationSounds = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - fgSizer251111->Add( m_bitmapNotificationSounds, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapNotificationSounds = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + fgSizer251111->Add( m_bitmapNotificationSounds, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticText851 = new wxStaticText( m_panel39, wxID_ANY, _("Notification sounds:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText851->Wrap( -1 ); - fgSizer251111->Add( m_staticText851, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_staticText851 = new wxStaticText( m_panel39, wxID_ANY, _("Notification sounds:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText851->Wrap( -1 ); + fgSizer251111->Add( m_staticText851, 0, wxALIGN_CENTER_VERTICAL, 5 ); - fgSizer251111->Add( 0, 0, 0, 0, 5 ); + fgSizer251111->Add( 0, 0, 0, 0, 5 ); - ffgSizer11 = new wxFlexGridSizer( 0, 3, 0, 10 ); - ffgSizer11->AddGrowableCol( 2 ); - ffgSizer11->SetFlexibleDirection( wxBOTH ); - ffgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + ffgSizer11 = new wxFlexGridSizer( 0, 3, 0, 10 ); + ffgSizer11->AddGrowableCol( 2 ); + ffgSizer11->SetFlexibleDirection( wxBOTH ); + ffgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_staticText171 = new wxStaticText( m_panel39, wxID_ANY, _("Comparison finished:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText171->Wrap( -1 ); - m_staticText171->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText171 = new wxStaticText( m_panel39, wxID_ANY, _("Comparison finished:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText171->Wrap( -1 ); + m_staticText171->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - ffgSizer11->Add( m_staticText171, 0, wxALIGN_CENTER_VERTICAL, 5 ); + ffgSizer11->Add( m_staticText171, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_bitmapCompareDone = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - ffgSizer11->Add( m_bitmapCompareDone, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapCompareDone = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + ffgSizer11->Add( m_bitmapCompareDone, 0, wxALIGN_CENTER_VERTICAL, 5 ); - wxBoxSizer* bSizer290; - bSizer290 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer290; + bSizer290 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonPlayCompareDone = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 ); - bSizer290->Add( m_bpButtonPlayCompareDone, 0, wxEXPAND, 5 ); + m_bpButtonPlayCompareDone = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 ); + bSizer290->Add( m_bpButtonPlayCompareDone, 0, wxEXPAND, 5 ); - m_textCtrlSoundPathCompareDone = new wxTextCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer290->Add( m_textCtrlSoundPathCompareDone, 1, wxALIGN_CENTER_VERTICAL, 5 ); + m_textCtrlSoundPathCompareDone = new wxTextCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer290->Add( m_textCtrlSoundPathCompareDone, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_buttonSelectSoundCompareDone = new wxButton( m_panel39, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectSoundCompareDone->SetToolTip( _("Select a folder") ); + m_buttonSelectSoundCompareDone = new wxButton( m_panel39, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectSoundCompareDone->SetToolTip( _("Select a folder") ); - bSizer290->Add( m_buttonSelectSoundCompareDone, 0, wxEXPAND, 5 ); + bSizer290->Add( m_buttonSelectSoundCompareDone, 0, wxEXPAND, 5 ); - ffgSizer11->Add( bSizer290, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + ffgSizer11->Add( bSizer290, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - m_staticText1711 = new wxStaticText( m_panel39, wxID_ANY, _("Synchronization finished:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText1711->Wrap( -1 ); - m_staticText1711->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText1711 = new wxStaticText( m_panel39, wxID_ANY, _("Synchronization finished:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText1711->Wrap( -1 ); + m_staticText1711->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - ffgSizer11->Add( m_staticText1711, 0, wxALIGN_CENTER_VERTICAL, 5 ); + ffgSizer11->Add( m_staticText1711, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_bitmapSyncDone = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - ffgSizer11->Add( m_bitmapSyncDone, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapSyncDone = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + ffgSizer11->Add( m_bitmapSyncDone, 0, wxALIGN_CENTER_VERTICAL, 5 ); - wxBoxSizer* bSizer2901; - bSizer2901 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer2901; + bSizer2901 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonPlaySyncDone = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 ); - bSizer2901->Add( m_bpButtonPlaySyncDone, 0, wxEXPAND, 5 ); + m_bpButtonPlaySyncDone = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 ); + bSizer2901->Add( m_bpButtonPlaySyncDone, 0, wxEXPAND, 5 ); - m_textCtrlSoundPathSyncDone = new wxTextCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer2901->Add( m_textCtrlSoundPathSyncDone, 1, wxALIGN_CENTER_VERTICAL, 5 ); + m_textCtrlSoundPathSyncDone = new wxTextCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer2901->Add( m_textCtrlSoundPathSyncDone, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_buttonSelectSoundSyncDone = new wxButton( m_panel39, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectSoundSyncDone->SetToolTip( _("Select a folder") ); + m_buttonSelectSoundSyncDone = new wxButton( m_panel39, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectSoundSyncDone->SetToolTip( _("Select a folder") ); - bSizer2901->Add( m_buttonSelectSoundSyncDone, 0, wxEXPAND, 5 ); + bSizer2901->Add( m_buttonSelectSoundSyncDone, 0, wxEXPAND, 5 ); - ffgSizer11->Add( bSizer2901, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + ffgSizer11->Add( bSizer2901, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - m_staticText17111 = new wxStaticText( m_panel39, wxID_ANY, _("Unattended error message:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText17111->Wrap( -1 ); - m_staticText17111->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText17111 = new wxStaticText( m_panel39, wxID_ANY, _("Unattended error message:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText17111->Wrap( -1 ); + m_staticText17111->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - ffgSizer11->Add( m_staticText17111, 0, wxALIGN_CENTER_VERTICAL, 5 ); + ffgSizer11->Add( m_staticText17111, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_bitmapAlertPending = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - ffgSizer11->Add( m_bitmapAlertPending, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapAlertPending = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + ffgSizer11->Add( m_bitmapAlertPending, 0, wxALIGN_CENTER_VERTICAL, 5 ); - wxBoxSizer* bSizer29011; - bSizer29011 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer29011; + bSizer29011 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonPlayAlertPending = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 ); - bSizer29011->Add( m_bpButtonPlayAlertPending, 0, wxEXPAND, 5 ); + m_bpButtonPlayAlertPending = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 ); + bSizer29011->Add( m_bpButtonPlayAlertPending, 0, wxEXPAND, 5 ); - m_textCtrlSoundPathAlertPending = new wxTextCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer29011->Add( m_textCtrlSoundPathAlertPending, 1, wxALIGN_CENTER_VERTICAL, 5 ); + m_textCtrlSoundPathAlertPending = new wxTextCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer29011->Add( m_textCtrlSoundPathAlertPending, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_buttonSelectSoundAlertPending = new wxButton( m_panel39, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectSoundAlertPending->SetToolTip( _("Select a folder") ); + m_buttonSelectSoundAlertPending = new wxButton( m_panel39, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectSoundAlertPending->SetToolTip( _("Select a folder") ); - bSizer29011->Add( m_buttonSelectSoundAlertPending, 0, wxEXPAND, 5 ); + bSizer29011->Add( m_buttonSelectSoundAlertPending, 0, wxEXPAND, 5 ); - ffgSizer11->Add( bSizer29011, 1, wxEXPAND, 5 ); + ffgSizer11->Add( bSizer29011, 1, wxEXPAND, 5 ); - fgSizer251111->Add( ffgSizer11, 0, wxEXPAND|wxTOP, 5 ); + fgSizer251111->Add( ffgSizer11, 0, wxEXPAND|wxTOP, 5 ); - bSizer166->Add( fgSizer251111, 0, wxALL|wxEXPAND, 10 ); + bSizer166->Add( fgSizer251111, 0, wxALL|wxEXPAND, 10 ); - m_staticline3611 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer166->Add( m_staticline3611, 0, wxEXPAND, 5 ); + m_staticline3611 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer166->Add( m_staticline3611, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer2971; - bSizer2971 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer2971; + bSizer2971 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapConsole = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer2971->Add( m_bitmapConsole, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapConsole = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer2971->Add( m_bitmapConsole, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticText85 = new wxStaticText( m_panel39, wxID_ANY, _("Customize context menu:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText85->Wrap( -1 ); - bSizer2971->Add( m_staticText85, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + m_staticText85 = new wxStaticText( m_panel39, wxID_ANY, _("Customize context menu:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText85->Wrap( -1 ); + bSizer2971->Add( m_staticText85, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - m_buttonShowCtxCustomize = new wxButton( m_panel39, wxID_ANY, _("&Show details"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer2971->Add( m_buttonShowCtxCustomize, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + m_buttonShowCtxCustomize = new wxButton( m_panel39, wxID_ANY, _("&Show details"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer2971->Add( m_buttonShowCtxCustomize, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - bSizer166->Add( bSizer2971, 0, wxALL, 10 ); + bSizer166->Add( bSizer2971, 0, wxALL, 10 ); - bSizerContextCustomize = new wxBoxSizer( wxVERTICAL ); + bSizerContextCustomize = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer181; - bSizer181 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer181; + bSizer181 = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer2991; - bSizer2991 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer2991; + bSizer2991 = new wxBoxSizer( wxVERTICAL ); - bSizer2991->Add( 0, 0, 1, 0, 5 ); + bSizer2991->Add( 0, 0, 1, 0, 5 ); - wxBoxSizer* bSizer193; - bSizer193 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer193; + bSizer193 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonAddRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizer193->Add( m_bpButtonAddRow, 0, wxALIGN_BOTTOM, 5 ); + m_bpButtonAddRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizer193->Add( m_bpButtonAddRow, 0, wxALIGN_BOTTOM, 5 ); - m_bpButtonRemoveRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|0 ); - bSizer193->Add( m_bpButtonRemoveRow, 0, wxALIGN_BOTTOM, 5 ); + m_bpButtonRemoveRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|0 ); + bSizer193->Add( m_bpButtonRemoveRow, 0, wxALIGN_BOTTOM, 5 ); - bSizer2991->Add( bSizer193, 0, 0, 5 ); + bSizer2991->Add( bSizer193, 0, 0, 5 ); - bSizer181->Add( bSizer2991, 1, wxEXPAND, 5 ); + bSizer181->Add( bSizer2991, 1, wxEXPAND, 5 ); - wxFlexGridSizer* fgSizer37; - fgSizer37 = new wxFlexGridSizer( 0, 2, 0, 10 ); - fgSizer37->SetFlexibleDirection( wxBOTH ); - fgSizer37->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + wxFlexGridSizer* fgSizer37; + fgSizer37 = new wxFlexGridSizer( 0, 2, 0, 10 ); + fgSizer37->SetFlexibleDirection( wxBOTH ); + fgSizer37->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_staticText174 = new wxStaticText( m_panel39, wxID_ANY, _("%item_path%"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText174->Wrap( -1 ); - m_staticText174->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) ); - m_staticText174->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText174 = new wxStaticText( m_panel39, wxID_ANY, _("%item_path%"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText174->Wrap( -1 ); + m_staticText174->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) ); + m_staticText174->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - fgSizer37->Add( m_staticText174, 0, wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer37->Add( m_staticText174, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticText175 = new wxStaticText( m_panel39, wxID_ANY, _("Full file or folder path"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText175->Wrap( -1 ); - m_staticText175->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText175 = new wxStaticText( m_panel39, wxID_ANY, _("Full file or folder path"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText175->Wrap( -1 ); + m_staticText175->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - fgSizer37->Add( m_staticText175, 0, wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer37->Add( m_staticText175, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticText178 = new wxStaticText( m_panel39, wxID_ANY, _("%local_path%"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText178->Wrap( -1 ); - m_staticText178->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) ); - m_staticText178->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText178 = new wxStaticText( m_panel39, wxID_ANY, _("%local_path%"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText178->Wrap( -1 ); + m_staticText178->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) ); + m_staticText178->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - fgSizer37->Add( m_staticText178, 0, wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer37->Add( m_staticText178, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticText179 = new wxStaticText( m_panel39, wxID_ANY, _("Temporary local copy for SFTP and MTP storage"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText179->Wrap( -1 ); - m_staticText179->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText179 = new wxStaticText( m_panel39, wxID_ANY, _("Temporary local copy for SFTP and MTP storage"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText179->Wrap( -1 ); + m_staticText179->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - fgSizer37->Add( m_staticText179, 0, wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer37->Add( m_staticText179, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticText189 = new wxStaticText( m_panel39, wxID_ANY, _("%item_name%"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText189->Wrap( -1 ); - m_staticText189->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) ); - m_staticText189->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText189 = new wxStaticText( m_panel39, wxID_ANY, _("%item_name%"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText189->Wrap( -1 ); + m_staticText189->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) ); + m_staticText189->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - fgSizer37->Add( m_staticText189, 0, wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer37->Add( m_staticText189, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticText190 = new wxStaticText( m_panel39, wxID_ANY, _("File or folder name"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText190->Wrap( -1 ); - m_staticText190->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText190 = new wxStaticText( m_panel39, wxID_ANY, _("File or folder name"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText190->Wrap( -1 ); + m_staticText190->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - fgSizer37->Add( m_staticText190, 0, wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer37->Add( m_staticText190, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticText176 = new wxStaticText( m_panel39, wxID_ANY, _("%parent_path%"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText176->Wrap( -1 ); - m_staticText176->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) ); - m_staticText176->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText176 = new wxStaticText( m_panel39, wxID_ANY, _("%parent_path%"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText176->Wrap( -1 ); + m_staticText176->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) ); + m_staticText176->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - fgSizer37->Add( m_staticText176, 0, wxALIGN_CENTER_VERTICAL, 5 ); + fgSizer37->Add( m_staticText176, 0, wxALIGN_CENTER_VERTICAL, 5 ); - wxBoxSizer* bSizer298; - bSizer298 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer298; + bSizer298 = new wxBoxSizer( wxHORIZONTAL ); - m_staticText177 = new wxStaticText( m_panel39, wxID_ANY, _("Parent folder path"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText177->Wrap( -1 ); - m_staticText177->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + m_staticText177 = new wxStaticText( m_panel39, wxID_ANY, _("Parent folder path"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText177->Wrap( -1 ); + m_staticText177->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - bSizer298->Add( m_staticText177, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer298->Add( m_staticText177, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer298->Add( 0, 0, 1, 0, 5 ); + bSizer298->Add( 0, 0, 1, 0, 5 ); - m_hyperlink17 = new wxHyperlinkCtrl( m_panel39, wxID_ANY, _("Show examples"), wxT("https://freefilesync.org/manual.php?topic=external-applications"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink17->SetToolTip( _("https://freefilesync.org/manual.php?topic=external-applications") ); + m_hyperlink17 = new wxHyperlinkCtrl( m_panel39, wxID_ANY, _("Show examples"), wxT("https://freefilesync.org/manual.php?topic=external-applications"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink17->SetToolTip( _("https://freefilesync.org/manual.php?topic=external-applications") ); - bSizer298->Add( m_hyperlink17, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + bSizer298->Add( m_hyperlink17, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); - fgSizer37->Add( bSizer298, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + fgSizer37->Add( bSizer298, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - bSizer181->Add( fgSizer37, 0, wxBOTTOM|wxLEFT, 10 ); + bSizer181->Add( fgSizer37, 0, wxBOTTOM|wxLEFT, 10 ); - bSizerContextCustomize->Add( bSizer181, 0, wxEXPAND, 5 ); + bSizerContextCustomize->Add( bSizer181, 0, wxEXPAND, 5 ); - m_gridCustomCommand = new wxGrid( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_gridCustomCommand = new wxGrid( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - // Grid - m_gridCustomCommand->CreateGrid( 3, 2 ); - m_gridCustomCommand->EnableEditing( true ); - m_gridCustomCommand->EnableGridLines( true ); - m_gridCustomCommand->EnableDragGridSize( false ); - m_gridCustomCommand->SetMargins( 0, 0 ); + // Grid + m_gridCustomCommand->CreateGrid( 3, 2 ); + m_gridCustomCommand->EnableEditing( true ); + m_gridCustomCommand->EnableGridLines( true ); + m_gridCustomCommand->EnableDragGridSize( false ); + m_gridCustomCommand->SetMargins( 0, 0 ); - // Columns - m_gridCustomCommand->EnableDragColMove( false ); - m_gridCustomCommand->EnableDragColSize( false ); - m_gridCustomCommand->SetColLabelValue( 0, _("Description") ); - m_gridCustomCommand->SetColLabelValue( 1, _("Command line") ); - m_gridCustomCommand->SetColLabelSize( -1 ); - m_gridCustomCommand->SetColLabelAlignment( wxALIGN_CENTER, wxALIGN_CENTER ); + // Columns + m_gridCustomCommand->EnableDragColMove( false ); + m_gridCustomCommand->EnableDragColSize( false ); + m_gridCustomCommand->SetColLabelValue( 0, _("Description") ); + m_gridCustomCommand->SetColLabelValue( 1, _("Command line") ); + m_gridCustomCommand->SetColLabelSize( -1 ); + m_gridCustomCommand->SetColLabelAlignment( wxALIGN_CENTER, wxALIGN_CENTER ); - // Rows - m_gridCustomCommand->EnableDragRowSize( false ); - m_gridCustomCommand->SetRowLabelSize( 1 ); - m_gridCustomCommand->SetRowLabelAlignment( wxALIGN_CENTER, wxALIGN_CENTER ); + // Rows + m_gridCustomCommand->EnableDragRowSize( false ); + m_gridCustomCommand->SetRowLabelSize( 1 ); + m_gridCustomCommand->SetRowLabelAlignment( wxALIGN_CENTER, wxALIGN_CENTER ); - // Label Appearance + // Label Appearance - // Cell Defaults - m_gridCustomCommand->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP ); - bSizerContextCustomize->Add( m_gridCustomCommand, 1, wxEXPAND, 5 ); + // Cell Defaults + m_gridCustomCommand->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP ); + bSizerContextCustomize->Add( m_gridCustomCommand, 1, wxEXPAND, 5 ); - bSizer166->Add( bSizerContextCustomize, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 10 ); + bSizer166->Add( bSizerContextCustomize, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 10 ); - m_panel39->SetSizer( bSizer166 ); - m_panel39->Layout(); - bSizer166->Fit( m_panel39 ); - bSizer95->Add( m_panel39, 1, wxEXPAND, 5 ); + m_panel39->SetSizer( bSizer166 ); + m_panel39->Layout(); + bSizer166->Fit( m_panel39 ); + bSizer95->Add( m_panel39, 1, wxEXPAND, 5 ); - m_staticline36 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer95->Add( m_staticline36, 0, wxEXPAND, 5 ); + m_staticline36 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer95->Add( m_staticline36, 0, wxEXPAND, 5 ); - bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); - m_buttonDefault = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizerStdButtons->Add( m_buttonDefault, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + m_buttonDefault = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerStdButtons->Add( m_buttonDefault, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizerStdButtons->Add( 0, 0, 1, 0, 5 ); + bSizerStdButtons->Add( 0, 0, 1, 0, 5 ); - m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonOkay->SetDefault(); - m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonOkay->SetDefault(); + m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer95->Add( bSizerStdButtons, 0, wxEXPAND, 5 ); + bSizer95->Add( bSizerStdButtons, 0, wxEXPAND, 5 ); - this->SetSizer( bSizer95 ); - this->Layout(); - bSizer95->Fit( this ); + this->SetSizer( bSizer95 ); + this->Layout(); + bSizer95->Fit( this ); - this->Centre( wxBOTH ); + this->Centre( wxBOTH ); - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( OptionsDlgGenerated::onClose ) ); - m_buttonShowHiddenDialogs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onShowHiddenDialogs ), NULL, this ); - m_checkListHiddenDialogs->Connect( wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, wxCommandEventHandler( OptionsDlgGenerated::onToggleHiddenDialog ), NULL, this ); - m_bpButtonShowLogFolder->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onShowLogFolder ), NULL, this ); - m_checkBoxLogFilesMaxAge->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onToggleLogfilesLimit ), NULL, this ); - m_bpButtonPlayCompareDone->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onPlayCompareDone ), NULL, this ); - m_textCtrlSoundPathCompareDone->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( OptionsDlgGenerated::onChangeSoundFilePath ), NULL, this ); - m_buttonSelectSoundCompareDone->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onSelectSoundCompareDone ), NULL, this ); - m_bpButtonPlaySyncDone->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onPlaySyncDone ), NULL, this ); - m_textCtrlSoundPathSyncDone->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( OptionsDlgGenerated::onChangeSoundFilePath ), NULL, this ); - m_buttonSelectSoundSyncDone->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onSelectSoundSyncDone ), NULL, this ); - m_bpButtonPlayAlertPending->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onPlayAlertPending ), NULL, this ); - m_textCtrlSoundPathAlertPending->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( OptionsDlgGenerated::onChangeSoundFilePath ), NULL, this ); - m_buttonSelectSoundAlertPending->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onSelectSoundAlertPending ), NULL, this ); - m_buttonShowCtxCustomize->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onShowContextCustomize ), NULL, this ); - m_bpButtonAddRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onAddRow ), NULL, this ); - m_bpButtonRemoveRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onRemoveRow ), NULL, this ); - m_buttonDefault->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onDefault ), NULL, this ); - m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onOkay ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onCancel ), NULL, this ); + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( OptionsDlgGenerated::onClose ) ); + m_buttonShowHiddenDialogs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onShowHiddenDialogs ), NULL, this ); + m_checkListHiddenDialogs->Connect( wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, wxCommandEventHandler( OptionsDlgGenerated::onToggleHiddenDialog ), NULL, this ); + m_bpButtonShowLogFolder->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onShowLogFolder ), NULL, this ); + m_checkBoxLogFilesMaxAge->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onToggleLogfilesLimit ), NULL, this ); + m_bpButtonPlayCompareDone->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onPlayCompareDone ), NULL, this ); + m_textCtrlSoundPathCompareDone->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( OptionsDlgGenerated::onChangeSoundFilePath ), NULL, this ); + m_buttonSelectSoundCompareDone->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onSelectSoundCompareDone ), NULL, this ); + m_bpButtonPlaySyncDone->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onPlaySyncDone ), NULL, this ); + m_textCtrlSoundPathSyncDone->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( OptionsDlgGenerated::onChangeSoundFilePath ), NULL, this ); + m_buttonSelectSoundSyncDone->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onSelectSoundSyncDone ), NULL, this ); + m_bpButtonPlayAlertPending->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onPlayAlertPending ), NULL, this ); + m_textCtrlSoundPathAlertPending->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( OptionsDlgGenerated::onChangeSoundFilePath ), NULL, this ); + m_buttonSelectSoundAlertPending->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onSelectSoundAlertPending ), NULL, this ); + m_buttonShowCtxCustomize->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onShowContextCustomize ), NULL, this ); + m_bpButtonAddRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onAddRow ), NULL, this ); + m_bpButtonRemoveRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onRemoveRow ), NULL, this ); + m_buttonDefault->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onDefault ), NULL, this ); + m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onOkay ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::onCancel ), NULL, this ); } OptionsDlgGenerated::~OptionsDlgGenerated() @@ -5136,61 +5225,61 @@ OptionsDlgGenerated::~OptionsDlgGenerated() SelectTimespanDlgGenerated::SelectTimespanDlgGenerated( 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 ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer96; - bSizer96 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer96; + bSizer96 = new wxBoxSizer( wxVERTICAL ); - m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer98; - bSizer98 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer98; + bSizer98 = new wxBoxSizer( wxHORIZONTAL ); - m_calendarFrom = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS|wxCAL_SHOW_SURROUNDING_WEEKS|wxBORDER_NONE ); - bSizer98->Add( m_calendarFrom, 0, wxTOP|wxBOTTOM|wxLEFT, 10 ); + m_calendarFrom = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS|wxCAL_SHOW_SURROUNDING_WEEKS|wxBORDER_NONE ); + bSizer98->Add( m_calendarFrom, 0, wxTOP|wxBOTTOM|wxLEFT, 10 ); - m_calendarTo = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS|wxCAL_SHOW_SURROUNDING_WEEKS|wxBORDER_NONE ); - bSizer98->Add( m_calendarTo, 0, wxALL, 10 ); + m_calendarTo = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS|wxCAL_SHOW_SURROUNDING_WEEKS|wxBORDER_NONE ); + bSizer98->Add( m_calendarTo, 0, wxALL, 10 ); - m_panel35->SetSizer( bSizer98 ); - m_panel35->Layout(); - bSizer98->Fit( m_panel35 ); - bSizer96->Add( m_panel35, 0, wxEXPAND, 5 ); + m_panel35->SetSizer( bSizer98 ); + m_panel35->Layout(); + bSizer98->Fit( m_panel35 ); + bSizer96->Add( m_panel35, 0, wxEXPAND, 5 ); - m_staticline21 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer96->Add( m_staticline21, 0, wxEXPAND, 5 ); + m_staticline21 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer96->Add( m_staticline21, 0, wxEXPAND, 5 ); - bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); - m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonOkay->SetDefault(); - m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonOkay->SetDefault(); + m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer96->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); + bSizer96->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); - this->SetSizer( bSizer96 ); - this->Layout(); - bSizer96->Fit( this ); + this->SetSizer( bSizer96 ); + this->Layout(); + bSizer96->Fit( this ); - this->Centre( wxBOTH ); + this->Centre( wxBOTH ); - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SelectTimespanDlgGenerated::onClose ) ); - m_calendarFrom->Connect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::onChangeSelectionFrom ), NULL, this ); - m_calendarTo->Connect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::onChangeSelectionTo ), NULL, this ); - m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::onOkay ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::onCancel ), NULL, this ); + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SelectTimespanDlgGenerated::onClose ) ); + m_calendarFrom->Connect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::onChangeSelectionFrom ), NULL, this ); + m_calendarTo->Connect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::onChangeSelectionTo ), NULL, this ); + m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::onOkay ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::onCancel ), NULL, this ); } SelectTimespanDlgGenerated::~SelectTimespanDlgGenerated() @@ -5199,210 +5288,210 @@ SelectTimespanDlgGenerated::~SelectTimespanDlgGenerated() 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 ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer31; - bSizer31 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer31; + bSizer31 = new wxBoxSizer( wxVERTICAL ); - m_panel41 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel41->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panel41 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel41->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer174; - bSizer174 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer174; + bSizer174 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapLogoLeft = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer174->Add( m_bitmapLogoLeft, 0, wxBOTTOM, 5 ); + m_bitmapLogoLeft = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer174->Add( m_bitmapLogoLeft, 0, wxBOTTOM, 5 ); - m_staticline81 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer174->Add( m_staticline81, 0, wxEXPAND, 5 ); + m_staticline81 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer174->Add( m_staticline81, 0, wxEXPAND, 5 ); - bSizerMainSection = new wxBoxSizer( wxVERTICAL ); + bSizerMainSection = new wxBoxSizer( wxVERTICAL ); - m_staticline82 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizerMainSection->Add( m_staticline82, 0, wxEXPAND, 5 ); + m_staticline82 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerMainSection->Add( m_staticline82, 0, wxEXPAND, 5 ); - m_bitmapLogo = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizerMainSection->Add( m_bitmapLogo, 0, 0, 5 ); + m_bitmapLogo = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerMainSection->Add( m_bitmapLogo, 0, 0, 5 ); - m_staticline341 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizerMainSection->Add( m_staticline341, 0, wxEXPAND, 5 ); + m_staticline341 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerMainSection->Add( m_staticline341, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer298; - bSizer298 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer298; + bSizer298 = new wxBoxSizer( wxHORIZONTAL ); - m_staticFfsTextVersion = new wxStaticText( m_panel41, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticFfsTextVersion->Wrap( -1 ); - bSizer298->Add( m_staticFfsTextVersion, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_staticFfsTextVersion = new wxStaticText( m_panel41, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticFfsTextVersion->Wrap( -1 ); + bSizer298->Add( m_staticFfsTextVersion, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextFfsVariant = new wxStaticText( m_panel41, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextFfsVariant->Wrap( -1 ); - m_staticTextFfsVariant->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_staticTextFfsVariant = new wxStaticText( m_panel41, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextFfsVariant->Wrap( -1 ); + m_staticTextFfsVariant->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer298->Add( m_staticTextFfsVariant, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 ); + bSizer298->Add( m_staticTextFfsVariant, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 ); - bSizerMainSection->Add( bSizer298, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + bSizerMainSection->Add( bSizer298, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - m_staticline3411 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizerMainSection->Add( m_staticline3411, 0, wxEXPAND, 5 ); + m_staticline3411 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerMainSection->Add( m_staticline3411, 0, wxEXPAND, 5 ); - bSizerDonate = new wxBoxSizer( wxVERTICAL ); + bSizerDonate = new wxBoxSizer( wxVERTICAL ); - bSizerDonate->Add( 0, 0, 1, 0, 5 ); + bSizerDonate->Add( 0, 0, 1, 0, 5 ); - m_panelDonate = new wxPanel( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelDonate->SetBackgroundColour( wxColour( 153, 170, 187 ) ); + m_panelDonate = new wxPanel( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelDonate->SetBackgroundColour( wxColour( 153, 170, 187 ) ); - wxBoxSizer* bSizer183; - bSizer183 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer183; + bSizer183 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapAnimalSmall = new wxStaticBitmap( m_panelDonate, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer183->Add( m_bitmapAnimalSmall, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + m_bitmapAnimalSmall = new wxStaticBitmap( m_panelDonate, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer183->Add( m_bitmapAnimalSmall, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_panel39 = new wxPanel( m_panelDonate, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel39->SetBackgroundColour( wxColour( 248, 248, 248 ) ); + m_panel39 = new wxPanel( m_panelDonate, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel39->SetBackgroundColour( wxColour( 248, 248, 248 ) ); - wxBoxSizer* bSizer184; - bSizer184 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer184; + bSizer184 = new wxBoxSizer( wxHORIZONTAL ); - m_staticTextDonate = new wxStaticText( m_panel39, wxID_ANY, _("Get the Donation Edition with bonus features and help keep FreeFileSync ad-free."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDonate->Wrap( -1 ); - m_staticTextDonate->SetForegroundColour( wxColour( 0, 0, 0 ) ); + m_staticTextDonate = new wxStaticText( m_panel39, wxID_ANY, _("Get the Donation Edition with bonus features and help keep FreeFileSync ad-free."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDonate->Wrap( -1 ); + m_staticTextDonate->SetForegroundColour( wxColour( 0, 0, 0 ) ); - bSizer184->Add( m_staticTextDonate, 0, wxALIGN_CENTER_HORIZONTAL|wxLEFT|wxALIGN_CENTER_VERTICAL, 10 ); + bSizer184->Add( m_staticTextDonate, 0, wxALIGN_CENTER_HORIZONTAL|wxLEFT|wxALIGN_CENTER_VERTICAL, 10 ); - m_panel39->SetSizer( bSizer184 ); - m_panel39->Layout(); - bSizer184->Fit( m_panel39 ); - bSizer183->Add( m_panel39, 1, wxTOP|wxBOTTOM|wxRIGHT|wxEXPAND, 5 ); + m_panel39->SetSizer( bSizer184 ); + m_panel39->Layout(); + bSizer184->Fit( m_panel39 ); + bSizer183->Add( m_panel39, 1, wxTOP|wxBOTTOM|wxRIGHT|wxEXPAND, 5 ); - m_panelDonate->SetSizer( bSizer183 ); - m_panelDonate->Layout(); - bSizer183->Fit( m_panelDonate ); - bSizerDonate->Add( m_panelDonate, 0, wxEXPAND, 5 ); + m_panelDonate->SetSizer( bSizer183 ); + m_panelDonate->Layout(); + bSizer183->Fit( m_panelDonate ); + bSizerDonate->Add( m_panelDonate, 0, wxEXPAND, 5 ); - m_buttonDonate1 = new zen::BitmapTextButton( m_panel41, wxID_ANY, _("Support with a donation"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_buttonDonate1->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - m_buttonDonate1->SetToolTip( _("https://freefilesync.org/donate") ); + m_buttonDonate1 = new zen::BitmapTextButton( m_panel41, wxID_ANY, _("Support with a donation"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonDonate1->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonDonate1->SetToolTip( _("https://freefilesync.org/donate") ); - bSizerDonate->Add( m_buttonDonate1, 0, wxEXPAND|wxALL, 10 ); + bSizerDonate->Add( m_buttonDonate1, 0, wxEXPAND|wxALL, 10 ); - bSizerDonate->Add( 0, 0, 1, 0, 5 ); + bSizerDonate->Add( 0, 0, 1, 0, 5 ); - bSizerMainSection->Add( bSizerDonate, 1, wxEXPAND, 5 ); + bSizerMainSection->Add( bSizerDonate, 1, wxEXPAND, 5 ); - m_bitmapAnimalBig = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizerMainSection->Add( m_bitmapAnimalBig, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + m_bitmapAnimalBig = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerMainSection->Add( m_bitmapAnimalBig, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - m_staticline3412 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizerMainSection->Add( m_staticline3412, 0, wxEXPAND, 5 ); + m_staticline3412 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerMainSection->Add( m_staticline3412, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer186; - bSizer186 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer186; + bSizer186 = new wxBoxSizer( wxVERTICAL ); - m_staticText94 = new wxStaticText( m_panel41, wxID_ANY, _("Share your feedback and ideas:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText94->Wrap( -1 ); - bSizer186->Add( m_staticText94, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT, 5 ); + m_staticText94 = new wxStaticText( m_panel41, wxID_ANY, _("Share your feedback and ideas:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText94->Wrap( -1 ); + bSizer186->Add( m_staticText94, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT, 5 ); - wxBoxSizer* bSizer289; - bSizer289 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer289; + bSizer289 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonForum = new wxBitmapButton( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 ); - m_bpButtonForum->SetToolTip( _("https://freefilesync.org/forum") ); + m_bpButtonForum = new wxBitmapButton( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 ); + m_bpButtonForum->SetToolTip( _("https://freefilesync.org/forum") ); - bSizer289->Add( m_bpButtonForum, 0, wxALL|wxEXPAND, 5 ); + bSizer289->Add( m_bpButtonForum, 0, wxALL|wxEXPAND, 5 ); - m_bpButtonEmail = new wxBitmapButton( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 ); - bSizer289->Add( m_bpButtonEmail, 0, wxTOP|wxBOTTOM|wxRIGHT|wxEXPAND, 5 ); + m_bpButtonEmail = new wxBitmapButton( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 ); + bSizer289->Add( m_bpButtonEmail, 0, wxTOP|wxBOTTOM|wxRIGHT|wxEXPAND, 5 ); - bSizer186->Add( bSizer289, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + bSizer186->Add( bSizer289, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizerMainSection->Add( bSizer186, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + bSizerMainSection->Add( bSizer186, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - bSizer174->Add( bSizerMainSection, 0, wxEXPAND, 5 ); + bSizer174->Add( bSizerMainSection, 0, wxEXPAND, 5 ); - m_staticline37 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer174->Add( m_staticline37, 0, wxEXPAND, 5 ); + m_staticline37 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer174->Add( m_staticline37, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer177; - bSizer177 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer177; + bSizer177 = new wxBoxSizer( wxVERTICAL ); - m_staticTextThanksForLoc = new wxStaticText( m_panel41, wxID_ANY, _("Many thanks for translation:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextThanksForLoc->Wrap( -1 ); - bSizer177->Add( m_staticTextThanksForLoc, 0, wxALL, 5 ); + m_staticTextThanksForLoc = new wxStaticText( m_panel41, wxID_ANY, _("Many thanks for translation:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextThanksForLoc->Wrap( -1 ); + bSizer177->Add( m_staticTextThanksForLoc, 0, wxALL, 5 ); - m_scrolledWindowTranslators = new wxScrolledWindow( m_panel41, wxID_ANY, wxDefaultPosition, wxSize( -1, -1 ), wxVSCROLL ); - m_scrolledWindowTranslators->SetScrollRate( 10, 10 ); - m_scrolledWindowTranslators->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_scrolledWindowTranslators = new wxScrolledWindow( m_panel41, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxVSCROLL ); + m_scrolledWindowTranslators->SetScrollRate( 10, 10 ); + m_scrolledWindowTranslators->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - fgSizerTranslators = new wxFlexGridSizer( 0, 2, 2, 10 ); - fgSizerTranslators->SetFlexibleDirection( wxBOTH ); - fgSizerTranslators->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + fgSizerTranslators = new wxFlexGridSizer( 0, 2, 2, 10 ); + fgSizerTranslators->SetFlexibleDirection( wxBOTH ); + fgSizerTranslators->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_scrolledWindowTranslators->SetSizer( fgSizerTranslators ); - m_scrolledWindowTranslators->Layout(); - fgSizerTranslators->Fit( m_scrolledWindowTranslators ); - bSizer177->Add( m_scrolledWindowTranslators, 1, wxEXPAND|wxLEFT, 5 ); + m_scrolledWindowTranslators->SetSizer( fgSizerTranslators ); + m_scrolledWindowTranslators->Layout(); + fgSizerTranslators->Fit( m_scrolledWindowTranslators ); + bSizer177->Add( m_scrolledWindowTranslators, 1, wxEXPAND|wxLEFT, 5 ); - bSizer174->Add( bSizer177, 0, wxEXPAND|wxLEFT, 5 ); + bSizer174->Add( bSizer177, 0, wxEXPAND|wxLEFT, 5 ); - m_panel41->SetSizer( bSizer174 ); - m_panel41->Layout(); - bSizer174->Fit( m_panel41 ); - bSizer31->Add( m_panel41, 0, wxEXPAND, 5 ); + m_panel41->SetSizer( bSizer174 ); + m_panel41->Layout(); + bSizer174->Fit( m_panel41 ); + bSizer31->Add( m_panel41, 0, wxEXPAND, 5 ); - m_staticline36 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer31->Add( m_staticline36, 0, wxEXPAND, 5 ); + m_staticline36 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer31->Add( m_staticline36, 0, wxEXPAND, 5 ); - bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); - m_buttonShowDonationDetails = new wxButton( this, wxID_ANY, _("Thank you, %x, for your support!"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizerStdButtons->Add( m_buttonShowDonationDetails, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + m_buttonShowDonationDetails = new wxButton( this, wxID_ANY, _("Thank you, %x, for your support!"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizerStdButtons->Add( m_buttonShowDonationDetails, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - bSizerStdButtons->Add( 0, 0, 1, 0, 5 ); + bSizerStdButtons->Add( 0, 0, 1, 0, 5 ); - m_buttonDonate2 = new zen::BitmapTextButton( this, wxID_ANY, _("&Donate"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_buttonDonate2->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - m_buttonDonate2->SetToolTip( _("https://freefilesync.org/donate") ); + m_buttonDonate2 = new zen::BitmapTextButton( this, wxID_ANY, _("&Donate"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonDonate2->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonDonate2->SetToolTip( _("https://freefilesync.org/donate") ); - bSizerStdButtons->Add( m_buttonDonate2, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + bSizerStdButtons->Add( m_buttonDonate2, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonClose->SetDefault(); - bSizerStdButtons->Add( m_buttonClose, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + m_buttonClose->SetDefault(); + bSizerStdButtons->Add( m_buttonClose, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer31->Add( bSizerStdButtons, 0, wxEXPAND, 5 ); + bSizer31->Add( bSizerStdButtons, 0, wxEXPAND, 5 ); - this->SetSizer( bSizer31 ); - this->Layout(); - bSizer31->Fit( this ); + this->SetSizer( bSizer31 ); + this->Layout(); + bSizer31->Fit( this ); - this->Centre( wxBOTH ); + this->Centre( wxBOTH ); - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::onClose ) ); - m_buttonDonate1->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::onDonate ), NULL, this ); - m_bpButtonForum->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::onOpenForum ), NULL, this ); - m_bpButtonEmail->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::onSendEmail ), NULL, this ); - m_buttonShowDonationDetails->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::onShowDonationDetails ), NULL, this ); - m_buttonDonate2->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::onDonate ), NULL, this ); - m_buttonClose->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::onOkay ), NULL, this ); + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::onClose ) ); + m_buttonDonate1->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::onDonate ), NULL, this ); + m_bpButtonForum->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::onOpenForum ), NULL, this ); + m_bpButtonEmail->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::onSendEmail ), NULL, this ); + m_buttonShowDonationDetails->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::onShowDonationDetails ), NULL, this ); + m_buttonDonate2->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::onDonate ), NULL, this ); + m_buttonClose->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::onOkay ), NULL, this ); } AboutDlgGenerated::~AboutDlgGenerated() @@ -5411,61 +5500,61 @@ AboutDlgGenerated::~AboutDlgGenerated() DownloadProgressDlgGenerated::DownloadProgressDlgGenerated( 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 ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - wxBoxSizer* bSizer24; - bSizer24 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer24; + bSizer24 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapDownloading = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer72->Add( m_bitmapDownloading, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); + m_bitmapDownloading = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer72->Add( m_bitmapDownloading, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); - m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextHeader->Wrap( -1 ); - bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 ); + m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHeader->Wrap( -1 ); + bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 ); - bSizer72->Add( 20, 0, 0, 0, 5 ); + bSizer72->Add( 20, 0, 0, 0, 5 ); - bSizer24->Add( bSizer72, 0, 0, 5 ); + bSizer24->Add( bSizer72, 0, 0, 5 ); - wxBoxSizer* bSizer212; - bSizer212 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer212; + bSizer212 = new wxBoxSizer( wxVERTICAL ); - m_gaugeProgress = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxDefaultSize, wxGA_HORIZONTAL ); - m_gaugeProgress->SetValue( 0 ); - bSizer212->Add( m_gaugeProgress, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); + m_gaugeProgress = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxDefaultSize, wxGA_HORIZONTAL ); + m_gaugeProgress->SetValue( 0 ); + bSizer212->Add( m_gaugeProgress, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); - m_staticTextDetails = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDetails->Wrap( -1 ); - bSizer212->Add( m_staticTextDetails, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + m_staticTextDetails = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDetails->Wrap( -1 ); + bSizer212->Add( m_staticTextDetails, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - bSizer24->Add( bSizer212, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + bSizer24->Add( bSizer212, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer24->Add( m_staticline9, 0, wxEXPAND, 5 ); + m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer24->Add( m_staticline9, 0, wxEXPAND, 5 ); - bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonCancel->SetDefault(); - bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + m_buttonCancel->SetDefault(); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - bSizer24->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); + bSizer24->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); - this->SetSizer( bSizer24 ); - this->Layout(); - bSizer24->Fit( this ); + this->SetSizer( bSizer24 ); + this->Layout(); + bSizer24->Fit( this ); - // Connect Events - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DownloadProgressDlgGenerated::onCancel ), NULL, this ); + // Connect Events + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DownloadProgressDlgGenerated::onCancel ), NULL, this ); } DownloadProgressDlgGenerated::~DownloadProgressDlgGenerated() @@ -5474,66 +5563,66 @@ DownloadProgressDlgGenerated::~DownloadProgressDlgGenerated() CfgHighlightDlgGenerated::CfgHighlightDlgGenerated( 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 ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer96; - bSizer96 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer96; + bSizer96 = new wxBoxSizer( wxVERTICAL ); - m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer98; - bSizer98 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer98; + bSizer98 = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer238; - bSizer238 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer238; + bSizer238 = new wxBoxSizer( wxVERTICAL ); - m_staticTextHighlight = new wxStaticText( m_panel35, wxID_ANY, _("Highlight configurations that have not been run for more than the following number of days:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextHighlight->Wrap( -1 ); - bSizer238->Add( m_staticTextHighlight, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + m_staticTextHighlight = new wxStaticText( m_panel35, wxID_ANY, _("Highlight configurations that have not been run for more than the following number of days:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHighlight->Wrap( -1 ); + bSizer238->Add( m_staticTextHighlight, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - m_spinCtrlOverdueDays = new wxSpinCtrl( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 0, 2000000000, 0 ); - bSizer238->Add( m_spinCtrlOverdueDays, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + m_spinCtrlOverdueDays = new wxSpinCtrl( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxSP_ARROW_KEYS, 0, 2000000000, 0 ); + bSizer238->Add( m_spinCtrlOverdueDays, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizer98->Add( bSizer238, 1, wxALL|wxEXPAND, 5 ); + bSizer98->Add( bSizer238, 1, wxALL|wxEXPAND, 5 ); - m_panel35->SetSizer( bSizer98 ); - m_panel35->Layout(); - bSizer98->Fit( m_panel35 ); - bSizer96->Add( m_panel35, 0, 0, 5 ); + m_panel35->SetSizer( bSizer98 ); + m_panel35->Layout(); + bSizer98->Fit( m_panel35 ); + bSizer96->Add( m_panel35, 0, 0, 5 ); - m_staticline21 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer96->Add( m_staticline21, 0, wxEXPAND, 5 ); + m_staticline21 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer96->Add( m_staticline21, 0, wxEXPAND, 5 ); - bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); - m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonOkay->SetDefault(); - m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonOkay->SetDefault(); + m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer96->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); + bSizer96->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); - this->SetSizer( bSizer96 ); - this->Layout(); - bSizer96->Fit( this ); + this->SetSizer( bSizer96 ); + this->Layout(); + bSizer96->Fit( this ); - this->Centre( wxBOTH ); + this->Centre( wxBOTH ); - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CfgHighlightDlgGenerated::onClose ) ); - m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CfgHighlightDlgGenerated::onOkay ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CfgHighlightDlgGenerated::onCancel ), NULL, this ); + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CfgHighlightDlgGenerated::onClose ) ); + m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CfgHighlightDlgGenerated::onOkay ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CfgHighlightDlgGenerated::onCancel ), NULL, this ); } CfgHighlightDlgGenerated::~CfgHighlightDlgGenerated() @@ -5542,97 +5631,97 @@ CfgHighlightDlgGenerated::~CfgHighlightDlgGenerated() PasswordPromptDlgGenerated::PasswordPromptDlgGenerated( 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 ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer96; - bSizer96 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer96; + bSizer96 = new wxBoxSizer( wxVERTICAL ); - m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer98; - bSizer98 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer98; + bSizer98 = new wxBoxSizer( wxHORIZONTAL ); - wxBoxSizer* bSizer238; - bSizer238 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer238; + bSizer238 = new wxBoxSizer( wxVERTICAL ); - m_staticTextMain = new wxStaticText( m_panel35, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextMain->Wrap( -1 ); - bSizer238->Add( m_staticTextMain, 1, wxALL, 5 ); + m_staticTextMain = new wxStaticText( m_panel35, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextMain->Wrap( -1 ); + bSizer238->Add( m_staticTextMain, 1, wxALL, 5 ); - wxBoxSizer* bSizer305; - bSizer305 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer305; + bSizer305 = new wxBoxSizer( wxHORIZONTAL ); - m_staticTextPassword = new wxStaticText( m_panel35, wxID_ANY, _("Password:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextPassword->Wrap( -1 ); - bSizer305->Add( m_staticTextPassword, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + m_staticTextPassword = new wxStaticText( m_panel35, wxID_ANY, _("Password:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextPassword->Wrap( -1 ); + bSizer305->Add( m_staticTextPassword, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - m_textCtrlPasswordVisible = new wxTextCtrl( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer305->Add( m_textCtrlPasswordVisible, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + m_textCtrlPasswordVisible = new wxTextCtrl( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer305->Add( m_textCtrlPasswordVisible, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - m_textCtrlPasswordHidden = new wxTextCtrl( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD ); - bSizer305->Add( m_textCtrlPasswordHidden, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + m_textCtrlPasswordHidden = new wxTextCtrl( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD ); + bSizer305->Add( m_textCtrlPasswordHidden, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - m_checkBoxShowPassword = new wxCheckBox( m_panel35, wxID_ANY, _("&Show password"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer305->Add( m_checkBoxShowPassword, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + m_checkBoxShowPassword = new wxCheckBox( m_panel35, wxID_ANY, _("&Show password"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer305->Add( m_checkBoxShowPassword, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - bSizer238->Add( bSizer305, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); + bSizer238->Add( bSizer305, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); - bSizerError = new wxBoxSizer( wxHORIZONTAL ); + bSizerError = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapError = new wxStaticBitmap( m_panel35, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizerError->Add( m_bitmapError, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + m_bitmapError = new wxStaticBitmap( m_panel35, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerError->Add( m_bitmapError, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextError = new wxStaticText( m_panel35, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextError->Wrap( -1 ); - bSizerError->Add( m_staticTextError, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + m_staticTextError = new wxStaticText( m_panel35, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextError->Wrap( -1 ); + bSizerError->Add( m_staticTextError, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - bSizer238->Add( bSizerError, 0, 0, 5 ); + bSizer238->Add( bSizerError, 0, 0, 5 ); - bSizer98->Add( bSizer238, 1, wxALL, 5 ); + bSizer98->Add( bSizer238, 1, wxALL, 5 ); - m_panel35->SetSizer( bSizer98 ); - m_panel35->Layout(); - bSizer98->Fit( m_panel35 ); - bSizer96->Add( m_panel35, 1, wxEXPAND, 5 ); + m_panel35->SetSizer( bSizer98 ); + m_panel35->Layout(); + bSizer98->Fit( m_panel35 ); + bSizer96->Add( m_panel35, 1, wxEXPAND, 5 ); - m_staticline21 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer96->Add( m_staticline21, 0, wxEXPAND, 5 ); + m_staticline21 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer96->Add( m_staticline21, 0, wxEXPAND, 5 ); - bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); - m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonOkay->SetDefault(); - m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonOkay->SetDefault(); + m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer96->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); + bSizer96->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); - this->SetSizer( bSizer96 ); - this->Layout(); - bSizer96->Fit( this ); + this->SetSizer( bSizer96 ); + this->Layout(); + bSizer96->Fit( this ); - this->Centre( wxBOTH ); + this->Centre( wxBOTH ); - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( PasswordPromptDlgGenerated::onClose ) ); - m_textCtrlPasswordVisible->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PasswordPromptDlgGenerated::onTypingPassword ), NULL, this ); - m_textCtrlPasswordHidden->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PasswordPromptDlgGenerated::onTypingPassword ), NULL, this ); - m_checkBoxShowPassword->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( PasswordPromptDlgGenerated::onToggleShowPassword ), NULL, this ); - m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PasswordPromptDlgGenerated::onOkay ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PasswordPromptDlgGenerated::onCancel ), NULL, this ); + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( PasswordPromptDlgGenerated::onClose ) ); + m_textCtrlPasswordVisible->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PasswordPromptDlgGenerated::onTypingPassword ), NULL, this ); + m_textCtrlPasswordHidden->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PasswordPromptDlgGenerated::onTypingPassword ), NULL, this ); + m_checkBoxShowPassword->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( PasswordPromptDlgGenerated::onToggleShowPassword ), NULL, this ); + m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PasswordPromptDlgGenerated::onOkay ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PasswordPromptDlgGenerated::onCancel ), NULL, this ); } PasswordPromptDlgGenerated::~PasswordPromptDlgGenerated() @@ -5641,178 +5730,178 @@ PasswordPromptDlgGenerated::~PasswordPromptDlgGenerated() ActivationDlgGenerated::ActivationDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxSize( -1, -1 ), wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer54; - bSizer54 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer54; + bSizer54 = new wxBoxSizer( wxVERTICAL ); - m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer172; - bSizer172 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer172; + bSizer172 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer165; - bSizer165 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer165; + bSizer165 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapActivation = new wxStaticBitmap( m_panel35, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer165->Add( m_bitmapActivation, 0, wxALL, 10 ); + m_bitmapActivation = new wxStaticBitmap( m_panel35, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer165->Add( m_bitmapActivation, 0, wxALL, 10 ); - wxBoxSizer* bSizer16; - bSizer16 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer16; + bSizer16 = new wxBoxSizer( wxVERTICAL ); - bSizer16->Add( 0, 10, 0, 0, 5 ); + bSizer16->Add( 0, 10, 0, 0, 5 ); - m_richTextLastError = new wxRichTextCtrl( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxBORDER_NONE|wxVSCROLL|wxWANTS_CHARS ); - bSizer16->Add( m_richTextLastError, 1, wxEXPAND, 5 ); + m_richTextLastError = new wxRichTextCtrl( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxBORDER_NONE|wxVSCROLL|wxWANTS_CHARS ); + bSizer16->Add( m_richTextLastError, 1, wxEXPAND, 5 ); - bSizer165->Add( bSizer16, 1, wxEXPAND, 5 ); + bSizer165->Add( bSizer16, 1, wxEXPAND, 5 ); - bSizer172->Add( bSizer165, 1, wxEXPAND, 5 ); + bSizer172->Add( bSizer165, 1, wxEXPAND, 5 ); - m_staticline82 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer172->Add( m_staticline82, 0, wxEXPAND, 5 ); + m_staticline82 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer172->Add( m_staticline82, 0, wxEXPAND, 5 ); - m_staticTextMain = new wxStaticText( m_panel35, wxID_ANY, _("Activate the FreeFileSync Donation Edition by one of the following methods:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextMain->Wrap( -1 ); - bSizer172->Add( m_staticTextMain, 0, wxALL, 10 ); + m_staticTextMain = new wxStaticText( m_panel35, wxID_ANY, _("Activate the FreeFileSync Donation Edition by one of the following methods:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextMain->Wrap( -1 ); + bSizer172->Add( m_staticTextMain, 0, wxALL, 10 ); - m_panel35->SetSizer( bSizer172 ); - m_panel35->Layout(); - bSizer172->Fit( m_panel35 ); - bSizer54->Add( m_panel35, 1, wxEXPAND, 5 ); + m_panel35->SetSizer( bSizer172 ); + m_panel35->Layout(); + bSizer172->Fit( m_panel35 ); + bSizer54->Add( m_panel35, 1, wxEXPAND, 5 ); - m_staticline181 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer54->Add( m_staticline181, 0, wxEXPAND|wxBOTTOM, 5 ); + m_staticline181 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer54->Add( m_staticline181, 0, wxEXPAND|wxBOTTOM, 5 ); - m_staticline18111 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer54->Add( m_staticline18111, 0, wxEXPAND|wxTOP, 5 ); + m_staticline18111 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer54->Add( m_staticline18111, 0, wxEXPAND|wxTOP, 5 ); - m_panel3511 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel3511->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panel3511 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel3511->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer263; - bSizer263 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer263; + bSizer263 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer234; - bSizer234 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer234; + bSizer234 = new wxBoxSizer( wxHORIZONTAL ); - m_staticTextMain1 = new wxStaticText( m_panel3511, wxID_ANY, _("1."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextMain1->Wrap( -1 ); - bSizer234->Add( m_staticTextMain1, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + m_staticTextMain1 = new wxStaticText( m_panel3511, wxID_ANY, _("1."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextMain1->Wrap( -1 ); + bSizer234->Add( m_staticTextMain1, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticText136 = new wxStaticText( m_panel3511, wxID_ANY, _("Activate via internet now:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText136->Wrap( -1 ); - bSizer234->Add( m_staticText136, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_staticText136 = new wxStaticText( m_panel3511, wxID_ANY, _("Activate via internet now:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText136->Wrap( -1 ); + bSizer234->Add( m_staticText136, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - m_buttonActivateOnline = new wxButton( m_panel3511, wxID_ANY, _("Activate online"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonActivateOnline = new wxButton( m_panel3511, wxID_ANY, _("Activate online"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonActivateOnline->SetDefault(); - m_buttonActivateOnline->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonActivateOnline->SetDefault(); + m_buttonActivateOnline->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer234->Add( m_buttonActivateOnline, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer234->Add( m_buttonActivateOnline, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer263->Add( bSizer234, 0, wxEXPAND|wxALL, 10 ); + bSizer263->Add( bSizer234, 0, wxEXPAND|wxALL, 10 ); - m_panel3511->SetSizer( bSizer263 ); - m_panel3511->Layout(); - bSizer263->Fit( m_panel3511 ); - bSizer54->Add( m_panel3511, 0, wxEXPAND, 5 ); + m_panel3511->SetSizer( bSizer263 ); + m_panel3511->Layout(); + bSizer263->Fit( m_panel3511 ); + bSizer54->Add( m_panel3511, 0, wxEXPAND, 5 ); - m_staticline181111 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer54->Add( m_staticline181111, 0, wxEXPAND|wxBOTTOM, 5 ); + m_staticline181111 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer54->Add( m_staticline181111, 0, wxEXPAND|wxBOTTOM, 5 ); - m_staticline181112 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer54->Add( m_staticline181112, 0, wxEXPAND|wxTOP, 5 ); + m_staticline181112 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer54->Add( m_staticline181112, 0, wxEXPAND|wxTOP, 5 ); - m_panel351 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel351->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panel351 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel351->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer266; - bSizer266 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer266; + bSizer266 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer237; - bSizer237 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer237; + bSizer237 = new wxBoxSizer( wxVERTICAL ); - wxBoxSizer* bSizer236; - bSizer236 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer236; + bSizer236 = new wxBoxSizer( wxHORIZONTAL ); - m_staticText175 = new wxStaticText( m_panel351, wxID_ANY, _("2."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText175->Wrap( -1 ); - bSizer236->Add( m_staticText175, 0, wxRIGHT|wxALIGN_BOTTOM, 5 ); + m_staticText175 = new wxStaticText( m_panel351, wxID_ANY, _("2."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText175->Wrap( -1 ); + bSizer236->Add( m_staticText175, 0, wxRIGHT|wxALIGN_BOTTOM, 5 ); - m_staticText1361 = new wxStaticText( m_panel351, wxID_ANY, _("Retrieve an offline activation key from the following URL:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText1361->Wrap( -1 ); - bSizer236->Add( m_staticText1361, 1, wxRIGHT|wxALIGN_BOTTOM, 5 ); + m_staticText1361 = new wxStaticText( m_panel351, wxID_ANY, _("Retrieve an offline activation key from the following URL:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText1361->Wrap( -1 ); + bSizer236->Add( m_staticText1361, 1, wxRIGHT|wxALIGN_BOTTOM, 5 ); - m_buttonCopyUrl = new wxButton( m_panel351, wxID_ANY, _("&Copy to clipboard"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer236->Add( m_buttonCopyUrl, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_buttonCopyUrl = new wxButton( m_panel351, wxID_ANY, _("&Copy to clipboard"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer236->Add( m_buttonCopyUrl, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer237->Add( bSizer236, 0, wxEXPAND|wxBOTTOM, 5 ); + bSizer237->Add( bSizer236, 0, wxEXPAND|wxBOTTOM, 5 ); - m_richTextManualActivationUrl = new wxRichTextCtrl( m_panel351, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxBORDER_NONE|wxVSCROLL|wxWANTS_CHARS ); - bSizer237->Add( m_richTextManualActivationUrl, 0, wxEXPAND|wxBOTTOM, 5 ); + m_richTextManualActivationUrl = new wxRichTextCtrl( m_panel351, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxBORDER_NONE|wxVSCROLL|wxWANTS_CHARS ); + bSizer237->Add( m_richTextManualActivationUrl, 0, wxEXPAND|wxBOTTOM, 5 ); - wxBoxSizer* bSizer235; - bSizer235 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer235; + bSizer235 = new wxBoxSizer( wxHORIZONTAL ); - m_staticText13611 = new wxStaticText( m_panel351, wxID_ANY, _("Enter activation key:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText13611->Wrap( -1 ); - bSizer235->Add( m_staticText13611, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_staticText13611 = new wxStaticText( m_panel351, wxID_ANY, _("Enter activation key:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText13611->Wrap( -1 ); + bSizer235->Add( m_staticText13611, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - m_textCtrlOfflineActivationKey = new wxTextCtrl( m_panel351, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxTE_PROCESS_ENTER ); - bSizer235->Add( m_textCtrlOfflineActivationKey, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_textCtrlOfflineActivationKey = new wxTextCtrl( m_panel351, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_PROCESS_ENTER ); + bSizer235->Add( m_textCtrlOfflineActivationKey, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - m_buttonActivateOffline = new wxButton( m_panel351, wxID_ANY, _("Activate offline"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_buttonActivateOffline->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_buttonActivateOffline = new wxButton( m_panel351, wxID_ANY, _("Activate offline"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonActivateOffline->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer235->Add( m_buttonActivateOffline, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer235->Add( m_buttonActivateOffline, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer237->Add( bSizer235, 0, wxEXPAND|wxTOP, 5 ); + bSizer237->Add( bSizer235, 0, wxEXPAND|wxTOP, 5 ); - bSizer266->Add( bSizer237, 0, wxALL|wxEXPAND, 10 ); + bSizer266->Add( bSizer237, 0, wxALL|wxEXPAND, 10 ); - m_panel351->SetSizer( bSizer266 ); - m_panel351->Layout(); - bSizer266->Fit( m_panel351 ); - bSizer54->Add( m_panel351, 0, wxEXPAND, 5 ); + m_panel351->SetSizer( bSizer266 ); + m_panel351->Layout(); + bSizer266->Fit( m_panel351 ); + bSizer54->Add( m_panel351, 0, wxEXPAND, 5 ); - m_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer54->Add( m_staticline13, 0, wxEXPAND, 5 ); + m_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer54->Add( m_staticline13, 0, wxEXPAND, 5 ); - bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer54->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); + bSizer54->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); - this->SetSizer( bSizer54 ); - this->Layout(); - bSizer54->Fit( this ); + this->SetSizer( bSizer54 ); + this->Layout(); + bSizer54->Fit( this ); - this->Centre( wxBOTH ); + this->Centre( wxBOTH ); - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ActivationDlgGenerated::onClose ) ); - m_buttonActivateOnline->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ActivationDlgGenerated::onActivateOnline ), NULL, this ); - m_buttonCopyUrl->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ActivationDlgGenerated::onCopyUrl ), NULL, this ); - m_textCtrlOfflineActivationKey->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( ActivationDlgGenerated::onOfflineActivationEnter ), NULL, this ); - m_buttonActivateOffline->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ActivationDlgGenerated::onActivateOffline ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ActivationDlgGenerated::onCancel ), NULL, this ); + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ActivationDlgGenerated::onClose ) ); + m_buttonActivateOnline->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ActivationDlgGenerated::onActivateOnline ), NULL, this ); + m_buttonCopyUrl->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ActivationDlgGenerated::onCopyUrl ), NULL, this ); + m_textCtrlOfflineActivationKey->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( ActivationDlgGenerated::onOfflineActivationEnter ), NULL, this ); + m_buttonActivateOffline->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ActivationDlgGenerated::onActivateOffline ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ActivationDlgGenerated::onCancel ), NULL, this ); } ActivationDlgGenerated::~ActivationDlgGenerated() @@ -5821,106 +5910,106 @@ ActivationDlgGenerated::~ActivationDlgGenerated() WarnAccessRightsMissingDlgGenerated::WarnAccessRightsMissingDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxSize( -1, -1 ), wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer330; - bSizer330 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer330; + bSizer330 = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapGrantAccess = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer330->Add( m_bitmapGrantAccess, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); + m_bitmapGrantAccess = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer330->Add( m_bitmapGrantAccess, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); - wxBoxSizer* bSizer95; - bSizer95 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer95; + bSizer95 = new wxBoxSizer( wxVERTICAL ); - m_staticTextDescr = new wxStaticText( this, wxID_ANY, _("FreeFileSync requires access rights to avoid \"Operation not permitted\" errors when synchronizing your data (e.g. Mail, Messages, Calendars)."), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_staticTextDescr->Wrap( -1 ); - bSizer95->Add( m_staticTextDescr, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 ); + m_staticTextDescr = new wxStaticText( this, wxID_ANY, _("FreeFileSync requires access rights to avoid \"Operation not permitted\" errors when synchronizing your data (e.g. Mail, Messages, Calendars)."), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_staticTextDescr->Wrap( -1 ); + bSizer95->Add( m_staticTextDescr, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 ); - m_staticline20 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer95->Add( m_staticline20, 0, wxEXPAND, 5 ); + m_staticline20 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer95->Add( m_staticline20, 0, wxEXPAND, 5 ); - m_panel39 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel39->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_panel39 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel39->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer166; - bSizer166 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer166; + bSizer166 = new wxBoxSizer( wxVERTICAL ); - ffgSizer11 = new wxFlexGridSizer( 0, 2, 5, 5 ); - ffgSizer11->SetFlexibleDirection( wxBOTH ); - ffgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + ffgSizer11 = new wxFlexGridSizer( 0, 2, 5, 5 ); + ffgSizer11->SetFlexibleDirection( wxBOTH ); + ffgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - m_staticTextStep1 = new wxStaticText( m_panel39, wxID_ANY, _("1."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStep1->Wrap( -1 ); - ffgSizer11->Add( m_staticTextStep1, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + m_staticTextStep1 = new wxStaticText( m_panel39, wxID_ANY, _("1."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStep1->Wrap( -1 ); + ffgSizer11->Add( m_staticTextStep1, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_buttonLocateBundle = new wxButton( m_panel39, wxID_ANY, _("Locate the FreeFileSync app"), wxDefaultPosition, wxDefaultSize, 0 ); - ffgSizer11->Add( m_buttonLocateBundle, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + m_buttonLocateBundle = new wxButton( m_panel39, wxID_ANY, _("Locate the FreeFileSync app"), wxDefaultPosition, wxDefaultSize, 0 ); + ffgSizer11->Add( m_buttonLocateBundle, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - m_staticTextStep2 = new wxStaticText( m_panel39, wxID_ANY, _("2."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStep2->Wrap( -1 ); - ffgSizer11->Add( m_staticTextStep2, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + m_staticTextStep2 = new wxStaticText( m_panel39, wxID_ANY, _("2."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStep2->Wrap( -1 ); + ffgSizer11->Add( m_staticTextStep2, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_buttonOpenSecurity = new wxButton( m_panel39, wxID_ANY, _("Open Security && Privacy"), wxDefaultPosition, wxDefaultSize, 0 ); - ffgSizer11->Add( m_buttonOpenSecurity, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + m_buttonOpenSecurity = new wxButton( m_panel39, wxID_ANY, _("Open Security && Privacy"), wxDefaultPosition, wxDefaultSize, 0 ); + ffgSizer11->Add( m_buttonOpenSecurity, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - m_staticTextStep3 = new wxStaticText( m_panel39, wxID_ANY, _("3."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStep3->Wrap( -1 ); - ffgSizer11->Add( m_staticTextStep3, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + m_staticTextStep3 = new wxStaticText( m_panel39, wxID_ANY, _("3."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStep3->Wrap( -1 ); + ffgSizer11->Add( m_staticTextStep3, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_staticTextAllowChanges = new wxStaticText( m_panel39, wxID_ANY, _("Click the lock to allow changes."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextAllowChanges->Wrap( -1 ); - ffgSizer11->Add( m_staticTextAllowChanges, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_staticTextAllowChanges = new wxStaticText( m_panel39, wxID_ANY, _("Click the lock to allow changes."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextAllowChanges->Wrap( -1 ); + ffgSizer11->Add( m_staticTextAllowChanges, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextStep4 = new wxStaticText( m_panel39, wxID_ANY, _("4."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStep4->Wrap( -1 ); - ffgSizer11->Add( m_staticTextStep4, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + m_staticTextStep4 = new wxStaticText( m_panel39, wxID_ANY, _("4."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStep4->Wrap( -1 ); + ffgSizer11->Add( m_staticTextStep4, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - m_staticTextGrantAccess = new wxStaticText( m_panel39, wxID_ANY, _("Drag FreeFileSync into the panel."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextGrantAccess->Wrap( -1 ); - ffgSizer11->Add( m_staticTextGrantAccess, 0, wxALIGN_CENTER_VERTICAL, 5 ); + m_staticTextGrantAccess = new wxStaticText( m_panel39, wxID_ANY, _("Drag FreeFileSync into the panel."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextGrantAccess->Wrap( -1 ); + ffgSizer11->Add( m_staticTextGrantAccess, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer166->Add( ffgSizer11, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 10 ); + bSizer166->Add( ffgSizer11, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 10 ); - m_panel39->SetSizer( bSizer166 ); - m_panel39->Layout(); - bSizer166->Fit( m_panel39 ); - bSizer95->Add( m_panel39, 1, wxEXPAND, 5 ); + m_panel39->SetSizer( bSizer166 ); + m_panel39->Layout(); + bSizer166->Fit( m_panel39 ); + bSizer95->Add( m_panel39, 1, wxEXPAND, 5 ); - m_staticline36 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer95->Add( m_staticline36, 0, wxEXPAND, 5 ); + m_staticline36 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer95->Add( m_staticline36, 0, wxEXPAND, 5 ); - m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("&Don't show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer95->Add( m_checkBoxDontShowAgain, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("&Don't show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer95->Add( m_checkBoxDontShowAgain, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); - m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonClose->SetDefault(); - bSizerStdButtons->Add( m_buttonClose, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + m_buttonClose->SetDefault(); + bSizerStdButtons->Add( m_buttonClose, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - bSizer95->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); + bSizer95->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); - bSizer330->Add( bSizer95, 1, wxEXPAND, 5 ); + bSizer330->Add( bSizer95, 1, wxEXPAND, 5 ); - this->SetSizer( bSizer330 ); - this->Layout(); - bSizer330->Fit( this ); + this->SetSizer( bSizer330 ); + this->Layout(); + bSizer330->Fit( this ); - this->Centre( wxBOTH ); + this->Centre( wxBOTH ); - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( WarnAccessRightsMissingDlgGenerated::onClose ) ); - m_buttonLocateBundle->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarnAccessRightsMissingDlgGenerated::onShowAppBundle ), NULL, this ); - m_buttonOpenSecurity->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarnAccessRightsMissingDlgGenerated::onOpenSecuritySettings ), NULL, this ); - m_checkBoxDontShowAgain->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( WarnAccessRightsMissingDlgGenerated::onCheckBoxClick ), NULL, this ); - m_buttonClose->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarnAccessRightsMissingDlgGenerated::onOkay ), NULL, this ); + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( WarnAccessRightsMissingDlgGenerated::onClose ) ); + m_buttonLocateBundle->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarnAccessRightsMissingDlgGenerated::onShowAppBundle ), NULL, this ); + m_buttonOpenSecurity->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarnAccessRightsMissingDlgGenerated::onOpenSecuritySettings ), NULL, this ); + m_checkBoxDontShowAgain->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( WarnAccessRightsMissingDlgGenerated::onCheckBoxClick ), NULL, this ); + m_buttonClose->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarnAccessRightsMissingDlgGenerated::onOkay ), NULL, this ); } WarnAccessRightsMissingDlgGenerated::~WarnAccessRightsMissingDlgGenerated() diff --git a/FreeFileSync/Source/ui/gui_generated.h b/FreeFileSync/Source/ui/gui_generated.h index 208bc33c..3378e36e 100644 --- a/FreeFileSync/Source/ui/gui_generated.h +++ b/FreeFileSync/Source/ui/gui_generated.h @@ -10,7 +10,7 @@ #include <wx/artprov.h> #include <wx/xrc/xmlres.h> #include <wx/intl.h> -namespace zen { class BitmapTextButton; } +namespace zen{ class BitmapTextButton; } #include "wx+/bitmap_button.h" #include "folder_history_box.h" @@ -65,229 +65,229 @@ namespace zen { class BitmapTextButton; } /////////////////////////////////////////////////////////////////////////////// class MainDialogGenerated : public wxFrame { -private: - -protected: - wxMenuBar* m_menubar; - wxMenu* m_menuFile; - wxMenuItem* m_menuItemNew; - wxMenuItem* m_menuItemLoad; - wxMenuItem* m_menuItemSave; - wxMenuItem* m_menuItemSaveAs; - wxMenuItem* m_menuItemSaveAsBatch; - wxMenuItem* m_menuItemQuit; - wxMenu* m_menuActions; - wxMenuItem* m_menuItemShowLog; - wxMenuItem* m_menuItemCompare; - wxMenuItem* m_menuItemCompSettings; - wxMenuItem* m_menuItemFilter; - wxMenuItem* m_menuItemSyncSettings; - wxMenuItem* m_menuItemSynchronize; - wxMenu* m_menuTools; - wxMenuItem* m_menuItemOptions; - wxMenu* m_menuLanguages; - wxMenuItem* m_menuItemFind; - wxMenuItem* m_menuItemExportList; - wxMenuItem* m_menuItemResetLayout; - wxMenuItem* m_menuItemShowMain; - wxMenuItem* m_menuItemShowFolders; - wxMenuItem* m_menuItemShowViewFilter; - wxMenuItem* m_menuItemShowConfig; - wxMenuItem* m_menuItemShowOverview; - wxMenu* m_menuHelp; - wxMenuItem* m_menuItemHelp; - wxMenuItem* m_menuItemCheckVersionNow; - wxMenuItem* m_menuItemCheckVersionAuto; - wxMenuItem* m_menuItemAbout; - wxBoxSizer* bSizerPanelHolder; - wxPanel* m_panelTopButtons; - wxBoxSizer* bSizerTopButtons; - wxButton* m_buttonCancel; - zen::BitmapTextButton* m_buttonCompare; - wxBitmapButton* m_bpButtonCmpConfig; - wxBitmapButton* m_bpButtonCmpContext; - wxBitmapButton* m_bpButtonFilter; - wxBitmapButton* m_bpButtonFilterContext; - wxBitmapButton* m_bpButtonSyncConfig; - wxBitmapButton* m_bpButtonSyncContext; - zen::BitmapTextButton* m_buttonSync; - wxPanel* m_panelDirectoryPairs; - wxStaticText* m_staticTextResolvedPathL; - wxBitmapButton* m_bpButtonAddPair; - wxButton* m_buttonSelectFolderLeft; - wxPanel* m_panelTopCenter; - wxBitmapButton* m_bpButtonSwapSides; - wxStaticText* m_staticTextResolvedPathR; - wxButton* m_buttonSelectFolderRight; - wxScrolledWindow* m_scrolledWindowFolderPairs; - wxBoxSizer* bSizerAddFolderPairs; - zen::Grid* m_gridOverview; - wxPanel* m_panelCenter; - fff::TripleSplitter* m_splitterMain; - zen::Grid* m_gridMainL; - zen::Grid* m_gridMainC; - zen::Grid* m_gridMainR; - wxPanel* m_panelStatusBar; - wxBoxSizer* bSizerFileStatus; - wxBoxSizer* bSizerStatusLeft; - wxBoxSizer* bSizerStatusLeftDirectories; - wxStaticBitmap* m_bitmapSmallDirectoryLeft; - wxStaticText* m_staticTextStatusLeftDirs; - wxBoxSizer* bSizerStatusLeftFiles; - wxStaticBitmap* m_bitmapSmallFileLeft; - wxStaticText* m_staticTextStatusLeftFiles; - wxStaticText* m_staticTextStatusLeftBytes; - wxStaticLine* m_staticline9; - wxStaticText* m_staticTextStatusCenter; - wxBoxSizer* bSizerStatusRight; - wxStaticLine* m_staticline10; - wxBoxSizer* bSizerStatusRightDirectories; - wxStaticBitmap* m_bitmapSmallDirectoryRight; - wxStaticText* m_staticTextStatusRightDirs; - wxBoxSizer* bSizerStatusRightFiles; - wxStaticBitmap* m_bitmapSmallFileRight; - wxStaticText* m_staticTextStatusRightFiles; - wxStaticText* m_staticTextStatusRightBytes; - wxStaticText* m_staticTextFullStatus; - wxPanel* m_panelSearch; - wxBitmapButton* m_bpButtonHideSearch; - wxStaticText* m_staticText101; - wxTextCtrl* m_textCtrlSearchTxt; - wxCheckBox* m_checkBoxMatchCase; - wxPanel* m_panelLog; - wxBoxSizer* bSizerLog; - wxBoxSizer* bSizer42; - wxFlexGridSizer* ffgSizer11; - wxFlexGridSizer* ffgSizer111; - wxFlexGridSizer* ffgSizer112; - wxStaticLine* m_staticline70; - wxPanel* m_panelConfig; - wxBoxSizer* bSizerConfig; - wxBoxSizer* bSizerCfgHistoryButtons; - wxBitmapButton* m_bpButtonNew; - wxStaticText* m_staticText951; - wxBitmapButton* m_bpButtonOpen; - wxStaticText* m_staticText95; - wxBitmapButton* m_bpButtonSave; - wxStaticText* m_staticText961; - wxBoxSizer* bSizerSaveAs; - wxBitmapButton* m_bpButtonSaveAs; - wxBitmapButton* m_bpButtonSaveAsBatch; - wxStaticText* m_staticText97; - wxStaticLine* m_staticline81; - zen::Grid* m_gridCfgHistory; - wxPanel* m_panelViewFilter; - wxBoxSizer* bSizerViewFilter; - wxBitmapButton* m_bpButtonToggleLog; - wxBoxSizer* bSizerViewButtons; - zen::ToggleButton* m_bpButtonViewType; - zen::ToggleButton* m_bpButtonShowExcluded; - zen::ToggleButton* m_bpButtonShowDeleteLeft; - zen::ToggleButton* m_bpButtonShowUpdateLeft; - zen::ToggleButton* m_bpButtonShowCreateLeft; - zen::ToggleButton* m_bpButtonShowLeftOnly; - zen::ToggleButton* m_bpButtonShowLeftNewer; - zen::ToggleButton* m_bpButtonShowEqual; - zen::ToggleButton* m_bpButtonShowDoNothing; - zen::ToggleButton* m_bpButtonShowDifferent; - zen::ToggleButton* m_bpButtonShowRightNewer; - zen::ToggleButton* m_bpButtonShowRightOnly; - zen::ToggleButton* m_bpButtonShowCreateRight; - zen::ToggleButton* m_bpButtonShowUpdateRight; - zen::ToggleButton* m_bpButtonShowDeleteRight; - zen::ToggleButton* m_bpButtonShowConflict; - wxBitmapButton* m_bpButtonViewFilterContext; - wxStaticText* m_staticText96; - wxPanel* m_panelStatistics; - wxBoxSizer* bSizer1801; - wxStaticBitmap* m_bitmapDeleteLeft; - wxStaticText* m_staticTextDeleteLeft; - wxStaticBitmap* m_bitmapUpdateLeft; - wxStaticText* m_staticTextUpdateLeft; - wxStaticBitmap* m_bitmapCreateLeft; - wxStaticText* m_staticTextCreateLeft; - wxStaticBitmap* m_bitmapData; - wxStaticText* m_staticTextData; - wxStaticBitmap* m_bitmapCreateRight; - wxStaticText* m_staticTextCreateRight; - wxStaticBitmap* m_bitmapUpdateRight; - wxStaticText* m_staticTextUpdateRight; - wxStaticBitmap* m_bitmapDeleteRight; - wxStaticText* m_staticTextDeleteRight; - - // Virtual event handlers, override them in your derived class - virtual void onClose( wxCloseEvent& event ) { event.Skip(); } - virtual void onConfigNew( wxCommandEvent& event ) { event.Skip(); } - virtual void onConfigLoad( wxCommandEvent& event ) { event.Skip(); } - virtual void onConfigSave( wxCommandEvent& event ) { event.Skip(); } - virtual void onConfigSaveAs( wxCommandEvent& event ) { event.Skip(); } - virtual void onSaveAsBatchJob( wxCommandEvent& event ) { event.Skip(); } - virtual void onMenuQuit( wxCommandEvent& event ) { event.Skip(); } - virtual void onToggleLog( wxCommandEvent& event ) { event.Skip(); } - virtual void onCompare( wxCommandEvent& event ) { event.Skip(); } - virtual void onCmpSettings( wxCommandEvent& event ) { event.Skip(); } - virtual void onConfigureFilter( wxCommandEvent& event ) { event.Skip(); } - virtual void onSyncSettings( wxCommandEvent& event ) { event.Skip(); } - virtual void onStartSync( wxCommandEvent& event ) { event.Skip(); } - virtual void onMenuOptions( wxCommandEvent& event ) { event.Skip(); } - virtual void onMenuFindItem( wxCommandEvent& event ) { event.Skip(); } - virtual void onMenuExportFileList( wxCommandEvent& event ) { event.Skip(); } - virtual void onMenuResetLayout( wxCommandEvent& event ) { event.Skip(); } - virtual void onShowHelp( wxCommandEvent& event ) { event.Skip(); } - virtual void onMenuCheckVersion( wxCommandEvent& event ) { event.Skip(); } - virtual void onMenuCheckVersionAutomatically( wxCommandEvent& event ) { event.Skip(); } - virtual void onMenuAbout( wxCommandEvent& event ) { event.Skip(); } - virtual void onCompSettingsContextMouse( wxMouseEvent& event ) { event.Skip(); } - virtual void onCompSettingsContext( wxCommandEvent& event ) { event.Skip(); } - virtual void onGlobalFilterContextMouse( wxMouseEvent& event ) { event.Skip(); } - virtual void onGlobalFilterContext( wxCommandEvent& event ) { event.Skip(); } - virtual void onSyncSettingsContextMouse( wxMouseEvent& event ) { event.Skip(); } - virtual void onSyncSettingsContext( wxCommandEvent& event ) { event.Skip(); } - virtual void onTopFolderPairAdd( wxCommandEvent& event ) { event.Skip(); } - virtual void onTopFolderPairRemove( wxCommandEvent& event ) { event.Skip(); } - virtual void onSwapSides( wxCommandEvent& event ) { event.Skip(); } - virtual void onTopLocalCompCfg( wxCommandEvent& event ) { event.Skip(); } - virtual void onTopLocalFilterCfg( wxCommandEvent& event ) { event.Skip(); } - virtual void onTopLocalSyncCfg( wxCommandEvent& event ) { event.Skip(); } - virtual void onHideSearchPanel( wxCommandEvent& event ) { event.Skip(); } - virtual void onSearchGridEnter( wxCommandEvent& event ) { event.Skip(); } - virtual void onToggleViewType( wxCommandEvent& event ) { event.Skip(); } - virtual void onViewTypeContextMouse( wxMouseEvent& event ) { event.Skip(); } - virtual void onToggleViewButton( wxCommandEvent& event ) { event.Skip(); } - virtual void onViewFilterContextMouse( wxMouseEvent& event ) { event.Skip(); } - virtual void onViewFilterContext( wxCommandEvent& event ) { event.Skip(); } - - -public: - wxPanel* m_panelTopLeft; - wxBitmapButton* m_bpButtonRemovePair; - fff::FolderHistoryBox* m_folderPathLeft; - wxBitmapButton* m_bpButtonSelectAltFolderLeft; - wxBitmapButton* m_bpButtonLocalCompCfg; - wxBitmapButton* m_bpButtonLocalFilter; - wxBitmapButton* m_bpButtonLocalSyncCfg; - wxPanel* m_panelTopRight; - fff::FolderHistoryBox* m_folderPathRight; - wxBitmapButton* m_bpButtonSelectAltFolderRight; - wxStaticBitmap* m_bitmapSyncResult; - wxStaticText* m_staticTextSyncResult; - wxStaticText* m_staticTextProcessed; - wxStaticText* m_staticTextRemaining; - wxPanel* m_panelItemStats; - wxStaticBitmap* m_bitmapItemStat; - wxStaticText* m_staticTextItemsProcessed; - wxStaticText* m_staticTextBytesProcessed; - wxStaticText* m_staticTextItemsRemaining; - wxStaticText* m_staticTextBytesRemaining; - wxPanel* m_panelTimeStats; - wxStaticBitmap* m_bitmapTimeStat; - wxStaticText* m_staticTextTimeElapsed; - wxBoxSizer* bSizerStatistics; - wxBoxSizer* bSizerData; - - MainDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); - - ~MainDialogGenerated(); + private: + + protected: + wxMenuBar* m_menubar; + wxMenu* m_menuFile; + wxMenuItem* m_menuItemNew; + wxMenuItem* m_menuItemLoad; + wxMenuItem* m_menuItemSave; + wxMenuItem* m_menuItemSaveAs; + wxMenuItem* m_menuItemSaveAsBatch; + wxMenuItem* m_menuItemQuit; + wxMenu* m_menuActions; + wxMenuItem* m_menuItemShowLog; + wxMenuItem* m_menuItemCompare; + wxMenuItem* m_menuItemCompSettings; + wxMenuItem* m_menuItemFilter; + wxMenuItem* m_menuItemSyncSettings; + wxMenuItem* m_menuItemSynchronize; + wxMenu* m_menuTools; + wxMenuItem* m_menuItemOptions; + wxMenu* m_menuLanguages; + wxMenuItem* m_menuItemFind; + wxMenuItem* m_menuItemExportList; + wxMenuItem* m_menuItemResetLayout; + wxMenuItem* m_menuItemShowMain; + wxMenuItem* m_menuItemShowFolders; + wxMenuItem* m_menuItemShowViewFilter; + wxMenuItem* m_menuItemShowConfig; + wxMenuItem* m_menuItemShowOverview; + wxMenu* m_menuHelp; + wxMenuItem* m_menuItemHelp; + wxMenuItem* m_menuItemCheckVersionNow; + wxMenuItem* m_menuItemCheckVersionAuto; + wxMenuItem* m_menuItemAbout; + wxBoxSizer* bSizerPanelHolder; + wxPanel* m_panelTopButtons; + wxBoxSizer* bSizerTopButtons; + wxButton* m_buttonCancel; + zen::BitmapTextButton* m_buttonCompare; + wxBitmapButton* m_bpButtonCmpConfig; + wxBitmapButton* m_bpButtonCmpContext; + wxBitmapButton* m_bpButtonFilter; + wxBitmapButton* m_bpButtonFilterContext; + wxBitmapButton* m_bpButtonSyncConfig; + wxBitmapButton* m_bpButtonSyncContext; + zen::BitmapTextButton* m_buttonSync; + wxPanel* m_panelDirectoryPairs; + wxStaticText* m_staticTextResolvedPathL; + wxBitmapButton* m_bpButtonAddPair; + wxButton* m_buttonSelectFolderLeft; + wxPanel* m_panelTopCenter; + wxBitmapButton* m_bpButtonSwapSides; + wxStaticText* m_staticTextResolvedPathR; + wxButton* m_buttonSelectFolderRight; + wxScrolledWindow* m_scrolledWindowFolderPairs; + wxBoxSizer* bSizerAddFolderPairs; + zen::Grid* m_gridOverview; + wxPanel* m_panelCenter; + fff::TripleSplitter* m_splitterMain; + zen::Grid* m_gridMainL; + zen::Grid* m_gridMainC; + zen::Grid* m_gridMainR; + wxPanel* m_panelStatusBar; + wxBoxSizer* bSizerFileStatus; + wxBoxSizer* bSizerStatusLeft; + wxBoxSizer* bSizerStatusLeftDirectories; + wxStaticBitmap* m_bitmapSmallDirectoryLeft; + wxStaticText* m_staticTextStatusLeftDirs; + wxBoxSizer* bSizerStatusLeftFiles; + wxStaticBitmap* m_bitmapSmallFileLeft; + wxStaticText* m_staticTextStatusLeftFiles; + wxStaticText* m_staticTextStatusLeftBytes; + wxStaticLine* m_staticline9; + wxStaticText* m_staticTextStatusCenter; + wxBoxSizer* bSizerStatusRight; + wxStaticLine* m_staticline10; + wxBoxSizer* bSizerStatusRightDirectories; + wxStaticBitmap* m_bitmapSmallDirectoryRight; + wxStaticText* m_staticTextStatusRightDirs; + wxBoxSizer* bSizerStatusRightFiles; + wxStaticBitmap* m_bitmapSmallFileRight; + wxStaticText* m_staticTextStatusRightFiles; + wxStaticText* m_staticTextStatusRightBytes; + wxStaticText* m_staticTextFullStatus; + wxPanel* m_panelSearch; + wxBitmapButton* m_bpButtonHideSearch; + wxStaticText* m_staticText101; + wxTextCtrl* m_textCtrlSearchTxt; + wxCheckBox* m_checkBoxMatchCase; + wxPanel* m_panelLog; + wxBoxSizer* bSizerLog; + wxBoxSizer* bSizer42; + wxFlexGridSizer* ffgSizer11; + wxFlexGridSizer* ffgSizer111; + wxFlexGridSizer* ffgSizer112; + wxStaticLine* m_staticline70; + wxPanel* m_panelConfig; + wxBoxSizer* bSizerConfig; + wxBoxSizer* bSizerCfgHistoryButtons; + wxBitmapButton* m_bpButtonNew; + wxStaticText* m_staticText951; + wxBitmapButton* m_bpButtonOpen; + wxStaticText* m_staticText95; + wxBitmapButton* m_bpButtonSave; + wxStaticText* m_staticText961; + wxBoxSizer* bSizerSaveAs; + wxBitmapButton* m_bpButtonSaveAs; + wxBitmapButton* m_bpButtonSaveAsBatch; + wxStaticText* m_staticText97; + wxStaticLine* m_staticline81; + zen::Grid* m_gridCfgHistory; + wxPanel* m_panelViewFilter; + wxBoxSizer* bSizerViewFilter; + wxBitmapButton* m_bpButtonToggleLog; + wxBoxSizer* bSizerViewButtons; + zen::ToggleButton* m_bpButtonViewType; + zen::ToggleButton* m_bpButtonShowExcluded; + zen::ToggleButton* m_bpButtonShowDeleteLeft; + zen::ToggleButton* m_bpButtonShowUpdateLeft; + zen::ToggleButton* m_bpButtonShowCreateLeft; + zen::ToggleButton* m_bpButtonShowLeftOnly; + zen::ToggleButton* m_bpButtonShowLeftNewer; + zen::ToggleButton* m_bpButtonShowEqual; + zen::ToggleButton* m_bpButtonShowDoNothing; + zen::ToggleButton* m_bpButtonShowDifferent; + zen::ToggleButton* m_bpButtonShowRightNewer; + zen::ToggleButton* m_bpButtonShowRightOnly; + zen::ToggleButton* m_bpButtonShowCreateRight; + zen::ToggleButton* m_bpButtonShowUpdateRight; + zen::ToggleButton* m_bpButtonShowDeleteRight; + zen::ToggleButton* m_bpButtonShowConflict; + wxBitmapButton* m_bpButtonViewFilterContext; + wxStaticText* m_staticText96; + wxPanel* m_panelStatistics; + wxBoxSizer* bSizer1801; + wxStaticBitmap* m_bitmapDeleteLeft; + wxStaticText* m_staticTextDeleteLeft; + wxStaticBitmap* m_bitmapUpdateLeft; + wxStaticText* m_staticTextUpdateLeft; + wxStaticBitmap* m_bitmapCreateLeft; + wxStaticText* m_staticTextCreateLeft; + wxStaticBitmap* m_bitmapData; + wxStaticText* m_staticTextData; + wxStaticBitmap* m_bitmapCreateRight; + wxStaticText* m_staticTextCreateRight; + wxStaticBitmap* m_bitmapUpdateRight; + wxStaticText* m_staticTextUpdateRight; + wxStaticBitmap* m_bitmapDeleteRight; + wxStaticText* m_staticTextDeleteRight; + + // Virtual event handlers, override them in your derived class + virtual void onClose( wxCloseEvent& event ) { event.Skip(); } + virtual void onConfigNew( wxCommandEvent& event ) { event.Skip(); } + virtual void onConfigLoad( wxCommandEvent& event ) { event.Skip(); } + virtual void onConfigSave( wxCommandEvent& event ) { event.Skip(); } + virtual void onConfigSaveAs( wxCommandEvent& event ) { event.Skip(); } + virtual void onSaveAsBatchJob( wxCommandEvent& event ) { event.Skip(); } + virtual void onMenuQuit( wxCommandEvent& event ) { event.Skip(); } + virtual void onToggleLog( wxCommandEvent& event ) { event.Skip(); } + virtual void onCompare( wxCommandEvent& event ) { event.Skip(); } + virtual void onCmpSettings( wxCommandEvent& event ) { event.Skip(); } + virtual void onConfigureFilter( wxCommandEvent& event ) { event.Skip(); } + virtual void onSyncSettings( wxCommandEvent& event ) { event.Skip(); } + virtual void onStartSync( wxCommandEvent& event ) { event.Skip(); } + virtual void onMenuOptions( wxCommandEvent& event ) { event.Skip(); } + virtual void onMenuFindItem( wxCommandEvent& event ) { event.Skip(); } + virtual void onMenuExportFileList( wxCommandEvent& event ) { event.Skip(); } + virtual void onMenuResetLayout( wxCommandEvent& event ) { event.Skip(); } + virtual void onShowHelp( wxCommandEvent& event ) { event.Skip(); } + virtual void onMenuCheckVersion( wxCommandEvent& event ) { event.Skip(); } + virtual void onMenuCheckVersionAutomatically( wxCommandEvent& event ) { event.Skip(); } + virtual void onMenuAbout( wxCommandEvent& event ) { event.Skip(); } + virtual void onCompSettingsContextMouse( wxMouseEvent& event ) { event.Skip(); } + virtual void onCompSettingsContext( wxCommandEvent& event ) { event.Skip(); } + virtual void onGlobalFilterContextMouse( wxMouseEvent& event ) { event.Skip(); } + virtual void onGlobalFilterContext( wxCommandEvent& event ) { event.Skip(); } + virtual void onSyncSettingsContextMouse( wxMouseEvent& event ) { event.Skip(); } + virtual void onSyncSettingsContext( wxCommandEvent& event ) { event.Skip(); } + virtual void onTopFolderPairAdd( wxCommandEvent& event ) { event.Skip(); } + virtual void onTopFolderPairRemove( wxCommandEvent& event ) { event.Skip(); } + virtual void onSwapSides( wxCommandEvent& event ) { event.Skip(); } + virtual void onTopLocalCompCfg( wxCommandEvent& event ) { event.Skip(); } + virtual void onTopLocalFilterCfg( wxCommandEvent& event ) { event.Skip(); } + virtual void onTopLocalSyncCfg( wxCommandEvent& event ) { event.Skip(); } + virtual void onHideSearchPanel( wxCommandEvent& event ) { event.Skip(); } + virtual void onSearchGridEnter( wxCommandEvent& event ) { event.Skip(); } + virtual void onToggleViewType( wxCommandEvent& event ) { event.Skip(); } + virtual void onViewTypeContextMouse( wxMouseEvent& event ) { event.Skip(); } + virtual void onToggleViewButton( wxCommandEvent& event ) { event.Skip(); } + virtual void onViewFilterContextMouse( wxMouseEvent& event ) { event.Skip(); } + virtual void onViewFilterContext( wxCommandEvent& event ) { event.Skip(); } + + + public: + wxPanel* m_panelTopLeft; + wxBitmapButton* m_bpButtonRemovePair; + fff::FolderHistoryBox* m_folderPathLeft; + wxBitmapButton* m_bpButtonSelectAltFolderLeft; + wxBitmapButton* m_bpButtonLocalCompCfg; + wxBitmapButton* m_bpButtonLocalFilter; + wxBitmapButton* m_bpButtonLocalSyncCfg; + wxPanel* m_panelTopRight; + fff::FolderHistoryBox* m_folderPathRight; + wxBitmapButton* m_bpButtonSelectAltFolderRight; + wxStaticBitmap* m_bitmapSyncResult; + wxStaticText* m_staticTextSyncResult; + wxStaticText* m_staticTextProcessed; + wxStaticText* m_staticTextRemaining; + wxPanel* m_panelItemStats; + wxStaticBitmap* m_bitmapItemStat; + wxStaticText* m_staticTextItemsProcessed; + wxStaticText* m_staticTextBytesProcessed; + wxStaticText* m_staticTextItemsRemaining; + wxStaticText* m_staticTextBytesRemaining; + wxPanel* m_panelTimeStats; + wxStaticBitmap* m_bitmapTimeStat; + wxStaticText* m_staticTextTimeElapsed; + wxBoxSizer* bSizerStatistics; + wxBoxSizer* bSizerData; + + MainDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); + + ~MainDialogGenerated(); }; @@ -296,29 +296,29 @@ public: /////////////////////////////////////////////////////////////////////////////// class FolderPairPanelGenerated : public wxPanel { -private: - -protected: - wxButton* m_buttonSelectFolderLeft; - wxButton* m_buttonSelectFolderRight; - -public: - wxPanel* m_panelLeft; - wxBitmapButton* m_bpButtonFolderPairOptions; - wxBitmapButton* m_bpButtonRemovePair; - fff::FolderHistoryBox* m_folderPathLeft; - wxBitmapButton* m_bpButtonSelectAltFolderLeft; - wxPanel* m_panel20; - wxBitmapButton* m_bpButtonLocalCompCfg; - wxBitmapButton* m_bpButtonLocalFilter; - wxBitmapButton* m_bpButtonLocalSyncCfg; - wxPanel* m_panelRight; - fff::FolderHistoryBox* m_folderPathRight; - wxBitmapButton* m_bpButtonSelectAltFolderRight; - - FolderPairPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 698, 67 ), long style = 0, const wxString& name = wxEmptyString ); - - ~FolderPairPanelGenerated(); + private: + + protected: + wxButton* m_buttonSelectFolderLeft; + wxButton* m_buttonSelectFolderRight; + + public: + wxPanel* m_panelLeft; + wxBitmapButton* m_bpButtonFolderPairOptions; + wxBitmapButton* m_bpButtonRemovePair; + fff::FolderHistoryBox* m_folderPathLeft; + wxBitmapButton* m_bpButtonSelectAltFolderLeft; + wxPanel* m_panel20; + wxBitmapButton* m_bpButtonLocalCompCfg; + wxBitmapButton* m_bpButtonLocalFilter; + wxBitmapButton* m_bpButtonLocalSyncCfg; + wxPanel* m_panelRight; + fff::FolderHistoryBox* m_folderPathRight; + wxBitmapButton* m_bpButtonSelectAltFolderRight; + + FolderPairPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 698,67 ), long style = 0, const wxString& name = wxEmptyString ); + + ~FolderPairPanelGenerated(); }; @@ -327,243 +327,243 @@ public: /////////////////////////////////////////////////////////////////////////////// class ConfigDlgGenerated : public wxDialog { -private: - -protected: - wxStaticText* m_staticTextFolderPairLabel; - wxListBox* m_listBoxFolderPair; - wxNotebook* m_notebook; - wxPanel* m_panelCompSettingsTab; - wxBoxSizer* bSizerHeaderCompSettings; - wxStaticText* m_staticTextMainCompSettings; - wxCheckBox* m_checkBoxUseLocalCmpOptions; - wxStaticLine* m_staticlineCompHeader; - wxPanel* m_panelComparisonSettings; - wxStaticText* m_staticText91; - zen::ToggleButton* m_buttonByTimeSize; - zen::ToggleButton* m_buttonByContent; - zen::ToggleButton* m_buttonBySize; - wxStaticBitmap* m_bitmapCompVariant; - wxStaticText* m_staticTextCompVarDescription; - wxStaticLine* m_staticline33; - wxCheckBox* m_checkBoxSymlinksInclude; - wxRadioButton* m_radioBtnSymlinksFollow; - wxRadioButton* m_radioBtnSymlinksDirect; - wxHyperlinkCtrl* m_hyperlink24; - wxStaticLine* m_staticline44; - wxStaticText* m_staticText112; - wxTextCtrl* m_textCtrlTimeShift; - wxStaticText* m_staticText1381; - wxStaticText* m_staticText13811; - wxHyperlinkCtrl* m_hyperlink241; - wxStaticLine* m_staticline331; - wxBoxSizer* bSizerCompMisc; - wxStaticLine* m_staticline3311; - wxStaticBitmap* m_bitmapIgnoreErrors; - wxCheckBox* m_checkBoxIgnoreErrors; - wxCheckBox* m_checkBoxAutoRetry; - wxFlexGridSizer* fgSizerAutoRetry; - wxStaticText* m_staticText96; - wxStaticText* m_staticTextAutoRetryDelay; - wxSpinCtrl* m_spinCtrlAutoRetryCount; - wxSpinCtrl* m_spinCtrlAutoRetryDelay; - wxStaticLine* m_staticline751; - wxBoxSizer* bSizerPerformance; - wxPanel* m_panel57; - wxStaticBitmap* m_bitmapPerf; - wxStaticText* m_staticText13611; - wxHyperlinkCtrl* m_hyperlinkPerfDeRequired; - wxBoxSizer* bSizer260; - wxStaticText* m_staticTextPerfParallelOps; - wxScrolledWindow* m_scrolledWindowPerf; - wxFlexGridSizer* fgSizerPerf; - wxHyperlinkCtrl* m_hyperlink1711; - wxPanel* m_panelFilterSettingsTab; - wxBoxSizer* bSizerHeaderFilterSettings; - wxStaticText* m_staticTextMainFilterSettings; - wxStaticText* m_staticTextLocalFilterSettings; - wxStaticLine* m_staticlineFilterHeader; - wxPanel* m_panel571; - wxStaticBitmap* m_bitmapInclude; - wxStaticText* m_staticText78; - wxTextCtrl* m_textCtrlInclude; - wxStaticBitmap* m_bitmapExclude; - wxStaticText* m_staticText77; - wxHyperlinkCtrl* m_hyperlink171; - wxTextCtrl* m_textCtrlExclude; - wxStaticLine* m_staticline24; - wxStaticBitmap* m_bitmapFilterSize; - wxStaticText* m_staticText80; - wxStaticText* m_staticText101; - wxSpinCtrl* m_spinCtrlMinSize; - wxChoice* m_choiceUnitMinSize; - wxStaticText* m_staticText102; - wxSpinCtrl* m_spinCtrlMaxSize; - wxChoice* m_choiceUnitMaxSize; - wxStaticLine* m_staticline23; - wxStaticBitmap* m_bitmapFilterDate; - wxStaticText* m_staticText79; - wxChoice* m_choiceUnitTimespan; - wxSpinCtrl* m_spinCtrlTimespan; - wxStaticLine* m_staticline231; - wxButton* m_buttonDefault; - wxBitmapButton* m_bpButtonDefaultContext; - wxButton* m_buttonClear; - wxPanel* m_panelSyncSettingsTab; - wxBoxSizer* bSizerHeaderSyncSettings; - wxStaticText* m_staticTextMainSyncSettings; - wxCheckBox* m_checkBoxUseLocalSyncOptions; - wxStaticLine* m_staticlineSyncHeader; - wxPanel* m_panelSyncSettings; - wxStaticText* m_staticText86; - zen::ToggleButton* m_buttonTwoWay; - zen::ToggleButton* m_buttonMirror; - zen::ToggleButton* m_buttonUpdate; - zen::ToggleButton* m_buttonCustom; - wxBoxSizer* bSizerSyncDirHolder; - wxBoxSizer* bSizerSyncDirections; - wxStaticText* m_staticText184; - wxFlexGridSizer* ffgSizer11; - wxStaticBitmap* m_bitmapLeftOnly; - wxStaticBitmap* m_bitmapLeftNewer; - wxStaticBitmap* m_bitmapDifferent; - wxStaticBitmap* m_bitmapConflict; - wxStaticBitmap* m_bitmapRightNewer; - wxStaticBitmap* m_bitmapRightOnly; - wxBitmapButton* m_bpButtonLeftOnly; - wxBitmapButton* m_bpButtonLeftNewer; - wxBitmapButton* m_bpButtonDifferent; - wxBitmapButton* m_bpButtonConflict; - wxBitmapButton* m_bpButtonRightNewer; - wxBitmapButton* m_bpButtonRightOnly; - wxStaticText* m_staticText120; - wxBoxSizer* bSizerDatabase; - wxStaticBitmap* m_bitmapDatabase; - wxStaticText* m_staticText145; - wxStaticText* m_staticTextSyncVarDescription; - wxStaticLine* m_staticline431; - wxStaticLine* m_staticline72; - wxCheckBox* m_checkBoxDetectMove; - wxHyperlinkCtrl* m_hyperlink242; - wxStaticLine* m_staticline54; - wxBoxSizer* bSizer2361; - wxStaticText* m_staticText87; - zen::ToggleButton* m_buttonRecycler; - zen::ToggleButton* m_buttonPermanent; - zen::ToggleButton* m_buttonVersioning; - wxBoxSizer* bSizerVersioningHolder; - wxStaticBitmap* m_bitmapDeletionType; - wxStaticText* m_staticTextDeletionTypeDescription; - wxPanel* m_panelVersioning; - wxStaticBitmap* m_bitmapVersioning; - wxStaticText* m_staticText155; - wxHyperlinkCtrl* m_hyperlink243; - fff::FolderHistoryBox* m_versioningFolderPath; - wxButton* m_buttonSelectVersioningFolder; - wxStaticText* m_staticText93; - wxChoice* m_choiceVersioningStyle; - wxStaticText* m_staticTextNamingCvtPart1; - wxStaticText* m_staticTextNamingCvtPart2Bold; - wxStaticText* m_staticTextNamingCvtPart3; - wxStaticLine* m_staticline69; - wxStaticText* m_staticTextLimitVersions; - wxFlexGridSizer* fgSizer15; - wxCheckBox* m_checkBoxVersionMaxDays; - wxCheckBox* m_checkBoxVersionCountMin; - wxCheckBox* m_checkBoxVersionCountMax; - wxSpinCtrl* m_spinCtrlVersionMaxDays; - wxSpinCtrl* m_spinCtrlVersionCountMin; - wxSpinCtrl* m_spinCtrlVersionCountMax; - wxStaticLine* m_staticline582; - wxBoxSizer* bSizerSyncMisc; - wxStaticBitmap* m_bitmapEmail; - wxCheckBox* m_checkBoxSendEmail; - fff::CommandBox* m_comboBoxEmail; - wxBitmapButton* m_bpButtonEmailAlways; - wxBitmapButton* m_bpButtonEmailErrorWarning; - wxBitmapButton* m_bpButtonEmailErrorOnly; - wxHyperlinkCtrl* m_hyperlinkPerfDeRequired2; - wxStaticLine* m_staticline57; - wxPanel* m_panelLogfile; - wxStaticBitmap* m_bitmapLogFile; - wxCheckBox* m_checkBoxOverrideLogPath; - wxButton* m_buttonSelectLogFolder; - wxStaticLine* m_staticline80; - wxStaticText* m_staticTextPostSync; - fff::CommandBox* m_comboBoxPostSyncCommand; - wxPanel* m_panelNotes; - wxStaticBitmap* m_bitmapNotes; - wxStaticText* m_staticText781; - wxTextCtrl* m_textCtrNotes; - wxStaticLine* m_staticline83; - wxBoxSizer* bSizerStdButtons; - zen::BitmapTextButton* m_buttonAddNotes; - wxButton* m_buttonOkay; - wxButton* m_buttonCancel; - - // Virtual event handlers, override them in your derived class - virtual void onClose( wxCloseEvent& event ) { event.Skip(); } - virtual void onListBoxKeyEvent( wxKeyEvent& event ) { event.Skip(); } - virtual void onSelectFolderPair( wxCommandEvent& event ) { event.Skip(); } - virtual void onToggleLocalCompSettings( wxCommandEvent& event ) { event.Skip(); } - virtual void onCompByTimeSize( wxCommandEvent& event ) { event.Skip(); } - virtual void onCompByTimeSizeDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void onCompByContent( wxCommandEvent& event ) { event.Skip(); } - virtual void onCompByContentDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void onCompBySize( wxCommandEvent& event ) { event.Skip(); } - virtual void onCompBySizeDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void onChangeCompOption( wxCommandEvent& event ) { event.Skip(); } - virtual void onToggleIgnoreErrors( wxCommandEvent& event ) { event.Skip(); } - virtual void onToggleAutoRetry( wxCommandEvent& event ) { event.Skip(); } - virtual void onChangeFilterOption( wxCommandEvent& event ) { event.Skip(); } - virtual void onFilterDefault( wxCommandEvent& event ) { event.Skip(); } - virtual void onFilterDefaultContextMouse( wxMouseEvent& event ) { event.Skip(); } - virtual void onFilterDefaultContext( wxCommandEvent& event ) { event.Skip(); } - virtual void onFilterClear( wxCommandEvent& event ) { event.Skip(); } - virtual void onToggleLocalSyncSettings( wxCommandEvent& event ) { event.Skip(); } - virtual void onSyncTwoWay( wxCommandEvent& event ) { event.Skip(); } - virtual void onSyncTwoWayDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void onSyncMirror( wxCommandEvent& event ) { event.Skip(); } - virtual void onSyncMirrorDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void onSyncUpdate( wxCommandEvent& event ) { event.Skip(); } - virtual void onSyncUpdateDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void onSyncCustom( wxCommandEvent& event ) { event.Skip(); } - virtual void onSyncCustomDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void onExLeftSideOnly( wxCommandEvent& event ) { event.Skip(); } - virtual void onLeftNewer( wxCommandEvent& event ) { event.Skip(); } - virtual void onDifferent( wxCommandEvent& event ) { event.Skip(); } - virtual void onConflict( wxCommandEvent& event ) { event.Skip(); } - virtual void onRightNewer( wxCommandEvent& event ) { event.Skip(); } - virtual void onExRightSideOnly( wxCommandEvent& event ) { event.Skip(); } - virtual void onToggleDetectMovedFiles( wxCommandEvent& event ) { event.Skip(); } - virtual void onDeletionRecycler( wxCommandEvent& event ) { event.Skip(); } - virtual void onDeletionPermanent( wxCommandEvent& event ) { event.Skip(); } - virtual void onDeletionVersioning( wxCommandEvent& event ) { event.Skip(); } - virtual void onChanegVersioningStyle( wxCommandEvent& event ) { event.Skip(); } - virtual void onToggleVersioningLimit( wxCommandEvent& event ) { event.Skip(); } - virtual void onToggleMiscEmail( wxCommandEvent& event ) { event.Skip(); } - virtual void onEmailAlways( wxCommandEvent& event ) { event.Skip(); } - virtual void onEmailErrorWarning( wxCommandEvent& event ) { event.Skip(); } - virtual void onEmailErrorOnly( wxCommandEvent& event ) { event.Skip(); } - virtual void onToggleMiscOption( wxCommandEvent& event ) { event.Skip(); } - virtual void onShowLogFolder( wxCommandEvent& event ) { event.Skip(); } - virtual void onAddNotes( wxCommandEvent& event ) { event.Skip(); } - virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } - virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } - - -public: - wxStaticBitmap* m_bitmapRetryErrors; - wxStaticText* m_staticTextFilterDescr; - wxBitmapButton* m_bpButtonSelectVersioningAltFolder; - wxBitmapButton* m_bpButtonShowLogFolder; - fff::FolderHistoryBox* m_logFolderPath; - wxBitmapButton* m_bpButtonSelectAltLogFolder; - wxChoice* m_choicePostSyncCondition; - - ConfigDlgGenerated( 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|wxMAXIMIZE_BOX|wxRESIZE_BORDER ); - - ~ConfigDlgGenerated(); + private: + + protected: + wxStaticText* m_staticTextFolderPairLabel; + wxListBox* m_listBoxFolderPair; + wxNotebook* m_notebook; + wxPanel* m_panelCompSettingsTab; + wxBoxSizer* bSizerHeaderCompSettings; + wxStaticText* m_staticTextMainCompSettings; + wxCheckBox* m_checkBoxUseLocalCmpOptions; + wxStaticLine* m_staticlineCompHeader; + wxPanel* m_panelComparisonSettings; + wxStaticText* m_staticText91; + zen::ToggleButton* m_buttonByTimeSize; + zen::ToggleButton* m_buttonByContent; + zen::ToggleButton* m_buttonBySize; + wxStaticBitmap* m_bitmapCompVariant; + wxStaticText* m_staticTextCompVarDescription; + wxStaticLine* m_staticline33; + wxCheckBox* m_checkBoxSymlinksInclude; + wxRadioButton* m_radioBtnSymlinksFollow; + wxRadioButton* m_radioBtnSymlinksDirect; + wxHyperlinkCtrl* m_hyperlink24; + wxStaticLine* m_staticline44; + wxStaticText* m_staticText112; + wxTextCtrl* m_textCtrlTimeShift; + wxStaticText* m_staticText1381; + wxStaticText* m_staticText13811; + wxHyperlinkCtrl* m_hyperlink241; + wxStaticLine* m_staticline331; + wxBoxSizer* bSizerCompMisc; + wxStaticLine* m_staticline3311; + wxStaticBitmap* m_bitmapIgnoreErrors; + wxCheckBox* m_checkBoxIgnoreErrors; + wxCheckBox* m_checkBoxAutoRetry; + wxFlexGridSizer* fgSizerAutoRetry; + wxStaticText* m_staticText96; + wxStaticText* m_staticTextAutoRetryDelay; + wxSpinCtrl* m_spinCtrlAutoRetryCount; + wxSpinCtrl* m_spinCtrlAutoRetryDelay; + wxStaticLine* m_staticline751; + wxBoxSizer* bSizerPerformance; + wxPanel* m_panel57; + wxStaticBitmap* m_bitmapPerf; + wxStaticText* m_staticText13611; + wxHyperlinkCtrl* m_hyperlinkPerfDeRequired; + wxBoxSizer* bSizer260; + wxStaticText* m_staticTextPerfParallelOps; + wxScrolledWindow* m_scrolledWindowPerf; + wxFlexGridSizer* fgSizerPerf; + wxHyperlinkCtrl* m_hyperlink1711; + wxPanel* m_panelFilterSettingsTab; + wxBoxSizer* bSizerHeaderFilterSettings; + wxStaticText* m_staticTextMainFilterSettings; + wxStaticText* m_staticTextLocalFilterSettings; + wxStaticLine* m_staticlineFilterHeader; + wxPanel* m_panel571; + wxStaticBitmap* m_bitmapInclude; + wxStaticText* m_staticText78; + wxTextCtrl* m_textCtrlInclude; + wxStaticBitmap* m_bitmapExclude; + wxStaticText* m_staticText77; + wxHyperlinkCtrl* m_hyperlink171; + wxTextCtrl* m_textCtrlExclude; + wxStaticLine* m_staticline24; + wxStaticBitmap* m_bitmapFilterSize; + wxStaticText* m_staticText80; + wxStaticText* m_staticText101; + wxSpinCtrl* m_spinCtrlMinSize; + wxChoice* m_choiceUnitMinSize; + wxStaticText* m_staticText102; + wxSpinCtrl* m_spinCtrlMaxSize; + wxChoice* m_choiceUnitMaxSize; + wxStaticLine* m_staticline23; + wxStaticBitmap* m_bitmapFilterDate; + wxStaticText* m_staticText79; + wxChoice* m_choiceUnitTimespan; + wxSpinCtrl* m_spinCtrlTimespan; + wxStaticLine* m_staticline231; + wxButton* m_buttonDefault; + wxBitmapButton* m_bpButtonDefaultContext; + wxButton* m_buttonClear; + wxPanel* m_panelSyncSettingsTab; + wxBoxSizer* bSizerHeaderSyncSettings; + wxStaticText* m_staticTextMainSyncSettings; + wxCheckBox* m_checkBoxUseLocalSyncOptions; + wxStaticLine* m_staticlineSyncHeader; + wxPanel* m_panelSyncSettings; + wxStaticText* m_staticText86; + zen::ToggleButton* m_buttonTwoWay; + zen::ToggleButton* m_buttonMirror; + zen::ToggleButton* m_buttonUpdate; + zen::ToggleButton* m_buttonCustom; + wxBoxSizer* bSizerSyncDirHolder; + wxBoxSizer* bSizerSyncDirections; + wxStaticText* m_staticText184; + wxFlexGridSizer* ffgSizer11; + wxStaticBitmap* m_bitmapLeftOnly; + wxStaticBitmap* m_bitmapLeftNewer; + wxStaticBitmap* m_bitmapDifferent; + wxStaticBitmap* m_bitmapConflict; + wxStaticBitmap* m_bitmapRightNewer; + wxStaticBitmap* m_bitmapRightOnly; + wxBitmapButton* m_bpButtonLeftOnly; + wxBitmapButton* m_bpButtonLeftNewer; + wxBitmapButton* m_bpButtonDifferent; + wxBitmapButton* m_bpButtonConflict; + wxBitmapButton* m_bpButtonRightNewer; + wxBitmapButton* m_bpButtonRightOnly; + wxStaticText* m_staticText120; + wxBoxSizer* bSizerDatabase; + wxStaticBitmap* m_bitmapDatabase; + wxStaticText* m_staticText145; + wxStaticText* m_staticTextSyncVarDescription; + wxStaticLine* m_staticline431; + wxStaticLine* m_staticline72; + wxCheckBox* m_checkBoxDetectMove; + wxHyperlinkCtrl* m_hyperlink242; + wxStaticLine* m_staticline54; + wxBoxSizer* bSizer2361; + wxStaticText* m_staticText87; + zen::ToggleButton* m_buttonRecycler; + zen::ToggleButton* m_buttonPermanent; + zen::ToggleButton* m_buttonVersioning; + wxBoxSizer* bSizerVersioningHolder; + wxStaticBitmap* m_bitmapDeletionType; + wxStaticText* m_staticTextDeletionTypeDescription; + wxPanel* m_panelVersioning; + wxStaticBitmap* m_bitmapVersioning; + wxStaticText* m_staticText155; + wxHyperlinkCtrl* m_hyperlink243; + fff::FolderHistoryBox* m_versioningFolderPath; + wxButton* m_buttonSelectVersioningFolder; + wxStaticText* m_staticText93; + wxChoice* m_choiceVersioningStyle; + wxStaticText* m_staticTextNamingCvtPart1; + wxStaticText* m_staticTextNamingCvtPart2Bold; + wxStaticText* m_staticTextNamingCvtPart3; + wxStaticLine* m_staticline69; + wxStaticText* m_staticTextLimitVersions; + wxFlexGridSizer* fgSizer15; + wxCheckBox* m_checkBoxVersionMaxDays; + wxCheckBox* m_checkBoxVersionCountMin; + wxCheckBox* m_checkBoxVersionCountMax; + wxSpinCtrl* m_spinCtrlVersionMaxDays; + wxSpinCtrl* m_spinCtrlVersionCountMin; + wxSpinCtrl* m_spinCtrlVersionCountMax; + wxStaticLine* m_staticline582; + wxBoxSizer* bSizerSyncMisc; + wxStaticBitmap* m_bitmapEmail; + wxCheckBox* m_checkBoxSendEmail; + fff::CommandBox* m_comboBoxEmail; + wxBitmapButton* m_bpButtonEmailAlways; + wxBitmapButton* m_bpButtonEmailErrorWarning; + wxBitmapButton* m_bpButtonEmailErrorOnly; + wxHyperlinkCtrl* m_hyperlinkPerfDeRequired2; + wxStaticLine* m_staticline57; + wxPanel* m_panelLogfile; + wxStaticBitmap* m_bitmapLogFile; + wxCheckBox* m_checkBoxOverrideLogPath; + wxButton* m_buttonSelectLogFolder; + wxStaticLine* m_staticline80; + wxStaticText* m_staticTextPostSync; + fff::CommandBox* m_comboBoxPostSyncCommand; + wxPanel* m_panelNotes; + wxStaticBitmap* m_bitmapNotes; + wxStaticText* m_staticText781; + wxTextCtrl* m_textCtrNotes; + wxStaticLine* m_staticline83; + wxBoxSizer* bSizerStdButtons; + zen::BitmapTextButton* m_buttonAddNotes; + wxButton* m_buttonOkay; + wxButton* m_buttonCancel; + + // Virtual event handlers, override them in your derived class + virtual void onClose( wxCloseEvent& event ) { event.Skip(); } + virtual void onListBoxKeyEvent( wxKeyEvent& event ) { event.Skip(); } + virtual void onSelectFolderPair( wxCommandEvent& event ) { event.Skip(); } + virtual void onToggleLocalCompSettings( wxCommandEvent& event ) { event.Skip(); } + virtual void onCompByTimeSize( wxCommandEvent& event ) { event.Skip(); } + virtual void onCompByTimeSizeDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void onCompByContent( wxCommandEvent& event ) { event.Skip(); } + virtual void onCompByContentDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void onCompBySize( wxCommandEvent& event ) { event.Skip(); } + virtual void onCompBySizeDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void onChangeCompOption( wxCommandEvent& event ) { event.Skip(); } + virtual void onToggleIgnoreErrors( wxCommandEvent& event ) { event.Skip(); } + virtual void onToggleAutoRetry( wxCommandEvent& event ) { event.Skip(); } + virtual void onChangeFilterOption( wxCommandEvent& event ) { event.Skip(); } + virtual void onFilterDefault( wxCommandEvent& event ) { event.Skip(); } + virtual void onFilterDefaultContextMouse( wxMouseEvent& event ) { event.Skip(); } + virtual void onFilterDefaultContext( wxCommandEvent& event ) { event.Skip(); } + virtual void onFilterClear( wxCommandEvent& event ) { event.Skip(); } + virtual void onToggleLocalSyncSettings( wxCommandEvent& event ) { event.Skip(); } + virtual void onSyncTwoWay( wxCommandEvent& event ) { event.Skip(); } + virtual void onSyncTwoWayDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void onSyncMirror( wxCommandEvent& event ) { event.Skip(); } + virtual void onSyncMirrorDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void onSyncUpdate( wxCommandEvent& event ) { event.Skip(); } + virtual void onSyncUpdateDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void onSyncCustom( wxCommandEvent& event ) { event.Skip(); } + virtual void onSyncCustomDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void onExLeftSideOnly( wxCommandEvent& event ) { event.Skip(); } + virtual void onLeftNewer( wxCommandEvent& event ) { event.Skip(); } + virtual void onDifferent( wxCommandEvent& event ) { event.Skip(); } + virtual void onConflict( wxCommandEvent& event ) { event.Skip(); } + virtual void onRightNewer( wxCommandEvent& event ) { event.Skip(); } + virtual void onExRightSideOnly( wxCommandEvent& event ) { event.Skip(); } + virtual void onToggleDetectMovedFiles( wxCommandEvent& event ) { event.Skip(); } + virtual void onDeletionRecycler( wxCommandEvent& event ) { event.Skip(); } + virtual void onDeletionPermanent( wxCommandEvent& event ) { event.Skip(); } + virtual void onDeletionVersioning( wxCommandEvent& event ) { event.Skip(); } + virtual void onChanegVersioningStyle( wxCommandEvent& event ) { event.Skip(); } + virtual void onToggleVersioningLimit( wxCommandEvent& event ) { event.Skip(); } + virtual void onToggleMiscEmail( wxCommandEvent& event ) { event.Skip(); } + virtual void onEmailAlways( wxCommandEvent& event ) { event.Skip(); } + virtual void onEmailErrorWarning( wxCommandEvent& event ) { event.Skip(); } + virtual void onEmailErrorOnly( wxCommandEvent& event ) { event.Skip(); } + virtual void onToggleMiscOption( wxCommandEvent& event ) { event.Skip(); } + virtual void onShowLogFolder( wxCommandEvent& event ) { event.Skip(); } + virtual void onAddNotes( wxCommandEvent& event ) { event.Skip(); } + virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } + virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } + + + public: + wxStaticBitmap* m_bitmapRetryErrors; + wxStaticText* m_staticTextFilterDescr; + wxBitmapButton* m_bpButtonSelectVersioningAltFolder; + wxBitmapButton* m_bpButtonShowLogFolder; + fff::FolderHistoryBox* m_logFolderPath; + wxBitmapButton* m_bpButtonSelectAltLogFolder; + wxChoice* m_choicePostSyncCondition; + + ConfigDlgGenerated( 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|wxMAXIMIZE_BOX|wxRESIZE_BORDER ); + + ~ConfigDlgGenerated(); }; @@ -572,117 +572,117 @@ public: /////////////////////////////////////////////////////////////////////////////// class CloudSetupDlgGenerated : public wxDialog { -private: - -protected: - wxStaticBitmap* m_bitmapCloud; - wxStaticText* m_staticText136; - wxToggleButton* m_toggleBtnGdrive; - wxToggleButton* m_toggleBtnSftp; - wxToggleButton* m_toggleBtnFtp; - wxStaticLine* m_staticline371; - wxPanel* m_panel41; - wxBoxSizer* bSizerGdrive; - wxStaticBitmap* m_bitmapGdriveUser; - wxStaticText* m_staticText166; - wxListBox* m_listBoxGdriveUsers; - zen::BitmapTextButton* m_buttonGdriveAddUser; - zen::BitmapTextButton* m_buttonGdriveRemoveUser; - wxStaticLine* m_staticline841; - wxStaticBitmap* m_bitmapGdriveDrive; - wxStaticText* m_staticText186; - wxListBox* m_listBoxGdriveDrives; - wxStaticLine* m_staticline73; - wxBoxSizer* bSizerServer; - wxStaticBitmap* m_bitmapServer; - wxStaticText* m_staticText12311; - wxTextCtrl* m_textCtrlServer; - wxStaticText* m_staticText1233; - wxTextCtrl* m_textCtrlPort; - wxStaticLine* m_staticline58; - wxBoxSizer* bSizerAuth; - wxBoxSizer* bSizerAuthInner; - wxBoxSizer* bSizerFtpEncrypt; - wxStaticText* m_staticText1251; - wxRadioButton* m_radioBtnEncryptNone; - wxRadioButton* m_radioBtnEncryptSsl; - wxStaticLine* m_staticline5721; - wxBoxSizer* bSizerSftpAuth; - wxStaticText* m_staticText125; - wxRadioButton* m_radioBtnPassword; - wxRadioButton* m_radioBtnKeyfile; - wxRadioButton* m_radioBtnAgent; - wxStaticLine* m_staticline572; - wxPanel* m_panelAuth; - wxStaticText* m_staticText123; - wxTextCtrl* m_textCtrlUserName; - wxStaticText* m_staticTextKeyfile; - wxBoxSizer* bSizerKeyFile; - wxTextCtrl* m_textCtrlKeyfilePath; - wxButton* m_buttonSelectKeyfile; - wxStaticText* m_staticTextPassword; - wxBoxSizer* bSizerPassword; - wxTextCtrl* m_textCtrlPasswordVisible; - wxTextCtrl* m_textCtrlPasswordHidden; - wxCheckBox* m_checkBoxShowPassword; - wxCheckBox* m_checkBoxPasswordPrompt; - wxStaticLine* m_staticline581; - wxStaticBitmap* m_bitmapServerDir; - wxStaticText* m_staticText1232; - wxStaticLine* m_staticline83; - wxStaticText* m_staticTextTimeout; - wxSpinCtrl* m_spinCtrlTimeout; - wxStaticLine* m_staticline82; - wxTextCtrl* m_textCtrlServerPath; - wxButton* m_buttonSelectFolder; - wxStaticLine* m_staticline571; - wxStaticBitmap* m_bitmapPerf; - wxStaticText* m_staticText1361; - wxHyperlinkCtrl* m_hyperlink171; - wxStaticLine* m_staticline57; - wxPanel* m_panel411; - wxBoxSizer* bSizerConnectionsLabel; - wxStaticText* m_staticTextConnectionsLabel; - wxStaticText* m_staticTextConnectionsLabelSub; - wxSpinCtrl* m_spinCtrlConnectionCount; - wxStaticText* m_staticTextConnectionCountDescr; - wxHyperlinkCtrl* m_hyperlinkDeRequired; - wxStaticText* m_staticTextChannelCountSftp; - wxSpinCtrl* m_spinCtrlChannelCountSftp; - wxButton* m_buttonChannelCountSftp; - wxCheckBox* m_checkBoxAllowZlib; - wxStaticText* m_staticTextZlibDescr; - wxStaticLine* m_staticline12; - wxBoxSizer* bSizerStdButtons; - wxButton* m_buttonOkay; - wxButton* m_buttonCancel; - - // Virtual event handlers, override them in your derived class - virtual void onClose( wxCloseEvent& event ) { event.Skip(); } - virtual void onConnectionGdrive( wxCommandEvent& event ) { event.Skip(); } - virtual void onConnectionSftp( wxCommandEvent& event ) { event.Skip(); } - virtual void onConnectionFtp( wxCommandEvent& event ) { event.Skip(); } - virtual void onGdriveUserSelect( wxCommandEvent& event ) { event.Skip(); } - virtual void onGdriveUserAdd( wxCommandEvent& event ) { event.Skip(); } - virtual void onGdriveUserRemove( wxCommandEvent& event ) { event.Skip(); } - virtual void onAuthPassword( wxCommandEvent& event ) { event.Skip(); } - virtual void onAuthKeyfile( wxCommandEvent& event ) { event.Skip(); } - virtual void onAuthAgent( wxCommandEvent& event ) { event.Skip(); } - virtual void onSelectKeyfile( wxCommandEvent& event ) { event.Skip(); } - virtual void onTypingPassword( wxCommandEvent& event ) { event.Skip(); } - virtual void onToggleShowPassword( wxCommandEvent& event ) { event.Skip(); } - virtual void onTogglePasswordPrompt( wxCommandEvent& event ) { event.Skip(); } - virtual void onBrowseCloudFolder( wxCommandEvent& event ) { event.Skip(); } - virtual void onDetectServerChannelLimit( wxCommandEvent& event ) { event.Skip(); } - virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } - virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } - - -public: - - CloudSetupDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Access Online Storage"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - - ~CloudSetupDlgGenerated(); + private: + + protected: + wxStaticBitmap* m_bitmapCloud; + wxStaticText* m_staticText136; + wxToggleButton* m_toggleBtnGdrive; + wxToggleButton* m_toggleBtnSftp; + wxToggleButton* m_toggleBtnFtp; + wxStaticLine* m_staticline371; + wxPanel* m_panel41; + wxBoxSizer* bSizerGdrive; + wxStaticBitmap* m_bitmapGdriveUser; + wxStaticText* m_staticText166; + wxListBox* m_listBoxGdriveUsers; + zen::BitmapTextButton* m_buttonGdriveAddUser; + zen::BitmapTextButton* m_buttonGdriveRemoveUser; + wxStaticLine* m_staticline841; + wxStaticBitmap* m_bitmapGdriveDrive; + wxStaticText* m_staticText186; + wxListBox* m_listBoxGdriveDrives; + wxStaticLine* m_staticline73; + wxBoxSizer* bSizerServer; + wxStaticBitmap* m_bitmapServer; + wxStaticText* m_staticText12311; + wxTextCtrl* m_textCtrlServer; + wxStaticText* m_staticText1233; + wxTextCtrl* m_textCtrlPort; + wxStaticLine* m_staticline58; + wxBoxSizer* bSizerAuth; + wxBoxSizer* bSizerAuthInner; + wxBoxSizer* bSizerFtpEncrypt; + wxStaticText* m_staticText1251; + wxRadioButton* m_radioBtnEncryptNone; + wxRadioButton* m_radioBtnEncryptSsl; + wxStaticLine* m_staticline5721; + wxBoxSizer* bSizerSftpAuth; + wxStaticText* m_staticText125; + wxRadioButton* m_radioBtnPassword; + wxRadioButton* m_radioBtnKeyfile; + wxRadioButton* m_radioBtnAgent; + wxStaticLine* m_staticline572; + wxPanel* m_panelAuth; + wxStaticText* m_staticText123; + wxTextCtrl* m_textCtrlUserName; + wxStaticText* m_staticTextKeyfile; + wxBoxSizer* bSizerKeyFile; + wxTextCtrl* m_textCtrlKeyfilePath; + wxButton* m_buttonSelectKeyfile; + wxStaticText* m_staticTextPassword; + wxBoxSizer* bSizerPassword; + wxTextCtrl* m_textCtrlPasswordVisible; + wxTextCtrl* m_textCtrlPasswordHidden; + wxCheckBox* m_checkBoxShowPassword; + wxCheckBox* m_checkBoxPasswordPrompt; + wxStaticLine* m_staticline581; + wxStaticBitmap* m_bitmapServerDir; + wxStaticText* m_staticText1232; + wxStaticLine* m_staticline83; + wxStaticText* m_staticTextTimeout; + wxSpinCtrl* m_spinCtrlTimeout; + wxStaticLine* m_staticline82; + wxTextCtrl* m_textCtrlServerPath; + wxButton* m_buttonSelectFolder; + wxStaticLine* m_staticline571; + wxStaticBitmap* m_bitmapPerf; + wxStaticText* m_staticText1361; + wxHyperlinkCtrl* m_hyperlink171; + wxStaticLine* m_staticline57; + wxPanel* m_panel411; + wxBoxSizer* bSizerConnectionsLabel; + wxStaticText* m_staticTextConnectionsLabel; + wxStaticText* m_staticTextConnectionsLabelSub; + wxSpinCtrl* m_spinCtrlConnectionCount; + wxStaticText* m_staticTextConnectionCountDescr; + wxHyperlinkCtrl* m_hyperlinkDeRequired; + wxStaticText* m_staticTextChannelCountSftp; + wxSpinCtrl* m_spinCtrlChannelCountSftp; + wxButton* m_buttonChannelCountSftp; + wxCheckBox* m_checkBoxAllowZlib; + wxStaticText* m_staticTextZlibDescr; + wxStaticLine* m_staticline12; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonOkay; + wxButton* m_buttonCancel; + + // Virtual event handlers, override them in your derived class + virtual void onClose( wxCloseEvent& event ) { event.Skip(); } + virtual void onConnectionGdrive( wxCommandEvent& event ) { event.Skip(); } + virtual void onConnectionSftp( wxCommandEvent& event ) { event.Skip(); } + virtual void onConnectionFtp( wxCommandEvent& event ) { event.Skip(); } + virtual void onGdriveUserSelect( wxCommandEvent& event ) { event.Skip(); } + virtual void onGdriveUserAdd( wxCommandEvent& event ) { event.Skip(); } + virtual void onGdriveUserRemove( wxCommandEvent& event ) { event.Skip(); } + virtual void onAuthPassword( wxCommandEvent& event ) { event.Skip(); } + virtual void onAuthKeyfile( wxCommandEvent& event ) { event.Skip(); } + virtual void onAuthAgent( wxCommandEvent& event ) { event.Skip(); } + virtual void onSelectKeyfile( wxCommandEvent& event ) { event.Skip(); } + virtual void onTypingPassword( wxCommandEvent& event ) { event.Skip(); } + virtual void onToggleShowPassword( wxCommandEvent& event ) { event.Skip(); } + virtual void onTogglePasswordPrompt( wxCommandEvent& event ) { event.Skip(); } + virtual void onBrowseCloudFolder( wxCommandEvent& event ) { event.Skip(); } + virtual void onDetectServerChannelLimit( wxCommandEvent& event ) { event.Skip(); } + virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } + virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } + + + public: + + CloudSetupDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Access Online Storage"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + + ~CloudSetupDlgGenerated(); }; @@ -691,29 +691,29 @@ public: /////////////////////////////////////////////////////////////////////////////// class AbstractFolderPickerGenerated : public wxDialog { -private: + private: -protected: - wxPanel* m_panel41; - wxStaticText* m_staticTextStatus; - wxTreeCtrl* m_treeCtrlFileSystem; - wxStaticLine* m_staticline12; - wxBoxSizer* bSizerStdButtons; - wxButton* m_buttonOkay; - wxButton* m_buttonCancel; + protected: + wxPanel* m_panel41; + wxStaticText* m_staticTextStatus; + wxTreeCtrl* m_treeCtrlFileSystem; + wxStaticLine* m_staticline12; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonOkay; + wxButton* m_buttonCancel; - // Virtual event handlers, override them in your derived class - virtual void onClose( wxCloseEvent& event ) { event.Skip(); } - virtual void onExpandNode( wxTreeEvent& event ) { event.Skip(); } - virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } - virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } + // Virtual event handlers, override them in your derived class + virtual void onClose( wxCloseEvent& event ) { event.Skip(); } + virtual void onExpandNode( wxTreeEvent& event ) { event.Skip(); } + virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } + virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } -public: + public: - AbstractFolderPickerGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Select a folder"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER ); + AbstractFolderPickerGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Select a folder"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER ); - ~AbstractFolderPickerGenerated(); + ~AbstractFolderPickerGenerated(); }; @@ -722,51 +722,51 @@ public: /////////////////////////////////////////////////////////////////////////////// class SyncConfirmationDlgGenerated : public wxDialog { -private: - -protected: - wxStaticBitmap* m_bitmapSync; - wxStaticText* m_staticTextCaption; - wxStaticLine* m_staticline371; - wxPanel* m_panelStatistics; - wxStaticLine* m_staticline38; - wxStaticText* m_staticText84; - wxStaticText* m_staticTextSyncVar; - wxStaticBitmap* m_bitmapSyncVar; - wxStaticLine* m_staticline14; - wxStaticText* m_staticText83; - wxStaticBitmap* m_bitmapDeleteLeft; - wxStaticBitmap* m_bitmapUpdateLeft; - wxStaticBitmap* m_bitmapCreateLeft; - wxStaticBitmap* m_bitmapData; - wxStaticBitmap* m_bitmapCreateRight; - wxStaticBitmap* m_bitmapUpdateRight; - wxStaticBitmap* m_bitmapDeleteRight; - wxStaticText* m_staticTextDeleteLeft; - wxStaticText* m_staticTextUpdateLeft; - wxStaticText* m_staticTextCreateLeft; - wxStaticText* m_staticTextData; - wxStaticText* m_staticTextCreateRight; - wxStaticText* m_staticTextUpdateRight; - wxStaticText* m_staticTextDeleteRight; - wxStaticLine* m_staticline381; - wxStaticLine* m_staticline12; - wxCheckBox* m_checkBoxDontShowAgain; - wxBoxSizer* bSizerStdButtons; - wxButton* m_buttonStartSync; - wxButton* m_buttonCancel; - - // Virtual event handlers, override them in your derived class - virtual void onClose( wxCloseEvent& event ) { event.Skip(); } - virtual void onStartSync( wxCommandEvent& event ) { event.Skip(); } - virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } - - -public: - - SyncConfirmationDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - - ~SyncConfirmationDlgGenerated(); + private: + + protected: + wxStaticBitmap* m_bitmapSync; + wxStaticText* m_staticTextCaption; + wxStaticLine* m_staticline371; + wxPanel* m_panelStatistics; + wxStaticLine* m_staticline38; + wxStaticText* m_staticText84; + wxStaticText* m_staticTextSyncVar; + wxStaticBitmap* m_bitmapSyncVar; + wxStaticLine* m_staticline14; + wxStaticText* m_staticText83; + wxStaticBitmap* m_bitmapDeleteLeft; + wxStaticBitmap* m_bitmapUpdateLeft; + wxStaticBitmap* m_bitmapCreateLeft; + wxStaticBitmap* m_bitmapData; + wxStaticBitmap* m_bitmapCreateRight; + wxStaticBitmap* m_bitmapUpdateRight; + wxStaticBitmap* m_bitmapDeleteRight; + wxStaticText* m_staticTextDeleteLeft; + wxStaticText* m_staticTextUpdateLeft; + wxStaticText* m_staticTextCreateLeft; + wxStaticText* m_staticTextData; + wxStaticText* m_staticTextCreateRight; + wxStaticText* m_staticTextUpdateRight; + wxStaticText* m_staticTextDeleteRight; + wxStaticLine* m_staticline381; + wxStaticLine* m_staticline12; + wxCheckBox* m_checkBoxDontShowAgain; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonStartSync; + wxButton* m_buttonCancel; + + // Virtual event handlers, override them in your derived class + virtual void onClose( wxCloseEvent& event ) { event.Skip(); } + virtual void onStartSync( wxCommandEvent& event ) { event.Skip(); } + virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } + + + public: + + SyncConfirmationDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + + ~SyncConfirmationDlgGenerated(); }; @@ -775,51 +775,51 @@ public: /////////////////////////////////////////////////////////////////////////////// class CompareProgressDlgGenerated : public wxPanel { -private: - -protected: - wxStaticText* m_staticTextStatus; - wxFlexGridSizer* ffgSizer11; - wxFlexGridSizer* ffgSizer111; - wxFlexGridSizer* ffgSizer112; - wxFlexGridSizer* ffgSizer114; - wxFlexGridSizer* ffgSizer1121; - wxFlexGridSizer* ffgSizer1141; - wxStaticText* m_staticText1461; - wxStaticText* m_staticTextRetryCount; - wxStaticText* m_staticText146; - wxBoxSizer* bSizerProgressGraph; - wxFlexGridSizer* ffgSizer113; - zen::Graph2D* m_panelProgressGraph; - -public: - wxStaticText* m_staticTextProcessed; - wxStaticText* m_staticTextRemaining; - wxPanel* m_panelItemStats; - wxStaticBitmap* m_bitmapItemStat; - wxStaticText* m_staticTextItemsProcessed; - wxStaticText* m_staticTextBytesProcessed; - wxStaticText* m_staticTextItemsRemaining; - wxStaticText* m_staticTextBytesRemaining; - wxPanel* m_panelTimeStats; - wxStaticBitmap* m_bitmapTimeStat; - wxStaticText* m_staticTextTimeElapsed; - wxStaticText* m_staticTextTimeRemaining; - wxStaticText* m_staticTextErrors; - wxStaticText* m_staticTextWarnings; - wxPanel* m_panelErrorStats; - wxStaticBitmap* m_bitmapErrors; - wxStaticText* m_staticTextErrorCount; - wxStaticBitmap* m_bitmapWarnings; - wxStaticText* m_staticTextWarningCount; - wxBoxSizer* bSizerErrorsRetry; - wxStaticBitmap* m_bitmapRetryErrors; - wxBoxSizer* bSizerErrorsIgnore; - wxStaticBitmap* m_bitmapIgnoreErrors; - - CompareProgressDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxBORDER_RAISED, const wxString& name = wxEmptyString ); - - ~CompareProgressDlgGenerated(); + private: + + protected: + wxStaticText* m_staticTextStatus; + wxFlexGridSizer* ffgSizer11; + wxFlexGridSizer* ffgSizer111; + wxFlexGridSizer* ffgSizer112; + wxFlexGridSizer* ffgSizer114; + wxFlexGridSizer* ffgSizer1121; + wxFlexGridSizer* ffgSizer1141; + wxStaticText* m_staticText1461; + wxStaticText* m_staticTextRetryCount; + wxStaticText* m_staticText146; + wxBoxSizer* bSizerProgressGraph; + wxFlexGridSizer* ffgSizer113; + zen::Graph2D* m_panelProgressGraph; + + public: + wxStaticText* m_staticTextProcessed; + wxStaticText* m_staticTextRemaining; + wxPanel* m_panelItemStats; + wxStaticBitmap* m_bitmapItemStat; + wxStaticText* m_staticTextItemsProcessed; + wxStaticText* m_staticTextBytesProcessed; + wxStaticText* m_staticTextItemsRemaining; + wxStaticText* m_staticTextBytesRemaining; + wxPanel* m_panelTimeStats; + wxStaticBitmap* m_bitmapTimeStat; + wxStaticText* m_staticTextTimeElapsed; + wxStaticText* m_staticTextTimeRemaining; + wxStaticText* m_staticTextErrors; + wxStaticText* m_staticTextWarnings; + wxPanel* m_panelErrorStats; + wxStaticBitmap* m_bitmapErrors; + wxStaticText* m_staticTextErrorCount; + wxStaticBitmap* m_bitmapWarnings; + wxStaticText* m_staticTextWarningCount; + wxBoxSizer* bSizerErrorsRetry; + wxStaticBitmap* m_bitmapRetryErrors; + wxBoxSizer* bSizerErrorsIgnore; + wxStaticBitmap* m_bitmapIgnoreErrors; + + CompareProgressDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxBORDER_RAISED, const wxString& name = wxEmptyString ); + + ~CompareProgressDlgGenerated(); }; @@ -828,70 +828,71 @@ public: /////////////////////////////////////////////////////////////////////////////// class SyncProgressPanelGenerated : public wxPanel { -private: - -protected: - wxPanel* m_panel53; - wxBoxSizer* bSizer42; - wxFlexGridSizer* ffgSizer11; - wxFlexGridSizer* ffgSizer111; - wxFlexGridSizer* ffgSizer112; - wxFlexGridSizer* ffgSizer114; - wxFlexGridSizer* ffgSizer1121; - wxStaticText* m_staticText1461; - wxStaticText* m_staticText146; - wxStaticText* m_staticText137; - -public: - wxBoxSizer* bSizerRoot; - wxStaticBitmap* m_bitmapStatus; - wxStaticText* m_staticTextPhase; - wxBitmapButton* m_bpButtonMinimizeToTray; - wxBoxSizer* bSizerStatusText; - wxStaticText* m_staticTextStatus; - wxPanel* m_panelProgress; - zen::Graph2D* m_panelGraphBytes; - wxStaticBitmap* m_bitmapGraphKeyBytes; - wxStaticBitmap* m_bitmapGraphKeyItems; - wxStaticText* m_staticTextProcessed; - wxStaticText* m_staticTextRemaining; - wxPanel* m_panelItemStats; - wxStaticBitmap* m_bitmapItemStat; - wxStaticText* m_staticTextItemsProcessed; - wxStaticText* m_staticTextBytesProcessed; - wxStaticText* m_staticTextItemsRemaining; - wxStaticText* m_staticTextBytesRemaining; - wxPanel* m_panelTimeStats; - wxStaticBitmap* m_bitmapTimeStat; - wxStaticText* m_staticTextTimeElapsed; - wxStaticText* m_staticTextTimeRemaining; - wxStaticText* m_staticTextErrors; - wxStaticText* m_staticTextWarnings; - wxPanel* m_panelErrorStats; - wxStaticBitmap* m_bitmapErrors; - wxStaticText* m_staticTextErrorCount; - wxStaticBitmap* m_bitmapWarnings; - wxStaticText* m_staticTextWarningCount; - wxBoxSizer* bSizerDynSpace; - zen::Graph2D* m_panelGraphItems; - wxBoxSizer* bSizerProgressFooter; - wxBoxSizer* bSizerErrorsRetry; - wxStaticBitmap* m_bitmapRetryErrors; - wxStaticText* m_staticTextRetryCount; - wxBoxSizer* bSizerErrorsIgnore; - wxStaticBitmap* m_bitmapIgnoreErrors; - wxChoice* m_choicePostSyncAction; - wxNotebook* m_notebookResult; - wxStaticLine* m_staticlineFooter; - wxBoxSizer* bSizerStdButtons; - wxCheckBox* m_checkBoxAutoClose; - wxButton* m_buttonClose; - wxButton* m_buttonPause; - wxButton* m_buttonStop; - - SyncProgressPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxTAB_TRAVERSAL, const wxString& name = wxEmptyString ); - - ~SyncProgressPanelGenerated(); + private: + + protected: + wxPanel* m_panel53; + wxBoxSizer* bSizer42; + wxFlexGridSizer* ffgSizer11; + wxFlexGridSizer* ffgSizer111; + wxFlexGridSizer* ffgSizer112; + wxFlexGridSizer* ffgSizer114; + wxFlexGridSizer* ffgSizer1121; + wxStaticText* m_staticText1461; + wxStaticText* m_staticText146; + wxStaticText* m_staticText137; + + public: + wxBoxSizer* bSizerRoot; + wxStaticBitmap* m_bitmapStatus; + wxStaticText* m_staticTextPhase; + wxStaticText* m_staticTextPercentTotal; + wxBitmapButton* m_bpButtonMinimizeToTray; + wxBoxSizer* bSizerStatusText; + wxStaticText* m_staticTextStatus; + wxPanel* m_panelProgress; + zen::Graph2D* m_panelGraphBytes; + wxStaticBitmap* m_bitmapGraphKeyBytes; + wxStaticBitmap* m_bitmapGraphKeyItems; + wxStaticText* m_staticTextProcessed; + wxStaticText* m_staticTextRemaining; + wxPanel* m_panelItemStats; + wxStaticBitmap* m_bitmapItemStat; + wxStaticText* m_staticTextItemsProcessed; + wxStaticText* m_staticTextBytesProcessed; + wxStaticText* m_staticTextItemsRemaining; + wxStaticText* m_staticTextBytesRemaining; + wxPanel* m_panelTimeStats; + wxStaticBitmap* m_bitmapTimeStat; + wxStaticText* m_staticTextTimeElapsed; + wxStaticText* m_staticTextTimeRemaining; + wxStaticText* m_staticTextErrors; + wxStaticText* m_staticTextWarnings; + wxPanel* m_panelErrorStats; + wxStaticBitmap* m_bitmapErrors; + wxStaticText* m_staticTextErrorCount; + wxStaticBitmap* m_bitmapWarnings; + wxStaticText* m_staticTextWarningCount; + wxBoxSizer* bSizerDynSpace; + zen::Graph2D* m_panelGraphItems; + wxBoxSizer* bSizerProgressFooter; + wxBoxSizer* bSizerErrorsRetry; + wxStaticBitmap* m_bitmapRetryErrors; + wxStaticText* m_staticTextRetryCount; + wxBoxSizer* bSizerErrorsIgnore; + wxStaticBitmap* m_bitmapIgnoreErrors; + wxChoice* m_choicePostSyncAction; + wxNotebook* m_notebookResult; + wxStaticLine* m_staticlineFooter; + wxBoxSizer* bSizerStdButtons; + wxCheckBox* m_checkBoxAutoClose; + wxButton* m_buttonClose; + wxButton* m_buttonPause; + wxButton* m_buttonStop; + + SyncProgressPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL, const wxString& name = wxEmptyString ); + + ~SyncProgressPanelGenerated(); }; @@ -900,26 +901,26 @@ public: /////////////////////////////////////////////////////////////////////////////// class LogPanelGenerated : public wxPanel { -private: + private: -protected: - zen::ToggleButton* m_bpButtonErrors; - zen::ToggleButton* m_bpButtonWarnings; - zen::ToggleButton* m_bpButtonInfo; - wxStaticLine* m_staticline13; + protected: + zen::ToggleButton* m_bpButtonErrors; + zen::ToggleButton* m_bpButtonWarnings; + zen::ToggleButton* m_bpButtonInfo; + wxStaticLine* m_staticline13; - // Virtual event handlers, override them in your derived class - virtual void onErrors( wxCommandEvent& event ) { event.Skip(); } - virtual void onWarnings( wxCommandEvent& event ) { event.Skip(); } - virtual void onInfo( wxCommandEvent& event ) { event.Skip(); } + // Virtual event handlers, override them in your derived class + virtual void onErrors( wxCommandEvent& event ) { event.Skip(); } + virtual void onWarnings( wxCommandEvent& event ) { event.Skip(); } + virtual void onInfo( wxCommandEvent& event ) { event.Skip(); } -public: - zen::Grid* m_gridMessages; + public: + zen::Grid* m_gridMessages; - LogPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL, const wxString& name = wxEmptyString ); + LogPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL, const wxString& name = wxEmptyString ); - ~LogPanelGenerated(); + ~LogPanelGenerated(); }; @@ -928,47 +929,47 @@ public: /////////////////////////////////////////////////////////////////////////////// class BatchDlgGenerated : public wxDialog { -private: - -protected: - wxStaticBitmap* m_bitmapBatchJob; - wxStaticText* m_staticTextHeader; - wxStaticLine* m_staticline18; - wxPanel* m_panel35; - wxStaticText* m_staticText146; - wxFlexGridSizer* ffgSizer11; - wxStaticBitmap* m_bitmapMinimizeToTray; - wxCheckBox* m_checkBoxRunMinimized; - wxStaticLine* m_staticline26; - wxStaticBitmap* m_bitmapIgnoreErrors; - wxCheckBox* m_checkBoxIgnoreErrors; - wxRadioButton* m_radioBtnErrorDialogShow; - wxRadioButton* m_radioBtnErrorDialogCancel; - wxStaticLine* m_staticline261; - wxStaticText* m_staticText137; - wxStaticLine* m_staticline262; - wxStaticLine* m_staticline25; - wxHyperlinkCtrl* m_hyperlink17; - wxStaticLine* m_staticline13; - wxBoxSizer* bSizerStdButtons; - wxButton* m_buttonSaveAs; - wxButton* m_buttonCancel; - - // Virtual event handlers, override them in your derived class - virtual void onClose( wxCloseEvent& event ) { event.Skip(); } - virtual void onToggleRunMinimized( wxCommandEvent& event ) { event.Skip(); } - virtual void onToggleIgnoreErrors( wxCommandEvent& event ) { event.Skip(); } - virtual void onSaveBatchJob( wxCommandEvent& event ) { event.Skip(); } - virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } - - -public: - wxCheckBox* m_checkBoxAutoClose; - wxChoice* m_choicePostSyncAction; - - BatchDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Save as a Batch Job"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - - ~BatchDlgGenerated(); + private: + + protected: + wxStaticBitmap* m_bitmapBatchJob; + wxStaticText* m_staticTextHeader; + wxStaticLine* m_staticline18; + wxPanel* m_panel35; + wxStaticText* m_staticText146; + wxFlexGridSizer* ffgSizer11; + wxStaticBitmap* m_bitmapMinimizeToTray; + wxCheckBox* m_checkBoxRunMinimized; + wxStaticLine* m_staticline26; + wxStaticBitmap* m_bitmapIgnoreErrors; + wxCheckBox* m_checkBoxIgnoreErrors; + wxRadioButton* m_radioBtnErrorDialogShow; + wxRadioButton* m_radioBtnErrorDialogCancel; + wxStaticLine* m_staticline261; + wxStaticText* m_staticText137; + wxStaticLine* m_staticline262; + wxStaticLine* m_staticline25; + wxHyperlinkCtrl* m_hyperlink17; + wxStaticLine* m_staticline13; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonSaveAs; + wxButton* m_buttonCancel; + + // Virtual event handlers, override them in your derived class + virtual void onClose( wxCloseEvent& event ) { event.Skip(); } + virtual void onToggleRunMinimized( wxCommandEvent& event ) { event.Skip(); } + virtual void onToggleIgnoreErrors( wxCommandEvent& event ) { event.Skip(); } + virtual void onSaveBatchJob( wxCommandEvent& event ) { event.Skip(); } + virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } + + + public: + wxCheckBox* m_checkBoxAutoClose; + wxChoice* m_choicePostSyncAction; + + BatchDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Save as a Batch Job"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + + ~BatchDlgGenerated(); }; @@ -977,33 +978,33 @@ public: /////////////////////////////////////////////////////////////////////////////// class DeleteDlgGenerated : public wxDialog { -private: + private: -protected: - wxStaticBitmap* m_bitmapDeleteType; - wxStaticText* m_staticTextHeader; - wxStaticLine* m_staticline91; - wxPanel* m_panel31; - wxStaticLine* m_staticline42; - wxTextCtrl* m_textCtrlFileList; - wxStaticLine* m_staticline9; - wxBoxSizer* bSizerStdButtons; - wxCheckBox* m_checkBoxUseRecycler; - wxButton* m_buttonOK; - wxButton* m_buttonCancel; + protected: + wxStaticBitmap* m_bitmapDeleteType; + wxStaticText* m_staticTextHeader; + wxStaticLine* m_staticline91; + wxPanel* m_panel31; + wxStaticLine* m_staticline42; + wxTextCtrl* m_textCtrlFileList; + wxStaticLine* m_staticline9; + wxBoxSizer* bSizerStdButtons; + wxCheckBox* m_checkBoxUseRecycler; + wxButton* m_buttonOK; + wxButton* m_buttonCancel; - // Virtual event handlers, override them in your derived class - virtual void onClose( wxCloseEvent& event ) { event.Skip(); } - virtual void onUseRecycler( wxCommandEvent& event ) { event.Skip(); } - virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } - virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } + // Virtual event handlers, override them in your derived class + virtual void onClose( wxCloseEvent& event ) { event.Skip(); } + virtual void onUseRecycler( wxCommandEvent& event ) { event.Skip(); } + virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } + virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } -public: + public: - DeleteDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Delete Items"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER ); + DeleteDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Delete Items"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER ); - ~DeleteDlgGenerated(); + ~DeleteDlgGenerated(); }; @@ -1012,36 +1013,70 @@ public: /////////////////////////////////////////////////////////////////////////////// class CopyToDlgGenerated : public wxDialog { -private: + private: -protected: - wxStaticBitmap* m_bitmapCopyTo; - wxStaticText* m_staticTextHeader; - wxStaticLine* m_staticline91; - wxPanel* m_panel31; - wxStaticLine* m_staticline42; - wxTextCtrl* m_textCtrlFileList; - wxButton* m_buttonSelectTargetFolder; - wxStaticLine* m_staticline9; - wxBoxSizer* bSizerStdButtons; - wxCheckBox* m_checkBoxKeepRelPath; - wxCheckBox* m_checkBoxOverwriteIfExists; - wxButton* m_buttonOK; - wxButton* m_buttonCancel; + protected: + wxStaticBitmap* m_bitmapCopyTo; + wxStaticText* m_staticTextHeader; + wxStaticLine* m_staticline91; + wxPanel* m_panel31; + wxStaticLine* m_staticline42; + wxTextCtrl* m_textCtrlFileList; + wxButton* m_buttonSelectTargetFolder; + wxStaticLine* m_staticline9; + wxBoxSizer* bSizerStdButtons; + wxCheckBox* m_checkBoxKeepRelPath; + wxCheckBox* m_checkBoxOverwriteIfExists; + wxButton* m_buttonOK; + wxButton* m_buttonCancel; - // Virtual event handlers, override them in your derived class - virtual void onClose( wxCloseEvent& event ) { event.Skip(); } - virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } - virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } + // Virtual event handlers, override them in your derived class + virtual void onClose( wxCloseEvent& event ) { event.Skip(); } + virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } + virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } -public: - fff::FolderHistoryBox* m_targetFolderPath; - wxBitmapButton* m_bpButtonSelectAltTargetFolder; + public: + fff::FolderHistoryBox* m_targetFolderPath; + wxBitmapButton* m_bpButtonSelectAltTargetFolder; - CopyToDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Copy Items"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER ); + CopyToDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Copy Items"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER ); - ~CopyToDlgGenerated(); + ~CopyToDlgGenerated(); + +}; + +/////////////////////////////////////////////////////////////////////////////// +/// Class RenameDlgGenerated +/////////////////////////////////////////////////////////////////////////////// +class RenameDlgGenerated : public wxDialog +{ + private: + + protected: + wxStaticBitmap* m_bitmapRename; + wxStaticText* m_staticTextHeader; + wxStaticLine* m_staticline91; + wxPanel* m_panel31; + zen::Grid* m_gridRenamePreview; + wxTextCtrl* m_textCtrlNewName; + wxStaticLine* m_staticline9; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonOK; + wxButton* m_buttonCancel; + + // Virtual event handlers, override them in your derived class + virtual void onClose( wxCloseEvent& event ) { event.Skip(); } + virtual void onTypingName( wxCommandEvent& event ) { event.Skip(); } + virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } + virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } + + + public: + + RenameDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Rename Items"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER ); + + ~RenameDlgGenerated(); }; @@ -1050,115 +1085,115 @@ public: /////////////////////////////////////////////////////////////////////////////// class OptionsDlgGenerated : public wxDialog { -private: - -protected: - wxStaticBitmap* m_bitmapSettings; - wxStaticText* m_staticText44; - wxStaticLine* m_staticline20; - wxPanel* m_panel39; - wxCheckBox* m_checkBoxFailSafe; - wxStaticText* m_staticText911; - wxStaticText* m_staticText91; - wxStaticText* m_staticText9111; - wxBoxSizer* bSizerLockedFiles; - wxCheckBox* m_checkBoxCopyLocked; - wxStaticText* m_staticText921; - wxStaticText* m_staticText92; - wxStaticText* m_staticText922; - wxCheckBox* m_checkBoxCopyPermissions; - wxStaticText* m_staticText931; - wxStaticText* m_staticText93; - wxStaticText* m_staticText932; - wxStaticLine* m_staticline39; - wxStaticLine* m_staticline191; - wxStaticBitmap* m_bitmapWarnings; - wxStaticText* m_staticText182; - wxStaticText* m_staticTextHiddenDialogsCount; - wxButton* m_buttonShowHiddenDialogs; - wxCheckListBox* m_checkListHiddenDialogs; - wxStaticLine* m_staticline1911; - wxStaticBitmap* m_bitmapLogFile; - wxStaticText* m_staticText163; - wxPanel* m_panelLogfile; - wxButton* m_buttonSelectLogFolder; - wxCheckBox* m_checkBoxLogFilesMaxAge; - wxSpinCtrl* m_spinCtrlLogFilesMaxAge; - wxStaticLine* m_staticline81; - wxStaticText* m_staticText184; - wxRadioButton* m_radioBtnLogHtml; - wxRadioButton* m_radioBtnLogText; - wxStaticLine* m_staticline361; - wxStaticBitmap* m_bitmapNotificationSounds; - wxStaticText* m_staticText851; - wxFlexGridSizer* ffgSizer11; - wxStaticText* m_staticText171; - wxStaticBitmap* m_bitmapCompareDone; - wxBitmapButton* m_bpButtonPlayCompareDone; - wxTextCtrl* m_textCtrlSoundPathCompareDone; - wxButton* m_buttonSelectSoundCompareDone; - wxStaticText* m_staticText1711; - wxStaticBitmap* m_bitmapSyncDone; - wxBitmapButton* m_bpButtonPlaySyncDone; - wxTextCtrl* m_textCtrlSoundPathSyncDone; - wxButton* m_buttonSelectSoundSyncDone; - wxStaticText* m_staticText17111; - wxStaticBitmap* m_bitmapAlertPending; - wxBitmapButton* m_bpButtonPlayAlertPending; - wxTextCtrl* m_textCtrlSoundPathAlertPending; - wxButton* m_buttonSelectSoundAlertPending; - wxStaticLine* m_staticline3611; - wxStaticBitmap* m_bitmapConsole; - wxStaticText* m_staticText85; - wxButton* m_buttonShowCtxCustomize; - wxBoxSizer* bSizerContextCustomize; - wxBitmapButton* m_bpButtonAddRow; - wxBitmapButton* m_bpButtonRemoveRow; - wxStaticText* m_staticText174; - wxStaticText* m_staticText175; - wxStaticText* m_staticText178; - wxStaticText* m_staticText179; - wxStaticText* m_staticText189; - wxStaticText* m_staticText190; - wxStaticText* m_staticText176; - wxStaticText* m_staticText177; - wxHyperlinkCtrl* m_hyperlink17; - wxGrid* m_gridCustomCommand; - wxStaticLine* m_staticline36; - wxBoxSizer* bSizerStdButtons; - wxButton* m_buttonDefault; - wxButton* m_buttonOkay; - wxButton* m_buttonCancel; - - // Virtual event handlers, override them in your derived class - virtual void onClose( wxCloseEvent& event ) { event.Skip(); } - virtual void onShowHiddenDialogs( wxCommandEvent& event ) { event.Skip(); } - virtual void onToggleHiddenDialog( wxCommandEvent& event ) { event.Skip(); } - virtual void onShowLogFolder( wxCommandEvent& event ) { event.Skip(); } - virtual void onToggleLogfilesLimit( wxCommandEvent& event ) { event.Skip(); } - virtual void onPlayCompareDone( wxCommandEvent& event ) { event.Skip(); } - virtual void onChangeSoundFilePath( wxCommandEvent& event ) { event.Skip(); } - virtual void onSelectSoundCompareDone( wxCommandEvent& event ) { event.Skip(); } - virtual void onPlaySyncDone( wxCommandEvent& event ) { event.Skip(); } - virtual void onSelectSoundSyncDone( wxCommandEvent& event ) { event.Skip(); } - virtual void onPlayAlertPending( wxCommandEvent& event ) { event.Skip(); } - virtual void onSelectSoundAlertPending( wxCommandEvent& event ) { event.Skip(); } - virtual void onShowContextCustomize( wxCommandEvent& event ) { event.Skip(); } - virtual void onAddRow( wxCommandEvent& event ) { event.Skip(); } - virtual void onRemoveRow( wxCommandEvent& event ) { event.Skip(); } - virtual void onDefault( wxCommandEvent& event ) { event.Skip(); } - virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } - virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } - - -public: - wxBitmapButton* m_bpButtonShowLogFolder; - fff::FolderHistoryBox* m_logFolderPath; - wxBitmapButton* m_bpButtonSelectAltLogFolder; - - OptionsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Options"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - - ~OptionsDlgGenerated(); + private: + + protected: + wxStaticBitmap* m_bitmapSettings; + wxStaticText* m_staticText44; + wxStaticLine* m_staticline20; + wxPanel* m_panel39; + wxCheckBox* m_checkBoxFailSafe; + wxStaticText* m_staticText911; + wxStaticText* m_staticText91; + wxStaticText* m_staticText9111; + wxBoxSizer* bSizerLockedFiles; + wxCheckBox* m_checkBoxCopyLocked; + wxStaticText* m_staticText921; + wxStaticText* m_staticText92; + wxStaticText* m_staticText922; + wxCheckBox* m_checkBoxCopyPermissions; + wxStaticText* m_staticText931; + wxStaticText* m_staticText93; + wxStaticText* m_staticText932; + wxStaticLine* m_staticline39; + wxStaticLine* m_staticline191; + wxStaticBitmap* m_bitmapWarnings; + wxStaticText* m_staticText182; + wxStaticText* m_staticTextHiddenDialogsCount; + wxButton* m_buttonShowHiddenDialogs; + wxCheckListBox* m_checkListHiddenDialogs; + wxStaticLine* m_staticline1911; + wxStaticBitmap* m_bitmapLogFile; + wxStaticText* m_staticText163; + wxPanel* m_panelLogfile; + wxButton* m_buttonSelectLogFolder; + wxCheckBox* m_checkBoxLogFilesMaxAge; + wxSpinCtrl* m_spinCtrlLogFilesMaxAge; + wxStaticLine* m_staticline81; + wxStaticText* m_staticText184; + wxRadioButton* m_radioBtnLogHtml; + wxRadioButton* m_radioBtnLogText; + wxStaticLine* m_staticline361; + wxStaticBitmap* m_bitmapNotificationSounds; + wxStaticText* m_staticText851; + wxFlexGridSizer* ffgSizer11; + wxStaticText* m_staticText171; + wxStaticBitmap* m_bitmapCompareDone; + wxBitmapButton* m_bpButtonPlayCompareDone; + wxTextCtrl* m_textCtrlSoundPathCompareDone; + wxButton* m_buttonSelectSoundCompareDone; + wxStaticText* m_staticText1711; + wxStaticBitmap* m_bitmapSyncDone; + wxBitmapButton* m_bpButtonPlaySyncDone; + wxTextCtrl* m_textCtrlSoundPathSyncDone; + wxButton* m_buttonSelectSoundSyncDone; + wxStaticText* m_staticText17111; + wxStaticBitmap* m_bitmapAlertPending; + wxBitmapButton* m_bpButtonPlayAlertPending; + wxTextCtrl* m_textCtrlSoundPathAlertPending; + wxButton* m_buttonSelectSoundAlertPending; + wxStaticLine* m_staticline3611; + wxStaticBitmap* m_bitmapConsole; + wxStaticText* m_staticText85; + wxButton* m_buttonShowCtxCustomize; + wxBoxSizer* bSizerContextCustomize; + wxBitmapButton* m_bpButtonAddRow; + wxBitmapButton* m_bpButtonRemoveRow; + wxStaticText* m_staticText174; + wxStaticText* m_staticText175; + wxStaticText* m_staticText178; + wxStaticText* m_staticText179; + wxStaticText* m_staticText189; + wxStaticText* m_staticText190; + wxStaticText* m_staticText176; + wxStaticText* m_staticText177; + wxHyperlinkCtrl* m_hyperlink17; + wxGrid* m_gridCustomCommand; + wxStaticLine* m_staticline36; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonDefault; + wxButton* m_buttonOkay; + wxButton* m_buttonCancel; + + // Virtual event handlers, override them in your derived class + virtual void onClose( wxCloseEvent& event ) { event.Skip(); } + virtual void onShowHiddenDialogs( wxCommandEvent& event ) { event.Skip(); } + virtual void onToggleHiddenDialog( wxCommandEvent& event ) { event.Skip(); } + virtual void onShowLogFolder( wxCommandEvent& event ) { event.Skip(); } + virtual void onToggleLogfilesLimit( wxCommandEvent& event ) { event.Skip(); } + virtual void onPlayCompareDone( wxCommandEvent& event ) { event.Skip(); } + virtual void onChangeSoundFilePath( wxCommandEvent& event ) { event.Skip(); } + virtual void onSelectSoundCompareDone( wxCommandEvent& event ) { event.Skip(); } + virtual void onPlaySyncDone( wxCommandEvent& event ) { event.Skip(); } + virtual void onSelectSoundSyncDone( wxCommandEvent& event ) { event.Skip(); } + virtual void onPlayAlertPending( wxCommandEvent& event ) { event.Skip(); } + virtual void onSelectSoundAlertPending( wxCommandEvent& event ) { event.Skip(); } + virtual void onShowContextCustomize( wxCommandEvent& event ) { event.Skip(); } + virtual void onAddRow( wxCommandEvent& event ) { event.Skip(); } + virtual void onRemoveRow( wxCommandEvent& event ) { event.Skip(); } + virtual void onDefault( wxCommandEvent& event ) { event.Skip(); } + virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } + virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } + + + public: + wxBitmapButton* m_bpButtonShowLogFolder; + fff::FolderHistoryBox* m_logFolderPath; + wxBitmapButton* m_bpButtonSelectAltLogFolder; + + OptionsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Options"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + + ~OptionsDlgGenerated(); }; @@ -1167,30 +1202,30 @@ public: /////////////////////////////////////////////////////////////////////////////// class SelectTimespanDlgGenerated : public wxDialog { -private: + private: -protected: - wxPanel* m_panel35; - wxCalendarCtrl* m_calendarFrom; - wxCalendarCtrl* m_calendarTo; - wxStaticLine* m_staticline21; - wxBoxSizer* bSizerStdButtons; - wxButton* m_buttonOkay; - wxButton* m_buttonCancel; + protected: + wxPanel* m_panel35; + wxCalendarCtrl* m_calendarFrom; + wxCalendarCtrl* m_calendarTo; + wxStaticLine* m_staticline21; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonOkay; + wxButton* m_buttonCancel; - // Virtual event handlers, override them in your derived class - virtual void onClose( wxCloseEvent& event ) { event.Skip(); } - virtual void onChangeSelectionFrom( wxCalendarEvent& event ) { event.Skip(); } - virtual void onChangeSelectionTo( wxCalendarEvent& event ) { event.Skip(); } - virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } - virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } + // Virtual event handlers, override them in your derived class + virtual void onClose( wxCloseEvent& event ) { event.Skip(); } + virtual void onChangeSelectionFrom( wxCalendarEvent& event ) { event.Skip(); } + virtual void onChangeSelectionTo( wxCalendarEvent& event ) { event.Skip(); } + virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } + virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } -public: + public: - SelectTimespanDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Select Time Span"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + SelectTimespanDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Select Time Span"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - ~SelectTimespanDlgGenerated(); + ~SelectTimespanDlgGenerated(); }; @@ -1199,54 +1234,54 @@ public: /////////////////////////////////////////////////////////////////////////////// class AboutDlgGenerated : public wxDialog { -private: - -protected: - wxPanel* m_panel41; - wxStaticBitmap* m_bitmapLogoLeft; - wxStaticLine* m_staticline81; - wxBoxSizer* bSizerMainSection; - wxStaticLine* m_staticline82; - wxStaticBitmap* m_bitmapLogo; - wxStaticLine* m_staticline341; - wxStaticText* m_staticFfsTextVersion; - wxStaticText* m_staticTextFfsVariant; - wxStaticLine* m_staticline3411; - wxBoxSizer* bSizerDonate; - wxPanel* m_panelDonate; - wxStaticBitmap* m_bitmapAnimalSmall; - wxPanel* m_panel39; - wxStaticText* m_staticTextDonate; - zen::BitmapTextButton* m_buttonDonate1; - wxStaticBitmap* m_bitmapAnimalBig; - wxStaticLine* m_staticline3412; - wxStaticText* m_staticText94; - wxBitmapButton* m_bpButtonForum; - wxBitmapButton* m_bpButtonEmail; - wxStaticLine* m_staticline37; - wxStaticText* m_staticTextThanksForLoc; - wxScrolledWindow* m_scrolledWindowTranslators; - wxFlexGridSizer* fgSizerTranslators; - wxStaticLine* m_staticline36; - wxBoxSizer* bSizerStdButtons; - wxButton* m_buttonShowDonationDetails; - zen::BitmapTextButton* m_buttonDonate2; - wxButton* m_buttonClose; - - // Virtual event handlers, override them in your derived class - virtual void onClose( wxCloseEvent& event ) { event.Skip(); } - virtual void onDonate( wxCommandEvent& event ) { event.Skip(); } - virtual void onOpenForum( wxCommandEvent& event ) { event.Skip(); } - virtual void onSendEmail( wxCommandEvent& event ) { event.Skip(); } - virtual void onShowDonationDetails( wxCommandEvent& event ) { event.Skip(); } - virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } - - -public: - - AboutDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - - ~AboutDlgGenerated(); + private: + + protected: + wxPanel* m_panel41; + wxStaticBitmap* m_bitmapLogoLeft; + wxStaticLine* m_staticline81; + wxBoxSizer* bSizerMainSection; + wxStaticLine* m_staticline82; + wxStaticBitmap* m_bitmapLogo; + wxStaticLine* m_staticline341; + wxStaticText* m_staticFfsTextVersion; + wxStaticText* m_staticTextFfsVariant; + wxStaticLine* m_staticline3411; + wxBoxSizer* bSizerDonate; + wxPanel* m_panelDonate; + wxStaticBitmap* m_bitmapAnimalSmall; + wxPanel* m_panel39; + wxStaticText* m_staticTextDonate; + zen::BitmapTextButton* m_buttonDonate1; + wxStaticBitmap* m_bitmapAnimalBig; + wxStaticLine* m_staticline3412; + wxStaticText* m_staticText94; + wxBitmapButton* m_bpButtonForum; + wxBitmapButton* m_bpButtonEmail; + wxStaticLine* m_staticline37; + wxStaticText* m_staticTextThanksForLoc; + wxScrolledWindow* m_scrolledWindowTranslators; + wxFlexGridSizer* fgSizerTranslators; + wxStaticLine* m_staticline36; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonShowDonationDetails; + zen::BitmapTextButton* m_buttonDonate2; + wxButton* m_buttonClose; + + // Virtual event handlers, override them in your derived class + virtual void onClose( wxCloseEvent& event ) { event.Skip(); } + virtual void onDonate( wxCommandEvent& event ) { event.Skip(); } + virtual void onOpenForum( wxCommandEvent& event ) { event.Skip(); } + virtual void onSendEmail( wxCommandEvent& event ) { event.Skip(); } + virtual void onShowDonationDetails( wxCommandEvent& event ) { event.Skip(); } + virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } + + + public: + + AboutDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + + ~AboutDlgGenerated(); }; @@ -1255,26 +1290,26 @@ public: /////////////////////////////////////////////////////////////////////////////// class DownloadProgressDlgGenerated : public wxDialog { -private: + private: -protected: - wxStaticBitmap* m_bitmapDownloading; - wxStaticText* m_staticTextHeader; - wxGauge* m_gaugeProgress; - wxStaticText* m_staticTextDetails; - wxStaticLine* m_staticline9; - wxBoxSizer* bSizerStdButtons; - wxButton* m_buttonCancel; + protected: + wxStaticBitmap* m_bitmapDownloading; + wxStaticText* m_staticTextHeader; + wxGauge* m_gaugeProgress; + wxStaticText* m_staticTextDetails; + wxStaticLine* m_staticline9; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonCancel; - // Virtual event handlers, override them in your derived class - virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } + // Virtual event handlers, override them in your derived class + virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } -public: + public: - DownloadProgressDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0 ); + DownloadProgressDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0 ); - ~DownloadProgressDlgGenerated(); + ~DownloadProgressDlgGenerated(); }; @@ -1283,28 +1318,28 @@ public: /////////////////////////////////////////////////////////////////////////////// class CfgHighlightDlgGenerated : public wxDialog { -private: + private: -protected: - wxPanel* m_panel35; - wxStaticText* m_staticTextHighlight; - wxSpinCtrl* m_spinCtrlOverdueDays; - wxStaticLine* m_staticline21; - wxBoxSizer* bSizerStdButtons; - wxButton* m_buttonOkay; - wxButton* m_buttonCancel; + protected: + wxPanel* m_panel35; + wxStaticText* m_staticTextHighlight; + wxSpinCtrl* m_spinCtrlOverdueDays; + wxStaticLine* m_staticline21; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonOkay; + wxButton* m_buttonCancel; - // Virtual event handlers, override them in your derived class - virtual void onClose( wxCloseEvent& event ) { event.Skip(); } - virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } - virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } + // Virtual event handlers, override them in your derived class + virtual void onClose( wxCloseEvent& event ) { event.Skip(); } + virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } + virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } -public: + public: - CfgHighlightDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Highlight Configurations"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + CfgHighlightDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Highlight Configurations"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - ~CfgHighlightDlgGenerated(); + ~CfgHighlightDlgGenerated(); }; @@ -1313,36 +1348,36 @@ public: /////////////////////////////////////////////////////////////////////////////// class PasswordPromptDlgGenerated : public wxDialog { -private: + private: -protected: - wxPanel* m_panel35; - wxStaticText* m_staticTextMain; - wxStaticText* m_staticTextPassword; - wxTextCtrl* m_textCtrlPasswordVisible; - wxTextCtrl* m_textCtrlPasswordHidden; - wxCheckBox* m_checkBoxShowPassword; - wxBoxSizer* bSizerError; - wxStaticBitmap* m_bitmapError; - wxStaticText* m_staticTextError; - wxStaticLine* m_staticline21; - wxBoxSizer* bSizerStdButtons; - wxButton* m_buttonOkay; - wxButton* m_buttonCancel; + protected: + wxPanel* m_panel35; + wxStaticText* m_staticTextMain; + wxStaticText* m_staticTextPassword; + wxTextCtrl* m_textCtrlPasswordVisible; + wxTextCtrl* m_textCtrlPasswordHidden; + wxCheckBox* m_checkBoxShowPassword; + wxBoxSizer* bSizerError; + wxStaticBitmap* m_bitmapError; + wxStaticText* m_staticTextError; + wxStaticLine* m_staticline21; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonOkay; + wxButton* m_buttonCancel; - // Virtual event handlers, override them in your derived class - virtual void onClose( wxCloseEvent& event ) { event.Skip(); } - virtual void onTypingPassword( wxCommandEvent& event ) { event.Skip(); } - virtual void onToggleShowPassword( wxCommandEvent& event ) { event.Skip(); } - virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } - virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } + // Virtual event handlers, override them in your derived class + virtual void onClose( wxCloseEvent& event ) { event.Skip(); } + virtual void onTypingPassword( wxCommandEvent& event ) { event.Skip(); } + virtual void onToggleShowPassword( wxCommandEvent& event ) { event.Skip(); } + virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } + virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } -public: + public: - PasswordPromptDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + PasswordPromptDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~PasswordPromptDlgGenerated(); + ~PasswordPromptDlgGenerated(); }; @@ -1351,48 +1386,48 @@ public: /////////////////////////////////////////////////////////////////////////////// class ActivationDlgGenerated : public wxDialog { -private: - -protected: - wxPanel* m_panel35; - wxStaticBitmap* m_bitmapActivation; - wxRichTextCtrl* m_richTextLastError; - wxStaticLine* m_staticline82; - wxStaticText* m_staticTextMain; - wxStaticLine* m_staticline181; - wxStaticLine* m_staticline18111; - wxPanel* m_panel3511; - wxStaticText* m_staticTextMain1; - wxStaticText* m_staticText136; - wxButton* m_buttonActivateOnline; - wxStaticLine* m_staticline181111; - wxStaticLine* m_staticline181112; - wxPanel* m_panel351; - wxStaticText* m_staticText175; - wxStaticText* m_staticText1361; - wxButton* m_buttonCopyUrl; - wxRichTextCtrl* m_richTextManualActivationUrl; - wxStaticText* m_staticText13611; - wxTextCtrl* m_textCtrlOfflineActivationKey; - wxButton* m_buttonActivateOffline; - wxStaticLine* m_staticline13; - wxBoxSizer* bSizerStdButtons; - wxButton* m_buttonCancel; - - // Virtual event handlers, override them in your derived class - virtual void onClose( wxCloseEvent& event ) { event.Skip(); } - virtual void onActivateOnline( wxCommandEvent& event ) { event.Skip(); } - virtual void onCopyUrl( wxCommandEvent& event ) { event.Skip(); } - virtual void onOfflineActivationEnter( wxCommandEvent& event ) { event.Skip(); } - virtual void onActivateOffline( wxCommandEvent& event ) { event.Skip(); } - virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } - - -public: - - ActivationDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - - ~ActivationDlgGenerated(); + private: + + protected: + wxPanel* m_panel35; + wxStaticBitmap* m_bitmapActivation; + wxRichTextCtrl* m_richTextLastError; + wxStaticLine* m_staticline82; + wxStaticText* m_staticTextMain; + wxStaticLine* m_staticline181; + wxStaticLine* m_staticline18111; + wxPanel* m_panel3511; + wxStaticText* m_staticTextMain1; + wxStaticText* m_staticText136; + wxButton* m_buttonActivateOnline; + wxStaticLine* m_staticline181111; + wxStaticLine* m_staticline181112; + wxPanel* m_panel351; + wxStaticText* m_staticText175; + wxStaticText* m_staticText1361; + wxButton* m_buttonCopyUrl; + wxRichTextCtrl* m_richTextManualActivationUrl; + wxStaticText* m_staticText13611; + wxTextCtrl* m_textCtrlOfflineActivationKey; + wxButton* m_buttonActivateOffline; + wxStaticLine* m_staticline13; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonCancel; + + // Virtual event handlers, override them in your derived class + virtual void onClose( wxCloseEvent& event ) { event.Skip(); } + virtual void onActivateOnline( wxCommandEvent& event ) { event.Skip(); } + virtual void onCopyUrl( wxCommandEvent& event ) { event.Skip(); } + virtual void onOfflineActivationEnter( wxCommandEvent& event ) { event.Skip(); } + virtual void onActivateOffline( wxCommandEvent& event ) { event.Skip(); } + virtual void onCancel( wxCommandEvent& event ) { event.Skip(); } + + + public: + + ActivationDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + + ~ActivationDlgGenerated(); }; @@ -1401,40 +1436,40 @@ public: /////////////////////////////////////////////////////////////////////////////// class WarnAccessRightsMissingDlgGenerated : public wxDialog { -private: - -protected: - wxStaticBitmap* m_bitmapGrantAccess; - wxStaticText* m_staticTextDescr; - wxStaticLine* m_staticline20; - wxPanel* m_panel39; - wxFlexGridSizer* ffgSizer11; - wxStaticText* m_staticTextStep1; - wxButton* m_buttonLocateBundle; - wxStaticText* m_staticTextStep2; - wxButton* m_buttonOpenSecurity; - wxStaticText* m_staticTextStep3; - wxStaticText* m_staticTextAllowChanges; - wxStaticText* m_staticTextStep4; - wxStaticText* m_staticTextGrantAccess; - wxStaticLine* m_staticline36; - wxCheckBox* m_checkBoxDontShowAgain; - wxBoxSizer* bSizerStdButtons; - wxButton* m_buttonClose; - - // Virtual event handlers, override them in your derived class - virtual void onClose( wxCloseEvent& event ) { event.Skip(); } - virtual void onShowAppBundle( wxCommandEvent& event ) { event.Skip(); } - virtual void onOpenSecuritySettings( wxCommandEvent& event ) { event.Skip(); } - virtual void onCheckBoxClick( wxCommandEvent& event ) { event.Skip(); } - virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } - - -public: - - WarnAccessRightsMissingDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Grant Full Disk Access"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - - ~WarnAccessRightsMissingDlgGenerated(); + private: + + protected: + wxStaticBitmap* m_bitmapGrantAccess; + wxStaticText* m_staticTextDescr; + wxStaticLine* m_staticline20; + wxPanel* m_panel39; + wxFlexGridSizer* ffgSizer11; + wxStaticText* m_staticTextStep1; + wxButton* m_buttonLocateBundle; + wxStaticText* m_staticTextStep2; + wxButton* m_buttonOpenSecurity; + wxStaticText* m_staticTextStep3; + wxStaticText* m_staticTextAllowChanges; + wxStaticText* m_staticTextStep4; + wxStaticText* m_staticTextGrantAccess; + wxStaticLine* m_staticline36; + wxCheckBox* m_checkBoxDontShowAgain; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonClose; + + // Virtual event handlers, override them in your derived class + virtual void onClose( wxCloseEvent& event ) { event.Skip(); } + virtual void onShowAppBundle( wxCommandEvent& event ) { event.Skip(); } + virtual void onOpenSecuritySettings( wxCommandEvent& event ) { event.Skip(); } + virtual void onCheckBoxClick( wxCommandEvent& event ) { event.Skip(); } + virtual void onOkay( wxCommandEvent& event ) { event.Skip(); } + + + public: + + WarnAccessRightsMissingDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Grant Full Disk Access"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + + ~WarnAccessRightsMissingDlgGenerated(); }; diff --git a/FreeFileSync/Source/ui/gui_status_handler.cpp b/FreeFileSync/Source/ui/gui_status_handler.cpp index 06a24c60..43d39981 100644 --- a/FreeFileSync/Source/ui/gui_status_handler.cpp +++ b/FreeFileSync/Source/ui/gui_status_handler.cpp @@ -5,15 +5,15 @@ // ***************************************************************************** #include "gui_status_handler.h" -#include <zen/process_exec.h> +//#include <zen/process_exec.h> #include <zen/shutdown.h> -#include <zen/resolve_path.h> +//#include <zen/resolve_path.h> #include <wx/app.h> #include <wx/sound.h> #include <wx/wupdlock.h> -#include <wx+/popup_dlg.h> -#include "main_dlg.h" -#include "../afs/concrete.h" +//#include <wx+/popup_dlg.h> +//#include "main_dlg.h" +//#include "../afs/concrete.h" //#include "../log_file.h" using namespace zen; @@ -116,7 +116,7 @@ void StatusHandlerTemporaryPanel::showStatsPanel() StatusHandlerTemporaryPanel::~StatusHandlerTemporaryPanel() { - if (!errorLog_.empty()) //reportResults() was not called! + if (!errorLog_.empty()) //prepareResult() was not called! std::abort(); //Workaround wxAuiManager crash when starting panel resizing during comparison and holding button until after comparison has finished: @@ -140,31 +140,39 @@ StatusHandlerTemporaryPanel::~StatusHandlerTemporaryPanel() } -StatusHandlerTemporaryPanel::Result StatusHandlerTemporaryPanel::reportResults() //noexcept!! +StatusHandlerTemporaryPanel::Result StatusHandlerTemporaryPanel::prepareResult() //noexcept!! { const std::chrono::milliseconds totalTime = mainDlg_.compareStatus_->pauseAndGetTotalTime(); + //append "extra" log for sync errors that could not otherwise be reported: + if (const ErrorLog extraLog = fetchExtraLog(); + !extraLog.empty()) + { + append(errorLog_, extraLog); + std::stable_sort(errorLog_.begin(), errorLog_.end(), [](const LogEntry& lhs, const LogEntry& rhs) { return lhs.time < rhs.time; }); + } + //determine post-sync status irrespective of further errors during tear-down - const SyncResult syncResult = [&] + const TaskResult syncResult = [&] { - if (getAbortStatus()) + if (taskCancelled()) { logMsg(errorLog_, _("Stopped"), MSG_TYPE_ERROR); //= user cancel - return SyncResult::aborted; + return TaskResult::cancelled; } const ErrorLogStats logCount = getStats(errorLog_); if (logCount.error > 0) - return SyncResult::finishedError; + return TaskResult::error; else if (logCount.warning > 0) - return SyncResult::finishedWarning; + return TaskResult::warning; else - return SyncResult::finishedSuccess; + return TaskResult::success; }(); const ProcessSummary summary { - startTime_, syncResult, {} /*jobName*/, + startTime_, syncResult, {} /*jobNames*/, getCurrentStats(), getTotalStats (), totalTime @@ -181,7 +189,7 @@ void StatusHandlerTemporaryPanel::initNewPhase(int itemsTotal, int64_t bytesTota mainDlg_.compareStatus_->initNewPhase(); //call after "StatusHandler::initNewPhase" //macOS needs a full yield to update GUI and get rid of "dummy" texts - requestUiUpdate(true /*force*/); //throw AbortProcess + requestUiUpdate(true /*force*/); //throw CancelProcess } @@ -200,7 +208,7 @@ void StatusHandlerTemporaryPanel::logMessage(const std::wstring& msg, MsgType ty assert(false); return MSG_TYPE_ERROR; }()); - requestUiUpdate(false /*force*/); //throw AbortProcess + requestUiUpdate(false /*force*/); //throw CancelProcess } @@ -228,7 +236,7 @@ void StatusHandlerTemporaryPanel::reportWarning(const std::wstring& msg, bool& w warningActive = !dontWarnAgain; break; case ConfirmationButton::cancel: - abortProcessNow(AbortTrigger::user); //throw AbortProcess + cancelProcessNow(CancelReason::user); //throw CancelProcess break; } } @@ -251,7 +259,7 @@ ProcessCallback::Response StatusHandlerTemporaryPanel::reportError(const ErrorIn [&, statusPrefix = _("Automatic retry") + (errorInfo.retryNumber == 0 ? L"" : L' ' + formatNumber(errorInfo.retryNumber + 1)) + SPACED_DASH, statusPostfix = SPACED_DASH + _("Error") + L": " + replaceCpy(errorInfo.msg, L'\n', L' ')](const std::wstring& timeRemMsg) - { this->updateStatus(statusPrefix + timeRemMsg + statusPostfix); }); //throw AbortProcess + { this->updateStatus(statusPrefix + timeRemMsg + statusPostfix); }); //throw CancelProcess return ProcessCallback::retry; } @@ -281,7 +289,7 @@ ProcessCallback::Response StatusHandlerTemporaryPanel::reportError(const ErrorIn return ProcessCallback::retry; case ConfirmationButton3::cancel: - abortProcessNow(AbortTrigger::user); //throw AbortProcess + cancelProcessNow(CancelReason::user); //throw CancelProcess break; } } @@ -316,7 +324,7 @@ void StatusHandlerTemporaryPanel::reportFatalError(const std::wstring& msg) break; case ConfirmationButton2::cancel: - abortProcessNow(AbortTrigger::user); //throw AbortProcess + cancelProcessNow(CancelReason::user); //throw CancelProcess break; } } @@ -349,7 +357,7 @@ Statistics::ErrorStats StatusHandlerTemporaryPanel::getErrorStats() const void StatusHandlerTemporaryPanel::forceUiUpdateNoThrow() { if (!mainDlg_.auiMgr_.GetPane(mainDlg_.compareStatus_->getAsWindow()).IsShown() && - std::chrono::steady_clock::now() > startTimeSteady_ + TEMP_PANEL_DISPLAY_DELAY) + std::chrono::steady_clock::now() > panelInitTime_ + TEMP_PANEL_DISPLAY_DELAY) showStatsPanel(); mainDlg_.compareStatus_->updateGui(); @@ -360,7 +368,7 @@ void StatusHandlerTemporaryPanel::onLocalKeyEvent(wxKeyEvent& event) { const int keyCode = event.GetKeyCode(); if (keyCode == WXK_ESCAPE) - return userRequestAbort(); + return userRequestCancel(); event.Skip(); } @@ -368,7 +376,7 @@ void StatusHandlerTemporaryPanel::onLocalKeyEvent(wxKeyEvent& event) void StatusHandlerTemporaryPanel::onAbortCompare(wxCommandEvent& event) { - userRequestAbort(); + userRequestCancel(); } //######################################################################################################## @@ -382,150 +390,120 @@ StatusHandlerFloatingDialog::StatusHandlerFloatingDialog(wxFrame* parentDlg, const Zstring& soundFileSyncComplete, const Zstring& soundFileAlertPending, const WindowLayout::Dimensions& dim, - bool autoCloseDialog, - ErrorLog errorLogPrefix) : + bool autoCloseDialog) : jobNames_(jobNames), startTime_(startTime), autoRetryCount_(autoRetryCount), autoRetryDelay_(autoRetryDelay), soundFileSyncComplete_(soundFileSyncComplete), - soundFileAlertPending_(soundFileAlertPending), - errorLog_(makeSharedRef<ErrorLog>(std::move(errorLogPrefix))) + soundFileAlertPending_(soundFileAlertPending) { //set *after* initializer list => callbacks during construction to getErrorStats()! - progressDlg_ = SyncProgressDialog::create(dim, [this] { userRequestAbort(); }, *this, parentDlg, true /*showProgress*/, autoCloseDialog, - jobNames, std::chrono::system_clock::to_time_t(startTime), ignoreErrors, autoRetryCount, PostSyncAction2::none); + progressDlg_ = SyncProgressDialog::create(dim, [this] { userRequestCancel(); }, *this, parentDlg, true /*showProgress*/, autoCloseDialog, + jobNames, std::chrono::system_clock::to_time_t(startTime), ignoreErrors, autoRetryCount, PostSyncAction::none); } StatusHandlerFloatingDialog::~StatusHandlerFloatingDialog() { - if (progressDlg_) //reportResults() was not called! + if (progressDlg_) //showResults() was not called! std::abort(); } -StatusHandlerFloatingDialog::Result StatusHandlerFloatingDialog::reportResults(const Zstring& postSyncCommand, PostSyncCondition postSyncCondition, - const AbstractPath& logFolderPath, int logfilesMaxAgeDays, LogFileFormat logFormat, - const std::set<AbstractPath>& logFilePathsToKeep, - const std::string& emailNotifyAddress, ResultsNotification emailNotifyCondition) +StatusHandlerFloatingDialog::Result StatusHandlerFloatingDialog::prepareResult() { //keep correct summary window stats considering count down timer, system sleep const std::chrono::milliseconds totalTime = progressDlg_->pauseAndGetTotalTime(); + //append "extra" log for sync errors that could not otherwise be reported: + if (const ErrorLog extraLog = fetchExtraLog(); + !extraLog.empty()) + { + append(errorLog_.ref(), extraLog); + std::stable_sort(errorLog_.ref().begin(), errorLog_.ref().end(), [](const LogEntry& lhs, const LogEntry& rhs) { return lhs.time < rhs.time; }); + } + //determine post-sync status irrespective of further errors during tear-down - const SyncResult syncResult = [&] + assert(!syncResult_); + syncResult_ = [&] { - if (getAbortStatus()) + if (taskCancelled()) //= user cancel { - logMsg(errorLog_.ref(), _("Stopped"), MSG_TYPE_ERROR); //= user cancel - return SyncResult::aborted; + assert(*taskCancelled() == CancelReason::user); //"stop on first error" is ffs_batch-only + logMsg(errorLog_.ref(), _("Stopped"), MSG_TYPE_ERROR); + return TaskResult::cancelled; } const ErrorLogStats logCount = getStats(errorLog_.ref()); if (logCount.error > 0) - return SyncResult::finishedError; + return TaskResult::error; else if (logCount.warning > 0) - return SyncResult::finishedWarning; + return TaskResult::warning; if (getTotalStats() == ProgressStats()) logMsg(errorLog_.ref(), _("Nothing to synchronize"), MSG_TYPE_INFO); - return SyncResult::finishedSuccess; + return TaskResult::success; }(); - assert(syncResult == SyncResult::aborted || currentPhase() == ProcessPhase::synchronizing); + assert(*syncResult_ == TaskResult::cancelled || currentPhase() == ProcessPhase::sync); const ProcessSummary summary { - startTime_, syncResult, jobNames_, + startTime_, *syncResult_, jobNames_, getCurrentStats(), getTotalStats (), totalTime }; - AbstractPath logFilePath = AFS::appendRelPath(logFolderPath, generateLogFileName(logFormat, summary)); - //e.g. %AppData%\FreeFileSync\Logs\Backup FreeFileSync 2013-09-15 015052.123 [Error].log + return {summary, errorLog_}; +} - auto notifyStatusNoThrow = [&](std::wstring&& msg) { try { updateStatus(std::move(msg)); /*throw AbortProcess*/ } catch (AbortProcess&) {} }; +StatusHandlerFloatingDialog::DlgOptions StatusHandlerFloatingDialog::showResult() +{ bool autoClose = false; - FinalRequest finalRequest = FinalRequest::none; bool suspend = false; + FinalRequest finalRequest = FinalRequest::none; - if (getAbortStatus() && *getAbortStatus() == AbortTrigger::user) - ; /* user cancelled => don't run post sync command - => don't send email notification - => don't run post sync action - => don't play sound notification */ + if (taskCancelled()) + assert(*taskCancelled() == CancelReason::user); //"stop on first error" is only for ffs_batch else { - //--------------------- post sync command ---------------------- - if (const Zstring cmdLine = trimCpy(postSyncCommand); - !cmdLine.empty()) - if (postSyncCondition == PostSyncCondition::completion || - (postSyncCondition == PostSyncCondition::errors) == (syncResult == SyncResult::aborted || - syncResult == SyncResult::finishedError)) - ////---------------------------------------------------------------------- - //::wxSetEnv(L"logfile_path", AFS::getDisplayPath(logFilePath)); - ////---------------------------------------------------------------------- - runCommandAndLogErrors(expandMacros(cmdLine), errorLog_.ref()); - - //--------------------- email notification ---------------------- - if (const std::string notifyEmail = trimCpy(emailNotifyAddress); - !notifyEmail.empty()) - if (emailNotifyCondition == ResultsNotification::always || - (emailNotifyCondition == ResultsNotification::errorWarning && (syncResult == SyncResult::aborted || - syncResult == SyncResult::finishedError || - syncResult == SyncResult::finishedWarning)) || - (emailNotifyCondition == ResultsNotification::errorOnly && (syncResult == SyncResult::aborted || - syncResult == SyncResult::finishedError))) - try - { - logMsg(errorLog_.ref(), replaceCpy(_("Sending email notification to %x"), L"%x", utfTo<std::wstring>(notifyEmail)), MSG_TYPE_INFO); - sendLogAsEmail(notifyEmail, summary, errorLog_.ref(), logFilePath, notifyStatusNoThrow); //throw FileError - } - catch (const FileError& e) { logMsg(errorLog_.ref(), e.toString(), MSG_TYPE_ERROR); } - //--------------------- post sync actions ---------------------- + //give user chance to cancel shutdown; do *not* consider the sync itself cancelled auto proceedWithShutdown = [&](const std::wstring& operationName) { if (progressDlg_->getWindowIfVisible()) try { - assert(!zen::endsWith(operationName, L".")); - auto notifyStatusThrowOnCancel = [&](const std::wstring& timeRemMsg) - { - try { updateStatus(operationName + L"... " + timeRemMsg); /*throw AbortProcess*/ } - catch (AbortProcess&) - { - if (getAbortStatus() && *getAbortStatus() == AbortTrigger::user) - throw; - } - }; - delayAndCountDown(std::chrono::steady_clock::now() + std::chrono::seconds(10), notifyStatusThrowOnCancel); //throw AbortProcess + assert(!endsWith(operationName, L".")); + auto notifyStatus = [&](const std::wstring& timeRemMsg) { updateStatus(operationName + L"... " + timeRemMsg); /*throw CancelProcess*/ }; + + delayAndCountDown(std::chrono::steady_clock::now() + std::chrono::seconds(10), notifyStatus); //throw CancelProcess } - catch (AbortProcess&) { return false; } + catch (CancelProcess&) { return false; } return true; }; switch (progressDlg_->getOptionPostSyncAction()) { - case PostSyncAction2::none: + case PostSyncAction::none: autoClose = progressDlg_->getOptionAutoCloseDialog(); break; - case PostSyncAction2::exit: + case PostSyncAction::exit: autoClose = true; finalRequest = FinalRequest::exit; //program exit must be handled by calling context! break; - case PostSyncAction2::sleep: + case PostSyncAction::sleep: if (proceedWithShutdown(_("System: Sleep"))) { autoClose = progressDlg_->getOptionAutoCloseDialog(); suspend = true; } break; - case PostSyncAction2::shutdown: + case PostSyncAction::shutdown: if (proceedWithShutdown(_("System: Shut down"))) { autoClose = true; @@ -533,68 +511,46 @@ StatusHandlerFloatingDialog::Result StatusHandlerFloatingDialog::reportResults(c } break; } - - //--------------------- sound notification ---------------------- - if (!autoClose) //only play when showing results dialog - if (!soundFileSyncComplete_.empty()) - { - //wxWidgets shows modal error dialog by default => "no, wxWidgets, NO!" - wxLog* oldLogTarget = wxLog::SetActiveTarget(new wxLogStderr); //transfer and receive ownership! - ZEN_ON_SCOPE_EXIT(delete wxLog::SetActiveTarget(oldLogTarget)); - - wxSound::Play(utfTo<wxString>(soundFileSyncComplete_), wxSOUND_ASYNC); - } - //if (::GetForegroundWindow() != GetHWND()) - // RequestUserAttention(); -> probably too much since task bar is already colorized with Taskbar::STATUS_ERROR or STATUS_NORMAL } - //--------------------- save log file ---------------------- - try //create not before destruction: 1. avoid issues with FFS trying to sync open log file 2. include status in log file name without extra rename - { - //do NOT use tryReportingError()! saving log files should not be cancellable! - saveLogFile(logFilePath, summary, errorLog_.ref(), logfilesMaxAgeDays, logFormat, logFilePathsToKeep, notifyStatusNoThrow); //throw FileError - } - catch (const FileError& e) - { - logMsg(errorLog_.ref(), e.toString(), MSG_TYPE_ERROR); - - const AbstractPath logFileDefaultPath = AFS::appendRelPath(createAbstractPath(getLogFolderDefaultPath()), generateLogFileName(logFormat, summary)); - if (logFilePath != logFileDefaultPath) //fallback: log file *must* be saved no matter what! - try - { - logFilePath = logFileDefaultPath; - saveLogFile(logFileDefaultPath, summary, errorLog_.ref(), logfilesMaxAgeDays, logFormat, logFilePathsToKeep, notifyStatusNoThrow); //throw FileError - } - catch (const FileError& e2) { logMsg(errorLog_.ref(), e2.toString(), MSG_TYPE_ERROR); } - } - //---------------------------------------------------------- - - if (suspend) //...*before* results dialog is shown - try + if (suspend) //*before* showing results dialog + try { suspendSystem(); //throw FileError } catch (const FileError& e) { logMsg(errorLog_.ref(), e.toString(), MSG_TYPE_ERROR); } + //--------------------- sound notification ---------------------- + if (!taskCancelled() && !suspend && !autoClose && //only play when actually showing results dialog + !soundFileSyncComplete_.empty()) + { + //wxWidgets shows modal error dialog by default => "no, wxWidgets, NO!" + wxLog* oldLogTarget = wxLog::SetActiveTarget(new wxLogStderr); //transfer and receive ownership! + ZEN_ON_SCOPE_EXIT(delete wxLog::SetActiveTarget(oldLogTarget)); + + wxSound::Play(utfTo<wxString>(soundFileSyncComplete_), wxSOUND_ASYNC); + } + //if (::GetForegroundWindow() != GetHWND()) + // RequestUserAttention(); -> probably too much since task bar is already colorized with Taskbar::Status::error or Status::normal - const auto [autoCloseFinal, dim] = progressDlg_->destroy(autoClose, - finalRequest == FinalRequest::none /*restoreParentFrame*/, - syncResult, errorLog_); - //caveat: calls back to getErrorStats() => share errorLog_ + const auto [autoCloseSelected, dim] = progressDlg_->destroy(autoClose, + finalRequest == FinalRequest::none /*restoreParentFrame*/, + *syncResult_, errorLog_); + //caveat: calls back to getErrorStats() => *share* (and not move) errorLog_ progressDlg_ = nullptr; - return {summary, errorLog_, finalRequest, logFilePath, dim, autoCloseFinal}; + return {autoCloseSelected, dim, finalRequest}; } void StatusHandlerFloatingDialog::initNewPhase(int itemsTotal, int64_t bytesTotal, ProcessPhase phaseID) { - assert(phaseID == ProcessPhase::synchronizing); + assert(phaseID == ProcessPhase::sync); StatusHandler::initNewPhase(itemsTotal, bytesTotal, phaseID); progressDlg_->initNewPhase(); //call after "StatusHandler::initNewPhase" //macOS needs a full yield to update GUI and get rid of "dummy" texts - requestUiUpdate(true /*force*/); //throw AbortProcess + requestUiUpdate(true /*force*/); //throw CancelProcess } @@ -614,7 +570,7 @@ void StatusHandlerFloatingDialog::logMessage(const std::wstring& msg, MsgType ty assert(false); return MSG_TYPE_ERROR; }()); - requestUiUpdate(false /*force*/); //throw AbortProcess + requestUiUpdate(false /*force*/); //throw CancelProcess } @@ -642,7 +598,7 @@ void StatusHandlerFloatingDialog::reportWarning(const std::wstring& msg, bool& w warningActive = !dontWarnAgain; break; case ConfirmationButton::cancel: - abortProcessNow(AbortTrigger::user); //throw AbortProcess + cancelProcessNow(CancelReason::user); //throw CancelProcess break; } } @@ -665,7 +621,7 @@ ProcessCallback::Response StatusHandlerFloatingDialog::reportError(const ErrorIn [&, statusPrefix = _("Automatic retry") + (errorInfo.retryNumber == 0 ? L"" : L' ' + formatNumber(errorInfo.retryNumber + 1)) + SPACED_DASH, statusPostfix = SPACED_DASH + _("Error") + L": " + replaceCpy(errorInfo.msg, L'\n', L' ')](const std::wstring& timeRemMsg) - { this->updateStatus(statusPrefix + timeRemMsg + statusPostfix); }); //throw AbortProcess + { this->updateStatus(statusPrefix + timeRemMsg + statusPostfix); }); //throw CancelProcess return ProcessCallback::retry; } @@ -695,7 +651,7 @@ ProcessCallback::Response StatusHandlerFloatingDialog::reportError(const ErrorIn return ProcessCallback::retry; case ConfirmationButton3::cancel: - abortProcessNow(AbortTrigger::user); //throw AbortProcess + cancelProcessNow(CancelReason::user); //throw CancelProcess break; } } @@ -730,7 +686,7 @@ void StatusHandlerFloatingDialog::reportFatalError(const std::wstring& msg) break; case ConfirmationButton2::cancel: - abortProcessNow(AbortTrigger::user); //throw AbortProcess + cancelProcessNow(CancelReason::user); //throw CancelProcess break; } } diff --git a/FreeFileSync/Source/ui/gui_status_handler.h b/FreeFileSync/Source/ui/gui_status_handler.h index 1969da59..252bd1c5 100644 --- a/FreeFileSync/Source/ui/gui_status_handler.h +++ b/FreeFileSync/Source/ui/gui_status_handler.h @@ -32,7 +32,7 @@ public: void initNewPhase (int itemsTotal, int64_t bytesTotal, ProcessPhase phaseID) override; // void logMessage (const std::wstring& msg, MsgType type) override; // - void reportWarning (const std::wstring& msg, bool& warningActive) override; //throw AbortProcess + void reportWarning (const std::wstring& msg, bool& warningActive) override; //throw CancelProcess Response reportError (const ErrorInfo& errorInfo) override; // void reportFatalError(const std::wstring& msg) override; // ErrorStats getErrorStats() const override; @@ -44,7 +44,7 @@ public: ProcessSummary summary; zen::SharedRef<const zen::ErrorLog> errorLog; }; - Result reportResults(); //noexcept!! + Result prepareResult(); //noexcept!! private: void onLocalKeyEvent(wxKeyEvent& event); @@ -60,7 +60,7 @@ private: const std::chrono::seconds autoRetryDelay_; const Zstring soundFileAlertPending_; const std::chrono::system_clock::time_point startTime_; - const std::chrono::steady_clock::time_point startTimeSteady_ = std::chrono::steady_clock::now(); + const std::chrono::steady_clock::time_point panelInitTime_ = std::chrono::steady_clock::now(); }; @@ -77,13 +77,12 @@ public: const Zstring& soundFileSyncComplete, const Zstring& soundFileAlertPending, const zen::WindowLayout::Dimensions& dim, - bool autoCloseDialog, - zen::ErrorLog errorLogPrefix /*optional, unifying assignment*/); //noexcept! + bool autoCloseDialog); //noexcept! ~StatusHandlerFloatingDialog(); void initNewPhase (int itemsTotal, int64_t bytesTotal, ProcessPhase phaseID) override; // void logMessage (const std::wstring& msg, MsgType type) override; // - void reportWarning (const std::wstring& msg, bool& warningActive) override; //throw AbortProcess + void reportWarning (const std::wstring& msg, bool& warningActive) override; //throw CancelProcess Response reportError (const ErrorInfo& errorInfo) override; // void reportFatalError(const std::wstring& msg) override; // ErrorStats getErrorStats() const override; @@ -91,24 +90,26 @@ public: void updateDataProcessed(int itemsDelta, int64_t bytesDelta) override; //noexcept!! void forceUiUpdateNoThrow() override; // + struct Result + { + ProcessSummary summary; + zen::SharedRef<zen::ErrorLog> errorLog; + }; + Result prepareResult(); + enum class FinalRequest { none, exit, shutdown }; - struct Result + struct DlgOptions { - ProcessSummary summary; - zen::SharedRef<const zen::ErrorLog> errorLog; + bool autoCloseSelected; + zen::WindowLayout::Dimensions dim; FinalRequest finalRequest; - AbstractPath logFilePath; - zen::WindowLayout::Dimensions dlgDim; - bool autoCloseDialog; }; - Result reportResults(const Zstring& postSyncCommand, PostSyncCondition postSyncCondition, - const AbstractPath& logFolderPath, int logfilesMaxAgeDays, LogFileFormat logFormat, const std::set<AbstractPath>& logFilePathsToKeep, - const std::string& emailNotifyAddress, ResultsNotification emailNotifyCondition); //noexcept!! + DlgOptions showResult(); private: const std::vector<std::wstring> jobNames_; @@ -118,9 +119,10 @@ private: const Zstring soundFileSyncComplete_; const Zstring soundFileAlertPending_; SyncProgressDialog* progressDlg_; //managed to have the same lifetime as this handler! - zen::SharedRef<zen::ErrorLog> errorLog_; + zen::SharedRef<zen::ErrorLog> errorLog_ = zen::makeSharedRef<zen::ErrorLog>(); mutable Statistics::ErrorStats errorStatsBuf_{}; mutable size_t errorStatsRowsChecked_ = 0; + std::optional<TaskResult> syncResult_; }; } diff --git a/FreeFileSync/Source/ui/log_panel.cpp b/FreeFileSync/Source/ui/log_panel.cpp index ff64044e..bd291972 100644 --- a/FreeFileSync/Source/ui/log_panel.cpp +++ b/FreeFileSync/Source/ui/log_panel.cpp @@ -283,7 +283,7 @@ public: static int getRowDefaultHeight(const Grid& grid) { - return std::max(getDefaultMenuIconSize(), grid.getMainWin().GetCharHeight() + fastFromDIP(2)) + 1; //+ some space + bottom border + return std::max(getDefaultMenuIconSize(), grid.getMainWin().GetCharHeight() + fastFromDIP(2) /*extra space*/) + fastFromDIP(1) /*bottom border*/; } std::wstring getToolTip(size_t row, ColumnType colType, HoverArea rowHover) override @@ -326,7 +326,7 @@ LogPanel::LogPanel(wxWindow* parent) : LogPanelGenerated(parent) }); //support for CTRL + C - m_gridMessages->Bind(wxEVT_KEY_DOWN, [this](wxKeyEvent& event) { onGridButtonEvent(event); }); + m_gridMessages->Bind(wxEVT_KEY_DOWN, [this](wxKeyEvent& event) { onGridKeyEvent(event); }); m_gridMessages->Bind(EVENT_GRID_CONTEXT_MENU, [this](GridContextMenuEvent& event) { onMsgGridContext(event); }); @@ -440,7 +440,7 @@ void LogPanel::onMsgGridContext(GridContextMenuEvent& event) } -void LogPanel::onGridButtonEvent(wxKeyEvent& event) +void LogPanel::onGridKeyEvent(wxKeyEvent& event) { int keyCode = event.GetKeyCode(); @@ -482,8 +482,6 @@ void LogPanel::onLocalKeyEvent(wxKeyEvent& event) //process key events without e m_gridMessages->SetFocus(); m_gridMessages->selectAllRows(GridEventPolicy::allow); return; // -> swallow event! don't allow default grid commands! - - //case 'C': -> already implemented by "Grid" class } else switch (keyCode) diff --git a/FreeFileSync/Source/ui/log_panel.h b/FreeFileSync/Source/ui/log_panel.h index fad3c054..6bfeff96 100644 --- a/FreeFileSync/Source/ui/log_panel.h +++ b/FreeFileSync/Source/ui/log_panel.h @@ -30,9 +30,9 @@ private: void onErrors (wxCommandEvent& event) override; void onWarnings(wxCommandEvent& event) override; void onInfo (wxCommandEvent& event) override; - void onGridButtonEvent(wxKeyEvent& event); void onMsgGridContext (zen::GridContextMenuEvent& event); - void onLocalKeyEvent (wxKeyEvent& event); + void onGridKeyEvent (wxKeyEvent& event); + void onLocalKeyEvent(wxKeyEvent& event); void copySelectionToClipboard(); diff --git a/FreeFileSync/Source/ui/main_dlg.cpp b/FreeFileSync/Source/ui/main_dlg.cpp index e8abe12e..935d5d0f 100644 --- a/FreeFileSync/Source/ui/main_dlg.cpp +++ b/FreeFileSync/Source/ui/main_dlg.cpp @@ -8,6 +8,7 @@ #include <zen/format_unit.h> #include <zen/file_access.h> #include <zen/file_io.h> +#include <zen/file_traverser.h> #include <zen/thread.h> #include <zen/process_exec.h> #include <zen/perf.h> @@ -34,6 +35,7 @@ #include "version_check.h" #include "gui_status_handler.h" #include "small_dlgs.h" +#include "rename_dlg.h" #include "progress_indicator.h" #include "folder_pair.h" #include "search_grid.h" @@ -66,23 +68,31 @@ constexpr std::chrono::milliseconds FILE_GRID_POST_UPDATE_DELAY(400); const ZstringView macroNameItemPath = Zstr("%item_path%"); const ZstringView macroNameItemPath2 = Zstr("%item_path2%"); +const ZstringView macroNameItemPaths = Zstr("%item_paths%"); const ZstringView macroNameLocalPath = Zstr("%local_path%"); const ZstringView macroNameLocalPath2 = Zstr("%local_path2%"); +const ZstringView macroNameLocalPaths = Zstr("%local_paths%"); const ZstringView macroNameItemName = Zstr("%item_name%"); const ZstringView macroNameItemName2 = Zstr("%item_name2%"); +const ZstringView macroNameItemNames = Zstr("%item_names%"); const ZstringView macroNameParentPath = Zstr("%parent_path%"); const ZstringView macroNameParentPath2 = Zstr("%parent_path2%"); +const ZstringView macroNameParentPaths = Zstr("%parent_paths%"); bool containsFileItemMacro(const Zstring& commandLinePhrase) { return contains(commandLinePhrase, macroNameItemPath ) || contains(commandLinePhrase, macroNameItemPath2 ) || + contains(commandLinePhrase, macroNameItemPaths ) || contains(commandLinePhrase, macroNameLocalPath ) || contains(commandLinePhrase, macroNameLocalPath2 ) || + contains(commandLinePhrase, macroNameLocalPaths ) || contains(commandLinePhrase, macroNameItemName ) || contains(commandLinePhrase, macroNameItemName2 ) || + contains(commandLinePhrase, macroNameItemNames ) || contains(commandLinePhrase, macroNameParentPath ) || - contains(commandLinePhrase, macroNameParentPath2) ; + contains(commandLinePhrase, macroNameParentPath2) || + contains(commandLinePhrase, macroNameParentPaths) ; } //let's NOT create wxWidgets objects statically: @@ -953,6 +963,42 @@ imgFileManagerSmall_([] onResizeLeftFolderWidth(evtDummy); // + onSystemShutdownRegister(onBeforeSystemShutdownCookie_); + + //show and clear "extra" log in case of startup errors: + guiQueue_.processAsync([] { std::this_thread::sleep_for(std::chrono::milliseconds(500)); }, [this] //give worker threads some time to (potentially) log extra errors + { + if (!operationInProgress_ && folderCmp_.empty()) //don't show if main dialog is otherwise busy! + { + ErrorLog extraLog = fetchExtraLog(); + + try //clean up remnant logs from previous FFS runs: + { + traverseFolder(getConfigDirPath(), [&](const FileInfo& fi) //"ErrorLog 2023-07-05 105207.073.xml" + { + if (startsWith(fi.itemName, Zstr("ErrorLog ")) && endsWith(fi.itemName, Zstr(".xml"))) //case-sensitive + { + append(extraLog, loadErrorLog(fi.fullPath)); //throw FileError + removeFilePlain(fi.fullPath); //throw FileError + //yeah, "read + delete" is a bit racy... + } + }, nullptr, nullptr); //throw FileError + } + catch (const FileError& e) { logMsg(extraLog, e.toString(), MessageType::MSG_TYPE_ERROR); } + + std::stable_sort(extraLog.begin(), extraLog.end(), [](const LogEntry& lhs, const LogEntry& rhs) { return lhs.time < rhs.time; }); + + if (!extraLog.empty()) + { + const ErrorLogStats logCount = getStats(extraLog); + const TaskResult taskResult = logCount.error > 0 ? TaskResult::error : (logCount.warning > 0 ? TaskResult::warning : TaskResult::success); + setLastOperationLog({.result = taskResult}, make_shared<const ErrorLog>(std::move(extraLog))); + showLogPanel(true); + } + } + }); + + //scroll cfg history to last used position. We cannot do this earlier e.g. in setGlobalCfgOnInit() //1. setConfig() indirectly calls cfggrid::addAndSelect() which changes cfg history scroll position //2. Grid::makeRowVisible() requires final window height! => do this after window resizing is complete @@ -969,9 +1015,6 @@ imgFileManagerSmall_([] } //start up: user most likely wants to change config, or start comparison by pressing ENTER m_gridCfgHistory->SetFocus(); - - - onSystemShutdownRegister(onBeforeSystemShutdownCookie_); } @@ -1007,11 +1050,10 @@ MainDialog::~MainDialog() void MainDialog::onBeforeSystemShutdown() { try { writeConfig(getConfig(), lastRunConfigPath_); } - catch (FileError&) { assert(false); } + catch (const FileError& e) { logExtraError(e.toString()); } try { writeConfig(getGlobalCfgBeforeExit(), globalConfigFilePath_); } - catch (FileError&) { assert(false); } - warn_static("log, maybe?") + catch (const FileError& e) { logExtraError(e.toString()); } } @@ -1457,13 +1499,13 @@ void MainDialog::copyToAlternateFolder(const std::vector<FileSystemObject*>& sel globalCfg_.mainDlg.copyToCfg.keepRelPaths, globalCfg_.mainDlg.copyToCfg.overwriteIfExists, globalCfg_.warnDlgs, - statusHandler); //throw AbortProcess + statusHandler); //throw CancelProcess //"clearSelection" not needed/desired } - catch (AbortProcess&) {} + catch (CancelProcess&) {} - const StatusHandlerTemporaryPanel::Result r = statusHandler.reportResults(); //noexcept + const StatusHandlerTemporaryPanel::Result r = statusHandler.prepareResult(); //noexcept setLastOperationLog(r.summary, r.errorLog.ptr()); //updateGui(); -> not needed @@ -1503,14 +1545,15 @@ void MainDialog::deleteSelectedFiles(const std::vector<FileSystemObject*>& selec extractDirectionCfg(folderCmp_, getConfig().mainCfg), moveToRecycler, globalCfg_.warnDlgs.warnRecyclerMissing, - statusHandler); //throw AbortProcess + statusHandler); //throw CancelProcess } - catch (AbortProcess&) {} + catch (CancelProcess&) {} - const StatusHandlerTemporaryPanel::Result r = statusHandler.reportResults(); //noexcept + const StatusHandlerTemporaryPanel::Result r = statusHandler.prepareResult(); //noexcept setLastOperationLog(r.summary, r.errorLog.ptr()); - append(errorLogPrepSync_, r.errorLog.ref()); + append(fullSyncLog_->log, r.errorLog.ref()); + fullSyncLog_->totalTime += r.summary.totalTime; //remove rows that are empty: just a beautification, invalid rows shouldn't cause issues filegrid::getDataView(*m_gridMainC).removeInvalidRows(); @@ -1519,6 +1562,69 @@ void MainDialog::deleteSelectedFiles(const std::vector<FileSystemObject*>& selec } +void MainDialog::renameSelectedFiles(const std::vector<FileSystemObject*>& selectionL, + const std::vector<FileSystemObject*>& selectionR) +{ + warn_static("finish") + if (std::all_of(selectionL.begin(), selectionL.end(), [](const FileSystemObject* fsObj) { return fsObj->isEmpty<SelectSide::left >(); }) && + /**/std::all_of(selectionR.begin(), selectionR.end(), [](const FileSystemObject* fsObj) { return fsObj->isEmpty<SelectSide::right>(); })) + /**/return; //harmonize with onGridContextRim(): this function should be a no-op iff context menu option is disabled! + + FocusPreserver fp; + + std::vector<Zstring> fileNamesOld + { + Zstr("Season 1, Episode 21 - The Arsenal of Freedom.mkv"), + Zstr("Season 1, Episode 22 - Symbiosis.mkv"), + Zstr("Season 1, Episode 23 - Skin of Evil.mkv"), + Zstr("Season 1, Episode 24 - We'll Always Have Paris.mkv"), + Zstr("Season 1, Episode 25 - Conspiracy.mkv"), + Zstr("Season 1, Episode 26 - The Neutral Zone.mkv"), + Zstr("Season 2, Episode 01 - The Child.mkv"), + Zstr("Season 2, Episode 02 - Where Silence Has Lease.mkv"), + Zstr("Season 2, Episode 03 - Elementary, Dear Data.mkv"), + }; + std::vector<Zstring> fileNamesNew; + + if (showRenameDialog(this, fileNamesOld, fileNamesNew) != ConfirmationButton::accept) + return; + + disableGuiElements(true /*enableAbort*/); //StatusHandlerTemporaryPanel will internally process Window messages, so avoid unexpected callbacks! + auto app = wxTheApp; //fix lambda/wxWigets/VC fuck up + ZEN_ON_SCOPE_EXIT(app->Yield(); enableGuiElements()); //ui update before enabling buttons again: prevent strange behaviour of delayed button clicks + + //wxBusyCursor dummy; -> redundant: progress already shown in status bar! + const auto& guiCfg = getConfig(); + + StatusHandlerTemporaryPanel statusHandler(*this, std::chrono::system_clock::now() /*startTime*/, + false /*ignoreErrors*/, + guiCfg.mainCfg.autoRetryCount, + guiCfg.mainCfg.autoRetryDelay, + globalCfg_.soundFileAlertPending); + try + { + + //deleteFromGridAndHD(selectionL, selectionR, + // extractDirectionCfg(folderCmp_, getConfig().mainCfg), + // moveToRecycler, + // globalCfg_.warnDlgs.warnRecyclerMissing, + // statusHandler); //throw CancelProcess + } + catch (CancelProcess&) {} + + const StatusHandlerTemporaryPanel::Result r = statusHandler.prepareResult(); //noexcept + setLastOperationLog(r.summary, r.errorLog.ptr()); + + append(fullSyncLog_->log, r.errorLog.ref()); + fullSyncLog_->totalTime += r.summary.totalTime; + + ////remove rows that are empty: just a beautification, invalid rows shouldn't cause issues + //filegrid::getDataView(*m_gridMainC).removeInvalidRows(); + + updateGui(); +} + + namespace { template <SelectSide side> @@ -1566,13 +1672,24 @@ void collectNonNativeFiles(const std::vector<FileSystemObject*>& selectedRows, c } +struct ItemPathInfo +{ + Zstring itemPath; + Zstring itemPath2; + Zstring itemName; + Zstring itemName2; + Zstring parentPath; + Zstring parentPath2; + Zstring localPath; + Zstring localPath2; +}; template <SelectSide side> -void invokeCommandLine(const Zstring& commandLinePhrase, //throw FileError - const std::vector<FileSystemObject*>& selection, - const TempFileBuffer& tempFileBuf) +std::vector<ItemPathInfo> getItemPathInfo(const std::vector<FileSystemObject*>& selection, const TempFileBuffer& tempFileBuf) { constexpr SelectSide side2 = getOtherSide<side>; + std::vector<ItemPathInfo> pathInfos; + for (const FileSystemObject* fsObj : selection) //context menu calls this function only if selection is not empty! { const AbstractPath basePath = fsObj->base().getAbstractPath<side >(); @@ -1604,34 +1721,19 @@ void invokeCommandLine(const Zstring& commandLinePhrase, //throw FileError if (localPath .empty()) localPath = replaceCpy(utfTo<Zstring>(L"<" + _("Local path not available for %x.") + L">"), Zstr("%x"), itemPath ); if (localPath2.empty()) localPath2 = replaceCpy(utfTo<Zstring>(L"<" + _("Local path not available for %x.") + L">"), Zstr("%x"), itemPath2); - Zstring cmdLine = expandMacros(commandLinePhrase); - replace(cmdLine, macroNameItemPath, itemPath); - replace(cmdLine, macroNameItemPath2, itemPath2); - replace(cmdLine, macroNameLocalPath, localPath); - replace(cmdLine, macroNameLocalPath2, localPath2); - replace(cmdLine, macroNameItemName, itemName); - replace(cmdLine, macroNameItemName2, itemName2); - replace(cmdLine, macroNameParentPath, parentPath); - replace(cmdLine, macroNameParentPath2, parentPath2); - - if (commandLinePhrase == extCommandOpenDefault.cmdLine) //not strictly needed, but: 1. better error reporting (Windows) 2. not async => avoid zombies (Linux/macOS) - openWithDefaultApp(localPath); //throw FileError - else - try - { - std::optional<int> timeoutMs; - if (selection.size() <= EXT_APP_MASS_INVOKE_THRESHOLD) - timeoutMs = EXT_APP_MAX_TOTAL_WAIT_TIME_MS / selection.size(); //run async, but give consoleExecute() some "time to fail" - //else: run synchronously - - if (const auto& [exitCode, output] = consoleExecute(cmdLine, timeoutMs); //throw SysError, SysErrorTimeOut - exitCode != 0) - throw SysError(formatSystemError(utfTo<std::string>(commandLinePhrase), - replaceCpy(_("Exit code %x"), L"%x", numberTo<std::wstring>(exitCode)), utfTo<std::wstring>(output))); - } - catch (SysErrorTimeOut&) {} //child process not failed yet => probably fine :> - catch (const SysError& e) { throw FileError(replaceCpy(_("Command %x failed."), L"%x", fmtPath(cmdLine)), e.toString()); } + pathInfos.push_back( + { + itemPath, + itemPath2, + itemName, + itemName2, + parentPath, + parentPath2, + localPath, + localPath2, + }); } + return pathInfos; } } @@ -1642,49 +1744,51 @@ void MainDialog::openExternalApplication(const Zstring& commandLinePhrase, bool { try { - if (containsFileItemMacro(commandLinePhrase)) + //support fallback instead of an error in this special case + if (commandLinePhrase == extCommandFileManager.cmdLine) { - //support fallback instead of an error in this special case - if (commandLinePhrase == extCommandFileManager.cmdLine) + if (selectionL.size() + selectionR.size() > 1) //do not open more than one Explorer instance! { - if (selectionL.size() + selectionR.size() > 1) //do not open more than one Explorer instance! - { - if (( leftSide && !selectionL.empty()) || - (!leftSide && selectionR.empty())) - return openExternalApplication(commandLinePhrase, leftSide, {selectionL[0]}, {}); - else - return openExternalApplication(commandLinePhrase, leftSide, {}, {selectionR[0]}); - } + if (( leftSide && !selectionL.empty()) || + (!leftSide && selectionR.empty())) + return openExternalApplication(commandLinePhrase, leftSide, {selectionL[0]}, {}); + else + return openExternalApplication(commandLinePhrase, leftSide, {}, {selectionR[0]}); + } - //either left or right selection is filled with exactly one item (or no selection at all) - AbstractPath itemPath = getNullPath(); - if (!selectionL.empty()) - { - if (selectionL[0]->isEmpty<SelectSide::left>()) - return openFolderInFileBrowser(getExistingParentFolder<SelectSide::left>(*selectionL[0])); //throw FileError + //either left or right selection is filled with exactly one item (or no selection at all) + AbstractPath itemPath = getNullPath(); + if (!selectionL.empty()) + { + if (selectionL[0]->isEmpty<SelectSide::left>()) + return openFolderInFileBrowser(getExistingParentFolder<SelectSide::left>(*selectionL[0])); //throw FileError - itemPath = selectionL[0]->getAbstractPath<SelectSide::left>(); - } - else if (!selectionR.empty()) - { - if (selectionR[0]->isEmpty<SelectSide::right>()) - return openFolderInFileBrowser(getExistingParentFolder<SelectSide::right>(*selectionR[0])); //throw FileError + itemPath = selectionL[0]->getAbstractPath<SelectSide::left>(); + } + else if (!selectionR.empty()) + { + if (selectionR[0]->isEmpty<SelectSide::right>()) + return openFolderInFileBrowser(getExistingParentFolder<SelectSide::right>(*selectionR[0])); //throw FileError - itemPath = selectionR[0]->getAbstractPath<SelectSide::right>(); - } - else - return openFolderInFileBrowser(leftSide ? //throw FileError - createAbstractPath(firstFolderPair_->getValues().folderPathPhraseLeft) : - createAbstractPath(firstFolderPair_->getValues().folderPathPhraseRight)); - - //itemPath != base folder in this context - if (const Zstring& gdriveUrl = getGoogleDriveFolderUrl(*AFS::getParentPath(itemPath)); //throw FileError - !gdriveUrl.empty()) - return openWithDefaultApp(gdriveUrl); //throw FileError + itemPath = selectionR[0]->getAbstractPath<SelectSide::right>(); } + else + return openFolderInFileBrowser(leftSide ? //throw FileError + createAbstractPath(firstFolderPair_->getValues().folderPathPhraseLeft) : + createAbstractPath(firstFolderPair_->getValues().folderPathPhraseRight)); + + //itemPath != base folder in this context + if (const Zstring& gdriveUrl = getGoogleDriveFolderUrl(*AFS::getParentPath(itemPath)); //throw FileError + !gdriveUrl.empty()) + return openWithDefaultApp(gdriveUrl); //throw FileError + } + std::vector<Zstring> cmdLines; + if (containsFileItemMacro(commandLinePhrase)) + { //regular command evaluation: const size_t invokeCount = selectionL.size() + selectionR.size(); + assert(invokeCount > 0); if (invokeCount > EXT_APP_MASS_INVOKE_THRESHOLD) if (globalCfg_.confirmDlgs.confirmCommandMassInvoke) { @@ -1706,12 +1810,13 @@ void MainDialog::openExternalApplication(const Zstring& commandLinePhrase, bool } std::set<FileDescriptor> nonNativeFiles; - if (contains(commandLinePhrase, Zstr("%local_path%"))) + if (contains(commandLinePhrase, macroNameLocalPath) || + contains(commandLinePhrase, macroNameLocalPaths)) { collectNonNativeFiles<SelectSide::left >(selectionL, tempFileBuf_, nonNativeFiles); collectNonNativeFiles<SelectSide::right>(selectionR, tempFileBuf_, nonNativeFiles); } - if (contains(commandLinePhrase, Zstr("%local_path2%"))) + if (contains(commandLinePhrase, macroNameLocalPath2)) { collectNonNativeFiles<SelectSide::right>(selectionL, tempFileBuf_, nonNativeFiles); collectNonNativeFiles<SelectSide::left >(selectionR, tempFileBuf_, nonNativeFiles); @@ -1735,37 +1840,101 @@ void MainDialog::openExternalApplication(const Zstring& commandLinePhrase, bool globalCfg_.soundFileAlertPending); try { - tempFileBuf_.createTempFiles(nonNativeFiles, statusHandler); //throw AbortProcess + tempFileBuf_.createTempFiles(nonNativeFiles, statusHandler); //throw CancelProcess //"clearSelection" not needed/desired } - catch (AbortProcess&) {} + catch (CancelProcess&) {} - const StatusHandlerTemporaryPanel::Result r = statusHandler.reportResults(); //noexcept + const StatusHandlerTemporaryPanel::Result r = statusHandler.prepareResult(); //noexcept setLastOperationLog(r.summary, r.errorLog.ptr()); - if (r.summary.syncResult == SyncResult::aborted) + if (r.summary.result == TaskResult::cancelled) return; //updateGui(); -> not needed } //######################################################################################## - invokeCommandLine<SelectSide::left >(commandLinePhrase, selectionL, tempFileBuf_); //throw FileError - invokeCommandLine<SelectSide::right>(commandLinePhrase, selectionR, tempFileBuf_); // + std::vector<ItemPathInfo> pathInfos; + append(pathInfos, getItemPathInfo<SelectSide::left >(selectionL, tempFileBuf_)); + append(pathInfos, getItemPathInfo<SelectSide::right>(selectionR, tempFileBuf_)); + + Zstring cmdLineTmp = expandMacros(commandLinePhrase); + + //support path lists for a single command line: https://freefilesync.org/forum/viewtopic.php?t=10328#p39305 + auto replacePathList = [&](const ZstringView macroName, const Zstring ItemPathInfo::*itemPath) + { + const Zstring& macroNameQuoted = Zstring() + Zstr('"') + macroName + Zstr('"'); + if (contains(cmdLineTmp, macroNameQuoted)) + { + Zstring pathList; + for (const ItemPathInfo& pathInfo : pathInfos) + { + if (!pathList.empty()) + pathList += Zstr(' '); + pathList += Zstr('"'); + pathList += pathInfo.*itemPath; + pathList += Zstr('"'); + } + replace(cmdLineTmp, macroNameQuoted, pathList); + } + if (contains(cmdLineTmp, macroName)) + { + Zstring pathList; + for (const ItemPathInfo& pathInfo : pathInfos) + { + if (!pathList.empty()) + pathList += Zstr(' '); + pathList += pathInfo.*itemPath; + } + replace(cmdLineTmp, macroName, pathList); + } + }; + replacePathList(macroNameItemPaths, &ItemPathInfo::itemPath); + replacePathList(macroNameLocalPaths, &ItemPathInfo::localPath); + replacePathList(macroNameItemNames, &ItemPathInfo::itemName); + replacePathList(macroNameParentPaths, &ItemPathInfo::parentPath); + + //generate multiple command lines per each selected item + for (const ItemPathInfo& pathInfo : pathInfos) + if (commandLinePhrase == extCommandOpenDefault.cmdLine) + //not strictly needed, but: 1. better error reporting (Windows) 2. not async => avoid zombies (Linux/macOS) + openWithDefaultApp(pathInfo.localPath); //throw FileError + else + { + Zstring cmdLine = cmdLineTmp; + replace(cmdLine, macroNameItemPath, pathInfo.itemPath); + replace(cmdLine, macroNameItemPath2, pathInfo.itemPath2); + replace(cmdLine, macroNameLocalPath, pathInfo.localPath); + replace(cmdLine, macroNameLocalPath2, pathInfo.localPath2); + replace(cmdLine, macroNameItemName, pathInfo.itemName); + replace(cmdLine, macroNameItemName2, pathInfo.itemName2); + replace(cmdLine, macroNameParentPath, pathInfo.parentPath); + replace(cmdLine, macroNameParentPath2, pathInfo.parentPath2); + + cmdLines.push_back(std::move(cmdLine)); + } + + removeDuplicatesStable(cmdLines); } else - { - const Zstring cmdLine = expandMacros(commandLinePhrase); + cmdLines.push_back(expandMacros(commandLinePhrase)); //add single entry (even if selection is empty!) + + for (const Zstring& cmdLine : cmdLines) try { - if (const auto& [exitCode, output] = consoleExecute(cmdLine, EXT_APP_MAX_TOTAL_WAIT_TIME_MS); //throw SysError, SysErrorTimeOut + std::optional<int> timeoutMs; + if (cmdLines.size() <= EXT_APP_MASS_INVOKE_THRESHOLD) + timeoutMs = EXT_APP_MAX_TOTAL_WAIT_TIME_MS / cmdLines.size(); //run async, but give consoleExecute() some "time to fail" + //else: run synchronously + + if (const auto& [exitCode, output] = consoleExecute(cmdLine, timeoutMs); //throw SysError, SysErrorTimeOut exitCode != 0) throw SysError(formatSystemError(utfTo<std::string>(commandLinePhrase), replaceCpy(_("Exit code %x"), L"%x", numberTo<std::wstring>(exitCode)), utfTo<std::wstring>(output))); } catch (SysErrorTimeOut&) {} //child process not failed yet => probably fine :> catch (const SysError& e) { throw FileError(replaceCpy(_("Command %x failed."), L"%x", fmtPath(cmdLine)), e.toString()); } - } } catch (const FileError& e) { showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } } @@ -2146,6 +2315,14 @@ void MainDialog::onGridKeyEvent(wxKeyEvent& event, Grid& grid, bool leftSide) switch (keyCode) { + case WXK_F2: + case WXK_NUMPAD_F2: + warn_static("finish") +#if 0 + renameSelectedFiles(selectionL, selectionR); +#endif + return; + case WXK_RETURN: case WXK_NUMPAD_ENTER: startSyncForSelecction(selection); @@ -2224,7 +2401,6 @@ void MainDialog::onLocalKeyEvent(wxKeyEvent& event) //process key events without //return; //-> swallow event! case WXK_F11: - warn_static("F11 not working at all on macOS!") setGridViewType(m_bpButtonViewType->isActive() ? GridViewType::difference : GridViewType::action); return; //-> swallow event! @@ -2620,6 +2796,12 @@ void MainDialog::onGridContextRim(const std::vector<FileSystemObject*>& selectio menu.addItem(_("&Copy to...") + L"\tCtrl+T", [&] { copyToAlternateFolder(selectionL, selectionR); }, wxNullImage, haveItemsSelected); //---------------------------------------------------------------------------------------------------- menu.addSeparator(); + + warn_static("finish") +#if 0 + menu.addItem(_("&Rename") + L"\tF2", [&] { renameSelectedFiles(selectionL, selectionR); }, loadImage("rename", getDefaultMenuIconSize()), haveItemsSelected); +#endif + menu.addItem(_("&Delete") + L"\t(Shift+)Del", [&] { deleteSelectedFiles(selectionL, selectionR, true /*moveToRecycler*/); }, imgTrashSmall_, haveItemsSelected); menu.popup(leftSide ? *m_gridMainL : *m_gridMainR, mousePos); @@ -3502,11 +3684,11 @@ void MainDialog::removeSelectedCfgHistoryItems(bool deleteFromDisk) std::vector<Zstring> deletedPaths; try { - deleteListOfFiles(filePaths, deletedPaths, moveToRecycler, globalCfg_.warnDlgs.warnRecyclerMissing, statusHandler); //throw AbortProcess + deleteListOfFiles(filePaths, deletedPaths, moveToRecycler, globalCfg_.warnDlgs.warnRecyclerMissing, statusHandler); //throw CancelProcess } - catch (AbortProcess&) {} + catch (CancelProcess&) {} - const StatusHandlerTemporaryPanel::Result r = statusHandler.reportResults(); //noexcept + const StatusHandlerTemporaryPanel::Result r = statusHandler.prepareResult(); //noexcept setLastOperationLog(r.summary, r.errorLog.ptr()); filePaths = deletedPaths; @@ -4304,11 +4486,11 @@ void MainDialog::onCompare(wxCommandEvent& event) guiCfg.mainCfg.autoRetryDelay, globalCfg_.soundFileAlertPending); - auto requestPassword = [&, password = Zstring()](const std::wstring& msg, const std::wstring& lastErrorMsg) mutable //throw AbortProcess + auto requestPassword = [&, password = Zstring()](const std::wstring& msg, const std::wstring& lastErrorMsg) mutable //throw CancelProcess { assert(runningOnMainThread()); if (showPasswordPrompt(this, msg, lastErrorMsg, password) != ConfirmationButton::accept) - statusHandler.abortProcessNow(AbortTrigger::user); //throw AbortProcess + statusHandler.cancelProcessNow(CancelReason::user); //throw CancelProcess return password; }; @@ -4316,7 +4498,6 @@ void MainDialog::onCompare(wxCommandEvent& event) { //GUI mode: place directory locks on directories isolated(!) during both comparison and synchronization - //COMPARE DIRECTORIES std::unique_ptr<LockHolder> dirLocks; folderCmp_ = compare(globalCfg_.warnDlgs, globalCfg_.fileTimeTolerance, @@ -4325,17 +4506,17 @@ void MainDialog::onCompare(wxCommandEvent& event) globalCfg_.createLockFile, dirLocks, fpCfgList, - statusHandler); //throw AbortProcess + statusHandler); //throw CancelProcess } - catch (AbortProcess&) {} + catch (CancelProcess&) {} - const StatusHandlerTemporaryPanel::Result r = statusHandler.reportResults(); //noexcept + const StatusHandlerTemporaryPanel::Result r = statusHandler.prepareResult(); //noexcept //--------------------------------------------------------------------------- setLastOperationLog(r.summary, r.errorLog.ptr()); - errorLogPrepSync_ = r.errorLog.ref(); + fullSyncLog_ = {r.errorLog.ref(), r.summary.startTime, r.summary.totalTime}; - if (r.summary.syncResult == SyncResult::aborted) + if (r.summary.result == TaskResult::cancelled) return updateGui(); //refresh grid in ANY case! (also on abort) @@ -4364,7 +4545,7 @@ void MainDialog::onCompare(wxCommandEvent& event) } //mark selected cfg files as "in sync" when there is nothing to do: https://freefilesync.org/forum/viewtopic.php?t=4991 - if (r.summary.syncResult == SyncResult::finishedSuccess) + if (r.summary.result == TaskResult::success) if (getCUD(SyncStatistics(folderCmp_)) == 0) { setStatusInfo(_("No files to synchronize"), true /*highlight*/); //user might be AFK: don't flashStatusInfo() @@ -4439,7 +4620,7 @@ void MainDialog::clearGrid(ptrdiff_t pos) } if (folderCmp_.empty()) - errorLogPrepSync_.clear(); + fullSyncLog_.reset(); filegrid::setData(*m_gridMainC, folderCmp_); treegrid::setData(*m_gridOverview, folderCmp_); @@ -4545,66 +4726,121 @@ void MainDialog::onStartSync(wxCommandEvent& event) }; - using FinalRequest = StatusHandlerFloatingDialog::FinalRequest; - FinalRequest finalRequest = FinalRequest::none; + disableGuiElements(false /*enableAbort*/); //StatusHandlerFloatingDialog will internally process Window messages, so avoid unexpected callbacks! + ZEN_ON_SCOPE_EXIT(enableGuiElements()); //run AFTER StatusHandlerFloatingDialog::showResult() + + //class handling status updates and error messages + StatusHandlerFloatingDialog statusHandler(this, getJobNames(), syncStartTime, + guiCfg.mainCfg.ignoreErrors, + guiCfg.mainCfg.autoRetryCount, + guiCfg.mainCfg.autoRetryDelay, + globalCfg_.soundFileSyncFinished, + globalCfg_.soundFileAlertPending, + progressDim, + globalCfg_.progressDlgAutoClose); + try { - disableGuiElements(false /*enableAbort*/); //StatusHandlerFloatingDialog will internally process Window messages, so avoid unexpected callbacks! - ZEN_ON_SCOPE_EXIT(enableGuiElements()); - //run this->enableGuiElements() BEFORE "finalRequest" buf AFTER StatusHandlerFloatingDialog::reportResults() + //PERF_START; - //class handling status updates and error messages - StatusHandlerFloatingDialog statusHandler(this, getJobNames(), syncStartTime, - guiCfg.mainCfg.ignoreErrors, - guiCfg.mainCfg.autoRetryCount, - guiCfg.mainCfg.autoRetryDelay, - globalCfg_.soundFileSyncFinished, - globalCfg_.soundFileAlertPending, - progressDim, - globalCfg_.progressDlgAutoClose, - std::exchange(errorLogPrepSync_, {})); //"consume" comparison's error log during sync - try + //let's report here rather than before comparison (user might have changed global settings in the meantime!) + logNonDefaultSettings(globalCfg_, statusHandler); //throw CancelProcess + + //wxBusyCursor dummy; -> redundant: progress already shown in progress dialog! + + //GUI mode: end directory lock lifetime after comparion and start new locking right before sync + std::unique_ptr<LockHolder> dirLocks; + if (globalCfg_.createLockFile) { - //PERF_START; + std::set<Zstring> folderPathsToLock; + for (auto it = begin(folderCmp_); it != end(folderCmp_); ++it) + { + if (it->getFolderStatus<SelectSide::left>() == BaseFolderStatus::existing) //do NOT check directory existence again! + if (const Zstring& nativePath = getNativeItemPath(it->getAbstractPath<SelectSide::left>()); //restrict directory locking to native paths until further + !nativePath.empty()) + folderPathsToLock.insert(nativePath); + + if (it->getFolderStatus<SelectSide::right>() == BaseFolderStatus::existing) + if (const Zstring& nativePath = getNativeItemPath(it->getAbstractPath<SelectSide::right>()); + !nativePath.empty()) + folderPathsToLock.insert(nativePath); + } + dirLocks = std::make_unique<LockHolder>(folderPathsToLock, globalCfg_.warnDlgs.warnDirectoryLockFailed, statusHandler); //throw CancelProcess + } - //let's report here rather than before comparison (user might have changed global settings in the meantime!) - logNonDefaultSettings(globalCfg_, statusHandler); //throw AbortProcess + synchronize(syncStartTime, + globalCfg_.verifyFileCopy, + globalCfg_.copyLockedFiles, + globalCfg_.copyFilePermissions, + globalCfg_.failSafeFileCopy, + globalCfg_.runWithBackgroundPriority, + extractSyncCfg(guiCfg.mainCfg), + folderCmp_, + globalCfg_.warnDlgs, + statusHandler); //throw CancelProcess + } + catch (CancelProcess&) { assert(statusHandler.taskCancelled() == CancelReason::user); } - //wxBusyCursor dummy; -> redundant: progress already shown in progress dialog! + //------------------------------------------------------------------- + StatusHandlerFloatingDialog::Result r = statusHandler.prepareResult(); - //GUI mode: end directory lock lifetime after comparion and start new locking right before sync - std::unique_ptr<LockHolder> dirLocks; - if (globalCfg_.createLockFile) - { - std::set<Zstring> folderPathsToLock; - for (auto it = begin(folderCmp_); it != end(folderCmp_); ++it) + //merge logs of comparison, manual operations, sync + append(fullSyncLog_->log, r.errorLog.ref()); + fullSyncLog_->totalTime += r.summary.totalTime; + + + if (statusHandler.taskCancelled()) + /* user cancelled => don't run post sync command + => don't send email notification + => don't save log file (=> treat sync attempt like a manual operation) + => don't update last sync stats for the selected cfg files + => don't play sound notification + => don't run post sync action */ + assert(statusHandler.taskCancelled() == CancelReason::user); //"stop on first error" is only for ffs_batch + else + { + //"consume" fullSyncLog_, but don't reset: there may be items remaining for manual operations or re-sync! + ProcessSummary fullSummary = r.summary; + fullSummary.startTime = std::exchange(fullSyncLog_->startTime, std::chrono::system_clock::now()); + fullSummary.totalTime = std::exchange(fullSyncLog_->totalTime, {}); + //let's *not* redetermine "ProcessSummary::result", even if errors occured during manual operations! + + ErrorLog fullLog = std::exchange(fullSyncLog_->log, {}); + + auto logMsg2 =[&](const std::wstring& msg, MessageType type) + { + logMsg(fullLog, msg, type); + logMsg(r.errorLog.ref(), msg, type); + }; + + auto notifyStatusNoThrow = [&](std::wstring&& msg) { try { statusHandler.updateStatus(std::move(msg)); /*throw CancelProcess*/ } catch (CancelProcess&) {} }; + + //--------------------- post sync command ---------------------- + if (const Zstring cmdLine = trimCpy(expandMacros(guiCfg.mainCfg.postSyncCommand)); + !cmdLine.empty()) + if (guiCfg.mainCfg.postSyncCondition == PostSyncCondition::completion || + (guiCfg.mainCfg.postSyncCondition == PostSyncCondition::errors) == (r.summary.result == TaskResult::cancelled || + r.summary.result == TaskResult::error)) + try { - if (it->getFolderStatus<SelectSide::left>() == BaseFolderStatus::existing) //do NOT check directory existence again! - if (const Zstring& nativePath = getNativeItemPath(it->getAbstractPath<SelectSide::left>()); //restrict directory locking to native paths until further - !nativePath.empty()) - folderPathsToLock.insert(nativePath); - - if (it->getFolderStatus<SelectSide::right>() == BaseFolderStatus::existing) - if (const Zstring& nativePath = getNativeItemPath(it->getAbstractPath<SelectSide::right>()); - !nativePath.empty()) - folderPathsToLock.insert(nativePath); - } - dirLocks = std::make_unique<LockHolder>(folderPathsToLock, globalCfg_.warnDlgs.warnDirectoryLockFailed, statusHandler); //throw AbortProcess - } + //give consoleExecute() some "time to fail", but not too long to hang our process + const int DEFAULT_APP_TIMEOUT_MS = 100; - //START SYNCHRONIZATION - synchronize(syncStartTime, - globalCfg_.verifyFileCopy, - globalCfg_.copyLockedFiles, - globalCfg_.copyFilePermissions, - globalCfg_.failSafeFileCopy, - globalCfg_.runWithBackgroundPriority, - extractSyncCfg(guiCfg.mainCfg), - folderCmp_, - globalCfg_.warnDlgs, - statusHandler); //throw AbortProcess - } - catch (AbortProcess&) {} + if (const auto& [exitCode, output] = consoleExecute(cmdLine, DEFAULT_APP_TIMEOUT_MS); //throw SysError, SysErrorTimeOut + exitCode != 0) + throw SysError(formatSystemError("", replaceCpy(_("Exit code %x"), L"%x", numberTo<std::wstring>(exitCode)), utfTo<std::wstring>(output))); + + logMsg2(_("Executing command:") + L' ' + utfTo<std::wstring>(cmdLine) + L" [" + replaceCpy(_("Exit code %x"), L"%x", L"0") + L']', MSG_TYPE_INFO); + } + catch (SysErrorTimeOut&) //child process not failed yet => probably fine :> + { + logMsg2(_("Executing command:") + L' ' + utfTo<std::wstring>(cmdLine), MSG_TYPE_INFO); + } + catch (const SysError& e) + { + logMsg2(replaceCpy(_("Command %x failed."), L"%x", fmtPath(cmdLine)) + L"\n\n" + e.toString(), MSG_TYPE_ERROR); + } + //--------------------- email notification ---------------------- AbstractPath logFolderPath = createAbstractPath(guiCfg.mainCfg.altLogFolderPathPhrase); //optional if (AFS::isNullPath(logFolderPath)) logFolderPath = createAbstractPath(globalCfg_.logFolderPhrase); @@ -4612,57 +4848,96 @@ void MainDialog::onStartSync(wxCommandEvent& event) if (AFS::isNullPath(logFolderPath)) logFolderPath = createAbstractPath(getLogFolderDefaultPath()); - StatusHandlerFloatingDialog::Result r = statusHandler.reportResults(guiCfg.mainCfg.postSyncCommand, guiCfg.mainCfg.postSyncCondition, - logFolderPath, globalCfg_.logfilesMaxAgeDays, globalCfg_.logFormat, logFilePathsToKeep, - guiCfg.mainCfg.emailNotifyAddress, guiCfg.mainCfg.emailNotifyCondition); //noexcept - //--------------------------------------------------------------------------- - setLastOperationLog(r.summary, r.errorLog.ptr()); + AbstractPath logFilePath = AFS::appendRelPath(logFolderPath, generateLogFileName(globalCfg_.logFormat, fullSummary)); + //e.g. %AppData%\FreeFileSync\Logs\Backup FreeFileSync 2013-09-15 015052.123 [Error].log + + if (const std::string notifyEmail = trimCpy(guiCfg.mainCfg.emailNotifyAddress); + !notifyEmail.empty()) + if (guiCfg.mainCfg.emailNotifyCondition == ResultsNotification::always || + (guiCfg.mainCfg.emailNotifyCondition == ResultsNotification::errorWarning && (fullSummary.result == TaskResult::cancelled || + fullSummary.result == TaskResult::error || + fullSummary.result == TaskResult::warning)) || + (guiCfg.mainCfg.emailNotifyCondition == ResultsNotification::errorOnly && (fullSummary.result == TaskResult::cancelled || + fullSummary.result == TaskResult::error))) + try + { + logMsg2(replaceCpy(_("Sending email notification to %x"), L"%x", utfTo<std::wstring>(notifyEmail)), MSG_TYPE_INFO); + sendLogAsEmail(notifyEmail, fullSummary, fullLog, logFilePath, notifyStatusNoThrow); //throw FileError + } + catch (const FileError& e) { logMsg2(e.toString(), MSG_TYPE_ERROR); } + + //--------------------- save log file ---------------------- + try //create not before destruction: 1. avoid issues with FFS trying to sync open log file 2. include status in log file name without extra rename + { + //do NOT use tryReportingError()! saving log files should not be cancellable! + saveLogFile(logFilePath, fullSummary, fullLog, globalCfg_.logfilesMaxAgeDays, globalCfg_.logFormat, logFilePathsToKeep, notifyStatusNoThrow); //throw FileError + } + catch (const FileError& e) + { + logMsg2(e.toString(), MSG_TYPE_ERROR); - globalCfg_.progressDlgAutoClose = r.autoCloseDialog; - globalCfg_.dpiLayouts[getDpiScalePercent()].progressDlg.size = r.dlgDim.size; - globalCfg_.dpiLayouts[getDpiScalePercent()].progressDlg.isMaximized = r.dlgDim.isMaximized; + const AbstractPath logFileDefaultPath = AFS::appendRelPath(createAbstractPath(getLogFolderDefaultPath()), generateLogFileName(globalCfg_.logFormat, fullSummary)); + if (logFilePath != logFileDefaultPath) //fallback: log file *must* be saved no matter what! + try + { + logFilePath = logFileDefaultPath; + saveLogFile(logFileDefaultPath, fullSummary, fullLog, globalCfg_.logfilesMaxAgeDays, globalCfg_.logFormat, logFilePathsToKeep, notifyStatusNoThrow); //throw FileError + } + catch (const FileError& e2) { logMsg2(e2.toString(), MSG_TYPE_ERROR); assert(false); } //should never happen!!! + } + + //--------- update last sync stats for the selected cfg files --------- + const ErrorLogStats& fullLogStats = getStats(fullLog); - //update last sync stats for the selected cfg files - const ErrorLogStats& logStats = getStats(r.errorLog.ref()); cfggrid::getDataView(*m_gridCfgHistory).setLastRunStats(activeConfigFiles_, { - r.logFilePath, - std::chrono::system_clock::to_time_t(r.summary.startTime), - r.summary.syncResult, - r.summary.statsProcessed.items, - r.summary.statsProcessed.bytes, - r.summary.totalTime, - logStats.error, - logStats.warning, + logFilePath, + std::chrono::system_clock::to_time_t(fullSummary.startTime), + fullSummary.result, + fullSummary.statsProcessed.items, + fullSummary.statsProcessed.bytes, + fullSummary.totalTime, + fullLogStats.error, + fullLogStats.warning, }); //re-apply selection: sort order changed if sorted by last sync time cfggrid::addAndSelect(*m_gridCfgHistory, activeConfigFiles_, false /*scrollToSelection*/); //m_gridCfgHistory->Refresh(); <- implicit in last call + } + //--------------------------------------------------------------------------- + setLastOperationLog(r.summary, r.errorLog.ptr()); - //remove empty rows: just a beautification, invalid rows shouldn't cause issues - filegrid::getDataView(*m_gridMainC).removeInvalidRows(); + //remove empty rows: just a beautification, invalid rows shouldn't cause issues + filegrid::getDataView(*m_gridMainC).removeInvalidRows(); - updateGui(); + updateGui(); - finalRequest = r.finalRequest; - } + //--------------------------------------------------------------------------- + const StatusHandlerFloatingDialog::DlgOptions dlgOpt = statusHandler.showResult(); + + globalCfg_.progressDlgAutoClose = dlgOpt.autoCloseSelected; + globalCfg_.dpiLayouts[getDpiScalePercent()].progressDlg.size = dlgOpt.dim.size; //=> ignore dim.pos + globalCfg_.dpiLayouts[getDpiScalePercent()].progressDlg.isMaximized = dlgOpt.dim.isMaximized; //--------------------------------------------------------------------------- - switch (finalRequest) + //run shutdown *after* last sync stats were updated! they will be saved via onBeforeSystemShutdownCookie_: https://freefilesync.org/forum/viewtopic.php?t=5761 + using FinalRequest = StatusHandlerFloatingDialog::FinalRequest; + switch (dlgOpt.finalRequest) { case FinalRequest::none: break; + case FinalRequest::exit: - Destroy(); //don't use Close(): we don't want to show the prompt to save current config in onClose() + Destroy(); //don't use Close() which prompts to save current config in onClose() break; - case FinalRequest::shutdown: //run *after* last sync stats were updated and saved! https://freefilesync.org/forum/viewtopic.php?t=5761 + + case FinalRequest::shutdown: try { shutdownSystem(); //throw FileError terminateProcess(static_cast<int>(FfsExitCode::success)); - //1. no point in continuing and saving cfg again in ~MainDialog()/onBeforeSystemShutdown() while the OS will kill us anytime! - //2. is seems wxEVT_END_SESSION is not implemented on wxGTK anyway! + //no point in continuing and saving cfg again in ~MainDialog()/onBeforeSystemShutdown() while the OS will kill us any time! } catch (const FileError& e) { showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } //[!] ignores current error handling setting, BUT this is not a sync error! @@ -4799,11 +5074,10 @@ void MainDialog::startSyncForSelecction(const std::vector<FileSystemObject*>& se try { //let's report here rather than before comparison (user might have changed global settings in the meantime!) - logNonDefaultSettings(globalCfg_, statusHandler); //throw AbortProcess + logNonDefaultSettings(globalCfg_, statusHandler); //throw CancelProcess //LockHolder? => let's go without; same behavior as manual deletion - //START SYNCHRONIZATION synchronize(syncStartTime, globalCfg_.verifyFileCopy, globalCfg_.copyLockedFiles, @@ -4813,15 +5087,16 @@ void MainDialog::startSyncForSelecction(const std::vector<FileSystemObject*>& se fpCfgSelect, folderCmpSelect, globalCfg_.warnDlgs, - statusHandler); //throw AbortProcess + statusHandler); //throw CancelProcess } - catch (AbortProcess&) {} + catch (CancelProcess&) {} - const StatusHandlerTemporaryPanel::Result r = statusHandler.reportResults(); //noexcept + const StatusHandlerTemporaryPanel::Result r = statusHandler.prepareResult(); //noexcept setLastOperationLog(r.summary, r.errorLog.ptr()); - append(errorLogPrepSync_, r.errorLog.ref()); + append(fullSyncLog_->log, r.errorLog.ref()); + fullSyncLog_->totalTime += r.summary.totalTime; } //run updateGui() *after* reverting our temporary exclusions @@ -4836,14 +5111,14 @@ void MainDialog::setLastOperationLog(const ProcessSummary& summary, const std::s { const wxImage syncResultImage = [&] { - switch (summary.syncResult) + switch (summary.result) { - case SyncResult::finishedSuccess: + case TaskResult::success: return loadImage("result_success"); - case SyncResult::finishedWarning: + case TaskResult::warning: return loadImage("result_warning"); - case SyncResult::finishedError: - case SyncResult::aborted: + case TaskResult::error: + case TaskResult::cancelled: return loadImage("result_error"); } assert(false); @@ -4867,7 +5142,7 @@ void MainDialog::setLastOperationLog(const ProcessSummary& summary, const std::s }(); setImage(*m_bitmapSyncResult, syncResultImage); - m_staticTextSyncResult->SetLabelText(getSyncResultLabel(summary.syncResult)); + m_staticTextSyncResult->SetLabelText(getSyncResultLabel(summary.result)); m_staticTextItemsProcessed->SetLabelText(formatNumber(summary.statsProcessed.items)); @@ -5077,11 +5352,11 @@ void MainDialog::swapSides() { statusHandler.initNewPhase(-1, -1, ProcessPhase::none); swapGrids(getConfig().mainCfg, folderCmp_, - statusHandler); //throw AbortProcess + statusHandler); //throw CancelProcess } - catch (AbortProcess&) {} + catch (CancelProcess&) {} - const StatusHandlerTemporaryPanel::Result r = statusHandler.reportResults(); //noexcept + const StatusHandlerTemporaryPanel::Result r = statusHandler.prepareResult(); //noexcept setLastOperationLog(r.summary, r.errorLog.ptr()); } @@ -5318,11 +5593,11 @@ void MainDialog::applySyncDirections() { statusHandler.initNewPhase(-1, -1, ProcessPhase::none); redetermineSyncDirection(directCfgs, - statusHandler); //throw AbortProcess + statusHandler); //throw CancelProcess } - catch (AbortProcess&) {} + catch (CancelProcess&) {} - const StatusHandlerTemporaryPanel::Result r = statusHandler.reportResults(); //noexcept + const StatusHandlerTemporaryPanel::Result r = statusHandler.prepareResult(); //noexcept setLastOperationLog(r.summary, r.errorLog.ptr()); } @@ -5871,7 +6146,7 @@ void MainDialog::onMenuExportFileList(wxCommandEvent& event) const Zstring shortGuid = printNumber<Zstring>(Zstr("%04x"), static_cast<unsigned int>(getCrc16(generateGUID()))); const Zstring csvFilePath = appendPath(tempFileBuf_.getAndCreateFolderPath(), //throw FileError - title + Zstr("~") + shortGuid + Zstr(".csv")); + title + Zstr('~') + shortGuid + Zstr(".csv")); const Zstring tmpFilePath = getPathWithTempName(csvFilePath); @@ -5899,9 +6174,8 @@ void MainDialog::onMenuExportFileList(wxCommandEvent& event) tmpFile.finalize(); //throw FileError //take over ownership: - ZEN_ON_SCOPE_FAIL( try { removeFilePlain(tmpFilePath); /*throw FileError*/ } - catch (FileError&) {}); - warn_static("log it!") + ZEN_ON_SCOPE_FAIL( try { removeFilePlain(tmpFilePath); } + catch (const FileError& e) { logExtraError(e.toString()); }); //operation finished: move temp file transactionally moveAndRenameItem(tmpFilePath, csvFilePath, true /*replaceExisting*/); //throw FileError, (ErrorMoveUnsupported), (ErrorTargetExisting) @@ -5938,7 +6212,7 @@ void MainDialog::onMenuCheckVersionAutomatically(wxCommandEvent& event) flashStatusInfo(_("Searching for program updates...")); //synchronous update check is sufficient here: automaticUpdateCheckEval(*this, globalCfg_.lastUpdateCheck, globalCfg_.lastOnlineVersion, - automaticUpdateCheckRunAsync(automaticUpdateCheckPrepare(*this).get()).get()); + automaticUpdateCheckRunAsync(automaticUpdateCheckPrepare(*this).ref()).ref()); } } @@ -5968,13 +6242,13 @@ void MainDialog::onStartupUpdateCheck(wxIdleEvent& event) { flashStatusInfo(_("Searching for program updates...")); - std::shared_ptr<const UpdateCheckResultPrep> resultPrep = automaticUpdateCheckPrepare(*this); //run on main thread: + SharedRef<const UpdateCheckResultPrep> resultPrep = automaticUpdateCheckPrepare(*this); //run on main thread: - guiQueue_.processAsync([resultPrep] { return automaticUpdateCheckRunAsync(resultPrep.get()); }, //run on worker thread: (long-running part of the check) - [this, showNewVersionReminder] (std::shared_ptr<const UpdateCheckResult>&& resultAsync) + guiQueue_.processAsync([resultPrep] { return automaticUpdateCheckRunAsync(resultPrep.ref()); }, //run on worker thread: (long-running part of the check) + [this, showNewVersionReminder] (SharedRef<const UpdateCheckResult>&& resultAsync) { automaticUpdateCheckEval(*this, globalCfg_.lastUpdateCheck, globalCfg_.lastOnlineVersion, - resultAsync.get()); //run on main thread: + resultAsync.ref()); //run on main thread: showNewVersionReminder(); }); } diff --git a/FreeFileSync/Source/ui/main_dlg.h b/FreeFileSync/Source/ui/main_dlg.h index 67a498e9..a8759173 100644 --- a/FreeFileSync/Source/ui/main_dlg.h +++ b/FreeFileSync/Source/ui/main_dlg.h @@ -125,6 +125,9 @@ private: void deleteSelectedFiles(const std::vector<FileSystemObject*>& selectionL, const std::vector<FileSystemObject*>& selectionR, bool moveToRecycler); + void renameSelectedFiles(const std::vector<FileSystemObject*>& selectionL, + const std::vector<FileSystemObject*>& selectionR); + void openExternalApplication(const Zstring& commandLinePhrase, bool leftSide, const std::vector<FileSystemObject*>& selectionL, const std::vector<FileSystemObject*>& selectionR); //selection may be empty @@ -308,9 +311,15 @@ private: //the prime data structure of this tool *bling*: FolderComparison folderCmp_; //optional!: sync button not available if empty - zen::ErrorLog errorLogPrepSync_; //prepend to sync log (e.g. comparison, manual interactions) - warn_static("errorLogPrepSync_ good idea? What about perf stats!? aggregate as well? https://freefilesync.org/forum/viewtopic.php?t=9022&p=38885#p38885") - warn_static("should logged errors impact the overall sync state!?") + + //merge logs of individual steps (comparison, manual operations, sync) into a combined result (just as for ffs_batch jobs) + struct FullSyncLog + { + zen::ErrorLog log; + std::chrono::system_clock::time_point startTime; + std::chrono::milliseconds totalTime{}; + }; + std::optional<FullSyncLog> fullSyncLog_; //folder pairs: std::unique_ptr<FolderPairFirst> firstFolderPair_; //always bound!!! diff --git a/FreeFileSync/Source/ui/progress_indicator.cpp b/FreeFileSync/Source/ui/progress_indicator.cpp index c1b5c768..8aaa5b22 100644 --- a/FreeFileSync/Source/ui/progress_indicator.cpp +++ b/FreeFileSync/Source/ui/progress_indicator.cpp @@ -65,18 +65,18 @@ std::wstring getDialogPhaseText(const Statistics& syncStat, bool paused) if (paused) return _("Paused"); - if (syncStat.getAbortStatus()) + if (syncStat.taskCancelled()) return _("Stop requested..."); switch (syncStat.currentPhase()) { case ProcessPhase::none: return _("Initializing..."); //dialog is shown *before* sync starts, so this text may be visible! - case ProcessPhase::scanning: + case ProcessPhase::scan: return _("Scanning..."); - case ProcessPhase::comparingContent: + case ProcessPhase::binaryCompare: return _("Comparing content..."); - case ProcessPhase::synchronizing: + case ProcessPhase::sync: return _("Synchronizing..."); } assert(false); @@ -198,7 +198,7 @@ CompareProgressPanel::Impl::Impl(wxFrame& parentWindow) : setImage(*m_bitmapIgnoreErrors, loadImage("error_ignore_active", getDefaultMenuIconSize())); setImage(*m_bitmapRetryErrors, loadImage("error_retry", getDefaultMenuIconSize())); - //make sure standard height matches ProcessPhase::comparingContent statistics layout (== largest) + //make sure standard height matches ProcessPhase::binaryCompare statistics layout (== largest) //init graph m_panelProgressGraph->setAttributes(Graph2D::MainAttributes().setMinY(0).setMaxY(2). @@ -273,7 +273,7 @@ void CompareProgressPanel::Impl::initNewPhase() const bool haveTotalStats = itemsTotal >= 0 || bytesTotal >= 0; - if (taskbar_.get()) taskbar_->setStatus(haveTotalStats ? Taskbar::STATUS_NORMAL : Taskbar::STATUS_INDETERMINATE); + if (taskbar_.get()) taskbar_->setStatus(haveTotalStats ? Taskbar::Status::normal : Taskbar::Status::indeterminate); m_staticTextProcessed ->Show(haveTotalStats); m_staticTextRemaining ->Show(haveTotalStats); @@ -325,10 +325,10 @@ void CompareProgressPanel::Impl::updateProgressGui() if (!haveTotalStats) { //dialog caption, taskbar - setTitle(formatNumber(itemsCurrent) + SPACED_DASH + getDialogPhaseText(*syncStat_, false /*paused*/)); + setTitle(formatNumber(itemsCurrent) + L' ' + getDialogPhaseText(*syncStat_, false /*paused*/)); //progress indicators - //taskbar_ already set to STATUS_INDETERMINATE within initNewPhase() + //taskbar_ already set to STATUS_INDETERMINATE by initNewPhase() } else { @@ -491,7 +491,7 @@ private: return {}; /* //report some additional width by 5% elapsed time to make graph recalibrate before hitting the right border - //caveat: graph for batch mode binary comparison does NOT start at elapsed time 0!! ProcessPhase::comparingContent and ProcessPhase::synchronizing! + //caveat: graph for batch mode binary comparison does NOT start at elapsed time 0!! ProcessPhase::binaryCompare and ProcessPhase::sync! //=> consider width of current sample set! upperEndMs += 0.05 *(upperEndMs - samples.begin()->first); */ @@ -671,7 +671,7 @@ class SyncProgressDialogImpl : public TopLevelDialog, public SyncProgressDialog public: SyncProgressDialogImpl(long style, //wxFrame/wxDialog style const WindowLayout::Dimensions& dim, - const std::function<void()>& userRequestAbort, + const std::function<void()>& userRequestCancel, const Statistics& syncStat, wxFrame* parentFrame, bool showProgress, @@ -680,12 +680,12 @@ public: time_t syncStartTime, bool ignoreErrors, size_t autoRetryCount, - PostSyncAction2 postSyncAction); + PostSyncAction postSyncAction); - Result destroy(bool autoClose, bool restoreParentFrame, SyncResult syncResult, const SharedRef<const zen::ErrorLog>& log) override; + Result destroy(bool autoClose, bool restoreParentFrame, TaskResult syncResult, const SharedRef<const zen::ErrorLog>& log) override; wxWindow* getWindowIfVisible() override { return this->IsShown() ? this : nullptr; } - //workaround OS X bug: if "this" is used as parent window for a modal dialog then this dialog will erroneously un-hide its parent! + //workaround macOS bug: if "this" is used as parent window for a modal dialog then this dialog will erroneously un-hide its parent! void initNewPhase () override; void notifyProgressChange() override; @@ -693,7 +693,7 @@ public: bool getOptionIgnoreErrors() const override { return ignoreErrors_; } void setOptionIgnoreErrors(bool ignoreErrors) override { ignoreErrors_ = ignoreErrors; updateStaticGui(); } - PostSyncAction2 getOptionPostSyncAction() const override { return getEnumVal(enumPostSyncAction_, *pnl_.m_choicePostSyncAction); } + PostSyncAction getOptionPostSyncAction() const override { return getEnumVal(enumPostSyncAction_, *pnl_.m_choicePostSyncAction); } bool getOptionAutoCloseDialog() const override { return pnl_.m_checkBoxAutoClose->GetValue(); } void timerSetStatus(bool active) override @@ -721,7 +721,7 @@ private: void onIconize(wxIconizeEvent& event); //void onToggleIgnoreErrors(wxCommandEvent& event) { updateStaticGui(); } - void showSummary(SyncResult syncResult, const SharedRef<const ErrorLog>& log); + void showSummary(TaskResult syncResult, const SharedRef<const ErrorLog>& log); void minimizeToTray(); void resumeFromSystray(bool userRequested); @@ -769,14 +769,14 @@ private: std::unique_ptr<Taskbar> taskbar_; bool ignoreErrors_ = false; - EnumDescrList<PostSyncAction2> enumPostSyncAction_; + EnumDescrList<PostSyncAction> enumPostSyncAction_; }; template <class TopLevelDialog> SyncProgressDialogImpl<TopLevelDialog>::SyncProgressDialogImpl(long style, //wxFrame/wxDialog style const WindowLayout::Dimensions& dim, - const std::function<void()>& userRequestAbort, + const std::function<void()>& userRequestCancel, const Statistics& syncStat, wxFrame* parentFrame, bool showProgress, @@ -785,7 +785,7 @@ SyncProgressDialogImpl<TopLevelDialog>::SyncProgressDialogImpl(long style, //wxF time_t syncStartTime, bool ignoreErrors, size_t autoRetryCount, - PostSyncAction2 postSyncAction) : + PostSyncAction postSyncAction) : TopLevelDialog(parentFrame, wxID_ANY, wxString(), wxDefaultPosition, wxDefaultSize, style), //title is overwritten anyway in setExternalStatus() pnl_(*new SyncProgressPanelGenerated(this)), //ownership passed to "this" syncStartTime_(getLocalTime(syncStartTime)), //returns TimeComp() on error @@ -802,7 +802,7 @@ SyncProgressDialogImpl<TopLevelDialog>::SyncProgressDialogImpl(long style, //wxF } ()), parentFrame_(parentFrame), -userRequestAbort_(userRequestAbort), +userRequestAbort_(userRequestCancel), syncStat_(&syncStat) { static_assert(std::is_same_v<TopLevelDialog, wxFrame > || @@ -833,6 +833,7 @@ syncStat_(&syncStat) assert(pnl_.m_buttonClose->GetId() == wxID_OK); //we cannot use wxID_CLOSE else ESC key won't work: yet another wxWidgets bug?? setRelativeFontSize(*pnl_.m_staticTextPhase, 1.5); + setRelativeFontSize(*pnl_.m_staticTextPercentTotal, 1.5); if (parentFrame_) parentTitleBackup_ = parentFrame_->GetTitle(); //save old title (will be used as progress indicator) @@ -905,11 +906,11 @@ syncStat_(&syncStat) //allow changing a few options dynamically during sync ignoreErrors_ = ignoreErrors; - enumPostSyncAction_.add(PostSyncAction2::none, L""); + enumPostSyncAction_.add(PostSyncAction::none, L""); if (parentFrame_) //enable EXIT option for gui mode sync - enumPostSyncAction_.add(PostSyncAction2::exit, wxControl::RemoveMnemonics(_("E&xit"))); //reuse label translation - enumPostSyncAction_.add(PostSyncAction2::sleep, _("System: Sleep")); - enumPostSyncAction_.add(PostSyncAction2::shutdown, _("System: Shut down")); + enumPostSyncAction_.add(PostSyncAction::exit, wxControl::RemoveMnemonics(_("E&xit"))); //reuse label translation + enumPostSyncAction_.add(PostSyncAction::sleep, _("System: Sleep")); + enumPostSyncAction_.add(PostSyncAction::shutdown, _("System: Shut down")); setEnumVal(enumPostSyncAction_, *pnl_.m_choicePostSyncAction, postSyncAction); @@ -917,7 +918,7 @@ syncStat_(&syncStat) updateStaticGui(); //null-status will be shown while waiting for dir locks - //make sure that standard height matches ProcessPhase::comparingContent statistics layout (== largest) + //make sure that standard height matches ProcessPhase::binaryCompare statistics layout (== largest) this->GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() #ifdef __WXGTK3__ @@ -1023,14 +1024,14 @@ namespace template <class TopLevelDialog> -void SyncProgressDialogImpl<TopLevelDialog>::setExternalStatus(const wxString& statusTxt, const wxString& progress) //progress may be empty! +void SyncProgressDialogImpl<TopLevelDialog>::setExternalStatus(const wxString& status, const wxString& progress) //progress may be empty! { //sys tray: order "top-down": jobname, status, progress wxString tooltip = L"FreeFileSync"; if (!jobName_.empty()) tooltip += SPACED_DASH + jobName_; - tooltip += L'\n' + statusTxt; + tooltip += L'\n' + status; if (!progress.empty()) tooltip += L' ' + progress; @@ -1040,11 +1041,12 @@ void SyncProgressDialogImpl<TopLevelDialog>::setExternalStatus(const wxString& s if (!progress.empty()) title += progress + L' '; - title += statusTxt; + title += status; - if (!jobName_.empty()) + if (!jobName_.empty() && !parentFrame_ /*job name already visible in sync config panel, unlike with batch jobs*/) title += SPACED_DASH + jobName_; +#if 0 //why again does start time have to be visible in the titel!? const Zchar* format = [&tc = syncStartTime_] { if (const TimeComp& tcNow = getLocalTime(); @@ -1055,7 +1057,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::setExternalStatus(const wxString& s return formatDateTimeTag; }(); title += SPACED_DASH + utfTo<std::wstring>(formatTime(format, syncStartTime_)); - +#endif //--------------------------------------------------------------------------- //systray tooltip, if window is minimized @@ -1082,11 +1084,10 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateProgressGui(bool allowYield) //normally we don't update the "static" GUI components here, but we have to make an exception //if sync is cancelled (by user or error handling option) - if (syncStat_->getAbortStatus()) + if (syncStat_->taskCancelled()) updateStaticGui(); //called more than once after cancel... ok - bool layoutChanged = false; //avoid screen flicker by calling layout() only if necessary const std::chrono::nanoseconds timeElapsed = stopWatch_.elapsed(); const double timeElapsedDouble = std::chrono::duration<double>(timeElapsed).count(); @@ -1097,6 +1098,8 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateProgressGui(bool allowYield) const bool haveTotalStats = itemsTotal >= 0 || bytesTotal >= 0; + bool headerLayoutChanged = false; + //status texts setText(*pnl_.m_staticTextStatus, replaceCpy(syncStat_->currentStatusText(), L'\n', L' ')); //no layout update for status texts! @@ -1106,8 +1109,10 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateProgressGui(bool allowYield) setExternalStatus(getDialogPhaseText(*syncStat_, paused_), formatNumber(itemsCurrent)); //status text may be "paused"! //progress indicators - if (trayIcon_.get()) trayIcon_->setProgress(1); //100% = regular FFS logo - //taskbar_ already set to STATUS_INDETERMINATE within initNewPhase() + setText(*pnl_.m_staticTextPercentTotal, L"", &headerLayoutChanged); + + if (trayIcon_.get()) trayIcon_->setProgress(1); //100% = fully visible FFS logo + //taskbar_ already set to STATUS_INDETERMINATE by initNewPhase() } else { @@ -1116,9 +1121,13 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateProgressGui(bool allowYield) const double fractionTotal = bytesTotal + itemsTotal == 0 ? 0 : 1.0 * (bytesCurrent + itemsCurrent) / (bytesTotal + itemsTotal); //add both data + obj-count, to handle "deletion-only" cases - setExternalStatus(getDialogPhaseText(*syncStat_, paused_), formatProgressPercent(fractionTotal)); //status text may be "paused"! + const std::wstring percentTotal = formatProgressPercent(fractionTotal); + + setExternalStatus(getDialogPhaseText(*syncStat_, paused_), percentTotal); //status text may be "paused"! //progress indicators + setText(*pnl_.m_staticTextPercentTotal, L' ' + percentTotal, &headerLayoutChanged); + if (trayIcon_.get()) trayIcon_->setProgress(fractionTotal); if (taskbar_ .get()) taskbar_ ->setProgress(fractionTotal); @@ -1140,6 +1149,16 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateProgressGui(bool allowYield) curveBytes_.ref().addSample(timeElapsedDouble, bytesCurrent); curveItems_.ref().addSample(timeElapsedDouble, itemsCurrent); + bool layoutChanged = false; //avoid screen flicker by calling layout() only if necessary + auto showIfNeeded = [&](wxWindow& wnd, bool show) + { + if (wnd.IsShown() != show) + { + wnd.Show(show); + layoutChanged = true; + } + }; + //item and data stats if (!haveTotalStats) { @@ -1159,14 +1178,6 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateProgressGui(bool allowYield) //it's possible data remaining becomes shortly negative if last file synced has ADS data and the bytesTotal was not yet corrected! } - auto showIfNeeded = [&](wxWindow& wnd, bool show) - { - if (wnd.IsShown() != show) - { - wnd.Show(show); - layoutChanged = true; - } - }; //errors and warnings (pop up dynamically) const Statistics::ErrorStats errorStats = syncStat_->getErrorStats(); @@ -1248,6 +1259,9 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateProgressGui(bool allowYield) pnl_.m_panelGraphItems->Refresh(); //adapt layout after content changes above + if (headerLayoutChanged) + pnl_.Layout(); + if (layoutChanged) { pnl_.m_panelProgress->Layout(); @@ -1300,17 +1314,17 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateStaticGui() //depends on "syn if (paused_) return loadImage("status_pause"); - if (syncStat_->getAbortStatus()) + if (syncStat_->taskCancelled()) return loadImage("result_error"); switch (syncStat_->currentPhase()) { case ProcessPhase::none: - case ProcessPhase::scanning: + case ProcessPhase::scan: return loadImage("status_scanning"); - case ProcessPhase::comparingContent: + case ProcessPhase::binaryCompare: return loadImage("status_binary_compare"); - case ProcessPhase::synchronizing: + case ProcessPhase::sync: return loadImage("status_syncing"); } assert(false); @@ -1322,7 +1336,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateStaticGui() //depends on "syn if (taskbar_.get()) { if (paused_) - taskbar_->setStatus(Taskbar::STATUS_PAUSED); + taskbar_->setStatus(Taskbar::Status::paused); else { const int itemsTotal = syncStat_->getTotalStats().items; @@ -1330,7 +1344,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateStaticGui() //depends on "syn const bool haveTotalStats = itemsTotal >= 0 || bytesTotal >= 0; - taskbar_->setStatus(haveTotalStats ? Taskbar::STATUS_NORMAL : Taskbar::STATUS_INDETERMINATE); + taskbar_->setStatus(haveTotalStats ? Taskbar::Status::normal : Taskbar::Status::indeterminate); } } @@ -1346,7 +1360,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateStaticGui() //depends on "syn template <class TopLevelDialog> -void SyncProgressDialogImpl<TopLevelDialog>::showSummary(SyncResult syncResult, const SharedRef<const ErrorLog>& log) +void SyncProgressDialogImpl<TopLevelDialog>::showSummary(TaskResult syncResult, const SharedRef<const ErrorLog>& log) { assert(syncStat_); //at the LATEST(!) to prevent access to currentStatusHandler @@ -1381,6 +1395,8 @@ void SyncProgressDialogImpl<TopLevelDialog>::showSummary(SyncResult syncResult, itemsProcessed == itemsTotal && bytesProcessed == bytesTotal) { + pnl_.m_staticTextPercentTotal->Hide(); + pnl_.m_staticTextProcessed ->Hide(); pnl_.m_staticTextRemaining ->Hide(); pnl_.m_staticTextItemsRemaining->Hide(); @@ -1406,12 +1422,12 @@ void SyncProgressDialogImpl<TopLevelDialog>::showSummary(SyncResult syncResult, { switch (syncResult) { - case SyncResult::finishedSuccess: + case TaskResult::success: return loadImage("result_success"); - case SyncResult::finishedWarning: + case TaskResult::warning: return loadImage("result_warning"); - case SyncResult::finishedError: - case SyncResult::aborted: + case TaskResult::error: + case TaskResult::cancelled: return loadImage("result_error"); } assert(false); @@ -1420,23 +1436,24 @@ void SyncProgressDialogImpl<TopLevelDialog>::showSummary(SyncResult syncResult, setImage(*pnl_.m_bitmapStatus, statusImage); pnl_.m_staticTextPhase->SetLabelText(getSyncResultLabel(syncResult)); + //pnl_.m_bitmapStatus->SetToolTip(); -> redundant //show status on Windows 7 taskbar if (taskbar_.get()) switch (syncResult) { - case SyncResult::finishedSuccess: - taskbar_->setStatus(Taskbar::STATUS_NORMAL); + case TaskResult::success: + taskbar_->setStatus(Taskbar::Status::normal); break; - case SyncResult::finishedWarning: - taskbar_->setStatus(Taskbar::STATUS_WARNING); + case TaskResult::warning: + taskbar_->setStatus(Taskbar::Status::warning); break; - case SyncResult::finishedError: - case SyncResult::aborted: - taskbar_->setStatus(Taskbar::STATUS_ERROR); + case TaskResult::error: + case TaskResult::cancelled: + taskbar_->setStatus(Taskbar::Status::error); break; } //---------------------------------- @@ -1522,7 +1539,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::showSummary(SyncResult syncResult, template <class TopLevelDialog> -auto SyncProgressDialogImpl<TopLevelDialog>::destroy(bool autoClose, bool restoreParentFrame, SyncResult syncResult, const SharedRef<const ErrorLog>& log) -> Result +auto SyncProgressDialogImpl<TopLevelDialog>::destroy(bool autoClose, bool restoreParentFrame, TaskResult syncResult, const SharedRef<const ErrorLog>& log) -> Result { assert(stopWatch_.isPaused()); //why wasn't pauseAndGetTotalTime() called? @@ -1694,7 +1711,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::resumeFromSystray(bool userRequeste //######################################################################################## SyncProgressDialog* SyncProgressDialog::create(const WindowLayout::Dimensions& dim, - const std::function<void()>& userRequestAbort, + const std::function<void()>& userRequestCancel, const Statistics& syncStat, wxFrame* parentWindow, //may be nullptr bool showProgress, @@ -1703,16 +1720,16 @@ SyncProgressDialog* SyncProgressDialog::create(const WindowLayout::Dimensions& d time_t syncStartTime, bool ignoreErrors, size_t autoRetryCount, - PostSyncAction2 postSyncAction) + PostSyncAction postSyncAction) { if (parentWindow) //FFS GUI sync return new SyncProgressDialogImpl<wxDialog>(wxDEFAULT_DIALOG_STYLE | wxMAXIMIZE_BOX | wxMINIMIZE_BOX | wxRESIZE_BORDER, - dim, userRequestAbort, syncStat, parentWindow, showProgress, + dim, userRequestCancel, syncStat, parentWindow, showProgress, autoCloseDialog, jobNames, syncStartTime, ignoreErrors, autoRetryCount, postSyncAction); else //FFS batch job { auto dlg = new SyncProgressDialogImpl<wxFrame>(wxDEFAULT_FRAME_STYLE, - dim, userRequestAbort, syncStat, parentWindow, showProgress, + dim, userRequestCancel, syncStat, parentWindow, showProgress, autoCloseDialog, jobNames, syncStartTime, ignoreErrors, autoRetryCount, postSyncAction); dlg->SetIcon(getFfsIcon()); //only top level windows should have an icon return dlg; diff --git a/FreeFileSync/Source/ui/progress_indicator.h b/FreeFileSync/Source/ui/progress_indicator.h index 36b9cdca..f1d93179 100644 --- a/FreeFileSync/Source/ui/progress_indicator.h +++ b/FreeFileSync/Source/ui/progress_indicator.h @@ -46,7 +46,7 @@ private: //StatusHandlerFloatingDialog will internally process Window messages => disable GUI controls to avoid unexpected callbacks! -enum class PostSyncAction2 +enum class PostSyncAction { none, exit, @@ -57,7 +57,7 @@ enum class PostSyncAction2 struct SyncProgressDialog { static SyncProgressDialog* create(const zen::WindowLayout::Dimensions& dim, - const std::function<void()>& userRequestAbort, + const std::function<void()>& userRequestCancel, const Statistics& syncStat, wxFrame* parentWindow, //may be nullptr bool showProgress, @@ -66,13 +66,13 @@ struct SyncProgressDialog time_t syncStartTime, bool ignoreErrors, size_t autoRetryCount, - PostSyncAction2 postSyncAction); + PostSyncAction postSyncAction); struct Result { bool autoCloseDialog; zen::WindowLayout::Dimensions dim; }; - virtual Result destroy(bool autoClose, bool restoreParentFrame, SyncResult syncResult, const zen::SharedRef<const zen::ErrorLog>& log) = 0; + virtual Result destroy(bool autoClose, bool restoreParentFrame, TaskResult syncResult, const zen::SharedRef<const zen::ErrorLog>& log) = 0; //--------------------------------------------------------------------------- virtual wxWindow* getWindowIfVisible() = 0; //may be nullptr; don't abuse, use as parent for modal dialogs only! @@ -84,7 +84,7 @@ struct SyncProgressDialog //allow changing a few options dynamically during sync virtual bool getOptionIgnoreErrors() const = 0; virtual void setOptionIgnoreErrors(bool ignoreError) = 0; - virtual PostSyncAction2 getOptionPostSyncAction() const = 0; + virtual PostSyncAction getOptionPostSyncAction() const = 0; virtual bool getOptionAutoCloseDialog() const = 0; virtual void timerSetStatus(bool active) = 0; //start/stop all internal timers! diff --git a/FreeFileSync/Source/ui/rename_dlg.cpp b/FreeFileSync/Source/ui/rename_dlg.cpp new file mode 100644 index 00000000..50798c69 --- /dev/null +++ b/FreeFileSync/Source/ui/rename_dlg.cpp @@ -0,0 +1,224 @@ +// ***************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: https://www.gnu.org/licenses/gpl-3.0 * +// * Copyright (C) Zenju (zenju AT freefilesync DOT org) - All Rights Reserved * +// ***************************************************************************** + +#include "rename_dlg.h" +#include "gui_generated.h" +#include <wx+/window_layout.h> +#include <wx+/image_resources.h> +#include "../base/multi_rename.h" + + +using namespace zen; +using namespace fff; + + +namespace +{ +enum class ColumnTypeRename +{ + oldName, + newName, +}; + + +class GridDataRename : public GridData +{ +public: + GridDataRename(const std::vector<std::wstring>& fileNamesOld, + const SharedRef<const RenameBuf>& renameBuf) : + fileNamesOld_(fileNamesOld), + renameBuf_(renameBuf) {} + + void updatePreview(const std::wstring& renamePhrase) + { + fileNamesNew_ = resolvePlaceholderPhrase(renamePhrase, renameBuf_.ref()); + assert(fileNamesNew_.size() == fileNamesOld_.size()); + } + + const std::vector<std::wstring>& getNewNames() const { return fileNamesNew_; } + + size_t getRowCount() const override { return fileNamesOld_.size(); } + + std::wstring getValue(size_t row, ColumnType colType) const override + { + if (row < fileNamesOld_.size()) + switch (static_cast<ColumnTypeRename>(colType)) + { + case ColumnTypeRename::oldName: + return fileNamesOld_[row]; + + case ColumnTypeRename::newName: + return fileNamesNew_[row]; + } + return std::wstring(); + } + + void renderRowBackgound(wxDC& dc, const wxRect& rect, size_t row, bool enabled, bool selected, HoverArea rowHover) override + { + //clearArea(dc, rect, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); -> already the default + } + + void renderCell(wxDC& dc, const wxRect& rect, size_t row, ColumnType colType, bool enabled, bool selected, HoverArea rowHover) override + { + //draw border on right + clearArea(dc, {rect.x + rect.width - fastFromDIP(1), rect.y, fastFromDIP(1), rect.height}, wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW)); + wxRect rectTmp = wxRect(rect.GetTopLeft(), wxSize(rect.width - fastFromDIP(1), rect.height)); + + rectTmp.x += getColumnGapLeft(); + rectTmp.width -= getColumnGapLeft(); + drawCellText(dc, rectTmp, getValue(row, colType)); + } + + int getBestSize(wxDC& dc, size_t row, ColumnType colType) override + { + // -> synchronize renderCell() <-> getBestSize() + return dc.GetTextExtent(getValue(row, colType)).GetWidth() + 2 * getColumnGapLeft() + fastFromDIP(1); //gap on left and right side + border + } + + std::wstring getToolTip(size_t row, ColumnType colType, HoverArea rowHover) override { return std::wstring(); } + + std::wstring getColumnLabel(ColumnType colType) const override + { + switch (static_cast<ColumnTypeRename>(colType)) + { + case ColumnTypeRename::oldName: + return _("Old name"); + case ColumnTypeRename::newName: + return _("New name"); + } + //assert(false); may be ColumnType::none + return std::wstring(); + } + +private: + const std::vector<std::wstring> fileNamesOld_; + std::vector<std::wstring> fileNamesNew_; + const SharedRef<const RenameBuf> renameBuf_; +}; + + +class RenameDialog : public RenameDlgGenerated +{ +public: + RenameDialog(wxWindow* parent, const std::vector<std::wstring>& fileNamesOld, std::vector<Zstring>& fileNamesNew); + +private: + void onTypingName(wxCommandEvent& event) override { updatePreview(); } + void onOkay (wxCommandEvent& event) override; + void onCancel (wxCommandEvent& event) override { EndModal(static_cast<int>(ConfirmationButton::cancel)); } + void onClose (wxCloseEvent& event) override { EndModal(static_cast<int>(ConfirmationButton::cancel)); } + + void onLocalKeyEvent(wxKeyEvent& event); + + void updatePreview() + { + getDataView().updatePreview(copyStringTo<std::wstring>(trimCpy(m_textCtrlNewName->GetValue()))); + m_gridRenamePreview->Refresh(); + } + + GridDataRename& getDataView() + { + if (auto* prov = dynamic_cast<GridDataRename*>(m_gridRenamePreview->getDataProvider())) + return *prov; + throw std::runtime_error(std::string(__FILE__) + '[' + numberTo<std::string>(__LINE__) + "] m_gridRenamePreview was not initialized."); + } + + //output-only parameters: + std::vector<Zstring>& fileNamesNewOut_; +}; + + +RenameDialog::RenameDialog(wxWindow* parent, + const std::vector<std::wstring>& fileNamesOld, + std::vector<Zstring>& fileNamesNew) : + RenameDlgGenerated(parent), + fileNamesNewOut_(fileNamesNew) +{ + setStandardButtonLayout(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonOK).setCancel(m_buttonCancel)); + + setMainInstructionFont(*m_staticTextHeader); + + setImage(*m_bitmapRename, loadImage("rename")); + + m_staticTextHeader->SetLabelText(_P("Do you really want to rename the following item?", + "Do you really want to rename the following %x items?", fileNamesOld.size())); + + m_staticTextHeader->Wrap(fastFromDIP(460)); //needs to be reapplied after SetLabel() + + m_buttonOK->SetLabelText(wxControl::RemoveMnemonics(_("&Rename"))); //no access key needed: use ENTER! + + const auto& [renamePhrase, renameBuf] = getPlaceholderPhrase(fileNamesOld); + + //----------------------------------------------------------- + m_gridRenamePreview->showRowLabel(false); + m_gridRenamePreview->setRowHeight(m_gridRenamePreview->getMainWin().GetCharHeight() + fastFromDIP(1) /*extra space*/); + m_gridRenamePreview->setColumnConfig( + { + {static_cast<ColumnType>(ColumnTypeRename::oldName), 0, 1, true}, + {static_cast<ColumnType>(ColumnTypeRename::newName), 0, 1, true}, + }); + + m_gridRenamePreview->setDataProvider(std::make_shared<GridDataRename>(fileNamesOld, renameBuf)); + + warn_static("make smarter!") + m_gridRenamePreview->SetMinSize({fastFromDIP(500), fastFromDIP(200)}); + //----------------------------------------------------------- + + m_textCtrlNewName->ChangeValue(renamePhrase); + + updatePreview(); + + Bind(wxEVT_CHAR_HOOK, [this](wxKeyEvent& event) { onLocalKeyEvent(event); }); //enable dialog-specific key events + + GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() +#ifdef __WXGTK3__ + Show(); //GTK3 size calculation requires visible window: https://github.com/wxWidgets/wxWidgets/issues/16088 + Hide(); //avoid old position flash when Center() moves window (asynchronously?) +#endif + Center(); //needs to be re-applied after a dialog size change! + + m_textCtrlNewName->SetFocus(); //[!] required *before* SetSelection() on wxGTK + + //pre-select name part that user will most likely change + assert(contains(renamePhrase, L'\u2776') == fileNamesOld.size() > 1); + auto it = fileNamesOld.size() == 1 ? + findLast (renamePhrase.begin(), renamePhrase.end(), L'.') : //select everything except file extension + std::find(renamePhrase.begin(), renamePhrase.end(), L'\u2776'); //❶ + if (it == renamePhrase.end()) + m_textCtrlNewName->SelectAll(); + else + m_textCtrlNewName->SetSelection(0, static_cast<long>(it - renamePhrase.begin())); +} + + +void RenameDialog::onLocalKeyEvent(wxKeyEvent& event) +{ + event.Skip(); +} + + +void RenameDialog::onOkay(wxCommandEvent& event) +{ + fileNamesNewOut_.clear(); + for (const std::wstring& newName : getDataView().getNewNames()) + fileNamesNewOut_.push_back(utfTo<Zstring>(newName)); + + EndModal(static_cast<int>(ConfirmationButton::accept)); +} +} + + +ConfirmationButton fff::showRenameDialog(wxWindow* parent, + const std::vector<Zstring>& fileNamesOld, + std::vector<Zstring>& fileNamesNew) +{ + std::vector<std::wstring> namesOld; + for (const Zstring& name : fileNamesOld) + namesOld.push_back(utfTo<std::wstring>(name)); + + RenameDialog dlg(parent, namesOld, fileNamesNew); + return static_cast<ConfirmationButton>(dlg.ShowModal()); +} diff --git a/FreeFileSync/Source/ui/rename_dlg.h b/FreeFileSync/Source/ui/rename_dlg.h new file mode 100644 index 00000000..b6be9cd5 --- /dev/null +++ b/FreeFileSync/Source/ui/rename_dlg.h @@ -0,0 +1,20 @@ +// ***************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: https://www.gnu.org/licenses/gpl-3.0 * +// * Copyright (C) Zenju (zenju AT freefilesync DOT org) - All Rights Reserved * +// ***************************************************************************** + +#ifndef RENAME_DLG_H_23487982347324 +#define RENAME_DLG_H_23487982347324 + +#include <wx+/popup_dlg.h> + + +namespace fff +{ +zen::ConfirmationButton showRenameDialog(wxWindow* parent, + const std::vector<Zstring>& fileNamesOld, + std::vector<Zstring>& fileNamesNew); +} + +#endif //RENAME_DLG_H_23487982347324 diff --git a/FreeFileSync/Source/ui/small_dlgs.cpp b/FreeFileSync/Source/ui/small_dlgs.cpp index 1a580cb0..16140cca 100644 --- a/FreeFileSync/Source/ui/small_dlgs.cpp +++ b/FreeFileSync/Source/ui/small_dlgs.cpp @@ -545,10 +545,10 @@ void CloudSetupDlg::onDetectServerChannelLimit(wxCommandEvent& event) { assert(runningOnMainThread()); if (showPasswordPrompt(this, msg, lastErrorMsg, password) != ConfirmationButton::accept) - throw AbortProcess(); + throw CancelProcess(); return password; }; - AFS::authenticateAccess(folderPath.afsDevice, requestPassword); //throw FileError, AbortProcess + AFS::authenticateAccess(folderPath.afsDevice, requestPassword); //throw FileError, CancelProcess //------------------------------------------------------------------- const int channelCountMax = getServerMaxChannelsPerConnection(extractSftpLogin(folderPath.afsDevice)); //throw FileError @@ -557,7 +557,7 @@ void CloudSetupDlg::onDetectServerChannelLimit(wxCommandEvent& event) m_spinCtrlChannelCountSftp->SetFocus(); //[!] otherwise selection is lost m_spinCtrlChannelCountSftp->SetSelection(-1, -1); //some visual feedback: select all } - catch (AbortProcess&) { return; } + catch (CancelProcess&) { return; } catch (const FileError& e) { showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); @@ -839,10 +839,10 @@ void CloudSetupDlg::onBrowseCloudFolder(wxCommandEvent& event) { assert(runningOnMainThread()); if (showPasswordPrompt(this, msg, lastErrorMsg, password) != ConfirmationButton::accept) - throw AbortProcess(); + throw CancelProcess(); return password; }; - AFS::authenticateAccess(folderPath.afsDevice, requestPassword); //throw FileError, AbortProcess + AFS::authenticateAccess(folderPath.afsDevice, requestPassword); //throw FileError, CancelProcess //caveat: this could block *indefinitely* for Google Drive, but luckily already authenticated in this context //------------------------------------------------------------------- // @@ -856,7 +856,7 @@ void CloudSetupDlg::onBrowseCloudFolder(wxCommandEvent& event) folderPath.afsPath = getFtpHomePath(extractFtpLogin(folderPath.afsDevice)); //throw FileError } } - catch (AbortProcess&) { return; } + catch (CancelProcess&) { return; } catch (const FileError& e) { showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); @@ -1420,7 +1420,7 @@ OptionsDlg::OptionsDlg(wxWindow* parent, XmlGlobalSettings& globalCfg) : m_checkListHiddenDialogs->Hide(); m_buttonShowCtxCustomize->Hide(); - //fix wxCheckListBox's stupid "per-item toggle" + //fix wxCheckListBox's stupid "per-item toggle" when multiple items are selected m_checkListHiddenDialogs->Bind(wxEVT_KEY_DOWN, [&checklist = *m_checkListHiddenDialogs](wxKeyEvent& event) { switch (event.GetKeyCode()) @@ -1551,7 +1551,7 @@ void OptionsDlg::updateGui() void OptionsDlg::expandConfigArea(ConfigArea area) { - //only show one expaned area at a time (wxGTK even crashes when showing both: not worth debugging) + //only show one expanded area at a time (wxGTK even crashes when showing both: not worth debugging) m_buttonShowHiddenDialogs->Show(area != ConfigArea::hidden); m_buttonShowCtxCustomize ->Show(area != ConfigArea::context); diff --git a/FreeFileSync/Source/ui/small_dlgs.h b/FreeFileSync/Source/ui/small_dlgs.h index eec1eca2..81a3dd0d 100644 --- a/FreeFileSync/Source/ui/small_dlgs.h +++ b/FreeFileSync/Source/ui/small_dlgs.h @@ -8,7 +8,6 @@ #define SMALL_DLGS_H_8321790875018750245 #include <span> -#include <wx/window.h> #include <wx+/popup_dlg.h> #include "../base/synchronization.h" #include "../config.h" diff --git a/FreeFileSync/Source/ui/version_check.cpp b/FreeFileSync/Source/ui/version_check.cpp index c3d1c8f9..ca49d087 100644 --- a/FreeFileSync/Source/ui/version_check.cpp +++ b/FreeFileSync/Source/ui/version_check.cpp @@ -304,17 +304,17 @@ struct fff::UpdateCheckResultPrep std::vector<std::pair<std::string, std::string>> postParameters; std::optional<SysError> error; }; -std::shared_ptr<const UpdateCheckResultPrep> fff::automaticUpdateCheckPrepare(wxWindow& parent) +SharedRef<const UpdateCheckResultPrep> fff::automaticUpdateCheckPrepare(wxWindow& parent) { assert(runningOnMainThread()); - auto prep = std::make_shared<UpdateCheckResultPrep>(); + auto prep = makeSharedRef<UpdateCheckResultPrep>(); try { - prep->postParameters = geHttpPostParameters(parent); //throw SysError + prep.ref().postParameters = geHttpPostParameters(parent); //throw SysError } catch (const SysError& e) { - prep->error = e; + prep.ref().error = e; } return prep; } @@ -326,33 +326,31 @@ struct fff::UpdateCheckResult bool internetIsAlive = false; std::optional<SysError> error; }; -std::shared_ptr<const UpdateCheckResult> fff::automaticUpdateCheckRunAsync(const UpdateCheckResultPrep* resultPrep) +SharedRef<const UpdateCheckResult> fff::automaticUpdateCheckRunAsync(const UpdateCheckResultPrep& resultPrep) { //assert(!runningOnMainThread()); -> allow synchronous call, too - auto result = std::make_shared<UpdateCheckResult>(); + auto result = makeSharedRef<UpdateCheckResult>(); try { - if (resultPrep->error) - throw* resultPrep->error; //throw SysError + if (resultPrep.error) + throw* resultPrep.error; //throw SysError - result->onlineVersion = getOnlineVersion(resultPrep->postParameters); //throw SysError - result->internetIsAlive = true; + result.ref().onlineVersion = getOnlineVersion(resultPrep.postParameters); //throw SysError + result.ref().internetIsAlive = true; } catch (const SysError& e) { - result->error = e; - result->internetIsAlive = internetIsAlive(); + result.ref().error = e; + result.ref().internetIsAlive = internetIsAlive(); } return result; } -void fff::automaticUpdateCheckEval(wxWindow& parent, time_t& lastUpdateCheck, std::string& lastOnlineVersion, const UpdateCheckResult* asyncResult) +void fff::automaticUpdateCheckEval(wxWindow& parent, time_t& lastUpdateCheck, std::string& lastOnlineVersion, const UpdateCheckResult& result) { assert(runningOnMainThread()); - const UpdateCheckResult& result = *asyncResult; - if (!result.error) { lastUpdateCheck = getVersionCheckCurrentTime(); @@ -378,7 +376,7 @@ void fff::automaticUpdateCheckEval(wxWindow& parent, time_t& lastUpdateCheck, st break; case ConfirmationButton2::accept2: //retry automaticUpdateCheckEval(parent, lastUpdateCheck, lastOnlineVersion, - automaticUpdateCheckRunAsync(automaticUpdateCheckPrepare(parent).get()).get()); //note: retry via recursion!!! + automaticUpdateCheckRunAsync(automaticUpdateCheckPrepare(parent).ref()).ref()); //note: retry via recursion!!! break; case ConfirmationButton2::cancel: break; diff --git a/FreeFileSync/Source/ui/version_check.h b/FreeFileSync/Source/ui/version_check.h index 6210b358..1a88997b 100644 --- a/FreeFileSync/Source/ui/version_check.h +++ b/FreeFileSync/Source/ui/version_check.h @@ -7,9 +7,10 @@ #ifndef VERSION_CHECK_H_324872374893274983275 #define VERSION_CHECK_H_324872374893274983275 -#include <functional> -#include <memory> +//#include <functional> +//#include <memory> #include <wx/window.h> +#include <zen/stl_tools.h> namespace fff @@ -25,12 +26,11 @@ struct UpdateCheckResultPrep; struct UpdateCheckResult; //run on main thread: -std::shared_ptr<const UpdateCheckResultPrep> automaticUpdateCheckPrepare(wxWindow& parent); +zen::SharedRef<const UpdateCheckResultPrep> automaticUpdateCheckPrepare(wxWindow& parent); //run on worker thread: (long-running part of the check) -std::shared_ptr<const UpdateCheckResult> automaticUpdateCheckRunAsync(const UpdateCheckResultPrep* resultPrep); +zen::SharedRef<const UpdateCheckResult> automaticUpdateCheckRunAsync(const UpdateCheckResultPrep& resultPrep); //run on main thread: -void automaticUpdateCheckEval(wxWindow& parent, time_t& lastUpdateCheck, std::string& lastOnlineVersion, - const UpdateCheckResult* asyncResult); +void automaticUpdateCheckEval(wxWindow& parent, time_t& lastUpdateCheck, std::string& lastOnlineVersion, const UpdateCheckResult& result); //---------------------------------------------------------------------------- //call from main thread: void checkForUpdateNow(wxWindow& parent, std::string& lastOnlineVersion); diff --git a/FreeFileSync/Source/version/version.h b/FreeFileSync/Source/version/version.h index ede1e2d3..3b1d7c53 100644 --- a/FreeFileSync/Source/version/version.h +++ b/FreeFileSync/Source/version/version.h @@ -3,7 +3,7 @@ namespace fff { -const char ffsVersion[] = "12.4"; //internal linkage! +const char ffsVersion[] = "12.5"; //internal linkage! const char FFS_VERSION_SEPARATOR = '.'; } diff --git a/libcurl/curl_wrap.cpp b/libcurl/curl_wrap.cpp index 1d72dcac..5f2a7f9d 100644 --- a/libcurl/curl_wrap.cpp +++ b/libcurl/curl_wrap.cpp @@ -28,13 +28,13 @@ void zen::libcurlInit() if (++curlInitLevel != 1) //non-atomic => require call from main thread return; - openSslInit(); - [[maybe_unused]] const CURLcode rc2 = ::curl_global_init(CURL_GLOBAL_NOTHING /*CURL_GLOBAL_DEFAULT = CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32*/); - assert(rc2 == CURLE_OK); - - warn_static("log on error") + try + { + ASSERT_SYSERROR(::curl_global_init(CURL_GLOBAL_NOTHING /*CURL_GLOBAL_DEFAULT = CURL_GLOBAL_SSL|CURL_GLOBAL_WIN32*/) == CURLE_OK); + } + catch (const SysError& e) { logExtraError(_("Error during process initialization.") + L"\n\n" + e.toString()); } } @@ -78,28 +78,35 @@ HttpSession::Result HttpSession::perform(const std::string& serverRelPath, else ::curl_easy_reset(easyHandle_); - - std::vector<CurlOption> options; + auto setCurlOption = [easyHandle = easyHandle_](const CurlOption& curlOpt) //throw SysError + { + if (const CURLcode rc = ::curl_easy_setopt(easyHandle, curlOpt.option, curlOpt.value); + rc != CURLE_OK) + throw SysError(formatSystemError("curl_easy_setopt(" + numberTo<std::string>(static_cast<int>(curlOpt.option)) + ")", + formatCurlStatusCode(rc), utfTo<std::wstring>(::curl_easy_strerror(rc)))); + }; char curlErrorBuf[CURL_ERROR_SIZE] = {}; - options.emplace_back(CURLOPT_ERRORBUFFER, curlErrorBuf); + setCurlOption({CURLOPT_ERRORBUFFER, curlErrorBuf}); //throw SysError - options.emplace_back(CURLOPT_USERAGENT, "FreeFileSync"); //default value; may be overwritten by caller + setCurlOption({CURLOPT_USERAGENT, "FreeFileSync"}); //throw SysError + //default value; may be overwritten by caller - //lifetime: keep alive until after curl_easy_setopt() below - const std::string curlPath = serverPrefix_ + serverRelPath; - options.emplace_back(CURLOPT_URL, curlPath.c_str()); + setCurlOption({CURLOPT_URL, (serverPrefix_ + serverRelPath).c_str()}); //throw SysError - options.emplace_back(CURLOPT_ACCEPT_ENCODING, ""); //libcurl: generate Accept-Encoding header containing all built-in supported encodings + setCurlOption({CURLOPT_ACCEPT_ENCODING, ""}); //throw SysError + //libcurl: generate Accept-Encoding header containing all built-in supported encodings //=> usually generates "Accept-Encoding: deflate, gzip" - note: "gzip" used by Google Drive - options.emplace_back(CURLOPT_NOSIGNAL, 1); //thread-safety: https://curl.haxx.se/libcurl/c/threadsafe.html + setCurlOption({CURLOPT_NOSIGNAL, 1}); //throw SysError + //thread-safety: https://curl.haxx.se/libcurl/c/threadsafe.html - options.emplace_back(CURLOPT_CONNECTTIMEOUT, timeoutSec); + setCurlOption({CURLOPT_CONNECTTIMEOUT, timeoutSec}); //throw SysError //CURLOPT_TIMEOUT: "Since this puts a hard limit for how long time a request is allowed to take, it has limited use in dynamic use cases with varying transfer times." - options.emplace_back(CURLOPT_LOW_SPEED_TIME, timeoutSec); - options.emplace_back(CURLOPT_LOW_SPEED_LIMIT, 1); //[bytes], can't use "0" which means "inactive", so use some low number + setCurlOption({CURLOPT_LOW_SPEED_TIME, timeoutSec}); //throw SysError + setCurlOption({CURLOPT_LOW_SPEED_LIMIT, 1}); //throw SysError + //[bytes], can't use "0" which means "inactive", so use some low number std::exception_ptr userCallbackException; @@ -123,18 +130,20 @@ HttpSession::Result HttpSession::perform(const std::string& serverRelPath, return (*clientp)(curlfd, purpose); //free this poor little C-API from its shackles and redirect to a proper lambda }; - options.emplace_back(CURLOPT_SOCKOPTFUNCTION, onSocketCreateWrapper); - options.emplace_back(CURLOPT_SOCKOPTDATA, &onSocketCreate); + setCurlOption({CURLOPT_SOCKOPTFUNCTION, onSocketCreateWrapper}); //throw SysError + setCurlOption({CURLOPT_SOCKOPTDATA, &onSocketCreate}); //throw SysError //libcurl forwards this char-string to OpenSSL as is, which - thank god - accepts UTF8 if (caCertFilePath_.empty()) { - options.emplace_back(CURLOPT_CAINFO, 0); //see remarks in ftp.cpp - options.emplace_back(CURLOPT_SSL_VERIFYPEER, 0); - options.emplace_back(CURLOPT_SSL_VERIFYHOST, 0); + setCurlOption({CURLOPT_CAINFO, 0}); //throw SysError + setCurlOption({CURLOPT_SSL_VERIFYPEER, 0}); //throw SysError + setCurlOption({CURLOPT_SSL_VERIFYHOST, 0}); //throw SysError + //see remarks in ftp.cpp } else - options.emplace_back(CURLOPT_CAINFO, caCertFilePath_.c_str()); //hopefully latest version from https://curl.haxx.se/docs/caextract.html + setCurlOption({CURLOPT_CAINFO, caCertFilePath_.c_str()}); //throw SysError + //hopefully latest version from https://curl.haxx.se/docs/caextract.html //CURLOPT_SSL_VERIFYPEER => already active by default //CURLOPT_SSL_VERIFYHOST => @@ -203,22 +212,24 @@ HttpSession::Result HttpSession::perform(const std::string& serverRelPath, //--------------------------------------------------- if (receiveHeader) { - options.emplace_back(CURLOPT_HEADERDATA, &onHeaderReceived); - options.emplace_back(CURLOPT_HEADERFUNCTION, onHeaderReceivedWrapper); + setCurlOption({CURLOPT_HEADERDATA, &onHeaderReceived}); //throw SysError + setCurlOption({CURLOPT_HEADERFUNCTION, onHeaderReceivedWrapper}); //throw SysError } if (writeResponse) { - options.emplace_back(CURLOPT_WRITEDATA, &onBytesReceived); - options.emplace_back(CURLOPT_WRITEFUNCTION, onBytesReceivedWrapper); + setCurlOption({CURLOPT_WRITEDATA, &onBytesReceived}); //throw SysError + setCurlOption({CURLOPT_WRITEFUNCTION, onBytesReceivedWrapper}); //throw SysError //{CURLOPT_BUFFERSIZE, 256 * 1024} -> defaults is 16 kB which seems to correspond to SSL packet size //=> setting larget buffers size does nothing (recv still returns only 16 kB) } if (readRequest) { if (std::all_of(extraOptions.begin(), extraOptions.end(), [](const CurlOption& o) { return o.option != CURLOPT_POST; })) - /**/options.emplace_back(CURLOPT_UPLOAD, 1); //issues HTTP PUT - options.emplace_back(CURLOPT_READDATA, &getBytesToSend); - options.emplace_back(CURLOPT_READFUNCTION, getBytesToSendWrapper); + /**/setCurlOption({CURLOPT_UPLOAD, 1}); //throw SysError + //issues HTTP PUT + + setCurlOption({CURLOPT_READDATA, &getBytesToSend}); //throw SysError + setCurlOption({CURLOPT_READFUNCTION, getBytesToSendWrapper}); //throw SysError //{CURLOPT_UPLOAD_BUFFERSIZE, 256 * 1024} -> default is 64 kB. apparently no performance improvement for larger buffers like 256 kB //Contradicting options: CURLOPT_READFUNCTION, CURLOPT_POSTFIELDS: @@ -240,12 +251,11 @@ HttpSession::Result HttpSession::perform(const std::string& serverRelPath, headers = ::curl_slist_append(headers, "Expect:"); //guess, what: www.googleapis.com doesn't support it! e.g. gdriveUploadFile() if (headers) - options.emplace_back(CURLOPT_HTTPHEADER, headers); + setCurlOption({CURLOPT_HTTPHEADER, headers}); //throw SysError //--------------------------------------------------- - append(options, extraOptions); - - applyCurlOptions(easyHandle_, options); //throw SysError + for (const CurlOption& option : extraOptions) + setCurlOption(option); //throw SysError //======================================================================================================= const CURLcode rcPerf = ::curl_easy_perform(easyHandle_); @@ -394,13 +404,3 @@ std::wstring zen::formatCurlStatusCode(CURLcode sc) return replaceCpy<std::wstring>(L"Curl status %x", L"%x", numberTo<std::wstring>(static_cast<int>(sc))); } - - -void zen::applyCurlOptions(CURL* easyHandle, const std::vector<CurlOption>& options) //throw SysError -{ - for (const CurlOption& opt : options) - if (const CURLcode rc = ::curl_easy_setopt(easyHandle, opt.option, opt.value); - rc != CURLE_OK) - throw SysError(formatSystemError("curl_easy_setopt(" + numberTo<std::string>(static_cast<int>(opt.option)) + ")", - formatCurlStatusCode(rc), utfTo<std::wstring>(::curl_easy_strerror(rc)))); -} diff --git a/libcurl/curl_wrap.h b/libcurl/curl_wrap.h index 3dbdc3ba..dc534428 100644 --- a/libcurl/curl_wrap.h +++ b/libcurl/curl_wrap.h @@ -72,7 +72,6 @@ private: std::wstring formatCurlStatusCode(CURLcode sc); -void applyCurlOptions(CURL* easyHandle, const std::vector<CurlOption>& options); //throw SysError } #else diff --git a/wx+/bitmap_button.h b/wx+/bitmap_button.h index 188ee607..bbae6397 100644 --- a/wx+/bitmap_button.h +++ b/wx+/bitmap_button.h @@ -44,8 +44,8 @@ void setImage(wxStaticBitmap& staticBmp, const wxImage& img); wxImage renderPressedButton(const wxSize& sz); -inline wxColor getColorToggleButtonBorder(){ return {0x79, 0xbc, 0xed}; } //medium blue -inline wxColor getColorToggleButtonFill (){ return {0xcc, 0xe4, 0xf8}; } //light blue +inline wxColor getColorToggleButtonBorder() { return {0x79, 0xbc, 0xed}; } //medium blue +inline wxColor getColorToggleButtonFill () { return {0xcc, 0xe4, 0xf8}; } //light blue diff --git a/wx+/grid.cpp b/wx+/grid.cpp index 8d3dbea9..68f40fb6 100644 --- a/wx+/grid.cpp +++ b/wx+/grid.cpp @@ -129,17 +129,23 @@ void GridData::renderCell(wxDC& dc, const wxRect& rect, size_t row, ColumnType c int GridData::getBestSize(wxDC& dc, size_t row, ColumnType colType) { - return dc.GetTextExtent(getValue(row, colType)).GetWidth() + 2 * getColumnGapLeft() + 1; //gap on left and right side + border + return dc.GetTextExtent(getValue(row, colType)).GetWidth() + 2 * getColumnGapLeft() + fastFromDIP(1); //gap on left and right side + border } wxRect GridData::drawCellBorder(wxDC& dc, const wxRect& rect) //returns remaining rectangle { - wxDCPenChanger dummy2(dc, wxPen(getColorGridLine(), fastFromDIP(1))); - dc.DrawLine(rect.GetBottomLeft(), rect.GetBottomRight()); - dc.DrawLine(rect.GetBottomRight(), rect.GetTopRight() + wxPoint(0, -1)); + //following code is adapted from clearArea(): + assert(getColorGridLine().IsSolid()); + //wxDC::DrawRectangle() just widens inner area if wxTRANSPARENT_PEN is used! + //bonus: wxTRANSPARENT_PEN is about 2x faster than redundantly drawing with col! + wxDCPenChanger areaPen (dc, *wxTRANSPARENT_PEN); + wxDCBrushChanger areaBrush(dc, getColorGridLine()); - return wxRect(rect.GetTopLeft(), wxSize(rect.width - 1, rect.height - 1)); + dc.DrawRectangle(rect.x + rect.width - fastFromDIP(1), rect.y, fastFromDIP(1), rect.height); //right border + dc.DrawRectangle(rect.x, rect.y + rect.height - fastFromDIP(1), rect.width, fastFromDIP(1)); //bottom border + + return wxRect(rect.GetTopLeft(), wxSize(rect.width - fastFromDIP(1), rect.height - fastFromDIP(1))); } @@ -439,7 +445,7 @@ class Grid::RowLabelWin : public SubWindow public: explicit RowLabelWin(Grid& parent) : SubWindow(parent), - rowHeight_(parent.GetCharHeight() + 2 + 1) {} //default height; don't call any functions on "parent" other than those from wxWindow during construction! + rowHeight_(parent.GetCharHeight() + fastFromDIP(2) + fastFromDIP(1)) {} //default height; don't call any functions on "parent" other than those from wxWindow during construction! //2 for some more space, 1 for bottom border (gives 15 + 2 + 1 on Windows, 17 + 2 + 1 on Ubuntu) int getBestWidth(ptrdiff_t rowFrom, ptrdiff_t rowTo) diff --git a/wx+/no_flicker.h b/wx+/no_flicker.h index 8a461db3..3d7c0ee0 100644 --- a/wx+/no_flicker.h +++ b/wx+/no_flicker.h @@ -55,7 +55,7 @@ void setTextWithUrls(wxRichTextCtrl& richCtrl, const wxString& newText) for (auto it = newText.begin();;) { - const std::wstring_view urlPrefix = L"https://"; + constexpr std::wstring_view urlPrefix = L"https://"; const auto itUrl = std::search(it, newText.end(), urlPrefix.begin(), urlPrefix.end()); if (it != itUrl) blocks.emplace_back(BlockType::text, wxString(it, itUrl)); diff --git a/wx+/popup_dlg.cpp b/wx+/popup_dlg.cpp index 9f29badc..5254ff29 100644 --- a/wx+/popup_dlg.cpp +++ b/wx+/popup_dlg.cpp @@ -123,10 +123,10 @@ public: case DialogInfoType::info: break; case DialogInfoType::warning: - taskbar_->setStatus(Taskbar::STATUS_WARNING); + taskbar_->setStatus(Taskbar::Status::warning); break; case DialogInfoType::error: - taskbar_->setStatus(Taskbar::STATUS_ERROR); + taskbar_->setStatus(Taskbar::Status::error); break; } } diff --git a/wx+/taskbar.h b/wx+/taskbar.h index 985d89b4..f660013e 100644 --- a/wx+/taskbar.h +++ b/wx+/taskbar.h @@ -21,13 +21,13 @@ public: Taskbar(wxWindow* window); //throw TaskbarNotAvailable ~Taskbar(); - enum Status + enum class Status { - STATUS_NORMAL, - STATUS_INDETERMINATE, - STATUS_WARNING, - STATUS_ERROR, - STATUS_PAUSED + normal, + indeterminate, + warning, + error, + paused, }; void setStatus(Status status); //noexcept diff --git a/zen/file_access.cpp b/zen/file_access.cpp index 6c47936c..4ce66acf 100644 --- a/zen/file_access.cpp +++ b/zen/file_access.cpp @@ -622,9 +622,8 @@ void zen::copySymlink(const Zstring& sourcePath, const Zstring& targetPath) //th } //allow only consistent objects to be created -> don't place before ::symlink(); targetPath may already exist! - ZEN_ON_SCOPE_FAIL(try { removeSymlinkPlain(targetPath); /*throw FileError*/ } - catch (FileError&) {}); - warn_static("log it!") + ZEN_ON_SCOPE_FAIL(try { removeSymlinkPlain(targetPath); } + catch (const FileError& e) { logExtraError(e.toString()); }); //file times: essential for syncing a symlink: enforce this! (don't just try!) struct stat sourceInfo = {}; @@ -665,7 +664,7 @@ FileCopyResult zen::copyNewFile(const Zstring& sourceFile, const Zstring& target } FileOutputPlain fileOut(fdTarget, targetFile); //pass ownership - //preallocate disk space + reduce fragmentation + //preallocate disk space + reduce fragmentation fileOut.reserveSpace(sourceInfo.st_size); //throw FileError unbufferedStreamCopy([&](void* buffer, size_t bytesToRead) @@ -684,7 +683,7 @@ FileCopyResult zen::copyNewFile(const Zstring& sourceFile, const Zstring& target }, fileOut.getBlockSize() /*throw FileError*/); //throw FileError, X - //possible improvement: copy_file_range() performs an in-kernel copy: https://github.com/coreutils/coreutils/blob/17479ef60c8edbd2fe8664e31a7f69704f0cd221/src/copy.c#L342 + //possible improvement: copy_file_range() performs an in-kernel copy: https://github.com/coreutils/coreutils/blob/17479ef60c8edbd2fe8664e31a7f69704f0cd221/src/copy.c#L342 #if 0 //clean file system cache: needed at all? no user complaints at all so far!!! diff --git a/zen/file_io.cpp b/zen/file_io.cpp index 8c985f64..af80a69a 100644 --- a/zen/file_io.cpp +++ b/zen/file_io.cpp @@ -58,8 +58,7 @@ FileBase::~FileBase() { close(); //throw FileError } - catch (FileError&) { assert(false); } - warn_static("log it!") + catch (const FileError& e) { logExtraError(e.toString()); } } @@ -170,8 +169,7 @@ size_t FileInputPlain::tryRead(void* buffer, size_t bytesToRead) //throw FileErr if (bytesRead < 0) THROW_LAST_SYS_ERROR("read"); - if (makeUnsigned(bytesRead) > bytesToRead) //better safe than sorry - throw SysError(formatSystemError("read", L"", L"Buffer overflow.")); + ASSERT_SYSERROR(makeUnsigned(bytesRead) <= bytesToRead); //better safe than sorry return bytesRead; //"zero indicates end of file" } catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(getFilePath())), e.toString()); } @@ -229,10 +227,9 @@ FileOutputPlain::~FileOutputPlain() if (::unlink(getFilePath().c_str()) != 0) THROW_LAST_SYS_ERROR("unlink"); } - catch (const SysError&) + catch (const SysError& e) { - assert(false); - warn_static("at least log on failure!") + logExtraError(replaceCpy(_("Cannot delete file %x."), L"%x", fmtPath(getFilePath())) + L"\n\n" + e.toString()); } } @@ -289,8 +286,8 @@ size_t FileOutputPlain::tryWrite(const void* buffer, size_t bytesToWrite) //thro THROW_LAST_SYS_ERROR("write"); } - if (makeUnsigned(bytesWritten) > bytesToWrite) //better safe than sorry - throw SysError(formatSystemError("write", L"", L"Buffer overflow.")); + + ASSERT_SYSERROR(makeUnsigned(bytesWritten) <= bytesToWrite); //better safe than sorry return bytesWritten; } catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(getFilePath())), e.toString()); } @@ -330,9 +327,8 @@ void zen::setFileContent(const Zstring& filePath, const std::string_view byteStr tmpFile.close(); //throw FileError //take over ownership: - ZEN_ON_SCOPE_FAIL( try { removeFilePlain(tmpFilePath); /*throw FileError*/ } - catch (FileError&) {}); - warn_static("log it!") + ZEN_ON_SCOPE_FAIL( try { removeFilePlain(tmpFilePath); } + catch (const FileError& e) { logExtraError(e.toString()); }); //operation finished: move temp file transactionally moveAndRenameItem(tmpFilePath, filePath, true /*replaceExisting*/); //throw FileError, (ErrorMoveUnsupported), (ErrorTargetExisting) diff --git a/zen/file_path.cpp b/zen/file_path.cpp index 60ac4eb7..6503ba2f 100644 --- a/zen/file_path.cpp +++ b/zen/file_path.cpp @@ -173,13 +173,6 @@ std::unordered_map<Zstring, Zstring> getAllEnvVars() } constinit Global<std::unordered_map<Zstring, Zstring>> globalEnvVars; -GLOBAL_RUN_ONCE( - //*INDENT-OFF* - //mitigate static initialization order fiasco: (whatever comes first) - if (!globalEnvVars.get()) - globalEnvVars.set(std::make_unique<std::unordered_map<Zstring, Zstring>>(getAllEnvVars())) - //*INDENT-ON* -); } @@ -191,24 +184,17 @@ std::optional<Zstring> zen::getEnvironmentVar(const ZstringView name) getenv_s() to the rescue!? not implemented on GCC, apparently *still* not threadsafe!!! => *eff* this: make a global copy during start up! */ - std::shared_ptr<std::unordered_map<Zstring, Zstring>> envVars = globalEnvVars.get(); - if (!envVars) //access during static init or shutdown? + globalEnvVars.setOnce([] { return std::make_unique<std::unordered_map<Zstring, Zstring>>(getAllEnvVars()); }); + + if (std::shared_ptr<std::unordered_map<Zstring, Zstring>> envVars = globalEnvVars.get()) { - if (globalEnvVars.wasDestroyed()) - { - assert(false); - return {}; //SOL! - } - //mitigate static initialization order fiasco: (whatever comes first) - globalEnvVars.set(std::make_unique<std::unordered_map<Zstring, Zstring>>(getAllEnvVars())); - envVars = globalEnvVars.get(); + if (const auto it = envVars->find(name); + it != envVars->end()) + return it->second; } - - const auto it = envVars->find(name); - if (it == envVars->end()) - return {}; - - return it->second; + else + assert(false); //access during global shutdown => SOL! + return {}; } diff --git a/zen/format_unit.cpp b/zen/format_unit.cpp index a5dd5152..0ce68d9b 100644 --- a/zen/format_unit.cpp +++ b/zen/format_unit.cpp @@ -27,7 +27,8 @@ std::wstring zen::formatTwoDigitPrecision(double value) //print two digits: 0,1 | 1,1 | 11 if (std::abs(value) < 9.95) //9.99 must not be formatted as "10.0" return printNumber<std::wstring>(L"%.1f", value); - return numberTo<std::wstring>(std::llround(value)); + + return formatNumber(std::llround(value)); } @@ -38,7 +39,8 @@ std::wstring zen::formatThreeDigitPrecision(double value) return printNumber<std::wstring>(L"%.2f", value); if (std::abs(value) < 99.95) //99.99 must not be formatted as "100.0" return printNumber<std::wstring>(L"%.1f", value); - return numberTo<std::wstring>(std::llround(value)); + + return formatNumber(std::llround(value)); } @@ -151,10 +153,9 @@ std::wstring zen::formatRemainingTime(double timeInSec) std::wstring zen::formatProgressPercent(double fraction, int decPlaces) { -#if 0 //special case for perf!? - if (decPlaces == 0) - return numberTo<std::wstring>(static_cast<int>(fraction * 100)) + L'%'; -#endif + if (decPlaces == 0) //special case for perf + return numberTo<std::wstring>(static_cast<int>(std::floor(fraction * 100))) + L'%'; + //round down! don't show 100% when not actually done: https://freefilesync.org/forum/viewtopic.php?t=9781 const double blocks = std::pow(10, decPlaces); const double percent = std::floor(fraction * 100 * blocks) / blocks; diff --git a/zen/globals.h b/zen/globals.h index 5d4a7041..1a110373 100644 --- a/zen/globals.h +++ b/zen/globals.h @@ -87,16 +87,32 @@ public: std::swap(pod_.inst, tmpInst); else assert(false); + + pod_.initialized = true; } delete tmpInst; } - bool wasDestroyed() + //for initialization via a frequently-called function (which may be running on parallel threads) + template <class Function> + void setOnce(Function getInitialValue /*-> std::unique_ptr<T>*/) { pod_.spinLock.lock(); ZEN_ON_SCOPE_EXIT(pod_.spinLock.unlock()); - return pod_.destroyed; + if (!pod_.initialized) + { + assert(!pod_.inst); + if (!pod_.destroyed) + { + if (std::unique_ptr<T> newInst = getInitialValue()) //throw ? + pod_.inst = new std::shared_ptr<T>(std::move(newInst)); + } + else + assert(false); + + pod_.initialized = true; + } } private: @@ -105,6 +121,7 @@ private: PodSpinMutex spinLock; //rely entirely on static zero-initialization! => avoid potential contention with worker thread during Global<> construction! //serialize access: can't use std::mutex: has non-trival destructor std::shared_ptr<T>* inst = nullptr; + bool initialized = false; bool destroyed = false; } pod_; }; @@ -128,29 +145,15 @@ class FunStatGlobal public: consteval FunStatGlobal() {}; //demand static zero-initialization! - //No ~FunStatGlobal()! + //No ~FunStatGlobal(): required to avoid generation of magic statics code for a function-scope static! - void initOnce(std::unique_ptr<T> (*getInitialValue)()) + std::shared_ptr<T> get() { static_assert(std::is_trivially_destructible_v<FunStatGlobal>, "this class must not generate code for magic statics!"); pod_.spinLock.lock(); ZEN_ON_SCOPE_EXIT(pod_.spinLock.unlock()); - if (!pod_.cleanUpEntry.cleanUpFun) - { - assert(!pod_.inst); - if (std::unique_ptr<T> newInst = (*getInitialValue)()) - pod_.inst = new std::shared_ptr<T>(std::move(newInst)); - registerDestruction(); - } - } - - std::shared_ptr<T> get() - { - pod_.spinLock.lock(); - ZEN_ON_SCOPE_EXIT(pod_.spinLock.unlock()); - if (pod_.inst) return *pod_.inst; return nullptr; @@ -165,13 +168,50 @@ public: pod_.spinLock.lock(); ZEN_ON_SCOPE_EXIT(pod_.spinLock.unlock()); - std::swap(pod_.inst, tmpInst); + if (!pod_.destroyed) + std::swap(pod_.inst, tmpInst); + else + assert(false); + registerDestruction(); } delete tmpInst; } + template <class Function> + void setOnce(Function getInitialValue /*-> std::unique_ptr<T>*/) + { + pod_.spinLock.lock(); + ZEN_ON_SCOPE_EXIT(pod_.spinLock.unlock()); + + if (!pod_.cleanUpEntry.cleanUpFun) + { + assert(!pod_.inst); + if (!pod_.destroyed) + { + if (std::unique_ptr<T> newInst = getInitialValue()) //throw ? + pod_.inst = new std::shared_ptr<T>(std::move(newInst)); + } + else + assert(false); + + registerDestruction(); + } + } + private: + void destruct() + { + static_assert(std::is_trivially_destructible_v<Pod>, "this memory needs to live forever"); + + pod_.spinLock.lock(); + std::shared_ptr<T>* oldInst = std::exchange(pod_.inst, nullptr); + pod_.destroyed = true; + pod_.spinLock.unlock(); + + delete oldInst; + } + //call while holding pod_.spinLock void registerDestruction() { @@ -182,8 +222,7 @@ private: pod_.cleanUpEntry.callbackData = this; pod_.cleanUpEntry.cleanUpFun = [](void* callbackData) { - auto thisPtr = static_cast<FunStatGlobal*>(callbackData); - thisPtr->set(nullptr); + static_cast<FunStatGlobal*>(callbackData)->destruct(); }; registerGlobalForDestruction(pod_.cleanUpEntry); @@ -196,6 +235,7 @@ private: //serialize access; can't use std::mutex: has non-trival destructor std::shared_ptr<T>* inst = nullptr; CleanUpEntry cleanUpEntry; + bool destroyed = false; } pod_; }; diff --git a/zen/http.cpp b/zen/http.cpp index e1a828c1..8cdcd65c 100644 --- a/zen/http.cpp +++ b/zen/http.cpp @@ -207,7 +207,6 @@ private: void cleanup() { asyncStreamIn_->setReadError(std::make_exception_ptr(ThreadStopRequest())); - warn_static("log on error!") } std::shared_ptr<AsyncStreamBuffer> asyncStreamIn_ = std::make_shared<AsyncStreamBuffer>(HTTP_STREAM_BUFFER_SIZE); @@ -330,7 +330,7 @@ struct Token class Scanner { public: - Scanner(const std::string& stream) : stream_(stream), pos_(stream_.begin()) + explicit Scanner(const std::string& stream) : stream_(stream), pos_(stream_.begin()) { if (zen::startsWith(stream_, BYTE_ORDER_MARK_UTF8)) pos_ += BYTE_ORDER_MARK_UTF8.size(); @@ -435,7 +435,7 @@ private: class JsonParser { public: - JsonParser(const std::string& stream) : + explicit JsonParser(const std::string& stream) : scn_(stream), tk_(scn_.getNextToken()) {} //throw JsonParsingError diff --git a/zen/legacy_compiler.h b/zen/legacy_compiler.h index 2070d60f..c853b139 100644 --- a/zen/legacy_compiler.h +++ b/zen/legacy_compiler.h @@ -41,7 +41,7 @@ basic_string<Char, Traits, Alloc> operator+(basic_string<Char, Traits, Alloc>&& //--------------------------------------------------------------------------------- //support for std::string::resize_and_overwrite() -#define ZEN_HAVE_RESIZE_AND_OVERWRITE 1 + #define ZEN_HAVE_RESIZE_AND_OVERWRITE 1 namespace zen { diff --git a/zen/open_ssl.cpp b/zen/open_ssl.cpp index 5cfd7f12..0d4a89ca 100644 --- a/zen/open_ssl.cpp +++ b/zen/open_ssl.cpp @@ -22,11 +22,40 @@ using namespace zen; +namespace +{ #ifndef OPENSSL_THREADS #error FFS, we are royally screwed! #endif -static_assert(OPENSSL_VERSION_NUMBER >= 0x30000000L, "OpenSSL version too old"); +static_assert(OPENSSL_VERSION_NUMBER >= 0x30000000L, "OpenSSL version is too old!"); + + +/* Sign a file using SHA-256: + openssl dgst -sha256 -sign private.pem -out file.sig file.txt + + verify the signature: (caveat: public key expected to be in pkix format!) + openssl dgst -sha256 -verify public.pem -signature file.sig file.txt */ + + +std::wstring formatOpenSSLError(const char* functionName, unsigned long ec) +{ + char errorBuf[256] = {}; //== buffer size used by ERR_error_string(); err.c: it seems the message uses at most ~200 bytes + ::ERR_error_string_n(ec, errorBuf, sizeof(errorBuf)); //includes null-termination + + return formatSystemError(functionName, replaceCpy(_("Error code %x"), L"%x", numberTo<std::wstring>(ec)), utfTo<std::wstring>(errorBuf)); +} + + +std::wstring formatLastOpenSSLError(const char* functionName) +{ + const auto ec = ::ERR_peek_last_error(); //"returns latest error code from the thread's error queue without modifying it" - unlike ERR_get_error() + //ERR_get_error: "returns the earliest error code from the thread's error queue and removes the entry. + // This function can be called repeatedly until there are no more error codes to return." + ::ERR_clear_error(); //clean up for next OpenSSL operation on this thread + return formatOpenSSLError(functionName, ec); +} +} void zen::openSslInit() @@ -36,19 +65,16 @@ void zen::openSslInit() //see Curl_ossl_cleanup(): https://github.com/curl/curl/blob/master/lib/vtls/openssl.c assert(runningOnMainThread()); - //excplicitly init OpenSSL on main thread: seems to initialize atomically! But it still might help to avoid issues: - [[maybe_unused]] const int rv = ::OPENSSL_init_ssl(OPENSSL_INIT_SSL_DEFAULT | OPENSSL_INIT_NO_LOAD_CONFIG, nullptr); - assert(rv == 1); //https://www.openssl.org/docs/man1.1.0/ssl/OPENSSL_init_ssl.html - - warn_static("probably should log") + //explicitly init OpenSSL on main thread: seems to initialize atomically! But it still might help to avoid issues: + //https://www.openssl.org/docs/manmaster/man3/OPENSSL_init_ssl.html + if (::OPENSSL_init_ssl(OPENSSL_INIT_SSL_DEFAULT | OPENSSL_INIT_NO_LOAD_CONFIG, nullptr) != 1) + logExtraError(_("Error during process initialization.") + L"\n\n" + formatLastOpenSSLError("OPENSSL_init_ssl")); } void zen::openSslTearDown() {} //OpenSSL 1.1.0+ deprecates all clean up functions //=> so much the theory, in practice it leaks, of course: https://github.com/openssl/openssl/issues/6283 -//=> OpenSslThreadCleanUp - namespace { struct OpenSslThreadCleanUp @@ -60,30 +86,6 @@ struct OpenSslThreadCleanUp }; thread_local OpenSslThreadCleanUp tearDownOpenSslThreadData; - -/* Sign a file using SHA-256: - openssl dgst -sha256 -sign private.pem -out file.sig file.txt - - verify the signature: (caveat: public key expected to be in pkix format!) - openssl dgst -sha256 -verify public.pem -signature file.sig file.txt */ - - -std::wstring formatOpenSSLError(const char* functionName, unsigned long ec) -{ - char errorBuf[256] = {}; //== buffer size used by ERR_error_string(); err.c: it seems the message uses at most ~200 bytes - ::ERR_error_string_n(ec, errorBuf, sizeof(errorBuf)); //includes null-termination - - return formatSystemError(functionName, replaceCpy(_("Error code %x"), L"%x", numberTo<std::wstring>(ec)), utfTo<std::wstring>(errorBuf)); -} - - -std::wstring formatLastOpenSSLError(const char* functionName) -{ - const auto ec = ::ERR_peek_last_error(); //"returns latest error code from the thread's error queue without modifying it" - unlike ERR_get_error() - ::ERR_clear_error(); //clean up for next OpenSSL operation on this thread - return formatOpenSSLError(functionName, ec); -} - //================================================================================ std::shared_ptr<EVP_PKEY> generateRsaKeyPair(int bits) //throw SysError @@ -217,7 +219,7 @@ std::string keyToStream(const EVP_PKEY* evp, RsaStreamType streamType, bool publ if (keyLen < 0) throw SysError(formatLastOpenSSLError("BIO_pending")); if (keyLen == 0) - throw SysError(formatSystemError("BIO_pending", L"", L"Unexpected failure.")); //no more error details + throw SysError(formatSystemError("BIO_pending", L"", L"No more error details.")); //no more error details std::string keyStream(keyLen, '\0'); @@ -281,7 +283,7 @@ std::string createHash(const std::string_view str, const EVP_MD* type) //throw S #else //streaming version EVP_MD_CTX* mdctx = ::EVP_MD_CTX_new(); if (!mdctx) - throw SysError(formatSystemError("EVP_MD_CTX_new", L"", L"Unexpected failure.")); //no more error details + throw SysError(formatSystemError("EVP_MD_CTX_new", L"", L"No more error details.")); //no more error details ZEN_ON_SCOPE_EXIT(::EVP_MD_CTX_free(mdctx)); if (::EVP_DigestInit(mdctx, //EVP_MD_CTX* ctx @@ -308,7 +310,7 @@ std::string createSignature(const std::string_view message, EVP_PKEY* privateKey //https://www.openssl.org/docs/manmaster/man3/EVP_DigestSign.html EVP_MD_CTX* mdctx = ::EVP_MD_CTX_new(); if (!mdctx) - throw SysError(formatSystemError("EVP_MD_CTX_new", L"", L"Unexpected failure.")); //no more error details + throw SysError(formatSystemError("EVP_MD_CTX_new", L"", L"No more error details.")); //no more error details ZEN_ON_SCOPE_EXIT(::EVP_MD_CTX_free(mdctx)); if (::EVP_DigestSignInit(mdctx, //EVP_MD_CTX* ctx @@ -347,7 +349,7 @@ void verifySignature(const std::string_view message, const std::string_view sign //https://www.openssl.org/docs/manmaster/man3/EVP_DigestVerify.html EVP_MD_CTX* mdctx = ::EVP_MD_CTX_new(); if (!mdctx) - throw SysError(formatSystemError("EVP_MD_CTX_new", L"", L"Unexpected failure.")); //no more error details + throw SysError(formatSystemError("EVP_MD_CTX_new", L"", L"No more error details.")); //no more error details ZEN_ON_SCOPE_EXIT(::EVP_MD_CTX_free(mdctx)); if (::EVP_DigestVerifyInit(mdctx, //EVP_MD_CTX* ctx @@ -553,7 +555,7 @@ std::string zen::convertPuttyKeyToPkix(const std::string_view keyStream, const s EVP_CIPHER_CTX* cipCtx = ::EVP_CIPHER_CTX_new(); if (!cipCtx) - throw SysError(formatSystemError("EVP_CIPHER_CTX_new", L"", L"Unexpected failure.")); //no more error details + throw SysError(formatSystemError("EVP_CIPHER_CTX_new", L"", L"No more error details.")); //no more error details ZEN_ON_SCOPE_EXIT(::EVP_CIPHER_CTX_free(cipCtx)); if (::EVP_DecryptInit(cipCtx, //EVP_CIPHER_CTX* ctx @@ -563,7 +565,7 @@ std::string zen::convertPuttyKeyToPkix(const std::string_view keyStream, const s throw SysError(formatLastOpenSSLError("EVP_DecryptInit_ex")); if (::EVP_CIPHER_CTX_set_padding(cipCtx, 0 /*padding*/) != 1) - throw SysError(formatSystemError("EVP_CIPHER_CTX_set_padding", L"", L"Unexpected failure.")); //no more error details + throw SysError(formatSystemError("EVP_CIPHER_CTX_set_padding", L"", L"No more error details.")); //no more error details privateBlob.resize(privateBlobEnc.size() + ::EVP_CIPHER_block_size(EVP_aes_256_cbc())); //"EVP_DecryptUpdate() should have room for (inl + cipher_block_size) bytes" @@ -613,7 +615,7 @@ std::string zen::convertPuttyKeyToPkix(const std::string_view keyStream, const s static_cast<int>(macData.size()), //int n reinterpret_cast<unsigned char*>(md), //unsigned char* md &mdLen)) //unsigned int* md_len - throw SysError(formatSystemError("HMAC", L"", L"Unexpected failure.")); //no more error details + throw SysError(formatSystemError("HMAC", L"", L"No more error details.")); //no more error details if (mac != std::string_view(md, mdLen)) throw SysError(keyEncrypted ? L"Wrong passphrase (or corrupted key)" : L"Validation failed: corrupted key"); diff --git a/zen/socket.h b/zen/socket.h index f706daab..c2fdb145 100644 --- a/zen/socket.h +++ b/zen/socket.h @@ -59,7 +59,6 @@ std::wstring formatGaiErrorCode(int ec) using SocketType = int; const SocketType invalidSocket = -1; inline void closeSocket(SocketType s) { ::close(s); } -warn_static("log on error!") void setNonBlocking(SocketType socket, bool value); //throw SysError @@ -194,8 +193,7 @@ size_t tryReadSocket(SocketType socket, void* buffer, size_t bytesToRead) //thro if (bytesReceived < 0) THROW_LAST_SYS_ERROR_WSA("recv"); - if (static_cast<size_t>(bytesReceived) > bytesToRead) //better safe than sorry - throw SysError(formatSystemError("recv", L"", L"Buffer overflow.")); + ASSERT_SYSERROR(makeUnsigned(bytesReceived) <= bytesToRead); //better safe than sorry return bytesReceived; //"zero indicates end of file" } @@ -218,11 +216,12 @@ size_t tryWriteSocket(SocketType socket, const void* buffer, size_t bytesToWrite } if (bytesWritten < 0) THROW_LAST_SYS_ERROR_WSA("send"); - if (bytesWritten > static_cast<int>(bytesToWrite)) - throw SysError(formatSystemError("send", L"", L"Buffer overflow.")); + if (bytesWritten == 0) throw SysError(formatSystemError("send", L"", L"Zero bytes processed.")); + ASSERT_SYSERROR(makeUnsigned(bytesWritten) <= bytesToWrite); //better safe than sorry + return bytesWritten; } } diff --git a/zen/stl_tools.h b/zen/stl_tools.h index 03e7901a..ff574368 100644 --- a/zen/stl_tools.h +++ b/zen/stl_tools.h @@ -187,7 +187,7 @@ void removeDuplicates(std::vector<T, Alloc>& v, CompLess less) template <class T, class Alloc> inline void removeDuplicates(std::vector<T, Alloc>& v) { - removeDuplicates(v, std::less(), std::equal_to()); + removeDuplicates(v, std::less{}, std::equal_to{}); } @@ -196,14 +196,14 @@ void removeDuplicatesStable(std::vector<T, Alloc>& v, CompLess less) { std::set<T, CompLess> usedItems(less); v.erase(std::remove_if(v.begin(), v.end(), - [&usedItems](const T& e) { return !usedItems.insert(e).second; }), v.end()); + /**/[&usedItems](const T& e) { return !usedItems.insert(e).second; }), v.end()); } template <class T, class Alloc> inline void removeDuplicatesStable(std::vector<T, Alloc>& v) { - removeDuplicatesStable(v, std::less()); + removeDuplicatesStable(v, std::less{}); } @@ -234,30 +234,28 @@ BidirectionalIterator findLast(const BidirectionalIterator first, const Bidirect } -template <class RandomAccessIterator1, class RandomAccessIterator2> inline +template <class RandomAccessIterator1, class RandomAccessIterator2, class IsEq> inline RandomAccessIterator1 searchFirst(const RandomAccessIterator1 first, const RandomAccessIterator1 last, - const RandomAccessIterator2 needleFirst, const RandomAccessIterator2 needleLast) + const RandomAccessIterator2 needleFirst, const RandomAccessIterator2 needleLast, IsEq isEqual) { if (needleLast - needleFirst == 1) //don't use expensive std::search unless required! - return std::find(first, last, *needleFirst); + return std::find_if(first, last, [needleFirst, isEqual](const auto c) { return isEqual(*needleFirst, c); }); + //"*needleFirst" could be improved with value rather than pointer access, at least for built-in types like "char" return std::search(first, last, - needleFirst, needleLast); + needleFirst, needleLast, isEqual); } -template <class RandomAccessIterator1, class RandomAccessIterator2, class IsEq> inline +template <class RandomAccessIterator1, class RandomAccessIterator2> inline RandomAccessIterator1 searchFirst(const RandomAccessIterator1 first, const RandomAccessIterator1 last, - const RandomAccessIterator2 needleFirst, const RandomAccessIterator2 needleLast, IsEq isEqual) + const RandomAccessIterator2 needleFirst, const RandomAccessIterator2 needleLast) { - if (needleLast - needleFirst == 1) //don't use expensive std::search unless required! - return std::find_if(first, last, [needleFirst, isEqual](const auto c) { return isEqual(*needleFirst, c); }); - - return std::search(first, last, - needleFirst, needleLast, isEqual); + return searchFirst(first, last, needleFirst, needleLast, std::equal_to{}); } + template <class RandomAccessIterator1, class RandomAccessIterator2> inline RandomAccessIterator1 searchLast(const RandomAccessIterator1 first, RandomAccessIterator1 last, const RandomAccessIterator2 needleFirst, const RandomAccessIterator2 needleLast) @@ -335,7 +333,7 @@ class FNV1aHash //FNV-1a: https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%8 { public: FNV1aHash() {} - explicit FNV1aHash(Num startVal) : hashVal_(startVal) { assert(startVal != 0); /*(yes, might be a real hash, but) most likely bad init value*/} + explicit FNV1aHash(Num startVal) : hashVal_(startVal) { assert(startVal != 0); /*yes, might be a real hash, but most likely bad init value*/} void add(Num n) { diff --git a/zen/symlink_target.h b/zen/symlink_target.h index 8580a9dd..24ce2313 100644 --- a/zen/symlink_target.h +++ b/zen/symlink_target.h @@ -50,7 +50,10 @@ SymlinkRawContent getSymlinkRawContent_impl(const Zstring& linkPath) //throw Sys const ssize_t bytesWritten = ::readlink(linkPath.c_str(), buf.data(), bufSize); if (bytesWritten < 0) THROW_LAST_SYS_ERROR("readlink"); - if (makeUnsigned(bytesWritten) >= bufSize) //detect truncation; not an error for readlink! + + ASSERT_SYSERROR(makeUnsigned(bytesWritten) <= bufSize); //better safe than sorry + + if (makeUnsigned(bytesWritten) == bufSize) //detect truncation; not an error for readlink! throw SysError(formatSystemError("readlink", L"", L"Buffer truncated.")); return {.targetPath = Zstring(buf.data(), bytesWritten)}; //readlink does not append 0-termination! diff --git a/zen/sys_error.h b/zen/sys_error.h index 73a92343..53cd2845 100644 --- a/zen/sys_error.h +++ b/zen/sys_error.h @@ -10,6 +10,7 @@ #include "scope_guard.h" // #include "i18n.h" //not used by this header, but the "rest of the world" needs it! #include "zstring.h" // +#include "extra_log.h" // #include <glib.h> #include <cerrno> @@ -78,7 +79,7 @@ inline bool validateBool(void* b) { return b; } bool validateBool(int) = delete; //catch unintended bool conversions, e.g. HRESULT } #define ASSERT_SYSERROR_IMPL(expr, exprStr) \ - { if (!impl::validateBool(expr)) \ + { if (!zen::impl::validateBool(expr)) \ throw zen::SysError(L"Assertion failed: \"" L ## exprStr L"\""); } } diff --git a/zen/sys_version.cpp b/zen/sys_version.cpp index e57c9b69..705fbade 100644 --- a/zen/sys_version.cpp +++ b/zen/sys_version.cpp @@ -89,8 +89,8 @@ OsVersion zen::getOsVersion() } catch (const SysError& e) { - std::cerr << utfTo<std::string>(e.toString()) + '\n'; - return OsVersionDetail{}; //sigh, it's a jungle out there: https://freefilesync.org/forum/viewtopic.php?t=7276 + logExtraError(_("Cannot get process information.") + L"\n\n" + e.toString()); + return OsVersionDetail{}; //arrgh, it's a jungle out there: https://freefilesync.org/forum/viewtopic.php?t=7276 } }(); return verDetail.version; diff --git a/zen/zlib_wrap.cpp b/zen/zlib_wrap.cpp index 7e680131..5810ef56 100644 --- a/zen/zlib_wrap.cpp +++ b/zen/zlib_wrap.cpp @@ -172,7 +172,6 @@ public: { [[maybe_unused]] const int rv = ::deflateEnd(&gzipStream_); assert(rv == Z_OK); - warn_static("log on error") } size_t read(void* buffer, size_t bytesToRead) //throw SysError, X; return "bytesToRead" bytes unless end of stream! diff --git a/zenXml/zenxml/cvrt_struc.h b/zenXml/zenxml/cvrt_struc.h index 0bfe5996..40277556 100644 --- a/zenXml/zenxml/cvrt_struc.h +++ b/zenXml/zenxml/cvrt_struc.h @@ -124,9 +124,9 @@ struct ConvertElement<T, ValueType::stlContainer> value.clear(); bool success = true; - const auto itPair = input.getChildren("Item"); + auto [it, itEnd] = input.getChildren(); - std::for_each(itPair.first, itPair.second, [&](const XmlElement& xmlChild) + std::for_each(it, itEnd, [&](const XmlElement& xmlChild) { typename T::value_type childVal; if (zen::readStruc(xmlChild, childVal)) diff --git a/zenXml/zenxml/dom.h b/zenXml/zenxml/dom.h index cba12cfb..89320db1 100644 --- a/zenXml/zenxml/dom.h +++ b/zenXml/zenxml/dom.h @@ -82,8 +82,8 @@ public: it->second->value = std::move(attrValue); else { - auto itBack = attributes_.insert(attributes_.end(), {name, std::move(attrValue)}); - attributesByName.emplace(std::move(name), itBack); + attributes_.push_back({name, std::move(attrValue)}); + attributesByName.emplace(std::move(name), --attributes_.end()); } static_assert(std::is_same_v<decltype(attributes_), std::list<Attribute>>); //must NOT invalidate references used in "attributesByName"! } @@ -97,6 +97,7 @@ public: attributes_.erase(it->second); attributesByName.erase(it); } + else assert(false); } ///Create a new child element and return a reference to it. @@ -107,9 +108,9 @@ public: { childElements_.emplace_back(name, this); XmlElement& newElement = childElements_.back(); - childElementsByName_.emplace(std::move(name), &newElement); + childElementByName_.emplace(std::move(name), --childElements_.end()); - static_assert(std::is_same_v<decltype(childElements_), std::list<XmlElement>>); //must NOT invalidate references used in "childElementsByName_"! + static_assert(std::is_same_v<decltype(childElements_), std::list<XmlElement>>); //must NOT invalidate references used in "childElementByName_"! return newElement; } @@ -120,8 +121,8 @@ public: */ const XmlElement* getChild(const std::string& name) const { - auto it = childElementsByName_.find(name); - return it == childElementsByName_.end() ? nullptr : it->second; + auto it = childElementByName_.find(name); + return it == childElementByName_.end() ? nullptr : &*(it->second); } ///\sa getChild @@ -130,71 +131,16 @@ public: return const_cast<XmlElement*>(static_cast<const XmlElement*>(this)->getChild(name)); } - template <class IterTy, //underlying iterator type - class T, //target object type - class AccessPolicy> //access policy: see AccessPtrMap - class PtrIter : private AccessPolicy //get rid of shared_ptr indirection - { - public: - using iterator_category = std::input_iterator_tag; - using value_type = T; - using difference_type = ptrdiff_t; - using pointer = T*; - using reference = T&; - - PtrIter(IterTy it) : it_(it) {} - //PtrIter(const PtrIter& other) : it_(other.it_) {} - PtrIter& operator++() { ++it_; return *this; } - PtrIter operator++(int) { PtrIter tmp(*this); operator++(); return tmp; } - inline friend bool operator==(const PtrIter& lhs, const PtrIter& rhs) { return lhs.it_ == rhs.it_; } - T& operator* () const { return AccessPolicy::template objectRef<T>(it_); } - T* operator->() const { return &AccessPolicy::template objectRef<T>(it_); } - private: - IterTy it_; - }; - - struct AccessMapElement - { - template <class T, class IterTy> - T& objectRef(const IterTy& it) const { return *(it->second); } - }; - - using ChildIter2 = PtrIter<std::multimap<std::string, XmlElement*>::iterator, XmlElement, AccessMapElement>; - using ChildIterConst2 = PtrIter<std::multimap<std::string, XmlElement*>::const_iterator, const XmlElement, AccessMapElement>; - - ///Access all child elements with the given name via STL iterators. - /** - \code - auto itPair = elem.getChildren("Item"); - std::for_each(iterPair.first, iterPair.second, - [](const XmlElement& child) { ... }); - \endcode - \param name The name of the child elements to be retrieved. - \return A pair of STL begin/end iterators to access the child elements sequentially. - */ - std::pair<ChildIterConst2, ChildIterConst2> getChildren(const std::string& name) const { return childElementsByName_.equal_range(name); } - - ///\sa getChildren - std::pair<ChildIter2, ChildIter2> getChildren(const std::string& name) { return childElementsByName_.equal_range(name); } - - struct AccessListElement - { - template <class T, class IterTy> - T& objectRef(const IterTy& it) const { return *it; } - }; - - using ChildIter = PtrIter<std::list<XmlElement>::iterator, XmlElement, AccessListElement>; - using ChildIterConst = PtrIter<std::list<XmlElement>::const_iterator, const XmlElement, AccessListElement>; + using ChildIter = std::list<XmlElement>::iterator; + using ChildIterConst = std::list<XmlElement>::const_iterator; ///Access all child elements sequentially via STL iterators. /** - \code - auto itPair = elem.getChildren(); - std::for_each(itPair.first, itPair.second, - [](const XmlElement& child) { ... }); - \endcode - \return A pair of STL begin/end iterators to access all child elements sequentially. - */ + \code + auto [it, itEnd] = elem.getChildren(); + std::for_each(it, itEnd, [](const XmlElement& child) { ... }); + \endcode + \return A pair of STL begin/end iterators to access all child elements sequentially. */ std::pair<ChildIterConst, ChildIterConst> getChildren() const { return {childElements_.begin(), childElements_.end()}; } ///\sa getChildren @@ -213,24 +159,24 @@ public: using AttrIter = std::list<Attribute>::const_iterator; /* -> disabled documentation extraction - \brief Get all attributes associated with the element. - \code + \brief Get all attributes associated with the element. + \code auto itPair = elem.getAttributes(); for (auto it = itPair.first; it != itPair.second; ++it) std::cout << std::string("name: ") + it->name + " value: " + it->value + '\n'; - \endcode - \return A pair of STL begin/end iterators to access all attributes sequentially as a list of name/value pairs of std::string. */ + \endcode + \return A pair of STL begin/end iterators to access all attributes sequentially as a list of name/value pairs of std::string. */ std::pair<AttrIter, AttrIter> getAttributes() const { return {attributes_.begin(), attributes_.end()}; } //swap two elements while keeping references to parent. -> disabled documentation extraction void swapSubtree(XmlElement& other) noexcept { - name_ .swap(other.name_); - value_ .swap(other.value_); - attributes_ .swap(other.attributes_); - attributesByName .swap(other.attributesByName); - childElements_ .swap(other.childElements_); - childElementsByName_.swap(other.childElementsByName_); + name_ .swap(other.name_); + value_ .swap(other.value_); + attributes_ .swap(other.attributes_); + attributesByName .swap(other.attributesByName); + childElements_ .swap(other.childElements_); + childElementByName_.swap(other.childElementByName_); for (XmlElement& child : childElements_) child.parent_ = this; @@ -248,12 +194,10 @@ private: std::list<Attribute> attributes_; //attributes in order of creation std::unordered_map<std::string, std::list<Attribute>::iterator> attributesByName; //alternate view for lookup - std::list<XmlElement> childElements_; //child elements in order of creation - std::multimap<std::string, XmlElement*> childElementsByName_; //alternate view for lookup - //alternative: std::unordered_map => but let's keep std::map, so which guarantees consistent order of duplicate items! - //e.g. std::unordered_map on Linux inserts duplicates in reverse! + std::list<XmlElement> childElements_; //child elements in order of creation + std::unordered_map<std::string, std::list<XmlElement>::iterator> childElementByName_; //alternate view for lookup of (*first*) child by name - XmlElement* parent_ = nullptr; + XmlElement* parent_ = nullptr; //currently unused: YAGNI? }; diff --git a/zenXml/zenxml/parser.h b/zenXml/zenxml/parser.h index 8416c211..e089a86f 100644 --- a/zenXml/zenxml/parser.h +++ b/zenXml/zenxml/parser.h @@ -206,14 +206,14 @@ void serialize(const XmlElement& element, std::string& stream, for (auto it = attr.first; it != attr.second; ++it) stream += ' ' + normalizeName(it->name) + "=\"" + normalizeAttribValue(it->value) + '"'; - auto itPair = element.getChildren(); - if (itPair.first != itPair.second) //structured element + auto [it, itEnd] = element.getChildren(); + if (it != itEnd) //structured element { //no support for mixed-mode content stream += '>' + lineBreak; - std::for_each(itPair.first, itPair.second, - [&](const XmlElement& el) { serialize(el, stream, lineBreak, indent, indentLevel + 1); }); + std::for_each(it, itEnd, [&](const XmlElement& el) + { serialize(el, stream, lineBreak, indent, indentLevel + 1); }); for (size_t i = 0; i < indentLevel; ++i) stream += indent; @@ -483,9 +483,9 @@ public: XmlElement dummy; parseChildElements(dummy); - auto itPair = dummy.getChildren(); - if (itPair.first != itPair.second) - doc.root().swapSubtree(*itPair.first); + auto [it, itEnd] = dummy.getChildren(); + if (it != itEnd) + doc.root().swapSubtree(*it); expectToken(Token::TK_END); //throw XmlParsingError return doc; diff --git a/zenXml/zenxml/xml.h b/zenXml/zenxml/xml.h index 8b86a49f..d4748bca 100644 --- a/zenXml/zenxml/xml.h +++ b/zenXml/zenxml/xml.h @@ -109,7 +109,7 @@ class XmlOut public: ///Construct an output proxy for an XML document /** - \code + \code zen::XmlDoc doc; zen::XmlOut out(doc); @@ -118,18 +118,18 @@ public: out["elem3"](-3); // saveXml(doc, "out.xml"); //throw FileError - \endcode - Output: - \verbatim + \endcode + Output: + \verbatim <?xml version="1.0" encoding="utf-8"?> <Root> <elem1>1</elem1> <elem2>2</elem2> <elem3>-3</elem3> </Root> - \endverbatim + \endverbatim */ - explicit XmlOut(XmlDoc& doc) : ref_(&doc.root()) {} + explicit XmlOut(XmlDoc& doc) : ref_(doc.root()) {} ///Retrieve a handle to an XML child element for writing /** @@ -138,8 +138,8 @@ public: */ XmlOut operator[](std::string name) const { - XmlElement* child = ref_->getChild(name); - return XmlOut(child ? *child : ref_->addChild(std::move(name))); + XmlElement* child = ref_.getChild(name); + return XmlOut(child ? *child : ref_.addChild(std::move(name))); } ///Retrieve a handle to an XML child element for writing @@ -150,7 +150,7 @@ public: */ XmlOut addChild(std::string name) const { - return XmlOut(ref_->addChild(std::move(name))); + return XmlOut(ref_.addChild(std::move(name))); } ///Write user data to the underlying XML element @@ -159,12 +159,12 @@ public: \tparam T User type that is converted into an XML element value. */ template <class T> - void operator()(const T& value) { writeStruc(value, *ref_); } + void operator()(const T& value) { writeStruc(value, ref_); } ///Write user data to an XML attribute /** This conversion requires a specialization of zen::writeText() for type T. - \code + \code zen::XmlDoc doc; zen::XmlOut out(doc); @@ -173,53 +173,50 @@ public: out["elem"].attribute("attr3", -3); // saveXml(doc, "out.xml"); //throw FileError - \endcode + \endcode Output: - \verbatim + \verbatim <?xml version="1.0" encoding="utf-8"?> <Root> <elem attr1="1" attr2="2" attr3="-3"/> </Root> - \endverbatim + \endverbatim \tparam T String-convertible user data type: e.g. any string-like type, all built-in arithmetic numbers \sa XmlElement::setAttribute() */ template <class T> - void attribute(std::string name, const T& value) { ref_->setAttribute(std::move(name), value); } + void attribute(std::string name, const T& value) { ref_.setAttribute(std::move(name), value); } private: ///Construct an output proxy for a single XML element /** \sa XmlOut(XmlDoc& doc) */ - explicit XmlOut(XmlElement& element) : ref_(&element) {} + explicit XmlOut(XmlElement& element) : ref_(element) {} - XmlElement* ref_; //always bound! + XmlElement& ref_; }; ///Proxy class to conveniently convert XML structure to user data class XmlIn { - class ErrorLog; + struct ErrorLog; public: ///Construct an input proxy for an XML document /** - \code + \code zen::XmlDoc doc; ... //load document zen::XmlIn in(doc); in["elem1"](value1); // in["elem2"](value2); //read data from XML elements into variables "value1", "value2", "value3" in["elem3"](value3); // - \endcode + \endcode */ - explicit XmlIn(const XmlDoc& doc) : nodeNameFormatted_('<' + doc.root().getName() + '>') - { - refList_.push_back(&doc.root()); - } + explicit XmlIn(const XmlDoc& doc) : XmlIn(&doc.root(), '<' + doc.root().getName() + '>', makeSharedRef<ErrorLog>()) {} ///Retrieve a handle to an XML child element for reading /** @@ -228,52 +225,59 @@ public: */ XmlIn operator[](const std::string& name) const { - std::vector<const XmlElement*> childList; - - if (const XmlElement* elem = get()) - { - auto itPair = elem->getChildren(name); - std::for_each(itPair.first, itPair.second, [&](const XmlElement& child) - { childList.push_back(&child); }); - } - - return XmlIn(childList, getChildNameFormatted(name), log_); + return XmlIn(elem_ ? elem_->getChild(name) : nullptr, elementNameFmt_ + " <" + name + '>', log_); } - ///Refer to next sibling element with the same name + ///Iterate over XML child elements /** - <b>Example:</b> Loop over all XML child elements named "Item" + <b>Example:</b> Loop over all XML child elements \verbatim - <?xml version="1.0" encoding="utf-8"?> - <Root> - <Item>1</Item> - <Item>3</Item> - <Item>5</Item> - </Root> + <?xml version="1.0" encoding="utf-8"?> + <Root> + <Item>1</Item> + <Item>3</Item> + <Item>5</Item> + </Root> \endverbatim \code - zen::XmlIn in(doc); - ... - for (zen::XmlIn child = in["Item"]; child; child.next()) - { + zen::XmlIn in(doc); ... - } + in.visitChildren([&](const XmlIn& inChild) + { + ... + }); \endcode */ - void next() { ++refIndex_; } + template <class Function> + void visitChildren(Function fun) + { + if (!elem_) + logMissingElement(); + else if (std::string value; elem_->getValue(value) && !value.empty()) + logConversionError(); //have XML value element, not container! + else + { + auto [it, itEnd] = elem_->getChildren(); + size_t childIdx = 0; + std::for_each(it, itEnd, [&](const XmlElement& child) + { + fun(XmlIn(&child, elementNameFmt_ + " <" + child.getName() + ">[" + numberTo<std::string>(++childIdx) + ']', log_)); + }); + } + } ///Test whether the underlying XML element exists /** - \code - XmlIn in(doc); - XmlIn child = in["elem1"]; - if (child) - ... - \endcode - Use member pointer as implicit conversion to bool (C++ Templates - Vandevoorde/Josuttis; chapter 20) + \code + XmlIn in(doc); + XmlIn child = in["elem1"]; + if (child) + ... + \endcode + Use member pointer as implicit conversion to bool (C++ Templates - Vandevoorde/Josuttis; chapter 20) */ - explicit operator bool() const { return get() != nullptr; } + explicit operator bool() const { return elem_; } ///Read user data from the underlying XML element /** @@ -284,25 +288,22 @@ public: template <class T> bool operator()(T& value) const { - if (const XmlElement* elem = get()) + if (elem_) { - if (readStruc(*elem, value)) + if (readStruc(*elem_, value)) return true; - log_.ref().notifyConversionError(getNameFormatted()); + logConversionError(); } else - log_.ref().notifyMissingElement(getNameFormatted()); + logMissingElement(); return false; } bool hasAttribute(const std::string& name) const { - if (const XmlElement* elem = get()) - if (elem->hasAttribute(name)) - return true; - return false; + return elem_ && elem_->hasAttribute(name); } ///Read user data from an XML attribute @@ -326,15 +327,15 @@ public: template <class T> bool attribute(const std::string& name, T& value) const { - if (const XmlElement* elem = get()) + if (elem_) { - if (elem->getAttribute(name, value)) + if (elem_->getAttribute(name, value)) return true; - log_.ref().notifyMissingAttribute(getNameFormatted(), name); + logMissingAttribute(name); } else - log_.ref().notifyMissingElement(getNameFormatted()); + logMissingElement(); return false; } @@ -342,104 +343,67 @@ public: ///Notifies errors while mapping the XML to user data /** Error logging is shared by each hiearchy of XmlIn proxy instances that are created from each other. Consequently it doesn't matter which instance you query for errors: - \code + \code XmlIn in(doc); XmlIn inItem = in["item1"]; int value = 0; inItem(value); //let's assume this conversion failed - assert(in.haveErrors() == inItem.haveErrors()); - assert(in.getErrorsAs<std::string>() == inItem.getErrorsAs<std::string>()); - \endcode + assert(in.getErrors() == inItem.getErrors()); + \endcode - Note that error logging is \b NOT global, but owned by all instances of a hierarchy of XmlIn proxies. - Therefore it's safe to use unrelated XmlIn proxies in multiple threads. - \n\n - However be aware that the chain of connected proxy instances will be broken once you call XmlIn::get() to retrieve the underlying pointer. - Errors that occur when working with this pointer are not logged by the original set of related instances. + Note that error logging is \b NOT global, but owned by all instances of a hierarchy of XmlIn proxies. + Therefore it's safe to use unrelated XmlIn proxies in different threads. */ ///Get a list of XML element and attribute names which failed to convert to user data. /** - \returns A list of XML element and attribute names, empty list if no errors occured. + \returns A list of XML element and attribute names, empty if no errors occured. */ - std::vector<std::wstring> getErrors() const - { - std::vector<std::wstring> output; + const std::wstring& getErrors() const { return log_.ref().failedElements; } - for (const std::string& str : log_.ref().elementList()) - output.push_back(utfTo<std::wstring>(str)); - - return output; + ///Retrieve the name of this XML element. + /** + \returns Name of the XML element. + */ + const std::string* getName() const + { + if (elem_) + return &elem_->getName(); + return nullptr; } private: - XmlIn(const std::vector<const XmlElement*>& siblingList, - const std::string& nodeNameFormatted, - const SharedRef<ErrorLog>& sharedlog) : refList_(siblingList), nodeNameFormatted_(nodeNameFormatted), log_(sharedlog) {} - - ///Return a pointer to the underlying Xml element, may be nullptr - const XmlElement* get() const { return refIndex_ < refList_.size() ? refList_[refIndex_] : nullptr; } - - std::string getNameFormatted() const //"<Root> <Level1> <Level2>" - { - if (refIndex_ == 0 && refList_.size() <= 1) - return nodeNameFormatted_; - else - return nodeNameFormatted_ + '[' + numberTo<std::string>(refIndex_ + 1) + ']'; - } + XmlIn(const XmlElement* elem, + const std::string& elementNameFmt, + const SharedRef<ErrorLog>& sharedlog) : log_(sharedlog), elem_(elem), elementNameFmt_(elementNameFmt) {} - std::string getChildNameFormatted(const std::string& childName) const + struct ErrorLog { - return getNameFormatted() + " <" + childName + '>'; - } + std::wstring failedElements; //unique list of failed elements + std::unordered_set<std::string> usedElements; + }; - class ErrorLog + void logElementError(const std::string& elementName) const { - public: - void notifyConversionError (const std::string& displayName) { insert(displayName); } - void notifyMissingElement (const std::string& displayName) { insert(displayName); } - void notifyMissingAttribute(const std::string& displayName, const std::string& attribName) { insert(displayName + " @" + attribName); } - - const std::vector<std::string>& elementList() const { return failedElements; } - - private: - void insert(const std::string& newVal) + if (const auto [it, inserted] = log_.ref().usedElements.insert(elementName); + inserted) { - if (usedElements.insert(newVal).second) - failedElements.push_back(newVal); + if (!log_.ref().failedElements.empty()) + log_.ref().failedElements += L'\n'; + log_.ref().failedElements += utfTo<std::wstring>(elementName); } + } - std::vector<std::string> failedElements; //unique list of failed elements - std::set<std::string> usedElements; - }; + void logConversionError() const { logElementError(elementNameFmt_); } + void logMissingElement() const { logElementError(elementNameFmt_); } + void logMissingAttribute(const std::string& attribName) const { logElementError(elementNameFmt_ + " @" + attribName); } - std::vector<const XmlElement*> refList_; //all sibling elements with same name (all pointers bound!) - size_t refIndex_ = 0; //this sibling's index in refList_ - std::string nodeNameFormatted_; - mutable SharedRef<ErrorLog> log_ = makeSharedRef<ErrorLog>(); + mutable SharedRef<ErrorLog> log_; + const XmlElement* elem_; + std::string elementNameFmt_; //e.g. "<Root> <Child> <List>[1]" }; - - -///Check XML input proxy for errors and map to FileError exception -/** -\param xmlInput XML input proxy -\throw FileError -*/ -inline -void checkXmlMappingErrors(const XmlIn& xmlInput) //throw FileError -{ - if (const std::vector<std::wstring>& errors = xmlInput.getErrors(); - !errors.empty()) - { - std::wstring msg = _("The following XML elements could not be read:") + L'\n'; - for (const std::wstring& elem : errors) - msg += L'\n' + elem; - - throw FileError(msg); - } -} } #endif //XML_H_349578228034572457454554 |