diff options
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 Binary files differindex b3146ea1..12931409 100755 --- a/FreeFileSync/Build/Resources.zip +++ b/FreeFileSync/Build/Resources.zip 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, ¤tSocket); 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; @@ -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; } |