summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorB Stack <bgstack15@gmail.com>2019-03-13 10:36:44 +0000
committerB Stack <bgstack15@gmail.com>2019-03-13 10:36:44 +0000
commit2c01454a3fea1c29df0aeb208862243cb928b74c (patch)
treedc226d83311470a23cdf0c02064feb525fcc5096
parentMerge branch '10.9' into 'master' (diff)
parent10.10 (diff)
downloadFreeFileSync-10.10.tar.gz
FreeFileSync-10.10.tar.bz2
FreeFileSync-10.10.zip
Merge branch '10.10' into 'master'10.10
10.10 Latest changes: * New option: synchronize selection * Dynamically disable unsuitable context menu options * Support MTP devices without move command * Fall back to copy/delete when implicitly moving to different device (e.g. symlink) * Fixed incorrect statistics after parallel move * Fixed menu button not triggering context menu * Fixed crash on focus change while message popup is dismissed * Fixed crash when trying to shrink empty image * Fixed invisible dialogs when monitor is turned off in multi-monitor setup * Work around GetFileInformationByHandle error code 58 on WD My Cloud EX * Changing deletion handling now correctly triggers updated config * Support root-relative FTP file paths (e.g. FreeNAS) * Move and rename MTP items as a transaction * Exclude AppleDouble files (._) via default filter on macOS * Support home path for FTP folder picker * Use server default permissions when creating SFTP folder * Use native OpenSSL AES-CTR rather than libssh2 fallback * Added context information for cloud connection errors * Updated translation files See merge request opensource-tracking/FreeFileSync!7
-rwxr-xr-xBugs.txt217
-rwxr-xr-xChangelog.txt23
-rwxr-xr-xFreeFileSync/Build/Languages/arabic.lng162
-rwxr-xr-xFreeFileSync/Build/Languages/bulgarian.lng242
-rwxr-xr-xFreeFileSync/Build/Languages/chinese_simple.lng174
-rwxr-xr-xFreeFileSync/Build/Languages/chinese_traditional.lng198
-rwxr-xr-xFreeFileSync/Build/Languages/croatian.lng178
-rwxr-xr-xFreeFileSync/Build/Languages/czech.lng174
-rwxr-xr-xFreeFileSync/Build/Languages/danish.lng174
-rwxr-xr-xFreeFileSync/Build/Languages/dutch.lng174
-rwxr-xr-xFreeFileSync/Build/Languages/english_uk.lng176
-rwxr-xr-xFreeFileSync/Build/Languages/french.lng174
-rwxr-xr-xFreeFileSync/Build/Languages/german.lng132
-rwxr-xr-xFreeFileSync/Build/Languages/greek.lng182
-rwxr-xr-xFreeFileSync/Build/Languages/hebrew.lng174
-rwxr-xr-xFreeFileSync/Build/Languages/hindi.lng206
-rwxr-xr-xFreeFileSync/Build/Languages/hungarian.lng186
-rwxr-xr-xFreeFileSync/Build/Languages/italian.lng174
-rwxr-xr-xFreeFileSync/Build/Languages/japanese.lng174
-rwxr-xr-xFreeFileSync/Build/Languages/korean.lng176
-rwxr-xr-xFreeFileSync/Build/Languages/lithuanian.lng174
-rwxr-xr-xFreeFileSync/Build/Languages/norwegian.lng174
-rwxr-xr-xFreeFileSync/Build/Languages/polish.lng178
-rwxr-xr-xFreeFileSync/Build/Languages/portuguese.lng174
-rwxr-xr-xFreeFileSync/Build/Languages/portuguese_br.lng222
-rwxr-xr-xFreeFileSync/Build/Languages/romanian.lng176
-rwxr-xr-xFreeFileSync/Build/Languages/russian.lng174
-rwxr-xr-xFreeFileSync/Build/Languages/slovenian.lng174
-rwxr-xr-xFreeFileSync/Build/Languages/spanish.lng182
-rwxr-xr-xFreeFileSync/Build/Languages/swedish.lng178
-rwxr-xr-xFreeFileSync/Build/Languages/turkish.lng162
-rwxr-xr-xFreeFileSync/Build/Languages/ukrainian.lng162
-rwxr-xr-xFreeFileSync/Build/Resources.zipbin323313 -> 286899 bytes
-rw-r--r--FreeFileSync/Source/RealTimeSync/app_icon.h9
-rw-r--r--FreeFileSync/Source/RealTimeSync/application.cpp1
-rw-r--r--FreeFileSync/Source/RealTimeSync/tray_menu.cpp2
-rw-r--r--FreeFileSync/Source/base/algorithm.cpp127
-rw-r--r--FreeFileSync/Source/base/algorithm.h5
-rw-r--r--FreeFileSync/Source/base/application.cpp3
-rw-r--r--FreeFileSync/Source/base/db_file.cpp2
-rw-r--r--FreeFileSync/Source/base/ffs_paths.cpp4
-rw-r--r--FreeFileSync/Source/base/file_hierarchy.cpp32
-rw-r--r--FreeFileSync/Source/base/file_hierarchy.h2
-rw-r--r--FreeFileSync/Source/base/help_provider.h50
-rw-r--r--FreeFileSync/Source/base/parallel_scan.cpp2
-rw-r--r--FreeFileSync/Source/base/synchronization.cpp550
-rw-r--r--FreeFileSync/Source/base/versioning.cpp8
-rw-r--r--FreeFileSync/Source/fs/abstract.cpp4
-rw-r--r--FreeFileSync/Source/fs/abstract.h20
-rw-r--r--FreeFileSync/Source/fs/abstract_impl.h2
-rw-r--r--FreeFileSync/Source/fs/ftp.cpp406
-rw-r--r--FreeFileSync/Source/fs/ftp.h2
-rw-r--r--FreeFileSync/Source/fs/gdrive.cpp1119
-rw-r--r--FreeFileSync/Source/fs/init_curl_libssh2.cpp6
-rw-r--r--FreeFileSync/Source/fs/libssh2/init_libssh2.cpp16
-rw-r--r--FreeFileSync/Source/fs/native.cpp89
-rw-r--r--FreeFileSync/Source/fs/sftp.cpp347
-rw-r--r--FreeFileSync/Source/ui/app_icon.h10
-rw-r--r--FreeFileSync/Source/ui/file_grid.cpp9
-rw-r--r--FreeFileSync/Source/ui/file_grid.h4
-rw-r--r--FreeFileSync/Source/ui/gui_generated.cpp10142
-rw-r--r--FreeFileSync/Source/ui/gui_generated.h2170
-rw-r--r--FreeFileSync/Source/ui/log_panel.cpp2
-rw-r--r--FreeFileSync/Source/ui/main_dlg.cpp688
-rw-r--r--FreeFileSync/Source/ui/main_dlg.h4
-rw-r--r--FreeFileSync/Source/ui/progress_indicator.cpp8
-rw-r--r--FreeFileSync/Source/ui/small_dlgs.cpp35
-rw-r--r--FreeFileSync/Source/ui/small_dlgs.h1
-rw-r--r--FreeFileSync/Source/ui/sync_cfg.cpp12
-rw-r--r--FreeFileSync/Source/ui/tree_grid.cpp2
-rw-r--r--FreeFileSync/Source/version/version.h2
-rw-r--r--wx+/grid.cpp74
-rw-r--r--wx+/grid.h25
-rw-r--r--wx+/image_resources.cpp2
-rw-r--r--wx+/image_tools.h4
-rw-r--r--wx+/popup_dlg.cpp1
-rw-r--r--wx+/tooltip.cpp11
-rw-r--r--xBRZ/src/xbrz_tools.h10
-rw-r--r--zen/file_access.cpp77
-rw-r--r--zen/file_access.h17
-rw-r--r--zen/file_error.h3
-rw-r--r--zen/file_io.cpp66
-rw-r--r--zen/file_io.h6
-rw-r--r--zen/http.cpp2
-rw-r--r--zen/shutdown.cpp4
-rw-r--r--zen/zstring.h2
-rw-r--r--zenXml/zenxml/xml.h2
87 files changed, 11387 insertions, 10416 deletions
diff --git a/Bugs.txt b/Bugs.txt
new file mode 100755
index 00000000..1cec865e
--- /dev/null
+++ b/Bugs.txt
@@ -0,0 +1,217 @@
+When manually compiling FreeFileSync, you should also fix the following bugs in its dependent libraries:
+
+
+----------------
+| libssh2 Bugs |
+----------------
+__________________________________________________________________________________________________________
+Amazons SFTP server returns legitimate package sizes of ~100kb!
+https://freefilesync.org/forum/viewtopic.php?t=5999
+
+/src/sftp.c:
+
+- #define LIBSSH2_SFTP_PACKET_MAXLEN 80000
++ #define LIBSSH2_SFTP_PACKET_MAXLEN 160000
+__________________________________________________________________________________________________________
+
+
+----------------
+| libcurl Bugs |
+----------------
+__________________________________________________________________________________________________________
+https://github.com/curl/curl/issues/1455
+
+/lib/ftp.c:
+
+Add:
+ static bool is_routable_ip_v4(unsigned int ip[4])
+ {
+ if (ip[0] == 127 || //127.0.0.0/8 (localhost)
+ ip[0] == 10 || //10.0.0.0/8 (private)
+ (ip[0] == 192 && ip[1] == 168) || //192.168.0.0/16 (private)
+ (ip[0] == 169 && ip[1] == 254) || //169.254.0.0/16 (link-local)
+ (ip[0] == 172 && ip[1] / 16 == 1)) //172.16.0.0/12 (private)
+ return false;
+ return true;
+ }
+
+
+Remove: if (data->set.ftp_skip_ip)
+
+Replace with:
+
+ bool skipIp = data->set.ftp_skip_ip;
+ if (!skipIp && !is_routable_ip_v4(ip))
+ {
+ unsigned int ip_ctrl[4];
+ if (4 != sscanf(control_address(conn), "%u.%u.%u.%u",
+ &ip_ctrl[0], &ip_ctrl[1], &ip_ctrl[2], &ip_ctrl[3]) ||
+ is_routable_ip_v4(ip_ctrl))
+ skipIp = true;
+ }
+
+ if (skipIp)
+__________________________________________________________________________________________________________
+
+"wrong dir listing because libcurl remembers wrong CWD": https://github.com/curl/curl/issues/1782
+
+=> "fixed" by adding only the "if (data->set.ftp_filemethod == FTPFILE_NOCWD)" below: https://github.com/curl/curl/issues/1811
+=> this is NOT enough! consider what happens for a reused connection that first used CURLFTPMETHOD_MULTICWD, now CURLFTPMETHOD_NOCWD:
+
+ the code in ftp_state_cwd() will issue a CWD sequence that ends with "ftpc->cwdcount == 1"!!! See "if (++ftpc->cwdcount <= ftpc->dirdepth)"
+ => this skips the previous "fix" in https://github.com/curl/curl/issues/1718 with
+ if ((conn->data->set.ftp_filemethod == FTPFILE_NOCWD) && !ftpc->cwdcount)
+
+/lib/ftp.c:
+
+ if (ftpc->prevpath)
+ {
++ if (data->set.ftp_filemethod == FTPFILE_NOCWD)
++ {
++ /*
++ CURLFTPMETHOD_NOCWD
++ if the connection is used for the first time, *no* CWD takes place
++ if the connection is reused, ftp_state_cwd() issues a single "CWD ftpc->entrypath" before the operation
++ in both cases ftp_done() sets ftpc->prevpath to "" after a successfull FTP operation
++ ergo: "" corresponds to ftpc->entrypath, so we only ever need CWD if ftpc->prevpath != ""
++ => avoid needless "CWD /" and reduce folder traversal time with CURLFTPMETHOD_NOCWD by 15-20%
++ */
++ if (strcmp(ftpc->prevpath, "") == 0)
++ {
++ infof(data, "Request has same path (\"%s\") as previous transfer\n", ftpc->prevpath);
++ ftpc->cwddone = TRUE;
++ }
++ }
++ else
++ {
+ /* prevpath is "raw" so we convert the input path before we compare the
+ strings */
+ size_t dlen;
+ char* path;
+ CURLcode result =
+ Curl_urldecode(conn->data, data->state.path, 0, &path, &dlen, FALSE);
+ if (result)
+ {
+ freedirs(ftpc);
+ return result;
+ }
+
+ dlen -= ftpc->file?strlen(ftpc->file):0;
+ if ((dlen == strlen(ftpc->prevpath)) &&
+ !strncmp(path, ftpc->prevpath, dlen) &&
+- (ftpc->prevmethod == data->set.ftp_filemethod))
++ true) //(ftpc->prevmethod == data->set.ftp_filemethod))
+ {
+ infof(data, "Request has same path as previous transfer\n");
+ ftpc->cwddone = TRUE;
+ }
+ free(path);
++ }
+ }
+__________________________________________________________________________________________________________
+
+
+------------------
+| wxWidgets Bugs |
+------------------
+__________________________________________________________________________________________________________
+Fix incorrect pane height calculations:
+
+/src/aui/framemanager.cpp:
+
+- // determine the dock's minimum size
+- bool plus_border = false;
+- bool plus_caption = false;
+- int dock_min_size = 0;
+- for (j = 0; j < dock_pane_count; ++j)
+- {
+- wxAuiPaneInfo& pane = *dock.panes.Item(j);
+- if (pane.min_size != wxDefaultSize)
+- {
+- if (pane.HasBorder())
+- plus_border = true;
+- if (pane.HasCaption())
+- plus_caption = true;
+- if (dock.IsHorizontal())
+- {
+- if (pane.min_size.y > dock_min_size)
+- dock_min_size = pane.min_size.y;
+- }
+- else
+- {
+- if (pane.min_size.x > dock_min_size)
+- dock_min_size = pane.min_size.x;
+- }
+- }
+- }
+-
+- if (plus_border)
+- dock_min_size += (pane_borderSize*2);
+- if (plus_caption && dock.IsHorizontal())
+- dock_min_size += (caption_size);
+-
+- dock.min_size = dock_min_size;
+
+
++ // determine the dock's minimum size
++ int dock_min_size = 0;
++ for (j = 0; j < dock_pane_count; ++j)
++ {
++ wxAuiPaneInfo& pane = *dock.panes.Item(j);
++ if (pane.min_size != wxDefaultSize)
++ {
++ int paneSize = dock.IsHorizontal() ? pane.min_size.y : pane.min_size.x;
++ if (pane.HasBorder())
++ paneSize += 2 * pane_borderSize;
++ if (pane.HasCaption() && dock.IsHorizontal())
++ paneSize += caption_size;
++
++ if (paneSize > dock_min_size)
++ dock_min_size = paneSize;
++ }
++ }
++
++ dock.min_size = dock_min_size;
+__________________________________________________________________________________________________________
+
+/src/gtk/menu.cpp:
+
+-g_signal_connect(m_menu, "map", G_CALLBACK(menu_map), this);
++g_signal_connect(m_menu, "show", G_CALLBACK(menu_map), this); //"map" is never called on Ubuntu Unity, but "show" is
+__________________________________________________________________________________________________________
+
+Backspace not working in filter dialog: http://www.freefilesync.org/forum/viewtopic.php?t=347
+
+/src/gtk/window.cpp:
+
+ void wxWindowGTK::ConnectWidget( GtkWidget *widget )
+ {
+- static bool isSourceAttached;
+- if (!isSourceAttached)
+- {
+- // attach GSource to detect new GDK events
+- isSourceAttached = true;
+- static GSourceFuncs funcs = {
+- source_prepare, source_check, source_dispatch,
+- NULL, NULL, NULL
+- };
+- GSource* source = g_source_new(&funcs, sizeof(GSource));
+- // priority slightly higher than GDK_PRIORITY_EVENTS
+- g_source_set_priority(source, GDK_PRIORITY_EVENTS - 1);
+- g_source_attach(source, NULL);
+- }
++//
++// if (!isSourceAttached)
++// {
++// // attach GSource to detect new GDK events
++// isSourceAttached = true;
++// static GSourceFuncs funcs = {
++// source_prepare, source_check, source_dispatch,
++// NULL, NULL, NULL
++// };
++// GSource* source = g_source_new(&funcs, sizeof(GSource));
++// // priority slightly higher than GDK_PRIORITY_EVENTS
++// g_source_set_priority(source, GDK_PRIORITY_EVENTS - 1);
++// g_source_attach(source, NULL);
++// }
+__________________________________________________________________________________________________________
diff --git a/Changelog.txt b/Changelog.txt
index dc7b5ab5..58d91e3b 100755
--- a/Changelog.txt
+++ b/Changelog.txt
@@ -1,3 +1,26 @@
+FreeFileSync 10.10 [2019-03-10]
+-------------------------------
+New option: synchronize selection
+Dynamically disable unsuitable context menu options
+Support MTP devices without move command
+Fall back to copy/delete when implicitly moving to different device (e.g. symlink)
+Fixed incorrect statistics after parallel move
+Fixed menu button not triggering context menu
+Fixed crash on focus change while message popup is dismissed
+Fixed crash when trying to shrink empty image
+Fixed invisible dialogs when monitor is turned off in multi-monitor setup
+Work around GetFileInformationByHandle error code 58 on WD My Cloud EX
+Changing deletion handling now correctly triggers updated config
+Support root-relative FTP file paths (e.g. FreeNAS)
+Move and rename MTP items as a transaction
+Exclude AppleDouble files (._) via default filter on macOS
+Support home path for FTP folder picker
+Use server default permissions when creating SFTP folder
+Use native OpenSSL AES-CTR rather than libssh2 fallback
+Added context information for cloud connection errors
+Updated translation files
+
+
FreeFileSync 10.9 [2019-02-10]
------------------------------
Added FTP, SFTP, Google Drive support for Linux
diff --git a/FreeFileSync/Build/Languages/arabic.lng b/FreeFileSync/Build/Languages/arabic.lng
index 1d4f1ac1..12560c6a 100755
--- a/FreeFileSync/Build/Languages/arabic.lng
+++ b/FreeFileSync/Build/Languages/arabic.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>حدث استثناء</target>
-<source>A directory path is expected after %x.</source>
-<target>مسار متوقع بعد %x.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>متوقع المسار لليمين واليسار بعد %x.</target>
<source>Syntax error</source>
<target>خطأ في البنية</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>متوقع المسار لليمين واليسار بعد %x.</target>
-
<source>Cannot find file %x.</source>
<target>لا يمكن العثور على المجلد %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>لا يحتوي الملف %x تكويناً صحيحاً.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>لم يتم تحديد عدد متساوي من المسارات على الطرفين.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>يجب أن يحتوي ملف الخيارات الخيارات على مستوى أزواج المسارات عند تحديد المسارات بواسطة سطر الأوامر.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>أي عدد من أزواج المسارات البديلة من أجل ملف خيارات واحد.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>فتح التكوين المحدد لتعديله فقط بدون تنفيذه.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>المجلدات سيتم انئاءها عند الحاجة.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target></target>
+
<source>Scanning:</source>
<target>الفحص:</target>
@@ -436,9 +433,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>الرجاء تشغيل نسخة 64-بت من FreeFileSync لإنشاء نسخ الظل على هذا النظام.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>تعذر تحديد اسم الوسط %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>اسم وحدة التخزين %x ليس جزءاُ من اسم الملف %y.</target>
@@ -502,6 +496,21 @@
<source>Source item %x not found</source>
<target>العنصر المصدر %x لم يتم ايجاده</target>
+<source>Cannot move file %x to %y.</source>
+<target>لا يمكن نقل الملف %x إلى %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target></target>
+
+<source>The name %x is already used by another item.</source>
+<target></target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>لا يمكن نسخ الملف %x إلى %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>لا يمكن نسخ الرابط الرمزي من %x إلى %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>جاري إنشاء نسخة ظل وسيطة لـ %x...</target>
@@ -523,6 +532,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>العناصر التالية لم تحل اختلافاتها، و لن يتم مزامنتها:</target>
+<source>Folder pair:</source>
+<target>زوج المجلدات:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>المجلدات التالية تختلف اختلافا كبيرا. يرجى التحقق من تحديد المجلدات الصحيحة لإجراء التزامن.</target>
@@ -579,14 +591,17 @@ Actual: %y bytes
<source>Cannot write permissions of %x.</source>
<target>لا يمكن كتابة أذونات %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>العملية غير مدعومة لأنواع المجلدات مختلفة الأساس.</target>
+<source>Operation not supported between different devices.</source>
+<target></target>
-<source>Cannot move file %x to %y.</source>
-<target>لا يمكن نقل الملف %x إلى %y.</target>
+<source>Cannot delete file %x.</source>
+<target>لا يمكن حذف الملف %x.</target>
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>لا يمكن نسخ الرابط الرمزي من %x إلى %y.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>لا يمكن حذف الرابط الرمزي %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>لا يمكن حذف المسار %x.</target>
<source>Error Code %x</source>
<target>رمز الخطأ %x</target>
@@ -597,21 +612,18 @@ Actual: %y bytes
<source>Cannot open directory %x.</source>
<target>لا يمكن فتح المسار %x.</target>
-<source>Cannot create directory %x.</source>
-<target>لا يمكن إنشاء المسار %x.</target>
-
-<source>Cannot delete file %x.</source>
-<target>لا يمكن حذف الملف %x.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>لا يمكن حذف المسار %x.</target>
-
<source>Cannot write modification time of %x.</source>
<target>لا يمكن كتابة وقت تعديل %x.</target>
<source>Cannot determine final path for %x.</source>
<target>تعذر تحديد المسار النهائي لـ %x.</target>
+<source>Cannot create directory %x.</source>
+<target>لا يمكن إنشاء المسار %x.</target>
+
+<source>Operation not supported by device.</source>
+<target></target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>لا يمكن حل الارتباط الرمزي %x.</target>
@@ -624,29 +636,32 @@ Actual: %y bytes
<source>Authentication completed.</source>
<target>نجحت المصادقة.</target>
-<source>Authentication failed.</source>
-<target>فشلت المصادقة.</target>
-
<source>You may close this page now and continue with FreeFileSync.</source>
<target>يمكنك غلق هذه الصفحة والاستمرار باستخدام FreeFileSync.</target>
-<source>The server returned an error:</source>
-<target>الخادم ارسل الخطأ:</target>
+<source>Authentication failed.</source>
+<target>فشلت المصادقة.</target>
+
+<source>Unable to disconnect from %x.</source>
+<target></target>
-<source>Cannot determine free disk space for %x.</source>
-<target>لا يمكن تحديد مساحة القرص الحرة لـ %x.</target>
+<source>Cannot monitor directory %x.</source>
+<target>لا يمكن مراقبة المسار %x.</target>
<source>Cannot find %x.</source>
<target>لا يمكن العثور على %x.</target>
+<source>Please authorize access to user account %x.</source>
+<target></target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>لا يمكن تحديد مساحة القرص الحرة لـ %x.</target>
+
<source>Cannot find device %x.</source>
<target>لا يمكن العثور على الجهاز %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>نوع العنصر %x غير مدعوم:</target>
-
-<source>Cannot delete symbolic link %x.</source>
-<target>لا يمكن حذف الرابط الرمزي %x.</target>
+<source>Unsupported item type.</source>
+<target></target>
<source>Incorrect command line:</source>
<target>سطر أوامر خاطئ:</target>
@@ -790,8 +805,8 @@ The command is triggered if:
<source>&Restore</source>
<target>&استعادة</target>
-<source>&Show error</source>
-<target>إ&ظهار الخطأ</target>
+<source>&Show error message</source>
+<target></target>
<source>&Quit</source>
<target>إ&نهاء</target>
@@ -824,6 +839,9 @@ The command is triggered if:
<source>Loading...</source>
<target>تحميل...</target>
+<source>Scanning...</source>
+<target>جاري الفحص...</target>
+
<source>job name</source>
<target>اسم المهمة</target>
@@ -1056,12 +1074,12 @@ The command is triggered if:
<source>View type:</source>
<target>عرض النوع:</target>
-<source>Save as default</source>
-<target>حفظ كافتراضي</target>
-
<source>Select view:</source>
<target>اختيار نمط العرض:</target>
+<source>Save as default</source>
+<target>حفظ كافتراضي</target>
+
<source>Statistics:</source>
<target>إحصائيات:</target>
@@ -1080,9 +1098,6 @@ The command is triggered if:
<source>Arrange folder pair</source>
<target>ترتيب زوج المجلدات</target>
-<source>Folder pair:</source>
-<target>زوج المجلدات:</target>
-
<source>Main settings:</source>
<target>الإعدادات الرئيسية:</target>
@@ -1208,12 +1223,21 @@ The command is triggered if:
<source>OK</source>
<target>موافق</target>
-<source>Enter your login details:</source>
-<target>أدخل تفاصيل تسجيل الدخول:</target>
-
<source>Connection type:</source>
<target>نوع الاتصال:</target>
+<source>Connected user accounts:</source>
+<target></target>
+
+<source>&Add connection</source>
+<target></target>
+
+<source>&Disconnect</source>
+<target></target>
+
+<source>Selected user account:</source>
+<target></target>
+
<source>Server name or IP address:</source>
<target>اسم الخادم أو عنوان IP:</target>
@@ -1262,15 +1286,9 @@ The command is triggered if:
<source>Detect server limit</source>
<target>اكتشاف حد الخادم</target>
-<source>Select a directory on the server:</source>
-<target>تحديد دليل على الخادم:</target>
-
<source>Select Folder</source>
<target>اختر مجلد</target>
-<source>Start synchronization now?</source>
-<target>بدأ المزامنة الآن؟</target>
-
<source>Variant:</source>
<target>بديل:</target>
@@ -1322,9 +1340,6 @@ The command is triggered if:
<source>Run minimized</source>
<target>تشغيل بوضع التصغير</target>
-<source>&Show error dialog</source>
-<target>&إظهار نافذة الأخطاء</target>
-
<source>Show pop-up on errors or warnings</source>
<target>إظهار إطارات منبثقة عند حصول أخطاء أو تحذيرات</target>
@@ -1575,11 +1590,11 @@ This guarantees a consistent state even in case of a serious error.
<source>multiple selection</source>
<target>تحديد متعدد</target>
-<source>Include via filter:</source>
-<target>تضمن عن طريق فلتر:</target>
+<source>&Include via filter:</source>
+<target></target>
-<source>Exclude via filter:</source>
-<target>استبعاد باستخدام عامل الفلترة:</target>
+<source>&Exclude via filter:</source>
+<target></target>
<source>Include temporarily</source>
<target>شمول مؤقتاً</target>
@@ -1587,6 +1602,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Exclude temporarily</source>
<target>استبعاد مؤقتاً</target>
+<source>&Synchronize selection</source>
+<target></target>
+
<source>&Copy to...</source>
<target>&نسخ إلى...</target>
@@ -1722,9 +1740,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Initializing...</source>
<target>التجهيز للبدأ...</target>
-<source>Scanning...</source>
-<target>جاري الفحص...</target>
-
<source>Comparing content...</source>
<target>مقارنة المحتوى...</target>
@@ -1743,6 +1758,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Recommended range:</source>
<target>النطاق المستحسن:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target></target>
+
<source>Password:</source>
<target>كلمة المرور:</target>
@@ -1797,6 +1815,12 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>هل تريد حقاً حذف الـ %x ملف التالية ؟</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target></target>
+
+<source>Start synchronization now?</source>
+<target>بدأ المزامنة الآن؟</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>نسخ DACL, SACL, Owner, Group</target>
@@ -1980,9 +2004,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Unable to register device notifications for %x.</source>
<target>تعذر تسجيل تنبيهات الجهاز لـ %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>لا يمكن مراقبة المسار %x.</target>
-
<source>The file is locked by another process:</source>
<target>الملف مقفول من قبل عملية أخرى:</target>
@@ -2001,9 +2022,6 @@ This guarantees a consistent state even in case of a serious error.
<source>%x is not a regular directory name.</source>
<target>%x ليس اسم دليل اعتيادي.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>لا يمكن نسخ الملف %x إلى %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>لا يمكن نسخ السمات من %x إلى %y.</target>
diff --git a/FreeFileSync/Build/Languages/bulgarian.lng b/FreeFileSync/Build/Languages/bulgarian.lng
index 6334a693..3efecf07 100755
--- a/FreeFileSync/Build/Languages/bulgarian.lng
+++ b/FreeFileSync/Build/Languages/bulgarian.lng
@@ -53,20 +53,17 @@
<target>Проверява достъпността на кошчето за папка %x...</target>
<source>The recycle bin is not supported by the following folders. Deleted or overwritten files will not be able to be restored:</source>
-<target>Кошчето не се поддържа за следните папки. Изтритите или презаписани файлове няма да могат да се възстановяват:</target>
+<target>Кошчето не се поддържа от следните папки. Изтрити или презаписани файлове няма да могат да се възстановят:</target>
<source>An exception occurred</source>
<target>Възникна изключение</target>
-<source>A directory path is expected after %x.</source>
-<target>Очаква се път до директория след %x.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Очаква се път до лява и дясна директория след %x.</target>
<source>Syntax error</source>
<target>Синтактична грешка</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>Очаква се път до лява и дясна директория след %x.</target>
-
<source>Cannot find file %x.</source>
<target>Не е намерен файл %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>Файл %x не съдържа валидна конфигурация.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Зададен е нееднакъв брой директории отляво и отдясно.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Конфигурационният файл не може да съдържа настройки на ниво двойка директории, ако директории се задават от команден ред.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Произволен брой алтернативни двойки директории за най-много един конфигурационен файл.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>Отвори избраната конфигурация само за редактиране, без да се изпълнява.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>Папките се създават автоматично, когато потрябват.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>Следните пътища се различават по регистър. Моля, ползвайте еднаква форма за избягване на дублиран достъп.</target>
+
<source>Scanning:</source>
<target>Търси файлове:</target>
@@ -424,9 +421,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Моля, ползвайте 64-битова FreeFileSync-версия за създаване на shadow-копия на тази система.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>Не може да определи името на тома за %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>Името на тома %x не е част от пътя до файла %y.</target>
@@ -490,6 +484,21 @@
<source>Source item %x not found</source>
<target>Изходен елемент %x не е намерен</target>
+<source>Cannot move file %x to %y.</source>
+<target>Не може да премести файл %x в %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>Родителска папка %x не съществува.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>Името %x вече се използва от друг елемент.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Не може да копира файл %x в %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Не може да копира символна връзка %x в %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Създава се Volume Shadow Copy за %x...</target>
@@ -511,6 +520,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Следните елементи имат нерешени конфликти и няма да бъдат синхронизирани:</target>
+<source>Folder pair:</source>
+<target>Двойка папки:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>Следните папки са съществено различни. Моля, проверете дали са избрани верни папки за синхронизация.</target>
@@ -527,7 +539,7 @@
<target>Някои файлове ще бъдат синхронизирани като част от повече базови папки.</target>
<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>За избягване на конфликти задайте изключващи филтри, тъй че всеки актуализиран файл да се следи само от една базова папка.</target>
+<target>За избягване конфликти задайте изключващи филтри, тъй че всеки актуализиран файл да бъде следен само от една базова папка.</target>
<source>Versioning folder:</source>
<target>Папка за версии:</target>
@@ -561,80 +573,83 @@ Actual: %y bytes
<target>
Неочакван размер на потока данни.
Очаквани: %x байта
-Действителни: %y байта
+Фактически: %y байта
</target>
<source>Cannot write permissions of %x.</source>
<target>Не може да запише правата за достъп на %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Операцията не се поддържа за различни типове основни папки.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>Не може да премести файл %x в %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Не може да копира символната връзка %x в %y.</target>
-
-<source>Error Code %x</source>
-<target>Код на грешка %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>Не може да получи информация за сървъра %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Не може да отвори директория %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Не може да създаде директория %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>Операцията не се поддържа между различни устройства.</target>
<source>Cannot delete file %x.</source>
<target>Не може да изтрие файл %x.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Не може да изтрие символна връзка %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>Не може да изтрие директория %x.</target>
+<source>Error Code %x</source>
+<target>Код на грешка %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>Не може да запише времето на промяна на %x.</target>
+<source>Cannot create directory %x.</source>
+<target>Не може да създаде директория %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>Не може да определи крайния път за %x.</target>
+<source>Operation not supported by device.</source>
+<target>Операцията не се поддържа от устройството.</target>
+
<source>Cannot resolve symbolic link %x.</source>
-<target>Не може да проследи символната връзка %x.</target>
+<target>Не може да проследи символна връзка %x.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>Не може да премести %x в кошчето.</target>
-<source>Unable to access %x.</source>
-<target>Няма достъп до %x.</target>
-
<source>Authentication completed.</source>
-<target>Аутентификацията приключи.</target>
+<target>Аутентификацията завърши.</target>
+
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>Може да затворите тази страница и да продължите с FreeFileSync.</target>
<source>Authentication failed.</source>
<target>Аутентификацията неуспешна.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>Може да затворите тази страница и да продължите с FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>Не може да намери %x.</target>
-<source>The server returned an error:</source>
-<target>Сървърът връща грешка:</target>
+<source>Please authorize access to user account %x.</source>
+<target>Моля, оторизирайте достъпа до потребителски акаунт %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>Не може да определи свободното дисково пространство за %x.</target>
-<source>Cannot find %x.</source>
-<target>Не е намерен %x.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Не може да прекъсне връзката от %x.</target>
+
+<source>Unable to access %x.</source>
+<target>Няма достъп до %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>Не може да получи информация за сървъра %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>Не може да следи директория %x.</target>
<source>Cannot find device %x.</source>
-<target>Не е намерено устройство %x.</target>
+<target>Не може да намери устройство %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>Типа на елемент %x не се поддържа:</target>
+<source>Cannot open directory %x.</source>
+<target>Не може да отвори директория %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>Не може да изтрие символната връзка %x.</target>
+<source>Unsupported item type.</source>
+<target>Неподдържан тип елемент.</target>
<source>Incorrect command line:</source>
<target>Невалиден команден ред:</target>
@@ -759,7 +774,7 @@ The command is triggered if:
<target>Автоматична синхронизация</target>
<source>The %x protocol does not support directory monitoring:</source>
-<target>Протоколът %x не поддържа следене на директорията:</target>
+<target>Протокол %x не поддържа следене на директорията:</target>
<source>Directory monitoring active</source>
<target>Следенето на директории е активирано</target>
@@ -770,8 +785,8 @@ The command is triggered if:
<source>&Restore</source>
<target>&Възстановяване</target>
-<source>&Show error</source>
-<target>&Покажи грешката</target>
+<source>&Show error message</source>
+<target>&Покажи съобщение за грешка</target>
<source>&Quit</source>
<target>&Край</target>
@@ -800,8 +815,11 @@ The command is triggered if:
<source>Loading...</source>
<target>Зареждане...</target>
+<source>Scanning...</source>
+<target>Търси файлове...</target>
+
<source>job name</source>
-<target>име на задачата</target>
+<target>име на задача</target>
<source>System: Sleep</source>
<target>Система: Заспиване</target>
@@ -810,13 +828,13 @@ The command is triggered if:
<target>Система: Изключване</target>
<source>Nothing to synchronize</source>
-<target>Няма нищо за синхронизиране</target>
+<target>Нищо за синхронизиране</target>
<source>Executing command %x</source>
<target>Изпълнява команда %x</target>
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
-<target>За да решите този проблем идете в главното меню на FreeFileSync.</target>
+<target>Може да идете в главния прозорец на FreeFileSync, за да решите проблема.</target>
<source>&Don't show this warning again</source>
<target>&Не показвай вече това предупреждение</target>
@@ -828,7 +846,7 @@ The command is triggered if:
<target>&Превключи</target>
<source>Switching to FreeFileSync's main window</source>
-<target>Иди в главното меню на FreeFileSync</target>
+<target>Иди в главния прозорец на FreeFileSync</target>
<source>Automatic retry</source>
<target>Автоматично повтаряне</target>
@@ -879,7 +897,7 @@ The command is triggered if:
<target>Относителен път</target>
<source>Item name</source>
-<target>Име на елемента</target>
+<target>Име на елемент</target>
<source>Size</source>
<target>Размер</target>
@@ -972,7 +990,7 @@ The command is triggered if:
<target>&Намери...</target>
<source>&Export file list...</source>
-<target>&Експортирай списъка с файлове...</target>
+<target>&Експортирай файловия списък...</target>
<source>&Reset layout</source>
<target>&Инициализирай изгледа</target>
@@ -1028,12 +1046,12 @@ The command is triggered if:
<source>View type:</source>
<target>Тип изглед:</target>
-<source>Save as default</source>
-<target>Запази като подразбирано</target>
-
<source>Select view:</source>
<target>Изберете изглед:</target>
+<source>Save as default</source>
+<target>Запази като подразбрано</target>
+
<source>Statistics:</source>
<target>Статистика:</target>
@@ -1052,9 +1070,6 @@ The command is triggered if:
<source>Arrange folder pair</source>
<target>Подреди двойката папки</target>
-<source>Folder pair:</source>
-<target>Двойка папки:</target>
-
<source>Main settings:</source>
<target>Главни настройки:</target>
@@ -1104,7 +1119,7 @@ The command is triggered if:
<target>Паралелни файлови операции:</target>
<source>How to get best performance?</source>
-<target>Как да се получи най-добра производителност?</target>
+<target>Как да получа най-добра производителност?</target>
<source>Local settings:</source>
<target>Локални настройки:</target>
@@ -1143,7 +1158,7 @@ The command is triggered if:
</source>
<target>
- Не се поддържа от всички файлови системи,
-- Изисква и създава файлове бази данни,
+- Изисква и създава файлове с бази данни,
- Няма откриване при първа синхронизация.
</target>
@@ -1180,12 +1195,21 @@ The command is triggered if:
<source>OK</source>
<target>ОК</target>
-<source>Enter your login details:</source>
-<target>Въведете входните си данни:</target>
-
<source>Connection type:</source>
<target>Тип на връзката:</target>
+<source>Connected user accounts:</source>
+<target>Свързани потребителски акаунти:</target>
+
+<source>&Add connection</source>
+<target>&Добави връзка</target>
+
+<source>&Disconnect</source>
+<target>&Прекъсни</target>
+
+<source>Selected user account:</source>
+<target>Избран потребителски акаунт:</target>
+
<source>Server name or IP address:</source>
<target>Име на сървъра или IP-адрес:</target>
@@ -1208,7 +1232,7 @@ The command is triggered if:
<target>&Парола</target>
<source>&Key file</source>
-<target>&Кодов файл</target>
+<target>&Ключов файл</target>
<source>&SSH agent</source>
<target>&SSH агент</target>
@@ -1217,7 +1241,7 @@ The command is triggered if:
<target>Потребителско име:</target>
<source>Private key file:</source>
-<target>Личен кодов файл:</target>
+<target>Личен ключов файл:</target>
<source>&Show password</source>
<target>&Покажи паролата</target>
@@ -1234,14 +1258,8 @@ The command is triggered if:
<source>Detect server limit</source>
<target>Открий лимита на сървъра</target>
-<source>Select a directory on the server:</source>
-<target>Изберете директория на сървъра:</target>
-
<source>Select Folder</source>
-<target>Изберете папка</target>
-
-<source>Start synchronization now?</source>
-<target>Синхронизирай сега?</target>
+<target>Избери папка</target>
<source>Variant:</source>
<target>Вариант:</target>
@@ -1286,7 +1304,7 @@ The command is triggered if:
<target>Стоп</target>
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
-<target>Създай пакетен файл за автоматична синхронизация. За старт двукратно щракнете върху този файл или задайте планова задача: %x</target>
+<target>Създай пакетен файл за автоматична синхронизация. За старт щракнете двукратно върху този файл или задайте планова задача: %x</target>
<source>Progress dialog:</source>
<target>Диалог за прогреса:</target>
@@ -1294,9 +1312,6 @@ The command is triggered if:
<source>Run minimized</source>
<target>Изпълни минимизирано</target>
-<source>&Show error dialog</source>
-<target>&Покажи диалог за грешките</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Питай при грешки или предупреждения</target>
@@ -1324,7 +1339,7 @@ This guarantees a consistent state even in case of a serious error.
</source>
<target>
Копирай във временен файл (*.ffs_tmp) преди презапис на целевия файл.
-Това гарантира цялостност на файла и в случай на сериозна грешка.
+Това гарантира цялостност на файла дори в случай на сериозна грешка.
</target>
<source>recommended</source>
@@ -1406,7 +1421,7 @@ This guarantees a consistent state even in case of a serious error.
<target>&Копирайте в клипборда</target>
<source>Enter activation key:</source>
-<target>Въведете активационния код:</target>
+<target>Въведете активационен код:</target>
<source>Activate offline</source>
<target>Активирайте офлайн</target>
@@ -1418,7 +1433,7 @@ This guarantees a consistent state even in case of a serious error.
<target>Настройки на Синхронизация</target>
<source>Access Online Storage</source>
-<target>Достъп до Онлайн-Запазване</target>
+<target>Достъп до Онлайн-Съхранение</target>
<source>Save as a Batch Job</source>
<target>Запази като Пакетна Задача</target>
@@ -1531,11 +1546,11 @@ This guarantees a consistent state even in case of a serious error.
<source>multiple selection</source>
<target>групово маркиране</target>
-<source>Include via filter:</source>
-<target>Включи чрез филтъра:</target>
+<source>&Include via filter:</source>
+<target>&Включи чрез филтър:</target>
-<source>Exclude via filter:</source>
-<target>Изключи чрез филтъра:</target>
+<source>&Exclude via filter:</source>
+<target>&Изключи чрез филтър:</target>
<source>Include temporarily</source>
<target>Включи временно</target>
@@ -1543,6 +1558,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Exclude temporarily</source>
<target>Изключи временно</target>
+<source>&Synchronize selection</source>
+<target>&Синхронизирай избраното</target>
+
<source>&Copy to...</source>
<target>&Копирай към...</target>
@@ -1652,7 +1670,7 @@ This guarantees a consistent state even in case of a serious error.
<target>Всички файлове са синхронизирани</target>
<source>Cannot find %x</source>
-<target>Не е намерен %x</target>
+<target>Не е открит %x</target>
<source>Move up</source>
<target>Премести нагоре</target>
@@ -1678,9 +1696,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Initializing...</source>
<target>Инициализация...</target>
-<source>Scanning...</source>
-<target>Търси файлове...</target>
-
<source>Comparing content...</source>
<target>Сравнява съдържанието на файлове...</target>
@@ -1699,11 +1714,14 @@ This guarantees a consistent state even in case of a serious error.
<source>Recommended range:</source>
<target>Препоръчителен обхват:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>Искате ли да прекъснете връзката на потребителски акаунт %x?</target>
+
<source>Password:</source>
<target>Парола:</target>
<source>Key password:</source>
-<target>Кодова фраза:</target>
+<target>Ключова фраза:</target>
<source>Please enter a file path.</source>
<target>Моля, въведете файлов път.</target>
@@ -1713,8 +1731,8 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>Copy the following %x items to another folder?</pluralform>
</source>
<target>
-<pluralform>Копиране на следния елемент в друга папка?</pluralform>
-<pluralform>Копиране на следните %x елемента в друга папка?</pluralform>
+<pluralform>Копирай следния елемент в друга папка?</pluralform>
+<pluralform>Копирай следните %x елемента в друга папка?</pluralform>
</target>
<source>Please enter a target folder.</source>
@@ -1725,8 +1743,8 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>Do you really want to move the following %x items to the recycle bin?</pluralform>
</source>
<target>
-<pluralform>Трябва ли следния елемент да бъде преместен в кошчето?</pluralform>
-<pluralform>Трябва ли следните %x елемента да бъдат преместени в кошчето?</pluralform>
+<pluralform>Искате ли следния елемент да бъде преместен в кошчето?</pluralform>
+<pluralform>Искате ли следните %x елемента да бъдат преместени в кошчето?</pluralform>
</target>
<source>Move</source>
@@ -1737,10 +1755,16 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>Do you really want to delete the following %x items?</pluralform>
</source>
<target>
-<pluralform>Трябва ли следния елемент да бъде изтрит?</pluralform>
-<pluralform>Трябва ли следните %x елемента да бъдат изтрити?</pluralform>
+<pluralform>Искате ли следния елемент да бъде изтрит?</pluralform>
+<pluralform>Искате ли следните %x елемента да бъдат изтрити?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>Почни синхронизиране на избраното?</target>
+
+<source>Start synchronization now?</source>
+<target>Почни синхронизиране сега?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Копирай DACL, SACL, Притежател, Група</target>
@@ -1754,13 +1778,13 @@ This guarantees a consistent state even in case of a serious error.
<target>Път до родителската папка</target>
<source>Temporary local copy for SFTP and MTP storage</source>
-<target>Временно локално копие за SFTP- и MTP-запазване</target>
+<target>Временно локално копие за SFTP- и MTP-съхранение</target>
<source>Parameters for opposite side</source>
<target>Параметри за срещуположната страна</target>
<source>Show hidden dialogs again</source>
-<target>Покажи отново скритите диалози</target>
+<target>Покажи скритите диалози отново</target>
<source>All dialogs shown</source>
<target>Всички диалози са показани</target>
@@ -1919,14 +1943,11 @@ This guarantees a consistent state even in case of a serious error.
<target>Опцията %x инсталиране е възможна само за FreeFileSync Дарителско Издание.</target>
<source>Cannot find system function %x.</source>
-<target>Не намира системната функция %x.</target>
+<target>Не открива системна функция %x.</target>
<source>Unable to register device notifications for %x.</source>
<target>Не регистрира съобщенията на устройство %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>Не може да следи директория %x.</target>
-
<source>The file is locked by another process:</source>
<target>Файлът е заключен от друг процес:</target>
@@ -1945,9 +1966,6 @@ This guarantees a consistent state even in case of a serious error.
<source>%x is not a regular directory name.</source>
<target>%x не е регулярно име на директория.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Не може да копира файл %x в %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Не може да копира атрибутите от %x в %y.</target>
@@ -1979,7 +1997,7 @@ This guarantees a consistent state even in case of a serious error.
<target>Не може да зададе привилегията %x.</target>
<source>Unable to suspend system sleep mode.</source>
-<target>Не може да прекрати режима на заспиване на системата.</target>
+<target>Не може да прекрати режима заспиване на системата.</target>
<source>Cannot change process I/O priorities.</source>
<target>Не може да промени I/O-приоритетите на процеса.</target>
diff --git a/FreeFileSync/Build/Languages/chinese_simple.lng b/FreeFileSync/Build/Languages/chinese_simple.lng
index 5716cb9a..7935f2d9 100755
--- a/FreeFileSync/Build/Languages/chinese_simple.lng
+++ b/FreeFileSync/Build/Languages/chinese_simple.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>发生异常</target>
-<source>A directory path is expected after %x.</source>
-<target>在 %x 之后预期是一个目录路径.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>在 %x 之后预期的是一个左边 和一个右边的目录路径.</target>
<source>Syntax error</source>
<target>语法错误</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>在 %x 之后预期的是一个左边 和一个右边的目录路径.</target>
-
<source>Cannot find file %x.</source>
<target>无法找到文件 %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>文件 %x 并未包含合法的配置.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>左边和右边指定了数量不相等的目录.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>当目录通过命令行设定时, 配置文件必须不包含目录对级别的设置.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>任意数目的替代目录对的最多一个配置文件.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>打开已选定的配置文件仅进行编辑而不执行.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>当有需要时, 此文件夹会自动创建.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>以下文件夹路径的大小写不同. 请使用单一的表单以避免重复访问.</target>
+
<source>Scanning:</source>
<target>扫描中:</target>
@@ -421,9 +418,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>请运行 FreeFileSync 的64位版本来在此系统上创建卷影.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>无法为 %x 确定卷名.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>卷名 %x 不是文件路径 %y 的一部分.</target>
@@ -487,6 +481,21 @@
<source>Source item %x not found</source>
<target>来源项目 %x 未找到</target>
+<source>Cannot move file %x to %y.</source>
+<target>无法移动文件 %x 到 %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>上级文件夹 %x 不存在.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>名称 %x 已被其他项目使用.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>无法复制文件 %x 到 %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>无法复制符号连接 %x 到 %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>正在为 %x 创建一个卷影副本...</target>
@@ -508,6 +517,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>如下项目有无法解决的冲突并将不会被同步:</target>
+<source>Folder pair:</source>
+<target>文件夹对:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>如下的文件夹有显著不同. 请检查是否选择了正确 的文件夹来进行同步.</target>
@@ -564,74 +576,77 @@ Actual: %y bytes
<source>Cannot write permissions of %x.</source>
<target>无法写入 %x 的权限.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>对于不同基础文件夹类型 此操作不被支持.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>无法移动文件 %x 到 %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>无法复制符号连接 %x 到 %y.</target>
-
-<source>Error Code %x</source>
-<target>错误代码 %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>获取关于服务器 %x 的信息时失败.</target>
-
-<source>Cannot open directory %x.</source>
-<target>无法打开目录 %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>无法创建目录 %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>不同设备之间不支持此操作.</target>
<source>Cannot delete file %x.</source>
<target>无法删除文件 %x.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>无法删除符号链接 %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>无法删除目录 %x.</target>
+<source>Error Code %x</source>
+<target>错误代码 %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>无法写入 %x 的最后修改时间.</target>
+<source>Cannot create directory %x.</source>
+<target>无法创建目录 %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>无法确定 %x 的最终路径.</target>
+<source>Operation not supported by device.</source>
+<target>设备不支持此操作.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>无法解决符号连接 %x.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>无法将 %x 移动到回收站.</target>
-<source>Unable to access %x.</source>
-<target>无法访问 %x.</target>
-
<source>Authentication completed.</source>
<target>验证完成.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>你可以现在关闭本页面并继续使用 FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>验证失败.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>你可以现在关闭本页面并继续使用 FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>无法找到 %x.</target>
-<source>The server returned an error:</source>
-<target>服务器返回一个错误:</target>
+<source>Please authorize access to user account %x.</source>
+<target>请为用户账户 %x 授权访问.</target>
<source>Cannot determine free disk space for %x.</source>
<target>无法确定 %x 上的可用磁盘空间.</target>
-<source>Cannot find %x.</source>
-<target>无法找到 %x.</target>
+<source>Unable to disconnect from %x.</source>
+<target>无法从 %x 断开连接.</target>
+
+<source>Unable to access %x.</source>
+<target>无法访问 %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>获取关于服务器 %x 的信息时失败.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>无法监视目录 %x.</target>
<source>Cannot find device %x.</source>
<target>无法找到设备 %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>项目 %x 的类型不被支持:</target>
+<source>Cannot open directory %x.</source>
+<target>无法打开目录 %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>无法删除符号链接 %x.</target>
+<source>Unsupported item type.</source>
+<target>不支持的项目类型.</target>
<source>Incorrect command line:</source>
<target>不正确的命令行:</target>
@@ -765,8 +780,8 @@ The command is triggered if:
<source>&Restore</source>
<target>恢复(&R)</target>
-<source>&Show error</source>
-<target>显示错误(&S)</target>
+<source>&Show error message</source>
+<target>显示错误信息(&S)</target>
<source>&Quit</source>
<target>退出(&Q)</target>
@@ -794,6 +809,9 @@ The command is triggered if:
<source>Loading...</source>
<target>正在载入...</target>
+<source>Scanning...</source>
+<target>正扫描...</target>
+
<source>job name</source>
<target>作业名称</target>
@@ -1021,12 +1039,12 @@ The command is triggered if:
<source>View type:</source>
<target>视图类型:</target>
-<source>Save as default</source>
-<target>保存为默认值</target>
-
<source>Select view:</source>
<target>选择视图:</target>
+<source>Save as default</source>
+<target>保存为默认值</target>
+
<source>Statistics:</source>
<target>统计:</target>
@@ -1045,9 +1063,6 @@ The command is triggered if:
<source>Arrange folder pair</source>
<target>排列文件夹对</target>
-<source>Folder pair:</source>
-<target>文件夹对:</target>
-
<source>Main settings:</source>
<target>主设置:</target>
@@ -1173,12 +1188,21 @@ The command is triggered if:
<source>OK</source>
<target>确定</target>
-<source>Enter your login details:</source>
-<target>输入你的登录详细资料:</target>
-
<source>Connection type:</source>
<target>连接类型:</target>
+<source>Connected user accounts:</source>
+<target>已连接的用户账户:</target>
+
+<source>&Add connection</source>
+<target>添加连接(&A)</target>
+
+<source>&Disconnect</source>
+<target>断开连接(&D)</target>
+
+<source>Selected user account:</source>
+<target>选定的用户账户:</target>
+
<source>Server name or IP address:</source>
<target>服务器名称或IP地址:</target>
@@ -1227,15 +1251,9 @@ The command is triggered if:
<source>Detect server limit</source>
<target>检测服务器限制</target>
-<source>Select a directory on the server:</source>
-<target>选择一个服务器上的目录:</target>
-
<source>Select Folder</source>
<target>选择文件夹</target>
-<source>Start synchronization now?</source>
-<target>现在开始同步吗?</target>
-
<source>Variant:</source>
<target>变化:</target>
@@ -1287,9 +1305,6 @@ The command is triggered if:
<source>Run minimized</source>
<target>以最小化运行</target>
-<source>&Show error dialog</source>
-<target>显示错误对话框(&S)</target>
-
<source>Show pop-up on errors or warnings</source>
<target>在错误或警告时显示弹出对话框</target>
@@ -1517,11 +1532,11 @@ This guarantees a consistent state even in case of a serious error.
<source>multiple selection</source>
<target>多选</target>
-<source>Include via filter:</source>
-<target>通过过滤器包括:</target>
+<source>&Include via filter:</source>
+<target>通过过滤器包含(&I):</target>
-<source>Exclude via filter:</source>
-<target>通过过滤器排除:</target>
+<source>&Exclude via filter:</source>
+<target>通过过滤器排除(&E):</target>
<source>Include temporarily</source>
<target>暂时包括</target>
@@ -1529,6 +1544,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Exclude temporarily</source>
<target>暂时排除</target>
+<source>&Synchronize selection</source>
+<target>同步选定内容(&S)</target>
+
<source>&Copy to...</source>
<target>复制到(&C)...</target>
@@ -1664,9 +1682,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Initializing...</source>
<target>正在初始化...</target>
-<source>Scanning...</source>
-<target>正扫描...</target>
-
<source>Comparing content...</source>
<target>正在比较文件内容...</target>
@@ -1685,6 +1700,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Recommended range:</source>
<target>建议的范围:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>你是否真的要从用户账户 %x 断开连接?</target>
+
<source>Password:</source>
<target>密码:</target>
@@ -1724,6 +1742,12 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>是否真的要删除如下 %x 个项目?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>是否开始同步选定内容?</target>
+
+<source>Start synchronization now?</source>
+<target>现在开始同步吗?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>复制DACL, SACL, 所有者, 群组</target>
@@ -1907,9 +1931,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Unable to register device notifications for %x.</source>
<target>无法为 %x 注册设备通知.</target>
-<source>Cannot monitor directory %x.</source>
-<target>无法监视目录 %x.</target>
-
<source>The file is locked by another process:</source>
<target>此文件被另一进程锁定:</target>
@@ -1928,9 +1949,6 @@ This guarantees a consistent state even in case of a serious error.
<source>%x is not a regular directory name.</source>
<target>%x 不是一个正规的目录名.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>无法复制文件 %x 到 %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>无法从 %x 复制属性到 %y.</target>
diff --git a/FreeFileSync/Build/Languages/chinese_traditional.lng b/FreeFileSync/Build/Languages/chinese_traditional.lng
index 2705c499..95c942d2 100755
--- a/FreeFileSync/Build/Languages/chinese_traditional.lng
+++ b/FreeFileSync/Build/Languages/chinese_traditional.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>發生異常</target>
-<source>A directory path is expected after %x.</source>
-<target>%x 後需要目錄路徑。</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>%x 之後應該有一個左邊和右邊目錄路徑。</target>
<source>Syntax error</source>
<target>語法錯誤</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>%x 之後應該有一個左邊和右邊目錄路徑。</target>
-
<source>Cannot find file %x.</source>
<target>找不到檔案 %x。</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>檔案 %x 不包含一個有效的配置。</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>指定的左邊和右邊目錄數量不相等。</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>目錄透過命令列設定時,該設定檔不能包含配對目錄層級的設定。</target>
@@ -106,8 +100,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>任意數量的備用配對目錄為最多一個配置檔案。</target>
-<source>Open the selected configuration for editing only without executing it.</source>
-<target>只打開所選的配置進行編輯而不執行。</target>
+<source>Open the selected configuration for editing only, without executing it.</source>
+<target>只打開選定的配置進行編輯而不執行。</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
<target>備用的GlobalSettings.xml檔案路徑。</target>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>這些資料夾是在需要時自動建立的。</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>以下資料夾路徑大小寫不同。請使用單一形式,避免重複存取。</target>
+
<source>Scanning:</source>
<target>正在掃瞄:</target>
@@ -214,7 +211,7 @@
<target>一個配對資料夾的一個底層資料夾包含在另一個配對資料夾中。</target>
<source>The folder should be excluded from synchronization via filter.</source>
-<target>應該從同步透過篩選器中排除資料夾。</target>
+<target>應該從同步篩選器中排除資料夾。</target>
<source>Calculating sync directions...</source>
<target>正在計算同步方向…</target>
@@ -421,9 +418,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>請在此系統上執行64位元版本的FreeFileSync建立陰影複製副本。</target>
-<source>Cannot determine volume name for %x.</source>
-<target>無法確定 %x 磁碟機名稱。</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>磁碟機名稱 %x 不是檔案路徑 %y 的一部分。</target>
@@ -487,6 +481,21 @@
<source>Source item %x not found</source>
<target>找不到來源項目 %x</target>
+<source>Cannot move file %x to %y.</source>
+<target>無法移動檔案 %x 到 %y。</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>上層資料夾 %x 不存在。</target>
+
+<source>The name %x is already used by another item.</source>
+<target>名稱 %x 已被另一個項目使用。</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>無法複製檔案 %x 到 %y。</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>無法複製符號連結 %x 到 %y。</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>正在建立磁碟區陰影複製為 %x…</target>
@@ -508,8 +517,11 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>下列項目有未解決的衝突,將不會同步:</target>
+<source>Folder pair:</source>
+<target>配對資料夾:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>下列資料夾明顯不同。請檢查同步中所選的正確資料夾。</target>
+<target>下列資料夾明顯不同。請檢查同步中選定的正確資料夾。</target>
<source>Not enough free disk space available in:</source>
<target>沒有足夠的可用磁碟空間:</target>
@@ -564,80 +576,83 @@ Actual: %y bytes
<source>Cannot write permissions of %x.</source>
<target>無法寫入 %x 的權限。</target>
-<source>Operation not supported for different base folder types.</source>
-<target>不支援不同底層資料夾類型的操作。</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>無法移動檔案 %x 到 %y。</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>無法複製符號連結 %x 到 %y。</target>
-
-<source>Error Code %x</source>
-<target>錯誤代碼 %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>無法取得關於伺服器 %x 的資訊。</target>
-
-<source>Cannot open directory %x.</source>
-<target>無法開啟目錄 %x。</target>
-
-<source>Cannot create directory %x.</source>
-<target>無法建立目錄 %x。</target>
+<source>Operation not supported between different devices.</source>
+<target>不支援不同裝置間的操作。</target>
<source>Cannot delete file %x.</source>
<target>無法刪除目錄 %x。</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>無法刪除符號連結 %x。</target>
+
<source>Cannot delete directory %x.</source>
<target>無法刪除目錄 %x。</target>
+<source>Error Code %x</source>
+<target>錯誤代碼 %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>無法寫入 %x 的修改時間。</target>
+<source>Cannot create directory %x.</source>
+<target>無法建立目錄 %x。</target>
+
<source>Cannot determine final path for %x.</source>
<target>無法確定 %x 最後路徑。</target>
+<source>Operation not supported by device.</source>
+<target>不支援該裝置的操作。</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>無法解析符號連結 %x。</target>
<source>Unable to move %x to the recycle bin.</source>
<target>無法將 %x 移動到資源回收筒。</target>
-<source>Unable to access %x.</source>
-<target>無法存取 %x。</target>
-
<source>Authentication completed.</source>
<target>認證完成。</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>您可以立即關閉此頁面並繼續使用FreeFileSync。</target>
+
<source>Authentication failed.</source>
<target>認證失敗。</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>您可以立即關閉此頁面並繼續使用FreeFileSync。</target>
+<source>Cannot find %x.</source>
+<target>找不到 %x。</target>
-<source>The server returned an error:</source>
-<target>伺服器傳回錯誤:</target>
+<source>Please authorize access to user account %x.</source>
+<target>請授權存取使用者帳號 %x。</target>
<source>Cannot determine free disk space for %x.</source>
<target>無法確定 %x 的可用磁碟空間。</target>
-<source>Cannot find %x.</source>
-<target>找不到 %x。</target>
+<source>Unable to disconnect from %x.</source>
+<target>無法中斷 %x 的連線。</target>
+
+<source>Unable to access %x.</source>
+<target>無法存取 %x。</target>
+
+<source>Failed to get information about server %x.</source>
+<target>無法取得關於伺服器 %x 的資訊。</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>無法監測目錄 %x。</target>
<source>Cannot find device %x.</source>
<target>找不到裝置 %x。</target>
-<source>Type of item %x is not supported:</source>
-<target>項目類型 %x 不被支援:</target>
+<source>Cannot open directory %x.</source>
+<target>無法開啟目錄 %x。</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>無法刪除符號連結 %x。</target>
+<source>Unsupported item type.</source>
+<target>不支援的項類型。</target>
<source>Incorrect command line:</source>
<target>不正確的命令列:</target>
<source>The server does not support authentication via %x.</source>
-<target>伺服器不支援透過 %x 進行認證。</target>
+<target>伺服器不支援 %x 進行認證。</target>
<source>
<pluralform>Operation timed out after 1 second.</pluralform>
@@ -652,11 +667,11 @@ Actual: %y bytes
<pluralform>Cannot wait on more than %x connections at a time.</pluralform>
</source>
<target>
-<pluralform>無法一次等待超過 %x 個連接數。</pluralform>
+<pluralform>無法一次等待超過 %x 個連線數。</pluralform>
</target>
<source>Active connections: %x</source>
-<target>活動連接數:%x</target>
+<target>活動連線數:%x</target>
<source>Failed to open SFTP channel number %x.</source>
<target>無法開啟SFTP通道號 %x。</target>
@@ -765,8 +780,8 @@ The command is triggered if:
<source>&Restore</source>
<target>還原(&R)</target>
-<source>&Show error</source>
-<target>顯示錯誤(&S)</target>
+<source>&Show error message</source>
+<target>顯示錯誤訊息(&S)</target>
<source>&Quit</source>
<target>離開(&Q)</target>
@@ -794,6 +809,9 @@ The command is triggered if:
<source>Loading...</source>
<target>正在載入…</target>
+<source>Scanning...</source>
+<target>正在掃瞄…</target>
+
<source>job name</source>
<target>工作名稱</target>
@@ -804,7 +822,7 @@ The command is triggered if:
<target>系統:關機</target>
<source>Nothing to synchronize</source>
-<target>沒有東西可以同步</target>
+<target>沒有要同步的內容</target>
<source>Executing command %x</source>
<target>執行命令 %x</target>
@@ -917,7 +935,7 @@ The command is triggered if:
<target>貼上</target>
<source>The selected folder %x cannot be used with FreeFileSync.</source>
-<target>所選資料夾 %x 無法使用於FreeFileSync。</target>
+<target>選定資料夾 %x 無法使用於FreeFileSync。</target>
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>請選擇一個本機檔案系統、網路或MTP裝置上的資料夾。</target>
@@ -1021,12 +1039,12 @@ The command is triggered if:
<source>View type:</source>
<target>檢視類型:</target>
-<source>Save as default</source>
-<target>儲存為預設值</target>
-
<source>Select view:</source>
<target>選擇視圖:</target>
+<source>Save as default</source>
+<target>儲存為預設值</target>
+
<source>Statistics:</source>
<target>統計資料:</target>
@@ -1045,9 +1063,6 @@ The command is triggered if:
<source>Arrange folder pair</source>
<target>排列配對資料夾</target>
-<source>Folder pair:</source>
-<target>配對資料夾:</target>
-
<source>Main settings:</source>
<target>主要設定:</target>
@@ -1173,12 +1188,21 @@ The command is triggered if:
<source>OK</source>
<target>確定</target>
-<source>Enter your login details:</source>
-<target>請輸入您的登入資訊:</target>
-
<source>Connection type:</source>
<target>連線類型:</target>
+<source>Connected user accounts:</source>
+<target>連線的使用者帳號:</target>
+
+<source>&Add connection</source>
+<target>新增連線(&A)</target>
+
+<source>&Disconnect</source>
+<target>中斷(&D)</target>
+
+<source>Selected user account:</source>
+<target>選定使用者帳號:</target>
+
<source>Server name or IP address:</source>
<target>伺服器名稱或IP位址:</target>
@@ -1227,15 +1251,9 @@ The command is triggered if:
<source>Detect server limit</source>
<target>檢測伺服器限制</target>
-<source>Select a directory on the server:</source>
-<target>選擇伺服器上的目錄:</target>
-
<source>Select Folder</source>
<target>選擇資料夾:</target>
-<source>Start synchronization now?</source>
-<target>現在開始同步?</target>
-
<source>Variant:</source>
<target>變數:</target>
@@ -1287,9 +1305,6 @@ The command is triggered if:
<source>Run minimized</source>
<target>最小化執行</target>
-<source>&Show error dialog</source>
-<target>顯示錯誤對話框(&S)</target>
-
<source>Show pop-up on errors or warnings</source>
<target>錯誤或警告時顯示彈出視窗</target>
@@ -1297,7 +1312,7 @@ The command is triggered if:
<target>取消(&C)</target>
<source>Stop synchronization at first error</source>
-<target>在第一個錯誤時停止同步</target>
+<target>出現第一個錯誤時停止同步</target>
<source>How can I schedule a batch job?</source>
<target>如何排程批次工作?</target>
@@ -1387,7 +1402,7 @@ This guarantees a consistent state even in case of a serious error.
<target>透過以下其中一種方法來啟動FreeFileSync贊助版:</target>
<source>1. Activate via internet now:</source>
-<target>1. 現在透過網際網路啟動:</target>
+<target>1. 立即由網際網路啟動:</target>
<source>Activate online</source>
<target>線上啟動</target>
@@ -1465,7 +1480,7 @@ This guarantees a consistent state even in case of a serious error.
<target>兩邊交換</target>
<source>Show "%x"</source>
-<target>顯示「%x」</target>
+<target>顯示 "%x"</target>
<source>&Show details</source>
<target>顯示詳細資訊(&S)</target>
@@ -1520,11 +1535,11 @@ This guarantees a consistent state even in case of a serious error.
<source>multiple selection</source>
<target>複選</target>
-<source>Include via filter:</source>
-<target>透過篩選器包含:</target>
+<source>&Include via filter:</source>
+<target>包含篩選器(&I):</target>
-<source>Exclude via filter:</source>
-<target>透過篩選器排除:</target>
+<source>&Exclude via filter:</source>
+<target>排除篩選器(&E):</target>
<source>Include temporarily</source>
<target>暫時包含</target>
@@ -1532,6 +1547,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Exclude temporarily</source>
<target>暫時排除</target>
+<source>&Synchronize selection</source>
+<target>同步選擇(&S)</target>
+
<source>&Copy to...</source>
<target>複製到(&C)…</target>
@@ -1667,9 +1685,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Initializing...</source>
<target>正在初始化…</target>
-<source>Scanning...</source>
-<target>正在掃瞄…</target>
-
<source>Comparing content...</source>
<target>正在比對内容…</target>
@@ -1688,6 +1703,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Recommended range:</source>
<target>建議範圍:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>您真的要中斷使用者帳號 %x 的連線嗎?</target>
+
<source>Password:</source>
<target>密碼:</target>
@@ -1727,6 +1745,12 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>您真的要將下列 %x 項目刪除嗎?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>是否開始同步所選內容?</target>
+
+<source>Start synchronization now?</source>
+<target>現在開始同步?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>複製DACL、SACL、擁有者、群組</target>
@@ -1746,7 +1770,7 @@ This guarantees a consistent state even in case of a serious error.
<target>另一邊的參數</target>
<source>Show hidden dialogs again</source>
-<target>再次顯示隱藏的對話框</target>
+<target>再次顯示隱藏對話框</target>
<source>All dialogs shown</source>
<target>顯示所有對話框</target>
@@ -1910,9 +1934,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Unable to register device notifications for %x.</source>
<target>無法為 %x 註冊裝置通知。</target>
-<source>Cannot monitor directory %x.</source>
-<target>無法監測目錄 %x。</target>
-
<source>The file is locked by another process:</source>
<target>檔案被另一個處理程序鎖定:</target>
@@ -1931,9 +1952,6 @@ This guarantees a consistent state even in case of a serious error.
<source>%x is not a regular directory name.</source>
<target>%x 不是一般目錄名稱。</target>
-<source>Cannot copy file %x to %y.</source>
-<target>無法複製檔案 %x 到 %y。</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>無法複製從 %x 到 %y 的屬性。</target>
diff --git a/FreeFileSync/Build/Languages/croatian.lng b/FreeFileSync/Build/Languages/croatian.lng
index ee6721a2..09495a23 100755
--- a/FreeFileSync/Build/Languages/croatian.lng
+++ b/FreeFileSync/Build/Languages/croatian.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>Dogodilo se izuzeće</target>
-<source>A directory path is expected after %x.</source>
-<target>Putanja direktorija se očekuje nakon %x.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Lijeva i desna putanja do mapa je očekivana nakon %x.</target>
<source>Syntax error</source>
<target>Greška sintakse</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>Lijeva i desna putanja do mapa je očekivana nakon %x.</target>
-
<source>Cannot find file %x.</source>
<target>Nije moguće pronaći datoteku %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>Datoteka %x ne sadrži valjane postavke.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Naveden je nejednak broj lijevih i desnih direktorija.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Konfiguracijska datoteka ne smije sadržavati postavke na razini para direktorija kada su direktoriji postavljeni putem naredbene linije.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Bilo koji broj alternativnih parova mapa za najmanje jednu config datoteku.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>Otvorite odabrane postavke za izmjenu bez da ih izvršite.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>Mape se izrađuju automatski kada su potrebne.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>Navedene mape se samo razlikuju u velikim i malim slovima. Molimo koristite jednoličan naziv mapa kako bi izbjegli duplikate.</target>
+
<source>Scanning:</source>
<target>Pretražujem:</target>
@@ -210,7 +207,7 @@
<target>Odgovarajuća mapa će se smatrati praznom.</target>
<source>Exclude:</source>
-<target>Odvojiti:</target>
+<target>Isključi:</target>
<source>One base folder of a folder pair is contained in the other one.</source>
<target>Jedna bazna mapa od para mapa se nalazi u drugoj mapi.</target>
@@ -427,9 +424,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Molimo pokrenite 64-bitnu verziju FreeFileSync-a da bi izradili shadow kopije na ovom sustavu.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>Ne mogu utvrditi naziv spremnika za %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>Naziv spremnika %x nije dio putanje datotke %y.</target>
@@ -493,6 +487,21 @@
<source>Source item %x not found</source>
<target>Izvorna datoteka %x nije pronađena</target>
+<source>Cannot move file %x to %y.</source>
+<target>Ne mogu premjestiti datoteku %x u %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>Glavna mapa %x ne postoji.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>Naziv %x se već koristi u drugoj datoteci.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Ne mogu kopirati datoteku %x na %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Ne može se kopirati simbolična poveznica %x prema %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Kreiranje Volume Shadow Copy za %x...</target>
@@ -514,6 +523,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Slijedeće stavke imaju nerješene konflikte i zato neće biti sinkronizirane:</target>
+<source>Folder pair:</source>
+<target>Par mapa:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>Slijedeće mape su značajno različite. Molimo provjerite da su mape za sinkronizaciju ispravno odabrane.</target>
@@ -570,74 +582,77 @@ Stvarno: %y bajta
<source>Cannot write permissions of %x.</source>
<target>Ne mogu zapisati dopuštenja za %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Operacija nije podržana za različite bazne mape.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>Ne mogu premjestiti datoteku %x u %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Ne može se kopirati simbolična poveznica %x prema %y.</target>
-
-<source>Error Code %x</source>
-<target>Kod greške %x.</target>
-
-<source>Failed to get information about server %x.</source>
-<target>Nije moguće pristupiti informacijama servera %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Ne mogu otvoriti mapu %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Ne mogu izraditi mapu %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>Zadatak nije podržan između različitih uređaja.</target>
<source>Cannot delete file %x.</source>
<target>Ne mogu izbrisati datoteku %x.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Nije moguće brisanje simbolične poveznice %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>Ne mogu izbrisati mapu %x.</target>
+<source>Error Code %x</source>
+<target>Kod greške %x.</target>
+
<source>Cannot write modification time of %x.</source>
<target>Ne mogu zapisati vrijeme izmjene %x.</target>
+<source>Cannot create directory %x.</source>
+<target>Ne mogu izraditi mapu %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>Ne mogu odrediti završnu putanju za %x.</target>
+<source>Operation not supported by device.</source>
+<target>Zadatak nije podržan od uređaja.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>Ne mogu odrediti simboličnu poveznicu %x.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>Nije moguće premjestiti %x u koš za smeće.</target>
-<source>Unable to access %x.</source>
-<target>Nije moguće pristupiti %x.</target>
-
<source>Authentication completed.</source>
<target>Provjera autentičnosti dovršena.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>Sada možete zatvoriti ovu stranicu i nastaviti sa FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>Provjera autentičnosti nije uspjela.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>Sada možete zatvoriti ovu stranicu i nastaviti sa FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>Nije moguće pronaći %x.</target>
-<source>The server returned an error:</source>
-<target>Pogreška poslužitelja:</target>
+<source>Please authorize access to user account %x.</source>
+<target>Molimo odobrite pristup korisničkom računu %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>Nije moguće izračunati slobodan prostor diska za %x.</target>
-<source>Cannot find %x.</source>
-<target>Nije moguće pronaći %x.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Nije moguće prekinuti vezu s %x.</target>
+
+<source>Unable to access %x.</source>
+<target>Nije moguće pristupiti %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>Nije moguće pristupiti informacijama servera %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>Ne mogu nadzirati direktorij %x.</target>
<source>Cannot find device %x.</source>
<target>Nije moguće pronaći uređaj %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>Vrsta stavke %x koji nije podržan:</target>
+<source>Cannot open directory %x.</source>
+<target>Ne mogu otvoriti mapu %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>Nije moguće brisanje simbolične poveznice %x.</target>
+<source>Unsupported item type.</source>
+<target>Nepodržan tip datoteke.</target>
<source>Incorrect command line:</source>
<target>Netočna naredbena linija:</target>
@@ -775,8 +790,8 @@ Naredba će biti pokrenuta ako se:
<source>&Restore</source>
<target>&Vrati</target>
-<source>&Show error</source>
-<target>&Prikaži grešku</target>
+<source>&Show error message</source>
+<target>&Pokaži poruke o greškama</target>
<source>&Quit</source>
<target>&Izlaz</target>
@@ -806,6 +821,9 @@ Naredba će biti pokrenuta ako se:
<source>Loading...</source>
<target>Učitavam...</target>
+<source>Scanning...</source>
+<target>Tražim...</target>
+
<source>job name</source>
<target>Naziv zadatka</target>
@@ -1035,12 +1053,12 @@ Naredba će biti pokrenuta ako se:
<source>View type:</source>
<target>Vrsta prikaza:</target>
-<source>Save as default</source>
-<target>Spremi kao standardno</target>
-
<source>Select view:</source>
<target>Odaberite prikaz:</target>
+<source>Save as default</source>
+<target>Spremi kao standardno</target>
+
<source>Statistics:</source>
<target>Statistika:</target>
@@ -1059,9 +1077,6 @@ Naredba će biti pokrenuta ako se:
<source>Arrange folder pair</source>
<target>Rasporedi par mapa</target>
-<source>Folder pair:</source>
-<target>Par mapa:</target>
-
<source>Main settings:</source>
<target>Glavne postavke:</target>
@@ -1187,12 +1202,21 @@ Naredba će biti pokrenuta ako se:
<source>OK</source>
<target>U redu</target>
-<source>Enter your login details:</source>
-<target>Unesite podatke za logiranje:</target>
-
<source>Connection type:</source>
<target>Tip konekcije:</target>
+<source>Connected user accounts:</source>
+<target>Povezani korisnički računi:</target>
+
+<source>&Add connection</source>
+<target>&Dodaj račun</target>
+
+<source>&Disconnect</source>
+<target>&Odspojiti</target>
+
+<source>Selected user account:</source>
+<target>Odabrani korisnički račun:</target>
+
<source>Server name or IP address:</source>
<target>Naziv servera ili IP adresa:</target>
@@ -1241,15 +1265,9 @@ Naredba će biti pokrenuta ako se:
<source>Detect server limit</source>
<target>Detektiranje limita servera</target>
-<source>Select a directory on the server:</source>
-<target>Odaberi mapu na serveru:</target>
-
<source>Select Folder</source>
<target>Odaberi mapu</target>
-<source>Start synchronization now?</source>
-<target>Započeti sinkronizaciju sada?</target>
-
<source>Variant:</source>
<target>Opcija:</target>
@@ -1301,9 +1319,6 @@ Naredba će biti pokrenuta ako se:
<source>Run minimized</source>
<target>Pokreni minimizirano</target>
-<source>&Show error dialog</source>
-<target>&Prikaži pogreške</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Prikaži skočni prozor pri greškama i upozorenjima</target>
@@ -1542,11 +1557,11 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>multiple selection</source>
<target>višestruki odabir</target>
-<source>Include via filter:</source>
-<target>Uključi kroz filter:</target>
+<source>&Include via filter:</source>
+<target>&Uključi pomoću filtera:</target>
-<source>Exclude via filter:</source>
-<target>Isključi kroz filter:</target>
+<source>&Exclude via filter:</source>
+<target>&Izdvoji pomoću filtera:</target>
<source>Include temporarily</source>
<target>Trenutno uključi</target>
@@ -1554,6 +1569,9 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Exclude temporarily</source>
<target>Izuzmi privremeno</target>
+<source>&Synchronize selection</source>
+<target>&Sinkroniziraj odabrano</target>
+
<source>&Copy to...</source>
<target>&Kopiraj na...</target>
@@ -1689,9 +1707,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Initializing...</source>
<target>Započinjem...</target>
-<source>Scanning...</source>
-<target>Tražim...</target>
-
<source>Comparing content...</source>
<target>Uspoređujem sadržaj...</target>
@@ -1710,6 +1725,9 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Recommended range:</source>
<target>Predloženi raspon:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>Da li se zaista želite odspojiti od korisničkog računa %x?</target>
+
<source>Password:</source>
<target>Lozinka:</target>
@@ -1755,6 +1773,12 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<pluralform>Da li zaista želite obristi sljedećih %x stavki?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>Započeti sinkronizaciju odabranog?</target>
+
+<source>Start synchronization now?</source>
+<target>Započeti sinkronizaciju sada?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Kopiraj DACL, SACL, Vlasnika, Grupu</target>
@@ -1801,7 +1825,7 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<target>Kopiraj nove i ažurirane datoteke u desnu mapu.</target>
<source>Configure your own synchronization rules.</source>
-<target>Postavite vaša vlastita sinkronizacijska pravila.</target>
+<target>Postavite vaša vlastita pravila za sinkronizaciju.</target>
<source>Comparison</source>
<target>Usporedba</target>
@@ -1938,9 +1962,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Unable to register device notifications for %x.</source>
<target>Nije moguće registrirati prijavu uređaja za %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>Ne mogu nadzirati direktorij %x.</target>
-
<source>The file is locked by another process:</source>
<target>Datoteku koristi drugi proces:</target>
@@ -1959,9 +1980,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>%x is not a regular directory name.</source>
<target>%x nije ispravan naziv mape.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Ne mogu kopirati datoteku %x na %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Nije moguće kopiranje atributa od %x prema %y.</target>
diff --git a/FreeFileSync/Build/Languages/czech.lng b/FreeFileSync/Build/Languages/czech.lng
index 1cf9fb65..a9624a8b 100755
--- a/FreeFileSync/Build/Languages/czech.lng
+++ b/FreeFileSync/Build/Languages/czech.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>Vyskytla se chyba</target>
-<source>A directory path is expected after %x.</source>
-<target>Očekávána adresářová cesta po %x.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Je očekávané zadání parametru levého a pravého adresáře po %x.</target>
<source>Syntax error</source>
<target>Chyba syntaxe</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>Je očekávané zadání parametru levého a pravého adresáře po %x.</target>
-
<source>Cannot find file %x.</source>
<target>Nelze najít soubor %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>Soubor %x neobsahuje platnou konfiguraci.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Zjištěn nestejný počet levých a pravých adresářů.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Konfigurační soubor nesmí obsahovat nastavení na úrovni adresářových párů pokud je zadán přes příkazovou řádku.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Libovolný počet alternativních párů adresářů na alespoň jednu konfiguraci.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>Otevřít konfiguraci pouze pro editaci aniž by byla spuštěna.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>Složky budou v případě potřeby automaticky vytvořeny.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>Následující složky se v názvu liší velikostí písma. Prosím použijte stejný zápis, aby nedošlo k duplicitnímu přístupu.</target>
+
<source>Scanning:</source>
<target>Zpracováváno:</target>
@@ -427,9 +424,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Prosím použijte 64-bitovou verzi FreeFileSync pro použití služby Stínové kopie.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>>Nelze zjistit jméno jednotky souboru %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>Název disku %x není součástí cesty souboru %y.</target>
@@ -493,6 +487,21 @@
<source>Source item %x not found</source>
<target>Zdrojová položka %x nenalezena.</target>
+<source>Cannot move file %x to %y.</source>
+<target>Nelze přesunout soubor %x do %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>Nadřazená složka %x neexistuje.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>Název %x je již používán jinou položkou.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Nelze kopírovat soubor %x do %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Nelze kopírovat symbolický odkaz %x do %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Vytváření Stínové kopie pro %x...</target>
@@ -514,6 +523,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Následující položky jsou nevyřešené konflikty a nebudou synchronizovány:</target>
+<source>Folder pair:</source>
+<target>Dvojice složek:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>Následující složky se významně liší. Zkontrolujte zda máte vybránu správnou dvojici složek pro synchronizaci.</target>
@@ -570,74 +582,77 @@ Aktuálně: %y b
<source>Cannot write permissions of %x.</source>
<target>Nelze zapsat oprávnění pro %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Operace není podporována pro různé typy základních adresářů.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>Nelze přesunout soubor %x do %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Nelze kopírovat symbolický odkaz %x do %y.</target>
-
-<source>Error Code %x</source>
-<target>Chybový kód %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>Nelze získat informace o serveru %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Nelze otevřít adresář %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Nelze vytvořit adresář %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>Operace není podporována mezi různými zařízeními.</target>
<source>Cannot delete file %x.</source>
<target>Nelze smazat soubor %x.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Nelze smazat symbolický odkaz %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>Nelze smazat adresář %x.</target>
+<source>Error Code %x</source>
+<target>Chybový kód %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>Nelze nastavit čas změny ve vlastnostech %x.</target>
+<source>Cannot create directory %x.</source>
+<target>Nelze vytvořit adresář %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>Nelze určit výslednou cestu pro %x.</target>
+<source>Operation not supported by device.</source>
+<target>Operace není zařízením podporována.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>Nelze najít odkaz zástupce %x.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>Není možné přesunout %x do Koše.</target>
-<source>Unable to access %x.</source>
-<target>Nepodařil se přístup k %x.</target>
-
<source>Authentication completed.</source>
<target>Přístup povolen.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>Nyní můžete tuto stránku zavřít a pokračovat s FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>Přístup odmítnut.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>Nyní můžete tuto stránku zavřít a pokračovat s FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>Nelze najít %x.</target>
-<source>The server returned an error:</source>
-<target>Server vrátil chybu:</target>
+<source>Please authorize access to user account %x.</source>
+<target>Prosím autorizujte přístup k uživatelskému účtu %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>Nelze zjistit volné místo na disku %x.</target>
-<source>Cannot find %x.</source>
-<target>Nelze najít %x.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Nelze se odpojit od %x.</target>
+
+<source>Unable to access %x.</source>
+<target>Nepodařil se přístup k %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>Nelze získat informace o serveru %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>Nelze nastavit monitorování adresáře %x.</target>
<source>Cannot find device %x.</source>
<target>Nelze nalézt zařízení %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>Typ položky %x není podporován:</target>
+<source>Cannot open directory %x.</source>
+<target>Nelze otevřít adresář %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>Nelze smazat symbolický odkaz %x.</target>
+<source>Unsupported item type.</source>
+<target>Nepodporovaný typ položky.</target>
<source>Incorrect command line:</source>
<target>Neplatný příkaz:</target>
@@ -775,8 +790,8 @@ Příkaz je spuštěn když:
<source>&Restore</source>
<target>&Obnovit</target>
-<source>&Show error</source>
-<target>&Zobrazit chybu</target>
+<source>&Show error message</source>
+<target>Zobrazit chybové &hlášení</target>
<source>&Quit</source>
<target>U&končit</target>
@@ -806,6 +821,9 @@ Příkaz je spuštěn když:
<source>Loading...</source>
<target>Načítání...</target>
+<source>Scanning...</source>
+<target>Zpracovávání...</target>
+
<source>job name</source>
<target>název úlohy</target>
@@ -1035,12 +1053,12 @@ Příkaz je spuštěn když:
<source>View type:</source>
<target>Typ zobrazení:</target>
-<source>Save as default</source>
-<target>Uložit jako výchozí</target>
-
<source>Select view:</source>
<target>Výběr zobrazení:</target>
+<source>Save as default</source>
+<target>Uložit jako výchozí</target>
+
<source>Statistics:</source>
<target>Statistika:</target>
@@ -1059,9 +1077,6 @@ Příkaz je spuštěn když:
<source>Arrange folder pair</source>
<target>Uspořádat složky</target>
-<source>Folder pair:</source>
-<target>Dvojice složek:</target>
-
<source>Main settings:</source>
<target>Hlavní nastavení:</target>
@@ -1187,12 +1202,21 @@ Příkaz je spuštěn když:
<source>OK</source>
<target>OK</target>
-<source>Enter your login details:</source>
-<target>Zadejte přihlašovací údaje:</target>
-
<source>Connection type:</source>
<target>Typ spojení:</target>
+<source>Connected user accounts:</source>
+<target>Připojené uživatelské účty:</target>
+
+<source>&Add connection</source>
+<target>&Přidat spojení</target>
+
+<source>&Disconnect</source>
+<target>&Odpojit</target>
+
+<source>Selected user account:</source>
+<target>Vybraný uživatelský účet:</target>
+
<source>Server name or IP address:</source>
<target>Jméno serveru nebo jeho IP adresa:</target>
@@ -1241,15 +1265,9 @@ Příkaz je spuštěn když:
<source>Detect server limit</source>
<target>Zjistit omezení serveru</target>
-<source>Select a directory on the server:</source>
-<target>Výběr adresáře na serveru:</target>
-
<source>Select Folder</source>
<target>Výběr složky</target>
-<source>Start synchronization now?</source>
-<target>Začít synchronizovat nyní?</target>
-
<source>Variant:</source>
<target>Varianta:</target>
@@ -1301,9 +1319,6 @@ Příkaz je spuštěn když:
<source>Run minimized</source>
<target>Minimalizovat</target>
-<source>&Show error dialog</source>
-<target>Zobrazit chybové &okno</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Zobrazit hlášení při chybě nebo varování</target>
@@ -1539,11 +1554,11 @@ This guarantees a consistent state even in case of a serious error.
<source>multiple selection</source>
<target>vícenásobný výběr</target>
-<source>Include via filter:</source>
-<target>Zahrnout pomocí filtru:</target>
+<source>&Include via filter:</source>
+<target>&Zahrnout pomocí filtru:</target>
-<source>Exclude via filter:</source>
-<target>Vynechat pomocí filtru:</target>
+<source>&Exclude via filter:</source>
+<target>&Vynechat pomocí filtru:</target>
<source>Include temporarily</source>
<target>Přidat dočasně</target>
@@ -1551,6 +1566,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Exclude temporarily</source>
<target>Vynechat dočasně</target>
+<source>&Synchronize selection</source>
+<target>&Synchronizovat výběr</target>
+
<source>&Copy to...</source>
<target>&Kopírovat do...</target>
@@ -1686,9 +1704,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Initializing...</source>
<target>Inicializace...</target>
-<source>Scanning...</source>
-<target>Zpracovávání...</target>
-
<source>Comparing content...</source>
<target>Porovnávání obsahu...</target>
@@ -1707,6 +1722,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Recommended range:</source>
<target>Doporučený rozsah:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>Opravdu chcete odpojit od uživatelského účtu %x?</target>
+
<source>Password:</source>
<target>Heslo:</target>
@@ -1752,6 +1770,12 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>Opravdu chcete smazat následujících %x položek?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>Začít synchronizovat výběr?</target>
+
+<source>Start synchronization now?</source>
+<target>Začít synchronizovat nyní?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Kopírovat DACL, SACL, Owner, Group</target>
@@ -1935,9 +1959,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Unable to register device notifications for %x.</source>
<target>Nepodařilo se zaregistrovat zprávy zařízení %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>Nelze nastavit monitorování adresáře %x.</target>
-
<source>The file is locked by another process:</source>
<target>Soubor je uzamčen jiným procesem:</target>
@@ -1956,9 +1977,6 @@ This guarantees a consistent state even in case of a serious error.
<source>%x is not a regular directory name.</source>
<target>%x není platným názvem adresáře.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Nelze kopírovat soubor %x do %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Nelze kopírovat vlastnosti z %x do %y.</target>
diff --git a/FreeFileSync/Build/Languages/danish.lng b/FreeFileSync/Build/Languages/danish.lng
index c3ed5775..00fadfec 100755
--- a/FreeFileSync/Build/Languages/danish.lng
+++ b/FreeFileSync/Build/Languages/danish.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>Undtagelse opstod</target>
-<source>A directory path is expected after %x.</source>
-<target>Der forventes en mappesti efter %x.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Venstre og højre mappesti forventes efter %x.</target>
<source>Syntax error</source>
<target>Syntaksfejl</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>Venstre og højre mappesti forventes efter %x.</target>
-
<source>Cannot find file %x.</source>
<target>Kan ikke finde filen %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>Filen %x indeholder ikke gyldige indstillinger.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Der er angivet et ulige antal højre og venstre mapper.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Indstillingsfilen må ikke indeholde indstillinger på mappepar niveau når mapper er sat via kommando.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Vilkårligt antal alternative mappepar til højst en indstillingsfil.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>Åben valgte indstilling for at redigere den.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>De oprettes automatisk efter behov.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>I følgende mappestier afviger store/små bogstaver. Ret dem for at undgå duplikater.</target>
+
<source>Scanning:</source>
<target>Skanner:</target>
@@ -424,9 +421,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Brug FreeFileSync 64 bit, for at oprette VSS kopier på dette system.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>Kan ikke bestemme volumennavn for %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>Volumennavnet %x er ikke del af filstien %y.</target>
@@ -490,6 +484,21 @@
<source>Source item %x not found</source>
<target>Kildeemne %x ikke fundet</target>
+<source>Cannot move file %x to %y.</source>
+<target>Kan ikke flytte filen %x til %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>Overordnet mappe %x findes ikke.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>Navnet %x findes allerede.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Kan ikke kopiere filen %x til %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Kan ikke kopiere symlink fra %x til %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Opretter VSS kopi for %x...</target>
@@ -511,6 +520,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Følgende emner har uløste konflikter og synkroniseres ikke:</target>
+<source>Folder pair:</source>
+<target>Mappepar:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>Følgende mapper er markant forskellige. Kontroller at du har valgt de rigtige mapper.</target>
@@ -567,74 +579,77 @@ Aktuel: %y byte
<source>Cannot write permissions of %x.</source>
<target>Kan ikke skrive tilladelserne til %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Handlingen understøtter ikke forskellige typer hovedmapper.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>Kan ikke flytte filen %x til %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Kan ikke kopiere symlink fra %x til %y.</target>
-
-<source>Error Code %x</source>
-<target>Fejlkode %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>Kunne ikke hente oplysninger om serveren %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Kan ikke åbne mappen %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Kan ikke oprette mappen %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>Handlingen støttes ikke mellem forskellige enheder.</target>
<source>Cannot delete file %x.</source>
<target>Kan ikke slette filen %x.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Kan ikke slette det symbolske link %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>Kan ikke slette mappen %x.</target>
+<source>Error Code %x</source>
+<target>Fejlkode %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>Kan ikke opdatere tidsændring på %x.</target>
+<source>Cannot create directory %x.</source>
+<target>Kan ikke oprette mappen %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>Kan ikke bestemme endelig sti for %x.</target>
+<source>Operation not supported by device.</source>
+<target>Handlingen understøttes ikke af enheden.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>Kan ikke følge symlinket %x.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>Kunne ikke flytte %x til papirkurv.</target>
-<source>Unable to access %x.</source>
-<target>Kan ikke tilgå %x.</target>
-
<source>Authentication completed.</source>
<target>Godkendelse gennemført.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>Du kan lukke siden og returnere til FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>Godkendelse fejlede.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>Du kan lukke siden og returnere til FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>Kan ikke finde %x.</target>
-<source>The server returned an error:</source>
-<target>Serverfejl:</target>
+<source>Please authorize access to user account %x.</source>
+<target>Godkend adgang til %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>Kan ikke definere ledig plads på %x.</target>
-<source>Cannot find %x.</source>
-<target>Kan ikke finde %x.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Forbindelsen til %x kan ikke afbrydes.</target>
+
+<source>Unable to access %x.</source>
+<target>Kan ikke tilgå %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>Kunne ikke hente oplysninger om serveren %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>Kan ikke overvåge mappen %x.</target>
<source>Cannot find device %x.</source>
<target>Kan ikke finde enheden %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>Filtypen %x understøttes ikke:</target>
+<source>Cannot open directory %x.</source>
+<target>Kan ikke åbne mappen %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>Kan ikke slette det symbolske link %x.</target>
+<source>Unsupported item type.</source>
+<target>Emnetype ikke understøttet.</target>
<source>Incorrect command line:</source>
<target>Ugyldig kommando:</target>
@@ -770,8 +785,8 @@ Kommandoen udføres hvis:
<source>&Restore</source>
<target>&Vis vindue</target>
-<source>&Show error</source>
-<target>Vi&s fejl</target>
+<source>&Show error message</source>
+<target>V&is fejlbesked</target>
<source>&Quit</source>
<target>&Afslut</target>
@@ -800,6 +815,9 @@ Kommandoen udføres hvis:
<source>Loading...</source>
<target>Indlæser...</target>
+<source>Scanning...</source>
+<target>Skanner...</target>
+
<source>job name</source>
<target>Jobnavn</target>
@@ -1028,12 +1046,12 @@ Kommandoen udføres hvis:
<source>View type:</source>
<target>Visning:</target>
-<source>Save as default</source>
-<target>Gem som standard</target>
-
<source>Select view:</source>
<target>Vælg visning:</target>
+<source>Save as default</source>
+<target>Gem som standard</target>
+
<source>Statistics:</source>
<target>Statistik:</target>
@@ -1052,9 +1070,6 @@ Kommandoen udføres hvis:
<source>Arrange folder pair</source>
<target>Arrangér mappepar</target>
-<source>Folder pair:</source>
-<target>Mappepar:</target>
-
<source>Main settings:</source>
<target>Overordnede indstillinger:</target>
@@ -1180,12 +1195,21 @@ Kommandoen udføres hvis:
<source>OK</source>
<target>OK</target>
-<source>Enter your login details:</source>
-<target>Angiv login:</target>
-
<source>Connection type:</source>
<target>Forbindelsestype:</target>
+<source>Connected user accounts:</source>
+<target>Forbundne konti:</target>
+
+<source>&Add connection</source>
+<target>&Tilføj</target>
+
+<source>&Disconnect</source>
+<target>&Afbryd</target>
+
+<source>Selected user account:</source>
+<target>Valgt konto:</target>
+
<source>Server name or IP address:</source>
<target>Servernavn eller IP adresse:</target>
@@ -1234,15 +1258,9 @@ Kommandoen udføres hvis:
<source>Detect server limit</source>
<target>Genkend servergrænse</target>
-<source>Select a directory on the server:</source>
-<target>Vælg servermappe:</target>
-
<source>Select Folder</source>
<target>Vælg mappe</target>
-<source>Start synchronization now?</source>
-<target>Synkroniser nu?</target>
-
<source>Variant:</source>
<target>Jobtype:</target>
@@ -1294,9 +1312,6 @@ Kommandoen udføres hvis:
<source>Run minimized</source>
<target>Kør minimeret</target>
-<source>&Show error dialog</source>
-<target>&Vis fejlbesked</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Vis fejlbeskeder og advarsler</target>
@@ -1531,11 +1546,11 @@ Sikrer processen ved alvorlige fejl.
<source>multiple selection</source>
<target>vælg flere</target>
-<source>Include via filter:</source>
-<target>Inkludér m. filter:</target>
+<source>&Include via filter:</source>
+<target>&Inkludér m. filter:</target>
-<source>Exclude via filter:</source>
-<target>Ekskluder m. filter:</target>
+<source>&Exclude via filter:</source>
+<target>&Ekskludér m. filter:</target>
<source>Include temporarily</source>
<target>Inkluder midlertidigt</target>
@@ -1543,6 +1558,9 @@ Sikrer processen ved alvorlige fejl.
<source>Exclude temporarily</source>
<target>Ekskluder midlertidigt</target>
+<source>&Synchronize selection</source>
+<target>&Synkronisér valgte</target>
+
<source>&Copy to...</source>
<target>&Kopier til...</target>
@@ -1678,9 +1696,6 @@ Sikrer processen ved alvorlige fejl.
<source>Initializing...</source>
<target>Forbereder...</target>
-<source>Scanning...</source>
-<target>Skanner...</target>
-
<source>Comparing content...</source>
<target>Analyserer indhold...</target>
@@ -1699,6 +1714,9 @@ Sikrer processen ved alvorlige fejl.
<source>Recommended range:</source>
<target>Anbefalet interval:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>Vil du afbryde forbindelsen til %x?</target>
+
<source>Password:</source>
<target>Kodeord:</target>
@@ -1741,6 +1759,12 @@ Sikrer processen ved alvorlige fejl.
<pluralform>Vil du slette følgende %x emner?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>Start synkronisering af valgte?</target>
+
+<source>Start synchronization now?</source>
+<target>Synkroniser nu?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Kopiér DACL, SACL, ejer, gruppe</target>
@@ -1924,9 +1948,6 @@ Sikrer processen ved alvorlige fejl.
<source>Unable to register device notifications for %x.</source>
<target>Kan ikke registrere beskeder for %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>Kan ikke overvåge mappen %x.</target>
-
<source>The file is locked by another process:</source>
<target>Filen er låst af en anden process:</target>
@@ -1945,9 +1966,6 @@ Sikrer processen ved alvorlige fejl.
<source>%x is not a regular directory name.</source>
<target>%x er ikke et gyldigt mappenavn.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Kan ikke kopiere filen %x til %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Kan ikke kopiere attributter fra %x til %y.</target>
diff --git a/FreeFileSync/Build/Languages/dutch.lng b/FreeFileSync/Build/Languages/dutch.lng
index 74467d30..5f8dd2d4 100755
--- a/FreeFileSync/Build/Languages/dutch.lng
+++ b/FreeFileSync/Build/Languages/dutch.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>Er is een uitzondering opgetreden</target>
-<source>A directory path is expected after %x.</source>
-<target>Een mappad wordt na %x verwacht.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Een linker en een rechter mappad worden verwacht na %x.</target>
<source>Syntax error</source>
<target>Syntaxis fout</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>Een linker en een rechter mappad worden verwacht na %x.</target>
-
<source>Cannot find file %x.</source>
<target>Kan bestand %x niet vinden.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>Het bestand %x bevat geen geldige configuratie.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Ongelijk aantal linker- en rechter- mappen opgegeven.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Het configuratiebestand mag geen instellingen op mappaarniveau bevatten, als de mappen via de opdrachtregel zijn ingesteld.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Een willekeurig aantal alternatieve mapparen voor maximaal een configuratiebestand.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>Open de geselecteerde configuratie om deze alleen te bewerken zonder deze uit te voeren.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>De mappen worden automatisch gemaakt indien dit nodig is.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>De volgende mappaden zijn hoofdlettergevoelig. Gebruik een uniforme vorm om dubbele toegang te voorkomen.</target>
+
<source>Scanning:</source>
<target>Scannen:</target>
@@ -424,9 +421,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Gelieve de 64-bits versie van FreeFileSync te gebruiken om schaduwkopiën te maken op dit systeem.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>Kan de volumenaam niet vaststellen voor %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>Volumenaam %x behoort niet tot bestandspad %y.</target>
@@ -490,6 +484,21 @@
<source>Source item %x not found</source>
<target>Bronitem %x niet gevonden</target>
+<source>Cannot move file %x to %y.</source>
+<target>Het bestand %x kan niet naar %y verplaatst worden.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>Bovenliggende map %x bestaat niet.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>De naam %x wordt al door een ander item gebruikt.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Kan bestand %x niet kopiëren naar %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Kan de symbolische koppeling %x niet kopiëren naar %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Maken van een volume schaduwkopie voor %x...</target>
@@ -511,6 +520,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>De volgende items hebben onopgeloste conflicten en zullen niet worden gesynchroniseerd:</target>
+<source>Folder pair:</source>
+<target>Map-paar:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>De volgende mappen zijn significant verschillend. Controleer of de juiste mappen zijn geselecteerd voor synchronisatie.</target>
@@ -567,74 +579,77 @@ Werkelijk: %y bytes
<source>Cannot write permissions of %x.</source>
<target>Kan de aangegeven machtigingen van %x niet schrijven.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Deze bewerking wordt niet ondersteund voor verschillende basis maptypen.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>Het bestand %x kan niet naar %y verplaatst worden.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Kan de symbolische koppeling %x niet kopiëren naar %y.</target>
-
-<source>Error Code %x</source>
-<target>Foutcode %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>Fout bij het ophalen van informatie over server %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Kan de map %x niet openen.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Kan de map %x niet maken.</target>
+<source>Operation not supported between different devices.</source>
+<target>Bewerking wordt niet ondersteund tussen verschillende apparaten.</target>
<source>Cannot delete file %x.</source>
<target>Kan bestand %x niet verwijderen.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Kan de symbolische koppeling %x niet verwijderen.</target>
+
<source>Cannot delete directory %x.</source>
<target>De map %x kan niet verwijderd worden.</target>
+<source>Error Code %x</source>
+<target>Foutcode %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>De modificatie-tijd van %x kan niet geschreven worden.</target>
+<source>Cannot create directory %x.</source>
+<target>Kan de map %x niet maken.</target>
+
<source>Cannot determine final path for %x.</source>
<target>Kan het uiteindelijke pad voor %x niet bepalen.</target>
+<source>Operation not supported by device.</source>
+<target>Bewerking wordt niet ondersteund door het apparaat.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>Kan de symbolische koppeling %x niet oplossen.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>Niet in staat om %x naar de prullenbak te verplaatsen.</target>
-<source>Unable to access %x.</source>
-<target>Geen toegang tot %x.</target>
-
<source>Authentication completed.</source>
<target>Authenticatie voltooid.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>U kunt deze pagina nu sluiten en doorgaan met FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>Verificatie mislukt.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>U kunt deze pagina nu sluiten en doorgaan met FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>Kan %x niet vinden.</target>
-<source>The server returned an error:</source>
-<target>De server heeft een fout teruggestuurd:</target>
+<source>Please authorize access to user account %x.</source>
+<target>Gelieve toestemming te geven om toegang tot het gebruikersaccount %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>Kan de vrije schijfruimte voor %x niet bepalen.</target>
-<source>Cannot find %x.</source>
-<target>Kan %x niet vinden.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Kan verbinding van %x niet verbreken.</target>
+
+<source>Unable to access %x.</source>
+<target>Geen toegang tot %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>Fout bij het ophalen van informatie over server %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>Kan map %x niet bewaken.</target>
<source>Cannot find device %x.</source>
<target>Kan apparaat %x niet vinden.</target>
-<source>Type of item %x is not supported:</source>
-<target>Dit itemtype %x wordt niet ondersteund:</target>
+<source>Cannot open directory %x.</source>
+<target>Kan de map %x niet openen.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>Kan de symbolische koppeling %x niet verwijderen.</target>
+<source>Unsupported item type.</source>
+<target>Niet-ondersteund item type.</target>
<source>Incorrect command line:</source>
<target>Onjuiste opdrachtregel:</target>
@@ -770,8 +785,8 @@ De opdracht wordt geactiveerd als:
<source>&Restore</source>
<target>&Herstellen</target>
-<source>&Show error</source>
-<target>&Toon fout</target>
+<source>&Show error message</source>
+<target>&Toon foutmelding</target>
<source>&Quit</source>
<target>&Stoppen</target>
@@ -800,6 +815,9 @@ De opdracht wordt geactiveerd als:
<source>Loading...</source>
<target>Laden...</target>
+<source>Scanning...</source>
+<target>Scannen...</target>
+
<source>job name</source>
<target>taaknaam</target>
@@ -1028,12 +1046,12 @@ De opdracht wordt geactiveerd als:
<source>View type:</source>
<target>Type bekijken:</target>
-<source>Save as default</source>
-<target>Opslaan als standaard</target>
-
<source>Select view:</source>
<target>Selecteer weergave:</target>
+<source>Save as default</source>
+<target>Opslaan als standaard</target>
+
<source>Statistics:</source>
<target>Statistieken:</target>
@@ -1052,9 +1070,6 @@ De opdracht wordt geactiveerd als:
<source>Arrange folder pair</source>
<target>Rangschik folder-paar</target>
-<source>Folder pair:</source>
-<target>Map-paar:</target>
-
<source>Main settings:</source>
<target>Belangrijkste instellingen:</target>
@@ -1180,12 +1195,21 @@ De opdracht wordt geactiveerd als:
<source>OK</source>
<target>OK</target>
-<source>Enter your login details:</source>
-<target>Logingegevens invoeren:</target>
-
<source>Connection type:</source>
<target>Verbindingstype:</target>
+<source>Connected user accounts:</source>
+<target>Verbonden gebruikersaccounts:</target>
+
+<source>&Add connection</source>
+<target>&Verbinding toevoegen</target>
+
+<source>&Disconnect</source>
+<target>&Verbreken</target>
+
+<source>Selected user account:</source>
+<target>Geselecteerde gebruikersaccount:</target>
+
<source>Server name or IP address:</source>
<target>Servernaam of IP-adres:</target>
@@ -1234,15 +1258,9 @@ De opdracht wordt geactiveerd als:
<source>Detect server limit</source>
<target>Gedetecteerd server limiet</target>
-<source>Select a directory on the server:</source>
-<target>Selecteer een map op de server:</target>
-
<source>Select Folder</source>
<target>Selecteer map</target>
-<source>Start synchronization now?</source>
-<target>Synchronisatie nu starten?</target>
-
<source>Variant:</source>
<target>Variant:</target>
@@ -1294,9 +1312,6 @@ De opdracht wordt geactiveerd als:
<source>Run minimized</source>
<target>Geminimaliseerd uitvoeren</target>
-<source>&Show error dialog</source>
-<target>&Toon foutdialoog</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Toon pop-up bij fouten of waarschuwingen</target>
@@ -1531,11 +1546,11 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>multiple selection</source>
<target>meervoudige selectie</target>
-<source>Include via filter:</source>
-<target>Inclusief via filter:</target>
+<source>&Include via filter:</source>
+<target>Via filter &Toevoegen:</target>
-<source>Exclude via filter:</source>
-<target>Uitsluiten via filter:</target>
+<source>&Exclude via filter:</source>
+<target>Via filter &Uitsluiten:</target>
<source>Include temporarily</source>
<target>Tijdelijk opnemen</target>
@@ -1543,6 +1558,9 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Exclude temporarily</source>
<target>Tijdelijk uitsluiten</target>
+<source>&Synchronize selection</source>
+<target>Selectie &synchroniseren</target>
+
<source>&Copy to...</source>
<target>&Kopiëren naar...</target>
@@ -1678,9 +1696,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Initializing...</source>
<target>Initialiseren...</target>
-<source>Scanning...</source>
-<target>Scannen...</target>
-
<source>Comparing content...</source>
<target>Inhoud vergelijken...</target>
@@ -1699,6 +1714,9 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Recommended range:</source>
<target>Aanbevolen bereik:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>Wilt u echt de verbinding verbreken met gebruikersaccount %x?</target>
+
<source>Password:</source>
<target>Wachtwoord:</target>
@@ -1741,6 +1759,12 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<pluralform>Wilt u de volgende %x items echt verwijderen?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>De selectie nu synchroniseren?</target>
+
+<source>Start synchronization now?</source>
+<target>Synchronisatie nu starten?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Kopiëren DACL, SACL, Eigenaar, Groep</target>
@@ -1924,9 +1948,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Unable to register device notifications for %x.</source>
<target>Niet in staat om apparaat meldingen te registreren voor %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>Kan map %x niet bewaken.</target>
-
<source>The file is locked by another process:</source>
<target>Het bestand is vergrendeld door een ander proces:</target>
@@ -1945,9 +1966,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>%x is not a regular directory name.</source>
<target>%x is niet een normale mapnaam.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Kan bestand %x niet kopiëren naar %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Kan de attributen van %x niet kopiëren naar %y.</target>
diff --git a/FreeFileSync/Build/Languages/english_uk.lng b/FreeFileSync/Build/Languages/english_uk.lng
index 9b2c4f75..f8814e1e 100755
--- a/FreeFileSync/Build/Languages/english_uk.lng
+++ b/FreeFileSync/Build/Languages/english_uk.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>An exception occurred</target>
-<source>A directory path is expected after %x.</source>
-<target>A directory path is expected after %x.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>A left and a right directory path are expected after %x.</target>
<source>Syntax error</source>
<target>Syntax error</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>A left and a right directory path are expected after %x.</target>
-
<source>Cannot find file %x.</source>
<target>Cannot find file %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>File %x does not contain a valid configuration.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Unequal number of left and right directories specified.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>The config file must not contain settings at directory pair level when directories are set via command line.</target>
@@ -106,8 +100,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Any number of alternative directory pairs for at most one config file.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
-<target>Open the selected configuration for editing only without executing it.</target>
+<source>Open the selected configuration for editing only, without executing it.</source>
+<target>Open the selected configuration for editing only, without executing it.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
<target>Path to an alternate GlobalSettings.xml file.</target>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>The folders are created automatically when needed.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</target>
+
<source>Scanning:</source>
<target>Scanning:</target>
@@ -424,9 +421,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>Cannot determine volume name for %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>Volume name %x is not part of file path %y.</target>
@@ -490,6 +484,21 @@
<source>Source item %x not found</source>
<target>Source item %x not found</target>
+<source>Cannot move file %x to %y.</source>
+<target>Cannot move file %x to %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>Parent folder %x is not existing.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>The name %x is already used by another item.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Cannot copy file %x to %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Cannot copy symbolic link %x to %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Creating a Volume Shadow Copy for %x...</target>
@@ -511,6 +520,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>The following items have unresolved conflicts and will not be synchronised:</target>
+<source>Folder pair:</source>
+<target>Folder pair:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>The following folders are significantly different. Please check that the correct folders are selected for synchronisation.</target>
@@ -567,74 +579,77 @@ Actual: %y bytes
<source>Cannot write permissions of %x.</source>
<target>Cannot write permissions of %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Operation not supported for different base folder types.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>Cannot move file %x to %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Cannot copy symbolic link %x to %y.</target>
-
-<source>Error Code %x</source>
-<target>Error Code %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>Failed to get information about server %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Cannot open directory %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Cannot create directory %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>Operation not supported between different devices.</target>
<source>Cannot delete file %x.</source>
<target>Cannot delete file %x.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Cannot delete symbolic link %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>Cannot delete directory %x.</target>
+<source>Error Code %x</source>
+<target>Error Code %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>Cannot write modification time of %x.</target>
+<source>Cannot create directory %x.</source>
+<target>Cannot create directory %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>Cannot determine final path for %x.</target>
+<source>Operation not supported by device.</source>
+<target>Operation not supported by device.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>Cannot resolve symbolic link %x.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>Unable to move %x to the recycle bin.</target>
-<source>Unable to access %x.</source>
-<target>Unable to access %x.</target>
-
<source>Authentication completed.</source>
<target>Authentication completed.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>You may close this page now and continue with FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>Authentication failed.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>You may close this page now and continue with FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>Cannot find %x.</target>
-<source>The server returned an error:</source>
-<target>The server returned an error:</target>
+<source>Please authorize access to user account %x.</source>
+<target>Please authorise access to user account %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>Cannot determine free disk space for %x.</target>
-<source>Cannot find %x.</source>
-<target>Cannot find %x.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Unable to disconnect from %x.</target>
+
+<source>Unable to access %x.</source>
+<target>Unable to access %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>Failed to get information about server %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>Cannot monitor directory %x.</target>
<source>Cannot find device %x.</source>
<target>Cannot find device %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>Type of item %x is not supported:</target>
+<source>Cannot open directory %x.</source>
+<target>Cannot open directory %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>Cannot delete symbolic link %x.</target>
+<source>Unsupported item type.</source>
+<target>Unsupported item type.</target>
<source>Incorrect command line:</source>
<target>Incorrect command line:</target>
@@ -770,8 +785,8 @@ The command is triggered if:
<source>&Restore</source>
<target>&Restore</target>
-<source>&Show error</source>
-<target>&Show error</target>
+<source>&Show error message</source>
+<target>&Show error message</target>
<source>&Quit</source>
<target>&Quit</target>
@@ -800,6 +815,9 @@ The command is triggered if:
<source>Loading...</source>
<target>Loading...</target>
+<source>Scanning...</source>
+<target>Scanning...</target>
+
<source>job name</source>
<target>job name</target>
@@ -1028,12 +1046,12 @@ The command is triggered if:
<source>View type:</source>
<target>View type:</target>
-<source>Save as default</source>
-<target>Save as default</target>
-
<source>Select view:</source>
<target>Select view:</target>
+<source>Save as default</source>
+<target>Save as default</target>
+
<source>Statistics:</source>
<target>Statistics:</target>
@@ -1052,9 +1070,6 @@ The command is triggered if:
<source>Arrange folder pair</source>
<target>Arrange folder pair</target>
-<source>Folder pair:</source>
-<target>Folder pair:</target>
-
<source>Main settings:</source>
<target>Main settings:</target>
@@ -1180,12 +1195,21 @@ The command is triggered if:
<source>OK</source>
<target>OK</target>
-<source>Enter your login details:</source>
-<target>Enter your login details:</target>
-
<source>Connection type:</source>
<target>Connection type:</target>
+<source>Connected user accounts:</source>
+<target>Connected user accounts:</target>
+
+<source>&Add connection</source>
+<target>&Add connection</target>
+
+<source>&Disconnect</source>
+<target>&Disconnect</target>
+
+<source>Selected user account:</source>
+<target>Selected user account:</target>
+
<source>Server name or IP address:</source>
<target>Server name or IP address:</target>
@@ -1234,15 +1258,9 @@ The command is triggered if:
<source>Detect server limit</source>
<target>Detect server limit</target>
-<source>Select a directory on the server:</source>
-<target>Select a directory on the server:</target>
-
<source>Select Folder</source>
<target>Select Folder</target>
-<source>Start synchronization now?</source>
-<target>Start synchronisation now?</target>
-
<source>Variant:</source>
<target>Variant:</target>
@@ -1294,9 +1312,6 @@ The command is triggered if:
<source>Run minimized</source>
<target>Run minimised</target>
-<source>&Show error dialog</source>
-<target>&Show error dialog</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Show pop-up on errors or warnings</target>
@@ -1531,11 +1546,11 @@ This guarantees a consistent state even in case of a serious error.
<source>multiple selection</source>
<target>multiple selection</target>
-<source>Include via filter:</source>
-<target>Include via filter:</target>
+<source>&Include via filter:</source>
+<target>&Include via filter:</target>
-<source>Exclude via filter:</source>
-<target>Exclude via filter:</target>
+<source>&Exclude via filter:</source>
+<target>&Exclude via filter:</target>
<source>Include temporarily</source>
<target>Include temporarily</target>
@@ -1543,6 +1558,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Exclude temporarily</source>
<target>Exclude temporarily</target>
+<source>&Synchronize selection</source>
+<target>&Synchronise selection</target>
+
<source>&Copy to...</source>
<target>&Copy to...</target>
@@ -1678,9 +1696,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Initializing...</source>
<target>Initialising...</target>
-<source>Scanning...</source>
-<target>Scanning...</target>
-
<source>Comparing content...</source>
<target>Comparing content...</target>
@@ -1699,6 +1714,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Recommended range:</source>
<target>Recommended range:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>Do you really want to disconnect from user account %x?</target>
+
<source>Password:</source>
<target>Password:</target>
@@ -1741,6 +1759,12 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>Do you really want to delete the following %x items?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>Start to synchronise the selection?</target>
+
+<source>Start synchronization now?</source>
+<target>Start synchronisation now?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Copy DACL, SACL, Owner, Group</target>
@@ -1924,9 +1948,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Unable to register device notifications for %x.</source>
<target>Unable to register device notifications for %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>Cannot monitor directory %x.</target>
-
<source>The file is locked by another process:</source>
<target>The file is locked by another process:</target>
@@ -1945,9 +1966,6 @@ This guarantees a consistent state even in case of a serious error.
<source>%x is not a regular directory name.</source>
<target>%x is not a regular directory name.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Cannot copy file %x to %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Cannot copy attributes from %x to %y.</target>
diff --git a/FreeFileSync/Build/Languages/french.lng b/FreeFileSync/Build/Languages/french.lng
index ca08d5b3..0f4e52a8 100755
--- a/FreeFileSync/Build/Languages/french.lng
+++ b/FreeFileSync/Build/Languages/french.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>Une erreur s'est produite</target>
-<source>A directory path is expected after %x.</source>
-<target>Un chemin est attendu après %x.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Un répertoire gauche et un répertoire droit sont requis après %x.</target>
<source>Syntax error</source>
<target>Erreur de syntaxe</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>Un répertoire gauche et un répertoire droit sont requis après %x.</target>
-
<source>Cannot find file %x.</source>
<target>Impossible de trouver le fichier %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>Le fichier %x ne contient pas une configuration valide.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Le nombre de répertoires à gauche et à droite n'est pas identique.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Le fichier de configuration ne peut pas contenir de paramètres au niveau de paires de répertoires quand ceux-ci sont définis par une ligne de commande.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>N'importe quel nombre de paires de répertoires distincts pour au plus un fichier de configuration.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>L'ouverture de la configuration choisie pour être modifiée ne permet pas de l'exécuter.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>Les dossiers sont créés automatiquement quand cela est nécessaire.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>Les chemins de dossier suivants diffèrent selon les cas. Veuillez utiliser un seul formulaire afin d'éviter les accès en double.</target>
+
<source>Scanning:</source>
<target>Lecture en cours :</target>
@@ -424,9 +421,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Veuillez exécuter de préférence la version 64 bits de FreeFileSync pour utiliser le service Shadow Copy.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>Impossible de déterminer le nom du volume de %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>Le nom de volume %x ne fait pas partie du chemin %y.</target>
@@ -490,6 +484,21 @@
<source>Source item %x not found</source>
<target>L'élément source %x n'a pas été trouvé</target>
+<source>Cannot move file %x to %y.</source>
+<target>Impossible de déplacer le fichier %x vers %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>Le dossier parent %x n'existe pas.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>Le nom %x est déjà utilisé par un autre élément.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Impossible de copier le fichier %x vers %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Impossible de copier le lien symbolique %x vers %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Création d'un Volume Shadow Copy pour %x ...</target>
@@ -511,6 +520,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Les éléments suivants sont en conflits non résolus et ne seront pas synchronisés :</target>
+<source>Folder pair:</source>
+<target>Paire de dossiers :</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>Les dossiers suivants sont assez différents. Veuillez contrôler que ce sont les bons dossiers qui sont sélectionnés pour la synchronisation.</target>
@@ -567,74 +579,77 @@ Trouvé : %y octets
<source>Cannot write permissions of %x.</source>
<target>Impossible d'écrire les permissions de %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Opération non prise en charge pour dee dossiers de base de types différents.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>Impossible de déplacer le fichier %x vers %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Impossible de copier le lien symbolique %x vers %y.</target>
-
-<source>Error Code %x</source>
-<target>Code Erreur %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>Impossible de trouver le serveur %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Impossible d'ouvrir le répertoire %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Impossible de créer le répertoire %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>Opération non prise en charge entre appareils différents.</target>
<source>Cannot delete file %x.</source>
<target>Impossible de supprimer le fichier %x.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Impossible de supprimer le lien symbolique %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>Impossible de supprimer le répertoire %x.</target>
+<source>Error Code %x</source>
+<target>Code Erreur %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>Impossible d'écrire la date de modification de %x.</target>
+<source>Cannot create directory %x.</source>
+<target>Impossible de créer le répertoire %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>Impossible de déterminer le chemin pour %x.</target>
+<source>Operation not supported by device.</source>
+<target>Opération non prise en charge par cet appareil.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>Impossible de résoudre le lien symbolique %x.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>Impossible de déplacer %x dans la Corbeille.</target>
-<source>Unable to access %x.</source>
-<target>Impossible d'accéder à %x.</target>
-
<source>Authentication completed.</source>
<target>Identification terminée.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>Vous pouvez fermer cette page maintenant et poursuivre avec FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>Echec de l'identification.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>Vous pouvez fermer cette page maintenant et poursuivre avec FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>Impossible de trouver %x.</target>
-<source>The server returned an error:</source>
-<target>Le serveur a renvoyé une erreur :</target>
+<source>Please authorize access to user account %x.</source>
+<target>Veuillez autoriser l'accès au compte d'utilisateur %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>Impossible de calculer l'espace libre du disque %x.</target>
-<source>Cannot find %x.</source>
-<target>Impossible de trouver %x.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Impossible de se déconnecter de %x.</target>
+
+<source>Unable to access %x.</source>
+<target>Impossible d'accéder à %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>Impossible de trouver le serveur %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>Impossible de gérer le répertoire %x.</target>
<source>Cannot find device %x.</source>
<target>Impossible de trouver le périphérique %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>Le type de l'élément %x n'est pas accepté :</target>
+<source>Cannot open directory %x.</source>
+<target>Impossible d'ouvrir le répertoire %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>Impossible de supprimer le lien symbolique %x.</target>
+<source>Unsupported item type.</source>
+<target>Type d'élément non pris en charge.</target>
<source>Incorrect command line:</source>
<target>Ligne de commande incorrecte :</target>
@@ -770,8 +785,8 @@ La commande est déclenchée si :
<source>&Restore</source>
<target>&Restaurer</target>
-<source>&Show error</source>
-<target>&Afficher l'erreur</target>
+<source>&Show error message</source>
+<target>&Afficher les messages d'erreur</target>
<source>&Quit</source>
<target>&Quitter</target>
@@ -800,6 +815,9 @@ La commande est déclenchée si :
<source>Loading...</source>
<target>Chargement ...</target>
+<source>Scanning...</source>
+<target>Lecture en cours ...</target>
+
<source>job name</source>
<target>nom du job</target>
@@ -1028,12 +1046,12 @@ La commande est déclenchée si :
<source>View type:</source>
<target>Type de vue :</target>
-<source>Save as default</source>
-<target>Sauvegarde par défaut</target>
-
<source>Select view:</source>
<target>Choisir la vue :</target>
+<source>Save as default</source>
+<target>Sauvegarde par défaut</target>
+
<source>Statistics:</source>
<target>Statistiques :</target>
@@ -1052,9 +1070,6 @@ La commande est déclenchée si :
<source>Arrange folder pair</source>
<target>Coordonne la paire de dossiers</target>
-<source>Folder pair:</source>
-<target>Paire de dossiers :</target>
-
<source>Main settings:</source>
<target>Paramètres principaux :</target>
@@ -1180,12 +1195,21 @@ La commande est déclenchée si :
<source>OK</source>
<target>OK</target>
-<source>Enter your login details:</source>
-<target>Entrez vos identifiants :</target>
-
<source>Connection type:</source>
<target>Type de connexion :</target>
+<source>Connected user accounts:</source>
+<target>Comptes utilisateur connectés :</target>
+
+<source>&Add connection</source>
+<target>&Ajouter une connexion</target>
+
+<source>&Disconnect</source>
+<target>&Se déconnecter</target>
+
+<source>Selected user account:</source>
+<target>Choisir un compte utilisateur :</target>
+
<source>Server name or IP address:</source>
<target>Nom du serveur ou adresse IP :</target>
@@ -1234,15 +1258,9 @@ La commande est déclenchée si :
<source>Detect server limit</source>
<target>Détection des limites du serveur</target>
-<source>Select a directory on the server:</source>
-<target>Choisir un répertoire sur le serveur :</target>
-
<source>Select Folder</source>
<target>Choisir un Dossier</target>
-<source>Start synchronization now?</source>
-<target>Démarrer la synchronisation maintenant ?</target>
-
<source>Variant:</source>
<target>Variante :</target>
@@ -1294,9 +1312,6 @@ La commande est déclenchée si :
<source>Run minimized</source>
<target>Exécution fenêtre réduite</target>
-<source>&Show error dialog</source>
-<target>&Afficher la boîte de dialogue d'erreur</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Montrer les avertissements et les messages d'erreur</target>
@@ -1531,11 +1546,11 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>multiple selection</source>
<target>sélection multiple</target>
-<source>Include via filter:</source>
-<target>Inclure à l'aide du filtre :</target>
+<source>&Include via filter:</source>
+<target>&Inclure via le filtre :</target>
-<source>Exclude via filter:</source>
-<target>Exclure à l'aide du filtre :</target>
+<source>&Exclude via filter:</source>
+<target>&Exclure via le filtre :</target>
<source>Include temporarily</source>
<target>Inclure temporairement</target>
@@ -1543,6 +1558,9 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Exclude temporarily</source>
<target>Exclure temporairement</target>
+<source>&Synchronize selection</source>
+<target>&Choix de la synchronisation</target>
+
<source>&Copy to...</source>
<target>&Copier vers ...</target>
@@ -1678,9 +1696,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Initializing...</source>
<target>Initialisation ...</target>
-<source>Scanning...</source>
-<target>Lecture en cours ...</target>
-
<source>Comparing content...</source>
<target>Comparaison du contenu ...</target>
@@ -1699,6 +1714,9 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Recommended range:</source>
<target>Plage recommandée :</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>Voulez-vous vraiment vous déconnecter du compte utilisateur %x ?</target>
+
<source>Password:</source>
<target>Mot de passe :</target>
@@ -1741,6 +1759,12 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<pluralform>Voulez-vous vraiment supprimer ces %x éléments ?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>Commencer à synchroniser la sélection ?</target>
+
+<source>Start synchronization now?</source>
+<target>Démarrer la synchronisation maintenant ?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Copie DACL, SACL, propriétaire et groupe</target>
@@ -1924,9 +1948,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Unable to register device notifications for %x.</source>
<target>Impossible d'enregistrer les notifications de périphérique pour %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>Impossible de gérer le répertoire %x.</target>
-
<source>The file is locked by another process:</source>
<target>Le fichier est verrouillé par un autre process :</target>
@@ -1945,9 +1966,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>%x is not a regular directory name.</source>
<target>%x n'est pas un nom de répertoire valide.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Impossible de copier le fichier %x vers %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Impossible de copier les attributs de %x à %y.</target>
diff --git a/FreeFileSync/Build/Languages/german.lng b/FreeFileSync/Build/Languages/german.lng
index e89cb5e3..c77d82c4 100755
--- a/FreeFileSync/Build/Languages/german.lng
+++ b/FreeFileSync/Build/Languages/german.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>Eine Ausnahme ist aufgetreten</target>
-<source>A directory path is expected after %x.</source>
-<target>Ein Verzeichnispfad wird nach %x erwartet.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Ein linker und rechter Verzeichnispfad werden nach %x erwartet.</target>
<source>Syntax error</source>
<target>Syntaxfehler</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>Ein linker und rechter Verzeichnispfad werden nach %x erwartet.</target>
-
<source>Cannot find file %x.</source>
<target>Die Datei %x wurde nicht gefunden.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>Die Datei %x enthält keine gültige Konfiguration.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Ungleiche Anzahl linker und rechter Verzeichnisse angegeben.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Die Konfigurationsdatei darf keine Einstellungen auf Verzeichnispaarebene enthalten, wenn Verzeichnisse über die Befehlszeile gesetzt werden.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Beliebige Anzahl von alternativen Verzeichnispaaren für maximal eine Konfigurationsdatei.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>Ausgewählte Konfiguration nur zum Editieren öffnen ohne sie auszuführen.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -427,9 +421,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Bitte starten Sie die FreeFileSync 64-Bit Version, um Schattenkopien auf diesem System zu erstellen.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>Der Laufwerksname für %x kann nicht bestimmt werden.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>Laufwerksname %x ist kein Teil des Dateipfades %y.</target>
@@ -493,6 +484,21 @@
<source>Source item %x not found</source>
<target>Das Quellelement %x wurde nicht gefunden.</target>
+<source>Cannot move file %x to %y.</source>
+<target>Die Datei %x kann nicht nach %y verschoben werden.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>Der übergeordnete Ordner %x existiert nicht.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>Der Name %x wird bereits von einem anderen Element verwendet.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Die Datei %x kann nicht nach %y kopiert werden.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Die symbolische Verknüpfung %x kann nicht nach %y kopiert werden.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Erstelle eine Volumenschattenkopie für %x...</target>
@@ -573,51 +579,39 @@ Tatsächlich: %y bytes
<source>Cannot write permissions of %x.</source>
<target>Die Berechtigungen von %x können nicht geschrieben werden.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Der Vorgang wird für unterschiedliche Basisordnertypen nicht unterstützt.</target>
+<source>Operation not supported between different devices.</source>
+<target>Der Vorgang wird zwischen unterschiedlichen Geräten nicht unterstützt.</target>
-<source>Cannot move file %x to %y.</source>
-<target>Die Datei %x kann nicht nach %y verschoben werden.</target>
+<source>Cannot delete file %x.</source>
+<target>Die Datei %x kann nicht gelöscht werden.</target>
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Die symbolische Verknüpfung %x kann nicht nach %y kopiert werden.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Die symbolischen Verknüpfung %x kann nicht gelöscht werden.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Das Verzeichnis %x kann nicht gelöscht werden.</target>
<source>Error Code %x</source>
<target>Fehlercode %x</target>
-<source>Failed to get information about server %x.</source>
-<target>Informationen über den Server %x konnten nicht abgerufen werden.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Das Verzeichnis %x kann nicht geöffnet werden.</target>
-
<source>Cannot write modification time of %x.</source>
<target>Die Änderungszeit von %x kann nicht geschrieben werden.</target>
<source>Cannot create directory %x.</source>
<target>Das Verzeichnis %x kann nicht erstellt werden.</target>
-<source>Cannot delete file %x.</source>
-<target>Die Datei %x kann nicht gelöscht werden.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Das Verzeichnis %x kann nicht gelöscht werden.</target>
-
<source>Cannot determine final path for %x.</source>
<target>Der endgültige Pfad für %x kann nicht ermittelt werden.</target>
+<source>Operation not supported by device.</source>
+<target>Der Vorgang wird vom Gerät nicht unterstützt.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>Die symbolische Verknüpfung %x kann nicht aufgelöst werden.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>%x kann nicht in den Papierkorb verschoben werden.</target>
-<source>Unable to access %x.</source>
-<target>Auf %x kann nicht zugegriffen werden.</target>
-
-<source>The server returned an error:</source>
-<target>Der Server hat einen Fehler zurückgegeben:</target>
-
<source>Authentication completed.</source>
<target>Authentifizierung abgeschlossen.</target>
@@ -627,29 +621,35 @@ Tatsächlich: %y bytes
<source>Authentication failed.</source>
<target>Authentifizierung fehlgeschlagen.</target>
-<source>Unable to disconnect from %x.</source>
-<target>Die Verbindung zu %x kann nicht getrennt werden.</target>
-
-<source>Cannot monitor directory %x.</source>
-<target>Das Verzeichnis %x kann nicht überwacht werden.</target>
-
<source>Cannot find %x.</source>
<target>%x wurde nicht gefunden.</target>
<source>Please authorize access to user account %x.</source>
<target>Bitte autorisieren Sie den Zugriff auf das Nutzerkonto %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>Die symbolischen Verknüpfung %x kann nicht gelöscht werden.</target>
-
<source>Cannot determine free disk space for %x.</source>
<target>Der freie Speicherplatz für %x konnte nicht ermittelt werden.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Die Verbindung zu %x kann nicht getrennt werden.</target>
+
+<source>Unable to access %x.</source>
+<target>Auf %x kann nicht zugegriffen werden.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>Informationen über den Server %x konnten nicht abgerufen werden.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>Das Verzeichnis %x kann nicht überwacht werden.</target>
+
<source>Cannot find device %x.</source>
<target>Das Gerät %x wurde nicht gefunden.</target>
-<source>Type of item %x is not supported:</source>
-<target>Der Typ des Elements %x wird nicht unterstützt:</target>
+<source>Cannot open directory %x.</source>
+<target>Das Verzeichnis %x kann nicht geöffnet werden.</target>
+
+<source>Unsupported item type.</source>
+<target>Der Elementstyp wird nicht unterstützt.</target>
<source>Incorrect command line:</source>
<target>Ungültige Befehlszeile:</target>
@@ -785,8 +785,8 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>&Restore</source>
<target>&Wiederherstellen</target>
-<source>&Show error</source>
-<target>&Zeige Fehler</target>
+<source>&Show error message</source>
+<target>&Fehlermeldung zeigen</target>
<source>&Quit</source>
<target>&Beenden</target>
@@ -1046,12 +1046,12 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>View type:</source>
<target>Ansichtstyp:</target>
-<source>Save as default</source>
-<target>Als Standard speichern</target>
-
<source>Select view:</source>
<target>Ansicht wählen:</target>
+<source>Save as default</source>
+<target>Als Standard speichern</target>
+
<source>Statistics:</source>
<target>Statistiken:</target>
@@ -1261,9 +1261,6 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>Select Folder</source>
<target>Ordner auswählen</target>
-<source>Start synchronization now?</source>
-<target>Synchronisation jetzt starten?</target>
-
<source>Variant:</source>
<target>Variante:</target>
@@ -1315,9 +1312,6 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>Run minimized</source>
<target>Minimiert ausführen</target>
-<source>&Show error dialog</source>
-<target>&Zeige Fehlerdialog</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Ein Auswahlfenster bei Fehlern oder Warnungen anzeigen</target>
@@ -1552,11 +1546,11 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert.
<source>multiple selection</source>
<target>Mehrfachauswahl</target>
-<source>Include via filter:</source>
-<target>Über Filter einschließen:</target>
+<source>&Include via filter:</source>
+<target>Über Filter &einschließen:</target>
-<source>Exclude via filter:</source>
-<target>Über Filter ausschließen:</target>
+<source>&Exclude via filter:</source>
+<target>Über Filter &ausschließen:</target>
<source>Include temporarily</source>
<target>Temporär einschließen</target>
@@ -1564,6 +1558,9 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert.
<source>Exclude temporarily</source>
<target>Temporär ausschließen</target>
+<source>&Synchronize selection</source>
+<target>Auswahl &synchronisieren</target>
+
<source>&Copy to...</source>
<target>&Kopieren nach...</target>
@@ -1762,6 +1759,12 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert.
<pluralform>Sollen die folgenden %x Elemente wirklich gelöscht werden?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>Auswahl jetzt synchronisieren?</target>
+
+<source>Start synchronization now?</source>
+<target>Synchronisation jetzt starten?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>DACL, SACL, Besitzer und Gruppe kopieren</target>
@@ -1922,7 +1925,7 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert.
<target>&Prüfen</target>
<source>Consistency check failed for %x.</source>
-<target>Die Konsistenzprüfung für %x ist fehlgeschlagen.</target>
+<target>Die Gültigkeitsprüfung für %x ist fehlgeschlagen.</target>
<source>Installation was registered on a different operating system.</source>
<target>Die Installation wurde auf einem anderen Betriebssystem registriert.</target>
@@ -1963,9 +1966,6 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert.
<source>%x is not a regular directory name.</source>
<target>%x ist kein regulärer Verzeichnisname.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Die Datei %x kann nicht nach %y kopiert werden.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Die Attribute können nicht von %x nach %y kopiert werden.</target>
diff --git a/FreeFileSync/Build/Languages/greek.lng b/FreeFileSync/Build/Languages/greek.lng
index ab0c8dfb..1fcaedac 100755
--- a/FreeFileSync/Build/Languages/greek.lng
+++ b/FreeFileSync/Build/Languages/greek.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>Παρουσιάστηκε μια εξαίρεση</target>
-<source>A directory path is expected after %x.</source>
-<target>Μετά το %x αναμένεται μια διαδρομή υποκαταλόγου.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Μετά το %x αναμένονται μια διαδρομή υποκαταλόγου αριστερά και μια δεξιά.</target>
<source>Syntax error</source>
<target>Σφάλμα σύνταξης</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>Μετά το %x αναμένονται μια διαδρομή υποκαταλόγου αριστερά και μια δεξιά.</target>
-
<source>Cannot find file %x.</source>
<target>Το αρχείο %x δεν μπορεί να βρεθεί.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>Το αρχείο %x δεν περιέχει έγκυρες παραμέτρους.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Έχει οριστεί άνισος αριθμός υποκαταλόγων δεξιά από ό,τι αριστερά.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Το αρχείο διάταξης δεν πρέπει να περιλαμβάνει ρυθμίσεις στο επίπεδο του ζεύγους των υποκαταλόγων, όταν οι φάκελοι ορίζονται μέσω της γραμμής εργασιών.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Οποιοσδήποτε αριθμός από εναλλακτικά ζεύγη υποκαταλόγων για το πολύ ένα αρχείο ρυθμίσεων.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>Άνοιγμα του επιλεγμένου αρχείου παραμέτρων μόνο για διόρθωση, χωρίς να εκτελεστεί.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>Οι φάκελοι θα δημιουργηθούν αυτόματα όταν χρειαστούν.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>Οι ακόλουθες διαδρομές υποκαταλόγων διαφέρουν ως προς τα κεφαλαία/πεζά τους. Παρακαλούμε χρησιμοποιείστε την ίδια μορφή, ώστε να αποφευχθούν οι διπλές προσβάσεις.</target>
+
<source>Scanning:</source>
<target>Ανίχνευση:</target>
@@ -424,9 +421,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Παρακαλούμε εκτελέστε την 64-bit έκδοση του FreeFileSync, για να δημιουργήσετε σκιώδη αντίγραφα σε αυτό το σύστημα.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>Δεν μπορεί να προσδιοριστεί το όνομα τόμου για το %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>Το όνομα τόμου %x δεν είναι μέρος της διαδρομής %y.</target>
@@ -490,6 +484,21 @@
<source>Source item %x not found</source>
<target>Το στοιχείο προέλευσης %x δεν βρέθηκε</target>
+<source>Cannot move file %x to %y.</source>
+<target>Δεν μπορεί το αρχείο %x να μεταφερθεί στο %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>Ο γονικός φάκελος %x δεν υπάρχει.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>Το όνομα %x χρησιμοποιείται ήδη από άλλο στοιχείο.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Δεν μπορεί να αντιγραφεί το αρχείο %x στο %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Αδυναμία αντιγραφής του συμβολικού συνδέσμου %x στο %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Δημιουργία Σκιώδους Αντίγραφου Τόμου για το %x...</target>
@@ -511,6 +520,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Τα ακόλουθα στοιχεία έχουν ανεπίλυτες διενέξεις και δε θα συγχρονιστούν:</target>
+<source>Folder pair:</source>
+<target>Ζεύγος φακέλων:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>Οι ακόλουθοι φάκελοι είναι σημαντικά διαφορετικοί. Παρακαλούμε ελέγξτε εάν έχουν επιλεχθεί για συγχρονισμό οι σωστοί φάκελοι.</target>
@@ -567,74 +579,77 @@ Actual: %y bytes
<source>Cannot write permissions of %x.</source>
<target>Δεν μπορεί να γίνει εγγραφή των δικαιωμάτων πρόσβασης του %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Η λειτουργία δεν υποστηρίζεται για διαφορετικούς τύπους βασικών φακέλων.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>Δεν μπορεί το αρχείο %x να μεταφερθεί στο %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Αδυναμία αντιγραφής του συμβολικού συνδέσμου %x στο %y.</target>
-
-<source>Error Code %x</source>
-<target>Κωδικός Σφάλματος %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>Αποτυχία λήψης πληροφοριών από τον διακομιστή %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Δεν είναι δυνατό το άνοιγμα του υποκαταλόγου %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Δεν μπορεί να δημιουργηθεί ο υποκατάλογος %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>Η λειτουργία δεν υποστηρίζεται μεταξύ διαφορετικών χώρων αποθήκευσης.</target>
<source>Cannot delete file %x.</source>
<target>Δεν μπορεί να διαγραφεί το αρχείο %x.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Δεν μπορεί να διαγραφεί ο συμβολικός σύνδεσμος %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>Δεν μπορεί να διαγραφεί ο υποκατάλογος %x.</target>
+<source>Error Code %x</source>
+<target>Κωδικός Σφάλματος %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>Δεν μπορεί να γίνει εγγραφή της ώρας τροποποίησης του %x.</target>
+<source>Cannot create directory %x.</source>
+<target>Δεν μπορεί να δημιουργηθεί ο υποκατάλογος %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>Δεν μπορεί να προσδιοριστεί η τελική διαδρομή για το %x.</target>
+<source>Operation not supported by device.</source>
+<target>Η λειτουργία δεν υποστηρίζεται από το χώρο αποθήκευσης.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>Ο συμβολικός σύνδεσμος %x δεν μπορεί να επιλυθεί.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>Δεν ήταν δυνατή η μεταφορά του %x στον κάδο ανακύκλωσης.</target>
-<source>Unable to access %x.</source>
-<target>Δεν είναι δυνατή η πρόσβαση στο %x.</target>
-
<source>Authentication completed.</source>
<target>Ολοκληρώθηκε η επαλήθευση ταυτότητας.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>Τώρα μπορείτε να κλείσετε αυτή τη σελίδα και να συνεχίσετε το FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>Η επαλήθευση ταυτότητας απέτυχε.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>Τώρα μπορείτε να κλείσετε αυτή τη σελίδα και να συνεχίσετε το FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>Το %x δεν μπορεί να βρεθεί.</target>
-<source>The server returned an error:</source>
-<target>Ο διακομιστής επέστρεψε το λάθος:</target>
+<source>Please authorize access to user account %x.</source>
+<target>Παρακαλούμε εξουσιοδοτείστε την πρόσβαση στο λογαριασμό χρήστη %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>Δεν μπορεί να υπολογιστεί ο ελεύθερος χώρος του δίσκου %x.</target>
-<source>Cannot find %x.</source>
-<target>Το %x δεν μπορεί να βρεθεί.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Αδυναία αποσύνδεσης από το %x.</target>
+
+<source>Unable to access %x.</source>
+<target>Δεν είναι δυνατή η πρόσβαση στο %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>Αποτυχία λήψης πληροφοριών από τον διακομιστή %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>Δεν είναι δυνατή η παρακολύθηση του υποκαταλόγου %x.</target>
<source>Cannot find device %x.</source>
-<target>Η συσκευή %x δεν μπορεί να βρεθεί.</target>
+<target>Ο χώρος αποθήκευσης %x δεν μπορεί να βρεθεί.</target>
-<source>Type of item %x is not supported:</source>
-<target>Ο τύπος του στοιχείου %x δεν υποστηρίζεται:</target>
+<source>Cannot open directory %x.</source>
+<target>Δεν είναι δυνατό το άνοιγμα του υποκαταλόγου %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>Δεν μπορεί να διαγραφεί ο συμβολικός σύνδεσμος %x.</target>
+<source>Unsupported item type.</source>
+<target>Μη υποστηριζόμενος τύπος στοιχείου.</target>
<source>Incorrect command line:</source>
<target>Εσφαλμένη γραμμή εντολών:</target>
@@ -770,8 +785,8 @@ The command is triggered if:
<source>&Restore</source>
<target>&Επαναφορά</target>
-<source>&Show error</source>
-<target>&Εμφάνιση σφάλματος</target>
+<source>&Show error message</source>
+<target>&Εμφάνιση μηνύματος σφαλμάτων</target>
<source>&Quit</source>
<target>Έ&ξοδος</target>
@@ -800,6 +815,9 @@ The command is triggered if:
<source>Loading...</source>
<target>Φόρτωση...</target>
+<source>Scanning...</source>
+<target>Ανίχνευση...</target>
+
<source>job name</source>
<target>όνομα ενέργειας</target>
@@ -1011,7 +1029,7 @@ The command is triggered if:
<target>Εύρεση:</target>
<source>Match case</source>
-<target>Ταίριασμα πεζών-κεφαλαίων</target>
+<target>Ταίριασμα κεφαλαίων/πεζών</target>
<source>New</source>
<target>Δημιουργία</target>
@@ -1028,12 +1046,12 @@ The command is triggered if:
<source>View type:</source>
<target>Τύπος εμφάνισης:</target>
-<source>Save as default</source>
-<target>Αποθήκευση ως προεπιλογής</target>
-
<source>Select view:</source>
<target>Επιλογή εμφάνισης:</target>
+<source>Save as default</source>
+<target>Αποθήκευση ως προεπιλογής</target>
+
<source>Statistics:</source>
<target>Στατιστικά:</target>
@@ -1052,9 +1070,6 @@ The command is triggered if:
<source>Arrange folder pair</source>
<target>Οργάνωση του ζεύγους φακέλων:</target>
-<source>Folder pair:</source>
-<target>Ζεύγος φακέλων:</target>
-
<source>Main settings:</source>
<target>Βασικές ρυθμίσεις:</target>
@@ -1104,7 +1119,7 @@ The command is triggered if:
<target>Παράλληλες λειτουργίες αρχείων:</target>
<source>How to get best performance?</source>
-<target>Πώς να έχετε την καλύτερη απόδοση;</target>
+<target>Πώς να έχετε την καλύτερη απόδοση</target>
<source>Local settings:</source>
<target>Τοπικές ρυθμίσεις:</target>
@@ -1180,12 +1195,21 @@ The command is triggered if:
<source>OK</source>
<target>OK</target>
-<source>Enter your login details:</source>
-<target>Εισάγετε τις λεπτομέρεις της σύνδεσης:</target>
-
<source>Connection type:</source>
<target>Τύπος σύνδεσης:</target>
+<source>Connected user accounts:</source>
+<target>Συνδεδεμένοι λογαριασμοί χρήστη:</target>
+
+<source>&Add connection</source>
+<target>&Προσθήκη σύνδεσης</target>
+
+<source>&Disconnect</source>
+<target>&Αποσύνδεση</target>
+
+<source>Selected user account:</source>
+<target>Επιλεγμένος λογαριασμός χρήστη:</target>
+
<source>Server name or IP address:</source>
<target>Όνομα του διακομιστή ή διεύθυνση IP:</target>
@@ -1234,15 +1258,9 @@ The command is triggered if:
<source>Detect server limit</source>
<target>Ανίχνευση ορίου του εξυπηρετητή</target>
-<source>Select a directory on the server:</source>
-<target>Επιλογή ενός υποκαταλόγου στον διακομιστή:</target>
-
<source>Select Folder</source>
<target>Επιλογή Φακέλου</target>
-<source>Start synchronization now?</source>
-<target>Να ξεκινήσει ο συγχρονισμός τώρα;</target>
-
<source>Variant:</source>
<target>Μέθοδος:</target>
@@ -1294,9 +1312,6 @@ The command is triggered if:
<source>Run minimized</source>
<target>Εκκίνηση σε ελαχιστοποιημένο παράθυρο</target>
-<source>&Show error dialog</source>
-<target>Εμ&φάνιση ειδοποιήσεων σφαλμάτων</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Εμφάνιση αναδυόμενου παράθυρου σε σφάλματα ή προειδοποιήσεις</target>
@@ -1531,11 +1546,11 @@ This guarantees a consistent state even in case of a serious error.
<source>multiple selection</source>
<target>πολλαπλή επιλογή</target>
-<source>Include via filter:</source>
-<target>Συμπερίληψη μέσω του φίλτρου:</target>
+<source>&Include via filter:</source>
+<target>&Συμπερίληψη μέσω φίλτρου:</target>
-<source>Exclude via filter:</source>
-<target>Εξαίρεση με βάση το φίλτρο:</target>
+<source>&Exclude via filter:</source>
+<target>&Εξαίρεση μέσω φίλτρου:</target>
<source>Include temporarily</source>
<target>Προσωρινή συμπερίληψη</target>
@@ -1543,6 +1558,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Exclude temporarily</source>
<target>Προσωρινή εξαίρεση</target>
+<source>&Synchronize selection</source>
+<target>&Συγχρονισμός επιλογής</target>
+
<source>&Copy to...</source>
<target>&Αντιγραφή σε...</target>
@@ -1678,9 +1696,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Initializing...</source>
<target>Αρχικοποίηση...</target>
-<source>Scanning...</source>
-<target>Ανίχνευση...</target>
-
<source>Comparing content...</source>
<target>Σύγκριση του περιεχομένου...</target>
@@ -1699,6 +1714,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Recommended range:</source>
<target>Προτεινόμενο εύρος:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>Θέλετε σίγουρα να αποσυνδεθείτε από το λογαριασμό χρήστη %x;</target>
+
<source>Password:</source>
<target>Συνθηματικό:</target>
@@ -1741,6 +1759,12 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>Είστε σίγουροι ότι θέλετε να διαγραφούν τα ακόλουθα %x στοιχεία;</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>Έναρξη συγχρονισμού της επιλογής;</target>
+
+<source>Start synchronization now?</source>
+<target>Να ξεκινήσει ο συγχρονισμός τώρα;</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Αντιγραφή των DACL, SACL, Κατόχου, Ομάδας</target>
@@ -1922,10 +1946,7 @@ This guarantees a consistent state even in case of a serious error.
<target>Δεν μπορεί να βρεθεί η λειτουργία συστήματος %x.</target>
<source>Unable to register device notifications for %x.</source>
-<target>Δεν μπορούν να καταχωρηθεί η ειδοποίηση για τη συσκευή %x.</target>
-
-<source>Cannot monitor directory %x.</source>
-<target>Δεν είναι δυνατή η παρακολύθηση του υποκαταλόγου %x.</target>
+<target>Δεν μπορούν να καταχωρηθεί η ειδοποίηση για το χώρο αποθήκευσης %x.</target>
<source>The file is locked by another process:</source>
<target>Το αρχείο είναι κλειδωμένο από μια άλλη διαδικασία:</target>
@@ -1945,9 +1966,6 @@ This guarantees a consistent state even in case of a serious error.
<source>%x is not a regular directory name.</source>
<target>Το %x δεν είναι ένα κανονικό όνομα υποκαταλόγου.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Δεν μπορεί να αντιγραφεί το αρχείο %x στο %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Δεν μπορούν να αντιγραφούν τα χαρακτηριστικά του %x στο %y.</target>
diff --git a/FreeFileSync/Build/Languages/hebrew.lng b/FreeFileSync/Build/Languages/hebrew.lng
index 8327f635..aa68375b 100755
--- a/FreeFileSync/Build/Languages/hebrew.lng
+++ b/FreeFileSync/Build/Languages/hebrew.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>אירוע חריג</target>
-<source>A directory path is expected after %x.</source>
-<target>נתיב מחיצה נדרש אחרי %x.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>נתיב מחיצה שמאלי וימני נדרשים לאחר %x.</target>
<source>Syntax error</source>
<target>שגיאת תחביר</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>נתיב מחיצה שמאלי וימני נדרשים לאחר %x.</target>
-
<source>Cannot find file %x.</source>
<target>לא מוצא קובץ %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>קובץ %x אינו כולל תצורה תקינה.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>מספר בלתי שווה של מחיצות ימין ושמאל צוין.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>קבצי הקונפיגורציה אינם יכולים לכלול הגדרות של זוגות מחיצות כאשר מחיצות מוגדרות באמצעות שורת הפקודה.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>כל כמות של זוגות מחיצות אלטרנטיביות עבור קובץ תצורה אחד לפחות.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>פתח את התצורה הבאה לעריכה בלבד מבלי להפעיל אותה.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>התיקיות נוצרות באופן אוטמטי כאשר נדרש.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>נתיביי התיקיות הבאים שונים. בבקשה עשה שימוש בתצורה אחידה כדי להימנע מריבוי גישה.</target>
+
<source>Scanning:</source>
<target>סורק:</target>
@@ -424,9 +421,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>בבקשה הרץ את גירסת 64 סיביות של FreeFileSync כדי ליצור עותקי צל של מערכת זו.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>לא יכול לקבוע שם אמצעי אחסון %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>כרך בשם %x אינו חלק של נתיב קובץ %y.</target>
@@ -490,6 +484,21 @@
<source>Source item %x not found</source>
<target>פריט מקור %x לא נמצא</target>
+<source>Cannot move file %x to %y.</source>
+<target>לא יכול להעביר קובץ %x אל %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>תיקיית אב %x לא קיימת.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>השם %x כבר בשימוש על ידי פריט אחר.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>לא יכול להעתיק קובץ %x אל %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>לא יכול להעתיק קישור סימבולי %x אל %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>מייצר Volume Shadow Copy עבור %x...</target>
@@ -511,6 +520,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>לפריטים הבאים יש קונפליקטים בלתי פתורים והם לא יסונכרנו:</target>
+<source>Folder pair:</source>
+<target>זוג תיקיות:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>התיקיות הבאות שונות באופן מהותי. בבקשה בדוק כי נבחרו התיקיות הנכונות לסחנכרון.</target>
@@ -567,74 +579,77 @@ Actual: %y bytes
<source>Cannot write permissions of %x.</source>
<target>לא יכול לכתוב הרשאות של %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>פעולה לא נתמכת עבור סוגים אחרים של תיקית בסיס.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>לא יכול להעביר קובץ %x אל %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>לא יכול להעתיק קישור סימבולי %x אל %y.</target>
-
-<source>Error Code %x</source>
-<target>קוד שגיאה %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>נכשלה קבלת מידע על שרת %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>לא יכול לפתוח מחיצה %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>לא יכול ליצור מחיצה %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>הפעולה אינה נתמכת בין התקנים שונים.</target>
<source>Cannot delete file %x.</source>
<target>לא יכול למחוק קובץ %x.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>לא ניתן למחוק קישור סימבולי %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>לא יכול למחוק מחיצה %x.</target>
+<source>Error Code %x</source>
+<target>קוד שגיאה %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>לא יכול לרשום זמן שינוי של %x.</target>
+<source>Cannot create directory %x.</source>
+<target>לא יכול ליצור מחיצה %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>לא יכול לקבוע את המסלול הסופי ל %x.</target>
+<source>Operation not supported by device.</source>
+<target>הפעולה אינה נתמכת על ידי ההתקן.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>לא יכול לפענח את הקישור הסימבולי %x.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>לא יכול להעביר את %x לסל המחזור.</target>
-<source>Unable to access %x.</source>
-<target>לא ניתן לגשת אל %x.</target>
-
<source>Authentication completed.</source>
<target>האימות הושלם.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>אתה יכול לסגור דף זה עכשיו ולהמשיך עם FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>האימות נכשל.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>אתה יכול לסגור דף זה עכשיו ולהמשיך עם FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>לא מוצא %x.</target>
-<source>The server returned an error:</source>
-<target>השרת החזיר שגיאה:</target>
+<source>Please authorize access to user account %x.</source>
+<target>בבקשה הרשה גישה לחשבון משתמש %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>לא ניתן לקבוע שטח דיסק פנוי עבור %x.</target>
-<source>Cannot find %x.</source>
-<target>לא מוצא %x.</target>
+<source>Unable to disconnect from %x.</source>
+<target>לא ניתן להתנתק מ %x.</target>
+
+<source>Unable to access %x.</source>
+<target>לא ניתן לגשת אל %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>נכשלה קבלת מידע על שרת %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>לא יכול לנטר מחיצה %x.</target>
<source>Cannot find device %x.</source>
<target>לא מוצא התקן %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>סוג של פריט %x אינו נתמך:</target>
+<source>Cannot open directory %x.</source>
+<target>לא יכול לפתוח מחיצה %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>לא ניתן למחוק קישור סימבולי %x.</target>
+<source>Unsupported item type.</source>
+<target>סוג פריט לא נתמך.</target>
<source>Incorrect command line:</source>
<target>שורת פקודה לא תקינה:</target>
@@ -770,8 +785,8 @@ The command is triggered if:
<source>&Restore</source>
<target>&טען מחדש</target>
-<source>&Show error</source>
-<target>&הראה שגיאה</target>
+<source>&Show error message</source>
+<target>&הצג הודעת שגיאה</target>
<source>&Quit</source>
<target>&יציאה</target>
@@ -800,6 +815,9 @@ The command is triggered if:
<source>Loading...</source>
<target>טוען...</target>
+<source>Scanning...</source>
+<target>סורק...</target>
+
<source>job name</source>
<target>שם משימה</target>
@@ -1028,12 +1046,12 @@ The command is triggered if:
<source>View type:</source>
<target>הצג סוג:</target>
-<source>Save as default</source>
-<target>שמור כברירת מחדל</target>
-
<source>Select view:</source>
<target>בחר תצוגה:</target>
+<source>Save as default</source>
+<target>שמור כברירת מחדל</target>
+
<source>Statistics:</source>
<target>סטטיסטיקה:</target>
@@ -1052,9 +1070,6 @@ The command is triggered if:
<source>Arrange folder pair</source>
<target>סדר זוג תיקיות</target>
-<source>Folder pair:</source>
-<target>זוג תיקיות:</target>
-
<source>Main settings:</source>
<target>הגדרות ראשיות:</target>
@@ -1180,12 +1195,21 @@ The command is triggered if:
<source>OK</source>
<target>אשר</target>
-<source>Enter your login details:</source>
-<target>הזן את פרטי הגישה שלך:</target>
-
<source>Connection type:</source>
<target>סוג חיבור:</target>
+<source>Connected user accounts:</source>
+<target>חשבונות משתמש מחוברים:</target>
+
+<source>&Add connection</source>
+<target>&הוסף חיבור</target>
+
+<source>&Disconnect</source>
+<target>&להתנתק</target>
+
+<source>Selected user account:</source>
+<target>בחר חשבון משתמש:</target>
+
<source>Server name or IP address:</source>
<target>שם שרת או כתובת IP:</target>
@@ -1234,15 +1258,9 @@ The command is triggered if:
<source>Detect server limit</source>
<target>גלה את גבול השרת</target>
-<source>Select a directory on the server:</source>
-<target>בחר מחיצה על השרת:</target>
-
<source>Select Folder</source>
<target>בחר מחיצה</target>
-<source>Start synchronization now?</source>
-<target>האם להתחיל סנכרון עכשיו?</target>
-
<source>Variant:</source>
<target>גרסה אחרת:</target>
@@ -1294,9 +1312,6 @@ The command is triggered if:
<source>Run minimized</source>
<target>הרץ ממוזער</target>
-<source>&Show error dialog</source>
-<target>&הצג דו-שיח שגיאה</target>
-
<source>Show pop-up on errors or warnings</source>
<target>הראה חלונות מוקפצים עבור שגיאות או אזהרות</target>
@@ -1531,11 +1546,11 @@ This guarantees a consistent state even in case of a serious error.
<source>multiple selection</source>
<target>בחירה מרובה</target>
-<source>Include via filter:</source>
-<target>כלול באמצעות מסנן:</target>
+<source>&Include via filter:</source>
+<target>&כלול באמצעות מסנן:</target>
-<source>Exclude via filter:</source>
-<target>אל תכלול בעזרת סנן:</target>
+<source>&Exclude via filter:</source>
+<target>&אל תכלול באמצעות מסנן:</target>
<source>Include temporarily</source>
<target>כלול זמנית</target>
@@ -1543,6 +1558,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Exclude temporarily</source>
<target>אל תכלול זמנית</target>
+<source>&Synchronize selection</source>
+<target>&סנכרן את הבחירה</target>
+
<source>&Copy to...</source>
<target>&העתק אל...</target>
@@ -1678,9 +1696,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Initializing...</source>
<target>מאתחל...</target>
-<source>Scanning...</source>
-<target>סורק...</target>
-
<source>Comparing content...</source>
<target>משווה תכולה...</target>
@@ -1699,6 +1714,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Recommended range:</source>
<target>טווח מומלץ:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>האם אתה באמת רוצה לנתק את חשבון המשתמש %x?</target>
+
<source>Password:</source>
<target>סיסמה:</target>
@@ -1741,6 +1759,12 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>האם ברצונך למחוק את הפריטים %x הבאים?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>התחל לסנכרן את הבחירה?</target>
+
+<source>Start synchronization now?</source>
+<target>האם להתחיל סנכרון עכשיו?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>העתק DACL, SACL, Owner, Group</target>
@@ -1924,9 +1948,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Unable to register device notifications for %x.</source>
<target>לא יכול לרשום הודעות עבור התקן %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>לא יכול לנטר מחיצה %x.</target>
-
<source>The file is locked by another process:</source>
<target>הקובץ נעול ע"י תהליך:</target>
@@ -1945,9 +1966,6 @@ This guarantees a consistent state even in case of a serious error.
<source>%x is not a regular directory name.</source>
<target>%x אינו שם של מחיצה רגילה.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>לא יכול להעתיק קובץ %x אל %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>לא יכול להעתיק תכונות מ- %x אל %y.</target>
diff --git a/FreeFileSync/Build/Languages/hindi.lng b/FreeFileSync/Build/Languages/hindi.lng
index f338466b..9094d3e6 100755
--- a/FreeFileSync/Build/Languages/hindi.lng
+++ b/FreeFileSync/Build/Languages/hindi.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>कोई अपवाद हुआ</target>
-<source>A directory path is expected after %x.</source>
-<target>%x के बाद कोई निर्देशिका पथ अपेक्षित है।</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>%x के बाद कोई दाया और कोई बाया निर्देशिका पथ अपेक्षित है।</target>
<source>Syntax error</source>
<target>वाक्य-विन्यास त्रुटि</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>%x के बाद कोई दाया और कोई बाया निर्देशिका पथ अपेक्षित है।</target>
-
<source>Cannot find file %x.</source>
<target>फ़ाइल %x नहीं मिली।</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>%x फ़ाइल में वैध कॉन्फ़िगरेशन नहीं है।</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>बाईं और दाईं निर्देशिकाओं की असमान संख्या निर्दिष्टित।</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>कॉन्फ़िग फ़ाइल में निर्देशिका जोडी स्तर पर सेटिंग्स नहीं होने चाहिए जब निर्देशिकाएँ आदेश-पंक्ति से सेट हुई हों।</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>कितने भी वैकलपिक निर्देशिका जोडे अधिक से अधिक एक कॉन्फ़िग फ़ाइल के लिए।</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>चयनित कॉन्फ़िगरेशन को बिना निष्पादित किए केवल संपादन के लिए खोलें।</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>आवश्यक होने पर फ़ोल्डर्स स्वचालित रूप से बनाए जाते हैं।</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>निम्न निर्देशिका पथ अक्षरों के केस में भिन्न हैं। प्रतिरूप अभिगम टालने के लिए कृपया कोई एक शैली का प्रयोग करें।</target>
+
<source>Scanning:</source>
<target>स्कैनिंग:</target>
@@ -424,9 +421,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>इस सिस्टम में शॅडो प्रतिलिपियाँ बनाने के लिए कृपया FreeFileSync का 64-बिट संस्करण चलाएँ।</target>
-<source>Cannot determine volume name for %x.</source>
-<target>%x के लिए वॉल्यूम नाम निर्धारण नहीं किया जा सकता।</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>%x वॉल्यूम नाम %y फ़ाइल पथ का हिस्सा नहीं है।</target>
@@ -490,6 +484,21 @@
<source>Source item %x not found</source>
<target>स्रोत आइटम %x नहीं मिला</target>
+<source>Cannot move file %x to %y.</source>
+<target>फ़ाइल %x से %y ले जा नाहीं सकते।</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>अभिभावक निर्देशिका %x विद्यमान नहीं है।</target>
+
+<source>The name %x is already used by another item.</source>
+<target>%x इस नाम का उपयोग पहले से ही किसी अन्य आइटम द्वारा किया गया है।</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>फ़ाइल %x से %y प्रतिलिपित नहीं कर सकते।</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>सिंबॉलिक लिंक %x से %y प्रतिलिपित नहीं कर सकते।</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>%x के लिए वॉल्यूम शॅडो प्रतिलिपि बनाई जा रही है...</target>
@@ -497,7 +506,7 @@
<target>निर्देशिका %x नहीं मिला।</target>
<source>Target folder %x already existing.</source>
-<target>गंतव्य निर्देशिका %x पहले से ही विद्यमान।</target>
+<target>गंतव्य निर्देशिका %x पहले से ही विद्यमान है।</target>
<source>Target folder input field must not be empty.</source>
<target>गंतव्य निर्देशिका प्रविष्टि खाली नहीं हो सकती।</target>
@@ -511,6 +520,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>निम्न आइटम्स में हल नहीं किये गए विरोध हैं और वे सिंक्रनाइज़ नहीं होंगे:</target>
+<source>Folder pair:</source>
+<target>निर्देशिका जोडा:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>निम्न निर्देशिकाएँ उल्लेखनीय रूप से भिन्न हैं। कृपया सुनिश्चित करें की सिंक्रनाइज़ेशन के लिए चुनी निर्देशिकाएँ उचित हैं।</target>
@@ -567,74 +579,77 @@ Actual: %y bytes
<source>Cannot write permissions of %x.</source>
<target>%x की अनुमतियां लिख नहीं सकते।</target>
-<source>Operation not supported for different base folder types.</source>
-<target>भिन्न आधार निर्देशिका प्रकारों के लिए कार्यवाई समर्थित नहीं।</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>फ़ाइल %x से %y ले जा नाहीं सकते।</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>सिंबॉलिक लिंक %x से %y प्रतिलिपित नहीं कर सकते।</target>
-
-<source>Error Code %x</source>
-<target>त्रुटि कोड %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>सर्वर %x की जानकारी प्राप्त करने में विफल।</target>
-
-<source>Cannot open directory %x.</source>
-<target>निर्देशिका %x खोल नहीं सकते।</target>
-
-<source>Cannot create directory %x.</source>
-<target>%x निर्देशिका बना नहीं सकते।</target>
+<source>Operation not supported between different devices.</source>
+<target>विभिन्न उपकरणों के बीच कार्यवाई असमर्थित।</target>
<source>Cannot delete file %x.</source>
<target>फ़ाइल %x हटा नहीं सकते।</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>प्रतीकात्मक कड़ी %x हटाया नहीं जा सकता।</target>
+
<source>Cannot delete directory %x.</source>
<target>निर्देशिका %x हटा नहीं सकते।</target>
+<source>Error Code %x</source>
+<target>त्रुटि कोड %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>%x का संशोधन समय लिख नहीं सकते।</target>
+<source>Cannot create directory %x.</source>
+<target>%x निर्देशिका बना नहीं सकते।</target>
+
<source>Cannot determine final path for %x.</source>
<target>%x का अंतिम पथ निर्धारित नहीं कर सकते।</target>
+<source>Operation not supported by device.</source>
+<target>कार्यवाई उपकरण द्वारा असमर्थित।</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>सिंबॉलिक लिंक %x को हल नहीं कर सकते।</target>
<source>Unable to move %x to the recycle bin.</source>
<target>%x को रीसायकल बिन ले जाने में असमर्थ।</target>
-<source>Unable to access %x.</source>
-<target>%x तक पहुँचने में असमर्थ।</target>
-
<source>Authentication completed.</source>
<target>प्रमाणन पूर्ण।</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>आप अब इस पृष्ठ को बंद कर FreeFileSync जारी रख सकते हैं।</target>
+
<source>Authentication failed.</source>
<target>प्रमाणन विफल।</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>आप अब इस पृष्ठ को बंद कर FreeFileSync जारी रख सकते हैं।</target>
+<source>Cannot find %x.</source>
+<target>%x नहीं मिला।</target>
-<source>The server returned an error:</source>
-<target>सर्वर ने एक त्रुटि वापस कर दी:</target>
+<source>Please authorize access to user account %x.</source>
+<target>कृपया उपयोगकर्ता खाता %x से पहुँच अधिकृत करें।</target>
<source>Cannot determine free disk space for %x.</source>
<target>%x के लिए खाली डिस्क जगह निर्धारित नहीं कर सकते।</target>
-<source>Cannot find %x.</source>
-<target>%x नहीं मिला।</target>
+<source>Unable to disconnect from %x.</source>
+<target>%x से सम्पर्क काटने में असमर्थ।</target>
+
+<source>Unable to access %x.</source>
+<target>%x तक पहुँचने में असमर्थ।</target>
+
+<source>Failed to get information about server %x.</source>
+<target>सर्वर %x की जानकारी प्राप्त करने में विफल।</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>निर्देशिका %x की निगरानी कर नहीं सकते।</target>
<source>Cannot find device %x.</source>
-<target>डिवाइस %x नहीं मिला।</target>
+<target>उपकरण %x नहीं मिला।</target>
-<source>Type of item %x is not supported:</source>
-<target>%x प्रकार का आइटम समर्थित नहीं है:</target>
+<source>Cannot open directory %x.</source>
+<target>निर्देशिका %x खोल नहीं सकते।</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>प्रतीकात्मक कड़ी %x हटाया नहीं जा सकता।</target>
+<source>Unsupported item type.</source>
+<target>असमर्थित आइटम प्रकार।</target>
<source>Incorrect command line:</source>
<target>अनुचित आदेश-पंक्ति:</target>
@@ -770,8 +785,8 @@ The command is triggered if:
<source>&Restore</source>
<target>पुनर्स्थापित करें (&R)</target>
-<source>&Show error</source>
-<target>त्रुटि दिखाएं (&S)</target>
+<source>&Show error message</source>
+<target>त्रुटि संदेश दिखाएं (&S)</target>
<source>&Quit</source>
<target>बाहर निकलें (&Q)</target>
@@ -800,6 +815,9 @@ The command is triggered if:
<source>Loading...</source>
<target>लोड हो रहा है...</target>
+<source>Scanning...</source>
+<target>स्कैनिंग...</target>
+
<source>job name</source>
<target>कार्य नाम</target>
@@ -927,7 +945,7 @@ The command is triggered if:
<target>चुनी निर्देशिका %x FreeFileSync के साथ उपयोग नहीं की जा सकती।</target>
<source>Please select a folder on a local file system, network or an MTP device.</source>
-<target>स्थानीय फ़ाइल सिस्टम, नेटवर्क या MTP डिव्हाइस पर कोई निर्देशिका चुनें।</target>
+<target>कृपया स्थानीय फ़ाइल सिस्टम, नेटवर्क या MTP उपकरण पर कोई निर्देशिका चुनें।</target>
<source>Defined by context of use</source>
<target>उपयोग के संदर्भ से परिभाषित</target>
@@ -1028,12 +1046,12 @@ The command is triggered if:
<source>View type:</source>
<target>दृश्य प्रकार:</target>
-<source>Save as default</source>
-<target>डिफ़ॉल्ट के रूप में सहेजें</target>
-
<source>Select view:</source>
<target>दृश्य चुनें:</target>
+<source>Save as default</source>
+<target>डिफ़ॉल्ट के रूप में सहेजें</target>
+
<source>Statistics:</source>
<target>आंकड़े:</target>
@@ -1052,9 +1070,6 @@ The command is triggered if:
<source>Arrange folder pair</source>
<target>निर्देशिका जोडा व्यवस्थित करें</target>
-<source>Folder pair:</source>
-<target>निर्देशिका जोडा:</target>
-
<source>Main settings:</source>
<target>मुख्य सेटिंग्स:</target>
@@ -1065,7 +1080,7 @@ The command is triggered if:
<target>प्रकार चुने:</target>
<source>Include &symbolic links:</source>
-<target>प्रतीकात्मक कड़ीयाँ शामिल करें (&s):</target>
+<target>प्रतीकात्मक कड़ीयाँ समावेश करें (&s):</target>
<source>&Follow</source>
<target>अनुसरण करें (&F)</target>
@@ -1110,7 +1125,7 @@ The command is triggered if:
<target>स्थानीय सेटिंग्स:</target>
<source>Include:</source>
-<target>शामिल करें:</target>
+<target>समावेश करें:</target>
<source>Show examples</source>
<target>उदाहरण दिखाएं</target>
@@ -1180,11 +1195,20 @@ The command is triggered if:
<source>OK</source>
<target>ठीक</target>
-<source>Enter your login details:</source>
-<target>अपना लॉगिन विवरण प्रविष्ट करें:</target>
-
<source>Connection type:</source>
-<target>कनेक्शन प्रकार:</target>
+<target>सम्पर्क प्रकार:</target>
+
+<source>Connected user accounts:</source>
+<target>जुड़े हुए उपयोगकर्ता खाते:</target>
+
+<source>&Add connection</source>
+<target>सम्पर्क जोड़ें (&A)</target>
+
+<source>&Disconnect</source>
+<target>सम्पर्क काटें (&D)</target>
+
+<source>Selected user account:</source>
+<target>चयनित उपयोगकर्ता खाता:</target>
<source>Server name or IP address:</source>
<target>सर्वर नाम या IP पता:</target>
@@ -1234,15 +1258,9 @@ The command is triggered if:
<source>Detect server limit</source>
<target>सर्वर सीमा का पता लगाएँ</target>
-<source>Select a directory on the server:</source>
-<target>सर्वर पर कोई निर्देशिका चुनें:</target>
-
<source>Select Folder</source>
<target>निर्देशिका चुनें</target>
-<source>Start synchronization now?</source>
-<target>अब सिंक्रनाइज़ेशन शुरू करें?</target>
-
<source>Variant:</source>
<target>प्रकार:</target>
@@ -1294,9 +1312,6 @@ The command is triggered if:
<source>Run minimized</source>
<target>छोटा (मिनिमाइज़) कर के चलाएँ</target>
-<source>&Show error dialog</source>
-<target>त्रुटी संवाद बॉक्स दिखाएँ (&S)</target>
-
<source>Show pop-up on errors or warnings</source>
<target>त्रुटियों या चेतावनियों पर पॉप-अप दिखाएं</target>
@@ -1491,8 +1506,8 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>Do you really want to execute the command %y for %x items?</pluralform>
</source>
<target>
-<pluralform>क्या आप वाकई एक आइटम के लिए %y आदेश निष्पादित करना चाहते हैं?</pluralform>
-<pluralform>क्या आप वाकई %x आइटम्स के लिए %y आदेश निष्पादित करना चाहते हैं?</pluralform>
+<pluralform>क्या आप वास्तव में एक आइटम के लिए %y आदेश निष्पादित करना चाहते हैं?</pluralform>
+<pluralform>क्या आप वास्तव में %x आइटम्स के लिए %y आदेश निष्पादित करना चाहते हैं?</pluralform>
</target>
<source>&Execute</source>
@@ -1531,18 +1546,21 @@ This guarantees a consistent state even in case of a serious error.
<source>multiple selection</source>
<target>एकाधिक चयन</target>
-<source>Include via filter:</source>
-<target>फ़िल्टर के द्वारा शामिल करें:</target>
+<source>&Include via filter:</source>
+<target>फ़िल्टर के द्वारा समावेश करें (&I):</target>
-<source>Exclude via filter:</source>
-<target>फ़िल्टर के द्वारा अपवर्जित करें:</target>
+<source>&Exclude via filter:</source>
+<target>फ़िल्टर के द्वारा अपवर्जित करें (&E):</target>
<source>Include temporarily</source>
-<target>अस्थायी रूप से शामिल करें</target>
+<target>अस्थायी रूप से समावेश करें</target>
<source>Exclude temporarily</source>
<target>अस्थायी रूप से अपवर्जित करें</target>
+<source>&Synchronize selection</source>
+<target>चयन सिंक्रनाइज़ करें (&S)</target>
+
<source>&Copy to...</source>
<target>यहाँ प्रतिलिपित करें (&C)...</target>
@@ -1550,7 +1568,7 @@ This guarantees a consistent state even in case of a serious error.
<target>हटाएं (&D)</target>
<source>Include all</source>
-<target>सभी शामिल करें</target>
+<target>सभी समावेश करें</target>
<source>Exclude all</source>
<target>सभी अपवर्जित करें</target>
@@ -1678,9 +1696,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Initializing...</source>
<target>प्रारंभ हो रहा है...</target>
-<source>Scanning...</source>
-<target>स्कैनिंग...</target>
-
<source>Comparing content...</source>
<target>सामग्री की तुलना हो रही है...</target>
@@ -1699,6 +1714,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Recommended range:</source>
<target>अनुशंसित श्रेणी:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>क्या आप वास्तव में उपयोगकर्ता खाता %x से सम्पर्क काटना चाहते हैं?</target>
+
<source>Password:</source>
<target>पासवर्ड:</target>
@@ -1725,8 +1743,8 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>Do you really want to move the following %x items to the recycle bin?</pluralform>
</source>
<target>
-<pluralform>क्या आप वाकई निम्न आइटम रीसायकल बिन में ले जाना चाहते हैं?</pluralform>
-<pluralform>क्या आप वाकई निम्न %x आइटम्स रीसायकल बिन में ले जाना चाहते हैं?</pluralform>
+<pluralform>क्या आप वास्तव में निम्न आइटम रीसायकल बिन में ले जाना चाहते हैं?</pluralform>
+<pluralform>क्या आप वास्तव में निम्न %x आइटम्स रीसायकल बिन में ले जाना चाहते हैं?</pluralform>
</target>
<source>Move</source>
@@ -1737,10 +1755,16 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>Do you really want to delete the following %x items?</pluralform>
</source>
<target>
-<pluralform>क्या आप वाकई निम्न आइटम हटाना चाहते हैं?</pluralform>
-<pluralform>क्या आप वाकई निम्न %x आइटम्स हटाना चाहते हैं?</pluralform>
+<pluralform>क्या आप वास्तव में निम्न आइटम हटाना चाहते हैं?</pluralform>
+<pluralform>क्या आप वास्तव में निम्न %x आइटम्स हटाना चाहते हैं?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>चयन को सिंक्रनाइज़ करने के लिए प्रारंभ करें?</target>
+
+<source>Start synchronization now?</source>
+<target>अब सिंक्रनाइज़ेशन प्रारंभ करें?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>DACL, SACL, स्वामी, समूह प्रतिलिपित करें</target>
@@ -1751,7 +1775,7 @@ This guarantees a consistent state even in case of a serious error.
<target>पूर्ण फाइल या निर्देशिका पथ</target>
<source>Parent folder path</source>
-<target>पैरेंट फ़ोल्‍डर पथ</target>
+<target>अभिभावक निर्देशिका पथ</target>
<source>Temporary local copy for SFTP and MTP storage</source>
<target>SFTP और MTP संग्रहण के लिए अस्थायी स्थानीय प्रतिलिपि</target>
@@ -1922,10 +1946,7 @@ This guarantees a consistent state even in case of a serious error.
<target>सिस्टम फ़ंकशन %x ढूंढ नहीं सकते।</target>
<source>Unable to register device notifications for %x.</source>
-<target>%x के लिए डिवाइस सूचनाएँ पंजिकृत करने में असमर्थ।</target>
-
-<source>Cannot monitor directory %x.</source>
-<target>निर्देशिका %x की निगरानी कर नहीं सकते।</target>
+<target>%x के लिए उपकरण सूचनाएँ पंजिकृत करने में असमर्थ।</target>
<source>The file is locked by another process:</source>
<target>फ़ाइल किसी अन्य प्रक्रिया द्वारा अवरोधित है:</target>
@@ -1945,9 +1966,6 @@ This guarantees a consistent state even in case of a serious error.
<source>%x is not a regular directory name.</source>
<target>%x कोई नियमित निर्देशिका नाम नहीं है।</target>
-<source>Cannot copy file %x to %y.</source>
-<target>फ़ाइल %x से %y प्रतिलिपित नहीं कर सकते।</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>%x से %y गुण प्रतिलिपित नहीं कर सकते।</target>
diff --git a/FreeFileSync/Build/Languages/hungarian.lng b/FreeFileSync/Build/Languages/hungarian.lng
index c22560bf..5abd63c6 100755
--- a/FreeFileSync/Build/Languages/hungarian.lng
+++ b/FreeFileSync/Build/Languages/hungarian.lng
@@ -58,17 +58,14 @@
<source>An exception occurred</source>
<target>Kivétel lépett fel</target>
-<source>A directory path is expected after %x.</source>
-<target>%x után egy könyvtár elérési útvonalának kell következnie.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Egy bal és egy jobb oldali könyvtár-útvonalra van szükség %x után.</target>
<source>Syntax error</source>
<target>Szintaktikai hiba</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>Egy bal és egy jobb oldali könyvtár-útvonalra van szükség %x után.</target>
-
<source>Cannot find file %x.</source>
-<target>Nem található a %x állomány.</target>
+<target>Nem található a(z) %x állomány.</target>
<source>Error</source>
<target>Hiba</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>%x állomány nem tartalmaz érvényes beállításokat.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Eltérő számú bal- és jobboldali könyvtárat határozott meg.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>A konfigurációs állomány nem tartalmazhat beállításokat könyvár-pár szinten, ha a könyvtárakat parancssorban állítjuk be.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Tetszőleges számú alternatív könyvtár-pár legfeljebb egy konfigurációs állományban.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>A kiválasztott konfigurációt csak szerkesztésre nyissa meg végrehajtás nélkül.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>A könyvárakat automatikusan létrehozza, amikor az szükséges.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>A következő útvonalak kis- és nagybetű használatában különböznek. Használjon egységes formát az ismételt hozzáférés elkerülése érdekében.</target>
+
<source>Scanning:</source>
<target>Vizsgálat:</target>
@@ -161,7 +158,7 @@
<target>Az elemek csak attribútumaikban különböznek</target>
<source>The name %x is used by more than one item in the folder.</source>
-<target>A %x nevet nem csak egy elem viseli a könyvtárban.</target>
+<target>A(z) %x nevet nem csak egy elem viseli a könyvtárban.</target>
<source>Resolving symbolic link %x</source>
<target>%x szimbolikus hivatkozás feloldása</target>
@@ -254,7 +251,7 @@
<target>%x könyvtár keresése...</target>
<source>Timeout while searching for folder %x.</source>
-<target>Időtúllépés a %x könyvtár keresése folyamán.</target>
+<target>Időtúllépés a(z) %x könyvtár keresése folyamán.</target>
<source>Cannot get process information.</source>
<target>Nem sikerült lekérdezni a processz-információkat.</target>
@@ -424,9 +421,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Ezen a rendszeren árnyék másolatok készítéséhez futtassa a FreeFileSync 64 bites verzióját.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>%x számára nem lehet a kötet-nevet meghatározni.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>%x kötet-név nem része a(z) %y állomány elérési útvonalának.</target>
@@ -490,6 +484,21 @@
<source>Source item %x not found</source>
<target>%x forrás állományt nem találom</target>
+<source>Cannot move file %x to %y.</source>
+<target>%x állomány nem mozgatható %y-ba.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>%x szülő könyvtár nem létezik.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>%x nevet már más elem használja.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>%x állomány nem másolható %y-ba.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>%x szimbolikus hivatkozás nem másolható %y-ba.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>%x számára árnyékmásolat-kötetet készítése...</target>
@@ -511,6 +520,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>A következő elemek feloldatlan ütközést tartalmaznak, így nem lesznek szinkronizálva:</target>
+<source>Folder pair:</source>
+<target>Könyvtár-pár:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>Az érintett könyvtárak lényegileg különböznek. Kérem ellenőrizze, a megfelelő könyvtárakat választotta-e ki szinkronizálásra.</target>
@@ -567,80 +579,83 @@ Tényleges: %y bájt
<source>Cannot write permissions of %x.</source>
<target>%x jogosultságait nem lehet felírni.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>A művelet nem támogatott különböző alapkönyvtártípusok esetén.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>%x állomány nem mozgatható %y-ba.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>%x szimbolikus hivatkozás nem másolható %y-ba.</target>
-
-<source>Error Code %x</source>
-<target>Hibakód %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>%x szerverről nem sikerült információt kapni.</target>
-
-<source>Cannot open directory %x.</source>
-<target>%x könyvtár nem nyitható meg.</target>
-
-<source>Cannot create directory %x.</source>
-<target>%x könyvtár nem hozható létre.</target>
+<source>Operation not supported between different devices.</source>
+<target>A művelet nem támogatott különböző eszközök között.</target>
<source>Cannot delete file %x.</source>
<target>%x állomány nem törölhető.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>%x szimbolikus hivatkozás nem törölhető.</target>
+
<source>Cannot delete directory %x.</source>
<target>%x könyvtár nem törölhető.</target>
+<source>Error Code %x</source>
+<target>Hibakód %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>%x módosításának időpontja nem rögzíthető.</target>
+<source>Cannot create directory %x.</source>
+<target>%x könyvtár nem hozható létre.</target>
+
<source>Cannot determine final path for %x.</source>
<target>%x számára a végső útvonal nem határozható meg.</target>
+<source>Operation not supported by device.</source>
+<target>Az eszköz nem támogatja a műveletet.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>%x szimbolikus hivatkozás nem oldható fel.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>%x nem helyezhető Lomtárba.</target>
-<source>Unable to access %x.</source>
-<target>%x nem elérhető.</target>
-
<source>Authentication completed.</source>
<target>Hitelesítés befejezve.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>Most bezárhatja ezt az oldalt és folytathatja a FreeFileSync-et.</target>
+
<source>Authentication failed.</source>
<target>Hitelesítés sikertelen.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>Most bezárhatja ezt az oldalt és folytathatja a FreeFileSync-et.</target>
+<source>Cannot find %x.</source>
+<target>%x nem található.</target>
-<source>The server returned an error:</source>
-<target>A szerver hibát adott vissza:</target>
+<source>Please authorize access to user account %x.</source>
+<target>Engedélyezze a hozzáférést a(z) %x felhasználói azonosítóhoz.</target>
<source>Cannot determine free disk space for %x.</source>
-<target>%x-en nem határozható meg a szabad tárterület.</target>
+<target>%x-nek nem határozható meg szabad tárterület.</target>
-<source>Cannot find %x.</source>
-<target>%x nem található.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Nem sikerült leválasztani %x-től.</target>
+
+<source>Unable to access %x.</source>
+<target>%x nem elérhető.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>%x szerverről nem sikerült információt kapni.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>%x könyvtárat nem sikerült monitorozni.</target>
<source>Cannot find device %x.</source>
<target>%x eszköz nem található.</target>
-<source>Type of item %x is not supported:</source>
-<target>%x elem típusa nem támogatott:</target>
+<source>Cannot open directory %x.</source>
+<target>%x könyvtár nem nyitható meg.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>%x szimbolikus hivatkozás nem törölhető.</target>
+<source>Unsupported item type.</source>
+<target>Nem támogatott elemtípus.</target>
<source>Incorrect command line:</source>
<target>Hibás parancssor:</target>
<source>The server does not support authentication via %x.</source>
-<target>A szerver nem támogatja a %x általi autentikációt.</target>
+<target>A szerver nem támogatja a(z) %x általi autentikációt.</target>
<source>
<pluralform>Operation timed out after 1 second.</pluralform>
@@ -664,7 +679,7 @@ Tényleges: %y bájt
<target>Aktív kapcsolatok száma: %x</target>
<source>Failed to open SFTP channel number %x.</source>
-<target>Hiba a %x számú SFTP csatorna megnyitása során.</target>
+<target>Hiba a(z) %x számú SFTP csatorna megnyitása során.</target>
<source>Drag && drop</source>
<target>Húzd && Ejtsd</target>
@@ -770,8 +785,8 @@ A parancs végrehajtódik, ha:
<source>&Restore</source>
<target>&Visszaállít</target>
-<source>&Show error</source>
-<target>&Mutassa a hibákat</target>
+<source>&Show error message</source>
+<target>&Mutassa a hibaüzenetet</target>
<source>&Quit</source>
<target>&Kilépés</target>
@@ -800,6 +815,9 @@ A parancs végrehajtódik, ha:
<source>Loading...</source>
<target>Tölti...</target>
+<source>Scanning...</source>
+<target>Vizsgálat folyamatban...</target>
+
<source>job name</source>
<target>feladat neve</target>
@@ -1028,12 +1046,12 @@ A parancs végrehajtódik, ha:
<source>View type:</source>
<target>Nézet típusa:</target>
-<source>Save as default</source>
-<target>Mentse mint alapértelmezést</target>
-
<source>Select view:</source>
<target>Válasszon nézetet:</target>
+<source>Save as default</source>
+<target>Mentse mint alapértelmezést</target>
+
<source>Statistics:</source>
<target>Statisztika:</target>
@@ -1052,9 +1070,6 @@ A parancs végrehajtódik, ha:
<source>Arrange folder pair</source>
<target>Kezelje a könyvtár-párt</target>
-<source>Folder pair:</source>
-<target>Könyvtár-pár:</target>
-
<source>Main settings:</source>
<target>Fő beállítások:</target>
@@ -1180,12 +1195,21 @@ A parancs végrehajtódik, ha:
<source>OK</source>
<target>OK</target>
-<source>Enter your login details:</source>
-<target>Adja meg a bejelentkezési adatait:</target>
-
<source>Connection type:</source>
<target>Kapcsolat típusa:</target>
+<source>Connected user accounts:</source>
+<target>Kapcsolt felhasználói azonosítók:</target>
+
+<source>&Add connection</source>
+<target>&Adja hozzá a kapcsolatot</target>
+
+<source>&Disconnect</source>
+<target>&Leválaszt</target>
+
+<source>Selected user account:</source>
+<target>Kiválasztott felhasználói azonosító:</target>
+
<source>Server name or IP address:</source>
<target>Szerver neve vagy IP címe:</target>
@@ -1234,15 +1258,9 @@ A parancs végrehajtódik, ha:
<source>Detect server limit</source>
<target>Szerver korlátainak észlelése</target>
-<source>Select a directory on the server:</source>
-<target>Válasszon egy könyvtárat szerveren:</target>
-
<source>Select Folder</source>
<target>Könyvtár kiválasztása</target>
-<source>Start synchronization now?</source>
-<target>Megkezdje a szinkronizálást?</target>
-
<source>Variant:</source>
<target>Variáns:</target>
@@ -1294,9 +1312,6 @@ A parancs végrehajtódik, ha:
<source>Run minimized</source>
<target>Minimalizálva fusson</target>
-<source>&Show error dialog</source>
-<target>&Mutassa a hiba üzenetet</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Hiba vagy figyelmeztetés esetén mutasson párbeszédablakot</target>
@@ -1531,11 +1546,11 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>multiple selection</source>
<target>többszörös kijelölés</target>
-<source>Include via filter:</source>
-<target>Adja hozzá a következő szűrő igénybe vételével:</target>
+<source>&Include via filter:</source>
+<target>&Bevonja a szűrő alapján:</target>
-<source>Exclude via filter:</source>
-<target>Zárja ki következő szűrő igénybe vételével:</target>
+<source>&Exclude via filter:</source>
+<target>&Kizárja a szűrő alapján:</target>
<source>Include temporarily</source>
<target>Csatolja ideiglenesen</target>
@@ -1543,6 +1558,9 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Exclude temporarily</source>
<target>Zárja ki ideiglenesen</target>
+<source>&Synchronize selection</source>
+<target>&Szinkronizálja a kiválasztottakat</target>
+
<source>&Copy to...</source>
<target>&Másolja oda...</target>
@@ -1678,9 +1696,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Initializing...</source>
<target>Inicializálás...</target>
-<source>Scanning...</source>
-<target>Vizsgálat folyamatban...</target>
-
<source>Comparing content...</source>
<target>Tartalom összehasonlítása...</target>
@@ -1699,6 +1714,9 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Recommended range:</source>
<target>A javasolt tartomány:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>Tényleg bontani akarja a kapcsolatot a(z) %x felhasználói azonosítóval?</target>
+
<source>Password:</source>
<target>Jelszó:</target>
@@ -1741,6 +1759,12 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<pluralform>Valóban törölni akarod a következő %x elemet?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>Megkezdje a kiválasztottak szinkronizálását?</target>
+
+<source>Start synchronization now?</source>
+<target>Megkezdje a szinkronizálást?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Másolja át DACL-t, SACL-t, tulajdonost és csoportot</target>
@@ -1924,9 +1948,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Unable to register device notifications for %x.</source>
<target>%x-hez nem lehet eszköz-értesítéseket regisztrálni.</target>
-<source>Cannot monitor directory %x.</source>
-<target>%x könyvtárat nem sikerült monitorozni.</target>
-
<source>The file is locked by another process:</source>
<target>Az állományt egy másik folyamat zárolta:</target>
@@ -1945,9 +1966,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>%x is not a regular directory name.</source>
<target>%x nem megfelelő könyvtárnév.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>%x állomány nem másolható %y-ba.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Az attribútumok nem másolhatók %x-ből %y-ba.</target>
diff --git a/FreeFileSync/Build/Languages/italian.lng b/FreeFileSync/Build/Languages/italian.lng
index d5633191..397a24e4 100755
--- a/FreeFileSync/Build/Languages/italian.lng
+++ b/FreeFileSync/Build/Languages/italian.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>Si è verificata una eccezione</target>
-<source>A directory path is expected after %x.</source>
-<target>E' previsto un percorso di directory dopo %x.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Sono previsti un percorso di directory sinistro e destro dopo %x.</target>
<source>Syntax error</source>
<target>Errore di sintassi</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>Sono previsti un percorso di directory sinistro e destro dopo %x.</target>
-
<source>Cannot find file %x.</source>
<target>Impossibile trovare il file %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>Il file %x non contiene una configurazione valida.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>E' stato specificato un numero diverso di directory a sinistra e a destra.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Il file di configurazione non deve contenere le impostazioni a livello di coppia di directory quando le directory sono impostate tramite linea di comando.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Qualsiasi numero di coppie di directory alternative per al massimo un file di configurazione.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>Apri la configurazione selezionata solo per la modifica senza eseguirla.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>Le cartelle vengono create automaticamente quando necessario.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>I seguenti percorsi di cartelle differiscono nel caso. Si prega di utilizzare un unico modulo per evitare accessi duplicati.</target>
+
<source>Scanning:</source>
<target>Scansione di:</target>
@@ -424,9 +421,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Si prega di eseguire la versione a 64 bit di FreeFileSync per creare copie shadow su questo sistema.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>Impossibile determinare nome del volume per %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>Nome volume %x non fa parte del percorso del file %y.</target>
@@ -490,6 +484,21 @@
<source>Source item %x not found</source>
<target>Elemento di origine %x non trovato</target>
+<source>Cannot move file %x to %y.</source>
+<target>Impossibile spostare il file %x in %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>La cartella principale %x non esiste.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>Il nome %x è già utilizzato da un altro elemento.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Impossibile copiare il file %x in %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Impossibile copiare collegamento %x per %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Creazione di un Volume Shadow Copy per %x...</target>
@@ -511,6 +520,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>I seguenti oggetti hanno conflitti irrisolti e non saranno sincronizzati:</target>
+<source>Folder pair:</source>
+<target>Coppia di cartelle:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>Le seguenti cartelle sono significativamente differenti. Si prega di controllare che sono selezionate le cartelle corrette per la sincronizzazione.</target>
@@ -567,74 +579,77 @@ Attuale: %y byte
<source>Cannot write permissions of %x.</source>
<target>Impossibile scrivere i permessi di %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Operazione non supportata per i diversi tipi di cartelle di base.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>Impossibile spostare il file %x in %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Impossibile copiare collegamento %x per %y.</target>
-
-<source>Error Code %x</source>
-<target>Codice di errore %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>Impossibile ottenere informazioni sul server %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Impossibile aprire la cartella %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Impossibile creare la cartella %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>Operazione non supportata tra diversi dispositivi.</target>
<source>Cannot delete file %x.</source>
<target>Impossibile eliminare il file %x.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Impossibile eliminare collegamento %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>Impossibile eliminare la directory %x.</target>
+<source>Error Code %x</source>
+<target>Codice di errore %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>Impossibile scrivere data e ora di modifica di %x.</target>
+<source>Cannot create directory %x.</source>
+<target>Impossibile creare la cartella %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>Impossibile determinare il percorso finale per %x.</target>
+<source>Operation not supported by device.</source>
+<target>Operazione non supportata dal dispositivo.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>Impossibile risolvere collegamento %x.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>Impossibile spostare %x nel cestino.</target>
-<source>Unable to access %x.</source>
-<target>Impossibile accedere %x.</target>
-
<source>Authentication completed.</source>
<target>Autenticazione completata.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>Puoi chiudere questa pagina ora e continuare con FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>Autenticazione fallita.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>Puoi chiudere questa pagina ora e continuare con FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>Impossibile trovare %x.</target>
-<source>The server returned an error:</source>
-<target>Il server ha restituito un errore:</target>
+<source>Please authorize access to user account %x.</source>
+<target>Autorizza l'accesso all'account utente %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>Impossibile determinare lo spazio libero su disco per %x.</target>
-<source>Cannot find %x.</source>
-<target>Impossibile trovare %x.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Impossibile disconnettersi da %x.</target>
+
+<source>Unable to access %x.</source>
+<target>Impossibile accedere %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>Impossibile ottenere informazioni sul server %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>Impossibile monitorare la directory %x.</target>
<source>Cannot find device %x.</source>
<target>Impossibile trovare dispositivo %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>Il tipo di oggetto %x non è supportato:</target>
+<source>Cannot open directory %x.</source>
+<target>Impossibile aprire la cartella %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>Impossibile eliminare collegamento %x.</target>
+<source>Unsupported item type.</source>
+<target>Tipo di articolo non supportato.</target>
<source>Incorrect command line:</source>
<target>Linea di comando non corretta:</target>
@@ -770,8 +785,8 @@ Il comando è attivato se:
<source>&Restore</source>
<target>&Ripristina</target>
-<source>&Show error</source>
-<target>&Mostra errore</target>
+<source>&Show error message</source>
+<target>&Mostra messaggio di errore</target>
<source>&Quit</source>
<target>&Esci</target>
@@ -800,6 +815,9 @@ Il comando è attivato se:
<source>Loading...</source>
<target>Caricamento...</target>
+<source>Scanning...</source>
+<target>Scansione...</target>
+
<source>job name</source>
<target>nome del lavoro</target>
@@ -1028,12 +1046,12 @@ Il comando è attivato se:
<source>View type:</source>
<target>Visualizza tipo:</target>
-<source>Save as default</source>
-<target>Salva come predefinito</target>
-
<source>Select view:</source>
<target>Seleziona vista:</target>
+<source>Save as default</source>
+<target>Salva come predefinito</target>
+
<source>Statistics:</source>
<target>Statistiche:</target>
@@ -1052,9 +1070,6 @@ Il comando è attivato se:
<source>Arrange folder pair</source>
<target>Disporre coppia di cartelle</target>
-<source>Folder pair:</source>
-<target>Coppia di cartelle:</target>
-
<source>Main settings:</source>
<target>Impostazioni principali:</target>
@@ -1180,12 +1195,21 @@ Il comando è attivato se:
<source>OK</source>
<target>OK</target>
-<source>Enter your login details:</source>
-<target>Inserisci i tuoi dati d'accesso:</target>
-
<source>Connection type:</source>
<target>Tipo di connessione:</target>
+<source>Connected user accounts:</source>
+<target>Account utente connessi:</target>
+
+<source>&Add connection</source>
+<target>&Aggiungi connessione</target>
+
+<source>&Disconnect</source>
+<target>&Disconnetti</target>
+
+<source>Selected user account:</source>
+<target>Account utente selezionato:</target>
+
<source>Server name or IP address:</source>
<target>Nome server o indirizzo IP:</target>
@@ -1234,15 +1258,9 @@ Il comando è attivato se:
<source>Detect server limit</source>
<target>Rilevare limite del server</target>
-<source>Select a directory on the server:</source>
-<target>Selezionare una directory sul server:</target>
-
<source>Select Folder</source>
<target>Seleziona cartella</target>
-<source>Start synchronization now?</source>
-<target>Avviare la sincronizzazione ora?</target>
-
<source>Variant:</source>
<target>Variante:</target>
@@ -1294,9 +1312,6 @@ Il comando è attivato se:
<source>Run minimized</source>
<target>Esegui minimizzato</target>
-<source>&Show error dialog</source>
-<target>&Mostra la finestra di errore</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Mostra pop-up di errore o avviso</target>
@@ -1531,11 +1546,11 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>multiple selection</source>
<target>selezione multipla</target>
-<source>Include via filter:</source>
-<target>Includi tramite filtro:</target>
+<source>&Include via filter:</source>
+<target>&Include tramite filtro:</target>
-<source>Exclude via filter:</source>
-<target>Escludi tramite filtro:</target>
+<source>&Exclude via filter:</source>
+<target>&Escludi tramite filtro:</target>
<source>Include temporarily</source>
<target>Includi temporaneamente</target>
@@ -1543,6 +1558,9 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Exclude temporarily</source>
<target>Escludi temporaneamente</target>
+<source>&Synchronize selection</source>
+<target>&Sincronizza selezione</target>
+
<source>&Copy to...</source>
<target>&Copia in...</target>
@@ -1678,9 +1696,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Initializing...</source>
<target>Inizializzazione...</target>
-<source>Scanning...</source>
-<target>Scansione...</target>
-
<source>Comparing content...</source>
<target>Comparazione del contenuto...</target>
@@ -1699,6 +1714,9 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Recommended range:</source>
<target>Intervallo consigliato:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>Vuoi davvero disconnetterti dall'account utente %x?</target>
+
<source>Password:</source>
<target>Password:</target>
@@ -1741,6 +1759,12 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<pluralform>Vuoi davvero eliminare i seguenti %x oggetti?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>Inizia a sincronizzare la selezione?</target>
+
+<source>Start synchronization now?</source>
+<target>Avviare la sincronizzazione ora?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Copia DACL, SACL, Proprietario, Gruppo</target>
@@ -1924,9 +1948,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Unable to register device notifications for %x.</source>
<target>Impossibile registrare le notifiche di dispositivo per %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>Impossibile monitorare la directory %x.</target>
-
<source>The file is locked by another process:</source>
<target>Il file è bloccato da un altro processo:</target>
@@ -1945,9 +1966,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>%x is not a regular directory name.</source>
<target>%x non è un nome di directory normale.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Impossibile copiare il file %x in %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Non è possibile copiare gli attributi da %x per %y.</target>
diff --git a/FreeFileSync/Build/Languages/japanese.lng b/FreeFileSync/Build/Languages/japanese.lng
index 388bc96b..44a92865 100755
--- a/FreeFileSync/Build/Languages/japanese.lng
+++ b/FreeFileSync/Build/Languages/japanese.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>例外が発生しました</target>
-<source>A directory path is expected after %x.</source>
-<target>%x の後にはディレクトリ パスが必要です.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>%x の後に左右のディレクトリ パスが必要です.</target>
<source>Syntax error</source>
<target>構文エラー</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>%x の後に左右のディレクトリ パスが必要です.</target>
-
<source>Cannot find file %x.</source>
<target>ファイル %x がみつかりません.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>ファイル %x には有効な構成が含まれていません.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>誤った数の左右ディレクトリが指定されています.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>コマンドライン経由でディレクトリが設定されている時は、構成設定にペア・レベルのディレクトリは含められません.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>任意の数の代替ディレクトリペア(ひとつの構成ファイル).</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>選択された構成を実行しないで編集用に開きます.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>フォルダは必要に応じて自動的に生成されます.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>次のフォルダパスは大文字小文字が異なります。アクセスの重複回避のため同じフォームにしてください.</target>
+
<source>Scanning:</source>
<target>スキャン:</target>
@@ -421,9 +418,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>現システムでシャドゥ コピーを作成するには 64-bit 版の FreeFileSync を使用してください.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>%x のボリューム名が決定されていません.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>ボリューム名 %x は、ファイルパス %y の一部ではありません.</target>
@@ -487,6 +481,21 @@
<source>Source item %x not found</source>
<target>ソース項目 %x が見つかりません</target>
+<source>Cannot move file %x to %y.</source>
+<target>ファイル %x を %y に移動できません.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>親フォルダ %x は存在しません.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>%x という名前は既に別項目で利用されています.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>%x から %y にコピーできません.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>シンボリックリンク %x を %y にコピーできません.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>ボリュームシャドウコピーを作成中 %x...</target>
@@ -508,6 +517,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>以下の項目は、未解決の競合が存在するため同期処理を実行できませんでした:</target>
+<source>Folder pair:</source>
+<target>フォルダ ペア:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>以下ののフォルダは内容が大幅に異なっています。同期フォルダの設定に誤りがないかどうかをご確認ください.</target>
@@ -564,74 +576,77 @@ Actual: %y bytes
<source>Cannot write permissions of %x.</source>
<target>%x のパーミッションを書き込めません.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>別の基準フォルダタイプでは対応していない操作.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>ファイル %x を %y に移動できません.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>シンボリックリンク %x を %y にコピーできません.</target>
-
-<source>Error Code %x</source>
-<target>エラーコード %x.</target>
-
-<source>Failed to get information about server %x.</source>
-<target>%x サーバからの情報取得に失敗しました.</target>
-
-<source>Cannot open directory %x.</source>
-<target>ディレクトリ %x を開けません.</target>
-
-<source>Cannot create directory %x.</source>
-<target>ディレクトリ %x を作成できません.</target>
+<source>Operation not supported between different devices.</source>
+<target>異なるデバイス間での操作には対応していません.</target>
<source>Cannot delete file %x.</source>
<target>ファイル %x を削除出来ません.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>シンボリック リンク %x を削除できません.</target>
+
<source>Cannot delete directory %x.</source>
<target>ディレクトリ %x を削除できません.</target>
+<source>Error Code %x</source>
+<target>エラーコード %x.</target>
+
<source>Cannot write modification time of %x.</source>
<target>%x の更新時刻を書き込めませんでした.</target>
+<source>Cannot create directory %x.</source>
+<target>ディレクトリ %x を作成できません.</target>
+
<source>Cannot determine final path for %x.</source>
<target>%x の最終的なパスを決定できません.</target>
+<source>Operation not supported by device.</source>
+<target>デバイスで対応していない操作です.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>シンボリックリンク %x を解決できません.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>%x をゴミ箱に移動できません.</target>
-<source>Unable to access %x.</source>
-<target>%x にアクセスできません.</target>
-
<source>Authentication completed.</source>
<target>認証が完了しました.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>このページを閉じて FreeFileSync. を続行することができます.</target>
+
<source>Authentication failed.</source>
<target>認証に失敗しました.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>このページを閉じて FreeFileSync. を続行することができます.</target>
+<source>Cannot find %x.</source>
+<target>%x がみつかりません.</target>
-<source>The server returned an error:</source>
-<target>サーバはエラーを返しました:</target>
+<source>Please authorize access to user account %x.</source>
+<target>アカウント %x へのアクセスを承認してください.</target>
<source>Cannot determine free disk space for %x.</source>
<target>%x の空きディスク領域を検出できません.</target>
-<source>Cannot find %x.</source>
-<target>%x がみつかりません.</target>
+<source>Unable to disconnect from %x.</source>
+<target>%x からの接続を切断できません.</target>
+
+<source>Unable to access %x.</source>
+<target>%x にアクセスできません.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>%x サーバからの情報取得に失敗しました.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>ディレクトリ %x を監視できません.</target>
<source>Cannot find device %x.</source>
<target>デバイス %x がみつかりません.</target>
-<source>Type of item %x is not supported:</source>
-<target>項目 %x には対応していません:</target>
+<source>Cannot open directory %x.</source>
+<target>ディレクトリ %x を開けません.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>シンボリック リンク %x を削除できません.</target>
+<source>Unsupported item type.</source>
+<target>対応していない項目形式.</target>
<source>Incorrect command line:</source>
<target>不正なコマンドライン:</target>
@@ -765,8 +780,8 @@ The command is triggered if:
<source>&Restore</source>
<target>修復(&R)</target>
-<source>&Show error</source>
-<target>エラー表示(&S)</target>
+<source>&Show error message</source>
+<target>エラーメッセージを表示(&S)</target>
<source>&Quit</source>
<target>終了(&Q)</target>
@@ -794,6 +809,9 @@ The command is triggered if:
<source>Loading...</source>
<target>読み込み中...</target>
+<source>Scanning...</source>
+<target>スキャン中...</target>
+
<source>job name</source>
<target>ジョブ名</target>
@@ -1021,12 +1039,12 @@ The command is triggered if:
<source>View type:</source>
<target>表示形式:</target>
-<source>Save as default</source>
-<target>既定として保存</target>
-
<source>Select view:</source>
<target>選択表示:</target>
+<source>Save as default</source>
+<target>既定として保存</target>
+
<source>Statistics:</source>
<target>統計情報:</target>
@@ -1045,9 +1063,6 @@ The command is triggered if:
<source>Arrange folder pair</source>
<target>フォルダ ペアの配置</target>
-<source>Folder pair:</source>
-<target>フォルダ ペア:</target>
-
<source>Main settings:</source>
<target>メイン設定:</target>
@@ -1173,12 +1188,21 @@ The command is triggered if:
<source>OK</source>
<target>OK</target>
-<source>Enter your login details:</source>
-<target>ログインの詳細を入力:</target>
-
<source>Connection type:</source>
<target>接続の種類:</target>
+<source>Connected user accounts:</source>
+<target>接続ユーザ アカウント:</target>
+
+<source>&Add connection</source>
+<target>接続を追加(&A)</target>
+
+<source>&Disconnect</source>
+<target>接続の切断(&D)</target>
+
+<source>Selected user account:</source>
+<target>選択ユーザ アカウント:</target>
+
<source>Server name or IP address:</source>
<target>サーバ名、または IP アドレス:</target>
@@ -1227,15 +1251,9 @@ The command is triggered if:
<source>Detect server limit</source>
<target>サーバ制限の検出</target>
-<source>Select a directory on the server:</source>
-<target>サーバ上のディレクトリを選択:</target>
-
<source>Select Folder</source>
<target>フォルダ選択</target>
-<source>Start synchronization now?</source>
-<target>今すぐ同期を開始しますか?</target>
-
<source>Variant:</source>
<target>メソッド:</target>
@@ -1287,9 +1305,6 @@ The command is triggered if:
<source>Run minimized</source>
<target>最小化で起動</target>
-<source>&Show error dialog</source>
-<target>エラーダイアログを表示(&S)</target>
-
<source>Show pop-up on errors or warnings</source>
<target>エラーと警告をポップアップで表示</target>
@@ -1520,11 +1535,11 @@ This guarantees a consistent state even in case of a serious error.
<source>multiple selection</source>
<target>複数選択</target>
-<source>Include via filter:</source>
-<target>フィルター経由で含める:</target>
+<source>&Include via filter:</source>
+<target>フィルタ経由で含める(&I):</target>
-<source>Exclude via filter:</source>
-<target>フィルター経由で除外:</target>
+<source>&Exclude via filter:</source>
+<target>フィルタ経由で除外(&E):</target>
<source>Include temporarily</source>
<target>一時的に含める</target>
@@ -1532,6 +1547,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Exclude temporarily</source>
<target>一時的に除外</target>
+<source>&Synchronize selection</source>
+<target>選択項目を同期(&S)</target>
+
<source>&Copy to...</source>
<target>コピー先(&C)...</target>
@@ -1667,9 +1685,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Initializing...</source>
<target>初期化中...</target>
-<source>Scanning...</source>
-<target>スキャン中...</target>
-
<source>Comparing content...</source>
<target>内容を比較中...</target>
@@ -1688,6 +1703,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Recommended range:</source>
<target>推奨される範囲:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>本当にユーザ アカウント %x の接続を切断しますか?</target>
+
<source>Password:</source>
<target>パスワード:</target>
@@ -1727,6 +1745,12 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>本当に以下の %x 個の項目を削除しますか?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>選択した項目の同期を開始しますか?</target>
+
+<source>Start synchronization now?</source>
+<target>今すぐ同期を開始しますか?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>DACL, SACL, 所有者, グループをコピー</target>
@@ -1910,9 +1934,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Unable to register device notifications for %x.</source>
<target>%x のデバイス通知を登録できません.</target>
-<source>Cannot monitor directory %x.</source>
-<target>ディレクトリ %x を監視できません.</target>
-
<source>The file is locked by another process:</source>
<target>次のファイルは別のプロセスで使用中です:</target>
@@ -1931,9 +1952,6 @@ This guarantees a consistent state even in case of a serious error.
<source>%x is not a regular directory name.</source>
<target>%x は通常のディレクトリ名ではありません。</target>
-<source>Cannot copy file %x to %y.</source>
-<target>%x から %y にコピーできません.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>属性 を %x から %y にコピーできません.</target>
diff --git a/FreeFileSync/Build/Languages/korean.lng b/FreeFileSync/Build/Languages/korean.lng
index 91efd696..d147b426 100755
--- a/FreeFileSync/Build/Languages/korean.lng
+++ b/FreeFileSync/Build/Languages/korean.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>예외 발생</target>
-<source>A directory path is expected after %x.</source>
-<target>%x 이후 일반적으로 디렉터리 경로가 하나 나옵니다.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>%x 다음에 좌측 및 우측 디렉토리 경로가 필요합니다.</target>
<source>Syntax error</source>
<target>구문 오류</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>%x 다음에 좌측 및 우측 디렉토리 경로가 필요합니다.</target>
-
<source>Cannot find file %x.</source>
<target>파일 %x을(를) 찾을 수 없습니다.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>파일 %x 의 구성이 유효하지 않습니다.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>지정된 좌측 및 우측 디렉터리 개수가 같지 않음.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>명령줄을 통해 설정된 디렉터리의 경우, 설정 파일은 디렉터리 페어 상의 설정을 포함할 수 없습니다.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>최대 1개 설정파일에 대한 대체 디렉터리 페어 개수.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>선택한 구성을 실행하지 않고 편집을 위해서만 열기.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>폴더는 필요 시 자동으로 생성됩니다.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>다음 폴더 경로는 경우에 따라 다릅니다. 중복 액세스를 피하기 위해 단일 양식을 사용하십시오.</target>
+
<source>Scanning:</source>
<target>스캔 중:</target>
@@ -421,9 +418,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>본 운영체제에서의 Shadow Copy 생성은 FreeFileSync 64-비트 버전을 사용하시기 바랍니다.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>%x 에 대한 볼륨 이름을 결정할 수 없습니다.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>볼륨 이름 %x은(는) 파일 경로 %y의 일부가 아닙니다.</target>
@@ -437,7 +431,7 @@
<target>파일 크기</target>
<source>Two way</source>
-<target>양측 방향 (투 웨이)</target>
+<target>양방향</target>
<source>Mirror</source>
<target>미러</target>
@@ -487,6 +481,21 @@
<source>Source item %x not found</source>
<target>원본 항목 %x을(를) 찾을 수 없음</target>
+<source>Cannot move file %x to %y.</source>
+<target>파일 %x을(를) %y(으)로 이동할 수 없습니다.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>상위 폴더 %x이(가) 존재하지 않습니다.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>이름 %x은(는) 이미 다른 항목에서 사용되고 있습니다.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>파일 %x을(를) %y(으)로 복사할 수 없습니다.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>심볼릭 링크 %x을(를) %y(으)로 복사할 수 없습니다.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>%x을(를) 위한 Volume Shadow Copy 생성 중...</target>
@@ -508,6 +517,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>아래의 항목들은 해결치 못 한 충돌로 인해 동기화할 수 없습니다:</target>
+<source>Folder pair:</source>
+<target>폴더 페어:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>다음 폴더들은 서로 간의 차이가 상당합니다. 동기화를 위해 올바른 폴더들이 매치되었는지 확인해 보십시오.</target>
@@ -564,74 +576,77 @@ Actual: %y bytes
<source>Cannot write permissions of %x.</source>
<target>%x의 권한을 쓸 수 없습니다.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>다른 기본 폴더 유형에 대해 지원되지 않는 동작입니다.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>파일 %x을(를) %y(으)로 이동할 수 없습니다.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>심볼릭 링크 %x을(를) %y(으)로 복사할 수 없습니다.</target>
-
-<source>Error Code %x</source>
-<target>오류 코드 %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>서버 %x에 대한 정보를 가져 오는데 실패했습니다.</target>
-
-<source>Cannot open directory %x.</source>
-<target>디렉터리 %x을(를) 열 수 없습니다.</target>
-
-<source>Cannot create directory %x.</source>
-<target>디렉터리 %x을(를) 생성할 수 없습니다.</target>
+<source>Operation not supported between different devices.</source>
+<target>다른 장치 간에는 지원되지 않는 작업입니다.</target>
<source>Cannot delete file %x.</source>
<target>파일 %x을(를) 삭제할 수 없습니다.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>심볼릭 링크 %x을(를) 삭제할 수 없습니다.</target>
+
<source>Cannot delete directory %x.</source>
<target>디렉터리 %x을(를) 삭제할 수 없습니다.</target>
+<source>Error Code %x</source>
+<target>오류 코드 %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>%x의 수정 시간을 쓸 수 없습니다.</target>
+<source>Cannot create directory %x.</source>
+<target>디렉터리 %x을(를) 생성할 수 없습니다.</target>
+
<source>Cannot determine final path for %x.</source>
<target>%x에 대한 최종 경로를 결정할 수 없습니다.</target>
+<source>Operation not supported by device.</source>
+<target>장치에서는 지원되지 않는 작업입니다.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>심볼릭 링크 %x을(를) 해결할 수 없습니다.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>휴지통으로 %x을(를) 이동할 수 없습니다.</target>
-<source>Unable to access %x.</source>
-<target>%x에 접근할 수 없습니다.</target>
-
<source>Authentication completed.</source>
<target>인증 완료.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>지금 이 페이지를 닫고 FreeFileSync를 계속 진행할 수 있습니다.</target>
+
<source>Authentication failed.</source>
<target>인증 실패.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>지금 이 페이지를 닫고 FreeFileSync를 계속 진행할 수 있습니다.</target>
+<source>Cannot find %x.</source>
+<target>%x을(를) 찾을 수 없습니다.</target>
-<source>The server returned an error:</source>
-<target>서버가 오류를 반환했습니다:</target>
+<source>Please authorize access to user account %x.</source>
+<target>사용자 계정 %x에 대한 액세스 권한을 부여하십시오.</target>
<source>Cannot determine free disk space for %x.</source>
<target>%x에 대한 사용 가능한 디스크 공간을 확인할 수 없습니다.</target>
-<source>Cannot find %x.</source>
-<target>%x을(를) 찾을 수 없습니다.</target>
+<source>Unable to disconnect from %x.</source>
+<target>%x에서 연결 해제가 안 됩니다.</target>
+
+<source>Unable to access %x.</source>
+<target>%x에 접근할 수 없습니다.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>서버 %x에 대한 정보를 가져 오는데 실패했습니다.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>디렉터리 %x을(를) 모니터링 할 수 없습니다.</target>
<source>Cannot find device %x.</source>
<target>장치 %x을(를) 찾을 수 없습니다.</target>
-<source>Type of item %x is not supported:</source>
-<target>항목 %x의 형식은 지원되지 않습니다:</target>
+<source>Cannot open directory %x.</source>
+<target>디렉터리 %x을(를) 열 수 없습니다.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>심볼릭 링크 %x을(를) 삭제할 수 없습니다.</target>
+<source>Unsupported item type.</source>
+<target>지원되지 않는 항목 형식.</target>
<source>Incorrect command line:</source>
<target>부정확한 명령줄:</target>
@@ -765,8 +780,8 @@ The command is triggered if:
<source>&Restore</source>
<target>복원(&R)</target>
-<source>&Show error</source>
-<target>오류 표시(&S)</target>
+<source>&Show error message</source>
+<target>오류 메세지 표시(&S)</target>
<source>&Quit</source>
<target>종료(&Q)</target>
@@ -794,6 +809,9 @@ The command is triggered if:
<source>Loading...</source>
<target>로드 중...</target>
+<source>Scanning...</source>
+<target>스캔 중...</target>
+
<source>job name</source>
<target>작업 이름</target>
@@ -1021,12 +1039,12 @@ The command is triggered if:
<source>View type:</source>
<target>유형 보기:</target>
-<source>Save as default</source>
-<target>기본 값으로 저장</target>
-
<source>Select view:</source>
<target>보기 선택:</target>
+<source>Save as default</source>
+<target>기본 값으로 저장</target>
+
<source>Statistics:</source>
<target>통계:</target>
@@ -1045,9 +1063,6 @@ The command is triggered if:
<source>Arrange folder pair</source>
<target>폴더 페어 정렬</target>
-<source>Folder pair:</source>
-<target>폴더 페어:</target>
-
<source>Main settings:</source>
<target>주요 설정:</target>
@@ -1173,12 +1188,21 @@ The command is triggered if:
<source>OK</source>
<target>확인</target>
-<source>Enter your login details:</source>
-<target>귀하의 로그인 정보 입력:</target>
-
<source>Connection type:</source>
<target>연결 유형:</target>
+<source>Connected user accounts:</source>
+<target>연결된 사용자 계정:</target>
+
+<source>&Add connection</source>
+<target>연결 추가(&A)</target>
+
+<source>&Disconnect</source>
+<target>연결 해제(&D)</target>
+
+<source>Selected user account:</source>
+<target>선택된 사용자 계정:</target>
+
<source>Server name or IP address:</source>
<target>서버 이름 또는 IP 주소:</target>
@@ -1227,15 +1251,9 @@ The command is triggered if:
<source>Detect server limit</source>
<target>서버 한계 감지</target>
-<source>Select a directory on the server:</source>
-<target>서버 디렉터리 선택:</target>
-
<source>Select Folder</source>
<target>폴더 선택</target>
-<source>Start synchronization now?</source>
-<target>지금 동기화를 시작하시겠습니까?</target>
-
<source>Variant:</source>
<target>베어리언트:</target>
@@ -1287,9 +1305,6 @@ The command is triggered if:
<source>Run minimized</source>
<target>최소화 실행</target>
-<source>&Show error dialog</source>
-<target>오류 대화 상자 표시(&S)</target>
-
<source>Show pop-up on errors or warnings</source>
<target>오류 또는 경고에 대한 팝업 보이기</target>
@@ -1520,11 +1535,11 @@ This guarantees a consistent state even in case of a serious error.
<source>multiple selection</source>
<target>복수 선택</target>
-<source>Include via filter:</source>
-<target>필터를 통해 다음을 포함:</target>
+<source>&Include via filter:</source>
+<target>필터를 통해 다음을 포함(&I):</target>
-<source>Exclude via filter:</source>
-<target>필터를 통해 다음을 제외:</target>
+<source>&Exclude via filter:</source>
+<target>필터를 통해 다음을 제외(&E):</target>
<source>Include temporarily</source>
<target>임시 포함</target>
@@ -1532,6 +1547,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Exclude temporarily</source>
<target>임시 제외</target>
+<source>&Synchronize selection</source>
+<target>동기화 선택(&S)</target>
+
<source>&Copy to...</source>
<target>다른 경로로 복사(&C)...</target>
@@ -1667,9 +1685,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Initializing...</source>
<target>초기화 작업 중...</target>
-<source>Scanning...</source>
-<target>스캔 중...</target>
-
<source>Comparing content...</source>
<target>내용 비교 중...</target>
@@ -1688,6 +1703,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Recommended range:</source>
<target>권장 범위:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>정말로 사용자 계정 %x에서 연결을 해제하시겠습니까?</target>
+
<source>Password:</source>
<target>비밀번호:</target>
@@ -1727,6 +1745,12 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>정말로 다음 %x 항목을 삭제하시겠습니까?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>선택한 항목에 대한 동기화를 시작하시겠습니까?</target>
+
+<source>Start synchronization now?</source>
+<target>지금 동기화를 시작하시겠습니까?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>DACL, SACL, 소유자, 그룹 복사</target>
@@ -1910,9 +1934,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Unable to register device notifications for %x.</source>
<target>%x에 대한 장치 알림 등록을 할 수 없습니다.</target>
-<source>Cannot monitor directory %x.</source>
-<target>디렉터리 %x을(를) 모니터링 할 수 없습니다.</target>
-
<source>The file is locked by another process:</source>
<target>파일이 다른 프로세스에 의해 잠겨 있습니다:</target>
@@ -1931,9 +1952,6 @@ This guarantees a consistent state even in case of a serious error.
<source>%x is not a regular directory name.</source>
<target>%x(은)는 일반 디렉터리 이름이 아닙니다.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>파일 %x을(를) %y(으)로 복사할 수 없습니다.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>%x에서 %y(으)로의 속성을 복사할 수 없습니다.</target>
diff --git a/FreeFileSync/Build/Languages/lithuanian.lng b/FreeFileSync/Build/Languages/lithuanian.lng
index e7029e08..dc48f448 100755
--- a/FreeFileSync/Build/Languages/lithuanian.lng
+++ b/FreeFileSync/Build/Languages/lithuanian.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>Atsirado išimtis</target>
-<source>A directory path is expected after %x.</source>
-<target>Reikalingas katalogo kelias po %x.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Keliai į kairį ir dešinį katalogus turėtų buti po %x.</target>
<source>Syntax error</source>
<target>Sintaksės klaida</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>Keliai į kairį ir dešinį katalogus turėtų buti po %x.</target>
-
<source>Cannot find file %x.</source>
<target>Negalima surasti failo %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>Failas %x neturi tinkamų nustatymų.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Nustatytas nevienodas skaičius katalogų kairėje ir dešinėje.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Config failas negali turėti katalogų poros lygio nustatymų kai katalogai nustatomi per komandinę eilutę.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Bet koks skaičius alternatyvių katalogų grupuojams tik su vienu konfigūraciniu failu.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>Nepaleidžiant atidaryti pasirinktą konfiguraciją tiktai redagavimui.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>Kai reikia, šie aplankai automatiškai sukuriami.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>Sekančio aplanko vieta nesutampa. Prašome naudoti tokį patį kelią, kad išvengtumėte dvigubos priegos.</target>
+
<source>Scanning:</source>
<target>Nuskaitoma:</target>
@@ -427,9 +424,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Norėdami sukurti sistemos šešėlinę kopiją, prašome baudoti 64-bitų FreeFileSync versiją.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>Vietos vardo %x nustatyti nepavyko.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>Vietos vardas %x nėra failo kelio %y dalis.</target>
@@ -493,6 +487,21 @@
<source>Source item %x not found</source>
<target>Šaltinio elementas %x nerastas:</target>
+<source>Cannot move file %x to %y.</source>
+<target>Nepavyksta perkelti failo %x į %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>Pirminis aplankas %x neegzistuoa.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>Šis %x vardas jau yra naudoamas.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Nepavyksta nukopijuoti failų %x į %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Nepavyko nukopijuoti simbolinės nuorodos %x į %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>%x kuriamas Duomenų Šešėlinė Kopija...</target>
@@ -514,6 +523,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Šie elementai turi neišspręstų konfliktų ir nebus suvienodinti:</target>
+<source>Folder pair:</source>
+<target>Aplanko pora:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>Sekantys aplankai turi ryškius skirtumus. Prašome patikrinti, ar tikrai teisingi aplankai yra pasirinkti suvienodinimui.</target>
@@ -570,74 +582,77 @@ Esamas: %y baitai
<source>Cannot write permissions of %x.</source>
<target>Nepavyksta įrašyti leidimų %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Veiksmas yra nesuderinamas dėl skirtingų aplankų savybių.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>Nepavyksta perkelti failo %x į %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Nepavyko nukopijuoti simbolinės nuorodos %x į %y.</target>
-
-<source>Error Code %x</source>
-<target>Klaidos kodas %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>Nepavyko gauti informaciją apie serverį %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Nepavyksta atversti direktorijos %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Nepavyksta sukurti katalogo %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>Veiksmas yra nesuderinamas tarp atskitų įrenginių.</target>
<source>Cannot delete file %x.</source>
<target>Nepavyksta ištrinti failo %x.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Negalima ištrinti virtualios nuorodos %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>Nepavyksta ištrinti katalogo %x.</target>
+<source>Error Code %x</source>
+<target>Klaidos kodas %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>Nepavyksta šrašyti pakeitimo datos %x.</target>
+<source>Cannot create directory %x.</source>
+<target>Nepavyksta sukurti katalogo %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>Galutinio %x kelio rasti nepavyko.</target>
+<source>Operation not supported by device.</source>
+<target>Šis įrenginys nepalaiko šio veiksmo.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>Nepavyko rasti simbolinės nuorodos %x reikšmės.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>%x į šiukšliadėžę perkelti nepavyko.</target>
-<source>Unable to access %x.</source>
-<target>Nepavyko prisijungti %x.</target>
-
<source>Authentication completed.</source>
<target>Autentifikavimas baigtas.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>Jūs dabar galite uždaryti šį langą ir testi FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>Nepavyko autentifikuoti.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>Jūs dabar galite uždaryti šį langą ir testi FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>Negalima surasti %x.</target>
-<source>The server returned an error:</source>
-<target>Serveris gražino klaidą:</target>
+<source>Please authorize access to user account %x.</source>
+<target>Prašome suteikti prieigą šiam vartotojui %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>Negalima nustatyti laisvos disko dalies %x.</target>
-<source>Cannot find %x.</source>
-<target>Negalima surasti %x.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Nepavyko atsijungti nuo %x.</target>
+
+<source>Unable to access %x.</source>
+<target>Nepavyko prisijungti %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>Nepavyko gauti informaciją apie serverį %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>Nepavyko stebėti katalogo %x.</target>
<source>Cannot find device %x.</source>
<target>Negalima surasti įrenginio %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>Elemento tipas %x nepalaikomas:</target>
+<source>Cannot open directory %x.</source>
+<target>Nepavyksta atversti direktorijos %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>Negalima ištrinti virtualios nuorodos %x.</target>
+<source>Unsupported item type.</source>
+<target>Nepalaikomas elemento tipas.</target>
<source>Incorrect command line:</source>
<target>Netaisyklinga Komandinė eilutė:</target>
@@ -775,8 +790,8 @@ Komanda inicijuojama jei:
<source>&Restore</source>
<target>&Atstatyti</target>
-<source>&Show error</source>
-<target>&Parodyti klaidą</target>
+<source>&Show error message</source>
+<target>&Rodyti kaidą</target>
<source>&Quit</source>
<target>&Išeiti</target>
@@ -806,6 +821,9 @@ Komanda inicijuojama jei:
<source>Loading...</source>
<target>Įkraunama...</target>
+<source>Scanning...</source>
+<target>Tikrinama...</target>
+
<source>job name</source>
<target>Užduoties pavadinimas</target>
@@ -1035,12 +1053,12 @@ Komanda inicijuojama jei:
<source>View type:</source>
<target>Rodymo būdai:</target>
-<source>Save as default</source>
-<target>Išsaugoti kaip pagrindinį</target>
-
<source>Select view:</source>
<target>Pasirinkti rodymo būdą:</target>
+<source>Save as default</source>
+<target>Išsaugoti kaip pagrindinį</target>
+
<source>Statistics:</source>
<target>Statistika:</target>
@@ -1059,9 +1077,6 @@ Komanda inicijuojama jei:
<source>Arrange folder pair</source>
<target>Sulygiuoti pagal aplanko porą</target>
-<source>Folder pair:</source>
-<target>Aplanko pora:</target>
-
<source>Main settings:</source>
<target>Pagrindiniai parametrai:</target>
@@ -1187,12 +1202,21 @@ Komanda inicijuojama jei:
<source>OK</source>
<target>Gerai</target>
-<source>Enter your login details:</source>
-<target>Įveskite išsamią prisijungimo informaciją:</target>
-
<source>Connection type:</source>
<target>Prisijungimo būdas:</target>
+<source>Connected user accounts:</source>
+<target>Prisijungta prie vartotojų:</target>
+
+<source>&Add connection</source>
+<target>&Pridėti prisijungimus</target>
+
+<source>&Disconnect</source>
+<target>&Atsijungti</target>
+
+<source>Selected user account:</source>
+<target>Pasirinkti vartotoją:</target>
+
<source>Server name or IP address:</source>
<target>Serverio vardas arba IP adresas:</target>
@@ -1241,15 +1265,9 @@ Komanda inicijuojama jei:
<source>Detect server limit</source>
<target>Aptikti serverio ribas</target>
-<source>Select a directory on the server:</source>
-<target>Pažymėti katalogą serveryje:</target>
-
<source>Select Folder</source>
<target>Pažymėti Aplanką</target>
-<source>Start synchronization now?</source>
-<target>Dabar pradėti suvienodinimą?</target>
-
<source>Variant:</source>
<target>Variantai:</target>
@@ -1301,9 +1319,6 @@ Komanda inicijuojama jei:
<source>Run minimized</source>
<target>Vykdyti sumažinus</target>
-<source>&Show error dialog</source>
-<target>&Rodyti klaidų dialogą</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Rodyti pranešimą esant klaidoms ar perspėjimams</target>
@@ -1542,11 +1557,11 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>multiple selection</source>
<target>keletos pažymėjimas</target>
-<source>Include via filter:</source>
-<target>Įtraukti naudojant filtrą:</target>
+<source>&Include via filter:</source>
+<target>&Pridėti su filtro pagalba:</target>
-<source>Exclude via filter:</source>
-<target>Neįtraukti naudojant filtrą:</target>
+<source>&Exclude via filter:</source>
+<target>&Išskirti su filtro pagalba:</target>
<source>Include temporarily</source>
<target>Įtraukti laikinai</target>
@@ -1554,6 +1569,9 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Exclude temporarily</source>
<target>Neįtraukti laikinai</target>
+<source>&Synchronize selection</source>
+<target>&Suvienodinti pasirinkimus</target>
+
<source>&Copy to...</source>
<target>&Kopijuoti į...</target>
@@ -1689,9 +1707,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Initializing...</source>
<target>Pradedama...</target>
-<source>Scanning...</source>
-<target>Tikrinama...</target>
-
<source>Comparing content...</source>
<target>Palyginimo turinys...</target>
@@ -1710,6 +1725,9 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Recommended range:</source>
<target>Rekomenduojamas intervalas:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>Ar jūs tikrai norite atsijungti nuo vartotojo %x?</target>
+
<source>Password:</source>
<target>Slaptažodis:</target>
@@ -1755,6 +1773,12 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<pluralform>Ar tikrai norite ištrinti šiuos %x elementų?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>Pradėti pasirinkimų suvienodinimą?</target>
+
+<source>Start synchronization now?</source>
+<target>Dabar pradėti suvienodinimą?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Kopijuoti DACL, SACL, Owner, Group</target>
@@ -1938,9 +1962,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Unable to register device notifications for %x.</source>
<target>Nepavyko priregistruoti %x įrenginio pranešimų.</target>
-<source>Cannot monitor directory %x.</source>
-<target>Nepavyko stebėti katalogo %x.</target>
-
<source>The file is locked by another process:</source>
<target>Failas yra užrakintas kito procceso:</target>
@@ -1959,9 +1980,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>%x is not a regular directory name.</source>
<target>%x nėra reguliarus katalogo vardas.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Nepavyksta nukopijuoti failų %x į %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Nepavyko nukopijuoti atributų iš %x į %y.</target>
diff --git a/FreeFileSync/Build/Languages/norwegian.lng b/FreeFileSync/Build/Languages/norwegian.lng
index 97e97cce..6a5146a9 100755
--- a/FreeFileSync/Build/Languages/norwegian.lng
+++ b/FreeFileSync/Build/Languages/norwegian.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>Et unntak oppstod</target>
-<source>A directory path is expected after %x.</source>
-<target>Det forventes en katalogsti etter %x.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>En venstre og en høyre katalogbane forventes etter %x.</target>
<source>Syntax error</source>
<target>Syntaksfeil</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>En venstre og en høyre katalogbane forventes etter %x.</target>
-
<source>Cannot find file %x.</source>
<target>Kan ikke finne filen %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>Filen %x inneholder ikke gyldige innstillinger.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Det er angitt et ulikt antall venstre- og høyre-mapper.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Innstillingsfilen må ikke inneholde innstillinger på katalog-nivå når mapper er satt via en kommandolinje.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Et ubegrenset antall alternative kataloger for maksimalt én konfigurasjonsfil.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>Åpne den valgte konfigurasjonen bare for redigering uten å utføre den.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>Mappene blir opprettet automatisk når det trengs.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>Følgende mappebaner er forskjellige i tilfelle. Vennligst bruk et enkelt skjema for å unngå dupliserte tilganger.</target>
+
<source>Scanning:</source>
<target>Skanner:</target>
@@ -424,9 +421,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Kjør 64-bits versjonen av FreeFileSync for å lage skyggekopier på dette systemet.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>Kan ikke bestemme volumnavn til %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>Volumnavnet %x er ikke en del av filstien %y.</target>
@@ -490,6 +484,21 @@
<source>Source item %x not found</source>
<target>Kildeelementet %x ikke funnet</target>
+<source>Cannot move file %x to %y.</source>
+<target>Kan ikke flytte filen %x til %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>Overordnet mappe %x finnes ikke.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>Navnet %x brukes allerede av et annet element.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Kan ikke kopiere filen %x til %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Kan ikke kopiere symbolsk forbindelse %x til %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Oppretter en Volume Shadow-kopi for %x...</target>
@@ -511,6 +520,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Følgende elementer har uløste konflikter og vil ikke bli synkroniserete:</target>
+<source>Folder pair:</source>
+<target>Mappepar:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>Følgende mapper er vesentlig forskjellige. Kontroller at de riktige mappene er valgt for synkronisering.</target>
@@ -567,74 +579,77 @@ Faktisk: %y bytes
<source>Cannot write permissions of %x.</source>
<target>Kan ikke skrive tillatelsene til %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Operasjonen støttes ikke for ulike typer basismapper.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>Kan ikke flytte filen %x til %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Kan ikke kopiere symbolsk forbindelse %x til %y.</target>
-
-<source>Error Code %x</source>
-<target>Feilkode %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>Kunne ikke få informasjon om server %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Kan ikke åpne katalog %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Kan ikke lage katalog %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>Operasjonen støttes ikke mellom ulike enheter.</target>
<source>Cannot delete file %x.</source>
<target>Kan ikke slette filen %x.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Kan ikke slette symbolsk lenke %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>Kan ikke slette katalog %x.</target>
+<source>Error Code %x</source>
+<target>Feilkode %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>Kan ikke oppdatere tidsendring på %x.</target>
+<source>Cannot create directory %x.</source>
+<target>Kan ikke lage katalog %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>Kan ikke bestemme endelig sti for %x.</target>
+<source>Operation not supported by device.</source>
+<target>Operasjonen støttes ikke av enheten.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>Kan ikke løse den symbolske forbindelsen %x.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>Kunne ikke flytte %x til papirkurven.</target>
-<source>Unable to access %x.</source>
-<target>Får ikke tilgang til %x.</target>
-
<source>Authentication completed.</source>
<target>Autentisering er ferdig.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>Du kan lukke denne siden nå og fortsette med FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>Autentisering mislyktes.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>Du kan lukke denne siden nå og fortsette med FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>Kan ikke finne %x.</target>
-<source>The server returned an error:</source>
-<target>Serveren returnerte en feilmelding:</target>
+<source>Please authorize access to user account %x.</source>
+<target>Vennligst godta tilgang til brukerkonto %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>Kan ikke fastslå ledig diskplass for %x.</target>
-<source>Cannot find %x.</source>
-<target>Kan ikke finne %x.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Kan ikke koble fra %x.</target>
+
+<source>Unable to access %x.</source>
+<target>Får ikke tilgang til %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>Kunne ikke få informasjon om server %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>Kan ikke overvåke katalog %x.</target>
<source>Cannot find device %x.</source>
<target>Kan ikke finne enhet %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>Elementtypen %x støttes ikke:</target>
+<source>Cannot open directory %x.</source>
+<target>Kan ikke åpne katalog %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>Kan ikke slette symbolsk lenke %x.</target>
+<source>Unsupported item type.</source>
+<target>Ikke-støttet varetype.</target>
<source>Incorrect command line:</source>
<target>Ugyldig kommando:</target>
@@ -770,8 +785,8 @@ Kommandoen utføres hvis:
<source>&Restore</source>
<target>&Gjenopprett</target>
-<source>&Show error</source>
-<target>&Vis feil</target>
+<source>&Show error message</source>
+<target>&Vis feilmelding</target>
<source>&Quit</source>
<target>&Avslutt</target>
@@ -800,6 +815,9 @@ Kommandoen utføres hvis:
<source>Loading...</source>
<target>Laster...</target>
+<source>Scanning...</source>
+<target>Skanner...</target>
+
<source>job name</source>
<target>jobbnavn</target>
@@ -1028,12 +1046,12 @@ Kommandoen utføres hvis:
<source>View type:</source>
<target>Visning:</target>
-<source>Save as default</source>
-<target>Lagre som standard</target>
-
<source>Select view:</source>
<target>Velg visning:</target>
+<source>Save as default</source>
+<target>Lagre som standard</target>
+
<source>Statistics:</source>
<target>Statistikk:</target>
@@ -1052,9 +1070,6 @@ Kommandoen utføres hvis:
<source>Arrange folder pair</source>
<target>Ordne mappepar</target>
-<source>Folder pair:</source>
-<target>Mappepar:</target>
-
<source>Main settings:</source>
<target>Hovedinnstillingene:</target>
@@ -1180,12 +1195,21 @@ Kommandoen utføres hvis:
<source>OK</source>
<target>OK</target>
-<source>Enter your login details:</source>
-<target>Skriv inn dine innloggingsdetaljer:</target>
-
<source>Connection type:</source>
<target>Tilkoblingstype:</target>
+<source>Connected user accounts:</source>
+<target>Tilkoblede brukerkontoer:</target>
+
+<source>&Add connection</source>
+<target>&Legg til tilkobling</target>
+
+<source>&Disconnect</source>
+<target>&Koble fra</target>
+
+<source>Selected user account:</source>
+<target>Valgt brukerkonto:</target>
+
<source>Server name or IP address:</source>
<target>Servernavn eller IP-adresse:</target>
@@ -1234,15 +1258,9 @@ Kommandoen utføres hvis:
<source>Detect server limit</source>
<target>Oppdag server grensa</target>
-<source>Select a directory on the server:</source>
-<target>Velg en katalog på serveren:</target>
-
<source>Select Folder</source>
<target>Velg mappe</target>
-<source>Start synchronization now?</source>
-<target>Synkroniser nå?</target>
-
<source>Variant:</source>
<target>Jobbtype:</target>
@@ -1294,9 +1312,6 @@ Kommandoen utføres hvis:
<source>Run minimized</source>
<target>Kjør minimert</target>
-<source>&Show error dialog</source>
-<target>& Vis feildialogboksen</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Vis feilmeldinger og advarsler</target>
@@ -1531,11 +1546,11 @@ Sikrer prosessen ved alvorlige feil.
<source>multiple selection</source>
<target>velg flere</target>
-<source>Include via filter:</source>
-<target>Inkludér via filter:</target>
+<source>&Include via filter:</source>
+<target>&Inkluder via filter:</target>
-<source>Exclude via filter:</source>
-<target>Ekskludér via filter:</target>
+<source>&Exclude via filter:</source>
+<target>&Ekskluder via filter:</target>
<source>Include temporarily</source>
<target>Inkludér midlertidig</target>
@@ -1543,6 +1558,9 @@ Sikrer prosessen ved alvorlige feil.
<source>Exclude temporarily</source>
<target>Ekskludér midlertidig</target>
+<source>&Synchronize selection</source>
+<target>&Synkroniser utvalg</target>
+
<source>&Copy to...</source>
<target>&Kopier til...</target>
@@ -1678,9 +1696,6 @@ Sikrer prosessen ved alvorlige feil.
<source>Initializing...</source>
<target>Forbereder...</target>
-<source>Scanning...</source>
-<target>Skanner...</target>
-
<source>Comparing content...</source>
<target>Sammenligner innhold...</target>
@@ -1699,6 +1714,9 @@ Sikrer prosessen ved alvorlige feil.
<source>Recommended range:</source>
<target>Anbefalt område:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>Vil du virkelig koble fra brukerkonto %x?</target>
+
<source>Password:</source>
<target>Passord:</target>
@@ -1741,6 +1759,12 @@ Sikrer prosessen ved alvorlige feil.
<pluralform>Vil du virkelig slette følgende %x element?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>Begynn å synkronisere utvalget?</target>
+
+<source>Start synchronization now?</source>
+<target>Synkroniser nå?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Kopiér DACL, SACL, Eier, Gruppe</target>
@@ -1924,9 +1948,6 @@ Sikrer prosessen ved alvorlige feil.
<source>Unable to register device notifications for %x.</source>
<target>Kunne ikke registere enhets-varsler for %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>Kan ikke overvåke katalog %x.</target>
-
<source>The file is locked by another process:</source>
<target>Filen er låst av en annen prosess:</target>
@@ -1945,9 +1966,6 @@ Sikrer prosessen ved alvorlige feil.
<source>%x is not a regular directory name.</source>
<target>%x er ikke et vanlig katalognavn.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Kan ikke kopiere filen %x til %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Kan ikke kopiere attributtene fra %x til %y.</target>
diff --git a/FreeFileSync/Build/Languages/polish.lng b/FreeFileSync/Build/Languages/polish.lng
index 30a67068..1159b893 100755
--- a/FreeFileSync/Build/Languages/polish.lng
+++ b/FreeFileSync/Build/Languages/polish.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>Wystąpił wyjątek</target>
-<source>A directory path is expected after %x.</source>
-<target>Za %x oczekiwana jest ścieżka katalogu.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Po %x należy określić lewy i prawy katalog.</target>
<source>Syntax error</source>
<target>Błąd składni</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>Po %x należy określić lewy i prawy katalog.</target>
-
<source>Cannot find file %x.</source>
<target>Nie można odnaleźć pliku %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>Plik %x nie zawiera prawidłowej konfiguracji.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Wprowadzona liczba katalogów do synchronizacji jest nierówna.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Plik konfiguracyjny nie może zawierać informacji o synchronizowanych katalogach, gdy nazwy ścieżek przekazywane są w linii poleceń.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Dowolna liczba alternatywnych par katalogów dla najwyżej jednego pliku konfiguracyjnego.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>Otwórz wybraną konfigurację tylko do edycji (bez uruchomienia).</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>Katalogi są tworzone automatycznie w razie potrzeby.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>Poniższe ścieżki do katalogów różnią się wielkością liter. Użyj pojedynczego formularza, aby uniknąć duplikowania dostępu.</target>
+
<source>Scanning:</source>
<target>Skanowanie:</target>
@@ -427,9 +424,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Uruchom 64-bitową wersję FreeFileSync aby utworzyć Shadow Copies w tym systemie.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>Nie można określić nazwy dysku dla %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>Nazwa wolumenu %x nie jest częścią ścieżki %y.</target>
@@ -493,6 +487,21 @@
<source>Source item %x not found</source>
<target>Nie znaleziono elementu źródłowego %x</target>
+<source>Cannot move file %x to %y.</source>
+<target>Nie można przenieść pliku %x do %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>Nadrzędny folder %x nie istnieje.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>Nazwa %x jest już używana przez inny element.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Nie można skopiować pliku %x do %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Nie można skopiować linku symbolicznego %x do %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Tworzenie Volume Shadow Copy dla %x...</target>
@@ -514,6 +523,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Te elementy znajdują się w konflikcie, którego nie można rozwiązać. Pliki nie zostaną zsynchronizowane:</target>
+<source>Folder pair:</source>
+<target>Para folderów:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>Poniższe katalogi znacząco się różnią. Zweryfikuj czy do synchronizacji zostały określone prawidłowe katalogi.</target>
@@ -570,74 +582,77 @@ Przesłany: %y bajtów
<source>Cannot write permissions of %x.</source>
<target>Nie można zapisać uprawnień %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Operacja nie jest wspierana dla różnych typów katalogów.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>Nie można przenieść pliku %x do %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Nie można skopiować linku symbolicznego %x do %y.</target>
-
-<source>Error Code %x</source>
-<target>Kod błędu %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>Nie można uzyskać informacji o serwerze %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Nie można otworzyć katalogu %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Nie można utworzyć katalogu %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>Operacja nie jest obsługiwana między różnymi urządzeniami.</target>
<source>Cannot delete file %x.</source>
<target>Nie można usunąć pliku %x.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Nie można usunąć dowiązania symbolicznego %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>Nie można usunąć katalogu %x.</target>
+<source>Error Code %x</source>
+<target>Kod błędu %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>Nie można zapisać czasu modyfikacji %x.</target>
+<source>Cannot create directory %x.</source>
+<target>Nie można utworzyć katalogu %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>Nie można określić ostatecznej ścieżki dla %x.</target>
+<source>Operation not supported by device.</source>
+<target>Operacja nie jest obsługiwana przez urządzenie.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>Nie można określić położenia dowiązania symbolicznego %x.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>Nie można przenieść %x do kosza.</target>
-<source>Unable to access %x.</source>
-<target>Brak dostępu do %x.</target>
-
<source>Authentication completed.</source>
<target>Uwierzytelnianie zakończone.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>Możesz teraz zamknąć tę stronę i kontynuować FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>Uwierzytelnianie nie powiodło się.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>Możesz teraz zamknąć tę stronę i kontynuować FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>Nie można odnaleźć %x.</target>
-<source>The server returned an error:</source>
-<target>Serwer zwrócił błąd:</target>
+<source>Please authorize access to user account %x.</source>
+<target>Proszę autoryzować dostęp do konta użytkownika %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>Nie można określić wolnego miejsca na %x.</target>
-<source>Cannot find %x.</source>
-<target>Nie można odnaleźć %x.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Nie można odłączyć od %x.</target>
+
+<source>Unable to access %x.</source>
+<target>Brak dostępu do %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>Nie można uzyskać informacji o serwerze %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>Nie można monitorować katalogu %x.</target>
<source>Cannot find device %x.</source>
<target>Nie można odnaleźć urządzenia %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>Element typu %x nie jest wspierany:</target>
+<source>Cannot open directory %x.</source>
+<target>Nie można otworzyć katalogu %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>Nie można usunąć dowiązania symbolicznego %x.</target>
+<source>Unsupported item type.</source>
+<target>Nieobsługiwany typ elementu.</target>
<source>Incorrect command line:</source>
<target>Niepoprawne polecenie:</target>
@@ -775,8 +790,8 @@ Komenda jest wykonywana gdy:
<source>&Restore</source>
<target>&Przywróć</target>
-<source>&Show error</source>
-<target>Pokaż &błędy</target>
+<source>&Show error message</source>
+<target>&Pokaż komunikat o błędzie</target>
<source>&Quit</source>
<target>Zam&knij</target>
@@ -806,6 +821,9 @@ Komenda jest wykonywana gdy:
<source>Loading...</source>
<target>Wczytywanie...</target>
+<source>Scanning...</source>
+<target>Skanowanie...</target>
+
<source>job name</source>
<target>nazwa zadania</target>
@@ -1035,12 +1053,12 @@ Komenda jest wykonywana gdy:
<source>View type:</source>
<target>Typ widoku:</target>
-<source>Save as default</source>
-<target>Zapisz jako domyślne</target>
-
<source>Select view:</source>
<target>Widok:</target>
+<source>Save as default</source>
+<target>Zapisz jako domyślne</target>
+
<source>Statistics:</source>
<target>Statystyki:</target>
@@ -1059,9 +1077,6 @@ Komenda jest wykonywana gdy:
<source>Arrange folder pair</source>
<target>Uporządkuj parę katalogów</target>
-<source>Folder pair:</source>
-<target>Para folderów:</target>
-
<source>Main settings:</source>
<target>Główne ustawienia:</target>
@@ -1187,12 +1202,21 @@ Komenda jest wykonywana gdy:
<source>OK</source>
<target>OK</target>
-<source>Enter your login details:</source>
-<target>Wprowadź dane do logowania:</target>
-
<source>Connection type:</source>
<target>Typ połączenia:</target>
+<source>Connected user accounts:</source>
+<target>Połączone konta użytkowników:</target>
+
+<source>&Add connection</source>
+<target>&Dodaj połączenie</target>
+
+<source>&Disconnect</source>
+<target>&Rozłącz się</target>
+
+<source>Selected user account:</source>
+<target>Wybrane konto użytkownika:</target>
+
<source>Server name or IP address:</source>
<target>Nazwa serwera lub adres IP:</target>
@@ -1241,15 +1265,9 @@ Komenda jest wykonywana gdy:
<source>Detect server limit</source>
<target>Wykryj limity serwera</target>
-<source>Select a directory on the server:</source>
-<target>Określ katalog na serwerze:</target>
-
<source>Select Folder</source>
<target>Określ katalog</target>
-<source>Start synchronization now?</source>
-<target>Rozpocząć teraz synchronizację?</target>
-
<source>Variant:</source>
<target>Wariant:</target>
@@ -1301,9 +1319,6 @@ Komenda jest wykonywana gdy:
<source>Run minimized</source>
<target>Uruchom zminimalizowane</target>
-<source>&Show error dialog</source>
-<target>&Pokaż powiadomienie z błędem</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Pokazuj okna pop-up dla błędów i ostrzeżeń</target>
@@ -1542,11 +1557,11 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>multiple selection</source>
<target>zaznaczone elementy</target>
-<source>Include via filter:</source>
-<target>Dodaj pliki:</target>
+<source>&Include via filter:</source>
+<target>&Dołącz przez filtr:</target>
-<source>Exclude via filter:</source>
-<target>Dodaj filtr:</target>
+<source>&Exclude via filter:</source>
+<target>&Wyklucz przez filtr:</target>
<source>Include temporarily</source>
<target>Dołącz tymczasowo</target>
@@ -1554,6 +1569,9 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Exclude temporarily</source>
<target>Wyklucz tymczasowo</target>
+<source>&Synchronize selection</source>
+<target>&Synchronizuj wybór</target>
+
<source>&Copy to...</source>
<target>&Kopiuj do...</target>
@@ -1689,9 +1707,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Initializing...</source>
<target>Inicjalizacja...</target>
-<source>Scanning...</source>
-<target>Skanowanie...</target>
-
<source>Comparing content...</source>
<target>Porównywanie zawartości...</target>
@@ -1710,6 +1725,9 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Recommended range:</source>
<target>Rekomendowany zakres:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>Czy na pewno chcesz się odłączyć od konta użytkownika %x?</target>
+
<source>Password:</source>
<target>Hasło:</target>
@@ -1755,6 +1773,12 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<pluralform>Czy na pewno chcesz usunąć %x następujących elementów?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>Zacznij synchronizować wybór?</target>
+
+<source>Start synchronization now?</source>
+<target>Rozpocząć teraz synchronizację?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Kopiuj DACL, SACL, Użytkownik, Grupa</target>
@@ -1828,7 +1852,7 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<target>MB</target>
<source>Retain deleted and overwritten files in the recycle bin</source>
-<target>Zachowaj pliku usunięte i nadpisane w koszu systemowym</target>
+<target>Zachowaj pliki usunięte i nadpisane w koszu systemowym</target>
<source>Delete and overwrite files permanently</source>
<target>Usuwaj i nadpisuj pliki permanentnie</target>
@@ -1888,7 +1912,7 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<target>Automatyczne aktualizacje:</target>
<source>Check for Program Updates</source>
-<target>Sprawdź dostępne aktualizacje.</target>
+<target>Sprawdź dostępne aktualizacje</target>
<source>Auto-update now or download manually from the FreeFileSync home page?</source>
<target>Automatycznie zaktualizować teraz czy ręcznie pobrać ze strony FreeFileSync</target>
@@ -1938,9 +1962,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Unable to register device notifications for %x.</source>
<target>Nie można zarejestrować powiadomień urządzenia dla %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>Nie można monitorować katalogu %x.</target>
-
<source>The file is locked by another process:</source>
<target>Plik jest zablokowany przez inny proces:</target>
@@ -1959,9 +1980,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>%x is not a regular directory name.</source>
<target>%x nie jest zwykłą nazwą katalogu.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Nie można skopiować pliku %x do %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Nie można skopiować atrybutów z %x do %y.</target>
diff --git a/FreeFileSync/Build/Languages/portuguese.lng b/FreeFileSync/Build/Languages/portuguese.lng
index b713f6f1..06aab803 100755
--- a/FreeFileSync/Build/Languages/portuguese.lng
+++ b/FreeFileSync/Build/Languages/portuguese.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>Ocorreu uma excepção</target>
-<source>A directory path is expected after %x.</source>
-<target>É esperado um caminho de directório após %x.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>É esperado um caminho de directório esquerdo e direito após %x.</target>
<source>Syntax error</source>
<target>Erro de sintaxe</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>É esperado um caminho de directório esquerdo e direito após %x.</target>
-
<source>Cannot find file %x.</source>
<target>Não é possível encontrar o ficheiro %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>Ficheiro %x não tem uma configuração válida.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Número desigual de directórios à esquerda e à direita.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>O ficheiro de configuração não deve conter configurações ao nível de par-directório quando os directórios são definidos pela linha de comandos.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Qualquer número de pares de directórios alternativos para apenas um ficheiro de configuração.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>Abre a configuração seleccionada para somente editar sem executá-la.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>As pastas são criadas automaticamente se necessário.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>Os seguintes caminhos de pastas diferem no caso. Por favor, use um único formulário para evitar acessos duplicados.</target>
+
<source>Scanning:</source>
<target>A pesquisar:</target>
@@ -424,9 +421,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Por favor, executar a versão do FreeFileSync de 64 bits para criar cópias de sombra neste sistema.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>Não é possível determinar o nome do volume para %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>Nome de volume %x não faz parte do caminho do ficheiro %y.</target>
@@ -490,6 +484,21 @@
<source>Source item %x not found</source>
<target>Item de origem %x não encontrado</target>
+<source>Cannot move file %x to %y.</source>
+<target>Não é possível mover o ficheiro %x para %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>A pasta pai %x não existe.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>O nome %x já está em uso por outro item.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Não é possível copiar o ficheiro %x para %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Não é possível criar o link simbólico de %x para %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>A criar Volume Shadow Copy para %x...</target>
@@ -511,6 +520,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Os seguintes itens têm conflitos não resolvidos, e não serão sincronizados:</target>
+<source>Folder pair:</source>
+<target>Par da pasta:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>As seguintes pastas são significativamente diferentes. Por favor, verifique se as pastas corretas estão seleccionadas para a sincronização.</target>
@@ -567,74 +579,77 @@ Actual: %y bytes
<source>Cannot write permissions of %x.</source>
<target>Não é possível escrever as permissões de %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Operação sem suporte para tipos de pastas base distintas.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>Não é possível mover o ficheiro %x para %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Não é possível criar o link simbólico de %x para %y.</target>
-
-<source>Error Code %x</source>
-<target>Código de Erro %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>Falha ao obter informações do servidor %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Não é possível abrir o directório %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Não é possível criar o directório %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>Operação não suportada entre dispositivos diferentes.</target>
<source>Cannot delete file %x.</source>
<target>Não é possível eliminar o ficheiro %x.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Não é possível remover o link simbólico %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>Não é possível eliminar o directório %x.</target>
+<source>Error Code %x</source>
+<target>Código de Erro %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>Não é possível alterar a data de modificação a %x.</target>
+<source>Cannot create directory %x.</source>
+<target>Não é possível criar o directório %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>Não é possível determinar o caminho final de %x.</target>
+<source>Operation not supported by device.</source>
+<target>Operação não suportada pelo dispositivo.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>Não é possível resolver o link simbólico %x.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>Não é possível mover %x para a reciclagem.</target>
-<source>Unable to access %x.</source>
-<target>Incapaz de aceder %x.</target>
-
<source>Authentication completed.</source>
<target>Autenticação completada.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>Você pode cerrar esta página agora e continuar com o FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>Falha na autenticação.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>Você pode cerrar esta página agora e continuar com o FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>Não é possível encontrar %x.</target>
-<source>The server returned an error:</source>
-<target>O servidor retornou um erro:</target>
+<source>Please authorize access to user account %x.</source>
+<target>Por favor, autorize o acesso à conta de usuário %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>Não é possível determinar o espaço livre no disco %x.</target>
-<source>Cannot find %x.</source>
-<target>Não é possível encontrar %x.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Incapaz de se desconectar de %x.</target>
+
+<source>Unable to access %x.</source>
+<target>Incapaz de aceder %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>Falha ao obter informações do servidor %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>Não é possível monitorizar o directório %x.</target>
<source>Cannot find device %x.</source>
<target>Não é possível encontrar o dispositivo %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>Tipo de item %x não é suportado:</target>
+<source>Cannot open directory %x.</source>
+<target>Não é possível abrir o directório %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>Não é possível remover o link simbólico %x.</target>
+<source>Unsupported item type.</source>
+<target>Tipo de item não suportado.</target>
<source>Incorrect command line:</source>
<target>Linha de comandos incorrecta:</target>
@@ -770,8 +785,8 @@ O comando é executado se:
<source>&Restore</source>
<target>&Restaurar</target>
-<source>&Show error</source>
-<target>Mostrar &erro</target>
+<source>&Show error message</source>
+<target>Mo&strar mensagens de erro</target>
<source>&Quit</source>
<target>&Sair</target>
@@ -800,6 +815,9 @@ O comando é executado se:
<source>Loading...</source>
<target>A carregar...</target>
+<source>Scanning...</source>
+<target>A pesquisar...</target>
+
<source>job name</source>
<target>nome da tarefa</target>
@@ -1028,12 +1046,12 @@ O comando é executado se:
<source>View type:</source>
<target>Tipo de vista:</target>
-<source>Save as default</source>
-<target>Guardar como padrão</target>
-
<source>Select view:</source>
<target>Seleccionar vista:</target>
+<source>Save as default</source>
+<target>Guardar como padrão</target>
+
<source>Statistics:</source>
<target>Estatísticas:</target>
@@ -1052,9 +1070,6 @@ O comando é executado se:
<source>Arrange folder pair</source>
<target>Organizar par da pasta</target>
-<source>Folder pair:</source>
-<target>Par da pasta:</target>
-
<source>Main settings:</source>
<target>Definições principais:</target>
@@ -1180,12 +1195,21 @@ O comando é executado se:
<source>OK</source>
<target>OK</target>
-<source>Enter your login details:</source>
-<target>Entre os detalhes do login:</target>
-
<source>Connection type:</source>
<target>Tipo de conexão:</target>
+<source>Connected user accounts:</source>
+<target>Contas de usuário conectadas:</target>
+
+<source>&Add connection</source>
+<target>&Adicionar conexão</target>
+
+<source>&Disconnect</source>
+<target>&Desconectar</target>
+
+<source>Selected user account:</source>
+<target>Conta de usuário seleccionada:</target>
+
<source>Server name or IP address:</source>
<target>Nome do servidor ou endereço IP:</target>
@@ -1234,15 +1258,9 @@ O comando é executado se:
<source>Detect server limit</source>
<target>Detectar limite do servidor</target>
-<source>Select a directory on the server:</source>
-<target>Seleccione um directório no servidor:</target>
-
<source>Select Folder</source>
<target>Seleccionar Pasta</target>
-<source>Start synchronization now?</source>
-<target>Iniciar sincronização agora?</target>
-
<source>Variant:</source>
<target>Variante:</target>
@@ -1294,9 +1312,6 @@ O comando é executado se:
<source>Run minimized</source>
<target>Correr minimizado</target>
-<source>&Show error dialog</source>
-<target>Mo&strar diálogo de erro</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Mostrar popup em caso de erros ou avisos</target>
@@ -1531,11 +1546,11 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>multiple selection</source>
<target>selecção múltipla</target>
-<source>Include via filter:</source>
-<target>Incluir via filtro:</target>
+<source>&Include via filter:</source>
+<target>&Incluir via filtro:</target>
-<source>Exclude via filter:</source>
-<target>Excluir por filtro:</target>
+<source>&Exclude via filter:</source>
+<target>&Excluir via filtro:</target>
<source>Include temporarily</source>
<target>Incluir temporariamente</target>
@@ -1543,6 +1558,9 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Exclude temporarily</source>
<target>Excluir temporariamente</target>
+<source>&Synchronize selection</source>
+<target>&Sincronizar selecção</target>
+
<source>&Copy to...</source>
<target>&Copiar para...</target>
@@ -1678,9 +1696,6 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Initializing...</source>
<target>A iniciar...</target>
-<source>Scanning...</source>
-<target>A pesquisar...</target>
-
<source>Comparing content...</source>
<target>A comparar...</target>
@@ -1699,6 +1714,9 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Recommended range:</source>
<target>Gama recomendada:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>Desejas realmente desconectar da conta de usuário %x?</target>
+
<source>Password:</source>
<target>Palavra passe:</target>
@@ -1741,6 +1759,12 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<pluralform>Deseja mesmo eliminar os seguintes %x itens?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>Iniciar a sincronizar a selecção?</target>
+
+<source>Start synchronization now?</source>
+<target>Iniciar sincronização agora?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Copiar DACL, SACL, Proprietário, Grupo</target>
@@ -1924,9 +1948,6 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Unable to register device notifications for %x.</source>
<target>Não é possível registrar as notificações do dispositivo para %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>Não é possível monitorizar o directório %x.</target>
-
<source>The file is locked by another process:</source>
<target>O ficheiro está bloqueado por outro processo:</target>
@@ -1945,9 +1966,6 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>%x is not a regular directory name.</source>
<target>%x não é um nome regular de directório.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Não é possível copiar o ficheiro %x para %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Não é possível copiar os atributos de %x para %y.</target>
diff --git a/FreeFileSync/Build/Languages/portuguese_br.lng b/FreeFileSync/Build/Languages/portuguese_br.lng
index 43c0904c..51b1097e 100755
--- a/FreeFileSync/Build/Languages/portuguese_br.lng
+++ b/FreeFileSync/Build/Languages/portuguese_br.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>Ocorreu uma exceção</target>
-<source>A directory path is expected after %x.</source>
-<target>Um caminho de diretório é esperado após %x.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Um caminho de diretório esquerdo e um direito são esperados após %x.</target>
<source>Syntax error</source>
<target>Erro de sintaxe</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>Um caminho de diretório esquerdo e um direito são esperados após %x.</target>
-
<source>Cannot find file %x.</source>
<target>Não é possível encontrar o arquivo %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>O arquivo %x não contém uma configuração válida.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Número diferente de diretórios especificados na esquerda e na direita.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>O arquivo de configuração não deve conter configurações de diretórios quando os diretórios são definidos via linha de comando.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Qualquer número de pares alternativos de diretórios para no máximo um arquivo de configuração.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>Abrir a configuração selecionada para edição apenas, sem executá-la.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>As pastas são criadas automaticamente quando necessárias.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>Os seguintes caminhos da pasta diferem em letras maiúsculas e minúsculas. Por favor, use apenas uma forma para evitar acessos duplicados.</target>
+
<source>Scanning:</source>
<target>Pesquisando:</target>
@@ -422,10 +419,7 @@
<target>Não é possível acessar o Serviço de Cópias de Sombra de Volume.</target>
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>Execute a versão 64-bits do FreeFileSync para criar cópias de sombra neste sistema.</target>
-
-<source>Cannot determine volume name for %x.</source>
-<target>Não é possível determinar o nome do volume para %x.</target>
+<target>Execute a versão 64 bits do FreeFileSync para criar cópias de sombra neste sistema.</target>
<source>Volume name %x is not part of file path %y.</source>
<target>O nome do volume %x não faz parte do caminho do arquivo %y.</target>
@@ -490,6 +484,21 @@
<source>Source item %x not found</source>
<target>Item de origem %x não encontrado</target>
+<source>Cannot move file %x to %y.</source>
+<target>Não é possível mover o arquivo %x para %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>Pasta pai %x não existe.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>O nome %x já é usado por outro item.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Não é possível copiar o arquivo %x para %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Não é possível copiar o link simbólico %x para %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Criando uma Cópia de Sombra de Volume para %x...</target>
@@ -506,11 +515,14 @@
<target>Pasta de origem %x não encontrada.</target>
<source>Please enter a target folder for versioning.</source>
-<target>Insira uma pasta de destino para controle de versões.</target>
+<target>Insira uma pasta de destino para controle de versão.</target>
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Os seguintes itens possuem conflitos não resolvidos e não serão sincronizados:</target>
+<source>Folder pair:</source>
+<target>Par de pastas:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>As seguintes pastas são muito diferentes. Verifique se as pastas corretas estão selecionadas.</target>
@@ -530,13 +542,13 @@
<target>Para evitar conflitos, configure filtros de exclusão para que cada arquivo atualizado seja considerado por apenas uma pasta base.</target>
<source>Versioning folder:</source>
-<target>Pasta de controle de versões:</target>
+<target>Pasta de controle de versão:</target>
<source>Base folder:</source>
<target>Pasta base:</target>
<source>The versioning folder is contained in a base folder.</source>
-<target>A pasta de controle de versões está dentro de uma pasta base.</target>
+<target>A pasta de controle de versão está dentro de uma pasta base.</target>
<source>Synchronizing folder pair:</source>
<target>Sincronizando par de pastas:</target>
@@ -567,74 +579,77 @@ Atual: %y bytes
<source>Cannot write permissions of %x.</source>
<target>Não é possível escrever as permissões de %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Operação não suportada para tipos de pastas base diferentes.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>Não é possível mover o arquivo %x para %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Não é possível copiar o link simbólico %x para %y.</target>
-
-<source>Error Code %x</source>
-<target>Código do Erro %x.</target>
-
-<source>Failed to get information about server %x.</source>
-<target>Falha na obteção da informação sobre o servidor %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Não é possível abrir o diretório %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Não é possível criar o diretório %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>Operação não suportada entre dispositivos diferentes.</target>
<source>Cannot delete file %x.</source>
<target>Não é possível excluir o arquivo %x.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Não é possível excluir o link simbólico %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>Não é possível excluir o diretório %x.</target>
+<source>Error Code %x</source>
+<target>Código do Erro %x.</target>
+
<source>Cannot write modification time of %x.</source>
<target>Não é possível escrever a data de modificação de %x.</target>
+<source>Cannot create directory %x.</source>
+<target>Não é possível criar o diretório %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>Não é possível determinar o caminho final para %x.</target>
+<source>Operation not supported by device.</source>
+<target>Operação não suportada pelo dispositivo.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>Não é possível resolver o link simbólico %x.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>Não é possível mover %x para a Lixeira.</target>
-<source>Unable to access %x.</source>
-<target>Não foi possível acessar %x.</target>
-
<source>Authentication completed.</source>
<target>Autenticação concluída.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>Você pode fechar esta página agora e continuar com o FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>Autenticação falhou.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>Você pode fechar esta página agora e continuar com o FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>Não é possível encontrar %x.</target>
-<source>The server returned an error:</source>
-<target>O servidor retornou um erro:</target>
+<source>Please authorize access to user account %x.</source>
+<target>Por favor, autorize o acesso para a conta de usuário %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>Não é possível determinar o espaço livre em disco para %x.</target>
-<source>Cannot find %x.</source>
-<target>Não é possível encontrar %x.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Não foi possível desconectar de %x.</target>
+
+<source>Unable to access %x.</source>
+<target>Não foi possível acessar %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>Falha na obteção da informação sobre o servidor %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>Não é possível monitorar o diretório %x.</target>
<source>Cannot find device %x.</source>
<target>Não é possível encontrar o dispositivo %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>Tipo de item %x não é suportado:</target>
+<source>Cannot open directory %x.</source>
+<target>Não é possível abrir o diretório %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>Não é possível excluir o link simbólico %x.</target>
+<source>Unsupported item type.</source>
+<target>Tipo de item não suportado.</target>
<source>Incorrect command line:</source>
<target>Linha de comando incorreta:</target>
@@ -770,8 +785,8 @@ O comando é disparado se:
<source>&Restore</source>
<target>&Restaurar</target>
-<source>&Show error</source>
-<target>&Mostrar erro</target>
+<source>&Show error message</source>
+<target>&Mostrar mensagem de erro</target>
<source>&Quit</source>
<target>&Encerrar</target>
@@ -800,6 +815,9 @@ O comando é disparado se:
<source>Loading...</source>
<target>Carregando...</target>
+<source>Scanning...</source>
+<target>Examinando...</target>
+
<source>job name</source>
<target>nome da tarefa</target>
@@ -1028,12 +1046,12 @@ O comando é disparado se:
<source>View type:</source>
<target>Tipo de visualização:</target>
-<source>Save as default</source>
-<target>Salvar como padrão</target>
-
<source>Select view:</source>
<target>Selecionar visualização:</target>
+<source>Save as default</source>
+<target>Salvar como padrão</target>
+
<source>Statistics:</source>
<target>Estatísticas:</target>
@@ -1052,9 +1070,6 @@ O comando é disparado se:
<source>Arrange folder pair</source>
<target>Organizar par de pastas</target>
-<source>Folder pair:</source>
-<target>Par de pastas:</target>
-
<source>Main settings:</source>
<target>Configurações principais:</target>
@@ -1128,7 +1143,7 @@ O comando é disparado se:
<target>Máximo:</target>
<source>Time span:</source>
-<target>Intervalo de tempo:</target>
+<target>Período de tempo:</target>
<source>C&lear</source>
<target>&Limpar</target>
@@ -1157,7 +1172,7 @@ O comando é disparado se:
<target>&Permanente</target>
<source>&Versioning</source>
-<target>Controle de &versões</target>
+<target>Controle de &versão</target>
<source>Move files to a user-defined folder</source>
<target>Mover os arquivos para uma pasta definida pelo usuário</target>
@@ -1180,12 +1195,21 @@ O comando é disparado se:
<source>OK</source>
<target>OK</target>
-<source>Enter your login details:</source>
-<target>Entre com seus dados de login:</target>
-
<source>Connection type:</source>
<target>Tipo de conexão:</target>
+<source>Connected user accounts:</source>
+<target>Contas de usuário conectadas:</target>
+
+<source>&Add connection</source>
+<target>&Adicionar conexão</target>
+
+<source>&Disconnect</source>
+<target>&Desconectar</target>
+
+<source>Selected user account:</source>
+<target>Conta de usuário selecionada:</target>
+
<source>Server name or IP address:</source>
<target>Nome do servidor ou endereço IP:</target>
@@ -1234,15 +1258,9 @@ O comando é disparado se:
<source>Detect server limit</source>
<target>Detectar limite do servidor</target>
-<source>Select a directory on the server:</source>
-<target>Selecionar um diretório no servidor:</target>
-
<source>Select Folder</source>
<target>Selecionar Pasta</target>
-<source>Start synchronization now?</source>
-<target>Iniciar sincronização agora?</target>
-
<source>Variant:</source>
<target>Variante:</target>
@@ -1286,7 +1304,7 @@ O comando é disparado se:
<target>Interromper</target>
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
-<target>Criar um arquivo de tarefa em lotes para sincronização desatendida. Para iniciar, dê um clique duplo neste arquivo ou insira no agendador de tarefas: %x</target>
+<target>Cria um arquivo em lotes para sincronização desatendida. Para iniciar, dê um clique duplo neste arquivo ou insira no agendador de tarefas: %x</target>
<source>Progress dialog:</source>
<target>Caixa de diálogo de progresso:</target>
@@ -1294,9 +1312,6 @@ O comando é disparado se:
<source>Run minimized</source>
<target>Executar minimizado</target>
-<source>&Show error dialog</source>
-<target>&Mostrar caixa de diálogo de erro</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Mostrar pop-up em caso de erros ou avisos</target>
@@ -1340,7 +1355,7 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>Transferir permissões de arquivos e pastas.</target>
<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Mostrar todas as caixas de diálogo e as mensagens de aviso permanentemente ocultadas</target>
+<target>Mostrar todas as caixas de diálogo e as mensagens de aviso permanentemente ocultas</target>
<source>Default log path:</source>
<target>Caminho de log padrão:</target>
@@ -1400,7 +1415,7 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>Ativar online</target>
<source>2. Retrieve an offline activation key from the following URL:</source>
-<target>2. Recuperar uma chave de ativação off-line a partir da seguinte URL:</target>
+<target>2. Recuperar uma chave de ativação offline a partir da seguinte URL:</target>
<source>&Copy to clipboard</source>
<target>&Copiar para área de transferência</target>
@@ -1409,7 +1424,7 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>Entrar com chave de ativação:</target>
<source>Activate offline</source>
-<target>Ativar off-line</target>
+<target>Ativar offline</target>
<source>Highlight configurations that have not been run for more than the following number of days:</source>
<target>Realçar configurações que não foram executadas a mais do seguinte número de dias:</target>
@@ -1433,7 +1448,7 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>Opções</target>
<source>Select Time Span</source>
-<target>Selecionar Intervalo de Tempo</target>
+<target>Selecionar Período de Tempo</target>
<source>Highlight Configurations</source>
<target>Realçar Configurações</target>
@@ -1531,11 +1546,11 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>multiple selection</source>
<target>seleção múltipla</target>
-<source>Include via filter:</source>
-<target>Incluir via filtro:</target>
+<source>&Include via filter:</source>
+<target>&Incluir via filtro:</target>
-<source>Exclude via filter:</source>
-<target>Excluir via filtro:</target>
+<source>&Exclude via filter:</source>
+<target>&Excluir via filtro:</target>
<source>Include temporarily</source>
<target>Incluir temporariamente</target>
@@ -1543,11 +1558,14 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Exclude temporarily</source>
<target>Excluir temporariamente</target>
+<source>&Synchronize selection</source>
+<target>&Sincronizar seleção</target>
+
<source>&Copy to...</source>
<target>&Copiar para...</target>
<source>&Delete</source>
-<target>&Excluir</target>
+<target>&Apagar</target>
<source>Include all</source>
<target>Incluir todos</target>
@@ -1568,7 +1586,7 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>Grande</target>
<source>Select time span...</source>
-<target>Selecionar intervalo de tempo...</target>
+<target>Selecionar período de tempo...</target>
<source>Donation Edition</source>
<target>Edição do Doador</target>
@@ -1678,9 +1696,6 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Initializing...</source>
<target>Inicializando...</target>
-<source>Scanning...</source>
-<target>Examinando...</target>
-
<source>Comparing content...</source>
<target>Comparando conteúdo...</target>
@@ -1699,6 +1714,9 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Recommended range:</source>
<target>Intervalo recomendado:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>Você realmente quer desconectar da conta de usuário %x?</target>
+
<source>Password:</source>
<target>Senha:</target>
@@ -1706,7 +1724,7 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>Senha da chave:</target>
<source>Please enter a file path.</source>
-<target>Insira um caminho de arquivo.</target>
+<target>Por favor, insira um caminho de arquivo.</target>
<source>
<pluralform>Copy the following item to another folder?</pluralform>
@@ -1718,15 +1736,15 @@ Isto garante um estado consistente mesmo em caso de erro grave.
</target>
<source>Please enter a target folder.</source>
-<target>Insira uma pasta de destino.</target>
+<target>Por favor, insira uma pasta de destino.</target>
<source>
<pluralform>Do you really want to move the following item to the recycle bin?</pluralform>
<pluralform>Do you really want to move the following %x items to the recycle bin?</pluralform>
</source>
<target>
-<pluralform>Você realmente deseja mover o seguinte item para a Lixeira?</pluralform>
-<pluralform>Você realmente deseja mover os seguintes %x itens para a Lixeira?</pluralform>
+<pluralform>Você realmente deseja mover o seguinte item para a lixeira?</pluralform>
+<pluralform>Você realmente deseja mover os seguintes %x itens para a lixeira?</pluralform>
</target>
<source>Move</source>
@@ -1741,6 +1759,12 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<pluralform>Você realmente deseja excluir os seguintes %x itens?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>Começar a sincronizar a seleção?</target>
+
+<source>Start synchronization now?</source>
+<target>Iniciar sincronização agora?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Copiar DACL, SACL, Proprietário, Grupo</target>
@@ -1781,7 +1805,7 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>Identifica e propaga as alterações em ambos os lados. Arquivos e pastas excluídos e/ou movidos e conflitos são detectados automaticamente usando um banco de dados.</target>
<source>Create a mirror backup of the left folder by adapting the right folder to match.</source>
-<target>Cria uma cópia espelho da pasta da esquerda adaptando a pasta da direita para igualar.</target>
+<target>Cria uma cópia espelho da pasta da esquerda adaptando a pasta da direita para corresponder.</target>
<source>Copy new and updated files to the right folder.</source>
<target>Copia arquivos novos ou atualizados para a pasta da direita.</target>
@@ -1814,7 +1838,7 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>MB</target>
<source>Retain deleted and overwritten files in the recycle bin</source>
-<target>Manter arquivos excluídos e substituídos na Lixeira</target>
+<target>Manter arquivos excluídos e substituídos na lixeira</target>
<source>Delete and overwrite files permanently</source>
<target>Excluir e substituir arquivos permanentemente</target>
@@ -1826,16 +1850,16 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>Mover arquivos e substituir se existente</target>
<source>Time stamp</source>
-<target>Estampa de tempo</target>
+<target>Carimbo de data/hora</target>
<source>Move files into a time-stamped subfolder</source>
-<target>Mover arquivos para uma subpasta com estampa de tempo</target>
+<target>Mover arquivos para uma subpasta com carimbo de data/hora</target>
<source>File</source>
<target>Arquivo</target>
<source>Append a time stamp to each file name</source>
-<target>Colocar uma estampa de tempo para cada nome de arquivo</target>
+<target>Colocar um carimbo de data/hora para cada nome de arquivo</target>
<source>On completion:</source>
<target>Ao finalizar:</target>
@@ -1924,9 +1948,6 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Unable to register device notifications for %x.</source>
<target>Não foi possível registrar notificações para %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>Não é possível monitorar o diretório %x.</target>
-
<source>The file is locked by another process:</source>
<target>O arquivo está bloqueado por outro processo:</target>
@@ -1945,9 +1966,6 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>%x is not a regular directory name.</source>
<target>%x não é um nome de diretório regular.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Não é possível copiar o arquivo %x para %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Não é possível copiar os atributos de %x para %y.</target>
@@ -2048,10 +2066,10 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>Configuração do FreeFileSync</target>
<source>FreeFileSync Batch File</source>
-<target>Arquivo de tarefa em lotes do FreeFileSync</target>
+<target>Arquivo em Lotes do FreeFileSync</target>
<source>FreeFileSync Synchronization Database</source>
-<target>Banco de dados de sincronização do FreeFileSync</target>
+<target>Banco de Dados de Sincronização do FreeFileSync</target>
<source>RealTimeSync Configuration</source>
<target>Configuração do RealTimeSync</target>
diff --git a/FreeFileSync/Build/Languages/romanian.lng b/FreeFileSync/Build/Languages/romanian.lng
index 52a59d90..db5f3093 100755
--- a/FreeFileSync/Build/Languages/romanian.lng
+++ b/FreeFileSync/Build/Languages/romanian.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>A apărut o excepție</target>
-<source>A directory path is expected after %x.</source>
-<target>Este așteptată o cale de dosar după %x.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>O cale pentru dosarul stîng și cel drept e așteptată după %x.</target>
<source>Syntax error</source>
<target>Eroare de sintaxă</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>O cale pentru dosarul stîng și cel drept e așteptată după %x.</target>
-
<source>Cannot find file %x.</source>
<target>Nu pot găsi fila %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>Fila %x nu conține o configurație validă.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Numărul de dosare specificat pentru părțile stîngă și dreaptă este inegal.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Fila de configurare nu trebuie să conțină setări la nivelul perechii de dosare, cînd dosarele sînt setate prin linia de comandă.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Orice număr de perechi alternative de dosare pentru cel mult o filă de configurare.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>Deschide configurația selectată doar pentru editare, fără a o executa.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>Dosarele sînt create automat la nevoie.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>La căile următoare diferă caseta literelor (majuscule/minuscule). Folosește o singură formă de casetă pt. a evita duplicarea acceselor.</target>
+
<source>Scanning:</source>
<target>Scanez:</target>
@@ -427,9 +424,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Folosește versiunea pe 64-biți a FreeFileSync pentru a crea conservări (copii de rezervă) pe acest sistem.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>Nu pot determina numele volumului pentru %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>Numele volumului %x nu face parte din calea filei %y.</target>
@@ -491,7 +485,22 @@
<target>Actualizez atributele lui %x</target>
<source>Source item %x not found</source>
-<target>Itemul sursă %x n-a fost găsit</target>
+<target>Elementul sursă %x n-a fost găsit</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Nu pot muta fila %x în %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>Dosarul părinte %x nu există.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>Numele %x este deja utilizat de alt element.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Nu pot copia fila %x în %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Nu pot copia legătura simbolică %x în %y.</target>
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Creez o Conservare a Volumului [Volume Shadow Copy] pentru %x...</target>
@@ -514,6 +523,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Există conflicte nerezolvate la elementele listate mai jos, deci ele nu vor fi sincronizate:</target>
+<source>Folder pair:</source>
+<target>Perechea de Dosare:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>Dosarele următoare au diferențe semnificative. Asigură-te că ai selectat dosarele corecte pentru sincronizare.</target>
@@ -570,74 +582,77 @@ Actuală: %y baiți
<source>Cannot write permissions of %x.</source>
<target>Nu pot scrie permisiunile lui %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Operație nesuportată pentru tipuri diferite de dosare bază (rădăcină).</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>Nu pot muta fila %x în %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Nu pot copia legătura simbolică %x în %y.</target>
-
-<source>Error Code %x</source>
-<target>Cod de Eroare %x.</target>
-
-<source>Failed to get information about server %x.</source>
-<target>N-am putut obține informații despre serverul %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Nu pot deschide dosarul %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Nu pot crea dosarul %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>Operația nu-i suportată între dispozitive de stocare diferite.</target>
<source>Cannot delete file %x.</source>
<target>Nu pot șterge fila %x.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Nu pot șterge legătura simbolică %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>Nu pot șterge dosarul %x.</target>
+<source>Error Code %x</source>
+<target>Cod de Eroare %x.</target>
+
<source>Cannot write modification time of %x.</source>
<target>Nu pot scrie modificarea timpului pentru %x.</target>
+<source>Cannot create directory %x.</source>
+<target>Nu pot crea dosarul %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>Nu pot determina calea finală pentru %x.</target>
+<source>Operation not supported by device.</source>
+<target>Operația nu-i suportată de dispozitivul de stocare.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>Nu pot rezolva legătura simbolică %x.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>Nu pot muta %x în Reciclator.</target>
-<source>Unable to access %x.</source>
-<target>Nu pot accesa %x.</target>
-
<source>Authentication completed.</source>
<target>Autentificare realizată.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>Poți închide pagina asta acum și continua cu FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>Autentificare eșuată.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>Poți închide pagina asta acum și continua cu FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>Nu pot găsi %x.</target>
-<source>The server returned an error:</source>
-<target>Serverul a returnat o eroare:</target>
+<source>Please authorize access to user account %x.</source>
+<target>Autorizează accesul la contul de utilizator %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>Nu pot determina spațiul liber de stocare pentru %x.</target>
-<source>Cannot find %x.</source>
-<target>Nu pot găsi %x.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Nu pot face deconectarea de la %x.</target>
+
+<source>Unable to access %x.</source>
+<target>Nu pot accesa %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>N-am putut obține informații despre serverul %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>Nu pot monitoriza dosarul %x.</target>
<source>Cannot find device %x.</source>
<target>Nu pot găsi dispozitivul %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>Tipul de element %x nu e suportat:</target>
+<source>Cannot open directory %x.</source>
+<target>Nu pot deschide dosarul %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>Nu pot șterge legătura simbolică %x.</target>
+<source>Unsupported item type.</source>
+<target>Tip de element nesuportat.</target>
<source>Incorrect command line:</source>
<target>Linie de comandă incorectă:</target>
@@ -775,8 +790,8 @@ Comanda este declanșată dacă:
<source>&Restore</source>
<target>&Restaurează</target>
-<source>&Show error</source>
-<target>A&rată eroarea</target>
+<source>&Show error message</source>
+<target>A&rată mesajele de eroare</target>
<source>&Quit</source>
<target>&Ieși</target>
@@ -806,6 +821,9 @@ Comanda este declanșată dacă:
<source>Loading...</source>
<target>Deschid...</target>
+<source>Scanning...</source>
+<target>Scanez...</target>
+
<source>job name</source>
<target>numele sarcinii</target>
@@ -1035,12 +1053,12 @@ Comanda este declanșată dacă:
<source>View type:</source>
<target>Tipul Vederii:</target>
-<source>Save as default</source>
-<target>Salvează ca implicit</target>
-
<source>Select view:</source>
<target>Selectează Vederea:</target>
+<source>Save as default</source>
+<target>Salvează ca implicit</target>
+
<source>Statistics:</source>
<target>Statistici:</target>
@@ -1059,9 +1077,6 @@ Comanda este declanșată dacă:
<source>Arrange folder pair</source>
<target>Aranjează perechea de dosare</target>
-<source>Folder pair:</source>
-<target>Perechea de Dosare:</target>
-
<source>Main settings:</source>
<target>Setările Principale:</target>
@@ -1187,12 +1202,21 @@ Comanda este declanșată dacă:
<source>OK</source>
<target>OK</target>
-<source>Enter your login details:</source>
-<target>Introdu detaliile de logare:</target>
-
<source>Connection type:</source>
<target>Tip de Conexiune:</target>
+<source>Connected user accounts:</source>
+<target>Conturi de utilizator conectate:</target>
+
+<source>&Add connection</source>
+<target>&Adaugă Conexiune</target>
+
+<source>&Disconnect</source>
+<target>&Deconectează</target>
+
+<source>Selected user account:</source>
+<target>Contul de utilizator selectat:</target>
+
<source>Server name or IP address:</source>
<target>Numele Serverului sau Adresa IP:</target>
@@ -1241,15 +1265,9 @@ Comanda este declanșată dacă:
<source>Detect server limit</source>
<target>Detectează limita serverului</target>
-<source>Select a directory on the server:</source>
-<target>Selectează un dosar de pe server:</target>
-
<source>Select Folder</source>
<target>Selectează Dosarul</target>
-<source>Start synchronization now?</source>
-<target>Pornesc sincronizarea acum?</target>
-
<source>Variant:</source>
<target>Variantă:</target>
@@ -1301,9 +1319,6 @@ Comanda este declanșată dacă:
<source>Run minimized</source>
<target>Rulează minimizat</target>
-<source>&Show error dialog</source>
-<target>Arată dialo&gul erorilor</target>
-
<source>Show pop-up on errors or warnings</source>
<target>În caz de erori sau avertizări este arătată o fereastră popîc [popup]</target>
@@ -1542,11 +1557,11 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>multiple selection</source>
<target>selectare multiplă</target>
-<source>Include via filter:</source>
-<target>Include prin Filtrul:</target>
+<source>&Include via filter:</source>
+<target>&Include prin filtru:</target>
-<source>Exclude via filter:</source>
-<target>Exclude prin Filtrul:</target>
+<source>&Exclude via filter:</source>
+<target>&Exclude prin filtru:</target>
<source>Include temporarily</source>
<target>Include Temporar</target>
@@ -1554,6 +1569,9 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Exclude temporarily</source>
<target>Exclude Temporar</target>
+<source>&Synchronize selection</source>
+<target>&Sincronizează Selecția</target>
+
<source>&Copy to...</source>
<target>&Copiază în...</target>
@@ -1689,9 +1707,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Initializing...</source>
<target>Inițializez...</target>
-<source>Scanning...</source>
-<target>Scanez...</target>
-
<source>Comparing content...</source>
<target>Compar conținutul...</target>
@@ -1710,6 +1725,9 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Recommended range:</source>
<target>Interval recomandat:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>Sigur vrei să te deconectezi de la contul de utilizator %x?</target>
+
<source>Password:</source>
<target>Parolă:</target>
@@ -1755,6 +1773,12 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<pluralform>Sigur vrei să ștergi definitiv următoarele %x de elemente?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>Pornești sinconizarea selecției?</target>
+
+<source>Start synchronization now?</source>
+<target>Pornesc sincronizarea acum?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Copiază permisiunile DACL, SACL, Proprietar, Grup</target>
@@ -1938,9 +1962,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Unable to register device notifications for %x.</source>
<target>Nu pot înregistra notificările dispozitivului pentru %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>Nu pot monitoriza dosarul %x.</target>
-
<source>The file is locked by another process:</source>
<target>Fila este zăvorîtă [locked] de alt proces:</target>
@@ -1959,9 +1980,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>%x is not a regular directory name.</source>
<target>%x nu este un nume regulamentar de dosar.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Nu pot copia fila %x în %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Nu pot copia atributele de pe %x pe %y.</target>
diff --git a/FreeFileSync/Build/Languages/russian.lng b/FreeFileSync/Build/Languages/russian.lng
index d6777279..7bc51a60 100755
--- a/FreeFileSync/Build/Languages/russian.lng
+++ b/FreeFileSync/Build/Languages/russian.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>Исключение произошло</target>
-<source>A directory path is expected after %x.</source>
-<target>Ожидается путь папки после %x.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Левый и правый пути папок ожидаются после %x.</target>
<source>Syntax error</source>
<target>Синтаксическая ошибка</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>Левый и правый пути папок ожидаются после %x.</target>
-
<source>Cannot find file %x.</source>
<target>Невозможно найти файл %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>Файл %x не содержит действительной конфигурации.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Указано неравное число папок слева и справа.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Конфигурационный файл не должен содержать настройки на уровне пар папок, когда папки задаются с помощью командной строки.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Любое количество альтернативных пар папок для не более одного конфигурационного файла.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>Открыть выбранную конфигурацию только для редактирования, не выполняя ее.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>Папки создаются автоматически, когда это необходимо.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>У следующих путей папок различаются регистры. Пожалуйста, используйте одинаковый вид, чтобы избежать дублирования.</target>
+
<source>Scanning:</source>
<target>Сканирую:</target>
@@ -427,9 +424,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Пожалуйста, запустите 64-битную версию FreeFileSync, чтобы создать теневые копии на этой системе.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>Невозможно определить имя тома для %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>Имя тома %x не является частью имени файла %y.</target>
@@ -493,6 +487,21 @@
<source>Source item %x not found</source>
<target>Исходный элемент %x не найден</target>
+<source>Cannot move file %x to %y.</source>
+<target>Невозможно перенести файл %x в %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>Родительская папка %x не существует.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>Имя %x уже используется другим элементом.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Невозможно скопировать файл %x в %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Невозможно скопировать символьную ссылку %x в %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Создание Тома Теневого Копирования для %x...</target>
@@ -514,6 +523,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Следующие элементы имеют неурегулированные конфликты и не будут синхронизированы:</target>
+<source>Folder pair:</source>
+<target>Пара папок:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>Следующие папки значительно отличаются. Пожалуйста, проверьте, что выбраны правильные папки для синхронизации.</target>
@@ -570,74 +582,77 @@ Actual: %y bytes
<source>Cannot write permissions of %x.</source>
<target>Невозможно записать права доступа %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Операция не поддерживается для разных базовых типов папок.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>Невозможно перенести файл %x в %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Невозможно скопировать символьную ссылку %x в %y.</target>
-
-<source>Error Code %x</source>
-<target>Код ошибки %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>Не удалось получить информацию о сервере %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Невозможно открыть папку %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Невозможно создать папку %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>Операция не поддерживается между различными устройствами.</target>
<source>Cannot delete file %x.</source>
<target>Невозможно удалить файл %x.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Невозможно удалить символьную ссылку %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>Невозможно удалить папку %x.</target>
+<source>Error Code %x</source>
+<target>Код ошибки %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>Невозможно записать время изменения файла %x.</target>
+<source>Cannot create directory %x.</source>
+<target>Невозможно создать папку %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>Невозможно определить конечный путь для %x.</target>
+<source>Operation not supported by device.</source>
+<target>Операция не поддерживается устройством.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>Невозможно разрешить символьную ссылку %x.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>Невозможно переместить %x в "Корзину".</target>
-<source>Unable to access %x.</source>
-<target>Невозможно получить доступ к %x.</target>
-
<source>Authentication completed.</source>
<target>Аутентификация завершена.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>Вы можете закрыть эту страницу сейчас и продолжить с FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>Ошибка аутентификации.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>Вы можете закрыть эту страницу сейчас и продолжить с FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>Невозможно найти %x.</target>
-<source>The server returned an error:</source>
-<target>Сервер возвратил ошибку:</target>
+<source>Please authorize access to user account %x.</source>
+<target>Пожалуйста, авторизуйте доступ к учетной записи пользователя %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>Невозможно определить свободное место на диске для %x.</target>
-<source>Cannot find %x.</source>
-<target>Невозможно найти %x.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Невозможно отключиться от %x.</target>
+
+<source>Unable to access %x.</source>
+<target>Невозможно получить доступ к %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>Не удалось получить информацию о сервере %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>Невозможно отследить папку %x.</target>
<source>Cannot find device %x.</source>
<target>Невозможно найти устройство %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>Тип элемента %x не поддерживается:</target>
+<source>Cannot open directory %x.</source>
+<target>Невозможно открыть папку %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>Невозможно удалить символьную ссылку %x.</target>
+<source>Unsupported item type.</source>
+<target>Неподдерживаемый тип элемента.</target>
<source>Incorrect command line:</source>
<target>Неверная командная строка:</target>
@@ -775,8 +790,8 @@ The command is triggered if:
<source>&Restore</source>
<target>&Восстановить</target>
-<source>&Show error</source>
-<target>&Показать ошибку</target>
+<source>&Show error message</source>
+<target>&Показать сообщение об ошибке</target>
<source>&Quit</source>
<target>&Выход</target>
@@ -806,6 +821,9 @@ The command is triggered if:
<source>Loading...</source>
<target>Загрузка...</target>
+<source>Scanning...</source>
+<target>Сканирование...</target>
+
<source>job name</source>
<target>название</target>
@@ -1035,12 +1053,12 @@ The command is triggered if:
<source>View type:</source>
<target>Тип просмотра:</target>
-<source>Save as default</source>
-<target>Сохранить по умолчанию</target>
-
<source>Select view:</source>
<target>Выберите отображение:</target>
+<source>Save as default</source>
+<target>Сохранить по умолчанию</target>
+
<source>Statistics:</source>
<target>Статистика:</target>
@@ -1059,9 +1077,6 @@ The command is triggered if:
<source>Arrange folder pair</source>
<target>Упорядочить пару папок</target>
-<source>Folder pair:</source>
-<target>Пара папок:</target>
-
<source>Main settings:</source>
<target>Основные настройки:</target>
@@ -1187,12 +1202,21 @@ The command is triggered if:
<source>OK</source>
<target>OK</target>
-<source>Enter your login details:</source>
-<target>Введите свои данные для входа:</target>
-
<source>Connection type:</source>
<target>Тип соединения:</target>
+<source>Connected user accounts:</source>
+<target>Подключенные учетные записи пользователей:</target>
+
+<source>&Add connection</source>
+<target>&Добавить соединение</target>
+
+<source>&Disconnect</source>
+<target>&Отключить</target>
+
+<source>Selected user account:</source>
+<target>Выбранная учетная запись пользователя:</target>
+
<source>Server name or IP address:</source>
<target>Имя сервера или IP адрес:</target>
@@ -1241,15 +1265,9 @@ The command is triggered if:
<source>Detect server limit</source>
<target>Выявить лимит сервера</target>
-<source>Select a directory on the server:</source>
-<target>Выберите папку на сервере:</target>
-
<source>Select Folder</source>
<target>Выберите папку</target>
-<source>Start synchronization now?</source>
-<target>Начать синхронизацию сейчас?</target>
-
<source>Variant:</source>
<target>Вариант:</target>
@@ -1301,9 +1319,6 @@ The command is triggered if:
<source>Run minimized</source>
<target>Запустить свернутым</target>
-<source>&Show error dialog</source>
-<target>&Показать окно ошибки</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Показывать всплывающие окна при ошибках и предупреждениях</target>
@@ -1542,11 +1557,11 @@ This guarantees a consistent state even in case of a serious error.
<source>multiple selection</source>
<target>групповое выделение</target>
-<source>Include via filter:</source>
-<target>Включить с помощью фильтра:</target>
+<source>&Include via filter:</source>
+<target>&Включить через фильтр:</target>
-<source>Exclude via filter:</source>
-<target>Исключить с помощью фильтра:</target>
+<source>&Exclude via filter:</source>
+<target>&Исключить через фильтр:</target>
<source>Include temporarily</source>
<target>Временно включить</target>
@@ -1554,6 +1569,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Exclude temporarily</source>
<target>Временно исключить</target>
+<source>&Synchronize selection</source>
+<target>&Синхронизировать выделенное</target>
+
<source>&Copy to...</source>
<target>&Копировать в...</target>
@@ -1689,9 +1707,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Initializing...</source>
<target>Инициализация...</target>
-<source>Scanning...</source>
-<target>Сканирование...</target>
-
<source>Comparing content...</source>
<target>Сравнение содержания...</target>
@@ -1710,6 +1725,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Recommended range:</source>
<target>Рекомендуемый диапазон:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>Вы действительно хотите отключиться от учетной записи пользователя %x?</target>
+
<source>Password:</source>
<target>Пароль:</target>
@@ -1755,6 +1773,12 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>Вы точно хотите удалить следующие %x элементов?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>Начать синхронизацию выделенного?</target>
+
+<source>Start synchronization now?</source>
+<target>Начать синхронизацию сейчас?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Копировать DACL, SACL, владелец, группа</target>
@@ -1938,9 +1962,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Unable to register device notifications for %x.</source>
<target>Не удалось зарегистрировать уведомления устройств для %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>Невозможно отследить папку %x.</target>
-
<source>The file is locked by another process:</source>
<target>Файл заблокирован другим процессом:</target>
@@ -1959,9 +1980,6 @@ This guarantees a consistent state even in case of a serious error.
<source>%x is not a regular directory name.</source>
<target>%x не является обычным именем папки.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Невозможно скопировать файл %x в %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Невозможно скопировать атрибуты от %x к %y.</target>
diff --git a/FreeFileSync/Build/Languages/slovenian.lng b/FreeFileSync/Build/Languages/slovenian.lng
index f013812b..25bd57e6 100755
--- a/FreeFileSync/Build/Languages/slovenian.lng
+++ b/FreeFileSync/Build/Languages/slovenian.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>Prišlo je do izjeme</target>
-<source>A directory path is expected after %x.</source>
-<target>Pot do imenika se pričakuje po %x.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Levo in desno pot imenika se pričakuje po %x.</target>
<source>Syntax error</source>
<target>Sintaktična napaka</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>Levo in desno pot imenika se pričakuje po %x.</target>
-
<source>Cannot find file %x.</source>
<target>Ne najdem datoteke %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>Datoteka %x ne vsebuje veljavnih nastavitev.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Vnešeno je neenako število levih in desnih imenikov.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Konfiguracijska datoteka ne sme vsebovati nastavitev na ravni imeniških parov, ko so imeniki nastavljeni preko ukazne vrstice.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Poljubno število alternativnih parov imenikov za največ eno nastavitveno datoteko.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>Odprite izbrano nastavitev samo za urejanje, ne da bi jo izvedli.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>Mape se samodejno ustvarijo po potrebi.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>Naslednje poti map se razlikujejo. Uporabite en obrazec, da se izognete podvojenim dostopom.</target>
+
<source>Scanning:</source>
<target>Skeniranje:</target>
@@ -430,9 +427,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Prosimo, zaženite 64-bitno različico FreeFileSync za ustvarjanje senčnih kopij v tem sistemu.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>Ne morem določiti ime nosilca za %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>Ime nosilca %x ni del poti datoteke %y.</target>
@@ -496,6 +490,21 @@
<source>Source item %x not found</source>
<target>Izvorna postavka %x ni bila najdena</target>
+<source>Cannot move file %x to %y.</source>
+<target>Ne morem premakniti datoteko %x v %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>Nadrejena mapa %x ne obstaja.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>Ime %x že uporablja druga postavka.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Ne morem kopirati datoteke %x v %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Ne morem kopirati simbolične povezave %x v %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Ustvarjam Volume Shadow Copy za %x...</target>
@@ -517,6 +526,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Naslednje postavke imajo nerešene konflikte in ne bodo sinhronizirane:</target>
+<source>Folder pair:</source>
+<target>Par map:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>Naslednje mape so bistveno različne. Prosimo preverite, ali so izbrane pravilne mape za sinhroniziranje.</target>
@@ -573,74 +585,77 @@ Dejansko: %y bajtov
<source>Cannot write permissions of %x.</source>
<target>Ne morem zapisati dovoljenj za %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Operacija ni podprta za različne vrste osnovnih map.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>Ne morem premakniti datoteko %x v %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Ne morem kopirati simbolične povezave %x v %y.</target>
-
-<source>Error Code %x</source>
-<target>Napačna koda %x.</target>
-
-<source>Failed to get information about server %x.</source>
-<target>Ne morem pridobiti informacije o strežniku %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Ne morem odpreti imenika %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Ne morem ustvariti imenika %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>Operacija med različnimi napravami ni podprta.</target>
<source>Cannot delete file %x.</source>
<target>Ne morem izbrisati datoteke %x.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Ne morem izbrisati simbolične povezave %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>Ne morem izbrisati imenika %x.</target>
+<source>Error Code %x</source>
+<target>Napačna koda %x.</target>
+
<source>Cannot write modification time of %x.</source>
<target>Ne morem zapisati časa spremembe od %x.</target>
+<source>Cannot create directory %x.</source>
+<target>Ne morem ustvariti imenika %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>Ne morem določiti končne poti za %x.</target>
+<source>Operation not supported by device.</source>
+<target>Operacija z napravo ni podprta.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>Ne morem razrešiti simbolične povezave %x.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>Ne morem premakniti %x v koš.</target>
-<source>Unable to access %x.</source>
-<target>Ne morem dostopati do %x.</target>
-
<source>Authentication completed.</source>
<target>Preverjanje pristnosti končano.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>To stran lahko zdaj zaprete in nadaljujete z FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>Preverjanje pristnosti ni uspelo.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>To stran lahko zdaj zaprete in nadaljujete z FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>Ne najdem %x.</target>
-<source>The server returned an error:</source>
-<target>Strežnik je vrnil napako:</target>
+<source>Please authorize access to user account %x.</source>
+<target>Odobrite dostop do uporabniškega računa %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>Ne morem določiti prostega prostora na disku za %x.</target>
-<source>Cannot find %x.</source>
-<target>Ne najdem %x.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Povezave z %x ni mogoče prekiniti.</target>
+
+<source>Unable to access %x.</source>
+<target>Ne morem dostopati do %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>Ne morem pridobiti informacije o strežniku %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>Ne morem nadzirati imenika %x.</target>
<source>Cannot find device %x.</source>
<target>Ne najdem naprave %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>Vrsta postavke %x ni podprta:</target>
+<source>Cannot open directory %x.</source>
+<target>Ne morem odpreti imenika %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>Ne morem izbrisati simbolične povezave %x.</target>
+<source>Unsupported item type.</source>
+<target>Nepodprta vrsta postavke.</target>
<source>Incorrect command line:</source>
<target>Napačna ukazna vrstica:</target>
@@ -780,8 +795,8 @@ Ukaz se sproži če:
<source>&Restore</source>
<target>&Obnovi</target>
-<source>&Show error</source>
-<target>&Pokaži napako</target>
+<source>&Show error message</source>
+<target>&Prikaži sporočilo o napaki</target>
<source>&Quit</source>
<target>&Zapri</target>
@@ -812,6 +827,9 @@ Ukaz se sproži če:
<source>Loading...</source>
<target>Nalagam...</target>
+<source>Scanning...</source>
+<target>Skeniram...</target>
+
<source>job name</source>
<target>naziv opravila</target>
@@ -1042,12 +1060,12 @@ Ukaz se sproži če:
<source>View type:</source>
<target>Vrsta prikaza:</target>
-<source>Save as default</source>
-<target>Shrani kot privzeto</target>
-
<source>Select view:</source>
<target>Izberi prikaz:</target>
+<source>Save as default</source>
+<target>Shrani kot privzeto</target>
+
<source>Statistics:</source>
<target>Statistika:</target>
@@ -1066,9 +1084,6 @@ Ukaz se sproži če:
<source>Arrange folder pair</source>
<target>Uredi pare map</target>
-<source>Folder pair:</source>
-<target>Par map:</target>
-
<source>Main settings:</source>
<target>Glavne nastavitve:</target>
@@ -1194,12 +1209,21 @@ Ukaz se sproži če:
<source>OK</source>
<target>V redu</target>
-<source>Enter your login details:</source>
-<target>Vnestite podatke za prijavo:</target>
-
<source>Connection type:</source>
<target>Vrsta povezave:</target>
+<source>Connected user accounts:</source>
+<target>Povezani uporabniški računi:</target>
+
+<source>&Add connection</source>
+<target>&Dodaj povezavo</target>
+
+<source>&Disconnect</source>
+<target>&Prekini</target>
+
+<source>Selected user account:</source>
+<target>Izbrani uporabniški račun:</target>
+
<source>Server name or IP address:</source>
<target>Ime strežnika ali naslov IP:</target>
@@ -1248,15 +1272,9 @@ Ukaz se sproži če:
<source>Detect server limit</source>
<target>Zaznaj omejitve strežnika</target>
-<source>Select a directory on the server:</source>
-<target>Izberite imenik na strežniku:</target>
-
<source>Select Folder</source>
<target>Izberite mapo</target>
-<source>Start synchronization now?</source>
-<target>Zaženem sinhronizacijo zdaj?</target>
-
<source>Variant:</source>
<target>Varianta:</target>
@@ -1308,9 +1326,6 @@ Ukaz se sproži če:
<source>Run minimized</source>
<target>Zaženi minimirano</target>
-<source>&Show error dialog</source>
-<target>&Prikaži pogovorno okno napak</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Pokaži pojavna okna napak ali opozoril</target>
@@ -1553,11 +1568,11 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>multiple selection</source>
<target>večkratni izbor</target>
-<source>Include via filter:</source>
-<target>Vključi preko filtra:</target>
+<source>&Include via filter:</source>
+<target>&Vključi preko filtra:</target>
-<source>Exclude via filter:</source>
-<target>Izključi preko filtra:</target>
+<source>&Exclude via filter:</source>
+<target>&Izključi preko filtra:</target>
<source>Include temporarily</source>
<target>Vključi začasno</target>
@@ -1565,6 +1580,9 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Exclude temporarily</source>
<target>Izključi začasno</target>
+<source>&Synchronize selection</source>
+<target>&Sinhroniziraj izbiro</target>
+
<source>&Copy to...</source>
<target>&Kopiraj v...</target>
@@ -1700,9 +1718,6 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Initializing...</source>
<target>Inicializiram...</target>
-<source>Scanning...</source>
-<target>Skeniram...</target>
-
<source>Comparing content...</source>
<target>Primerjam vsebino...</target>
@@ -1721,6 +1736,9 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Recommended range:</source>
<target>Priporočeni obseg:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>Ali res želite prekiniti povezavo z uporabniškim računom %x?</target>
+
<source>Password:</source>
<target>Geslo:</target>
@@ -1769,6 +1787,12 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<pluralform>Ali res želite izbrisati sledečih %x postavk?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>Začnem sinhronizirati izbiro?</target>
+
+<source>Start synchronization now?</source>
+<target>Začnem sinhronizacijo zdaj?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Kopiraj DACL, SACL, lastnik, skupina</target>
@@ -1952,9 +1976,6 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Unable to register device notifications for %x.</source>
<target>Ne morem registrirati obvestil naprave za %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>Ne morem nadzirati imenika %x.</target>
-
<source>The file is locked by another process:</source>
<target>Datoteko je zaklenil drug proces:</target>
@@ -1973,9 +1994,6 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>%x is not a regular directory name.</source>
<target>%x ni pravilno ime imenika.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Ne morem kopirati datoteke %x v %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Ne morem kopirati atributov iz %x v %y.</target>
diff --git a/FreeFileSync/Build/Languages/spanish.lng b/FreeFileSync/Build/Languages/spanish.lng
index 0bb0b241..cf756088 100755
--- a/FreeFileSync/Build/Languages/spanish.lng
+++ b/FreeFileSync/Build/Languages/spanish.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>Ha ocurrido una excepción</target>
-<source>A directory path is expected after %x.</source>
-<target>Se esperaba una ruta de directorio después de %x.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Se esperan dos rutas de directorio izquierdo y derecho después de %x.</target>
<source>Syntax error</source>
<target>Error de sintaxis</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>Se esperan dos rutas de directorio izquierdo y derecho después de %x.</target>
-
<source>Cannot find file %x.</source>
<target>No se encuentra el archivo %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>El archivo %x no contiene una configuración válida.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Desigualdad en el número de directorios especificados a izquierda y derecha.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>El archivo de configuración no debe incluir parámetros al nivel de un par de directorios cuando éstos se especifican desde la línea de comandos.</target>
@@ -106,8 +100,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Cualquier número de pares de directorios alternativos para un archivo de configuración como máximo.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
-<target>Abrir la configuración seleccionada para modificación sin ejecutarla.</target>
+<source>Open the selected configuration for editing only, without executing it.</source>
+<target>Abrir la configuración seleccionada sólo para modificación, sin ejecutarla.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
<target>Ruta a un archivo alternativo GlobalSettings.xml.</target>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>Las carpetas son creadas automáticamente si es necesario.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>Las rutas de carpeta difieren por mayúsculas y minúsculas. Utilice un mismo formato para evitar accesos duplicados.</target>
+
<source>Scanning:</source>
<target>Escanear:</target>
@@ -424,9 +421,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Por favor, use la versión de 64 bits de FreeFileSync para instantáneas en el sistema.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>No se puede determinar nombre del volumen de %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>El nombre de volumen %x no es parte de la ruta de archivo %y.</target>
@@ -490,6 +484,21 @@
<source>Source item %x not found</source>
<target>No se encontró el archivo de origen %x</target>
+<source>Cannot move file %x to %y.</source>
+<target>No se puede mover el archivo %x a %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>La carpeta principal %x no existe.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>El nombre %x es utilizado por otro elemento.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>No se puede copiar el archivo %x a %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>No se puede copiar el vínculo simbólico %x a %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Creando una Instantánea de volumen para %x...</target>
@@ -511,6 +520,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Los siguientes elementos tienen conflictos sin resolver y no serán sincronizados:</target>
+<source>Folder pair:</source>
+<target>Par de carpetas:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>Las carpetas siguientes presentan diferencias significativas. Asegúrese de seleccionar las carpetas correctas para su sincronización.</target>
@@ -567,74 +579,77 @@ Reales: %y bytes
<source>Cannot write permissions of %x.</source>
<target>No se pueden escribir los permisos de %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>No se admite esta operación para tipos de carpetas base diferentes.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>No se puede mover el archivo %x a %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>No se puede copiar el vínculo simbólico %x a %y.</target>
-
-<source>Error Code %x</source>
-<target>Código de error %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>Fallo al obtener información del servidor %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>No se puede abrir el directorio %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>No se puede crear el directorio %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>No se admite esta operación entre dispositivos diferentes.</target>
<source>Cannot delete file %x.</source>
<target>No se puede eliminar el archivo %x.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>No se puede eliminar el vínculo simbólico %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>No se puede eliminar el directorio %x.</target>
+<source>Error Code %x</source>
+<target>Código de error %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>No se puede escribir el tiempo de modificación de %x.</target>
+<source>Cannot create directory %x.</source>
+<target>No se puede crear el directorio %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>No se puede determinar la ruta final de %x.</target>
+<source>Operation not supported by device.</source>
+<target>El dispositivo no admite esta operación.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>No se puede resolver el vínculo simbólico %x.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>No es posible mover %x a la papelera de reciclaje.</target>
-<source>Unable to access %x.</source>
-<target>No se puede acceder a %x.</target>
-
<source>Authentication completed.</source>
<target>Autenticación completada.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>Puede cerrar esta página y continuar con FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>Fallo de autenticación.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>Puede cerrar esta página y continuar con FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>No se encuentra %x.</target>
-<source>The server returned an error:</source>
-<target>El servidor devolvió un error:</target>
+<source>Please authorize access to user account %x.</source>
+<target>Autorice el acceso a la cuenta de usuario %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>No se puede determinar el espacio libre en disco para %x.</target>
-<source>Cannot find %x.</source>
-<target>No se encuentra %x.</target>
+<source>Unable to disconnect from %x.</source>
+<target>No se puede desconectar de %x.</target>
+
+<source>Unable to access %x.</source>
+<target>No se puede acceder a %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>Fallo al obtener información del servidor %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>No se puede monitorizar el directorio %x.</target>
<source>Cannot find device %x.</source>
<target>No se encuentra el dispositivo %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>El tipo de objeto %x no esta soportado:</target>
+<source>Cannot open directory %x.</source>
+<target>No se puede abrir el directorio %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>No se puede eliminar el vínculo simbólico %x.</target>
+<source>Unsupported item type.</source>
+<target>Tipo de elemento no admitido.</target>
<source>Incorrect command line:</source>
<target>Línea de comandos incorrecta:</target>
@@ -770,8 +785,8 @@ El comando es disparado si:
<source>&Restore</source>
<target>&Restaurar</target>
-<source>&Show error</source>
-<target>Mo&strar error</target>
+<source>&Show error message</source>
+<target>Mo&strar mensaje de error</target>
<source>&Quit</source>
<target>&Salir</target>
@@ -800,6 +815,9 @@ El comando es disparado si:
<source>Loading...</source>
<target>Cargando...</target>
+<source>Scanning...</source>
+<target>Escaneando...</target>
+
<source>job name</source>
<target>nombre de tarea</target>
@@ -1028,12 +1046,12 @@ El comando es disparado si:
<source>View type:</source>
<target>Ver tipo:</target>
-<source>Save as default</source>
-<target>Guardar como predeterminado</target>
-
<source>Select view:</source>
<target>Seleccionar vista:</target>
+<source>Save as default</source>
+<target>Guardar como predeterminado</target>
+
<source>Statistics:</source>
<target>Estadísticas:</target>
@@ -1052,9 +1070,6 @@ El comando es disparado si:
<source>Arrange folder pair</source>
<target>Reorganizar pares de carpetas</target>
-<source>Folder pair:</source>
-<target>Par de carpetas:</target>
-
<source>Main settings:</source>
<target>Configuración principal:</target>
@@ -1086,7 +1101,7 @@ El comando es disparado si:
<target>Ejemplo:</target>
<source>Handle daylight saving time</source>
-<target>Respetar el horario de verano</target>
+<target>Reflejar el horario de verano</target>
<source>Ignore errors</source>
<target>Ignorar errores</target>
@@ -1180,12 +1195,21 @@ El comando es disparado si:
<source>OK</source>
<target>OK</target>
-<source>Enter your login details:</source>
-<target>Escriba sus datos de conexión:</target>
-
<source>Connection type:</source>
<target>Tipo de conexión:</target>
+<source>Connected user accounts:</source>
+<target>Cuentas de usuario conectadas:</target>
+
+<source>&Add connection</source>
+<target>&Agregar conexión</target>
+
+<source>&Disconnect</source>
+<target>&Desconectar</target>
+
+<source>Selected user account:</source>
+<target>Cuenta de usuario seleccionada:</target>
+
<source>Server name or IP address:</source>
<target>Nombre o dirección IP del servidor:</target>
@@ -1223,7 +1247,7 @@ El comando es disparado si:
<target>Mo&strar constraseña</target>
<source>Directory on server:</source>
-<target>Directorio del servidor:</target>
+<target>Directorio en el servidor:</target>
<source>Access timeout (in seconds):</source>
<target>Tiempo de espera en acceso (segundos):</target>
@@ -1234,15 +1258,9 @@ El comando es disparado si:
<source>Detect server limit</source>
<target>Detectar el límite del servidor</target>
-<source>Select a directory on the server:</source>
-<target>Seleccione un directorio en el servidor:</target>
-
<source>Select Folder</source>
<target>Seleccionar carpeta</target>
-<source>Start synchronization now?</source>
-<target>¿Iniciar la sincronización ahora?</target>
-
<source>Variant:</source>
<target>Variante:</target>
@@ -1294,9 +1312,6 @@ El comando es disparado si:
<source>Run minimized</source>
<target>Ejecutar minimizado</target>
-<source>&Show error dialog</source>
-<target>Mo&strar diálogo de error</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Mostrar ventana emergente de errores o avisos</target>
@@ -1526,16 +1541,16 @@ Esto garantiza un estado coherente incluso en caso de error grave.
</target>
<source>Set direction:</source>
-<target>Indicar dirección:</target>
+<target>Usar dirección:</target>
<source>multiple selection</source>
<target>selección múltiple</target>
-<source>Include via filter:</source>
-<target>Incluir a través del filtro:</target>
+<source>&Include via filter:</source>
+<target>&Incluir a través del filtro:</target>
-<source>Exclude via filter:</source>
-<target>Excluir a través del filtro:</target>
+<source>&Exclude via filter:</source>
+<target>&Excluir a través del filtro:</target>
<source>Include temporarily</source>
<target>Incluir temporalmente</target>
@@ -1543,6 +1558,9 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Exclude temporarily</source>
<target>Excluir temporalmente</target>
+<source>&Synchronize selection</source>
+<target>&Sincronizar la selección</target>
+
<source>&Copy to...</source>
<target>&Copiar hacia...</target>
@@ -1678,9 +1696,6 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Initializing...</source>
<target>Inicializando...</target>
-<source>Scanning...</source>
-<target>Escaneando...</target>
-
<source>Comparing content...</source>
<target>Comparando contenido...</target>
@@ -1699,6 +1714,9 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Recommended range:</source>
<target>Rango recomendado:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>¿Realmente desea desconectar de la cuenta de usuario %x?</target>
+
<source>Password:</source>
<target>Contraseña:</target>
@@ -1741,6 +1759,12 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<pluralform>¿Realmente desea eliminar estos %x elementos?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>¿Iniciar la sincronización de la selección?</target>
+
+<source>Start synchronization now?</source>
+<target>¿Iniciar la sincronización ahora?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Copiar permisos DACL, SACL, Owner, Group</target>
@@ -1924,9 +1948,6 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Unable to register device notifications for %x.</source>
<target>No es posible registrar las notificaciones de dispositivo para %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>No se puede monitorizar el directorio %x.</target>
-
<source>The file is locked by another process:</source>
<target>El archivo está bloqueado por otro proceso:</target>
@@ -1945,9 +1966,6 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>%x is not a regular directory name.</source>
<target>%x no es una nombre de directorio autorizado.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>No se puede copiar el archivo %x a %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>No se puedem copiar los atributos desde %x hacia %y.</target>
diff --git a/FreeFileSync/Build/Languages/swedish.lng b/FreeFileSync/Build/Languages/swedish.lng
index 91965af7..88752d22 100755
--- a/FreeFileSync/Build/Languages/swedish.lng
+++ b/FreeFileSync/Build/Languages/swedish.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>Ett undantag inträffade</target>
-<source>A directory path is expected after %x.</source>
-<target>En sökväg förväntas efter %x.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>En vänster och en höger mappsökväg förväntas efter %x.</target>
<source>Syntax error</source>
<target>Syntaxfel</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>En vänster och en höger mappsökväg förväntas efter %x.</target>
-
<source>Cannot find file %x.</source>
<target>Kan inte hitta filen %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>Filen %x innehåller ingen giltig konfiguration.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Ett ojämnt antal vänster- och högermappar har specificerats.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Konfigurationsfilen kan inte innehålla inställningar på katalogparnivå när mappar anges via kommandorad.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Valfritt antal alternativa katalogpar för som mest, en konfigurationsfil.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>Öppna den valda konfigurationen endast för redigering, utan att köra den.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>Mapparna skapas automatiskt när de behövs.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target>Följande mappsökvägar skiljer sig åt i skiftläge. Använd en enda form för att undvika dubbla åtkomster.</target>
+
<source>Scanning:</source>
<target>Skannar:</target>
@@ -424,9 +421,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Använd 64-bitarsversionen av FreeFileSync för att skapa skuggkopior på detta system.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>Kan inte utläsa volymnamn för %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>Volymnamnet %x är inte en del av sökvägen %y.</target>
@@ -490,6 +484,21 @@
<source>Source item %x not found</source>
<target>Källobjektet %x hittades inte</target>
+<source>Cannot move file %x to %y.</source>
+<target>Kan inte flytta filen %x till %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target>Överordnad mapp %x, finns inte.</target>
+
+<source>The name %x is already used by another item.</source>
+<target>Namnet %x, används redan av ett annat objekt.</target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Kan inte kopiera %x till %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Kan inte kopiera den symboliska länken %x till %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Skapar en 'Volume Shadow Copy' för %x...</target>
@@ -511,6 +520,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Följande objekt har olösta konflikter, och kommer inte att synkroniseras:</target>
+<source>Folder pair:</source>
+<target>Katalogpar:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>Följande mappar är påtagligt olika. Tillse att rätt mappar är valda för synkronisering.</target>
@@ -567,74 +579,77 @@ Aktuell: %y byte
<source>Cannot write permissions of %x.</source>
<target>Kan inte skriva behörigheter för %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Åtgärden stöder inte olika basmapptyper.</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>Kan inte flytta filen %x till %y.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Kan inte kopiera den symboliska länken %x till %y.</target>
-
-<source>Error Code %x</source>
-<target>Felkod %x</target>
-
-<source>Failed to get information about server %x.</source>
-<target>Kunde inte hämta information om server %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Kan inte öppna %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Kan inte skapa mappen %x.</target>
+<source>Operation not supported between different devices.</source>
+<target>Åtgärden stöds inte mellan olika enheter.</target>
<source>Cannot delete file %x.</source>
<target>Filen %x kan inte tas bort.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Kan inte ta bort den symboliska länken %x.</target>
+
<source>Cannot delete directory %x.</source>
<target>Kan inte ta bort mappen %x.</target>
+<source>Error Code %x</source>
+<target>Felkod %x</target>
+
<source>Cannot write modification time of %x.</source>
<target>Kan inte ändra tidsangivelsen för %x.</target>
+<source>Cannot create directory %x.</source>
+<target>Kan inte skapa mappen %x.</target>
+
<source>Cannot determine final path for %x.</source>
<target>Kan inte utläsa slutlig sökväg för %x.</target>
+<source>Operation not supported by device.</source>
+<target>Åtgärden stöds inte av enheten.</target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>Den symboliska länken %x kan inte matchas.</target>
<source>Unable to move %x to the recycle bin.</source>
<target>Kan inte att flytta %x till papperskorgen.</target>
-<source>Unable to access %x.</source>
-<target>Kan inte komma åt %x.</target>
-
<source>Authentication completed.</source>
<target>Autentisering slutförd.</target>
+<source>You may close this page now and continue with FreeFileSync.</source>
+<target>Du kan nu stänga denna sida och fortsätta med FreeFileSync.</target>
+
<source>Authentication failed.</source>
<target>Autentisering misslyckades.</target>
-<source>You may close this page now and continue with FreeFileSync.</source>
-<target>Du kan nu stänga denna sida och fortsätta med FreeFileSync.</target>
+<source>Cannot find %x.</source>
+<target>Kan inte hitta %x.</target>
-<source>The server returned an error:</source>
-<target>Servern returnerade ett fel:</target>
+<source>Please authorize access to user account %x.</source>
+<target>Autentisera åtkomst till användarkonto %x.</target>
<source>Cannot determine free disk space for %x.</source>
<target>Kan inte avgöra ledigt utrymme på %x.</target>
-<source>Cannot find %x.</source>
-<target>Kan inte hitta %x.</target>
+<source>Unable to disconnect from %x.</source>
+<target>Kan inte koppla ifrån %x.</target>
+
+<source>Unable to access %x.</source>
+<target>Kan inte komma åt %x.</target>
+
+<source>Failed to get information about server %x.</source>
+<target>Kunde inte hämta information om server %x.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>Mappen %x kan inte övervakas.</target>
<source>Cannot find device %x.</source>
<target>Kan inte hitta enheten %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>Objekttyp %x stöds ej:</target>
+<source>Cannot open directory %x.</source>
+<target>Kan inte öppna %x.</target>
-<source>Cannot delete symbolic link %x.</source>
-<target>Kan inte ta bort den symboliska länken %x.</target>
+<source>Unsupported item type.</source>
+<target>Objekttypen stöds inte.</target>
<source>Incorrect command line:</source>
<target>Felaktig kommandorad:</target>
@@ -770,8 +785,8 @@ Kommandot triggas om:
<source>&Restore</source>
<target>&Återställ</target>
-<source>&Show error</source>
-<target>&Visa fel</target>
+<source>&Show error message</source>
+<target>&Visa felmeddelande</target>
<source>&Quit</source>
<target>&Avsluta</target>
@@ -800,6 +815,9 @@ Kommandot triggas om:
<source>Loading...</source>
<target>Läser in...</target>
+<source>Scanning...</source>
+<target>Skannar...</target>
+
<source>job name</source>
<target>åtgärdsnamn</target>
@@ -1028,12 +1046,12 @@ Kommandot triggas om:
<source>View type:</source>
<target>Visningstyp:</target>
-<source>Save as default</source>
-<target>Spara som standard</target>
-
<source>Select view:</source>
<target>Välj vy:</target>
+<source>Save as default</source>
+<target>Spara som standard</target>
+
<source>Statistics:</source>
<target>Statistik:</target>
@@ -1052,9 +1070,6 @@ Kommandot triggas om:
<source>Arrange folder pair</source>
<target>Arrangera katalogpar</target>
-<source>Folder pair:</source>
-<target>Katalogpar:</target>
-
<source>Main settings:</source>
<target>Huvudinställningar:</target>
@@ -1180,12 +1195,21 @@ Kommandot triggas om:
<source>OK</source>
<target>OK</target>
-<source>Enter your login details:</source>
-<target>Ange dina inloggningsuppgifter:</target>
-
<source>Connection type:</source>
<target>Anslutningstyp:</target>
+<source>Connected user accounts:</source>
+<target>Anslutna användarkonton:</target>
+
+<source>&Add connection</source>
+<target>&Lägg till anslutning</target>
+
+<source>&Disconnect</source>
+<target>&Koppla ifrån</target>
+
+<source>Selected user account:</source>
+<target>Valt användarkonto:</target>
+
<source>Server name or IP address:</source>
<target>Servernamn eller IP-adress:</target>
@@ -1234,15 +1258,9 @@ Kommandot triggas om:
<source>Detect server limit</source>
<target>Identifiera serverbegränsning</target>
-<source>Select a directory on the server:</source>
-<target>Välj en mapp på servern:</target>
-
<source>Select Folder</source>
<target>Välj mapp</target>
-<source>Start synchronization now?</source>
-<target>Vill du starta synkroniseringen nu?</target>
-
<source>Variant:</source>
<target>Alternativ:</target>
@@ -1294,9 +1312,6 @@ Kommandot triggas om:
<source>Run minimized</source>
<target>Kör minimerad</target>
-<source>&Show error dialog</source>
-<target>&Visa feldialog</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Visa popup vid fel och varningar</target>
@@ -1531,11 +1546,11 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>multiple selection</source>
<target>flerval</target>
-<source>Include via filter:</source>
-<target>Inkludera via filter:</target>
+<source>&Include via filter:</source>
+<target>&Inkludera via filter:</target>
-<source>Exclude via filter:</source>
-<target>Lägg till i undantag:</target>
+<source>&Exclude via filter:</source>
+<target>&Undanta via filter:</target>
<source>Include temporarily</source>
<target>Inkludera tillfälligt</target>
@@ -1543,6 +1558,9 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Exclude temporarily</source>
<target>Undanta tillfälligt</target>
+<source>&Synchronize selection</source>
+<target>&Synkronisera markerat</target>
+
<source>&Copy to...</source>
<target>&Kopiera till...</target>
@@ -1553,7 +1571,7 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<target>Inkludera alla</target>
<source>Exclude all</source>
-<target>Exkludera alla</target>
+<target>Undanta alla</target>
<source>Show icons:</source>
<target>Visa ikoner:</target>
@@ -1643,7 +1661,7 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<target>Visa filer som inte kommer att kopieras</target>
<source>Show filtered or temporarily excluded files</source>
-<target>Dölj filtrerade eller temporärt undantagna filer</target>
+<target>Visa filtrerade eller tillfälligt undantagna filer</target>
<source>Filter</source>
<target>Filter</target>
@@ -1678,9 +1696,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Initializing...</source>
<target>Initierar...</target>
-<source>Scanning...</source>
-<target>Skannar...</target>
-
<source>Comparing content...</source>
<target>Jämför innehåll...</target>
@@ -1699,6 +1714,9 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Recommended range:</source>
<target>Rekommenderat intervall:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target>Vill du verkligen koppla ner användarkonto %x?</target>
+
<source>Password:</source>
<target>Lösenord:</target>
@@ -1741,6 +1759,12 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<pluralform>Vill du verkligen ta bort följande %x objekt?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target>Vill du börja synkronisera markerat?</target>
+
+<source>Start synchronization now?</source>
+<target>Vill du starta synkroniseringen nu?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Kopiera DACL, SACL, Ägare, Grupp</target>
@@ -1924,9 +1948,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Unable to register device notifications for %x.</source>
<target>Kunde inte registrera enhetsavisering för %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>Mappen %x kan inte övervakas.</target>
-
<source>The file is locked by another process:</source>
<target>Filen är låst av en annan process:</target>
@@ -1945,9 +1966,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>%x is not a regular directory name.</source>
<target>%x är inte ett vanligt mappnamn.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Kan inte kopiera %x till %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Kan inte kopiera attribut från %x till %y.</target>
diff --git a/FreeFileSync/Build/Languages/turkish.lng b/FreeFileSync/Build/Languages/turkish.lng
index b7ebec78..2b1e70a7 100755
--- a/FreeFileSync/Build/Languages/turkish.lng
+++ b/FreeFileSync/Build/Languages/turkish.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>Olağan dışı bir durumla karşılaşıldı</target>
-<source>A directory path is expected after %x.</source>
-<target>%x ardından bir klasör yolu gelmelidir.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>%x ardından sol ve sağ klasör belirtilmelidir.</target>
<source>Syntax error</source>
<target>Yazım hatası</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>%x ardından sol ve sağ klasör belirtilmelidir.</target>
-
<source>Cannot find file %x.</source>
<target>%x dosyası bulunamadı.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>%x dosyası geçerli yapılandırma bilgilerini içermiyor.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Sağdan ve soldan seçilen klasör sayısı aynı değil.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Klasörler komut satırından seçildiği zaman, yapılandırma dosyasında klasör çifti düzeyinde ayarlar bulunmamalıdır.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>En fazla bir yapılandırma dosyası için herhangi bir sayıda alternatif klasör çifti.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>Seçilmiş yapılandırmayı yürütmeden yalnız düzenlemek için açar.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>Klasörler gerektiğinde otomatik olarak oluşturulur.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target></target>
+
<source>Scanning:</source>
<target>Taranıyor:</target>
@@ -424,9 +421,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Lütfen bu sistemde gölge kopyalar oluşturmak için FreeFileSync uygulamasının 64 bit sürümünü kullanın.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>%x için birim adı belirlenemedi.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>%x birim adı %y dosya yolunun bir parçası değil.</target>
@@ -490,6 +484,21 @@
<source>Source item %x not found</source>
<target>%x kaynak ögesi bulunamadı</target>
+<source>Cannot move file %x to %y.</source>
+<target>%x dosyası %y hedefine taşınamadı.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target></target>
+
+<source>The name %x is already used by another item.</source>
+<target></target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>%x dosyası %y olarak kopyalanamadı.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>%x sembolik bağlantısı %y hedefine kopyalanamadı.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>%x için Birim Gölge Hizmeti oluşturuluyor...</target>
@@ -511,6 +520,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Uyuşmazlığı çözümlenmemiş şu ögeler eşitlenmeyecek:</target>
+<source>Folder pair:</source>
+<target>Klasör Çifti:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>Şu klasörler birbirinden çok farklı. Lütfen eşitleme için doğru klasörleri seçtiğinizden emin olun.</target>
@@ -567,14 +579,17 @@ Gerçekleşen: %y bayt
<source>Cannot write permissions of %x.</source>
<target>%x izinleri yazılamadı.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Farklı temel klasör türleri üzerindeki işlemler desteklenmiyor.</target>
+<source>Operation not supported between different devices.</source>
+<target></target>
-<source>Cannot move file %x to %y.</source>
-<target>%x dosyası %y hedefine taşınamadı.</target>
+<source>Cannot delete file %x.</source>
+<target>%x dosyası silinemedi.</target>
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>%x sembolik bağlantısı %y hedefine kopyalanamadı.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>%x sembolik bağlantısı silinemedi.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>%x klasörü silinemedi.</target>
<source>Error Code %x</source>
<target>Hata Kodu %x</target>
@@ -585,21 +600,18 @@ Gerçekleşen: %y bayt
<source>Cannot open directory %x.</source>
<target>%x klasörü açılamadı.</target>
-<source>Cannot create directory %x.</source>
-<target>%x klasörü oluşturulamadı.</target>
-
-<source>Cannot delete file %x.</source>
-<target>%x dosyası silinemedi.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>%x klasörü silinemedi.</target>
-
<source>Cannot write modification time of %x.</source>
<target>%x dosyasının değişiklik tarihi yazılamadı.</target>
<source>Cannot determine final path for %x.</source>
<target>%x dosyasının son yolu belirlenemedi.</target>
+<source>Cannot create directory %x.</source>
+<target>%x klasörü oluşturulamadı.</target>
+
+<source>Operation not supported by device.</source>
+<target></target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>%x sembolik bağlantısı çözümlenemedi.</target>
@@ -612,29 +624,32 @@ Gerçekleşen: %y bayt
<source>Authentication completed.</source>
<target>Kimlik doğrulandı.</target>
-<source>Authentication failed.</source>
-<target>Kimlik doğrulanamadı.</target>
-
<source>You may close this page now and continue with FreeFileSync.</source>
<target>Bu sayfayı kapatıp FreeFileSync ile çalışmayı sürdürebilirsiniz.</target>
-<source>The server returned an error:</source>
-<target>Sunucu şu hatayı bildirdi:</target>
+<source>Authentication failed.</source>
+<target>Kimlik doğrulanamadı.</target>
+
+<source>Unable to disconnect from %x.</source>
+<target></target>
-<source>Cannot determine free disk space for %x.</source>
-<target>%x için boş disk alanı belirlenemedi.</target>
+<source>Cannot monitor directory %x.</source>
+<target>%x klasörü izlenemiyor.</target>
<source>Cannot find %x.</source>
<target>%x bulunamadı.</target>
+<source>Please authorize access to user account %x.</source>
+<target></target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>%x için boş disk alanı belirlenemedi.</target>
+
<source>Cannot find device %x.</source>
<target>%x aygıtı bulunamadı.</target>
-<source>Type of item %x is not supported:</source>
-<target>%x ögesi türü desteklenmiyor:</target>
-
-<source>Cannot delete symbolic link %x.</source>
-<target>%x sembolik bağlantısı silinemedi.</target>
+<source>Unsupported item type.</source>
+<target></target>
<source>Incorrect command line:</source>
<target>Satırdaki komut geçersiz:</target>
@@ -770,8 +785,8 @@ Komut şu durumlarda yürütülür:
<source>&Restore</source>
<target>Gö&rüntülensin</target>
-<source>&Show error</source>
-<target>Hataya &Bakın</target>
+<source>&Show error message</source>
+<target></target>
<source>&Quit</source>
<target>Çı&k</target>
@@ -800,6 +815,9 @@ Komut şu durumlarda yürütülür:
<source>Loading...</source>
<target>Yükleniyor...</target>
+<source>Scanning...</source>
+<target>Taranıyor...</target>
+
<source>job name</source>
<target>iş adı</target>
@@ -1028,12 +1046,12 @@ Komut şu durumlarda yürütülür:
<source>View type:</source>
<target>Görünüm Kipi:</target>
-<source>Save as default</source>
-<target>Varsayılan Olarak Kaydet</target>
-
<source>Select view:</source>
<target>Eşit Dosya Görünümü:</target>
+<source>Save as default</source>
+<target>Varsayılan Olarak Kaydet</target>
+
<source>Statistics:</source>
<target>İstatistikler:</target>
@@ -1052,9 +1070,6 @@ Komut şu durumlarda yürütülür:
<source>Arrange folder pair</source>
<target>Klasör çiftini belirleyin</target>
-<source>Folder pair:</source>
-<target>Klasör Çifti:</target>
-
<source>Main settings:</source>
<target>Temel ayarlar:</target>
@@ -1180,12 +1195,21 @@ Komut şu durumlarda yürütülür:
<source>OK</source>
<target>Tamam</target>
-<source>Enter your login details:</source>
-<target>Oturum açma bilgilerinizi yazın:</target>
-
<source>Connection type:</source>
<target>Bağlantı Türü:</target>
+<source>Connected user accounts:</source>
+<target></target>
+
+<source>&Add connection</source>
+<target></target>
+
+<source>&Disconnect</source>
+<target></target>
+
+<source>Selected user account:</source>
+<target></target>
+
<source>Server name or IP address:</source>
<target>Sunucu Adı / IP Adresi:</target>
@@ -1234,15 +1258,9 @@ Komut şu durumlarda yürütülür:
<source>Detect server limit</source>
<target>Sunucu Sınırını Bul</target>
-<source>Select a directory on the server:</source>
-<target>Sunucu üzerinde bir klasör seçin:</target>
-
<source>Select Folder</source>
<target>Klasör Seçin</target>
-<source>Start synchronization now?</source>
-<target>Eşitleme başlatılsın mı?</target>
-
<source>Variant:</source>
<target>İşlem Türü:</target>
@@ -1294,9 +1312,6 @@ Komut şu durumlarda yürütülür:
<source>Run minimized</source>
<target>Küçültülmüş Çalıştırılsın</target>
-<source>&Show error dialog</source>
-<target>Sorun &penceresi görüntülensin</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Sorun ya da uyarılar açılır pencerede görüntülenir</target>
@@ -1531,11 +1546,11 @@ Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak y
<source>multiple selection</source>
<target>çoklu seçim</target>
-<source>Include via filter:</source>
-<target>Katılacak Ögelere Ekle:</target>
+<source>&Include via filter:</source>
+<target></target>
-<source>Exclude via filter:</source>
-<target>Katılmayacak Ögelere Ekle:</target>
+<source>&Exclude via filter:</source>
+<target></target>
<source>Include temporarily</source>
<target>Geçici Olarak Kat</target>
@@ -1543,6 +1558,9 @@ Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak y
<source>Exclude temporarily</source>
<target>Geçici Olarak Katma</target>
+<source>&Synchronize selection</source>
+<target></target>
+
<source>&Copy to...</source>
<target>&Farklı Konuma Kopyala...</target>
@@ -1678,9 +1696,6 @@ Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak y
<source>Initializing...</source>
<target>Başlatılıyor...</target>
-<source>Scanning...</source>
-<target>Taranıyor...</target>
-
<source>Comparing content...</source>
<target>İçerik karşılaştırılıyor...</target>
@@ -1699,6 +1714,9 @@ Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak y
<source>Recommended range:</source>
<target>Önerilen Aralık:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target></target>
+
<source>Password:</source>
<target>Parola:</target>
@@ -1741,6 +1759,12 @@ Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak y
<pluralform>Aşağıdaki %x ögeyi silmek istediğinize emin misiniz?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target></target>
+
+<source>Start synchronization now?</source>
+<target>Eşitleme başlatılsın mı?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>DACL, SACL, Sahip, Grup Kopyalansın</target>
@@ -1924,9 +1948,6 @@ Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak y
<source>Unable to register device notifications for %x.</source>
<target>%x aygıtının bildirimleri için gerekli kayıt eklenemedi.</target>
-<source>Cannot monitor directory %x.</source>
-<target>%x klasörü izlenemiyor.</target>
-
<source>The file is locked by another process:</source>
<target>Dosya başka bir işlem tarafından kilitlenmiş:</target>
@@ -1945,9 +1966,6 @@ Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak y
<source>%x is not a regular directory name.</source>
<target>%x geçerli bir klasör adı değil.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>%x dosyası %y olarak kopyalanamadı.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Öznitelikler %x üzerinden %y üzerine kopyalanamadı.</target>
diff --git a/FreeFileSync/Build/Languages/ukrainian.lng b/FreeFileSync/Build/Languages/ukrainian.lng
index b3d31637..aa73fea8 100755
--- a/FreeFileSync/Build/Languages/ukrainian.lng
+++ b/FreeFileSync/Build/Languages/ukrainian.lng
@@ -58,15 +58,12 @@
<source>An exception occurred</source>
<target>Відбулось виключення</target>
-<source>A directory path is expected after %x.</source>
-<target>Після %x очікується шлях до папки.</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Шлях до каталогу ліворуч і праворуч очікується після %x.</target>
<source>Syntax error</source>
<target>Синтаксична помилка</target>
-<source>A left and a right directory path are expected after %x.</source>
-<target>Шлях до каталогу ліворуч і праворуч очікується після %x.</target>
-
<source>Cannot find file %x.</source>
<target>Неможливо знайти файл %x.</target>
@@ -76,9 +73,6 @@
<source>File %x does not contain a valid configuration.</source>
<target>Файл %x не містить правильної конфігурації.</target>
-<source>Unequal number of left and right directories specified.</source>
-<target>Вказано різну кількість лівих і правих папок.</target>
-
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Конфігураційний файл не повинен містити налаштувань на рівні пар папок, якщо папки задаються командним рядком.</target>
@@ -106,7 +100,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Будь-яка кількість альтернативних пар папок для не більше одного конфігураційного файлу.</target>
-<source>Open the selected configuration for editing only without executing it.</source>
+<source>Open the selected configuration for editing only, without executing it.</source>
<target>Відкрити вибрану конфігурацію тільки для редагування без її виконання.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
@@ -127,6 +121,9 @@
<source>The folders are created automatically when needed.</source>
<target>Папки створюються автоматично, коли це потрібно.</target>
+<source>The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses.</source>
+<target></target>
+
<source>Scanning:</source>
<target>Сканування:</target>
@@ -427,9 +424,6 @@
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
<target>Будь ласка, використовуйте 64-розрядну версію FreeFileSync для створення тіньових копій у цій системі.</target>
-<source>Cannot determine volume name for %x.</source>
-<target>Не вдалося встановити ім'я тому для %x.</target>
-
<source>Volume name %x is not part of file path %y.</source>
<target>Ім'я тому %x не є частиною шляху до файлу %y.</target>
@@ -493,6 +487,21 @@
<source>Source item %x not found</source>
<target>Вихідний елемент %x не знайдено</target>
+<source>Cannot move file %x to %y.</source>
+<target>Не вдається перемістити файл %x до %y.</target>
+
+<source>Parent folder %x is not existing.</source>
+<target></target>
+
+<source>The name %x is already used by another item.</source>
+<target></target>
+
+<source>Cannot copy file %x to %y.</source>
+<target>Не вдається скопіювати файл %x до %y.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Не вдається скопіювати символьне посилання %x до %y.</target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Створення Тіньової Копії для %x...</target>
@@ -514,6 +523,9 @@
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Наступні елементи мають невирішені конфлікти і не будуть синхронізовані:</target>
+<source>Folder pair:</source>
+<target>Пара папок:</target>
+
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
<target>Наступні папки значно відрізняються. Будь ласка, перевірте що вибрані правильні папки для синхронізації.</target>
@@ -570,14 +582,17 @@ Actual: %y bytes
<source>Cannot write permissions of %x.</source>
<target>Не вдається записати права доступу до %x.</target>
-<source>Operation not supported for different base folder types.</source>
-<target>Операція не підтримується для різних типів базових папок.</target>
+<source>Operation not supported between different devices.</source>
+<target></target>
-<source>Cannot move file %x to %y.</source>
-<target>Не вдається перемістити файл %x до %y.</target>
+<source>Cannot delete file %x.</source>
+<target>Не вдається видалити файл %x.</target>
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Не вдається скопіювати символьне посилання %x до %y.</target>
+<source>Cannot delete symbolic link %x.</source>
+<target>Не вдалося вилучити символьне посилання %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Не вдається видалити папку %x.</target>
<source>Error Code %x</source>
<target>Код помилки %x</target>
@@ -588,21 +603,18 @@ Actual: %y bytes
<source>Cannot open directory %x.</source>
<target>Не вдається відкрити папку %x.</target>
-<source>Cannot create directory %x.</source>
-<target>Не вдається створити папку %x.</target>
-
-<source>Cannot delete file %x.</source>
-<target>Не вдається видалити файл %x.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Не вдається видалити папку %x.</target>
-
<source>Cannot write modification time of %x.</source>
<target>Не вдається записати час модифікації %x.</target>
<source>Cannot determine final path for %x.</source>
<target>Не вдається визначити кінцевого шляху для %x.</target>
+<source>Cannot create directory %x.</source>
+<target>Не вдається створити папку %x.</target>
+
+<source>Operation not supported by device.</source>
+<target></target>
+
<source>Cannot resolve symbolic link %x.</source>
<target>Не вдається вирішити символьне посилання %x.</target>
@@ -615,29 +627,32 @@ Actual: %y bytes
<source>Authentication completed.</source>
<target>Автентифікація виконана.</target>
-<source>Authentication failed.</source>
-<target>Автентифікація не виконана.</target>
-
<source>You may close this page now and continue with FreeFileSync.</source>
<target>Ви можете закрити цю сторінку зараз і продовжити з FreeFileSync.</target>
-<source>The server returned an error:</source>
-<target>Сервер вернув помилку:</target>
+<source>Authentication failed.</source>
+<target>Автентифікація не виконана.</target>
+
+<source>Unable to disconnect from %x.</source>
+<target></target>
-<source>Cannot determine free disk space for %x.</source>
-<target>Не вдається визначити об'єм вільного місця для %x.</target>
+<source>Cannot monitor directory %x.</source>
+<target>Не вдається спостереження за папкою %x.</target>
<source>Cannot find %x.</source>
<target>Не вдається знайти %x.</target>
+<source>Please authorize access to user account %x.</source>
+<target></target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>Не вдається визначити об'єм вільного місця для %x.</target>
+
<source>Cannot find device %x.</source>
<target>Не вдається знайти пристрій %x.</target>
-<source>Type of item %x is not supported:</source>
-<target>Тип елемента %x не підтримується:</target>
-
-<source>Cannot delete symbolic link %x.</source>
-<target>Не вдалося вилучити символьне посилання %x.</target>
+<source>Unsupported item type.</source>
+<target></target>
<source>Incorrect command line:</source>
<target>Неправильний командний рядок:</target>
@@ -775,8 +790,8 @@ The command is triggered if:
<source>&Restore</source>
<target>Від&новити</target>
-<source>&Show error</source>
-<target>&Показати помилку</target>
+<source>&Show error message</source>
+<target></target>
<source>&Quit</source>
<target>В&ихід</target>
@@ -806,6 +821,9 @@ The command is triggered if:
<source>Loading...</source>
<target>Завантаження...</target>
+<source>Scanning...</source>
+<target>Сканування...</target>
+
<source>job name</source>
<target>назва завдання</target>
@@ -1035,12 +1053,12 @@ The command is triggered if:
<source>View type:</source>
<target>Тип перегляду:</target>
-<source>Save as default</source>
-<target>Зберегти як замовчування</target>
-
<source>Select view:</source>
<target>Вибрати перегляд:</target>
+<source>Save as default</source>
+<target>Зберегти як замовчування</target>
+
<source>Statistics:</source>
<target>Статистика:</target>
@@ -1059,9 +1077,6 @@ The command is triggered if:
<source>Arrange folder pair</source>
<target>Упорядкувати пару папок</target>
-<source>Folder pair:</source>
-<target>Пара папок:</target>
-
<source>Main settings:</source>
<target>Головні налаштування:</target>
@@ -1187,12 +1202,21 @@ The command is triggered if:
<source>OK</source>
<target>OK</target>
-<source>Enter your login details:</source>
-<target>Введіть Ваші параметри входу:</target>
-
<source>Connection type:</source>
<target>Тип з'єднання:</target>
+<source>Connected user accounts:</source>
+<target></target>
+
+<source>&Add connection</source>
+<target></target>
+
+<source>&Disconnect</source>
+<target></target>
+
+<source>Selected user account:</source>
+<target></target>
+
<source>Server name or IP address:</source>
<target>Ім'я серверу чи IP адреса:</target>
@@ -1241,15 +1265,9 @@ The command is triggered if:
<source>Detect server limit</source>
<target>Визначити ліміти сервера</target>
-<source>Select a directory on the server:</source>
-<target>Вибрати папку на сервері:</target>
-
<source>Select Folder</source>
<target>Вибрати Папку</target>
-<source>Start synchronization now?</source>
-<target>Запустити синхронізацію зараз?</target>
-
<source>Variant:</source>
<target>Варіант:</target>
@@ -1301,9 +1319,6 @@ The command is triggered if:
<source>Run minimized</source>
<target>Запустити згорнутим</target>
-<source>&Show error dialog</source>
-<target>&Показати діалог з помилками</target>
-
<source>Show pop-up on errors or warnings</source>
<target>Показувати виринаючі вікна при помилках та попередженнях</target>
@@ -1542,11 +1557,11 @@ This guarantees a consistent state even in case of a serious error.
<source>multiple selection</source>
<target>груповий вибір</target>
-<source>Include via filter:</source>
-<target>Включити за допомогою фільтру:</target>
+<source>&Include via filter:</source>
+<target></target>
-<source>Exclude via filter:</source>
-<target>Виключити за допомогою фільтру:</target>
+<source>&Exclude via filter:</source>
+<target></target>
<source>Include temporarily</source>
<target>Включити тимчасово</target>
@@ -1554,6 +1569,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Exclude temporarily</source>
<target>Виключити тимчасово</target>
+<source>&Synchronize selection</source>
+<target></target>
+
<source>&Copy to...</source>
<target>&Копіювати до...</target>
@@ -1689,9 +1707,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Initializing...</source>
<target>Ініціалізація...</target>
-<source>Scanning...</source>
-<target>Сканування...</target>
-
<source>Comparing content...</source>
<target>Порівнювання вмісту...</target>
@@ -1710,6 +1725,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Recommended range:</source>
<target>Рекомендований діапазон:</target>
+<source>Do you really want to disconnect from user account %x?</source>
+<target></target>
+
<source>Password:</source>
<target>Пароль:</target>
@@ -1755,6 +1773,12 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>Ви дійсно хочете вилучити ці %x елементів?</pluralform>
</target>
+<source>Start to synchronize the selection?</source>
+<target></target>
+
+<source>Start synchronization now?</source>
+<target>Запустити синхронізацію зараз?</target>
+
<source>Copy DACL, SACL, Owner, Group</source>
<target>Скопіювати DACL, SACL, власника, групу</target>
@@ -1938,9 +1962,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Unable to register device notifications for %x.</source>
<target>Не вдається зареєструвати повідомлення пристрою для %x.</target>
-<source>Cannot monitor directory %x.</source>
-<target>Не вдається спостереження за папкою %x.</target>
-
<source>The file is locked by another process:</source>
<target>Файл заблоковано іншим процесом:</target>
@@ -1959,9 +1980,6 @@ This guarantees a consistent state even in case of a serious error.
<source>%x is not a regular directory name.</source>
<target>%x не є звичайним іменем папки.</target>
-<source>Cannot copy file %x to %y.</source>
-<target>Не вдається скопіювати файл %x до %y.</target>
-
<source>Cannot copy attributes from %x to %y.</source>
<target>Не вдається скопіювати атрибути з %x до %y.</target>
diff --git a/FreeFileSync/Build/Resources.zip b/FreeFileSync/Build/Resources.zip
index b3146ea1..12931409 100755
--- a/FreeFileSync/Build/Resources.zip
+++ b/FreeFileSync/Build/Resources.zip
Binary files differ
diff --git a/FreeFileSync/Source/RealTimeSync/app_icon.h b/FreeFileSync/Source/RealTimeSync/app_icon.h
index 00797e37..fef1896c 100644
--- a/FreeFileSync/Source/RealTimeSync/app_icon.h
+++ b/FreeFileSync/Source/RealTimeSync/app_icon.h
@@ -13,18 +13,15 @@
namespace zen
{
inline
-wxIcon getRtsIcon()
+wxIcon getRtsIcon() //see FFS/app_icon.h
{
- //wxWidgets' bitmap to icon conversion on OS X can only deal with very specific sizes => check on all platforms!
assert(getResourceImage(L"RealTimeSync").GetWidth () == getResourceImage(L"RealTimeSync").GetHeight() &&
- getResourceImage(L"RealTimeSync").GetWidth() % 128 == 0);
- //attention: make sure to not implicitly call "instance()" again => deadlock on Linux
+ getResourceImage(L"RealTimeSync").GetWidth() == 128);
wxIcon icon;
- icon.CopyFromBitmap(getResourceImage(L"RealTimeSync")); //use big logo bitmap for better quality
+ icon.CopyFromBitmap(getResourceImage(L"RealTimeSync").ConvertToImage().Scale(fastFromDIP(64), fastFromDIP(64), wxIMAGE_QUALITY_HIGH));
return icon;
}
}
-
#endif //APP_ICON_H_8914578394545342
diff --git a/FreeFileSync/Source/RealTimeSync/application.cpp b/FreeFileSync/Source/RealTimeSync/application.cpp
index 899d1c69..e99c2c6a 100644
--- a/FreeFileSync/Source/RealTimeSync/application.cpp
+++ b/FreeFileSync/Source/RealTimeSync/application.cpp
@@ -76,7 +76,6 @@ bool Application::OnInit()
int Application::OnExit()
{
- fff::uninitializeHelp();
fff::releaseWxLocale();
cleanupResourceImages();
return wxApp::OnExit();
diff --git a/FreeFileSync/Source/RealTimeSync/tray_menu.cpp b/FreeFileSync/Source/RealTimeSync/tray_menu.cpp
index 106c508b..1f2ae016 100644
--- a/FreeFileSync/Source/RealTimeSync/tray_menu.cpp
+++ b/FreeFileSync/Source/RealTimeSync/tray_menu.cpp
@@ -137,7 +137,7 @@ private:
defaultItem = new wxMenuItem(contextMenu, CONTEXT_RESTORE, _("&Restore"));
break;
case TRAY_MODE_ERROR:
- defaultItem = new wxMenuItem(contextMenu, CONTEXT_SHOW_ERROR, _("&Show error"));
+ defaultItem = new wxMenuItem(contextMenu, CONTEXT_SHOW_ERROR, _("&Show error message"));
break;
}
contextMenu->Append(defaultItem);
diff --git a/FreeFileSync/Source/base/algorithm.cpp b/FreeFileSync/Source/base/algorithm.cpp
index b04cbb36..d5b163a6 100644
--- a/FreeFileSync/Source/base/algorithm.cpp
+++ b/FreeFileSync/Source/base/algorithm.cpp
@@ -24,6 +24,67 @@ using namespace zen;
using namespace fff;
+
+namespace
+{
+class RecursiveObjectVisitorImpl
+{
+public:
+ RecursiveObjectVisitorImpl(std::function<void (FolderPair& folder)> onFolder,
+ std::function<void (FilePair& file)> onFile,
+ std::function<void (SymlinkPair& symlink)> onSymlink) :
+ onFolder_(onFolder), onFile_(onFile), onSymlink_(onSymlink) {}
+
+ void execute(FileSystemObject& fsObj)
+ {
+ visitFSObject(fsObj,
+ [&](const FolderPair& folder) { visit(const_cast<FolderPair& >(folder )); }, //
+ [&](const FilePair& file) { visit(const_cast<FilePair& >(file )); }, //physical object is not const anyway
+ [&](const SymlinkPair& symlink) { visit(const_cast<SymlinkPair&>(symlink)); }); //
+ }
+
+private:
+ void visit(FolderPair& folder)
+ {
+ if (onFolder_)
+ onFolder_(folder);
+
+ for (FilePair& file : folder.refSubFiles())
+ visit(file);
+ for (SymlinkPair& symlink : folder.refSubLinks())
+ visit(symlink);
+ for (FolderPair& subFolder : folder.refSubFolders())
+ visit(subFolder);
+ }
+
+ void visit(FilePair& file)
+ {
+ if (onFile_)
+ onFile_(file);
+ }
+
+ void visit(SymlinkPair& symlink)
+ {
+ if (onSymlink_)
+ onSymlink_(symlink);
+ }
+
+ std::function<void (FolderPair& folder)> onFolder_;
+ std::function<void (FilePair& file)> onFile_;
+ std::function<void (SymlinkPair& symlink)> onSymlink_;
+};
+}
+
+
+void fff::recursiveObjectVisitor(FileSystemObject& fsObj,
+ std::function<void (FolderPair& folder)> onFolder,
+ std::function<void (FilePair& file)> onFile,
+ std::function<void (SymlinkPair& symlink)> onSymlink)
+{
+ RecursiveObjectVisitorImpl(onFolder, onFile, onSymlink).execute(fsObj);
+}
+
+
void fff::swapGrids(const MainConfiguration& mainCfg, FolderComparison& folderCmp) //throw FileError
{
std::for_each(begin(folderCmp), end(folderCmp), [](BaseFolderPair& baseFolder) { baseFolder.flip(); });
@@ -754,53 +815,43 @@ void fff::redetermineSyncDirection(const std::vector<DirectionConfig>& directCfg
//---------------------------------------------------------------------------------------------------------------
-struct SetNewDirection
+namespace
{
- static void execute(FilePair& file, SyncDirection newDirection)
- {
- if (file.getCategory() != FILE_EQUAL)
- file.setSyncDir(newDirection);
- }
-
- static void execute(SymlinkPair& symlink, SyncDirection newDirection)
- {
- if (symlink.getLinkCategory() != SYMLINK_EQUAL)
- symlink.setSyncDir(newDirection);
- }
+void setSyncDirectionImpl(FilePair& file, SyncDirection newDirection)
+{
+ if (file.getCategory() != FILE_EQUAL)
+ file.setSyncDir(newDirection);
+}
- static void execute(FolderPair& folder, SyncDirection newDirection)
- {
- if (folder.getDirCategory() != DIR_EQUAL)
- folder.setSyncDir(newDirection);
+void setSyncDirectionImpl(SymlinkPair& symlink, SyncDirection newDirection)
+{
+ if (symlink.getLinkCategory() != SYMLINK_EQUAL)
+ symlink.setSyncDir(newDirection);
+}
- //recurse:
- for (FilePair& file : folder.refSubFiles())
- execute(file, newDirection);
- for (SymlinkPair& link : folder.refSubLinks())
- execute(link, newDirection);
- for (FolderPair& subFolder : folder.refSubFolders())
- execute(subFolder, newDirection);
- }
-};
+void setSyncDirectionImpl(FolderPair& folder, SyncDirection newDirection)
+{
+ if (folder.getDirCategory() != DIR_EQUAL)
+ folder.setSyncDir(newDirection);
+
+ for (FilePair& file : folder.refSubFiles())
+ setSyncDirectionImpl(file, newDirection);
+ for (SymlinkPair& link : folder.refSubLinks())
+ setSyncDirectionImpl(link, newDirection);
+ for (FolderPair& subFolder : folder.refSubFolders())
+ setSyncDirectionImpl(subFolder, newDirection);
+}
+}
void fff::setSyncDirectionRec(SyncDirection newDirection, FileSystemObject& fsObj)
{
//process subdirectories also!
- visitFSObject(fsObj, [&](const FolderPair& folder)
- {
- SetNewDirection::execute(const_cast<FolderPair&>(folder), newDirection); //
- },
+ visitFSObject(fsObj,
+ [&](const FolderPair& folder) { setSyncDirectionImpl(const_cast<FolderPair& >(folder ), newDirection); }, //
+ [&](const FilePair& file) { setSyncDirectionImpl(const_cast<FilePair& >(file ), newDirection); }, //physical object is not const anyway
+ [&](const SymlinkPair& symlink) { setSyncDirectionImpl(const_cast<SymlinkPair&>(symlink), newDirection); }); //
- [&](const FilePair& file)
- {
- SetNewDirection::execute(const_cast<FilePair&>(file), newDirection); //phyiscal object is not const in this method anyway
- },
-
- [&](const SymlinkPair& symlink)
- {
- SetNewDirection::execute(const_cast<SymlinkPair&>(symlink), newDirection); //
- });
}
//--------------- functions related to filtering ------------------------------------------------------------------------------------
diff --git a/FreeFileSync/Source/base/algorithm.h b/FreeFileSync/Source/base/algorithm.h
index a58e2b50..01ebca36 100644
--- a/FreeFileSync/Source/base/algorithm.h
+++ b/FreeFileSync/Source/base/algorithm.h
@@ -16,6 +16,11 @@
namespace fff
{
+void recursiveObjectVisitor(FileSystemObject& fsObj,
+ std::function<void (FolderPair& folder)> onFolder,
+ std::function<void (FilePair& file)> onFile,
+ std::function<void (SymlinkPair& symlink)> onSymlink);
+
void swapGrids(const MainConfiguration& mainCfg, FolderComparison& folderCmp); //throw FileError
std::vector<DirectionConfig> extractDirectionCfg(const MainConfiguration& mainCfg);
diff --git a/FreeFileSync/Source/base/application.cpp b/FreeFileSync/Source/base/application.cpp
index 678454ac..27a2eaba 100644
--- a/FreeFileSync/Source/base/application.cpp
+++ b/FreeFileSync/Source/base/application.cpp
@@ -92,7 +92,6 @@ bool Application::OnInit()
int Application::OnExit()
{
- uninitializeHelp();
releaseWxLocale();
cleanupResourceImages();
teardownAfs(); //throw FileError
@@ -449,7 +448,7 @@ void showSyntaxHelp()
_("Any number of alternative directory pairs for at most one config file.") + L"\n\n" +
L"-Edit" + L"\n" +
- _("Open the selected configuration for editing only without executing it.") + L"\n\n" +
+ _("Open the selected configuration for editing only, without executing it.") + L"\n\n" +
_("global config file:") + L"\n" +
_("Path to an alternate GlobalSettings.xml file.")));
diff --git a/FreeFileSync/Source/base/db_file.cpp b/FreeFileSync/Source/base/db_file.cpp
index 9b83d194..f15657a7 100644
--- a/FreeFileSync/Source/base/db_file.cpp
+++ b/FreeFileSync/Source/base/db_file.cpp
@@ -909,7 +909,7 @@ void fff::saveLastSynchronousState(const BaseFolderPair& baseFolder, const std::
//operation finished: rename temp files -> this should work (almost) transactionally:
//if there were no write access, creation of temp files would have failed
AFS::removeFileIfExists(dbPathLeft); //throw FileError
- AFS::moveAndRenameItem(dbPathLeftTmp, dbPathLeft); //throw FileError, (ErrorDifferentVolume)
+ AFS::moveAndRenameItem(dbPathLeftTmp, dbPathLeft); //throw FileError, (ErrorMoveUnsupported)
guardTmpL.dismiss();
AFS::removeFileIfExists(dbPathRight); //
diff --git a/FreeFileSync/Source/base/ffs_paths.cpp b/FreeFileSync/Source/base/ffs_paths.cpp
index 25d8dd58..76d1f484 100644
--- a/FreeFileSync/Source/base/ffs_paths.cpp
+++ b/FreeFileSync/Source/base/ffs_paths.cpp
@@ -34,13 +34,13 @@ Zstring getExeFolderParentPath()
VolumeId fff::getVolumeSerialOs() //throw FileError
{
- return getFileDetails("/").volumeId; //throw FileError
+ return getVolumeId("/"); //throw FileError
}
VolumeId fff::getVolumeSerialFfs() //throw FileError
{
- return getFileDetails(getExeFolderPath()).volumeId; //throw FileError
+ return getVolumeId(getExeFolderPath()); //throw FileError
}
diff --git a/FreeFileSync/Source/base/file_hierarchy.cpp b/FreeFileSync/Source/base/file_hierarchy.cpp
index 39af1e8e..ed55b0b8 100644
--- a/FreeFileSync/Source/base/file_hierarchy.cpp
+++ b/FreeFileSync/Source/base/file_hierarchy.cpp
@@ -170,7 +170,7 @@ SyncOperation getIsolatedSyncOperation(bool itemExistsLeft,
}
assert(false);
- return SO_DO_NOTHING; //dummy
+ return SO_DO_NOTHING;
}
@@ -475,31 +475,31 @@ std::wstring fff::getSyncOpDescription(const FileSystemObject& fsObj)
case SO_MOVE_LEFT_TO:
case SO_MOVE_RIGHT_FROM:
case SO_MOVE_RIGHT_TO:
- if (auto sourceFile = dynamic_cast<const FilePair*>(&fsObj))
- if (auto targetFile = dynamic_cast<const FilePair*>(FileSystemObject::retrieve(sourceFile->getMoveRef())))
+ if (auto fileFrom = dynamic_cast<const FilePair*>(&fsObj))
+ if (auto fileTo = dynamic_cast<const FilePair*>(FileSystemObject::retrieve(fileFrom->getMoveRef())))
{
- assert(targetFile->getMoveRef() == sourceFile->getId());
- const bool onLeft = op == SO_MOVE_LEFT_FROM || op == SO_MOVE_LEFT_TO;
- const bool isSource = op == SO_MOVE_LEFT_FROM || op == SO_MOVE_RIGHT_FROM;
+ assert(fileTo->getMoveRef() == fileFrom->getId());
+ const bool onLeft = op == SO_MOVE_LEFT_FROM || op == SO_MOVE_LEFT_TO;
+ const bool isMoveSource = op == SO_MOVE_LEFT_FROM || op == SO_MOVE_RIGHT_FROM;
- if (!isSource)
- std::swap(sourceFile, targetFile);
+ if (!isMoveSource)
+ std::swap(fileFrom, fileTo);
auto getRelName = [&](const FileSystemObject& fso, bool leftSide) { return leftSide ? fso.getRelativePath<LEFT_SIDE>() : fso.getRelativePath<RIGHT_SIDE>(); };
- const Zstring relSource = getRelName(*sourceFile, onLeft);
- const Zstring relTarget = getRelName(*targetFile, onLeft);
+ const Zstring relPathFrom = getRelName(*fileFrom, onLeft);
+ const Zstring relPathTo = getRelName(*fileTo, onLeft);
//attention: ::SetWindowText() doesn't handle tab characters correctly in combination with certain file names, so don't use them
return getSyncOpDescription(op) + L"\n" +
- (beforeLast(relSource, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE) ==
- beforeLast(relTarget, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE) ?
+ (beforeLast(relPathFrom, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE) ==
+ beforeLast(relPathTo, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE) ?
//detected pure "rename"
- fmtPath(afterLast(relSource, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL)) + L" " + arrowRight + L"\n" + //show short name only
- fmtPath(afterLast(relTarget, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL)) :
+ fmtPath(afterLast(relPathFrom, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL)) + L" " + arrowRight + L"\n" + //show short name only
+ fmtPath(afterLast(relPathTo, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL)) :
//"move" or "move + rename"
- fmtPath(relSource) + L" " + arrowRight + L"\n" +
- fmtPath(relTarget)) /*+ footer -> redundant */;
+ fmtPath(relPathFrom) + L" " + arrowRight + L"\n" +
+ fmtPath(relPathTo)) /*+ footer -> redundant */;
}
break;
diff --git a/FreeFileSync/Source/base/file_hierarchy.h b/FreeFileSync/Source/base/file_hierarchy.h
index d90c88c4..0d6758dd 100644
--- a/FreeFileSync/Source/base/file_hierarchy.h
+++ b/FreeFileSync/Source/base/file_hierarchy.h
@@ -379,7 +379,7 @@ template <class T>
class ObjectMgr
{
public:
- using ObjectId = ObjectMgr* ;
+ using ObjectId = ObjectMgr*;
using ObjectIdConst = const ObjectMgr*;
ObjectIdConst getId() const { return this; }
diff --git a/FreeFileSync/Source/base/help_provider.h b/FreeFileSync/Source/base/help_provider.h
index 8cee813b..d9a1b3fc 100644
--- a/FreeFileSync/Source/base/help_provider.h
+++ b/FreeFileSync/Source/base/help_provider.h
@@ -7,62 +7,16 @@
#ifndef HELP_PROVIDER_H_85930427583421563126
#define HELP_PROVIDER_H_85930427583421563126
-#if 1
-namespace fff
-{
-inline void displayHelpEntry(const wxString& topic, wxWindow* parent) { wxLaunchDefaultBrowser(L"https://freefilesync.org/manual.php?topic=" + topic); }
-inline void uninitializeHelp() {}
-}
-
-#else
-#include <zen/globals.h>
-#include <wx+/http.h>
-#include "ffs_paths.h"
-
- #include <wx/html/helpctrl.h>
+#include <wx/utils.h>
namespace fff
{
-void displayHelpEntry(const wxString& topic, wxWindow* parent);
-void uninitializeHelp(); //clean up gracefully during app shutdown: leaving this up to static destruction crashes on Win 8.1!
-
-
-
-
-
-
-//######################## implementation ########################
-namespace impl
-{
-}
-
-
inline
void displayHelpEntry(const wxString& topic, wxWindow* parent)
{
- if (internetIsAlive()) //noexcept
- wxLaunchDefaultBrowser(L"https://freefilesync.org/manual.php?topic=" + topic);
- else
- -> what if FFS is blocked, but the web browser would have internet access??
- {
- const wxString section = L"html/" + topic + L".html";
- wxHtmlModalHelp dlg(parent, utfTo<wxString>(zen::getResourceDirPf()) + L"Help/FreeFileSync.hhp", section,
- wxHF_DEFAULT_STYLE | wxHF_DIALOG | wxHF_MODAL | wxHF_MERGE_BOOKS);
- (void)dlg;
- //-> solves modal help craziness on OSX!
- //-> Suse Linux: avoids program hang on exit if user closed help parent dialog before the help dialog itself was closed (why is this even possible???)
- // avoids ESC key not being recognized by help dialog (but by parent dialog instead)
-
- }
-}
-
-
-inline
-void uninitializeHelp()
-{
+ wxLaunchDefaultBrowser(L"https://freefilesync.org/manual.php?topic=" + topic);
}
}
-#endif
#endif //HELP_PROVIDER_H_85930427583421563126
diff --git a/FreeFileSync/Source/base/parallel_scan.cpp b/FreeFileSync/Source/base/parallel_scan.cpp
index e52749b4..6ed8b453 100644
--- a/FreeFileSync/Source/base/parallel_scan.cpp
+++ b/FreeFileSync/Source/base/parallel_scan.cpp
@@ -39,7 +39,7 @@ namespace
=> Traversing does not take any advantage of file locality so that even multiple threads operating on the same disk impose no performance overhead! (even faster on XP) */
-class AsyncCallback
+class AsyncCallback
{
public:
AsyncCallback(size_t threadsToFinish, std::chrono::milliseconds cbInterval) : threadsToFinish_(threadsToFinish), cbInterval_(cbInterval) {}
diff --git a/FreeFileSync/Source/base/synchronization.cpp b/FreeFileSync/Source/base/synchronization.cpp
index ce38944e..ed65977a 100644
--- a/FreeFileSync/Source/base/synchronization.cpp
+++ b/FreeFileSync/Source/base/synchronization.cpp
@@ -497,8 +497,8 @@ void removeSymlinkIfExists(const AbstractPath& ap, std::mutex& singleThread) //t
{ parallelScope([ap] { AFS::removeSymlinkIfExists(ap); /*throw FileError*/ }, singleThread); }
inline
-void moveAndRenameItem(const AbstractPath& apSource, const AbstractPath& apTarget, std::mutex& singleThread) //throw FileError, ErrorDifferentVolume
-{ parallelScope([apSource, apTarget] { AFS::moveAndRenameItem(apSource, apTarget); /*throw FileError, ErrorDifferentVolume*/ }, singleThread); }
+void moveAndRenameItem(const AbstractPath& pathFrom, const AbstractPath& pathTo, std::mutex& singleThread) //throw FileError, ErrorMoveUnsupported
+{ parallelScope([pathFrom, pathTo] { AFS::moveAndRenameItem(pathFrom, pathTo); /*throw FileError, ErrorMoveUnsupported*/ }, singleThread); }
inline
AbstractPath getSymlinkResolvedPath(const AbstractPath& ap, std::mutex& singleThread) //throw FileError
@@ -915,6 +915,14 @@ private:
};
+template <class List> inline
+bool haveNameClash(const Zstring& itemName, const List& m)
+{
+ return std::any_of(m.begin(), m.end(),
+ [&](const typename List::value_type& obj) { return equalNoCase(obj.getItemNameAny(), itemName); }); //equalNoCase: when in doubt => assume name clash!
+}
+
+
class FolderPairSyncer
{
public:
@@ -960,25 +968,18 @@ private:
static PassNo getPass(const SymlinkPair& link);
static PassNo getPass(const FolderPair& folder);
static bool needZeroPass(const FilePair& file);
+ static bool needZeroPass(const FolderPair& folder);
static void runPass(PassNo pass, SyncCtx& syncCtx, BaseFolderPair& baseFolder, ProcessCallback& cb); //throw X
RingBuffer<Workload::WorkItems> getFolderLevelWorkItems(PassNo pass, ContainerObject& parentFolder, Workload& workload);
- enum class CmtfStatus //CreateMoveTargetFolderStatus
- {
- AVAILABLE,
- NAME_CLASH,
- SOURCE_MISSING
- };
- template <SelectedSide side> void setup2StepMove(FilePair& sourceFile, FilePair& targetFile); //throw FileError, ThreadInterruption
- template <SelectedSide side> CmtfStatus createMoveTargetFolder(FileSystemObject& fsObj); //throw FileError, ThreadInterruption
- template <SelectedSide side> void resolveMoveConflicts(FilePair& sourceFile, FilePair& targetFile); //throw FileError, ThreadInterruption
-
- void prepareFileMove(FilePair& file); //throw ThreadInterruption
+ static bool containsMoveTarget(const FolderPair& parent);
+ void executeFileMove(FilePair& file); //throw ThreadInterruption
+ template <SelectedSide side> void executeFileMoveImpl(FilePair& fileFrom, FilePair& fileTo); //throw ThreadInterruption
void synchronizeFile(FilePair& file); //
- template <SelectedSide side> void synchronizeFileInt(FilePair& file, SyncOperation syncOp); //throw FileError, ThreadInterruption
+ template <SelectedSide side> void synchronizeFileInt(FilePair& file, SyncOperation syncOp); //throw FileError, ErrorMoveUnsupported, ThreadInterruption
void synchronizeLink(SymlinkPair& link); //
template <SelectedSide sideTrg> void synchronizeLinkInt(SymlinkPair& link, SyncOperation syncOp); //throw FileError, ThreadInterruption
@@ -1094,38 +1095,56 @@ RingBuffer<Workload::WorkItems> FolderPairSyncer::getFolderLevelWorkItems(PassNo
RingBuffer<std::function<void()>> workItems;
- //synchronize folders:
- for (FolderPair& folder : hierObj.refSubFolders())
- if (pass == getPass(folder))
- workItems.push_back([this, &folder, &workload, pass]
- {
- tryReportingError([&] { synchronizeFolder(folder); }, acb_); //throw ThreadInterruption
-
- workload.addWorkItems(getFolderLevelWorkItems(pass, folder, workload));
- });
+ if (pass == PassNo::zero)
+ {
+ for (FilePair& file : hierObj.refSubFiles())
+ if (needZeroPass(file))
+ workItems.push_back([this, &file] { executeFileMove(file); /*throw ThreadInterruption*/ });
+
+ //create folders as required by file move targets:
+ for (FolderPair& folder : hierObj.refSubFolders())
+ if (needZeroPass(folder) &&
+ !haveNameClash(folder.getItemNameAny(), folder.parent().refSubFiles()) && //name clash with files/symlinks? obscure => skip folder creation
+ !haveNameClash(folder.getItemNameAny(), folder.parent().refSubLinks())) // => move: fall back to delete + copy
+ workItems.push_back([this, &folder, &workload, pass]
+ {
+ tryReportingError([&] { synchronizeFolder(folder); }, acb_); //throw ThreadInterruption
+ //error? => still process move targets (for delete + copy fall back!)
+ workload.addWorkItems(getFolderLevelWorkItems(pass, folder, workload));
+ });
+ else
+ foldersToInspect.push_back(&folder);
+ }
else
- foldersToInspect.push_back(&folder);
+ {
+ //synchronize folders:
+ for (FolderPair& folder : hierObj.refSubFolders())
+ if (pass == getPass(folder))
+ workItems.push_back([this, &folder, &workload, pass]
+ {
+ tryReportingError([&] { synchronizeFolder(folder); }, acb_); //throw ThreadInterruption
- //synchronize files:
- for (FilePair& file : hierObj.refSubFiles())
- if (pass == PassNo::zero)
- {
- if (needZeroPass(file))
- workItems.push_back([this, &file] { prepareFileMove(file); /*throw ThreadInterruption*/ });
- }
- else if (pass == getPass(file))
- workItems.push_back([this, &file]
- {
- tryReportingError([&] { synchronizeFile(file); }, acb_); //throw ThreadInterruption
- });
+ workload.addWorkItems(getFolderLevelWorkItems(pass, folder, workload));
+ });
+ else
+ foldersToInspect.push_back(&folder);
- //synchronize symbolic links:
- for (SymlinkPair& symlink : hierObj.refSubLinks())
- if (pass == getPass(symlink))
- workItems.push_back([this, &symlink]
- {
- tryReportingError([&] { synchronizeLink(symlink); }, acb_); //throw ThreadInterruption
- });
+ //synchronize files:
+ for (FilePair& file : hierObj.refSubFiles())
+ if (pass == getPass(file))
+ workItems.push_back([this, &file]
+ {
+ tryReportingError([&] { synchronizeFile(file); }, acb_); //throw ThreadInterruption
+ });
+
+ //synchronize symbolic links:
+ for (SymlinkPair& symlink : hierObj.refSubLinks())
+ if (pass == getPass(symlink))
+ workItems.push_back([this, &symlink]
+ {
+ tryReportingError([&] { synchronizeLink(symlink); }, acb_); //throw ThreadInterruption
+ });
+ }
if (!workItems.empty())
buckets.push_back(std::move(workItems));
@@ -1136,321 +1155,213 @@ RingBuffer<Workload::WorkItems> FolderPairSyncer::getFolderLevelWorkItems(PassNo
/*
-__________________________
-|Move algorithm, 0th pass|
---------------------------
-1. loop over hierarchy and find "move source"
+ __________________________
+ |Move algorithm, 0th pass|
+ --------------------------
+ 1. loop over hierarchy and find "move targets" => remember required parent folders
-2. check whether parent directory of "move source" is going to be deleted or location of "move source" may lead to name clash with other dir/symlink
- -> no: delay move until 2nd pass
+ 2. create required folders hierarchically:
+ - name-clash with other file/symlink (=> obscure!): fall back to delete and copy
+ - source folder missing: child items already deleted by synchronizeFolder()
+ - ignored error: fall back to delete and copy (in phases 1 and 2)
-3. create move target's parent directory recursively + execute move
- do we have name clash?
- -> prepare a 2-step move operation: 1. move source to base and update "move target" accordingly 2. delay move until 2nd pass
+ 3. start file move (via targets)
+ - name-clash with other folder/symlink (=> obscure!): fall back to delete and copy
+ - ErrorMoveUnsupported: fall back to delete and copy
+ - ignored error: fall back to delete and copy
-4. If any of the operations above did not succeed (even after retry), update statistics and revert to "copy + delete"
- Note: first pass may delete "move source"!!!
+ __________________
+ |killer-scenarios|
+ ------------------
+ propagate the following move sequences:
+ I) a -> a/a caveat syncing parent directory first leads to circular dependency!
-__________________
-|killer-scenarios|
-------------------
-propagate the following move sequences:
-I) a -> a/a caveat sync'ing parent directory first leads to circular dependency!
+ II) a/a -> a caveat: fixing name clash will remove source!
-II) a/a -> a caveat: fixing name clash will remove source!
+ III) c -> d caveat: move-sequence needs to be processed in correct order!
+ b -> c/b
+ a -> b/a */
-III) c -> d caveat: move-sequence needs to be processed in correct order!
- b -> c/b
- a -> b/a
-*/
-
-template <class List> inline
-bool haveNameClash(const Zstring& itemName, const List& m)
-{
- return std::any_of(m.begin(), m.end(),
- [&](const typename List::value_type& obj) { return equalNoCase(obj.getItemNameAny(), itemName); }); //equalNoCase: when in doubt => assume name clash!
-}
-
-
-template <SelectedSide side>
-void FolderPairSyncer::setup2StepMove(FilePair& sourceFile, //throw FileError, ThreadInterruption
- FilePair& targetFile)
-{
- //generate (hopefully) unique file name to avoid clashing with some remnant ffs_tmp file
- const Zstring shortGuid = printNumber<Zstring>(Zstr("%04x"), static_cast<unsigned int>(getCrc16(generateGUID())));
- const Zstring fileName = sourceFile.getItemName<side>();
- auto it = findLast(fileName.begin(), fileName.end(), Zstr('.')); //gracefully handle case of missing "."
-
- const Zstring sourceRelPathTmp = Zstring(fileName.begin(), it) + Zstr('.') + shortGuid + AFS::TEMP_FILE_ENDING;
- //-------------------------------------------------------------------------------------------
- //this could still lead to a name-clash in obscure cases, if some file exists on the other side with
- //the very same (.ffs_tmp) name and is copied before the second step of the move is executed
- //good news: even in this pathologic case, this may only prevent the copy of the other file, but not this move
-
- const AbstractPath sourcePathTmp = AFS::appendRelPath(sourceFile.base().getAbstractPath<side>(), sourceRelPathTmp);
-
- reportInfo(txtMovingFileXtoY_, //ThreadInterruption
- AFS::getDisplayPath(sourceFile.getAbstractPath<side>()),
- AFS::getDisplayPath(sourcePathTmp));
-
- parallel::moveAndRenameItem(sourceFile.getAbstractPath<side>(), sourcePathTmp, singleThread_); //throw FileError, (ErrorDifferentVolume)
-
- //TODO: prepare2StepMove: consider ErrorDifferentVolume! e.g. symlink aliasing!
-
- //update file hierarchy
- FilePair& tempFile = sourceFile.base().addSubFile<side>(afterLast(sourceRelPathTmp, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL), sourceFile.getAttributes<side>());
- static_assert(std::is_same_v<ContainerObject::FileList, std::list<FilePair>>,
- "ATTENTION: we're adding to the file list WHILE looping over it! This is only working because std::list iterators are not invalidated by insertion!");
- sourceFile.removeObject<side>(); //remove only *after* evaluating "sourceFile, side"!
- //note: this new item is *not* considered at the end of 0th pass because "!sourceWillBeDeleted && !haveNameClash"
-
- //prepare move in second pass
- tempFile.setSyncDir(side == LEFT_SIDE ? SyncDirection::LEFT : SyncDirection::RIGHT);
-
- targetFile.setMoveRef(tempFile .getId());
- tempFile .setMoveRef(targetFile.getId());
-
- //NO statistics update!
-}
-
-
-//returns: CmtfStatus::AVAILABLE
-// CmtfStatus::NAME_CLASH
-// CmtfStatus::SOURCE_MISSING
template <SelectedSide side>
-auto FolderPairSyncer::createMoveTargetFolder(FileSystemObject& fsObj) -> CmtfStatus //throw FileError, ThreadInterruption
+void FolderPairSyncer::executeFileMoveImpl(FilePair& fileFrom, FilePair& fileTo) //throw ThreadInterruption
{
- if (auto parentFolder = dynamic_cast<FolderPair*>(&fsObj.parent()))
+ const bool fallBackCopyDelete = [&]
{
- const CmtfStatus cmtfs = createMoveTargetFolder<side>(*parentFolder);
- if (cmtfs != CmtfStatus::AVAILABLE)
- return cmtfs;
+ //creation of parent folder has failed earlier? => fall back to delete + copy
+ const FolderPair* parentMissing = nullptr; //let's be more specific: go up in hierarchy until first missing parent folder
+ for (const FolderPair* f = dynamic_cast<const FolderPair*>(&fileTo.parent()); f && f->isEmpty<side>(); f = dynamic_cast<const FolderPair*>(&f->parent()))
+ parentMissing = f;
- //detect (and try to resolve) file type conflicts: 1. symlinks 2. files
- const Zstring& folderName = parentFolder->getItemNameAny();
- if (haveNameClash(folderName, parentFolder->parent().refSubLinks()) ||
- haveNameClash(folderName, parentFolder->parent().refSubFiles()))
- return CmtfStatus::NAME_CLASH;
+ if (parentMissing)
+ {
+ reportInfo(_("Cannot move file %x to %y.") + L"\n\n" +
+ replaceCpy(_("Parent folder %x is not existing."), L"%x", fmtPath(AFS::getDisplayPath(parentMissing->getAbstractPath<side>()))),
+ AFS::getDisplayPath(fileFrom.getAbstractPath<side>()),
+ AFS::getDisplayPath(fileTo .getAbstractPath<side>())); //throw ThreadInterruption
+ return true;
+ }
- //-------- create parent folder if needed --------------
- constexpr SelectedSide sideSrc = OtherSide<side>::value;
- assert(!parentFolder->isEmpty<sideSrc>());
+ //name clash with folders/symlinks? obscure => fall back to delete + copy
+ if (haveNameClash(fileTo.getItemNameAny(), fileTo.parent().refSubFolders()) ||
+ haveNameClash(fileTo.getItemNameAny(), fileTo.parent().refSubLinks ()))
+ {
+ reportInfo(_("Cannot move file %x to %y.") + L"\n\n" + replaceCpy(_("The name %x is already used by another item."), L"%x", fmtPath(fileTo.getItemNameAny())),
+ AFS::getDisplayPath(fileFrom.getAbstractPath<side>()),
+ AFS::getDisplayPath(fileTo .getAbstractPath<side>())); //throw ThreadInterruption
+ return true;
+ }
- switch (parentFolder->getSyncOperation())
+ bool moveSupported = true;
+ const std::wstring errMsg = tryReportingError([&] //throw ThreadInterruption
{
- case SO_CREATE_NEW_LEFT:
- case SO_CREATE_NEW_RIGHT:
+ try
{
- const AbstractPath targetPath = parentFolder->getAbstractPath<side>();
- reportInfo(txtCreatingFolder_, AFS::getDisplayPath(targetPath)); //throw ThreadInterruption
-
- //shallow-"copying" a folder might not fail if source is missing, so we need to check this first:
- if (parallel::itemStillExists(parentFolder->getAbstractPath<sideSrc>(), singleThread_)) //throw FileError
- {
- AsyncItemStatReporter statReporter(1, 0, acb_);
- try
- {
- //target existing: fail/ignore
- parallel::copyNewFolder(parentFolder->getAbstractPath<sideSrc>(), targetPath, copyFilePermissions_, singleThread_); //throw FileError
- }
- catch (FileError&)
- {
- bool folderAlreadyExists = false;
- try { folderAlreadyExists = parallel::getItemType(targetPath, singleThread_) == AFS::ItemType::FOLDER; } /*throw FileError*/ catch (FileError&) {}
- if (!folderAlreadyExists) //previous exception is more relevant; good enough? https://freefilesync.org/forum/viewtopic.php?t=5266
- throw;
- }
- statReporter.reportDelta(1, 0);
-
- parentFolder->setSyncedTo<side>(parentFolder->getItemName<sideSrc>(),
- false /*isSymlinkTrg*/,
- parentFolder->isFollowedSymlink<sideSrc>());
- }
- else //source deleted meanwhile...
- {
- //attention when fixing statistics due to missing folder: child items may be scheduled for move, so deletion will have move-references flip back to copy + delete!
- const SyncStatistics statsBefore(parentFolder->base()); //=> don't bother considering move operations, just calculate over the whole tree
- parentFolder->removeObject<sideSrc>(); //DON'T physically delete child objects while we're still evaluating them, e.g. fsObj, and in caller code!!!
- const SyncStatistics statsAfter(parentFolder->base());
-
- acb_.updateDataProcessed(1, 0); //even if the source item does not exist anymore, significant I/O work was done => report
- acb_.updateDataTotal(getCUD(statsAfter) - getCUD(statsBefore) + 1, statsAfter.getBytesToProcess() - statsBefore.getBytesToProcess()); //noexcept
-
- reportInfo(txtSourceItemNotFound_, AFS::getDisplayPath(parentFolder->getAbstractPath<sideSrc>())); //throw ThreadInterruption
- return CmtfStatus::SOURCE_MISSING;
- }
+ synchronizeFile(fileTo); //throw FileError, ErrorMoveUnsupported, ThreadInterruption
}
- break;
-
- case SO_DO_NOTHING: //!isEmpty<side>(); see FolderPair::getSyncOperation()
- case SO_UNRESOLVED_CONFLICT: //
- case SO_OVERWRITE_LEFT: //possible: e.g. manually-resolved dir-traversal conflict
- case SO_OVERWRITE_RIGHT: //
- case SO_COPY_METADATA_TO_LEFT:
- case SO_COPY_METADATA_TO_RIGHT:
- case SO_EQUAL:
- assert(!parentFolder->isEmpty<side>());
- break; //we're good
-
- case SO_DELETE_LEFT: //not possible in the context of planning to move a child item, see FolderPair::getSyncOperation()
- case SO_DELETE_RIGHT: //
- case SO_MOVE_LEFT_FROM: //status not possible for folder
- case SO_MOVE_RIGHT_FROM: //
- case SO_MOVE_LEFT_TO: //
- case SO_MOVE_RIGHT_TO: //
- assert(false);
- break;
- }
- }
- return CmtfStatus::AVAILABLE;
-}
-
-
-template <SelectedSide side>
-void FolderPairSyncer::resolveMoveConflicts(FilePair& sourceFile, //throw FileError, ThreadInterruption
- FilePair& targetFile)
-{
- assert((sourceFile.getSyncOperation() == SO_MOVE_LEFT_FROM && targetFile.getSyncOperation() == SO_MOVE_LEFT_TO && side == LEFT_SIDE) ||
- (sourceFile.getSyncOperation() == SO_MOVE_RIGHT_FROM && targetFile.getSyncOperation() == SO_MOVE_RIGHT_TO && side == RIGHT_SIDE));
-
- const bool sourceWillBeDeleted = [&]
- {
- if (auto parentFolder = dynamic_cast<const FolderPair*>(&sourceFile.parent()))
- switch (parentFolder->getSyncOperation()) //evaluate comparison result and sync direction
+ catch (const ErrorMoveUnsupported& e)
{
- case SO_DELETE_LEFT:
- case SO_DELETE_RIGHT:
- return true; //we need to do something about this!
- case SO_MOVE_LEFT_FROM:
- case SO_MOVE_RIGHT_FROM:
- case SO_MOVE_LEFT_TO:
- case SO_MOVE_RIGHT_TO:
- case SO_OVERWRITE_LEFT:
- case SO_OVERWRITE_RIGHT:
- case SO_CREATE_NEW_LEFT:
- case SO_CREATE_NEW_RIGHT:
- case SO_DO_NOTHING:
- case SO_EQUAL:
- case SO_UNRESOLVED_CONFLICT:
- case SO_COPY_METADATA_TO_LEFT:
- case SO_COPY_METADATA_TO_RIGHT:
- break;
+ acb_.reportInfo(e.toString()); //let user know that move operation is not supported, then fall back:
+ moveSupported = false;
}
- return false;
+ }, acb_);
+
+ return !errMsg.empty() || !moveSupported; //move failed? We cannot allow to continue and have move source's parent directory deleted, messing up statistics!
}();
- auto haveNameClash = [](const FilePair& file)
+ if (fallBackCopyDelete)
{
- return ::haveNameClash(file.getItemNameAny(), file.parent().refSubLinks()) ||
- ::haveNameClash(file.getItemNameAny(), file.parent().refSubFolders());
- };
+ auto getStats = [&]() -> std::pair<int, int64_t>
+ {
+ SyncStatistics statSrc(fileFrom);
+ SyncStatistics statTrg(fileTo);
+ return { getCUD(statSrc) + getCUD(statTrg), statSrc.getBytesToProcess() + statTrg.getBytesToProcess() };
+ };
+ const auto [itemsBefore, bytesBefore] = getStats();
+ fileFrom.setMoveRef(nullptr);
+ fileTo .setMoveRef(nullptr);
+ const auto [itemsAfter, bytesAfter] = getStats();
- if (sourceWillBeDeleted || haveNameClash(sourceFile))
- {
- //prepare for move now: - revert to 2-step move on name clashes
- if (haveNameClash(targetFile) ||
- createMoveTargetFolder<side>(targetFile) == CmtfStatus::NAME_CLASH) //throw FileError, ThreadInterruption
- return setup2StepMove<side>(sourceFile, targetFile); //throw FileError, ThreadInterruption
-
- //finally start move! this should work now:
- synchronizeFile(targetFile); //throw FileError, ThreadInterruption
- //- FolderPairSyncer::synchronizeFileInt() is *not* expecting SO_MOVE_LEFT_FROM/SO_MOVE_RIGHT_FROM => start move from targetFile, not sourceFile!
- //- function call will be NOOP if CmtfStatus::SOURCE_MISSING
+ //fix statistics total to match "copy + delete"
+ acb_.updateDataTotal(itemsAfter - itemsBefore, bytesAfter - bytesBefore); //noexcept
}
- //else: sourceFile will not be deleted, and is not standing in the way => delay to second pass
- //note: this also applies for new "move sources" from two-step sub-routine!!!
}
-void FolderPairSyncer::prepareFileMove(FilePair& file) //throw ThreadInterruption
+void FolderPairSyncer::executeFileMove(FilePair& file) //throw ThreadInterruption
{
const SyncOperation syncOp = file.getSyncOperation();
- switch (syncOp) //evaluate comparison result and sync direction
+ switch (syncOp)
{
- case SO_MOVE_LEFT_FROM:
- case SO_MOVE_RIGHT_FROM:
- if (FilePair* targetObj = dynamic_cast<FilePair*>(FileSystemObject::retrieve(file.getMoveRef())))
+ case SO_MOVE_LEFT_TO:
+ case SO_MOVE_RIGHT_TO:
+ if (FilePair* fileFrom = dynamic_cast<FilePair*>(FileSystemObject::retrieve(file.getMoveRef())))
{
- FilePair* sourceObj = &file;
- assert(targetObj->getMoveRef() == sourceObj->getId());
-
- const std::wstring errMsg = tryReportingError([&] //throw ThreadInterruption
- {
- if (syncOp == SO_MOVE_LEFT_FROM)
- resolveMoveConflicts<LEFT_SIDE>(*sourceObj, *targetObj); //throw FileError, ThreadInterruption
- else
- resolveMoveConflicts<RIGHT_SIDE>(*sourceObj, *targetObj); //
- }, acb_); //throw ThreadInterruption
+ assert(fileFrom->getMoveRef() == file.getId());
- if (!errMsg.empty())
- {
- //move operation has failed! We cannot allow to continue and have move source's parent directory deleted, messing up statistics!
- // => revert to ordinary "copy + delete"
- auto getStats = [&]() -> std::pair<int, int64_t>
- {
- SyncStatistics statSrc(*sourceObj);
- SyncStatistics statTrg(*targetObj);
- return { getCUD(statSrc) + getCUD(statTrg), statSrc.getBytesToProcess() + statTrg.getBytesToProcess() };
- };
- const auto [itemsBefore, bytesBefore] = getStats();
- sourceObj->setMoveRef(nullptr);
- targetObj->setMoveRef(nullptr);
- const auto [itemsAfter, bytesAfter] = getStats();
-
- //fix statistics total to match "copy + delete"
- acb_.updateDataTotal(itemsAfter - itemsBefore, bytesAfter - bytesBefore); //noexcept
- }
+ if (syncOp == SO_MOVE_LEFT_TO)
+ executeFileMoveImpl<LEFT_SIDE>(*fileFrom, file); //throw ThreadInterruption
+ else
+ executeFileMoveImpl<RIGHT_SIDE>(*fileFrom, file); //throw ThreadInterruption
}
else assert(false);
break;
- case SO_MOVE_LEFT_TO: //it's enough to try each move-pair *once*
- case SO_MOVE_RIGHT_TO: //
+ case SO_CREATE_NEW_LEFT:
+ case SO_CREATE_NEW_RIGHT:
case SO_DELETE_LEFT:
case SO_DELETE_RIGHT:
+ case SO_MOVE_LEFT_FROM: //don't try to move more than *once* per pair
+ case SO_MOVE_RIGHT_FROM: //
case SO_OVERWRITE_LEFT:
case SO_OVERWRITE_RIGHT:
- case SO_CREATE_NEW_LEFT:
- case SO_CREATE_NEW_RIGHT:
+ case SO_COPY_METADATA_TO_LEFT:
+ case SO_COPY_METADATA_TO_RIGHT:
case SO_DO_NOTHING:
case SO_EQUAL:
case SO_UNRESOLVED_CONFLICT:
+ assert(false); //should have been filtered out by FolderPairSyncer::needZeroPass()
+ break;
+ }
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+bool FolderPairSyncer::containsMoveTarget(const FolderPair& parent)
+{
+ for (const FilePair& file : parent.refSubFiles())
+ if (needZeroPass(file))
+ return true;
+
+ for (const FolderPair& subFolder : parent.refSubFolders())
+ if (containsMoveTarget(subFolder))
+ return true;
+ return false;
+}
+
+
+//0th pass: execute file moves (+ optional fallback to delete/copy in passes 1 and 2)
+bool FolderPairSyncer::needZeroPass(const FolderPair& folder)
+{
+ switch (folder.getSyncOperation())
+ {
+ case SO_CREATE_NEW_LEFT:
+ case SO_CREATE_NEW_RIGHT:
+ return containsMoveTarget(folder); //recursive! watch perf!
+
+ case SO_DO_NOTHING: //implies !isEmpty<side>(); see FolderPair::getSyncOperation()
+ case SO_UNRESOLVED_CONFLICT: //
+ case SO_EQUAL:
+ case SO_OVERWRITE_LEFT: //possible: e.g. manually-resolved dir-traversal conflict
+ case SO_OVERWRITE_RIGHT: //
case SO_COPY_METADATA_TO_LEFT:
case SO_COPY_METADATA_TO_RIGHT:
+ assert((!folder.isEmpty<LEFT_SIDE>() && !folder.isEmpty<RIGHT_SIDE>()) || !containsMoveTarget(folder));
+ //we're good to move contained items
+ break;
+ case SO_DELETE_LEFT: //not possible in the context of planning to move a child item, see FolderPair::getSyncOperation()
+ case SO_DELETE_RIGHT: //
+ assert(!containsMoveTarget(folder));
+ break;
+ case SO_MOVE_LEFT_FROM: //
+ case SO_MOVE_RIGHT_FROM: //status not possible for folder
+ case SO_MOVE_LEFT_TO: //
+ case SO_MOVE_RIGHT_TO: //
+ assert(false);
break;
}
+ return false;
}
-//---------------------------------------------------------------------------------------------------------------
inline
bool FolderPairSyncer::needZeroPass(const FilePair& file)
{
switch (file.getSyncOperation())
{
- case SO_MOVE_LEFT_FROM:
- case SO_MOVE_RIGHT_FROM:
+ case SO_MOVE_LEFT_TO:
+ case SO_MOVE_RIGHT_TO:
return true;
- case SO_MOVE_LEFT_TO: //it's enough to try each move-pair *once*
- case SO_MOVE_RIGHT_TO: //
+ case SO_CREATE_NEW_LEFT:
+ case SO_CREATE_NEW_RIGHT:
case SO_DELETE_LEFT:
case SO_DELETE_RIGHT:
+ case SO_MOVE_LEFT_FROM: //don't try to move more than *once* per pair
+ case SO_MOVE_RIGHT_FROM: //
case SO_OVERWRITE_LEFT:
case SO_OVERWRITE_RIGHT:
- case SO_CREATE_NEW_LEFT:
- case SO_CREATE_NEW_RIGHT:
+ case SO_COPY_METADATA_TO_LEFT:
+ case SO_COPY_METADATA_TO_RIGHT:
case SO_DO_NOTHING:
case SO_EQUAL:
case SO_UNRESOLVED_CONFLICT:
- case SO_COPY_METADATA_TO_LEFT:
- case SO_COPY_METADATA_TO_RIGHT:
break;
}
return false;
}
-//1st, 2nd pass requirements:
+
+//1st, 2nd pass benefits:
// - avoid disk space shortage: 1. delete files, 2. overwrite big with small files first
// - support change in type: overwrite file by directory, symlink by file, etc.
@@ -1488,7 +1399,7 @@ FolderPairSyncer::PassNo FolderPairSyncer::getPass(const FilePair& file)
return PassNo::never;
}
assert(false);
- return PassNo::never; //dummy
+ return PassNo::never;
}
@@ -1520,7 +1431,7 @@ FolderPairSyncer::PassNo FolderPairSyncer::getPass(const SymlinkPair& link)
return PassNo::never;
}
assert(false);
- return PassNo::never; //dummy
+ return PassNo::never;
}
@@ -1552,13 +1463,13 @@ FolderPairSyncer::PassNo FolderPairSyncer::getPass(const FolderPair& folder)
return PassNo::never;
}
assert(false);
- return PassNo::never; //dummy
+ return PassNo::never;
}
//---------------------------------------------------------------------------------------------------------------
inline
-void FolderPairSyncer::synchronizeFile(FilePair& file) //throw FileError, ThreadInterruption
+void FolderPairSyncer::synchronizeFile(FilePair& file) //throw FileError, ErrorMoveUnsupported, ThreadInterruption
{
const SyncOperation syncOp = file.getSyncOperation();
@@ -1573,7 +1484,7 @@ void FolderPairSyncer::synchronizeFile(FilePair& file) //throw FileError, Thread
template <SelectedSide sideTrg>
-void FolderPairSyncer::synchronizeFileInt(FilePair& file, SyncOperation syncOp) //throw FileError, ThreadInterruption
+void FolderPairSyncer::synchronizeFileInt(FilePair& file, SyncOperation syncOp) //throw FileError, ErrorMoveUnsupported, ThreadInterruption
{
constexpr SelectedSide sideSrc = OtherSide<sideTrg>::value;
DeletionHandler& delHandlerTrg = SelectParam<sideTrg>::ref(delHandlerLeft_, delHandlerRight_);
@@ -1648,37 +1559,36 @@ void FolderPairSyncer::synchronizeFileInt(FilePair& file, SyncOperation syncOp)
case SO_MOVE_LEFT_TO:
case SO_MOVE_RIGHT_TO:
- if (FilePair* moveFrom = dynamic_cast<FilePair*>(FileSystemObject::retrieve(file.getMoveRef())))
+ if (FilePair* fileFrom = dynamic_cast<FilePair*>(FileSystemObject::retrieve(file.getMoveRef())))
{
- FilePair* moveTo = &file;
- assert(moveFrom->getMoveRef() == moveTo->getId());
+ FilePair* fileTo = &file;
+ assert(fileFrom->getMoveRef() == fileTo->getId());
- assert((moveFrom->getSyncOperation() == SO_MOVE_LEFT_FROM && moveTo->getSyncOperation() == SO_MOVE_LEFT_TO && sideTrg == LEFT_SIDE) ||
- (moveFrom->getSyncOperation() == SO_MOVE_RIGHT_FROM && moveTo->getSyncOperation() == SO_MOVE_RIGHT_TO && sideTrg == RIGHT_SIDE));
+ assert((fileFrom->getSyncOperation() == SO_MOVE_LEFT_FROM && fileTo->getSyncOperation() == SO_MOVE_LEFT_TO && sideTrg == LEFT_SIDE) ||
+ (fileFrom->getSyncOperation() == SO_MOVE_RIGHT_FROM && fileTo->getSyncOperation() == SO_MOVE_RIGHT_TO && sideTrg == RIGHT_SIDE));
- const AbstractPath pathFrom = moveFrom->getAbstractPath<sideTrg>();
- const AbstractPath pathTo = moveTo ->getAbstractPath<sideTrg>();
+ const AbstractPath pathFrom = fileFrom->getAbstractPath<sideTrg>();
+ const AbstractPath pathTo = fileTo ->getAbstractPath<sideTrg>();
reportInfo(txtMovingFileXtoY_, AFS::getDisplayPath(pathFrom), AFS::getDisplayPath(pathTo)); //throw ThreadInterruption
AsyncItemStatReporter statReporter(1, 0, acb_);
- //TODO: synchronizeFileInt: consider ErrorDifferentVolume! e.g. symlink aliasing!
-
- parallel::moveAndRenameItem(pathFrom, pathTo, singleThread_); //throw FileError, (ErrorDifferentVolume)
+ parallel::moveAndRenameItem(pathFrom, pathTo, singleThread_); //throw FileError, ErrorMoveUnsupported
statReporter.reportDelta(1, 0);
//update FilePair
- assert(moveFrom->getFileSize<sideTrg>() == moveTo->getFileSize<sideSrc>());
- moveTo->setSyncedTo<sideTrg>(moveTo->getItemName<sideSrc>(), moveTo->getFileSize<sideSrc>(),
- moveFrom->getLastWriteTime<sideTrg>(), //awkward naming! moveFrom is renamed on "sideTrg" side!
- moveTo ->getLastWriteTime<sideSrc>(),
- moveFrom->getFileId<sideTrg>(),
- moveTo ->getFileId<sideSrc>(),
- moveFrom->isFollowedSymlink<sideTrg>(),
- moveTo ->isFollowedSymlink<sideSrc>());
- moveFrom->removeObject<sideTrg>(); //remove only *after* evaluating "moveFrom, sideTrg"!
+ assert(fileFrom->getFileSize<sideTrg>() == fileTo->getFileSize<sideSrc>());
+ fileTo->setSyncedTo<sideTrg>(fileTo->getItemName<sideSrc>(),
+ fileTo->getFileSize<sideSrc>(),
+ fileFrom->getLastWriteTime<sideTrg>(),
+ fileTo ->getLastWriteTime<sideSrc>(),
+ fileFrom->getFileId<sideTrg>(),
+ fileTo ->getFileId<sideSrc>(),
+ fileFrom->isFollowedSymlink<sideTrg>(),
+ fileTo ->isFollowedSymlink<sideSrc>());
+ fileFrom->removeObject<sideTrg>(); //remove only *after* evaluating "fileFrom, sideTrg"!
}
else (assert(false));
break;
@@ -1701,7 +1611,7 @@ void FolderPairSyncer::synchronizeFileInt(FilePair& file, SyncOperation syncOp)
if (file.isFollowedSymlink<sideTrg>()) //since we follow the link, we need to sync case sensitivity of the link manually!
if (getUnicodeNormalForm(file.getItemName<sideTrg>()) !=
getUnicodeNormalForm(file.getItemName<sideSrc>())) //have difference in case?
- parallel::moveAndRenameItem(file.getAbstractPath<sideTrg>(), targetPathLogical, singleThread_); //throw FileError, (ErrorDifferentVolume)
+ parallel::moveAndRenameItem(file.getAbstractPath<sideTrg>(), targetPathLogical, singleThread_); //throw FileError, (ErrorMoveUnsupported)
auto onDeleteTargetFile = [&] //delete target at appropriate time
{
@@ -1750,7 +1660,7 @@ void FolderPairSyncer::synchronizeFileInt(FilePair& file, SyncOperation syncOp)
if (getUnicodeNormalForm(file.getItemName<sideTrg>()) !=
getUnicodeNormalForm(file.getItemName<sideSrc>())) //have difference in case?
- parallel::moveAndRenameItem(file.getAbstractPath<sideTrg>(), //throw FileError, (ErrorDifferentVolume)
+ parallel::moveAndRenameItem(file.getAbstractPath<sideTrg>(), //throw FileError, (ErrorMoveUnsupported)
AFS::appendRelPath(file.parent().getAbstractPath<sideTrg>(), file.getItemName<sideSrc>()), singleThread_);
else
assert(false);
@@ -1906,7 +1816,7 @@ void FolderPairSyncer::synchronizeLinkInt(SymlinkPair& symlink, SyncOperation sy
if (getUnicodeNormalForm(symlink.getItemName<sideTrg>()) !=
getUnicodeNormalForm(symlink.getItemName<sideSrc>())) //have difference in case?
- parallel::moveAndRenameItem(symlink.getAbstractPath<sideTrg>(), //throw FileError, (ErrorDifferentVolume)
+ parallel::moveAndRenameItem(symlink.getAbstractPath<sideTrg>(), //throw FileError, (ErrorMoveUnsupported)
AFS::appendRelPath(symlink.parent().getAbstractPath<sideTrg>(), symlink.getItemName<sideSrc>()), singleThread_);
else
assert(false);
@@ -2000,7 +1910,7 @@ void FolderPairSyncer::synchronizeFolderInt(FolderPair& folder, SyncOperation sy
else //source deleted meanwhile...
{
//attention when fixing statistics due to missing folder: child items may be scheduled for move, so deletion will have move-references flip back to copy + delete!
- const SyncStatistics statsBefore(folder.base()); //=> don't bother considering move operations, just calculate over the whole tree
+ const SyncStatistics statsBefore(folder.base()); //=> don't bother considering individual move operations, just calculate over the whole tree
folder.refSubFiles ().clear(); //
folder.refSubLinks ().clear(); //update FolderPair
folder.refSubFolders().clear(); //
@@ -2043,7 +1953,7 @@ void FolderPairSyncer::synchronizeFolderInt(FolderPair& folder, SyncOperation sy
if (getUnicodeNormalForm(folder.getItemName<sideTrg>()) !=
getUnicodeNormalForm(folder.getItemName<sideSrc>())) //have difference in case?
- parallel::moveAndRenameItem(folder.getAbstractPath<sideTrg>(), //throw FileError, (ErrorDifferentVolume)
+ parallel::moveAndRenameItem(folder.getAbstractPath<sideTrg>(), //throw FileError, (ErrorMoveUnsupported)
AFS::appendRelPath(folder.parent().getAbstractPath<sideTrg>(), folder.getItemName<sideSrc>()), singleThread_);
else
assert(false);
diff --git a/FreeFileSync/Source/base/versioning.cpp b/FreeFileSync/Source/base/versioning.cpp
index f9de8ea4..bdc357a5 100644
--- a/FreeFileSync/Source/base/versioning.cpp
+++ b/FreeFileSync/Source/base/versioning.cpp
@@ -129,10 +129,10 @@ void moveExistingItemToVersioning(const AbstractPath& sourcePath, const Abstract
try //first try to move directly without copying
{
- AFS::moveAndRenameItem(sourcePath, targetPath); //throw FileError, ErrorDifferentVolume
+ AFS::moveAndRenameItem(sourcePath, targetPath); //throw FileError, ErrorMoveUnsupported
//great, we get away cheaply!
}
- catch (ErrorDifferentVolume&)
+ catch (ErrorMoveUnsupported&)
{
try
{
@@ -154,9 +154,9 @@ void moveExistingItemToVersioning(const AbstractPath& sourcePath, const Abstract
try //retry
{
- AFS::moveAndRenameItem(sourcePath, targetPath); //throw FileError, ErrorDifferentVolume
+ AFS::moveAndRenameItem(sourcePath, targetPath); //throw FileError, ErrorMoveUnsupported
}
- catch (ErrorDifferentVolume&)
+ catch (ErrorMoveUnsupported&)
{
copyNewItemPlain(); //throw FileError
AFS::removeFilePlain(sourcePath); //throw FileError
diff --git a/FreeFileSync/Source/fs/abstract.cpp b/FreeFileSync/Source/fs/abstract.cpp
index 294484e3..a73b52f3 100644
--- a/FreeFileSync/Source/fs/abstract.cpp
+++ b/FreeFileSync/Source/fs/abstract.cpp
@@ -184,7 +184,7 @@ AFS::FileCopyResult AFS::copyFileTransactional(const AbstractPath& apSource, con
//fall back to stream-based file copy:
if (copyFilePermissions)
throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(AFS::getDisplayPath(apTargetTmp))),
- _("Operation not supported for different base folder types."));
+ _("Operation not supported between different devices."));
return apSource.afsDevice.ref().copyFileAsStream(apSource.afsPath, attrSource, apTargetTmp, notifyUnbufferedIO); //throw FileError, ErrorFileLocked, X
//target existing: undefined behavior! (fail/overwrite/auto-rename)
@@ -222,7 +222,7 @@ AFS::FileCopyResult AFS::copyFileTransactional(const AbstractPath& apSource, con
onDeleteTargetFile(); //throw X
//perf: this call is REALLY expensive on unbuffered volumes! ~40% performance decrease on FAT USB stick!
- moveAndRenameItem(apTargetTmp, apTarget); //throw FileError, (ErrorDifferentVolume)
+ moveAndRenameItem(apTargetTmp, apTarget); //throw FileError, (ErrorMoveUnsupported)
/*
CAVEAT on FAT/FAT32: the sequence of deleting the target file and renaming "file.txt.ffs_tmp" to "file.txt" does
diff --git a/FreeFileSync/Source/fs/abstract.h b/FreeFileSync/Source/fs/abstract.h
index 5821870c..83b237e7 100644
--- a/FreeFileSync/Source/fs/abstract.h
+++ b/FreeFileSync/Source/fs/abstract.h
@@ -248,7 +248,7 @@ struct AbstractFileSystem //THREAD-SAFETY: "const" member functions must model t
//----------------------------------------------------------------------------------------------------------------
//target existing: undefined behavior! (fail/overwrite/auto-rename)
- static void moveAndRenameItem(const AbstractPath& apSource, const AbstractPath& apTarget); //throw FileError, ErrorDifferentVolume
+ static void moveAndRenameItem(const AbstractPath& pathFrom, const AbstractPath& pathTo); //throw FileError, ErrorMoveUnsupported
//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:
@@ -368,7 +368,7 @@ private:
virtual bool supportsPermissions(const AfsPath& afsPath) const = 0; //throw FileError
//target existing: undefined behavior! (fail/overwrite/auto-rename)
- virtual void moveAndRenameItemForSameAfsType(const AfsPath& afsPathSource, const AbstractPath& apTarget) const = 0; //throw FileError, ErrorDifferentVolume
+ virtual void moveAndRenameItemForSameAfsType(const AfsPath& pathFrom, const AbstractPath& pathTo) const = 0; //throw FileError, ErrorMoveUnsupported
//symlink handling: follow link!
//target existing: undefined behavior! (fail/overwrite/auto-rename)
@@ -488,16 +488,16 @@ bool AbstractFileSystem::supportPermissionCopy(const AbstractPath& apSource, con
inline
-void AbstractFileSystem::moveAndRenameItem(const AbstractPath& apSource, const AbstractPath& apTarget) //throw FileError, ErrorDifferentVolume
+void AbstractFileSystem::moveAndRenameItem(const AbstractPath& pathFrom, const AbstractPath& pathTo) //throw FileError, ErrorMoveUnsupported
{
using namespace zen;
- if (typeid(apSource.afsDevice.ref()) == typeid(apTarget.afsDevice.ref()))
- return apSource.afsDevice.ref().moveAndRenameItemForSameAfsType(apSource.afsPath, apTarget); //throw FileError, ErrorDifferentVolume
+ if (typeid(pathFrom.afsDevice.ref()) == typeid(pathTo.afsDevice.ref()))
+ return pathFrom.afsDevice.ref().moveAndRenameItemForSameAfsType(pathFrom.afsPath, pathTo); //throw FileError, ErrorMoveUnsupported
- throw ErrorDifferentVolume(replaceCpy(replaceCpy(_("Cannot move file %x to %y."),
- L"%x", L"\n" + fmtPath(getDisplayPath(apSource))),
- L"%y", L"\n" + fmtPath(getDisplayPath(apTarget))), _("Operation not supported for different base folder types."));
+ throw ErrorMoveUnsupported(replaceCpy(replaceCpy(_("Cannot move file %x to %y."),
+ L"%x", L"\n" + fmtPath(getDisplayPath(pathFrom))),
+ L"%y", L"\n" + fmtPath(getDisplayPath(pathTo))), _("Operation not supported between different devices."));
}
@@ -513,7 +513,7 @@ void AbstractFileSystem::copyNewFolder(const AbstractPath& apSource, const Abstr
//fall back:
if (copyFilePermissions)
throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(getDisplayPath(apTarget))),
- _("Operation not supported for different base folder types."));
+ _("Operation not supported between different devices."));
//already existing: fail/ignore
createFolderPlain(apTarget); //throw FileError
@@ -530,7 +530,7 @@ void AbstractFileSystem::copySymlink(const AbstractPath& apSource, const Abstrac
throw FileError(replaceCpy(replaceCpy(_("Cannot copy symbolic link %x to %y."),
L"%x", L"\n" + fmtPath(getDisplayPath(apSource))),
- L"%y", L"\n" + fmtPath(getDisplayPath(apTarget))), _("Operation not supported for different base folder types."));
+ L"%y", L"\n" + fmtPath(getDisplayPath(apTarget))), _("Operation not supported between different devices."));
}
}
diff --git a/FreeFileSync/Source/fs/abstract_impl.h b/FreeFileSync/Source/fs/abstract_impl.h
index 585c074e..7a175128 100644
--- a/FreeFileSync/Source/fs/abstract_impl.h
+++ b/FreeFileSync/Source/fs/abstract_impl.h
@@ -229,7 +229,7 @@ public:
{
const std::shared_ptr<PathAccessLocker> gpalh = getGlobalInstance(); //throw SysError
if (!gpalh)
- throw zen::SysError(L"Function call not allowed during process init/shutdown.");
+ throw zen::SysError(L"PathAccessLocker::Lock() function call not allowed during init/shutdown.");
m_ = gpalh->getOrCreateMutex(nativePath);
}
m_->lock();
diff --git a/FreeFileSync/Source/fs/ftp.cpp b/FreeFileSync/Source/fs/ftp.cpp
index 653994ed..02205263 100644
--- a/FreeFileSync/Source/fs/ftp.cpp
+++ b/FreeFileSync/Source/fs/ftp.cpp
@@ -283,16 +283,10 @@ Global<UniSessionCounter> globalFtpSessionCount(createUniSessionCounter());
class FtpSession
{
public:
- FtpSession(const FtpSessionId& sessionId) : sessionId_(sessionId) //throw FileError
- {
- try
- {
- libsshCurlUnifiedInitCookie_ = getLibsshCurlUnifiedInitCookie(globalFtpSessionCount); //throw SysError
- }
- catch (const SysError& e) { throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)), e.toString()); }
-
- lastSuccessfulUseTime_ = std::chrono::steady_clock::now();
- }
+ FtpSession(const FtpSessionId& sessionId) : //throw SysError
+ sessionId_(sessionId),
+ libsshCurlUnifiedInitCookie_(getLibsshCurlUnifiedInitCookie(globalFtpSessionCount)), //throw SysError
+ lastSuccessfulUseTime_(std::chrono::steady_clock::now()) {}
~FtpSession()
{
@@ -316,17 +310,16 @@ public:
//returns server response (header data)
std::string perform(const AfsPath* afsPath /*optional, use last-used path if null*/, bool isDir,
- const std::vector<Option>& extraOptions, bool requiresUtf8, int timeoutSec) //throw FileError, SysError
+ const std::vector<Option>& extraOptions, bool requiresUtf8, int timeoutSec) //throw SysError
{
- if (requiresUtf8) //avoid endless recusion
- sessionEnableUtf8(timeoutSec); //throw FileError
+ if (requiresUtf8) //avoid endless recursion
+ sessionEnableUtf8(timeoutSec); //throw SysError
if (!easyHandle_)
{
easyHandle_ = ::curl_easy_init();
if (!easyHandle_)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)),
- formatSystemError(L"curl_easy_init", formatCurlErrorRaw(CURLE_OUT_OF_MEMORY), std::wstring()));
+ throw SysError(formatSystemError(L"curl_easy_init", formatCurlErrorRaw(CURLE_OUT_OF_MEMORY), std::wstring()));
}
else
::curl_easy_reset(easyHandle_);
@@ -360,7 +353,7 @@ public:
targetPath = *afsPath;
targetPathisDir = isDir;
}
- curlPath = getCurlUrlPath(targetPath, targetPathisDir, timeoutSec); //throw FileError
+ curlPath = getCurlUrlPath(targetPath, targetPathisDir, timeoutSec); //throw SysError
workingDirPath_ = AfsPath();
}
else
@@ -373,12 +366,12 @@ public:
currentPathisDir = isDir;
}
else //try to use libcurl's last-used working dir and avoid excess CWD round trips
- if (getActiveSocket()) //throw FileError
+ if (getActiveSocket()) //throw SysError
currentPath = workingDirPath_;
//what if our last curl_easy_perform() just deleted the working directory????
//=> 1. libcurl recognizes last-used path and avoids the CWD accordingly 2. commands that depend on the working directory, e.g. PWD will fail on *some* servers
- curlPath = getCurlUrlPath(currentPath, currentPathisDir, timeoutSec); //throw FileError
+ curlPath = getCurlUrlPath(currentPath, currentPathisDir, timeoutSec); //throw SysError
workingDirPath_ = currentPathisDir ? currentPath : AfsPath(beforeLast(currentPath.value, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE));
//remember libcurl's working dir: path might not exist => make sure to clear if ::curl_easy_perform() fails!
}
@@ -404,11 +397,12 @@ public:
options.emplace_back(CURLOPT_LOW_SPEED_TIME, timeoutSec);
options.emplace_back(CURLOPT_LOW_SPEED_LIMIT, 1L); //[bytes], can't use "0" which means "inactive", so use some low number
- //"while libcurl is waiting for a [FTP] response, this value overrides CURLOPT_TIMEOUT."
+ //unlike CURLOPT_TIMEOUT, this one is NOT a limit on the total transfer time
options.emplace_back(CURLOPT_FTP_RESPONSE_TIMEOUT, timeoutSec);
//CURLOPT_ACCEPTTIMEOUT_MS? => only relevant for "active" FTP connections
+
if (!std::any_of(extraOptions.begin(), extraOptions.end(), [](const Option& opt) { return opt.option == CURLOPT_FTP_FILEMETHOD; }))
options.emplace_back(CURLOPT_FTP_FILEMETHOD, CURLFTPMETHOD_SINGLECWD);
//let's save these needless round trips!! most servers should support "CWD /folder/subfolder"
@@ -513,16 +507,15 @@ public:
{
const CURLcode rc = ::curl_easy_setopt(easyHandle_, opt.option, opt.value);
if (rc != CURLE_OK)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)),
- formatSystemError(L"curl_easy_setopt " + numberTo<std::wstring>(opt.option),
- formatCurlErrorRaw(rc), utfTo<std::wstring>(::curl_easy_strerror(rc))));
+ throw SysError(formatSystemError(L"curl_easy_setopt " + numberTo<std::wstring>(opt.option),
+ formatCurlErrorRaw(rc), utfTo<std::wstring>(::curl_easy_strerror(rc))));
}
//=======================================================================================================
const CURLcode rcPerf = ::curl_easy_perform(easyHandle_);
//WTF: curl_easy_perform() considers FTP response codes 4XX, 5XX as failure, but for HTTP response codes 4XX are considered success!! CONSISTENCY, people!!!
long ftpStatus = 0; //optional
- ::curl_easy_getinfo(easyHandle_, CURLINFO_RESPONSE_CODE, &ftpStatus);
+ /*const CURLcode rc =*/ ::curl_easy_getinfo(easyHandle_, CURLINFO_RESPONSE_CODE, &ftpStatus);
//note: CURLOPT_FAILONERROR(default:off) is only available for HTTP
//assert((rcPerf == CURLE_OK && 100 <= ftpStatus && ftpStatus < 400) || -> insufficient *FEAT can fail with 550, but still CURLE_OK because of *
@@ -540,7 +533,7 @@ public:
}
//returns server response (header data)
- std::string runSingleFtpCommand(const std::string& ftpCmd, bool requiresUtf8, int timeoutSec) //throw FileError, SysError
+ std::string runSingleFtpCommand(const std::string& ftpCmd, bool requiresUtf8, int timeoutSec) //throw SysError
{
struct curl_slist* quote = nullptr;
ZEN_ON_SCOPE_EXIT(::curl_slist_free_all(quote));
@@ -554,111 +547,119 @@ public:
//observation: libcurl sends CWD *after* CURLOPT_QUOTE has run
//perf: we neither need nor want libcurl to send CWD
- return perform(nullptr /*re-use last-used path*/, true /*isDir*/, options, requiresUtf8, timeoutSec); //throw FileError, SysError
+ return perform(nullptr /*re-use last-used path*/, true /*isDir*/, options, requiresUtf8, timeoutSec); //throw SysError
+ }
+
+ AfsPath getHomePath(int timeoutSec) //throw SysError
+ {
+ perform(nullptr /*re-use last-used path*/, true /*isDir*/,
+ { FtpSession::Option(CURLOPT_NOBODY, 1L) }, true /*requiresUtf8*/, timeoutSec); //throw SysError
+ assert(easyHandle_);
+
+ const char* homePath = nullptr; //not owned
+ /*CURLcode rc =*/ ::curl_easy_getinfo(easyHandle_, CURLINFO_FTP_ENTRY_PATH, &homePath);
+
+ if (!homePath)
+ return AfsPath();
+ return sanitizeRootRelativePath(utfTo<Zstring>(homePath));
}
//------------------------------------------------------------------------------------------------------------
bool supportsMlsd(int timeoutSec) { return getFeatureSupport(&Features::mlsd, timeoutSec); } //
- bool supportsMlst(int timeoutSec) { return getFeatureSupport(&Features::mlst, timeoutSec); } //
- bool supportsMfmt(int timeoutSec) { return getFeatureSupport(&Features::mfmt, timeoutSec); } //throw FileError
+ bool supportsMfmt(int timeoutSec) { return getFeatureSupport(&Features::mfmt, timeoutSec); } //throw SysError
bool supportsClnt(int timeoutSec) { return getFeatureSupport(&Features::clnt, timeoutSec); } //
bool supportsUtf8(int timeoutSec) { return getFeatureSupport(&Features::utf8, timeoutSec); } //
- ServerEncoding getServerEncoding(int timeoutSec) { return supportsUtf8(timeoutSec) ? ServerEncoding::utf8 : ServerEncoding::ansi; } //throw FileError
+ ServerEncoding getServerEncoding(int timeoutSec) { return supportsUtf8(timeoutSec) ? ServerEncoding::utf8 : ServerEncoding::ansi; } //throw SysError
bool isHealthy() const
{
return numeric::dist(std::chrono::steady_clock::now(), lastSuccessfulUseTime_) <= FTP_SESSION_MAX_IDLE_TIME;
}
- std::string getServerRelPathInternal(const AfsPath& afsPath, int timeoutSec) //throw FileError
+ std::string getServerRelPathInternal(const AfsPath& afsPath, int timeoutSec) //throw SysError
{
const Zstring serverRelPath = getServerRelPath(afsPath);
if (afsPath.value.empty()) //endless recursion caveat!! getServerEncoding() transitively depends on getServerRelPathInternal()
return utfTo<std::string>(serverRelPath);
- const ServerEncoding encoding = getServerEncoding(timeoutSec); //throw FileError
- try
- {
- return utfToServerEncoding(serverRelPath, encoding); //throw SysError
- }
- catch (const SysError& e) { throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)), e.toString()); }
+ const ServerEncoding encoding = getServerEncoding(timeoutSec); //throw SysError
+
+ return utfToServerEncoding(serverRelPath, encoding); //throw SysError
}
private:
FtpSession (const FtpSession&) = delete;
FtpSession& operator=(const FtpSession&) = delete;
- std::string getCurlUrlPath(const AfsPath& afsPath, bool isDir, int timeoutSec) //throw FileError
+ std::string getCurlUrlPath(const AfsPath& afsPath, bool isDir, int timeoutSec) //throw SysError
{
- std::string serverRelPath;
+ //Some FTP servers distinguish between user-home- and root-relative paths! e.g. FreeNAS: https://freefilesync.org/forum/viewtopic.php?t=6129
+ //=> use root-relative paths (= same as expected by CURLOPT_QUOTE)
+ std::string curlRelPath = "/%2f"; //https://curl.haxx.se/docs/faq.html#How_do_I_list_the_root_dir_of_an
- for (const std::string& comp : split(getServerRelPathInternal(afsPath, timeoutSec), '/', SplitType::ALLOW_EMPTY)) //throw FileError
+ for (const std::string& comp : split(getServerRelPathInternal(afsPath, timeoutSec), '/', SplitType::SKIP_EMPTY)) //throw SysError
{
char* compFmt = ::curl_easy_escape(easyHandle_, comp.c_str(), static_cast<int>(comp.size()));
if (!compFmt)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)),
- replaceCpy<std::wstring>(L"curl_easy_escape: conversion failure (%x)", L"%x", utfTo<std::wstring>(comp)));
+ throw SysError(replaceCpy<std::wstring>(L"curl_easy_escape: conversion failure (%x)", L"%x", utfTo<std::wstring>(comp)));
ZEN_ON_SCOPE_EXIT(::curl_free(compFmt));
- serverRelPath += compFmt;
- serverRelPath += '/';
+ curlRelPath += compFmt;
+ curlRelPath += '/';
}
- if (!serverRelPath.empty())
- serverRelPath.pop_back();
+ if (endsWith(curlRelPath, '/'))
+ curlRelPath.pop_back();
+
+ std::string path = utfTo<std::string>(Zstring(ftpPrefix) + Zstr("//") + sessionId_.server) + curlRelPath;
- std::string path = utfTo<std::string>(Zstring(ftpPrefix) + Zstr("//") + sessionId_.server) + serverRelPath;
if (isDir && !endsWith(path, '/')) //curl-FTP needs directory paths to end with a slash
path += "/";
return path;
}
- void sessionEnableUtf8(int timeoutSec) //throw FileError
+ void sessionEnableUtf8(int timeoutSec) //throw SysError
{
+ //"OPTS UTF8 ON" needs to be activated each time libcurl internally creates a new session
+ //hopyfully libcurl will offer a better solution: https://github.com/curl/curl/issues/1457
+
//Some RFC-2640-non-compliant servers require UTF8 to be explicitly enabled: https://wiki.filezilla-project.org/Character_Encoding#Conflicting_specification
//e.g. this one (Microsoft FTP Service): https://freefilesync.org/forum/viewtopic.php?t=4303
- if (supportsUtf8(timeoutSec)) //throw FileError
+ if (supportsUtf8(timeoutSec)) //throw SysError
{
- //hopyfully libcurl will offer a better solution: https://github.com/curl/curl/issues/1457
-
- //"OPTS UTF8 ON" needs to be activated each time libcurl internally creates a new session
-
//[!] supportsUtf8() is buffered! => FTP session might not yet exist (or was closed by libcurl after a failure)
- if (std::optional<curl_socket_t> currentSocket = getActiveSocket()) //throw FileError
+ if (std::optional<curl_socket_t> currentSocket = getActiveSocket()) //throw SysError
if (*currentSocket == utf8EnabledSocket_) //caveat: a non-utf8-enabled session might already exist, e.g. from a previous call to supportsMlsd()
return;
- try
- {
- //some servers even require "CLNT" before accepting "OPTS UTF8 ON": https://social.msdn.microsoft.com/Forums/en-US/d602574f-8a69-4d69-b337-52b6081902cf/problem-with-ftpwebrequestopts-utf8-on-501-please-clnt-first
- if (supportsClnt(timeoutSec)) //throw FileError
- runSingleFtpCommand("CLNT FreeFileSync", false /*requiresUtf8*/, timeoutSec); //throw FileError, SysError
- //"prefix the command with an asterisk to make libcurl continue even if the command fails"
- //-> ignore if server does not know this legacy command (but report all *other* issues; else getActiveSocket() below won't return value and hide real error!)
- runSingleFtpCommand("*OPTS UTF8 ON", false /*requiresUtf8*/, timeoutSec); //throw FileError, SysError
- }
- catch (const SysError& e) { throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)), e.toString()); }
+ //some servers even require "CLNT" before accepting "OPTS UTF8 ON": https://social.msdn.microsoft.com/Forums/en-US/d602574f-8a69-4d69-b337-52b6081902cf/problem-with-ftpwebrequestopts-utf8-on-501-please-clnt-first
+ if (supportsClnt(timeoutSec)) //throw SysError
+ runSingleFtpCommand("CLNT FreeFileSync", false /*requiresUtf8*/, timeoutSec); //throw SysError
+
+ //"prefix the command with an asterisk to make libcurl continue even if the command fails"
+ //-> ignore if server does not know this legacy command (but report all *other* issues; else getActiveSocket() below won't return value and hide real error!)
+ runSingleFtpCommand("*OPTS UTF8 ON", false /*requiresUtf8*/, timeoutSec); //throw SysError
+
//make sure our unicode-enabled session is still there (== libcurl behaves as we expect)
- std::optional<curl_socket_t> currentSocket = getActiveSocket(); //throw FileError
+ std::optional<curl_socket_t> currentSocket = getActiveSocket(); //throw SysError
if (!currentSocket)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)), L"Curl failed to cache FTP session."); //why is libcurl not caching the session???
+ throw SysError(L"Curl failed to cache FTP session."); //why is libcurl not caching the session???
utf8EnabledSocket_ = *currentSocket; //remember what we did
}
}
- std::optional<curl_socket_t> getActiveSocket() //throw FileError
+ std::optional<curl_socket_t> getActiveSocket() //throw SysError
{
if (easyHandle_)
{
curl_socket_t currentSocket = 0;
const CURLcode rc = ::curl_easy_getinfo(easyHandle_, CURLINFO_ACTIVESOCKET, &currentSocket);
if (rc != CURLE_OK)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)),
- formatSystemError(L"curl_easy_getinfo: CURLINFO_ACTIVESOCKET", formatCurlErrorRaw(rc), utfTo<std::wstring>(::curl_easy_strerror(rc))));
+ throw SysError(formatSystemError(L"curl_easy_getinfo: CURLINFO_ACTIVESOCKET", formatCurlErrorRaw(rc), utfTo<std::wstring>(::curl_easy_strerror(rc))));
if (currentSocket != CURL_SOCKET_BAD)
return currentSocket;
}
@@ -668,14 +669,13 @@ private:
struct Features
{
bool mlsd = false;
- bool mlst = false;
bool mfmt = false;
bool clnt = false;
bool utf8 = false;
};
using FeatureList = std::map<Zstring /*server name*/, std::optional<Features>, LessAsciiNoCase>;
- bool getFeatureSupport(bool Features::* status, int timeoutSec) //throw FileError
+ bool getFeatureSupport(bool Features::* status, int timeoutSec) //throw SysError
{
if (!featureCache_)
{
@@ -684,21 +684,16 @@ private:
const auto sf = globalServerFeatures.get();
if (!sf)
- throw FileError(replaceCpy(_("Failed to get information about server %x."), L"%x", fmtPath(sessionId_.server)),
- L"Function call not allowed during process shutdown.");
+ throw SysError(L"FtpSession::getFeatureSupport() function call not allowed during init/shutdown.");
sf->access([&](FeatureList& feat) { featureCache_ = feat[sessionId_.server]; });
if (!featureCache_)
{
- std::string featResponse;
- try
- {
- //ignore errors if server does not support FEAT (do those exist?), but fail for all others
- featResponse = runSingleFtpCommand("*FEAT", false /*requiresUtf8*/, timeoutSec); //throw FileError, SysError
- //used by sessionEnableUtf8()! => requiresUtf8 = false!!!
- }
- catch (const SysError& e) { throw FileError(replaceCpy(_("Failed to get information about server %x."), L"%x", fmtPath(sessionId_.server)), e.toString()); }
+ //ignore errors if server does not support FEAT (do those exist?), but fail for all others
+ const std::string featResponse = runSingleFtpCommand("*FEAT", false /*requiresUtf8*/, timeoutSec); //throw SysError
+ //used by sessionEnableUtf8()! => requiresUtf8 = false!!!
+
sf->access([&](FeatureList& feat)
{
auto& f = feat[sessionId_.server];
@@ -728,7 +723,7 @@ private:
//"there is no distinct FEAT output for MLSD. The presence of the MLST feature indicates that both MLST and MLSD are supported"
if (equalAsciiNoCase (line, " MLST") ||
startsWithAsciiNoCase(line, " MLST ")) //SP "MLST" [SP factlist] CRLF
- output.mlsd = output.mlst = true;
+ output.mlsd = true;
//https://tools.ietf.org/html/draft-somers-ftp-mfxx-04#section-3.3
//"Where a server-FTP process supports the MFMT command [...] it MUST include the response to the FEAT command"
@@ -783,10 +778,10 @@ private:
curl_socket_t utf8EnabledSocket_ = 0;
- std::chrono::steady_clock::time_point lastSuccessfulUseTime_;
- std::shared_ptr<UniCounterCookie> libsshCurlUnifiedInitCookie_;
-
std::optional<Features> featureCache_;
+
+ std::shared_ptr<UniCounterCookie> libsshCurlUnifiedInitCookie_;
+ std::chrono::steady_clock::time_point lastSuccessfulUseTime_;
};
//================================================================================================================
@@ -808,7 +803,7 @@ public:
sessionCleaner_.join();
}
- void access(const FtpLoginInfo& login, const std::function<void(FtpSession& session)>& useFtpSession /*throw X*/) //throw FileError, X
+ void access(const FtpLoginInfo& login, const std::function<void(FtpSession& session)>& useFtpSession /*throw X*/) //throw SysError, X
{
Protected<IdleFtpSessions>& sessionStore = getSessionStore(login);
@@ -826,7 +821,7 @@ public:
//create new FTP session outside the lock: 1. don't block other threads 2. non-atomic regarding "sessionStore"! => one session too many is not a problem!
if (!ftpSession)
- ftpSession = std::make_unique<FtpSession>(login); //throw FileError
+ ftpSession = std::make_unique<FtpSession>(login); //throw SysError
ZEN_ON_SCOPE_EXIT(
if (ftpSession->isHealthy()) //thread that created the "!isHealthy()" session is responsible for clean up (avoid hitting server connection limits!)
@@ -904,12 +899,12 @@ UniInitializer globalStartupInitFtp(*globalFtpSessionCount.get()); //static orde
Global<FtpSessionManager> globalFtpSessionManager(std::make_unique<FtpSessionManager>());
//--------------------------------------------------------------------------------------
-void accessFtpSession(const FtpLoginInfo& login, const std::function<void(FtpSession& session)>& useFtpSession /*throw X*/) //throw FileError, X
+void accessFtpSession(const FtpLoginInfo& login, const std::function<void(FtpSession& session)>& useFtpSession /*throw X*/) //throw SysError, X
{
if (const std::shared_ptr<FtpSessionManager> mgr = globalFtpSessionManager.get())
- mgr->access(login, useFtpSession); //throw FileError, X
+ mgr->access(login, useFtpSession); //throw SysError, X
else
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(login.server)), L"Function call not allowed during process init/shutdown.");
+ throw SysError(L"accessFtpSession() function call not allowed during init/shutdown.");
}
//===========================================================================================================================
@@ -940,58 +935,57 @@ public:
};
std::vector<FtpItem> output;
-
- accessFtpSession(login, [&](FtpSession& session) //throw FileError
+ try
{
- std::vector<FtpSession::Option> options =
+ accessFtpSession(login, [&](FtpSession& session) //throw SysError
{
- FtpSession::Option(CURLOPT_WRITEDATA, &rawListing),
- FtpSession::Option(CURLOPT_WRITEFUNCTION, onBytesReceived),
- };
+ std::vector<FtpSession::Option> options =
+ {
+ FtpSession::Option(CURLOPT_WRITEDATA, &rawListing),
+ FtpSession::Option(CURLOPT_WRITEFUNCTION, onBytesReceived),
+ };
- if (session.supportsMlsd(login.timeoutSec)) //throw FileError
- {
- options.emplace_back(CURLOPT_CUSTOMREQUEST, "MLSD");
-
- //some FTP servers abuse https://tools.ietf.org/html/rfc3659#section-7.1
- //and process wildcards characters inside the "dirpath"; see http://www.proftpd.org/docs/howto/Globbing.html
- // [] matches any character in the character set enclosed in the brackets
- // * (not between brackets) matches any string, including the empty string
- // ? (not between brackets) matches any single character
- //
- //of course this "helpfulness" blows up with MLSD + paths that incidentally contain wildcards: https://freefilesync.org/forum/viewtopic.php?t=5575
- const bool pathHasWildcards = [&] //=> globbing is reproducible even with freefilesync.org's FTP!
+ if (session.supportsMlsd(login.timeoutSec)) //throw SysError
{
- const size_t pos = afsDirPath.value.find(Zstr('['));
- if (pos != Zstring::npos)
- if (afsDirPath.value.find(Zstr(']'), pos + 1) != Zstring::npos)
- return true;
+ options.emplace_back(CURLOPT_CUSTOMREQUEST, "MLSD");
+
+ //some FTP servers abuse https://tools.ietf.org/html/rfc3659#section-7.1
+ //and process wildcards characters inside the "dirpath"; see http://www.proftpd.org/docs/howto/Globbing.html
+ // [] matches any character in the character set enclosed in the brackets
+ // * (not between brackets) matches any string, including the empty string
+ // ? (not between brackets) matches any single character
+ //
+ //of course this "helpfulness" blows up with MLSD + paths that incidentally contain wildcards: https://freefilesync.org/forum/viewtopic.php?t=5575
+ const bool pathHasWildcards = [&] //=> globbing is reproducible even with freefilesync.org's FTP!
+ {
+ const size_t pos = afsDirPath.value.find(Zstr('['));
+ if (pos != Zstring::npos)
+ if (afsDirPath.value.find(Zstr(']'), pos + 1) != Zstring::npos)
+ return true;
- return contains(afsDirPath.value, Zstr('*')) ||
- /**/ contains(afsDirPath.value, Zstr('?'));
- }();
+ return contains(afsDirPath.value, Zstr('*')) ||
+ /**/ contains(afsDirPath.value, Zstr('?'));
+ }();
- if (!pathHasWildcards)
- options.emplace_back(CURLOPT_FTP_FILEMETHOD, CURLFTPMETHOD_NOCWD); //16% faster traversal compared to CURLFTPMETHOD_SINGLECWD (35% faster than CURLFTPMETHOD_MULTICWD)
- }
- //else: use "LIST" + CURLFTPMETHOD_SINGLECWD
+ if (!pathHasWildcards)
+ options.emplace_back(CURLOPT_FTP_FILEMETHOD, CURLFTPMETHOD_NOCWD); //16% faster traversal compared to CURLFTPMETHOD_SINGLECWD (35% faster than CURLFTPMETHOD_MULTICWD)
+ }
+ //else: use "LIST" + CURLFTPMETHOD_SINGLECWD
- try
- {
- session.perform(&afsDirPath, true /*isDir*/, options, true /*requiresUtf8*/, login.timeoutSec); //throw FileError, SysError
- }
- catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtPath(getCurlDisplayPath(login.server, afsDirPath))), e.toString()); }
+ session.perform(&afsDirPath, true /*isDir*/, options, true /*requiresUtf8*/, login.timeoutSec); //throw SysError
- const ServerEncoding encoding = session.getServerEncoding(login.timeoutSec); //throw FileError
- try
- {
- if (session.supportsMlsd(login.timeoutSec)) //throw FileError
+
+ const ServerEncoding encoding = session.getServerEncoding(login.timeoutSec); //throw SysError
+ if (session.supportsMlsd(login.timeoutSec)) //throw SysError
output = parseMlsd(rawListing, encoding); //throw SysError
else
output = parseUnknown(rawListing, encoding); //throw SysError
- }
- catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtPath(getCurlDisplayPath(login.server, afsDirPath))), e.toString()); }
- });
+ });
+ }
+ catch (const SysError& e)
+ {
+ throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtPath(getCurlDisplayPath(login.server, afsDirPath))), e.toString());
+ }
return output;
}
@@ -1541,24 +1535,24 @@ void ftpFileDownload(const FtpLoginInfo& login, const AfsPath& afsFilePath, //th
return (*cb)(buffer, size * nitems);
};
- accessFtpSession(login, [&](FtpSession& session) //throw FileError
+ try
{
- try
+ accessFtpSession(login, [&](FtpSession& session) //throw SysError
{
- session.perform(&afsFilePath, false /*isDir*/, //throw FileError, SysError
+ session.perform(&afsFilePath, false /*isDir*/, //throw SysError
{
FtpSession::Option(CURLOPT_WRITEDATA, &onBytesReceived),
FtpSession::Option(CURLOPT_WRITEFUNCTION, onBytesReceivedWrapper),
}, true /*requiresUtf8*/, login.timeoutSec);
- }
- catch (const SysError& e)
- {
- if (exception)
- std::rethrow_exception(exception);
+ });
+ }
+ catch (const SysError& e)
+ {
+ if (exception)
+ std::rethrow_exception(exception);
- throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(getCurlDisplayPath(login.server, afsFilePath))), e.toString());
- }
- });
+ throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(getCurlDisplayPath(login.server, afsFilePath))), e.toString());
+ }
}
@@ -1597,20 +1591,20 @@ void ftpFileUpload(const FtpLoginInfo& login, const AfsPath& afsFilePath, //thro
return (*cb)(buffer, size * nitems);
};
- accessFtpSession(login, [&](FtpSession& session) //throw FileError
+ try
{
- try
+ accessFtpSession(login, [&](FtpSession& session) //throw SysError
{
/*
- struct curl_slist* quote = nullptr;
- ZEN_ON_SCOPE_EXIT(::curl_slist_free_all(quote));
+ struct curl_slist* quote = nullptr;
+ ZEN_ON_SCOPE_EXIT(::curl_slist_free_all(quote));
- //"prefix the command with an asterisk to make libcurl continue even if the command fails"
- quote = ::curl_slist_append(quote, ("*DELE " + session.getServerRelPathInternal(afsFilePath)).c_str()); //throw FileError
+ //"prefix the command with an asterisk to make libcurl continue even if the command fails"
+ quote = ::curl_slist_append(quote, ("*DELE " + session.getServerRelPathInternal(afsFilePath)).c_str()); //throw SysError
- //optimize fail-safe copy with RNFR/RNTO as CURLOPT_POSTQUOTE? -> even slightly *slower* than RNFR/RNTO as additional curl_easy_perform()
+ //optimize fail-safe copy with RNFR/RNTO as CURLOPT_POSTQUOTE? -> even slightly *slower* than RNFR/RNTO as additional curl_easy_perform()
*/
- session.perform(&afsFilePath, false /*isDir*/, //throw FileError, SysError
+ session.perform(&afsFilePath, false /*isDir*/, //throw SysError
{
FtpSession::Option(CURLOPT_UPLOAD, 1L),
//FtpSession::Option(CURLOPT_INFILESIZE_LARGE, static_cast<curl_off_t>(inputBuffer.size())),
@@ -1622,15 +1616,15 @@ void ftpFileUpload(const FtpLoginInfo& login, const AfsPath& afsFilePath, //thro
//FtpSession::Option(CURLOPT_PREQUOTE, quote),
//FtpSession::Option(CURLOPT_POSTQUOTE, quote),
}, true /*requiresUtf8*/, login.timeoutSec);
- }
- catch (const SysError& e)
- {
- if (exception)
- std::rethrow_exception(exception);
+ });
+ }
+ catch (const SysError& e)
+ {
+ if (exception)
+ std::rethrow_exception(exception);
- throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(getCurlDisplayPath(login.server, afsFilePath))), e.toString());
- }
- });
+ throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(getCurlDisplayPath(login.server, afsFilePath))), e.toString());
+ }
}
//===========================================================================================================================
@@ -1784,13 +1778,13 @@ private:
if (isoTime.empty())
throw SysError(L"Invalid modification time (time_t: " + numberTo<std::wstring>(*modTime_) + L")");
- accessFtpSession(login_, [&](FtpSession& session) //throw FileError
+ accessFtpSession(login_, [&](FtpSession& session) //throw SysError
{
- if (!session.supportsMfmt(login_.timeoutSec)) //throw FileError
+ if (!session.supportsMfmt(login_.timeoutSec)) //throw SysError
throw SysError(L"Server does not support the MFMT command.");
session.runSingleFtpCommand("MFMT " + isoTime + " " + session.getServerRelPathInternal(afsPath_, login_.timeoutSec),
- true /*requiresUtf8*/, login_.timeoutSec); //throw FileError, SysError
+ true /*requiresUtf8*/, login_.timeoutSec); //throw SysError
//Does MFMT follow symlinks?? Anyway, our FTP implementation supports folder symlinks only
});
}
@@ -1854,7 +1848,7 @@ private:
//=> but "HELP", and "NOOP" work, right?? https://en.wikipedia.org/wiki/List_of_FTP_commands
//Fuck my life: even "HELP" is not always implemented: https://freefilesync.org/forum/viewtopic.php?t=6002
//Screw this, just traverse the root folder: (only a single round-trip for FTP)
- FtpDirectoryReader::execute(login_, afsPath); //throw FileError
+ /*std::vector<FtpItem> items =*/ FtpDirectoryReader::execute(login_, afsPath); //throw FileError
return ItemType::FOLDER;
}
@@ -1909,10 +1903,10 @@ private:
{
try
{
- accessFtpSession(login_, [&](FtpSession& session) //throw FileError
+ accessFtpSession(login_, [&](FtpSession& session) //throw SysError
{
session.runSingleFtpCommand("MKD " + session.getServerRelPathInternal(afsPath, login_.timeoutSec),
- true /*requiresUtf8*/, login_.timeoutSec); //throw FileError, SysError
+ true /*requiresUtf8*/, login_.timeoutSec); //throw SysError
});
}
catch (const SysError& e)
@@ -1925,10 +1919,10 @@ private:
{
try
{
- accessFtpSession(login_, [&](FtpSession& session) //throw FileError
+ accessFtpSession(login_, [&](FtpSession& session) //throw SysError
{
session.runSingleFtpCommand("DELE " + session.getServerRelPathInternal(afsPath, login_.timeoutSec),
- true /*requiresUtf8*/, login_.timeoutSec); //throw FileError, SysError
+ true /*requiresUtf8*/, login_.timeoutSec); //throw SysError
});
}
catch (const SysError& e)
@@ -1948,24 +1942,35 @@ private:
{
try
{
- accessFtpSession(login_, [&](FtpSession& session) //throw FileError
+ std::optional<SysError> delError;
+
+ accessFtpSession(login_, [&](FtpSession& session) //throw SysError
{
- session.runSingleFtpCommand("RMD " + session.getServerRelPathInternal(afsPath, login_.timeoutSec),
- true /*requiresUtf8*/, login_.timeoutSec); //throw FileError, SysError
+ try
+ {
+ session.runSingleFtpCommand("RMD " + session.getServerRelPathInternal(afsPath, login_.timeoutSec),
+ true /*requiresUtf8*/, login_.timeoutSec); //throw SysError
+ }
+ catch (const SysError& e) { delError = e; }
});
+
+ if (delError)
+ {
+ //Windows test, FileZilla Server and Windows IIS FTP: all symlinks are reported as regular folders
+ //tested freefilesync.org: RMD will fail for symlinks!
+ bool symlinkExists = false;
+ try { symlinkExists = getItemType(afsPath) == ItemType::SYMLINK; } /*throw FileError*/ catch (FileError&) {} //previous exception is more relevant
+
+ if (symlinkExists)
+ return removeSymlinkPlain(afsPath); //throw FileError
+ else
+ throw* delError;
+ }
}
catch (const SysError& e)
{
- //tested freefilesync.org: RMD will fail for symlinks!
- bool symlinkExists = false;
- try { symlinkExists = getItemType(afsPath) == ItemType::SYMLINK; } /*throw FileError*/ catch (FileError&) {} //previous exception is more relevant
-
- if (symlinkExists)
- return removeSymlinkPlain(afsPath); //throw FileError
-
throw FileError(replaceCpy(_("Cannot delete directory %x."), L"%x", fmtPath(getDisplayPath(afsPath))), e.toString());
}
- //Windows test, FileZilla Server and Windows IIS FTP: all symlinks are reported as regular folders
}
void removeFolderIfExistsRecursion(const AfsPath& afsPath, //throw FileError
@@ -1979,12 +1984,12 @@ private:
//----------------------------------------------------------------------------------------------------------------
AbstractPath getSymlinkResolvedPath(const AfsPath& afsPath) const override //throw FileError
{
- throw FileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtPath(getDisplayPath(afsPath))), L"Reading symlink content not supported for FTP devices.");
+ throw FileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtPath(getDisplayPath(afsPath))), _("Operation not supported by device."));
}
std::string getSymlinkBinaryContent(const AfsPath& afsPath) const override //throw FileError
{
- throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtPath(getDisplayPath(afsPath))), L"Reading symlink content not supported for FTP devices.");
+ throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtPath(getDisplayPath(afsPath))), _("Operation not supported by device."));
}
//----------------------------------------------------------------------------------------------------------------
@@ -2020,8 +2025,7 @@ private:
{
//no native FTP file copy => use stream-based file copy:
if (copyFilePermissions)
- throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(AFS::getDisplayPath(apTarget))),
- L"Permissions not supported for FTP devices.");
+ throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(AFS::getDisplayPath(apTarget))), _("Operation not supported by device."));
//target existing: undefined behavior! (fail/overwrite/auto-rename)
return copyFileAsStream(afsPathSource, attrSource, apTarget, notifyUnbufferedIO); //throw FileError, (ErrorFileLocked), X
@@ -2032,8 +2036,7 @@ private:
void copyNewFolderForSameAfsType(const AfsPath& afsPathSource, const AbstractPath& apTarget, bool copyFilePermissions) const override //throw FileError
{
if (copyFilePermissions)
- throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(AFS::getDisplayPath(apTarget))),
- L"Permissions not supported for FTP devices.");
+ throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(AFS::getDisplayPath(apTarget))), _("Operation not supported by device."));
//already existing: fail/ignore
AFS::createFolderPlain(apTarget); //throw FileError
@@ -2043,8 +2046,7 @@ private:
{
throw FileError(replaceCpy(replaceCpy(_("Cannot copy symbolic link %x to %y."),
L"%x", L"\n" + fmtPath(getDisplayPath(afsPathSource))),
- L"%y", L"\n" + fmtPath(AFS::getDisplayPath(apTarget))),
- L"Creating symlinks is not supported by libcurl.");
+ L"%y", L"\n" + fmtPath(AFS::getDisplayPath(apTarget))), _("Operation not supported by device."));
}
//target existing: undefined behavior! (fail/overwrite/auto-rename)
@@ -2052,26 +2054,26 @@ private:
// freefilesync.org: silent overwrite
// Windows IIS: CURLE_QUOTE_ERROR: QUOT command failed with 550 Cannot create a file when that file already exists.
// FileZilla Server: CURLE_QUOTE_ERROR: QUOT command failed with 553 file exists
- void moveAndRenameItemForSameAfsType(const AfsPath& afsPathSource, const AbstractPath& apTarget) const override //throw FileError, ErrorDifferentVolume
+ void moveAndRenameItemForSameAfsType(const AfsPath& pathFrom, const AbstractPath& pathTo) const override //throw FileError, ErrorMoveUnsupported
{
auto generateErrorMsg = [&] { return replaceCpy(replaceCpy(_("Cannot move file %x to %y."),
- L"%x", L"\n" + fmtPath(getDisplayPath(afsPathSource))),
- L"%y", L"\n" + fmtPath(AFS::getDisplayPath(apTarget)));
+ L"%x", L"\n" + fmtPath(getDisplayPath(pathFrom))),
+ L"%y", L"\n" + fmtPath(AFS::getDisplayPath(pathTo)));
};
- if (compareDeviceSameAfsType(apTarget.afsDevice.ref()) != 0)
- throw ErrorDifferentVolume(generateErrorMsg(), L"Different FTP volume.");
+ if (compareDeviceSameAfsType(pathTo.afsDevice.ref()) != 0)
+ throw ErrorMoveUnsupported(generateErrorMsg(), _("Operation not supported between different devices."));
try
{
- accessFtpSession(login_, [&](FtpSession& session) //throw FileError
+ accessFtpSession(login_, [&](FtpSession& session) //throw SysError
{
struct curl_slist* quote = nullptr;
ZEN_ON_SCOPE_EXIT(::curl_slist_free_all(quote));
- quote = ::curl_slist_append(quote, ("RNFR " + session.getServerRelPathInternal(afsPathSource, login_.timeoutSec)).c_str()); //throw FileError
- quote = ::curl_slist_append(quote, ("RNTO " + session.getServerRelPathInternal(apTarget.afsPath, login_.timeoutSec)).c_str()); //
+ quote = ::curl_slist_append(quote, ("RNFR " + session.getServerRelPathInternal(pathFrom, login_.timeoutSec)).c_str()); //throw SysError
+ quote = ::curl_slist_append(quote, ("RNTO " + session.getServerRelPathInternal(pathTo.afsPath, login_.timeoutSec)).c_str()); //
- session.perform(nullptr /*re-use last-used path*/, true /*isDir*/, //throw FileError, SysError
+ session.perform(nullptr /*re-use last-used path*/, true /*isDir*/, //throw SysError
{
FtpSession::Option(CURLOPT_NOBODY, 1L),
FtpSession::Option(CURLOPT_QUOTE, quote),
@@ -2105,13 +2107,13 @@ private:
std::unique_ptr<RecycleSession> createRecyclerSession(const AfsPath& afsPath) const override //throw FileError, return value must be bound!
{
assert(false); //see supportsRecycleBin()
- throw FileError(L"Recycle Bin not supported for FTP devices.");
+ throw FileError(L"Recycle bin not supported by device.");
}
void recycleItemIfExists(const AfsPath& afsPath) const override //throw FileError
{
assert(false); //see supportsRecycleBin()
- throw FileError(replaceCpy(_("Unable to move %x to the recycle bin."), L"%x", fmtPath(getDisplayPath(afsPath))), L"Recycle Bin not supported for FTP devices.");
+ throw FileError(replaceCpy(_("Unable to move %x to the recycle bin."), L"%x", fmtPath(getDisplayPath(afsPath))), _("Operation not supported by device."));
}
const FtpLoginInfo login_;
@@ -2145,6 +2147,22 @@ Zstring concatenateFtpFolderPathPhrase(const FtpLoginInfo& login, const AfsPath&
}
+AfsPath fff::getFtpHomePath(const FtpLoginInfo& login) //throw FileError
+{
+ try
+ {
+ AfsPath homePath;
+
+ accessFtpSession(login, [&](FtpSession& session) //throw SysError
+ {
+ homePath = session.getHomePath(login.timeoutSec); //throw SysError
+ });
+ return homePath;
+ }
+ catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtPath(getCurlDisplayPath(login.server, AfsPath(Zstr("~"))))), e.toString()); }
+}
+
+
Zstring fff::condenseToFtpFolderPathPhrase(const FtpLoginInfo& login, const Zstring& relPath) //noexcept
{
FtpLoginInfo loginTmp = login;
diff --git a/FreeFileSync/Source/fs/ftp.h b/FreeFileSync/Source/fs/ftp.h
index f73d523f..422487d1 100644
--- a/FreeFileSync/Source/fs/ftp.h
+++ b/FreeFileSync/Source/fs/ftp.h
@@ -38,6 +38,8 @@ FtpPathInfo getResolvedFtpPath(const Zstring& folderPathPhrase); //noexcept
//expects (potentially messy) user input:
Zstring condenseToFtpFolderPathPhrase(const FtpLoginInfo& login, const Zstring& relPath); //noexcept
+
+AfsPath getFtpHomePath(const FtpLoginInfo& login); //throw FileError
}
#endif //FTP_H_745895742383425326568678
diff --git a/FreeFileSync/Source/fs/gdrive.cpp b/FreeFileSync/Source/fs/gdrive.cpp
index f8044a57..cc778456 100644
--- a/FreeFileSync/Source/fs/gdrive.cpp
+++ b/FreeFileSync/Source/fs/gdrive.cpp
@@ -170,7 +170,7 @@ std::wstring tryFormatHttpErrorCode(int ec) //https://en.wikipedia.org/wiki/List
if (ec == 415) return L"Unsupported Media Type.";
if (ec == 416) return L"Range Not Satisfiable.";
if (ec == 417) return L"Expectation Failed.";
- if (ec == 418) return L"I\'m a teapot.";
+ if (ec == 418) return L"I'm a teapot.";
if (ec == 421) return L"Misdirected Request.";
if (ec == 422) return L"Unprocessable Entity.";
if (ec == 423) return L"Locked.";
@@ -202,18 +202,11 @@ Global<UniSessionCounter> httpSessionCount(createUniSessionCounter());
class HttpSession
{
public:
- HttpSession(const HttpSessionId& sessionId, const Zstring& caCertFilePath) : //throw FileError
+ HttpSession(const HttpSessionId& sessionId, const Zstring& caCertFilePath) : //throw SysError
sessionId_(sessionId),
- caCertFilePath_(utfTo<std::string>(caCertFilePath))
- {
- try
- {
- libsshCurlUnifiedInitCookie_ = getLibsshCurlUnifiedInitCookie(httpSessionCount); //throw SysError
- }
- catch (const SysError& e) { throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)), e.toString()); }
-
- lastSuccessfulUseTime_ = std::chrono::steady_clock::now();
- }
+ caCertFilePath_(utfTo<std::string>(caCertFilePath)),
+ libsshCurlUnifiedInitCookie_(getLibsshCurlUnifiedInitCookie(httpSessionCount)), //throw SysError
+ lastSuccessfulUseTime_(std::chrono::steady_clock::now()) {}
~HttpSession()
{
@@ -239,7 +232,7 @@ public:
//std::string contentType;
};
HttpResult perform(const std::string& serverRelPath,
- const std::vector<std::string>& extraHeaders, const std::vector<Option>& extraOptions, //throw FileError
+ const std::vector<std::string>& extraHeaders, const std::vector<Option>& extraOptions, //throw SysError
const std::function<void (const void* buffer, size_t bytesToWrite)>& writeResponse /*throw X*/, //optional
const std::function<size_t( void* buffer, size_t bytesToRead )>& readRequest /*throw X*/) //
{
@@ -247,8 +240,7 @@ public:
{
easyHandle_ = ::curl_easy_init();
if (!easyHandle_)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)),
- formatSystemError(L"curl_easy_init", formatCurlErrorRaw(CURLE_OUT_OF_MEMORY), std::wstring()));
+ throw SysError(formatSystemError(L"curl_easy_init", formatCurlErrorRaw(CURLE_OUT_OF_MEMORY), std::wstring()));
}
else
::curl_easy_reset(easyHandle_);
@@ -360,9 +352,8 @@ public:
{
const CURLcode rc = ::curl_easy_setopt(easyHandle_, opt.option, opt.value);
if (rc != CURLE_OK)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)),
- formatSystemError(L"curl_easy_setopt " + numberTo<std::wstring>(opt.option),
- formatCurlErrorRaw(rc), utfTo<std::wstring>(::curl_easy_strerror(rc))));
+ throw SysError(formatSystemError(L"curl_easy_setopt " + numberTo<std::wstring>(opt.option),
+ formatCurlErrorRaw(rc), utfTo<std::wstring>(::curl_easy_strerror(rc))));
}
//=======================================================================================================
@@ -376,28 +367,14 @@ public:
std::rethrow_exception(userCallbackException); //throw X
//=======================================================================================================
- try
- {
- long httpStatusCode = 0; //optional
- {
- const CURLcode rc = ::curl_easy_getinfo(easyHandle_, CURLINFO_RESPONSE_CODE, &httpStatusCode);
- if (rc != CURLE_OK)
- throw SysError(formatSystemError(L"curl_easy_getinfo: CURLINFO_RESPONSE_CODE", formatCurlErrorRaw(rc), utfTo<std::wstring>(::curl_easy_strerror(rc))));
- }
- //char* contentType = nullptr; //optional; owned by libcurl
- //{
- // const CURLcode rc = ::curl_easy_getinfo(easyHandle_, CURLINFO_CONTENT_TYPE, &contentType);
- // if (rc != CURLE_OK)
- // throw SysError(formatSystemError(L"curl_easy_getinfo: CURLINFO_CONTENT_TYPE", formatCurlErrorRaw(rc), utfTo<std::wstring>(::curl_easy_strerror(rc))));
- //}
-
- if (rcPerf != CURLE_OK)
- throw SysError(formatLastCurlError(L"curl_easy_perform", rcPerf, httpStatusCode));
-
- lastSuccessfulUseTime_ = std::chrono::steady_clock::now();
- return { static_cast<int>(httpStatusCode) /*, contentType ? contentType : ""*/ };
- }
- catch (const SysError& e) { throw FileError(replaceCpy(_("Unable to access %x."), L"%x", fmtPath(sessionId_.server)), e.toString()); }
+ long httpStatusCode = 0; //optional
+ /*const CURLcode rc = */ ::curl_easy_getinfo(easyHandle_, CURLINFO_RESPONSE_CODE, &httpStatusCode);
+
+ if (rcPerf != CURLE_OK)
+ throw SysError(formatLastCurlError(L"curl_easy_perform", rcPerf, httpStatusCode));
+
+ lastSuccessfulUseTime_ = std::chrono::steady_clock::now();
+ return { static_cast<int>(httpStatusCode) /*, contentType ? contentType : ""*/ };
}
//------------------------------------------------------------------------------------------------------------
@@ -439,8 +416,8 @@ private:
CURL* easyHandle_ = nullptr;
char curlErrorBuf_[CURL_ERROR_SIZE] = {};
- std::chrono::steady_clock::time_point lastSuccessfulUseTime_;
std::shared_ptr<UniCounterCookie> libsshCurlUnifiedInitCookie_;
+ std::chrono::steady_clock::time_point lastSuccessfulUseTime_;
};
//----------------------------------------------------------------------------------------------------------------
@@ -464,7 +441,7 @@ public:
using IdleHttpSessions = std::vector<std::unique_ptr<HttpSession>>;
- void access(const HttpSessionId& login, const std::function<void(HttpSession& session)>& useHttpSession /*throw X*/) //throw FileError, X
+ void access(const HttpSessionId& login, const std::function<void(HttpSession& session)>& useHttpSession /*throw X*/) //throw SysError, X
{
Protected<HttpSessionManager::IdleHttpSessions>& sessionStore = getSessionStore(login);
@@ -482,7 +459,7 @@ public:
//create new HTTP session outside the lock: 1. don't block other threads 2. non-atomic regarding "sessionStore"! => one session too many is not a problem!
if (!httpSession)
- httpSession = std::make_unique<HttpSession>(login, caCertFilePath_); //throw FileError
+ httpSession = std::make_unique<HttpSession>(login, caCertFilePath_); //throw SysError
ZEN_ON_SCOPE_EXIT(
if (httpSession->isHealthy()) //thread that created the "!isHealthy()" session is responsible for clean up (avoid hitting server connection limits!)
@@ -565,7 +542,7 @@ Global<HttpSessionManager> httpSessionManager;
//===========================================================================================================================
//try to get a grip on this crazy REST API: - parameters are passed via query string, header, or body, using GET, POST, PUT, PATCH, DELETE, ... it's a dice roll
-HttpSession::HttpResult googleHttpsRequest(const std::string& serverRelPath, //throw FileError
+HttpSession::HttpResult googleHttpsRequest(const std::string& serverRelPath, //throw SysError
const std::vector<std::string>& extraHeaders,
const std::vector<HttpSession::Option>& extraOptions,
const std::function<void (const void* buffer, size_t bytesToWrite)>& writeResponse /*throw X*/, //optional
@@ -573,11 +550,11 @@ HttpSession::HttpResult googleHttpsRequest(const std::string& serverRelPath, //t
{
const std::shared_ptr<HttpSessionManager> mgr = httpSessionManager.get();
if (!mgr)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(GOOGLE_REST_API_SERVER)), L"Function call not allowed during process init/shutdown.");
+ throw SysError(L"googleHttpsRequest() function call not allowed during init/shutdown.");
HttpSession::HttpResult httpResult;
- mgr->access(HttpSessionId(GOOGLE_REST_API_SERVER), [&](HttpSession& session) //throw FileError
+ mgr->access(HttpSessionId(GOOGLE_REST_API_SERVER), [&](HttpSession& session) //throw SysError
{
std::vector<HttpSession::Option> options =
{
@@ -588,7 +565,7 @@ HttpSession::HttpResult googleHttpsRequest(const std::string& serverRelPath, //t
};
append(options, extraOptions);
- httpResult = session.perform(serverRelPath, extraHeaders, options, writeResponse, readRequest); //throw FileError
+ httpResult = session.perform(serverRelPath, extraHeaders, options, writeResponse, readRequest); //throw SysError
});
return httpResult;
}
@@ -600,7 +577,7 @@ struct GoogleUserInfo
std::wstring displayName;
Zstring email;
};
-GoogleUserInfo getUserInfo(const std::string& accessToken) //throw FileError
+GoogleUserInfo getUserInfo(const std::string& accessToken) //throw SysError
{
//https://developers.google.com/drive/api/v3/reference/about
const std::string queryParams = xWwwFormUrlEncode(
@@ -608,7 +585,7 @@ GoogleUserInfo getUserInfo(const std::string& accessToken) //throw FileError
{ "fields", "user/displayName,user/emailAddress" },
});
std::string response;
- googleHttpsRequest("/drive/v3/about?" + queryParams, { "Authorization: Bearer " + accessToken }, {} /*extraOptions*/, //throw FileError
+ googleHttpsRequest("/drive/v3/about?" + queryParams, { "Authorization: Bearer " + accessToken }, {} /*extraOptions*/, //throw SysError
[&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/);
JsonValue jresponse;
@@ -623,7 +600,7 @@ GoogleUserInfo getUserInfo(const std::string& accessToken) //throw FileError
return { utfTo<std::wstring>(*displayName), utfTo<Zstring>(*email) };
}
- throw FileError(replaceCpy(_("Failed to get information about server %x."), L"%x", fmtPath(Zstr("Google Drive"))), formatGoogleErrorRaw(response));
+ throw SysError(formatGoogleErrorRaw(response));
}
@@ -663,7 +640,7 @@ struct GoogleAuthCode
struct GoogleAccessToken
{
std::string value;
- time_t validUntil; //remaining lifetime of the access token
+ time_t validUntil = 0; //remaining lifetime of the access token
};
struct GoogleAccessInfo
@@ -673,7 +650,7 @@ struct GoogleAccessInfo
GoogleUserInfo userInfo;
};
-GoogleAccessInfo googleDriveExchangeAuthCode(const GoogleAuthCode& authCode) //throw FileError
+GoogleAccessInfo googleDriveExchangeAuthCode(const GoogleAuthCode& authCode) //throw SysError
{
//https://developers.google.com/identity/protocols/OAuth2InstalledApp#exchange-authorization-code
const std::string postBuf = xWwwFormUrlEncode(
@@ -686,7 +663,7 @@ GoogleAccessInfo googleDriveExchangeAuthCode(const GoogleAuthCode& authCode) //t
{ "code_verifier", authCode.codeChallenge },
});
std::string response;
- googleHttpsRequest("/oauth2/v4/token", {} /*extraHeaders*/, { { CURLOPT_POSTFIELDS, postBuf.c_str() } }, //throw FileError
+ googleHttpsRequest("/oauth2/v4/token", {} /*extraHeaders*/, { { CURLOPT_POSTFIELDS, postBuf.c_str() } }, //throw SysError
[&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/);
JsonValue jresponse;
@@ -697,81 +674,80 @@ GoogleAccessInfo googleDriveExchangeAuthCode(const GoogleAuthCode& authCode) //t
const std::optional<std::string> refreshToken = getPrimitiveFromJsonObject(jresponse, "refresh_token");
const std::optional<std::string> expiresIn = getPrimitiveFromJsonObject(jresponse, "expires_in"); //e.g. 3600 seconds
if (!accessToken || !refreshToken || !expiresIn)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", L"Google Drive"), formatGoogleErrorRaw(response));
+ throw SysError(formatGoogleErrorRaw(response));
- const GoogleUserInfo userInfo = getUserInfo(*accessToken); //throw FileError
+ const GoogleUserInfo userInfo = getUserInfo(*accessToken); //throw SysError
return { { *accessToken, std::time(nullptr) + stringTo<time_t>(*expiresIn) }, *refreshToken, userInfo };
}
-GoogleAccessInfo authorizeAccessToGoogleDrive(const Zstring& googleLoginHint, const std::function<void()>& updateGui /*throw X*/) //throw FileError, X
+GoogleAccessInfo authorizeAccessToGoogleDrive(const Zstring& googleLoginHint, const std::function<void()>& updateGui /*throw X*/) //throw SysError, X
{
- try //spin up a web server to wait for the HTTP GET after Google authentication
- {
- ::addrinfo hints = {};
- hints.ai_family = AF_INET; //make sure our server is reached by IPv4 127.0.0.1, not IPv6 [::1]
- hints.ai_socktype = SOCK_STREAM; //we *do* care about this one!
- hints.ai_flags = AI_PASSIVE; //the returned socket addresses will be suitable for bind(2)ing a socket that will accept(2) connections.
- hints.ai_flags |= AI_ADDRCONFIG; //no such issue on Linux: https://bugs.chromium.org/p/chromium/issues/detail?id=5234
- ::addrinfo* servinfo = nullptr;
- ZEN_ON_SCOPE_EXIT(if (servinfo) ::freeaddrinfo(servinfo));
-
- //ServiceName == "0" => open the next best free port
- const int rcGai = ::getaddrinfo(nullptr, //_In_opt_ PCSTR pNodeName,
- "0", //_In_opt_ PCSTR pServiceName,
- &hints, //_In_opt_ const ADDRINFOA* pHints,
- &servinfo); //_Outptr_ PADDRINFOA* ppResult
- if (rcGai != 0)
- throw SysError(formatSystemError(L"getaddrinfo", replaceCpy(_("Error Code %x"), L"%x", numberTo<std::wstring>(rcGai)), utfTo<std::wstring>(::gai_strerror(rcGai))));
- if (!servinfo)
- throw SysError(L"getaddrinfo: empty server info");
-
- auto getBoundSocket = [&](const auto& /*::addrinfo*/ ai)
- {
- SocketType testSocket = ::socket(ai.ai_family, ai.ai_socktype, ai.ai_protocol);
- if (testSocket == invalidSocket)
- THROW_LAST_SYS_ERROR_WSA(L"socket");
- ZEN_ON_SCOPE_FAIL(closeSocket(testSocket));
-
- if (::bind(testSocket, ai.ai_addr, static_cast<int>(ai.ai_addrlen)) != 0)
- THROW_LAST_SYS_ERROR_WSA(L"bind");
+ //spin up a web server to wait for the HTTP GET after Google authentication
+ ::addrinfo hints = {};
+ hints.ai_family = AF_INET; //make sure our server is reached by IPv4 127.0.0.1, not IPv6 [::1]
+ hints.ai_socktype = SOCK_STREAM; //we *do* care about this one!
+ hints.ai_flags = AI_PASSIVE; //the returned socket addresses will be suitable for bind(2)ing a socket that will accept(2) connections.
+ hints.ai_flags |= AI_ADDRCONFIG; //no such issue on Linux: https://bugs.chromium.org/p/chromium/issues/detail?id=5234
+ ::addrinfo* servinfo = nullptr;
+ ZEN_ON_SCOPE_EXIT(if (servinfo) ::freeaddrinfo(servinfo));
+
+ //ServiceName == "0" => open the next best free port
+ const int rcGai = ::getaddrinfo(nullptr, //_In_opt_ PCSTR pNodeName,
+ "0", //_In_opt_ PCSTR pServiceName,
+ &hints, //_In_opt_ const ADDRINFOA* pHints,
+ &servinfo); //_Outptr_ PADDRINFOA* ppResult
+ if (rcGai != 0)
+ throw SysError(formatSystemError(L"getaddrinfo", replaceCpy(_("Error Code %x"), L"%x", numberTo<std::wstring>(rcGai)), utfTo<std::wstring>(::gai_strerror(rcGai))));
+ if (!servinfo)
+ throw SysError(L"getaddrinfo: empty server info");
+
+ auto getBoundSocket = [&](const auto& /*::addrinfo*/ ai)
+ {
+ SocketType testSocket = ::socket(ai.ai_family, ai.ai_socktype, ai.ai_protocol);
+ if (testSocket == invalidSocket)
+ THROW_LAST_SYS_ERROR_WSA(L"socket");
+ ZEN_ON_SCOPE_FAIL(closeSocket(testSocket));
+
+ if (::bind(testSocket, ai.ai_addr, static_cast<int>(ai.ai_addrlen)) != 0)
+ THROW_LAST_SYS_ERROR_WSA(L"bind");
+
+ return testSocket;
+ };
- return testSocket;
- };
+ SocketType socket = invalidSocket;
- SocketType socket = invalidSocket;
+ std::optional<SysError> firstError;
+ for (const auto* /*::addrinfo*/ si = servinfo; si; si = si->ai_next)
+ try
+ {
+ socket = getBoundSocket(*si); //throw SysError; pass ownership
+ break;
+ }
+ catch (const SysError& e) { if (!firstError) firstError = e; }
- std::optional<SysError> firstError;
- for (const auto* /*::addrinfo*/ si = servinfo; si; si = si->ai_next)
- try
- {
- socket = getBoundSocket(*si); //throw SysError; pass ownership
- break;
- }
- catch (const SysError& e) { if (!firstError) firstError = e; }
+ if (socket == invalidSocket)
+ throw* firstError; //list was not empty, so there must have been an error!
- if (socket == invalidSocket)
- throw* firstError; //list was not empty, so there must have been an error!
+ ZEN_ON_SCOPE_EXIT(closeSocket(socket));
- ZEN_ON_SCOPE_EXIT(closeSocket(socket));
-
- sockaddr_storage addr = {}; //"sufficiently large to store address information for IPv4 or IPv6" => sockaddr_in and sockaddr_in6
- socklen_t addrLen = sizeof(addr);
- if (::getsockname(socket, reinterpret_cast<sockaddr*>(&addr), &addrLen) != 0)
- THROW_LAST_SYS_ERROR_WSA(L"getsockname");
+ sockaddr_storage addr = {}; //"sufficiently large to store address information for IPv4 or IPv6" => sockaddr_in and sockaddr_in6
+ socklen_t addrLen = sizeof(addr);
+ if (::getsockname(socket, reinterpret_cast<sockaddr*>(&addr), &addrLen) != 0)
+ THROW_LAST_SYS_ERROR_WSA(L"getsockname");
- if (addr.ss_family != AF_INET &&
- addr.ss_family != AF_INET6)
- throw SysError(L"getsockname: unknown protocol family (" + numberTo<std::wstring>(addr.ss_family) + L")");
+ if (addr.ss_family != AF_INET &&
+ addr.ss_family != AF_INET6)
+ throw SysError(L"getsockname: unknown protocol family (" + numberTo<std::wstring>(addr.ss_family) + L")");
-const int port = ntohs(reinterpret_cast<const sockaddr_in&>(addr).sin_port);
-//the socket is not bound to a specific local IP => inet_ntoa(reinterpret_cast<const sockaddr_in&>(addr).sin_addr) == "0.0.0.0"
-const std::string redirectUrl = "http://127.0.0.1:" + numberTo<std::string>(port);
+ const int port = ntohs(reinterpret_cast<const sockaddr_in&>(addr).sin_port);
+ //the socket is not bound to a specific local IP => inet_ntoa(reinterpret_cast<const sockaddr_in&>(addr).sin_addr) == "0.0.0.0"
+ const std::string redirectUrl = "http://127.0.0.1:" + numberTo<std::string>(port);
-if (::listen(socket, SOMAXCONN) != 0)
- THROW_LAST_SYS_ERROR_WSA(L"listen");
+ if (::listen(socket, SOMAXCONN) != 0)
+ THROW_LAST_SYS_ERROR_WSA(L"listen");
//"A code_verifier is a high-entropy cryptographic random string using the unreserved characters:"
@@ -784,138 +760,135 @@ if (::listen(socket, SOMAXCONN) != 0)
//authenticate Google Drive via browser: https://developers.google.com/identity/protocols/OAuth2InstalledApp#step-2-send-a-request-to-googles-oauth-20-server
const std::string oauthUrl = "https://accounts.google.com/o/oauth2/v2/auth?" + xWwwFormUrlEncode(
-{
- { "client_id", GOOGLE_DRIVE_CLIENT_ID },
- { "redirect_uri", redirectUrl },
- { "response_type", "code" },
- { "scope", "https://www.googleapis.com/auth/drive" },
- { "code_challenge", codeChallenge },
- { "code_challenge_method", "plain" },
- { "login_hint", utfTo<std::string>(googleLoginHint) },
-});
-openWithDefaultApplication(utfTo<Zstring>(oauthUrl)); //throw FileError
-//[!] no need to map to SysError
-
-//process incoming HTTP requests
-for (;;)
-{
-for (;;) //::accept() blocks forever if no client connects (e.g. user just closes the browser window!) => wait for incoming traffic with a time-out via ::select()
{
- if (updateGui) updateGui(); //throw X
-
- fd_set rfd = {};
- FD_ZERO(&rfd);
- FD_SET(socket, &rfd);
- fd_set* readfds = &rfd;
-
- struct ::timeval tv = {};
- tv.tv_usec = static_cast<long>(100 /*ms*/) * 1000;
-
- //WSAPoll broken, even ::poll() on OS X? https://daniel.haxx.se/blog/2012/10/10/wsapoll-is-broken/
- //perf: no significant difference compared to ::WSAPoll()
- const int rc = ::select(socket + 1, readfds, nullptr /*writefds*/, nullptr /*errorfds*/, &tv);
- if (rc < 0)
- THROW_LAST_SYS_ERROR_WSA(L"select");
- if (rc != 0)
- break;
- //else: time-out!
+ { "client_id", GOOGLE_DRIVE_CLIENT_ID },
+ { "redirect_uri", redirectUrl },
+ { "response_type", "code" },
+ { "scope", "https://www.googleapis.com/auth/drive" },
+ { "code_challenge", codeChallenge },
+ { "code_challenge_method", "plain" },
+ { "login_hint", utfTo<std::string>(googleLoginHint) },
+ });
+ try
+ {
+ openWithDefaultApplication(utfTo<Zstring>(oauthUrl)); //throw FileError
}
- //potential race! if the connection is gone right after ::select() and before ::accept(), latter will hang
- const SocketType clientSocket = ::accept(socket, //SOCKET s,
- nullptr, //sockaddr *addr,
- nullptr); //int *addrlen
- if (clientSocket == invalidSocket)
- THROW_LAST_SYS_ERROR_WSA(L"accept");
+ catch (const FileError& e) { throw SysError(e.toString()); } //errors should be further enriched by context info => SysError
- //receive first line of HTTP request
- std::string reqLine;
+ //process incoming HTTP requests
for (;;)
{
- const size_t blockSize = 64 * 1024;
- reqLine.resize(reqLine.size() + blockSize);
- const size_t bytesReceived = tryReadSocket(clientSocket, &*(reqLine.end() - blockSize), blockSize); //throw SysError
- reqLine.resize(reqLine.size() - blockSize + bytesReceived); //caveat: unsigned arithmetics
-
- if (contains(reqLine, "\r\n"))
+ for (;;) //::accept() blocks forever if no client connects (e.g. user just closes the browser window!) => wait for incoming traffic with a time-out via ::select()
{
- reqLine = beforeFirst(reqLine, "\r\n", IF_MISSING_RETURN_NONE);
- break;
- }
- if (bytesReceived == 0 || reqLine.size() >= 100000 /*bogus line length*/)
- break;
- }
+ if (updateGui) updateGui(); //throw X
- //get OAuth2.0 authorization result from Google, either:
- std::string code;
- std::string error;
+ fd_set rfd = {};
+ FD_ZERO(&rfd);
+ FD_SET(socket, &rfd);
+ fd_set* readfds = &rfd;
- //parse header; e.g.: GET http://127.0.0.1:62054/?code=4/ZgBRsB9k68sFzc1Pz1q0__Kh17QK1oOmetySrGiSliXt6hZtTLUlYzm70uElNTH9vt1OqUMzJVeFfplMsYsn4uI HTTP/1.1
- const std::vector<std::string> statusItems = split(reqLine, ' ', SplitType::ALLOW_EMPTY); //Method SP Request-URI SP HTTP-Version CRLF
+ struct ::timeval tv = {};
+ tv.tv_usec = static_cast<long>(100 /*ms*/) * 1000;
- if (statusItems.size() == 3 && statusItems[0] == "GET" && startsWith(statusItems[2], "HTTP/"))
- {
- for (const auto& [name, value] : xWwwFormUrlDecode(afterFirst(statusItems[1], "?", IF_MISSING_RETURN_NONE)))
- if (name == "code")
- code = value;
- else if (name == "error")
- error = value; //e.g. "access_denied" => no more detailed error info available :(
- } //"add explicit braces to avoid dangling else [-Wdangling-else]"
+ //WSAPoll broken, even ::poll() on OS X? https://daniel.haxx.se/blog/2012/10/10/wsapoll-is-broken/
+ //perf: no significant difference compared to ::WSAPoll()
+ const int rc = ::select(socket + 1, readfds, nullptr /*writefds*/, nullptr /*errorfds*/, &tv);
+ if (rc < 0)
+ THROW_LAST_SYS_ERROR_WSA(L"select");
+ if (rc != 0)
+ break;
+ //else: time-out!
+ }
+ //potential race! if the connection is gone right after ::select() and before ::accept(), latter will hang
+ const SocketType clientSocket = ::accept(socket, //SOCKET s,
+ nullptr, //sockaddr *addr,
+ nullptr); //int *addrlen
+ if (clientSocket == invalidSocket)
+ THROW_LAST_SYS_ERROR_WSA(L"accept");
+
+ //receive first line of HTTP request
+ std::string reqLine;
+ for (;;)
+ {
+ const size_t blockSize = 64 * 1024;
+ reqLine.resize(reqLine.size() + blockSize);
+ const size_t bytesReceived = tryReadSocket(clientSocket, &*(reqLine.end() - blockSize), blockSize); //throw SysError
+ reqLine.resize(reqLine.size() - blockSize + bytesReceived); //caveat: unsigned arithmetics
+
+ if (contains(reqLine, "\r\n"))
+ {
+ reqLine = beforeFirst(reqLine, "\r\n", IF_MISSING_RETURN_NONE);
+ break;
+ }
+ if (bytesReceived == 0 || reqLine.size() >= 100000 /*bogus line length*/)
+ break;
+ }
- std::optional<std::variant<GoogleAccessInfo, FileError>> authResult;
+ //get OAuth2.0 authorization result from Google, either:
+ std::string code;
+ std::string error;
- //send HTTP response; https://www.w3.org/Protocols/HTTP/1.0/spec.html#Request-Line
- std::string httpResponse;
- if (code.empty() && error.empty()) //parsing error or unrelated HTTP request
- httpResponse = "HTTP/1.0 400 Bad Request" "\r\n" "\r\n" "400 Bad Request\n" + reqLine;
- else
- {
- std::string htmlMsg = htmlMessageTemplate;
- try
+ //parse header; e.g.: GET http://127.0.0.1:62054/?code=4/ZgBRsB9k68sFzc1Pz1q0__Kh17QK1oOmetySrGiSliXt6hZtTLUlYzm70uElNTH9vt1OqUMzJVeFfplMsYsn4uI HTTP/1.1
+ const std::vector<std::string> statusItems = split(reqLine, ' ', SplitType::ALLOW_EMPTY); //Method SP Request-URI SP HTTP-Version CRLF
+
+ if (statusItems.size() == 3 && statusItems[0] == "GET" && startsWith(statusItems[2], "HTTP/"))
{
- if (!error.empty())
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", L"Google Drive"),
- replaceCpy(_("Error Code %x"), L"%x", + L"\"" + utfTo<std::wstring>(error) + L"\""));
+ for (const auto& [name, value] : xWwwFormUrlDecode(afterFirst(statusItems[1], "?", IF_MISSING_RETURN_NONE)))
+ if (name == "code")
+ code = value;
+ else if (name == "error")
+ error = value; //e.g. "access_denied" => no more detailed error info available :(
+ } //"add explicit braces to avoid dangling else [-Wdangling-else]"
- //do as many login-related tasks as possible while we have the browser as an error output device!
- //see AFS::connectNetworkFolder() => errors will be lost after time out in dir_exist_async.h!
- authResult = googleDriveExchangeAuthCode({ code, redirectUrl, codeChallenge }); //throw FileError
- replace(htmlMsg, "TITLE_PLACEHOLDER", utfTo<std::string>(_("Authentication completed.")));
- replace(htmlMsg, "MESSAGE_PLACEHOLDER", utfTo<std::string>(_("You may close this page now and continue with FreeFileSync.")));
- }
- catch (const FileError& e)
+ std::optional<std::variant<GoogleAccessInfo, SysError>> authResult;
+
+ //send HTTP response; https://www.w3.org/Protocols/HTTP/1.0/spec.html#Request-Line
+ std::string httpResponse;
+ if (code.empty() && error.empty()) //parsing error or unrelated HTTP request
+ httpResponse = "HTTP/1.0 400 Bad Request" "\r\n" "\r\n" "400 Bad Request\n" + reqLine;
+ else
{
- authResult = e;
- replace(htmlMsg, "TITLE_PLACEHOLDER", utfTo<std::string>(_("Authentication failed.")));
- replace(htmlMsg, "MESSAGE_PLACEHOLDER", utfTo<std::string>(e.toString()));
+ std::string htmlMsg = htmlMessageTemplate;
+ try
+ {
+ if (!error.empty())
+ throw SysError(replaceCpy(_("Error Code %x"), L"%x", + L"\"" + utfTo<std::wstring>(error) + L"\""));
+
+ //do as many login-related tasks as possible while we have the browser as an error output device!
+ //see AFS::connectNetworkFolder() => errors will be lost after time out in dir_exist_async.h!
+ authResult = googleDriveExchangeAuthCode({ code, redirectUrl, codeChallenge }); //throw SysError
+ replace(htmlMsg, "TITLE_PLACEHOLDER", utfTo<std::string>(_("Authentication completed.")));
+ replace(htmlMsg, "MESSAGE_PLACEHOLDER", utfTo<std::string>(_("You may close this page now and continue with FreeFileSync.")));
+ }
+ catch (const SysError& e)
+ {
+ authResult = e;
+ replace(htmlMsg, "TITLE_PLACEHOLDER", utfTo<std::string>(_("Authentication failed.")));
+ replace(htmlMsg, "MESSAGE_PLACEHOLDER", utfTo<std::string>(replaceCpy(_("Unable to connect to %x."), L"%x", L"Google Drive") + L"\n\n" + e.toString()));
+ }
+ httpResponse = "HTTP/1.0 200 OK" "\r\n"
+ "Content-Type: text/html" "\r\n"
+ "Content-Length: " + numberTo<std::string>(strLength(htmlMsg)) + "\r\n"
+ "\r\n" + htmlMsg;
}
- httpResponse = "HTTP/1.0 200 OK" "\r\n"
- "Content-Type: text/html" "\r\n"
- "Content-Length: " + numberTo<std::string>(strLength(htmlMsg)) + "\r\n"
- "\r\n" + htmlMsg;
- }
- for (size_t bytesToSend = httpResponse.size(); bytesToSend > 0;)
- bytesToSend -= tryWriteSocket(clientSocket, &*(httpResponse.end() - bytesToSend), bytesToSend); //throw SysError
+ for (size_t bytesToSend = httpResponse.size(); bytesToSend > 0;)
+ bytesToSend -= tryWriteSocket(clientSocket, &*(httpResponse.end() - bytesToSend), bytesToSend); //throw SysError
- shutdownSocketSend(clientSocket); //throw SysError
- //---------------------------------------------------------------
+ shutdownSocketSend(clientSocket); //throw SysError
+ //---------------------------------------------------------------
- if (authResult)
- {
- if (const FileError* e = std::get_if<FileError>(&*authResult))
- throw *e;
- return std::get<GoogleAccessInfo>(*authResult);
+ if (authResult)
+ {
+ if (const SysError* e = std::get_if<SysError>(&*authResult))
+ throw *e;
+ return std::get<GoogleAccessInfo>(*authResult);
+ }
}
}
-}
-catch (const SysError& e)
-{
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", L"Google Drive"), e.toString());
-}
-}
-GoogleAccessToken refreshAccessToGoogleDrive(const std::string& refreshToken, const Zstring& googleUserEmail) //throw FileError
+GoogleAccessToken refreshAccessToGoogleDrive(const std::string& refreshToken) //throw SysError
{
//https://developers.google.com/identity/protocols/OAuth2InstalledApp#offline
const std::string postBuf = xWwwFormUrlEncode(
@@ -927,7 +900,7 @@ GoogleAccessToken refreshAccessToGoogleDrive(const std::string& refreshToken, co
});
std::string response;
- googleHttpsRequest("/oauth2/v4/token", {} /*extraHeaders*/, { { CURLOPT_POSTFIELDS, postBuf.c_str() } }, //throw FileError
+ googleHttpsRequest("/oauth2/v4/token", {} /*extraHeaders*/, { { CURLOPT_POSTFIELDS, postBuf.c_str() } }, //throw SysError
[&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/);
JsonValue jresponse;
@@ -937,39 +910,38 @@ GoogleAccessToken refreshAccessToGoogleDrive(const std::string& refreshToken, co
const std::optional<std::string> accessToken = getPrimitiveFromJsonObject(jresponse, "access_token");
const std::optional<std::string> expiresIn = getPrimitiveFromJsonObject(jresponse, "expires_in"); //e.g. 3600 seconds
if (!accessToken || !expiresIn)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(getGoogleDisplayPath({ googleUserEmail, AfsPath() }))), formatGoogleErrorRaw(response));
+ throw SysError(formatGoogleErrorRaw(response));
return { *accessToken, std::time(nullptr) + stringTo<time_t>(*expiresIn) };
}
-void revokeAccessToGoogleDrive(const std::string& accessToken, const Zstring& googleUserEmail) //throw FileError
+void revokeAccessToGoogleDrive(const std::string& accessToken, const Zstring& googleUserEmail) //throw SysError
{
//https://developers.google.com/identity/protocols/OAuth2InstalledApp#tokenrevoke
const std::shared_ptr<HttpSessionManager> mgr = httpSessionManager.get();
if (!mgr)
- throw FileError(replaceCpy(_("Unable to access %x."), L"%x", fmtPath(getGoogleDisplayPath({ googleUserEmail, AfsPath() }))),
- L"Function call not allowed during process init/shutdown.");
+ throw SysError(L"revokeAccessToGoogleDrive() Function call not allowed during process init/shutdown.");
HttpSession::HttpResult httpResult;
std::string response;
- mgr->access(HttpSessionId(Zstr("accounts.google.com")), [&](HttpSession& session) //throw FileError
+ mgr->access(HttpSessionId(Zstr("accounts.google.com")), [&](HttpSession& session) //throw SysError
{
httpResult = session.perform("/o/oauth2/revoke?token=" + accessToken, { "Content-Type: application/x-www-form-urlencoded" }, {} /*extraOptions*/,
- [&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/); //throw FileError
+ [&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/); //throw SysError
});
if (httpResult.statusCode != 200)
- throw FileError(replaceCpy(_("Unable to disconnect from %x."), L"%x", fmtPath(getGoogleDisplayPath({ googleUserEmail, AfsPath() }))), formatGoogleErrorRaw(response));
+ throw SysError(formatGoogleErrorRaw(response));
}
-uint64_t gdriveGetFreeDiskSpace(const std::string& accessToken) //throw FileError, SysError; returns 0 if not available
+uint64_t gdriveGetFreeDiskSpace(const std::string& accessToken) //throw SysError; returns 0 if not available
{
//https://developers.google.com/drive/api/v3/reference/about
std::string response;
- googleHttpsRequest("/drive/v3/about?fields=storageQuota", { "Authorization: Bearer " + accessToken }, {} /*extraOptions*/, //throw FileError
+ googleHttpsRequest("/drive/v3/about?fields=storageQuota", { "Authorization: Bearer " + accessToken }, {} /*extraOptions*/, //throw SysError
[&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/);
JsonValue jresponse;
@@ -1018,15 +990,12 @@ struct GoogleFileItem
std::string itemId;
GoogleItemDetails details;
};
-std::vector<GoogleFileItem> readFolderContent(const std::string& folderId, //throw FileError
- const std::string& accessToken, const GdrivePath& gdrivePath)
+std::vector<GoogleFileItem> readFolderContent(const std::string& folderId, const std::string& accessToken) //throw SysError
{
-
warn_static("perf: trashed=false and ('114231411234' in parents or '123123' in parents)")
//https://developers.google.com/drive/api/v3/reference/files/list
std::vector<GoogleFileItem> childItems;
- try
{
std::optional<std::string> nextPageToken;
do
@@ -1044,7 +1013,7 @@ std::vector<GoogleFileItem> readFolderContent(const std::string& folderId, //thr
queryParams += '&' + xWwwFormUrlEncode({ { "pageToken", *nextPageToken } });
std::string response;
- googleHttpsRequest("/drive/v3/files?" + queryParams, { "Authorization: Bearer " + accessToken }, {} /*extraOptions*/, //throw FileError
+ googleHttpsRequest("/drive/v3/files?" + queryParams, { "Authorization: Bearer " + accessToken }, {} /*extraOptions*/, //throw SysError
[&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/);
JsonValue jresponse;
@@ -1091,8 +1060,6 @@ std::vector<GoogleFileItem> readFolderContent(const std::string& folderId, //thr
}
while (nextPageToken);
}
- catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtPath(getGoogleDisplayPath(gdrivePath))), e.toString()); }
-
return childItems;
}
@@ -1107,107 +1074,103 @@ struct ChangesDelta
std::string newStartPageToken;
std::vector<ChangeItem> changes;
};
-ChangesDelta getChangesDelta(const std::string& startPageToken, //throw FileError
- const std::string& accessToken, const Zstring& googleUserEmail)
+ChangesDelta getChangesDelta(const std::string& startPageToken, const std::string& accessToken) //throw SysError
{
- try //https://developers.google.com/drive/api/v3/reference/changes/list
+ //https://developers.google.com/drive/api/v3/reference/changes/list
+ ChangesDelta delta;
+ std::optional<std::string> nextPageToken = startPageToken;
+ for (;;)
{
- ChangesDelta delta;
- std::optional<std::string> nextPageToken = startPageToken;
- for (;;)
+ std::string queryParams = xWwwFormUrlEncode(
{
- std::string queryParams = xWwwFormUrlEncode(
- {
- { "pageToken", *nextPageToken },
- { "pageSize", "1000" }, //"[1, 1000] Default: 100"
- { "restrictToMyDrive", "true" }, //important! otherwise we won't get "removed: true" (because file may still be accessible from other Corpora)
- { "spaces", "drive" },
- { "fields", "kind,nextPageToken,newStartPageToken,changes(kind,removed,fileId,file(name,mimeType,size,modifiedTime,parents,trashed))" },
- });
+ { "pageToken", *nextPageToken },
+ { "pageSize", "1000" }, //"[1, 1000] Default: 100"
+ { "restrictToMyDrive", "true" }, //important! otherwise we won't get "removed: true" (because file may still be accessible from other Corpora)
+ { "spaces", "drive" },
+ { "fields", "kind,nextPageToken,newStartPageToken,changes(kind,removed,fileId,file(name,mimeType,size,modifiedTime,parents,trashed))" },
+ });
- std::string response;
- googleHttpsRequest("/drive/v3/changes?" + queryParams, { "Authorization: Bearer " + accessToken }, {} /*extraOptions*/, //throw FileError
- [&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/);
+ std::string response;
+ googleHttpsRequest("/drive/v3/changes?" + queryParams, { "Authorization: Bearer " + accessToken }, {} /*extraOptions*/, //throw SysError
+ [&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/);
- JsonValue jresponse;
- try { jresponse = parseJson(response); }
- catch (JsonParsingError&) {}
+ JsonValue jresponse;
+ try { jresponse = parseJson(response); }
+ catch (JsonParsingError&) {}
+
+ /**/ nextPageToken = getPrimitiveFromJsonObject(jresponse, "nextPageToken");
+ const std::optional<std::string> newStartPageToken = getPrimitiveFromJsonObject(jresponse, "newStartPageToken");
+ const std::optional<std::string> listKind = getPrimitiveFromJsonObject(jresponse, "kind");
+ const JsonValue* changes = getChildFromJsonObject (jresponse, "changes");
- /**/ nextPageToken = getPrimitiveFromJsonObject(jresponse, "nextPageToken");
- const std::optional<std::string> newStartPageToken = getPrimitiveFromJsonObject(jresponse, "newStartPageToken");
- const std::optional<std::string> listKind = getPrimitiveFromJsonObject(jresponse, "kind");
- const JsonValue* changes = getChildFromJsonObject (jresponse, "changes");
+ if (!!nextPageToken == !!newStartPageToken || //there can be only one
+ !listKind || *listKind != "drive#changeList" ||
+ !changes || changes->type != JsonValue::Type::array)
+ throw SysError(formatGoogleErrorRaw(response));
- if (!!nextPageToken == !!newStartPageToken || //there can be only one
- !listKind || *listKind != "drive#changeList" ||
- !changes || changes->type != JsonValue::Type::array)
+ for (const auto& childVal : changes->arrayVal)
+ {
+ const std::optional<std::string> kind = getPrimitiveFromJsonObject(*childVal, "kind");
+ const std::optional<std::string> removed = getPrimitiveFromJsonObject(*childVal, "removed");
+ const std::optional<std::string> itemId = getPrimitiveFromJsonObject(*childVal, "fileId");
+ const JsonValue* file = getChildFromJsonObject (*childVal, "file");
+ if (!kind || *kind != "drive#change" || !removed || !itemId)
throw SysError(formatGoogleErrorRaw(response));
- for (const auto& childVal : changes->arrayVal)
+ ChangeItem changeItem;
+ changeItem.itemId = *itemId;
+ if (*removed != "true")
{
- const std::optional<std::string> kind = getPrimitiveFromJsonObject(*childVal, "kind");
- const std::optional<std::string> removed = getPrimitiveFromJsonObject(*childVal, "removed");
- const std::optional<std::string> itemId = getPrimitiveFromJsonObject(*childVal, "fileId");
- const JsonValue* file = getChildFromJsonObject (*childVal, "file");
- if (!kind || *kind != "drive#change" || !removed || !itemId)
+ if (!file)
throw SysError(formatGoogleErrorRaw(response));
- ChangeItem changeItem;
- changeItem.itemId = *itemId;
- if (*removed != "true")
+ const std::optional<std::string> itemName = getPrimitiveFromJsonObject(*file, "name");
+ const std::optional<std::string> mimeType = getPrimitiveFromJsonObject(*file, "mimeType");
+ const std::optional<std::string> size = getPrimitiveFromJsonObject(*file, "size");
+ const std::optional<std::string> modifiedTime = getPrimitiveFromJsonObject(*file, "modifiedTime");
+ const std::optional<std::string> trashed = getPrimitiveFromJsonObject(*file, "trashed");
+ const JsonValue* parents = getChildFromJsonObject (*file, "parents");
+ if (!itemName || !mimeType || !modifiedTime || !trashed || !parents)
+ throw SysError(formatGoogleErrorRaw(response));
+
+ if (*trashed != "true")
{
- if (!file)
- throw SysError(formatGoogleErrorRaw(response));
+ GoogleItemDetails itemDetails = {};
+ itemDetails.itemName = *itemName;
+ itemDetails.isFolder = *mimeType == googleFolderMimeType;
+ itemDetails.fileSize = size ? stringTo<uint64_t>(*size) : 0; //not available for folders
- const std::optional<std::string> itemName = getPrimitiveFromJsonObject(*file, "name");
- const std::optional<std::string> mimeType = getPrimitiveFromJsonObject(*file, "mimeType");
- const std::optional<std::string> size = getPrimitiveFromJsonObject(*file, "size");
- const std::optional<std::string> modifiedTime = getPrimitiveFromJsonObject(*file, "modifiedTime");
- const std::optional<std::string> trashed = getPrimitiveFromJsonObject(*file, "trashed");
- const JsonValue* parents = getChildFromJsonObject (*file, "parents");
- if (!itemName || !mimeType || !modifiedTime || !trashed || !parents)
- throw SysError(formatGoogleErrorRaw(response));
+ //RFC 3339 date-time: e.g. "2018-09-29T08:39:12.053Z"
+ itemDetails.modTime = utcToTimeT(parseTime("%Y-%m-%dT%H:%M:%S", beforeLast(*modifiedTime, '.', IF_MISSING_RETURN_ALL))); //returns -1 on error
+ if (itemDetails.modTime == -1 || !endsWith(*modifiedTime, 'Z')) //'Z' means "UTC" => it seems Google doesn't use the time-zone offset postfix
+ throw SysError(L"Modification time could not be parsed. (" + utfTo<std::wstring>(*modifiedTime) + L")");
- if (*trashed != "true")
+ for (const auto& parentVal : parents->arrayVal)
{
- GoogleItemDetails itemDetails = {};
- itemDetails.itemName = *itemName;
- itemDetails.isFolder = *mimeType == googleFolderMimeType;
- itemDetails.fileSize = size ? stringTo<uint64_t>(*size) : 0; //not available for folders
-
- //RFC 3339 date-time: e.g. "2018-09-29T08:39:12.053Z"
- itemDetails.modTime = utcToTimeT(parseTime("%Y-%m-%dT%H:%M:%S", beforeLast(*modifiedTime, '.', IF_MISSING_RETURN_ALL))); //returns -1 on error
- if (itemDetails.modTime == -1 || !endsWith(*modifiedTime, 'Z')) //'Z' means "UTC" => it seems Google doesn't use the time-zone offset postfix
- throw SysError(L"Modification time could not be parsed. (" + utfTo<std::wstring>(*modifiedTime) + L")");
-
- for (const auto& parentVal : parents->arrayVal)
- {
- if (parentVal->type != JsonValue::Type::string)
- throw SysError(formatGoogleErrorRaw(response));
- itemDetails.parentIds.push_back(parentVal->primVal);
- }
- changeItem.details = std::move(itemDetails);
+ if (parentVal->type != JsonValue::Type::string)
+ throw SysError(formatGoogleErrorRaw(response));
+ itemDetails.parentIds.push_back(parentVal->primVal);
}
+ changeItem.details = std::move(itemDetails);
}
- delta.changes.push_back(std::move(changeItem));
}
+ delta.changes.push_back(std::move(changeItem));
+ }
- if (!nextPageToken)
- {
- delta.newStartPageToken = *newStartPageToken;
- return delta;
- }
+ if (!nextPageToken)
+ {
+ delta.newStartPageToken = *newStartPageToken;
+ return delta;
}
}
- catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtPath(getGoogleDisplayPath({ googleUserEmail, AfsPath() }))), e.toString()); }
}
-std::string /*startPageToken*/ getChangesCurrentToken(const std::string& accessToken, const Zstring& googleUserEmail) //throw FileError
+std::string /*startPageToken*/ getChangesCurrentToken(const std::string& accessToken) //throw SysError
{
//https://developers.google.com/drive/api/v3/reference/changes/getStartPageToken
std::string response;
- googleHttpsRequest("/drive/v3/changes/startPageToken", { "Authorization: Bearer " + accessToken }, {} /*extraOptions*/, //throw FileError
+ googleHttpsRequest("/drive/v3/changes/startPageToken", { "Authorization: Bearer " + accessToken }, {} /*extraOptions*/, //throw SysError
[&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/);
JsonValue jresponse;
@@ -1216,7 +1179,7 @@ std::string /*startPageToken*/ getChangesCurrentToken(const std::string& accessT
const std::optional<std::string> startPageToken = getPrimitiveFromJsonObject(jresponse, "startPageToken");
if (!startPageToken)
- throw FileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtPath(getGoogleDisplayPath({ googleUserEmail, AfsPath() }))), formatGoogleErrorRaw(response));
+ throw SysError(formatGoogleErrorRaw(response));
return *startPageToken;
}
@@ -1224,11 +1187,11 @@ std::string /*startPageToken*/ getChangesCurrentToken(const std::string& accessT
//- if item is a folder: deletes recursively!!!
//- even deletes a hardlink with multiple parents => use gdriveUnlinkParent() first
-void gdriveDeleteItem(const std::string& itemId, const std::string& accessToken) //throw FileError, SysError
+void gdriveDeleteItem(const std::string& itemId, const std::string& accessToken) //throw SysError
{
//https://developers.google.com/drive/api/v3/reference/files/delete
std::string response;
- const HttpSession::HttpResult httpResult = googleHttpsRequest("/drive/v3/files/" + itemId, { "Authorization: Bearer " + accessToken }, //throw FileError
+ const HttpSession::HttpResult httpResult = googleHttpsRequest("/drive/v3/files/" + itemId, { "Authorization: Bearer " + accessToken }, //throw SysError
{ { CURLOPT_CUSTOMREQUEST, "DELETE" } },
[&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/);
@@ -1239,7 +1202,7 @@ void gdriveDeleteItem(const std::string& itemId, const std::string& accessToken)
//item is NOT deleted when last parent is removed: it is just not accessible via the "My Drive" hierarchy but still adds to quota! => use for hard links only!
-void gdriveUnlinkParent(const std::string& itemId, const std::string& parentFolderId, const std::string& accessToken) //throw FileError, SysError
+void gdriveUnlinkParent(const std::string& itemId, const std::string& parentFolderId, const std::string& accessToken) //throw SysError
{
//https://developers.google.com/drive/api/v3/reference/files/update
const std::string queryParams = xWwwFormUrlEncode(
@@ -1248,7 +1211,7 @@ void gdriveUnlinkParent(const std::string& itemId, const std::string& parentFold
{ "fields", "id,parents"}, //for test if operation was successful
});
std::string response;
- googleHttpsRequest("/drive/v3/files/" + itemId + '?' + queryParams, //throw FileError
+ googleHttpsRequest("/drive/v3/files/" + itemId + '?' + queryParams, //throw SysError
{ "Authorization: Bearer " + accessToken, "Content-Type: application/json; charset=UTF-8" },
{ { CURLOPT_CUSTOMREQUEST, "PATCH" }, { CURLOPT_POSTFIELDS, "{}" } },
[&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/);
@@ -1266,19 +1229,19 @@ void gdriveUnlinkParent(const std::string& itemId, const std::string& parentFold
if (parents->type != JsonValue::Type::array ||
std::any_of(parents->arrayVal.begin(), parents->arrayVal.end(),
[&](const std::unique_ptr<JsonValue>& jval) { return jval->type == JsonValue::Type::string && jval->primVal == parentFolderId; }))
- throw SysError(L"Google Drive internal failure"); //user should never see this...
+ throw SysError(L"gdriveUnlinkParent: Google Drive internal failure"); //user should never see this...
}
//- if item is a folder: trashes recursively!!!
//- a hardlink with multiple parents will be not be accessible anymore via any of its path aliases!
-void gdriveMoveToTrash(const std::string& itemId, const std::string& accessToken) //throw FileError, SysError
+void gdriveMoveToTrash(const std::string& itemId, const std::string& accessToken) //throw SysError
{
//https://developers.google.com/drive/api/v3/reference/files/update
const std::string postBuf = R"({ "trashed": true })";
std::string response;
- googleHttpsRequest("/drive/v3/files/" + itemId + "?fields=trashed", //throw FileError
+ googleHttpsRequest("/drive/v3/files/" + itemId + "?fields=trashed", //throw SysError
{ "Authorization: Bearer " + accessToken, "Content-Type: application/json; charset=UTF-8" },
{ { CURLOPT_CUSTOMREQUEST, "PATCH" }, { CURLOPT_POSTFIELDS, postBuf.c_str() } },
[&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/);
@@ -1294,7 +1257,7 @@ void gdriveMoveToTrash(const std::string& itemId, const std::string& accessToken
//folder name already existing? will (happily) create duplicate folders => caller must check!
-std::string /*folderId*/ gdriveCreateFolderPlain(const Zstring& folderName, const std::string& parentFolderId, const std::string& accessToken) //throw FileError, SysError
+std::string /*folderId*/ gdriveCreateFolderPlain(const Zstring& folderName, const std::string& parentFolderId, const std::string& accessToken) //throw SysError
{
//https://developers.google.com/drive/api/v3/folder#creating_a_folder
std::string postBuf = "{\n";
@@ -1305,8 +1268,8 @@ std::string /*folderId*/ gdriveCreateFolderPlain(const Zstring& folderName, cons
std::string response;
googleHttpsRequest("/drive/v3/files?fields=id", { "Authorization: Bearer " + accessToken, "Content-Type: application/json; charset=UTF-8" },
- { { CURLOPT_POSTFIELDS, postBuf.c_str() } }, //throw FileError
- [&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/);
+ { { CURLOPT_POSTFIELDS, postBuf.c_str() } },
+ [&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/); //throw SysError
JsonValue jresponse;
try { jresponse = parseJson(response); }
@@ -1320,17 +1283,17 @@ std::string /*folderId*/ gdriveCreateFolderPlain(const Zstring& folderName, cons
//target name already existing? will (happily) create duplicate items => caller must check!
-void gdriveMoveAndRenameItem(const std::string& itemId, const std::string& parentIdOld, const std::string& parentIdNew,
- const Zstring& newName, time_t newModTime, const std::string& accessToken) //throw FileError, SysError
+void gdriveMoveAndRenameItem(const std::string& itemId, const std::string& parentIdFrom, const std::string& parentIdTo,
+ const Zstring& newName, time_t newModTime, const std::string& accessToken) //throw SysError
{
//https://developers.google.com/drive/api/v3/folder#moving_files_between_folders
std::string queryParams = "fields=name,parents"; //for test if operation was successful
- if (parentIdOld != parentIdNew)
+ if (parentIdFrom != parentIdTo)
queryParams += '&' + xWwwFormUrlEncode(
{
- { "removeParents", parentIdOld },
- { "addParents", parentIdNew },
+ { "removeParents", parentIdFrom },
+ { "addParents", parentIdTo },
});
//more Google Drive peculiarities: changing the file name changes modifiedTime!!! => workaround:
@@ -1347,7 +1310,7 @@ void gdriveMoveAndRenameItem(const std::string& itemId, const std::string& paren
postBuf += "}";
std::string response;
- googleHttpsRequest("/drive/v3/files/" + itemId + '?' + queryParams, //throw FileError
+ googleHttpsRequest("/drive/v3/files/" + itemId + '?' + queryParams, //throw SysError
{ "Authorization: Bearer " + accessToken, "Content-Type: application/json; charset=UTF-8" },
{ { CURLOPT_CUSTOMREQUEST, "PATCH" }, { CURLOPT_POSTFIELDS, postBuf.c_str() } },
[&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/);
@@ -1363,52 +1326,45 @@ void gdriveMoveAndRenameItem(const std::string& itemId, const std::string& paren
throw SysError(formatGoogleErrorRaw(response));
if (!std::any_of(parents->arrayVal.begin(), parents->arrayVal.end(),
- [&](const std::unique_ptr<JsonValue>& jval) { return jval->type == JsonValue::Type::string && jval->primVal == parentIdNew; }))
- throw SysError(L"Google Drive internal failure"); //user should never see this...
+ [&](const std::unique_ptr<JsonValue>& jval) { return jval->type == JsonValue::Type::string && jval->primVal == parentIdTo; }))
+ throw SysError(L"gdriveMoveAndRenameItem: Google Drive internal failure"); //user should never see this...
}
#if 0
-void setModTime(const std::string& itemId, time_t modTime, //throw FileError
- const std::string& accessToken, const GdrivePath& gdrivePath)
+void setModTime(const std::string& itemId, time_t modTime, const std::string& accessToken) //throw SysError
{
- try //https://developers.google.com/drive/api/v3/reference/files/update
- {
- //RFC 3339 date-time: e.g. "2018-09-29T08:39:12.053Z"
- const std::string dateTime = formatTime<std::string>("%Y-%m-%dT%H:%M:%S.000Z", getUtcTime(modTime)); //returns empty string on failure
- if (dateTime.empty())
- throw SysError(L"Invalid modification time (time_t: " + numberTo<std::wstring>(modTime) + L")");
+ //https://developers.google.com/drive/api/v3/reference/files/update
+ //RFC 3339 date-time: e.g. "2018-09-29T08:39:12.053Z"
+ const std::string dateTime = formatTime<std::string>("%Y-%m-%dT%H:%M:%S.000Z", getUtcTime(modTime)); //returns empty string on failure
+ if (dateTime.empty())
+ throw SysError(L"Invalid modification time (time_t: " + numberTo<std::wstring>(modTime) + L")");
- const std::string postBuf = R"({ "modifiedTime": ")" + dateTime + "\" }";
+ const std::string postBuf = R"({ "modifiedTime": ")" + dateTime + "\" }";
- std::string response;
- googleHttpsRequest("/drive/v3/files/" + itemId + "?fields=modifiedTime", //throw FileError
- { "Authorization: Bearer " + accessToken, "Content-Type: application/json; charset=UTF-8" },
- { { CURLOPT_CUSTOMREQUEST, "PATCH" }, { CURLOPT_POSTFIELDS, postBuf.c_str() } },
- [&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/);
+ std::string response;
+ googleHttpsRequest("/drive/v3/files/" + itemId + "?fields=modifiedTime", //throw SysError
+ { "Authorization: Bearer " + accessToken, "Content-Type: application/json; charset=UTF-8" },
+ { { CURLOPT_CUSTOMREQUEST, "PATCH" }, { CURLOPT_POSTFIELDS, postBuf.c_str() } },
+ [&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/);
- JsonValue jresponse;
- try { jresponse = parseJson(response); /*throw JsonParsingError*/ }
- catch (const JsonParsingError&) {}
+ JsonValue jresponse;
+ try { jresponse = parseJson(response); /*throw JsonParsingError*/ }
+ catch (const JsonParsingError&) {}
- const std::optional<std::string> modifiedTime = getPrimitiveFromJsonObject(jresponse, "modifiedTime");
- if (!modifiedTime || *modifiedTime != dateTime)
- throw SysError(formatGoogleErrorRaw(response));
- }
- catch (const SysError& e)
- {
- throw FileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtPath(getGoogleDisplayPath(gdrivePath))), e.toString());
- }
+ const std::optional<std::string> modifiedTime = getPrimitiveFromJsonObject(jresponse, "modifiedTime");
+ if (!modifiedTime || *modifiedTime != dateTime)
+ throw SysError(formatGoogleErrorRaw(response));
}
#endif
-void gdriveDownloadFile(const std::string& itemId, const std::function<void(const void* buffer, size_t bytesToWrite)>& writeBlock /*throw X*/, //throw FileError, X
- const std::string& accessToken, const GdrivePath& gdrivePath)
+void gdriveDownloadFile(const std::string& itemId, const std::function<void(const void* buffer, size_t bytesToWrite)>& writeBlock /*throw X*/, //throw SysError, X
+ const std::string& accessToken)
{
//https://developers.google.com/drive/api/v3/manage-downloads
std::string response;
- const HttpSession::HttpResult httpResult = googleHttpsRequest("/drive/v3/files/" + itemId + "?alt=media", //throw FileError, X
+ const HttpSession::HttpResult httpResult = googleHttpsRequest("/drive/v3/files/" + itemId + "?alt=media", //throw SysError, X
{ "Authorization: Bearer " + accessToken }, {} /*extraOptions*/,
[&](const void* buffer, size_t bytesToWrite)
{
@@ -1418,7 +1374,7 @@ void gdriveDownloadFile(const std::string& itemId, const std::function<void(cons
}, nullptr /*readRequest*/);
if (httpResult.statusCode / 100 != 2)
- throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(getGoogleDisplayPath(gdrivePath))), formatGoogleErrorRaw(response));
+ throw SysError(formatGoogleErrorRaw(response));
}
@@ -1426,9 +1382,9 @@ void gdriveDownloadFile(const std::string& itemId, const std::function<void(cons
//file name already existing? => duplicate file created!
//note: Google Drive upload is already transactional!
//upload "small files" (5 MB or less; enforced by Google?) in a single round-trip
-std::string /*itemId*/ gdriveUploadSmallFile(const Zstring& fileName, const std::string& parentFolderId, uint64_t streamSize, std::optional<time_t> modTime, //throw FileError, X
+std::string /*itemId*/ gdriveUploadSmallFile(const Zstring& fileName, const std::string& parentFolderId, uint64_t streamSize, std::optional<time_t> modTime, //throw SysError, X
const std::function<size_t(void* buffer, size_t bytesToRead)>& readBlock /*throw X*/, //returning 0 signals EOF: Posix read() semantics
- const std::string& accessToken, const GdrivePath& gdrivePath)
+ const std::string& accessToken)
{
//https://developers.google.com/drive/api/v3/folder#inserting_a_file_in_a_folder
//https://developers.google.com/drive/api/v3/multipart-upload
@@ -1498,41 +1454,34 @@ std::string /*itemId*/ gdriveUploadSmallFile(const Zstring& fileName, const std:
TODO:
gzip-compress HTTP request body!
- try
+ std::string response;
+ const HttpSession::HttpResult httpResult = googleHttpsRequest("/upload/drive/v3/files?uploadType=multipart", //throw SysError, X
{
- std::string response;
- const HttpSession::HttpResult httpResult = googleHttpsRequest("/upload/drive/v3/files?uploadType=multipart", //throw FileError, X
- {
- "Authorization: Bearer " + accessToken,
- "Content-Type: multipart/related; boundary=" + boundaryString,
- "Content-Length: " + numberTo<std::string>(postBufHead.size() + streamSize + postBufTail.size())
- },
- { { CURLOPT_POST, 1 } }, //otherwise HttpSession::perform() will PUT
- [&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, readMultipartBlock );
+ "Authorization: Bearer " + accessToken,
+ "Content-Type: multipart/related; boundary=" + boundaryString,
+ "Content-Length: " + numberTo<std::string>(postBufHead.size() + streamSize + postBufTail.size())
+ },
+ { { CURLOPT_POST, 1 } }, //otherwise HttpSession::perform() will PUT
+ [&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, readMultipartBlock );
- JsonValue jresponse;
- try { jresponse = parseJson(response); }
- catch (JsonParsingError&) {}
+ JsonValue jresponse;
+ try { jresponse = parseJson(response); }
+ catch (JsonParsingError&) {}
- const std::optional<std::string> itemId = getPrimitiveFromJsonObject(jresponse, "id");
- if (!itemId)
- throw SysError(formatGoogleErrorRaw(response));
+ const std::optional<std::string> itemId = getPrimitiveFromJsonObject(jresponse, "id");
+ if (!itemId)
+ throw SysError(formatGoogleErrorRaw(response));
- return *itemId;
- }
- catch (const SysError& e)
- {
- throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(getGoogleDisplayPath(gdrivePath))), e.toString());
- }
+ return *itemId;
}
#endif
//file name already existing? => duplicate file created!
//note: Google Drive upload is already transactional!
-std::string /*itemId*/ gdriveUploadFile(const Zstring& fileName, const std::string& parentFolderId, std::optional<time_t> modTime, //throw FileError, X
+std::string /*itemId*/ gdriveUploadFile(const Zstring& fileName, const std::string& parentFolderId, std::optional<time_t> modTime, //throw SysError, X
const std::function<size_t(void* buffer, size_t bytesToRead)>& readBlock /*throw X*/, //returning 0 signals EOF: Posix read() semantics
- const std::string& accessToken, const GdrivePath& gdrivePath)
+ const std::string& accessToken)
{
//https://developers.google.com/drive/api/v3/folder#inserting_a_file_in_a_folder
//https://developers.google.com/drive/api/v3/resumable-upload
@@ -1578,7 +1527,7 @@ std::string /*itemId*/ gdriveUploadFile(const Zstring& fileName, const std::stri
};
std::string response;
- const HttpSession::HttpResult httpResult = googleHttpsRequest("/upload/drive/v3/files?uploadType=resumable", //throw FileError
+ const HttpSession::HttpResult httpResult = googleHttpsRequest("/upload/drive/v3/files?uploadType=resumable", //throw SysError
{ "Authorization: Bearer " + accessToken, "Content-Type: application/json; charset=UTF-8" },
{ { CURLOPT_POSTFIELDS, postBuf.c_str() }, { CURLOPT_HEADERDATA, &onBytesReceived }, { CURLOPT_HEADERFUNCTION, onBytesReceivedWrapper } },
[&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/);
@@ -1597,11 +1546,11 @@ std::string /*itemId*/ gdriveUploadFile(const Zstring& fileName, const std::stri
//not officially documented, but Google Drive supports compressed file upload when "Content-Encoding: gzip" is set! :)))
InputStreamAsGzip gzipStream(readBlock); //throw ZlibInternalError
- auto readBlockAsGzip = [&](void* buffer, size_t bytesToRead) { return gzipStream.read(buffer, bytesToRead); }; //throw ZlibInternalError, X;
+ auto readBlockAsGzip = [&](void* buffer, size_t bytesToRead) { return gzipStream.read(buffer, bytesToRead); }; //throw ZlibInternalError, X
//returns "bytesToRead" bytes unless end of stream! => fits into "0 signals EOF: Posix read() semantics"
std::string response;
- googleHttpsRequest(uploadUrlRelative, { "Content-Encoding: gzip" }, {} /*extraOptions*/, //throw FileError, X
+ googleHttpsRequest(uploadUrlRelative, { "Content-Encoding: gzip" }, {} /*extraOptions*/, //throw SysError, ZlibInternalError, X
[&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, readBlockAsGzip);
JsonValue jresponse;
@@ -1616,21 +1565,17 @@ std::string /*itemId*/ gdriveUploadFile(const Zstring& fileName, const std::stri
}
catch (ZlibInternalError&)
{
- throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(getGoogleDisplayPath(gdrivePath))), L"zlib internal error");
- }
- catch (const SysError& e)
- {
- throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(getGoogleDisplayPath(gdrivePath))), e.toString());
+ throw SysError(L"zlib internal error");
}
}
//instead of the "root" alias Google uses an actual ID in file metadata
-std::string /*itemId*/ getRootItemId(const std::string& accessToken, const Zstring& googleUserEmail) //throw FileError
+std::string /*itemId*/ getRootItemId(const std::string& accessToken) //throw SysError
{
//https://developers.google.com/drive/api/v3/reference/files/get
std::string response;
- googleHttpsRequest("/drive/v3/files/root?fields=id", { "Authorization: Bearer " + accessToken }, {} /*extraOptions*/, //throw FileError
+ googleHttpsRequest("/drive/v3/files/root?fields=id", { "Authorization: Bearer " + accessToken }, {} /*extraOptions*/, //throw SysError
[&](const void* buffer, size_t bytesToWrite) { response.append(static_cast<const char*>(buffer), bytesToWrite); }, nullptr /*readRequest*/);
JsonValue jresponse;
@@ -1639,7 +1584,7 @@ std::string /*itemId*/ getRootItemId(const std::string& accessToken, const Zstri
const std::optional<std::string> itemId = getPrimitiveFromJsonObject(jresponse, "id");
if (!itemId)
- throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(getGoogleDisplayPath({ googleUserEmail, AfsPath() }))), formatGoogleErrorRaw(response));
+ throw SysError(formatGoogleErrorRaw(response));
return *itemId;
}
@@ -1669,10 +1614,10 @@ public:
writeContainer(stream, utfTo<std::string>(accessInfo_.userInfo.email));
}
- std::string getAccessToken() //throw FileError
+ std::string getAccessToken() //throw SysError
{
if (accessInfo_.accessToken.validUntil <= std::time(nullptr) + std::chrono::seconds(HTTP_SESSION_ACCESS_TIME_OUT).count() + 5 /*some leeway*/) //expired/will expire
- accessInfo_.accessToken = refreshAccessToGoogleDrive(accessInfo_.refreshToken, accessInfo_.userInfo.email); //throw FileError
+ accessInfo_.accessToken = refreshAccessToGoogleDrive(accessInfo_.refreshToken); //throw SysError
assert(accessInfo_.accessToken.validUntil > std::time(nullptr) + std::chrono::seconds(HTTP_SESSION_ACCESS_TIME_OUT).count());
return accessInfo_.accessToken.value;
@@ -1702,11 +1647,10 @@ class GooglePersistentSessions;
class GoogleFileState //per-user-session! => serialize access (perf: amortized fully buffered!)
{
public:
- GoogleFileState(GoogleAccessBuffer& accessBuf) : accessBuf_(accessBuf) //throw FileError
- {
- lastSyncToken_ = getChangesCurrentToken(accessBuf_.getAccessToken(), accessBuf_.getUserEmail()); //throw FileError
- rootId_ = getRootItemId (accessBuf_.getAccessToken(), accessBuf_.getUserEmail()); //throw FileError
- }
+ GoogleFileState(GoogleAccessBuffer& accessBuf) : //throw SysError
+ lastSyncToken_(getChangesCurrentToken(accessBuf.getAccessToken())), //
+ rootId_ (getRootItemId (accessBuf.getAccessToken())), //throw SysError
+ accessBuf_(accessBuf) {} //
GoogleFileState(MemoryStreamIn<ByteArray>& stream, GoogleAccessBuffer& accessBuf) : accessBuf_(accessBuf) //throw UnexpectedEndOfStreamError
{
@@ -1880,7 +1824,7 @@ public:
markSyncDue();
}
- void notifyMoveAndRename(const FileStateDelta& stateDelta, const std::string& itemId, const std::string& parentIdOld, const std::string& parentIdNew, const Zstring& newName)
+ void notifyMoveAndRename(const FileStateDelta& stateDelta, const std::string& itemId, const std::string& parentIdFrom, const std::string& parentIdTo, const Zstring& newName)
{
auto it = itemDetails_.find(itemId);
if (it != itemDetails_.end())
@@ -1888,8 +1832,8 @@ public:
GoogleItemDetails detailsNew = it->second;
detailsNew.itemName = utfTo<std::string>(newName);
- eraseIf(detailsNew.parentIds, [&](const std::string& id) { return id == parentIdOld || id == parentIdNew; }); //
- detailsNew.parentIds.push_back(parentIdNew); //not a duplicate
+ eraseIf(detailsNew.parentIds, [&](const std::string& id) { return id == parentIdFrom || id == parentIdTo; }); //
+ detailsNew.parentIds.push_back(parentIdTo); //not a duplicate
notifyItemUpdate(stateDelta, itemId, detailsNew);
}
@@ -1930,9 +1874,9 @@ private:
void markSyncDue() { lastSyncTime_ = std::chrono::steady_clock::now() - GOOGLE_DRIVE_SYNC_INTERVAL; }
- void syncWithGoogle() //throw FileError
+ void syncWithGoogle() //throw SysError
{
- const ChangesDelta delta = getChangesDelta(lastSyncToken_, accessBuf_.getAccessToken(), accessBuf_.getUserEmail()); //throw FileError
+ const ChangesDelta delta = getChangesDelta(lastSyncToken_, accessBuf_.getAccessToken()); //throw SysError
for (const ChangeItem& item : delta.changes)
updateItemState(item.itemId, item.details);
@@ -1954,11 +1898,7 @@ private:
childItems = &(itKnown->second.childItems);
else
{
- try
- {
- notifyFolderContent(registerFileStateDelta(), folderId, readFolderContent(folderId, accessBuf_.getAccessToken(), { accessBuf_.getUserEmail(), folderPath })); //throw FileError
- }
- catch (const FileError& e) { throw SysError(e.toString()); } //path-resolution errors should be further enriched by context info => SysError
+ notifyFolderContent(registerFileStateDelta(), folderId, readFolderContent(folderId, accessBuf_.getAccessToken())); //throw SysError
if (!folderContents_[folderId].isKnownFolder)
throw std::logic_error("Contract violation! " + std::string(__FILE__) + ":" + numberTo<std::string>(__LINE__));
@@ -2130,7 +2070,7 @@ public:
saveSession(dbFilePathTmp, *holder.session); //throw FileError
- moveAndRenameItem(dbFilePathTmp, dbFilePath, true /*replaceExisting*/); //throw FileError, ErrorDifferentVolume, (ErrorTargetExisting)
+ moveAndRenameItem(dbFilePathTmp, dbFilePath, true /*replaceExisting*/); //throw FileError, (ErrorMoveUnsupported), (ErrorTargetExisting)
}
catch (FileError&) { if (!firstError) firstError = std::current_exception(); }
});
@@ -2140,56 +2080,62 @@ public:
}
}
- Zstring addUserSession(const Zstring& googleLoginHint, const std::function<void()>& updateGui /*throw X*/) //throw FileError, X
+ Zstring addUserSession(const Zstring& googleLoginHint, const std::function<void()>& updateGui /*throw X*/) //throw SysError, X
{
- const GoogleAccessInfo accessInfo = authorizeAccessToGoogleDrive(googleLoginHint, updateGui); //throw FileError, X
+ const GoogleAccessInfo accessInfo = authorizeAccessToGoogleDrive(googleLoginHint, updateGui); //throw SysError, X
- accessUserSession(accessInfo.userInfo.email, [&](std::optional<UserSession>& userSession) //throw FileError
+ accessUserSession(accessInfo.userInfo.email, [&](std::optional<UserSession>& userSession) //throw SysError
{
if (userSession)
userSession->accessBuf.ref().update(accessInfo); //redundant?
else
{
auto accessBuf = makeSharedRef<GoogleAccessBuffer>(accessInfo);
- auto fileState = makeSharedRef<GoogleFileState >(accessBuf.ref()); //throw FileError
+ auto fileState = makeSharedRef<GoogleFileState >(accessBuf.ref()); //throw SysError
userSession = { accessBuf, fileState };
}
});
+
return accessInfo.userInfo.email;
}
- void removeUserSession(const Zstring& googleUserEmail) //throw FileError
+ void removeUserSession(const Zstring& googleUserEmail) //throw SysError
{
try
{
- accessUserSession(googleUserEmail, [&](std::optional<UserSession>& userSession) //throw FileError
+ accessUserSession(googleUserEmail, [&](std::optional<UserSession>& userSession) //throw SysError
{
if (userSession)
- revokeAccessToGoogleDrive(userSession->accessBuf.ref().getAccessToken(), googleUserEmail); //throw FileError
+ revokeAccessToGoogleDrive(userSession->accessBuf.ref().getAccessToken(), googleUserEmail); //throw SysError
});
}
- catch (FileError&) { assert(false); } //best effort: try to invalidate the access token
+ catch (SysError&) { assert(false); } //best effort: try to invalidate the access token
//=> expected to fail if offline => not worse than removing FFS via "Uninstall Programs"
- //start with deleting the DB file (1. maybe it's corrupted? 2. skip unnecessary lazy-load)
- const Zstring dbFilePath = getDbFilePath(googleUserEmail);
try
{
- removeFilePlain(dbFilePath); //throw FileError
- }
- catch (FileError&)
- {
- if (itemStillExists(dbFilePath)) //throw FileError
- throw;
+ //start with deleting the DB file (1. maybe it's corrupted? 2. skip unnecessary lazy-load)
+ const Zstring dbFilePath = getDbFilePath(googleUserEmail);
+ try
+ {
+ removeFilePlain(dbFilePath); //throw FileError
+ }
+ catch (FileError&)
+ {
+ if (itemStillExists(dbFilePath)) //throw FileError
+ throw;
+ }
}
+ catch (const FileError& e) { throw SysError(e.toString()); } //file access errors should be further enriched by context info => SysError
- accessUserSession(googleUserEmail, [&](std::optional<UserSession>& userSession) //throw FileError
+
+ accessUserSession(googleUserEmail, [&](std::optional<UserSession>& userSession) //throw SysError
{
userSession.reset();
});
}
- std::vector<Zstring> /*Google user email*/ listUserSessions() //throw FileError
+ std::vector<Zstring> /*Google user email*/ listUserSessions() //throw SysError
{
std::vector<Zstring> emails;
@@ -2215,8 +2161,12 @@ public:
[&](const SymlinkInfo& si) {},
[&](const std::wstring& errorMsg)
{
- if (itemStillExists(configDirPath_)) //throw FileError
- throw FileError(errorMsg);
+ try
+ {
+ if (itemStillExists(configDirPath_)) //throw FileError
+ throw FileError(errorMsg);
+ }
+ catch (const FileError& e) { throw SysError(e.toString()); } //file access errors should be further enriched by context info => SysError
});
removeDuplicates(emails, LessAsciiNoCase());
@@ -2229,22 +2179,21 @@ public:
GoogleFileState::FileStateDelta stateDelta;
};
//perf: amortized fully buffered!
- AsyncAccessInfo accessGlobalFileState(const Zstring& googleUserEmail, const std::function<void(GoogleFileState& fileState)>& useFileState /*throw X*/) //throw FileError, X
+ AsyncAccessInfo accessGlobalFileState(const Zstring& googleUserEmail, const std::function<void(GoogleFileState& fileState)>& useFileState /*throw X*/) //throw SysError, X
{
std::string accessToken;
GoogleFileState::FileStateDelta stateDelta;
- accessUserSession(googleUserEmail, [&](std::optional<UserSession>& userSession) //throw FileError
+ accessUserSession(googleUserEmail, [&](std::optional<UserSession>& userSession) //throw SysError
{
if (!userSession)
- throw FileError(replaceCpy(_("Unable to access %x."), L"%x", fmtPath(getGoogleDisplayPath({ googleUserEmail, AfsPath() }))),
- replaceCpy(_("Please authorize access to user account %x."), L"%x", fmtPath(googleUserEmail)));
+ throw SysError(replaceCpy(_("Please authorize access to user account %x."), L"%x", fmtPath(googleUserEmail)));
//manage last sync time here rather than in GoogleFileState, so that "lastSyncToken" remains stable while accessing GoogleFileState in the callback
if (userSession->fileState.ref().syncIsDue())
- userSession->fileState.ref().syncWithGoogle(); //throw FileError
+ userSession->fileState.ref().syncWithGoogle(); //throw SysError
- accessToken = userSession->accessBuf.ref().getAccessToken(); //throw FileError
+ accessToken = userSession->accessBuf.ref().getAccessToken(); //throw SysError
stateDelta = userSession->fileState.ref().registerFileStateDelta();
useFileState(userSession->fileState.ref()); //throw X
@@ -2266,26 +2215,30 @@ private:
return appendSeparator(configDirPath_) + googleUserEmail + Zstr(".db");
}
- void accessUserSession(const Zstring& googleUserEmail, const std::function<void(std::optional<UserSession>& userSession)>& useSession) //throw FileError
+ void accessUserSession(const Zstring& googleUserEmail, const std::function<void(std::optional<UserSession>& userSession)>& useSession) //throw SysError
{
Protected<SessionHolder>* protectedSession = nullptr; //pointers remain stable, thanks to std::map<>
globalSessions_.access([&](GlobalSessions& sessions) { protectedSession = &sessions[googleUserEmail]; });
- protectedSession->access([&](SessionHolder& holder)
+ try
{
- if (!holder.dbWasLoaded) //let's NOT load the DB files under the globalSessions_ lock, but the session-specific one!
- try
- {
- holder.session = loadSession(getDbFilePath(googleUserEmail)); //throw FileError
- }
- catch (FileError&)
- {
- if (itemStillExists(getDbFilePath(googleUserEmail))) //throw FileError
- throw;
- }
- holder.dbWasLoaded = true;
- useSession(holder.session);
- });
+ protectedSession->access([&](SessionHolder& holder)
+ {
+ if (!holder.dbWasLoaded) //let's NOT load the DB files under the globalSessions_ lock, but the session-specific one!
+ try
+ {
+ holder.session = loadSession(getDbFilePath(googleUserEmail)); //throw FileError
+ }
+ catch (FileError&)
+ {
+ if (itemStillExists(getDbFilePath(googleUserEmail))) //throw FileError
+ throw;
+ }
+ holder.dbWasLoaded = true;
+ useSession(holder.session);
+ });
+ }
+ catch (const FileError& e) { throw SysError(e.toString()); } //GooglePersistentSessions errors should be further enriched by context info => SysError
}
static void saveSession(const Zstring& dbFilePath, const UserSession& userSession) //throw FileError
@@ -2333,16 +2286,13 @@ private:
auto fileState = makeSharedRef<GoogleFileState >(streamIn, accessBuf.ref()); //throw UnexpectedEndOfStreamError
return { accessBuf, fileState };
}
- catch (UnexpectedEndOfStreamError&)
- {
- throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(dbFilePath)), L"Unexpected end of stream.");
- }
+ catch (UnexpectedEndOfStreamError&) { throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(dbFilePath)), L"Unexpected end of stream."); }
}
struct UserSession
{
- SharedRef<GoogleAccessBuffer> accessBuf;
- SharedRef<GoogleFileState> fileState;
+ SharedRef<GoogleAccessBuffer> accessBuf;
+ SharedRef<GoogleFileState> fileState;
};
struct SessionHolder
@@ -2359,15 +2309,12 @@ private:
Global<GooglePersistentSessions> globalGoogleSessions;
//==========================================================================================
-
-GooglePersistentSessions::AsyncAccessInfo accessGlobalFileState(const Zstring& googleUserEmail, const std::function<void(GoogleFileState& fileState)>& useFileState /*throw X*/) //throw FileError, X
+GooglePersistentSessions::AsyncAccessInfo accessGlobalFileState(const Zstring& googleUserEmail, const std::function<void(GoogleFileState& fileState)>& useFileState /*throw X*/) //throw SysError, X
{
- const std::shared_ptr<GooglePersistentSessions> gps = globalGoogleSessions.get();
- if (!gps)
- throw FileError(replaceCpy(_("Unable to access %x."), L"%x", fmtPath(getGoogleDisplayPath({ googleUserEmail, AfsPath() }))),
- L"Function call not allowed during process init/shutdown.");
+ if (const std::shared_ptr<GooglePersistentSessions> gps = globalGoogleSessions.get())
+ return gps->accessGlobalFileState(googleUserEmail, useFileState); //throw SysError, X
- return gps->accessGlobalFileState(googleUserEmail, useFileState); //throw FileError, X
+ throw SysError(L"accessGlobalFileState() function call not allowed during init/shutdown.");
}
//==========================================================================================
@@ -2388,7 +2335,7 @@ struct GetDirDetails
{
std::string folderId;
std::optional<std::vector<GoogleFileItem>> childItemsBuffered;
- const GooglePersistentSessions::AsyncAccessInfo aai = accessGlobalFileState(gdriveFolderPath_.userEmail, [&](GoogleFileState& fileState) //throw FileError
+ const GooglePersistentSessions::AsyncAccessInfo aai = accessGlobalFileState(gdriveFolderPath_.userEmail, [&](GoogleFileState& fileState) //throw SysError
{
folderId = fileState.getItemId(gdriveFolderPath_.itemPath); //throw SysError
childItemsBuffered = fileState.tryGetBufferedFolderContent(folderId);
@@ -2399,10 +2346,10 @@ struct GetDirDetails
childItems = std::move(*childItemsBuffered);
else
{
- childItems = readFolderContent(folderId, aai.accessToken, gdriveFolderPath_); //throw FileError
+ childItems = readFolderContent(folderId, aai.accessToken); //throw SysError
//buffer new file state ASAP => make sure accessGlobalFileState() has amortized constant access (despite the occasional internal readFolderContent() on non-leaf folders)
- accessGlobalFileState(gdriveFolderPath_.userEmail, [&](GoogleFileState& fileState) //throw FileError
+ accessGlobalFileState(gdriveFolderPath_.userEmail, [&](GoogleFileState& fileState) //throw SysError
{
fileState.notifyFolderContent(aai.stateDelta, folderId, childItems);
});
@@ -2425,7 +2372,7 @@ class SingleFolderTraverser
{
public:
SingleFolderTraverser(const Zstring& googleUserEmail, const std::vector<std::pair<AfsPath, std::shared_ptr<AFS::TraverserCallback>>>& workload /*throw X*/) :
- workload_(workload), googleUserEmail_(googleUserEmail)
+ workload_(workload), googleUserEmail_(googleUserEmail)
{
while (!workload_.empty())
{
@@ -2446,34 +2393,34 @@ private:
void traverseWithException(const AfsPath& folderPath, AFS::TraverserCallback& cb) //throw FileError, X
{
- const GetDirDetails::Result r = GetDirDetails({ googleUserEmail_, folderPath })(); //throw FileError
+ const GetDirDetails::Result r = GetDirDetails({ googleUserEmail_, folderPath })(); //throw FileError
- for (const GoogleFileItem& item : r.childItems)
- {
- const Zstring itemName = utfTo<Zstring>(item.details.itemName);
- if (item.details.isFolder)
+ for (const GoogleFileItem& item : r.childItems)
{
- const AfsPath afsItemPath(nativeAppendPaths(r.gdriveFolderPath.itemPath.value, itemName));
+ const Zstring itemName = utfTo<Zstring>(item.details.itemName);
+ if (item.details.isFolder)
+ {
+ const AfsPath afsItemPath(nativeAppendPaths(r.gdriveFolderPath.itemPath.value, itemName));
- if (std::shared_ptr<AFS::TraverserCallback> cbSub = cb.onFolder({ itemName, nullptr /*symlinkInfo*/ })) //throw X
- workload_.push_back({ afsItemPath, std::move(cbSub) });
- }
- else
- {
- AFS::FileId fileId = copyStringTo<AFS::FileId>(item.itemId);
- cb.onFile({ itemName, item.details.fileSize, item.details.modTime, fileId, nullptr /*symlinkInfo*/ }); //throw X
+ if (std::shared_ptr<AFS::TraverserCallback> cbSub = cb.onFolder({ itemName, nullptr /*symlinkInfo*/ })) //throw X
+ workload_.push_back({ afsItemPath, std::move(cbSub) });
+ }
+ else
+ {
+ AFS::FileId fileId = copyStringTo<AFS::FileId>(item.itemId);
+ cb.onFile({ itemName, item.details.fileSize, item.details.modTime, fileId, nullptr /*symlinkInfo*/ }); //throw X
+ }
}
}
- }
std::vector<std::pair<AfsPath, std::shared_ptr<AFS::TraverserCallback>>> workload_;
- const Zstring googleUserEmail_;
+ const Zstring googleUserEmail_;
};
void gdriveTraverseFolderRecursive(const Zstring& googleUserEmail, const std::vector<std::pair<AfsPath, std::shared_ptr<AFS::TraverserCallback>>>& workload /*throw X*/, size_t) //throw X
{
- SingleFolderTraverser dummy(googleUserEmail, workload); //throw X
+ SingleFolderTraverser dummy(googleUserEmail, workload); //throw X
}
//==========================================================================================
//==========================================================================================
@@ -2493,19 +2440,23 @@ struct InputStreamGdrive : public AbstractFileSystem::InputStream
std::string fileId;
try
{
- accessToken = accessGlobalFileState(gdrivePath.userEmail, [&](GoogleFileState& fileState) //throw FileError
+ accessToken = accessGlobalFileState(gdrivePath.userEmail, [&](GoogleFileState& fileState) //throw SysError
{
fileId = fileState.getItemId(gdrivePath.itemPath); //throw SysError
}).accessToken;
}
catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot open file %x."), L"%x", fmtPath(getGoogleDisplayPath(gdrivePath))), e.toString()); }
- auto writeBlock = [&](const void* buffer, size_t bytesToWrite)
+ try
{
- return asyncStreamOut->write(buffer, bytesToWrite); //throw ThreadInterruption
- };
+ auto writeBlock = [&](const void* buffer, size_t bytesToWrite)
+ {
+ return asyncStreamOut->write(buffer, bytesToWrite); //throw ThreadInterruption
+ };
- gdriveDownloadFile(fileId, writeBlock, accessToken, gdrivePath); //throw FileError, ThreadInterruption
+ gdriveDownloadFile(fileId, writeBlock, accessToken); //throw SysError, ThreadInterruption
+ }
+ catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(getGoogleDisplayPath(gdrivePath))), e.toString()); }
asyncStreamOut->closeStream();
}
@@ -2534,7 +2485,7 @@ struct InputStreamGdrive : public AbstractFileSystem::InputStream
AFS::StreamAttributes attr = {};
try
{
- accessGlobalFileState(gdrivePath_.userEmail, [&](GoogleFileState& fileState) //throw FileError
+ accessGlobalFileState(gdrivePath_.userEmail, [&](GoogleFileState& fileState) //throw SysError
{
std::pair<std::string /*itemId*/, GoogleItemDetails> gdriveAttr = fileState.getFileAttributes(gdrivePath_.itemPath); //throw SysError
attr.modTime = gdriveAttr.second.modTime;
@@ -2585,18 +2536,20 @@ struct OutputStreamGdrive : public AbstractFileSystem::OutputStreamImpl
{
try
{
+ const Zstring fileName = AFS::getItemName(gdrivePath.itemPath);
+
GoogleFileState::PathStatus ps;
- GooglePersistentSessions::AsyncAccessInfo aai = accessGlobalFileState(gdrivePath.userEmail, [&](GoogleFileState& fileState) //throw FileError
+ GooglePersistentSessions::AsyncAccessInfo aai = accessGlobalFileState(gdrivePath.userEmail, [&](GoogleFileState& fileState) //throw SysError
{
ps = fileState.getPathStatus(gdrivePath.itemPath); //throw SysError
});
if (ps.relPath.empty())
- throw SysError(formatSystemErrorRaw(EEXIST));
+ throw SysError(replaceCpy(_("The name %x is already used by another item."), L"%x", fmtPath(fileName)));
+
if (ps.relPath.size() > 1) //parent folder missing
throw SysError(replaceCpy(_("Cannot find %x."), L"%x",
fmtPath(getGoogleDisplayPath({ gdrivePath.userEmail, AfsPath(nativeAppendPaths(ps.existingPath.value, ps.relPath.front()))}))));
- const Zstring fileName = AFS::getItemName(gdrivePath.itemPath);
const std::string& parentFolderId = ps.existingItemId;
auto readBlock = [&](void* buffer, size_t bytesToRead)
@@ -2608,8 +2561,8 @@ struct OutputStreamGdrive : public AbstractFileSystem::OutputStreamImpl
//for whatever reason, gdriveUploadFile() is equally-fast or faster than gdriveUploadSmallFile(), despite its two roundtrips, even when the file sizes are 0!!
//=> issue likely on Google's side
const std::string fileIdNew = //streamSize && *streamSize < 5 * 1024 * 1024 ?
- //gdriveUploadSmallFile(fileName, parentFolderId, *streamSize, modTime, readBlock, aai.accessToken, gdrivePath) : //throw FileError, ThreadInterruption
- gdriveUploadFile (fileName, parentFolderId, modTime, readBlock, aai.accessToken, gdrivePath); //throw FileError, ThreadInterruption
+ //gdriveUploadSmallFile(fileName, parentFolderId, *streamSize, modTime, readBlock, aai.accessToken) : //throw SysError, ThreadInterruption
+ gdriveUploadFile (fileName, parentFolderId, modTime, readBlock, aai.accessToken); //throw SysError, ThreadInterruption
assert(asyncStreamIn->getTotalBytesRead() == asyncStreamIn->getTotalBytesWritten());
(void)streamSize;
@@ -2623,7 +2576,7 @@ struct OutputStreamGdrive : public AbstractFileSystem::OutputStreamImpl
newFileItem.details.modTime = *modTime;
newFileItem.details.parentIds.push_back(parentFolderId);
- accessGlobalFileState(gdrivePath.userEmail, [&](GoogleFileState& fileState) //throw FileError
+ accessGlobalFileState(gdrivePath.userEmail, [&](GoogleFileState& fileState) //throw SysError
{
fileState.notifyItemCreated(aai.stateDelta, newFileItem);
});
@@ -2718,7 +2671,7 @@ private:
try
{
GoogleFileState::PathStatus ps;
- accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw FileError
+ accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw SysError
{
ps = fileState.getPathStatus(afsPath); //throw SysError
});
@@ -2739,39 +2692,38 @@ private:
//avoid duplicate Google Drive item creation by multiple threads
PathAccessLock pal(getGdrivePath(afsPath)); //throw SysError
+ const Zstring folderName = getItemName(afsPath);
+
GoogleFileState::PathStatus ps;
- const GooglePersistentSessions::AsyncAccessInfo aai = accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw FileError
+ const GooglePersistentSessions::AsyncAccessInfo aai = accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw SysError
{
ps = fileState.getPathStatus(afsPath); //throw SysError
});
if (ps.relPath.empty())
- throw SysError(formatSystemErrorRaw(EEXIST));
+ throw SysError(replaceCpy(_("The name %x is already used by another item."), L"%x", fmtPath(folderName)));
+
if (ps.relPath.size() > 1) //parent folder missing
throw SysError(replaceCpy(_("Cannot find %x."), L"%x", fmtPath(getDisplayPath(AfsPath(nativeAppendPaths(ps.existingPath.value, ps.relPath.front()))))));
- const Zstring folderName = getItemName(afsPath);
const std::string& parentFolderId = ps.existingItemId;
- const std::string folderIdNew = gdriveCreateFolderPlain(folderName, parentFolderId, aai.accessToken); //throw FileError, SysError
+ const std::string folderIdNew = gdriveCreateFolderPlain(folderName, parentFolderId, aai.accessToken); //throw SysError
//buffer new file state ASAP (don't wait GOOGLE_DRIVE_SYNC_INTERVAL)
- accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw FileError
+ accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw SysError
{
fileState.notifyFolderCreated(aai.stateDelta, folderIdNew, folderName, parentFolderId);
});
}
- catch (const SysError& e)
- {
- throw FileError(replaceCpy(_("Cannot create directory %x."), L"%x", fmtPath(getDisplayPath(afsPath))), e.toString());
- }
+ catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot create directory %x."), L"%x", fmtPath(getDisplayPath(afsPath))), e.toString()); }
}
- void removeItemPlainImpl(const AfsPath& afsPath) const //throw FileError, SysError
+ void removeItemPlainImpl(const AfsPath& afsPath) const //throw SysError
{
std::string itemId;
std::optional<std::string> parentIdToUnlink;
- const GooglePersistentSessions::AsyncAccessInfo aai = accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw FileError
+ const GooglePersistentSessions::AsyncAccessInfo aai = accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw SysError
{
const std::optional<AfsPath> parentPath = getParentPath(afsPath);
if (!parentPath) throw SysError(L"Item is device root");
@@ -2787,20 +2739,20 @@ private:
if (parentIdToUnlink)
{
- gdriveUnlinkParent(itemId, *parentIdToUnlink, aai.accessToken); //throw FileError, SysError
+ gdriveUnlinkParent(itemId, *parentIdToUnlink, aai.accessToken); //throw SysError
//buffer new file state ASAP (don't wait GOOGLE_DRIVE_SYNC_INTERVAL)
- accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw FileError
+ accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw SysError
{
fileState.notifyParentRemoved(aai.stateDelta, itemId, *parentIdToUnlink);
});
}
else
{
- gdriveDeleteItem(itemId, aai.accessToken); //throw FileError, SysError
+ gdriveDeleteItem(itemId, aai.accessToken); //throw SysError
//buffer new file state ASAP (don't wait GOOGLE_DRIVE_SYNC_INTERVAL)
- accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw FileError
+ accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw SysError
{
fileState.notifyItemDeleted(aai.stateDelta, itemId);
});
@@ -2811,21 +2763,21 @@ private:
{
try
{
- removeItemPlainImpl(afsPath); //throw FileError, SysError
+ removeItemPlainImpl(afsPath); //throw SysError
}
catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot delete file %x."), L"%x", fmtPath(getDisplayPath(afsPath))), e.toString()); }
}
void removeSymlinkPlain(const AfsPath& afsPath) const override //throw FileError
{
- throw FileError(replaceCpy(_("Cannot delete symbolic link %x."), L"%x", fmtPath(getDisplayPath(afsPath))), L"Symlinks not supported for Google Drive.");
+ throw FileError(replaceCpy(_("Cannot delete symbolic link %x."), L"%x", fmtPath(getDisplayPath(afsPath))), _("Operation not supported by device."));
}
void removeFolderPlain(const AfsPath& afsPath) const override //throw FileError
{
try
{
- removeItemPlainImpl(afsPath); //throw FileError, SysError
+ removeItemPlainImpl(afsPath); //throw SysError
}
catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot delete directory %x."), L"%x", fmtPath(getDisplayPath(afsPath))), e.toString()); }
}
@@ -2851,12 +2803,12 @@ private:
//----------------------------------------------------------------------------------------------------------------
AbstractPath getSymlinkResolvedPath(const AfsPath& afsPath) const override //throw FileError
{
- throw FileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtPath(getDisplayPath(afsPath))), L"Symlinks not supported for Google Drive.");
+ throw FileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtPath(getDisplayPath(afsPath))), _("Operation not supported by device."));
}
std::string getSymlinkBinaryContent(const AfsPath& afsPath) const override //throw FileError
{
- throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtPath(getDisplayPath(afsPath))), L"Symlinks not supported for Google Drive.");
+ throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtPath(getDisplayPath(afsPath))), _("Operation not supported by device."));
}
//----------------------------------------------------------------------------------------------------------------
@@ -2892,8 +2844,7 @@ private:
{
//no native Google Drive file copy => use stream-based file copy:
if (copyFilePermissions)
- throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(AFS::getDisplayPath(apTarget))),
- L"Permissions not supported for Google Drive.");
+ throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(AFS::getDisplayPath(apTarget))), _("Operation not supported by device."));
//target existing: undefined behavior! (fail/overwrite/auto-rename)
return copyFileAsStream(afsPathSource, attrSource, apTarget, notifyUnbufferedIO); //throw FileError, (ErrorFileLocked), X
@@ -2904,8 +2855,7 @@ private:
void copyNewFolderForSameAfsType(const AfsPath& afsPathSource, const AbstractPath& apTarget, bool copyFilePermissions) const override //throw FileError
{
if (copyFilePermissions)
- throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(AFS::getDisplayPath(apTarget))),
- L"Permissions not supported for Google Drive.");
+ throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(AFS::getDisplayPath(apTarget))), _("Operation not supported by device."));
//already existing: fail/ignore
AFS::createFolderPlain(apTarget); //throw FileError
@@ -2915,72 +2865,72 @@ private:
{
throw FileError(replaceCpy(replaceCpy(_("Cannot copy symbolic link %x to %y."),
L"%x", L"\n" + fmtPath(getDisplayPath(afsPathSource))),
- L"%y", L"\n" + fmtPath(AFS::getDisplayPath(apTarget))),
- L"Symlinks not supported for Google Drive.");
+ L"%y", L"\n" + fmtPath(AFS::getDisplayPath(apTarget))), _("Operation not supported by device."));
}
//target existing: undefined behavior! (fail/overwrite/auto-rename)
//=> actual behavior: fails with "already existing
- void moveAndRenameItemForSameAfsType(const AfsPath& afsPathSource, const AbstractPath& apTarget) const override //throw FileError, ErrorDifferentVolume
+ void moveAndRenameItemForSameAfsType(const AfsPath& pathFrom, const AbstractPath& pathTo) const override //throw FileError, ErrorMoveUnsupported
{
auto generateErrorMsg = [&] { return replaceCpy(replaceCpy(_("Cannot move file %x to %y."),
- L"%x", L"\n" + fmtPath(getDisplayPath(afsPathSource))),
- L"%y", L"\n" + fmtPath(AFS::getDisplayPath(apTarget)));
+ L"%x", L"\n" + fmtPath(getDisplayPath(pathFrom))),
+ L"%y", L"\n" + fmtPath(AFS::getDisplayPath(pathTo)));
};
- if (compareDeviceSameAfsType(apTarget.afsDevice.ref()) != 0)
- throw ErrorDifferentVolume(generateErrorMsg(), L"Different Google Drive volume.");
+ if (compareDeviceSameAfsType(pathTo.afsDevice.ref()) != 0)
+ throw ErrorMoveUnsupported(generateErrorMsg(), _("Operation not supported between different devices."));
try
{
//avoid duplicate Google Drive item creation by multiple threads
- PathAccessLock pal(getGdrivePath(apTarget.afsPath)); //throw SysError
+ PathAccessLock pal(getGdrivePath(pathTo.afsPath)); //throw SysError
- const Zstring itemNameOld = getItemName(afsPathSource);
- const Zstring itemNameNew = AFS::getItemName(apTarget);
+ const Zstring itemNameOld = getItemName(pathFrom);
+ const Zstring itemNameNew = AFS::getItemName(pathTo);
- const std::optional<AfsPath> parentAfsPathSource = getParentPath(afsPathSource);
- const std::optional<AfsPath> parentAfsPathTarget = getParentPath(apTarget.afsPath);
- if (!parentAfsPathSource) throw SysError(L"Source is device root");
- if (!parentAfsPathTarget) throw SysError(L"Target is device root");
+ const std::optional<AfsPath> parentPathFrom = getParentPath(pathFrom);
+ const std::optional<AfsPath> parentPathTo = getParentPath(pathTo.afsPath);
+ if (!parentPathFrom) throw SysError(L"Source is device root");
+ if (!parentPathTo ) throw SysError(L"Target is device root");
- std::string itemIdSource;
- time_t modTimeSource = 0;
- std::string parentIdSource;
- std::string parentIdTarget;
- const GooglePersistentSessions::AsyncAccessInfo aai = accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw FileError
+ std::string itemIdFrom;
+ time_t modTimeFrom = 0;
+ std::string parentIdFrom;
+ std::string parentIdTo;
+ const GooglePersistentSessions::AsyncAccessInfo aai = accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw SysError
{
- std::pair<std::string /*itemId*/, GoogleItemDetails> gdriveAttr = fileState.getFileAttributes(afsPathSource); //throw SysError
- itemIdSource = gdriveAttr.first;
- modTimeSource = gdriveAttr.second.modTime;
- parentIdSource = fileState.getItemId(*parentAfsPathSource); //throw SysError
- GoogleFileState::PathStatus psTarget = fileState.getPathStatus(apTarget.afsPath); //throw SysError
+ std::pair<std::string /*itemId*/, GoogleItemDetails> gdriveAttr = fileState.getFileAttributes(pathFrom); //throw SysError
+ itemIdFrom = gdriveAttr.first;
+ modTimeFrom = gdriveAttr.second.modTime;
+ parentIdFrom = fileState.getItemId(*parentPathFrom); //throw SysError
+ GoogleFileState::PathStatus psTo = fileState.getPathStatus(pathTo.afsPath); //throw SysError
//e.g. changing file name case only => this is not an "already exists" situation!
//also: hardlink referenced by two different paths, the source one will be unlinked
- if (psTarget.relPath.empty() && psTarget.existingItemId == itemIdSource)
- parentIdTarget = fileState.getItemId(*parentAfsPathTarget); //throw SysError
+ if (psTo.relPath.empty() && psTo.existingItemId == itemIdFrom)
+ parentIdTo = fileState.getItemId(*parentPathTo); //throw SysError
else
{
- if (psTarget.relPath.empty())
- throw SysError(formatSystemErrorRaw(EEXIST));
- if (psTarget.relPath.size() > 1) //parent folder missing
+ if (psTo.relPath.empty())
+ throw SysError(replaceCpy(_("The name %x is already used by another item."), L"%x", fmtPath(itemNameNew)));
+
+ if (psTo.relPath.size() > 1) //parent folder missing
throw SysError(replaceCpy(_("Cannot find %x."), L"%x",
- fmtPath(getDisplayPath(AfsPath(nativeAppendPaths(psTarget.existingPath.value, psTarget.relPath.front()))))));
- parentIdTarget = psTarget.existingItemId;
+ fmtPath(getDisplayPath(AfsPath(nativeAppendPaths(psTo.existingPath.value, psTo.relPath.front()))))));
+ parentIdTo = psTo.existingItemId;
}
});
- if (parentIdSource == parentIdTarget && itemNameOld == itemNameNew)
+ if (parentIdFrom == parentIdTo && itemNameOld == itemNameNew)
return; //nothing to do
//target name already existing? will (happily) create duplicate items
- gdriveMoveAndRenameItem(itemIdSource, parentIdSource, parentIdTarget, itemNameNew, modTimeSource, aai.accessToken); //throw FileError, SysError
+ gdriveMoveAndRenameItem(itemIdFrom, parentIdFrom, parentIdTo, itemNameNew, modTimeFrom, aai.accessToken); //throw SysError
//buffer new file state ASAP (don't wait GOOGLE_DRIVE_SYNC_INTERVAL)
- accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw FileError
+ accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw SysError
{
- fileState.notifyMoveAndRename(aai.stateDelta, itemIdSource, parentIdSource, parentIdTarget, itemNameNew);
+ fileState.notifyMoveAndRename(aai.stateDelta, itemIdFrom, parentIdFrom, parentIdTo, itemNameNew);
});
}
catch (const SysError& e) { throw FileError(generateErrorMsg(), e.toString()); }
@@ -2999,12 +2949,12 @@ private:
{
const std::shared_ptr<GooglePersistentSessions> gps = globalGoogleSessions.get();
if (!gps)
- throw SysError(L"Function call not allowed during process init/shutdown.");
+ throw SysError(L"GdriveFileSystem::authenticateAccess() function call not allowed during init/shutdown.");
- for (const Zstring& email : gps->listUserSessions()) //throw FileError
+ for (const Zstring& email : gps->listUserSessions()) //throw SysError
if (equalAsciiNoCase(email, googleUserEmail_))
return;
- gps->addUserSession(googleUserEmail_ /*googleLoginHint*/, nullptr /*updateGui*/); //throw FileError
+ gps->addUserSession(googleUserEmail_ /*googleLoginHint*/, nullptr /*updateGui*/); //throw SysError
//error messages will be lost after time out in dir_exist_async.h! However:
//The most-likely-to-fail parts (web access) are reported by authorizeAccessToGoogleDrive() via the browser!
}
@@ -3020,8 +2970,8 @@ private:
{
try
{
- const std::string& accessToken = accessGlobalFileState(googleUserEmail_, [](GoogleFileState& fileState) {}).accessToken; //throw FileError
- return gdriveGetFreeDiskSpace(accessToken); //throw FileError, SysError; returns 0 if not available
+ const std::string& accessToken = accessGlobalFileState(googleUserEmail_, [](GoogleFileState& fileState) {}).accessToken; //throw SysError
+ return gdriveGetFreeDiskSpace(accessToken); //throw SysError; returns 0 if not available
}
catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot determine free disk space for %x."), L"%x", fmtPath(getDisplayPath(afsPath))), e.toString()); }
}
@@ -3043,16 +2993,16 @@ private:
try
{
GoogleFileState::PathStatus ps;
- const GooglePersistentSessions::AsyncAccessInfo aai = accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw FileError
+ const GooglePersistentSessions::AsyncAccessInfo aai = accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw SysError
{
ps = fileState.getPathStatus(afsPath); //throw SysError
});
if (ps.relPath.empty())
{
- gdriveMoveToTrash(ps.existingItemId, aai.accessToken); //throw FileError, SysError
+ gdriveMoveToTrash(ps.existingItemId, aai.accessToken); //throw SysError
//buffer new file state ASAP (don't wait GOOGLE_DRIVE_SYNC_INTERVAL)
- accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw FileError
+ accessGlobalFileState(googleUserEmail_, [&](GoogleFileState& fileState) //throw SysError
{
//a hardlink with multiple parents will be not be accessible anymore via any of its path aliases!
fileState.notifyItemDeleted(aai.stateDelta, ps.existingItemId);
@@ -3097,29 +3047,40 @@ void fff::googleDriveTeardown()
Zstring fff::googleAddUser(const std::function<void()>& updateGui /*throw X*/) //throw FileError, X
{
- if (const std::shared_ptr<GooglePersistentSessions> gps = globalGoogleSessions.get())
- return gps->addUserSession(Zstr("") /*googleLoginHint*/, updateGui); //throw FileError, X
+ try
+ {
+ if (const std::shared_ptr<GooglePersistentSessions> gps = globalGoogleSessions.get())
+ return gps->addUserSession(Zstr("") /*googleLoginHint*/, updateGui); //throw SysError, X
- throw FileError(replaceCpy(_("Unable to access %x."), L"%x", L"Google Drive"), L"Function call not allowed during process init/shutdown.");
+ throw SysError(L"googleAddUser() function call not allowed during init/shutdown.");
+ }
+ catch (const SysError& e) { throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", L"Google Drive"), e.toString()); }
}
void fff::googleRemoveUser(const Zstring& googleUserEmail) //throw FileError
{
- if (const std::shared_ptr<GooglePersistentSessions> gps = globalGoogleSessions.get())
- return gps->removeUserSession(googleUserEmail); //throw FileError
+ try
+ {
+ if (const std::shared_ptr<GooglePersistentSessions> gps = globalGoogleSessions.get())
+ return gps->removeUserSession(googleUserEmail); //throw SysError
- throw FileError(replaceCpy(_("Unable to access %x."), L"%x", fmtPath(getGoogleDisplayPath({ googleUserEmail, AfsPath() }))),
- L"Function call not allowed during process init/shutdown.");
+ throw SysError(L"googleRemoveUser() function call not allowed during init/shutdown.");
+ }
+ catch (const SysError& e) { throw FileError(replaceCpy(_("Unable to disconnect from %x."), L"%x", fmtPath(getGoogleDisplayPath({ googleUserEmail, AfsPath() }))), e.toString()); }
}
std::vector<Zstring> /*Google user email*/ fff::googleListConnectedUsers() //throw FileError
{
- if (const std::shared_ptr<GooglePersistentSessions> gps = globalGoogleSessions.get())
- return gps->listUserSessions(); //throw FileError
+ try
+ {
+ if (const std::shared_ptr<GooglePersistentSessions> gps = globalGoogleSessions.get())
+ return gps->listUserSessions(); //throw SysError
- throw FileError(replaceCpy(_("Unable to access %x."), L"%x", L"Google Drive"), L"Function call not allowed during process init/shutdown.");
+ throw SysError(L"googleListConnectedUsers() function call not allowed during init/shutdown.");
+ }
+ catch (const SysError& e) { throw FileError(replaceCpy(_("Unable to access %x."), L"%x", L"Google Drive"), e.toString()); }
}
diff --git a/FreeFileSync/Source/fs/init_curl_libssh2.cpp b/FreeFileSync/Source/fs/init_curl_libssh2.cpp
index 4f4dfbbe..8839fc39 100644
--- a/FreeFileSync/Source/fs/init_curl_libssh2.cpp
+++ b/FreeFileSync/Source/fs/init_curl_libssh2.cpp
@@ -63,7 +63,7 @@ public:
assert(sessionCount_ >= 0);
if (!newSessionsAllowed_)
- throw SysError(L"Function call not allowed during process shutdown.");
+ throw SysError(L"UniSessionCounter::inc() function call not allowed during init/shutdown.");
++sessionCount_;
}
@@ -138,8 +138,8 @@ std::shared_ptr<UniCounterCookie> zen::getLibsshCurlUnifiedInitCookie(Global<Uni
{
std::shared_ptr<UniSessionCounter> sessionCounter = globalSftpSessionCount.get();
if (!sessionCounter)
- throw SysError(L"Function call not allowed during process startup/shutdown."); //=> ~UniCounterCookie() *not* called!
- sessionCounter->pimpl->inc(); //throw SysError //
+ throw SysError(L"getLibsshCurlUnifiedInitCookie() function call not allowed during init/shutdown."); //=> ~UniCounterCookie() *not* called!
+ sessionCounter->pimpl->inc(); //throw SysError //
//pass "ownership" of having to call UniSessionCounter::dec()
return std::make_shared<UniCounterCookie>(sessionCounter); //throw SysError
diff --git a/FreeFileSync/Source/fs/libssh2/init_libssh2.cpp b/FreeFileSync/Source/fs/libssh2/init_libssh2.cpp
index b793357d..974e4f06 100644
--- a/FreeFileSync/Source/fs/libssh2/init_libssh2.cpp
+++ b/FreeFileSync/Source/fs/libssh2/init_libssh2.cpp
@@ -18,14 +18,22 @@
#error OpenSSL version too old
#endif
+#if defined LIBSSH2_WIN32 && !defined HAVE_EVP_AES_128_CTR
+ #error OpenSSL already supports EVP_aes_128_ctr(), etc. => no need for the libssh2 fallbacks!
+#endif
+
void zen::libssh2Init()
{
const int rc = ::libssh2_init(0);
- //we need libssh2's crypto init:
- // - initializes a few statically allocated constants => avoid (minor) race condition if these were initialized by worker threads
- // - enable proper clean up of these variables in libssh2_exit() (otherwise: memory leaks!)
- // - there are a few other OpenSSL-related initializations which might be needed (and hopefully won't hurt...)
+ /*
+ we need libssh2's crypto init:
+ - there is other OpenSSL-related initialization which might be needed (and hopefully won't hurt...)
+
+ 2019-02-26: following reasons are obsolete due to HAVE_EVP_AES_128_CTR:
+ // - initializes a few statically allocated constants => avoid (minor) race condition if these were initialized by worker threads
+ // - enable proper clean up of these variables in libssh2_exit() (otherwise: memory leaks!)
+ */
assert(rc == 0); //libssh2 unconditionally returns 0 => why then have a return value in first place???
(void)rc;
}
diff --git a/FreeFileSync/Source/fs/native.cpp b/FreeFileSync/Source/fs/native.cpp
index 47dd3ff3..f6a13574 100644
--- a/FreeFileSync/Source/fs/native.cpp
+++ b/FreeFileSync/Source/fs/native.cpp
@@ -50,6 +50,27 @@ AFS::FileId convertToAbstractFileId(const zen::FileId& fid)
}
+struct NativeFileInfo
+{
+ time_t modTime;
+ uint64_t fileSize;
+ FileId fileId; //optional
+};
+NativeFileInfo getFileAttributes(FileBase::FileHandle fh) //throw SysError
+{
+ struct ::stat fileAttr = {};
+ if (::fstat(fh, &fileAttr) != 0)
+ THROW_LAST_SYS_ERROR(L"fstat");
+
+ return
+ {
+ fileAttr.st_mtime,
+ makeUnsigned(fileAttr.st_size),
+ generateFileId(fileAttr)
+ };
+}
+
+
struct FsItemRaw
{
Zstring itemName;
@@ -269,45 +290,32 @@ private:
//===========================================================================================================================
- typedef struct ::stat FileAttribs; //GCC 5.2 fails when "::" is used in "using FileAttribs = struct ::stat"
-
-
-inline
-FileAttribs getFileAttributes(FileBase::FileHandle fh, const Zstring& filePath) //throw FileError
-{
- struct ::stat fileAttr = {};
- if (::fstat(fh, &fileAttr) != 0)
- THROW_LAST_FILE_ERROR(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(filePath)), L"fstat");
- return fileAttr;
-}
-
-
struct InputStreamNative : public AbstractFileSystem::InputStream
{
InputStreamNative(const Zstring& filePath, const IOCallback& notifyUnbufferedIO /*throw X*/) : fi_(filePath, notifyUnbufferedIO) {} //throw FileError, ErrorFileLocked
size_t read(void* buffer, size_t bytesToRead) override { return fi_.read(buffer, bytesToRead); } //throw FileError, ErrorFileLocked, X; return "bytesToRead" bytes unless end of stream!
size_t getBlockSize() const override { return fi_.getBlockSize(); } //non-zero block size is AFS contract!
- std::optional<AFS::StreamAttributes> getAttributesBuffered() override; //throw FileError
+ std::optional<AFS::StreamAttributes> getAttributesBuffered() override //throw FileError
+ {
+ try
+ {
+ const NativeFileInfo fileInfo = getFileAttributes(fi_.getHandle()); //throw SysError
+ return
+ AFS::StreamAttributes(
+ {
+ fileInfo.modTime,
+ fileInfo.fileSize,
+ convertToAbstractFileId(fileInfo.fileId)
+ });
+ }
+ catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(fi_.getFilePath())), e.toString()); }
+ }
private:
FileInput fi_;
};
-
-std::optional<AFS::StreamAttributes> InputStreamNative::getAttributesBuffered() //throw FileError
-{
- const FileAttribs fileAttr = getFileAttributes(fi_.getHandle(), fi_.getFilePath()); //throw FileError
-
- const time_t modTime = fileAttr.st_mtime;
-
- const uint64_t fileSize = makeUnsigned(fileAttr.st_size);
-
- const AFS::FileId fileId = convertToAbstractFileId(generateFileId(fileAttr));
-
- return AFS::StreamAttributes({ modTime, fileSize, fileId });
-}
-
//===========================================================================================================================
struct OutputStreamNative : public AbstractFileSystem::OutputStreamImpl
@@ -328,7 +336,11 @@ struct OutputStreamNative : public AbstractFileSystem::OutputStreamImpl
AFS::FinalizeResult finalize() override //throw FileError, X
{
AFS::FinalizeResult result;
- result.fileId = convertToAbstractFileId(generateFileId(getFileAttributes(fo_.getHandle(), fo_.getFilePath()))); //throw FileError
+ try
+ {
+ result.fileId = convertToAbstractFileId(getFileAttributes(fo_.getHandle()).fileId); //throw SysError
+ }
+ catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(fo_.getFilePath())), e.toString()); }
fo_.finalize(); //throw FileError, X
@@ -539,19 +551,18 @@ private:
}
//target existing: undefined behavior! (fail/overwrite/auto-rename) => Native will fail and give a clear error message
- void moveAndRenameItemForSameAfsType(const AfsPath& afsPathSource, const AbstractPath& apTarget) const override //throw FileError, ErrorDifferentVolume
+ void moveAndRenameItemForSameAfsType(const AfsPath& pathFrom, const AbstractPath& pathTo) const override //throw FileError, ErrorMoveUnsupported
{
//perf test: detecting different volumes by path is ~30 times faster than having ::MoveFileEx() fail with ERROR_NOT_SAME_DEVICE (6µs vs 190µs)
//=> maybe we can even save some actual I/O in some cases?
- if (compareDeviceSameAfsType(apTarget.afsDevice.ref()) != 0)
- throw ErrorDifferentVolume(replaceCpy(replaceCpy(_("Cannot move file %x to %y."),
- L"%x", L"\n" + fmtPath(getDisplayPath(afsPathSource))),
- L"%y", L"\n" + fmtPath(AFS::getDisplayPath(apTarget))),
- formatSystemError(L"compareDeviceRoot", EXDEV)
- );
+ if (compareDeviceSameAfsType(pathTo.afsDevice.ref()) != 0)
+ throw ErrorMoveUnsupported(replaceCpy(replaceCpy(_("Cannot move file %x to %y."),
+ L"%x", L"\n" + fmtPath(getDisplayPath(pathFrom))),
+ L"%y", L"\n" + fmtPath(AFS::getDisplayPath(pathTo))),
+ _("Operation not supported between different devices."));
initComForThread(); //throw FileError
- const Zstring nativePathTarget = static_cast<const NativeFileSystem&>(apTarget.afsDevice.ref()).getNativePath(apTarget.afsPath);
- zen::moveAndRenameItem(getNativePath(afsPathSource), nativePathTarget, false /*replaceExisting*/); //throw FileError, ErrorTargetExisting, ErrorDifferentVolume
+ const Zstring nativePathTarget = static_cast<const NativeFileSystem&>(pathTo.afsDevice.ref()).getNativePath(pathTo.afsPath);
+ zen::moveAndRenameItem(getNativePath(pathFrom), nativePathTarget, false /*replaceExisting*/); //throw FileError, ErrorTargetExisting, ErrorMoveUnsupported
}
bool supportsPermissions(const AfsPath& afsPath) const override //throw FileError
@@ -669,6 +680,6 @@ AbstractPath fff::createItemPathNativeNoFormatting(const Zstring& nativePath) //
{
if (const std::optional<PathComponents> comp = parsePathComponents(nativePath))
return AbstractPath(makeSharedRef<NativeFileSystem>(comp->rootPath), AfsPath(comp->relPath));
- else //broken path syntax
+ else //broken path syntax
return AbstractPath(makeSharedRef<NativeFileSystem>(nativePath), AfsPath());
}
diff --git a/FreeFileSync/Source/fs/sftp.cpp b/FreeFileSync/Source/fs/sftp.cpp
index ec12b1dd..f0a56e10 100644
--- a/FreeFileSync/Source/fs/sftp.cpp
+++ b/FreeFileSync/Source/fs/sftp.cpp
@@ -293,50 +293,46 @@ std::wstring formatLastSshError(const std::wstring& functionName, LIBSSH2_SESSIO
//===========================================================================================================================
-class FatalSshError //=> consider SshSession corrupted and stop use ASAP! same conceptual level like FileError
+class FatalSshError //=> consider SshSession corrupted and stop use ASAP! same conceptual level like SysError
{
public:
- FatalSshError(const std::wstring& msg, const std::wstring& details) : msg_(msg + L"\n\n" + details) {}
- const std::wstring& toString() const { return msg_; }
+ FatalSshError(const std::wstring& details) : details_(details) {}
+ const std::wstring& toString() const { return details_; }
private:
- std::wstring msg_;
+ std::wstring details_;
};
Global<UniSessionCounter> globalSftpSessionCount(createUniSessionCounter());
-class SshSession //throw FileError
+class SshSession //throw SysError
{
public:
- SshSession(const SshSessionId& sessionId, int timeoutSec) : sessionId_(sessionId) //throw FileError
+ SshSession(const SshSessionId& sessionId, int timeoutSec) : //throw SysError
+ sessionId_(sessionId),
+ libsshCurlUnifiedInitCookie_(getLibsshCurlUnifiedInitCookie(globalSftpSessionCount)) //throw SysError
{
ZEN_ON_SCOPE_FAIL(cleanup()); //destructor call would lead to member double clean-up!!!
- try
- {
- libsshCurlUnifiedInitCookie_ = getLibsshCurlUnifiedInitCookie(globalSftpSessionCount); //throw SysError
- Zstring serviceName = Zstr("ssh"); //SFTP default port: 22, see %WINDIR%\system32\drivers\etc\services
- if (sessionId_.port > 0)
- serviceName = numberTo<Zstring>(sessionId_.port);
+ Zstring serviceName = Zstr("ssh"); //SFTP default port: 22, see %WINDIR%\system32\drivers\etc\services
+ if (sessionId_.port > 0)
+ serviceName = numberTo<Zstring>(sessionId_.port);
- socket_ = std::make_unique<Socket>(sessionId_.server, serviceName); //throw SysError
- }
- catch (const SysError& e) { throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)), e.toString()); }
+ socket_ = std::make_unique<Socket>(sessionId_.server, serviceName); //throw SysError
sshSession_ = ::libssh2_session_init();
if (!sshSession_) //does not set ssh last error; source: only memory allocation may fail
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)),
- formatSystemError(L"libssh2_session_init", formatSshErrorRaw(LIBSSH2_ERROR_ALLOC), std::wstring()));
+ throw SysError(formatSystemError(L"libssh2_session_init", formatSshErrorRaw(LIBSSH2_ERROR_ALLOC), std::wstring()));
/*
=> libssh2 using zlib crashes for Bitvise Servers: https://freefilesync.org/forum/viewtopic.php?t=2825
=> Don't enable zlib compression: libssh2 also recommends this option disabled: http://comments.gmane.org/gmane.network.ssh.libssh2.devel/6203
const int rc = ::libssh2_session_flag(sshSession_, LIBSSH2_FLAG_COMPRESS, 1); //does not set ssh last error
if (rc != 0)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)), formatSystemError(L"libssh2_session_flag", formatSshErrorRaw(rc), std::wstring()));
+ throw SysError(formatSystemError(L"libssh2_session_flag", formatSshErrorRaw(rc), std::wstring()));
=> build libssh2 without LIBSSH2_HAVE_ZLIB
*/
@@ -347,9 +343,8 @@ public:
-
if (::libssh2_session_handshake(sshSession_, socket_->get()) != 0)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)), formatLastSshError(L"libssh2_session_handshake", sshSession_, nullptr));
+ throw SysError(formatLastSshError(L"libssh2_session_handshake", sshSession_, nullptr));
//evaluate fingerprint = libssh2_hostkey_hash(sshSession_, LIBSSH2_HOSTKEY_HASH_SHA1) ???
@@ -360,7 +355,7 @@ public:
if (!authList)
{
if (::libssh2_userauth_authenticated(sshSession_) == 0)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)), formatLastSshError(L"libssh2_userauth_list", sshSession_, nullptr));
+ throw SysError(formatLastSshError(L"libssh2_userauth_list", sshSession_, nullptr));
//else: SSH_USERAUTH_NONE has authenticated successfully => we're already done
}
else
@@ -386,7 +381,7 @@ public:
if (supportAuthPassword)
{
if (::libssh2_userauth_password(sshSession_, usernameUtf8.c_str(), passwordUtf8.c_str()) != 0)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)), formatLastSshError(L"libssh2_userauth_password", sshSession_, nullptr));
+ throw SysError(formatLastSshError(L"libssh2_userauth_password", sshSession_, nullptr));
}
else if (supportAuthInteractive) //some servers, e.g. web.sourceforge.net, support "keyboard-interactive", but not "password"
{
@@ -420,36 +415,33 @@ public:
};
if (*::libssh2_session_abstract(sshSession_))
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)), L"libssh2_session_abstract: non-null value");
+ throw SysError(L"libssh2_session_abstract: non-null value");
*reinterpret_cast<AuthCbType**>(::libssh2_session_abstract(sshSession_)) = &authCallback;
ZEN_ON_SCOPE_EXIT(*::libssh2_session_abstract(sshSession_) = nullptr);
if (::libssh2_userauth_keyboard_interactive(sshSession_, usernameUtf8.c_str(), authCallbackWrapper) != 0)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)),
- formatLastSshError(L"libssh2_userauth_keyboard_interactive", sshSession_, nullptr) +
- (unexpectedPrompts.empty() ? L"" : L"\nUnexpected prompts: " + unexpectedPrompts));
+ throw SysError(formatLastSshError(L"libssh2_userauth_keyboard_interactive", sshSession_, nullptr) +
+ (unexpectedPrompts.empty() ? L"" : L"\nUnexpected prompts: " + unexpectedPrompts));
}
else
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)),
- replaceCpy(_("The server does not support authentication via %x."), L"%x", L"\"username/password\"") +
- L"\n" +_("Required:") + L" " + utfTo<std::wstring>(authList));
+ throw SysError(replaceCpy(_("The server does not support authentication via %x."), L"%x", L"\"username/password\"") +
+ L"\n" +_("Required:") + L" " + utfTo<std::wstring>(authList));
}
break;
case SftpAuthType::KEY_FILE:
{
if (!supportAuthKeyfile)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)),
- replaceCpy(_("The server does not support authentication via %x."), L"%x", L"\"key file\"") +
- L"\n" +_("Required:") + L" " + utfTo<std::wstring>(authList));
+ throw SysError(replaceCpy(_("The server does not support authentication via %x."), L"%x", L"\"key file\"") +
+ L"\n" +_("Required:") + L" " + utfTo<std::wstring>(authList));
std::string pkStream;
try
{
pkStream = loadBinContainer<std::string>(sessionId_.privateKeyFilePath, nullptr /*notifyUnbufferedIO*/); //throw FileError
}
- catch (const FileError& e) { throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)), e.toString()); }
+ catch (const FileError& e) { throw SysError(e.toString()); } //errors should be further enriched by context info => SysError
if (::libssh2_userauth_publickey_frommemory(sshSession_, //LIBSSH2_SESSION *session,
usernameUtf8.c_str(), //const char *username,
@@ -459,7 +451,7 @@ public:
pkStream.c_str(), //const char *privatekeydata,
pkStream.size(), //size_t privatekeydata_len,
passwordUtf8.c_str()) != 0) //const char *passphrase
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)), formatLastSshError(L"libssh2_userauth_publickey_frommemory", sshSession_, nullptr));
+ throw SysError(formatLastSshError(L"libssh2_userauth_publickey_frommemory", sshSession_, nullptr));
}
break;
@@ -467,15 +459,15 @@ public:
{
LIBSSH2_AGENT* sshAgent = ::libssh2_agent_init(sshSession_);
if (!sshAgent)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)), formatLastSshError(L"libssh2_agent_init", sshSession_, nullptr));
+ throw SysError(formatLastSshError(L"libssh2_agent_init", sshSession_, nullptr));
ZEN_ON_SCOPE_EXIT(::libssh2_agent_free(sshAgent));
if (::libssh2_agent_connect(sshAgent) != 0)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)), formatLastSshError(L"libssh2_agent_connect", sshSession_, nullptr));
+ throw SysError(formatLastSshError(L"libssh2_agent_connect", sshSession_, nullptr));
ZEN_ON_SCOPE_EXIT(::libssh2_agent_disconnect(sshAgent));
if (::libssh2_agent_list_identities(sshAgent) != 0)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)), formatLastSshError(L"libssh2_agent_list_identities", sshSession_, nullptr));
+ throw SysError(formatLastSshError(L"libssh2_agent_list_identities", sshSession_, nullptr));
for (libssh2_agent_publickey* prev = nullptr;;)
{
@@ -484,9 +476,9 @@ public:
if (rc == 0) //public key returned
;
else if (rc == 1) //no more public keys
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)), L"SSH agent contains no matching public key.");
+ throw SysError(L"SSH agent contains no matching public key.");
else
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sessionId_.server)), formatLastSshError(L"libssh2_agent_get_identity", sshSession_, nullptr));
+ throw SysError(formatLastSshError(L"libssh2_agent_get_identity", sshSession_, nullptr));
if (::libssh2_agent_userauth(sshAgent, usernameUtf8.c_str(), identity) == 0)
break; //authentication successful
@@ -578,8 +570,7 @@ public:
{
if (numeric::dist(std::chrono::steady_clock::now(), nbInfo.commandStartTime) > std::chrono::seconds(timeoutSec))
//consider SSH session corrupted! => isHealthy() will see pending command
- throw FatalSshError(replaceCpy(_("Unable to access %x."), L"%x", fmtPath(sessionId_.server)),
- formatSystemError(functionName, formatSshErrorRaw(LIBSSH2_ERROR_TIMEOUT),
+ throw FatalSshError(formatSystemError(functionName, formatSshErrorRaw(LIBSSH2_ERROR_TIMEOUT),
_P("Operation timed out after 1 second.", "Operation timed out after %x seconds.", timeoutSec)));
return false;
}
@@ -601,8 +592,7 @@ public:
if (sshSessions.empty()) return;
if (sshSessions.size() > FD_SETSIZE) //precise: this limit is for both fd_set containers *each*!
- throw FatalSshError(replaceCpy(_("Unable to access %x."), L"%x", fmtPath(sshSessions[0]->sessionId_.server)),
- _P("Cannot wait on more than 1 connection at a time.", "Cannot wait on more than %x connections at a time.", FD_SETSIZE) + L" " +
+ throw FatalSshError(_P("Cannot wait on more than 1 connection at a time.", "Cannot wait on more than %x connections at a time.", FD_SETSIZE) + L" " +
replaceCpy(_("Active connections: %x"), L"%x", numberTo<std::wstring>(sshSessions.size())));
SocketType nfds = 0;
fd_set rfd = {};
@@ -666,21 +656,20 @@ public:
{
//consider SSH sessions corrupted! => isHealthy() will see pending commands
ErrorCode ec = getLastError(); //copy before directly/indirectly making other system calls!
- throw FatalSshError(replaceCpy(_("Unable to access %x."), L"%x", fmtPath(sshSessions[0]->sessionId_.server)), formatSystemError(L"select", ec));
+ throw FatalSshError(formatSystemError(L"select", ec));
}
}
- static void addSftpChannel(const std::vector<SshSession*>& sshSessions, int timeoutSec) //throw FileError, FatalSshError
+ static void addSftpChannel(const std::vector<SshSession*>& sshSessions, int timeoutSec) //throw SysError, FatalSshError
{
- auto getErrorMsg = [](SshSession& sshSession) //when hitting the server's SFTP channel limit, inform user about channel number
+ auto addChannelDetails = [](const std::wstring& msg, SshSession& sshSession) //when hitting the server's SFTP channel limit, inform user about channel number
{
- std::wstring errorMsg = replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(sshSession.sessionId_.server));
- if (!sshSession.sftpChannels_.empty())
- errorMsg += L" " + replaceCpy(_("Failed to open SFTP channel number %x."), L"%x", numberTo<std::wstring>(sshSession.sftpChannels_.size() + 1));
- return errorMsg;
+ if (sshSession.sftpChannels_.empty())
+ return msg;
+ return msg + L" " + replaceCpy(_("Failed to open SFTP channel number %x."), L"%x", numberTo<std::wstring>(sshSession.sftpChannels_.size() + 1));
};
- std::optional<FileError> firstFileError;
+ std::optional<SysError> firstSysError;
std::optional<FatalSshError> firstFatalError;
std::vector<SshSession*> pendingSessions = sshSessions;
@@ -708,23 +697,23 @@ public:
}
catch (const SysError& e)
{
- if (!firstFileError) //don't throw yet and corrupt other valid, but pending SshSessions! We also don't want to leak LIBSSH2_SFTP* waiting in libssh2 code
- firstFileError = FileError(getErrorMsg(*pendingSessions[pos]), e.toString());
+ if (!firstSysError) //don't throw yet and corrupt other valid, but pending SshSessions! We also don't want to leak LIBSSH2_SFTP* waiting in libssh2 code
+ firstSysError = SysError(addChannelDetails(e.toString(), *pendingSessions[pos]));
pendingSessions.erase(pendingSessions.begin() + pos);
}
catch (const FatalSshError& e)
{
if (!firstFatalError)
- firstFatalError = e;
+ firstFatalError = FatalSshError(addChannelDetails(e.toString(), *pendingSessions[pos]));
pendingSessions.erase(pendingSessions.begin() + pos);
}
if (pendingSessions.empty())
{
- if (firstFatalError) //throw FatalSshError *before* FileError (later can be retried)
+ if (firstFatalError) //throw FatalSshError *before* SysError (later can be retried)
throw* firstFatalError;
- if (firstFileError)
- throw* firstFileError;
+ if (firstSysError)
+ throw* firstSysError;
return;
}
@@ -808,14 +797,14 @@ public:
class SshSessionShared
{
public:
- SshSessionShared(std::unique_ptr<SshSession, ReUseOnDelete>&& idleSession, int timeoutSec) : session_(std::move(idleSession)), //bound!
- timeoutSec_(timeoutSec) { /*assert(session_->isHealthy());*/ }
+ SshSessionShared(std::unique_ptr<SshSession, ReUseOnDelete>&& idleSession, int timeoutSec) :
+ session_(std::move(idleSession)) /*bound!*/, timeoutSec_(timeoutSec) { /*assert(session_->isHealthy());*/ }
//we need two-step initialization: 1. constructor is FAST and noexcept 2. init() is SLOW and throws
- void init() //throw FileError, FatalSshError
+ void init() //throw SysError, FatalSshError
{
if (session_->getSftpChannelCount() == 0) //make sure the SSH session contains at least one SFTP channel
- SshSession::addSftpChannel({ session_.get() }, timeoutSec_); //throw FileError, FatalSshError
+ SshSession::addSftpChannel({ session_.get() }, timeoutSec_); //throw SysError, FatalSshError
}
//bool isHealthy() const { return session_->isHealthy(); }
@@ -842,8 +831,8 @@ public:
class SshSessionExclusive
{
public:
- SshSessionExclusive(std::unique_ptr<SshSession, ReUseOnDelete>&& idleSession, int timeoutSec) : session_(std::move(idleSession)), //bound!
- timeoutSec_(timeoutSec) { /*assert(session_->isHealthy());*/ }
+ SshSessionExclusive(std::unique_ptr<SshSession, ReUseOnDelete>&& idleSession, int timeoutSec) :
+ session_(std::move(idleSession)) /*bound!*/, timeoutSec_(timeoutSec) { /*assert(session_->isHealthy());*/ }
bool tryNonBlocking(size_t channelNo, std::chrono::steady_clock::time_point commandStartTime, const std::wstring& functionName, //throw SysError, FatalSshError
const std::function<int(const SshSession::Details& sd)>& sftpCommand /*noexcept!*/)
@@ -869,7 +858,7 @@ public:
size_t getSftpChannelCount() const { return session_->getSftpChannelCount(); }
void markAsCorrupted() { session_->markAsCorrupted(); }
- static void addSftpChannel(const std::vector<SshSessionExclusive*>& exSessions) //throw FileError, FatalSshError
+ static void addSftpChannel(const std::vector<SshSessionExclusive*>& exSessions) //throw SysError, FatalSshError
{
std::vector<SshSession*> sshSessions;
for (SshSessionExclusive* exSession : exSessions)
@@ -879,7 +868,7 @@ public:
for (SshSessionExclusive* exSession : exSessions)
timeoutSec = std::max(timeoutSec, exSession->timeoutSec_);
- SshSession::addSftpChannel(sshSessions, timeoutSec); //throw FileError, FatalSshError
+ SshSession::addSftpChannel(sshSessions, timeoutSec); //throw SysError, FatalSshError
}
static void waitForTraffic(const std::vector<SshSessionExclusive*>& exSessions) //throw FatalSshError
@@ -903,7 +892,7 @@ public:
};
- std::shared_ptr<SshSessionShared> getSharedSession(const SftpLoginInfo& login) //throw FileError
+ std::shared_ptr<SshSessionShared> getSharedSession(const SftpLoginInfo& login) //throw SysError
{
Protected<IdleSshSessions>& sessionStore = getSessionStore(login);
@@ -931,7 +920,7 @@ public:
//create new SFTP session outside the lock: 1. don't block other threads 2. non-atomic regarding "sessionStore"! => one session too many is not a problem!
if (!sharedSession)
{
- sharedSession = std::make_shared<SshSessionShared>(std::unique_ptr<SshSession, ReUseOnDelete>(new SshSession(login, login.timeoutSec)), login.timeoutSec); //throw FileError
+ sharedSession = std::make_shared<SshSessionShared>(std::unique_ptr<SshSession, ReUseOnDelete>(new SshSession(login, login.timeoutSec)), login.timeoutSec); //throw SysError
sessionStore.access([&](IdleSshSessions& sessions)
{
sessions.sshSessionsWithThreadAffinity[threadId] = sharedSession;
@@ -941,15 +930,15 @@ public:
//finish two-step initialization outside the lock: SLOW!
try
{
- sharedSession->init(); //throw FileError, FatalSshError
+ sharedSession->init(); //throw SysError, FatalSshError
}
- catch (const FatalSshError& e) { throw FileError(e.toString()); } //session corrupted => is not returned => no special handling required => FileError is sufficient
+ catch (const FatalSshError& e) { throw SysError(e.toString()); } //session corrupted => is not returned => no special handling required
return sharedSession;
}
- std::unique_ptr<SshSessionExclusive> getExclusiveSession(const SftpLoginInfo& login) //throw FileError
+ std::unique_ptr<SshSessionExclusive> getExclusiveSession(const SftpLoginInfo& login) //throw SysError
{
Protected<IdleSshSessions>& sessionStore = getSessionStore(login);
@@ -967,9 +956,9 @@ public:
//create new SFTP session outside the lock: 1. don't block other threads 2. non-atomic regarding "sessionStore"! => one session too many is not a problem!
if (!sshSession)
- sshSession.reset(new SshSession(login, login.timeoutSec)); //throw FileError
+ sshSession.reset(new SshSession(login, login.timeoutSec)); //throw SysError
- return std::make_unique<SshSessionExclusive>(std::move(sshSession), login.timeoutSec); //throw FileError
+ return std::make_unique<SshSessionExclusive>(std::move(sshSession), login.timeoutSec);
}
private:
@@ -1067,34 +1056,34 @@ void SftpSessionManager::ReUseOnDelete::operator()(SshSession* s) const
}
-std::shared_ptr<SftpSessionManager::SshSessionShared> getSharedSftpSession(const SftpLoginInfo& login) //throw FileError
+std::shared_ptr<SftpSessionManager::SshSessionShared> getSharedSftpSession(const SftpLoginInfo& login) //throw SysError
{
if (const std::shared_ptr<SftpSessionManager> mgr = globalSftpSessionManager.get())
- return mgr->getSharedSession(login); //throw FileError
+ return mgr->getSharedSession(login); //throw SysError
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(login.server)), L"Function call not allowed during process shutdown.");
+ throw SysError(L"getSharedSftpSession() function call not allowed during init/shutdown.");
}
-std::unique_ptr<SftpSessionManager::SshSessionExclusive> getExclusiveSftpSession(const SftpLoginInfo& login) //throw FileError
+std::unique_ptr<SftpSessionManager::SshSessionExclusive> getExclusiveSftpSession(const SftpLoginInfo& login) //throw SysError
{
if (const std::shared_ptr<SftpSessionManager> mgr = globalSftpSessionManager.get())
- return mgr->getExclusiveSession(login); //throw FileError
+ return mgr->getExclusiveSession(login); //throw SysError
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(login.server)), L"Function call not allowed during process shutdown.");
+ throw SysError(L"getExclusiveSftpSession() function call not allowed during init/shutdown.");
}
void runSftpCommand(const SftpLoginInfo& login, const std::wstring& functionName,
- const std::function<int(const SshSession::Details& sd)>& sftpCommand /*noexcept!*/) //throw SysError, FileError
+ const std::function<int(const SshSession::Details& sd)>& sftpCommand /*noexcept!*/) //throw SysError
{
- std::shared_ptr<SftpSessionManager::SshSessionShared> asyncSession = getSharedSftpSession(login); //throw FileError
+ std::shared_ptr<SftpSessionManager::SshSessionShared> asyncSession = getSharedSftpSession(login); //throw SysError
//no need to protect against concurrency: shared session is (temporarily) bound to current thread
try
{
asyncSession->executeBlocking(functionName, sftpCommand); //throw SysError, FatalSshError
}
- catch (const FatalSshError& e) { throw FileError(e.toString()); } //SSH session corrupted! => we stop using session => map to FileError is okay
+ catch (const FatalSshError& e) { throw SysError(e.toString()); } //SSH session corrupted! => we stop using session => map to SysError is okay
}
//===========================================================================================================================
@@ -1115,7 +1104,7 @@ std::vector<SftpItem> getDirContentFlat(const SftpLoginInfo& login, const AfsPat
LIBSSH2_SFTP_HANDLE* dirHandle = nullptr;
try
{
- runSftpCommand(login, L"libssh2_sftp_opendir", //throw SysError, FileError
+ runSftpCommand(login, L"libssh2_sftp_opendir", //throw SysError
[&](const SshSession::Details& sd) //noexcept!
{
dirHandle = ::libssh2_sftp_opendir(sd.sftpChannel, getLibssh2Path(dirPath).c_str());
@@ -1128,11 +1117,10 @@ std::vector<SftpItem> getDirContentFlat(const SftpLoginInfo& login, const AfsPat
ZEN_ON_SCOPE_EXIT(try
{
- runSftpCommand(login, L"libssh2_sftp_closedir", //throw SysError, FileError
+ runSftpCommand(login, L"libssh2_sftp_closedir", //throw SysError
[&](const SshSession::Details& sd) { return ::libssh2_sftp_closedir(dirHandle); }); //noexcept!
}
- catch (SysError&) {}
- catch (FileError&) {});
+ catch (SysError&) {});
std::vector<char> buffer(10000); //libssh2 sample code uses 512
std::vector<SftpItem> output;
@@ -1142,7 +1130,7 @@ std::vector<SftpItem> getDirContentFlat(const SftpLoginInfo& login, const AfsPat
int rc = 0;
try
{
- runSftpCommand(login, L"libssh2_sftp_readdir", //throw SysError, FileError
+ runSftpCommand(login, L"libssh2_sftp_readdir", //throw SysError
[&](const SshSession::Details& sd) { return rc = ::libssh2_sftp_readdir(dirHandle, &buffer[0], buffer.size(), &attribs); }); //noexcept!
}
catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtPath(getSftpDisplayPath(login.server, dirPath))), e.toString()); }
@@ -1186,7 +1174,7 @@ SftpItemDetails getSymlinkTargetDetails(const SftpLoginInfo& login, const AfsPat
LIBSSH2_SFTP_ATTRIBUTES attribsTrg = {};
try
{
- runSftpCommand(login, L"libssh2_sftp_stat", //throw SysError, FileError
+ runSftpCommand(login, L"libssh2_sftp_stat", //throw SysError
[&](const SshSession::Details& sd) { return ::libssh2_sftp_stat(sd.sftpChannel, getLibssh2Path(linkPath).c_str(), &attribsTrg); }); //noexcept!
}
catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtPath(getSftpDisplayPath(login.server, linkPath))), e.toString()); }
@@ -1295,12 +1283,13 @@ void traverseFolderRecursiveSftp(const SftpLoginInfo& login, const std::vector<s
struct InputStreamSftp : public AbstractFileSystem::InputStream
{
InputStreamSftp(const SftpLoginInfo& login, const AfsPath& filePath, const IOCallback& notifyUnbufferedIO /*throw X*/) : //throw FileError
- session_(getSharedSftpSession(login)), //throw FileError
displayPath_(getSftpDisplayPath(login.server, filePath)),
notifyUnbufferedIO_(notifyUnbufferedIO)
{
try
{
+ session_ = getSharedSftpSession(login); //throw SysError
+
session_->executeBlocking(L"libssh2_sftp_open", //throw SysError, FatalSshError
[&](const SshSession::Details& sd) //noexcept!
{
@@ -1311,7 +1300,7 @@ struct InputStreamSftp : public AbstractFileSystem::InputStream
});
}
catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot open file %x."), L"%x", fmtPath(displayPath_)), e.toString()); }
- catch (const FatalSshError& e) { throw FileError(e.toString()); } //SSH session corrupted! => stop using session => map to FileError is okay
+ catch (const FatalSshError& e) { throw FileError(replaceCpy(_("Cannot open file %x."), L"%x", fmtPath(displayPath_)), e.toString()); } //SSH session corrupted! => stop using session
}
~InputStreamSftp()
@@ -1380,20 +1369,20 @@ private:
bytesRead = ::libssh2_sftp_read(fileHandle_, static_cast<char*>(buffer), bytesToRead);
return static_cast<int>(bytesRead);
});
+
+ if (static_cast<size_t>(bytesRead) > bytesToRead) //better safe than sorry
+ throw SysError(L"libssh2_sftp_read: buffer overflow."); //user should never see this
}
catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(displayPath_)), e.toString()); }
- catch (const FatalSshError& e) { throw FileError(e.toString()); } //SSH session corrupted! => caller (will/should) stop using session => map to FileError is okay
-
- if (static_cast<size_t>(bytesRead) > bytesToRead) //better safe than sorry
- throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(displayPath_)), L"libssh2_sftp_read: buffer overflow."); //user should never see this
+ catch (const FatalSshError& e) { throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(displayPath_)), e.toString()); } //SSH session corrupted! => caller (will/should) stop using session
return bytesRead; //"zero indicates end of file"
}
- std::shared_ptr<SftpSessionManager::SshSessionShared> session_;
const std::wstring displayPath_;
LIBSSH2_SFTP_HANDLE* fileHandle_ = nullptr;
const IOCallback notifyUnbufferedIO_; //throw X
+ std::shared_ptr<SftpSessionManager::SshSessionShared> session_;
std::vector<std::byte> memBuf_ = std::vector<std::byte>(getBlockSize());
size_t bufPos_ = 0; //buffered I/O; see file_io.cpp
@@ -1411,12 +1400,13 @@ struct OutputStreamSftp : public AbstractFileSystem::OutputStreamImpl
const IOCallback& notifyUnbufferedIO /*throw X*/) :
filePath_(filePath),
displayPath_(getSftpDisplayPath(login.server, filePath)),
- session_(getSharedSftpSession(login)), //throw FileError
modTime_(modTime),
notifyUnbufferedIO_(notifyUnbufferedIO)
{
try
{
+ session_ = getSharedSftpSession(login); //throw SysError
+
session_->executeBlocking(L"libssh2_sftp_open", //throw SysError, FatalSshError
[&](const SshSession::Details& sd) //noexcept!
{
@@ -1431,7 +1421,7 @@ struct OutputStreamSftp : public AbstractFileSystem::OutputStreamImpl
});
}
catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(displayPath_)), e.toString()); }
- catch (const FatalSshError& e) { throw FileError(e.toString()); } //SSH session corrupted! => stop using session => map to FileError is okay
+ catch (const FatalSshError& e) { throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(displayPath_)), e.toString()); } //SSH session corrupted! => stop using session
//NOTE: fileHandle_ still unowned until end of constructor!!!
@@ -1504,7 +1494,7 @@ struct OutputStreamSftp : public AbstractFileSystem::OutputStreamImpl
/* is setting modtime after closing the file handle a pessimization?
SFTP: no, needed for functional correctness (synology server), just as for Native */
}
- catch (const FileError& e) { result.errorModTime = FileError(e.toString()); /*avoid slicing*/ }
+ catch (const FileError& e) { result.errorModTime = e; /*slicing?*/ }
return result;
}
@@ -1514,17 +1504,17 @@ private:
void close() //throw FileError
{
- if (!fileHandle_)
- throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(displayPath_)), L"Contract error: close() called more than once.");
- ZEN_ON_SCOPE_EXIT(fileHandle_ = nullptr);
-
try
{
+ if (!fileHandle_)
+ throw SysError(L"Contract error: close() called more than once.");
+ ZEN_ON_SCOPE_EXIT(fileHandle_ = nullptr);
+
session_->executeBlocking(L"libssh2_sftp_close", //throw SysError, FatalSshError
[&](const SshSession::Details& sd) { return ::libssh2_sftp_close(fileHandle_); }); //noexcept!
}
catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(displayPath_)), e.toString()); }
- catch (const FatalSshError& e) { throw FileError(e.toString()); } //SSH session corrupted! => caller (will/should) stop using session => map to FileError is okay
+ catch (const FatalSshError& e) { throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(displayPath_)), e.toString()); } //SSH session corrupted! => caller (will/should) stop using session
}
size_t tryWrite(const void* buffer, size_t bytesToWrite) //throw FileError; may return short! CONTRACT: bytesToWrite > 0
@@ -1542,12 +1532,12 @@ private:
bytesWritten = ::libssh2_sftp_write(fileHandle_, static_cast<const char*>(buffer), bytesToWrite);
return static_cast<int>(bytesWritten);
});
+
+ if (bytesWritten > static_cast<ssize_t>(bytesToWrite)) //better safe than sorry
+ throw SysError(L"libssh2_sftp_write: buffer overflow.");
}
catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(displayPath_)), e.toString()); }
- catch (const FatalSshError& e) { throw FileError(e.toString()); } //SSH session corrupted! => caller (will/should) stop using session => map to FileError is okay
-
- if (bytesWritten > static_cast<ssize_t>(bytesToWrite)) //better safe than sorry
- throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(displayPath_)), L"libssh2_sftp_write: buffer overflow.");
+ catch (const FatalSshError& e) { throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(displayPath_)), e.toString()); } //SSH session corrupted! => caller (will/should) stop using session
//bytesWritten == 0 is no error according to doc!
return bytesWritten;
@@ -1560,7 +1550,7 @@ private:
{
LIBSSH2_SFTP_ATTRIBUTES attribNew = {};
attribNew.flags = LIBSSH2_SFTP_ATTR_ACMODTIME;
- attribNew.mtime = static_cast<decltype(attribNew.mtime)>(*modTime_); //32-bit target! loss of data!
+ attribNew.mtime = static_cast<decltype(attribNew.mtime)>(*modTime_); //32-bit target! loss of data!
attribNew.atime = static_cast<decltype(attribNew.atime)>(::time(nullptr)); //
try
@@ -1569,16 +1559,16 @@ private:
[&](const SshSession::Details& sd) { return ::libssh2_sftp_setstat(sd.sftpChannel, getLibssh2Path(filePath_).c_str(), &attribNew); }); //noexcept!
}
catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtPath(displayPath_)), e.toString()); }
- catch (const FatalSshError& e) { throw FileError(e.toString()); } //SSH session corrupted! => caller (will/should) stop using session => map to FileError is okay
+ catch (const FatalSshError& e) { throw FileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtPath(displayPath_)), e.toString()); } //SSH session corrupted! => caller (will/should) stop using session
}
}
const AfsPath filePath_;
const std::wstring displayPath_;
- std::shared_ptr<SftpSessionManager::SshSessionShared> session_;
LIBSSH2_SFTP_HANDLE* fileHandle_ = nullptr;
const std::optional<time_t> modTime_;
const IOCallback notifyUnbufferedIO_; //throw X
+ std::shared_ptr<SftpSessionManager::SshSessionShared> session_;
std::vector<std::byte> memBuf_ = std::vector<std::byte>(getBlockSize());
size_t bufPos_ = 0; //buffered I/O see file_io.cpp
@@ -1597,7 +1587,7 @@ public:
try
{
//we never ever change the SFTP working directory, right? ...right?
- return getServerRealPath("."); //throw SysError, FileError
+ return getServerRealPath("."); //throw SysError
}
catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtPath(getDisplayPath(AfsPath(Zstr("."))))), e.toString()); }
}
@@ -1632,11 +1622,11 @@ private:
try
{
LIBSSH2_SFTP_ATTRIBUTES attr = {};
- runSftpCommand(login_, L"libssh2_sftp_lstat", //throw SysError, FileError
+ runSftpCommand(login_, L"libssh2_sftp_lstat", //throw SysError
[&](const SshSession::Details& sd) { return ::libssh2_sftp_lstat(sd.sftpChannel, getLibssh2Path(afsPath).c_str(), &attr); }); //noexcept!
if ((attr.flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) == 0)
- throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(getDisplayPath(afsPath))), L"File attributes not available.");
+ throw SysError(L"File attributes not available.");
if (LIBSSH2_SFTP_S_ISLNK(attr.permissions))
return ItemType::SYMLINK;
@@ -1663,13 +1653,15 @@ private:
{
try
{
- runSftpCommand(login_, L"libssh2_sftp_mkdir", //throw SysError, FileError
+ //fails if folder is already existing:
+ runSftpCommand(login_, L"libssh2_sftp_mkdir", //throw SysError
[&](const SshSession::Details& sd) //noexcept!
{
- //- 0777, default for newly created directories
- //- use LIBSSH2_SFTP_DEFAULT_MODE? bugz! https://github.com/libssh2/libssh2/pull/284
- //- fails if folder is already existing
+#if 1 //let's see how LIBSSH2_SFTP_DEFAULT_MODE works out:
+ return ::libssh2_sftp_mkdir(sd.sftpChannel, getLibssh2Path(afsPath).c_str(), LIBSSH2_SFTP_DEFAULT_MODE);
+#else //default for newly created directories: 0777
return ::libssh2_sftp_mkdir(sd.sftpChannel, getLibssh2Path(afsPath).c_str(), LIBSSH2_SFTP_S_IRWXU | LIBSSH2_SFTP_S_IRWXG | LIBSSH2_SFTP_S_IRWXO);
+#endif
});
}
catch (const SysError& e) //libssh2_sftp_mkdir reports generic LIBSSH2_FX_FAILURE if existing
@@ -1682,7 +1674,7 @@ private:
{
try
{
- runSftpCommand(login_, L"libssh2_sftp_unlink", //throw SysError, FileError
+ runSftpCommand(login_, L"libssh2_sftp_unlink", //throw SysError
[&](const SshSession::Details& sd) { return ::libssh2_sftp_unlink(sd.sftpChannel, getLibssh2Path(afsPath).c_str()); }); //noexcept!
}
catch (const SysError& e)
@@ -1698,19 +1690,23 @@ private:
void removeFolderPlain(const AfsPath& afsPath) const override //throw FileError
{
+ int delResult = LIBSSH2_ERROR_NONE;
try
{
- runSftpCommand(login_, L"libssh2_sftp_rmdir", //throw SysError, FileError
- [&](const SshSession::Details& sd) { return ::libssh2_sftp_rmdir(sd.sftpChannel, getLibssh2Path(afsPath).c_str()); }); //noexcept!
+ runSftpCommand(login_, L"libssh2_sftp_rmdir", //throw SysError
+ [&](const SshSession::Details& sd) { return delResult = ::libssh2_sftp_rmdir(sd.sftpChannel, getLibssh2Path(afsPath).c_str()); }); //noexcept!
}
catch (const SysError& e)
{
- //tested: libssh2_sftp_rmdir will fail for symlinks!
- bool symlinkExists = false;
- try { symlinkExists = getItemType(afsPath) == ItemType::SYMLINK; } /*throw FileError*/ catch (FileError&) {} //previous exception is more relevant
+ if (delResult < 0)
+ {
+ //tested: libssh2_sftp_rmdir will fail for symlinks!
+ bool symlinkExists = false;
+ try { symlinkExists = getItemType(afsPath) == ItemType::SYMLINK; } /*throw FileError*/ catch (FileError&) {} //previous exception is more relevant
- if (symlinkExists)
- return removeSymlinkPlain(afsPath); //throw FileError
+ if (symlinkExists)
+ return removeSymlinkPlain(afsPath); //throw FileError
+ }
throw FileError(replaceCpy(_("Cannot delete directory %x."), L"%x", fmtPath(getDisplayPath(afsPath))), e.toString());
}
@@ -1725,13 +1721,15 @@ private:
}
//----------------------------------------------------------------------------------------------------------------
- AfsPath getServerRealPath(const std::string& sftpPath) const //throw SysError, FileError
+ AfsPath getServerRealPath(const std::string& sftpPath) const //throw SysError
{
- std::vector<char> buffer(10000);
- runSftpCommand(login_, L"libssh2_sftp_realpath", //throw SysError, FileError
- [&](const SshSession::Details& sd) { return ::libssh2_sftp_realpath(sd.sftpChannel, sftpPath.c_str(), &buffer[0], static_cast<unsigned int>(buffer.size())); }); //noexcept!
+ const unsigned int bufSize = 10000;
+ std::vector<char> buf(bufSize + 1); //ensure buffer is always null-terminated since we don't evaluate the byte count returned by libssh2_sftp_realpath()!
+
+ runSftpCommand(login_, L"libssh2_sftp_realpath", //throw SysError
+ [&](const SshSession::Details& sd) { return ::libssh2_sftp_realpath(sd.sftpChannel, sftpPath.c_str(), &buf[0], bufSize); }); //noexcept!
- const std::string sftpPathTrg = &buffer[0];
+ const std::string sftpPathTrg = &buf[0];
if (!startsWith(sftpPathTrg, '/'))
throw SysError(replaceCpy<std::wstring>(L"Invalid path %x.", L"%x", fmtPath(utfTo<std::wstring>(sftpPathTrg))));
@@ -1742,7 +1740,7 @@ private:
{
try
{
- const AfsPath afsPathTrg = getServerRealPath(getLibssh2Path(afsPath)); //throw SysError, FileError
+ const AfsPath afsPathTrg = getServerRealPath(getLibssh2Path(afsPath)); //throw SysError
return AbstractPath(makeSharedRef<SftpFileSystem>(login_), afsPathTrg);
}
catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtPath(getDisplayPath(afsPath))), e.toString()); }
@@ -1750,15 +1748,16 @@ private:
std::string getSymlinkBinaryContent(const AfsPath& afsPath) const override //throw FileError
{
- std::vector<char> buffer(10000);
+ const unsigned int bufSize = 10000;
+ std::vector<char> buf(bufSize + 1); //ensure buffer is always null-terminated since we don't evaluate the byte count returned by libssh2_sftp_readlink()!
try
{
- runSftpCommand(login_, L"libssh2_sftp_readlink", //throw SysError, FileError
- [&](const SshSession::Details& sd) { return ::libssh2_sftp_readlink(sd.sftpChannel, getLibssh2Path(afsPath).c_str(), &buffer[0], static_cast<unsigned int>(buffer.size())); }); //noexcept!
+ runSftpCommand(login_, L"libssh2_sftp_readlink", //throw SysError
+ [&](const SshSession::Details& sd) { return ::libssh2_sftp_readlink(sd.sftpChannel, getLibssh2Path(afsPath).c_str(), &buf[0], bufSize); }); //noexcept!
}
catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtPath(getDisplayPath(afsPath))), e.toString()); }
- return &buffer[0];
+ return &buf[0];
}
//----------------------------------------------------------------------------------------------------------------
@@ -1791,8 +1790,7 @@ private:
{
//no native SFTP file copy => use stream-based file copy:
if (copyFilePermissions)
- throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(AFS::getDisplayPath(apTarget))),
- L"Permissions not supported for SFTP devices.");
+ throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(AFS::getDisplayPath(apTarget))), _("Operation not supported by device."));
//target existing: undefined behavior! (fail/overwrite/auto-rename)
return copyFileAsStream(afsPathSource, attrSource, apTarget, notifyUnbufferedIO); //throw FileError, (ErrorFileLocked), X
@@ -1803,8 +1801,7 @@ private:
void copyNewFolderForSameAfsType(const AfsPath& afsPathSource, const AbstractPath& apTarget, bool copyFilePermissions) const override //throw FileError
{
if (copyFilePermissions)
- throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(AFS::getDisplayPath(apTarget))),
- L"Permissions not supported for SFTP devices.");
+ throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(AFS::getDisplayPath(apTarget))), _("Operation not supported by device."));
//already existing: fail/ignore
AFS::createFolderPlain(apTarget); //throw FileError
@@ -1814,24 +1811,23 @@ private:
{
throw FileError(replaceCpy(replaceCpy(_("Cannot copy symbolic link %x to %y."),
L"%x", L"\n" + fmtPath(getDisplayPath(afsPathSource))),
- L"%y", L"\n" + fmtPath(AFS::getDisplayPath(apTarget))),
- L"Setting symlink modtime not supported by libssh2.");
+ L"%y", L"\n" + fmtPath(AFS::getDisplayPath(apTarget))), _("Operation not supported by device."));
}
//target existing: undefined behavior! (fail/overwrite/auto-rename) => SFTP will fail with obscure LIBSSH2_FX_FAILURE error message
- void moveAndRenameItemForSameAfsType(const AfsPath& afsPathSource, const AbstractPath& apTarget) const override //throw FileError, ErrorDifferentVolume
+ void moveAndRenameItemForSameAfsType(const AfsPath& pathFrom, const AbstractPath& pathTo) const override //throw FileError, ErrorMoveUnsupported
{
auto generateErrorMsg = [&] { return replaceCpy(replaceCpy(_("Cannot move file %x to %y."),
- L"%x", L"\n" + fmtPath(getDisplayPath(afsPathSource))),
- L"%y", L"\n" + fmtPath(AFS::getDisplayPath(apTarget)));
+ L"%x", L"\n" + fmtPath(getDisplayPath(pathFrom))),
+ L"%y", L"\n" + fmtPath(AFS::getDisplayPath(pathTo)));
};
- if (compareDeviceSameAfsType(apTarget.afsDevice.ref()) != 0)
- throw ErrorDifferentVolume(generateErrorMsg(), L"Different SFTP volume.");
+ if (compareDeviceSameAfsType(pathTo.afsDevice.ref()) != 0)
+ throw ErrorMoveUnsupported(generateErrorMsg(), _("Operation not supported between different devices."));
try
{
- runSftpCommand(login_, L"libssh2_sftp_rename_ex", //throw SysError, FileError
+ runSftpCommand(login_, L"libssh2_sftp_rename_ex", //throw SysError
[&](const SshSession::Details& sd) //noexcept!
{
/*
@@ -1844,8 +1840,8 @@ private:
"... the most widespread SFTP server implementation, the OpenSSH, will fail the SSH_FXP_RENAME request if the target file already exists"
=> incidentally this is just the behavior we want!
*/
- const std::string sftpPathOld = getLibssh2Path(afsPathSource);
- const std::string sftpPathNew = getLibssh2Path(apTarget.afsPath);
+ const std::string sftpPathOld = getLibssh2Path(pathFrom);
+ const std::string sftpPathNew = getLibssh2Path(pathTo.afsPath);
return ::libssh2_sftp_rename_ex(sd.sftpChannel,
sftpPathOld.c_str(), static_cast<unsigned int>(sftpPathOld.size()),
@@ -1889,7 +1885,7 @@ private:
LIBSSH2_SFTP_STATVFS fsStats = {};
try
{
- runSftpCommand(login_, L"libssh2_sftp_statvfs", //throw SysError, FileError
+ runSftpCommand(login_, L"libssh2_sftp_statvfs", //throw SysError
[&](const SshSession::Details& sd) { return ::libssh2_sftp_statvfs(sd.sftpChannel, sftpPath.c_str(), sftpPath.size(), &fsStats); }); //noexcept!
}
catch (const SysError& e) { throw FileError(replaceCpy(_("Cannot determine free disk space for %x."), L"%x", fmtPath(getDisplayPath(L"/"))), e.toString()); }
@@ -1904,13 +1900,13 @@ private:
std::unique_ptr<RecycleSession> createRecyclerSession(const AfsPath& afsPath) const override //throw FileError, return value must be bound!
{
assert(false); //see supportsRecycleBin()
- throw FileError(L"Recycle Bin not supported for SFTP devices.");
+ throw FileError(L"Recycle bin not supported by device.");
}
void recycleItemIfExists(const AfsPath& afsPath) const override //throw FileError
{
assert(false); //see supportsRecycleBin()
- throw FileError(replaceCpy(_("Unable to move %x to the recycle bin."), L"%x", fmtPath(getDisplayPath(afsPath))), L"Recycle Bin not supported for SFTP devices.");
+ throw FileError(replaceCpy(_("Unable to move %x to the recycle bin."), L"%x", fmtPath(getDisplayPath(afsPath))), _("Operation not supported by device."));
}
const SftpLoginInfo login_;
@@ -1954,6 +1950,13 @@ Zstring concatenateSftpFolderPathPhrase(const SftpLoginInfo& login, const AfsPat
}
}
+
+AfsPath fff::getSftpHomePath(const SftpLoginInfo& login) //throw FileError
+{
+ return SftpFileSystem(login).getHomePath(); //throw FileError
+}
+
+
Zstring fff::condenseToSftpFolderPathPhrase(const SftpLoginInfo& login, const Zstring& relPath) //noexcept
{
SftpLoginInfo loginTmp = login;
@@ -1980,33 +1983,33 @@ Zstring fff::condenseToSftpFolderPathPhrase(const SftpLoginInfo& login, const Zs
int fff::getServerMaxChannelsPerConnection(const SftpLoginInfo& login) //throw FileError
{
- const auto startTime = std::chrono::steady_clock::now();
+ try
+ {
+ const auto startTime = std::chrono::steady_clock::now();
- std::unique_ptr<SftpSessionManager::SshSessionExclusive> exSession = getExclusiveSftpSession(login); //throw FileError
+ std::unique_ptr<SftpSessionManager::SshSessionExclusive> exSession = getExclusiveSftpSession(login); //throw SysError
- ZEN_ON_SCOPE_EXIT(exSession->markAsCorrupted()); //after hitting the server limits, the session might have gone bananas (= server fails on all requests)
+ ZEN_ON_SCOPE_EXIT(exSession->markAsCorrupted()); //after hitting the server limits, the session might have gone bananas (e.g. server fails on all requests)
- for (;;)
- {
- try
+ for (;;)
{
- SftpSessionManager::SshSessionExclusive::addSftpChannel({ exSession.get() }); //throw FileError, FatalSshError
+ try
+ {
+ SftpSessionManager::SshSessionExclusive::addSftpChannel({ exSession.get() }); //throw SysError, FatalSshError
+ }
+ catch (const SysError& ) { if (exSession->getSftpChannelCount() == 0) throw; return static_cast<int>(exSession->getSftpChannelCount()); }
+ catch (const FatalSshError& e) { if (exSession->getSftpChannelCount() == 0) throw SysError(e.toString()); return static_cast<int>(exSession->getSftpChannelCount()); }
+
+ if (numeric::dist(std::chrono::steady_clock::now(), startTime) > SFTP_CHANNEL_LIMIT_DETECTION_TIME_OUT)
+ throw SysError(_P("Operation timed out after 1 second.", "Operation timed out after %x seconds.",
+ std::chrono::seconds(SFTP_CHANNEL_LIMIT_DETECTION_TIME_OUT).count()) + L" " +
+ replaceCpy(_("Failed to open SFTP channel number %x."), L"%x", numberTo<std::wstring>(exSession->getSftpChannelCount() + 1)));
}
- catch (const FileError& ) { if (exSession->getSftpChannelCount() == 0) throw; return static_cast<int>(exSession->getSftpChannelCount()); }
- catch (const FatalSshError& e) { if (exSession->getSftpChannelCount() == 0) throw FileError(e.toString()); return static_cast<int>(exSession->getSftpChannelCount()); }
-
- if (numeric::dist(std::chrono::steady_clock::now(), startTime) > SFTP_CHANNEL_LIMIT_DETECTION_TIME_OUT)
- throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(login.server)) + L" " +
- replaceCpy(_("Failed to open SFTP channel number %x."), L"%x", numberTo<std::wstring>(exSession->getSftpChannelCount() + 1)),
- _P("Operation timed out after 1 second.", "Operation timed out after %x seconds.",
- std::chrono::seconds(SFTP_CHANNEL_LIMIT_DETECTION_TIME_OUT).count()));
}
-}
-
-
-AfsPath fff::getSftpHomePath(const SftpLoginInfo& login) //throw FileError
-{
- return SftpFileSystem(login).getHomePath(); //throw FileError
+ catch (const SysError& e)
+ {
+ throw FileError(replaceCpy(_("Unable to connect to %x."), L"%x", fmtPath(login.server)), e.toString());
+ }
}
diff --git a/FreeFileSync/Source/ui/app_icon.h b/FreeFileSync/Source/ui/app_icon.h
index 68fa910b..80e866a3 100644
--- a/FreeFileSync/Source/ui/app_icon.h
+++ b/FreeFileSync/Source/ui/app_icon.h
@@ -17,15 +17,15 @@ inline
wxIcon getFfsIcon()
{
using namespace zen;
- //wxWidgets' bitmap to icon conversion on OS X can only deal with very specific sizes => check on all platforms!
+ //wxWidgets' bitmap to icon conversion on macOS can only deal with very specific sizes => check on all platforms!
assert(getResourceImage(L"FreeFileSync").GetWidth () == getResourceImage(L"FreeFileSync").GetHeight() &&
- getResourceImage(L"FreeFileSync").GetWidth() % 128 == 0);
- wxIcon icon;
- icon.CopyFromBitmap(getResourceImage(L"FreeFileSync")); //use big logo bitmap for better quality
+ getResourceImage(L"FreeFileSync").GetWidth() == 128);
+ wxIcon icon; //Ubuntu-Linux does a bad job at down-scaling in Unity dash (blocky icons!) => prepare:
+ icon.CopyFromBitmap(getResourceImage(L"FreeFileSync").ConvertToImage().Scale(fastFromDIP(64), fastFromDIP(64), wxIMAGE_QUALITY_HIGH));
+ //no discernable difference bewteen wxIMAGE_QUALITY_HIGH/wxIMAGE_QUALITY_BILINEAR in this case
return icon;
}
}
-
#endif //APP_ICON_H_6748179634932174683214
diff --git a/FreeFileSync/Source/ui/file_grid.cpp b/FreeFileSync/Source/ui/file_grid.cpp
index 52250044..2ba97e1a 100644
--- a/FreeFileSync/Source/ui/file_grid.cpp
+++ b/FreeFileSync/Source/ui/file_grid.cpp
@@ -1351,7 +1351,10 @@ public:
Connect(EVENT_ALIGN_SCROLLBARS, wxEventHandler(GridEventManager::onAlignScrollBars), NULL, this);
}
- ~GridEventManager() { assert(!scrollbarUpdatePending_); }
+ ~GridEventManager()
+ {
+ //assert(!scrollbarUpdatePending_); => false-positives: e.g. start ffs, right-click on grid, close by clicking X
+ }
void setScrollMaster(const Grid& grid) { scrollMaster_ = &grid; }
@@ -1500,7 +1503,7 @@ private:
if (yOld != y)
target.Scroll(-1, y); //empirical test Windows/Ubuntu: this call does NOT trigger a wxEVT_SCROLLWIN event, which would incorrectly set "scrollMaster" to "&target"!
//CAVEAT: wxScrolledWindow::Scroll() internally calls wxWindow::Update(), leading to immediate WM_PAINT handling in the target grid!
- // an this while we're still in our WM_PAINT handler! => no recusion, fine (hopefully)
+ // an this while we're still in our WM_PAINT handler! => no recursion, fine (hopefully)
};
int y = 0;
lead->GetViewStart(nullptr, &y);
@@ -1522,8 +1525,8 @@ private:
void onAlignScrollBars(wxEvent& event)
{
- ZEN_ON_SCOPE_EXIT(scrollbarUpdatePending_ = false);
assert(scrollbarUpdatePending_);
+ ZEN_ON_SCOPE_EXIT(scrollbarUpdatePending_ = false);
auto needsHorizontalScrollbars = [](const Grid& grid) -> bool
{
diff --git a/FreeFileSync/Source/ui/file_grid.h b/FreeFileSync/Source/ui/file_grid.h
index 3ae06651..8bfc82d8 100644
--- a/FreeFileSync/Source/ui/file_grid.h
+++ b/FreeFileSync/Source/ui/file_grid.h
@@ -51,12 +51,12 @@ extern const wxEventType EVENT_GRID_SYNC_DIRECTION;
struct CheckRowsEvent : public wxCommandEvent
{
- CheckRowsEvent(size_t rowFirst, size_t rowLast, bool setIncluded) : wxCommandEvent(EVENT_GRID_CHECK_ROWS), rowFirst_(rowFirst), rowLast_(rowLast), setIncluded_(setIncluded) { assert(rowFirst <= rowLast); }
+ CheckRowsEvent(size_t rowFirst, size_t rowLast, bool setIncluded) : wxCommandEvent(EVENT_GRID_CHECK_ROWS), rowFirst_(rowFirst), rowLast_(rowLast), setActive_(setIncluded) { assert(rowFirst <= rowLast); }
wxEvent* Clone() const override { return new CheckRowsEvent(*this); }
const size_t rowFirst_; //selected range: [rowFirst_, rowLast_)
const size_t rowLast_; //range is empty when clearing selection
- const bool setIncluded_;
+ const bool setActive_;
};
diff --git a/FreeFileSync/Source/ui/gui_generated.cpp b/FreeFileSync/Source/ui/gui_generated.cpp
index 5e2cb523..ccc5db48 100644
--- a/FreeFileSync/Source/ui/gui_generated.cpp
+++ b/FreeFileSync/Source/ui/gui_generated.cpp
@@ -11,1184 +11,1184 @@
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( wxSize( 640,400 ), 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_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_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_menuItemSaveAsBatch = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("Save as &batch job...") ) , wxEmptyString, wxITEM_NORMAL );
- m_menuFile->Append( m_menuItemSaveAsBatch );
-
- m_menuFile->AppendSeparator();
-
- wxMenuItem* m_menuItem4;
- m_menuItem4 = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("E&xit") ) , wxEmptyString, wxITEM_NORMAL );
- m_menuFile->Append( m_menuItem4 );
-
- m_menubar->Append( m_menuFile, _("&File") );
-
- m_menu4 = new wxMenu();
- m_menuItemShowLog = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("Show &log") ) + wxT('\t') + wxT("F4"), wxEmptyString, wxITEM_NORMAL );
- m_menu4->Append( m_menuItemShowLog );
-
- m_menu4->AppendSeparator();
-
- m_menuItemCompare = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("Start &comparison") ) + wxT('\t') + wxT("F5"), wxEmptyString, wxITEM_NORMAL );
- m_menu4->Append( m_menuItemCompare );
-
- m_menu4->AppendSeparator();
-
- m_menuItemCompSettings = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("C&omparison settings") ) + wxT('\t') + wxT("F6"), wxEmptyString, wxITEM_NORMAL );
- m_menu4->Append( m_menuItemCompSettings );
-
- m_menuItemFilter = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("&Filter settings") ) + wxT('\t') + wxT("F7"), wxEmptyString, wxITEM_NORMAL );
- m_menu4->Append( m_menuItemFilter );
-
- m_menuItemSyncSettings = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("S&ynchronization settings") ) + wxT('\t') + wxT("F8"), wxEmptyString, wxITEM_NORMAL );
- m_menu4->Append( m_menuItemSyncSettings );
-
- m_menu4->AppendSeparator();
-
- m_menuItemSynchronize = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("Start &synchronization") ) + wxT('\t') + wxT("F9"), wxEmptyString, wxITEM_NORMAL );
- m_menu4->Append( m_menuItemSynchronize );
-
- m_menubar->Append( m_menu4, _("&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_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_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_menuTools->AppendSeparator();
-
- wxMenuItem* m_menuItem51;
- m_menuItem51 = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("&Reset layout") ) , wxEmptyString, wxITEM_NORMAL );
- m_menuTools->Append( m_menuItem51 );
-
- 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_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_menuItemShowOverview = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("dummy") ) , wxEmptyString, wxITEM_NORMAL );
- m_menuTools->Append( m_menuItemShowOverview );
-
- 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->AppendSeparator();
-
- 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_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_menubar->Append( m_menuHelp, _("&Help") );
-
- this->SetMenuBar( m_menubar );
-
- bSizerPanelHolder = new wxBoxSizer( wxVERTICAL );
-
- m_panelTopButtons = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer1791;
- bSizer1791 = new wxBoxSizer( wxVERTICAL );
-
- bSizerTopButtons = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer261;
- bSizer261 = new wxBoxSizer( wxHORIZONTAL );
-
-
- 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();
-
- bSizer261->Add( m_buttonCancel, 0, wxEXPAND, 5 );
-
- m_buttonCompare = new zen::BitmapTextButton( m_panelTopButtons, wxID_ANY, _("Compare"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonCompare->SetDefault();
- 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( 4, 0, 0, 0, 5 );
-
- m_bpButtonCmpConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonCmpConfig->SetToolTip( _("dummy") );
-
- bSizer261->Add( m_bpButtonCmpConfig, 0, wxEXPAND, 5 );
-
- m_bpButtonCmpContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonCmpContext->SetToolTip( _("dummy") );
-
- bSizer261->Add( m_bpButtonCmpContext, 0, wxEXPAND, 5 );
-
-
- bSizer261->Add( 0, 0, 1, 0, 5 );
-
-
- bSizerTopButtons->Add( bSizer261, 1, wxEXPAND, 5 );
-
-
- bSizerTopButtons->Add( 5, 2, 0, 0, 5 );
-
- wxBoxSizer* bSizer199;
- bSizer199 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer199->Add( 0, 0, 1, 0, 5 );
-
- m_bpButtonFilter = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE );
- m_bpButtonFilter->SetToolTip( _("dummy") );
-
- bSizer199->Add( m_bpButtonFilter, 0, wxEXPAND, 5 );
-
- m_bpButtonFilterContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonFilterContext->SetToolTip( _("dummy") );
-
- bSizer199->Add( m_bpButtonFilterContext, 0, wxEXPAND, 5 );
-
-
- bSizer199->Add( 0, 0, 1, 0, 5 );
-
-
- bSizerTopButtons->Add( bSizer199, 0, wxEXPAND, 5 );
-
-
- bSizerTopButtons->Add( 5, 2, 0, 0, 5 );
-
- wxBoxSizer* bSizer262;
- bSizer262 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer262->Add( 0, 0, 1, 0, 5 );
-
- m_bpButtonSyncConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonSyncConfig->SetToolTip( _("dummy") );
-
- bSizer262->Add( m_bpButtonSyncConfig, 0, wxEXPAND, 5 );
-
- m_bpButtonSyncContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonSyncContext->SetToolTip( _("dummy") );
-
- bSizer262->Add( m_bpButtonSyncContext, 0, wxEXPAND, 5 );
-
-
- bSizer262->Add( 4, 0, 0, 0, 5 );
-
- 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( 0, 0, 1, 0, 5 );
-
-
- bSizerTopButtons->Add( bSizer262, 1, wxEXPAND, 5 );
-
-
- bSizer1791->Add( bSizerTopButtons, 1, 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, wxSTATIC_BORDER|wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer1601;
- bSizer1601 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer91;
- bSizer91 = new wxBoxSizer( wxHORIZONTAL );
-
- 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 );
-
-
- 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 );
-
- wxBoxSizer* bSizer159;
- bSizer159 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonAddPair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonAddPair->SetToolTip( _("Add folder pair") );
-
- bSizer159->Add( m_bpButtonAddPair, 0, wxEXPAND, 5 );
-
- m_bpButtonRemovePair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") );
-
- bSizer159->Add( m_bpButtonRemovePair, 0, wxEXPAND, 5 );
-
-
- fgSizer8->Add( bSizer159, 0, wxEXPAND, 5 );
-
- 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_buttonSelectFolderLeft = new wxButton( m_panelTopLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectFolderLeft->SetToolTip( _("Select a folder") );
-
- bSizer182->Add( m_buttonSelectFolderLeft, 0, wxEXPAND, 5 );
-
- m_bpButtonSelectAltFolderLeft = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonSelectAltFolderLeft->SetToolTip( _("Access online storage") );
-
- bSizer182->Add( m_bpButtonSelectAltFolderLeft, 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_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 );
- m_bpButtonSwapSides->SetToolTip( _("dummy") );
-
- bSizer1771->Add( m_bpButtonSwapSides, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer160;
- bSizer160 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonLocalCompCfg = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonLocalCompCfg->SetToolTip( _("dummy") );
-
- bSizer160->Add( m_bpButtonLocalCompCfg, 0, wxEXPAND, 5 );
-
- m_bpButtonLocalFilter = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonLocalFilter->SetToolTip( _("dummy") );
-
- bSizer160->Add( m_bpButtonLocalFilter, 0, wxEXPAND, 5 );
-
- m_bpButtonLocalSyncCfg = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonLocalSyncCfg->SetToolTip( _("dummy") );
-
- bSizer160->Add( m_bpButtonLocalSyncCfg, 0, wxEXPAND, 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_panelTopRight = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelTopRight->SetMinSize( wxSize( 1,-1 ) );
-
- 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 );
-
- 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_buttonSelectFolderRight = new wxButton( m_panelTopRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectFolderRight->SetToolTip( _("Select a folder") );
-
- bSizer179->Add( m_buttonSelectFolderRight, 0, wxEXPAND, 5 );
-
- m_bpButtonSelectAltFolderRight = new wxBitmapButton( m_panelTopRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonSelectAltFolderRight->SetToolTip( _("Access online storage") );
-
- bSizer179->Add( m_bpButtonSelectAltFolderRight, 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 );
-
-
- bSizer1601->Add( bSizer91, 0, wxEXPAND, 5 );
-
- m_scrolledWindowFolderPairs = new wxScrolledWindow( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxHSCROLL|wxVSCROLL );
- m_scrolledWindowFolderPairs->SetScrollRate( 10, 10 );
- m_scrolledWindowFolderPairs->SetMinSize( wxSize( -1,0 ) );
-
- bSizerAddFolderPairs = new wxBoxSizer( wxVERTICAL );
-
-
- 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_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_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_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_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, wxSTATIC_BORDER|wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer451;
- bSizer451 = new wxBoxSizer( wxHORIZONTAL );
-
- bSizer451->SetMinSize( wxSize( -1,22 ) );
- bSizerFileStatus = new wxBoxSizer( wxHORIZONTAL );
-
- bSizerStatusLeft = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer53;
- bSizer53 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- 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 );
-
-
- 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 );
-
-
- bSizer53->Add( bSizerStatusLeftDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- bSizerStatusLeftFiles = new wxBoxSizer( wxHORIZONTAL );
-
-
- 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 );
-
-
- 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 );
-
-
- 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 );
-
-
- bSizer53->Add( bSizerStatusLeftFiles, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 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 );
-
-
- bSizerFileStatus->Add( bSizerStatusLeft, 1, wxEXPAND, 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 );
-
-
- bSizerFileStatus->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- bSizerStatusRight = new wxBoxSizer( wxHORIZONTAL );
-
- 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 );
-
-
- bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- 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 );
-
-
- 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 );
-
-
- bSizer52->Add( bSizerStatusRightDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- bSizerStatusRightFiles = new wxBoxSizer( wxHORIZONTAL );
-
-
- 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 );
-
-
- 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 );
-
-
- 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 );
-
-
- bSizer52->Add( bSizerStatusRightFiles, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatusRight->Add( bSizer52, 1, wxEXPAND, 5 );
-
-
- bSizerFileStatus->Add( bSizerStatusRight, 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 ) );
-
- 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_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_bpButtonHideSearch = new wxBitmapButton( m_panelSearch, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonHideSearch->SetToolTip( _("Close search bar") );
-
- 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_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_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 ) );
-
- bSizerLog = new wxBoxSizer( wxVERTICAL );
-
- bSizer42 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapLogStatus = new wxStaticBitmap( m_panelLog, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer42->Add( m_bitmapLogStatus, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
-
- m_staticTextLogStatus = new wxStaticText( m_panelLog, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextLogStatus->Wrap( -1 );
- m_staticTextLogStatus->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
-
- bSizer42->Add( m_staticTextLogStatus, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_panelItemsProcessed = new wxPanel( m_panelLog, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelItemsProcessed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer165;
- bSizer165 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer165->Add( 0, 5, 0, 0, 5 );
-
- wxStaticText* m_staticText962;
- m_staticText962 = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("Items processed:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText962->Wrap( -1 );
- bSizer165->Add( m_staticText962, 0, wxRIGHT|wxLEFT, 5 );
-
- wxBoxSizer* bSizer169;
- bSizer169 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticTextItemsProcessed = new wxStaticText( m_panelItemsProcessed, 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 ) );
-
- bSizer169->Add( m_staticTextItemsProcessed, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextBytesProcessed = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextBytesProcessed->Wrap( -1 );
- bSizer169->Add( m_staticTextBytesProcessed, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
-
-
- bSizer165->Add( bSizer169, 0, wxRIGHT|wxLEFT, 5 );
-
-
- bSizer165->Add( 0, 5, 0, 0, 5 );
-
-
- m_panelItemsProcessed->SetSizer( bSizer165 );
- m_panelItemsProcessed->Layout();
- bSizer165->Fit( m_panelItemsProcessed );
- bSizer42->Add( m_panelItemsProcessed, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 );
-
- m_panelItemsRemaining = new wxPanel( m_panelLog, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelItemsRemaining->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer166;
- bSizer166 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer166->Add( 0, 5, 0, 0, 5 );
-
- wxStaticText* m_staticText971;
- m_staticText971 = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText971->Wrap( -1 );
- bSizer166->Add( m_staticText971, 0, wxRIGHT|wxLEFT, 5 );
-
- wxBoxSizer* bSizer170;
- bSizer170 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticTextItemsRemaining = new wxStaticText( m_panelItemsRemaining, 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 ) );
-
- bSizer170->Add( m_staticTextItemsRemaining, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextBytesRemaining = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextBytesRemaining->Wrap( -1 );
- bSizer170->Add( m_staticTextBytesRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
-
-
- bSizer166->Add( bSizer170, 0, wxRIGHT|wxLEFT, 5 );
-
-
- bSizer166->Add( 0, 5, 0, 0, 5 );
-
-
- m_panelItemsRemaining->SetSizer( bSizer166 );
- m_panelItemsRemaining->Layout();
- bSizer166->Fit( m_panelItemsRemaining );
- bSizer42->Add( m_panelItemsRemaining, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 );
-
- wxPanel* m_panelTimeElapsed;
- m_panelTimeElapsed = new wxPanel( m_panelLog, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelTimeElapsed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer168;
- bSizer168 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer168->Add( 0, 5, 0, 0, 5 );
-
- wxStaticText* m_staticText9611;
- m_staticText9611 = new wxStaticText( m_panelTimeElapsed, wxID_ANY, _("Total time:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText9611->Wrap( -1 );
- bSizer168->Add( m_staticText9611, 0, wxRIGHT|wxLEFT, 5 );
-
- m_staticTextTotalTime = new wxStaticText( m_panelTimeElapsed, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextTotalTime->Wrap( -1 );
- m_staticTextTotalTime->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
-
- bSizer168->Add( m_staticTextTotalTime, 0, wxRIGHT|wxLEFT, 5 );
-
-
- bSizer168->Add( 0, 5, 0, 0, 5 );
-
-
- m_panelTimeElapsed->SetSizer( bSizer168 );
- m_panelTimeElapsed->Layout();
- bSizer168->Fit( m_panelTimeElapsed );
- bSizer42->Add( m_panelTimeElapsed, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 );
-
-
- bSizerLog->Add( bSizer42, 0, wxALL, 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_panelConfig = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- bSizerConfig = new wxBoxSizer( wxHORIZONTAL );
-
- bSizerCfgHistoryButtons = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer17611;
- bSizer17611 = new wxBoxSizer( wxVERTICAL );
-
- m_bpButtonNew = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonNew->SetToolTip( _("dummy") );
-
- 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 );
-
-
- bSizerCfgHistoryButtons->Add( bSizer17611, 0, 0, 5 );
-
- wxBoxSizer* bSizer1761;
- bSizer1761 = new wxBoxSizer( wxVERTICAL );
-
- m_bpButtonOpen = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonOpen->SetToolTip( _("dummy") );
-
- 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 );
-
-
- bSizerCfgHistoryButtons->Add( bSizer1761, 0, 0, 5 );
-
- wxBoxSizer* bSizer175;
- bSizer175 = new wxBoxSizer( wxVERTICAL );
-
- m_bpButtonSave = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonSave->SetToolTip( _("dummy") );
-
- 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 );
-
-
- bSizerCfgHistoryButtons->Add( bSizer175, 0, 0, 5 );
-
- wxBoxSizer* bSizer174;
- bSizer174 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer1772;
- bSizer1772 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonSaveAs = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonSaveAs->SetToolTip( _("dummy") );
-
- bSizer1772->Add( m_bpButtonSaveAs, 1, 0, 5 );
-
- m_bpButtonSaveAsBatch = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonSaveAsBatch->SetToolTip( _("dummy") );
-
- bSizer1772->Add( m_bpButtonSaveAsBatch, 1, 0, 5 );
-
-
- bSizer174->Add( bSizer1772, 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 );
-
-
- bSizerCfgHistoryButtons->Add( bSizer174, 0, 0, 5 );
-
-
- bSizerConfig->Add( bSizerCfgHistoryButtons, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 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_panelViewFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- bSizerViewFilter = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonShowLog = new wxBitmapButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowLog, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextViewType = new wxStaticText( m_panelViewFilter, wxID_ANY, _("View type:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextViewType->Wrap( -1 );
- bSizerViewFilter->Add( m_staticTextViewType, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonViewTypeSyncAction = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonViewTypeSyncAction, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 );
-
-
- bSizerViewFilter->Add( 0, 0, 3, wxEXPAND, 5 );
-
- m_staticTextSelectView = new wxStaticText( m_panelViewFilter, wxID_ANY, _("Select view:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextSelectView->Wrap( -1 );
- bSizerViewFilter->Add( m_staticTextSelectView, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowExcluded = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowExcluded, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 );
-
- m_bpButtonShowDeleteLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowDeleteLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowUpdateLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowCreateLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowLeftOnly = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowLeftOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowLeftNewer = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowLeftNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowEqual = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowEqual, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowDoNothing = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowDoNothing, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowDifferent = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowDifferent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowRightNewer = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowRightNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowRightOnly = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowRightOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowCreateRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowUpdateRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowDeleteRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowDeleteRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowConflict = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowConflict, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonViewFilterSave = new wxBitmapButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW );
- m_bpButtonViewFilterSave->SetToolTip( _("Save as default") );
-
- bSizerViewFilter->Add( m_bpButtonViewFilterSave, 0, wxALIGN_BOTTOM|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizerViewFilter->Add( 0, 0, 3, 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_panelStatistics = new wxPanel( m_panelViewFilter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
- m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- bSizer1801 = new wxBoxSizer( wxVERTICAL );
-
- bSizerStatistics = new wxBoxSizer( wxHORIZONTAL );
-
- 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") );
-
- bSizer173->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer173->Add( 5, 2, 0, 0, 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") );
-
- bSizer173->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatistics->Add( bSizer173, 0, wxEXPAND, 5 );
-
-
- bSizerStatistics->Add( 5, 5, 0, 0, 5 );
-
- 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") );
-
- bSizer172->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer172->Add( 5, 2, 0, 0, 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") );
-
- bSizer172->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizerStatistics->Add( bSizer172, 0, wxEXPAND, 5 );
-
-
- bSizerStatistics->Add( 5, 5, 0, 0, 5 );
-
- 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") );
-
- bSizer1712->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer1712->Add( 5, 2, 0, 0, 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") );
-
- bSizer1712->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizerStatistics->Add( bSizer1712, 0, wxEXPAND, 5 );
-
-
- bSizerStatistics->Add( 5, 5, 0, 0, 5 );
-
- bSizerData = new wxBoxSizer( wxVERTICAL );
-
- 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( 5, 2, 0, 0, 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") );
-
- bSizerData->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatistics->Add( bSizerData, 0, wxEXPAND, 5 );
-
-
- bSizerStatistics->Add( 5, 5, 0, 0, 5 );
-
- 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") );
-
- bSizer178->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer178->Add( 5, 2, 0, 0, 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") );
-
- bSizer178->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatistics->Add( bSizer178, 0, wxEXPAND, 5 );
-
-
- bSizerStatistics->Add( 5, 5, 0, 0, 5 );
-
- 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") );
-
- bSizer177->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer177->Add( 5, 2, 0, 0, 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") );
-
- bSizer177->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatistics->Add( bSizer177, 0, wxEXPAND, 5 );
-
-
- bSizerStatistics->Add( 5, 5, 0, 0, 5 );
-
- 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") );
-
- bSizer176->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer176->Add( 5, 2, 0, 0, 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") );
-
- bSizer176->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatistics->Add( bSizer176, 0, wxEXPAND, 5 );
-
-
- 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_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 );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) );
- this->Connect( m_menuItemNew->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigNew ) );
- this->Connect( m_menuItemLoad->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ) );
- this->Connect( m_menuItemSave->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSave ) );
- this->Connect( m_menuItemSaveAs->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSaveAs ) );
- this->Connect( m_menuItemSaveAsBatch->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSaveAsBatchJob ) );
- this->Connect( m_menuItem4->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) );
- this->Connect( m_menuItemShowLog->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnShowLog ) );
- this->Connect( m_menuItemCompare->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) );
- this->Connect( m_menuItemCompSettings->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCmpSettings ) );
- this->Connect( m_menuItemFilter->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ) );
- this->Connect( m_menuItemSyncSettings->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettings ) );
- this->Connect( m_menuItemSynchronize->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ) );
- this->Connect( m_menuItemOptions->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuOptions ) );
- this->Connect( m_menuItemFind->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuFindItem ) );
- this->Connect( m_menuItemExportList->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) );
- this->Connect( m_menuItem51->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuResetLayout ) );
- this->Connect( m_menuItemHelp->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnShowHelp ) );
- this->Connect( m_menuItemCheckVersionNow->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersion ) );
- this->Connect( m_menuItemCheckVersionAuto->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersionAutomatically ) );
- this->Connect( m_menuItemAbout->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) );
- 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::OnCompSettingsContext ), NULL, this );
- m_bpButtonCmpContext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompSettingsContext ), NULL, this );
- m_bpButtonCmpContext->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnCompSettingsContext ), NULL, this );
- m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this );
- m_bpButtonFilter->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnGlobalFilterContext ), NULL, this );
- m_bpButtonFilterContext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnGlobalFilterContext ), NULL, this );
- m_bpButtonFilterContext->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnGlobalFilterContext ), NULL, this );
- m_bpButtonSyncConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettings ), NULL, this );
- m_bpButtonSyncConfig->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnSyncSettingsContext ), NULL, this );
- m_bpButtonSyncContext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettingsContext ), NULL, this );
- m_bpButtonSyncContext->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnSyncSettingsContext ), 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_bpButtonShowLog->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowLog ), NULL, this );
- m_bpButtonViewTypeSyncAction->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewType ), NULL, this );
- m_bpButtonShowExcluded->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowDeleteLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowUpdateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowCreateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowEqual->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowDoNothing->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowCreateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowUpdateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowDeleteRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonViewFilterSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnViewFilterSave ), NULL, this );
+ this->SetSizeHints( wxSize( 640, 400 ), 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_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_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_menuItemSaveAsBatch = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("Save as &batch job...") ), wxEmptyString, wxITEM_NORMAL );
+ m_menuFile->Append( m_menuItemSaveAsBatch );
+
+ m_menuFile->AppendSeparator();
+
+ wxMenuItem* m_menuItem4;
+ m_menuItem4 = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("E&xit") ), wxEmptyString, wxITEM_NORMAL );
+ m_menuFile->Append( m_menuItem4 );
+
+ m_menubar->Append( m_menuFile, _("&File") );
+
+ m_menu4 = new wxMenu();
+ m_menuItemShowLog = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("Show &log") ) + wxT('\t') + wxT("F4"), wxEmptyString, wxITEM_NORMAL );
+ m_menu4->Append( m_menuItemShowLog );
+
+ m_menu4->AppendSeparator();
+
+ m_menuItemCompare = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("Start &comparison") ) + wxT('\t') + wxT("F5"), wxEmptyString, wxITEM_NORMAL );
+ m_menu4->Append( m_menuItemCompare );
+
+ m_menu4->AppendSeparator();
+
+ m_menuItemCompSettings = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("C&omparison settings") ) + wxT('\t') + wxT("F6"), wxEmptyString, wxITEM_NORMAL );
+ m_menu4->Append( m_menuItemCompSettings );
+
+ m_menuItemFilter = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("&Filter settings") ) + wxT('\t') + wxT("F7"), wxEmptyString, wxITEM_NORMAL );
+ m_menu4->Append( m_menuItemFilter );
+
+ m_menuItemSyncSettings = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("S&ynchronization settings") ) + wxT('\t') + wxT("F8"), wxEmptyString, wxITEM_NORMAL );
+ m_menu4->Append( m_menuItemSyncSettings );
+
+ m_menu4->AppendSeparator();
+
+ m_menuItemSynchronize = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("Start &synchronization") ) + wxT('\t') + wxT("F9"), wxEmptyString, wxITEM_NORMAL );
+ m_menu4->Append( m_menuItemSynchronize );
+
+ m_menubar->Append( m_menu4, _("&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_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_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_menuTools->AppendSeparator();
+
+ wxMenuItem* m_menuItem51;
+ m_menuItem51 = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("&Reset layout") ), wxEmptyString, wxITEM_NORMAL );
+ m_menuTools->Append( m_menuItem51 );
+
+ 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_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_menuItemShowOverview = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("dummy") ), wxEmptyString, wxITEM_NORMAL );
+ m_menuTools->Append( m_menuItemShowOverview );
+
+ 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->AppendSeparator();
+
+ 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_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_menubar->Append( m_menuHelp, _("&Help") );
+
+ this->SetMenuBar( m_menubar );
+
+ bSizerPanelHolder = new wxBoxSizer( wxVERTICAL );
+
+ m_panelTopButtons = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer1791;
+ bSizer1791 = new wxBoxSizer( wxVERTICAL );
+
+ bSizerTopButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer261;
+ bSizer261 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ 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();
+
+ bSizer261->Add( m_buttonCancel, 0, wxEXPAND, 5 );
+
+ m_buttonCompare = new zen::BitmapTextButton( m_panelTopButtons, wxID_ANY, _("Compare"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ m_buttonCompare->SetDefault();
+ 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( 4, 0, 0, 0, 5 );
+
+ m_bpButtonCmpConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonCmpConfig->SetToolTip( _("dummy") );
+
+ bSizer261->Add( m_bpButtonCmpConfig, 0, wxEXPAND, 5 );
+
+ m_bpButtonCmpContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonCmpContext->SetToolTip( _("dummy") );
+
+ bSizer261->Add( m_bpButtonCmpContext, 0, wxEXPAND, 5 );
+
+
+ bSizer261->Add( 0, 0, 1, 0, 5 );
+
+
+ bSizerTopButtons->Add( bSizer261, 1, wxEXPAND, 5 );
+
+
+ bSizerTopButtons->Add( 5, 2, 0, 0, 5 );
+
+ wxBoxSizer* bSizer199;
+ bSizer199 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer199->Add( 0, 0, 1, 0, 5 );
+
+ m_bpButtonFilter = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE );
+ m_bpButtonFilter->SetToolTip( _("dummy") );
+
+ bSizer199->Add( m_bpButtonFilter, 0, wxEXPAND, 5 );
+
+ m_bpButtonFilterContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonFilterContext->SetToolTip( _("dummy") );
+
+ bSizer199->Add( m_bpButtonFilterContext, 0, wxEXPAND, 5 );
+
+
+ bSizer199->Add( 0, 0, 1, 0, 5 );
+
+
+ bSizerTopButtons->Add( bSizer199, 0, wxEXPAND, 5 );
+
+
+ bSizerTopButtons->Add( 5, 2, 0, 0, 5 );
+
+ wxBoxSizer* bSizer262;
+ bSizer262 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer262->Add( 0, 0, 1, 0, 5 );
+
+ m_bpButtonSyncConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSyncConfig->SetToolTip( _("dummy") );
+
+ bSizer262->Add( m_bpButtonSyncConfig, 0, wxEXPAND, 5 );
+
+ m_bpButtonSyncContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSyncContext->SetToolTip( _("dummy") );
+
+ bSizer262->Add( m_bpButtonSyncContext, 0, wxEXPAND, 5 );
+
+
+ bSizer262->Add( 4, 0, 0, 0, 5 );
+
+ 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( 0, 0, 1, 0, 5 );
+
+
+ bSizerTopButtons->Add( bSizer262, 1, wxEXPAND, 5 );
+
+
+ bSizer1791->Add( bSizerTopButtons, 1, 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, wxSTATIC_BORDER|wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer1601;
+ bSizer1601 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer91;
+ bSizer91 = new wxBoxSizer( wxHORIZONTAL );
+
+ 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 );
+
+
+ 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 );
+
+ wxBoxSizer* bSizer159;
+ bSizer159 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonAddPair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonAddPair->SetToolTip( _("Add folder pair") );
+
+ bSizer159->Add( m_bpButtonAddPair, 0, wxEXPAND, 5 );
+
+ m_bpButtonRemovePair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") );
+
+ bSizer159->Add( m_bpButtonRemovePair, 0, wxEXPAND, 5 );
+
+
+ fgSizer8->Add( bSizer159, 0, wxEXPAND, 5 );
+
+ 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_buttonSelectFolderLeft = new wxButton( m_panelTopLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectFolderLeft->SetToolTip( _("Select a folder") );
+
+ bSizer182->Add( m_buttonSelectFolderLeft, 0, wxEXPAND, 5 );
+
+ m_bpButtonSelectAltFolderLeft = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectAltFolderLeft->SetToolTip( _("Access online storage") );
+
+ bSizer182->Add( m_bpButtonSelectAltFolderLeft, 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_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 );
+ m_bpButtonSwapSides->SetToolTip( _("dummy") );
+
+ bSizer1771->Add( m_bpButtonSwapSides, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer160;
+ bSizer160 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonLocalCompCfg = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonLocalCompCfg->SetToolTip( _("dummy") );
+
+ bSizer160->Add( m_bpButtonLocalCompCfg, 0, wxEXPAND, 5 );
+
+ m_bpButtonLocalFilter = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonLocalFilter->SetToolTip( _("dummy") );
+
+ bSizer160->Add( m_bpButtonLocalFilter, 0, wxEXPAND, 5 );
+
+ m_bpButtonLocalSyncCfg = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonLocalSyncCfg->SetToolTip( _("dummy") );
+
+ bSizer160->Add( m_bpButtonLocalSyncCfg, 0, wxEXPAND, 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_panelTopRight = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelTopRight->SetMinSize( wxSize( 1, -1 ) );
+
+ 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 );
+
+ 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_buttonSelectFolderRight = new wxButton( m_panelTopRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectFolderRight->SetToolTip( _("Select a folder") );
+
+ bSizer179->Add( m_buttonSelectFolderRight, 0, wxEXPAND, 5 );
+
+ m_bpButtonSelectAltFolderRight = new wxBitmapButton( m_panelTopRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectAltFolderRight->SetToolTip( _("Access online storage") );
+
+ bSizer179->Add( m_bpButtonSelectAltFolderRight, 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 );
+
+
+ bSizer1601->Add( bSizer91, 0, wxEXPAND, 5 );
+
+ m_scrolledWindowFolderPairs = new wxScrolledWindow( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxSize( -1, -1 ), wxHSCROLL|wxVSCROLL );
+ m_scrolledWindowFolderPairs->SetScrollRate( 10, 10 );
+ m_scrolledWindowFolderPairs->SetMinSize( wxSize( -1, 0 ) );
+
+ bSizerAddFolderPairs = new wxBoxSizer( wxVERTICAL );
+
+
+ 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_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_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_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_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, wxSTATIC_BORDER|wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer451;
+ bSizer451 = new wxBoxSizer( wxHORIZONTAL );
+
+ bSizer451->SetMinSize( wxSize( -1, 22 ) );
+ bSizerFileStatus = new wxBoxSizer( wxHORIZONTAL );
+
+ bSizerStatusLeft = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer53;
+ bSizer53 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ 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 );
+
+
+ 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 );
+
+
+ bSizer53->Add( bSizerStatusLeftDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizerStatusLeftFiles = new wxBoxSizer( wxHORIZONTAL );
+
+
+ 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 );
+
+
+ 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 );
+
+
+ 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 );
+
+
+ bSizer53->Add( bSizerStatusLeftFiles, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 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 );
+
+
+ bSizerFileStatus->Add( bSizerStatusLeft, 1, wxEXPAND, 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 );
+
+
+ bSizerFileStatus->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizerStatusRight = new wxBoxSizer( wxHORIZONTAL );
+
+ 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 );
+
+
+ bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ 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 );
+
+
+ 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 );
+
+
+ bSizer52->Add( bSizerStatusRightDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizerStatusRightFiles = new wxBoxSizer( wxHORIZONTAL );
+
+
+ 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 );
+
+
+ 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 );
+
+
+ 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 );
+
+
+ bSizer52->Add( bSizerStatusRightFiles, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusRight->Add( bSizer52, 1, wxEXPAND, 5 );
+
+
+ bSizerFileStatus->Add( bSizerStatusRight, 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 ) );
+
+ 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_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_bpButtonHideSearch = new wxBitmapButton( m_panelSearch, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonHideSearch->SetToolTip( _("Close search bar") );
+
+ 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_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_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 ) );
+
+ bSizerLog = new wxBoxSizer( wxVERTICAL );
+
+ bSizer42 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapLogStatus = new wxStaticBitmap( m_panelLog, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ bSizer42->Add( m_bitmapLogStatus, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
+
+ m_staticTextLogStatus = new wxStaticText( m_panelLog, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextLogStatus->Wrap( -1 );
+ m_staticTextLogStatus->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
+
+ bSizer42->Add( m_staticTextLogStatus, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_panelItemsProcessed = new wxPanel( m_panelLog, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panelItemsProcessed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer165;
+ bSizer165 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer165->Add( 0, 5, 0, 0, 5 );
+
+ wxStaticText* m_staticText962;
+ m_staticText962 = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("Items processed:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText962->Wrap( -1 );
+ bSizer165->Add( m_staticText962, 0, wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer169;
+ bSizer169 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticTextItemsProcessed = new wxStaticText( m_panelItemsProcessed, 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 ) );
+
+ bSizer169->Add( m_staticTextItemsProcessed, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextBytesProcessed = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextBytesProcessed->Wrap( -1 );
+ bSizer169->Add( m_staticTextBytesProcessed, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
+
+
+ bSizer165->Add( bSizer169, 0, wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer165->Add( 0, 5, 0, 0, 5 );
+
+
+ m_panelItemsProcessed->SetSizer( bSizer165 );
+ m_panelItemsProcessed->Layout();
+ bSizer165->Fit( m_panelItemsProcessed );
+ bSizer42->Add( m_panelItemsProcessed, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 );
+
+ m_panelItemsRemaining = new wxPanel( m_panelLog, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panelItemsRemaining->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer166;
+ bSizer166 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer166->Add( 0, 5, 0, 0, 5 );
+
+ wxStaticText* m_staticText971;
+ m_staticText971 = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText971->Wrap( -1 );
+ bSizer166->Add( m_staticText971, 0, wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer170;
+ bSizer170 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticTextItemsRemaining = new wxStaticText( m_panelItemsRemaining, 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 ) );
+
+ bSizer170->Add( m_staticTextItemsRemaining, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextBytesRemaining = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextBytesRemaining->Wrap( -1 );
+ bSizer170->Add( m_staticTextBytesRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
+
+
+ bSizer166->Add( bSizer170, 0, wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer166->Add( 0, 5, 0, 0, 5 );
+
+
+ m_panelItemsRemaining->SetSizer( bSizer166 );
+ m_panelItemsRemaining->Layout();
+ bSizer166->Fit( m_panelItemsRemaining );
+ bSizer42->Add( m_panelItemsRemaining, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 );
+
+ wxPanel* m_panelTimeElapsed;
+ m_panelTimeElapsed = new wxPanel( m_panelLog, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panelTimeElapsed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer168;
+ bSizer168 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer168->Add( 0, 5, 0, 0, 5 );
+
+ wxStaticText* m_staticText9611;
+ m_staticText9611 = new wxStaticText( m_panelTimeElapsed, wxID_ANY, _("Total time:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText9611->Wrap( -1 );
+ bSizer168->Add( m_staticText9611, 0, wxRIGHT|wxLEFT, 5 );
+
+ m_staticTextTotalTime = new wxStaticText( m_panelTimeElapsed, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextTotalTime->Wrap( -1 );
+ m_staticTextTotalTime->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
+
+ bSizer168->Add( m_staticTextTotalTime, 0, wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer168->Add( 0, 5, 0, 0, 5 );
+
+
+ m_panelTimeElapsed->SetSizer( bSizer168 );
+ m_panelTimeElapsed->Layout();
+ bSizer168->Fit( m_panelTimeElapsed );
+ bSizer42->Add( m_panelTimeElapsed, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 );
+
+
+ bSizerLog->Add( bSizer42, 0, wxALL, 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_panelConfig = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ bSizerConfig = new wxBoxSizer( wxHORIZONTAL );
+
+ bSizerCfgHistoryButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer17611;
+ bSizer17611 = new wxBoxSizer( wxVERTICAL );
+
+ m_bpButtonNew = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonNew->SetToolTip( _("dummy") );
+
+ 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 );
+
+
+ bSizerCfgHistoryButtons->Add( bSizer17611, 0, 0, 5 );
+
+ wxBoxSizer* bSizer1761;
+ bSizer1761 = new wxBoxSizer( wxVERTICAL );
+
+ m_bpButtonOpen = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonOpen->SetToolTip( _("dummy") );
+
+ 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 );
+
+
+ bSizerCfgHistoryButtons->Add( bSizer1761, 0, 0, 5 );
+
+ wxBoxSizer* bSizer175;
+ bSizer175 = new wxBoxSizer( wxVERTICAL );
+
+ m_bpButtonSave = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSave->SetToolTip( _("dummy") );
+
+ 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 );
+
+
+ bSizerCfgHistoryButtons->Add( bSizer175, 0, 0, 5 );
+
+ wxBoxSizer* bSizer174;
+ bSizer174 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer1772;
+ bSizer1772 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonSaveAs = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSaveAs->SetToolTip( _("dummy") );
+
+ bSizer1772->Add( m_bpButtonSaveAs, 1, 0, 5 );
+
+ m_bpButtonSaveAsBatch = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSaveAsBatch->SetToolTip( _("dummy") );
+
+ bSizer1772->Add( m_bpButtonSaveAsBatch, 1, 0, 5 );
+
+
+ bSizer174->Add( bSizer1772, 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 );
+
+
+ bSizerCfgHistoryButtons->Add( bSizer174, 0, 0, 5 );
+
+
+ bSizerConfig->Add( bSizerCfgHistoryButtons, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 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_panelViewFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ bSizerViewFilter = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonShowLog = new wxBitmapButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowLog, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextViewType = new wxStaticText( m_panelViewFilter, wxID_ANY, _("View type:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextViewType->Wrap( -1 );
+ bSizerViewFilter->Add( m_staticTextViewType, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonViewTypeSyncAction = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonViewTypeSyncAction, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 );
+
+
+ bSizerViewFilter->Add( 0, 0, 3, wxEXPAND, 5 );
+
+ m_staticTextSelectView = new wxStaticText( m_panelViewFilter, wxID_ANY, _("Select view:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextSelectView->Wrap( -1 );
+ bSizerViewFilter->Add( m_staticTextSelectView, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowExcluded = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowExcluded, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 );
+
+ m_bpButtonShowDeleteLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowDeleteLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowUpdateLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowCreateLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowLeftOnly = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowLeftOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowLeftNewer = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowLeftNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowEqual = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowEqual, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowDoNothing = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowDoNothing, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowDifferent = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowDifferent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowRightNewer = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowRightNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowRightOnly = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowRightOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowCreateRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowUpdateRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowDeleteRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowDeleteRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowConflict = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowConflict, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonViewFilterSave = new wxBitmapButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW );
+ m_bpButtonViewFilterSave->SetToolTip( _("Save as default") );
+
+ bSizerViewFilter->Add( m_bpButtonViewFilterSave, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ bSizerViewFilter->Add( 0, 0, 3, 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_panelStatistics = new wxPanel( m_panelViewFilter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
+ m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ bSizer1801 = new wxBoxSizer( wxVERTICAL );
+
+ bSizerStatistics = new wxBoxSizer( wxHORIZONTAL );
+
+ 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") );
+
+ bSizer173->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer173->Add( 5, 2, 0, 0, 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") );
+
+ bSizer173->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatistics->Add( bSizer173, 0, wxEXPAND, 5 );
+
+
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
+
+ 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") );
+
+ bSizer172->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer172->Add( 5, 2, 0, 0, 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") );
+
+ bSizer172->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizerStatistics->Add( bSizer172, 0, wxEXPAND, 5 );
+
+
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
+
+ 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") );
+
+ bSizer1712->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer1712->Add( 5, 2, 0, 0, 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") );
+
+ bSizer1712->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizerStatistics->Add( bSizer1712, 0, wxEXPAND, 5 );
+
+
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
+
+ bSizerData = new wxBoxSizer( wxVERTICAL );
+
+ 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( 5, 2, 0, 0, 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") );
+
+ bSizerData->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatistics->Add( bSizerData, 0, wxEXPAND, 5 );
+
+
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
+
+ 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") );
+
+ bSizer178->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer178->Add( 5, 2, 0, 0, 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") );
+
+ bSizer178->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatistics->Add( bSizer178, 0, wxEXPAND, 5 );
+
+
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
+
+ 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") );
+
+ bSizer177->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer177->Add( 5, 2, 0, 0, 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") );
+
+ bSizer177->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatistics->Add( bSizer177, 0, wxEXPAND, 5 );
+
+
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
+
+ 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") );
+
+ bSizer176->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer176->Add( 5, 2, 0, 0, 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") );
+
+ bSizer176->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatistics->Add( bSizer176, 0, wxEXPAND, 5 );
+
+
+ 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_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 );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) );
+ this->Connect( m_menuItemNew->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigNew ) );
+ this->Connect( m_menuItemLoad->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ) );
+ this->Connect( m_menuItemSave->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSave ) );
+ this->Connect( m_menuItemSaveAs->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSaveAs ) );
+ this->Connect( m_menuItemSaveAsBatch->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSaveAsBatchJob ) );
+ this->Connect( m_menuItem4->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) );
+ this->Connect( m_menuItemShowLog->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnShowLog ) );
+ this->Connect( m_menuItemCompare->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) );
+ this->Connect( m_menuItemCompSettings->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCmpSettings ) );
+ this->Connect( m_menuItemFilter->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ) );
+ this->Connect( m_menuItemSyncSettings->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettings ) );
+ this->Connect( m_menuItemSynchronize->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ) );
+ this->Connect( m_menuItemOptions->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuOptions ) );
+ this->Connect( m_menuItemFind->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuFindItem ) );
+ this->Connect( m_menuItemExportList->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) );
+ this->Connect( m_menuItem51->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuResetLayout ) );
+ this->Connect( m_menuItemHelp->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnShowHelp ) );
+ this->Connect( m_menuItemCheckVersionNow->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersion ) );
+ this->Connect( m_menuItemCheckVersionAuto->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersionAutomatically ) );
+ this->Connect( m_menuItemAbout->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) );
+ 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::OnCompSettingsContext ), NULL, this );
+ m_bpButtonCmpContext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompSettingsContext ), NULL, this );
+ m_bpButtonCmpContext->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnCompSettingsContext ), NULL, this );
+ m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this );
+ m_bpButtonFilter->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnGlobalFilterContext ), NULL, this );
+ m_bpButtonFilterContext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnGlobalFilterContext ), NULL, this );
+ m_bpButtonFilterContext->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnGlobalFilterContext ), NULL, this );
+ m_bpButtonSyncConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettings ), NULL, this );
+ m_bpButtonSyncConfig->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnSyncSettingsContext ), NULL, this );
+ m_bpButtonSyncContext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettingsContext ), NULL, this );
+ m_bpButtonSyncContext->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnSyncSettingsContext ), 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_bpButtonShowLog->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowLog ), NULL, this );
+ m_bpButtonViewTypeSyncAction->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewType ), NULL, this );
+ m_bpButtonShowExcluded->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowDeleteLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowUpdateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowCreateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowEqual->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowDoNothing->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowCreateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowUpdateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowDeleteRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonViewFilterSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnViewFilterSave ), NULL, this );
}
MainDialogGenerated::~MainDialogGenerated()
@@ -1197,98 +1197,98 @@ MainDialogGenerated::~MainDialogGenerated()
FolderPairPanelGenerated::FolderPairPanelGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
{
- wxBoxSizer* bSizer74;
- bSizer74 = new wxBoxSizer( wxHORIZONTAL );
-
- m_panelLeft = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelLeft->SetMinSize( wxSize( 1,-1 ) );
-
- wxBoxSizer* bSizer134;
- bSizer134 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonFolderPairOptions = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonFolderPairOptions->SetToolTip( _("Arrange folder pair") );
-
- bSizer134->Add( m_bpButtonFolderPairOptions, 0, wxEXPAND, 5 );
-
- m_bpButtonRemovePair = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") );
-
- 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_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 );
-
- m_bpButtonSelectAltFolderLeft = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonSelectAltFolderLeft->SetToolTip( _("Access online storage") );
-
- 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_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 );
- m_bpButtonLocalCompCfg->SetToolTip( _("dummy") );
-
- bSizer95->Add( m_bpButtonLocalCompCfg, 0, wxEXPAND, 5 );
-
- m_bpButtonLocalFilter = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonLocalFilter->SetToolTip( _("dummy") );
-
- bSizer95->Add( m_bpButtonLocalFilter, 0, wxEXPAND, 5 );
-
- m_bpButtonLocalSyncCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonLocalSyncCfg->SetToolTip( _("dummy") );
-
- 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_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelRight->SetMinSize( wxSize( 1,-1 ) );
-
- 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_buttonSelectFolderRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectFolderRight->SetToolTip( _("Select a folder") );
-
- bSizer135->Add( m_buttonSelectFolderRight, 0, wxEXPAND, 5 );
-
- m_bpButtonSelectAltFolderRight = new wxBitmapButton( m_panelRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonSelectAltFolderRight->SetToolTip( _("Access online storage") );
-
- 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 );
-
-
- this->SetSizer( bSizer74 );
- this->Layout();
- bSizer74->Fit( this );
+ wxBoxSizer* bSizer74;
+ bSizer74 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_panelLeft = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelLeft->SetMinSize( wxSize( 1, -1 ) );
+
+ wxBoxSizer* bSizer134;
+ bSizer134 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonFolderPairOptions = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonFolderPairOptions->SetToolTip( _("Arrange folder pair") );
+
+ bSizer134->Add( m_bpButtonFolderPairOptions, 0, wxEXPAND, 5 );
+
+ m_bpButtonRemovePair = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") );
+
+ 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_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 );
+
+ m_bpButtonSelectAltFolderLeft = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectAltFolderLeft->SetToolTip( _("Access online storage") );
+
+ 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_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 );
+ m_bpButtonLocalCompCfg->SetToolTip( _("dummy") );
+
+ bSizer95->Add( m_bpButtonLocalCompCfg, 0, wxEXPAND, 5 );
+
+ m_bpButtonLocalFilter = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonLocalFilter->SetToolTip( _("dummy") );
+
+ bSizer95->Add( m_bpButtonLocalFilter, 0, wxEXPAND, 5 );
+
+ m_bpButtonLocalSyncCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonLocalSyncCfg->SetToolTip( _("dummy") );
+
+ 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_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelRight->SetMinSize( wxSize( 1, -1 ) );
+
+ 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_buttonSelectFolderRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectFolderRight->SetToolTip( _("Select a folder") );
+
+ bSizer135->Add( m_buttonSelectFolderRight, 0, wxEXPAND, 5 );
+
+ m_bpButtonSelectAltFolderRight = new wxBitmapButton( m_panelRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectAltFolderRight->SetToolTip( _("Access online storage") );
+
+ 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 );
+
+
+ this->SetSizer( bSizer74 );
+ this->Layout();
+ bSizer74->Fit( this );
}
FolderPairPanelGenerated::~FolderPairPanelGenerated()
@@ -1297,1139 +1297,1139 @@ 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 ) );
-
- wxBoxSizer* bSizer7;
- bSizer7 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer190;
- bSizer190 = new wxBoxSizer( wxHORIZONTAL );
-
- 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_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|wxLEFT, 5 );
-
- m_notebook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- 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 );
-
- 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_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 );
-
- 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 );
-
- 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* bSizer159;
- bSizer159 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer178;
- bSizer178 = new wxBoxSizer( wxHORIZONTAL );
-
- 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 );
-
- wxBoxSizer* bSizer2381;
- bSizer2381 = new wxBoxSizer( wxVERTICAL );
-
- m_toggleBtnByTimeSize = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File time and size"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_toggleBtnByTimeSize->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
-
- bSizer2381->Add( m_toggleBtnByTimeSize, 0, wxEXPAND|wxBOTTOM, 5 );
-
- m_toggleBtnByContent = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_toggleBtnByContent->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
-
- bSizer2381->Add( m_toggleBtnByContent, 0, wxEXPAND|wxBOTTOM, 5 );
-
- m_toggleBtnBySize = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File size"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_toggleBtnBySize->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
-
- bSizer2381->Add( m_toggleBtnBySize, 0, wxEXPAND, 5 );
-
-
- bSizer182->Add( bSizer2381, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer178->Add( bSizer182, 0, wxALL, 5 );
-
- 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_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 );
-
-
- bSizer178->Add( bSizer2371, 0, wxALIGN_CENTER_VERTICAL|wxALL, 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 );
-
- wxBoxSizer* bSizer1734;
- bSizer1734 = new wxBoxSizer( wxHORIZONTAL );
-
- 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 );
-
- wxBoxSizer* bSizer176;
- bSizer176 = new wxBoxSizer( wxVERTICAL );
-
- m_radioBtnSymlinksFollow = new wxRadioButton( m_panelComparisonSettings, wxID_ANY, _("&Follow"), wxDefaultPosition, wxDefaultSize, 0 );
- m_radioBtnSymlinksFollow->SetValue( true );
- bSizer176->Add( m_radioBtnSymlinksFollow, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
- m_radioBtnSymlinksDirect = new wxRadioButton( m_panelComparisonSettings, wxID_ANY, _("&Direct"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer176->Add( m_radioBtnSymlinksDirect, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer1721->Add( bSizer176, 0, wxLEFT|wxEXPAND, 18 );
-
-
- bSizer1721->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_hyperlink24 = new wxHyperlinkCtrl( m_panelComparisonSettings, wxID_ANY, _("More information"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer1721->Add( m_hyperlink24, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer1734->Add( bSizer1721, 0, wxALL|wxEXPAND, 5 );
-
- m_staticline44 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer1734->Add( m_staticline44, 0, wxEXPAND, 5 );
-
- 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_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, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
- 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 ) );
-
- 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 ) );
-
- bSizer197->Add( m_staticText13811, 0, wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer1733->Add( bSizer197, 0, 0, 5 );
-
-
- bSizer1733->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_hyperlink241 = new wxHyperlinkCtrl( m_panelComparisonSettings, wxID_ANY, _("Handle daylight saving time"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer1733->Add( m_hyperlink241, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer1734->Add( bSizer1733, 0, wxALL|wxEXPAND, 5 );
-
- m_staticline441 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer1734->Add( m_staticline441, 0, wxEXPAND, 5 );
-
-
- bSizer159->Add( bSizer1734, 0, 0, 5 );
-
- m_staticline331 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer159->Add( m_staticline331, 0, wxEXPAND, 5 );
-
- bSizerCompMisc = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer2781;
- bSizer2781 = new wxBoxSizer( wxHORIZONTAL );
-
- 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_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_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 );
-
- 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_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_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 );
-
-
- bSizerCompMisc->Add( bSizer2781, 0, wxEXPAND, 5 );
-
- m_staticline3311 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizerCompMisc->Add( m_staticline3311, 0, wxEXPAND, 5 );
-
-
- bSizer159->Add( bSizerCompMisc, 0, wxEXPAND, 5 );
-
-
- bSizer2561->Add( bSizer159, 0, wxEXPAND, 5 );
-
- m_staticlinePerformance = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer2561->Add( m_staticlinePerformance, 0, wxEXPAND, 5 );
-
- bSizerPerformance = new wxBoxSizer( wxVERTICAL );
-
- m_staticTextPerfDeRequired = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("Requires FreeFileSync Donation Edition"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextPerfDeRequired->Wrap( -1 );
- bSizerPerformance->Add( m_staticTextPerfDeRequired, 0, wxALL, 5 );
-
- m_staticlinePerfDeRequired = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizerPerformance->Add( m_staticlinePerfDeRequired, 0, wxEXPAND, 5 );
-
- m_panelPerfHeader = new wxPanel( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelPerfHeader->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer2191;
- bSizer2191 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapPerf = new wxStaticBitmap( m_panelPerfHeader, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizer2191->Add( m_bitmapPerf, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_staticText13611 = new wxStaticText( m_panelPerfHeader, wxID_ANY, _("Performance improvements:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText13611->Wrap( -1 );
- bSizer2191->Add( m_staticText13611, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 );
-
-
- m_panelPerfHeader->SetSizer( bSizer2191 );
- m_panelPerfHeader->Layout();
- bSizer2191->Fit( m_panelPerfHeader );
- bSizerPerformance->Add( m_panelPerfHeader, 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 );
-
- 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_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 );
-
-
- m_scrolledWindowPerf->SetSizer( fgSizerPerf );
- m_scrolledWindowPerf->Layout();
- fgSizerPerf->Fit( m_scrolledWindowPerf );
- bSizer260->Add( m_scrolledWindowPerf, 1, wxALL|wxEXPAND, 5 );
-
- m_hyperlink1711 = new wxHyperlinkCtrl( m_panelComparisonSettings, wxID_ANY, _("How to get best performance?"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer260->Add( m_hyperlink1711, 0, wxALL, 5 );
-
-
- bSizerPerformance->Add( bSizer260, 1, wxALL|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_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 ) );
-
- wxBoxSizer* bSizer278;
- bSizer278 = 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_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 );
-
-
- bSizer278->Add( bSizerHeaderFilterSettings, 0, wxEXPAND, 5 );
-
- m_panelFilterSettings = new wxPanel( m_panelFilterSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelFilterSettings->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer1591;
- bSizer1591 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer166;
- bSizer166 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer166->Add( 0, 10, 0, 0, 5 );
-
- wxBoxSizer* bSizer1661;
- bSizer1661 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapInclude = new wxStaticBitmap( m_panelFilterSettings, 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 );
-
- m_staticText78 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("Include:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText78->Wrap( -1 );
- bSizer1731->Add( m_staticText78, 0, 0, 5 );
-
- m_textCtrlInclude = new wxTextCtrl( m_panelFilterSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE );
- bSizer1731->Add( m_textCtrlInclude, 1, wxEXPAND|wxTOP, 5 );
-
-
- bSizer1661->Add( bSizer1731, 1, wxEXPAND, 5 );
-
-
- bSizer166->Add( bSizer1661, 3, wxEXPAND|wxLEFT, 5 );
-
-
- bSizer166->Add( 0, 10, 0, 0, 5 );
-
- wxBoxSizer* bSizer1651;
- bSizer1651 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapExclude = new wxStaticBitmap( m_panelFilterSettings, 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* bSizer189;
- bSizer189 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText77 = new wxStaticText( m_panelFilterSettings, 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 );
-
- m_hyperlink171 = new wxHyperlinkCtrl( m_panelFilterSettings, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer189->Add( m_hyperlink171, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer1742->Add( bSizer189, 0, wxEXPAND, 5 );
-
- m_textCtrlExclude = new wxTextCtrl( m_panelFilterSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE );
- bSizer1742->Add( m_textCtrlExclude, 1, wxEXPAND|wxTOP, 5 );
-
-
- bSizer1651->Add( bSizer1742, 1, wxEXPAND, 5 );
-
-
- bSizer166->Add( bSizer1651, 5, wxEXPAND|wxLEFT, 5 );
-
- m_staticTextFilterDescr = new wxStaticText( m_panelFilterSettings, 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 ) );
-
- bSizer166->Add( m_staticTextFilterDescr, 0, wxALL, 10 );
-
-
- bSizer1591->Add( bSizer166, 1, wxEXPAND, 5 );
-
- m_staticline24 = new wxStaticLine( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer1591->Add( m_staticline24, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer160;
- bSizer160 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer168;
- bSizer168 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapFilterSize = new wxStaticBitmap( m_panelFilterSettings, 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 );
-
- m_staticText80 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("File size:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText80->Wrap( -1 );
- bSizer158->Add( m_staticText80, 0, wxBOTTOM, 5 );
-
- wxBoxSizer* bSizer162;
- bSizer162 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText101 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("Minimum:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText101->Wrap( -1 );
- bSizer162->Add( m_staticText101, 0, wxBOTTOM, 2 );
-
- m_spinCtrlMinSize = new wxSpinCtrl( m_panelFilterSettings, 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_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMinSizeChoices, 0 );
- m_choiceUnitMinSize->SetSelection( 0 );
- bSizer162->Add( m_choiceUnitMinSize, 0, wxEXPAND, 5 );
-
-
- bSizer158->Add( bSizer162, 0, wxBOTTOM|wxEXPAND, 5 );
-
- wxBoxSizer* bSizer163;
- bSizer163 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText102 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("Maximum:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText102->Wrap( -1 );
- bSizer163->Add( m_staticText102, 0, wxBOTTOM, 2 );
-
- m_spinCtrlMaxSize = new wxSpinCtrl( m_panelFilterSettings, 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_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMaxSizeChoices, 0 );
- m_choiceUnitMaxSize->SetSelection( 0 );
- bSizer163->Add( m_choiceUnitMaxSize, 0, wxEXPAND, 5 );
-
-
- bSizer158->Add( bSizer163, 0, wxEXPAND, 5 );
-
-
- bSizer168->Add( bSizer158, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer160->Add( bSizer168, 2, wxEXPAND|wxALL, 5 );
-
- m_staticline23 = new wxStaticLine( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer160->Add( m_staticline23, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer167;
- bSizer167 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapFilterDate = new wxStaticBitmap( m_panelFilterSettings, 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 );
-
- m_staticText79 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("Time span:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText79->Wrap( -1 );
- bSizer165->Add( m_staticText79, 0, wxBOTTOM, 5 );
-
- m_spinCtrlTimespan = new wxSpinCtrl( m_panelFilterSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 );
- bSizer165->Add( m_spinCtrlTimespan, 0, wxEXPAND, 5 );
-
- wxArrayString m_choiceUnitTimespanChoices;
- m_choiceUnitTimespan = new wxChoice( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitTimespanChoices, 0 );
- m_choiceUnitTimespan->SetSelection( 0 );
- bSizer165->Add( m_choiceUnitTimespan, 0, wxEXPAND, 5 );
-
-
- bSizer167->Add( bSizer165, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer160->Add( bSizer167, 1, wxEXPAND|wxALL, 5 );
-
- m_staticline231 = new wxStaticLine( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer160->Add( m_staticline231, 0, wxEXPAND, 5 );
-
- m_buttonClear = new wxButton( m_panelFilterSettings, wxID_ANY, _("C&lear"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer160->Add( m_buttonClear, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 10 );
-
-
- bSizer1591->Add( bSizer160, 0, wxEXPAND, 5 );
-
-
- m_panelFilterSettings->SetSizer( bSizer1591 );
- m_panelFilterSettings->Layout();
- bSizer1591->Fit( m_panelFilterSettings );
- bSizer278->Add( m_panelFilterSettings, 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 ) );
-
- wxBoxSizer* bSizer276;
- bSizer276 = 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_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 );
-
-
- 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 ) );
-
- wxBoxSizer* bSizer232;
- bSizer232 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer237;
- bSizer237 = new wxBoxSizer( wxHORIZONTAL );
-
- 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 );
-
- wxBoxSizer* bSizer236;
- bSizer236 = new wxBoxSizer( wxVERTICAL );
-
- m_toggleBtnTwoWay = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_toggleBtnTwoWay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
-
- bSizer236->Add( m_toggleBtnTwoWay, 0, wxBOTTOM|wxEXPAND, 5 );
-
- m_toggleBtnMirror = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_toggleBtnMirror->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
-
- bSizer236->Add( m_toggleBtnMirror, 0, wxEXPAND|wxBOTTOM, 5 );
-
- m_toggleBtnUpdate = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_toggleBtnUpdate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
-
- bSizer236->Add( m_toggleBtnUpdate, 0, wxEXPAND|wxBOTTOM, 5 );
-
- m_toggleBtnCustom = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_toggleBtnCustom->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
-
- bSizer236->Add( m_toggleBtnCustom, 0, wxEXPAND, 5 );
-
-
- bSizer235->Add( bSizer236, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer237->Add( bSizer235, 0, wxALL, 5 );
-
-
- bSizer237->Add( 10, 0, 0, 0, 5 );
-
- wxBoxSizer* bSizer238;
- bSizer238 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer238->Add( 0, 0, 1, wxEXPAND, 5 );
-
- bSizerSyncDirHolder = new wxBoxSizer( wxHORIZONTAL );
-
- bSizerSyncDirections = new wxBoxSizer( wxVERTICAL );
-
- m_staticTextCategory = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Category"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextCategory->Wrap( -1 );
- bSizerSyncDirections->Add( m_staticTextCategory, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
- 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") );
-
- 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") );
-
- 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") );
-
- 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") );
-
- 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") );
-
- 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") );
-
- 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 );
- 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 );
- 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 );
- 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 );
- 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 );
- 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 );
- ffgSizer11->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 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 );
-
-
- bSizerSyncDirHolder->Add( bSizerSyncDirections, 0, 0, 5 );
-
- bSizerDatabase = new wxWrapSizer( wxVERTICAL );
-
- 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 );
-
- 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_SWISS, wxFONTSTYLE_ITALIC, wxFONTWEIGHT_NORMAL, false, wxT("Arial") ) );
- m_staticText145->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
-
- bSizerDatabase->Add( m_staticText145, 0, wxALIGN_CENTER_HORIZONTAL, 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 ) );
-
- bSizerSyncDirHolder->Add( m_staticTextSyncVarDescription, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 );
-
-
- bSizer238->Add( bSizerSyncDirHolder, 0, wxTOP|wxBOTTOM|wxRIGHT, 10 );
-
-
- 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 );
-
- 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 );
-
- 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") );
-
- bSizer249->Add( m_checkBoxDetectMove, 0, wxALL|wxEXPAND, 5 );
-
- m_hyperlink242 = new wxHyperlinkCtrl( m_panelSyncSettings, wxID_ANY, _("More information"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer249->Add( m_hyperlink242, 0, wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer201->Add( bSizer249, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer238->Add( bSizer201, 0, 0, 5 );
-
-
- bSizer237->Add( bSizer238, 1, 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 );
-
- bSizer2361 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer202;
- bSizer202 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText87 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Delete files:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText87->Wrap( -1 );
- bSizer202->Add( m_staticText87, 0, wxALL, 5 );
-
- wxBoxSizer* bSizer234;
- bSizer234 = new wxBoxSizer( wxVERTICAL );
-
- m_toggleBtnRecycler = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("&Recycle bin"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer234->Add( m_toggleBtnRecycler, 0, wxEXPAND, 5 );
-
- m_toggleBtnPermanent = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("&Permanent"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer234->Add( m_toggleBtnPermanent, 0, wxEXPAND, 5 );
-
- m_toggleBtnVersioning = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("&Versioning"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer234->Add( m_toggleBtnVersioning, 0, wxEXPAND, 5 );
-
-
- bSizer202->Add( bSizer234, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer2361->Add( bSizer202, 0, wxALL, 5 );
-
- bSizerVersioningHolder = new wxBoxSizer( wxVERTICAL );
-
-
- bSizerVersioningHolder->Add( 0, 0, 1, wxEXPAND, 5 );
-
- 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_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 );
-
-
- 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 ) );
-
- wxBoxSizer* bSizer191;
- bSizer191 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer191->Add( 0, 5, 0, 0, 5 );
-
- 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 );
-
- wxBoxSizer* bSizer253;
- bSizer253 = new wxBoxSizer( wxVERTICAL );
-
- 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 ) );
-
- bSizer254->Add( m_staticText155, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
-
- bSizer254->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_hyperlink243 = new wxHyperlinkCtrl( m_panelVersioning, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer254->Add( m_hyperlink243, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
-
-
- bSizer253->Add( bSizer254, 0, wxEXPAND|wxBOTTOM, 5 );
-
- 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_buttonSelectVersioningFolder = new wxButton( m_panelVersioning, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectVersioningFolder->SetToolTip( _("Select a folder") );
-
- bSizer156->Add( m_buttonSelectVersioningFolder, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonSelectVersioningAltFolder = new wxBitmapButton( m_panelVersioning, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonSelectVersioningAltFolder->SetToolTip( _("Access online storage") );
-
- bSizer156->Add( m_bpButtonSelectVersioningAltFolder, 0, wxEXPAND, 5 );
-
-
- bSizer253->Add( bSizer156, 0, wxEXPAND, 5 );
-
-
- bSizer252->Add( bSizer253, 1, wxRIGHT, 5 );
-
-
- bSizer191->Add( bSizer252, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
-
- wxBoxSizer* bSizer198;
- bSizer198 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer255;
- bSizer255 = new wxBoxSizer( wxVERTICAL );
-
- 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 );
-
- 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 );
-
- 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 ) );
-
- 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 ) );
-
- 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 ) );
-
- bSizer257->Add( m_staticTextNamingCvtPart3, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer255->Add( bSizer257, 0, wxBOTTOM|wxRIGHT|wxLEFT, 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 );
-
- 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 );
-
- 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_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_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_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 );
-
-
- bSizer198->Add( bSizer258, 0, wxALL, 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 );
-
-
- bSizerVersioningHolder->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- bSizer2361->Add( bSizerVersioningHolder, 1, wxALIGN_CENTER_VERTICAL, 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 );
-
- bSizerSyncMisc = 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 ) );
-
- wxBoxSizer* bSizer1912;
- bSizer1912 = new wxBoxSizer( wxVERTICAL );
-
- 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|wxRIGHT, 5 );
-
- m_checkBoxSaveLog = new wxCheckBox( m_panelLogfile, wxID_ANY, _("&Override default log path:"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer279->Add( m_checkBoxSaveLog, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_buttonSelectLogFolder = new wxButton( m_panelLogfile, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectLogFolder->SetToolTip( _("Select a folder") );
-
- bSizer279->Add( m_buttonSelectLogFolder, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonSelectAltLogFolder = new wxBitmapButton( m_panelLogfile, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonSelectAltLogFolder->SetToolTip( _("Access online storage") );
-
- bSizer279->Add( m_bpButtonSelectAltLogFolder, 0, wxEXPAND, 5 );
-
-
- bSizer1912->Add( bSizer279, 0, wxEXPAND, 5 );
-
- m_logFolderPath = new fff::FolderHistoryBox( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer1912->Add( m_logFolderPath, 0, wxEXPAND|wxTOP, 5 );
-
-
- m_panelLogfile->SetSizer( bSizer1912 );
- m_panelLogfile->Layout();
- bSizer1912->Fit( m_panelLogfile );
- bSizer2372->Add( m_panelLogfile, 1, 0, 5 );
-
-
- bSizerSyncMisc->Add( bSizer2372, 1, wxALL, 10 );
-
- m_staticline57 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizerSyncMisc->Add( m_staticline57, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer247;
- bSizer247 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer251;
- bSizer251 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText89 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Run a command:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText89->Wrap( -1 );
- bSizer251->Add( m_staticText89, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
-
- bSizer251->Add( 0, 0, 1, 0, 5 );
-
- wxArrayString m_choicePostSyncConditionChoices;
- m_choicePostSyncCondition = new wxChoice( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choicePostSyncConditionChoices, 0 );
- m_choicePostSyncCondition->SetSelection( 0 );
- bSizer251->Add( m_choicePostSyncCondition, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer247->Add( bSizer251, 0, wxEXPAND, 5 );
-
- m_comboBoxPostSyncCommand = new fff::CommandBox( m_panelSyncSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer247->Add( m_comboBoxPostSyncCommand, 0, wxTOP|wxEXPAND, 5 );
-
-
- bSizerSyncMisc->Add( bSizer247, 1, wxALL, 10 );
-
-
- 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_panelSyncSettingsTab->SetSizer( bSizer276 );
- m_panelSyncSettingsTab->Layout();
- bSizer276->Fit( m_panelSyncSettingsTab );
- m_notebook->AddPage( m_panelSyncSettingsTab, _("dummy"), true );
-
- bSizer190->Add( m_notebook, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer7->Add( bSizer190, 1, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- 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 ) );
-
- 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 );
-
-
- bSizer7->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- this->SetSizer( bSizer7 );
- this->Layout();
- bSizer7->Fit( this );
-
- 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_toggleBtnByTimeSize->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnCompByTimeSizeDouble ), NULL, this );
- m_toggleBtnByTimeSize->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnCompByTimeSize ), NULL, this );
- m_toggleBtnByContent->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnCompByContentDouble ), NULL, this );
- m_toggleBtnByContent->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnCompByContent ), NULL, this );
- m_toggleBtnBySize->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnCompBySizeDouble ), NULL, this );
- m_toggleBtnBySize->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnCompBySize ), NULL, this );
- m_checkBoxSymlinksInclude->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeCompOption ), NULL, this );
- m_hyperlink24->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpComparisonSettings ), NULL, this );
- m_textCtrlTimeShift->Connect( wxEVT_KEY_DOWN, wxKeyEventHandler( ConfigDlgGenerated::onlTimeShiftKeyDown ), NULL, this );
- m_hyperlink241->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpTimeShift ), 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_hyperlink1711->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpPerformance ), NULL, this );
- m_textCtrlInclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeFilterOption ), NULL, this );
- m_hyperlink171->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpShowExamples ), 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_buttonClear->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnFilterReset ), NULL, this );
- m_checkBoxUseLocalSyncOptions->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleLocalSyncSettings ), NULL, this );
- m_toggleBtnTwoWay->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnSyncTwoWayDouble ), NULL, this );
- m_toggleBtnTwoWay->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnSyncTwoWay ), NULL, this );
- m_toggleBtnMirror->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnSyncMirrorDouble ), NULL, this );
- m_toggleBtnMirror->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnSyncMirror ), NULL, this );
- m_toggleBtnUpdate->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnSyncUpdateDouble ), NULL, this );
- m_toggleBtnUpdate->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnSyncUpdate ), NULL, this );
- m_toggleBtnCustom->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnSyncCustomDouble ), NULL, this );
- m_toggleBtnCustom->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnSyncCustom ), 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_hyperlink242->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpDetectMovedFiles ), NULL, this );
- m_toggleBtnRecycler->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnDeletionRecycler ), NULL, this );
- m_toggleBtnPermanent->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnDeletionPermanent ), NULL, this );
- m_toggleBtnVersioning->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnDeletionVersioning ), NULL, this );
- m_hyperlink243->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpVersioning ), 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_checkBoxSaveLog->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleSaveLogfile ), 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 );
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer7;
+ bSizer7 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer190;
+ bSizer190 = new wxBoxSizer( wxHORIZONTAL );
+
+ 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_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|wxLEFT, 5 );
+
+ m_notebook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ 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 );
+
+ 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_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 );
+
+ 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 );
+
+ 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* bSizer159;
+ bSizer159 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer178;
+ bSizer178 = new wxBoxSizer( wxHORIZONTAL );
+
+ 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 );
+
+ wxBoxSizer* bSizer2381;
+ bSizer2381 = new wxBoxSizer( wxVERTICAL );
+
+ m_toggleBtnByTimeSize = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File time and size"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ m_toggleBtnByTimeSize->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
+
+ bSizer2381->Add( m_toggleBtnByTimeSize, 0, wxEXPAND|wxBOTTOM, 5 );
+
+ m_toggleBtnByContent = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ m_toggleBtnByContent->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
+
+ bSizer2381->Add( m_toggleBtnByContent, 0, wxEXPAND|wxBOTTOM, 5 );
+
+ m_toggleBtnBySize = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File size"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ m_toggleBtnBySize->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
+
+ bSizer2381->Add( m_toggleBtnBySize, 0, wxEXPAND, 5 );
+
+
+ bSizer182->Add( bSizer2381, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer178->Add( bSizer182, 0, wxALL, 5 );
+
+ 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_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 );
+
+
+ bSizer178->Add( bSizer2371, 0, wxALIGN_CENTER_VERTICAL|wxALL, 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 );
+
+ wxBoxSizer* bSizer1734;
+ bSizer1734 = new wxBoxSizer( wxHORIZONTAL );
+
+ 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 );
+
+ wxBoxSizer* bSizer176;
+ bSizer176 = new wxBoxSizer( wxVERTICAL );
+
+ m_radioBtnSymlinksFollow = new wxRadioButton( m_panelComparisonSettings, wxID_ANY, _("&Follow"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_radioBtnSymlinksFollow->SetValue( true );
+ bSizer176->Add( m_radioBtnSymlinksFollow, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ m_radioBtnSymlinksDirect = new wxRadioButton( m_panelComparisonSettings, wxID_ANY, _("&Direct"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer176->Add( m_radioBtnSymlinksDirect, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer1721->Add( bSizer176, 0, wxLEFT|wxEXPAND, 18 );
+
+
+ bSizer1721->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_hyperlink24 = new wxHyperlinkCtrl( m_panelComparisonSettings, wxID_ANY, _("More information"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer1721->Add( m_hyperlink24, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer1734->Add( bSizer1721, 0, wxALL|wxEXPAND, 5 );
+
+ m_staticline44 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer1734->Add( m_staticline44, 0, wxEXPAND, 5 );
+
+ 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_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, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ 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 ) );
+
+ 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 ) );
+
+ bSizer197->Add( m_staticText13811, 0, wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer1733->Add( bSizer197, 0, 0, 5 );
+
+
+ bSizer1733->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_hyperlink241 = new wxHyperlinkCtrl( m_panelComparisonSettings, wxID_ANY, _("Handle daylight saving time"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer1733->Add( m_hyperlink241, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer1734->Add( bSizer1733, 0, wxALL|wxEXPAND, 5 );
+
+ m_staticline441 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer1734->Add( m_staticline441, 0, wxEXPAND, 5 );
+
+
+ bSizer159->Add( bSizer1734, 0, 0, 5 );
+
+ m_staticline331 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer159->Add( m_staticline331, 0, wxEXPAND, 5 );
+
+ bSizerCompMisc = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer2781;
+ bSizer2781 = new wxBoxSizer( wxHORIZONTAL );
+
+ 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_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_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 );
+
+ 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_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_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 );
+
+
+ bSizerCompMisc->Add( bSizer2781, 0, wxEXPAND, 5 );
+
+ m_staticline3311 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizerCompMisc->Add( m_staticline3311, 0, wxEXPAND, 5 );
+
+
+ bSizer159->Add( bSizerCompMisc, 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 );
+
+ bSizerPerformance = new wxBoxSizer( wxVERTICAL );
+
+ m_staticTextPerfDeRequired = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("Requires FreeFileSync Donation Edition"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextPerfDeRequired->Wrap( -1 );
+ bSizerPerformance->Add( m_staticTextPerfDeRequired, 0, wxALL, 5 );
+
+ m_staticlinePerfDeRequired = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizerPerformance->Add( m_staticlinePerfDeRequired, 0, wxEXPAND, 5 );
+
+ m_panelPerfHeader = new wxPanel( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelPerfHeader->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer2191;
+ bSizer2191 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapPerf = new wxStaticBitmap( m_panelPerfHeader, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer2191->Add( m_bitmapPerf, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_staticText13611 = new wxStaticText( m_panelPerfHeader, wxID_ANY, _("Performance improvements:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText13611->Wrap( -1 );
+ bSizer2191->Add( m_staticText13611, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 );
+
+
+ m_panelPerfHeader->SetSizer( bSizer2191 );
+ m_panelPerfHeader->Layout();
+ bSizer2191->Fit( m_panelPerfHeader );
+ bSizerPerformance->Add( m_panelPerfHeader, 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 );
+
+ 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_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 );
+
+
+ m_scrolledWindowPerf->SetSizer( fgSizerPerf );
+ m_scrolledWindowPerf->Layout();
+ fgSizerPerf->Fit( m_scrolledWindowPerf );
+ bSizer260->Add( m_scrolledWindowPerf, 1, wxALL|wxEXPAND, 5 );
+
+ m_hyperlink1711 = new wxHyperlinkCtrl( m_panelComparisonSettings, wxID_ANY, _("How to get best performance?"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer260->Add( m_hyperlink1711, 0, wxALL, 5 );
+
+
+ bSizerPerformance->Add( bSizer260, 1, wxALL|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_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 );
+
+ 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_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 );
+
+
+ bSizer278->Add( bSizerHeaderFilterSettings, 0, wxEXPAND, 5 );
+
+ m_panelFilterSettings = new wxPanel( m_panelFilterSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelFilterSettings->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer1591;
+ bSizer1591 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer166;
+ bSizer166 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer166->Add( 0, 10, 0, 0, 5 );
+
+ wxBoxSizer* bSizer1661;
+ bSizer1661 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapInclude = new wxStaticBitmap( m_panelFilterSettings, 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 );
+
+ m_staticText78 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("Include:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText78->Wrap( -1 );
+ bSizer1731->Add( m_staticText78, 0, 0, 5 );
+
+ m_textCtrlInclude = new wxTextCtrl( m_panelFilterSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxTE_MULTILINE );
+ bSizer1731->Add( m_textCtrlInclude, 1, wxEXPAND|wxTOP, 5 );
+
+
+ bSizer1661->Add( bSizer1731, 1, wxEXPAND, 5 );
+
+
+ bSizer166->Add( bSizer1661, 3, wxEXPAND|wxLEFT, 5 );
+
+
+ bSizer166->Add( 0, 10, 0, 0, 5 );
+
+ wxBoxSizer* bSizer1651;
+ bSizer1651 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapExclude = new wxStaticBitmap( m_panelFilterSettings, 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* bSizer189;
+ bSizer189 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText77 = new wxStaticText( m_panelFilterSettings, 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 );
+
+ m_hyperlink171 = new wxHyperlinkCtrl( m_panelFilterSettings, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer189->Add( m_hyperlink171, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer1742->Add( bSizer189, 0, wxEXPAND, 5 );
+
+ m_textCtrlExclude = new wxTextCtrl( m_panelFilterSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxTE_MULTILINE );
+ bSizer1742->Add( m_textCtrlExclude, 1, wxEXPAND|wxTOP, 5 );
+
+
+ bSizer1651->Add( bSizer1742, 1, wxEXPAND, 5 );
+
+
+ bSizer166->Add( bSizer1651, 5, wxEXPAND|wxLEFT, 5 );
+
+ m_staticTextFilterDescr = new wxStaticText( m_panelFilterSettings, 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 ) );
+
+ bSizer166->Add( m_staticTextFilterDescr, 0, wxALL, 10 );
+
+
+ bSizer1591->Add( bSizer166, 1, wxEXPAND, 5 );
+
+ m_staticline24 = new wxStaticLine( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer1591->Add( m_staticline24, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer160;
+ bSizer160 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer168;
+ bSizer168 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapFilterSize = new wxStaticBitmap( m_panelFilterSettings, 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 );
+
+ m_staticText80 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("File size:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText80->Wrap( -1 );
+ bSizer158->Add( m_staticText80, 0, wxBOTTOM, 5 );
+
+ wxBoxSizer* bSizer162;
+ bSizer162 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText101 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("Minimum:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText101->Wrap( -1 );
+ bSizer162->Add( m_staticText101, 0, wxBOTTOM, 2 );
+
+ m_spinCtrlMinSize = new wxSpinCtrl( m_panelFilterSettings, 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_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMinSizeChoices, 0 );
+ m_choiceUnitMinSize->SetSelection( 0 );
+ bSizer162->Add( m_choiceUnitMinSize, 0, wxEXPAND, 5 );
+
+
+ bSizer158->Add( bSizer162, 0, wxBOTTOM|wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer163;
+ bSizer163 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText102 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("Maximum:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText102->Wrap( -1 );
+ bSizer163->Add( m_staticText102, 0, wxBOTTOM, 2 );
+
+ m_spinCtrlMaxSize = new wxSpinCtrl( m_panelFilterSettings, 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_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMaxSizeChoices, 0 );
+ m_choiceUnitMaxSize->SetSelection( 0 );
+ bSizer163->Add( m_choiceUnitMaxSize, 0, wxEXPAND, 5 );
+
+
+ bSizer158->Add( bSizer163, 0, wxEXPAND, 5 );
+
+
+ bSizer168->Add( bSizer158, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer160->Add( bSizer168, 2, wxEXPAND|wxALL, 5 );
+
+ m_staticline23 = new wxStaticLine( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer160->Add( m_staticline23, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer167;
+ bSizer167 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapFilterDate = new wxStaticBitmap( m_panelFilterSettings, 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 );
+
+ m_staticText79 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("Time span:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText79->Wrap( -1 );
+ bSizer165->Add( m_staticText79, 0, wxBOTTOM, 5 );
+
+ m_spinCtrlTimespan = new wxSpinCtrl( m_panelFilterSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 );
+ bSizer165->Add( m_spinCtrlTimespan, 0, wxEXPAND, 5 );
+
+ wxArrayString m_choiceUnitTimespanChoices;
+ m_choiceUnitTimespan = new wxChoice( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitTimespanChoices, 0 );
+ m_choiceUnitTimespan->SetSelection( 0 );
+ bSizer165->Add( m_choiceUnitTimespan, 0, wxEXPAND, 5 );
+
+
+ bSizer167->Add( bSizer165, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer160->Add( bSizer167, 1, wxEXPAND|wxALL, 5 );
+
+ m_staticline231 = new wxStaticLine( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer160->Add( m_staticline231, 0, wxEXPAND, 5 );
+
+ m_buttonClear = new wxButton( m_panelFilterSettings, wxID_ANY, _("C&lear"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ bSizer160->Add( m_buttonClear, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 10 );
+
+
+ bSizer1591->Add( bSizer160, 0, wxEXPAND, 5 );
+
+
+ m_panelFilterSettings->SetSizer( bSizer1591 );
+ m_panelFilterSettings->Layout();
+ bSizer1591->Fit( m_panelFilterSettings );
+ bSizer278->Add( m_panelFilterSettings, 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 ) );
+
+ wxBoxSizer* bSizer276;
+ bSizer276 = 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_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 );
+
+
+ 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 ) );
+
+ wxBoxSizer* bSizer232;
+ bSizer232 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer237;
+ bSizer237 = new wxBoxSizer( wxHORIZONTAL );
+
+ 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 );
+
+ wxBoxSizer* bSizer236;
+ bSizer236 = new wxBoxSizer( wxVERTICAL );
+
+ m_toggleBtnTwoWay = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ m_toggleBtnTwoWay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
+
+ bSizer236->Add( m_toggleBtnTwoWay, 0, wxBOTTOM|wxEXPAND, 5 );
+
+ m_toggleBtnMirror = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ m_toggleBtnMirror->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
+
+ bSizer236->Add( m_toggleBtnMirror, 0, wxEXPAND|wxBOTTOM, 5 );
+
+ m_toggleBtnUpdate = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ m_toggleBtnUpdate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
+
+ bSizer236->Add( m_toggleBtnUpdate, 0, wxEXPAND|wxBOTTOM, 5 );
+
+ m_toggleBtnCustom = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ m_toggleBtnCustom->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
+
+ bSizer236->Add( m_toggleBtnCustom, 0, wxEXPAND, 5 );
+
+
+ bSizer235->Add( bSizer236, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer237->Add( bSizer235, 0, wxALL, 5 );
+
+
+ bSizer237->Add( 10, 0, 0, 0, 5 );
+
+ wxBoxSizer* bSizer238;
+ bSizer238 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer238->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ bSizerSyncDirHolder = new wxBoxSizer( wxHORIZONTAL );
+
+ bSizerSyncDirections = new wxBoxSizer( wxVERTICAL );
+
+ m_staticTextCategory = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Category"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextCategory->Wrap( -1 );
+ bSizerSyncDirections->Add( m_staticTextCategory, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ 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") );
+
+ 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") );
+
+ 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") );
+
+ 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") );
+
+ 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") );
+
+ 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") );
+
+ 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 );
+ 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 );
+ 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 );
+ 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 );
+ 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 );
+ 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 );
+ ffgSizer11->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 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 );
+
+
+ bSizerSyncDirHolder->Add( bSizerSyncDirections, 0, 0, 5 );
+
+ bSizerDatabase = new wxWrapSizer( wxVERTICAL );
+
+ 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 );
+
+ 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_SWISS, wxFONTSTYLE_ITALIC, wxFONTWEIGHT_NORMAL, false, wxT("Arial") ) );
+ m_staticText145->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
+
+ bSizerDatabase->Add( m_staticText145, 0, wxALIGN_CENTER_HORIZONTAL, 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 ) );
+
+ bSizerSyncDirHolder->Add( m_staticTextSyncVarDescription, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 );
+
+
+ bSizer238->Add( bSizerSyncDirHolder, 0, wxTOP|wxBOTTOM|wxRIGHT, 10 );
+
+
+ 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 );
+
+ 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 );
+
+ 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") );
+
+ bSizer249->Add( m_checkBoxDetectMove, 0, wxALL|wxEXPAND, 5 );
+
+ m_hyperlink242 = new wxHyperlinkCtrl( m_panelSyncSettings, wxID_ANY, _("More information"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer249->Add( m_hyperlink242, 0, wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer201->Add( bSizer249, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer238->Add( bSizer201, 0, 0, 5 );
+
+
+ bSizer237->Add( bSizer238, 1, 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 );
+
+ bSizer2361 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer202;
+ bSizer202 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText87 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Delete files:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText87->Wrap( -1 );
+ bSizer202->Add( m_staticText87, 0, wxALL, 5 );
+
+ wxBoxSizer* bSizer234;
+ bSizer234 = new wxBoxSizer( wxVERTICAL );
+
+ m_toggleBtnRecycler = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("&Recycle bin"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ bSizer234->Add( m_toggleBtnRecycler, 0, wxEXPAND, 5 );
+
+ m_toggleBtnPermanent = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("&Permanent"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ bSizer234->Add( m_toggleBtnPermanent, 0, wxEXPAND, 5 );
+
+ m_toggleBtnVersioning = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("&Versioning"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ bSizer234->Add( m_toggleBtnVersioning, 0, wxEXPAND, 5 );
+
+
+ bSizer202->Add( bSizer234, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer2361->Add( bSizer202, 0, wxALL, 5 );
+
+ bSizerVersioningHolder = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizerVersioningHolder->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ 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_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 );
+
+
+ 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 ) );
+
+ wxBoxSizer* bSizer191;
+ bSizer191 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer191->Add( 0, 5, 0, 0, 5 );
+
+ 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 );
+
+ wxBoxSizer* bSizer253;
+ bSizer253 = new wxBoxSizer( wxVERTICAL );
+
+ 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 ) );
+
+ bSizer254->Add( m_staticText155, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+
+ bSizer254->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_hyperlink243 = new wxHyperlinkCtrl( m_panelVersioning, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer254->Add( m_hyperlink243, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
+
+
+ bSizer253->Add( bSizer254, 0, wxEXPAND|wxBOTTOM, 5 );
+
+ 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_buttonSelectVersioningFolder = new wxButton( m_panelVersioning, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectVersioningFolder->SetToolTip( _("Select a folder") );
+
+ bSizer156->Add( m_buttonSelectVersioningFolder, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonSelectVersioningAltFolder = new wxBitmapButton( m_panelVersioning, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectVersioningAltFolder->SetToolTip( _("Access online storage") );
+
+ bSizer156->Add( m_bpButtonSelectVersioningAltFolder, 0, wxEXPAND, 5 );
+
+
+ bSizer253->Add( bSizer156, 0, wxEXPAND, 5 );
+
+
+ bSizer252->Add( bSizer253, 1, wxRIGHT, 5 );
+
+
+ bSizer191->Add( bSizer252, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer198;
+ bSizer198 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer255;
+ bSizer255 = new wxBoxSizer( wxVERTICAL );
+
+ 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 );
+
+ 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 );
+
+ 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 ) );
+
+ 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 ) );
+
+ 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 ) );
+
+ bSizer257->Add( m_staticTextNamingCvtPart3, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer255->Add( bSizer257, 0, wxBOTTOM|wxRIGHT|wxLEFT, 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 );
+
+ 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 );
+
+ 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_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_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_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 );
+
+
+ bSizer198->Add( bSizer258, 0, wxALL, 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 );
+
+
+ bSizerVersioningHolder->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ bSizer2361->Add( bSizerVersioningHolder, 1, wxALIGN_CENTER_VERTICAL, 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 );
+
+ bSizerSyncMisc = 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 ) );
+
+ wxBoxSizer* bSizer1912;
+ bSizer1912 = new wxBoxSizer( wxVERTICAL );
+
+ 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|wxRIGHT, 5 );
+
+ m_checkBoxSaveLog = new wxCheckBox( m_panelLogfile, wxID_ANY, _("&Override default log path:"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer279->Add( m_checkBoxSaveLog, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_buttonSelectLogFolder = new wxButton( m_panelLogfile, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectLogFolder->SetToolTip( _("Select a folder") );
+
+ bSizer279->Add( m_buttonSelectLogFolder, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonSelectAltLogFolder = new wxBitmapButton( m_panelLogfile, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectAltLogFolder->SetToolTip( _("Access online storage") );
+
+ bSizer279->Add( m_bpButtonSelectAltLogFolder, 0, wxEXPAND, 5 );
+
+
+ bSizer1912->Add( bSizer279, 0, wxEXPAND, 5 );
+
+ m_logFolderPath = new fff::FolderHistoryBox( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizer1912->Add( m_logFolderPath, 0, wxEXPAND|wxTOP, 5 );
+
+
+ m_panelLogfile->SetSizer( bSizer1912 );
+ m_panelLogfile->Layout();
+ bSizer1912->Fit( m_panelLogfile );
+ bSizer2372->Add( m_panelLogfile, 1, 0, 5 );
+
+
+ bSizerSyncMisc->Add( bSizer2372, 1, wxALL, 10 );
+
+ m_staticline57 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizerSyncMisc->Add( m_staticline57, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer247;
+ bSizer247 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer251;
+ bSizer251 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText89 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Run a command:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText89->Wrap( -1 );
+ bSizer251->Add( m_staticText89, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+
+ bSizer251->Add( 0, 0, 1, 0, 5 );
+
+ wxArrayString m_choicePostSyncConditionChoices;
+ m_choicePostSyncCondition = new wxChoice( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choicePostSyncConditionChoices, 0 );
+ m_choicePostSyncCondition->SetSelection( 0 );
+ bSizer251->Add( m_choicePostSyncCondition, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer247->Add( bSizer251, 0, wxEXPAND, 5 );
+
+ m_comboBoxPostSyncCommand = new fff::CommandBox( m_panelSyncSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizer247->Add( m_comboBoxPostSyncCommand, 0, wxTOP|wxEXPAND, 5 );
+
+
+ bSizerSyncMisc->Add( bSizer247, 1, wxALL, 10 );
+
+
+ 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_panelSyncSettingsTab->SetSizer( bSizer276 );
+ m_panelSyncSettingsTab->Layout();
+ bSizer276->Fit( m_panelSyncSettingsTab );
+ m_notebook->AddPage( m_panelSyncSettingsTab, _("dummy"), false );
+
+ bSizer190->Add( m_notebook, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer7->Add( bSizer190, 1, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ 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 ) );
+
+ 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 );
+
+
+ bSizer7->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ this->SetSizer( bSizer7 );
+ this->Layout();
+ bSizer7->Fit( this );
+
+ 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_toggleBtnByTimeSize->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnCompByTimeSizeDouble ), NULL, this );
+ m_toggleBtnByTimeSize->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnCompByTimeSize ), NULL, this );
+ m_toggleBtnByContent->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnCompByContentDouble ), NULL, this );
+ m_toggleBtnByContent->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnCompByContent ), NULL, this );
+ m_toggleBtnBySize->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnCompBySizeDouble ), NULL, this );
+ m_toggleBtnBySize->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnCompBySize ), NULL, this );
+ m_checkBoxSymlinksInclude->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeCompOption ), NULL, this );
+ m_hyperlink24->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpComparisonSettings ), NULL, this );
+ m_textCtrlTimeShift->Connect( wxEVT_KEY_DOWN, wxKeyEventHandler( ConfigDlgGenerated::onlTimeShiftKeyDown ), NULL, this );
+ m_hyperlink241->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpTimeShift ), 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_hyperlink1711->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpPerformance ), NULL, this );
+ m_textCtrlInclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeFilterOption ), NULL, this );
+ m_hyperlink171->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpShowExamples ), 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_buttonClear->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnFilterReset ), NULL, this );
+ m_checkBoxUseLocalSyncOptions->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleLocalSyncSettings ), NULL, this );
+ m_toggleBtnTwoWay->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnSyncTwoWayDouble ), NULL, this );
+ m_toggleBtnTwoWay->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnSyncTwoWay ), NULL, this );
+ m_toggleBtnMirror->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnSyncMirrorDouble ), NULL, this );
+ m_toggleBtnMirror->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnSyncMirror ), NULL, this );
+ m_toggleBtnUpdate->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnSyncUpdateDouble ), NULL, this );
+ m_toggleBtnUpdate->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnSyncUpdate ), NULL, this );
+ m_toggleBtnCustom->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnSyncCustomDouble ), NULL, this );
+ m_toggleBtnCustom->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnSyncCustom ), 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_hyperlink242->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpDetectMovedFiles ), NULL, this );
+ m_toggleBtnRecycler->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnDeletionRecycler ), NULL, this );
+ m_toggleBtnPermanent->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnDeletionPermanent ), NULL, this );
+ m_toggleBtnVersioning->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnDeletionVersioning ), NULL, this );
+ m_hyperlink243->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpVersioning ), 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_checkBoxSaveLog->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleSaveLogfile ), 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()
@@ -2438,500 +2438,500 @@ 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 ) );
-
- wxBoxSizer* bSizer134;
- bSizer134 = new wxBoxSizer( wxVERTICAL );
-
- 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 );
-
- 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 );
-
- 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 ) );
-
- 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 ) );
-
- 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 ) );
-
- bSizer231->Add( m_toggleBtnFtp, 0, wxALL|wxEXPAND, 5 );
-
-
- bSizer272->Add( bSizer231, 0, 0, 5 );
-
-
- bSizer72->Add( bSizer272, 0, wxALL, 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_panel41 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panel41->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer185;
- bSizer185 = new wxBoxSizer( wxVERTICAL );
-
- bSizerGdrive = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer284;
- bSizer284 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer285;
- bSizer285 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText166 = new wxStaticText( m_panel41, wxID_ANY, _("Connected user accounts:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText166->Wrap( -1 );
- bSizer285->Add( m_staticText166, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
-
- m_listBoxGdriveUsers = new wxListBox( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_NEEDED_SB|wxLB_SINGLE|wxLB_SORT );
- bSizer285->Add( m_listBoxGdriveUsers, 1, wxTOP|wxBOTTOM|wxLEFT|wxEXPAND, 5 );
-
-
- bSizer284->Add( bSizer285, 0, wxEXPAND|wxTOP|wxBOTTOM|wxLEFT, 5 );
-
- wxBoxSizer* bSizer286;
- bSizer286 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer289;
- bSizer289 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer288;
- bSizer288 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText167 = new wxStaticText( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText167->Wrap( -1 );
- bSizer288->Add( m_staticText167, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
-
- m_buttonGdriveAddUser = new zen::BitmapTextButton( m_panel41, wxID_ANY, _("&Add connection"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer288->Add( m_buttonGdriveAddUser, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
-
- m_buttonGdriveRemoveUser = new zen::BitmapTextButton( m_panel41, wxID_ANY, _("&Disconnect"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer288->Add( m_buttonGdriveRemoveUser, 0, wxEXPAND|wxALL, 5 );
-
-
- bSizer289->Add( bSizer288, 0, wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
- m_staticline76 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer289->Add( m_staticline76, 0, wxEXPAND, 5 );
-
-
- bSizer286->Add( bSizer289, 0, 0, 5 );
-
- m_staticline74 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer286->Add( m_staticline74, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer287;
- bSizer287 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText165 = new wxStaticText( m_panel41, wxID_ANY, _("Selected user account:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText165->Wrap( -1 );
- bSizer287->Add( m_staticText165, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
-
- wxBoxSizer* bSizer279;
- bSizer279 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapGdriveSelectedUser = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizer279->Add( m_bitmapGdriveSelectedUser, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
-
- m_staticTextGdriveUser = new wxStaticText( m_panel41, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextGdriveUser->Wrap( -1 );
- bSizer279->Add( m_staticTextGdriveUser, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer287->Add( bSizer279, 0, 0, 5 );
-
-
- bSizer286->Add( bSizer287, 0, wxALL, 5 );
-
-
- bSizer284->Add( bSizer286, 1, 0, 5 );
-
-
- bSizerGdrive->Add( bSizer284, 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, 0, wxEXPAND, 5 );
-
- bSizerServer = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer276;
- bSizer276 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapServer = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizer276->Add( m_bitmapServer, 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_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 );
-
-
- 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 );
-
-
- bSizer185->Add( bSizerServer, 0, wxEXPAND, 5 );
-
- bSizerAuth = new wxBoxSizer( wxVERTICAL );
-
- bSizerAuthInner = new wxBoxSizer( wxHORIZONTAL );
-
- bSizerFtpEncrypt = new wxBoxSizer( wxHORIZONTAL );
-
- 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_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 );
-
-
- 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 );
-
-
- bSizerAuthInner->Add( bSizerFtpEncrypt, 0, wxEXPAND, 5 );
-
- bSizerSftpAuth = new wxBoxSizer( wxHORIZONTAL );
-
- 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_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_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 );
-
- 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 );
-
- 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 );
-
- 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, _("User name:"), 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_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 );
-
- 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") );
-
- bSizerKeyFile->Add( m_buttonSelectKeyfile, 0, wxALIGN_CENTER_VERTICAL, 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 );
-
- 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_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 );
-
-
- fgSizer161->Add( bSizerPassword, 0, wxALIGN_CENTER_VERTICAL|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 );
-
-
- 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 );
-
-
- bSizer185->Add( bSizerAuth, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer269;
- bSizer269 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer270;
- bSizer270 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer275;
- bSizer275 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapServerDir = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizer275->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 );
- bSizer275->Add( m_staticText1232, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer270->Add( bSizer275, 1, wxALIGN_BOTTOM|wxTOP|wxRIGHT, 5 );
-
- bSizerAccessTimeout = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticline72 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizerAccessTimeout->Add( m_staticline72, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer273;
- bSizer273 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticTextTimeout = new wxStaticText( m_panel41, wxID_ANY, _("Access timeout (in seconds):"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextTimeout->Wrap( -1 );
- bSizer273->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 );
- bSizer273->Add( m_spinCtrlTimeout, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerAccessTimeout->Add( bSizer273, 0, wxALL, 5 );
-
-
- bSizer270->Add( bSizerAccessTimeout, 0, 0, 5 );
-
-
- bSizer269->Add( bSizer270, 0, wxEXPAND|wxLEFT, 5 );
-
- 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|wxBOTTOM|wxLEFT, 5 );
-
- m_buttonSelectFolder = new wxButton( m_panel41, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectFolder->SetToolTip( _("Select a folder") );
-
- bSizer217->Add( m_buttonSelectFolder, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer269->Add( bSizer217, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer185->Add( bSizer269, 0, wxEXPAND, 5 );
-
-
- m_panel41->SetSizer( bSizer185 );
- m_panel41->Layout();
- bSizer185->Fit( m_panel41 );
- bSizer134->Add( m_panel41, 0, wxEXPAND, 5 );
-
- bSizer255 = new wxBoxSizer( wxVERTICAL );
-
- m_staticline571 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer255->Add( m_staticline571, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer219;
- bSizer219 = new wxBoxSizer( wxHORIZONTAL );
-
-
- 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_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 );
-
- m_hyperlink171 = new wxHyperlinkCtrl( this, wxID_ANY, _("How to get best performance?"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer219->Add( m_hyperlink171, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 );
-
-
- bSizer255->Add( bSizer219, 0, wxEXPAND, 5 );
-
- m_staticline57 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer255->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 ) );
-
- wxBoxSizer* bSizer1851;
- bSizer1851 = new wxBoxSizer( wxVERTICAL );
-
- wxFlexGridSizer* fgSizer1611;
- fgSizer1611 = new wxFlexGridSizer( 0, 3, 0, 0 );
- fgSizer1611->AddGrowableCol( 1 );
- fgSizer1611->SetFlexibleDirection( wxBOTH );
- fgSizer1611->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-
- 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_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 );
-
- m_spinCtrlConnectionCount = new wxSpinCtrl( m_panel411, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
- fgSizer1611->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 ) );
-
- fgSizer1611->Add( m_staticTextConnectionCountDescr, 0, wxALIGN_CENTER_VERTICAL|wxALL, 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_spinCtrlChannelCountSftp = new wxSpinCtrl( m_panel411, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
- fgSizer1611->Add( m_spinCtrlChannelCountSftp, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_buttonChannelCountSftp = new wxButton( m_panel411, wxID_ANY, _("Detect server limit"), wxDefaultPosition, wxDefaultSize, 0 );
- fgSizer1611->Add( m_buttonChannelCountSftp, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
-
- bSizer1851->Add( fgSizer1611, 0, wxALL, 5 );
-
-
- m_panel411->SetSizer( bSizer1851 );
- m_panel411->Layout();
- bSizer1851->Fit( m_panel411 );
- bSizer255->Add( m_panel411, 1, wxEXPAND, 5 );
-
-
- bSizer134->Add( bSizer255, 1, wxEXPAND, 5 );
-
- m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer134->Add( m_staticline12, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- 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 ) );
-
- 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 );
-
-
- bSizer134->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- this->SetSizer( bSizer134 );
- this->Layout();
- bSizer134->Fit( this );
-
- 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_checkBoxShowPassword->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::OnToggleShowPassword ), NULL, this );
- m_buttonSelectFolder->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::OnBrowseCloudFolder ), NULL, this );
- m_hyperlink171->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( CloudSetupDlgGenerated::OnHelpFtpPerformance ), 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 );
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer134;
+ bSizer134 = new wxBoxSizer( wxVERTICAL );
+
+ 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 );
+
+ 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 );
+
+ 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 ) );
+
+ 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 ) );
+
+ 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 ) );
+
+ bSizer231->Add( m_toggleBtnFtp, 0, wxALL|wxEXPAND, 5 );
+
+
+ bSizer272->Add( bSizer231, 0, 0, 5 );
+
+
+ bSizer72->Add( bSizer272, 0, wxALL, 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_panel41 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel41->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer185;
+ bSizer185 = new wxBoxSizer( wxVERTICAL );
+
+ bSizerGdrive = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer284;
+ bSizer284 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer285;
+ bSizer285 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText166 = new wxStaticText( m_panel41, wxID_ANY, _("Connected user accounts:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText166->Wrap( -1 );
+ bSizer285->Add( m_staticText166, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ m_listBoxGdriveUsers = new wxListBox( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_NEEDED_SB|wxLB_SINGLE|wxLB_SORT );
+ bSizer285->Add( m_listBoxGdriveUsers, 1, wxTOP|wxBOTTOM|wxLEFT|wxEXPAND, 5 );
+
+
+ bSizer284->Add( bSizer285, 0, wxEXPAND|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer286;
+ bSizer286 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer289;
+ bSizer289 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer288;
+ bSizer288 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText167 = new wxStaticText( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText167->Wrap( -1 );
+ bSizer288->Add( m_staticText167, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ m_buttonGdriveAddUser = new zen::BitmapTextButton( m_panel41, wxID_ANY, _("&Add connection"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ bSizer288->Add( m_buttonGdriveAddUser, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ m_buttonGdriveRemoveUser = new zen::BitmapTextButton( m_panel41, wxID_ANY, _("&Disconnect"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ bSizer288->Add( m_buttonGdriveRemoveUser, 0, wxEXPAND|wxALL, 5 );
+
+
+ bSizer289->Add( bSizer288, 0, wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+ m_staticline76 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer289->Add( m_staticline76, 0, wxEXPAND, 5 );
+
+
+ bSizer286->Add( bSizer289, 0, 0, 5 );
+
+ m_staticline74 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer286->Add( m_staticline74, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer287;
+ bSizer287 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText165 = new wxStaticText( m_panel41, wxID_ANY, _("Selected user account:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText165->Wrap( -1 );
+ bSizer287->Add( m_staticText165, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer279;
+ bSizer279 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapGdriveSelectedUser = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer279->Add( m_bitmapGdriveSelectedUser, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ m_staticTextGdriveUser = new wxStaticText( m_panel41, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextGdriveUser->Wrap( -1 );
+ bSizer279->Add( m_staticTextGdriveUser, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer287->Add( bSizer279, 0, 0, 5 );
+
+
+ bSizer286->Add( bSizer287, 0, wxALL, 5 );
+
+
+ bSizer284->Add( bSizer286, 1, 0, 5 );
+
+
+ bSizerGdrive->Add( bSizer284, 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, 0, wxEXPAND, 5 );
+
+ bSizerServer = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer276;
+ bSizer276 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapServer = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer276->Add( m_bitmapServer, 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_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 );
+
+
+ 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 );
+
+
+ bSizer185->Add( bSizerServer, 0, wxEXPAND, 5 );
+
+ bSizerAuth = new wxBoxSizer( wxVERTICAL );
+
+ bSizerAuthInner = new wxBoxSizer( wxHORIZONTAL );
+
+ bSizerFtpEncrypt = new wxBoxSizer( wxHORIZONTAL );
+
+ 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_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 );
+
+
+ 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 );
+
+
+ bSizerAuthInner->Add( bSizerFtpEncrypt, 0, wxEXPAND, 5 );
+
+ bSizerSftpAuth = new wxBoxSizer( wxHORIZONTAL );
+
+ 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_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_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 );
+
+ 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 );
+
+ 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 );
+
+ 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, _("User name:"), 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_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 );
+
+ 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") );
+
+ bSizerKeyFile->Add( m_buttonSelectKeyfile, 0, wxALIGN_CENTER_VERTICAL, 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 );
+
+ 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_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 );
+
+
+ fgSizer161->Add( bSizerPassword, 0, wxALIGN_CENTER_VERTICAL|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 );
+
+
+ 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 );
+
+
+ bSizer185->Add( bSizerAuth, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer269;
+ bSizer269 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer270;
+ bSizer270 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer275;
+ bSizer275 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapServerDir = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer275->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 );
+ bSizer275->Add( m_staticText1232, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer270->Add( bSizer275, 1, wxALIGN_BOTTOM|wxTOP|wxRIGHT, 5 );
+
+ bSizerAccessTimeout = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticline72 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizerAccessTimeout->Add( m_staticline72, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer273;
+ bSizer273 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticTextTimeout = new wxStaticText( m_panel41, wxID_ANY, _("Access timeout (in seconds):"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextTimeout->Wrap( -1 );
+ bSizer273->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 );
+ bSizer273->Add( m_spinCtrlTimeout, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerAccessTimeout->Add( bSizer273, 0, wxALL, 5 );
+
+
+ bSizer270->Add( bSizerAccessTimeout, 0, 0, 5 );
+
+
+ bSizer269->Add( bSizer270, 0, wxEXPAND|wxLEFT, 5 );
+
+ 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|wxBOTTOM|wxLEFT, 5 );
+
+ m_buttonSelectFolder = new wxButton( m_panel41, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectFolder->SetToolTip( _("Select a folder") );
+
+ bSizer217->Add( m_buttonSelectFolder, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer269->Add( bSizer217, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer185->Add( bSizer269, 0, wxEXPAND, 5 );
+
+
+ m_panel41->SetSizer( bSizer185 );
+ m_panel41->Layout();
+ bSizer185->Fit( m_panel41 );
+ bSizer134->Add( m_panel41, 0, wxEXPAND, 5 );
+
+ bSizer255 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticline571 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer255->Add( m_staticline571, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer219;
+ bSizer219 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ 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_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 );
+
+ m_hyperlink171 = new wxHyperlinkCtrl( this, wxID_ANY, _("How to get best performance?"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer219->Add( m_hyperlink171, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 );
+
+
+ bSizer255->Add( bSizer219, 0, wxEXPAND, 5 );
+
+ m_staticline57 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer255->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 ) );
+
+ wxBoxSizer* bSizer1851;
+ bSizer1851 = new wxBoxSizer( wxVERTICAL );
+
+ wxFlexGridSizer* fgSizer1611;
+ fgSizer1611 = new wxFlexGridSizer( 0, 3, 0, 0 );
+ fgSizer1611->AddGrowableCol( 1 );
+ fgSizer1611->SetFlexibleDirection( wxBOTH );
+ fgSizer1611->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ 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_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 );
+
+ m_spinCtrlConnectionCount = new wxSpinCtrl( m_panel411, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
+ fgSizer1611->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 ) );
+
+ fgSizer1611->Add( m_staticTextConnectionCountDescr, 0, wxALIGN_CENTER_VERTICAL|wxALL, 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_spinCtrlChannelCountSftp = new wxSpinCtrl( m_panel411, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
+ fgSizer1611->Add( m_spinCtrlChannelCountSftp, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_buttonChannelCountSftp = new wxButton( m_panel411, wxID_ANY, _("Detect server limit"), wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer1611->Add( m_buttonChannelCountSftp, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ bSizer1851->Add( fgSizer1611, 0, wxALL, 5 );
+
+
+ m_panel411->SetSizer( bSizer1851 );
+ m_panel411->Layout();
+ bSizer1851->Fit( m_panel411 );
+ bSizer255->Add( m_panel411, 1, wxEXPAND, 5 );
+
+
+ bSizer134->Add( bSizer255, 1, wxEXPAND, 5 );
+
+ m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer134->Add( m_staticline12, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ 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 ) );
+
+ 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 );
+
+
+ bSizer134->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ this->SetSizer( bSizer134 );
+ this->Layout();
+ bSizer134->Fit( this );
+
+ 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_checkBoxShowPassword->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::OnToggleShowPassword ), NULL, this );
+ m_buttonSelectFolder->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CloudSetupDlgGenerated::OnBrowseCloudFolder ), NULL, this );
+ m_hyperlink171->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( CloudSetupDlgGenerated::OnHelpFtpPerformance ), 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()
@@ -2940,60 +2940,60 @@ 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 ) );
-
- 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 ) );
-
- 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_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|wxNO_BORDER );
- 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_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer134->Add( m_staticline12, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- 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 ) );
-
- 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 );
-
-
- bSizer134->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- this->SetSizer( bSizer134 );
- this->Layout();
- bSizer134->Fit( this );
-
- 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 );
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ 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 ) );
+
+ 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_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|wxNO_BORDER );
+ 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_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer134->Add( m_staticline12, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ 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 ) );
+
+ 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 );
+
+
+ bSizer134->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ this->SetSizer( bSizer134 );
+ this->Layout();
+ bSizer134->Fit( this );
+
+ 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 );
}
AbstractFolderPickerGenerated::~AbstractFolderPickerGenerated()
@@ -3002,221 +3002,221 @@ 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 ) );
-
- wxBoxSizer* bSizer134;
- bSizer134 = new wxBoxSizer( wxVERTICAL );
-
- 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_staticTextHeader = new wxStaticText( this, wxID_ANY, _("Start synchronization now?"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextHeader->Wrap( -1 );
- bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 );
-
-
- 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_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer185;
- bSizer185 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer185->Add( 40, 0, 0, 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 );
-
- wxBoxSizer* bSizer162;
- bSizer162 = new wxBoxSizer( wxVERTICAL );
-
- 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 );
-
-
- bSizer182->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextVariant = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextVariant->Wrap( -1 );
- m_staticTextVariant->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
-
- bSizer182->Add( m_staticTextVariant, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
-
- bSizer182->Add( 0, 0, 1, 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 );
-
- 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 );
-
- 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") );
-
- 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") );
-
- 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") );
-
- 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") );
-
- 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") );
-
- 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") );
-
- 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") );
-
- 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") );
-
- 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") );
-
- 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") );
-
- 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") );
-
- 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") );
-
- 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") );
-
- 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") );
-
- fgSizer11->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer181->Add( fgSizer11, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
-
-
- bSizer162->Add( bSizer181, 0, wxEXPAND|wxALL, 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 );
-
-
- bSizer185->Add( 0, 0, 1, 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_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer134->Add( m_staticline12, 0, wxEXPAND, 5 );
-
- 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 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- 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 ) );
-
- 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 );
-
-
- bSizer164->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- bSizer134->Add( bSizer164, 1, wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer134 );
- this->Layout();
- bSizer134->Fit( this );
-
- 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 );
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer134;
+ bSizer134 = new wxBoxSizer( wxVERTICAL );
+
+ 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_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 );
+
+ 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 ) );
+
+ wxBoxSizer* bSizer185;
+ bSizer185 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer185->Add( 40, 0, 0, 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 );
+
+ wxBoxSizer* bSizer162;
+ bSizer162 = new wxBoxSizer( wxVERTICAL );
+
+ 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 );
+
+
+ bSizer182->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextVariant = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextVariant->Wrap( -1 );
+ m_staticTextVariant->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
+
+ bSizer182->Add( m_staticTextVariant, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ bSizer182->Add( 0, 0, 1, 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 );
+
+ 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 );
+
+ 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") );
+
+ 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") );
+
+ 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") );
+
+ 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") );
+
+ 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") );
+
+ 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") );
+
+ 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") );
+
+ 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") );
+
+ 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") );
+
+ 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") );
+
+ 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") );
+
+ 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") );
+
+ 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") );
+
+ 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") );
+
+ fgSizer11->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer181->Add( fgSizer11, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
+
+
+ bSizer162->Add( bSizer181, 0, wxEXPAND|wxALL, 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 );
+
+
+ bSizer185->Add( 0, 0, 1, 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_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer134->Add( m_staticline12, 0, wxEXPAND, 5 );
+
+ 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 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ 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 ) );
+
+ 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 );
+
+
+ bSizer164->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ bSizer134->Add( bSizer164, 1, wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer134 );
+ this->Layout();
+ bSizer134->Fit( this );
+
+ 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 );
}
SyncConfirmationDlgGenerated::~SyncConfirmationDlgGenerated()
@@ -3225,161 +3225,161 @@ SyncConfirmationDlgGenerated::~SyncConfirmationDlgGenerated()
CompareProgressDlgGenerated::CompareProgressDlgGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
{
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer40;
- bSizer40 = new wxBoxSizer( wxHORIZONTAL );
-
- m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer187;
- bSizer187 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer187->Add( 0, 5, 0, 0, 5 );
-
- wxFlexGridSizer* fgSizer7;
- fgSizer7 = new wxFlexGridSizer( 0, 2, 5, 5 );
- fgSizer7->SetFlexibleDirection( wxHORIZONTAL );
- fgSizer7->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-
- m_staticTextItemsFoundLabel = new wxStaticText( m_panelStatistics, wxID_ANY, _("Items found:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextItemsFoundLabel->Wrap( -1 );
- fgSizer7->Add( m_staticTextItemsFoundLabel, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextItemsFound = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextItemsFound->Wrap( -1 );
- m_staticTextItemsFound->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
-
- fgSizer7->Add( m_staticTextItemsFound, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextItemsRemainingLabel = new wxStaticText( m_panelStatistics, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextItemsRemainingLabel->Wrap( -1 );
- fgSizer7->Add( m_staticTextItemsRemainingLabel, 0, wxALIGN_BOTTOM, 5 );
-
- bSizerItemsRemaining = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticTextItemsRemaining = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextItemsRemaining->Wrap( -1 );
- m_staticTextItemsRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
-
- bSizerItemsRemaining->Add( m_staticTextItemsRemaining, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextBytesRemaining = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextBytesRemaining->Wrap( -1 );
- bSizerItemsRemaining->Add( m_staticTextBytesRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
-
-
- fgSizer7->Add( bSizerItemsRemaining, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextTimeRemainingLabel = new wxStaticText( m_panelStatistics, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextTimeRemainingLabel->Wrap( -1 );
- fgSizer7->Add( m_staticTextTimeRemainingLabel, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextTimeRemaining = new wxStaticText( m_panelStatistics, 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 ) );
-
- fgSizer7->Add( m_staticTextTimeRemaining, 0, wxALIGN_BOTTOM, 5 );
-
- wxStaticText* m_staticText37;
- m_staticText37 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText37->Wrap( -1 );
- fgSizer7->Add( m_staticText37, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextTimeElapsed = new wxStaticText( m_panelStatistics, 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 ) );
-
- fgSizer7->Add( m_staticTextTimeElapsed, 0, wxALIGN_BOTTOM, 5 );
-
-
- bSizer187->Add( fgSizer7, 0, wxRIGHT|wxLEFT, 5 );
-
-
- bSizer187->Add( 0, 5, 0, 0, 5 );
-
-
- m_panelStatistics->SetSizer( bSizer187 );
- m_panelStatistics->Layout();
- bSizer187->Fit( m_panelStatistics );
- bSizer40->Add( m_panelStatistics, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- wxBoxSizer* bSizer181;
- bSizer181 = new wxBoxSizer( wxVERTICAL );
-
- m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatus->Wrap( -1 );
- bSizer181->Add( m_staticTextStatus, 0, 0, 5 );
-
- wxBoxSizer* bSizer199;
- bSizer199 = 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_staticText1461 = new wxStaticText( this, wxID_ANY, _("Automatic retry"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText1461->Wrap( -1 );
- bSizerErrorsRetry->Add( m_staticText1461, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|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|wxRIGHT, 5 );
-
-
- bSizer199->Add( bSizerErrorsRetry, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- 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_staticText146 = new wxStaticText( this, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText146->Wrap( -1 );
- bSizerErrorsIgnore->Add( m_staticText146, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer199->Add( bSizerErrorsIgnore, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- bSizerProgressGraph = new wxBoxSizer( wxHORIZONTAL );
-
- 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 );
-
- wxBoxSizer* bSizer247;
- bSizer247 = new wxBoxSizer( wxVERTICAL );
-
- wxStaticText* m_staticText99;
- m_staticText99 = new wxStaticText( this, wxID_ANY, _("Bytes"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText99->Wrap( -1 );
- bSizer247->Add( m_staticText99, 0, wxALL, 5 );
-
- wxStaticText* m_staticText100;
- m_staticText100 = new wxStaticText( this, wxID_ANY, _("Items"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText100->Wrap( -1 );
- bSizer247->Add( m_staticText100, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizerProgressGraph->Add( bSizer247, 0, 0, 5 );
-
-
- bSizer199->Add( bSizerProgressGraph, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer181->Add( bSizer199, 0, wxTOP|wxEXPAND, 5 );
-
-
- bSizer40->Add( bSizer181, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
-
- this->SetSizer( bSizer40 );
- this->Layout();
- bSizer40->Fit( this );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer40;
+ bSizer40 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer187;
+ bSizer187 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer187->Add( 0, 5, 0, 0, 5 );
+
+ wxFlexGridSizer* fgSizer7;
+ fgSizer7 = new wxFlexGridSizer( 0, 2, 5, 5 );
+ fgSizer7->SetFlexibleDirection( wxHORIZONTAL );
+ fgSizer7->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ m_staticTextItemsFoundLabel = new wxStaticText( m_panelStatistics, wxID_ANY, _("Items found:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextItemsFoundLabel->Wrap( -1 );
+ fgSizer7->Add( m_staticTextItemsFoundLabel, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextItemsFound = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextItemsFound->Wrap( -1 );
+ m_staticTextItemsFound->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
+
+ fgSizer7->Add( m_staticTextItemsFound, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextItemsRemainingLabel = new wxStaticText( m_panelStatistics, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextItemsRemainingLabel->Wrap( -1 );
+ fgSizer7->Add( m_staticTextItemsRemainingLabel, 0, wxALIGN_BOTTOM, 5 );
+
+ bSizerItemsRemaining = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticTextItemsRemaining = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextItemsRemaining->Wrap( -1 );
+ m_staticTextItemsRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
+
+ bSizerItemsRemaining->Add( m_staticTextItemsRemaining, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextBytesRemaining = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextBytesRemaining->Wrap( -1 );
+ bSizerItemsRemaining->Add( m_staticTextBytesRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
+
+
+ fgSizer7->Add( bSizerItemsRemaining, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextTimeRemainingLabel = new wxStaticText( m_panelStatistics, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextTimeRemainingLabel->Wrap( -1 );
+ fgSizer7->Add( m_staticTextTimeRemainingLabel, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextTimeRemaining = new wxStaticText( m_panelStatistics, 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 ) );
+
+ fgSizer7->Add( m_staticTextTimeRemaining, 0, wxALIGN_BOTTOM, 5 );
+
+ wxStaticText* m_staticText37;
+ m_staticText37 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText37->Wrap( -1 );
+ fgSizer7->Add( m_staticText37, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextTimeElapsed = new wxStaticText( m_panelStatistics, 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 ) );
+
+ fgSizer7->Add( m_staticTextTimeElapsed, 0, wxALIGN_BOTTOM, 5 );
+
+
+ bSizer187->Add( fgSizer7, 0, wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer187->Add( 0, 5, 0, 0, 5 );
+
+
+ m_panelStatistics->SetSizer( bSizer187 );
+ m_panelStatistics->Layout();
+ bSizer187->Fit( m_panelStatistics );
+ bSizer40->Add( m_panelStatistics, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ wxBoxSizer* bSizer181;
+ bSizer181 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatus->Wrap( -1 );
+ bSizer181->Add( m_staticTextStatus, 0, 0, 5 );
+
+ wxBoxSizer* bSizer199;
+ bSizer199 = 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_staticText1461 = new wxStaticText( this, wxID_ANY, _("Automatic retry"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText1461->Wrap( -1 );
+ bSizerErrorsRetry->Add( m_staticText1461, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|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|wxRIGHT, 5 );
+
+
+ bSizer199->Add( bSizerErrorsRetry, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ 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_staticText146 = new wxStaticText( this, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText146->Wrap( -1 );
+ bSizerErrorsIgnore->Add( m_staticText146, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer199->Add( bSizerErrorsIgnore, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ bSizerProgressGraph = new wxBoxSizer( wxHORIZONTAL );
+
+ 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 );
+
+ wxBoxSizer* bSizer247;
+ bSizer247 = new wxBoxSizer( wxVERTICAL );
+
+ wxStaticText* m_staticText99;
+ m_staticText99 = new wxStaticText( this, wxID_ANY, _("Bytes"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText99->Wrap( -1 );
+ bSizer247->Add( m_staticText99, 0, wxALL, 5 );
+
+ wxStaticText* m_staticText100;
+ m_staticText100 = new wxStaticText( this, wxID_ANY, _("Items"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText100->Wrap( -1 );
+ bSizer247->Add( m_staticText100, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizerProgressGraph->Add( bSizer247, 0, 0, 5 );
+
+
+ bSizer199->Add( bSizerProgressGraph, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer181->Add( bSizer199, 0, wxTOP|wxEXPAND, 5 );
+
+
+ bSizer40->Add( bSizer181, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ this->SetSizer( bSizer40 );
+ this->Layout();
+ bSizer40->Fit( this );
}
CompareProgressDlgGenerated::~CompareProgressDlgGenerated()
@@ -3388,346 +3388,346 @@ CompareProgressDlgGenerated::~CompareProgressDlgGenerated()
SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
{
- bSizerRoot = new wxBoxSizer( wxVERTICAL );
-
- m_panel53 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panel53->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- bSizer42 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer42->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_bitmapStatus = new wxStaticBitmap( m_panel53, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer42->Add( m_bitmapStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
-
- 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 ) );
-
- bSizer42->Add( m_staticTextPhase, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
- wxBoxSizer* bSizer247;
- bSizer247 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer247->Add( 0, 0, 1, 0, 5 );
-
- m_bpButtonMinimizeToTray = new wxBitmapButton( m_panel53, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonMinimizeToTray->SetToolTip( _("Minimize to notification area") );
-
- bSizer247->Add( m_bpButtonMinimizeToTray, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
-
-
- bSizer42->Add( bSizer247, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- m_panel53->SetSizer( bSizer42 );
- m_panel53->Layout();
- bSizer42->Fit( m_panel53 );
- bSizerRoot->Add( m_panel53, 0, wxEXPAND, 5 );
-
- bSizerStatusText = new wxBoxSizer( wxVERTICAL );
-
-
- bSizerStatusText->Add( 0, 5, 0, 0, 5 );
-
- m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatus->Wrap( -1 );
- bSizerStatusText->Add( m_staticTextStatus, 0, wxEXPAND|wxLEFT, 10 );
-
-
- bSizerStatusText->Add( 0, 5, 0, 0, 5 );
-
-
- bSizerRoot->Add( bSizerStatusText, 0, wxEXPAND, 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 );
-
- 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 ) );
-
- bSizer161->Add( m_panelGraphBytes, 1, wxEXPAND|wxLEFT, 10 );
-
- wxBoxSizer* bSizer232;
- bSizer232 = new wxBoxSizer( wxHORIZONTAL );
-
- m_panelItemsProcessed = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelItemsProcessed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer165;
- bSizer165 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer165->Add( 0, 5, 0, 0, 5 );
-
- wxStaticText* m_staticText96;
- m_staticText96 = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("Items processed:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText96->Wrap( -1 );
- bSizer165->Add( m_staticText96, 0, wxRIGHT|wxLEFT, 5 );
-
- wxBoxSizer* bSizer169;
- bSizer169 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticTextItemsProcessed = new wxStaticText( m_panelItemsProcessed, 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 ) );
-
- bSizer169->Add( m_staticTextItemsProcessed, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextBytesProcessed = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextBytesProcessed->Wrap( -1 );
- bSizer169->Add( m_staticTextBytesProcessed, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
-
-
- bSizer165->Add( bSizer169, 0, wxRIGHT|wxLEFT, 5 );
-
-
- bSizer165->Add( 0, 5, 0, 0, 5 );
-
-
- m_panelItemsProcessed->SetSizer( bSizer165 );
- m_panelItemsProcessed->Layout();
- bSizer165->Fit( m_panelItemsProcessed );
- bSizer232->Add( m_panelItemsProcessed, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 );
-
- m_panelItemsRemaining = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelItemsRemaining->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer166;
- bSizer166 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer166->Add( 0, 5, 0, 0, 5 );
-
- wxStaticText* m_staticText97;
- m_staticText97 = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText97->Wrap( -1 );
- bSizer166->Add( m_staticText97, 0, wxRIGHT|wxLEFT, 5 );
-
- wxBoxSizer* bSizer170;
- bSizer170 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticTextItemsRemaining = new wxStaticText( m_panelItemsRemaining, 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 ) );
-
- bSizer170->Add( m_staticTextItemsRemaining, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextBytesRemaining = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextBytesRemaining->Wrap( -1 );
- bSizer170->Add( m_staticTextBytesRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
-
-
- bSizer166->Add( bSizer170, 0, wxRIGHT|wxLEFT, 5 );
-
-
- bSizer166->Add( 0, 5, 0, 0, 5 );
-
-
- m_panelItemsRemaining->SetSizer( bSizer166 );
- m_panelItemsRemaining->Layout();
- bSizer166->Fit( m_panelItemsRemaining );
- bSizer232->Add( m_panelItemsRemaining, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 );
-
- m_panelTimeRemaining = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelTimeRemaining->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer167;
- bSizer167 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer167->Add( 0, 5, 0, 0, 5 );
-
- wxStaticText* m_staticText98;
- m_staticText98 = new wxStaticText( m_panelTimeRemaining, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText98->Wrap( -1 );
- bSizer167->Add( m_staticText98, 0, wxRIGHT|wxLEFT, 5 );
-
- m_staticTextTimeRemaining = new wxStaticText( m_panelTimeRemaining, 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 ) );
-
- bSizer167->Add( m_staticTextTimeRemaining, 0, wxRIGHT|wxLEFT, 5 );
-
-
- bSizer167->Add( 0, 5, 0, 0, 5 );
-
-
- m_panelTimeRemaining->SetSizer( bSizer167 );
- m_panelTimeRemaining->Layout();
- bSizer167->Fit( m_panelTimeRemaining );
- bSizer232->Add( m_panelTimeRemaining, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 10 );
-
- wxPanel* m_panelTimeElapsed;
- m_panelTimeElapsed = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelTimeElapsed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer168;
- bSizer168 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer168->Add( 0, 5, 0, 0, 5 );
-
- wxStaticText* m_staticText961;
- m_staticText961 = new wxStaticText( m_panelTimeElapsed, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText961->Wrap( -1 );
- bSizer168->Add( m_staticText961, 0, wxRIGHT|wxLEFT, 5 );
-
- m_staticTextTimeElapsed = new wxStaticText( m_panelTimeElapsed, 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 ) );
-
- bSizer168->Add( m_staticTextTimeElapsed, 0, wxRIGHT|wxLEFT, 5 );
-
-
- bSizer168->Add( 0, 5, 0, 0, 5 );
-
-
- m_panelTimeElapsed->SetSizer( bSizer168 );
- m_panelTimeElapsed->Layout();
- bSizer168->Fit( m_panelTimeElapsed );
- bSizer232->Add( m_panelTimeElapsed, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 );
-
- wxBoxSizer* bSizer233;
- bSizer233 = new wxBoxSizer( wxVERTICAL );
-
- 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 );
-
- 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 );
-
-
- bSizer233->Add( bSizer175, 0, 0, 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 );
-
- 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( bSizer174, 0, wxTOP, 5 );
-
-
- bSizer232->Add( bSizer233, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 10 );
-
-
- bSizer161->Add( bSizer232, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 10 );
-
- 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 );
-
- bSizerProgressFooter = new wxBoxSizer( wxHORIZONTAL );
-
- bSizerErrorsRetry = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapRetryErrors = new wxStaticBitmap( m_panelProgress, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizerErrorsRetry->Add( m_bitmapRetryErrors, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- 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|wxRIGHT|wxLEFT, 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, 5 );
-
-
- bSizerProgressFooter->Add( bSizerErrorsRetry, 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 );
-
- 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( bSizerErrorsIgnore, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
-
- 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 );
-
- 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 );
-
-
- bSizer161->Add( bSizerProgressFooter, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 10 );
-
-
- bSizer173->Add( bSizer161, 1, wxEXPAND|wxLEFT, 10 );
-
-
- m_panelProgress->SetSizer( bSizer173 );
- m_panelProgress->Layout();
- bSizer173->Fit( m_panelProgress );
- bSizerRoot->Add( m_panelProgress, 1, wxEXPAND, 5 );
-
- m_notebookResult = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_FIXEDWIDTH );
- m_notebookResult->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
-
- 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 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- m_checkBoxAutoClose = new wxCheckBox( this, wxID_ANY, _("Auto-close"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizerStdButtons->Add( m_checkBoxAutoClose, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
-
- bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonClose->SetDefault();
- m_buttonClose->Enable( false );
-
- 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 );
-
- 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 );
+ bSizerRoot = new wxBoxSizer( wxVERTICAL );
+
+ m_panel53 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel53->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ bSizer42 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer42->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_bitmapStatus = new wxStaticBitmap( m_panel53, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ bSizer42->Add( m_bitmapStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
+
+ 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 ) );
+
+ bSizer42->Add( m_staticTextPhase, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+ wxBoxSizer* bSizer247;
+ bSizer247 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer247->Add( 0, 0, 1, 0, 5 );
+
+ m_bpButtonMinimizeToTray = new wxBitmapButton( m_panel53, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonMinimizeToTray->SetToolTip( _("Minimize to notification area") );
+
+ bSizer247->Add( m_bpButtonMinimizeToTray, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
+
+
+ bSizer42->Add( bSizer247, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ m_panel53->SetSizer( bSizer42 );
+ m_panel53->Layout();
+ bSizer42->Fit( m_panel53 );
+ bSizerRoot->Add( m_panel53, 0, wxEXPAND, 5 );
+
+ bSizerStatusText = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizerStatusText->Add( 0, 5, 0, 0, 5 );
+
+ m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatus->Wrap( -1 );
+ bSizerStatusText->Add( m_staticTextStatus, 0, wxEXPAND|wxLEFT, 10 );
+
+
+ bSizerStatusText->Add( 0, 5, 0, 0, 5 );
+
+
+ bSizerRoot->Add( bSizerStatusText, 0, wxEXPAND, 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 );
+
+ 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 ) );
+
+ bSizer161->Add( m_panelGraphBytes, 1, wxEXPAND|wxLEFT, 10 );
+
+ wxBoxSizer* bSizer232;
+ bSizer232 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_panelItemsProcessed = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panelItemsProcessed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer165;
+ bSizer165 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer165->Add( 0, 5, 0, 0, 5 );
+
+ wxStaticText* m_staticText96;
+ m_staticText96 = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("Items processed:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText96->Wrap( -1 );
+ bSizer165->Add( m_staticText96, 0, wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer169;
+ bSizer169 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticTextItemsProcessed = new wxStaticText( m_panelItemsProcessed, 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 ) );
+
+ bSizer169->Add( m_staticTextItemsProcessed, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextBytesProcessed = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextBytesProcessed->Wrap( -1 );
+ bSizer169->Add( m_staticTextBytesProcessed, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
+
+
+ bSizer165->Add( bSizer169, 0, wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer165->Add( 0, 5, 0, 0, 5 );
+
+
+ m_panelItemsProcessed->SetSizer( bSizer165 );
+ m_panelItemsProcessed->Layout();
+ bSizer165->Fit( m_panelItemsProcessed );
+ bSizer232->Add( m_panelItemsProcessed, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 );
+
+ m_panelItemsRemaining = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panelItemsRemaining->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer166;
+ bSizer166 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer166->Add( 0, 5, 0, 0, 5 );
+
+ wxStaticText* m_staticText97;
+ m_staticText97 = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText97->Wrap( -1 );
+ bSizer166->Add( m_staticText97, 0, wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer170;
+ bSizer170 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticTextItemsRemaining = new wxStaticText( m_panelItemsRemaining, 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 ) );
+
+ bSizer170->Add( m_staticTextItemsRemaining, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextBytesRemaining = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextBytesRemaining->Wrap( -1 );
+ bSizer170->Add( m_staticTextBytesRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
+
+
+ bSizer166->Add( bSizer170, 0, wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer166->Add( 0, 5, 0, 0, 5 );
+
+
+ m_panelItemsRemaining->SetSizer( bSizer166 );
+ m_panelItemsRemaining->Layout();
+ bSizer166->Fit( m_panelItemsRemaining );
+ bSizer232->Add( m_panelItemsRemaining, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 );
+
+ m_panelTimeRemaining = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panelTimeRemaining->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer167;
+ bSizer167 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer167->Add( 0, 5, 0, 0, 5 );
+
+ wxStaticText* m_staticText98;
+ m_staticText98 = new wxStaticText( m_panelTimeRemaining, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText98->Wrap( -1 );
+ bSizer167->Add( m_staticText98, 0, wxRIGHT|wxLEFT, 5 );
+
+ m_staticTextTimeRemaining = new wxStaticText( m_panelTimeRemaining, 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 ) );
+
+ bSizer167->Add( m_staticTextTimeRemaining, 0, wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer167->Add( 0, 5, 0, 0, 5 );
+
+
+ m_panelTimeRemaining->SetSizer( bSizer167 );
+ m_panelTimeRemaining->Layout();
+ bSizer167->Fit( m_panelTimeRemaining );
+ bSizer232->Add( m_panelTimeRemaining, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 10 );
+
+ wxPanel* m_panelTimeElapsed;
+ m_panelTimeElapsed = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panelTimeElapsed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer168;
+ bSizer168 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer168->Add( 0, 5, 0, 0, 5 );
+
+ wxStaticText* m_staticText961;
+ m_staticText961 = new wxStaticText( m_panelTimeElapsed, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText961->Wrap( -1 );
+ bSizer168->Add( m_staticText961, 0, wxRIGHT|wxLEFT, 5 );
+
+ m_staticTextTimeElapsed = new wxStaticText( m_panelTimeElapsed, 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 ) );
+
+ bSizer168->Add( m_staticTextTimeElapsed, 0, wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer168->Add( 0, 5, 0, 0, 5 );
+
+
+ m_panelTimeElapsed->SetSizer( bSizer168 );
+ m_panelTimeElapsed->Layout();
+ bSizer168->Fit( m_panelTimeElapsed );
+ bSizer232->Add( m_panelTimeElapsed, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 );
+
+ wxBoxSizer* bSizer233;
+ bSizer233 = new wxBoxSizer( wxVERTICAL );
+
+ 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 );
+
+ 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 );
+
+
+ bSizer233->Add( bSizer175, 0, 0, 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 );
+
+ 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( bSizer174, 0, wxTOP, 5 );
+
+
+ bSizer232->Add( bSizer233, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 10 );
+
+
+ bSizer161->Add( bSizer232, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 10 );
+
+ 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 );
+
+ bSizerProgressFooter = new wxBoxSizer( wxHORIZONTAL );
+
+ bSizerErrorsRetry = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapRetryErrors = new wxStaticBitmap( m_panelProgress, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizerErrorsRetry->Add( m_bitmapRetryErrors, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ 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|wxRIGHT|wxLEFT, 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, 5 );
+
+
+ bSizerProgressFooter->Add( bSizerErrorsRetry, 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 );
+
+ 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( bSizerErrorsIgnore, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+
+ 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 );
+
+ 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 );
+
+
+ bSizer161->Add( bSizerProgressFooter, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 10 );
+
+
+ bSizer173->Add( bSizer161, 1, wxEXPAND|wxLEFT, 10 );
+
+
+ m_panelProgress->SetSizer( bSizer173 );
+ m_panelProgress->Layout();
+ bSizer173->Fit( m_panelProgress );
+ bSizerRoot->Add( m_panelProgress, 1, wxEXPAND, 5 );
+
+ m_notebookResult = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_FIXEDWIDTH );
+ m_notebookResult->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+
+ 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 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ m_checkBoxAutoClose = new wxCheckBox( this, wxID_ANY, _("Auto-close"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizerStdButtons->Add( m_checkBoxAutoClose, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ m_buttonClose->SetDefault();
+ m_buttonClose->Enable( false );
+
+ 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 );
+
+ 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()
@@ -3736,42 +3736,42 @@ SyncProgressPanelGenerated::~SyncProgressPanelGenerated()
LogPanelGenerated::LogPanelGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
{
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer153;
- bSizer153 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer154;
- bSizer154 = new wxBoxSizer( wxVERTICAL );
-
- m_bpButtonErrors = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizer154->Add( m_bpButtonErrors, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonWarnings = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizer154->Add( m_bpButtonWarnings, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonInfo = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizer154->Add( m_bpButtonInfo, 0, wxALIGN_CENTER_HORIZONTAL, 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_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 );
-
- // 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 );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer153;
+ bSizer153 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer154;
+ bSizer154 = new wxBoxSizer( wxVERTICAL );
+
+ m_bpButtonErrors = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizer154->Add( m_bpButtonErrors, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonWarnings = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizer154->Add( m_bpButtonWarnings, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonInfo = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizer154->Add( m_bpButtonInfo, 0, wxALIGN_CENTER_HORIZONTAL, 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_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 );
+
+ // 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()
@@ -3780,173 +3780,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 ) );
-
- wxBoxSizer* bSizer54;
- bSizer54 = new wxBoxSizer( wxVERTICAL );
-
- 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_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 );
-
- 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 ) );
-
- wxBoxSizer* bSizer172;
- bSizer172 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer180;
- bSizer180 = new wxBoxSizer( wxHORIZONTAL );
-
- 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 );
-
- 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_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 );
-
- 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 );
-
-
- 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 );
-
- wxBoxSizer* bSizer242;
- bSizer242 = new wxBoxSizer( wxVERTICAL );
-
- 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_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|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- wxBoxSizer* bSizer246;
- bSizer246 = new wxBoxSizer( wxVERTICAL );
-
- m_radioBtnErrorDialogShow = new wxRadioButton( m_panel35, wxID_ANY, _("&Show error dialog"), 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 );
-
- 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 );
-
-
- bSizer242->Add( bSizer246, 0, wxALIGN_CENTER_HORIZONTAL, 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 );
-
- 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 );
-
- 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 );
-
- 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 );
-
- 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?"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- 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_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer54->Add( m_staticline13, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- 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 ) );
-
- 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 );
-
-
- bSizer54->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- this->SetSizer( bSizer54 );
- this->Layout();
- bSizer54->Fit( this );
-
- 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_radioBtnErrorDialogShow->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnErrorDialogShow ), NULL, this );
- m_radioBtnErrorDialogCancel->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnErrorDialogCancel ), NULL, this );
- m_hyperlink17->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( BatchDlgGenerated::OnHelpScheduleBatch ), 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 );
+ this->SetSizeHints( wxSize( -1, -1 ), wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer54;
+ bSizer54 = new wxBoxSizer( wxVERTICAL );
+
+ 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_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 );
+
+ 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 ) );
+
+ wxBoxSizer* bSizer172;
+ bSizer172 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer180;
+ bSizer180 = new wxBoxSizer( wxHORIZONTAL );
+
+ 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 );
+
+ 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_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 );
+
+ 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 );
+
+
+ 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 );
+
+ wxBoxSizer* bSizer242;
+ bSizer242 = new wxBoxSizer( wxVERTICAL );
+
+ 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_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|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ 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") );
+
+ 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") );
+
+ bSizer246->Add( m_radioBtnErrorDialogCancel, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
+
+
+ bSizer242->Add( bSizer246, 0, wxALIGN_CENTER_HORIZONTAL, 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 );
+
+ 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 );
+
+ 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 );
+
+ 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 );
+
+ 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?"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ 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_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer54->Add( m_staticline13, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ 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 ) );
+
+ 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 );
+
+
+ bSizer54->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ this->SetSizer( bSizer54 );
+ this->Layout();
+ bSizer54->Fit( this );
+
+ 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_radioBtnErrorDialogShow->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnErrorDialogShow ), NULL, this );
+ m_radioBtnErrorDialogCancel->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnErrorDialogCancel ), NULL, this );
+ m_hyperlink17->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( BatchDlgGenerated::OnHelpScheduleBatch ), 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()
@@ -3955,84 +3955,84 @@ 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 ) );
-
- wxBoxSizer* bSizer24;
- bSizer24 = new wxBoxSizer( wxVERTICAL );
-
- 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_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* bSizer185;
- bSizer185 = new wxBoxSizer( wxHORIZONTAL );
-
-
- 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_textCtrlFileList = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
- 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_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer24->Add( m_staticline9, 0, wxEXPAND, 5 );
-
- 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 );
-
-
- bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 );
-
- 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 ) );
-
- 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 );
-
-
- bSizer24->Add( bSizerStdButtons, 0, wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer24 );
- this->Layout();
- bSizer24->Fit( this );
-
- 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::OnOK ), NULL, this );
- m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this );
+ 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_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 );
+
+
+ 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* bSizer185;
+ bSizer185 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ 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_textCtrlFileList = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
+ 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_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer24->Add( m_staticline9, 0, wxEXPAND, 5 );
+
+ 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 );
+
+
+ bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ 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 ) );
+
+ 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 );
+
+
+ bSizer24->Add( bSizerStdButtons, 0, wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer24 );
+ this->Layout();
+ bSizer24->Fit( this );
+
+ 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::OnOK ), NULL, this );
+ m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this );
}
DeleteDlgGenerated::~DeleteDlgGenerated()
@@ -4041,121 +4041,121 @@ 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 ) );
-
- wxBoxSizer* bSizer24;
- bSizer24 = new wxBoxSizer( wxVERTICAL );
-
- 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_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 );
-
- wxBoxSizer* bSizer185;
- bSizer185 = new wxBoxSizer( wxHORIZONTAL );
-
-
- 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_textCtrlFileList = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
- bSizer185->Add( m_textCtrlFileList, 1, wxEXPAND, 5 );
-
-
- bSizer242->Add( bSizer185, 1, wxEXPAND, 5 );
-
- 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_buttonSelectTargetFolder = new wxButton( m_panel31, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectTargetFolder->SetToolTip( _("Select a folder") );
-
- bSizer182->Add( m_buttonSelectTargetFolder, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonSelectAltTargetFolder = new wxBitmapButton( m_panel31, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonSelectAltTargetFolder->SetToolTip( _("Access online storage") );
-
- bSizer182->Add( m_bpButtonSelectAltTargetFolder, 0, wxEXPAND, 5 );
-
-
- 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_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer24->Add( m_staticline9, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- 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_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( 0, 0, 1, wxEXPAND, 5 );
-
- 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 ) );
-
- 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 );
-
-
- bSizer24->Add( bSizerStdButtons, 0, wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer24 );
- this->Layout();
- bSizer24->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CopyToDlgGenerated::OnClose ) );
- m_checkBoxKeepRelPath->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( CopyToDlgGenerated::OnUseRecycler ), NULL, this );
- m_checkBoxOverwriteIfExists->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( CopyToDlgGenerated::OnUseRecycler ), NULL, this );
- m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CopyToDlgGenerated::OnOK ), NULL, this );
- m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CopyToDlgGenerated::OnCancel ), NULL, this );
+ 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_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 );
+
+
+ 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 );
+
+ wxBoxSizer* bSizer185;
+ bSizer185 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ 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_textCtrlFileList = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
+ bSizer185->Add( m_textCtrlFileList, 1, wxEXPAND, 5 );
+
+
+ bSizer242->Add( bSizer185, 1, wxEXPAND, 5 );
+
+ 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_buttonSelectTargetFolder = new wxButton( m_panel31, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectTargetFolder->SetToolTip( _("Select a folder") );
+
+ bSizer182->Add( m_buttonSelectTargetFolder, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonSelectAltTargetFolder = new wxBitmapButton( m_panel31, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectAltTargetFolder->SetToolTip( _("Access online storage") );
+
+ bSizer182->Add( m_bpButtonSelectAltTargetFolder, 0, wxEXPAND, 5 );
+
+
+ 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_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer24->Add( m_staticline9, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ 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_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( 0, 0, 1, wxEXPAND, 5 );
+
+ 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 ) );
+
+ 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 );
+
+
+ bSizer24->Add( bSizerStdButtons, 0, wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer24 );
+ this->Layout();
+ bSizer24->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CopyToDlgGenerated::OnClose ) );
+ m_checkBoxKeepRelPath->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( CopyToDlgGenerated::OnUseRecycler ), NULL, this );
+ m_checkBoxOverwriteIfExists->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( CopyToDlgGenerated::OnUseRecycler ), NULL, this );
+ m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CopyToDlgGenerated::OnOK ), NULL, this );
+ m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CopyToDlgGenerated::OnCancel ), NULL, this );
}
CopyToDlgGenerated::~CopyToDlgGenerated()
@@ -4164,296 +4164,296 @@ CopyToDlgGenerated::~CopyToDlgGenerated()
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 ) );
-
- wxBoxSizer* bSizer95;
- bSizer95 = new wxBoxSizer( wxVERTICAL );
-
- 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_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 );
-
- 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 ) );
-
- wxBoxSizer* bSizer166;
- bSizer166 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer186;
- bSizer186 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer160;
- bSizer160 = new wxBoxSizer( wxVERTICAL );
-
- 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.") );
-
- 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 ) );
-
- 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 ) );
-
- 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 ) );
-
- bSizer176->Add( m_staticText9111, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer160->Add( bSizer176, 0, wxEXPAND, 5 );
-
- 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.") );
-
- 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 ) );
-
- 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 ) );
-
- 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 ) );
-
- bSizerLockedFiles->Add( m_staticText922, 0, wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer160->Add( bSizerLockedFiles, 0, wxEXPAND, 5 );
-
- 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.") );
-
- 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 ) );
-
- 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 ) );
-
- 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 ) );
-
- bSizer178->Add( m_staticText932, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer160->Add( bSizer178, 0, wxEXPAND, 5 );
-
-
- bSizer186->Add( bSizer160, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticline39 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer186->Add( m_staticline39, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer1881;
- bSizer1881 = new wxBoxSizer( wxVERTICAL );
-
- m_staticTextResetDialogs = new wxStaticText( m_panel39, wxID_ANY, _("Show all permanently hidden dialogs and warning messages again"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextResetDialogs->Wrap( -1 );
- m_staticTextResetDialogs->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
-
- bSizer1881->Add( m_staticTextResetDialogs, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
-
- m_buttonResetDialogs = new zen::BitmapTextButton( m_panel39, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer1881->Add( m_buttonResetDialogs, 0, wxALL, 5 );
-
-
- bSizer186->Add( bSizer1881, 0, wxALL|wxALIGN_CENTER_VERTICAL, 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 );
-
- wxBoxSizer* bSizer259;
- bSizer259 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer258;
- bSizer258 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapLogFile = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizer258->Add( m_bitmapLogFile, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticText163 = new wxStaticText( m_panel39, wxID_ANY, _("Default log path:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText163->Wrap( -1 );
- bSizer258->Add( m_staticText163, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
-
- m_hyperlinkLogFolder = new wxHyperlinkCtrl( m_panel39, wxID_ANY, _("dummy"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer258->Add( m_hyperlinkLogFolder, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
-
-
- bSizer259->Add( bSizer258, 0, wxALL|wxEXPAND, 5 );
-
- wxBoxSizer* bSizer282;
- bSizer282 = new wxBoxSizer( wxHORIZONTAL );
-
- m_checkBoxLogFilesMaxAge = new wxCheckBox( m_panel39, wxID_ANY, _("&Delete logs after x days:"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer282->Add( m_checkBoxLogFilesMaxAge, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_spinCtrlLogFilesMaxAge = new wxSpinCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
- bSizer282->Add( m_spinCtrlLogFilesMaxAge, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer259->Add( bSizer282, 0, wxALL, 5 );
-
-
- bSizer166->Add( bSizer259, 0, wxALL|wxEXPAND, 5 );
-
- m_staticline361 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer166->Add( m_staticline361, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer181;
- bSizer181 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText85 = new wxStaticText( m_panel39, wxID_ANY, _("Customize context menu:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText85->Wrap( -1 );
- bSizer181->Add( m_staticText85, 0, wxBOTTOM, 5 );
-
- 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 );
-
- // Columns
- m_gridCustomCommand->EnableDragColMove( false );
- m_gridCustomCommand->EnableDragColSize( true );
- m_gridCustomCommand->SetColLabelSize( -1 );
- m_gridCustomCommand->SetColLabelValue( 0, _("Description") );
- m_gridCustomCommand->SetColLabelValue( 1, _("Command line") );
- m_gridCustomCommand->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
-
- // Rows
- m_gridCustomCommand->EnableDragRowSize( false );
- m_gridCustomCommand->SetRowLabelSize( 1 );
- m_gridCustomCommand->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
-
- // Label Appearance
-
- // Cell Defaults
- m_gridCustomCommand->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP );
- bSizer181->Add( m_gridCustomCommand, 1, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer193;
- bSizer193 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonAddRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizer193->Add( m_bpButtonAddRow, 0, wxEXPAND, 5 );
-
- m_bpButtonRemoveRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- bSizer193->Add( m_bpButtonRemoveRow, 0, wxEXPAND, 5 );
-
-
- bSizer193->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_hyperlink17 = new wxHyperlinkCtrl( m_panel39, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer193->Add( m_hyperlink17, 0, wxLEFT, 5 );
-
-
- bSizer181->Add( bSizer193, 0, wxTOP|wxEXPAND, 5 );
-
-
- bSizer166->Add( bSizer181, 1, wxEXPAND|wxALL, 10 );
-
-
- 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 );
-
- 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 );
-
-
- bSizerStdButtons->Add( 0, 0, 1, 0, 5 );
-
- 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 ) );
-
- 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 );
-
-
- bSizer95->Add( bSizerStdButtons, 0, wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer95 );
- this->Layout();
- bSizer95->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( OptionsDlgGenerated::OnClose ) );
- m_buttonResetDialogs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnResetDialogs ), NULL, this );
- m_hyperlinkLogFolder->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( OptionsDlgGenerated::OnShowLogFolder ), NULL, this );
- m_checkBoxLogFilesMaxAge->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnToggleLogfilesLimit ), 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_hyperlink17->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( OptionsDlgGenerated::OnHelpShowExamples ), 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 );
+ this->SetSizeHints( wxSize( -1, -1 ), wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer95;
+ bSizer95 = new wxBoxSizer( wxVERTICAL );
+
+ 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_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 );
+
+ 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 ) );
+
+ wxBoxSizer* bSizer166;
+ bSizer166 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer186;
+ bSizer186 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer160;
+ bSizer160 = new wxBoxSizer( wxVERTICAL );
+
+ 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.") );
+
+ 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 ) );
+
+ 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 ) );
+
+ 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 ) );
+
+ bSizer176->Add( m_staticText9111, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer160->Add( bSizer176, 0, wxEXPAND, 5 );
+
+ 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.") );
+
+ 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 ) );
+
+ 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 ) );
+
+ 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 ) );
+
+ bSizerLockedFiles->Add( m_staticText922, 0, wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer160->Add( bSizerLockedFiles, 0, wxEXPAND, 5 );
+
+ 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.") );
+
+ 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 ) );
+
+ 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 ) );
+
+ 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 ) );
+
+ bSizer178->Add( m_staticText932, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer160->Add( bSizer178, 0, wxEXPAND, 5 );
+
+
+ bSizer186->Add( bSizer160, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticline39 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer186->Add( m_staticline39, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer1881;
+ bSizer1881 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticTextResetDialogs = new wxStaticText( m_panel39, wxID_ANY, _("Show all permanently hidden dialogs and warning messages again"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextResetDialogs->Wrap( -1 );
+ m_staticTextResetDialogs->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
+
+ bSizer1881->Add( m_staticTextResetDialogs, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ m_buttonResetDialogs = new zen::BitmapTextButton( m_panel39, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ bSizer1881->Add( m_buttonResetDialogs, 0, wxALL, 5 );
+
+
+ bSizer186->Add( bSizer1881, 0, wxALL|wxALIGN_CENTER_VERTICAL, 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 );
+
+ wxBoxSizer* bSizer259;
+ bSizer259 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer258;
+ bSizer258 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapLogFile = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer258->Add( m_bitmapLogFile, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticText163 = new wxStaticText( m_panel39, wxID_ANY, _("Default log path:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText163->Wrap( -1 );
+ bSizer258->Add( m_staticText163, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
+
+ m_hyperlinkLogFolder = new wxHyperlinkCtrl( m_panel39, wxID_ANY, _("dummy"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer258->Add( m_hyperlinkLogFolder, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
+
+
+ bSizer259->Add( bSizer258, 0, wxALL|wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer282;
+ bSizer282 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_checkBoxLogFilesMaxAge = new wxCheckBox( m_panel39, wxID_ANY, _("&Delete logs after x days:"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer282->Add( m_checkBoxLogFilesMaxAge, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_spinCtrlLogFilesMaxAge = new wxSpinCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
+ bSizer282->Add( m_spinCtrlLogFilesMaxAge, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer259->Add( bSizer282, 0, wxALL, 5 );
+
+
+ bSizer166->Add( bSizer259, 0, wxALL|wxEXPAND, 5 );
+
+ m_staticline361 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer166->Add( m_staticline361, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer181;
+ bSizer181 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText85 = new wxStaticText( m_panel39, wxID_ANY, _("Customize context menu:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText85->Wrap( -1 );
+ bSizer181->Add( m_staticText85, 0, wxBOTTOM, 5 );
+
+ 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 );
+
+ // Columns
+ m_gridCustomCommand->EnableDragColMove( false );
+ m_gridCustomCommand->EnableDragColSize( true );
+ m_gridCustomCommand->SetColLabelSize( -1 );
+ m_gridCustomCommand->SetColLabelValue( 0, _("Description") );
+ m_gridCustomCommand->SetColLabelValue( 1, _("Command line") );
+ m_gridCustomCommand->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
+
+ // Rows
+ m_gridCustomCommand->EnableDragRowSize( false );
+ m_gridCustomCommand->SetRowLabelSize( 1 );
+ m_gridCustomCommand->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
+
+ // Label Appearance
+
+ // Cell Defaults
+ m_gridCustomCommand->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP );
+ bSizer181->Add( m_gridCustomCommand, 1, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer193;
+ bSizer193 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonAddRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizer193->Add( m_bpButtonAddRow, 0, wxEXPAND, 5 );
+
+ m_bpButtonRemoveRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizer193->Add( m_bpButtonRemoveRow, 0, wxEXPAND, 5 );
+
+
+ bSizer193->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_hyperlink17 = new wxHyperlinkCtrl( m_panel39, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer193->Add( m_hyperlink17, 0, wxLEFT, 5 );
+
+
+ bSizer181->Add( bSizer193, 0, wxTOP|wxEXPAND, 5 );
+
+
+ bSizer166->Add( bSizer181, 1, wxEXPAND|wxALL, 10 );
+
+
+ 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 );
+
+ 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 );
+
+
+ bSizerStdButtons->Add( 0, 0, 1, 0, 5 );
+
+ 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 ) );
+
+ 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 );
+
+
+ bSizer95->Add( bSizerStdButtons, 0, wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer95 );
+ this->Layout();
+ bSizer95->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( OptionsDlgGenerated::OnClose ) );
+ m_buttonResetDialogs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnResetDialogs ), NULL, this );
+ m_hyperlinkLogFolder->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( OptionsDlgGenerated::OnShowLogFolder ), NULL, this );
+ m_checkBoxLogFilesMaxAge->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnToggleLogfilesLimit ), 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_hyperlink17->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( OptionsDlgGenerated::OnHelpShowExamples ), 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()
@@ -4462,22 +4462,22 @@ OptionsDlgGenerated::~OptionsDlgGenerated()
TooltipDlgGenerated::TooltipDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
- this->SetSizeHints( wxDefaultSize, wxDefaultSize );
-
- wxBoxSizer* bSizer158;
- bSizer158 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapLeft = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizer158->Add( m_bitmapLeft, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextMain = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextMain->Wrap( 600 );
- bSizer158->Add( m_staticTextMain, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- this->SetSizer( bSizer158 );
- this->Layout();
- bSizer158->Fit( this );
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+
+ wxBoxSizer* bSizer158;
+ bSizer158 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapLeft = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer158->Add( m_bitmapLeft, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextMain = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextMain->Wrap( 600 );
+ bSizer158->Add( m_staticTextMain, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ this->SetSizer( bSizer158 );
+ this->Layout();
+ bSizer158->Fit( this );
}
TooltipDlgGenerated::~TooltipDlgGenerated()
@@ -4486,60 +4486,60 @@ TooltipDlgGenerated::~TooltipDlgGenerated()
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 ) );
-
- 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 ) );
-
- wxBoxSizer* bSizer98;
- bSizer98 = new wxBoxSizer( wxHORIZONTAL );
-
- m_calendarFrom = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS|wxNO_BORDER );
- bSizer98->Add( m_calendarFrom, 0, wxTOP|wxBOTTOM|wxLEFT, 10 );
-
- m_calendarTo = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS|wxNO_BORDER );
- 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_staticline21 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer96->Add( m_staticline21, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- 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 ) );
-
- 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 );
-
-
- bSizer96->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- this->SetSizer( bSizer96 );
- this->Layout();
- bSizer96->Fit( this );
-
- 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 );
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ 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 ) );
+
+ wxBoxSizer* bSizer98;
+ bSizer98 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_calendarFrom = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS|wxNO_BORDER );
+ bSizer98->Add( m_calendarFrom, 0, wxTOP|wxBOTTOM|wxLEFT, 10 );
+
+ m_calendarTo = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS|wxNO_BORDER );
+ 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_staticline21 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer96->Add( m_staticline21, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ 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 ) );
+
+ 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 );
+
+
+ bSizer96->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ this->SetSizer( bSizer96 );
+ this->Layout();
+ bSizer96->Fit( this );
+
+ 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 );
}
SelectTimespanDlgGenerated::~SelectTimespanDlgGenerated()
@@ -4548,379 +4548,379 @@ 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 ) );
-
- 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 ) );
-
- wxBoxSizer* bSizer174;
- bSizer174 = new wxBoxSizer( wxHORIZONTAL );
-
- bSizerMainSection = new wxBoxSizer( wxVERTICAL );
-
- 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 );
-
- wxBoxSizer* bSizer186;
- bSizer186 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText94 = new wxStaticText( m_panel41, wxID_ANY, _("Feedback and suggestions are welcome:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText94->Wrap( -1 );
- bSizer186->Add( m_staticText94, 0, wxALL, 5 );
-
- wxBoxSizer* bSizer166;
- bSizer166 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer251;
- bSizer251 = new wxBoxSizer( wxVERTICAL );
-
- m_bitmapHomepage = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_bitmapHomepage->SetToolTip( _("Home page") );
-
- bSizer251->Add( m_bitmapHomepage, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_hyperlink1 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("FreeFileSync.org"), wxT("https://freefilesync.org/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink1->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, true, wxEmptyString ) );
- m_hyperlink1->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink1->SetToolTip( _("https://freefilesync.org") );
-
- bSizer251->Add( m_hyperlink1, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer166->Add( bSizer251, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
-
- wxBoxSizer* bSizer250;
- bSizer250 = new wxBoxSizer( wxVERTICAL );
-
- m_bitmapForum = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_bitmapForum->SetToolTip( _("FreeFileSync Forum") );
-
- bSizer250->Add( m_bitmapForum, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_hyperlink21 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("FreeFileSync Forum"), wxT("https://freefilesync.org/forum/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink21->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, true, wxEmptyString ) );
- m_hyperlink21->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink21->SetToolTip( _("https://freefilesync.org/forum/") );
-
- bSizer250->Add( m_hyperlink21, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer166->Add( bSizer250, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
-
- wxBoxSizer* bSizer249;
- bSizer249 = new wxBoxSizer( wxVERTICAL );
-
- m_bitmapEmail = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_bitmapEmail->SetToolTip( _("Email") );
-
- bSizer249->Add( m_bitmapEmail, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_hyperlink2 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("zenju@freefilesync.org"), wxT("mailto:zenju@freefilesync.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink2->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, true, wxEmptyString ) );
- m_hyperlink2->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink2->SetToolTip( _("mailto:zenju@freefilesync.org") );
-
- bSizer249->Add( m_hyperlink2, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer166->Add( bSizer249, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer186->Add( bSizer166, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizerMainSection->Add( bSizer186, 0, wxALL|wxEXPAND, 5 );
-
- m_staticline3412 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizerMainSection->Add( m_staticline3412, 0, wxEXPAND, 5 );
-
- m_panelDonate = new wxPanel( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelDonate->SetBackgroundColour( wxColour( 153, 170, 187 ) );
-
- wxBoxSizer* bSizer183;
- bSizer183 = new wxBoxSizer( wxVERTICAL );
-
- 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 );
-
-
- bSizer184->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_bitmapDonate = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizer184->Add( m_bitmapDonate, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
-
- wxBoxSizer* bSizer178;
- bSizer178 = new wxBoxSizer( wxVERTICAL );
-
- m_staticTextDonate = new wxStaticText( m_panel39, wxID_ANY, _("If you like FreeFileSync:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextDonate->Wrap( -1 );
- m_staticTextDonate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) );
- m_staticTextDonate->SetForegroundColour( wxColour( 0, 0, 0 ) );
-
- bSizer178->Add( m_staticTextDonate, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_buttonDonate = new wxButton( m_panel39, wxID_ANY, _("Support with a donation"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonDonate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
- m_buttonDonate->SetToolTip( _("https://freefilesync.org/donate.php") );
-
- bSizer178->Add( m_buttonDonate, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer184->Add( bSizer178, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
-
- bSizer184->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- m_panel39->SetSizer( bSizer184 );
- m_panel39->Layout();
- bSizer184->Fit( m_panel39 );
- bSizer183->Add( m_panel39, 0, wxALL|wxEXPAND, 5 );
-
-
- m_panelDonate->SetSizer( bSizer183 );
- m_panelDonate->Layout();
- bSizer183->Fit( m_panelDonate );
- bSizerMainSection->Add( m_panelDonate, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 10 );
-
- m_panelThankYou = new wxPanel( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelThankYou->SetBackgroundColour( wxColour( 153, 170, 187 ) );
-
- wxBoxSizer* bSizer1831;
- bSizer1831 = new wxBoxSizer( wxVERTICAL );
-
- m_panel391 = new wxPanel( m_panelThankYou, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panel391->SetBackgroundColour( wxColour( 248, 248, 248 ) );
-
- wxBoxSizer* bSizer243;
- bSizer243 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer1841;
- bSizer1841 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapThanks = new wxStaticBitmap( m_panel391, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizer1841->Add( m_bitmapThanks, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
-
- m_staticTextThanks = new wxStaticText( m_panel391, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextThanks->Wrap( -1 );
- m_staticTextThanks->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) );
- m_staticTextThanks->SetForegroundColour( wxColour( 0, 0, 0 ) );
-
- bSizer1841->Add( m_staticTextThanks, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer243->Add( bSizer1841, 1, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 );
-
- m_staticTextNoAutoUpdate = new wxStaticText( m_panel391, wxID_ANY, _("The auto updater was disabled by the administrator."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextNoAutoUpdate->Wrap( -1 );
- m_staticTextNoAutoUpdate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_ITALIC, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) );
-
- bSizer243->Add( m_staticTextNoAutoUpdate, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
- m_buttonShowDonationDetails = new wxButton( m_panel391, wxID_ANY, _("Donation details"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonShowDonationDetails->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) );
-
- bSizer243->Add( m_buttonShowDonationDetails, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
-
-
- m_panel391->SetSizer( bSizer243 );
- m_panel391->Layout();
- bSizer243->Fit( m_panel391 );
- bSizer1831->Add( m_panel391, 0, wxEXPAND|wxALL, 5 );
-
-
- m_panelThankYou->SetSizer( bSizer1831 );
- m_panelThankYou->Layout();
- bSizer1831->Fit( m_panelThankYou );
- bSizerMainSection->Add( m_panelThankYou, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 10 );
-
- wxBoxSizer* bSizer187;
- bSizer187 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText96 = new wxStaticText( m_panel41, wxID_ANY, _("Source code written in C++ using:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText96->Wrap( -1 );
- bSizer187->Add( m_staticText96, 0, wxALL, 5 );
-
- wxBoxSizer* bSizer171;
- bSizer171 = new wxBoxSizer( wxHORIZONTAL );
-
- m_hyperlink11 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("MS Visual Studio"), wxT("https://www.visualstudio.com"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink11->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink11->SetToolTip( _("https://www.visualstudio.com") );
-
- bSizer171->Add( m_hyperlink11, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink7 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("wxWidgets"), wxT("http://www.wxwidgets.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink7->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink7->SetToolTip( _("http://www.wxwidgets.org") );
-
- bSizer171->Add( m_hyperlink7, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink14 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("wxFormBuilder"), wxT("https://github.com/wxFormBuilder/wxFormBuilder"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink14->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink14->SetToolTip( _("https://github.com/wxFormBuilder/wxFormBuilder") );
-
- bSizer171->Add( m_hyperlink14, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink16 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Artistic Style"), wxT("http://astyle.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink16->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink16->SetToolTip( _("http://astyle.sourceforge.net") );
-
- bSizer171->Add( m_hyperlink16, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer187->Add( bSizer171, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
- wxBoxSizer* bSizer172;
- bSizer172 = new wxBoxSizer( wxHORIZONTAL );
-
- m_hyperlink15 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("zen::Xml"), wxT("http://zenxml.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink15->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink15->SetToolTip( _("http://zenxml.sourceforge.net") );
-
- bSizer172->Add( m_hyperlink15, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink12 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Google Test"), wxT("https://github.com/google/googletest"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink12->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink12->SetToolTip( _("https://github.com/google/googletest") );
-
- bSizer172->Add( m_hyperlink12, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink10 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("libssh2"), wxT("https://www.libssh2.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink10->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink10->SetToolTip( _("https://www.libssh2.org") );
-
- bSizer172->Add( m_hyperlink10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink101 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("libcurl"), wxT("https://curl.haxx.se/libcurl"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink101->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink101->SetToolTip( _("https://curl.haxx.se/libcurl") );
-
- bSizer172->Add( m_hyperlink101, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_hyperlink18 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("NSIS"), wxT("http://nsis.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink18->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink18->SetToolTip( _("http://nsis.sourceforge.net") );
-
- bSizer172->Add( m_hyperlink18, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink9 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Inno Setup"), wxT("http://www.jrsoftware.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink9->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink9->SetToolTip( _("http://www.jrsoftware.org") );
-
- bSizer172->Add( m_hyperlink9, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer187->Add( bSizer172, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizerMainSection->Add( bSizer187, 0, wxALL|wxEXPAND, 5 );
-
- m_staticline34 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizerMainSection->Add( m_staticline34, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer185;
- bSizer185 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText93 = new wxStaticText( m_panel41, wxID_ANY, _("Published under the GNU General Public License:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText93->Wrap( -1 );
- bSizer185->Add( m_staticText93, 0, wxALL, 5 );
-
- wxBoxSizer* bSizer1671;
- bSizer1671 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapGpl = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer1671->Add( m_bitmapGpl, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink5 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("https://www.gnu.org/licenses/gpl-3.0"), wxT("https://www.gnu.org/licenses/gpl-3.0"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink5->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- bSizer1671->Add( m_hyperlink5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer185->Add( bSizer1671, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizerMainSection->Add( bSizer185, 0, wxALL|wxEXPAND, 5 );
-
-
- bSizer174->Add( bSizerMainSection, 0, 0, 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 );
-
- m_staticline74 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer177->Add( m_staticline74, 0, wxEXPAND, 5 );
-
- m_staticTextThanksForLoc = new wxStaticText( m_panel41, wxID_ANY, _("Many thanks for localization:"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_staticTextThanksForLoc->Wrap( -1 );
- m_staticTextThanksForLoc->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
-
- bSizer177->Add( m_staticTextThanksForLoc, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT, 10 );
-
-
- bSizer177->Add( 0, 5, 0, 0, 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 ) );
-
- 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, wxLEFT|wxEXPAND, 10 );
-
-
- bSizer174->Add( bSizer177, 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 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- 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 );
-
-
- bSizer31->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- this->SetSizer( bSizer31 );
- this->Layout();
- bSizer31->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) );
- m_buttonDonate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnDonate ), NULL, this );
- m_buttonShowDonationDetails->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnShowDonationDetails ), NULL, this );
- m_buttonClose->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this );
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ 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 ) );
+
+ wxBoxSizer* bSizer174;
+ bSizer174 = new wxBoxSizer( wxHORIZONTAL );
+
+ bSizerMainSection = new wxBoxSizer( wxVERTICAL );
+
+ 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 );
+
+ wxBoxSizer* bSizer186;
+ bSizer186 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText94 = new wxStaticText( m_panel41, wxID_ANY, _("Feedback and suggestions are welcome:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText94->Wrap( -1 );
+ bSizer186->Add( m_staticText94, 0, wxALL, 5 );
+
+ wxBoxSizer* bSizer166;
+ bSizer166 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer251;
+ bSizer251 = new wxBoxSizer( wxVERTICAL );
+
+ m_bitmapHomepage = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ m_bitmapHomepage->SetToolTip( _("Home page") );
+
+ bSizer251->Add( m_bitmapHomepage, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_hyperlink1 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("FreeFileSync.org"), wxT("https://freefilesync.org/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink1->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, true, wxEmptyString ) );
+ m_hyperlink1->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink1->SetToolTip( _("https://freefilesync.org") );
+
+ bSizer251->Add( m_hyperlink1, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer166->Add( bSizer251, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer250;
+ bSizer250 = new wxBoxSizer( wxVERTICAL );
+
+ m_bitmapForum = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ m_bitmapForum->SetToolTip( _("FreeFileSync Forum") );
+
+ bSizer250->Add( m_bitmapForum, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_hyperlink21 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("FreeFileSync Forum"), wxT("https://freefilesync.org/forum/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink21->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, true, wxEmptyString ) );
+ m_hyperlink21->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink21->SetToolTip( _("https://freefilesync.org/forum/") );
+
+ bSizer250->Add( m_hyperlink21, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer166->Add( bSizer250, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer249;
+ bSizer249 = new wxBoxSizer( wxVERTICAL );
+
+ m_bitmapEmail = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ m_bitmapEmail->SetToolTip( _("Email") );
+
+ bSizer249->Add( m_bitmapEmail, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_hyperlink2 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("zenju@freefilesync.org"), wxT("mailto:zenju@freefilesync.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink2->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, true, wxEmptyString ) );
+ m_hyperlink2->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink2->SetToolTip( _("mailto:zenju@freefilesync.org") );
+
+ bSizer249->Add( m_hyperlink2, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer166->Add( bSizer249, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer186->Add( bSizer166, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizerMainSection->Add( bSizer186, 0, wxALL|wxEXPAND, 5 );
+
+ m_staticline3412 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizerMainSection->Add( m_staticline3412, 0, wxEXPAND, 5 );
+
+ m_panelDonate = new wxPanel( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelDonate->SetBackgroundColour( wxColour( 153, 170, 187 ) );
+
+ wxBoxSizer* bSizer183;
+ bSizer183 = new wxBoxSizer( wxVERTICAL );
+
+ 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 );
+
+
+ bSizer184->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_bitmapDonate = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer184->Add( m_bitmapDonate, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer178;
+ bSizer178 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticTextDonate = new wxStaticText( m_panel39, wxID_ANY, _("If you like FreeFileSync:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDonate->Wrap( -1 );
+ m_staticTextDonate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) );
+ m_staticTextDonate->SetForegroundColour( wxColour( 0, 0, 0 ) );
+
+ bSizer178->Add( m_staticTextDonate, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_buttonDonate = new wxButton( m_panel39, wxID_ANY, _("Support with a donation"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonDonate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
+ m_buttonDonate->SetToolTip( _("https://freefilesync.org/donate.php") );
+
+ bSizer178->Add( m_buttonDonate, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer184->Add( bSizer178, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+
+ bSizer184->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ m_panel39->SetSizer( bSizer184 );
+ m_panel39->Layout();
+ bSizer184->Fit( m_panel39 );
+ bSizer183->Add( m_panel39, 0, wxALL|wxEXPAND, 5 );
+
+
+ m_panelDonate->SetSizer( bSizer183 );
+ m_panelDonate->Layout();
+ bSizer183->Fit( m_panelDonate );
+ bSizerMainSection->Add( m_panelDonate, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 10 );
+
+ m_panelThankYou = new wxPanel( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelThankYou->SetBackgroundColour( wxColour( 153, 170, 187 ) );
+
+ wxBoxSizer* bSizer1831;
+ bSizer1831 = new wxBoxSizer( wxVERTICAL );
+
+ m_panel391 = new wxPanel( m_panelThankYou, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel391->SetBackgroundColour( wxColour( 248, 248, 248 ) );
+
+ wxBoxSizer* bSizer243;
+ bSizer243 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer1841;
+ bSizer1841 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapThanks = new wxStaticBitmap( m_panel391, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer1841->Add( m_bitmapThanks, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ m_staticTextThanks = new wxStaticText( m_panel391, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextThanks->Wrap( -1 );
+ m_staticTextThanks->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) );
+ m_staticTextThanks->SetForegroundColour( wxColour( 0, 0, 0 ) );
+
+ bSizer1841->Add( m_staticTextThanks, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer243->Add( bSizer1841, 1, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 );
+
+ m_staticTextNoAutoUpdate = new wxStaticText( m_panel391, wxID_ANY, _("The auto updater was disabled by the administrator."), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextNoAutoUpdate->Wrap( -1 );
+ m_staticTextNoAutoUpdate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_ITALIC, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) );
+
+ bSizer243->Add( m_staticTextNoAutoUpdate, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ m_buttonShowDonationDetails = new wxButton( m_panel391, wxID_ANY, _("Donation details"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonShowDonationDetails->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) );
+
+ bSizer243->Add( m_buttonShowDonationDetails, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
+
+
+ m_panel391->SetSizer( bSizer243 );
+ m_panel391->Layout();
+ bSizer243->Fit( m_panel391 );
+ bSizer1831->Add( m_panel391, 0, wxEXPAND|wxALL, 5 );
+
+
+ m_panelThankYou->SetSizer( bSizer1831 );
+ m_panelThankYou->Layout();
+ bSizer1831->Fit( m_panelThankYou );
+ bSizerMainSection->Add( m_panelThankYou, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 10 );
+
+ wxBoxSizer* bSizer187;
+ bSizer187 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText96 = new wxStaticText( m_panel41, wxID_ANY, _("Source code written in C++ using:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText96->Wrap( -1 );
+ bSizer187->Add( m_staticText96, 0, wxALL, 5 );
+
+ wxBoxSizer* bSizer171;
+ bSizer171 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_hyperlink11 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("MS Visual Studio"), wxT("https://www.visualstudio.com"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink11->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink11->SetToolTip( _("https://www.visualstudio.com") );
+
+ bSizer171->Add( m_hyperlink11, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink7 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("wxWidgets"), wxT("http://www.wxwidgets.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink7->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink7->SetToolTip( _("http://www.wxwidgets.org") );
+
+ bSizer171->Add( m_hyperlink7, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink14 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("wxFormBuilder"), wxT("https://github.com/wxFormBuilder/wxFormBuilder"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink14->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink14->SetToolTip( _("https://github.com/wxFormBuilder/wxFormBuilder") );
+
+ bSizer171->Add( m_hyperlink14, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink16 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Artistic Style"), wxT("http://astyle.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink16->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink16->SetToolTip( _("http://astyle.sourceforge.net") );
+
+ bSizer171->Add( m_hyperlink16, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer187->Add( bSizer171, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer172;
+ bSizer172 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_hyperlink15 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("zen::Xml"), wxT("http://zenxml.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink15->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink15->SetToolTip( _("http://zenxml.sourceforge.net") );
+
+ bSizer172->Add( m_hyperlink15, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink12 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Google Test"), wxT("https://github.com/google/googletest"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink12->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink12->SetToolTip( _("https://github.com/google/googletest") );
+
+ bSizer172->Add( m_hyperlink12, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink10 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("libssh2"), wxT("https://www.libssh2.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink10->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink10->SetToolTip( _("https://www.libssh2.org") );
+
+ bSizer172->Add( m_hyperlink10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink101 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("libcurl"), wxT("https://curl.haxx.se/libcurl"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink101->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink101->SetToolTip( _("https://curl.haxx.se/libcurl") );
+
+ bSizer172->Add( m_hyperlink101, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_hyperlink18 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("NSIS"), wxT("http://nsis.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink18->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink18->SetToolTip( _("http://nsis.sourceforge.net") );
+
+ bSizer172->Add( m_hyperlink18, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink9 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Inno Setup"), wxT("http://www.jrsoftware.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink9->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink9->SetToolTip( _("http://www.jrsoftware.org") );
+
+ bSizer172->Add( m_hyperlink9, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer187->Add( bSizer172, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizerMainSection->Add( bSizer187, 0, wxALL|wxEXPAND, 5 );
+
+ m_staticline34 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizerMainSection->Add( m_staticline34, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer185;
+ bSizer185 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText93 = new wxStaticText( m_panel41, wxID_ANY, _("Published under the GNU General Public License:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText93->Wrap( -1 );
+ bSizer185->Add( m_staticText93, 0, wxALL, 5 );
+
+ wxBoxSizer* bSizer1671;
+ bSizer1671 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapGpl = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ bSizer1671->Add( m_bitmapGpl, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink5 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("https://www.gnu.org/licenses/gpl-3.0"), wxT("https://www.gnu.org/licenses/gpl-3.0"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink5->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ bSizer1671->Add( m_hyperlink5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer185->Add( bSizer1671, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizerMainSection->Add( bSizer185, 0, wxALL|wxEXPAND, 5 );
+
+
+ bSizer174->Add( bSizerMainSection, 0, 0, 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 );
+
+ m_staticline74 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer177->Add( m_staticline74, 0, wxEXPAND, 5 );
+
+ m_staticTextThanksForLoc = new wxStaticText( m_panel41, wxID_ANY, _("Many thanks for localization:"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ m_staticTextThanksForLoc->Wrap( -1 );
+ m_staticTextThanksForLoc->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
+
+ bSizer177->Add( m_staticTextThanksForLoc, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT, 10 );
+
+
+ bSizer177->Add( 0, 5, 0, 0, 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 ) );
+
+ 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, wxLEFT|wxEXPAND, 10 );
+
+
+ bSizer174->Add( bSizer177, 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 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ 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 );
+
+
+ bSizer31->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ this->SetSizer( bSizer31 );
+ this->Layout();
+ bSizer31->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) );
+ m_buttonDonate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnDonate ), NULL, this );
+ m_buttonShowDonationDetails->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnShowDonationDetails ), NULL, this );
+ m_buttonClose->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this );
}
AboutDlgGenerated::~AboutDlgGenerated()
@@ -4929,60 +4929,60 @@ 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 );
-
- wxBoxSizer* bSizer24;
- bSizer24 = new wxBoxSizer( wxVERTICAL );
-
- 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_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 );
-
-
- bSizer24->Add( bSizer72, 0, 0, 5 );
-
- 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_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 );
-
- m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer24->Add( m_staticline9, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- 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 );
-
-
- bSizer24->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- this->SetSizer( bSizer24 );
- this->Layout();
- bSizer24->Fit( this );
-
- // Connect Events
- m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DownloadProgressDlgGenerated::OnCancel ), NULL, this );
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+
+ wxBoxSizer* bSizer24;
+ bSizer24 = new wxBoxSizer( wxVERTICAL );
+
+ 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_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 );
+
+
+ bSizer24->Add( bSizer72, 0, 0, 5 );
+
+ 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_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 );
+
+ m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer24->Add( m_staticline9, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ 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 );
+
+
+ bSizer24->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ this->SetSizer( bSizer24 );
+ this->Layout();
+ bSizer24->Fit( this );
+
+ // Connect Events
+ m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DownloadProgressDlgGenerated::OnCancel ), NULL, this );
}
DownloadProgressDlgGenerated::~DownloadProgressDlgGenerated()
@@ -4991,174 +4991,174 @@ DownloadProgressDlgGenerated::~DownloadProgressDlgGenerated()
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 ) );
-
- 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 ) );
-
- wxBoxSizer* bSizer172;
- bSizer172 = new wxBoxSizer( wxVERTICAL );
-
- 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 );
-
-
- bSizer165->Add( 0, 120, 0, 0, 5 );
-
- wxBoxSizer* bSizer16;
- bSizer16 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer16->Add( 0, 10, 0, 0, 5 );
-
- m_textCtrlLastError = new wxTextCtrl( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
- bSizer16->Add( m_textCtrlLastError, 1, wxEXPAND, 5 );
-
-
- bSizer16->Add( 0, 5, 0, 0, 5 );
-
-
- bSizer165->Add( bSizer16, 1, wxEXPAND, 5 );
-
-
- bSizer172->Add( bSizer165, 1, 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, wxBOTTOM|wxRIGHT|wxLEFT, 10 );
-
-
- 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_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 ) );
-
- wxBoxSizer* bSizer263;
- bSizer263 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer234;
- bSizer234 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText136 = new wxStaticText( m_panel3511, wxID_ANY, _("1. Activate via internet now:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText136->Wrap( -1 );
- bSizer234->Add( m_staticText136, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
-
- 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 ) );
-
- bSizer234->Add( m_buttonActivateOnline, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
-
- bSizer263->Add( bSizer234, 0, wxEXPAND|wxALL, 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_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 ) );
-
- wxBoxSizer* bSizer266;
- bSizer266 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer237;
- bSizer237 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer236;
- bSizer236 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText1361 = new wxStaticText( m_panel351, wxID_ANY, _("2. Retrieve an offline activation key from the following URL:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText1361->Wrap( -1 );
- bSizer236->Add( m_staticText1361, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
-
- m_buttonCopyUrl = new wxButton( m_panel351, wxID_ANY, _("&Copy to clipboard"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonCopyUrl->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) );
-
- bSizer236->Add( m_buttonCopyUrl, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
-
- bSizer237->Add( bSizer236, 0, wxEXPAND, 5 );
-
- m_textCtrlManualActivationUrl = new wxTextCtrl( m_panel351, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,55 ), wxTE_MULTILINE|wxTE_READONLY );
- bSizer237->Add( m_textCtrlManualActivationUrl, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
-
- 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|wxTOP|wxBOTTOM|wxLEFT, 5 );
-
- m_textCtrlOfflineActivationKey = new wxTextCtrl( m_panel351, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 250,-1 ), wxTE_PROCESS_ENTER );
- bSizer235->Add( m_textCtrlOfflineActivationKey, 1, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 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 ) );
-
- bSizer235->Add( m_buttonActivateOffline, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer237->Add( bSizer235, 0, wxEXPAND, 5 );
-
-
- bSizer266->Add( bSizer237, 0, wxALL|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 );
-
- 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 );
-
-
- bSizer54->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- this->SetSizer( bSizer54 );
- this->Layout();
- bSizer54->Fit( this );
-
- 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 );
+ this->SetSizeHints( wxSize( -1, -1 ), wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ 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 ) );
+
+ wxBoxSizer* bSizer172;
+ bSizer172 = new wxBoxSizer( wxVERTICAL );
+
+ 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 );
+
+
+ bSizer165->Add( 0, 120, 0, 0, 5 );
+
+ wxBoxSizer* bSizer16;
+ bSizer16 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer16->Add( 0, 10, 0, 0, 5 );
+
+ m_textCtrlLastError = new wxTextCtrl( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
+ bSizer16->Add( m_textCtrlLastError, 1, wxEXPAND, 5 );
+
+
+ bSizer16->Add( 0, 5, 0, 0, 5 );
+
+
+ bSizer165->Add( bSizer16, 1, wxEXPAND, 5 );
+
+
+ bSizer172->Add( bSizer165, 1, 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, wxBOTTOM|wxRIGHT|wxLEFT, 10 );
+
+
+ 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_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 ) );
+
+ wxBoxSizer* bSizer263;
+ bSizer263 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer234;
+ bSizer234 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText136 = new wxStaticText( m_panel3511, wxID_ANY, _("1. Activate via internet now:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText136->Wrap( -1 );
+ bSizer234->Add( m_staticText136, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ 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 ) );
+
+ bSizer234->Add( m_buttonActivateOnline, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ bSizer263->Add( bSizer234, 0, wxEXPAND|wxALL, 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_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 ) );
+
+ wxBoxSizer* bSizer266;
+ bSizer266 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer237;
+ bSizer237 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer236;
+ bSizer236 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText1361 = new wxStaticText( m_panel351, wxID_ANY, _("2. Retrieve an offline activation key from the following URL:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText1361->Wrap( -1 );
+ bSizer236->Add( m_staticText1361, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ m_buttonCopyUrl = new wxButton( m_panel351, wxID_ANY, _("&Copy to clipboard"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ m_buttonCopyUrl->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) );
+
+ bSizer236->Add( m_buttonCopyUrl, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ bSizer237->Add( bSizer236, 0, wxEXPAND, 5 );
+
+ m_textCtrlManualActivationUrl = new wxTextCtrl( m_panel351, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, 55 ), wxTE_MULTILINE|wxTE_READONLY );
+ bSizer237->Add( m_textCtrlManualActivationUrl, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
+
+ 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|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ m_textCtrlOfflineActivationKey = new wxTextCtrl( m_panel351, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 250, -1 ), wxTE_PROCESS_ENTER );
+ bSizer235->Add( m_textCtrlOfflineActivationKey, 1, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 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 ) );
+
+ bSizer235->Add( m_buttonActivateOffline, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer237->Add( bSizer235, 0, wxEXPAND, 5 );
+
+
+ bSizer266->Add( bSizer237, 0, wxALL|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 );
+
+ 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 );
+
+
+ bSizer54->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ this->SetSizer( bSizer54 );
+ this->Layout();
+ bSizer54->Fit( this );
+
+ 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 );
}
ActivationDlgGenerated::~ActivationDlgGenerated()
@@ -5167,65 +5167,65 @@ ActivationDlgGenerated::~ActivationDlgGenerated()
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 ) );
-
- 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 ) );
-
- wxBoxSizer* bSizer98;
- bSizer98 = new wxBoxSizer( wxHORIZONTAL );
-
- 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_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 );
-
-
- 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 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- 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 ) );
-
- 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 );
-
-
- bSizer96->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- this->SetSizer( bSizer96 );
- this->Layout();
- bSizer96->Fit( this );
-
- 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 );
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ 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 ) );
+
+ wxBoxSizer* bSizer98;
+ bSizer98 = new wxBoxSizer( wxHORIZONTAL );
+
+ 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_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 );
+
+
+ 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 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ 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 ) );
+
+ 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 );
+
+
+ bSizer96->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ this->SetSizer( bSizer96 );
+ this->Layout();
+ bSizer96->Fit( this );
+
+ 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 );
}
CfgHighlightDlgGenerated::~CfgHighlightDlgGenerated()
diff --git a/FreeFileSync/Source/ui/gui_generated.h b/FreeFileSync/Source/ui/gui_generated.h
index 635172c1..3f42dfe6 100644
--- a/FreeFileSync/Source/ui/gui_generated.h
+++ b/FreeFileSync/Source/ui/gui_generated.h
@@ -61,1200 +61,1200 @@
///////////////////////////////////////////////////////////////////////////////
/// Class MainDialogGenerated
///////////////////////////////////////////////////////////////////////////////
-class MainDialogGenerated : public wxFrame
+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;
- wxMenu* m_menu4;
- 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_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;
- 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;
- wxBitmapButton* m_bpButtonSaveAs;
- wxBitmapButton* m_bpButtonSaveAsBatch;
- wxStaticText* m_staticText97;
- zen::Grid* m_gridCfgHistory;
- wxPanel* m_panelViewFilter;
- wxBoxSizer* bSizerViewFilter;
- wxBitmapButton* m_bpButtonShowLog;
- wxStaticText* m_staticTextViewType;
- zen::ToggleButton* m_bpButtonViewTypeSyncAction;
- wxStaticText* m_staticTextSelectView;
- 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_bpButtonViewFilterSave;
- 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, overide 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 OnShowLog( 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 OnCompSettingsContext( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnCompSettingsContext( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnGlobalFilterContext( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnGlobalFilterContext( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSyncSettingsContext( 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 OnToggleViewButton( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnViewFilterSave( 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_bitmapLogStatus;
- wxStaticText* m_staticTextLogStatus;
- wxPanel* m_panelItemsProcessed;
- wxStaticText* m_staticTextItemsProcessed;
- wxStaticText* m_staticTextBytesProcessed;
- wxPanel* m_panelItemsRemaining;
- wxStaticText* m_staticTextItemsRemaining;
- wxStaticText* m_staticTextBytesRemaining;
- wxStaticText* m_staticTextTotalTime;
- 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;
+ wxMenu* m_menu4;
+ 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_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;
+ 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;
+ wxBitmapButton* m_bpButtonSaveAs;
+ wxBitmapButton* m_bpButtonSaveAsBatch;
+ wxStaticText* m_staticText97;
+ zen::Grid* m_gridCfgHistory;
+ wxPanel* m_panelViewFilter;
+ wxBoxSizer* bSizerViewFilter;
+ wxBitmapButton* m_bpButtonShowLog;
+ wxStaticText* m_staticTextViewType;
+ zen::ToggleButton* m_bpButtonViewTypeSyncAction;
+ wxStaticText* m_staticTextSelectView;
+ 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_bpButtonViewFilterSave;
+ 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, overide 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 OnShowLog( 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 OnCompSettingsContext( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnCompSettingsContext( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnGlobalFilterContext( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnGlobalFilterContext( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSyncSettingsContext( 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 OnToggleViewButton( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnViewFilterSave( 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_bitmapLogStatus;
+ wxStaticText* m_staticTextLogStatus;
+ wxPanel* m_panelItemsProcessed;
+ wxStaticText* m_staticTextItemsProcessed;
+ wxStaticText* m_staticTextBytesProcessed;
+ wxPanel* m_panelItemsRemaining;
+ wxStaticText* m_staticTextItemsRemaining;
+ wxStaticText* m_staticTextBytesRemaining;
+ wxStaticText* m_staticTextTotalTime;
+ 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();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class FolderPairPanelGenerated
///////////////////////////////////////////////////////////////////////////////
-class FolderPairPanelGenerated : public wxPanel
+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 = wxDefaultSize, long style = 0 );
- ~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 = wxDefaultSize, long style = 0 );
+ ~FolderPairPanelGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class ConfigDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class ConfigDlgGenerated : public wxDialog
+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;
- wxToggleButton* m_toggleBtnByTimeSize;
- wxToggleButton* m_toggleBtnByContent;
- wxToggleButton* m_toggleBtnBySize;
- 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_staticline441;
- wxStaticLine* m_staticline331;
- wxBoxSizer* bSizerCompMisc;
- 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_staticline3311;
- wxStaticLine* m_staticlinePerformance;
- wxBoxSizer* bSizerPerformance;
- wxStaticText* m_staticTextPerfDeRequired;
- wxStaticLine* m_staticlinePerfDeRequired;
- wxPanel* m_panelPerfHeader;
- wxStaticBitmap* m_bitmapPerf;
- wxStaticText* m_staticText13611;
- 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_panelFilterSettings;
- 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;
- wxSpinCtrl* m_spinCtrlTimespan;
- wxChoice* m_choiceUnitTimespan;
- wxStaticLine* m_staticline231;
- wxButton* m_buttonClear;
- wxPanel* m_panelSyncSettingsTab;
- wxBoxSizer* bSizerHeaderSyncSettings;
- wxStaticText* m_staticTextMainSyncSettings;
- wxCheckBox* m_checkBoxUseLocalSyncOptions;
- wxStaticLine* m_staticlineSyncHeader;
- wxPanel* m_panelSyncSettings;
- wxStaticText* m_staticText86;
- wxToggleButton* m_toggleBtnTwoWay;
- wxToggleButton* m_toggleBtnMirror;
- wxToggleButton* m_toggleBtnUpdate;
- wxToggleButton* m_toggleBtnCustom;
- wxBoxSizer* bSizerSyncDirHolder;
- wxBoxSizer* bSizerSyncDirections;
- wxStaticText* m_staticTextCategory;
- 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;
- wxWrapSizer* 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;
- wxToggleButton* m_toggleBtnRecycler;
- wxToggleButton* m_toggleBtnPermanent;
- wxToggleButton* m_toggleBtnVersioning;
- 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;
- wxPanel* m_panelLogfile;
- wxStaticBitmap* m_bitmapLogFile;
- wxCheckBox* m_checkBoxSaveLog;
- wxButton* m_buttonSelectLogFolder;
- wxStaticLine* m_staticline57;
- wxStaticText* m_staticText89;
- fff::CommandBox* m_comboBoxPostSyncCommand;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonOkay;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide 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 OnCompByTimeSizeDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnCompByTimeSize( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCompByContentDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnCompByContent( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCompBySizeDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnCompBySize( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnChangeCompOption( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnHelpComparisonSettings( wxHyperlinkEvent& event ) { event.Skip(); }
- virtual void onlTimeShiftKeyDown( wxKeyEvent& event ) { event.Skip(); }
- virtual void OnHelpTimeShift( wxHyperlinkEvent& event ) { event.Skip(); }
- virtual void OnToggleIgnoreErrors( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnToggleAutoRetry( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnHelpPerformance( wxHyperlinkEvent& event ) { event.Skip(); }
- virtual void OnChangeFilterOption( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnHelpShowExamples( wxHyperlinkEvent& event ) { event.Skip(); }
- virtual void OnFilterReset( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnToggleLocalSyncSettings( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSyncTwoWayDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnSyncTwoWay( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSyncMirrorDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnSyncMirror( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSyncUpdateDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnSyncUpdate( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSyncCustomDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnSyncCustom( wxCommandEvent& 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 OnHelpDetectMovedFiles( wxHyperlinkEvent& 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 OnHelpVersioning( wxHyperlinkEvent& event ) { event.Skip(); }
- virtual void OnChanegVersioningStyle( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnToggleVersioningLimit( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnToggleSaveLogfile( 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_bpButtonSelectAltLogFolder;
- fff::FolderHistoryBox* m_logFolderPath;
- 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;
+ wxToggleButton* m_toggleBtnByTimeSize;
+ wxToggleButton* m_toggleBtnByContent;
+ wxToggleButton* m_toggleBtnBySize;
+ 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_staticline441;
+ wxStaticLine* m_staticline331;
+ wxBoxSizer* bSizerCompMisc;
+ 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_staticline3311;
+ wxStaticLine* m_staticline751;
+ wxBoxSizer* bSizerPerformance;
+ wxStaticText* m_staticTextPerfDeRequired;
+ wxStaticLine* m_staticlinePerfDeRequired;
+ wxPanel* m_panelPerfHeader;
+ wxStaticBitmap* m_bitmapPerf;
+ wxStaticText* m_staticText13611;
+ 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_panelFilterSettings;
+ 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;
+ wxSpinCtrl* m_spinCtrlTimespan;
+ wxChoice* m_choiceUnitTimespan;
+ wxStaticLine* m_staticline231;
+ wxButton* m_buttonClear;
+ wxPanel* m_panelSyncSettingsTab;
+ wxBoxSizer* bSizerHeaderSyncSettings;
+ wxStaticText* m_staticTextMainSyncSettings;
+ wxCheckBox* m_checkBoxUseLocalSyncOptions;
+ wxStaticLine* m_staticlineSyncHeader;
+ wxPanel* m_panelSyncSettings;
+ wxStaticText* m_staticText86;
+ wxToggleButton* m_toggleBtnTwoWay;
+ wxToggleButton* m_toggleBtnMirror;
+ wxToggleButton* m_toggleBtnUpdate;
+ wxToggleButton* m_toggleBtnCustom;
+ wxBoxSizer* bSizerSyncDirHolder;
+ wxBoxSizer* bSizerSyncDirections;
+ wxStaticText* m_staticTextCategory;
+ 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;
+ wxWrapSizer* 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;
+ wxToggleButton* m_toggleBtnRecycler;
+ wxToggleButton* m_toggleBtnPermanent;
+ wxToggleButton* m_toggleBtnVersioning;
+ 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;
+ wxPanel* m_panelLogfile;
+ wxStaticBitmap* m_bitmapLogFile;
+ wxCheckBox* m_checkBoxSaveLog;
+ wxButton* m_buttonSelectLogFolder;
+ wxStaticLine* m_staticline57;
+ wxStaticText* m_staticText89;
+ fff::CommandBox* m_comboBoxPostSyncCommand;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonOkay;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide 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 OnCompByTimeSizeDouble( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnCompByTimeSize( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCompByContentDouble( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnCompByContent( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCompBySizeDouble( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnCompBySize( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnChangeCompOption( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnHelpComparisonSettings( wxHyperlinkEvent& event ) { event.Skip(); }
+ virtual void onlTimeShiftKeyDown( wxKeyEvent& event ) { event.Skip(); }
+ virtual void OnHelpTimeShift( wxHyperlinkEvent& event ) { event.Skip(); }
+ virtual void OnToggleIgnoreErrors( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnToggleAutoRetry( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnHelpPerformance( wxHyperlinkEvent& event ) { event.Skip(); }
+ virtual void OnChangeFilterOption( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnHelpShowExamples( wxHyperlinkEvent& event ) { event.Skip(); }
+ virtual void OnFilterReset( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnToggleLocalSyncSettings( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSyncTwoWayDouble( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnSyncTwoWay( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSyncMirrorDouble( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnSyncMirror( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSyncUpdateDouble( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnSyncUpdate( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSyncCustomDouble( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnSyncCustom( wxCommandEvent& 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 OnHelpDetectMovedFiles( wxHyperlinkEvent& 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 OnHelpVersioning( wxHyperlinkEvent& event ) { event.Skip(); }
+ virtual void OnChanegVersioningStyle( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnToggleVersioningLimit( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnToggleSaveLogfile( 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_bpButtonSelectAltLogFolder;
+ fff::FolderHistoryBox* m_logFolderPath;
+ 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();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class CloudSetupDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class CloudSetupDlgGenerated : public wxDialog
+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;
- wxStaticText* m_staticText166;
- wxListBox* m_listBoxGdriveUsers;
- wxStaticText* m_staticText167;
- zen::BitmapTextButton* m_buttonGdriveAddUser;
- zen::BitmapTextButton* m_buttonGdriveRemoveUser;
- wxStaticLine* m_staticline76;
- wxStaticLine* m_staticline74;
- wxStaticText* m_staticText165;
- wxStaticBitmap* m_bitmapGdriveSelectedUser;
- wxStaticText* m_staticTextGdriveUser;
- 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;
- wxStaticLine* m_staticline581;
- wxStaticBitmap* m_bitmapServerDir;
- wxStaticText* m_staticText1232;
- wxBoxSizer* bSizerAccessTimeout;
- wxStaticLine* m_staticline72;
- wxStaticText* m_staticTextTimeout;
- wxSpinCtrl* m_spinCtrlTimeout;
- wxTextCtrl* m_textCtrlServerPath;
- wxButton* m_buttonSelectFolder;
- wxBoxSizer* bSizer255;
- 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;
- wxStaticText* m_staticTextChannelCountSftp;
- wxSpinCtrl* m_spinCtrlChannelCountSftp;
- wxButton* m_buttonChannelCountSftp;
- wxStaticLine* m_staticline12;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonOkay;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide 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 OnToggleShowPassword( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnBrowseCloudFolder( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnHelpFtpPerformance( wxHyperlinkEvent& 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|wxMAXIMIZE_BOX|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;
+ wxStaticText* m_staticText166;
+ wxListBox* m_listBoxGdriveUsers;
+ wxStaticText* m_staticText167;
+ zen::BitmapTextButton* m_buttonGdriveAddUser;
+ zen::BitmapTextButton* m_buttonGdriveRemoveUser;
+ wxStaticLine* m_staticline76;
+ wxStaticLine* m_staticline74;
+ wxStaticText* m_staticText165;
+ wxStaticBitmap* m_bitmapGdriveSelectedUser;
+ wxStaticText* m_staticTextGdriveUser;
+ 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;
+ wxStaticLine* m_staticline581;
+ wxStaticBitmap* m_bitmapServerDir;
+ wxStaticText* m_staticText1232;
+ wxBoxSizer* bSizerAccessTimeout;
+ wxStaticLine* m_staticline72;
+ wxStaticText* m_staticTextTimeout;
+ wxSpinCtrl* m_spinCtrlTimeout;
+ wxTextCtrl* m_textCtrlServerPath;
+ wxButton* m_buttonSelectFolder;
+ wxBoxSizer* bSizer255;
+ 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;
+ wxStaticText* m_staticTextChannelCountSftp;
+ wxSpinCtrl* m_spinCtrlChannelCountSftp;
+ wxButton* m_buttonChannelCountSftp;
+ wxStaticLine* m_staticline12;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonOkay;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide 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 OnToggleShowPassword( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnBrowseCloudFolder( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnHelpFtpPerformance( wxHyperlinkEvent& 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|wxMAXIMIZE_BOX|wxRESIZE_BORDER );
+ ~CloudSetupDlgGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class AbstractFolderPickerGenerated
///////////////////////////////////////////////////////////////////////////////
-class AbstractFolderPickerGenerated : public wxDialog
+class AbstractFolderPickerGenerated : public wxDialog
{
- private:
-
- protected:
- wxPanel* m_panel41;
- wxStaticText* m_staticTextStatus;
- wxTreeCtrl* m_treeCtrlFileSystem;
- wxStaticLine* m_staticline12;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonOkay;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide 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:
-
- 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();
-
+private:
+
+protected:
+ wxPanel* m_panel41;
+ wxStaticText* m_staticTextStatus;
+ wxTreeCtrl* m_treeCtrlFileSystem;
+ wxStaticLine* m_staticline12;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonOkay;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide 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:
+
+ 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();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class SyncConfirmationDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class SyncConfirmationDlgGenerated : public wxDialog
+class SyncConfirmationDlgGenerated : public wxDialog
{
- private:
-
- protected:
- wxStaticBitmap* m_bitmapSync;
- wxStaticText* m_staticTextHeader;
- wxStaticLine* m_staticline371;
- wxPanel* m_panelStatistics;
- wxStaticLine* m_staticline38;
- wxStaticText* m_staticText84;
- wxStaticText* m_staticTextVariant;
- 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, overide 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 = _("FreeFileSync"), 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_staticTextVariant;
+ 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, overide 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();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class CompareProgressDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class CompareProgressDlgGenerated : public wxPanel
+class CompareProgressDlgGenerated : public wxPanel
{
- private:
-
- protected:
- wxPanel* m_panelStatistics;
- wxStaticText* m_staticTextItemsFoundLabel;
- wxStaticText* m_staticTextItemsFound;
- wxStaticText* m_staticTextItemsRemainingLabel;
- wxBoxSizer* bSizerItemsRemaining;
- wxStaticText* m_staticTextItemsRemaining;
- wxStaticText* m_staticTextBytesRemaining;
- wxStaticText* m_staticTextTimeRemainingLabel;
- wxStaticText* m_staticTextTimeRemaining;
- wxStaticText* m_staticTextTimeElapsed;
- wxStaticText* m_staticTextStatus;
- wxStaticText* m_staticText1461;
- wxStaticText* m_staticTextRetryCount;
- wxStaticText* m_staticText146;
- wxBoxSizer* bSizerProgressGraph;
- zen::Graph2D* m_panelProgressGraph;
-
- public:
- 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 = wxRAISED_BORDER );
- ~CompareProgressDlgGenerated();
-
+private:
+
+protected:
+ wxPanel* m_panelStatistics;
+ wxStaticText* m_staticTextItemsFoundLabel;
+ wxStaticText* m_staticTextItemsFound;
+ wxStaticText* m_staticTextItemsRemainingLabel;
+ wxBoxSizer* bSizerItemsRemaining;
+ wxStaticText* m_staticTextItemsRemaining;
+ wxStaticText* m_staticTextBytesRemaining;
+ wxStaticText* m_staticTextTimeRemainingLabel;
+ wxStaticText* m_staticTextTimeRemaining;
+ wxStaticText* m_staticTextTimeElapsed;
+ wxStaticText* m_staticTextStatus;
+ wxStaticText* m_staticText1461;
+ wxStaticText* m_staticTextRetryCount;
+ wxStaticText* m_staticText146;
+ wxBoxSizer* bSizerProgressGraph;
+ zen::Graph2D* m_panelProgressGraph;
+
+public:
+ 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 = wxRAISED_BORDER );
+ ~CompareProgressDlgGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class SyncProgressPanelGenerated
///////////////////////////////////////////////////////////////////////////////
-class SyncProgressPanelGenerated : public wxPanel
+class SyncProgressPanelGenerated : public wxPanel
{
- private:
-
- protected:
- wxPanel* m_panel53;
- wxBoxSizer* bSizer42;
- 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;
- wxPanel* m_panelItemsProcessed;
- wxStaticText* m_staticTextItemsProcessed;
- wxStaticText* m_staticTextBytesProcessed;
- wxPanel* m_panelItemsRemaining;
- wxStaticText* m_staticTextItemsRemaining;
- wxStaticText* m_staticTextBytesRemaining;
- wxPanel* m_panelTimeRemaining;
- wxStaticText* m_staticTextTimeRemaining;
- wxStaticText* m_staticTextTimeElapsed;
- wxStaticBitmap* m_bitmapGraphKeyBytes;
- wxStaticBitmap* m_bitmapGraphKeyItems;
- 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 );
- ~SyncProgressPanelGenerated();
-
+private:
+
+protected:
+ wxPanel* m_panel53;
+ wxBoxSizer* bSizer42;
+ 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;
+ wxPanel* m_panelItemsProcessed;
+ wxStaticText* m_staticTextItemsProcessed;
+ wxStaticText* m_staticTextBytesProcessed;
+ wxPanel* m_panelItemsRemaining;
+ wxStaticText* m_staticTextItemsRemaining;
+ wxStaticText* m_staticTextBytesRemaining;
+ wxPanel* m_panelTimeRemaining;
+ wxStaticText* m_staticTextTimeRemaining;
+ wxStaticText* m_staticTextTimeElapsed;
+ wxStaticBitmap* m_bitmapGraphKeyBytes;
+ wxStaticBitmap* m_bitmapGraphKeyItems;
+ 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 );
+ ~SyncProgressPanelGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class LogPanelGenerated
///////////////////////////////////////////////////////////////////////////////
-class LogPanelGenerated : public wxPanel
+class LogPanelGenerated : public wxPanel
{
- private:
-
- protected:
- zen::ToggleButton* m_bpButtonErrors;
- zen::ToggleButton* m_bpButtonWarnings;
- zen::ToggleButton* m_bpButtonInfo;
- wxStaticLine* m_staticline13;
-
- // Virtual event handlers, overide 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;
-
- LogPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL );
- ~LogPanelGenerated();
-
+private:
+
+protected:
+ zen::ToggleButton* m_bpButtonErrors;
+ zen::ToggleButton* m_bpButtonWarnings;
+ zen::ToggleButton* m_bpButtonInfo;
+ wxStaticLine* m_staticline13;
+
+ // Virtual event handlers, overide 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;
+
+ LogPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL );
+ ~LogPanelGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class BatchDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class BatchDlgGenerated : public wxDialog
+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, overide 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 OnErrorDialogShow( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnErrorDialogCancel( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnHelpScheduleBatch( wxHyperlinkEvent& 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, overide 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 OnErrorDialogShow( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnErrorDialogCancel( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnHelpScheduleBatch( wxHyperlinkEvent& 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();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class DeleteDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class DeleteDlgGenerated : public wxDialog
+class DeleteDlgGenerated : public wxDialog
{
- 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;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnUseRecycler( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnOK( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
-
-
- public:
-
- DeleteDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Delete Items"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER );
- ~DeleteDlgGenerated();
-
+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;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnUseRecycler( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnOK( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+public:
+
+ DeleteDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Delete Items"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER );
+ ~DeleteDlgGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class CopyToDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class CopyToDlgGenerated : public wxDialog
+class CopyToDlgGenerated : public wxDialog
{
- 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;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnUseRecycler( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnOK( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
-
-
- public:
- 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();
-
+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;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnUseRecycler( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnOK( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+public:
+ 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();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class OptionsDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class OptionsDlgGenerated : public wxDialog
+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;
- wxStaticText* m_staticTextResetDialogs;
- zen::BitmapTextButton* m_buttonResetDialogs;
- wxStaticLine* m_staticline191;
- wxStaticBitmap* m_bitmapLogFile;
- wxStaticText* m_staticText163;
- wxHyperlinkCtrl* m_hyperlinkLogFolder;
- wxCheckBox* m_checkBoxLogFilesMaxAge;
- wxSpinCtrl* m_spinCtrlLogFilesMaxAge;
- wxStaticLine* m_staticline361;
- wxStaticText* m_staticText85;
- wxGrid* m_gridCustomCommand;
- wxBitmapButton* m_bpButtonAddRow;
- wxBitmapButton* m_bpButtonRemoveRow;
- wxHyperlinkCtrl* m_hyperlink17;
- wxStaticLine* m_staticline36;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonDefault;
- wxButton* m_buttonOkay;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnResetDialogs( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnShowLogFolder( wxHyperlinkEvent& event ) { event.Skip(); }
- virtual void OnToggleLogfilesLimit( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnAddRow( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnRemoveRow( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnHelpShowExamples( wxHyperlinkEvent& 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:
-
- 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;
+ wxStaticText* m_staticTextResetDialogs;
+ zen::BitmapTextButton* m_buttonResetDialogs;
+ wxStaticLine* m_staticline191;
+ wxStaticBitmap* m_bitmapLogFile;
+ wxStaticText* m_staticText163;
+ wxHyperlinkCtrl* m_hyperlinkLogFolder;
+ wxCheckBox* m_checkBoxLogFilesMaxAge;
+ wxSpinCtrl* m_spinCtrlLogFilesMaxAge;
+ wxStaticLine* m_staticline361;
+ wxStaticText* m_staticText85;
+ wxGrid* m_gridCustomCommand;
+ wxBitmapButton* m_bpButtonAddRow;
+ wxBitmapButton* m_bpButtonRemoveRow;
+ wxHyperlinkCtrl* m_hyperlink17;
+ wxStaticLine* m_staticline36;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonDefault;
+ wxButton* m_buttonOkay;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnResetDialogs( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnShowLogFolder( wxHyperlinkEvent& event ) { event.Skip(); }
+ virtual void OnToggleLogfilesLimit( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnAddRow( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnRemoveRow( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnHelpShowExamples( wxHyperlinkEvent& 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:
+
+ 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();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class TooltipDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class TooltipDlgGenerated : public wxDialog
+class TooltipDlgGenerated : public wxDialog
{
- private:
-
- protected:
-
- public:
- wxStaticBitmap* m_bitmapLeft;
- wxStaticText* m_staticTextMain;
-
- TooltipDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
- ~TooltipDlgGenerated();
-
+private:
+
+protected:
+
+public:
+ wxStaticBitmap* m_bitmapLeft;
+ wxStaticText* m_staticTextMain;
+
+ TooltipDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~TooltipDlgGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class SelectTimespanDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class SelectTimespanDlgGenerated : public wxDialog
+class SelectTimespanDlgGenerated : public wxDialog
{
- private:
-
- protected:
- wxPanel* m_panel35;
- wxCalendarCtrl* m_calendarFrom;
- wxCalendarCtrl* m_calendarTo;
- wxStaticLine* m_staticline21;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonOkay;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide 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:
-
- 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();
-
+private:
+
+protected:
+ wxPanel* m_panel35;
+ wxCalendarCtrl* m_calendarFrom;
+ wxCalendarCtrl* m_calendarTo;
+ wxStaticLine* m_staticline21;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonOkay;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide 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:
+
+ 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();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class AboutDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class AboutDlgGenerated : public wxDialog
+class AboutDlgGenerated : public wxDialog
{
- private:
-
- protected:
- wxPanel* m_panel41;
- wxBoxSizer* bSizerMainSection;
- wxStaticBitmap* m_bitmapLogo;
- wxStaticLine* m_staticline341;
- wxStaticText* m_staticText94;
- wxStaticBitmap* m_bitmapHomepage;
- wxHyperlinkCtrl* m_hyperlink1;
- wxStaticBitmap* m_bitmapForum;
- wxHyperlinkCtrl* m_hyperlink21;
- wxStaticBitmap* m_bitmapEmail;
- wxHyperlinkCtrl* m_hyperlink2;
- wxStaticLine* m_staticline3412;
- wxPanel* m_panelDonate;
- wxPanel* m_panel39;
- wxStaticBitmap* m_bitmapDonate;
- wxStaticText* m_staticTextDonate;
- wxButton* m_buttonDonate;
- wxPanel* m_panelThankYou;
- wxPanel* m_panel391;
- wxStaticBitmap* m_bitmapThanks;
- wxStaticText* m_staticTextThanks;
- wxStaticText* m_staticTextNoAutoUpdate;
- wxButton* m_buttonShowDonationDetails;
- wxStaticText* m_staticText96;
- wxHyperlinkCtrl* m_hyperlink11;
- wxHyperlinkCtrl* m_hyperlink7;
- wxHyperlinkCtrl* m_hyperlink14;
- wxHyperlinkCtrl* m_hyperlink16;
- wxHyperlinkCtrl* m_hyperlink15;
- wxHyperlinkCtrl* m_hyperlink12;
- wxHyperlinkCtrl* m_hyperlink10;
- wxHyperlinkCtrl* m_hyperlink101;
- wxHyperlinkCtrl* m_hyperlink18;
- wxHyperlinkCtrl* m_hyperlink9;
- wxStaticLine* m_staticline34;
- wxStaticText* m_staticText93;
- wxStaticBitmap* m_bitmapGpl;
- wxHyperlinkCtrl* m_hyperlink5;
- wxStaticLine* m_staticline37;
- wxStaticLine* m_staticline74;
- wxStaticText* m_staticTextThanksForLoc;
- wxScrolledWindow* m_scrolledWindowTranslators;
- wxFlexGridSizer* fgSizerTranslators;
- wxStaticLine* m_staticline36;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonClose;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnDonate( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnShowDonationDetails( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnOK( wxCommandEvent& event ) { event.Skip(); }
-
-
- public:
-
- AboutDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
- ~AboutDlgGenerated();
-
+private:
+
+protected:
+ wxPanel* m_panel41;
+ wxBoxSizer* bSizerMainSection;
+ wxStaticBitmap* m_bitmapLogo;
+ wxStaticLine* m_staticline341;
+ wxStaticText* m_staticText94;
+ wxStaticBitmap* m_bitmapHomepage;
+ wxHyperlinkCtrl* m_hyperlink1;
+ wxStaticBitmap* m_bitmapForum;
+ wxHyperlinkCtrl* m_hyperlink21;
+ wxStaticBitmap* m_bitmapEmail;
+ wxHyperlinkCtrl* m_hyperlink2;
+ wxStaticLine* m_staticline3412;
+ wxPanel* m_panelDonate;
+ wxPanel* m_panel39;
+ wxStaticBitmap* m_bitmapDonate;
+ wxStaticText* m_staticTextDonate;
+ wxButton* m_buttonDonate;
+ wxPanel* m_panelThankYou;
+ wxPanel* m_panel391;
+ wxStaticBitmap* m_bitmapThanks;
+ wxStaticText* m_staticTextThanks;
+ wxStaticText* m_staticTextNoAutoUpdate;
+ wxButton* m_buttonShowDonationDetails;
+ wxStaticText* m_staticText96;
+ wxHyperlinkCtrl* m_hyperlink11;
+ wxHyperlinkCtrl* m_hyperlink7;
+ wxHyperlinkCtrl* m_hyperlink14;
+ wxHyperlinkCtrl* m_hyperlink16;
+ wxHyperlinkCtrl* m_hyperlink15;
+ wxHyperlinkCtrl* m_hyperlink12;
+ wxHyperlinkCtrl* m_hyperlink10;
+ wxHyperlinkCtrl* m_hyperlink101;
+ wxHyperlinkCtrl* m_hyperlink18;
+ wxHyperlinkCtrl* m_hyperlink9;
+ wxStaticLine* m_staticline34;
+ wxStaticText* m_staticText93;
+ wxStaticBitmap* m_bitmapGpl;
+ wxHyperlinkCtrl* m_hyperlink5;
+ wxStaticLine* m_staticline37;
+ wxStaticLine* m_staticline74;
+ wxStaticText* m_staticTextThanksForLoc;
+ wxScrolledWindow* m_scrolledWindowTranslators;
+ wxFlexGridSizer* fgSizerTranslators;
+ wxStaticLine* m_staticline36;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonClose;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnDonate( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnShowDonationDetails( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnOK( wxCommandEvent& event ) { event.Skip(); }
+
+
+public:
+
+ AboutDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~AboutDlgGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class DownloadProgressDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class DownloadProgressDlgGenerated : public wxDialog
+class DownloadProgressDlgGenerated : public wxDialog
{
- private:
-
- protected:
- wxStaticBitmap* m_bitmapDownloading;
- wxStaticText* m_staticTextHeader;
- wxGauge* m_gaugeProgress;
- wxStaticText* m_staticTextDetails;
- wxStaticLine* m_staticline9;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
-
-
- public:
-
- DownloadProgressDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0 );
- ~DownloadProgressDlgGenerated();
-
+private:
+
+protected:
+ wxStaticBitmap* m_bitmapDownloading;
+ wxStaticText* m_staticTextHeader;
+ wxGauge* m_gaugeProgress;
+ wxStaticText* m_staticTextDetails;
+ wxStaticLine* m_staticline9;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+public:
+
+ DownloadProgressDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0 );
+ ~DownloadProgressDlgGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class ActivationDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class ActivationDlgGenerated : public wxDialog
+class ActivationDlgGenerated : public wxDialog
{
- private:
-
- protected:
- wxPanel* m_panel35;
- wxStaticBitmap* m_bitmapActivation;
- wxTextCtrl* m_textCtrlLastError;
- wxStaticText* m_staticTextMain;
- wxStaticLine* m_staticline181;
- wxStaticLine* m_staticline18111;
- wxPanel* m_panel3511;
- wxStaticText* m_staticText136;
- wxButton* m_buttonActivateOnline;
- wxStaticLine* m_staticline181111;
- wxStaticLine* m_staticline181112;
- wxPanel* m_panel351;
- wxStaticText* m_staticText1361;
- wxButton* m_buttonCopyUrl;
- wxTextCtrl* m_textCtrlManualActivationUrl;
- wxStaticText* m_staticText13611;
- wxTextCtrl* m_textCtrlOfflineActivationKey;
- wxButton* m_buttonActivateOffline;
- wxStaticLine* m_staticline13;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide 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;
+ wxTextCtrl* m_textCtrlLastError;
+ wxStaticText* m_staticTextMain;
+ wxStaticLine* m_staticline181;
+ wxStaticLine* m_staticline18111;
+ wxPanel* m_panel3511;
+ wxStaticText* m_staticText136;
+ wxButton* m_buttonActivateOnline;
+ wxStaticLine* m_staticline181111;
+ wxStaticLine* m_staticline181112;
+ wxPanel* m_panel351;
+ wxStaticText* m_staticText1361;
+ wxButton* m_buttonCopyUrl;
+ wxTextCtrl* m_textCtrlManualActivationUrl;
+ wxStaticText* m_staticText13611;
+ wxTextCtrl* m_textCtrlOfflineActivationKey;
+ wxButton* m_buttonActivateOffline;
+ wxStaticLine* m_staticline13;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide 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();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class CfgHighlightDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class CfgHighlightDlgGenerated : public wxDialog
+class CfgHighlightDlgGenerated : public wxDialog
{
- private:
-
- protected:
- wxPanel* m_panel35;
- wxStaticText* m_staticTextHighlight;
- wxSpinCtrl* m_spinCtrlOverdueDays;
- wxStaticLine* m_staticline21;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonOkay;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
-
-
- 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();
-
+private:
+
+protected:
+ wxPanel* m_panel35;
+ wxStaticText* m_staticTextHighlight;
+ wxSpinCtrl* m_spinCtrlOverdueDays;
+ wxStaticLine* m_staticline21;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonOkay;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+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();
+
};
#endif //__GUI_GENERATED_H__
diff --git a/FreeFileSync/Source/ui/log_panel.cpp b/FreeFileSync/Source/ui/log_panel.cpp
index fca60a36..34b0aa64 100644
--- a/FreeFileSync/Source/ui/log_panel.cpp
+++ b/FreeFileSync/Source/ui/log_panel.cpp
@@ -461,7 +461,7 @@ void LogPanel::onMsgGridContext(GridClickEvent& event)
menu.addSeparator();
menu.addItem(_("Select all") + L"\tCtrl+A", [this] { m_gridMessages->selectAllRows(GridEventPolicy::ALLOW); }, nullptr, rowCount > 0);
- menu.popup(*this);
+ menu.popup(*m_gridMessages, event.mousePos_);
}
diff --git a/FreeFileSync/Source/ui/main_dlg.cpp b/FreeFileSync/Source/ui/main_dlg.cpp
index d998c55f..7a318d0f 100644
--- a/FreeFileSync/Source/ui/main_dlg.cpp
+++ b/FreeFileSync/Source/ui/main_dlg.cpp
@@ -1072,32 +1072,95 @@ XmlGlobalSettings MainDialog::getGlobalCfgBeforeExit()
}
-void MainDialog::setSyncDirManually(const std::vector<FileSystemObject*>& selection, SyncDirection direction)
+namespace
{
- if (!selection.empty())
+//user expectations for partial sync:
+// 1. selected folder implies also processing child items
+// 2. to-be-moved item requires also processing target item
+std::vector<FileSystemObject*> expandSelectionForPartialSync(const std::vector<FileSystemObject*>& selection)
+{
+ std::vector<FileSystemObject*> output;
+
+ for (FileSystemObject* fsObj : selection)
+ recursiveObjectVisitor(*fsObj, [&](FolderPair& folder) { output.push_back(&folder); },
+ [&](FilePair& file)
{
- for (FileSystemObject* fsObj : selection)
+ output.push_back(&file);
+ switch (file.getSyncOperation()) //evaluate comparison result and sync direction
{
- setSyncDirectionRec(direction, *fsObj); //set new direction (recursively)
- setActiveStatus(true, *fsObj); //works recursively for directories
+ case SO_MOVE_LEFT_FROM:
+ case SO_MOVE_LEFT_TO:
+ case SO_MOVE_RIGHT_FROM:
+ case SO_MOVE_RIGHT_TO:
+ if (FileSystemObject* moveRefObj = FileSystemObject::retrieve(file.getMoveRef()))
+ output.push_back(moveRefObj);
+ assert(dynamic_cast<FilePair*>(output.back())->getMoveRef() == file.getId());
+ break;
+
+ case SO_CREATE_NEW_LEFT:
+ case SO_CREATE_NEW_RIGHT:
+ case SO_DELETE_LEFT:
+ case SO_DELETE_RIGHT:
+ case SO_OVERWRITE_LEFT:
+ case SO_OVERWRITE_RIGHT:
+ case SO_COPY_METADATA_TO_LEFT:
+ case SO_COPY_METADATA_TO_RIGHT:
+ case SO_UNRESOLVED_CONFLICT:
+ case SO_DO_NOTHING:
+ case SO_EQUAL:
+ break;
}
- updateGui();
- }
+ },
+ [&](SymlinkPair& symlink) { output.push_back(&symlink); });
+
+ removeDuplicates(output);
+ return output;
}
-void MainDialog::setFilterManually(const std::vector<FileSystemObject*>& selection, bool setIncluded)
+bool selectionIncludesNonEqualItem(const std::vector<FileSystemObject*>& selection)
{
- //if hidefiltered is active, there should be no filtered elements on screen => current element was filtered out
- assert(m_bpButtonShowExcluded->isActive() || !setIncluded);
-
- if (!selection.empty())
+ struct ItemFound {};
+ try
{
for (FileSystemObject* fsObj : selection)
- setActiveStatus(setIncluded, *fsObj); //works recursively for directories
+ recursiveObjectVisitor(*fsObj,
+ [](FolderPair& folder) { if (folder .getSyncOperation() != SO_EQUAL) throw ItemFound(); },
+ /**/[](FilePair& file) { if (file .getSyncOperation() != SO_EQUAL) throw ItemFound(); },
+ /**/[](SymlinkPair& symlink) { if (symlink.getSyncOperation() != SO_EQUAL) throw ItemFound(); });
+ return false;
+ }
+ catch (ItemFound&) { return true;}
+}
+}
- updateGuiDelayedIf(!m_bpButtonShowExcluded->isActive()); //show update GUI before removing rows
+
+void MainDialog::setSyncDirManually(const std::vector<FileSystemObject*>& selection, SyncDirection direction)
+{
+ if (!selectionIncludesNonEqualItem(selection))
+ return; //harmonize with onMainGridContextRim(): this function should be a no-op iff context menu option is disabled!
+
+ for (FileSystemObject* fsObj : selection)
+ {
+ setSyncDirectionRec(direction, *fsObj); //set new direction (recursively)
+ setActiveStatus(true, *fsObj); //works recursively for directories
}
+ updateGui();
+}
+
+
+void MainDialog::setFilterManually(const std::vector<FileSystemObject*>& selection, bool setActive)
+{
+ //if hidefiltered is active, there should be no filtered elements on screen => current element was filtered out
+ assert(m_bpButtonShowExcluded->isActive() || !setActive);
+
+ if (selection.empty())
+ return; //harmonize with onMainGridContextRim(): this function should be a no-op iff context menu option is disabled!
+
+ for (FileSystemObject* fsObj : selection)
+ setActiveStatus(setActive, *fsObj); //works recursively for directories
+
+ updateGuiDelayedIf(!m_bpButtonShowExcluded->isActive()); //show update GUI before removing rows
}
@@ -1187,8 +1250,8 @@ void MainDialog::copyToAlternateFolder(const std::vector<FileSystemObject*>& sel
const std::vector<FileSystemObject*>& selectionRight)
{
if (std::all_of(selectionLeft .begin(), selectionLeft .end(), [](const FileSystemObject* fsObj) { return fsObj->isEmpty< LEFT_SIDE>(); }) &&
- std::all_of(selectionRight.begin(), selectionRight.end(), [](const FileSystemObject* fsObj) { return fsObj->isEmpty< RIGHT_SIDE>(); }))
- return;
+ /**/std::all_of(selectionRight.begin(), selectionRight.end(), [](const FileSystemObject* fsObj) { return fsObj->isEmpty<RIGHT_SIDE>(); }))
+ return; //harmonize with onMainGridContextRim(): this function should be a no-op iff context menu option is disabled!
FocusPreserver fp;
@@ -1201,7 +1264,7 @@ void MainDialog::copyToAlternateFolder(const std::vector<FileSystemObject*>& sel
globalCfg_.gui.mainDlg.copyToCfg.overwriteIfExists) != ReturnSmallDlg::BUTTON_OKAY)
return;
- disableAllElements(true); //StatusHandlerTemporaryPanel will internally process Window messages, so avoid unexpected callbacks!
+ disableAllElements(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(); enableAllElements()); //ui update before enabling buttons again: prevent strange behaviour of delayed button clicks
@@ -1237,8 +1300,8 @@ void MainDialog::deleteSelectedFiles(const std::vector<FileSystemObject*>& selec
const std::vector<FileSystemObject*>& selectionRight, bool moveToRecycler)
{
if (std::all_of(selectionLeft .begin(), selectionLeft .end(), [](const FileSystemObject* fsObj) { return fsObj->isEmpty< LEFT_SIDE>(); }) &&
- std::all_of(selectionRight.begin(), selectionRight.end(), [](const FileSystemObject* fsObj) { return fsObj->isEmpty< RIGHT_SIDE>(); }))
- return;
+ /**/std::all_of(selectionRight.begin(), selectionRight.end(), [](const FileSystemObject* fsObj) { return fsObj->isEmpty<RIGHT_SIDE>(); }))
+ return; //harmonize with onMainGridContextRim(): this function should be a no-op iff context menu option is disabled!
FocusPreserver fp;
@@ -1246,7 +1309,7 @@ void MainDialog::deleteSelectedFiles(const std::vector<FileSystemObject*>& selec
moveToRecycler) != ReturnSmallDlg::BUTTON_OKAY)
return;
- disableAllElements(true); //StatusHandlerTemporaryPanel will internally process Window messages, so avoid unexpected callbacks!
+ disableAllElements(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(); enableAllElements()); //ui update before enabling buttons again: prevent strange behaviour of delayed button clicks
@@ -1274,15 +1337,6 @@ void MainDialog::deleteSelectedFiles(const std::vector<FileSystemObject*>& selec
setLastOperationLog(r.summary, r.errorLog);
- if (r.summary.finalStatus != SyncResult::ABORTED)
- {
- m_gridMainL->clearSelection(GridEventPolicy::ALLOW);
- m_gridMainC->clearSelection(GridEventPolicy::ALLOW);
- m_gridMainR->clearSelection(GridEventPolicy::ALLOW);
-
- m_gridOverview->clearSelection(GridEventPolicy::ALLOW);
- }
-
//remove rows that are empty: just a beautification, invalid rows shouldn't cause issues
filegrid::getDataView(*m_gridMainC).removeInvalidRows();
@@ -1350,8 +1404,8 @@ void invokeCommandLine(const Zstring& commandLinePhrase, //throw FileError
const AbstractPath basePath2 = fsObj->base().getAbstractPath<side2>();
//full path, even if item is not (yet) existing:
- const Zstring itemPath = AFS::isNullPath(basePath ) ? Zstr("") : utfTo<Zstring>(AFS::getDisplayPath(fsObj->getAbstractPath<side >()));
- const Zstring itemPath2 = AFS::isNullPath(basePath2) ? Zstr("") : utfTo<Zstring>(AFS::getDisplayPath(fsObj->getAbstractPath<side2>()));
+ const Zstring itemPath = AFS::isNullPath(basePath ) ? Zstr("") : utfTo<Zstring>(AFS::getDisplayPath(fsObj-> getAbstractPath<side >()));
+ const Zstring itemPath2 = AFS::isNullPath(basePath2) ? Zstr("") : utfTo<Zstring>(AFS::getDisplayPath(fsObj-> getAbstractPath<side2>()));
const Zstring folderPath = AFS::isNullPath(basePath ) ? Zstr("") : utfTo<Zstring>(AFS::getDisplayPath(fsObj->parent().getAbstractPath<side >()));
const Zstring folderPath2 = AFS::isNullPath(basePath2) ? Zstr("") : utfTo<Zstring>(AFS::getDisplayPath(fsObj->parent().getAbstractPath<side2>()));
@@ -1472,7 +1526,7 @@ void MainDialog::openExternalApplication(const Zstring& commandLinePhrase, bool
FocusPreserver fp;
- disableAllElements(true); //StatusHandlerTemporaryPanel will internally process Window messages, so avoid unexpected callbacks!
+ disableAllElements(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(); enableAllElements()); //ui update before enabling buttons again: prevent strange behaviour of delayed button clicks
@@ -1750,6 +1804,8 @@ void MainDialog::OnResizeLeftFolderWidth(wxEvent& event)
void MainDialog::onTreeButtonEvent(wxKeyEvent& event)
{
+ const std::vector<FileSystemObject*> selection = getTreeSelection();
+
int keyCode = event.GetKeyCode();
if (m_gridOverview->GetLayoutDirection() == wxLayout_RightToLeft)
{
@@ -1772,39 +1828,41 @@ void MainDialog::onTreeButtonEvent(wxKeyEvent& event)
{
case WXK_NUMPAD_LEFT:
case WXK_LEFT: //ALT + <-
- setSyncDirManually(getTreeSelection(), SyncDirection::LEFT);
+ setSyncDirManually(selection, SyncDirection::LEFT);
return;
case WXK_NUMPAD_RIGHT:
case WXK_RIGHT: //ALT + ->
- setSyncDirManually(getTreeSelection(), SyncDirection::RIGHT);
+ setSyncDirManually(selection, SyncDirection::RIGHT);
return;
case WXK_NUMPAD_UP:
case WXK_NUMPAD_DOWN:
case WXK_UP: /* ALT + /|\ */
case WXK_DOWN: /* ALT + \|/ */
- setSyncDirManually(getTreeSelection(), SyncDirection::NONE);
+ setSyncDirManually(selection, SyncDirection::NONE);
return;
}
else
switch (keyCode)
{
+ case WXK_RETURN:
+ case WXK_NUMPAD_ENTER:
+ startSyncForSelecction(selection);
+ return;
+
case WXK_SPACE:
case WXK_NUMPAD_SPACE:
- {
- const std::vector<FileSystemObject*>& selection = getTreeSelection();
if (!selection.empty())
setFilterManually(selection, m_bpButtonShowExcluded->isActive() && !selection[0]->isActive());
//always exclude items if "m_bpButtonShowExcluded is unchecked" => yes, it's possible to have already unchecked items in selection, so we need to overwrite:
//e.g. select root node while the first item returned is not shown on grid!
- }
- return;
+ return;
case WXK_DELETE:
case WXK_NUMPAD_DELETE:
- deleteSelectedFiles(getTreeSelection(), getTreeSelection(), !event.ShiftDown() /*moveToRecycler*/);
+ deleteSelectedFiles(selection, selection, !event.ShiftDown() /*moveToRecycler*/);
return;
}
@@ -1814,7 +1872,7 @@ void MainDialog::onTreeButtonEvent(wxKeyEvent& event)
void MainDialog::onGridButtonEvent(wxKeyEvent& event, Grid& grid, bool leftSide)
{
- const std::vector<FileSystemObject*> selection = getGridSelection(); //referenced by lambdas!
+ const std::vector<FileSystemObject*> selection = getGridSelection();
const std::vector<FileSystemObject*> selectionLeft = getGridSelection(true, false);
const std::vector<FileSystemObject*> selectionRight = getGridSelection(false, true);
@@ -1870,8 +1928,6 @@ void MainDialog::onGridButtonEvent(wxKeyEvent& event, Grid& grid, bool leftSide)
return keyCode - '0';
if (WXK_NUMPAD0 <= keyCode && keyCode <= WXK_NUMPAD9)
return keyCode - WXK_NUMPAD0;
- if (keyCode == WXK_RETURN || keyCode == WXK_NUMPAD_ENTER) //open with first external application
- return 0;
return static_cast<size_t>(-1);
}();
@@ -1883,9 +1939,9 @@ void MainDialog::onGridButtonEvent(wxKeyEvent& event, Grid& grid, bool leftSide)
switch (keyCode)
{
- case WXK_DELETE:
- case WXK_NUMPAD_DELETE:
- deleteSelectedFiles(selectionLeft, selectionRight, !event.ShiftDown() /*moveToRecycler*/);
+ case WXK_RETURN:
+ case WXK_NUMPAD_ENTER:
+ startSyncForSelecction(selection);
return;
case WXK_SPACE:
@@ -1893,6 +1949,11 @@ void MainDialog::onGridButtonEvent(wxKeyEvent& event, Grid& grid, bool leftSide)
if (!selection.empty())
setFilterManually(selection, m_bpButtonShowExcluded->isActive() && !selection[0]->isActive());
return;
+
+ case WXK_DELETE:
+ case WXK_NUMPAD_DELETE:
+ deleteSelectedFiles(selectionLeft, selectionRight, !event.ShiftDown() /*moveToRecycler*/);
+ return;
}
}
@@ -1931,31 +1992,34 @@ void MainDialog::onLocalKeyEvent(wxKeyEvent& event) //process key events without
//case WXK_F6:
//{
- // wxCommandEvent dummy2(wxEVT_COMMAND_BUTTON_CLICKED); //simulate button click
+ // wxCommandEvent dummy2(wxEVT_COMMAND_BUTTON_CLICKED);
// m_bpButtonCmpConfig->Command(dummy2); //simulate click
//}
//return; //-> swallow event!
//case WXK_F7:
//{
- // wxCommandEvent dummy2(wxEVT_COMMAND_BUTTON_CLICKED); //simulate button click
+ // wxCommandEvent dummy2(wxEVT_COMMAND_BUTTON_CLICKED);
// m_bpButtonFilter->Command(dummy2); //simulate click
//}
//return; //-> swallow event!
//case WXK_F8:
//{
- // wxCommandEvent dummy2(wxEVT_COMMAND_BUTTON_CLICKED); //simulate button click
+ // wxCommandEvent dummy2(wxEVT_COMMAND_BUTTON_CLICKED);
// m_bpButtonSyncConfig->Command(dummy2); //simulate click
//}
//return; //-> swallow event!
case WXK_F10:
- {
- wxCommandEvent dummy(wxEVT_COMMAND_BUTTON_CLICKED);
- m_bpButtonSwapSides->Command(dummy); //simulate click
- }
- return; //-> swallow event!
+ if (event.ShiftDown()) //shfit + F10 == alias for menu key
+ break;
+ else
+ {
+ wxCommandEvent dummy(wxEVT_COMMAND_BUTTON_CLICKED);
+ m_bpButtonSwapSides->Command(dummy); //simulate click
+ return; //-> swallow event!
+ }
case WXK_F11:
setViewTypeSyncAction(!m_bpButtonViewTypeSyncAction->isActive());
@@ -2076,37 +2140,32 @@ void MainDialog::onTreeGridSelection(GridSelectEvent& event)
void MainDialog::onTreeGridContext(GridClickEvent& event)
{
- const auto& selection = getTreeSelection(); //referenced by lambdas!
+ const std::vector<FileSystemObject*>& selection = getTreeSelection(); //referenced by lambdas!
ContextMenu menu;
//----------------------------------------------------------------------------------------------------
- if (!selection.empty())
- //std::any_of(selection.begin(), selection.end(), [](const FileSystemObject* fsObj) { return fsObj->getSyncOperation() != SO_EQUAL; })) -> doesn't consider directories
+ auto getImage = [&](SyncDirection dir, SyncOperation soDefault)
{
- auto getImage = [&](SyncDirection dir, SyncOperation soDefault)
- {
- return mirrorIfRtl(getSyncOpImage(selection[0]->getSyncOperation() != SO_EQUAL ?
- selection[0]->testSyncOperation(dir) : soDefault));
- };
- const wxBitmap opRight = getImage(SyncDirection::RIGHT, SO_OVERWRITE_RIGHT);
- const wxBitmap opNone = getImage(SyncDirection::NONE, SO_DO_NOTHING );
- const wxBitmap opLeft = getImage(SyncDirection::LEFT, SO_OVERWRITE_LEFT );
-
- wxString shortCutLeft = L"\tAlt+Left";
- wxString shortCutRight = L"\tAlt+Right";
- if (wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft)
- std::swap(shortCutLeft, shortCutRight);
-
- menu.addItem(_("Set direction:") + L" ->" + shortCutRight, [this, &selection] { setSyncDirManually(selection, SyncDirection::RIGHT); }, &opRight);
- menu.addItem(_("Set direction:") + L" -" L"\tAlt+Down", [this, &selection] { setSyncDirManually(selection, SyncDirection::NONE); }, &opNone);
- menu.addItem(_("Set direction:") + L" <-" + shortCutLeft, [this, &selection] { setSyncDirManually(selection, SyncDirection::LEFT); }, &opLeft);
- //Gtk needs a direction, "<-", because it has no context menu icons!
- //Gtk requires "no spaces" for shortcut identifiers!
- menu.addSeparator();
- }
-
+ return mirrorIfRtl(getSyncOpImage(!selection.empty() && selection[0]->getSyncOperation() != SO_EQUAL ?
+ selection[0]->testSyncOperation(dir) : soDefault));
+ };
+ const wxBitmap opRight = getImage(SyncDirection::RIGHT, SO_OVERWRITE_RIGHT);
+ const wxBitmap opNone = getImage(SyncDirection::NONE, SO_DO_NOTHING );
+ const wxBitmap opLeft = getImage(SyncDirection::LEFT, SO_OVERWRITE_LEFT );
+
+ wxString shortcutLeft = L"\tAlt+Left";
+ wxString shortcutRight = L"\tAlt+Right";
+ if (wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft)
+ std::swap(shortcutLeft, shortcutRight);
+
+ const bool nonEqualSelected = selectionIncludesNonEqualItem(selection);
+ menu.addItem(_("Set direction:") + L" ->" + shortcutRight, [this, &selection] { setSyncDirManually(selection, SyncDirection::RIGHT); }, &opRight, nonEqualSelected);
+ menu.addItem(_("Set direction:") + L" -" L"\tAlt+Down", [this, &selection] { setSyncDirManually(selection, SyncDirection::NONE); }, &opNone, nonEqualSelected);
+ menu.addItem(_("Set direction:") + L" <-" + shortcutLeft, [this, &selection] { setSyncDirManually(selection, SyncDirection::LEFT); }, &opLeft, nonEqualSelected);
+ //Gtk needs a direction, "<-", because it has no context menu icons!
+ //Gtk requires "no spaces" for shortcut identifiers!
+ menu.addSeparator();
//----------------------------------------------------------------------------------------------------
-
auto addFilterMenu = [&](const std::wstring& label, const wxString& iconName, bool include)
{
if (selection.size() == 1)
@@ -2136,39 +2195,58 @@ void MainDialog::onTreeGridContext(GridClickEvent& event)
[this, &selection, include] { filterItems(selection, include); }, &getResourceImage(iconName));
}
};
- addFilterMenu(_("Include via filter:"), L"filter_include_sicon", true);
- addFilterMenu(_("Exclude via filter:"), L"filter_exclude_sicon", false);
-
+ addFilterMenu(_("&Include via filter:"), L"filter_include_sicon", true);
+ addFilterMenu(_("&Exclude via filter:"), L"filter_exclude_sicon", false);
//----------------------------------------------------------------------------------------------------
- if (!selection.empty())
- {
- if (m_bpButtonShowExcluded->isActive() && !selection[0]->isActive())
- menu.addItem(_("Include temporarily") + L"\tSpace", [this, &selection] { setFilterManually(selection, true); }, &getResourceImage(L"checkbox_true"));
- else
- menu.addItem(_("Exclude temporarily") + L"\tSpace", [this, &selection] { setFilterManually(selection, false); }, &getResourceImage(L"checkbox_false"));
- }
+ if (m_bpButtonShowExcluded->isActive() && !selection.empty() && !selection[0]->isActive())
+ menu.addItem(_("Include temporarily") + L"\tSpace", [this, &selection] { setFilterManually(selection, true); }, &getResourceImage(L"checkbox_true"));
else
- menu.addItem(_("Exclude temporarily") + L"\tSpace", [] {}, nullptr, false);
-
+ menu.addItem(_("Exclude temporarily") + L"\tSpace", [this, &selection] { setFilterManually(selection, false); }, &getResourceImage(L"checkbox_false"), !selection.empty());
//----------------------------------------------------------------------------------------------------
- const bool haveNonEmptyItems = std::any_of(selection.begin(), selection.end(), [&](const FileSystemObject* fsObj) { return !fsObj->isEmpty<LEFT_SIDE>() || !fsObj->isEmpty<RIGHT_SIDE>(); });
-
+ const bool selectionContainsItemsToSync = [&]
+ {
+ for (FileSystemObject* fsObj : expandSelectionForPartialSync(selection))
+ switch (fsObj->getSyncOperation())
+ {
+ case SO_CREATE_NEW_LEFT:
+ case SO_CREATE_NEW_RIGHT:
+ case SO_DELETE_LEFT:
+ case SO_DELETE_RIGHT:
+ case SO_MOVE_LEFT_FROM:
+ case SO_MOVE_LEFT_TO:
+ case SO_MOVE_RIGHT_FROM:
+ case SO_MOVE_RIGHT_TO:
+ case SO_OVERWRITE_LEFT:
+ case SO_OVERWRITE_RIGHT:
+ case SO_COPY_METADATA_TO_LEFT:
+ case SO_COPY_METADATA_TO_RIGHT:
+ return true;
+
+ case SO_UNRESOLVED_CONFLICT:
+ case SO_DO_NOTHING:
+ case SO_EQUAL:
+ break;
+ }
+ return false;
+ }();
+ menu.addSeparator();
+ menu.addItem(_("&Synchronize selection") + L"\tEnter", [&] { startSyncForSelecction(selection); }, &getResourceImage(L"file_sync_selection_sicon"), selectionContainsItemsToSync);
+ //----------------------------------------------------------------------------------------------------
+ const bool haveNonEmptyItems = std::any_of(selection.begin(), selection.end(), [](const FileSystemObject* fsObj) { return !fsObj->isEmpty<LEFT_SIDE>() || !fsObj->isEmpty<RIGHT_SIDE>(); });
//menu.addSeparator();
-
//menu.addItem(_("&Copy to...") + L"\tCtrl+T", [&] { copyToAlternateFolder(selection, selection); }, nullptr, haveNonEmptyItems);
-
//----------------------------------------------------------------------------------------------------
-
menu.addSeparator();
-
menu.addItem(_("&Delete") + L"\t(Shift+)Del", [&] { deleteSelectedFiles(selection, selection, true /*moveToRecycler*/); }, nullptr, haveNonEmptyItems);
- menu.popup(*this);
+ menu.popup(*m_gridOverview, event.mousePos_);
}
void MainDialog::onMainGridContextC(GridClickEvent& event)
{
+ warn_static("do we still need this???")
+#if 0
ContextMenu menu;
menu.addItem(_("Include all"), [&]
@@ -2183,23 +2261,24 @@ void MainDialog::onMainGridContextC(GridClickEvent& event)
updateGuiDelayedIf(!m_bpButtonShowExcluded->isActive()); //show update GUI before removing rows
}, nullptr, filegrid::getDataView(*m_gridMainC).rowsTotal() > 0);
- menu.popup(*this);
+ menu.popup(*m_gridMainC, event.mousePos_);
+#endif
}
void MainDialog::onMainGridContextL(GridClickEvent& event)
{
- onMainGridContextRim(true);
+ onMainGridContextRim(true /*leftSide*/, event);
}
void MainDialog::onMainGridContextR(GridClickEvent& event)
{
- onMainGridContextRim(false);
+ onMainGridContextRim(false /*leftSide*/, event);
}
-void MainDialog::onMainGridContextRim(bool leftSide)
+void MainDialog::onMainGridContextRim(bool leftSide, GridClickEvent& event)
{
const std::vector<FileSystemObject*> selection = getGridSelection(); //referenced by lambdas!
const std::vector<FileSystemObject*> selectionLeft = getGridSelection(true, false);
@@ -2207,32 +2286,28 @@ void MainDialog::onMainGridContextRim(bool leftSide)
ContextMenu menu;
- if (!selection.empty())
+ auto getImage = [&](SyncDirection dir, SyncOperation soDefault)
{
- auto getImage = [&](SyncDirection dir, SyncOperation soDefault)
- {
- return mirrorIfRtl(getSyncOpImage(selection[0]->getSyncOperation() != SO_EQUAL ?
- selection[0]->testSyncOperation(dir) : soDefault));
- };
- const wxBitmap opRight = getImage(SyncDirection::RIGHT, SO_OVERWRITE_RIGHT);
- const wxBitmap opNone = getImage(SyncDirection::NONE, SO_DO_NOTHING );
- const wxBitmap opLeft = getImage(SyncDirection::LEFT, SO_OVERWRITE_LEFT );
-
- wxString shortCutLeft = L"\tAlt+Left";
- wxString shortCutRight = L"\tAlt+Right";
- if (wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft)
- std::swap(shortCutLeft, shortCutRight);
-
- menu.addItem(_("Set direction:") + L" ->" + shortCutRight, [this, &selection] { setSyncDirManually(selection, SyncDirection::RIGHT); }, &opRight);
- menu.addItem(_("Set direction:") + L" -" L"\tAlt+Down", [this, &selection] { setSyncDirManually(selection, SyncDirection::NONE); }, &opNone);
- menu.addItem(_("Set direction:") + L" <-" + shortCutLeft, [this, &selection] { setSyncDirManually(selection, SyncDirection::LEFT); }, &opLeft);
- //Gtk needs a direction, "<-", because it has no context menu icons!
- //Gtk requires "no spaces" for shortcut identifiers!
- menu.addSeparator();
- }
-
+ return mirrorIfRtl(getSyncOpImage(!selection.empty() && selection[0]->getSyncOperation() != SO_EQUAL ?
+ selection[0]->testSyncOperation(dir) : soDefault));
+ };
+ const wxBitmap opRight = getImage(SyncDirection::RIGHT, SO_OVERWRITE_RIGHT);
+ const wxBitmap opNone = getImage(SyncDirection::NONE, SO_DO_NOTHING );
+ const wxBitmap opLeft = getImage(SyncDirection::LEFT, SO_OVERWRITE_LEFT );
+
+ wxString shortcutLeft = L"\tAlt+Left";
+ wxString shortcutRight = L"\tAlt+Right";
+ if (wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft)
+ std::swap(shortcutLeft, shortcutRight);
+
+ const bool nonEqualSelected = selectionIncludesNonEqualItem(selection);
+ menu.addItem(_("Set direction:") + L" ->" + shortcutRight, [this, &selection] { setSyncDirManually(selection, SyncDirection::RIGHT); }, &opRight, nonEqualSelected);
+ menu.addItem(_("Set direction:") + L" -" L"\tAlt+Down", [this, &selection] { setSyncDirManually(selection, SyncDirection::NONE); }, &opNone, nonEqualSelected);
+ menu.addItem(_("Set direction:") + L" <-" + shortcutLeft, [this, &selection] { setSyncDirManually(selection, SyncDirection::LEFT); }, &opLeft, nonEqualSelected);
+ //Gtk needs a direction, "<-", because it has no context menu icons!
+ //Gtk requires "no spaces" for shortcut identifiers!
+ menu.addSeparator();
//----------------------------------------------------------------------------------------------------
-
auto addFilterMenu = [&](const wxString& label, const wxString& iconName, bool include)
{
if (selection.size() == 1)
@@ -2271,23 +2346,43 @@ void MainDialog::onMainGridContextRim(bool leftSide)
[this, &selection, include] { filterItems(selection, include); }, &getResourceImage(iconName));
}
};
- addFilterMenu(_("Include via filter:"), L"filter_include_sicon", true);
- addFilterMenu(_("Exclude via filter:"), L"filter_exclude_sicon", false);
-
+ addFilterMenu(_("&Include via filter:"), L"filter_include_sicon", true);
+ addFilterMenu(_("&Exclude via filter:"), L"filter_exclude_sicon", false);
//----------------------------------------------------------------------------------------------------
-
- if (!selection.empty())
- {
- if (m_bpButtonShowExcluded->isActive() && !selection[0]->isActive())
- menu.addItem(_("Include temporarily") + L"\tSpace", [this, &selection] { setFilterManually(selection, true); }, &getResourceImage(L"checkbox_true"));
- else
- menu.addItem(_("Exclude temporarily") + L"\tSpace", [this, &selection] { setFilterManually(selection, false); }, &getResourceImage(L"checkbox_false"));
- }
+ if (m_bpButtonShowExcluded->isActive() && !selection.empty() && !selection[0]->isActive())
+ menu.addItem(_("Include temporarily") + L"\tSpace", [this, &selection] { setFilterManually(selection, true); }, &getResourceImage(L"checkbox_true"));
else
- menu.addItem(_("Exclude temporarily") + L"\tSpace", [] {}, nullptr, false);
-
+ menu.addItem(_("Exclude temporarily") + L"\tSpace", [this, &selection] { setFilterManually(selection, false); }, &getResourceImage(L"checkbox_false"), !selection.empty());
+ //----------------------------------------------------------------------------------------------------
+ const bool selectionContainsItemsToSync = [&]
+ {
+ for (FileSystemObject* fsObj : expandSelectionForPartialSync(selection))
+ switch (fsObj->getSyncOperation())
+ {
+ case SO_CREATE_NEW_LEFT:
+ case SO_CREATE_NEW_RIGHT:
+ case SO_DELETE_LEFT:
+ case SO_DELETE_RIGHT:
+ case SO_MOVE_LEFT_FROM:
+ case SO_MOVE_LEFT_TO:
+ case SO_MOVE_RIGHT_FROM:
+ case SO_MOVE_RIGHT_TO:
+ case SO_OVERWRITE_LEFT:
+ case SO_OVERWRITE_RIGHT:
+ case SO_COPY_METADATA_TO_LEFT:
+ case SO_COPY_METADATA_TO_RIGHT:
+ return true;
+
+ case SO_UNRESOLVED_CONFLICT:
+ case SO_DO_NOTHING:
+ case SO_EQUAL:
+ break;
+ }
+ return false;
+ }();
+ menu.addSeparator();
+ menu.addItem(_("&Synchronize selection") + L"\tEnter", [&] { startSyncForSelecction(selection); }, &getResourceImage(L"file_sync_selection_sicon"), selectionContainsItemsToSync);
//----------------------------------------------------------------------------------------------------
-
if (!globalCfg_.gui.externalApps.empty())
{
menu.addSeparator();
@@ -2299,44 +2394,34 @@ void MainDialog::onMainGridContextRim(bool leftSide)
//translate default external apps on the fly: 1. "open in explorer" 2. "start directly"
wxString description = translate(it->description);
if (description.empty())
- description = L" "; //wxWidgets doesn't like empty items
+ description = L" "; //wxWidgets doesn't like empty labels
auto openApp = [this, command = it->cmdLine, leftSide, &selectionLeft, &selectionRight] { openExternalApplication(command, leftSide, selectionLeft, selectionRight); };
const size_t pos = it - globalCfg_.gui.externalApps.begin();
if (pos == 0)
- description += L"\tEnter, D-Click";
+ description += L"\tD-Click, 0";
else if (pos < 9)
description += L"\t" + numberTo<std::wstring>(pos);
menu.addItem(description, openApp, nullptr, !selectionLeft.empty() || !selectionRight.empty());
}
}
-
//----------------------------------------------------------------------------------------------------
-
- std::vector<FileSystemObject*> nonEmptySelectionLeft = selectionLeft;
- std::vector<FileSystemObject*> nonEmptySelectionRight = selectionRight;
- eraseIf(nonEmptySelectionLeft, [](const FileSystemObject* fsObj) { return fsObj->isEmpty< LEFT_SIDE>(); });
- eraseIf(nonEmptySelectionRight, [](const FileSystemObject* fsObj) { return fsObj->isEmpty<RIGHT_SIDE>(); });
+ const bool haveNonEmptyItemsL = std::any_of(selectionLeft .begin(), selectionLeft .end(), [](const FileSystemObject* fsObj) { return !fsObj->isEmpty<LEFT_SIDE >(); });
+ const bool haveNonEmptyItemsR = std::any_of(selectionRight.begin(), selectionRight.end(), [](const FileSystemObject* fsObj) { return !fsObj->isEmpty<RIGHT_SIDE>(); });
menu.addSeparator();
-
- menu.addItem(_("&Copy to...") + L"\tCtrl+T", [&] { copyToAlternateFolder(nonEmptySelectionLeft, nonEmptySelectionRight); }, nullptr,
- !nonEmptySelectionLeft.empty() || !nonEmptySelectionRight.empty());
-
+ menu.addItem(_("&Copy to...") + L"\tCtrl+T", [&] { copyToAlternateFolder(selectionLeft, selectionRight); }, nullptr, haveNonEmptyItemsL || haveNonEmptyItemsR);
//----------------------------------------------------------------------------------------------------
-
menu.addSeparator();
- menu.addItem(_("&Delete") + L"\t(Shift+)Del", [&] { deleteSelectedFiles(nonEmptySelectionLeft, nonEmptySelectionRight, true /*moveToRecycler*/); }, nullptr,
- !nonEmptySelectionLeft.empty() || !nonEmptySelectionRight.empty());
+ menu.addItem(_("&Delete") + L"\t(Shift+)Del", [&] { deleteSelectedFiles(selectionLeft, selectionRight, true /*moveToRecycler*/); }, nullptr, haveNonEmptyItemsL || haveNonEmptyItemsR);
- menu.popup(*this);
+ menu.popup(leftSide ? *m_gridMainL : *m_gridMainR, event.mousePos_);
}
-
void MainDialog::addFilterPhrase(const Zstring& phrase, bool include, bool requireNewLine)
{
Zstring& filterString = [&]() -> Zstring&
@@ -2652,9 +2737,7 @@ void MainDialog::OnCompSettingsContext(wxEvent& event)
//menu.addRadio(getVariantName(CompareVariant::CONTENT ), [&] { setVariant(CompareVariant::CONTENT); }, activeCmpVar == CompareVariant::CONTENT);
//menu.addRadio(getVariantName(CompareVariant::SIZE ), [&] { setVariant(CompareVariant::SIZE); }, activeCmpVar == CompareVariant::SIZE);
- wxPoint pos = m_bpButtonCmpContext->GetPosition();
- pos.x += m_bpButtonCmpContext->GetSize().GetWidth();
- menu.popup(*m_panelTopButtons, pos);
+ menu.popup(*m_bpButtonCmpContext, { m_bpButtonCmpContext->GetSize().x, 0 });
}
@@ -2675,9 +2758,7 @@ void MainDialog::OnSyncSettingsContext(wxEvent& event)
menu.addRadio(getVariantName(DirectionConfig::UPDATE), [&] { setVariant(DirectionConfig::UPDATE); }, currentVar == DirectionConfig::UPDATE);
menu.addRadio(getVariantName(DirectionConfig::CUSTOM), [&] { setVariant(DirectionConfig::CUSTOM); }, currentVar == DirectionConfig::CUSTOM);
- wxPoint pos = m_bpButtonSyncContext->GetPosition();
- pos.x += m_bpButtonSyncContext->GetSize().GetWidth();
- menu.popup(*m_panelTopButtons, pos);
+ menu.popup(*m_bpButtonSyncContext, { m_bpButtonSyncContext->GetSize().x, 0 });
}
@@ -3126,8 +3207,8 @@ void MainDialog::deleteSelectedCfgHistoryItems()
cfggrid::getDataView(*m_gridCfgHistory).removeItems(filePaths);
m_gridCfgHistory->Refresh(); //grid size changed => clears selection!
- //set active selection on next item to allow "batch-deletion" by holding down DEL key
- //user expects that selected config is also loaded: https://freefilesync.org/forum/viewtopic.php?t=5723
+ //set active selection on next item to allow "batch-deletion" by holding down DEL key
+ //user expects that selected config is also loaded: https://freefilesync.org/forum/viewtopic.php?t=5723
std::vector<Zstring> nextCfgPaths;
if (m_gridCfgHistory->getRowCount() > 0)
{
@@ -3163,7 +3244,7 @@ void MainDialog::onCfgGridContext(GridClickEvent& event)
menu.addItem(_("Hide configuration") + L"\tDel", [this] { deleteSelectedCfgHistoryItems(); }, nullptr, !selectedRows.empty());
//--------------------------------------------------------------------------------------------------------
- menu.popup(*this);
+ menu.popup(*m_gridCfgHistory, event.mousePos_);
//event.Skip();
}
@@ -3259,7 +3340,7 @@ void MainDialog::onCheckRows(CheckRowsEvent& event)
if (!selectedRows.empty())
{
std::vector<FileSystemObject*> objects = filegrid::getDataView(*m_gridMainC).getAllFileRef(selectedRows);
- setFilterManually(objects, event.setIncluded_);
+ setFilterManually(objects, event.setActive_);
}
}
@@ -3450,14 +3531,14 @@ void MainDialog::showConfigDialog(SyncConfigPanel panelToShow, int localPairInde
return false;
}();
- const bool miscConfigChanged = globalPairCfg.miscCfg.deviceParallelOps != globalPairCfgOld.miscCfg.deviceParallelOps ||
- globalPairCfg.miscCfg.ignoreErrors != globalPairCfgOld.miscCfg.ignoreErrors ||
- globalPairCfg.miscCfg.automaticRetryCount != globalPairCfgOld.miscCfg.automaticRetryCount ||
- globalPairCfg.miscCfg.automaticRetryDelay != globalPairCfgOld.miscCfg.automaticRetryDelay ||
- globalPairCfg.miscCfg.altLogFolderPathPhrase != globalPairCfgOld.miscCfg.altLogFolderPathPhrase ||
- globalPairCfg.miscCfg.postSyncCommand != globalPairCfgOld.miscCfg.postSyncCommand ||
- globalPairCfg.miscCfg.postSyncCondition != globalPairCfgOld.miscCfg.postSyncCondition;
- /**/ //globalPairCfg.miscCfg.commandHistory != globalPairCfgOld.miscCfg.commandHistory;
+ //const bool miscConfigChanged = globalPairCfg.miscCfg.deviceParallelOps != globalPairCfgOld.miscCfg.deviceParallelOps ||
+ // globalPairCfg.miscCfg.ignoreErrors != globalPairCfgOld.miscCfg.ignoreErrors ||
+ // globalPairCfg.miscCfg.automaticRetryCount != globalPairCfgOld.miscCfg.automaticRetryCount ||
+ // globalPairCfg.miscCfg.automaticRetryDelay != globalPairCfgOld.miscCfg.automaticRetryDelay ||
+ // globalPairCfg.miscCfg.altLogFolderPathPhrase != globalPairCfgOld.miscCfg.altLogFolderPathPhrase ||
+ // globalPairCfg.miscCfg.postSyncCommand != globalPairCfgOld.miscCfg.postSyncCommand ||
+ // globalPairCfg.miscCfg.postSyncCondition != globalPairCfgOld.miscCfg.postSyncCondition;
+ ///**/ //globalPairCfg.miscCfg.commandHistory != globalPairCfgOld.miscCfg.commandHistory;
//------------------------------------------------------------------------------------
if (cmpConfigChanged)
@@ -3472,8 +3553,7 @@ void MainDialog::showConfigDialog(SyncConfigPanel panelToShow, int localPairInde
applyFilterConfig(); //re-apply filter
}
- if (miscConfigChanged)
- updateUnsavedCfgStatus(); //usually included by updateGui();
+ updateUnsavedCfgStatus(); //also included by updateGui();
}
@@ -3502,15 +3582,13 @@ void MainDialog::OnGlobalFilterContext(wxEvent& event)
menu.addItem( _("Copy"), copyFilter, nullptr, !isNullFilter(currentCfg_.mainCfg.globalFilter));
menu.addItem( _("Paste"), pasteFilter, nullptr, filterCfgOnClipboard_.get() != nullptr);
- wxPoint pos = m_bpButtonFilterContext->GetPosition();
- pos.x += m_bpButtonFilterContext->GetSize().GetWidth();
- menu.popup(*m_panelTopButtons, pos);
+ menu.popup(*m_bpButtonFilterContext, { m_bpButtonFilterContext->GetSize().x, 0 });
}
void MainDialog::OnToggleViewType(wxCommandEvent& event)
{
- setViewTypeSyncAction(!m_bpButtonViewTypeSyncAction->isActive()); //toggle view
+ setViewTypeSyncAction(!m_bpButtonViewTypeSyncAction->isActive());
}
@@ -3582,57 +3660,57 @@ void MainDialog::initViewFilterButtons()
void MainDialog::setViewFilterDefault()
{
- auto setButton = [](ToggleButton* tb, bool value) { tb->setActive(value); };
+ auto setButton = [](ToggleButton& tb, bool value) { tb.setActive(value); };
const auto& def = globalCfg_.gui.mainDlg.viewFilterDefault;
- setButton(m_bpButtonShowExcluded, def.excluded);
- setButton(m_bpButtonShowEqual, def.equal);
- setButton(m_bpButtonShowConflict, def.conflict);
+ setButton(*m_bpButtonShowExcluded, def.excluded);
+ setButton(*m_bpButtonShowEqual, def.equal);
+ setButton(*m_bpButtonShowConflict, def.conflict);
- setButton(m_bpButtonShowLeftOnly, def.leftOnly);
- setButton(m_bpButtonShowRightOnly, def.rightOnly);
- setButton(m_bpButtonShowLeftNewer, def.leftNewer);
- setButton(m_bpButtonShowRightNewer, def.rightNewer);
- setButton(m_bpButtonShowDifferent, def.different);
+ setButton(*m_bpButtonShowLeftOnly, def.leftOnly);
+ setButton(*m_bpButtonShowRightOnly, def.rightOnly);
+ setButton(*m_bpButtonShowLeftNewer, def.leftNewer);
+ setButton(*m_bpButtonShowRightNewer, def.rightNewer);
+ setButton(*m_bpButtonShowDifferent, def.different);
- setButton(m_bpButtonShowCreateLeft, def.createLeft);
- setButton(m_bpButtonShowCreateRight, def.createRight);
- setButton(m_bpButtonShowUpdateLeft, def.updateLeft);
- setButton(m_bpButtonShowUpdateRight, def.updateRight);
- setButton(m_bpButtonShowDeleteLeft, def.deleteLeft);
- setButton(m_bpButtonShowDeleteRight, def.deleteRight);
- setButton(m_bpButtonShowDoNothing, def.doNothing);
+ setButton(*m_bpButtonShowCreateLeft, def.createLeft);
+ setButton(*m_bpButtonShowCreateRight, def.createRight);
+ setButton(*m_bpButtonShowUpdateLeft, def.updateLeft);
+ setButton(*m_bpButtonShowUpdateRight, def.updateRight);
+ setButton(*m_bpButtonShowDeleteLeft, def.deleteLeft);
+ setButton(*m_bpButtonShowDeleteRight, def.deleteRight);
+ setButton(*m_bpButtonShowDoNothing, def.doNothing);
}
void MainDialog::OnViewFilterSave(wxCommandEvent& event)
{
- auto setButtonDefault = [](const ToggleButton* tb, bool& defaultValue)
+ auto saveButtonDefault = [](const ToggleButton& tb, bool& defaultValue)
{
- if (tb->IsShown())
- defaultValue = tb->isActive();
+ if (tb.IsShown())
+ defaultValue = tb.isActive();
};
auto saveDefault = [&]
{
auto& def = globalCfg_.gui.mainDlg.viewFilterDefault;
- setButtonDefault(m_bpButtonShowExcluded, def.excluded);
- setButtonDefault(m_bpButtonShowEqual, def.equal);
- setButtonDefault(m_bpButtonShowConflict, def.conflict);
-
- setButtonDefault(m_bpButtonShowLeftOnly, def.leftOnly);
- setButtonDefault(m_bpButtonShowRightOnly, def.rightOnly);
- setButtonDefault(m_bpButtonShowLeftNewer, def.leftNewer);
- setButtonDefault(m_bpButtonShowRightNewer, def.rightNewer);
- setButtonDefault(m_bpButtonShowDifferent, def.different);
-
- setButtonDefault(m_bpButtonShowCreateLeft, def.createLeft);
- setButtonDefault(m_bpButtonShowCreateRight, def.createRight);
- setButtonDefault(m_bpButtonShowDeleteLeft, def.deleteLeft);
- setButtonDefault(m_bpButtonShowDeleteRight, def.deleteRight);
- setButtonDefault(m_bpButtonShowUpdateLeft, def.updateLeft);
- setButtonDefault(m_bpButtonShowUpdateRight, def.updateRight);
- setButtonDefault(m_bpButtonShowDoNothing, def.doNothing);
+ saveButtonDefault(*m_bpButtonShowExcluded, def.excluded);
+ saveButtonDefault(*m_bpButtonShowEqual, def.equal);
+ saveButtonDefault(*m_bpButtonShowConflict, def.conflict);
+
+ saveButtonDefault(*m_bpButtonShowLeftOnly, def.leftOnly);
+ saveButtonDefault(*m_bpButtonShowRightOnly, def.rightOnly);
+ saveButtonDefault(*m_bpButtonShowLeftNewer, def.leftNewer);
+ saveButtonDefault(*m_bpButtonShowRightNewer, def.rightNewer);
+ saveButtonDefault(*m_bpButtonShowDifferent, def.different);
+
+ saveButtonDefault(*m_bpButtonShowCreateLeft, def.createLeft);
+ saveButtonDefault(*m_bpButtonShowCreateRight, def.createRight);
+ saveButtonDefault(*m_bpButtonShowDeleteLeft, def.deleteLeft);
+ saveButtonDefault(*m_bpButtonShowDeleteRight, def.deleteRight);
+ saveButtonDefault(*m_bpButtonShowUpdateLeft, def.updateLeft);
+ saveButtonDefault(*m_bpButtonShowUpdateRight, def.updateRight);
+ saveButtonDefault(*m_bpButtonShowDoNothing, def.doNothing);
};
ContextMenu menu;
@@ -3677,7 +3755,7 @@ void MainDialog::OnCompare(wxCommandEvent& event)
clearGrid(); //avoid memory peak by clearing old data first
- disableAllElements(true); //StatusHandlerTemporaryPanel will internally process Window messages, so avoid unexpected callbacks!
+ disableAllElements(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(); enableAllElements()); //ui update before enabling buttons again: prevent strange behaviour of delayed button clicks
@@ -3869,16 +3947,14 @@ void MainDialog::OnStartSync(wxCommandEvent& event)
{
bool dontShowAgain = false;
- if (showSyncConfirmationDlg(this,
+ if (showSyncConfirmationDlg(this, false /*syncSelection*/,
getSyncVariantName(guiCfg.mainCfg),
SyncStatistics(folderCmp_),
dontShowAgain) != ReturnSmallDlg::BUTTON_OKAY)
return;
-
globalCfg_.confirmDlgs.confirmSyncStart = !dontShowAgain;
}
-
std::set<AbstractPath> logFilePathsToKeep;
for (const ConfigFileItem& item : cfggrid::getDataView(*m_gridCfgHistory).get())
logFilePathsToKeep.insert(item.logFilePath);
@@ -3889,13 +3965,12 @@ void MainDialog::OnStartSync(wxCommandEvent& event)
using FinalRequest = StatusHandlerFloatingDialog::FinalRequest;
FinalRequest finalRequest = FinalRequest::none;
{
- disableAllElements(false); //StatusHandlerFloatingDialog will internally process Window messages, so avoid unexpected callbacks!
+ disableAllElements(false /*enableAbort*/); //StatusHandlerFloatingDialog will internally process Window messages, so avoid unexpected callbacks!
ZEN_ON_SCOPE_EXIT(enableAllElements());
//run this->enableAllElements() BEFORE "exitRequest" buf AFTER StatusHandlerFloatingDialog::reportFinalStatus()
//class handling status updates and error messages
- StatusHandlerFloatingDialog statusHandler(this,
- syncStartTime,
+ StatusHandlerFloatingDialog statusHandler(this, syncStartTime,
guiCfg.mainCfg.ignoreErrors,
guiCfg.mainCfg.automaticRetryCount,
guiCfg.mainCfg.automaticRetryDelay,
@@ -3908,7 +3983,6 @@ void MainDialog::OnStartSync(wxCommandEvent& event)
{
//PERF_START;
- //inform about (important) non-default global settings;
//let's report here rather than before comparison (user might have changed global settings in the meantime!)
logNonDefaultSettings(globalCfg_, statusHandler); //throw AbortProcess
@@ -3984,6 +4058,163 @@ void MainDialog::OnStartSync(wxCommandEvent& event)
}
+namespace
+{
+void appendInactive(ContainerObject& hierObj, std::vector<FileSystemObject*>& inactiveItems)
+{
+ for (FilePair& file : hierObj.refSubFiles())
+ if (!file.isActive())
+ inactiveItems.push_back(&file);
+ for (SymlinkPair& link : hierObj.refSubLinks())
+ if (!link.isActive())
+ inactiveItems.push_back(&link);
+ for (FolderPair& folder : hierObj.refSubFolders())
+ {
+ if (!folder.isActive())
+ inactiveItems.push_back(&folder);
+ appendInactive(folder, inactiveItems); //recurse
+ }
+}
+}
+
+
+void MainDialog::startSyncForSelecction(const std::vector<FileSystemObject*>& selection)
+{
+ //------------------ analyze selection ------------------
+ std::unordered_set<const BaseFolderPair*> basePairsSelect;
+ std::vector<FileSystemObject*> selectedActive;
+
+ for (FileSystemObject* fsObj : expandSelectionForPartialSync(selection))
+ {
+ switch (fsObj->getSyncOperation())
+ {
+ case SO_CREATE_NEW_LEFT:
+ case SO_CREATE_NEW_RIGHT:
+ case SO_DELETE_LEFT:
+ case SO_DELETE_RIGHT:
+ case SO_MOVE_LEFT_FROM:
+ case SO_MOVE_LEFT_TO:
+ case SO_MOVE_RIGHT_FROM:
+ case SO_MOVE_RIGHT_TO:
+ case SO_OVERWRITE_LEFT:
+ case SO_OVERWRITE_RIGHT:
+ case SO_COPY_METADATA_TO_LEFT:
+ case SO_COPY_METADATA_TO_RIGHT:
+ basePairsSelect.insert(&fsObj->base());
+ break;
+
+ case SO_UNRESOLVED_CONFLICT:
+ case SO_DO_NOTHING:
+ case SO_EQUAL:
+ break;
+ }
+ if (fsObj->isActive())
+ selectedActive.push_back(fsObj);
+ }
+
+ if (basePairsSelect.empty())
+ return; //harmonize with onMainGridContextRim(): this function should be a no-op iff context menu option is disabled!
+
+ FocusPreserver fp;
+ {
+ //---------------------------------------------------------------
+ //simulate partial sync by temporarily excluding all other items:
+ std::vector<FileSystemObject*> inactiveItems; //remember inactive (assuming a smaller number than active items)
+ std::for_each(begin(folderCmp_), end(folderCmp_), [&](BaseFolderPair& baseFolder) { appendInactive(baseFolder, inactiveItems); });
+
+ setActiveStatus(false, folderCmp_); //limit to folderCmpSelect? => no, let's also activate non-participating folder pairs, if only to visually match user selection
+
+ for (FileSystemObject* fsObj : selectedActive)
+ fsObj->setActive(true);
+
+ //don't run a full updateGui() (which would remove excluded rows) since we're only temporarily excluding:
+ filegrid::refresh(*m_gridMainL, *m_gridMainC, *m_gridMainR);
+ m_gridOverview->Refresh();
+
+ ZEN_ON_SCOPE_EXIT(
+ setActiveStatus(true, folderCmp_);
+
+ //inactive items are expected to still exist after sync! => no need for FileSystemObject::ObjectId
+ for (FileSystemObject* fsObj : inactiveItems)
+ fsObj->setActive(false);
+
+ filegrid::refresh(*m_gridMainL, *m_gridMainC, *m_gridMainR); //e.g. if user cancels confirmation popup
+ m_gridOverview->Refresh();
+ );
+ //---------------------------------------------------------------
+ const auto& guiCfg = getConfig();
+ const std::vector<FolderPairSyncCfg> fpCfg = extractSyncCfg(guiCfg.mainCfg);
+
+ //only apply partial sync to base pairs that contain at least one item to sync (e.g. avoid needless sync.ffs_db updates)
+ std::vector<std::shared_ptr<BaseFolderPair>> folderCmpSelect;
+ std::vector<FolderPairSyncCfg> fpCfgSelect;
+
+ for (size_t i = 0; i < folderCmp_.size(); ++i)
+ if (basePairsSelect.find(folderCmp_[i].get()) != basePairsSelect.end())
+ {
+ folderCmpSelect.push_back(folderCmp_[i]);
+ fpCfgSelect .push_back( fpCfg[i]);
+ }
+
+ //show sync preview/confirmation dialog
+ if (globalCfg_.confirmDlgs.confirmSyncStart)
+ {
+ bool dontShowAgain = false;
+
+ if (showSyncConfirmationDlg(this,
+ true /*syncSelection*/,
+ getSyncVariantName(guiCfg.mainCfg),
+ SyncStatistics(folderCmpSelect),
+ dontShowAgain) != ReturnSmallDlg::BUTTON_OKAY)
+ return;
+ globalCfg_.confirmDlgs.confirmSyncStart = !dontShowAgain;
+ }
+
+ const std::chrono::system_clock::time_point syncStartTime = std::chrono::system_clock::now();
+
+ //last sync log file? => let's go without; same behavior as manual deletion
+
+ disableAllElements(true /*enableAbort*/); //StatusHandlerFloatingDialog will internally process Window messages, so avoid unexpected callbacks!
+ auto app = wxTheApp; //fix lambda/wxWigets/VC fuck up
+ ZEN_ON_SCOPE_EXIT(app->Yield(); enableAllElements()); //ui update before enabling buttons again: prevent strange behaviour of delayed button clicks
+
+ StatusHandlerTemporaryPanel statusHandler(*this, syncStartTime,
+ guiCfg.mainCfg.ignoreErrors,
+ guiCfg.mainCfg.automaticRetryCount,
+ guiCfg.mainCfg.automaticRetryDelay); //handle status display and error messages
+ try
+ {
+ //let's report here rather than before comparison (user might have changed global settings in the meantime!)
+ logNonDefaultSettings(globalCfg_, statusHandler); //throw AbortProcess
+
+ //LockHolder? => let's go without; same behavior as manual deletion
+
+ //START SYNCHRONIZATION
+ synchronize(syncStartTime,
+ globalCfg_.verifyFileCopy,
+ globalCfg_.copyLockedFiles,
+ globalCfg_.copyFilePermissions,
+ globalCfg_.failSafeFileCopy,
+ globalCfg_.runWithBackgroundPriority,
+ fpCfgSelect,
+ folderCmpSelect,
+ globalCfg_.warnDlgs,
+ statusHandler); //throw AbortProcess
+ }
+ catch (AbortProcess&) {}
+
+ StatusHandlerTemporaryPanel::Result r = statusHandler.reportFinalStatus(); //noexcept
+
+ setLastOperationLog(r.summary, r.errorLog);
+ } //run updateGui() *after* reverting our temporary exclusions
+
+ //remove empty rows: just a beautification, invalid rows shouldn't cause issues
+ filegrid::getDataView(*m_gridMainC).removeInvalidRows();
+
+ updateGui();
+}
+
+
void MainDialog::updateConfigLastRunStats(time_t lastRunTime, SyncResult result, const AbstractPath& logFilePath)
{
cfggrid::getDataView(*m_gridCfgHistory).setLastRunStats(activeConfigFiles_, { lastRunTime, result, logFilePath });
@@ -4415,7 +4646,6 @@ void MainDialog::applySyncDirections()
{
showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString()));
}
-
updateGui();
}
@@ -4608,9 +4838,7 @@ void MainDialog::OnShowFolderPairOptions(wxEvent& event)
menu.addItem(_("Move up" ) + L"\tAlt+Page Up", [this, pos] { moveAddFolderPairUp(pos); }, &getResourceImage(L"move_up_sicon"));
menu.addItem(_("Move down") + L"\tAlt+Page Down", [this, pos] { moveAddFolderPairUp(pos + 1); }, &getResourceImage(L"move_down_sicon"), pos + 1 < makeSigned(additionalFolderPairs_.size()));
- wxPoint ctxPos = (*it)->m_bpButtonFolderPairOptions->GetPosition();
- ctxPos.x += (*it)->m_bpButtonFolderPairOptions->GetSize().GetWidth();
- menu.popup(*(*it)->m_panelLeft, ctxPos);
+ menu.popup(*(*it)->m_bpButtonFolderPairOptions, { (*it)->m_bpButtonFolderPairOptions->GetSize().x, 0 });
break;
}
}
diff --git a/FreeFileSync/Source/ui/main_dlg.h b/FreeFileSync/Source/ui/main_dlg.h
index 7259d3d8..410767b7 100644
--- a/FreeFileSync/Source/ui/main_dlg.h
+++ b/FreeFileSync/Source/ui/main_dlg.h
@@ -165,7 +165,7 @@ private:
void onMainGridContextL(zen::GridClickEvent& event);
void onMainGridContextC(zen::GridClickEvent& event);
void onMainGridContextR(zen::GridClickEvent& event);
- void onMainGridContextRim(bool leftSide);
+ void onMainGridContextRim(bool leftSide, zen::GridClickEvent& event);
void onTreeGridContext(zen::GridClickEvent& event);
@@ -224,6 +224,8 @@ private:
void OnSwapSides (wxCommandEvent& event) override;
void OnClose (wxCloseEvent& event) override;
+ void startSyncForSelecction(const std::vector<FileSystemObject*>& selection);
+
void OnCmpSettings (wxCommandEvent& event) override { showConfigDialog(SyncConfigPanel::COMPARISON, -1); }
void OnConfigureFilter(wxCommandEvent& event) override { showConfigDialog(SyncConfigPanel::FILTER, -1); }
void OnSyncSettings (wxCommandEvent& event) override { showConfigDialog(SyncConfigPanel::SYNC, -1); }
diff --git a/FreeFileSync/Source/ui/progress_indicator.cpp b/FreeFileSync/Source/ui/progress_indicator.cpp
index 262f721b..c9c8581b 100644
--- a/FreeFileSync/Source/ui/progress_indicator.cpp
+++ b/FreeFileSync/Source/ui/progress_indicator.cpp
@@ -1289,13 +1289,13 @@ void SyncProgressDialogImpl<TopLevelDialog>::closeDirectly(bool restoreParentFra
paused_ = false; //you never know?
+ //resumeFromSystray(); -> NO, instead ~SyncProgressDialogImpl() makes sure that main dialog is shown again! e.g. avoid calls to this/parentFrame_->Raise()
+
//ATTENTION: dialog may live a little longer, so watch callbacks!
//e.g. wxGTK calls OnIconize after wxWindow::Close() (better not ask why) and before physical destruction! => indirectly calls updateStaticGui(), which reads syncStat_!!!
syncStat_ = nullptr;
abortCb_ = nullptr;
- //resumeFromSystray(); -> NO, instead ~SyncProgressDialogImpl() makes sure that main dialog is shown again! e.g. avoid calls to this/parentFrame_->Raise()
-
this->Close(); //generate close event: do NOT destroy window unconditionally!
}
@@ -1354,6 +1354,8 @@ void SyncProgressDialogImpl<TopLevelDialog>::showSummary(SyncResult finalStatus,
//hide remaining time
pnl_.m_panelTimeRemaining->Hide();
+ resumeFromSystray(); //if in tray mode...
+
//------- change class state -------
syncStat_ = nullptr;
abortCb_ = nullptr;
@@ -1398,8 +1400,6 @@ void SyncProgressDialogImpl<TopLevelDialog>::showSummary(SyncResult finalStatus,
setExternalStatus(getFinalStatusLabel(finalStatus), wxString());
- resumeFromSystray(); //if in tray mode...
-
//this->EnableCloseButton(true);
pnl_.m_bpButtonMinimizeToTray->Hide();
diff --git a/FreeFileSync/Source/ui/small_dlgs.cpp b/FreeFileSync/Source/ui/small_dlgs.cpp
index 4312a7f9..871dd33e 100644
--- a/FreeFileSync/Source/ui/small_dlgs.cpp
+++ b/FreeFileSync/Source/ui/small_dlgs.cpp
@@ -623,17 +623,19 @@ void CloudSetupDlg::OnBrowseCloudFolder(wxCommandEvent& event)
{
AbstractPath folderPath = createAbstractPath(getFolderPathPhrase()); //noexcept
- try
- {
- //for SFTP it makes more sense to start with the home directory rather than root (which often denies access!)
- if (type_ == CloudType::sftp && !AFS::getParentPath(folderPath))
- folderPath.afsPath = getSftpHomePath(getResolvedSftpPath(getFolderPathPhrase()).login); //throw FileError
- }
- catch (const FileError& e)
- {
- showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString()));
- return;
- }
+ if (!AFS::getParentPath(folderPath))
+ try //for (S)FTP it makes more sense to start with the home directory rather than root (which often denies access!)
+ {
+ if (type_ == CloudType::sftp)
+ folderPath.afsPath = getSftpHomePath(getResolvedSftpPath(getFolderPathPhrase()).login); //throw FileError
+ if (type_ == CloudType::ftp)
+ folderPath.afsPath = getFtpHomePath(getResolvedFtpPath(getFolderPathPhrase()).login); //throw FileError
+ }
+ catch (const FileError& e)
+ {
+ showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString()));
+ return;
+ }
if (showAbstractFolderPicker(this, folderPath) == ReturnAfsPicker::BUTTON_OKAY)
m_textCtrlServerPath->ChangeValue(utfTo<wxString>(FILE_NAME_SEPARATOR + folderPath.afsPath.value));
@@ -935,6 +937,7 @@ class SyncConfirmationDlg : public SyncConfirmationDlgGenerated
{
public:
SyncConfirmationDlg(wxWindow* parent,
+ bool syncSelection,
const wxString& variantName,
const SyncStatistics& st,
bool& dontShowAgain);
@@ -951,6 +954,7 @@ private:
SyncConfirmationDlg::SyncConfirmationDlg(wxWindow* parent,
+ bool syncSelection,
const wxString& variantName,
const SyncStatistics& st,
bool& dontShowAgain) :
@@ -959,9 +963,10 @@ SyncConfirmationDlg::SyncConfirmationDlg(wxWindow* parent,
{
setStandardButtonLayout(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonStartSync).setCancel(m_buttonCancel));
- setMainInstructionFont(*m_staticTextHeader);
- m_bitmapSync->SetBitmap(getResourceImage(L"file_sync"));
+ setMainInstructionFont(*m_staticTextCaption);
+ m_bitmapSync->SetBitmap(getResourceImage(syncSelection ? L"file_sync_selection" : L"file_sync"));
+ m_staticTextCaption->SetLabel(syncSelection ?_("Start to synchronize the selection?") : _("Start synchronization now?"));
m_staticTextVariant->SetLabel(variantName);
m_checkBoxDontShowAgain->SetValue(dontShowAgain);
@@ -1017,11 +1022,13 @@ void SyncConfirmationDlg::OnStartSync(wxCommandEvent& event)
ReturnSmallDlg::ButtonPressed fff::showSyncConfirmationDlg(wxWindow* parent,
+ bool syncSelection,
const wxString& variantName,
const SyncStatistics& statistics,
bool& dontShowAgain)
{
SyncConfirmationDlg dlg(parent,
+ syncSelection,
variantName,
statistics,
dontShowAgain);
@@ -1101,7 +1108,7 @@ OptionsDlg::OptionsDlg(wxWindow* parent, XmlGlobalSettings& globalSettings) :
setExtApp(globalSettings.gui.externalApps);
m_checkBoxLogFilesMaxAge->SetValue(globalSettings.logfilesMaxAgeDays > 0);
- m_spinCtrlLogFilesMaxAge->SetValue(globalSettings.logfilesMaxAgeDays > 0 ? globalSettings.logfilesMaxAgeDays : 14);
+ m_spinCtrlLogFilesMaxAge->SetValue(globalSettings.logfilesMaxAgeDays > 0 ? globalSettings.logfilesMaxAgeDays : XmlGlobalSettings().logfilesMaxAgeDays);
//--------------------------------------------------------------------------------
updateGui();
diff --git a/FreeFileSync/Source/ui/small_dlgs.h b/FreeFileSync/Source/ui/small_dlgs.h
index 9083874c..27292afd 100644
--- a/FreeFileSync/Source/ui/small_dlgs.h
+++ b/FreeFileSync/Source/ui/small_dlgs.h
@@ -42,6 +42,7 @@ ReturnSmallDlg::ButtonPressed showDeleteDialog(wxWindow* parent,
bool& useRecycleBin);
ReturnSmallDlg::ButtonPressed showSyncConfirmationDlg(wxWindow* parent,
+ bool syncSelection,
const wxString& variantName,
const SyncStatistics& statistics,
bool& dontShowAgain);
diff --git a/FreeFileSync/Source/ui/sync_cfg.cpp b/FreeFileSync/Source/ui/sync_cfg.cpp
index 8a2add95..fe956ab5 100644
--- a/FreeFileSync/Source/ui/sync_cfg.cpp
+++ b/FreeFileSync/Source/ui/sync_cfg.cpp
@@ -90,7 +90,7 @@ private:
CompareVariant localCmpVar_ = CompareVariant::TIME_SIZE;
- std::set<AfsDevice> devicesForEdit_; //helper data for deviceParallelOps
+ std::set<AfsDevice> devicesForEdit_; //helper data for deviceParallelOps
std::map<AfsDevice, size_t> deviceParallelOps_; //
//------------- filter panel --------------------------
@@ -309,7 +309,6 @@ commandHistItemsMax_(commandHistItemsMax)
m_scrolledWindowPerf->SetMinSize(wxSize(fastFromDIP(220), -1));
m_bitmapPerf->SetBitmap(perfPanelActive_ ? getResourceImage(L"speed") : greyScale(getResourceImage(L"speed")));
m_panelPerfHeader ->Enable(perfPanelActive_);
- m_staticTextPerfParallelOps->Enable(perfPanelActive_);
m_spinCtrlAutoRetryCount->SetMinSize(wxSize(fastFromDIP(60), -1)); //Hack: set size (why does wxWindow::Size() not work?)
m_spinCtrlAutoRetryDelay->SetMinSize(wxSize(fastFromDIP(60), -1)); //
@@ -1234,6 +1233,8 @@ void ConfigDialog::setMiscSyncOptions(const MiscSyncConfig& miscCfg)
staticTextDevice->SetLabel(AFS::getDisplayPath(AbstractPath(afsDevice, AfsPath())));
++i;
}
+ m_staticTextPerfParallelOps->Enable(perfPanelActive_ && !devicesForEdit_.empty());
+
m_panelComparisonSettings->Layout(); //*after* setting text labels
//----------------------------------------------------------------------------
@@ -1300,10 +1301,9 @@ void ConfigDialog::selectFolderPairConfig(int newPairIndexToShow)
m_checkBoxUseLocalSyncOptions->Show(!mainConfigSelected && showMultipleCfgs_);
m_staticlineSyncHeader->Show(showMultipleCfgs_);
//misc
- bSizerPerformance ->Show(mainConfigSelected); //caveat: recursively shows hidden child items!
- m_staticlinePerformance->Show(mainConfigSelected);
- bSizerCompMisc ->Show(mainConfigSelected);
- bSizerSyncMisc ->Show(mainConfigSelected);
+ bSizerPerformance->Show(mainConfigSelected); //caveat: recursively shows hidden child items!
+ bSizerCompMisc ->Show(mainConfigSelected);
+ bSizerSyncMisc ->Show(mainConfigSelected);
if (mainConfigSelected) m_staticTextPerfDeRequired->Show(!perfPanelActive_); //keep after bSizerPerformance->Show()
if (mainConfigSelected) m_staticlinePerfDeRequired->Show(!perfPanelActive_); //
diff --git a/FreeFileSync/Source/ui/tree_grid.cpp b/FreeFileSync/Source/ui/tree_grid.cpp
index 2525ace2..896b004f 100644
--- a/FreeFileSync/Source/ui/tree_grid.cpp
+++ b/FreeFileSync/Source/ui/tree_grid.cpp
@@ -636,7 +636,7 @@ std::unique_ptr<TreeView::Node> TreeView::getLine(size_t row) const
case TreeView::TYPE_FILES:
{
const auto* parentDir = flatTree_[row].node;
- if (auto firstFile = FileSystemObject::retrieve(parentDir->firstFileId))
+ if (FileSystemObject* firstFile = FileSystemObject::retrieve(parentDir->firstFileId))
{
std::vector<FileSystemObject*> filesAndLinks;
ContainerObject& parent = firstFile->parent();
diff --git a/FreeFileSync/Source/version/version.h b/FreeFileSync/Source/version/version.h
index f3b88a49..d9eb206a 100644
--- a/FreeFileSync/Source/version/version.h
+++ b/FreeFileSync/Source/version/version.h
@@ -3,7 +3,7 @@
namespace fff
{
-const char ffsVersion[] = "10.9"; //internal linkage!
+const char ffsVersion[] = "10.10"; //internal linkage!
const char FFS_VERSION_SEPARATOR = '.';
}
diff --git a/wx+/grid.cpp b/wx+/grid.cpp
index 3c19c246..114bb82d 100644
--- a/wx+/grid.cpp
+++ b/wx+/grid.cpp
@@ -293,6 +293,7 @@ public:
Connect(wxEVT_MOUSE_CAPTURE_LOST, wxMouseCaptureLostEventHandler(SubWindow::onMouseCaptureLost), nullptr, this);
Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(SubWindow::onKeyDown), nullptr, this);
+ Connect(wxEVT_KEY_UP, wxKeyEventHandler(SubWindow::onKeyUp ), nullptr, this);
assert(GetClientAreaOrigin() == wxPoint()); //generally assumed when dealing with coordinates below
}
@@ -300,7 +301,7 @@ public:
const Grid& refParent() const { return parent_; }
template <class T>
- bool sendEventNow(T&& event) //take both "rvalue + lvalues", return "true" if a suitable event handler function was found and executed, and the function did not call wxEvent::Skip.
+ bool sendEventToParent(T&& event) //take both "rvalue + lvalues", return "true" if a suitable event handler function was found and executed, and the function did not call wxEvent::Skip.
{
if (wxEvtHandler* evtHandler = parent_.GetEventHandler())
return evtHandler->ProcessEvent(event);
@@ -346,7 +347,13 @@ private:
void onKeyDown(wxKeyEvent& event)
{
- if (!sendEventNow(event)) //let parent collect all key events
+ if (!sendEventToParent(event)) //let parent collect all key events
+ event.Skip();
+ }
+
+ void onKeyUp(wxKeyEvent& event)
+ {
+ if (!sendEventToParent(event)) //let parent collect all key events
event.Skip();
}
@@ -366,7 +373,7 @@ private:
//=> call wxScrolledWindow mouse wheel handler directly
parent_.HandleOnMouseWheel(event);
- //if (!sendEventNow(event))
+ //if (!sendEventToParent(event))
// event.Skip();
}
@@ -723,7 +730,7 @@ private:
else //notify single label click
{
if (const std::optional<ColumnType> colType = refParent().colToType(activeClickOrMove_->getColumnFrom()))
- sendEventNow(GridLabelClickEvent(EVENT_GRID_COL_LABEL_MOUSE_LEFT, event, *colType));
+ sendEventToParent(GridLabelClickEvent(EVENT_GRID_COL_LABEL_MOUSE_LEFT, *colType));
}
activeClickOrMove_.reset();
}
@@ -832,13 +839,13 @@ private:
if (const std::optional<ColAction> action = refParent().clientPosToColumnAction(event.GetPosition()))
{
if (const std::optional<ColumnType> colType = refParent().colToType(action->col))
- sendEventNow(GridLabelClickEvent(EVENT_GRID_COL_LABEL_MOUSE_RIGHT, event, *colType)); //notify right click
+ sendEventToParent(GridLabelClickEvent(EVENT_GRID_COL_LABEL_MOUSE_RIGHT, *colType)); //notify right click
else assert(false);
}
else
//notify right click (on free space after last column)
if (fillGapAfterColumns)
- sendEventNow(GridLabelClickEvent(EVENT_GRID_COL_LABEL_MOUSE_RIGHT, event, ColumnType::NONE));
+ sendEventToParent(GridLabelClickEvent(EVENT_GRID_COL_LABEL_MOUSE_RIGHT, ColumnType::NONE));
event.Skip();
}
@@ -971,8 +978,10 @@ private:
const ptrdiff_t row = rowLabelWin_.getRowAtPos(absPos.y); //return -1 for invalid position; >= rowCount if out of range
const ColumnPosInfo cpi = refParent().getColumnAtPos(absPos.x); //returns ColumnType::NONE if no column at x position!
const HoverArea rowHover = prov->getRowMouseHover(row, cpi.colType, cpi.cellRelativePosX, cpi.colWidth);
+ const wxPoint mousePos = GetPosition() + event.GetPosition();
+
//client is interested in all double-clicks, even those outside of the grid!
- sendEventNow(GridClickEvent(EVENT_GRID_MOUSE_LEFT_DOUBLE, event, row, rowHover));
+ sendEventToParent(GridClickEvent(EVENT_GRID_MOUSE_LEFT_DOUBLE, row, rowHover, mousePos));
}
event.Skip();
}
@@ -985,10 +994,11 @@ private:
const ptrdiff_t row = rowLabelWin_.getRowAtPos(absPos.y); //return -1 for invalid position; >= rowCount if out of range
const ColumnPosInfo cpi = refParent().getColumnAtPos(absPos.x); //returns ColumnType::NONE if no column at x position!
const HoverArea rowHover = prov->getRowMouseHover(row, cpi.colType, cpi.cellRelativePosX, cpi.colWidth);
+ const wxPoint mousePos = GetPosition() + event.GetPosition();
//row < 0 possible!!! Pressing "Menu Key" simulates mouse-right-button down + up at position 0xffff/0xffff!
- GridClickEvent mouseEvent(event.RightDown() ? EVENT_GRID_MOUSE_RIGHT_DOWN : EVENT_GRID_MOUSE_LEFT_DOWN, event, row, rowHover);
- if (!sendEventNow(mouseEvent)) //allow client to swallow event!
+ GridClickEvent mouseEvent(event.RightDown() ? EVENT_GRID_MOUSE_RIGHT_DOWN : EVENT_GRID_MOUSE_LEFT_DOWN, row, rowHover, mousePos);
+ if (!sendEventToParent(mouseEvent)) //allow client to swallow event!
{
if (wxWindow::FindFocus() != this) //doesn't seem to happen automatically for right mouse button
SetFocus();
@@ -1057,8 +1067,9 @@ private:
const ptrdiff_t row = rowLabelWin_.getRowAtPos(absPos.y); //return -1 for invalid position; >= rowCount if out of range
const ColumnPosInfo cpi = refParent().getColumnAtPos(absPos.x); //returns ColumnType::NONE if no column at x position!
const HoverArea rowHover = prov->getRowMouseHover(row, cpi.colType, cpi.cellRelativePosX, cpi.colWidth);
+ const wxPoint mousePos = GetPosition() + event.GetPosition();
//notify click event after the range selection! e.g. this makes sure the selection is applied before showing a context menu
- sendEventNow(GridClickEvent(event.RightUp() ? EVENT_GRID_MOUSE_RIGHT_UP : EVENT_GRID_MOUSE_LEFT_UP, event, row, rowHover));
+ sendEventToParent(GridClickEvent(event.RightUp() ? EVENT_GRID_MOUSE_RIGHT_UP : EVENT_GRID_MOUSE_LEFT_UP, row, rowHover, mousePos));
}
//update highlight_ and tooltip: on OS X no mouse movement event is generated after a mouse button click (unlike on Windows)
@@ -1317,6 +1328,7 @@ Grid::Grid(wxWindow* parent,
Bind(wxEVT_ERASE_BACKGROUND, [](wxEraseEvent& event) {}); //http://wiki.wxwidgets.org/Flicker-Free_Drawing
Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(Grid::onKeyDown), nullptr, this);
+ Connect(wxEVT_KEY_UP, wxKeyEventHandler(Grid::onKeyUp ), nullptr, this);
}
@@ -1481,6 +1493,32 @@ wxSize Grid::GetSizeAvailableForScrollTarget(const wxSize& size)
void Grid::onPaintEvent(wxPaintEvent& event) { wxPaintDC dc(this); }
+void Grid::onKeyUp(wxKeyEvent& event)
+{
+ int keyCode = event.GetKeyCode();
+ if (event.ShiftDown() && keyCode == WXK_F10) //== alias for menu key
+ keyCode = WXK_WINDOWS_MENU;
+
+ switch (keyCode)
+ {
+ case WXK_MENU: //
+ case WXK_WINDOWS_MENU: //simulate right mouse click at cursor(+1) position
+ {
+ const int cursorNextPosY = rowLabelWin_->getRowHeight() * std::min(getRowCount(), mainWin_->getCursor() + 1);
+ const int clientPosMainWinY = std::clamp(CalcScrolledPosition(wxPoint(0, cursorNextPosY)).y, //absolute -> client coordinates
+ 0, mainWin_->GetClientSize().GetHeight() - 1);
+ const wxPoint mousePos = mainWin_->GetPosition() + wxPoint(0, clientPosMainWinY); //mainWin_-relative to Grid-relative
+
+ GridClickEvent clickEvent(EVENT_GRID_MOUSE_RIGHT_UP, -1, HoverArea::NONE, mousePos);
+ if (wxEvtHandler* evtHandler = GetEventHandler())
+ evtHandler->ProcessEvent(clickEvent);
+ }
+ return;
+ }
+ event.Skip();
+}
+
+
void Grid::onKeyDown(wxKeyEvent& event)
{
int keyCode = event.GetKeyCode();
@@ -1491,6 +1529,8 @@ void Grid::onKeyDown(wxKeyEvent& event)
else if (keyCode == WXK_RIGHT || keyCode == WXK_NUMPAD_RIGHT)
keyCode = WXK_LEFT;
}
+ if (event.ShiftDown() && keyCode == WXK_F10) //== alias for menu key
+ keyCode = WXK_WINDOWS_MENU;
const ptrdiff_t rowCount = getRowCount();
const ptrdiff_t cursorRow = mainWin_->getCursor();
@@ -1515,6 +1555,20 @@ void Grid::onKeyDown(wxKeyEvent& event)
switch (keyCode)
{
+ case WXK_MENU: //
+ case WXK_WINDOWS_MENU: //simulate right mouse click at cursor(+1) position
+ {
+ const int cursorNextPosY = rowLabelWin_->getRowHeight() * std::min(getRowCount(), mainWin_->getCursor() + 1);
+ const int clientPosMainWinY = std::clamp(CalcScrolledPosition(wxPoint(0, cursorNextPosY)).y, //absolute -> client coordinates
+ 0, mainWin_->GetClientSize().GetHeight() - 1);
+ const wxPoint mousePos = mainWin_->GetPosition() + wxPoint(0, clientPosMainWinY); //mainWin_-relative to Grid-relative
+
+ GridClickEvent clickEvent(EVENT_GRID_MOUSE_RIGHT_DOWN, -1, HoverArea::NONE, mousePos);
+ if (wxEvtHandler* evtHandler = GetEventHandler())
+ evtHandler->ProcessEvent(clickEvent);
+ }
+ return;
+
//case WXK_TAB:
// if (Navigate(event.ShiftDown() ? wxNavigationKeyEvent::IsBackward : wxNavigationKeyEvent::IsForward))
// return;
diff --git a/wx+/grid.h b/wx+/grid.h
index 102396c3..dbd33c7a 100644
--- a/wx+/grid.h
+++ b/wx+/grid.h
@@ -22,6 +22,10 @@ namespace zen
enum class ColumnType { NONE = -1 }; //user-defiend column type
enum class HoverArea { NONE = -1 }; //user-defined area for mouse selections for a given row (may span multiple columns or split a single column into multiple areas)
+//wxContextMenuEvent? => automatically generated by wxWidgets when right mouse down/up is not handled; even OS-dependent in which case event is generated
+//=> inappropriate! client decides when to show context! => simulate right mouse click when WXK_WINDOWS_MENU button is pressed
+//=> same behavior as earlier wxWidgets: https://github.com/wxWidgets/wxWidgets/commit/2c69d27c0d225d3a331c773da466686153185320#diff-9f11c8f2cb1f734f7c0c1071aba491a5
+
//------------------------ events ------------------------------------------------
extern const wxEventType EVENT_GRID_MOUSE_LEFT_DOUBLE; //
extern const wxEventType EVENT_GRID_MOUSE_LEFT_DOWN; //
@@ -38,21 +42,21 @@ extern const wxEventType EVENT_GRID_COL_RESIZE; //generates: GridColumnResizeEve
//example: wnd.Connect(EVENT_GRID_COL_LABEL_LEFT_CLICK, GridClickEventHandler(MyDlg::OnLeftClick), nullptr, this);
-struct GridClickEvent : public wxMouseEvent
+struct GridClickEvent : public wxEvent
{
- GridClickEvent(wxEventType et, const wxMouseEvent& me, ptrdiff_t row, HoverArea hoverArea) :
- wxMouseEvent(me), row_(row), hoverArea_(hoverArea) { SetEventType(et); }
+ GridClickEvent(wxEventType et, ptrdiff_t row, HoverArea hoverArea, const wxPoint& mousePos) :
+ wxEvent(0 /*winid*/, et), row_(row), hoverArea_(hoverArea), mousePos_(mousePos) {}
GridClickEvent* Clone() const override { return new GridClickEvent(*this); }
const ptrdiff_t row_; //-1 for invalid position, >= rowCount if out of range
const HoverArea hoverArea_; //may be HoverArea::NONE
+ const wxPoint mousePos_; //client coordinates
};
-
-struct GridSelectEvent : public wxCommandEvent
+struct GridSelectEvent : public wxEvent
{
GridSelectEvent(size_t rowFirst, size_t rowLast, bool positive, const GridClickEvent* mouseClick) :
- wxCommandEvent(EVENT_GRID_SELECT_RANGE), rowFirst_(rowFirst), rowLast_(rowLast), positive_(positive),
+ wxEvent(0 /*winid*/, EVENT_GRID_SELECT_RANGE), rowFirst_(rowFirst), rowLast_(rowLast), positive_(positive),
mouseClick_(mouseClick ? *mouseClick : std::optional<GridClickEvent>()) { assert(rowFirst <= rowLast); }
GridSelectEvent* Clone() const override { return new GridSelectEvent(*this); }
@@ -62,17 +66,17 @@ struct GridSelectEvent : public wxCommandEvent
const std::optional<GridClickEvent> mouseClick_; //filled unless selection was performed via keyboard shortcuts
};
-struct GridLabelClickEvent : public wxMouseEvent
+struct GridLabelClickEvent : public wxEvent
{
- GridLabelClickEvent(wxEventType et, const wxMouseEvent& me, ColumnType colType) : wxMouseEvent(me), colType_(colType) { SetEventType(et); }
+ GridLabelClickEvent(wxEventType et, ColumnType colType) : wxEvent(0 /*winid*/, et), colType_(colType) {}
GridLabelClickEvent* Clone() const override { return new GridLabelClickEvent(*this); }
const ColumnType colType_; //may be ColumnType::NONE
};
-struct GridColumnResizeEvent : public wxCommandEvent
+struct GridColumnResizeEvent : public wxEvent
{
- GridColumnResizeEvent(int offset, ColumnType colType) : wxCommandEvent(EVENT_GRID_COL_RESIZE), colType_(colType), offset_(offset) {}
+ GridColumnResizeEvent(int offset, ColumnType colType) : wxEvent(0 /*winid*/, EVENT_GRID_COL_RESIZE), colType_(colType), offset_(offset) {}
GridColumnResizeEvent* Clone() const override { return new GridColumnResizeEvent(*this); }
const ColumnType colType_;
@@ -224,6 +228,7 @@ private:
void onPaintEvent(wxPaintEvent& event);
void onSizeEvent(wxSizeEvent& event) { updateWindowSizes(); event.Skip(); }
void onKeyDown(wxKeyEvent& event);
+ void onKeyUp (wxKeyEvent& event);
void updateWindowSizes(bool updateScrollbar = true);
diff --git a/wx+/image_resources.cpp b/wx+/image_resources.cpp
index 5bc8006f..faabbb2a 100644
--- a/wx+/image_resources.cpp
+++ b/wx+/image_resources.cpp
@@ -88,7 +88,7 @@ auto getScalerTask(const wxString& name, const wxImage& img, int hqScale, Protec
width = img.GetWidth(),
height = img.GetHeight(),
dpiWidth = fastFromDIP(img.GetWidth()),
- dpiHeight = fastFromDIP(img.GetHeight()), //don't call fastFromDIP() from worker thread (wxWidgets function!)
+ dpiHeight = fastFromDIP(img.GetHeight()), //don't call (wxWidgets function!) fastFromDIP() from worker thread
rgb = img.GetData(),
alpha = img.GetAlpha(),
hqScale, &result]
diff --git a/wx+/image_tools.h b/wx+/image_tools.h
index e1a6953c..b1df41e6 100644
--- a/wx+/image_tools.h
+++ b/wx+/image_tools.h
@@ -187,6 +187,10 @@ wxImage shrinkImage(const wxImage& img, int requestedSize)
{
const int maxExtent = std::max(img.GetWidth(), img.GetHeight());
assert(requestedSize <= maxExtent);
+
+ if (requestedSize >= maxExtent)
+ return img;
+
return img.Scale(img.GetWidth () * requestedSize / maxExtent,
img.GetHeight() * requestedSize / maxExtent, wxIMAGE_QUALITY_BILINEAR); //looks sharper than wxIMAGE_QUALITY_HIGH!
}
diff --git a/wx+/popup_dlg.cpp b/wx+/popup_dlg.cpp
index 689b364e..8ee44521 100644
--- a/wx+/popup_dlg.cpp
+++ b/wx+/popup_dlg.cpp
@@ -113,7 +113,6 @@ public:
int maxWidth = fastFromDIP(500);
int maxHeight = fastFromDIP(400); //try to determine better value based on actual display resolution:
- //int [maxWidth, maxHeight] = wxSize(fastFromDIP(500), fastFromDIP(400));
if (parent)
{
diff --git a/wx+/tooltip.cpp b/wx+/tooltip.cpp
index a7bf85fe..03025049 100644
--- a/wx+/tooltip.cpp
+++ b/wx+/tooltip.cpp
@@ -30,9 +30,10 @@ public:
{
//Suse Linux/X11: needs parent window, else there are z-order issues
- this->SetSizeHints(wxDefaultSize, wxDefaultSize);
- this->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOBK)); //both required: on Ubuntu background is black, foreground white!
- this->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOTEXT)); //
+ SetSizeHints(wxDefaultSize, wxDefaultSize);
+ SetExtraStyle(this->GetExtraStyle() | wxWS_EX_TRANSIENT);
+ SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOBK)); //both required: on Ubuntu background is black, foreground white!
+ SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOTEXT)); //
wxBoxSizer* bSizer158 = new wxBoxSizer(wxHORIZONTAL);
bitmapLeft_ = new wxStaticBitmap(this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0);
@@ -41,8 +42,8 @@ public:
staticTextMain_ = new wxStaticText(this, wxID_ANY, wxString(), wxDefaultPosition, wxDefaultSize, 0);
bSizer158->Add(staticTextMain_, 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5);
- this->SetSizer(bSizer158);
- this->Layout();
+ SetSizer(bSizer158);
+ Layout();
bSizer158->Fit(this);
}
diff --git a/xBRZ/src/xbrz_tools.h b/xBRZ/src/xbrz_tools.h
index aaa2b769..15bea025 100644
--- a/xBRZ/src/xbrz_tools.h
+++ b/xBRZ/src/xbrz_tools.h
@@ -184,7 +184,7 @@ void bilinearScale(const uint32_t* src, int srcWidth, int srcHeight, int srcPitc
//perf notes:
// -> double-based calculation is (slightly) faster than float
- // -> precalculation gives significant boost; std::vector<> memory allocation is negligible!
+ // -> pre-calculation gives significant boost; std::vector<> memory allocation is negligible!
struct CoeffsX
{
int x1 = 0;
@@ -233,11 +233,9 @@ void bilinearScale(const uint32_t* src, int srcWidth, int srcHeight, int srcPitc
auto interpolate = [=](int offset)
{
- /*
- https://en.wikipedia.org/wiki/Bilinear_interpolation
- (c11(x2 - x) + c21(x - x1)) * (y2 - y ) +
- (c12(x2 - x) + c22(x - x1)) * (y - y1)
- */
+ /* https://en.wikipedia.org/wiki/Bilinear_interpolation
+ (c11(x2 - x) + c21(x - x1)) * (y2 - y ) +
+ (c12(x2 - x) + c22(x - x1)) * (y - y1) */
const auto c11 = (srcLine [x1] >> (8 * offset)) & 0xff;
const auto c21 = (srcLine [x2] >> (8 * offset)) & 0xff;
const auto c12 = (srcLineNext[x1] >> (8 * offset)) & 0xff;
diff --git a/zen/file_access.cpp b/zen/file_access.cpp
index a60eccb2..4536ec36 100644
--- a/zen/file_access.cpp
+++ b/zen/file_access.cpp
@@ -180,19 +180,23 @@ uint64_t zen::getFreeDiskSpace(const Zstring& path) //throw FileError, returns 0
}
-FileDetails zen::getFileDetails(const Zstring& itemPath) //throw FileError
+VolumeId zen::getVolumeId(const Zstring& itemPath) //throw FileError
{
struct ::stat fileInfo = {};
if (::stat(itemPath.c_str(), &fileInfo) != 0)
THROW_LAST_FILE_ERROR(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(itemPath)), L"stat");
- return
- {
- makeUnsigned(fileInfo.st_size),
- fileInfo.st_mtime,
- fileInfo.st_dev,
- //FileIndex fileIndex = fileInfo.st_ino;
- };
+ return fileInfo.st_dev;
+}
+
+
+uint64_t zen::getFileSize(const Zstring& filePath) //throw FileError
+{
+ struct ::stat fileInfo = {};
+ if (::stat(filePath.c_str(), &fileInfo) != 0)
+ THROW_LAST_FILE_ERROR(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(filePath)), L"stat");
+
+ return fileInfo.st_size;
}
@@ -303,15 +307,15 @@ namespace
Fix8Dot3NameClash()
*/
//wrapper for file system rename function:
-void moveAndRenameFileSub(const Zstring& pathSource, const Zstring& pathTarget, bool replaceExisting) //throw FileError, ErrorDifferentVolume, ErrorTargetExisting
+void moveAndRenameFileSub(const Zstring& pathFrom, const Zstring& pathTo, bool replaceExisting) //throw FileError, ErrorMoveUnsupported, ErrorTargetExisting
{
auto throwException = [&](int ec)
{
- const std::wstring errorMsg = replaceCpy(replaceCpy(_("Cannot move file %x to %y."), L"%x", L"\n" + fmtPath(pathSource)), L"%y", L"\n" + fmtPath(pathTarget));
+ const std::wstring errorMsg = replaceCpy(replaceCpy(_("Cannot move file %x to %y."), L"%x", L"\n" + fmtPath(pathFrom)), L"%y", L"\n" + fmtPath(pathTo));
const std::wstring errorDescr = formatSystemError(L"rename", ec);
if (ec == EXDEV)
- throw ErrorDifferentVolume(errorMsg, errorDescr);
+ throw ErrorMoveUnsupported(errorMsg, errorDescr);
if (ec == EEXIST)
throw ErrorTargetExisting(errorMsg, errorDescr);
throw FileError(errorMsg, errorDescr);
@@ -324,11 +328,11 @@ void moveAndRenameFileSub(const Zstring& pathSource, const Zstring& pathTarget,
if (!replaceExisting)
{
struct ::stat infoSrc = {};
- if (::lstat(pathSource.c_str(), &infoSrc) != 0)
- THROW_LAST_FILE_ERROR(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(pathSource)), L"stat");
+ if (::lstat(pathFrom.c_str(), &infoSrc) != 0)
+ THROW_LAST_FILE_ERROR(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(pathFrom)), L"stat");
struct ::stat infoTrg = {};
- if (::lstat(pathTarget.c_str(), &infoTrg) == 0)
+ if (::lstat(pathTo.c_str(), &infoTrg) == 0)
{
if (infoSrc.st_dev != infoTrg.st_dev ||
infoSrc.st_ino != infoTrg.st_ino)
@@ -339,7 +343,7 @@ void moveAndRenameFileSub(const Zstring& pathSource, const Zstring& pathTarget,
//else: not existing or access error (hopefully ::rename will also fail!)
}
- if (::rename(pathSource.c_str(), pathTarget.c_str()) != 0)
+ if (::rename(pathFrom.c_str(), pathTo.c_str()) != 0)
throwException(errno);
}
@@ -348,29 +352,29 @@ void moveAndRenameFileSub(const Zstring& pathSource, const Zstring& pathTarget,
//rename file: no copying!!!
-void zen::moveAndRenameItem(const Zstring& pathSource, const Zstring& pathTarget, bool replaceExisting) //throw FileError, ErrorDifferentVolume, ErrorTargetExisting
+void zen::moveAndRenameItem(const Zstring& pathFrom, const Zstring& pathTo, bool replaceExisting) //throw FileError, ErrorMoveUnsupported, ErrorTargetExisting
{
try
{
- moveAndRenameFileSub(pathSource, pathTarget, replaceExisting); //throw FileError, ErrorDifferentVolume, ErrorTargetExisting
+ moveAndRenameFileSub(pathFrom, pathTo, replaceExisting); //throw FileError, ErrorMoveUnsupported, ErrorTargetExisting
}
catch (ErrorTargetExisting&)
{
#if 0 //"Work around pen drive failing to change file name case" => enable if needed: https://freefilesync.org/forum/viewtopic.php?t=4279
- const Zstring fileNameSrc = afterLast (pathSource, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL);
- const Zstring fileNameTrg = afterLast (pathTarget, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL);
- const Zstring parentPathSrc = beforeLast(pathSource, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE);
- const Zstring parentPathTrg = beforeLast(pathTarget, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE);
+ const Zstring fileNameSrc = afterLast (pathFrom, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL);
+ const Zstring fileNameTrg = afterLast (pathTo, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL);
+ const Zstring parentPathSrc = beforeLast(pathFrom, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE);
+ const Zstring parentPathTrg = beforeLast(pathTo, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE);
//some (broken) devices may fail to rename case directly:
if (equalNativePath(parentPathSrc, parentPathTrg))
{
if (fileNameSrc == fileNameTrg)
return; //non-sensical request
- const Zstring tempFilePath = getTemporaryPath8Dot3(pathSource); //throw FileError
- moveAndRenameFileSub(pathSource, tempFilePath); //throw FileError, ErrorDifferentVolume, ErrorTargetExisting
- ZEN_ON_SCOPE_FAIL(moveAndRenameFileSub(tempFilePath, pathSource)); //"try" our best to be "atomic" :>
- moveAndRenameFileSub(tempFilePath, pathTarget); //throw FileError, ErrorDifferentVolume, ErrorTargetExisting
+ const Zstring tempFilePath = getTemporaryPath8Dot3(pathFrom); //throw FileError
+ moveAndRenameFileSub(pathFrom, tempFilePath); //throw FileError, (ErrorMoveUnsupported), ErrorTargetExisting
+ ZEN_ON_SCOPE_FAIL(moveAndRenameFileSub(tempFilePath, pathFrom)); //"try" our best to be "atomic" :>
+ moveAndRenameFileSub(tempFilePath, pathTo); //throw FileError, (ErrorMoveUnsupported), ErrorTargetExisting
return;
}
#endif
@@ -585,27 +589,26 @@ void zen::tryCopyDirectoryAttributes(const Zstring& sourcePath, const Zstring& t
}
-void zen::copySymlink(const Zstring& sourceLink, const Zstring& targetLink, bool copyFilePermissions) //throw FileError
+void zen::copySymlink(const Zstring& sourcePath, const Zstring& targetPath, bool copyFilePermissions) //throw FileError
{
- const Zstring linkPath = getSymlinkTargetRaw(sourceLink); //throw FileError; accept broken symlinks
+ const Zstring linkPath = getSymlinkTargetRaw(sourcePath); //throw FileError; accept broken symlinks
- const wchar_t functionName[] = L"symlink";
- if (::symlink(linkPath.c_str(), targetLink.c_str()) != 0)
- THROW_LAST_FILE_ERROR(replaceCpy(replaceCpy(_("Cannot copy symbolic link %x to %y."), L"%x", L"\n" + fmtPath(sourceLink)), L"%y", L"\n" + fmtPath(targetLink)), functionName);
+ if (::symlink(linkPath.c_str(), targetPath.c_str()) != 0)
+ THROW_LAST_FILE_ERROR(replaceCpy(replaceCpy(_("Cannot copy symbolic link %x to %y."), L"%x", L"\n" + fmtPath(sourcePath)), L"%y", L"\n" + fmtPath(targetPath)), L"symlink");
- //allow only consistent objects to be created -> don't place before ::symlink, targetLink may already exist!
- ZEN_ON_SCOPE_FAIL(try { removeSymlinkPlain(targetLink); /*throw FileError*/ }
+ //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&) {});
- //file times: essential for sync'ing a symlink: enforce this! (don't just try!)
+ //file times: essential for syncing a symlink: enforce this! (don't just try!)
struct ::stat sourceInfo = {};
- if (::lstat(sourceLink.c_str(), &sourceInfo) != 0)
- THROW_LAST_FILE_ERROR(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(sourceLink)), L"lstat");
+ if (::lstat(sourcePath.c_str(), &sourceInfo) != 0)
+ THROW_LAST_FILE_ERROR(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(sourcePath)), L"lstat");
- setWriteTimeNative(targetLink, sourceInfo.st_mtim, ProcSymlink::DIRECT); //throw FileError
+ setWriteTimeNative(targetPath, sourceInfo.st_mtim, ProcSymlink::DIRECT); //throw FileError
if (copyFilePermissions)
- copyItemPermissions(sourceLink, targetLink, ProcSymlink::DIRECT); //throw FileError
+ copyItemPermissions(sourcePath, targetPath, ProcSymlink::DIRECT); //throw FileError
}
diff --git a/zen/file_access.h b/zen/file_access.h
index e06c64ac..fc4b5833 100644
--- a/zen/file_access.h
+++ b/zen/file_access.h
@@ -52,17 +52,10 @@ enum class ProcSymlink
};
void setFileTime(const Zstring& filePath, time_t modTime, ProcSymlink procSl); //throw FileError
-//symlink handling: always follow
+//symlink handling: always follow:
uint64_t getFreeDiskSpace(const Zstring& path); //throw FileError, returns 0 if not available
-
-struct FileDetails
-{
- uint64_t fileSize = 0;
- time_t modTime = 0; //number of seconds since Jan. 1st 1970 UTC
- VolumeId volumeId = 0;
-};
-//symlink handling: always follow
-FileDetails getFileDetails(const Zstring& itemPath); //throw FileError
+VolumeId getVolumeId(const Zstring& itemPath); //throw FileError
+uint64_t getFileSize(const Zstring& filePath); //throw FileError
//get per-user directory designated for temporary files:
Zstring getTempFolderPath(); //throw FileError
@@ -72,7 +65,7 @@ void removeSymlinkPlain (const Zstring& linkPath); //throw FileError; E
void removeDirectoryPlain(const Zstring& dirPath ); //throw FileError; ERROR if not existing
void removeDirectoryPlainRecursion(const Zstring& dirPath); //throw FileError; ERROR if not existing
-void moveAndRenameItem(const Zstring& itemPathOld, const Zstring& itemPathNew, bool replaceExisting); //throw FileError, ErrorDifferentVolume, ErrorTargetExisting
+void moveAndRenameItem(const Zstring& pathFrom, const Zstring& pathTo, bool replaceExisting); //throw FileError, ErrorMoveUnsupported, ErrorTargetExisting
bool supportsPermissions(const Zstring& dirPath); //throw FileError, follows symlinks
//copy permissions for files, directories or symbolic links: requires admin rights
@@ -89,7 +82,7 @@ void createDirectoryIfMissingRecursion(const Zstring& dirPath); //throw FileErro
//reports note-worthy errors only
void tryCopyDirectoryAttributes(const Zstring& sourcePath, const Zstring& targetPath); //throw FileError
-void copySymlink(const Zstring& sourceLink, const Zstring& targetLink, bool copyFilePermissions); //throw FileError
+void copySymlink(const Zstring& sourcePath, const Zstring& targetPath, bool copyFilePermissions); //throw FileError
struct FileCopyResult
{
diff --git a/zen/file_error.h b/zen/file_error.h
index 101d6543..e47fb9f4 100644
--- a/zen/file_error.h
+++ b/zen/file_error.h
@@ -31,9 +31,8 @@ private:
#define DEFINE_NEW_FILE_ERROR(X) struct X : public zen::FileError { X(const std::wstring& msg) : FileError(msg) {} X(const std::wstring& msg, const std::wstring& descr) : FileError(msg, descr) {} };
DEFINE_NEW_FILE_ERROR(ErrorTargetExisting);
-//DEFINE_NEW_FILE_ERROR(ErrorTargetPathMissing);
DEFINE_NEW_FILE_ERROR(ErrorFileLocked);
-DEFINE_NEW_FILE_ERROR(ErrorDifferentVolume);
+DEFINE_NEW_FILE_ERROR(ErrorMoveUnsupported);
//CAVEAT: thread-local Win32 error code is easily overwritten => evaluate *before* making any (indirect) system calls:
diff --git a/zen/file_io.cpp b/zen/file_io.cpp
index 1c6ab6f2..e788bcfe 100644
--- a/zen/file_io.cpp
+++ b/zen/file_io.cpp
@@ -14,43 +14,12 @@
using namespace zen;
-namespace
-{
-//- "filePath" could be a named pipe which *blocks* forever for open()!
-//- open() with O_NONBLOCK avoids the block, but opens successfully
-//- create sample pipe: "sudo mkfifo named_pipe"
-void checkForUnsupportedType(const Zstring& filePath) //throw FileError
-{
- struct ::stat fileInfo = {};
- if (::stat(filePath.c_str(), &fileInfo) != 0) //follows symlinks
- return; //let the caller handle errors like "not existing"
-
- if (!S_ISREG(fileInfo.st_mode) &&
- !S_ISLNK(fileInfo.st_mode) &&
- !S_ISDIR(fileInfo.st_mode))
- {
- auto getTypeName = [](mode_t m) -> std::wstring
- {
- const wchar_t* name =
- S_ISCHR (m) ? L"character device":
- S_ISBLK (m) ? L"block device" :
- S_ISFIFO(m) ? L"FIFO, named pipe" :
- S_ISSOCK(m) ? L"socket" : nullptr;
- const std::wstring numFmt = printNumber<std::wstring>(L"0%06o", m & S_IFMT);
- return name ? numFmt + L", " + name : numFmt;
- };
- throw FileError(replaceCpy(_("Type of item %x is not supported:"), L"%x", fmtPath(filePath)) + L" " + getTypeName(fileInfo.st_mode));
- }
-}
-}
-
-
- const FileBase::FileHandle FileBase::invalidHandleValue = -1;
+ const FileBase::FileHandle FileBase::invalidHandleValue_ = -1;
FileBase::~FileBase()
{
- if (fileHandle_ != invalidHandleValue)
+ if (fileHandle_ != invalidHandleValue_)
try
{
close(); //throw FileError
@@ -61,9 +30,9 @@ FileBase::~FileBase()
void FileBase::close() //throw FileError
{
- if (fileHandle_ == invalidHandleValue)
+ if (fileHandle_ == invalidHandleValue_)
throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(getFilePath())), L"Contract error: close() called more than once.");
- ZEN_ON_SCOPE_EXIT(fileHandle_ = invalidHandleValue);
+ ZEN_ON_SCOPE_EXIT(fileHandle_ = invalidHandleValue_);
//no need to clean-up on failure here (just like there is no clean on FileOutput::write failure!) => FileOutput is not transactional!
@@ -77,7 +46,32 @@ namespace
{
FileBase::FileHandle openHandleForRead(const Zstring& filePath) //throw FileError, ErrorFileLocked
{
- checkForUnsupportedType(filePath); //throw FileError; opening a named pipe would block forever!
+ //- "filePath" could be a named pipe which *blocks* forever for open()!
+ //- open() with O_NONBLOCK avoids the block, but opens successfully
+ //- create sample pipe: "sudo mkfifo named_pipe"
+ struct ::stat fileInfo = {};
+ if (::stat(filePath.c_str(), &fileInfo) == 0) //follows symlinks
+ {
+ if (!S_ISREG(fileInfo.st_mode) &&
+ !S_ISLNK(fileInfo.st_mode) &&
+ !S_ISDIR(fileInfo.st_mode))
+ {
+ const std::wstring typeName = [m = fileInfo.st_mode]
+ {
+ std::wstring name =
+ S_ISCHR (m) ? L"character device" :
+ S_ISBLK (m) ? L"block device" :
+ S_ISFIFO(m) ? L"FIFO, named pipe" :
+ S_ISSOCK(m) ? L"socket" : L"";
+ if (!name.empty())
+ name += L", ";
+ return name + printNumber<std::wstring>(L"0%06o", m & S_IFMT);
+ }();
+ throw FileError(replaceCpy(_("Cannot open file %x."), L"%x", fmtPath(filePath)),
+ _("Unsupported item type.") + L" [" + typeName + L"]");
+ }
+ }
+ //else: let ::open() fail for errors like "not existing"
//don't use O_DIRECT: http://yarchive.net/comp/linux/o_direct.html
const FileBase::FileHandle fileHandle = ::open(filePath.c_str(), O_RDONLY | O_CLOEXEC);
diff --git a/zen/file_io.h b/zen/file_io.h
index bf23d22c..cf5ecc73 100644
--- a/zen/file_io.h
+++ b/zen/file_io.h
@@ -41,13 +41,13 @@ protected:
~FileBase();
void close(); //throw FileError -> optional, but good place to catch errors when closing stream!
- static const FileHandle invalidHandleValue;
+ static const FileHandle invalidHandleValue_;
private:
FileBase (const FileBase&) = delete;
FileBase& operator=(const FileBase&) = delete;
- FileHandle fileHandle_ = invalidHandleValue;
+ FileHandle fileHandle_ = invalidHandleValue_;
const Zstring filePath_;
};
@@ -108,7 +108,7 @@ template <class BinContainer> inline
BinContainer loadBinContainer(const Zstring& filePath, const IOCallback& notifyUnbufferedIO /*throw X*/) //throw FileError, X
{
FileInput streamIn(filePath, notifyUnbufferedIO); //throw FileError, ErrorFileLocked
- return bufferedLoad<BinContainer>(streamIn); //throw FileError, X;
+ return bufferedLoad<BinContainer>(streamIn); //throw FileError, X
}
diff --git a/zen/http.cpp b/zen/http.cpp
index 1f89bf20..f8538c93 100644
--- a/zen/http.cpp
+++ b/zen/http.cpp
@@ -203,7 +203,7 @@ size_t HttpInputStream::read(void* buffer, size_t bytesToRead) { return pimpl_->
size_t HttpInputStream::getBlockSize() const { return pimpl_->getBlockSize(); }
-std::string HttpInputStream::readAll() { return bufferedLoad<std::string>(*pimpl_); } //throw SysError, X;
+std::string HttpInputStream::readAll() { return bufferedLoad<std::string>(*pimpl_); } //throw SysError, X
namespace
diff --git a/zen/shutdown.cpp b/zen/shutdown.cpp
index f09c4d07..cd37d57c 100644
--- a/zen/shutdown.cpp
+++ b/zen/shutdown.cpp
@@ -44,6 +44,6 @@ void zen::terminateProcess(int exitCode)
//Shut down: systemctl poweroff //alternative requiring admin: sudo shutdown -h 1
//Sleep: systemctl suspend //alternative requiring admin: sudo pm-suspend
//Log off: gnome-session-quit --no-prompt
- // alternative requiring admin: sudo killall Xorg
- // alternative without admin: dbus-send --session --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.Logout uint32:1
+ // alternative requiring admin: sudo killall Xorg
+ // alternative without admin: dbus-send --session --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.Logout uint32:1
diff --git a/zen/zstring.h b/zen/zstring.h
index 6727253b..42487670 100644
--- a/zen/zstring.h
+++ b/zen/zstring.h
@@ -33,7 +33,7 @@ Zstring makeUpperCopy(const Zstring& str);
//macOS: decomposed
Zstring getUnicodeNormalForm(const Zstring& str);
// "In fact, Unicode declares that there is an equivalence relationship between decomposed and composed sequences,
-// and conformant software should not treat canonically equivalent sequences, whether composed or decomposed or something inbetween, as different."
+// and conformant software should not treat canonically equivalent sequences, whether composed or decomposed or something in between, as different."
// http://www.win.tue.nl/~aeb/linux/uc/nfc_vs_nfd.html
struct LessUnicodeNormal { bool operator()(const Zstring& lhs, const Zstring& rhs) const { return getUnicodeNormalForm(lhs) < getUnicodeNormalForm(rhs);} };
diff --git a/zenXml/zenxml/xml.h b/zenXml/zenxml/xml.h
index 27701248..15d635bd 100644
--- a/zenXml/zenxml/xml.h
+++ b/zenXml/zenxml/xml.h
@@ -90,7 +90,7 @@ void saveXml(const XmlDoc& doc, const Zstring& filePath) //throw FileError
try //only update XML file if there are changes
{
- if (getFileDetails(filePath).fileSize == stream.size()) //throw FileError
+ if (getFileSize(filePath) == stream.size()) //throw FileError
if (loadBinContainer<std::string>(filePath, nullptr /*notifyUnbufferedIO*/) == stream) //throw FileError
return;
}
bgstack15