diff options
273 files changed, 29055 insertions, 16011 deletions
diff --git a/Application.cpp b/Application.cpp index 48bd1155..638cffbc 100644 --- a/Application.cpp +++ b/Application.cpp @@ -173,7 +173,7 @@ int Application::OnRun() wxFile safeOutput(zen::getConfigDir() + wxT("LastError.txt"), wxFile::write); safeOutput.Write(wxString::FromAscii(e.what())); - wxSafeShowMessage(_("An exception occurred!"), wxString::FromAscii(e.what())); + wxSafeShowMessage(_("An exception occurred!") + L" - FFS", wxString::FromAscii(e.what())); return -9; } catch (...) //catch the rest @@ -260,28 +260,26 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet }); //COMPARE DIRECTORIES - zen::CompareProcess comparison(globSettings.fileTimeTolerance, - globSettings.optDialogs, - statusHandler); + zen::CompareProcess cmpProc(globSettings.fileTimeTolerance, + globSettings.optDialogs, + statusHandler); zen::FolderComparison folderCmp; - comparison.startCompareProcess(cmpConfig, - batchCfg.mainCfg.compareVar, - folderCmp); + cmpProc.startCompareProcess(cmpConfig, folderCmp); //START SYNCHRONIZATION - zen::SyncProcess synchronization( + zen::SyncProcess syncProc( globSettings.optDialogs, globSettings.verifyFileCopy, globSettings.copyLockedFiles, globSettings.copyFilePermissions, - globSettings.transactionalFileCopy, + globSettings.transactionalFileCopy, statusHandler); const std::vector<zen::FolderPairSyncCfg> syncProcessCfg = zen::extractSyncCfg(batchCfg.mainCfg); assert(syncProcessCfg.size() == folderCmp.size()); - synchronization.startSynchronizationProcess(syncProcessCfg, folderCmp); + syncProc.startSynchronizationProcess(syncProcessCfg, folderCmp); //play (optional) sound notification after sync has completed if (!batchCfg.silent) diff --git a/BUILD/Changelog.txt b/BUILD/Changelog.txt index 96b91543..428f11ee 100644 --- a/BUILD/Changelog.txt +++ b/BUILD/Changelog.txt @@ -2,6 +2,38 @@ |FreeFileSync| -------------- +Changelog v4.0 +--------------- +Thumbnail list view +Option to specify comparison settings at folder pair level +Correctly update parent-child relationship when changing sync directions +Show history list for additional folder pairs +Switch between volume name and full path in directory history list +Perf: shrinked folder matching CPU time by over 70% +Show windows environment strings in directory history list +Show windows special folder IDs in directory history list +Fixed progress dialog going into background on heavy load +Support creating old 8.3 directories +Take over configuration name when creating new batch job +Remember batch-specific settings when loading a ffs_batch file from main dialog +Drag & drop ffs_batch files on main dialog to test and edit batch settings +Automatically resolve objects deleted externally after comparison +Date column context menu: manual time range selector +New categories for time span filter: today, this week, this month, this year +Respect both sides when sorting by relative path +Updated COM error message reporting resolving "Unknown error" +Smarter configuration merge algorithm +Correctly show existing folders on both sides when using include filter +Fixed network access using WebDrive +Update modification times during file copy to write current values to database +RealtimeSync: write name of changed file into environment variable "changed_file" +RealtimeSync: fixed network drop incorrectly being handled as a failure +Set default direction according to current configuration when deleting manually +Plenty of GUI improvements +Updated help file +Updated translation files + + Changelog v3.21 --------------- Fixed deleting to user-defined directory diff --git a/BUILD/FreeFileSync.chm b/BUILD/FreeFileSync.chm Binary files differindex 536b4cee..891d3310 100644 --- a/BUILD/FreeFileSync.chm +++ b/BUILD/FreeFileSync.chm diff --git a/BUILD/Help/FreeFileSync.hhp b/BUILD/Help/FreeFileSync.hhp index d6e98272..9e2bffc1 100644 --- a/BUILD/Help/FreeFileSync.hhp +++ b/BUILD/Help/FreeFileSync.hhp @@ -2,7 +2,7 @@ Compatibility=1.1 or later Compiled file=..\FreeFileSync.chm Contents file=Table of Contents.hhc -Default topic=html\Overview.html +Default topic=html\FreeFileSync.html Display compile progress=No Full-text search=Yes Language=0x409 Englisch (USA) @@ -12,23 +12,22 @@ Title=FreeFileSync - Help [FILES] html\Features.html html\Links.html -html\advanced\CompareFileSize.html -html\advanced\DragDrop.html -html\advanced\ExcludeSubfolder.html -html\advanced\ExternalApp.html -html\advanced\Ftp.html -html\advanced\ScheduleBatch.html -html\advanced\SendMail.html -html\advanced\SymbolicLinks.html -html\advanced\BackupStrategy.html -html\advanced\VariableDrive.html -html\Overview.html -html\advanced\DaylightSavingTime.html -html\advanced\Macros.html -html\advanced\RealtimeSync.html -html\advanced\ShadowCopy.html -html\advanced\RunAsService.html -html\advanced\Batch Scripting.html +html\CompareFileSize.html +html\ExcludeSubfolder.html +html\ExternalApp.html +html\Ftp.html +html\ScheduleBatch.html +html\SendMail.html +html\BackupStrategy.html +html\VariableDrive.html +html\FreeFileSync.html +html\DaylightSavingTime.html +html\Macros.html +html\RealtimeSync.html +html\ShadowCopy.html +html\RunAsService.html +html\Batch Scripting.html +html\ComparisonSettings.html [INFOTYPES] diff --git a/BUILD/Help/Table of Contents.hhc b/BUILD/Help/Table of Contents.hhc index 6e1b0357..042c6986 100644 --- a/BUILD/Help/Table of Contents.hhc +++ b/BUILD/Help/Table of Contents.hhc @@ -10,88 +10,91 @@ </OBJECT> <UL> <LI> <OBJECT type="text/sitemap"> - <param name="Name" value="Usage"> - <param name="Local" value="html\Overview.html"> - <param name="ImageNumber" value="17"> - </OBJECT> - <LI> <OBJECT type="text/sitemap"> - <param name="Name" value="Features"> - <param name="Local" value="html\Features.html"> - <param name="ImageNumber" value="11"> - </OBJECT> - <LI> <OBJECT type="text/sitemap"> - <param name="Name" value="Links"> - <param name="Local" value="html\Links.html"> - <param name="ImageNumber" value="19"> - </OBJECT> - <LI> <OBJECT type="text/sitemap"> - <param name="Name" value="Advanced"> + <param name="Name" value="FreeFileSync"> + <param name="Local" value="html\FreeFileSync.html"> + <param name="ImageNumber" value="2"> </OBJECT> <UL> <LI> <OBJECT type="text/sitemap"> + <param name="Name" value="# Overview"> + <param name="Local" value="html\FreeFileSync.html"> + </OBJECT> + <LI> <OBJECT type="text/sitemap"> <param name="Name" value="Backup Strategies"> - <param name="Local" value="html\advanced\BackupStrategy.html"> + <param name="Local" value="html\BackupStrategy.html"> </OBJECT> <LI> <OBJECT type="text/sitemap"> <param name="Name" value="Batch Scripting"> - <param name="Local" value="html\advanced\Batch Scripting.html"> + <param name="Local" value="html\Batch Scripting.html"> </OBJECT> <LI> <OBJECT type="text/sitemap"> <param name="Name" value="Compare by file size"> - <param name="Local" value="html\advanced\CompareFileSize.html"> + <param name="Local" value="html\CompareFileSize.html"> </OBJECT> <LI> <OBJECT type="text/sitemap"> - <param name="Name" value="Daylight saving time"> - <param name="Local" value="html\advanced\DaylightSavingTime.html"> + <param name="Name" value="Comparison Settings"> + <param name="Local" value="html\ComparisonSettings.html"> </OBJECT> <LI> <OBJECT type="text/sitemap"> - <param name="Name" value="Drag & drop support"> - <param name="Local" value="html\advanced\DragDrop.html"> + <param name="Name" value="Daylight saving time"> + <param name="Local" value="html\DaylightSavingTime.html"> </OBJECT> <LI> <OBJECT type="text/sitemap"> <param name="Name" value="Error notification"> - <param name="Local" value="html\advanced\SendMail.html"> + <param name="Local" value="html\SendMail.html"> </OBJECT> <LI> <OBJECT type="text/sitemap"> <param name="Name" value="Exclude files"> - <param name="Local" value="html\advanced\ExcludeSubfolder.html"> + <param name="Local" value="html\ExcludeSubfolder.html"> </OBJECT> <LI> <OBJECT type="text/sitemap"> <param name="Name" value="External applications"> - <param name="Local" value="html\advanced\ExternalApp.html"> + <param name="Local" value="html\ExternalApp.html"> </OBJECT> <LI> <OBJECT type="text/sitemap"> - <param name="Name" value="Macros"> - <param name="Local" value="html\advanced\Macros.html"> + <param name="Name" value="Features"> + <param name="Local" value="html\Features.html"> </OBJECT> <LI> <OBJECT type="text/sitemap"> - <param name="Name" value="RealtimeSync"> - <param name="Local" value="html\advanced\RealtimeSync.html"> + <param name="Name" value="Macros"> + <param name="Local" value="html\Macros.html"> </OBJECT> <LI> <OBJECT type="text/sitemap"> - <param name="Name" value="Run as Service"> - <param name="Local" value="html\advanced\RunAsService.html"> + <param name="Name" value="Schedule Batch Job"> + <param name="Local" value="html\ScheduleBatch.html"> </OBJECT> <LI> <OBJECT type="text/sitemap"> - <param name="Name" value="Schedule a Batch Job"> - <param name="Local" value="html\advanced\ScheduleBatch.html"> + <param name="Name" value="Synchronize with FTP"> + <param name="Local" value="html\Ftp.html"> </OBJECT> <LI> <OBJECT type="text/sitemap"> - <param name="Name" value="Symbolic link handling"> - <param name="Local" value="html\advanced\SymbolicLinks.html"> + <param name="Name" value="Variable drive letters"> + <param name="Local" value="html\VariableDrive.html"> </OBJECT> <LI> <OBJECT type="text/sitemap"> - <param name="Name" value="Synchronize with FTP"> - <param name="Local" value="html\advanced\Ftp.html"> + <param name="Name" value="Volume Shadow Copy"> + <param name="Local" value="html\ShadowCopy.html"> </OBJECT> + </UL> + <LI> <OBJECT type="text/sitemap"> + <param name="Name" value="RealtimeSync"> + <param name="Local" value="html\RealtimeSync.html"> + <param name="ImageNumber" value="2"> + </OBJECT> + <UL> <LI> <OBJECT type="text/sitemap"> - <param name="Name" value="Variable drive letters"> - <param name="Local" value="html\advanced\VariableDrive.html"> + <param name="Name" value="# Overview"> + <param name="Local" value="html\RealtimeSync.html"> </OBJECT> <LI> <OBJECT type="text/sitemap"> - <param name="Name" value="Volume Shadow Copy"> - <param name="Local" value="html\advanced\ShadowCopy.html"> + <param name="Name" value="Run as Service"> + <param name="Local" value="html\RunAsService.html"> </OBJECT> </UL> + <LI> <OBJECT type="text/sitemap"> + <param name="Name" value="Links"> + <param name="Local" value="html\Links.html"> + <param name="ImageNumber" value="19"> + </OBJECT> </UL> </BODY></HTML> diff --git a/BUILD/Help/html/advanced/BackupStrategy.html b/BUILD/Help/html/BackupStrategy.html index 25da75c5..9cec9364 100644 --- a/BUILD/Help/html/advanced/BackupStrategy.html +++ b/BUILD/Help/html/BackupStrategy.html @@ -5,7 +5,7 @@ <TITLE></TITLE> <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20110413;23155400"> + <META NAME="CHANGED" CONTENT="20110901;20151400"> <META NAME="Info 1" CONTENT=""> <META NAME="Info 2" CONTENT=""> <META NAME="Info 3" CONTENT=""> @@ -52,17 +52,11 @@ complete backups into different target directories.</FONT></P> directory "C:\Source" requires a daily backup into a time-stamped target directory like "C:\Target_2009-10-08". Base directories are set up accordingly:</FONT></P> -<UL> - <P><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> - <UL> - <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Source - folder: "<FONT FACE="Courier New, monospace">C:\Source</FONT>"<BR>Target - folder: "<FONT FACE="Courier New, monospace">C:\Target_%date%</FONT>"</FONT></P> - </UL> - </SPAN><BR CLEAR=LEFT> - </P> -</UL> -<P STYLE="margin-bottom: 0cm"><BR> +<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen5" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Tahoma, sans-serif">Source folder: "<FONT FACE="Courier New, monospace">C:\Source</FONT>"<BR>Target + folder: "<FONT FACE="Courier New, monospace">C:\Target_%date%</FONT>"</FONT></P> +</SPAN><BR CLEAR=LEFT><BR> </P> <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Latter will be interactively replaced with the current date during diff --git a/BUILD/Help/html/Batch Scripting.html b/BUILD/Help/html/Batch Scripting.html new file mode 100644 index 00000000..4293813a --- /dev/null +++ b/BUILD/Help/html/Batch Scripting.html @@ -0,0 +1,105 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> + <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"> + <TITLE></TITLE> + <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> + <META NAME="CREATED" CONTENT="20091206;16574000"> + <META NAME="CHANGED" CONTENT="20110901;20020700"> + <META NAME="Info 1" CONTENT=""> + <META NAME="Info 2" CONTENT=""> + <META NAME="Info 3" CONTENT=""> + <META NAME="Info 4" CONTENT=""> + <STYLE TYPE="text/css"> + <!-- + @page { margin: 2cm } + P { margin-bottom: 0.21cm } + H3 { margin-bottom: 0.21cm } + H3.western { font-family: "Arial", sans-serif } + H3.cjk { font-family: "MS Mincho" } + H3.ctl { font-family: "Mangal" } + A:link { so-language: zxx } + --> + </STYLE> +</HEAD> +<BODY LANG="en-US" DIR="LTR"> +<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Batch Scripting +<SPAN STYLE="font-weight: normal">(Windows)</SPAN></FONT></H3> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">In +order to facilitate using FreeFileSync and RealtimeSync in advanced +synchronization scenarios, creating batch files is a good way to +provide additional functionality. The following section will give +some general hints and examples for custom *.cmd and *.bat files.</FONT></P> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<UL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">When + starting a batch file from RealtimeSync make synchronous calls to + FreeFileSync only. This will prevent RealtimeSync continue detecting + changes while synchronization is still in progress.<BR> </FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">During + execution of a Windows Batch file (*.bat/*.cmd) a black console + window is shown. You can hide it using the Visual Basic script + "Invisible.vbs" located in FreeFileSync's installation + directory.</FONT></P> +</UL> +<OL> + <P STYLE="margin-bottom: 0cm"><B><FONT FACE="Tahoma, sans-serif">Usage:</FONT></B></P> +</OL> +<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Courier New, monospace">wscript C:\Program + files\FreeFileSync\Invisible.vbs C:\MyBatchFile.cmd</FONT></P> +</SPAN><BR CLEAR=LEFT><BR> +</P> +<UL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">FreeFileSync + returns with an Errorlevel below zero if unresolved problems remain:</FONT></P> +</UL> +<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">"C:\Program + Files\FreeFileSync\FreeFileSync.exe" + "H:\Silent_Config.ffs_batch"<BR>if not errorlevel 0 + (<BR> </FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::if + something went wrong, add special treatment here<BR> </B></I></FONT></FONT><FONT COLOR="#000000"><FONT FACE="Courier New, monospace"><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">echo + Errors occurred during synchronization...</SPAN></SPAN></FONT></FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B><BR> </B></I></FONT></FONT><FONT FACE="Courier New, monospace">pause<BR>)</FONT></FONT></P> +</SPAN><BR CLEAR=LEFT><BR> +</P> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B> +Shutdown PC after synchronization</FONT></P> +<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen4" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Tahoma, sans-serif"><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::start + FreeFileSync Batch + Job<BR></B></I></FONT></FONT><FONT FACE="Courier New, monospace">"C:\Users\ZenJu\Desktop\SyncJob.ffs_batch"<BR> </FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::schedule + shutdown after 10 seconds<BR></B></I></FONT></FONT><FONT FACE="Courier New, monospace">shutdown + /s /t 10</FONT></FONT></P> +</SPAN><BR CLEAR=LEFT><BR> +</P> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B> +A simple locking facility – (<SPAN STYLE="font-style: normal"><B>Note:</B></SPAN> +<I>FreeFileSync already has a more powerful directory locking +mechanism implemented that allows multiple writers in parallel</I>)</FONT></P> +<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen3" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">:tryAgain<BR>if + not exist \\share\folder\lock (<BR> </FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::create + the lock<BR> </B></I></FONT></FONT><FONT FACE="Courier New, monospace">echo + This is a lock file > \\share\folder\lock<BR> </FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::execute + the synchronization batch job synchronously<BR> </B></I></FONT></FONT><FONT FACE="Courier New, monospace">"C:\Program + Files\FreeFileSync\FreeFileSync.exe" + "C:\MySyncJob.ffs_batch"<BR> del + \\share\folder\lock<BR>) else (<BR> </FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::wait + 5 seconds then try starting sync again:<BR> </B></I></FONT></FONT><FONT FACE="Courier New, monospace">choice + /C:AB /T:5 /D:A > NUL<BR> goto tryAgain<BR>)</FONT></FONT></P> +</SPAN><BR CLEAR=LEFT><BR> +</P> +</BODY> +</HTML>
\ No newline at end of file diff --git a/BUILD/Help/html/CmpSettings.png b/BUILD/Help/html/CmpSettings.png Binary files differnew file mode 100644 index 00000000..eb0c83ab --- /dev/null +++ b/BUILD/Help/html/CmpSettings.png diff --git a/BUILD/Help/html/CompareButton.png b/BUILD/Help/html/CompareButton.png Binary files differnew file mode 100644 index 00000000..bab3780b --- /dev/null +++ b/BUILD/Help/html/CompareButton.png diff --git a/BUILD/Help/html/advanced/CompareFileSize.html b/BUILD/Help/html/CompareFileSize.html index af184fd9..af184fd9 100644 --- a/BUILD/Help/html/advanced/CompareFileSize.html +++ b/BUILD/Help/html/CompareFileSize.html diff --git a/BUILD/Help/html/ComparisonSettings.html b/BUILD/Help/html/ComparisonSettings.html new file mode 100644 index 00000000..069a7fd0 --- /dev/null +++ b/BUILD/Help/html/ComparisonSettings.html @@ -0,0 +1,171 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> + <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"> + <TITLE></TITLE> + <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> + <META NAME="CREATED" CONTENT="20091206;16574000"> + <META NAME="CHANGED" CONTENT="20110910;15564800"> + <META NAME="Info 1" CONTENT=""> + <META NAME="Info 2" CONTENT=""> + <META NAME="Info 3" CONTENT=""> + <META NAME="Info 4" CONTENT=""> + <STYLE TYPE="text/css"> + <!-- + @page { margin: 2cm } + P { margin-bottom: 0.21cm } + H3 { margin-bottom: 0.21cm } + H3.western { font-family: "Arial", sans-serif } + H3.cjk { font-family: "MS Mincho" } + H3.ctl { font-family: "Mangal" } + A:link { so-language: zxx } + --> + </STYLE> +</HEAD> +<BODY LANG="en-US" DIR="LTR"> +<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Comparison +Settings</FONT></H3> +<P STYLE="margin-bottom: 0cm"><IMG SRC="CmpSettings.png" NAME="Grafik1" ALIGN=BOTTOM BORDER=0></P> +<H3 CLASS="western" STYLE="page-break-after: avoid"><FONT FACE="Tahoma, sans-serif">I. +Compare by "File time and size"</FONT></H3> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">This +variant evaluates two equally named files as being equal when they +have the same modification time <B>and</B> file size. When the +comparison is started, the following decision tree is processed:</FONT></P> +<OL TYPE=i> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>file + exists on one side only</B></FONT></P> + <OL TYPE=i> + <UL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">left + only</FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">right + only</FONT></P> + </UL> + </OL> + <LI><P STYLE="margin-bottom: 0cm; font-style: normal"><FONT FACE="Tahoma, sans-serif"><B>file + exists on both sides</B></FONT></P> + <OL TYPE=i> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>different + date</B></FONT></P> + <UL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">left + newer</FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">right + newer</FONT></P> + </UL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>same + date</B></FONT></P> + <UL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">equal</FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">conflict + (same date, different size)</FONT></P> + </UL> + </OL> +</OL> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">This +results into the following categories:</FONT></P> +<UL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">left + only</FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">right + only</FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">left + newer</FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">right + newer</FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">equal</FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">conflict + (same date, different size)</FONT></P> +</UL> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<H3 CLASS="western" STYLE="page-break-after: avoid"><FONT FACE="Tahoma, sans-serif">II. +Compare by "File content"</FONT></H3> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Two +files which have the same name are marked as equal if and only if +they have the same content. This option is more useful for +consistency checks rather than backup operations for reasons of +speed. The file modification time is not taken into account at all.</FONT></P> +<OL TYPE=i> + <LI VALUE=1><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>file + exists on one side only</B></FONT></P> + <OL TYPE=a> + <UL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">left + only</FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">right + only</FONT></P> + </UL> + </OL> + <LI><P STYLE="margin-bottom: 0cm; font-style: normal"><FONT FACE="Tahoma, sans-serif"><B>file + exists on both sides</B></FONT></P> + <OL TYPE=a> + <UL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">equal</FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">different + content</FONT></P> + </UL> + </OL> +</OL> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">As a +result the files are separated into the following categories:</FONT></P> +<UL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">left + only</FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">right + only</FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">equal</FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">different + content</FONT></P> +</UL> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Symbolic link +handling</FONT></H3> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">FreeFileSync +offers three options to configure processing of symbolic links (also +called symlinks or soft links):</FONT></P> +<OL> + <LI><P STYLE="margin-bottom: 0cm"><SPAN STYLE="text-decoration: none"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-style: normal"><B>Ignore:</B></SPAN></FONT></SPAN> + <FONT FACE="Tahoma, sans-serif">excludes symbolic links while + scanning input directories.<BR></FONT> </P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Direct:</B></FONT> + <FONT FACE="Tahoma, sans-serif">configures synchronization of the + symbolic link object itself and not its target. symbolic links will + be visible on main grid as a separate entity with corresponding meta + data. Links pointing to directories are not traversed and the link + object is copied directly during synchronization. <BR></FONT> </P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-style: normal"><B>Follow:</B></SPAN> + dereferences symbolic links, i.e. they are treated like their target + objects. Links pointing to directories are traversed like ordinary + folders and the target of each link is copied during + synchronization.</FONT></P> +</OL> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Tahoma, sans-serif"><B>Note:</B></FONT></P> + <UL> + <LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">In + Windows the options described above always apply to </FONT><FONT FACE="Tahoma, sans-serif"><I>"Reparse + Points"</I></FONT><FONT FACE="Tahoma, sans-serif">. Reparse + Points are a more general concept including for example symbolic + links, junctions and mount points. The term </FONT><FONT FACE="Tahoma, sans-serif"><I>"symbolic + link" </I></FONT><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-style: normal">has + been retained nevertheless for harmonization with Linux.</SPAN></FONT></P> + <LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm; font-style: normal"><FONT FACE="Tahoma, sans-serif">Copying + symbolic links requires the application to be started with + administrator rights.</FONT></P> + </UL> +</SPAN><BR CLEAR=LEFT><BR> +</P> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +</BODY> +</HTML>
\ No newline at end of file diff --git a/BUILD/Help/html/advanced/DaylightSavingTime.html b/BUILD/Help/html/DaylightSavingTime.html index a15ea521..a15ea521 100644 --- a/BUILD/Help/html/advanced/DaylightSavingTime.html +++ b/BUILD/Help/html/DaylightSavingTime.html diff --git a/BUILD/Help/html/ErrorHandling.png b/BUILD/Help/html/ErrorHandling.png Binary files differnew file mode 100644 index 00000000..628fac9c --- /dev/null +++ b/BUILD/Help/html/ErrorHandling.png diff --git a/BUILD/Help/html/advanced/ExcludeSubfolder.html b/BUILD/Help/html/ExcludeSubfolder.html index 63255f47..49215730 100644 --- a/BUILD/Help/html/advanced/ExcludeSubfolder.html +++ b/BUILD/Help/html/ExcludeSubfolder.html @@ -5,7 +5,7 @@ <TITLE></TITLE> <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20110319;19021800"> + <META NAME="CHANGED" CONTENT="20110912;13300400"> <META NAME="Info 1" CONTENT=""> <META NAME="Info 2" CONTENT=""> <META NAME="Info 3" CONTENT=""> @@ -35,8 +35,8 @@ sync-directory and may additionally include wild cards like '*' or <P STYLE="margin-bottom: 0cm"><BR> </P> <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B> -<SPAN STYLE="font-weight: normal">(Exclude all sub directories</SPAN><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">)</SPAN></FONT></FONT></P> -<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> +<SPAN STYLE="font-weight: normal">Exclude all sub directories</SPAN></FONT></P> +<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen5" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> <FONT FACE="Tahoma, sans-serif">Include: <FONT FACE="Courier New, monospace">*</FONT><BR>Exclude: <FONT FACE="Courier New, monospace">*\</FONT></FONT></P> @@ -49,34 +49,34 @@ character, which is interpreted as the end of a directory name.</FONT></P> <P STYLE="margin-bottom: 0cm"><BR> </P> <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B> -<SPAN STYLE="font-weight: normal">(Mirror-Sync from </SPAN><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">C:\Source</SPAN></FONT> -<SPAN STYLE="font-weight: normal">to </SPAN><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">D:\Target)</SPAN></FONT></FONT></P> -<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> - <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude +<SPAN STYLE="font-weight: normal">Mirror-sync from </SPAN><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">C:\Source</SPAN></FONT> +<SPAN STYLE="font-weight: normal">to </SPAN><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">D:\Target</SPAN></FONT></FONT></P> +<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <P STYLE="margin-left: 0.82cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude single file </SPAN></FONT><FONT FACE="Courier New, monospace">C:\Source\file.txt:<BR></FONT> <FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Filter: </SPAN></FONT><FONT FACE="Courier New, monospace">\file.txt</FONT></P> - <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude + <P STYLE="margin-left: 0.82cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude single folder </SPAN></FONT><FONT FACE="Courier New, monospace">C:\Source\sample\subfolder:<BR></FONT> <FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Filter: - </SPAN></FONT><FONT FACE="Courier New, monospace">\sample\subfolder</FONT></P> - <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude + </SPAN></FONT><FONT FACE="Courier New, monospace">\sample\subfolder\</FONT></P> + <P STYLE="margin-left: 0.82cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude all </SPAN></FONT><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">*.tmp</SPAN></FONT> <FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">files - within </SPAN></FONT><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">subfolder</SPAN></FONT><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">:<BR></SPAN></FONT> <FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Filter: + located in </SPAN></FONT><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">subfolder</SPAN></FONT><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal"> + only:<BR></SPAN></FONT> <FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Filter: </SPAN></FONT><FONT FACE="Courier New, monospace">\sample\subfolder\*.tmp</FONT></P> - <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude - all files and folders named </SPAN></FONT><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">CVS</SPAN></FONT> - <FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">within - arbitrary sub directories:<BR></SPAN></FONT> <FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Filter: - </SPAN></FONT><FONT FACE="Courier New, monospace">*\CVS</FONT></P> - <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude + <P STYLE="margin-left: 0.82cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude + files (and folders) named </SPAN></FONT><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">thumbs.db</SPAN></FONT><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal"> + in all sub directories:<BR></SPAN></FONT> <FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Filter: + </SPAN></FONT><FONT FACE="Courier New, monospace">*\thumbs.db</FONT></P> + <P STYLE="margin-left: 0.82cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude all files and folders that have </SPAN></FONT><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">test</SPAN></FONT> <FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">as part of their name:<BR></SPAN></FONT> <FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Filter: </SPAN></FONT><FONT FACE="Courier New, monospace">*test*</FONT></P> - <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude - multiple entries; separate by semicolon or newlines:<BR></SPAN></FONT> <FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Filter: - </SPAN></FONT><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">*.tmp; - *.doc; *.bak</SPAN></FONT></P> + <P ALIGN=LEFT STYLE="margin-left: 0.82cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude + multiple entries; separate by semicolon or newlines:<BR></SPAN> <SPAN STYLE="font-weight: normal">Filter: + </SPAN><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">*.tmp; + *.doc; *.bak</SPAN></FONT></FONT></P> </SPAN><BR CLEAR=LEFT><BR> </P> <P STYLE="margin-bottom: 0cm"><BR> diff --git a/BUILD/Help/html/advanced/ExternalApp.html b/BUILD/Help/html/ExternalApp.html index 862d6071..8a7c6bb6 100644 --- a/BUILD/Help/html/advanced/ExternalApp.html +++ b/BUILD/Help/html/ExternalApp.html @@ -5,7 +5,7 @@ <TITLE></TITLE> <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20110519;13094300"> + <META NAME="CHANGED" CONTENT="20110903;15121200"> <META NAME="Info 1" CONTENT=""> <META NAME="Info 2" CONTENT=""> <META NAME="Info 3" CONTENT=""> @@ -23,8 +23,8 @@ </STYLE> </HEAD> <BODY LANG="en-US" DIR="LTR"> -<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Start an external -application via double-click</FONT></H3> +<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">External +applications</FONT></H3> <P STYLE="margin-bottom: 0cm"><BR> </P> <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">By @@ -37,39 +37,34 @@ the user is free to integrate other external applications into FreeFileSync: navigate to "</FONT><FONT FACE="Tahoma, sans-serif"><I>Menu -> Advanced -> Global settings: External Applications</I></FONT><FONT FACE="Tahoma, sans-serif">" and add or replace a command string. The first entry is used when -double-clicking a row while all subsequent entries are only available -in right-click context menu on main dialog. The following macros are +double-clicking a row while all other entries are only available via +right-click context menu on main dialog. The following macros are available:</FONT></P> -<UL> - <P><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> - <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Courier New, monospace">%name - full - file or directory name<BR>%dir - directory part - only<BR>%nameCo - Other side's counterpart to %name<BR>%dirCo - - Other side's counterpart to %dir</FONT></P> - </SPAN><BR CLEAR=LEFT> - </P> -</UL> +<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen3" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Courier New, monospace">%name - full + file or directory name<BR>%dir - directory part + only<BR>%nameCo - Other side's counterpart to %name<BR>%dirCo - + Other side's counterpart to %dir</FONT></P> +</SPAN><BR CLEAR=LEFT><BR> +</P> <P STYLE="margin-bottom: 0cm"><BR> </P> <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Examples:</B></FONT></P> <UL> - <UL> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Start - visual difference tool:<BR><FONT FACE="Courier New, monospace">"C:\Program - Files\WinMerge\WinMergeU.exe" "%name" "%nameCo"</FONT></FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Show - file in Windows Explorer:<BR><FONT FACE="Courier New, monospace">explorer - /select, "%name"</FONT></FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Open - file in associated application:</FONT><BR><FONT FACE="Courier New, monospace">cmd - /c start "" "%name" </FONT><FONT FACE="Tahoma, sans-serif">or - simply</FONT><FONT FACE="Courier New, monospace"> "%name" - </FONT><FONT FACE="Tahoma, sans-serif">(since v3.17)</FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Open - console dialog:<BR><FONT FACE="Courier New, monospace">cmd /k cd /D - "%dir"</FONT></FONT></P> - </UL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Start + visual difference tool:<BR><FONT FACE="Courier New, monospace">"C:\Program + Files\WinMerge\WinMergeU.exe" "%name" "%nameCo"<BR> </FONT></FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Show + file in Windows Explorer:<BR><FONT FACE="Courier New, monospace">explorer + /select, "%name"<BR> </FONT></FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Open + file in associated application:</FONT><BR><FONT FACE="Courier New, monospace">cmd + /c start "" "%name" </FONT><FONT FACE="Tahoma, sans-serif">or + simply</FONT> <FONT FACE="Courier New, monospace">"%name"</FONT><FONT FACE="Tahoma, sans-serif"><BR> </FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Open + console dialog:<BR><FONT FACE="Courier New, monospace">cmd /k cd /D + "%dir"<BR> </FONT></FONT></P> </UL> <P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff"> <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> diff --git a/BUILD/Help/html/Features.html b/BUILD/Help/html/Features.html index 6f33780a..784598ba 100644 --- a/BUILD/Help/html/Features.html +++ b/BUILD/Help/html/Features.html @@ -5,7 +5,7 @@ <TITLE></TITLE> <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20110421;18243600"> + <META NAME="CHANGED" CONTENT="20110915;12485300"> <STYLE TYPE="text/css"> <!-- @page { margin: 2cm } @@ -112,7 +112,7 @@ <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Create regular backups with macros %time%, %date% within directory names</FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Copy - file and folder create/access/modification times when synchronizing.</FONT></P> + file create/modification times when synchronizing.</FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Advanced locking strategy to allow multiple synchronization processes (e.g. multiple writers, same network share).</FONT></P> diff --git a/BUILD/Help/html/Overview.html b/BUILD/Help/html/FreeFileSync.html index 7903e8fd..0b81ac64 100644 --- a/BUILD/Help/html/Overview.html +++ b/BUILD/Help/html/FreeFileSync.html @@ -3,9 +3,9 @@ <HEAD> <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"> <TITLE></TITLE> - <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.0 (Win32)"> + <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20100323;23421400"> + <META NAME="CHANGED" CONTENT="20110903;14244700"> <META NAME="Info 1" CONTENT=""> <META NAME="Info 2" CONTENT=""> <META NAME="Info 3" CONTENT=""> @@ -18,6 +18,7 @@ H3 { margin-bottom: 0.21cm } H3.western { font-family: "Arial", sans-serif } H3.cjk { font-family: "MS Mincho" } + H3.ctl { font-family: "Mangal" } A:link { so-language: zxx } --> </STYLE> @@ -29,17 +30,17 @@ Folder Comparison and Synchronization -</SPAN></I></FONT></H3> <H3 CLASS="western" ALIGN=LEFT>Usage:</H3> <OL> <LI VALUE=1><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Choose - left and right directories.<BR></FONT><IMG SRC="overview_html_m7391eb10.gif" NAME="Grafik4" ALIGN=TEXTTOP WIDTH=449 HEIGHT=49 BORDER=0></P> + left and right directories.<BR></FONT><IMG SRC="SourceTarget.png" NAME="Grafik4" ALIGN=TEXTTOP WIDTH=427 HEIGHT=52 BORDER=0></P> <P STYLE="margin-bottom: 0cm"> </P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">"</FONT><FONT FACE="Tahoma, sans-serif"><I>Compare</I></FONT><FONT FACE="Tahoma, sans-serif">" - them.<BR></FONT><IMG SRC="Overview_html_165273dc.gif" NAME="Grafik1" ALIGN=BOTTOM WIDTH=178 HEIGHT=40 BORDER=0></P> + them.<BR></FONT><IMG SRC="CompareButton.png" NAME="Grafik1" ALIGN=BOTTOM WIDTH=178 HEIGHT=39 BORDER=0></P> <P STYLE="margin-bottom: 0cm"> </P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Select - synchronization settings.<BR></FONT><IMG SRC="overview_html_mbb6ab4a.gif" NAME="Grafik3" ALIGN=BOTTOM WIDTH=46 HEIGHT=40 BORDER=0></P> + synchronization settings.<BR></FONT><IMG SRC="SyncConfigButton.png" NAME="Grafik3" ALIGN=BOTTOM WIDTH=46 HEIGHT=40 BORDER=0></P> <P STYLE="margin-bottom: 0cm"> </P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Press "</FONT><FONT FACE="Tahoma, sans-serif"><I>Synchronize...</I></FONT><FONT FACE="Tahoma, sans-serif">" - to begin synchronization.<BR></FONT><IMG SRC="Overview_html_m633b851c.gif" NAME="Grafik2" ALIGN=BOTTOM WIDTH=198 HEIGHT=40 BORDER=0></P> + to begin synchronization.<BR></FONT><IMG SRC="SynchronizeButton.png" NAME="Grafik2" ALIGN=BOTTOM WIDTH=183 HEIGHT=40 BORDER=0></P> </OL> <P STYLE="margin-bottom: 0cm; border-top: none; border-bottom: 1px solid #000000; border-left: none; border-right: none; padding-top: 0cm; padding-bottom: 0.07cm; padding-left: 0cm; padding-right: 0cm"> <BR> @@ -49,7 +50,7 @@ Folder Comparison and Synchronization -</SPAN></I></FONT></H3> <H3 CLASS="western" STYLE="page-break-before: always"><FONT FACE="Tahoma, sans-serif">Main Dialog:</FONT></H3> <OL> - <P STYLE="margin-bottom: 0cm"><IMG SRC="main.png" NAME="Grafik5" ALIGN=BOTTOM WIDTH=736 HEIGHT=467 BORDER=0></P> + <P STYLE="margin-bottom: 0cm"><IMG SRC="MainDialog.png" NAME="Grafik5" ALIGN=BOTTOM WIDTH=743 HEIGHT=438 BORDER=0></P> </OL> <P STYLE="margin-bottom: 0cm"><BR> </P> @@ -62,16 +63,18 @@ Dialog:</FONT></H3> sync configuration</FONT></FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Start synchronization</FONT></FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Select - left and right directories</FONT></FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Swap - sides</FONT></FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Add additional folder pairs</FONT></FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Exclude - files</FONT></FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Swap + sides</FONT></FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Select + left and right directories</FONT></FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Save/load configuration</FONT></FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Exclude + files</FONT></FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Specify + category for display</FONT></FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Synchronization statistics/preview</FONT></FONT></P> </OL> diff --git a/BUILD/Help/html/advanced/Ftp.html b/BUILD/Help/html/Ftp.html index 028ca05d..c11dcd24 100644 --- a/BUILD/Help/html/advanced/Ftp.html +++ b/BUILD/Help/html/Ftp.html @@ -5,7 +5,7 @@ <TITLE></TITLE> <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20100902;19174600"> + <META NAME="CHANGED" CONTENT="20110901;20315700"> <META NAME="Info 1" CONTENT=""> <META NAME="Info 2" CONTENT=""> <META NAME="Info 3" CONTENT=""> @@ -62,21 +62,17 @@ SFTP <SPAN STYLE="font-weight: normal">(Linux)</SPAN></FONT></H3> <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">An SFTP share can be easily mapped onto a local folder for use with FreeFileSync:</FONT></P> -<UL> - <P><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> - <UL> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Install:</FONT><FONT FACE="Courier New, monospace"><BR>sudo - apt-get install sshfs</FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Mount - SFTP share:</FONT><FONT FACE="Courier New, monospace"><BR>sshfs - ssh-account@ssh-server:[path] mountpoint</FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Unmount:</FONT><FONT FACE="Courier New, monospace"><BR>fusermount - -u mountpoint</FONT></P> - </UL> - </SPAN><BR CLEAR=LEFT> - </P> -</UL> -<P><BR><BR> +<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen5" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <UL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Install:</FONT><FONT FACE="Courier New, monospace"><BR>sudo + apt-get install sshfs<BR> </FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Mount + SFTP share:</FONT><FONT FACE="Courier New, monospace"><BR>sshfs + ssh-account@ssh-server:<path> mountpoint<BR> </FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Unmount:</FONT><FONT FACE="Courier New, monospace"><BR>fusermount + -u mountpoint</FONT></P> + </UL> +</SPAN><BR CLEAR=LEFT><BR> </P> </BODY> </HTML>
\ No newline at end of file diff --git a/BUILD/Help/html/Links.html b/BUILD/Help/html/Links.html index f35a3641..71a55ebb 100644 --- a/BUILD/Help/html/Links.html +++ b/BUILD/Help/html/Links.html @@ -5,7 +5,7 @@ <TITLE></TITLE> <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20100402;19064500"> + <META NAME="CHANGED" CONTENT="20110819;12441400"> <STYLE TYPE="text/css"> <!-- @page { margin: 2cm } @@ -13,14 +13,14 @@ H3 { margin-bottom: 0.21cm } H3.western { font-family: "Arial", sans-serif } H3.cjk { font-family: "MS Mincho" } + H3.ctl { font-family: "Mangal" } A:link { so-language: zxx } --> </STYLE> </HEAD> <BODY LANG="de-DE" DIR="LTR"> <H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Links</FONT></H3> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Homepage:</FONT></P> -<P STYLE="margin-bottom: 0cm"><A HREF="http://freefilesync.sourceforge.net/"><FONT COLOR="#000080"><FONT FACE="Tahoma, sans-serif"><SPAN LANG="zxx"><U>http://freefilesync.sourceforge.net</U></SPAN></FONT></FONT></A></P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Homepage:<BR></FONT><A HREF="http://freefilesync.sourceforge.net/"><FONT COLOR="#000080"><FONT FACE="Tahoma, sans-serif"><SPAN LANG="zxx"><U>http://freefilesync.sourceforge.net</U></SPAN></FONT></FONT></A></P> <P STYLE="margin-bottom: 0cm"><BR> </P> <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">FreeFileSync diff --git a/BUILD/Help/html/Macros.html b/BUILD/Help/html/Macros.html new file mode 100644 index 00000000..d3c48d1d --- /dev/null +++ b/BUILD/Help/html/Macros.html @@ -0,0 +1,150 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> + <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"> + <TITLE></TITLE> + <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> + <META NAME="CREATED" CONTENT="20091206;16574000"> + <META NAME="CHANGED" CONTENT="20110909;23060200"> + <META NAME="Info 1" CONTENT=""> + <META NAME="Info 2" CONTENT=""> + <META NAME="Info 3" CONTENT=""> + <META NAME="Info 4" CONTENT=""> + <STYLE TYPE="text/css"> + <!-- + @page { margin: 2cm } + P { margin-bottom: 0.21cm } + H3 { margin-bottom: 0.21cm } + H3.western { font-family: "Arial", sans-serif } + H3.cjk { font-family: "MS Mincho" } + H3.ctl { font-family: "Mangal" } + A:link { so-language: zxx } + --> + </STYLE> +</HEAD> +<BODY LANG="de-DE" DIR="LTR"> +<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Macros</FONT></H3> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">All +directory names may contain macros that are expanded during +synchronization. Begin and end of each macro is marked by a '%' +character. Besides special macros handling time and date, the +<SPAN STYLE="text-decoration: none"><B>operating system's environment +variables</B></SPAN> can also be used.</FONT></P> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Internal +macros:</B></FONT></P> +<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">%time% - + </FONT>current time, format [hhmmss], e. g. "<FONT FACE="Courier New, monospace">201340</FONT>"<BR><FONT FACE="Courier New, monospace">%date% - + </FONT>current date, e. g. "<FONT FACE="Courier New, monospace">2010-07-13</FONT>"<BR><BR><FONT FACE="Courier New, monospace">%weekday% - + </FONT>day of the week, e. g. "<FONT FACE="Courier New, monospace">Monday</FONT>"<BR><FONT FACE="Courier New, monospace">%week% - + </FONT>calendar week, e. g. "<FONT FACE="Courier New, monospace">28</FONT>"<BR><BR><FONT FACE="Courier New, monospace">%day% - + </FONT>current day, e. g. "<FONT FACE="Courier New, monospace">21</FONT>"<BR><FONT FACE="Courier New, monospace">%month% - + </FONT>current month, e. g. "<FONT FACE="Courier New, monospace">July</FONT>"<BR><FONT FACE="Courier New, monospace">%year% - + </FONT>current year, e. g. "<FONT FACE="Courier New, monospace">2010</FONT>"<BR><BR><FONT FACE="Courier New, monospace">%hour% - + </FONT>current hour, e. g. "<FONT FACE="Courier New, monospace">20</FONT>"<BR><FONT FACE="Courier New, monospace">%min% - + </FONT>current minute, e. g. "<FONT FACE="Courier New, monospace">13</FONT>"<BR><FONT FACE="Courier New, monospace">%sec% - + </FONT>current second, e. g. "<FONT FACE="Courier New, monospace">40</FONT>"</FONT></P> +</SPAN><BR CLEAR=LEFT><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Environment +variables: </B><SPAN STYLE="font-weight: normal">(Windows)</SPAN></FONT></P> +<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen4" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">%AllUsersProfile% </FONT>e. + g. <FONT FACE="Courier New, monospace">C:\ProgramData<BR>%AppData% </FONT>e. + g. <FONT FACE="Courier New, monospace">C:\Users\username\AppData\Roaming<BR>%LocalAppData% </FONT>e. + g. <FONT FACE="Courier New, monospace">C:\Users\username\AppData\Local<BR>%ProgramData% </FONT>e. + g. <FONT FACE="Courier New, monospace">C:\ProgramData<BR>%ProgramFiles% </FONT>e. + g. <FONT FACE="Courier New, monospace">C:\Program + Files<BR>%ProgramFiles(x86)% </FONT>e. g. <FONT FACE="Courier New, monospace">C:\Program + Files (x86)<BR>%Public% </FONT>e. + g. <FONT FACE="Courier New, monospace">C:\Users\Public<BR>%UserProfile% </FONT>e. + g. <FONT FACE="Courier New, monospace">C:\Users\username<BR>%WinDir% </FONT>e. + g. <FONT FACE="Courier New, monospace">C:\Windows<BR>%Temp% </FONT>e. + g. <FONT FACE="Courier New, monospace">C:\Windows\Temp</FONT></FONT></P> +</SPAN><BR CLEAR=LEFT><BR> +</P> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Special +folder locations </B><SPAN STYLE="font-weight: normal">(Windows)</SPAN></FONT></P> +<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen6" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">%csidl_Desktop% </FONT>e. + g. <FONT FACE="Courier New, monospace">C:\Users\username\Desktop<BR>%csidl_MyMusic% </FONT>e. + g. <FONT FACE="Courier New, monospace">C:\Users\username\My + Documents\My Music<BR>%csidl_Pictures% </FONT>e. + g. <FONT FACE="Courier New, monospace">C:\Users\username\My + Documents\My Pictures<BR>%csidl_MyVideo% </FONT>e. + g. <FONT FACE="Courier New, monospace">C:\Users\username\My + Documents\My Videos<BR>%csidl_MyDocuments% </FONT>e. g. + <FONT FACE="Courier New, monospace">C:\Users\username\My + Documents<BR>%csidl_StartMenu% </FONT>e. g. + <FONT FACE="Courier New, monospace">C:\Users\username\Start + Menu<BR>%csidl_Favorites% </FONT>e. g. + <FONT FACE="Courier New, monospace">C:\Users\username\Favorites<BR>%csidl_Templates% </FONT>e. + g. <FONT FACE="Courier New, monospace">C:\Users\username\Templates<BR>%csidl_Resources% </FONT>e. + g. <FONT FACE="Courier New, monospace">C:\Windows\Resources</FONT></FONT></P> +</SPAN><BR CLEAR=LEFT>Note: Each user configuration folder has a +public version. E.g. <FONT FACE="Courier New, monospace">csidl_MyMusic</FONT> +→ <FONT FACE="Courier New, monospace">csidl_PublicMusic</FONT> +</P> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Hint:</B></FONT></P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">You can +add a great amount of flexibility to Batch Synchronization +(*.ffs_batch) by creating new temporary environment variables in a +*.bat/*.cmd file that are evaluated by FreeFileSync at runtime!</FONT></P> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B></FONT></P> +<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <UL> + <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">C:\Backup\%username%_Config </FONT>expands + to<FONT FACE="Courier New, monospace"><BR>C:\Backup\ZenJu_Config</FONT></FONT></P> + <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">%appdata%\FreeFileSync </FONT>expands + to<FONT FACE="Courier New, monospace"><BR>C:\Documents and + Settings\ZenJu\Application Data\FreeFileSync</FONT></FONT></P> + </UL> +</SPAN><BR CLEAR=LEFT><BR> +</P> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B></FONT></P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">The +batch configuration file <FONT FACE="Courier New, monospace">C:\SyncJob.ffs_batch +</FONT>contains macro <FONT FACE="Courier New, monospace">%MyVar% +</FONT>instead of an absolute target directory and is invoked by a +*.cmd file:</FONT></P> +<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen5" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">set + MyVar=C:\Target<BR>cd "C:\Program + files\FreeFileSync"<BR>FreeFileSync.exe C:\SyncJob.ffs_batch + </FONT>(-><FONT FACE="Courier New, monospace">%MyVar% </FONT>is + replaced by <FONT FACE="Courier New, monospace">C:\Target </FONT>during + execution)</FONT></P> +</SPAN><BR CLEAR=LEFT><BR> +</P> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<UL> + <P><SPAN ID="Rahmen3" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Tahoma, sans-serif"><B>Note:</B><BR>Temporary + environment variables created with the "<FONT FACE="Courier New, monospace">set</FONT>" + command are only valid if the batch job is started by calling the + executable directly! Using "<FONT FACE="Courier New, monospace">start + /wait</FONT>" or relying on Shell Execute creates a new + program context without these temporal variables.</FONT></P> + </SPAN><BR CLEAR=LEFT> + </P> +</UL> +</BODY> +</HTML>
\ No newline at end of file diff --git a/BUILD/Help/html/MainDialog.png b/BUILD/Help/html/MainDialog.png Binary files differnew file mode 100644 index 00000000..ab6a6f7c --- /dev/null +++ b/BUILD/Help/html/MainDialog.png diff --git a/BUILD/Help/html/Overview_html_165273dc.gif b/BUILD/Help/html/Overview_html_165273dc.gif Binary files differdeleted file mode 100644 index 3fa6854d..00000000 --- a/BUILD/Help/html/Overview_html_165273dc.gif +++ /dev/null diff --git a/BUILD/Help/html/Overview_html_m633b851c.gif b/BUILD/Help/html/Overview_html_m633b851c.gif Binary files differdeleted file mode 100644 index a1f073bb..00000000 --- a/BUILD/Help/html/Overview_html_m633b851c.gif +++ /dev/null diff --git a/BUILD/Help/html/RealtimeSync.html b/BUILD/Help/html/RealtimeSync.html new file mode 100644 index 00000000..fc0a2054 --- /dev/null +++ b/BUILD/Help/html/RealtimeSync.html @@ -0,0 +1,151 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> + <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"> + <TITLE></TITLE> + <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> + <META NAME="CREATED" CONTENT="20091206;16574000"> + <META NAME="CHANGED" CONTENT="20110906;23572100"> + <META NAME="Info 1" CONTENT=""> + <META NAME="Info 2" CONTENT=""> + <META NAME="Info 3" CONTENT=""> + <META NAME="Info 4" CONTENT=""> + <STYLE TYPE="text/css"> + <!-- + @page { margin: 2cm } + P { margin-bottom: 0.21cm } + H3 { margin-bottom: 0.21cm } + H3.western { font-family: "Arial", sans-serif } + H3.cjk { font-family: "MS Mincho" } + H3.ctl { font-family: "Mangal" } + A:link { so-language: zxx } + --> + </STYLE> +</HEAD> +<BODY LANG="en-US" DIR="LTR"> +<H3 CLASS="western" ALIGN=CENTER><IMG SRC="rtsicon.png" NAME="Grafik6" ALIGN=ABSMIDDLE WIDTH=37 HEIGHT=37 BORDER=0> +<FONT SIZE=4 STYLE="font-size: 16pt">RealtimeSync<BR></FONT><FONT SIZE=3><I><SPAN STYLE="font-weight: normal">- +Automated Synchronization -</SPAN></I></FONT></H3> +<P ALIGN=LEFT><BR><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">RealtimeSync's +primary function is to trigger synchronization immediately after +files in a source directory have changed. However its implementation +is more flexible to cover an even broader range of use: A list of +directories provided by the user is monitored for changes. Whenever a +file within these directories or sub directories is modified OR the +directory becomes available (e. g. insert of a USB-stick), +RealtimeSync responds by executing the user-specified command line.</FONT></P> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B></FONT> +<FONT FACE="Tahoma, sans-serif">Real time synchronization - in +combination with FreeFileSync</FONT></P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">First +start up RealtimeSync.exe located in FreeFileSync's installation +directory. Then specify all directories that shall be monitored. +Instead of doing this manually you can simply import a </FONT><FONT FACE="Courier New, monospace">*.ffs_batch</FONT> +<FONT FACE="Tahoma, sans-serif">file via </FONT><FONT FACE="Tahoma, sans-serif"><I>Menu +-> File -> Load configuration</I></FONT><FONT FACE="Tahoma, sans-serif">. +This not only extracts all directories relevant for synchronization +but also sets up the command-line to execute the </FONT><FONT FACE="Courier New, monospace">*.ffs_batch</FONT> +<FONT FACE="Tahoma, sans-serif">file each time changes are detected. +Now press "</FONT><FONT FACE="Tahoma, sans-serif"><I>Start</I></FONT><FONT FACE="Tahoma, sans-serif">" +to begin monitoring.</FONT></P> +<UL> + <P STYLE="margin-bottom: 0cm"><IMG SRC="RealtimeSync.png" NAME="Grafik3" ALIGN=MIDDLE WIDTH=420 HEIGHT=480 BORDER=0></P> +</UL> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff"> + <UL> + <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note:</B></FONT></P> + <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">The + command-line should <B>not</B> <B>block</B> the progress. If a + FreeFileSync batch file is called make sure it is running + "minimized" and "error handling” is set to + "ignore errors" or "exit instantly<SPAN STYLE="text-decoration: none">".<BR> </SPAN></FONT></P> + <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">The + settings dialog can be skipped by passing a RealtimeSync + configuration file (<FONT FACE="Courier New, monospace">*.ffs_real</FONT>) + OR a FreeFileSync batch file (<FONT FACE="Courier New, monospace">*.ffs_batch</FONT>) + as first command-line argument to RealtimeSync.exe. This allows for + integration with the operating system's auto start + facility:<BR> <FONT FACE="Courier New, monospace">"C:\Program + Files\FreeFileSync\RealtimeSync.exe" + "C:\MyConfig.ffs_real"<BR></FONT> <FONT FACE="Courier New, monospace">"C:\Program + Files\FreeFileSync\RealtimeSync.exe" "C:\SyncJob.ffs_batch"</FONT><BR> </FONT></P> + <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Using + RealtimeSync is not restricted to starting FreeFileSync. It can + also be used in other scenarios, like sending an email whenever a + certain directory is modified.<BR> </FONT></P> + <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">If + you schedule a Windows batch file (.bat, .cmd), see notes in <A HREF="Batch%20Scripting.html">Batch + Scripting</A>.</FONT></P> + </UL> +</SPAN><BR CLEAR=LEFT><BR> +</P> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B></FONT> +<FONT FACE="Tahoma, sans-serif">Automatic synchronization when USB +stick is inserted</FONT></P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Save +the relevant configuration on the USB stick's root directory to have +it called when the stick is mounted. Then configure RealtimeSync as +shown in the following:</FONT></P> +<UL> + <P><IMG SRC="WatchUsbInsert.png" NAME="Grafik2" ALIGN=BOTTOM WIDTH=436 HEIGHT=447 BORDER=0></P> +</UL> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Whenever +directory "</FONT><FONT FACE="Courier New, monospace">H:\Data</FONT><FONT FACE="Tahoma, sans-serif">" +becomes available, the command line executes and starts the batch job +on the stick. Additionally it also starts the batch job each time +files are modified in "</FONT><FONT FACE="Courier New, monospace">H:\Data</FONT><FONT FACE="Tahoma, sans-serif">". +</FONT> +</P> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff"> + <UL> + <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note:<BR></B></FONT><FONT FACE="Tahoma, sans-serif">The + n</FONT><SPAN STYLE="text-decoration: none"><FONT FACE="Tahoma, sans-serif">ame + of the last changed file is written to an environment variable + named </FONT></SPAN><SPAN STYLE="text-decoration: none"><FONT FACE="Courier New, monospace">"changed_file".</FONT></SPAN></P> + </UL> +</SPAN><BR CLEAR=LEFT><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B></FONT> +<FONT FACE="Tahoma, sans-serif">Show names of changed files or +directories. (Windows)</FONT></P> +<UL> + <P><SPAN ID="Rahmen4" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <UL> + <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Courier New, monospace"><FONT FACE="Tahoma, sans-serif">Show + which file or directory has triggered a change. Enter into command + line:</FONT><BR> cmd /c echo + "%changed_file%" & pause<BR><BR><FONT FACE="Tahoma, sans-serif">Write + a list of all changes to a logfile:</FONT><BR> cmd + /c echo "%changed_file%" >> c:\log.txt</FONT></P> + </UL> + </SPAN><BR CLEAR=LEFT> + </P> +</UL> +<P STYLE="margin-bottom: 0cm; text-decoration: none"><BR> +</P> +<P STYLE="margin-bottom: 0cm; text-decoration: none"><FONT FACE="Tahoma, sans-serif">Limitations:</FONT></P> +<UL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">If + multiple changes happen at the same time, only the name of the first + file is written to variable "changed_file".</FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">While + RealtimeSync is executing the command line, monitoring is inactive + and changes occurring during this time are lost. </FONT> + </P> +</UL> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +</BODY> +</HTML>
\ No newline at end of file diff --git a/BUILD/Help/html/RealtimeSync.png b/BUILD/Help/html/RealtimeSync.png Binary files differnew file mode 100644 index 00000000..20d582c6 --- /dev/null +++ b/BUILD/Help/html/RealtimeSync.png diff --git a/BUILD/Help/html/advanced/RunAsService.html b/BUILD/Help/html/RunAsService.html index 54408579..c347a4fa 100644 --- a/BUILD/Help/html/advanced/RunAsService.html +++ b/BUILD/Help/html/RunAsService.html @@ -5,7 +5,7 @@ <TITLE></TITLE> <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20100902;19154500"> + <META NAME="CHANGED" CONTENT="20110903;15175900"> <META NAME="Info 1" CONTENT=""> <META NAME="Info 2" CONTENT=""> <META NAME="Info 3" CONTENT=""> @@ -23,8 +23,8 @@ </STYLE> </HEAD> <BODY LANG="en-US" DIR="LTR"> -<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Run RealtimeSync -as a Service <SPAN STYLE="font-weight: normal">(Windows only)</SPAN></FONT></H3> +<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Run as Service +<SPAN STYLE="font-weight: normal">(Windows only)</SPAN></FONT></H3> <P STYLE="margin-bottom: 0cm"><BR> </P> <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">The @@ -67,8 +67,8 @@ the new Service with RealtimeSync:</FONT></P> </UL> <P STYLE="margin-bottom: 0cm"><BR> </P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">That's -it!</FONT></P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">The new +service is now ready for operation!</FONT></P> <P STYLE="margin-bottom: 0cm"><BR> </P> <P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff"> @@ -76,12 +76,12 @@ it!</FONT></P> <FONT FACE="Tahoma, sans-serif"><B>Attention:</B><BR>When running RealtimeSync as a service the application has no means to interact with the user. Therefore any popup dialog will stop the process - flow! Consequently consider the following rules when setting up a - FreeFileSync batch job:</FONT></P> + flow! Consider the following options when setting up a FreeFileSync + batch job:</FONT></P> <UL> <LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Enable - checkbox "<I>Silent mode</I>" to prevent showing a status - dialog at the end of the process.</FONT></P> + checkbox "<I>Run minimized</I>" to prevent showing the + results dialog after synchronization.</FONT></P> <LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Set "<I>Error handling</I>" to either "<I>Exit instantly</I>" or "<I>Ignore errors</I>".</FONT></P> @@ -90,8 +90,8 @@ it!</FONT></P> </P> <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><BR> </P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">The new -service can now be started via command line or Windows Service +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">You can +start the service now via command line or Windows Service administration:</FONT></P> <UL> <P STYLE="margin-right: 0.98cm"><SPAN ID="Rahmen5" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> diff --git a/BUILD/Help/html/advanced/RunAsService_html_17e8fbfe.png b/BUILD/Help/html/RunAsService_html_17e8fbfe.png Binary files differindex 23eb6083..23eb6083 100644 --- a/BUILD/Help/html/advanced/RunAsService_html_17e8fbfe.png +++ b/BUILD/Help/html/RunAsService_html_17e8fbfe.png diff --git a/BUILD/Help/html/advanced/RunAsService_html_4f230a46.png b/BUILD/Help/html/RunAsService_html_4f230a46.png Binary files differindex a32a442d..a32a442d 100644 --- a/BUILD/Help/html/advanced/RunAsService_html_4f230a46.png +++ b/BUILD/Help/html/RunAsService_html_4f230a46.png diff --git a/BUILD/Help/html/advanced/RunAsService_html_68e0fe53.png b/BUILD/Help/html/RunAsService_html_68e0fe53.png Binary files differindex 5639a21c..5639a21c 100644 --- a/BUILD/Help/html/advanced/RunAsService_html_68e0fe53.png +++ b/BUILD/Help/html/RunAsService_html_68e0fe53.png diff --git a/BUILD/Help/html/advanced/RunAsService_html_7aa44556.png b/BUILD/Help/html/RunAsService_html_7aa44556.png Binary files differindex b37fe6e4..b37fe6e4 100644 --- a/BUILD/Help/html/advanced/RunAsService_html_7aa44556.png +++ b/BUILD/Help/html/RunAsService_html_7aa44556.png diff --git a/BUILD/Help/html/advanced/RunAsService_html_bf02de4e.png b/BUILD/Help/html/RunAsService_html_bf02de4e.png Binary files differindex 2bdac2db..2bdac2db 100644 --- a/BUILD/Help/html/advanced/RunAsService_html_bf02de4e.png +++ b/BUILD/Help/html/RunAsService_html_bf02de4e.png diff --git a/BUILD/Help/html/advanced/RunAsService_html_m3be0f332.png b/BUILD/Help/html/RunAsService_html_m3be0f332.png Binary files differindex 5ad45cfa..5ad45cfa 100644 --- a/BUILD/Help/html/advanced/RunAsService_html_m3be0f332.png +++ b/BUILD/Help/html/RunAsService_html_m3be0f332.png diff --git a/BUILD/Help/html/advanced/RunAsService_html_m3e56d901.png b/BUILD/Help/html/RunAsService_html_m3e56d901.png Binary files differindex 860d1543..860d1543 100644 --- a/BUILD/Help/html/advanced/RunAsService_html_m3e56d901.png +++ b/BUILD/Help/html/RunAsService_html_m3e56d901.png diff --git a/BUILD/Help/html/RunMinimized.png b/BUILD/Help/html/RunMinimized.png Binary files differnew file mode 100644 index 00000000..145a7568 --- /dev/null +++ b/BUILD/Help/html/RunMinimized.png diff --git a/BUILD/Help/html/ScheduleBatch.html b/BUILD/Help/html/ScheduleBatch.html new file mode 100644 index 00000000..4bd0c8ad --- /dev/null +++ b/BUILD/Help/html/ScheduleBatch.html @@ -0,0 +1,124 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> + <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"> + <TITLE></TITLE> + <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> + <META NAME="CREATED" CONTENT="20091206;16574000"> + <META NAME="CHANGED" CONTENT="20110830;15010600"> + <STYLE TYPE="text/css"> + <!-- + @page { margin: 2cm } + P { margin-bottom: 0.21cm } + H3 { margin-bottom: 0.21cm } + H3.western { font-family: "Arial", sans-serif } + H3.cjk { font-family: "MS Mincho" } + H3.ctl { font-family: "Mangal" } + A:link { so-language: zxx } + --> + </STYLE> +</HEAD> +<BODY LANG="de-DE" DIR="LTR"> +<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Schedule Batch +Job</FONT></H3> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<OL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Create + a new batch job via FreeFileSync's main + dialog:<BR></FONT><FONT FACE="Tahoma, sans-serif"><I>Menu->Advanced->Create + batch job</I></FONT> <FONT FACE="Tahoma, sans-serif">and save it, + for example, as "</FONT><FONT FACE="Courier New, monospace">C:\SyncJob.ffs_batch</FONT><FONT FACE="Tahoma, sans-serif">".<BR> </FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Enable + checkbox "<I>Run miminized</I>" to avoid blocking while + showing a status dialog at the end of the process.<BR><IMG SRC="RunMinimized.png" NAME="Grafik3" ALIGN=BOTTOM WIDTH=709 HEIGHT=332 BORDER=0></FONT></P> + <P STYLE="margin-bottom: 0cm"> </P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">In + order to prevent error or warning popup messages from stopping + progress, set "<I>Error handling</I>" to either "<I>Ignore + errors</I>" or "<I>Exit instantly</I>".<BR><IMG SRC="ErrorHandling.png" NAME="Grafik4" ALIGN=BOTTOM WIDTH=313 HEIGHT=331 BORDER=0></FONT></P> + <P STYLE="margin-bottom: 0cm"> </P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Setup + your operating system's scheduler</FONT></P> +</OL> +<OL> + <OL TYPE=A> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Windows + 7 Task Scheduler:</B></FONT></P> + <UL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Go + to Start and e</SPAN></FONT><FONT FACE="Tahoma, sans-serif"><FONT SIZE=3><SPAN STYLE="font-weight: normal">nter + </SPAN></FONT></FONT><FONT FACE="Courier New, monospace"><FONT SIZE=3><SPAN STYLE="font-weight: normal">"</SPAN></FONT></FONT><FONT COLOR="#000000"><FONT FACE="Courier New, monospace"><FONT SIZE=3><SPAN STYLE="font-weight: normal">taskschd.msc"</SPAN></FONT></FONT></FONT></P> + <LI><P STYLE="margin-bottom: 0cm; font-weight: normal"><FONT COLOR="#000000"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=3>Create + a new basic task and follow the wizard.</FONT></FONT></FONT></P> + <LI><P STYLE="margin-bottom: 0cm; font-weight: normal"><FONT COLOR="#000000"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=3>Make + "Program/script" point to the location of + FreeFileSync.exe and specify the ffs_batch file under "Add + arguments".</FONT></FONT></FONT></P> + </UL> + </OL> +</OL> +<OL> + <OL TYPE=A> + <UL> + <LI><P STYLE="margin-bottom: 0cm; font-weight: normal"><FONT FACE="Tahoma, sans-serif"><FONT COLOR="#000000"><FONT SIZE=3>Use + quotes if any paths contain spaces, e.g.: </FONT></FONT><FONT COLOR="#000000"><FONT FACE="Courier New, monospace"><FONT SIZE=3>"C:\some + folder\SyncJob.ffs_batch"</FONT></FONT></FONT><FONT COLOR="#000000"><FONT SIZE=3><BR></FONT></FONT><IMG SRC="win7scheduler.png" NAME="Grafik1" ALIGN=BOTTOM WIDTH=708 HEIGHT=321 BORDER=0><BR> </FONT></P> + </UL> + </OL> +</OL> +<OL> + <OL TYPE=A START=2> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Windows + XP Scheduled Tasks:</B></FONT></P> + <UL> + <LI VALUE=1><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Go + to <I>Start → Control Panel → Scheduled Tasks</I> and + select "<I>Add Scheduled Task</I>".</FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Follow + the wizard and select FreeFileSync.exe as program to run.</FONT></P> + <LI><P STYLE="margin-bottom: 0cm; font-weight: normal"><FONT FACE="Tahoma, sans-serif">Make + sure "Run:" is specified as: <FONT FACE="Courier New, monospace"><FreeFileSync + installation directory>\FreeFileSync.exe <ffs_batch + file></FONT><BR><IMG SRC="ScheduleBatch_html_m10bf0d36.gif" NAME="Grafik2" ALIGN=BOTTOM WIDTH=406 HEIGHT=455 BORDER=0><BR> </FONT></P> + </UL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Ubuntu + Linux Gnome-schedule:</B></FONT></P> + <UL> + <LI><P STYLE="margin-bottom: 0cm; font-weight: normal"><FONT FACE="Tahoma, sans-serif">Install + Gnome-schedule, if necessary: <FONT FACE="Courier New, monospace">sudo + apt-get install gnome-schedule</FONT></FONT></P> + </UL> + </OL> +</OL> +<OL> + <OL TYPE=A START=2> + <UL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Go + to </SPAN></FONT><FONT FACE="Tahoma, sans-serif"><I>System -> + Preferences -> Scheduled tasks</I></FONT></P> + </UL> + </OL> +</OL> +<OL> + <OL TYPE=A START=2> + <UL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">Specify + the command as:</SPAN></SPAN></FONT> <FONT FACE="Courier New, monospace"><I><SPAN STYLE="font-weight: normal"><FreeFileSync + installation directory>\FreeFileSync <ffs_batch file><BR></SPAN></I></FONT><IMG SRC="ubuntuScheduler.png" NAME="Grafik5" ALIGN=BOTTOM WIDTH=629 HEIGHT=560 BORDER=0></P> + </UL> + </OL> +</OL> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Tahoma, sans-serif"><B>Note:</B></FONT><FONT FACE="Tahoma, sans-serif"><BR>Beginning + with Windows Vista, the command always needs to start with the path + to "FreeFileSync.exe" even if file associations are set!</FONT> + <FONT FACE="Tahoma, sans-serif">Else the task will return with error + code 0xC1, "%1 is not a valid Win32 application".</FONT></P> +</SPAN><BR CLEAR=LEFT><BR> +</P> +</BODY> +</HTML>
\ No newline at end of file diff --git a/BUILD/Help/html/advanced/ScheduleBatch_html_372f0f3.gif b/BUILD/Help/html/ScheduleBatch_html_372f0f3.gif Binary files differindex 4cddbc19..4cddbc19 100644 --- a/BUILD/Help/html/advanced/ScheduleBatch_html_372f0f3.gif +++ b/BUILD/Help/html/ScheduleBatch_html_372f0f3.gif diff --git a/BUILD/Help/html/ScheduleBatch_html_m10bf0d36.gif b/BUILD/Help/html/ScheduleBatch_html_m10bf0d36.gif Binary files differnew file mode 100644 index 00000000..20d27d6d --- /dev/null +++ b/BUILD/Help/html/ScheduleBatch_html_m10bf0d36.gif diff --git a/BUILD/Help/html/advanced/SendMail.html b/BUILD/Help/html/SendMail.html index a3263f3c..87e96ad4 100644 --- a/BUILD/Help/html/advanced/SendMail.html +++ b/BUILD/Help/html/SendMail.html @@ -5,7 +5,7 @@ <TITLE></TITLE> <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20100902;19140400"> + <META NAME="CHANGED" CONTENT="20110901;20164500"> <META NAME="Info 1" CONTENT=""> <META NAME="Info 2" CONTENT=""> <META NAME="Info 3" CONTENT=""> @@ -23,39 +23,34 @@ </STYLE> </HEAD> <BODY LANG="en-US" DIR="LTR"> -<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Synchronize in -Batch Mode and send error notification via email</FONT></H3> +<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Send error +notification via email</FONT></H3> <P STYLE="margin-bottom: 0cm"><BR> </P> <OL> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Create - a FreeFileSync batch file using "<I>Silent mode</I>".</FONT></P> + a FreeFileSync batch file using "<I>Run minimized</I>".<BR> </FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Set error handling to "<I>Exit instantly</I>" or "<I>Ignore errors</I>" to avoid having a pop-up stop the program flow. In case errors occur FreeFileSync will exit with a return code < 0 - that can be checked via the ERRORLEVEL batch command.</FONT></P> + that can be checked via the ERRORLEVEL batch command.<BR> </FONT></P> <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Create a *.cmd or *.bat file to specify the location of FreeFileSync.exe - and pass the name of the FreeFileSync batch file as first argument; - e.g.:</FONT></P> + and pass the name of the ffs_batch file as first argument; e.g.:</FONT></P> </OL> -<UL> - <P><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> - <UL> - <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Courier New, monospace">"C:\Program - Files\FreeFileSync\FreeFileSync.exe" - "C:\SyncJob.ffs_batch"<BR>@if not errorlevel 0 - (<BR> echo An error occured!<BR> pause<BR>)</FONT></P> - </UL> - </SPAN><BR CLEAR=LEFT> - </P> -</UL> -<P STYLE="margin-bottom: 0cm"><BR> +<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen5" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">"C:\Program + Files\FreeFileSync\FreeFileSync.exe" "C:\SyncJob.ffs_batch"<BR>@if + not errorlevel 0 (<BR> echo An error + occured!<BR> pause<BR>)</FONT></FONT></P> +</SPAN><BR CLEAR=LEFT><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Instead +of displaying "An error occurred!" you can specify another +command like sending an email notification (using a third party +tool).</FONT> </P> -<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Instead -of displaying "An error occurred!" you can specify any -other command like sending an email notification (using a third party -tool).</FONT></P> </BODY> </HTML>
\ No newline at end of file diff --git a/BUILD/Help/html/advanced/ShadowCopy.html b/BUILD/Help/html/ShadowCopy.html index 98d50659..d8286285 100644 --- a/BUILD/Help/html/advanced/ShadowCopy.html +++ b/BUILD/Help/html/ShadowCopy.html @@ -5,7 +5,7 @@ <TITLE></TITLE> <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20100902;19132400"> + <META NAME="CHANGED" CONTENT="20110901;20302700"> <META NAME="Info 1" CONTENT=""> <META NAME="Info 2" CONTENT=""> <META NAME="Info 3" CONTENT=""> @@ -31,44 +31,33 @@ Copy Service <SPAN STYLE="font-weight: normal">(Windows only)</SPAN></FONT></H3> supports copying locked or shared files by creating a Volume Shadow Copy of the source drive. To enable this feature go to </FONT><FONT FACE="Tahoma, sans-serif"><I>Menu -> Advanced -> Global settings: Copy locked files</I></FONT><FONT FACE="Tahoma, sans-serif">.</FONT></P> -<UL> - <P><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff"> - <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Tahoma, sans-serif"><B>Note:</B></FONT></P> - <UL> - <LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">This - functionality is applied to locked files only. Regular files will - not use Volume Shadow Copy Service when being synchronized.</FONT></P> - </UL> - <UL> - <LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm; font-style: normal"><FONT FACE="Tahoma, sans-serif">Creating - Volume Snapshots using VSS requires the application to be started - with Administrator rights.</FONT></P> - </UL> - </SPAN><BR CLEAR=LEFT> - </P> -</UL> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><BR> +<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen3" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff"> + <UL> + <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note:</B></FONT></P> + <LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">This + functionality is applied to locked files only. Regular files will + not use Volume Shadow Copy Service when being synchronized.</FONT></P> + <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><SPAN STYLE="font-style: normal"><FONT FACE="Tahoma, sans-serif">Creating + Volume Snapshots using VSS requires the application to be started + with Administrator rights.</FONT></SPAN></P> + </UL> +</SPAN><BR CLEAR=LEFT><BR> </P> <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Troubleshooting</B></FONT></P> <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">If you experience problems using the Volume Shadow Copy Service a renewal of registration might help. Create and execute a *.cmd batch file with the follow content or enter directly via command line:</FONT></P> -<UL> - <P STYLE="margin-right: 0.98cm"><SPAN ID="Rahmen3" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> - <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Courier New, monospace">cd /d %windir%\system32<BR>Net - stop vss<BR>Net stop swprv<BR>regsvr32 ole32.dll<BR>regsvr32 - oleaut32.dll<BR>regsvr32 vss_ps.dll<BR>Vssvc /register<BR>regsvr32 - /i swprv.dll<BR>regsvr32 /i eventcls.dll<BR>regsvr32 - es.dll<BR>regsvr32 stdprov.dll<BR>regsvr32 vssui.dll<BR>regsvr32 - msxml.dll<BR>regsvr32 msxml3.dll<BR>regsvr32 msxml4.dll</FONT></P> - </SPAN><BR CLEAR=LEFT> - </P> -</UL> +<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Courier New, monospace">cd /d %windir%\system32<BR>Net + stop vss<BR>Net stop swprv<BR>regsvr32 ole32.dll<BR>regsvr32 + oleaut32.dll<BR>regsvr32 vss_ps.dll<BR>Vssvc /register<BR>regsvr32 + /i swprv.dll<BR>regsvr32 /i eventcls.dll<BR>regsvr32 es.dll<BR>regsvr32 + stdprov.dll<BR>regsvr32 vssui.dll<BR>regsvr32 msxml.dll<BR>regsvr32 + msxml3.dll<BR>regsvr32 msxml4.dll</FONT></P> +</SPAN><BR CLEAR=LEFT><BR> +</P> <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><BR> </P> <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">(Reference: diff --git a/BUILD/Help/html/SourceTarget.png b/BUILD/Help/html/SourceTarget.png Binary files differnew file mode 100644 index 00000000..2a3a834e --- /dev/null +++ b/BUILD/Help/html/SourceTarget.png diff --git a/BUILD/Help/html/SyncConfigButton.png b/BUILD/Help/html/SyncConfigButton.png Binary files differnew file mode 100644 index 00000000..2ac5c94e --- /dev/null +++ b/BUILD/Help/html/SyncConfigButton.png diff --git a/BUILD/Help/html/SynchronizeButton.png b/BUILD/Help/html/SynchronizeButton.png Binary files differnew file mode 100644 index 00000000..a8b8002b --- /dev/null +++ b/BUILD/Help/html/SynchronizeButton.png diff --git a/BUILD/Help/html/VariableDrive.html b/BUILD/Help/html/VariableDrive.html new file mode 100644 index 00000000..ebf80b8d --- /dev/null +++ b/BUILD/Help/html/VariableDrive.html @@ -0,0 +1,69 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<HTML> +<HEAD> + <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"> + <TITLE></TITLE> + <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> + <META NAME="CREATED" CONTENT="20091206;16574000"> + <META NAME="CHANGED" CONTENT="20110909;4200"> + <STYLE TYPE="text/css"> + <!-- + @page { margin: 2cm } + P { margin-bottom: 0.21cm } + H3 { margin-bottom: 0.21cm } + H3.western { font-family: "Arial", sans-serif } + H3.cjk { font-family: "MS Mincho" } + H3.ctl { font-family: "Mangal" } + A:link { so-language: zxx } + --> + </STYLE> +</HEAD> +<BODY LANG="de-DE" DIR="LTR"> +<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Variable drive +letters</FONT></H3> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">USB +sticks often get different volume names assigned when plugged into +different computers. FreeFileSync offers two solutions to handle this +issue:</FONT></P> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Option +1: </B>Specify a directory via volume name: Syntax: <FONT FACE="Courier New, monospace">[<volume +name>]\<path></FONT></FONT></P> +<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen5" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> + <FONT FACE="Tahoma, sans-serif">Use "<FONT FACE="Courier New, monospace">[ZenJu-USB]\directory</FONT>" + instead of "<FONT FACE="Courier New, monospace">E:\directory</FONT>" + where "<FONT FACE="Courier New, monospace">ZenJu-USB</FONT>" + is the name of the USB stick.</FONT></P> +</SPAN><BR CLEAR=LEFT><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">It is +not required to look up and enter the volume name manually. Just +select the corresponding entry in the drop down menu.<BR></FONT><IMG SRC="VolumeName.png" NAME="Grafik1" ALIGN=BOTTOM WIDTH=279 HEIGHT=103 BORDER=0></P> +<P STYLE="margin-bottom: 0cm"><BR> +</P> +<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Option +2: </B></FONT><FONT FACE="Tahoma, sans-serif">Use a relative +directory name:</FONT></P> +<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> + <UL> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Use + "</FONT><FONT FACE="Courier New, monospace">\directory</FONT><FONT FACE="Tahoma, sans-serif">" + instead of "</FONT><FONT FACE="Courier New, monospace">E:\directory</FONT><FONT FACE="Tahoma, sans-serif">"<BR> </FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Save + and copy synchronization settings to the USB stick: + "</FONT><FONT COLOR="#000000"><FONT FACE="Courier New, monospace"><FONT SIZE=3>E:\settings.ffs_gui"<BR> </FONT></FONT></FONT></P> + <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Start + FreeFileSync by double-clicking on "</FONT><FONT FACE="Courier New, monospace">E:\settings.ffs_gui</FONT><FONT FACE="Tahoma, sans-serif">"<BR>→ + Working directory is automatically set to "</FONT><FONT FACE="Courier New, monospace">E:\</FONT><FONT FACE="Tahoma, sans-serif">" + by the operating system so that "</FONT><FONT FACE="Courier New, monospace">\directory</FONT><FONT FACE="Tahoma, sans-serif">" + will be resolved as "</FONT><FONT FACE="Courier New, monospace">E:\directory</FONT><FONT FACE="Tahoma, sans-serif">" + during synchronization.</FONT></P> + </UL> +</SPAN><BR CLEAR=LEFT><BR> +</P> +</BODY> +</HTML>
\ No newline at end of file diff --git a/BUILD/Help/html/VolumeName.png b/BUILD/Help/html/VolumeName.png Binary files differnew file mode 100644 index 00000000..9d1b9201 --- /dev/null +++ b/BUILD/Help/html/VolumeName.png diff --git a/BUILD/Help/html/WatchUsbInsert.png b/BUILD/Help/html/WatchUsbInsert.png Binary files differnew file mode 100644 index 00000000..9d106fb8 --- /dev/null +++ b/BUILD/Help/html/WatchUsbInsert.png diff --git a/BUILD/Help/html/advanced/Batch Scripting.html b/BUILD/Help/html/advanced/Batch Scripting.html deleted file mode 100644 index 7867597d..00000000 --- a/BUILD/Help/html/advanced/Batch Scripting.html +++ /dev/null @@ -1,110 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<HTML> -<HEAD> - <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"> - <TITLE></TITLE> - <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> - <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20110405;14240200"> - <META NAME="Info 1" CONTENT=""> - <META NAME="Info 2" CONTENT=""> - <META NAME="Info 3" CONTENT=""> - <META NAME="Info 4" CONTENT=""> - <STYLE TYPE="text/css"> - <!-- - @page { margin: 2cm } - P { margin-bottom: 0.21cm } - H3 { margin-bottom: 0.21cm } - H3.western { font-family: "Arial", sans-serif } - H3.cjk { font-family: "MS Mincho" } - H3.ctl { font-family: "Mangal" } - A:link { so-language: zxx } - --> - </STYLE> -</HEAD> -<BODY LANG="en-US" DIR="LTR"> -<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Batch Scripting -<SPAN STYLE="font-weight: normal">(Windows)</SPAN></FONT></H3> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">In -order to facilitate using FreeFileSync and RealtimeSync in advanced -synchronization scenarios, creating batch files is a good way to -provide additional functionality. The following section will give -some general hints and examples for custom *.cmd and *.bat files.</FONT></P> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<UL> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">When - starting a batch file from RealtimeSync make synchronous calls to - FreeFileSync only. This will prevent RealtimeSync continue detecting - changes while synchronization is still in progress.</FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">During - execution of a Batch file a black console window is shown. You can - hide this window by using the Visual Basic script "Invisible.vbs" - located in the FreeFileSync installation directory.</FONT></P> -</UL> -<OL> - <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Usage:</B></FONT></P> - <P STYLE="margin-right: 0.98cm"><SPAN ID="Rahmen7" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> - <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Courier New, monospace">wscript C:\Program - files\FreeFileSync\Invisible.vbs C:\MyBatchFile.cmd</FONT></P> - </SPAN><BR CLEAR=LEFT> - </P> -</OL> -<UL> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">FreeFileSync - returns with an Errorlevel below zero if unresolved problems remain:</FONT></P> -</UL> -<OL START=3> - <P><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> - <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Courier New, monospace">"C:\Program - Files\FreeFileSync\FreeFileSync.exe" - "H:\Silent_Config.ffs_batch"<BR>if not errorlevel 0 - (<BR> </FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::if - something went wrong, add special treatment here<BR> </B></I></FONT></FONT><FONT COLOR="#000000"><FONT FACE="Courier New, monospace"><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">echo - Errors occurred during synchronization...</SPAN></SPAN></FONT></FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B><BR> </B></I></FONT></FONT><FONT FACE="Courier New, monospace">pause<BR>)</FONT></P> - </SPAN><BR CLEAR=LEFT> - </P> -</OL> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B> -Shutdown PC after synchronization</FONT></P> -<UL> - <P><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> - <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::start - FreeFileSync Batch - Job<BR></B></I></FONT></FONT><FONT FACE="Courier New, monospace">"C:\Users\ZenJu\Desktop\SyncJob.ffs_batch"<BR> </FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::schedule - shutdown after 10 seconds<BR></B></I></FONT></FONT><FONT FACE="Courier New, monospace">shutdown - /s /t 10</FONT></P> - </SPAN><BR CLEAR=LEFT> - </P> -</UL> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B> -A simple locking facility – (<SPAN STYLE="font-style: normal"><B>Note:</B></SPAN> -<I>FreeFileSync already has a more powerful directory locking -mechanism implemented that allows multiple writers in parallel</I>)</FONT></P> -<OL START=0> - <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><SPAN ID="Rahmen5" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> - <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Courier New, monospace">:tryAgain<BR>if not exist - \\share\folder\lock (<BR> </FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::create - the lock<BR> </B></I></FONT></FONT><FONT FACE="Courier New, monospace">echo - This is a lock file > \\share\folder\lock<BR> </FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::execute - the synchronization batch job synchronously<BR> </B></I></FONT></FONT><FONT FACE="Courier New, monospace">"C:\Program - Files\FreeFileSync\FreeFileSync.exe" - "C:\MySyncJob.ffs_batch"<BR> del - \\share\folder\lock<BR>) else (<BR> </FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::wait - 5 seconds then try starting sync again:<BR> </B></I></FONT></FONT><FONT FACE="Courier New, monospace">choice - /C:AB /T:5 /D:A > NUL<BR> goto tryAgain<BR>)</FONT></P> - </SPAN><BR CLEAR=LEFT><FONT COLOR="#808080"> </FONT> - </P> -</OL> -</BODY> -</HTML>
\ No newline at end of file diff --git a/BUILD/Help/html/advanced/CmpSettings.png b/BUILD/Help/html/advanced/CmpSettings.png Binary files differdeleted file mode 100644 index 834647f5..00000000 --- a/BUILD/Help/html/advanced/CmpSettings.png +++ /dev/null diff --git a/BUILD/Help/html/advanced/DragDrop.html b/BUILD/Help/html/advanced/DragDrop.html deleted file mode 100644 index 1f08a07a..00000000 --- a/BUILD/Help/html/advanced/DragDrop.html +++ /dev/null @@ -1,55 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<HTML> -<HEAD> - <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"> - <TITLE></TITLE> - <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> - <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20100729;21153900"> - <STYLE TYPE="text/css"> - <!-- - @page { margin: 2cm } - P { margin-bottom: 0.21cm } - H3 { margin-bottom: 0.21cm } - H3.western { font-family: "Arial", sans-serif } - H3.cjk { font-family: "MS Mincho" } - H3.ctl { font-family: "Mangal" } - A:link { so-language: zxx } - --> - </STYLE> -</HEAD> -<BODY LANG="de-DE" DIR="LTR"> -<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Drag & drop -support</FONT></H3> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">FreeFileSync -takes usability very seriously. Therefore drag & drop is -supported in various situations:</FONT></P> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B></FONT></P> -<UL> - <UL> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">drag - & drop a directory onto the main window to set the directory - for comparison</FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">drag - & drop a file onto the main window to set the directory for - comparison</FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">drag - & drop *.ffs_gui files onto the main window to load the - configuration contained</FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">drag - & drop *.ffs_batch files onto the main window to display and - edit the batch configuration</FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">drag - & drop *.ffs_batch files onto the batch dialog to display and - edit the batch configuration</FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">merge - multiple *.ffs_batch, *.ffs_gui files or combinations of both via - drag & drop</FONT></P> - </UL> -</UL> -</BODY> -</HTML>
\ No newline at end of file diff --git a/BUILD/Help/html/advanced/Macros.html b/BUILD/Help/html/advanced/Macros.html deleted file mode 100644 index a513f458..00000000 --- a/BUILD/Help/html/advanced/Macros.html +++ /dev/null @@ -1,116 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<HTML> -<HEAD> - <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"> - <TITLE></TITLE> - <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> - <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20110718;14131000"> - <META NAME="Info 1" CONTENT=""> - <META NAME="Info 2" CONTENT=""> - <META NAME="Info 3" CONTENT=""> - <META NAME="Info 4" CONTENT=""> - <STYLE TYPE="text/css"> - <!-- - @page { margin: 2cm } - P { margin-bottom: 0.21cm } - H3 { margin-bottom: 0.21cm } - H3.western { font-family: "Arial", sans-serif } - H3.cjk { font-family: "MS Mincho" } - H3.ctl { font-family: "Mangal" } - A:link { so-language: zxx } - --> - </STYLE> -</HEAD> -<BODY LANG="de-DE" DIR="LTR"> -<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Macros</FONT></H3> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">All -directory names may contain macros that are expanded during -synchronization. Begin and end of each macro is marked by a '%' -character. Besides special macros handling time and date, the -<U>operating system's environment variables</U> can also be used.</FONT></P> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Internal -macros:</B></FONT></P> -<UL> - <P><SPAN ID="Rahmen4" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> - <UL> - <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">%time% - - </FONT>current time, format [hhmmss], e. g. "<FONT FACE="Courier New, monospace">201340</FONT>"<BR><FONT FACE="Courier New, monospace">%date% - - </FONT>current date, e. g. "<FONT FACE="Courier New, monospace">2010-07-13</FONT>"<BR><BR><FONT FACE="Courier New, monospace">%weekday% - - </FONT>day of the week, e. g. "<FONT FACE="Courier New, monospace">Monday</FONT>"<BR><FONT FACE="Courier New, monospace">%week% - - </FONT>calendar week, e. g. "<FONT FACE="Courier New, monospace">28</FONT>"<BR><BR><FONT FACE="Courier New, monospace">%day% - - </FONT>current day, e. g. "<FONT FACE="Courier New, monospace">21</FONT>"<BR><FONT FACE="Courier New, monospace">%month% - - </FONT>current month, e. g. "<FONT FACE="Courier New, monospace">July</FONT>"<BR><FONT FACE="Courier New, monospace">%year% - - </FONT>current year, e. g. "<FONT FACE="Courier New, monospace">2010</FONT>"<BR><BR><FONT FACE="Courier New, monospace">%hour% - - </FONT>current hour, e. g. "<FONT FACE="Courier New, monospace">20</FONT>"<BR><FONT FACE="Courier New, monospace">%min% - - </FONT>current minute, e. g. "<FONT FACE="Courier New, monospace">13</FONT>"<BR><FONT FACE="Courier New, monospace">%sec% - - </FONT>current second, e. g. "<FONT FACE="Courier New, monospace">40</FONT>"</FONT></P> - </UL> - </SPAN><BR CLEAR=LEFT> - </P> -</UL> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Hint:</B></FONT></P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">You can -add a great amount of flexibility to Batch Synchronization -(*.ffs_batch) by creating new temporary environment variables in a -*.bat/*.cmd file that are evaluated by FreeFileSync at runtime!</FONT></P> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B></FONT></P> -<UL> - <P><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> - <UL> - <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">C:\Backup\%username%_Config </FONT>expands - to<FONT FACE="Courier New, monospace"><BR>C:\Backup\ZenJu_Config</FONT></FONT></P> - <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">%appdata%\FreeFileSync </FONT>expands - to<FONT FACE="Courier New, monospace"><BR>C:\Documents and - Settings\ZenJu\Application Data\FreeFileSync</FONT></FONT></P> - </UL> - </SPAN><BR CLEAR=LEFT> - </P> -</UL> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B></FONT></P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">The -batch configuration file <FONT FACE="Courier New, monospace">C:\SyncJob.ffs_batch -</FONT>contains macro <FONT FACE="Courier New, monospace">%MyVar% -</FONT>instead of an absolute target directory and is invoked by a -*.cmd file:</FONT></P> -<UL> - <P><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> - <UL> - <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">set - MyVar=C:\Target<BR>cd "C:\Program - files\FreeFileSync"<BR>FreeFileSync.exe C:\SyncJob.ffs_batch - </FONT>(-><FONT FACE="Courier New, monospace">%MyVar% </FONT>is - replaced by <FONT FACE="Courier New, monospace">C:\Target </FONT>during - execution)</FONT></P> - </UL> - </SPAN><BR CLEAR=LEFT> - </P> -</UL> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<UL> - <P><SPAN ID="Rahmen3" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff"> - <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Tahoma, sans-serif"><B>Note:</B><BR>Temporary - environment variables created with the "<FONT FACE="Courier New, monospace">set</FONT>" - command are only valid if the batch job is started by calling the - executable directly! Using "<FONT FACE="Courier New, monospace">start - /wait</FONT>" or relying on Shell Execute creates a new - program context without these temporal variables.</FONT></P> - </SPAN><BR CLEAR=LEFT> - </P> -</UL> -</BODY> -</HTML>
\ No newline at end of file diff --git a/BUILD/Help/html/advanced/RealtimeSync.html b/BUILD/Help/html/advanced/RealtimeSync.html deleted file mode 100644 index 7fb599e8..00000000 --- a/BUILD/Help/html/advanced/RealtimeSync.html +++ /dev/null @@ -1,155 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<HTML> -<HEAD> - <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"> - <TITLE></TITLE> - <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> - <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20110405;14185900"> - <META NAME="Info 1" CONTENT=""> - <META NAME="Info 2" CONTENT=""> - <META NAME="Info 3" CONTENT=""> - <META NAME="Info 4" CONTENT=""> - <STYLE TYPE="text/css"> - <!-- - @page { margin: 2cm } - P { margin-bottom: 0.21cm } - H3 { margin-bottom: 0.21cm } - H3.western { font-family: "Arial", sans-serif } - H3.cjk { font-family: "MS Mincho" } - H3.ctl { font-family: "Mangal" } - A:link { so-language: zxx } - --> - </STYLE> -</HEAD> -<BODY LANG="en-US" DIR="LTR"> -<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">RealtimeSync</FONT></H3> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">RealtimeSync's -primary function is to trigger synchronization immediately after -files in a source directory have changed. However its implementation -is much more flexible to cover an even broader range of use: A list -of directories provided by the user is monitored for changes. -Whenever a file within these directories or sub directories is -modified OR the directory becomes available (e. g. insert of a -USB-stick), RealtimeSync responds by executing the user-specified -command line.</FONT></P> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B></FONT> -<FONT FACE="Tahoma, sans-serif">(Real time synchronization - in -combination with FreeFileSync)</FONT></P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">First -start up RealtimeSync.exe located in FreeFileSync's installation -directory. Then specify all directories that shall be monitored. -Instead of doing this manually you can simply import a </FONT><FONT FACE="Courier New, monospace">*.ffs_batch</FONT> -<FONT FACE="Tahoma, sans-serif">file via </FONT><FONT FACE="Tahoma, sans-serif"><I>Menu --> File -> Load configuration</I></FONT><FONT FACE="Tahoma, sans-serif">. -This not only extracts all directories relevant for synchronization -but also sets up the command-line to execute the </FONT><FONT FACE="Courier New, monospace">*.ffs_batch</FONT> -<FONT FACE="Tahoma, sans-serif">file each time changes are detected. -Now press "</FONT><FONT FACE="Tahoma, sans-serif"><I>Start</I></FONT><FONT FACE="Tahoma, sans-serif">" -to begin monitoring.</FONT></P> -<UL> - <P STYLE="margin-bottom: 0cm"><IMG SRC="rts23.png" NAME="Grafik3" ALIGN=MIDDLE WIDTH=503 HEIGHT=429 BORDER=0></P> -</UL> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<UL> - <P><SPAN ID="Rahmen3" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff"> - <UL> - <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note:</B></FONT></P> - <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Tahoma, sans-serif">The command-line must <B>NOT</B> - <B>block</B> the progress. If a FreeFileSync batch file is called - make sure it is operating in "silent-mode" and "error - handling” is set to "ignore errors" or "exit - instantly<U>"</U>.</FONT></P> - <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Tahoma, sans-serif">The settings dialog can be skipped - by passing a RealtimeSync configuration file (<FONT FACE="Courier New, monospace">*.ffs_real</FONT>) - OR a FreeFileSync batch file (<FONT FACE="Courier New, monospace">*.ffs_batch</FONT>) - as first command-line argument to RealtimeSync.exe. This allows - for integration with the operating system's auto start facility.</FONT></P> - <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Tahoma, sans-serif">Using RealtimeSync is not - restricted to starting FreeFileSync. It can also be used in other - scenarios, like sending an email whenever a certain directory is - modified.</FONT></P> - <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Tahoma, sans-serif">If you schedule a Windows batch - file (.bat, .cmd), see notes in <A HREF="Batch%20Scripting.html">Batch - Scripting</A>.</FONT></P> - </UL> - </SPAN><BR CLEAR=LEFT> - </P> -</UL> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<UL> - <P><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> - <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Courier New, monospace">"C:\Program - Files\FreeFileSync\RealtimeSync.exe" - "C:\MyConfig.ffs_real"<BR>"C:\Program - Files\FreeFileSync\RealtimeSync.exe" "C:\SyncJob.ffs_batch"</FONT></P> - </SPAN><BR CLEAR=LEFT> - </P> -</UL> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B></FONT> -<FONT FACE="Tahoma, sans-serif">(Automatic synchronization when USB -stick is inserted)</FONT></P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Assume -you have multiple USB sticks that contain data you want to -automatically synchronize whenever you insert one of the sticks into -the PC. Save the relevant configuration on each USB stick's root -directory to have it called when the stick is mounted. Then configure -RealtimeSync analog to the following:</FONT></P> -<UL> - <P><IMG SRC="rts.png" NAME="Grafik2" ALIGN=BOTTOM WIDTH=462 HEIGHT=411 BORDER=0></P> -</UL> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Whenever -directory "</FONT><FONT FACE="Courier New, monospace">H:\Data</FONT><FONT FACE="Tahoma, sans-serif">" -becomes available, the command-line executes and starts the batch job -whose configuration is located on the stick. Furthermore it also -starts the batch job each time files are modified in "</FONT><FONT FACE="Courier New, monospace">H:\Data</FONT><FONT FACE="Tahoma, sans-serif">". -</FONT> -</P> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B></FONT> -<FONT FACE="Tahoma, sans-serif">(Calling a custom .cmd or .bat file)</FONT></P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">For -additional convenience it may be nice if the batch job remains silent -if synchronization completes successfully, otherwise shows -FreeFileSync's GUI dialog when errors occurred. Therefore create two -configurations, one silent-mode batch to be called by default and one -<FONT FACE="Courier New, monospace">*.ffs_gui</FONT> to be called -when former fails. Then replace the command-line to simply execute a -batch file similar to this one:</FONT></P> -<UL> - <P><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> - <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::first - check whether USB-stick contains a sync-configuration at all</B></I></FONT></FONT><FONT FACE="Courier New, monospace"><BR>@if - exist "H:\Silent_Config.ffs_batch" (<BR></FONT><FONT COLOR="#808080"> </FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::configuration - found, now execute the synchronization batch job</B></I></FONT></FONT><FONT FACE="Courier New, monospace"><BR></FONT><FONT COLOR="#808080"> </FONT><FONT FACE="Courier New, monospace">"C:\Program - Files\FreeFileSync\FreeFileSync.exe" - "H:\Silent_Config.ffs_batch"<BR></FONT><FONT COLOR="#808080"> </FONT><FONT FACE="Courier New, monospace">@if - not errorlevel 0 (<BR></FONT><FONT COLOR="#808080"> </FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::if - something went wrong, start FreeFileSync in GUI - mode</B></I></FONT></FONT><FONT FACE="Courier New, monospace"><BR></FONT><FONT COLOR="#808080"> </FONT><FONT FACE="Courier New, monospace">"C:\Program - Files\FreeFileSync\FreeFileSync.exe" - "H:\GUI_Config.ffs_gui"<BR></FONT><FONT COLOR="#808080"> </FONT><FONT FACE="Courier New, monospace">)<BR>)</FONT></P> - </SPAN><BR CLEAR=LEFT> - </P> -</UL> -</BODY> -</HTML>
\ No newline at end of file diff --git a/BUILD/Help/html/advanced/ScheduleBatch.html b/BUILD/Help/html/advanced/ScheduleBatch.html deleted file mode 100644 index c7b163c9..00000000 --- a/BUILD/Help/html/advanced/ScheduleBatch.html +++ /dev/null @@ -1,75 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<HTML> -<HEAD> - <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"> - <TITLE></TITLE> - <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> - <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20101128;12534500"> - <STYLE TYPE="text/css"> - <!-- - @page { margin: 2cm } - P { margin-bottom: 0.21cm } - H3 { margin-bottom: 0.21cm } - H3.western { font-family: "Arial", sans-serif } - H3.cjk { font-family: "MS Mincho" } - H3.ctl { font-family: "Mangal" } - A:link { so-language: zxx } - --> - </STYLE> -</HEAD> -<BODY LANG="de-DE" DIR="LTR"> -<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Schedule Batch -Job in Windows Task Planner <SPAN STYLE="font-weight: normal">(Windows -XP)</SPAN></FONT></H3> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<OL> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Create - a new batch job via FreeFileSync's main - dialog:<BR><I>Menu->Advanced->Create batch job</I> and save - it, for example, as "<FONT FACE="Courier New, monospace">C:\SyncJob.ffs_batch</FONT>".</FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Make - sure you enable checkbox "<I>Silent mode</I>" to prevent - showing a status dialog at the end of the process.</FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">If - you want to avoid error or warning popup messages from stopping the - process set "<I>Error handling</I>" to either "<I>Exit - instantly</I>" or "<I>Ignore errors</I>".</FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Start - Windows Task Scheduler: Go to <I>Start->Control Panel->Scheduled - Tasks</I> and select "<I>Add Scheduled Task</I>".</FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Follow - the wizard and choose "<FONT FACE="Courier New, monospace">C:\SyncJob.ffs_batch</FONT>" - as program to run.</FONT></P> - <UL> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">If - you are using the locally installed version of FreeFileSync, - </FONT><FONT FACE="Courier New, monospace">*.ffs_batch</FONT> <FONT FACE="Tahoma, sans-serif">files - are automatically associated with the tool and field "</FONT><FONT FACE="Tahoma, sans-serif"><I>Run:</I></FONT><FONT FACE="Tahoma, sans-serif">" - can be directly filled with the filename:<BR>"</FONT><FONT FACE="Courier New, monospace">C:\SyncJob.ffs_batch</FONT><FONT FACE="Tahoma, sans-serif">"<BR><IMG SRC="ScheduleBatch_html_372f0f3.gif" NAME="Grafik1" ALIGN=BOTTOM WIDTH=406 HEIGHT=455 BORDER=0></FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">If - file associations have not been set (portable installation),</FONT> - "<FONT FACE="Tahoma, sans-serif"><I>Run:</I></FONT><FONT FACE="Tahoma, sans-serif">" - has to be prefixed with the - executable:<BR>"</FONT><FONT FACE="Courier New, monospace">D:\FreeFileSync\FreeFileSync.exe" - "C:\SyncJob.ffs_batch</FONT><FONT FACE="Tahoma, sans-serif">"<BR><IMG SRC="ScheduleBatch_html_m10bf0d36.gif" NAME="Grafik2" ALIGN=BOTTOM WIDTH=406 HEIGHT=455 BORDER=0></FONT></P> - </UL> -</OL> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff"> - <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Tahoma, sans-serif"><B>Note:</B></FONT><FONT FACE="Tahoma, sans-serif"><BR>Beginning - with Windows Vista, the command always needs to be prefixed with the - executable even if file associations are set:<BR></FONT>→ - <FONT FACE="Tahoma, sans-serif">"</FONT><FONT FACE="Courier New, monospace">D:\FreeFileSync\FreeFileSync.exe" - "C:\SyncJob.ffs_batch<BR></FONT><FONT FACE="Tahoma, sans-serif">Else - the task will return with error code 0xC1, "%1 is not a valid - Win32 application".</FONT></P> -</SPAN><BR CLEAR=LEFT><BR> -</P> -</BODY> -</HTML>
\ No newline at end of file diff --git a/BUILD/Help/html/advanced/ScheduleBatch_html_m10bf0d36.gif b/BUILD/Help/html/advanced/ScheduleBatch_html_m10bf0d36.gif Binary files differdeleted file mode 100644 index ed8f077f..00000000 --- a/BUILD/Help/html/advanced/ScheduleBatch_html_m10bf0d36.gif +++ /dev/null diff --git a/BUILD/Help/html/advanced/SymbolicLinks.html b/BUILD/Help/html/advanced/SymbolicLinks.html deleted file mode 100644 index 1914f953..00000000 --- a/BUILD/Help/html/advanced/SymbolicLinks.html +++ /dev/null @@ -1,76 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<HTML> -<HEAD> - <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"> - <TITLE></TITLE> - <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> - <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20100902;19130700"> - <META NAME="Info 1" CONTENT=""> - <META NAME="Info 2" CONTENT=""> - <META NAME="Info 3" CONTENT=""> - <META NAME="Info 4" CONTENT=""> - <STYLE TYPE="text/css"> - <!-- - @page { margin: 2cm } - P { margin-bottom: 0.21cm } - H3 { margin-bottom: 0.21cm } - H3.western { font-family: "Arial", sans-serif } - H3.cjk { font-family: "MS Mincho" } - H3.ctl { font-family: "Mangal" } - A:link { so-language: zxx } - --> - </STYLE> -</HEAD> -<BODY LANG="en-US" DIR="LTR"> -<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Symbolic link -handling <SPAN STYLE="font-weight: normal">(Windows since Vista and -Linux)</SPAN></FONT></H3> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">FreeFileSync -offers three advanced options to configure processing of Symbolic -Links (also called Symlinks or Soft Links):</FONT></P> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<UL> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">"</FONT><FONT FACE="Tahoma, sans-serif"><I>Ignore</I></FONT><FONT FACE="Tahoma, sans-serif">" - excludes Symbolic Links while scanning the input directories.<BR></FONT> </P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">"Direct" - configures synchronization of the Symbolic Link object itself and - not its target. Symbolic Links will be visible on main grid as a - separate entity with corresponding meta data. Links pointing to - directories are not traversed and the Link object is copied directly - during synchronization. <BR></FONT> </P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">"<I>Follow</I>" - dereferences Symbolic Links, i.e. they are treated like their target - objects. Links pointing to directories are traversed like ordinary - folders and the target of each Link is copied during - synchronization.</FONT></P> -</UL> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><IMG SRC="CmpSettings.png" NAME="Grafik1" ALIGN=BOTTOM BORDER=0></P> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff"> - <P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Tahoma, sans-serif"><B>Note:</B></FONT></P> - <UL> - <LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">In - Windows the options described above always apply to </FONT><FONT FACE="Tahoma, sans-serif"><I>"Reparse - Points"</I></FONT><FONT FACE="Tahoma, sans-serif">. Reparse - Points are a more general concept including for example Symbolic - Links, Junctions and Mount Points. The term </FONT><FONT FACE="Tahoma, sans-serif"><I>"Symbolic - Link" </I></FONT><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-style: normal">has - been retained nevertheless for harmonization with Linux.</SPAN></FONT></P> - <LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm; font-style: normal"><FONT FACE="Tahoma, sans-serif">Copying - Symbolic Links requires the application to be started with - Administrator rights.</FONT></P> - </UL> -</SPAN><BR CLEAR=LEFT><BR> -</P> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -</BODY> -</HTML>
\ No newline at end of file diff --git a/BUILD/Help/html/advanced/VariableDrive.html b/BUILD/Help/html/advanced/VariableDrive.html deleted file mode 100644 index c9232acb..00000000 --- a/BUILD/Help/html/advanced/VariableDrive.html +++ /dev/null @@ -1,73 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> -<HTML> -<HEAD> - <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252"> - <TITLE></TITLE> - <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)"> - <META NAME="CREATED" CONTENT="20091206;16574000"> - <META NAME="CHANGED" CONTENT="20110419;15293700"> - <STYLE TYPE="text/css"> - <!-- - @page { margin: 2cm } - P { margin-bottom: 0.21cm } - H3 { margin-bottom: 0.21cm } - H3.western { font-family: "Arial", sans-serif } - H3.cjk { font-family: "MS Mincho" } - H3.ctl { font-family: "Mangal" } - A:link { so-language: zxx } - --> - </STYLE> -</HEAD> -<BODY LANG="de-DE" DIR="LTR"> -<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Synchronize USB -sticks with variable drive letters</FONT></H3> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">USB -sticks often get different volume names assigned when plugged into -distinct computers. FreeFileSync offers two solutions to handle this -issue:</FONT></P> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Option -1</B><B>: </B>Specify a directory via volume name: Syntax: [<volume -name>]\<path></FONT></P> -<UL> - <P><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> - <UL> - <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Use - "<FONT FACE="Courier New, monospace">[ZenJu-USB]\directory</FONT>" - instead of "<FONT FACE="Courier New, monospace">E:\directory</FONT>" - where "<FONT FACE="Courier New, monospace">ZenJu-USB</FONT>" - is the name of the USB stick.</FONT></P> - </UL> - </SPAN><BR CLEAR=LEFT> - </P> -</UL> -<P STYLE="margin-bottom: 0cm"><BR> -</P> -<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Option -2</B></FONT><FONT FACE="Tahoma, sans-serif"><B>: </B></FONT><FONT FACE="Tahoma, sans-serif">Use -a relative directory name:</FONT></P> -<UL> - <P><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6"> - <UL> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Use - "</FONT><FONT FACE="Courier New, monospace">\directory</FONT><FONT FACE="Tahoma, sans-serif">" - instead of "</FONT><FONT FACE="Courier New, monospace">E:\directory</FONT><FONT FACE="Tahoma, sans-serif">"</FONT></P> - <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Save - and copy synchronization settings to the USB stick: - "</FONT><FONT COLOR="#000000"><FONT FACE="Courier New, monospace"><FONT SIZE=3>E:\settings.ffs_gui"</FONT></FONT></FONT></P> - <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"> - <FONT FACE="Tahoma, sans-serif">Start FreeFileSync by - double-clicking on "<FONT FACE="Courier New, monospace">E:\settings.ffs_gui</FONT>"<BR>→ - Working directory is automatically set to "<FONT FACE="Courier New, monospace">E:\</FONT>" - by the operating system so that "<FONT FACE="Courier New, monospace">\directory</FONT>" - is resolved as "<FONT FACE="Courier New, monospace">E:\directory</FONT>" - during synchronization.</FONT></P> - </UL> - </SPAN><BR CLEAR=LEFT> - </P> -</UL> -</BODY> -</HTML>
\ No newline at end of file diff --git a/BUILD/Help/html/advanced/rts.png b/BUILD/Help/html/advanced/rts.png Binary files differdeleted file mode 100644 index 8462d0e0..00000000 --- a/BUILD/Help/html/advanced/rts.png +++ /dev/null diff --git a/BUILD/Help/html/advanced/rts23.png b/BUILD/Help/html/advanced/rts23.png Binary files differdeleted file mode 100644 index 9cda186d..00000000 --- a/BUILD/Help/html/advanced/rts23.png +++ /dev/null diff --git a/BUILD/Help/html/main.png b/BUILD/Help/html/main.png Binary files differdeleted file mode 100644 index 6ad6b030..00000000 --- a/BUILD/Help/html/main.png +++ /dev/null diff --git a/BUILD/Help/html/overview_html_m7391eb10.gif b/BUILD/Help/html/overview_html_m7391eb10.gif Binary files differdeleted file mode 100644 index d5831a44..00000000 --- a/BUILD/Help/html/overview_html_m7391eb10.gif +++ /dev/null diff --git a/BUILD/Help/html/overview_html_mbb6ab4a.gif b/BUILD/Help/html/overview_html_mbb6ab4a.gif Binary files differdeleted file mode 100644 index 499b00bd..00000000 --- a/BUILD/Help/html/overview_html_mbb6ab4a.gif +++ /dev/null diff --git a/BUILD/Help/html/rtsicon.png b/BUILD/Help/html/rtsicon.png Binary files differnew file mode 100644 index 00000000..dabaa256 --- /dev/null +++ b/BUILD/Help/html/rtsicon.png diff --git a/BUILD/Help/html/advanced/scheduleBatch_html_13615436.gif b/BUILD/Help/html/scheduleBatch_html_13615436.gif Binary files differindex 23d7bda9..23d7bda9 100644 --- a/BUILD/Help/html/advanced/scheduleBatch_html_13615436.gif +++ b/BUILD/Help/html/scheduleBatch_html_13615436.gif diff --git a/BUILD/Help/html/advanced/scheduleBatch_html_28bb3203.gif b/BUILD/Help/html/scheduleBatch_html_28bb3203.gif Binary files differindex 45c8b1c2..45c8b1c2 100644 --- a/BUILD/Help/html/advanced/scheduleBatch_html_28bb3203.gif +++ b/BUILD/Help/html/scheduleBatch_html_28bb3203.gif diff --git a/BUILD/Help/html/advanced/scheduleBatch_html_m22c860a2.gif b/BUILD/Help/html/scheduleBatch_html_m22c860a2.gif Binary files differindex 1f8da914..1f8da914 100644 --- a/BUILD/Help/html/advanced/scheduleBatch_html_m22c860a2.gif +++ b/BUILD/Help/html/scheduleBatch_html_m22c860a2.gif diff --git a/BUILD/Help/html/ubuntuScheduler.png b/BUILD/Help/html/ubuntuScheduler.png Binary files differnew file mode 100644 index 00000000..82bf329f --- /dev/null +++ b/BUILD/Help/html/ubuntuScheduler.png diff --git a/BUILD/Help/html/win7scheduler.png b/BUILD/Help/html/win7scheduler.png Binary files differnew file mode 100644 index 00000000..29fa1f36 --- /dev/null +++ b/BUILD/Help/html/win7scheduler.png diff --git a/BUILD/Languages/chinese_simple.lng b/BUILD/Languages/chinese_simple.lng index a0f44b7b..72707f4d 100644 --- a/BUILD/Languages/chinese_simple.lng +++ b/BUILD/Languages/chinese_simple.lng @@ -8,75 +8,116 @@ </header> <source>Searching for directory %x...</source> -<target></target> +<target>æ£åœ¨æœç´¢ç›®å½• %x...</target> + <source>Show in Explorer</source> <target>在Explorerä¸æ˜¾ç¤º</target> + <source>Open with default application</source> <target>用默认应用软件打开</target> + <source>Browse directory</source> <target>æµè§ˆç›®å½•</target> + <source>RealtimeSync - Automated Synchronization</source> <target>实时åŒæ¥ - 自动åŒæ¥</target> + <source>Browse</source> <target>æµè§ˆ</target> -<source>Invalid commandline: %x</source> -<target>éžæ³•å‘½ä»¤è¡Œ:%x</target> + +<source>Invalid command line: %x</source> +<target>æ— æ•ˆçš„å‘½ä»¤è¡Œ: %x</target> + <source>Error resolving symbolic link:</source> <target>解决符å·é“¾æŽ¥å‡ºé”™:</target> -<source>Show popup</source> -<target>显示弹出窗å£</target> -<source>Show popup on errors or warnings</source> -<target>在错误或è¦å‘Šæ—¶æ˜¾ç¤ºå¼¹å‡ºçª—å£</target> + +<source>Show pop-up</source> +<target>显示弹出对è¯æ¡†</target> + +<source>Show pop-up on errors or warnings</source> +<target>在错误或è¦å‘Šæ—¶æ˜¾ç¤ºå¼¹å‡ºå¯¹è¯æ¡†</target> + <source>Ignore errors</source> <target>忽略错误</target> + <source>Hide all error and warning messages</source> <target>éšè—所有错误与è¦å‘Šä¿¡æ¯</target> + <source>Exit instantly</source> <target>ç«‹å³é€€å‡º</target> + <source>Abort synchronization immediately</source> <target>ç«‹å³ä¸æ¢åŒæ¥</target> + +<source>Select alternate comparison settings</source> +<target>选择替æ¢çš„比较设置</target> + <source>Select alternate synchronization settings</source> <target>选择替æ¢åŒæ¥è®¾ç½®</target> + <source>No filter selected</source> <target>没有选定过滤器</target> + <source>Filter is active</source> <target>过滤器已激活</target> -<source>Clear filter settings</source> -<target>清除过滤器设置</target> + <source>Remove alternate settings</source> <target>移除替æ¢è®¾ç½®</target> + +<source>Clear filter settings</source> +<target>清除过滤器设置</target> + <source>Create a batch job</source> <target>创建一个批处ç†ä½œä¸š</target> + <source>Synchronization settings</source> <target>åŒæ¥è®¾ç½®</target> + <source>Comparison settings</source> <target>比较设置</target> + <source>About</source> <target>关于</target> + <source>Error</source> <target>错误</target> + <source>Warning</source> <target>è¦å‘Š</target> + <source>Question</source> <target>问题</target> + <source>Confirm</source> <target>确认</target> + <source>Configure filter</source> <target>é…置过滤</target> + <source>Customize columns</source> <target>自定义æ </target> + <source>Global settings</source> <target>全局设置</target> + <source>Synchronization Preview</source> <target>åŒæ¥é¢„览</target> + <source>Find</source> <target>查找</target> + +<source>Select time span</source> +<target>选择时间跨度</target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -84,46 +125,64 @@ <target> <pluralform>%x å—节</pluralform> </target> + <source><Symlink></source> <target><符å·è¿žæŽ¥></target> + <source><Directory></source> <target><目录></target> + <source>Size</source> <target>大å°</target> + <source>Date</source> <target>日期</target> + <source>Full path</source> <target>完整路径</target> + <source>Filename</source> <target>文件å</target> + <source>Relative path</source> <target>相对路径</target> + <source>Directory</source> <target>目录</target> + <source>Extension</source> <target>扩展å</target> + <source>Comparison Result</source> <target>比较结果</target> + <source>Incompatible synchronization database format:</source> <target>ä¸å…¼å®¹çš„åŒæ¥æ•°æ®åº“æ ¼å¼:</target> + <source>Initial synchronization:</source> <target>åˆå§‹åŒ–åŒæ¥:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>FreeFileSyncæ•°æ®åº“文件其ä¸ä¸€ä¸ªä¸å˜åœ¨:</target> + <source>Error reading from synchronization database:</source> <target>从åŒæ¥æ•°æ®åº“ä¸è¯»å–时出错:</target> + <source>Database files do not share a common synchronization session:</source> -<target></target> +<target>æ•°æ®åº“文件没ä¸å…±äº«ä¸€ä¸ªå…¬å…±çš„åŒæ¥æ®µ</target> + <source>An exception occurred!</source> <target>å‘生异常!</target> -<source>Error deleting file:</source> -<target>åˆ é™¤æ–‡ä»¶å‡ºé”™:</target> + <source>Error reading file attributes:</source> <target>读å–文件属性出错:</target> + <source>Waiting while directory is locked (%x)...</source> <target>由于目录已é”定而æ£åœ¨ç‰å¾…(%x)...</target> + <source>Error setting directory lock:</source> <target>设置目录é”定时出错:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -131,27 +190,39 @@ <target> <pluralform>%x 秒</pluralform> </target> + <source>Info</source> <target>ä¿¡æ¯</target> + <source>Fatal Error</source> <target>致命错误</target> + <source>Scanning:</source> <target>扫æä¸:</target> + <source>Encoding extended time information: %x</source> <target>æ£åœ¨ç¼–ç 扩展时间信æ¯:%x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> -<target></target> +<target> +<pluralform>[%x 线程]</pluralform> +</target> + <source>Invalid FreeFileSync config file!</source> <target>æ— æ•ˆçš„ FreeFileSync é…置文件!</target> + <source>File does not exist:</source> <target>文件ä¸å˜åœ¨:</target> + <source>Error parsing configuration file:</source> <target>分æžé…置文件出错:</target> + <source>/sec</source> <target>/秒</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -159,6 +230,7 @@ <target> <pluralform>%x 分</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -166,6 +238,7 @@ <target> <pluralform>%x å°æ—¶</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -173,28 +246,40 @@ <target> <pluralform>%x 天</pluralform> </target> + <source>S&ave configuration...</source> <target>ä¿å˜é…ç½®(&A)...</target> + <source>&Load configuration...</source> <target>åŠ è½½é…ç½®(&L)...</target> + <source>&Quit</source> <target>退出(&Q)</target> + <source>&File</source> <target>文件(&F)</target> + <source>&Content</source> <target>内容(&C)</target> + <source>&About...</source> <target>关于(&A)...</target> + <source>&Help</source> <target>帮助(&H)</target> + <source>Usage:</source> <target>用法:</target> + <source>1. Select directories to monitor.</source> <target>1. 选择è¦ç›‘视的目录.</target> + <source>2. Enter a command line.</source> <target>2. 输入一个命令行.</target> + <source>3. Press 'Start'.</source> <target>3. 点击'开始'.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -205,310 +290,461 @@ The command line is executed each time: - 所有目录转为å¯ç”¨çŠ¶æ€(例如æ’å…¥U盘) - 目录或å目录里的文件被修改 </target> + <source>Directories to watch</source> <target>è¦ç›‘视的目录</target> + <source>Add folder</source> <target>æ·»åŠ æ–‡ä»¶å¤¹</target> + <source>Remove folder</source> <target>åˆ é™¤æ–‡ä»¶å¤¹</target> + <source>Select a folder</source> <target>选择一个文件夹</target> + <source>Command line</source> <target>命令行</target> + <source>Minimum Idle Time [seconds]</source> <target>最å°ç©ºé—²æ—¶é—´[秒]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>以秒计的最åŽå˜æ›´å’Œæ‰§è¡Œå‘½ä»¤è¡Œä¹‹é—´çš„空闲时间</target> + <source>Start</source> <target>开始</target> + <source>(Build: %x)</source> <target>(Build: %x)</target> + <source>RealtimeSync configuration</source> <target>实时åŒæ¥é…ç½®</target> + <source>File already exists. Overwrite?</source> <target>文件已ç»å˜åœ¨.覆盖?</target> + <source>&Restore</source> <target>æ¢å¤(&R)</target> + <source>&Exit</source> <target>退出(&E)</target> + <source>Monitoring active...</source> <target>监视激活...</target> + <source>Waiting for missing directories...</source> <target>æ£åœ¨ç‰å¾…丢失的目录...</target> + <source>A directory input field is empty.</source> <target>有一个目录输入å—段是空的.</target> + <source>Drag && drop</source> <target>拖放</target> + <source>Could not initialize directory monitoring:</source> <target>ä¸èƒ½åˆå§‹åŒ–目录监视:</target> + <source>Error when monitoring directories.</source> <target>监视目录时出错.</target> + <source>Conversion error:</source> <target>转æ¢é”™è¯¯:</target> + +<source>Error deleting file:</source> +<target>åˆ é™¤æ–‡ä»¶å‡ºé”™:</target> + <source>Error moving file:</source> <target>移动文件时出错:</target> + <source>Target file already existing!</source> <target>ç›®æ ‡æ–‡ä»¶å·²ç»å˜åœ¨!</target> + <source>Error moving directory:</source> <target>移动目录时出错:</target> + <source>Target directory already existing!</source> <target>ç›®æ ‡ç›®å½•å·²ç»å˜åœ¨!</target> + <source>Error deleting directory:</source> <target>åˆ é™¤ç›®å½•å‡ºé”™:</target> + <source>Error changing modification time:</source> <target>改å˜ä¿®æ”¹æ—¶é—´æ—¶å‡ºé”™:</target> + <source>Error loading library function:</source> <target>åŠ è½½åº“å‡½æ•°å‡ºé”™:</target> + <source>Error reading security context:</source> <target>读å–安全上下文时出错:</target> + <source>Error writing security context:</source> <target>写入安全上下文时出错:</target> + <source>Error copying file permissions:</source> <target>å¤åˆ¶æ–‡ä»¶æƒé™æ—¶å‡ºé”™:</target> + <source>Error creating directory:</source> <target>创建目录出错:</target> + <source>Error copying symbolic link:</source> <target>å¤åˆ¶ç¬¦å·é“¾æŽ¥æ—¶å‡ºé”™:</target> + <source>Error copying file:</source> <target>å¤åˆ¶æ–‡ä»¶å‡ºé”™:</target> + <source>Error opening file:</source> <target>打开文件出错:</target> + <source>Error writing file:</source> <target>写入文件出错:</target> + <source>Error reading file:</source> <target>读å–文件出错:</target> + <source>Operation aborted!</source> <target>æ“作已å–消!</target> + +<source>Could not load a required DLL:</source> +<target>ä¸èƒ½åŠ 载所需的动æ€è¿žæŽ¥åº“:</target> + <source>Endless loop when traversing directory:</source> <target>éåŽ†ç›®å½•æ—¶å‡ºçŽ°æ— é™å¾ªçŽ¯:</target> + <source>Error traversing directory:</source> <target>é历目录出错:</target> + <source>Windows Error Code %x:</source> <target>Windows错误代ç %x:</target> + <source>Linux Error Code %x:</source> <target>Linux错误代ç %x:</target> + <source>Error setting privilege:</source> <target>设置æƒé™æ—¶å‡ºé”™:</target> + <source>Error moving to Recycle Bin:</source> <target>移动到回收站出错:</target> -<source>Could not load a required DLL:</source> -<target>ä¸èƒ½åŠ 载所需的动æ€è¿žæŽ¥åº“:</target> + <source>Error writing to synchronization database:</source> <target>å‘åŒæ¥æ•°æ®åº“ä¸å†™å…¥æ—¶å‡ºé”™:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>å¯åŠ¨å·å½±å¤åˆ¶æœåŠ¡æ—¶å‡ºé”™!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target>使用å·å½±å¤åˆ¶æœåŠ¡æ—¶å‡ºé”™!</target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>ä¸æ”¯æŒåœ¨WOW64上使用å·å½±å¤åˆ¶. 请使用 FreeFileSync 64ä½ç‰ˆæœ¬.</target> + <source>Could not determine volume name for file:</source> <target>ä¸èƒ½ç¡®å®šæ¤æ–‡ä»¶çš„å·å称:</target> + <source>Volume name %x not part of filename %y!</source> <target>å·å %x 并éžæ–‡ä»¶å %y 的一部分!</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>ä¸èƒ½ä»Žå¦‚下XML节点读å–数值:</target> + <source>Logging</source> <target>记录</target> + <source>FreeFileSync batch file</source> <target>FreeFileSync 批处ç†æ–‡ä»¶</target> + <source>FreeFileSync configuration</source> <target>FreeFileSync é…ç½®</target> + <source>FreeFileSync Batch Job</source> <target>FreeFileSync 批处ç†ä½œä¸š</target> + <source>Unable to create logfile!</source> <target>æ— æ³•åˆ›å»ºæ—¥å¿—!</target> + <source>Batch execution</source> <target>批处ç†æ‰§è¡Œ</target> + <source>Log-messages:</source> <target>日志信æ¯:</target> + <source>Stop</source> <target>åœæ¢</target> + <source>Total time:</source> <target>总共时间:</target> + <source>Synchronization aborted!</source> <target>åŒæ¥å·²æ”¾å¼ƒ!</target> + <source>Synchronization completed with errors!</source> <target>åŒæ¥å·²å®Œæˆä½†æœ‰é”™è¯¯.</target> + <source>Synchronization completed successfully!</source> <target>åŒæ¥æˆåŠŸå®Œæˆ!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>按"切æ¢"å¯æ‰“å¼€FreeFileSync图形用户界é¢æ¨¡å—.</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>切æ¢è‡³FreeFileSync图形用户界é¢æ¨¡å—...</target> + <source>Unable to connect to sourceforge.net!</source> <target>æ— æ³•é“¾æŽ¥åˆ° Sourceforge.net!</target> + <source>A newer version of FreeFileSync is available:</source> <target>FreeFileSync 有新版å¯ç”¨:</target> + <source>Download now?</source> <target>ç«‹å³ä¸‹è½½?</target> + <source>Information</source> <target>ä¿¡æ¯</target> + <source>FreeFileSync is up to date!</source> <target>FreeFileSync 已是最新!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>è¦è®© FreeFileSync ä¿æŒæ¯å‘¨æ£€æŸ¥ä¸€æ¬¡æ›´æ–°å—?></target> + <source>(Requires an Internet connection!)</source> <target>(需è¦å› 特网连接!)</target> + <source>1. &Compare</source> <target>1. 比较(&C)</target> + <source>2. &Synchronize...</source> <target>2. åŒæ¥(&S)...</target> + <source>S&witch view</source> <target>切æ¢è§†å›¾(&W)</target> + <source>&New</source> <target>新建(&N)</target> + <source>&Program</source> <target>程åº(&P)</target> + <source>&Language</source> <target>切æ¢è¯è¨€(&L)</target> + <source>&Global settings...</source> <target>全局设置(&G)...</target> + <source>&Create batch job...</source> <target>创建批处ç†ä½œä¸š(&C)...</target> + <source>&Export file list...</source> <target>导出文件列表(&E)...</target> + <source>&Advanced</source> <target>高级(&A)</target> + <source>&Check for new version</source> <target>检查更新(&C)</target> + <source>Compare</source> <target>比较</target> + <source>Compare both sides</source> <target>比较两侧</target> + <source>&Abort</source> <target>å–消(&A)</target> + <source>Synchronize...</source> <target>åŒæ¥...</target> + <source>Start synchronization</source> <target>开始åŒæ¥</target> -<source>Swap sides</source> -<target>两侧互æ¢</target> + <source>Add folder pair</source> <target>æ·»åŠ æˆå¯¹æ–‡ä»¶å¤¹</target> + <source>Remove folder pair</source> <target>åˆ é™¤æ–‡ä»¶å¤¹å¯¹</target> + +<source>Swap sides</source> +<target>两侧互æ¢</target> + <source>Save current configuration to file</source> <target>ä¿å˜å½“å‰é…置到文件</target> + <source>Load configuration from file</source> <target>ä»Žæ–‡ä»¶åŠ è½½é…ç½®</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>最åŽä½¿ç”¨çš„é…ç½®(按DEL键将其从列表ä¸ç§»é™¤)</target> + <source>Hide excluded items</source> <target>éšè—已排除的项目</target> + <source>Hide filtered or temporarily excluded files</source> <target>éšè—已过滤或临时排除的文件</target> + <source>Number of files and directories that will be created</source> <target>一些文件和目录将被创建</target> + <source>Number of files that will be overwritten</source> <target>一些文件和目录将被覆盖</target> + <source>Number of files and directories that will be deleted</source> <target>ä¸€äº›æ–‡ä»¶å’Œç›®å½•å°†è¢«åˆ é™¤</target> + <source>Total amount of data that will be transferred</source> <target>将被转移的总数æ®</target> -<source>Left</source> -<target>左侧</target> -<source>Right</source> -<target>å³ä¾§</target> + <source>Batch job</source> <target>批处ç†ä½œä¸š</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>为自动åŒæ¥åˆ›å»ºä¸€ä¸ªæ‰¹å¤„ç†. è¦å¼€å§‹æ‰¹å¤„ç†æ¨¡å¼åªéœ€ç®€å•åœ°åŒå‡»æ‰¹å¤„ç†æ–‡ä»¶æˆ–通过命令行执行:FreeFileSync.exe <批处ç†æ–‡ä»¶å>. æ¤å¤–还å¯ä»¥é€šè¿‡æ“作系统的计划任务æ¥å®šæ—¶æ‰§è¡Œ.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target>创建一个用于自动åŒæ¥çš„批处ç†æ–‡ä»¶. è¦å¼€å§‹æ‰¹å¤„ç†æ¨¡å¼åªéœ€ç®€å•åœ°åŒå‡»æ¤æ–‡ä»¶æˆ–通过命令行执行: FreeFileSync.exe <ffs_batch 文件>. æ¤æ–‡ä»¶è¿˜å¯ä»¥ç”¨äºŽä½ æ“作系统的计划任务ä¸.</target> + <source>Help</source> <target>帮助</target> + <source>Filter files</source> <target>过滤文件</target> + <source>Error handling</source> <target>错误处ç†</target> + +<source>Left</source> +<target>左侧</target> + +<source>Right</source> +<target>å³ä¾§</target> + <source>Overview</source> <target>摘è¦</target> + <source>Status feedback</source> <target>状况å馈</target> + <source>Run minimized</source> -<target></target> +<target>以最å°åŒ–è¿è¡Œ</target> + <source>Maximum number of logfiles:</source> <target>最大的日志文件数:</target> + <source>Select logfile directory:</source> <target>选择日志ä¿å˜ä½ç½®:</target> + <source>Batch settings</source> -<target></target> +<target>批处ç†è®¾ç½®</target> + <source>&Save</source> <target>ä¿å˜(&S)</target> + <source>&Load</source> <target>åŠ è½½(&L)</target> + <source>&Cancel</source> <target>å–消(&C)</target> + <source>Elements found:</source> <target>å·²æ‰¾åˆ°çš„å…ƒç´ :</target> + <source>Elements remaining:</source> <target>å‰©ä½™çš„å…ƒç´ :</target> + <source>Speed:</source> <target>速度:</target> + <source>Time remaining:</source> <target>剩余时间:</target> + <source>Time elapsed:</source> <target>已用时间:</target> + <source>Operation:</source> <target>æ“作:</target> + <source>Select variant:</source> <target>选择å˜åŒ–çš„:</target> + <source><Automatic></source> <target><自动></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>使用数æ®åº“æ¥è¯†åˆ«å’Œä¼ é€ä¸¤è¾¹çš„改å˜. è‡ªåŠ¨æ£€æµ‹åˆ é™¤å’Œå†²çªçŠ¶æ€.</target> + <source>Mirror ->></source> <target>é•œåƒ ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>é•œåƒå¤‡ä»½å·¦è¾¹çš„文件夹.åŒæ¥åŽå³è¾¹çš„文件夹被修改为和左边文件夹精确匹é….</target> + <source>Update -></source> <target>æ›´æ–° -></target> + <source>Copy new or updated files to right folder.</source> <target>å¤åˆ¶æ–°çš„或修改过的文件到å³ä¾§æ–‡ä»¶å¤¹</target> + <source>Custom</source> <target>自定义</target> + <source>Configure your own synchronization rules.</source> <target>é…ç½®ä½ è‡ªå·±çš„åŒæ¥è§„则.</target> + <source>Deletion handling</source> <target>åˆ é™¤å¤„ç†</target> + <source>&OK</source> <target>确定(&O)</target> + <source>Configuration</source> <target>é…ç½®</target> + <source>Category</source> <target>分类</target> + <source>Action</source> <target>动作</target> + <source>File/folder exists on left side only</source> <target>文件/文件夹仅å˜åœ¨äºŽå·¦ä¾§</target> + <source>File/folder exists on right side only</source> <target>文件/文件夹仅å˜åœ¨äºŽå³ä¾§</target> + <source>Left file is newer</source> <target>左侧文件较新</target> + <source>Right file is newer</source> <target>å³ä¾§æ–‡ä»¶è¾ƒæ–°</target> + <source>Files have different content</source> <target>文件内容ä¸åŒ</target> + <source>Conflict/file cannot be categorized</source> <target>冲çª/文件ä¸èƒ½è¢«åˆ†ç±»</target> + <source>Compare by...</source> <target>比较选项...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> <target> 文件被认为是相åŒçš„,如果 - - æ–‡ä»¶å¤§å° - 最åŽä¿®æ”¹æ—¶é—´å’Œæ—¥æœŸ -ç›¸åŒ + - æ–‡ä»¶å¤§å° +是相åŒçš„ </target> -<source>File size and date</source> -<target>文件大å°å’Œæ—¥æœŸ</target> + +<source>File time and size</source> +<target>文件时间和日期</target> + <source> Files are found equal if - file content @@ -519,93 +755,85 @@ is the same - 文件内容 ç›¸åŒ </target> + <source>File content</source> <target>文件内容</target> + <source>Symbolic Link handling</source> <target>符å·è¿žæŽ¥å¤„ç†æ–¹å¼</target> + <source>Synchronizing...</source> <target>åŒæ¥ä¸...</target> + <source>Elements processed:</source> <target>已处ç†çš„å…ƒç´ :</target> + <source>&Pause</source> <target>æš‚åœ(&P)</target> -<source>Compare by "File size and date"</source> -<target>通过文件大å°å’Œæ—¥æœŸæ¯”较</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>æ¤å˜åŒ–评估两个文件å相åŒçš„文件,åªæœ‰å½“他们有åŒæ ·çš„文件大å°å¹¶ä¸”最åŽä¿®æ”¹æ—¥æœŸå’Œæ—¶é—´ä¹Ÿç›¸åŒæ—¶æ‰è®¤ä¸ºå®ƒä»¬æ˜¯ç›¸åŒçš„.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>当以æ¤é€‰é¡¹å¼€å§‹æ¯”è¾ƒæ—¶ä»¥ä¸‹å†³å®šæ ‘è¢«å¤„ç†:</target> -<source>As a result the files are separated into the following categories:</source> -<target>å…¶ç»“æžœæ˜¯æ–‡ä»¶åˆ†ä¸ºä»¥ä¸‹å‡ ç±»:</target> -<source>- equal</source> -<target>- 相åŒ</target> -<source>- left newer</source> -<target>- 左侧较新</target> -<source>- right newer</source> -<target>- å³ä¾§è¾ƒæ–°</target> -<source>- exists left only</source> -<target>- 仅左侧å˜åœ¨çš„</target> -<source>- exists right only</source> -<target>- ä»…å³ä¾§å˜åœ¨çš„</target> -<source>- conflict (same date, different size)</source> -<target>- 冲çª(相åŒæ—¥æœŸ,ä¸åŒå¤§å°)</target> -<source>Compare by "File content"</source> -<target>通过文件内容比较</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. - -With this option enabled the decision tree is smaller: -</source> -<target> -顾åæ€ä¹‰,两个相åŒæ–‡ä»¶å的文件当且仅当它们具有相åŒçš„内容时会被认为是相åŒçš„. -æ¤é€‰é¡¹å¯¹äºŽä¸€è‡´æ€§æ£€æŸ¥æ¯”较有用,而ä¸æ˜¯å¤‡ä»½æ“作. å› æ¤,文件时间没有被考虑到. -通过æ¤é€‰é¡¹ä½¿å†³ç–æ ‘è¾ƒå°: -</target> -<source>- different</source> -<target>- ä¸åŒ</target> <source>Source code written in C++ utilizing:</source> <target>æºä»£ç 用如下C++工具写æˆ:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>éžå¸¸æ„Ÿè°¢ä»¥ä¸‹æœ¬åœ°åŒ– FreeFileSync 的工作人员:</target> + <source>Feedback and suggestions are welcome at:</source> <target>欢迎在下é¢æ出å馈æ„è§å’Œå»ºè®®:</target> + <source>FreeFileSync at Sourceforge</source> <target>Sourceforge上的FreeFileSync</target> + <source>Homepage</source> <target>主页</target> + <source>If you like FFS</source> <target>å¦‚æžœä½ å–œæ¬¢ FFS</target> + <source>Donate with PayPal</source> <target>通过PayPalæèµ </target> + <source>Email</source> <target>邮箱</target> + <source>Report translation error</source> <target>报告翻译错误</target> + <source>Published under the GNU General Public License:</source> <target>在GNU通用公共许å¯ä¸‹å‘布:</target> + <source>Ignore subsequent errors</source> <target>忽略éšåŽçš„错误</target> + <source>Hide further error messages during the current process</source> <target>在当å‰è¿›ç¨‹ä¸éšè—进一æ¥çš„错误信æ¯</target> + <source>&Ignore</source> <target>忽略(&I)</target> + <source>&Retry</source> <target>é‡è¯•(&R)</target> + <source>Do not show this dialog again</source> <target>ä¸è¦å†æ˜¾ç¤ºæ¤å¯¹è¯æ¡†</target> + <source>&Switch</source> <target>切æ¢(&S)</target> + <source>&Yes</source> <target>是(&Y)</target> + <source>&No</source> <target>å¦(&N)</target> + <source>Delete on both sides</source> <target>ä»Žä¸¤ä¾§åˆ é™¤</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>ä»Žä¸¤ä¾§åˆ é™¤(å³ä½¿ä»…在一侧选择文件)</target> + <source>Use Recycle Bin</source> <target>使用回收站</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -614,16 +842,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire åªæœ‰åŒ¹é…所有过滤器设置的文件/目录会被选择用于åŒæ¥. 备注:文件å过滤器必须指定为åŒæ¥ä¸»ç›®å½•çš„相对路径. </target> + <source>Hints:</source> <target>æ示:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. 输入相对文件或文件夹å称,用';'或空行分隔.</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. 使用通é…符‘*’和‘?’.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. 通过å³é”®èœå•åœ¨ä¸»ç½‘æ ¼æŽ’é™¤æ–‡ä»¶.</target> + <source>Example</source> <target>例如</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -632,30 +866,40 @@ Exclude: \stuff\temp\* 包括: *.doc;*.zip;*.exe 排除: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>åŒæ¥æ‰€æœ‰ .doc, .zipå’Œ .exe 文件, 除了"temp"ä¸çš„一切.</target> + <source>Include</source> <target>包括</target> + <source>Exclude</source> <target>排除</target> -<source>Select time span:</source> -<target>选择时间间隔:</target> -<source>Minimum file size:</source> -<target>最å°æ–‡ä»¶å¤§å°:</target> -<source>Maximum file size:</source> + +<source>Minimum file size</source> +<target>最å°æ–‡ä»¶å¤§å°</target> + +<source>Maximum file size</source> <target>最大文件大å°</target> + <source>&Default</source> <target>默认(&D)</target> + <source>Move column up</source> <target>上移一行</target> + <source>Move column down</source> <target>下移一行</target> -<source>Transactional File Copy</source> -<target></target> + +<source>Transactional file copy</source> +<target>事务文件å¤åˆ¶</target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> -<target></target> +<target>首先写文件到临时文件(*.ffs_tmp)然åŽé‡å‘½å. 如æ¤ä¿è¯äº†ä¸€è‡´æ€§ï¼Œå³ä½¿åœ¨å‡ºçŽ°è‡´å‘½é”™è¯¯çš„情况下.</target> + <source>Copy locked files</source> <target>å¤åˆ¶è¢«é”定的文件</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -664,8 +908,10 @@ Copy shared or locked files using Volume Shadow Copy Service 通过å·å½±å¤åˆ¶æœåŠ¡å¤åˆ¶å…±äº«æˆ–é”定的文件 (需è¦ç®¡ç†å‘˜æƒé™) </target> -<source>Copy filesystem permissions</source> -<target>å¤åˆ¶æ–‡ä»¶ç³»ç»Ÿçš„æƒé™</target> + +<source>Copy file access permissions</source> +<target>å¤åˆ¶æ–‡ä»¶å˜å–æƒé™</target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -674,138 +920,217 @@ Transfer file and directory permissions 转移文件和目录的æƒé™ (需è¦ç®¡ç†å‘˜æƒé™) </target> + <source>Hidden dialogs:</source> <target>éšè—对è¯æ¡†:</target> + <source>Reset</source> <target>é‡ç½®</target> + <source>Show hidden dialogs</source> <target>显示éšè—的对è¯æ¡†</target> + <source>External applications</source> <target>外部应用程åº</target> + <source>Description</source> <target>æè¿°</target> + <source>Variant</source> <target>å˜åŒ–</target> + <source>Statistics</source> <target>统计</target> + <source>Find what:</source> <target>è¦æŸ¥æ‰¾ä»€ä¹ˆ:</target> + <source>Match case</source> <target>匹é…大å°å†™</target> + <source>&Find next</source> <target>查找下一个(&F)</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>您å¯èƒ½ä¼šå°è¯•å†æ¬¡åŒæ¥å‰©ä½™çš„项目(而ä¸å¿…é‡æ–°æ¯”较)!</target> -<source>Batch file created successfully!</source> -<target>批处ç†æ–‡ä»¶åˆ›å»ºæˆåŠŸ!</target> + <source>Main bar</source> <target>主工具æ¡</target> + <source>Folder pairs</source> <target>文件夹对</target> + <source>Select view</source> <target>选择视图</target> + <source>Set direction:</source> <target>设置方å‘:</target> + <source>Exclude temporarily</source> <target>暂时排除</target> + <source>Include temporarily</source> <target>暂时包括</target> + <source>Exclude via filter:</source> <target>通过过滤器排除:</target> + <source><multiple selection></source> <target><多选></target> + <source>D-Click</source> <target>åŒå‡»</target> + <source>Delete</source> <target>åˆ é™¤</target> + <source>Customize...</source> <target>自定义...</target> + +<source>Select time span...</source> +<target>选择时间跨度...</target> + <source>Auto-adjust columns</source> <target>自动调整æ 宽</target> + +<source>Icon size:</source> +<target></target> + +<source>Small</source> +<target></target> + +<source>Medium</source> +<target></target> + +<source>Large</source> +<target></target> + <source>Include all rows</source> <target>包括所有行</target> + <source>Exclude all rows</source> <target>排除所有行</target> + <source>Reset view</source> <target>é‡ç½®è§†å›¾</target> + <source>Show "%x"</source> <target>显示 "%x"</target> + <source><Last session></source> <target><最åŽä¼šè¯></target> + <source>Configuration saved!</source> <target>é…置已ä¿å˜!</target> + <source>Save changes to current configuration?</source> <target>ä¿å˜æ›´æ”¹åˆ°å½“å‰é…ç½®?</target> + <source>Configuration loaded!</source> <target>é…ç½®å·²åŠ è½½!</target> + <source>Folder Comparison and Synchronization</source> <target>文件夹比较与åŒæ¥</target> + <source>Hide files that exist on left side only</source> <target>éšè—仅在左侧的文件</target> + <source>Show files that exist on left side only</source> <target>显示仅å˜åœ¨å·¦ä¾§çš„文件</target> + <source>Hide files that exist on right side only</source> <target>éšè—仅在å³ä¾§çš„文件</target> + <source>Show files that exist on right side only</source> <target>显示仅å˜åœ¨å³ä¾§çš„文件</target> + <source>Hide files that are newer on left</source> <target>éšè—左侧较新的文件</target> + <source>Show files that are newer on left</source> <target>显示左侧较新的文件</target> + <source>Hide files that are newer on right</source> <target>éšè—å³ä¾§è¾ƒæ–°çš„文件</target> + <source>Show files that are newer on right</source> <target>显示å³ä¾§è¾ƒæ–°çš„文件</target> + <source>Hide files that are equal</source> <target>éšè—相åŒçš„文件</target> + <source>Show files that are equal</source> <target>显示相åŒçš„文件</target> + <source>Hide files that are different</source> <target>éšè—ä¸åŒçš„文件</target> + <source>Show files that are different</source> <target>显示ä¸åŒçš„文件</target> + <source>Hide conflicts</source> <target>éšè—冲çª</target> + <source>Show conflicts</source> <target>显示冲çª</target> + <source>Hide files that will be created on the left side</source> <target>éšè—将在左侧被建立的文件</target> + <source>Show files that will be created on the left side</source> <target>显示将在左侧被建立的文件</target> + <source>Hide files that will be created on the right side</source> <target>éšè—将在å³ä¾§è¢«å»ºç«‹çš„文件</target> + <source>Show files that will be created on the right side</source> <target>显示将在å³ä¾§è¢«å»ºç«‹çš„文件</target> + <source>Hide files that will be deleted on the left side</source> <target>éšè—å°†åœ¨å·¦ä¾§è¢«åˆ é™¤çš„æ–‡ä»¶</target> + <source>Show files that will be deleted on the left side</source> <target>æ˜¾ç¤ºå°†åœ¨å·¦ä¾§è¢«åˆ é™¤çš„æ–‡ä»¶</target> + <source>Hide files that will be deleted on the right side</source> <target>éšè—将在å³ä¾§è¢«åˆ 除的文件</target> + <source>Show files that will be deleted on the right side</source> <target>显示将在å³ä¾§è¢«åˆ 除的文件</target> + <source>Hide files that will be overwritten on left side</source> <target>éšè—将在左侧被覆盖的文件</target> + <source>Show files that will be overwritten on left side</source> <target>显示将在左侧被覆盖的文件</target> + <source>Hide files that will be overwritten on right side</source> <target>éšè—将在å³ä¾§è¢«è¦†ç›–的文件</target> + <source>Show files that will be overwritten on right side</source> <target>显示将在å³ä¾§è¢«è¦†ç›–的文件</target> + <source>Hide files that won't be copied</source> <target>éšè—å°†ä¸ä¼šè¢«å¤åˆ¶çš„文件</target> + <source>Show files that won't be copied</source> <target>显示将ä¸è¢«å¤åˆ¶çš„文件</target> + <source>All directories in sync!</source> <target>所有目录åŒæ¥!</target> + <source>Please run a Compare first before synchronizing!</source> <target>åŒæ¥ä¹‹å‰è¯·å…ˆè¿›è¡Œå¯¹æ¯”</target> + <source>Comma separated list</source> <target>逗å·åˆ†éš”的列表</target> + <source>Legend</source> <target>图例</target> + <source>File list exported!</source> <target>文件清å•å·²ç»å¯¼å‡º!</target> + +<source>Batch file created successfully!</source> +<target>批处ç†æ–‡ä»¶åˆ›å»ºæˆåŠŸ!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -813,6 +1138,7 @@ Transfer file and directory permissions <target> <pluralform>%x 个对象被æˆåŠŸåˆ 除!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -820,6 +1146,7 @@ Transfer file and directory permissions <target> <pluralform>%x 目录</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -827,6 +1154,7 @@ Transfer file and directory permissions <target> <pluralform>%x 文件</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -834,72 +1162,97 @@ Transfer file and directory permissions <target> <pluralform>%y ä¸çš„ %x è¡Œå¯è§</pluralform> </target> + <source>Scanning...</source> <target>æ£æ‰«æ...</target> + <source>Comparing content...</source> <target>æ£åœ¨æ¯”较文件内容...</target> + <source>Paused</source> <target>已暂åœ</target> + <source>Aborted</source> <target>å·²å–消</target> + <source>Completed</source> <target>完æˆ</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>å–消请求: æ£åœ¨ç‰å¾…当å‰æ“作完æˆ...</target> + <source>Continue</source> <target>继ç»</target> + <source>Pause</source> <target>æš‚åœ</target> + <source>Cannot find %x</source> <target>找ä¸åˆ° %x</target> -<source>DECISION TREE</source> -<target>决ç–æ ‘</target> -<source>file exists on both sides</source> -<target>文件在两侧å‡å·²å˜åœ¨</target> -<source>on one side only</source> -<target>仅在一侧</target> -<source>same date</source> -<target>日期相åŒ</target> -<source>different date</source> -<target>日期ä¸åŒ</target> + <source>Inactive</source> <target>ä¸ä½¿ç”¨</target> -<source>Second</source> -<target>秒</target> -<source>Minute</source> -<target>分</target> -<source>Hour</source> -<target>å°æ—¶</target> -<source>Day</source> -<target>天</target> + +<source>Last x hours</source> +<target>æœ€åŽ x å°æ—¶</target> + +<source>Today</source> +<target>今天</target> + +<source>This week</source> +<target>本周</target> + +<source>This month</source> +<target>本月</target> + +<source>This year</source> +<target>今年</target> + <source>Byte</source> <target>å—节</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>过滤器:所有的é…对</target> + <source>Filter: Single pair</source> <target>过滤器:å•ä¸€çš„é…对</target> + <source>Ignore</source> <target>忽略</target> + <source>Direct</source> <target>直接</target> + <source>Follow</source> <target>è·Ÿéš</target> + +<source>Copy NTFS permissions</source> +<target>å¤åˆ¶NTFSæƒé™</target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>集æˆå¤–部应用程åºåˆ°å³é”®èœå•. 如下å®å¯ç”¨:</target> + <source>- full file or directory name</source> <target>- 完整的文件å或目录å</target> + <source>- directory part only</source> <target>- åªå¯¹ç›®å½•éƒ¨åˆ†</target> + <source>- Other side's counterpart to %name</source> <target>- å¦ä¸€ä¾§å‚ç…§ %name</target> + <source>- Other side's counterpart to %dir</source> <target>- å¦ä¸€ä¾§å‚ç…§ %dir</target> + <source>Restore all hidden dialogs?</source> <target>æ¢å¤æ‰€æœ‰è¢«éšè—的对è¯æ¡†?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -907,6 +1260,7 @@ Transfer file and directory permissions <target> <pluralform>ä½ æ˜¯å¦çœŸçš„è¦ç§»åŠ¨å¦‚下 %x 个对象到回收站?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -914,139 +1268,211 @@ Transfer file and directory permissions <target> <pluralform>ä½ æ˜¯å¦çœŸçš„è¦åˆ 除如下 %x 个对象?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>é—留为未解决的冲çª</target> + <source>Delete permanently</source> <target>æ°¸ä¹…æ€§åˆ é™¤</target> + <source>Delete or overwrite files permanently</source> <target>æ°¸ä¹…æ€§åˆ é™¤æˆ–è¦†ç›–æ–‡ä»¶</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>å½“åˆ é™¤æˆ–è¦†ç›–æ–‡ä»¶æ—¶ä½¿ç”¨å›žæ”¶ç«™</target> + <source>Versioning</source> <target>ä¿ç•™åŽ†å²ç‰ˆæœ¬</target> + <source>Move files into a time-stamped subdirectory</source> <target>ç§»åŠ¨æ–‡ä»¶åˆ°æ—¶é—´æ ‡è®°å目录</target> -<source>Cannot determine sync-direction:</source> -<target>ä¸èƒ½æ£€æµ‹åŒæ¥æ–¹å‘:</target> -<source>Filter settings have changed!</source> -<target>过滤设置已改å˜!</target> + <source>Both sides have changed since last synchronization!</source> <target>在最åŽçš„åŒæ¥ä¹‹åŽä¸¤è¾¹å‡å·²æ”¹å˜!</target> + +<source>Cannot determine sync-direction:</source> +<target>ä¸èƒ½æ£€æµ‹åŒæ¥æ–¹å‘:</target> + <source>No change since last synchronization!</source> <target>自从最åŽä¸€æ¬¡åŒæ¥ä»¥æ¥æ²¡æœ‰å˜åŠ¨!</target> + +<source>Filter settings have changed!</source> +<target>过滤设置已改å˜!</target> + <source>The file was not processed by last synchronization!</source> <target>æ¤æ–‡ä»¶åœ¨æœ€åŽä¸€æ¬¡åŒæ¥ä¸æœªè¢«å¤„ç†!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>è®¡åˆ’çš„ç›®å½•åˆ é™¤ä¸Žå…¶å目录和文件有冲çª!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>设置默认的åŒæ¥æ–¹å‘:旧文件会被新文件覆盖.</target> + <source>The file does not contain a valid configuration:</source> <target>该文件ä¸åŒ…å«æœ‰æ•ˆçš„é…ç½®:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>ä½ å¯ä»¥å¿½ç•¥è¿™ä¸ªé”™è¯¯è€Œè®¤ä¸ºç›®å½•æ˜¯ç©ºçš„.</target> + <source>Directory does not exist:</source> <target>目录ä¸å˜åœ¨:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>目录有ä¾èµ–性ï¼åœ¨è®¾ç«‹åŒæ¥è§„则时请å°å¿ƒ:</target> + <source>Comparing content of files %x</source> <target>æ£åœ¨æ¯”较文件 %x 的内容</target> + <source>Memory allocation failed!</source> <target>内å˜åˆ†é…失败!</target> + <source>File %x has an invalid date!</source> <target>文件 %x 的日期éžæ³•!</target> + <source>Conflict detected:</source> <target>检测到冲çª:</target> + <source>Files %x have the same date but a different size!</source> <target>文件 %x 日期相åŒä½†å¤§å°ä¸åŒ!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>符å·è¿žæŽ¥ %x 有相åŒçš„æ—¥æœŸä½†ç›®æ ‡ä¸åŒ!</target> + <source>Comparing files by content failed.</source> <target>按文件内容比较失败.</target> + <source>Generating file list...</source> <target>生æˆæ–‡ä»¶åˆ—表...</target> + <source>Multiple...</source> <target>并è”...</target> + <source>Both sides are equal</source> <target>两侧相ç‰</target> + <source>Files/folders differ in attributes only</source> <target>文件/文件夹仅属性ä¸åŒ</target> + <source>Copy new file/folder to left</source> <target>å¤åˆ¶æ–°æ–‡ä»¶/文件夹至左侧</target> + <source>Copy new file/folder to right</source> <target>å¤åˆ¶æ–°æ–‡ä»¶/文件夹至å³ä¾§</target> + <source>Delete left file/folder</source> <target>åˆ é™¤å·¦ä¾§æ–‡ä»¶/文件夹</target> + <source>Delete right file/folder</source> <target>åˆ é™¤å³ä¾§æ–‡ä»¶/文件夹</target> + <source>Overwrite left file/folder with right one</source> <target>从å³ä¾§è¦†ç›–左侧的文件/文件夹</target> + <source>Overwrite right file/folder with left one</source> <target>从左侧覆盖å³ä¾§çš„文件/文件夹</target> + <source>Do nothing</source> <target>ä¿æŒä¸åŠ¨</target> + <source>Copy file attributes only to left</source> <target>ä»…å¤åˆ¶æ–‡ä»¶å±žæ€§åˆ°å·¦ä¾§</target> + <source>Copy file attributes only to right</source> <target>ä»…å¤åˆ¶æ–‡ä»¶å±žæ€§åˆ°å³ä¾§</target> + <source>Deleting file %x</source> <target>æ£åˆ 除文件 %x</target> -<source>Deleting Symbolic Link %x</source> -<target>æ£åœ¨åˆ 除符å·è¿žæŽ¥ %x</target> + <source>Deleting folder %x</source> <target>æ£åˆ 除文件夹 %x</target> -<source>Moving %x to Recycle Bin</source> -<target>移动 %x 到回收站</target> -<source>Moving file %x to user-defined directory %y</source> -<target>移动文件 %x 到用户定义目录 %y</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>移动文件夹 %x 到用户定义目录 %y</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>æ£åœ¨ç§»åŠ¨ç¬¦å·è¿žæŽ¥ %x 到用户定义目录 %y</target> -<source>Copying new file %x to %y</source> -<target>å¤åˆ¶æ–°æ–‡ä»¶ %x 到 %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>å¤åˆ¶æ–°ç¬¦å·è¿žæŽ¥ %x 到 %y</target> -<source>Overwriting file %x in %y</source> -<target>æ£åœ¨ %y 上覆盖文件 %x</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>æ£åœ¨ %y 上覆盖符å·è¿žæŽ¥ %x</target> + +<source>Deleting symbolic link %x</source> +<target>æ£åœ¨åˆ 除符å·è¿žæŽ¥ %x</target> + +<source>Moving file %x to recycle bin</source> +<target>æ£åœ¨ç§»åŠ¨æ–‡ä»¶ %x 到回收站</target> + +<source>Moving folder %x to recycle bin</source> +<target>æ£åœ¨ç§»åŠ¨æ–‡ä»¶å¤¹ %x 到回收站</target> + +<source>Moving symbolic link %x to recycle bin</source> +<target>æ£åœ¨ç§»åŠ¨ç¬¦å·è¿žæŽ¥ %x 到回收站</target> + +<source>Moving file %x to %y</source> +<target>æ£åœ¨ç§»åŠ¨æ–‡ä»¶ %x 到 %y</target> + +<source>Moving folder %x to %y</source> +<target>æ£åœ¨ç§»åŠ¨æ–‡ä»¶å¤¹ %x 到 %y</target> + +<source>Moving symbolic link %x to %y</source> +<target>æ£åœ¨ç§»åŠ¨ç¬¦å·è¿žæŽ¥ %x 到 %y</target> + +<source>Creating file %x</source> +<target>æ£åœ¨åˆ›å»ºæ–‡ä»¶ %x</target> + +<source>Creating symbolic link %x</source> +<target>æ£åœ¨åˆ›å»ºç¬¦å·è¿žæŽ¥ %x</target> + <source>Creating folder %x</source> <target>æ£åˆ›å»ºæ–‡ä»¶å¤¹ %x</target> + +<source>Overwriting file %x</source> +<target>æ£åœ¨è¦†ç›–文件 %x</target> + +<source>Overwriting symbolic link %x</source> +<target>æ£åœ¨è¦†ç›–符å·è¿žæŽ¥ %x</target> + <source>Verifying file %x</source> <target>æ ¡éªŒæ–‡ä»¶ %x</target> + <source>Updating attributes of %x</source> <target>æ›´æ–° %x 的属性</target> -<source>Source directory does not exist anymore:</source> -<target>æºç›®å½•å·²ç»ä¸å˜åœ¨:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>æ ¹æ®é…置没有任何åŒæ¥!</target> + <source>Target directory name must not be empty!</source> <target>ç›®æ ‡ç›®å½•åä¸èƒ½ä¸ºç©º!</target> + <source>User-defined directory for deletion was not specified!</source> <target>ç”¨äºŽåˆ é™¤çš„ç”¨æˆ·å®šä¹‰ç›®å½•æ²¡æœ‰æŒ‡å®š!</target> + +<source>Source directory does not exist anymore:</source> +<target>æºç›®å½•å·²ç»ä¸å˜åœ¨:</target> + <source>Unresolved conflicts existing!</source> <target>å˜åœ¨ä¸å¯è§£å†³çš„冲çª!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>ä½ å¯å¿½ç•¥å†²çªå¹¶ç»§ç»åŒæ¥.</target> + <source>Significant difference detected:</source> <target>已侦测到显著ä¸åŒ:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>超过总数 50% 以上的文件è¦è¢«å¤åˆ¶æˆ–åˆ é™¤!</target> + <source>Not enough free disk space available in:</source> <target>没有足够的å¯ç”¨ç£ç›˜ç©ºé—´ç”¨äºŽ:</target> + <source>Free disk space required:</source> <target>需è¦å¯ç”¨çš„ç£ç›˜ç©ºé—´:</target> + <source>Free disk space available:</source> <target>å¯ç”¨ç£ç›˜ç©ºé—´:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target></target> +<target>如下路径的回收站ä¸å¯ç”¨! æ–‡ä»¶ä¼šè¢«æ°¸ä¹…åˆ é™¤:</target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>有一个目录将被修改,而它是多个文件夹对的一部分!请é‡æ–°æ£€æŸ¥åŒæ¥è®¾ç½®!</target> + <source>Processing folder pair:</source> <target>æ£åœ¨å¤„ç†æˆå¯¹æ–‡ä»¶å¤¹:</target> + <source>Generating database...</source> <target>æ£åœ¨ç”Ÿæˆæ•°æ®åº“...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>æ ¹æ®é…置没有任何åŒæ¥!</target> + <source>Error copying locked file %x!</source> <target>å¤åˆ¶å·²é”定的文件时出错 %x!</target> + <source>Data verification error: Source and target file have different content!</source> <target>æ•°æ®æ ¡éªŒé”™è¯¯:æºæ–‡ä»¶å’Œç›®æ ‡æ–‡ä»¶å†…容ä¸åŒ!</target> + diff --git a/BUILD/Languages/chinese_traditional.lng b/BUILD/Languages/chinese_traditional.lng index f57dd719..62b2912e 100644 --- a/BUILD/Languages/chinese_traditional.lng +++ b/BUILD/Languages/chinese_traditional.lng @@ -8,75 +8,116 @@ </header> <source>Searching for directory %x...</source> -<target></target> +<target>æ£åœ¨æœå°‹ç›®éŒ„ %x...</target> + <source>Show in Explorer</source> <target>在資æºç®¡ç†å™¨ä¸é¡¯ç¤º</target> + <source>Open with default application</source> <target>使用é è¨çš„應用程å¼é–‹å•Ÿ</target> + <source>Browse directory</source> <target>ç€è¦½ç›®éŒ„</target> + <source>RealtimeSync - Automated Synchronization</source> <target>å³æ™‚åŒæ¥ - 自動åŒæ¥</target> + <source>Browse</source> <target>ç€è¦½</target> -<source>Invalid commandline: %x</source> + +<source>Invalid command line: %x</source> <target>無效的命令列:%x</target> + <source>Error resolving symbolic link:</source> <target>解æžéŒ¯èª¤çš„符號連çµï¼š</target> -<source>Show popup</source> + +<source>Show pop-up</source> <target>顯示彈出視窗</target> -<source>Show popup on errors or warnings</source> + +<source>Show pop-up on errors or warnings</source> <target>在彈出視窗上顯示錯誤或è¦å‘Šè¨Šæ¯</target> + <source>Ignore errors</source> <target>忽略錯誤</target> + <source>Hide all error and warning messages</source> <target>éš±è—所有錯誤和è¦å‘Šè¨Šæ¯</target> + <source>Exit instantly</source> <target>ç«‹å³é€€å‡º</target> + <source>Abort synchronization immediately</source> <target>ç«‹å³ä¸æ¢åŒæ¥</target> + +<source>Select alternate comparison settings</source> +<target>é¸æ“‡æ›¿ä»£çš„比å°è¨å®š</target> + <source>Select alternate synchronization settings</source> -<target>é¸æ“‡å‚™ç”¨åŒæ¥è¨å®š</target> +<target>é¸æ“‡æ›¿ä»£çš„åŒæ¥è¨å®š</target> + <source>No filter selected</source> <target>沒有é¸æ“‡ç¯©é¸å™¨</target> + <source>Filter is active</source> <target>篩é¸å™¨ç‚ºå•Ÿå‹•</target> + +<source>Remove alternate settings</source> +<target>移除替代è¨å®š</target> + <source>Clear filter settings</source> <target>清除篩é¸å™¨è¨å®š</target> -<source>Remove alternate settings</source> -<target>移除備用è¨å®š</target> + <source>Create a batch job</source> <target>新建一個批次處ç†ä½œæ¥</target> + <source>Synchronization settings</source> <target>åŒæ¥è¨å®š</target> + <source>Comparison settings</source> <target>比å°è¨å®š</target> + <source>About</source> <target>關於</target> + <source>Error</source> <target>錯誤</target> + <source>Warning</source> <target>è¦å‘Š</target> + <source>Question</source> <target>å•é¡Œ</target> + <source>Confirm</source> <target>確èª</target> + <source>Configure filter</source> <target>é…置篩é¸</target> + <source>Customize columns</source> <target>自訂列</target> + <source>Global settings</source> <target>æ•´é«”è¨å®š</target> + <source>Synchronization Preview</source> <target>åŒæ¥é 覽</target> + <source>Find</source> <target>尋找</target> + +<source>Select time span</source> +<target>é¸æ“‡æ™‚間範åœ</target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -84,46 +125,64 @@ <target> <pluralform>%x ä½å…ƒçµ„</pluralform> </target> + <source><Symlink></source> <target><符號連çµ></target> + <source><Directory></source> <target><目錄></target> + <source>Size</source> <target>大å°</target> + <source>Date</source> <target>日期</target> + <source>Full path</source> <target>完整路徑</target> + <source>Filename</source> <target>檔案å稱</target> + <source>Relative path</source> <target>相å°è·¯å¾‘</target> + <source>Directory</source> <target>目錄</target> + <source>Extension</source> <target>擴展</target> + <source>Comparison Result</source> <target>比å°çµæžœ</target> + <source>Incompatible synchronization database format:</source> <target>åŒæ¥è³‡æ–™åº«æ ¼å¼ä¸ç›¸å®¹ï¼š</target> + <source>Initial synchronization:</source> <target>åˆå§‹åŒ–åŒæ¥ï¼š</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>å…¶ä¸ä¸€å€‹ FreeFileSync 資料庫檔案ä¸å˜åœ¨ï¼š</target> + <source>Error reading from synchronization database:</source> <target>讀å–åŒæ¥è³‡æ–™åº«éŒ¯èª¤ï¼š</target> + <source>Database files do not share a common synchronization session:</source> -<target></target> +<target>資料庫檔案ä¸å…±äº«ä¸€å€‹å…±åŒçš„åŒæ¥é€£ç·šï¼š</target> + <source>An exception occurred!</source> <target>發生異常ï¼</target> -<source>Error deleting file:</source> -<target>刪除檔案錯誤:</target> + <source>Error reading file attributes:</source> <target>讀å–檔案屬性錯誤:</target> + <source>Waiting while directory is locked (%x)...</source> <target>ç‰å¾…目錄被鎖定(%x)...</target> + <source>Error setting directory lock:</source> <target>è¨å®šç›®éŒ„鎖錯誤:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -131,27 +190,39 @@ <target> <pluralform>%x 秒</pluralform> </target> + <source>Info</source> <target>訊æ¯</target> + <source>Fatal Error</source> <target>åš´é‡éŒ¯èª¤</target> + <source>Scanning:</source> -<target>掃瞄ä¸ï¼š</target> +<target>æ£åœ¨æŽƒçž„:</target> + <source>Encoding extended time information: %x</source> <target>編碼延長時間資訊:%x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> -<target></target> +<target> +<pluralform>[%x 個執行緒]</pluralform> +</target> + <source>Invalid FreeFileSync config file!</source> <target>無效的 FreeFileSync é…置檔案ï¼</target> + <source>File does not exist:</source> <target>檔案ä¸å˜åœ¨ï¼š</target> + <source>Error parsing configuration file:</source> <target>分æžé…置檔案錯誤:</target> + <source>/sec</source> <target>/秒</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -159,13 +230,15 @@ <target> <pluralform>%x 分</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> </source> <target> -<pluralform>%x 時</pluralform> +<pluralform>%x å°æ™‚</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -173,28 +246,40 @@ <target> <pluralform>%x 天</pluralform> </target> + <source>S&ave configuration...</source> <target>儲å˜é…ç½®(&A)...</target> + <source>&Load configuration...</source> <target>載入é…ç½®(&L)...</target> + <source>&Quit</source> <target>離開(&Q)</target> + <source>&File</source> <target>檔案(&F)</target> + <source>&Content</source> -<target>內容</target> +<target>內容(&C)</target> + <source>&About...</source> <target>關於(&A)...</target> + <source>&Help</source> <target>說明(&H)</target> + <source>Usage:</source> <target>使用é‡ï¼š</target> + <source>1. Select directories to monitor.</source> <target>1. é¸æ“‡è¦ç›£æ¸¬çš„目錄。</target> + <source>2. Enter a command line.</source> <target>2. 輸入命令列。</target> + <source>3. Press 'Start'.</source> <target>3. 按下 '開始'。</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -205,398 +290,541 @@ The command line is executed each time: - å¯ç”¨çš„目錄(例如æ’å…¥USB隨身碟) - 檔案在這些目錄或å目錄會被修改 </target> + <source>Directories to watch</source> <target>è¦ç›£çœ‹çš„目錄</target> + <source>Add folder</source> <target>新增資料夾</target> + <source>Remove folder</source> <target>移除資料夾</target> + <source>Select a folder</source> <target>é¸æ“‡ä¸€å€‹è³‡æ–™å¤¾</target> + <source>Command line</source> <target>命令列</target> + <source>Minimum Idle Time [seconds]</source> <target>最å°é–’置時間 [秒]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>上次更改的檢測和執行命令列之間以秒為單ä½çš„閒置時間</target> + <source>Start</source> <target>開始</target> + <source>(Build: %x)</source> <target>(建立:%x)</target> + <source>RealtimeSync configuration</source> <target>å³æ™‚åŒæ¥é…ç½®</target> + <source>File already exists. Overwrite?</source> <target>檔案已å˜åœ¨ï¼Œè¦è¦†è“‹å—Žï¼Ÿ</target> + <source>&Restore</source> <target>回復(&R)</target> + <source>&Exit</source> <target>çµæŸ(&E)</target> + <source>Monitoring active...</source> <target>監測活動...</target> + <source>Waiting for missing directories...</source> <target>ç‰å¾…缺少的目錄...</target> + <source>A directory input field is empty.</source> <target>目錄輸入的欄ä½ç‚ºç©º</target> + <source>Drag && drop</source> <target>拖放</target> + <source>Could not initialize directory monitoring:</source> <target>無法åˆå§‹åŒ–目錄監測:</target> + <source>Error when monitoring directories.</source> <target>監測目錄錯誤。</target> + <source>Conversion error:</source> <target>轉æ›éŒ¯èª¤ï¼š</target> + +<source>Error deleting file:</source> +<target>刪除檔案錯誤:</target> + <source>Error moving file:</source> <target>移動檔案錯誤:</target> + <source>Target file already existing!</source> <target>目標檔案已å˜åœ¨ï¼</target> + <source>Error moving directory:</source> <target>移動目錄錯誤:</target> + <source>Target directory already existing!</source> <target>目標目錄已å˜åœ¨ï¼</target> + <source>Error deleting directory:</source> <target>刪除目錄錯誤:</target> + <source>Error changing modification time:</source> <target>變更修改時間錯誤:</target> + <source>Error loading library function:</source> <target>載入函數庫錯誤:</target> + <source>Error reading security context:</source> <target>讀å–安全內文錯誤:</target> + <source>Error writing security context:</source> <target>寫入安全性內容錯誤:</target> + <source>Error copying file permissions:</source> <target>複製檔案權é™éŒ¯èª¤ï¼š</target> + <source>Error creating directory:</source> <target>新建目錄錯誤:</target> + <source>Error copying symbolic link:</source> <target>複製符號連çµéŒ¯èª¤ï¼š</target> + <source>Error copying file:</source> <target>複製檔案錯誤:</target> + <source>Error opening file:</source> <target>開啟檔案錯誤:</target> + <source>Error writing file:</source> <target>寫入檔案錯誤:</target> + <source>Error reading file:</source> <target>讀å–檔案錯誤:</target> + <source>Operation aborted!</source> <target>ä¸æ¢æ“作ï¼</target> + <source>Endless loop when traversing directory:</source> <target>當éæ·ç›®éŒ„時無é™å¾ªç’°ï¼š</target> + <source>Error traversing directory:</source> <target>éæ·ç›®éŒ„錯誤:</target> + <source>Windows Error Code %x:</source> <target>Windows 錯誤代碼 %x:</target> + <source>Linux Error Code %x:</source> <target>Linux 錯誤代碼 %x:</target> + <source>Error setting privilege:</source> <target>è¨å®šæ¬Šé™éŒ¯èª¤ï¼š</target> + <source>Error moving to Recycle Bin:</source> <target>移動到資æºå›žæ”¶ç’錯誤:</target> + <source>Could not load a required DLL:</source> <target>無法載入一個所需的DLL:</target> + <source>Error writing to synchronization database:</source> <target>寫入åŒæ¥è³‡æ–™åº«éŒ¯èª¤ï¼š</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>å•Ÿå‹•å·å½±è¤‡è£½æœå‹™éŒ¯èª¤ï¼</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target>讀å–å·å½±è¤‡è£½æœå‹™æ™‚錯誤ï¼</target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>ä¸æ”¯æ´è£½ä½œ WOW64 上的å·å½±å‰¯æœ¬ã€‚請使用 FreeFileSync 64ä½å…ƒç‰ˆæœ¬ã€‚</target> + <source>Could not determine volume name for file:</source> <target>無法判斷æ¤æª”案的å·æ¨™å稱:</target> + <source>Volume name %x not part of filename %y!</source> <target>å·å %x 並éžæª”å %y 的一部份ï¼</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>ç„¡æ³•è®€å– XML 之後節點的值:</target> + <source>Logging</source> <target>日誌記錄</target> + <source>FreeFileSync batch file</source> <target>FreeFileSync 批次檔</target> + <source>FreeFileSync configuration</source> <target>FreeFileSync é…ç½®</target> + <source>FreeFileSync Batch Job</source> <target>FreeFileSync 批次處ç†ä½œæ¥</target> + <source>Unable to create logfile!</source> <target>無法新建日誌檔ï¼</target> + <source>Batch execution</source> <target>批次處ç†åŸ·è¡Œ</target> + <source>Log-messages:</source> <target>日誌訊æ¯ï¼š</target> + <source>Stop</source> <target>åœæ¢</target> + <source>Total time:</source> <target>全部時間:</target> + <source>Synchronization aborted!</source> <target>åŒæ¥å·²ä¸æ¢ï¼</target> + <source>Synchronization completed with errors!</source> <target>åŒæ¥å®Œæˆä½†æœ‰éŒ¯èª¤ï¼</target> + <source>Synchronization completed successfully!</source> <target>å·²æˆåŠŸçš„完æˆåŒæ¥ï¼</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>按下 "切æ›" é–‹å•Ÿ FreeFileSync 圖形介é¢æ“作方å¼ã€‚</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>åˆ‡æ› FreeFileSync 圖形介é¢æ“作方å¼...</target> + <source>Unable to connect to sourceforge.net!</source> <target>無法連接到 sourceforge.netï¼</target> + <source>A newer version of FreeFileSync is available:</source> <target>有較新版本的 FreeFileSync å¯ç”¨ï¼š</target> + <source>Download now?</source> <target>è¦ç«‹å³ä¸‹è¼‰å—Žï¼Ÿ</target> + <source>Information</source> <target>訊æ¯</target> + <source>FreeFileSync is up to date!</source> <target>FreeFileSync 已經是最新版本ï¼</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>è¦æ¯é€±è‡ªå‹•æª¢æŸ¥æ›´æ–° FreeFileSync 嗎?</target> + <source>(Requires an Internet connection!)</source> <target>(需è¦é€£æŽ¥åˆ°ç¶²éš›ç¶²è·¯ï¼)</target> + <source>1. &Compare</source> <target>1. 比å°(&C)</target> + <source>2. &Synchronize...</source> <target>2. åŒæ¥(&S)...</target> + <source>S&witch view</source> <target>切æ›æª¢è¦–(&W)</target> + <source>&New</source> <target>新增專案(&N)</target> + <source>&Program</source> <target>程å¼(&P)</target> + <source>&Language</source> <target>語言(&L)</target> + <source>&Global settings...</source> <target>æ•´é«”è¨å®š(&G)...</target> + <source>&Create batch job...</source> <target>新建批次處ç†ä½œæ¥(&C)...</target> + <source>&Export file list...</source> <target>匯出檔案清單(&E)...</target> + <source>&Advanced</source> <target>進階(&A)</target> + <source>&Check for new version</source> <target>檢查更新(&C)</target> + <source>Compare</source> <target>比å°</target> + <source>Compare both sides</source> <target>比å°å…©é‚Š</target> + <source>&Abort</source> <target>å–消(&A)</target> + <source>Synchronize...</source> <target>åŒæ¥...</target> + <source>Start synchronization</source> <target>開始åŒæ¥</target> -<source>Swap sides</source> -<target>兩邊交æ›</target> + <source>Add folder pair</source> <target>新增一å°è³‡æ–™å¤¾</target> + <source>Remove folder pair</source> <target>移除一å°è³‡æ–™å¤¾</target> + +<source>Swap sides</source> +<target>兩邊交æ›</target> + <source>Save current configuration to file</source> <target>將目å‰é…置儲å˜åˆ°æª”案</target> + <source>Load configuration from file</source> <target>從檔案載入é…ç½®</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>上次使用的é…ç½®(按DELéµï¼Œå¾žæ¸…å–®ä¸ç§»é™¤)</target> + <source>Hide excluded items</source> <target>éš±è—è¢«æŽ’é™¤çš„é …ç›®</target> + <source>Hide filtered or temporarily excluded files</source> <target>éš±è—篩é¸æˆ–暫時被排除的檔案</target> + <source>Number of files and directories that will be created</source> <target>一些檔案和目錄將被新建</target> + <source>Number of files that will be overwritten</source> <target>一些檔案和目錄將被覆蓋</target> + <source>Number of files and directories that will be deleted</source> <target>一些檔案和目錄將被刪除</target> + <source>Total amount of data that will be transferred</source> <target>å°‡è¦å‚³è¼¸çš„全部資料é‡</target> -<source>Left</source> -<target>左邊</target> -<source>Right</source> -<target>å³é‚Š</target> + <source>Batch job</source> <target>批次處ç†ä½œæ¥</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>新建一個自動åŒæ¥çš„批次檔。若è¦é–‹å§‹æ‰¹æ¬¡è™•ç†æ¨¡å¼åªéœ€æŒ‰å…©ä¸‹æ¤æª”或通éŽå‘½ä»¤åˆ—執行:FreeFileSync.exe <batchfile>。還å¯ä»¥å®‰æŽ’在您的作æ¥ç³»çµ±çš„任務計畫ä¸ã€‚</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target>新建一個自動åŒæ¥çš„批次檔。若è¦é–‹å§‹æ‰¹æ¬¡è™•ç†æ¨¡å¼åªéœ€æŒ‰å…©ä¸‹æ¤æª”或通éŽå‘½ä»¤åˆ—執行:FreeFileSync.exe <ffs_batch file>。還å¯ä»¥å®‰æŽ’在您的作æ¥ç³»çµ±çš„任務計畫ä¸ã€‚</target> + <source>Help</source> <target>說明</target> + <source>Filter files</source> <target>篩é¸æª”案</target> + <source>Error handling</source> <target>錯誤處ç†</target> + +<source>Left</source> +<target>左邊</target> + +<source>Right</source> +<target>å³é‚Š</target> + <source>Overview</source> <target>摘è¦</target> + <source>Status feedback</source> <target>ç‹€æ…‹å›žå ±</target> + <source>Run minimized</source> -<target></target> +<target>執行最å°åŒ–</target> + <source>Maximum number of logfiles:</source> <target>日誌檔的最大數目:</target> + <source>Select logfile directory:</source> <target>é¸æ“‡æ—¥èªŒæª”目錄:</target> + <source>Batch settings</source> -<target></target> +<target>批次處ç†è¨å®š</target> + <source>&Save</source> <target>儲å˜(&S)</target> + <source>&Load</source> <target>載入(&L)</target> + <source>&Cancel</source> <target>å–消(&C)</target> + <source>Elements found:</source> <target>尋找è¦ç´ :</target> + <source>Elements remaining:</source> <target>剩餘è¦ç´ :</target> + <source>Speed:</source> <target>速度:</target> + <source>Time remaining:</source> <target>剩餘時間:</target> + <source>Time elapsed:</source> <target>經éŽæ™‚間:</target> + <source>Operation:</source> <target>æ“作:</target> + <source>Select variant:</source> <target>é¸æ“‡è®Šæ•¸ï¼š</target> + <source><Automatic></source> <target><自動></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>å°å…©é‚Šä½¿ç”¨åŒä¸€å€‹è³‡æ–™åº«çš„è˜åˆ¥å’Œå‚³é€æ›´æ”¹ã€‚自動檢測刪除和è¡çªéƒ¨ä»½ã€‚</target> + <source>Mirror ->></source> <target>é¡åƒ ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>é¡åƒå‚™ä»½çš„左邊的資料夾。åŒæ¥å¾Œï¼Œå³é‚Šçš„資料夾進行修改以完全相é…左邊的資料夾。</target> + <source>Update -></source> <target>æ›´æ–° -></target> + <source>Copy new or updated files to right folder.</source> <target>將新的或更新éŽçš„檔案複製到å³é‚Šçš„資料夾ä¸ã€‚</target> + <source>Custom</source> <target>自訂</target> + <source>Configure your own synchronization rules.</source> <target>é…ç½®ä½ è‡ªå·±çš„åŒæ¥è¦å‰‡ã€‚</target> + <source>Deletion handling</source> <target>刪除處ç†</target> + <source>&OK</source> <target>確定(&O)</target> + <source>Configuration</source> <target>é…ç½®</target> + <source>Category</source> <target>分類</target> + <source>Action</source> <target>動作</target> + <source>File/folder exists on left side only</source> <target>åªå˜åœ¨æ–¼å·¦é‚Šçš„檔案/資料夾</target> + <source>File/folder exists on right side only</source> <target>åªå˜åœ¨æ–¼å³é‚Šçš„檔案/資料夾</target> + <source>Left file is newer</source> <target>左邊檔案較新</target> + <source>Right file is newer</source> <target>å³é‚Šæª”案較新</target> + <source>Files have different content</source> <target>檔案的內容ä¸åŒ</target> + <source>Conflict/file cannot be categorized</source> <target>è¡çª/檔案無法分類</target> + <source>Compare by...</source> <target>比å°é¸é …...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> <target>如果檔案大å°å’Œæœ€å¾Œä¿®æ”¹æ™‚間和日期相åŒå‰‡åˆ¤æ–·å…©è€…相åŒ</target> -<source>File size and date</source> + +<source>File time and size</source> <target>檔案大å°å’Œæ—¥æœŸ</target> + <source> Files are found equal if - file content is the same </source> <target>如果檔案内容相åŒå‰‡åˆ¤æ–·å…©è€…相åŒ</target> + <source>File content</source> <target>檔案内容</target> + <source>Symbolic Link handling</source> <target>符號連çµè™•ç†</target> + <source>Synchronizing...</source> <target>æ£åœ¨åŒæ¥...</target> + <source>Elements processed:</source> <target>已處ç†è¦ç´ :</target> + <source>&Pause</source> <target>æš«åœ(&P)</target> -<source>Compare by "File size and date"</source> -<target>以檔案大å°å’Œæ—¥æœŸæ¯”å°</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>æ¤è®Šæ•¸è¨ˆç®—çµæžœç‚ºå…©å€‹æª”å相åŒçš„檔案,åªæœ‰ç•¶ä»–們的檔案大å°å’Œæœ€å¾Œä¿®æ”¹æ—¥æœŸæ™‚間也相åŒï¼Œæ‰æœƒåˆ¤æ–·ä»–們是相åŒçš„檔案。</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>當比å°é–‹å§‹ï¼Œä½¿ç”¨æ¤é¸é …è¨å®šæ™‚,以下決ç–樹將被處ç†ï¼š</target> -<source>As a result the files are separated into the following categories:</source> -<target>çµæžœæ˜¯æª”案分為以下幾類:</target> -<source>- equal</source> -<target>- 相åŒ</target> -<source>- left newer</source> -<target>- 左邊較新</target> -<source>- right newer</source> -<target>- å³é‚Šè¼ƒæ–°</target> -<source>- exists left only</source> -<target>- åªå˜åœ¨æ–¼å·¦é‚Š</target> -<source>- exists right only</source> -<target>- åªå˜åœ¨æ–¼å³é‚Š</target> -<source>- conflict (same date, different size)</source> -<target>- è¡çª(相åŒæ—¥æœŸï¼Œä¸åŒå¤§å°)</target> -<source>Compare by "File content"</source> -<target>以檔案内容比å°</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. - -With this option enabled the decision tree is smaller: -</source> -<target> -顧åæ€ç¾©ï¼Œå…©å€‹ç›¸åŒæª”å的檔案,åªæœ‰ç•¶ä»–們具有åŒæ¨£çš„内容時會被判斷是相åŒçš„。 -æ¤é¸é …å°æ–¼ä¸€è‡´æ€§æª¢æŸ¥æ¯”較有用,而ä¸æ˜¯å‚™ä»½æ“ä½œã€‚å› æ¤ï¼Œæª”案時間沒有列入考慮。 -啟用æ¤é¸é …使決ç–樹較å°ï¼š -</target> -<source>- different</source> -<target>- ä¸åŒ</target> <source>Source code written in C++ utilizing:</source> <target>使用C++編寫的原始碼</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>éžå¸¸æ„Ÿè¬ FreeFileSync 當地語系化的工作人員:</target> + <source>Feedback and suggestions are welcome at:</source> <target>æ¡è¿Žåœ¨ä¸‹é¢æå‡ºå›žå ±å’Œå»ºè°ï¼š</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync 在 Sourceforge</target> + <source>Homepage</source> <target>首é </target> + <source>If you like FFS</source> <target>å¦‚æžœä½ å–œæ¡ FFS</target> + <source>Donate with PayPal</source> <target>使用 PayPal æè´ˆ</target> + <source>Email</source> <target>ä¿¡ç®±</target> + <source>Report translation error</source> <target>å›žå ±ç¿»è¯éŒ¯èª¤</target> + <source>Published under the GNU General Public License:</source> <target>在GNU通用公共許å¯è‰ä¸‹ç™¼ä½ˆï¼š</target> + <source>Ignore subsequent errors</source> <target>忽略後續錯誤</target> + <source>Hide further error messages during the current process</source> <target>在目å‰é€²ç¨‹ä¸éš±è—進一æ¥çš„錯誤訊æ¯</target> + <source>&Ignore</source> <target>忽略(&I)</target> + <source>&Retry</source> <target>é‡è©¦(&R)</target> + <source>Do not show this dialog again</source> <target>ä¸è¦å†é¡¯ç¤ºæ¤å°è©±æ¡†</target> + <source>&Switch</source> -<target>切æ›</target> +<target>切æ›(&S)</target> + <source>&Yes</source> -<target>是</target> +<target>是(&Y)</target> + <source>&No</source> -<target>å¦</target> +<target>å¦(&N)</target> + <source>Delete on both sides</source> <target>兩邊都刪除</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>å³ä½¿åªåœ¨ä¸€é‚Šä¸é¸å¥½æª”案,還是會刪除兩邊檔案。</target> + <source>Use Recycle Bin</source> <target>使用資æºå›žæ”¶ç’</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -605,16 +833,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire åªæœ‰è¢«é¸ä¸ç¯©é¸çš„檔案/目錄會進行åŒæ¥ã€‚ 注æ„:篩é¸å™¨å°‡å¥—用到基本åŒæ¥ç›®éŒ„的相å°å稱。 </target> + <source>Hints:</source> <target>æ示:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. 輸入相å°æª”案或目錄å稱,使用 ';' 或空行分隔。</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. 使用è¬ç”¨å—å…ƒ '*' å’Œ '?'。</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. 經由內容é¸å–®ç›´æŽ¥åœ¨ä¸»è¦ç¶²æ ¼æŽ’除檔案。</target> + <source>Example</source> <target>例如</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -623,30 +857,40 @@ Exclude: \stuff\temp\* 包括:*.doc; *.zip; *.exe 排除:\stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>åŒæ¥æ‰€æœ‰ .doc, .zip å’Œ .exe 檔案,除了"temp"å資料夾ä¸çš„所有檔案。</target> + <source>Include</source> <target>包括</target> + <source>Exclude</source> <target>排除</target> -<source>Select time span:</source> -<target>é¸æ“‡æ™‚間範åœï¼š</target> -<source>Minimum file size:</source> -<target>最å°æª”案大å°ï¼š</target> -<source>Maximum file size:</source> -<target>最大檔案大å°ï¼š</target> + +<source>Minimum file size</source> +<target>最å°æª”案大å°</target> + +<source>Maximum file size</source> +<target>最大檔案大å°</target> + <source>&Default</source> <target>é è¨(&D)</target> + <source>Move column up</source> <target>上移一行</target> + <source>Move column down</source> <target>下移一行</target> -<source>Transactional File Copy</source> -<target></target> + +<source>Transactional file copy</source> +<target>異動檔案副本</target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> -<target></target> +<target>ç¬¬ä¸€æ¬¡å°‡æª”å¯«å…¥åˆ°ä¸€å€‹æš«å˜ (*.ffs_tmp) é †ä¾¿å°‡å®ƒå€‘é‡æ–°å‘½å。å³ä½¿åœ¨åš´é‡éŒ¯èª¤çš„情æ³ä¸‹ï¼Œé‚„å¯ç¢ºä¿ä¸€è‡´çš„狀態。</target> + <source>Copy locked files</source> <target>複製被鎖定的檔案</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -655,8 +899,10 @@ Copy shared or locked files using Volume Shadow Copy Service 複製共用或鎖定檔案使用使用å·å½±è¤‡è£½æœå‹™ (需è¦ç®¡ç†å“¡æ¬Šé™) </target> -<source>Copy filesystem permissions</source> + +<source>Copy file access permissions</source> <target>複製檔案系統權é™</target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -665,138 +911,217 @@ Transfer file and directory permissions å‚³è¼¸æª”æ¡ˆå’Œç›®éŒ„æ¬Šé™ (需è¦ç®¡ç†å“¡æ¬Šé™) </target> + <source>Hidden dialogs:</source> <target>éš±è—å°è©±æ¡†ï¼š</target> + <source>Reset</source> <target>é‡ç½®</target> + <source>Show hidden dialogs</source> <target>顯示隱è—çš„å°è©±æ¡†</target> + <source>External applications</source> <target>外部應用程å¼</target> + <source>Description</source> <target>æè¿°</target> + <source>Variant</source> <target>變數</target> + <source>Statistics</source> <target>統計</target> + <source>Find what:</source> <target>尋找內容:</target> + <source>Match case</source> <target>å€åˆ†å¤§å°å¯«</target> + <source>&Find next</source> <target>找下一個(&F)</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>您å¯èƒ½æœƒå˜—試å†æ¬¡åŒæ¥å‰©é¤˜é …ç›®(ä¸ç”¨é‡æ–°æ¯”å°)ï¼</target> -<source>Batch file created successfully!</source> -<target>批次檔新建æˆåŠŸï¼</target> + <source>Main bar</source> <target>主欄ä½</target> + <source>Folder pairs</source> <target>資料夾å°</target> + <source>Select view</source> <target>é¸æ“‡æª¢è¦–</target> + <source>Set direction:</source> <target>è¨å®šæ–¹å‘:</target> + <source>Exclude temporarily</source> <target>暫時排除</target> + <source>Include temporarily</source> <target>暫時包括</target> + <source>Exclude via filter:</source> <target>使用篩é¸å™¨æŽ’除:</target> + <source><multiple selection></source> <target><多é‡é¸æ“‡></target> + <source>D-Click</source> <target>點兩下</target> + <source>Delete</source> <target>刪除</target> + <source>Customize...</source> <target>自訂...</target> + +<source>Select time span...</source> +<target>é¸æ“‡æ™‚間範åœ...</target> + <source>Auto-adjust columns</source> <target>自動調整欄寬</target> + +<source>Icon size:</source> +<target></target> + +<source>Small</source> +<target></target> + +<source>Medium</source> +<target></target> + +<source>Large</source> +<target></target> + <source>Include all rows</source> <target>包括所有行</target> + <source>Exclude all rows</source> <target>排除所有行</target> + <source>Reset view</source> <target>é‡ç½®æª¢è¦–</target> + <source>Show "%x"</source> <target>顯示 "%x"</target> + <source><Last session></source> <target><最後連線></target> + <source>Configuration saved!</source> <target>é…置已儲å˜ï¼</target> + <source>Save changes to current configuration?</source> <target>è¦å„²å˜ç›®å‰é…置的更改嗎?</target> + <source>Configuration loaded!</source> -<target>已載入é…ç½®ï¼</target> +<target>é…置已載入ï¼</target> + <source>Folder Comparison and Synchronization</source> <target>資料夾比å°å’ŒåŒæ¥</target> + <source>Hide files that exist on left side only</source> <target>éš±è—åªå˜åœ¨æ–¼å·¦é‚Šçš„檔案</target> + <source>Show files that exist on left side only</source> <target>顯示åªå˜åœ¨æ–¼å·¦é‚Šçš„檔案</target> + <source>Hide files that exist on right side only</source> <target>éš±è—åªå˜åœ¨æ–¼å³é‚Šçš„檔案</target> + <source>Show files that exist on right side only</source> <target>顯示åªå˜åœ¨æ–¼å³é‚Šçš„檔案</target> + <source>Hide files that are newer on left</source> <target>éš±è—左邊較新的檔案</target> + <source>Show files that are newer on left</source> <target>顯示左邊較新的檔案</target> + <source>Hide files that are newer on right</source> <target>éš±è—å³é‚Šè¼ƒæ–°çš„檔案</target> + <source>Show files that are newer on right</source> <target>顯示å³é‚Šè¼ƒæ–°çš„檔案</target> + <source>Hide files that are equal</source> <target>éš±è—相åŒçš„檔案</target> + <source>Show files that are equal</source> <target>顯示相åŒçš„檔案</target> + <source>Hide files that are different</source> <target>éš±è—ä¸åŒçš„檔案</target> + <source>Show files that are different</source> <target>顯示ä¸åŒçš„檔案</target> + <source>Hide conflicts</source> <target>éš±è—è¡çª</target> + <source>Show conflicts</source> <target>顯示è¡çª</target> + <source>Hide files that will be created on the left side</source> <target>éš±è—左邊將被新建的檔案</target> + <source>Show files that will be created on the left side</source> <target>顯示左邊將被新建的檔案</target> + <source>Hide files that will be created on the right side</source> <target>éš±è—å³é‚Šå°‡è¢«æ–°å»ºçš„檔案</target> + <source>Show files that will be created on the right side</source> <target>顯示å³é‚Šå°‡è¢«æ–°å»ºçš„檔案</target> + <source>Hide files that will be deleted on the left side</source> <target>éš±è—左邊將被刪除的檔案</target> + <source>Show files that will be deleted on the left side</source> <target>顯示左邊將被刪除的檔案</target> + <source>Hide files that will be deleted on the right side</source> <target>éš±è—å³é‚Šå°‡è¢«åˆªé™¤çš„檔案</target> + <source>Show files that will be deleted on the right side</source> <target>顯示å³é‚Šå°‡è¢«åˆªé™¤çš„檔案</target> + <source>Hide files that will be overwritten on left side</source> <target>éš±è—左邊將被覆蓋的檔案</target> + <source>Show files that will be overwritten on left side</source> <target>顯示左邊將被覆蓋的檔案</target> + <source>Hide files that will be overwritten on right side</source> <target>éš±è—å³é‚Šå°‡è¢«è¦†è“‹çš„檔案</target> + <source>Show files that will be overwritten on right side</source> <target>顯示å³é‚Šå°‡è¢«è¦†è“‹çš„檔案</target> + <source>Hide files that won't be copied</source> <target>éš±è—å°‡ä¸æœƒè¢«è¤‡è£½çš„檔案</target> + <source>Show files that won't be copied</source> <target>顯示將ä¸æœƒè¢«è¤‡è£½çš„檔案</target> + <source>All directories in sync!</source> <target>åŒæ¥æ‰€æœ‰ç›®éŒ„ï¼</target> + <source>Please run a Compare first before synchronizing!</source> <target>執行åŒæ¥å‰è«‹å…ˆæ¯”å°ï¼</target> + <source>Comma separated list</source> <target>逗號分隔清單</target> + <source>Legend</source> <target>圖例</target> + <source>File list exported!</source> <target>檔案清單已匯出ï¼</target> + +<source>Batch file created successfully!</source> +<target>批次檔新建æˆåŠŸï¼</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -804,6 +1129,7 @@ Transfer file and directory permissions <target> <pluralform>%x 物件已æˆåŠŸåˆªé™¤ï¼</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -811,6 +1137,7 @@ Transfer file and directory permissions <target> <pluralform>%x 目錄</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -818,6 +1145,7 @@ Transfer file and directory permissions <target> <pluralform>%x 檔案</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -825,79 +1153,105 @@ Transfer file and directory permissions <target> <pluralform>顯示 %y 之 %x è¡Œ</pluralform> </target> + <source>Scanning...</source> <target>æ£åœ¨æŽƒçž„...</target> + <source>Comparing content...</source> <target>æ£åœ¨æ¯”å°æª”案内容...</target> + <source>Paused</source> <target>已暫åœ</target> + <source>Aborted</source> <target>å·²ä¸æ¢</target> + <source>Completed</source> <target>完æˆ</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>ä¸æ¢è«‹æ±‚:æ£åœ¨ç‰å¾…ç›®å‰æ“作完æˆ...</target> + <source>Continue</source> <target>繼續</target> + <source>Pause</source> <target>æš«åœ</target> + <source>Cannot find %x</source> <target>找ä¸åˆ° %x</target> -<source>DECISION TREE</source> -<target>決ç–樹</target> -<source>file exists on both sides</source> -<target>檔案在兩邊å‡å·²å˜åœ¨</target> -<source>on one side only</source> -<target>åªæœ‰ä¸€é‚Š</target> -<source>same date</source> -<target>相åŒæ—¥æœŸ</target> -<source>different date</source> -<target>ä¸åŒæ—¥æœŸ</target> + <source>Inactive</source> <target>åœç”¨</target> -<source>Second</source> -<target>秒</target> -<source>Minute</source> -<target>分</target> -<source>Hour</source> -<target>時</target> -<source>Day</source> -<target>天</target> + +<source>Last x hours</source> +<target>最後 x å°æ™‚</target> + +<source>Today</source> +<target>今日</target> + +<source>This week</source> +<target>本週</target> + +<source>This month</source> +<target>本月</target> + +<source>This year</source> +<target>今年</target> + <source>Byte</source> <target>ä½å…ƒçµ„</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>篩é¸å™¨ï¼šæ‰€æœ‰å°</target> + <source>Filter: Single pair</source> <target>篩é¸å™¨ï¼šå–®å°</target> + <source>Ignore</source> <target>忽略</target> + <source>Direct</source> <target>直接</target> + <source>Follow</source> <target>éµå¾ª</target> + +<source>Copy NTFS permissions</source> +<target>複製 NTFS 權é™</target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>æ•´åˆä¸Šä¸‹æ–‡åŠŸèƒ½è¡¨ä¸çš„外部應用程å¼ã€‚å¯ä»¥ä½¿ç”¨ä¸‹é¢çš„巨集:</target> + <source>- full file or directory name</source> <target>- 完整的檔å或目錄å稱</target> + <source>- directory part only</source> <target>- åªæœ‰ç›®éŒ„部份</target> + <source>- Other side's counterpart to %name</source> <target>- å¦ä¸€é‚Šå°æ‡‰åˆ° %name</target> + <source>- Other side's counterpart to %dir</source> <target>- å¦ä¸€é‚Šå°æ‡‰åˆ° %dir</target> + <source>Restore all hidden dialogs?</source> <target>è¦é‚„原全部隱è—çš„å°è©±æ¡†å—Žï¼Ÿ</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> </source> <target> -<pluralform>確定è¦å°‡ä¸‹åˆ— x% 物件移動到資æºå›žæ”¶ç’嗎?</pluralform> +<pluralform>確定è¦å°‡ä¸‹åˆ— %x 物件移動到資æºå›žæ”¶ç’嗎?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -905,139 +1259,211 @@ Transfer file and directory permissions <target> <pluralform>您確定è¦åˆªé™¤ä¸‹åˆ—çš„ %x 物件嗎?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>ä¿ç•™çµ¦æœªè§£æ±ºçš„è¡çª</target> + <source>Delete permanently</source> <target>永久刪除</target> + <source>Delete or overwrite files permanently</source> <target>永久刪除或覆蓋檔案</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>當刪除或覆蓋檔案時使用資æºå›žæ”¶ç’</target> + <source>Versioning</source> <target>版本控制</target> + <source>Move files into a time-stamped subdirectory</source> <target>移動檔案到一個時間標記的å目錄</target> -<source>Cannot determine sync-direction:</source> -<target>無法判斷åŒæ¥æ–¹å‘:</target> -<source>Filter settings have changed!</source> -<target>篩é¸å™¨è¨å®šå·²æ›´æ”¹ï¼</target> + <source>Both sides have changed since last synchronization!</source> <target>自上次åŒæ¥å¾Œï¼Œå…©é‚Šå‡å·²æ›´æ”¹éŽï¼</target> + +<source>Cannot determine sync-direction:</source> +<target>無法判斷åŒæ¥æ–¹å‘:</target> + <source>No change since last synchronization!</source> <target>自上次åŒæ¥ä»¥ä¾†éƒ½æ²’有變更ï¼</target> + +<source>Filter settings have changed!</source> +<target>篩é¸å™¨è¨å®šå·²æ›´æ”¹ï¼</target> + <source>The file was not processed by last synchronization!</source> <target>上次åŒæ¥æ™‚該檔案未被處ç†ï¼</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>計劃è¦åˆªé™¤çš„目錄與其å目錄和檔案是è¡çªçš„ï¼</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>è¨å®šé è¨åŒæ¥æ–¹å‘:舊檔案會被較新的檔案覆蓋。</target> + <source>The file does not contain a valid configuration:</source> <target>該檔案ä¸åŒ…å«æœ‰æ•ˆçš„é…置:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>您å¯ä»¥å¿½ç•¥æ¤éŒ¯èª¤ï¼Œè€ƒæ…®è©²ç›®éŒ„為空。</target> + <source>Directory does not exist:</source> <target>目錄ä¸å˜åœ¨ï¼š</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>目錄有ä¾é 性ï¼è«‹å°å¿ƒè¨å®šåŒæ¥è¦å‰‡ï¼š</target> + <source>Comparing content of files %x</source> <target>æ£åœ¨æ¯”å°æª”案内容的百分比 %x</target> + <source>Memory allocation failed!</source> <target>記憶體分é…失敗ï¼</target> + <source>File %x has an invalid date!</source> <target>檔案 %x 的日期無效ï¼</target> + <source>Conflict detected:</source> <target>檢測到è¡çªï¼š</target> + <source>Files %x have the same date but a different size!</source> <target>檔案 %x 日期相åŒä½†å¤§å°ä¸åŒï¼</target> + <source>Symlinks %x have the same date but a different target!</source> <target>ç¬¦è™Ÿé€£çµ %x 有相åŒæ—¥æœŸä½†æ˜¯ä¸åŒç›®æ¨™ï¼</target> + <source>Comparing files by content failed.</source> <target>比å°æª”案內容失敗。</target> + <source>Generating file list...</source> <target>產生檔案清單...</target> + <source>Multiple...</source> <target>多個...</target> + <source>Both sides are equal</source> <target>兩邊都相åŒ</target> + <source>Files/folders differ in attributes only</source> <target>檔案/資料夾僅在於ä¸åŒçš„屬性</target> + <source>Copy new file/folder to left</source> <target>複製新檔案/資料夾到左邊</target> + <source>Copy new file/folder to right</source> <target>複製新檔案/資料夾到å³é‚Š</target> + <source>Delete left file/folder</source> <target>刪除左邊檔案/資料夾</target> + <source>Delete right file/folder</source> <target>刪除å³é‚Šæª”案/資料夾</target> + <source>Overwrite left file/folder with right one</source> <target>用é©åˆæª”案/資料夾覆蓋左邊檔案/資料夾</target> + <source>Overwrite right file/folder with left one</source> <target>用é©åˆæª”案/資料夾覆蓋å³é‚Šæª”案/資料夾</target> + <source>Do nothing</source> <target>ç¶æŒåŽŸç‹€</target> + <source>Copy file attributes only to left</source> <target>åªè¤‡è£½æª”案屬性到左邊</target> + <source>Copy file attributes only to right</source> <target>åªè¤‡è£½æª”案屬性到å³é‚Š</target> + <source>Deleting file %x</source> <target>æ£åœ¨åˆªé™¤æª”案 %x</target> -<source>Deleting Symbolic Link %x</source> -<target>æ£åœ¨åˆªé™¤ç¬¦è™Ÿé€£çµ %x</target> + <source>Deleting folder %x</source> <target>æ£åœ¨åˆªé™¤è³‡æ–™å¤¾ %x</target> -<source>Moving %x to Recycle Bin</source> -<target>æ£åœ¨ç§»å‹• %x 到資æºå›žæ”¶ç’</target> -<source>Moving file %x to user-defined directory %y</source> -<target>æ£åœ¨ç§»å‹•æª”案 %x 到自定義目錄 %y</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>æ£åœ¨ç§»å‹•è³‡æ–™å¤¾ %x 到自定義目錄 %y</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>æ£åœ¨ç§»å‹•ç¬¦è™Ÿé€£çµ %x 到自定義目錄 %y</target> -<source>Copying new file %x to %y</source> -<target>複製新檔案 %x 到 %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>è¤‡è£½ç¬¦è™Ÿé€£çµ %x 到 %y</target> -<source>Overwriting file %x in %y</source> -<target>覆蓋檔案 %x 在 %y</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>è¦†è“‹ç¬¦è™Ÿé€£çµ %x 在 %y</target> + +<source>Deleting symbolic link %x</source> +<target>æ£åœ¨åˆªé™¤ç¬¦è™Ÿé€£çµ %x</target> + +<source>Moving file %x to recycle bin</source> +<target>æ£åœ¨ç§»å‹•æª”案 %x 到資æºå›žæ”¶ç’</target> + +<source>Moving folder %x to recycle bin</source> +<target>æ£åœ¨ç§»å‹•è³‡æ–™å¤¾ %x 到資æºå›žæ”¶ç’</target> + +<source>Moving symbolic link %x to recycle bin</source> +<target>æ£åœ¨ç§»å‹•ç¬¦è™Ÿé€£çµ %x 到資æºå›žæ”¶ç’</target> + +<source>Moving file %x to %y</source> +<target>æ£åœ¨ç§»å‹•æª”案 %x 到 %y</target> + +<source>Moving folder %x to %y</source> +<target>æ£åœ¨ç§»å‹•è³‡æ–™å¤¾ %x 到 %y</target> + +<source>Moving symbolic link %x to %y</source> +<target>æ£åœ¨ç§»å‹•ç¬¦è™Ÿé€£çµ %x 到 %y</target> + +<source>Creating file %x</source> +<target>æ£åœ¨æ–°å»ºæª”案 %x</target> + +<source>Creating symbolic link %x</source> +<target>æ£åœ¨æ–°å»ºç¬¦è™Ÿé€£çµ %x</target> + <source>Creating folder %x</source> <target>æ£åœ¨æ–°å»ºè³‡æ–™å¤¾ %x</target> + +<source>Overwriting file %x</source> +<target>æ£åœ¨è¦†è“‹æª”案 %x</target> + +<source>Overwriting symbolic link %x</source> +<target>æ£åœ¨è¦†è“‹ç¬¦è™Ÿé€£çµ %x</target> + <source>Verifying file %x</source> -<target>é©—è‰æª” %x</target> +<target>æ£åœ¨é©—è‰æª”案 %x</target> + <source>Updating attributes of %x</source> -<target>æ›´æ–° %x 個的屬性</target> -<source>Source directory does not exist anymore:</source> -<target>來æºç›®éŒ„ä¸å˜åœ¨ï¼š</target> -<source>Nothing to synchronize according to configuration!</source> -<target>æ ¹æ“šé…置没有任何åŒæ¥ï¼</target> +<target>æ£åœ¨æ›´æ–° %x 個的屬性</target> + <source>Target directory name must not be empty!</source> <target>目標目錄å稱ä¸èƒ½ç©ºç™½ï¼</target> + <source>User-defined directory for deletion was not specified!</source> <target>未指定è¦åˆªé™¤çš„自定義目錄ï¼</target> + +<source>Source directory does not exist anymore:</source> +<target>來æºç›®éŒ„ä¸å˜åœ¨ï¼š</target> + <source>Unresolved conflicts existing!</source> <target>å˜åœ¨æœªè§£æ±ºçš„è¡çªï¼</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>ä½ å¯ä»¥å¿½ç•¥è¡çªï¼Œä¸¦ç¹¼çºŒåŒæ¥ã€‚</target> + <source>Significant difference detected:</source> <target>檢測到顯著的差異:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>超éŽç¸½æ•¸ 50% 以上的檔案將被複製或刪除ï¼</target> + <source>Not enough free disk space available in:</source> <target>æ²’æœ‰è¶³å¤ çš„å¯ç”¨ç©ºé–“:</target> + <source>Free disk space required:</source> <target>所需è¦çš„å¯ç”¨ç£ç¢Ÿç©ºé–“:</target> + <source>Free disk space available:</source> <target>å¯ç”¨ç£ç¢Ÿç©ºé–“:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target></target> +<target>資æºå›žæ”¶ç’ä¸å¯ç”¨æ–¼ä»¥ä¸‹è·¯å¾‘ï¼ç›¸å的,檔案將永é 被刪除:</target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>一個目錄將被修改,這是多å°è³‡æ–™å¤¾çš„一部份ï¼è«‹æª¢é–±åŒæ¥è¨å®šï¼</target> + <source>Processing folder pair:</source> <target>處ç†ä¸€å°è³‡æ–™å¤¾ï¼š</target> + <source>Generating database...</source> <target>產生資料庫...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>æ ¹æ“šé…置没有任何åŒæ¥ï¼</target> + <source>Error copying locked file %x!</source> <target>複製已鎖定檔案錯誤 %xï¼</target> + <source>Data verification error: Source and target file have different content!</source> -<target>資料驗è‰éŒ¯èª¤ï¼šä¾†æºå’Œç›®çš„檔案內容ä¸åŒï¼</target> +<target>資料驗è‰éŒ¯èª¤ï¼šä¾†æºå’Œç›®æ¨™æª”案內容ä¸åŒï¼</target> + diff --git a/BUILD/Languages/czech.lng b/BUILD/Languages/czech.lng index c286f417..f7da8b36 100644 --- a/BUILD/Languages/czech.lng +++ b/BUILD/Languages/czech.lng @@ -8,75 +8,116 @@ </header> <source>Searching for directory %x...</source> -<target></target> +<target>OtevÃránà adresáře %x</target> + <source>Show in Explorer</source> <target>Zobrazit v PrůzkumnÃkovi</target> + <source>Open with default application</source> <target>OtevÅ™Ãt výchozà aplikacÃ</target> + <source>Browse directory</source> <target>Procházet adresář</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Automatická synchronizace</target> + <source>Browse</source> <target>Procházet</target> -<source>Invalid commandline: %x</source> + +<source>Invalid command line: %x</source> <target>Neplatný pÅ™Ãkaz: %x</target> + <source>Error resolving symbolic link:</source> <target>Chyba odkazu zástupce:</target> -<source>Show popup</source> + +<source>Show pop-up</source> <target>Zobrazit okno</target> -<source>Show popup on errors or warnings</source> + +<source>Show pop-up on errors or warnings</source> <target>Zobrazit hlášenà pÅ™i chybÄ› nebo varovánÃ</target> + <source>Ignore errors</source> -<target>Ignorovat chyby</target> +<target>PÅ™eskoÄit chyby</target> + <source>Hide all error and warning messages</source> <target>Skrýt vÅ¡echny chyby a varovánÃ</target> + <source>Exit instantly</source> <target>UkonÄit ihned</target> + <source>Abort synchronization immediately</source> <target>PÅ™eruÅ¡it synchronizaci ihned</target> + +<source>Select alternate comparison settings</source> +<target>ZmÄ›nit nastavenà porovnánÃ</target> + <source>Select alternate synchronization settings</source> -<target>Vyberte alternativnà nastavenà synchronizace</target> +<target>ZmÄ›nit nastavenà synchronizace</target> + <source>No filter selected</source> <target>Nenà vybrán žádný filtr</target> + <source>Filter is active</source> <target>Filtr je zapnutý</target> -<source>Clear filter settings</source> -<target>Smazat nastavenà filtru</target> + <source>Remove alternate settings</source> -<target>Odstranit jiné nastavenÃ</target> +<target>ZruÅ¡it jiné nastavenÃ</target> + +<source>Clear filter settings</source> +<target>ZruÅ¡it nastavenà filtru</target> + <source>Create a batch job</source> <target>VytvoÅ™it dávku</target> + <source>Synchronization settings</source> <target>Nastavenà synchronizace</target> + <source>Comparison settings</source> <target>Nastavenà porovnánÃ</target> + <source>About</source> <target>O Programu</target> + <source>Error</source> <target>Chyba</target> + <source>Warning</source> <target>VarovánÃ</target> + <source>Question</source> <target>Dotaz</target> + <source>Confirm</source> <target>Potvrdit</target> + <source>Configure filter</source> <target>Nastavenà filtru</target> + <source>Customize columns</source> <target>Vlastnà sloupce</target> + <source>Global settings</source> <target>Nastavenà programu</target> + <source>Synchronization Preview</source> <target>Náhled synchronizace</target> + <source>Find</source> <target>NajÃt</target> + +<source>Select time span</source> +<target>ÄŒasové rozmezÃ</target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -86,46 +127,64 @@ <pluralform>%x B</pluralform> <pluralform>%x B</pluralform> </target> + <source><Symlink></source> <target><Symlink></target> + <source><Directory></source> <target><Adresář></target> + <source>Size</source> <target>Velikost</target> + <source>Date</source> <target>ÄŒas</target> + <source>Full path</source> <target>Plná cesta</target> + <source>Filename</source> <target>Jméno</target> + <source>Relative path</source> <target>Relativnà cesta</target> + <source>Directory</source> <target>Adresář</target> + <source>Extension</source> <target>PÅ™Ãpona</target> + <source>Comparison Result</source> <target>Výsledek porovnánÃ</target> + <source>Incompatible synchronization database format:</source> <target>Chyba formátu synchronizaÄnà databáze:</target> + <source>Initial synchronization:</source> <target>Prvotnà synchronizace:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>NÄ›který z databázových souborů FreeFileSync neexistuje:</target> + <source>Error reading from synchronization database:</source> <target>Chyba Ätenà synchronizaÄnà databáze:</target> + <source>Database files do not share a common synchronization session:</source> -<target></target> +<target>Databázové soubory nejsou navzájem komplementárnÃ</target> + <source>An exception occurred!</source> <target>Vyskytla se chyba!</target> -<source>Error deleting file:</source> -<target>Chyba mazánà souboru:</target> + <source>Error reading file attributes:</source> <target>Chyba Ätenà atributů souboru:</target> + <source>Waiting while directory is locked (%x)...</source> <target>ÄŒekánà na uzamÄenà adresáře (%x)</target> + <source>Error setting directory lock:</source> <target>Chyba nastavenà zámku adresáře:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -135,27 +194,41 @@ <pluralform>%x sekundy</pluralform> <pluralform>%x sekund</pluralform> </target> + <source>Info</source> <target>Info</target> + <source>Fatal Error</source> <target>Závažná chyba</target> + <source>Scanning:</source> <target>Zpracováváno:</target> + <source>Encoding extended time information: %x</source> <target>Zpracovánà rozÅ¡ÃÅ™ené informace o Äase: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> -<target></target> +<target> +<pluralform>[1 proces]</pluralform> +<pluralform>[%x procesy]</pluralform> +<pluralform>[%x procesů]</pluralform> +</target> + <source>Invalid FreeFileSync config file!</source> <target>Chybný konfiguraÄnà soubor FreeFileSync!</target> + <source>File does not exist:</source> <target>Soubor neexistuje:</target> + <source>Error parsing configuration file:</source> <target>Chyba zpracovánà konfigurace:</target> + <source>/sec</source> <target>/s</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -165,6 +238,7 @@ <pluralform>%x minuty</pluralform> <pluralform>%x minut</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -174,6 +248,7 @@ <pluralform>%x hodiny</pluralform> <pluralform>%x hodin</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -183,28 +258,40 @@ <pluralform>%x dny</pluralform> <pluralform>%x dnů</pluralform> </target> + <source>S&ave configuration...</source> <target>&Uloženà konfigurace...</target> + <source>&Load configuration...</source> <target>&NaÄÃst konfiguraci...</target> + <source>&Quit</source> <target>U&konÄit</target> + <source>&File</source> <target>&Soubor</target> + <source>&Content</source> <target>&Obsah</target> + <source>&About...</source> <target>&O Programu...</target> + <source>&Help</source> <target>&Pomoc</target> + <source>Usage:</source> <target>PoužitÃ:</target> + <source>1. Select directories to monitor.</source> <target>1. Vyberte adresáře pro sledovánÃ.</target> + <source>2. Enter a command line.</source> <target>2. Zadejte pÅ™Ãkazovou řádku.</target> + <source>3. Press 'Start'.</source> <target>3. ZmáÄknÄ›te 'Start'</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -215,310 +302,461 @@ PÅ™Ãkazová řádka je spuÅ¡tÄ›na pokaždé když: - jsou k dispozici vÅ¡echny adresáře (napÅ™. vloženÃm USB disku) - dojde ke zmÄ›nÄ› souborů v adresáři nebo podadresářÃch </target> + <source>Directories to watch</source> <target>Sledované adresáře</target> + <source>Add folder</source> <target>PÅ™idat adresář</target> + <source>Remove folder</source> <target>Odstranit adresář</target> + <source>Select a folder</source> <target>Vyberte adresář</target> + <source>Command line</source> <target>PÅ™Ãkazová řádka</target> + <source>Minimum Idle Time [seconds]</source> <target>Minimálnà Äas prodlevy [v sekundách]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>Prodleva mezi detekcà poslednà zmÄ›ny a spuÅ¡tÄ›nÃm pÅ™Ãkazu (v sekundách)</target> + <source>Start</source> <target>Start</target> + <source>(Build: %x)</source> <target>(Build: %x)</target> + <source>RealtimeSync configuration</source> <target>Konfigurace RealtimeSync</target> + <source>File already exists. Overwrite?</source> <target>Soubor již existuje. PÅ™epsat?</target> + <source>&Restore</source> <target>&Obnovit</target> + <source>&Exit</source> <target>&Konec</target> + <source>Monitoring active...</source> <target>Sledovánà zapnuto...</target> + <source>Waiting for missing directories...</source> <target>ÄŒekánà na nedostupné adresáře...</target> + <source>A directory input field is empty.</source> <target>Nenà zadán vstupnà adresář.</target> + <source>Drag && drop</source> <target>Drag && Drop</target> + <source>Could not initialize directory monitoring:</source> <target>Nelze nastavit monitorovánà adresáře:</target> + <source>Error when monitoring directories.</source> <target>Chyba pÅ™i sledovánà adresářů.</target> + <source>Conversion error:</source> <target>Chyba konverze:</target> + +<source>Error deleting file:</source> +<target>Chyba mazánà souboru:</target> + <source>Error moving file:</source> <target>Chyba pÅ™esouvánà souboru:</target> + <source>Target file already existing!</source> <target>CÃlový soubor již existuje!</target> + <source>Error moving directory:</source> <target>Chyba pÅ™esouvánà adresáře:</target> + <source>Target directory already existing!</source> <target>CÃlový adresář již existuje!</target> + <source>Error deleting directory:</source> <target>Chyba mazánà adresáře:</target> + <source>Error changing modification time:</source> <target>Chyba nastavenà Äasu zmÄ›ny:</target> + <source>Error loading library function:</source> <target>Chyba naÄtenà knihovny funkcÃ:</target> + <source>Error reading security context:</source> <target>Chyba pÅ™i Ätenà pÅ™Ãstupových práv:</target> + <source>Error writing security context:</source> <target>Chyba pÅ™i zápisu pÅ™Ãstupových práv:</target> + <source>Error copying file permissions:</source> <target>Chyba kopÃrovánà oprávnÄ›nà souborů:</target> + <source>Error creating directory:</source> <target>Chyba vytvoÅ™enà adresáře:</target> + <source>Error copying symbolic link:</source> <target>Chyba kopÃrovánà zástupce:</target> + <source>Error copying file:</source> <target>Chyba kopÃrovánà souboru:</target> + <source>Error opening file:</source> <target>Chyba otevÅ™enà souboru:</target> + <source>Error writing file:</source> <target>Chyba zápisu souboru:</target> + <source>Error reading file:</source> <target>Chyba Ätenà souboru:</target> + <source>Operation aborted!</source> <target>Operace zruÅ¡ena!</target> + <source>Endless loop when traversing directory:</source> <target>Zacyklenà pÅ™i procházenà adresáře:</target> + <source>Error traversing directory:</source> <target>Chyba procházenà adresáře:</target> + <source>Windows Error Code %x:</source> <target>Chybový kód Windows %x:</target> + <source>Linux Error Code %x:</source> <target>Chybový kód Linux %x:</target> + <source>Error setting privilege:</source> <target>Chyba nastavenà práv:</target> + <source>Error moving to Recycle Bin:</source> <target>Chyba pÅ™esunu do KoÅ¡e:</target> + <source>Could not load a required DLL:</source> <target>Nelze naÄÃst požadovanou knihovnu DLL:</target> + <source>Error writing to synchronization database:</source> <target>Chyba zápisu synchronizaÄnà databáze:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>Chyba spuÅ¡tÄ›nà služby Volume Shadow Copy Service!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target>Chyba pÅ™Ãstupu ke službÄ› Volume Shadow Copy Service!</target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>Vytvářenà stÃnových kopià na WOW64 nenà podporováno. ProsÃm použijte 64 bitovou verzi FreeFileSync.</target> + <source>Could not determine volume name for file:</source> <target>Nenà možné zjistit jméno jednotky souboru:</target> + <source>Volume name %x not part of filename %y!</source> <target>Disk %x nenà souÄástà jména souboru %y!</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>Nelze naÄÃst hodnoty následujÃcÃch XML elementy:</target> + <source>Logging</source> <target>ZaznamenávánÃ</target> + <source>FreeFileSync batch file</source> <target>FreeFileSync dávkový soubor</target> + <source>FreeFileSync configuration</source> <target>Konfigurace FreeFileSync</target> + <source>FreeFileSync Batch Job</source> <target>FreeFileSync Dávkové zpracovánÃ</target> + <source>Unable to create logfile!</source> <target>nenà možné vytvoÅ™it záznamový soubor!</target> + <source>Batch execution</source> <target>SpuÅ¡tÄ›nà dávky</target> + <source>Log-messages:</source> <target>Záznamy:</target> + <source>Stop</source> <target>Stop</target> + <source>Total time:</source> <target>Celkový Äas:</target> + <source>Synchronization aborted!</source> <target>Synchronizace zruÅ¡ena!</target> + <source>Synchronization completed with errors!</source> <target>Synchronizace dokonÄena s chybami.</target> + <source>Synchronization completed successfully!</source> <target>Synchronizace dokonÄena úspěšnÄ›!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>TalÄÃtkem "PÅ™epnout" otevÅ™ete okno FreeFileSync.</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>OtevÃránà okna FreeFileSync...</target> + <source>Unable to connect to sourceforge.net!</source> <target>Nenà možné se pÅ™ipojit k sourceforge.net!</target> + <source>A newer version of FreeFileSync is available:</source> <target>Je dostupná novÄ›jÅ¡Ã verze FreeFileSync:</target> + <source>Download now?</source> <target>Stáhnout nynÃ?</target> + <source>Information</source> <target>Informace</target> + <source>FreeFileSync is up to date!</source> <target>FreeFileSync je aktuálnÃ!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>Chcete aby FreeFileSync automaticky zjiÅ¡Å¥oval aktualizace každý týden?</target> + <source>(Requires an Internet connection!)</source> <target>(Vyžaduje pÅ™ipojenà k internetu!)</target> + <source>1. &Compare</source> <target>1. &Porovnat</target> + <source>2. &Synchronize...</source> <target>2. &Synchronizovat...</target> + <source>S&witch view</source> <target>&ZmÄ›nit zobrazenÃ</target> + <source>&New</source> <target>&Nový</target> + <source>&Program</source> <target>&Nástroje</target> + <source>&Language</source> <target>&Jazyk</target> + <source>&Global settings...</source> <target>&NastavenÃ...</target> + <source>&Create batch job...</source> <target>&VytvoÅ™it dávku...</target> + <source>&Export file list...</source> <target>&Exportovat seznam souborů...</target> + <source>&Advanced</source> <target>&UpÅ™esnit</target> + <source>&Check for new version</source> <target>Zkontrolovat &aktualizace</target> + <source>Compare</source> <target>PorovnánÃ</target> + <source>Compare both sides</source> <target>Porovnat obÄ› strany</target> + <source>&Abort</source> -<target>&PÅ™eruÅ¡it</target> +<target>&UkonÄit</target> + <source>Synchronize...</source> <target>Synchronizace</target> + <source>Start synchronization</source> <target>Start synchronizace</target> -<source>Swap sides</source> -<target>ZmÄ›na stran</target> + <source>Add folder pair</source> <target>PÅ™idat adresář pro porovnánÃ</target> + <source>Remove folder pair</source> <target>Odstranit dvojici adresářů</target> + +<source>Swap sides</source> +<target>ZmÄ›na stran</target> + <source>Save current configuration to file</source> <target>Uložit zmÄ›ny do konfiguraÄnÃho souboru</target> + <source>Load configuration from file</source> <target>NaÄÃst konfiguraci ze souboru</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>PoslednÄ› použité konfigurace (pomocà DEL můžete položku smazat)</target> + <source>Hide excluded items</source> <target>Skrýt vynechané položky</target> + <source>Hide filtered or temporarily excluded files</source> <target>Skrýt filtrované nebo doÄasnÄ› vynechané soubory</target> + <source>Number of files and directories that will be created</source> <target>PoÄet souborů a adresářů k vytvoÅ™enÃ</target> + <source>Number of files that will be overwritten</source> <target>PoÄet souborů a adresářů k pÅ™epsánÃ</target> + <source>Number of files and directories that will be deleted</source> <target>PoÄet souborů a adresářů ke smazánÃ</target> + <source>Total amount of data that will be transferred</source> <target>Celkový objem dat, který bude pÅ™enesen</target> -<source>Left</source> -<target>Levý</target> -<source>Right</source> -<target>Pravý</target> + <source>Batch job</source> <target>Dávkový soubor</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>Vytvořà dávkový souboru pro automatický provoz. Ke spuÅ¡tÄ›nà dávky jednoduÅ¡e poklikejte na vytvoÅ™ený soubor nebo jejho jméno zadejte jako parametr pÅ™i spuÅ¡tÄ›nà FreeFileSync: FreeFileSync.exe <batchfile>. StejnÄ› tak můžete ke spuÅ¡tÄ›nà využÃt plánovaÄ Ãºloh vaÅ¡eho operaÄnÃho systému.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target>Vytvořà dávkový souboru pro automatický provoz. Ke spuÅ¡tÄ›nà dávky jednoduÅ¡e poklikejte na vytvoÅ™ený soubor nebo jeho jméno zadejte jako parametr pÅ™i spuÅ¡tÄ›nà FreeFileSync: FreeFileSync.exe <jméno_souboru>. StejnÄ› tak můžete ke spuÅ¡tÄ›nà využÃt plánovaÄ Ãºloh vaÅ¡eho operaÄnÃho systému.</target> + <source>Help</source> <target>NápovÄ›da</target> + <source>Filter files</source> <target>Filtr souborů</target> + <source>Error handling</source> <target>Zpracovánà chyb</target> + +<source>Left</source> +<target>Levý</target> + +<source>Right</source> +<target>Pravý</target> + <source>Overview</source> <target>PÅ™ehled</target> + <source>Status feedback</source> <target>BÄ›h programu</target> + <source>Run minimized</source> -<target></target> +<target>Minimalizovat</target> + <source>Maximum number of logfiles:</source> -<target>Maximálnà poÄet záznamových soubor</target> +<target>Maximálnà poÄet záznamových souborů:</target> + <source>Select logfile directory:</source> <target>Vyberte adresář pro záznamové soubory:</target> + <source>Batch settings</source> -<target></target> +<target>NastavenÃ</target> + <source>&Save</source> <target>&Uložit</target> + <source>&Load</source> <target>&NaÄÃst</target> + <source>&Cancel</source> <target>&ZruÅ¡it</target> + <source>Elements found:</source> <target>Nalezeno položek:</target> + <source>Elements remaining:</source> <target>Zbývá položek:</target> + <source>Speed:</source> <target>Rychlost:</target> + <source>Time remaining:</source> <target>ZbývajÃcà Äas:</target> + <source>Time elapsed:</source> <target>Uplynulý Äas:</target> + <source>Operation:</source> <target>Operace:</target> + <source>Select variant:</source> <target>Vyberte variantu:</target> + <source><Automatic></source> -<target><Automaticky></target> +<target><- Automaticky -></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>Rozpoznat a provést zmÄ›ny na obou stranách pomocà databáze. OdstranÄ›né soubory a konflikty budou detekovány automaticky.</target> + <source>Mirror ->></source> <target>Zrcadlenà ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Zrcadlenà levého adresáře. Pravý adresář bude zmÄ›nÄ›n tak, aby po synchronizaci byl totožný s levým.</target> + <source>Update -></source> <target>Aktualizuj -></target> + <source>Copy new or updated files to right folder.</source> <target>KopÃrovat nové nebo aktualizované soubory do adresáře vpravo.</target> + <source>Custom</source> <target>VlastnÃ</target> + <source>Configure your own synchronization rules.</source> <target>Nastavenà vlastnÃch pravidel synchronizace.</target> + <source>Deletion handling</source> <target>Nastavenà mazánÃ</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>Konfigurace</target> + <source>Category</source> <target>Kategorie</target> + <source>Action</source> <target>Akce</target> + <source>File/folder exists on left side only</source> <target>Soubory/adresáře, které existujà pouze vlevo</target> + <source>File/folder exists on right side only</source> <target>Soubory/adresáře, které existujà pouze vpravo</target> + <source>Left file is newer</source> <target>Levý soubor je novÄ›jÅ¡Ã</target> + <source>Right file is newer</source> <target>Pravý soubor je novÄ›jÅ¡Ã</target> + <source>Files have different content</source> <target>Soubory, které majà rozdÃlný obsah</target> + <source>Conflict/file cannot be categorized</source> <target>Konflikty/soubory které nelze zaÅ™adit</target> + <source>Compare by...</source> <target>Porovnat ...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> <target> Soubory jsou shodné jestliže - - velikost souboru - datum i Äas poslednà zmÄ›ny + - velikost souboru jsou stejné </target> -<source>File size and date</source> + +<source>File time and size</source> <target>Podle velikosti a data souboru</target> + <source> Files are found equal if - file content @@ -529,92 +767,85 @@ Soubory jsou shodné jestliže - obsah souboru je stejný </target> + <source>File content</source> <target>Podle obsahu souboru</target> + <source>Symbolic Link handling</source> <target>Zpracovánà symbolických odkazů</target> + <source>Synchronizing...</source> <target>Synchronizuji...</target> + <source>Elements processed:</source> <target>Zpracováno položek:</target> + <source>&Pause</source> <target>&Pauza</target> -<source>Compare by "File size and date"</source> -<target>Porovnat "podle velikosti a data souboru"</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>Tato varianta vyhodnotà dva stejnÄ› pojmenované soubory jako shodné pokud majà i stejnou velikost A ZÃROVEŇ i datum a Äas poslednà zmÄ›ny.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>Když je zahájeno porovnávánà s tÃmto nastavenÃm, je použito následujÃcà schéma rozhodovánÃ:</target> -<source>As a result the files are separated into the following categories:</source> -<target>Jako výsledek jsou soubory rozdÄ›leny do následujÃcÃch kategoriÃ:</target> -<source>- equal</source> -<target>- stejné</target> -<source>- left newer</source> -<target>- vlevo novÄ›jÅ¡Ã</target> -<source>- right newer</source> -<target>- vpravo novÄ›jÅ¡Ã</target> -<source>- exists left only</source> -<target>- existuje pouze na levé stranÄ›</target> -<source>- exists right only</source> -<target>- existuje pouze na pravé stranÄ›</target> -<source>- conflict (same date, different size)</source> -<target>- konflikt (stejné datum, jiná velikost)</target> -<source>Compare by "File content"</source> -<target>Porovnat "podle obsahu souboru"</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. - -With this option enabled the decision tree is smaller: -</source> -<target> -Jak název napovÃdá, dva soubory majÃcà stejné jméno jsou oznaÄeny za shodné jen a pouze pokud majà shodný obsah. Toto nastavenà je vhodné spÃÅ¡e pro sledovánà konzistence než pro zálohovánÃ. Proto nejsou data zmÄ›n souborů brána vůbec v potaz. -Pokud vyberete toto nastavenà bude schéma rozhodovánà kratÅ¡Ã: -</target> -<source>- different</source> -<target>- rozdÃlné</target> <source>Source code written in C++ utilizing:</source> <target>Zdrojový kód byl napsán kompletnÄ› v C++ s pomocÃ:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>PodÄ›kovánà za pÅ™eklad FreeFileSync:</target> + <source>Feedback and suggestions are welcome at:</source> <target>Komentáře a námÄ›ty zasÃlejte na:</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync na Sourceforge</target> + <source>Homepage</source> <target>Homepage</target> + <source>If you like FFS</source> <target>Pokud se Vám FSS lÃbÃ</target> + <source>Donate with PayPal</source> <target>PÅ™ispÄ›t pomocà PayPal</target> + <source>Email</source> <target>Email</target> + <source>Report translation error</source> <target>Hlásit chyby pÅ™ekladu</target> + <source>Published under the GNU General Public License:</source> <target>Vydáno podle GNU General Public License (GPL):</target> + <source>Ignore subsequent errors</source> -<target>Ignorovat dalÅ¡Ã chyby</target> +<target>PÅ™eskoÄit dalÅ¡Ã chyby</target> + <source>Hide further error messages during the current process</source> <target>Nezobrazovat dalÅ¡Ã chybová hlášenà bÄ›hem zpracovánÃ</target> + <source>&Ignore</source> <target>&PokraÄovat</target> + <source>&Retry</source> <target>&Opakovat</target> + <source>Do not show this dialog again</source> <target>Tento dialog již nezobrazovat</target> + <source>&Switch</source> <target>&PÅ™epnout</target> + <source>&Yes</source> <target>&Ano</target> + <source>&No</source> <target>&Ne</target> + <source>Delete on both sides</source> <target>Smazat z obou stran</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>Smazat na obou stranách i když je soubor vybrán pouze na jedné z nich</target> + <source>Use Recycle Bin</source> <target>PoužÃt KoÅ¡</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -623,16 +854,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire Pouze soubory/adresáře odpovÃdajÃcà nastavenému filtru budou vybrány pro synchronizaci. Poznámka: Filtr je aplikován relativnÄ›(!) k cestÄ› synchronizovaných adresářů. </target> + <source>Hints:</source> <target>NápovÄ›da:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. Můžete použÃt relativnà cesty k souboru nebo adresáři oddÄ›lené ';' nebo řádkem.</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. Můžete použÃt zástupné znaky (wildcard) '*' a '?'.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. Můžete použÃt pro vynechávánà souborů pÅ™Ãmo kontextového menu.</target> + <source>Example</source> <target>PÅ™Ãklad</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -641,30 +878,40 @@ Exclude: \stuff\temp\* PÅ™idat: *.doc;*.zip;*.exe Vynechat: \nÄ›kde\nÄ›co\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>Synchronizovat vÅ¡echny soubory .doc, .zip a .exe s výjimkou vÅ¡eho v podadresáři "nÄ›kde\nÄ›co"</target> + <source>Include</source> <target>PÅ™idat</target> + <source>Exclude</source> <target>Vynechat</target> -<source>Select time span:</source> -<target>PoslednÃch:</target> -<source>Minimum file size:</source> -<target>Minimálnà velikost souboru:</target> -<source>Maximum file size:</source> + +<source>Minimum file size</source> <target>Minimálnà velikost souboru:</target> + +<source>Maximum file size</source> +<target>Maximálnà velikost souboru:</target> + <source>&Default</source> <target>&PÅ™eddefinované</target> + <source>Move column up</source> <target>PÅ™esunout sloupec nahoru</target> + <source>Move column down</source> <target>PÅ™esunout sloupec dolů</target> -<source>Transactional File Copy</source> -<target></target> + +<source>Transactional file copy</source> +<target>BezpeÄné kopÃrovánà souborů</target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> -<target></target> +<target>KopÃruje data nejprve do pomocného souboru (*.ffs_tmp) a poté teprve soubor pÅ™ejmenuje. Tento postup zajiÅ¡Å¥uje bezpeÄné chovánà i v pÅ™ÃpadÄ› chyby bÄ›hem pÅ™enosu</target> + <source>Copy locked files</source> <target>KopÃrovat zamÄené soubory</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -673,8 +920,10 @@ Copy shared or locked files using Volume Shadow Copy Service KopÃrovat sdÃlené nebo zamÄené soubory pomocà Volume Shadow Copy Service (Vyžaduje administrátorské oprávnÄ›nÃ) </target> -<source>Copy filesystem permissions</source> -<target>KopÃrovat oprávnÄ›nà k souborům</target> + +<source>Copy file access permissions</source> +<target>KopÃrovat pÅ™Ãstupová oprávnÄ›nà k souborům</target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -683,138 +932,205 @@ Transfer file and directory permissions PÅ™enést pÅ™Ãstupová oprávnÄ›nà souborů a adresářů (Vyžaduje administrátorké oprávnÄ›nÃ) </target> + <source>Hidden dialogs:</source> <target>Skryté dialogy:</target> + <source>Reset</source> <target>Resetovat</target> + <source>Show hidden dialogs</source> <target>Zobrazit skryté dialogy</target> + <source>External applications</source> <target>Externà aplikace</target> + <source>Description</source> <target>Popis</target> + <source>Variant</source> <target>Varianta</target> + <source>Statistics</source> <target>Statistika</target> + <source>Find what:</source> <target>NajÃt:</target> + <source>Match case</source> <target>RozliÅ¡ovat malá a velká pÃsmena</target> + <source>&Find next</source> <target>&NajÃt dalÅ¡Ã</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>Můžete se pokusit synchronizovat zbývajÃcà položky (BEZ nutnosti znovuporovnávánÃ)!</target> -<source>Batch file created successfully!</source> -<target>Dávka úspěšnÄ› vytvoÅ™ena!</target> + <source>Main bar</source> <target>Hlavnà liÅ¡ta</target> + <source>Folder pairs</source> <target>Adresářové páry</target> + <source>Select view</source> <target>Vyberte zobrazenÃ</target> + <source>Set direction:</source> <target>Nastavit adresář:</target> + <source>Exclude temporarily</source> <target>Vynechat doÄasnÄ›</target> + <source>Include temporarily</source> <target>PÅ™idat doÄasnÄ›</target> + <source>Exclude via filter:</source> <target>Vynechat pomocà filtru:</target> + <source><multiple selection></source> <target><vÃcenásobný výbÄ›r></target> + <source>D-Click</source> <target>Dvojklik</target> + <source>Delete</source> <target>Smazat</target> + <source>Customize...</source> <target>VlastnÃ....</target> + +<source>Select time span...</source> +<target>Zadejte Äasové rozmezÃ...</target> + <source>Auto-adjust columns</source> <target>Automaticky pÅ™izpůsobit Å¡ÃÅ™ku</target> + <source>Include all rows</source> <target>PoužÃt vÅ¡echny řádky</target> + <source>Exclude all rows</source> <target>Vynechat vÅ¡echny řádky</target> + <source>Reset view</source> <target>Výchozà zobrazenÃ</target> + <source>Show "%x"</source> <target>Zobrazit "%x"</target> + <source><Last session></source> <target><Poslednà sezenÃ></target> + <source>Configuration saved!</source> <target>Konfigurace uložena.</target> + <source>Save changes to current configuration?</source> <target>Uložit zmÄ›ny do aktuálnà konfigurace?</target> + <source>Configuration loaded!</source> <target>Konfigurace naÄtena.</target> + <source>Folder Comparison and Synchronization</source> <target>Porovnánà a Synchronizace adresářů</target> + <source>Hide files that exist on left side only</source> <target>Skrýt soubory existujÃcà pouze vlevo</target> + <source>Show files that exist on left side only</source> <target>Zobrazit soubory existujÃcà pouze vlevo</target> + <source>Hide files that exist on right side only</source> <target>Skrýt soubory existujÃcà pouze vpravo</target> + <source>Show files that exist on right side only</source> <target>Zobrazit soubory existujÃcà pouze vpravo</target> + <source>Hide files that are newer on left</source> <target>Skrýt novÄ›jÅ¡Ã zleva</target> + <source>Show files that are newer on left</source> <target>Zobrazit soubory novÄ›jÅ¡Ã vlevo</target> + <source>Hide files that are newer on right</source> <target>Skrýt novÄ›jÅ¡Ã zprava</target> + <source>Show files that are newer on right</source> <target>Zobrazit soubory novÄ›jÅ¡Ã vpravo</target> + <source>Hide files that are equal</source> <target>Skrýt shodné soubory</target> + <source>Show files that are equal</source> <target>Zobrazit shodné soubory</target> + <source>Hide files that are different</source> <target>Skrýt rozdÃlné soubory</target> + <source>Show files that are different</source> <target>Zobrazit rozdÃlené soubory</target> + <source>Hide conflicts</source> <target>Skrýt konflikty</target> + <source>Show conflicts</source> <target>Zobrazit konflikty</target> + <source>Hide files that will be created on the left side</source> <target>Skrýt soubory, které budou vlevo vytvoÅ™eny</target> + <source>Show files that will be created on the left side</source> <target>Zobrazit soubory, které budou vlevo vytvoÅ™eny</target> + <source>Hide files that will be created on the right side</source> <target>Skrýt soubory, které budou vpravo vytvoÅ™eny</target> + <source>Show files that will be created on the right side</source> <target>Zobrazit soubory, které budou vpravo vytvoÅ™eny</target> + <source>Hide files that will be deleted on the left side</source> <target>Skrýt soubory, které budou vlevo smazány</target> + <source>Show files that will be deleted on the left side</source> <target>Zobrazit soubory, které budou vlevo smazány</target> + <source>Hide files that will be deleted on the right side</source> <target>Skrýt soubory, které budou vpravo smazány</target> + <source>Show files that will be deleted on the right side</source> <target>Zobrazit soubory, které budou vpravo smazány</target> + <source>Hide files that will be overwritten on left side</source> <target>Skrýt soubory, které budou vlevo pÅ™epsány</target> + <source>Show files that will be overwritten on left side</source> <target>Zobrazit soubory, které budou vlevo pÅ™epsány</target> + <source>Hide files that will be overwritten on right side</source> <target>Skrýt soubory, které budou vpravo pÅ™epsány</target> + <source>Show files that will be overwritten on right side</source> <target>Zobrazit soubory, které budou vpravo pÅ™epsány</target> + <source>Hide files that won't be copied</source> <target>Skrýt soubory, které nebudou kopÃrovány</target> + <source>Show files that won't be copied</source> <target>Zobrazit soubory, které nebudou kopÃrovány</target> + <source>All directories in sync!</source> <target>VÅ¡echny adresáře jsou synchronizovány!</target> + <source>Please run a Compare first before synchronizing!</source> <target>ProsÃm proveÄte nejdÅ™Ãv porovnánà pÅ™ed synchronizacÃ!</target> + <source>Comma separated list</source> <target>Text oddÄ›lený Äárkami</target> + <source>Legend</source> <target>Legenda</target> + <source>File list exported!</source> <target>Seznam souborů exportován!</target> + +<source>Batch file created successfully!</source> +<target>Dávka úspěšnÄ› vytvoÅ™ena!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -824,6 +1140,7 @@ PÅ™enést pÅ™Ãstupová oprávnÄ›nà souborů a adresářů <pluralform>%x objekty úspěšnÄ› smazány!</pluralform> <pluralform>%x objektů úspěšnÄ› smazáno!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -833,6 +1150,7 @@ PÅ™enést pÅ™Ãstupová oprávnÄ›nà souborů a adresářů <pluralform>%x adresáře</pluralform> <pluralform>%x adresářů</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -842,6 +1160,7 @@ PÅ™enést pÅ™Ãstupová oprávnÄ›nà souborů a adresářů <pluralform>%x soubory</pluralform> <pluralform>%x souborů</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -851,72 +1170,97 @@ PÅ™enést pÅ™Ãstupová oprávnÄ›nà souborů a adresářů <pluralform>%x z %y řádků</pluralform> <pluralform>%x z %y řádků</pluralform> </target> + <source>Scanning...</source> <target>ZpracovávánÃ...</target> + <source>Comparing content...</source> <target>Porovnávánà obsahu...</target> + <source>Paused</source> <target>Pauza</target> + <source>Aborted</source> <target>PÅ™eruÅ¡eno</target> + <source>Completed</source> <target>Hotovo</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>Požadavek na pÅ™eruÅ¡enÃ: ÄŒekánà na ukonÄenà aktuálnà operace...</target> + <source>Continue</source> <target>PokraÄovat</target> + <source>Pause</source> <target>Pauza</target> + <source>Cannot find %x</source> <target>Nelze najÃt %x</target> -<source>DECISION TREE</source> -<target>ROZHODOVÃNÃ</target> -<source>file exists on both sides</source> -<target>soubor existuje na obou stranách</target> -<source>on one side only</source> -<target>pouze na jedné stranÄ›</target> -<source>same date</source> -<target>stejné datum</target> -<source>different date</source> -<target>rozdÃlné datum</target> + <source>Inactive</source> <target>Vypnuto</target> -<source>Second</source> -<target>sekund</target> -<source>Minute</source> -<target>minut</target> -<source>Hour</source> -<target>hodin</target> -<source>Day</source> -<target>dnů</target> + +<source>Last x hours</source> +<target>PoslednÃch x hodin</target> + +<source>Today</source> +<target>Dnes</target> + +<source>This week</source> +<target>Tento týden</target> + +<source>This month</source> +<target>Tento mÄ›sÃc</target> + +<source>This year</source> +<target>Tento rok</target> + <source>Byte</source> <target>Byte</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>Filtr: VÅ¡echny páry</target> + <source>Filter: Single pair</source> <target>Filtr: Jeden pár</target> + <source>Ignore</source> <target>PÅ™eskoÄit</target> + <source>Direct</source> <target>Zachovat</target> + <source>Follow</source> <target>PoužÃt cÃl</target> + +<source>Copy NTFS permissions</source> +<target>KopÃrovat oprávnÄ›nà NTFS</target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>Integrace externà aplikace do kontextového menu. K dispozici jsou následujÃcà makra:</target> + <source>- full file or directory name</source> <target>- celá cesta nebo jméno souboru</target> + <source>- directory part only</source> <target>- pouze cesta</target> + <source>- Other side's counterpart to %name</source> <target>- celá cesta nebo jméno souboru z opaÄného panelu</target> + <source>- Other side's counterpart to %dir</source> <target>- pouze cesta z opaÄného panelu</target> + <source>Restore all hidden dialogs?</source> <target>Obnovit vÅ¡echny skryté dialogy?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -926,6 +1270,7 @@ PÅ™enést pÅ™Ãstupová oprávnÄ›nà souborů a adresářů <pluralform>Opravdu chcete pÅ™esunout následujÃcà %x objekty?</pluralform> <pluralform>Opravdu chcete pÅ™esunout následujÃcÃch %x objektů?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -935,139 +1280,211 @@ PÅ™enést pÅ™Ãstupová oprávnÄ›nà souborů a adresářů <pluralform>Opravdu chcete smazat následujÃcà %x objekty?</pluralform> <pluralform>Opravdu chcete smazat následujÃcÃch %x objektů?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>Ponechat jako nevyÅ™eÅ¡ený konflikt</target> + <source>Delete permanently</source> <target>Odstranit trvale</target> + <source>Delete or overwrite files permanently</source> <target>Smazat nebo pÅ™epsat soubory trvale</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>PoužÃt KoÅ¡ pÅ™i mazánà nebo pÅ™episu souborů</target> + <source>Versioning</source> <target>VerzovánÃ</target> + <source>Move files into a time-stamped subdirectory</source> <target>PÅ™esunout soubory do ÄasovÄ› oznaÄeného podadresáře</target> -<source>Cannot determine sync-direction:</source> -<target>Nelze urÄit smÄ›r synchronizace:</target> -<source>Filter settings have changed!</source> -<target>Nastavenà filtru bylo zmÄ›nÄ›no!</target> + <source>Both sides have changed since last synchronization!</source> <target>DoÅ¡lo ke zmÄ›nÄ› obou stran od poslednà synchronizace!</target> + +<source>Cannot determine sync-direction:</source> +<target>Nelze urÄit smÄ›r synchronizace:</target> + <source>No change since last synchronization!</source> <target>Žádné zmÄ›ny od poslednà synchronizace!</target> + +<source>Filter settings have changed!</source> +<target>Nastavenà filtru bylo zmÄ›nÄ›no!</target> + <source>The file was not processed by last synchronization!</source> <target>Soubor nebyl poslednà synchronizacà zpracován!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>Naplánované smazánà adresáře je v konfliktu s podadresáři a/nebo soubory!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Nastaven výchozà způsob synchronizace: Staré soubory budou nahrazeny novými.</target> + <source>The file does not contain a valid configuration:</source> <target>Soubor neobsahuje platnou konfiguraci:</target> + <source>You can ignore this error to consider the directory as empty.</source> -<target>Tuto chybu můžete ignorovat a považovat neexistujÃcà adresář jako prázdný.</target> +<target>Tuto chybu můžete pÅ™eskoÄit a považovat neexistujÃcà adresář jako prázdný.</target> + <source>Directory does not exist:</source> <target>Adresář neexistuje:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Adresáře jsou závislé! BuÄte opatrnà s definicà synchronizaÄnÃch pravidel:</target> + <source>Comparing content of files %x</source> <target>Porovnávánà obsahu souborů %x</target> + <source>Memory allocation failed!</source> <target>Chyba pÅ™idÄ›lenà pamÄ›ti!</target> + <source>File %x has an invalid date!</source> <target>Soubor %x má chybné datum!</target> + <source>Conflict detected:</source> <target>Zaznamenán konflikt:</target> + <source>Files %x have the same date but a different size!</source> <target>Soubory %x majà stejné datum a Äas ale rozdÃlnou velikost!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>Symbolický odkaz %x má stejné datum ale jiný cÃl!</target> + <source>Comparing files by content failed.</source> <target>Porovnánà obsahu souborů se nezdaÅ™ilo.</target> + <source>Generating file list...</source> <target>Vytvářenà seznamu souborů...</target> + <source>Multiple...</source> -<target>NÄ›kolikanásobný...</target> +<target>Různé...</target> + <source>Both sides are equal</source> <target>ObÄ› strany jsou shodné</target> + <source>Files/folders differ in attributes only</source> <target>Soubory/adresáře se liÅ¡Ã pouze ve vlastnostech</target> + <source>Copy new file/folder to left</source> <target>KopÃrovat nový soubor/adresář do leva</target> + <source>Copy new file/folder to right</source> <target>KopÃrovat nový soubor/adresář do prava</target> + <source>Delete left file/folder</source> <target>Smazat soubor/adresář z leva</target> + <source>Delete right file/folder</source> <target>Smazat soubor/adresáře z prava</target> + <source>Overwrite left file/folder with right one</source> <target>PÅ™epsat levý soubor/adresář tÃm z prava</target> + <source>Overwrite right file/folder with left one</source> <target>PÅ™epsat pravý soubor/adresář tÃm z leva</target> + <source>Do nothing</source> <target>Nic nedÄ›lat</target> + <source>Copy file attributes only to left</source> <target>KopÃrovat vlastnosti souboru pouze do leva</target> + <source>Copy file attributes only to right</source> <target>KopÃrovat vlastnosti souboru pouze do prava</target> + <source>Deleting file %x</source> <target>Mazánà souboru %x</target> -<source>Deleting Symbolic Link %x</source> -<target>Mazánà symbolického odkazu</target> + <source>Deleting folder %x</source> <target>Mazánà adresáře %x</target> -<source>Moving %x to Recycle Bin</source> -<target>PÅ™esouvánà %x do KoÅ¡e.</target> -<source>Moving file %x to user-defined directory %y</source> -<target>PÅ™esouvánà souboru %x do uživatelského adresáře %y</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>PÅ™esouvánà adresáře %x do uživatelského adresáře %y</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>PÅ™esouvánà symbolického odkazu %xdo uživatelského adresáře %y</target> -<source>Copying new file %x to %y</source> -<target>KopÃrovánà nového souboru %x do %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>KopÃrovánà symbolického odkazu %x do %y</target> -<source>Overwriting file %x in %y</source> -<target>PÅ™epis souboru %x v %y</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>PÅ™epis symbolického odkazu %x v %y</target> + +<source>Deleting symbolic link %x</source> +<target>Mazánà symbolického odkazu %x</target> + +<source>Moving file %x to recycle bin</source> +<target>PÅ™esouvánà souboru %x do KoÅ¡e</target> + +<source>Moving folder %x to recycle bin</source> +<target>PÅ™esouvánà afresáře %x do KoÅ¡e</target> + +<source>Moving symbolic link %x to recycle bin</source> +<target>PÅ™esouvánà symbolického odkazu %x do KoÅ¡e</target> + +<source>Moving file %x to %y</source> +<target>PÅ™esouvánà souboru %x do %y</target> + +<source>Moving folder %x to %y</source> +<target>PÅ™esouvánà adresáře %x do %y</target> + +<source>Moving symbolic link %x to %y</source> +<target>PÅ™esouvánà symbolického odkazu %x do %y</target> + +<source>Creating file %x</source> +<target>Vytvářenà souboru %x</target> + +<source>Creating symbolic link %x</source> +<target>Vytvářenà symbolického odkazu %x</target> + <source>Creating folder %x</source> <target>Vytvářenà adresáře %x</target> + +<source>Overwriting file %x</source> +<target>PÅ™episovánà souboru %x</target> + +<source>Overwriting symbolic link %x</source> +<target>PÅ™episovánà symbolického odkazu %x</target> + <source>Verifying file %x</source> -<target>Kontroluji soubor %x</target> +<target>Kontrola souboru %x</target> + <source>Updating attributes of %x</source> <target>Aktualizace atributů souboru %x</target> -<source>Source directory does not exist anymore:</source> -<target>Zdrojový adresář již neexistuje:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>Podle dané konfigurace nenà co synchronizovat!</target> + <source>Target directory name must not be empty!</source> <target>Nenà zadán cÃlový adresář!</target> + <source>User-defined directory for deletion was not specified!</source> <target>Uživatelsky definovaný adresář pro mazánà nebyl zadán!</target> + +<source>Source directory does not exist anymore:</source> +<target>Zdrojový adresář již neexistuje:</target> + <source>Unresolved conflicts existing!</source> <target>NevyÅ™eÅ¡ené konflikty!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>Je možné konflikt ignorovat a pokraÄovat v synchronizaci.</target> + <source>Significant difference detected:</source> <target>Nalezeny významné zmÄ›ny:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>VÃce než polovina souborů má být zkopÃrována nebo smazána!</target> + <source>Not enough free disk space available in:</source> <target>Nedostatek mÃsta na disku:</target> + <source>Free disk space required:</source> <target>Požadované volné mÃsto na disku:</target> + <source>Free disk space available:</source> <target>Volné mÃsto k dispozici:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target></target> +<target>Nelze použÃt KoÅ¡ pro následujÃcà umÃstÄ›nÃ! Soubory budou odstranÄ›ny trvale:</target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>Bude zmÄ›nÄ› adresář, který je souÄástà adresářového páru vÃcenásobného porovnánÃ! ProsÃm zkontrolujte si nastavenà synchronizace!</target> + <source>Processing folder pair:</source> <target>Zpracovávánà adresářové páru:</target> + <source>Generating database...</source> <target>Vytvářenà databáze...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>Podle dané konfigurace nenà co synchronizovat!</target> + <source>Error copying locked file %x!</source> <target>Chyba kopÃrovánà zamÄeného souboru %x!</target> + <source>Data verification error: Source and target file have different content!</source> <target>Chyba verifikace dat: Zdrojový a cÃlový soubor majà rozdÃlný obsah!</target> + diff --git a/BUILD/Languages/danish.lng b/BUILD/Languages/danish.lng index 402f918e..4b52e2f7 100644 --- a/BUILD/Languages/danish.lng +++ b/BUILD/Languages/danish.lng @@ -8,75 +8,116 @@ </header> <source>Searching for directory %x...</source> -<target></target> +<target>Søger efter bibliotek %x...</target> + <source>Show in Explorer</source> <target>Vis i Explorer</target> + <source>Open with default application</source> <target>Ã…ben med standard program</target> + <source>Browse directory</source> <target>Gennemse Bibliotek</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSynk - Automatisk Synkronisering</target> + <source>Browse</source> <target>Gennemse</target> -<source>Invalid commandline: %x</source> + +<source>Invalid command line: %x</source> <target>Ugyldig kommando: %x</target> + <source>Error resolving symbolic link:</source> -<target>Error resolving symbolic link:</target> -<source>Show popup</source> -<target>Vis popup</target> -<source>Show popup on errors or warnings</source> -<target>Vis popup ved fejl eller advarsler</target> +<target>Fejl i at finde link:</target> + +<source>Show pop-up</source> +<target>Vis pop-up</target> + +<source>Show pop-up on errors or warnings</source> +<target>Vis pop-up ved fejl eller advarsler</target> + <source>Ignore errors</source> <target>Ignorer fejl</target> + <source>Hide all error and warning messages</source> <target>Skjul beskeder om fejl og advarsler</target> + <source>Exit instantly</source> <target>Afslut med det samme</target> + <source>Abort synchronization immediately</source> <target>Abort synkronisering med det samme</target> + +<source>Select alternate comparison settings</source> +<target>Vælg alternative sammenlignings indstillinger</target> + <source>Select alternate synchronization settings</source> <target>Vælg alternative indstillinger</target> + <source>No filter selected</source> <target>Intet filter valgt</target> + <source>Filter is active</source> <target>Filter er aktivt</target> -<source>Clear filter settings</source> -<target>Ryd filter indstillinger</target> + <source>Remove alternate settings</source> <target>Fjern alternative indstillinger</target> + +<source>Clear filter settings</source> +<target>Ryd filter indstillinger</target> + <source>Create a batch job</source> <target>Lav et batch job</target> + <source>Synchronization settings</source> <target>Synkroniserings indstillinger</target> + <source>Comparison settings</source> <target>Sammenlignings indstillinger</target> + <source>About</source> <target>Om</target> + <source>Error</source> <target>Fejl</target> + <source>Warning</source> <target>Advarsel</target> + <source>Question</source> <target>SpørgsmÃ¥l</target> + <source>Confirm</source> <target>Bekræft</target> + <source>Configure filter</source> <target>Indstil filter</target> + <source>Customize columns</source> <target>Rediger kolonner</target> + <source>Global settings</source> <target>Fælles indstillinger</target> + <source>Synchronization Preview</source> <target>Vis Synkronisering</target> + <source>Find</source> <target>Find</target> + +<source>Select time span</source> +<target>Vælg tids omrÃ¥de</target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -85,46 +126,64 @@ <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> </target> + <source><Symlink></source> <target><Symlink></target> + <source><Directory></source> <target><Directory></target> + <source>Size</source> <target>Størrelse</target> + <source>Date</source> <target>Dato</target> + <source>Full path</source> <target>Fuld Sti</target> + <source>Filename</source> <target>Filnavne</target> + <source>Relative path</source> <target>Filsti</target> + <source>Directory</source> <target>Bibliotek</target> + <source>Extension</source> <target>Udvidelse</target> + <source>Comparison Result</source> <target>Sammenlignings Resultat</target> + <source>Incompatible synchronization database format:</source> <target>Ukompatibelt synkroniserings database format:</target> + <source>Initial synchronization:</source> <target>Indledende synkronisering:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>En af FreeFileSync database filerne findes ikke endnu:</target> + <source>Error reading from synchronization database:</source> <target>Fejl i læsning fra synkroniserings databasen:</target> + <source>Database files do not share a common synchronization session:</source> -<target></target> +<target>Database filer deler ikke en fælles synkroniserings session</target> + <source>An exception occurred!</source> <target>En undtagelse er opstÃ¥et!</target> -<source>Error deleting file:</source> -<target>Fejl i sletning af fil:</target> + <source>Error reading file attributes:</source> <target>Fejl i læsning af atributter:</target> + <source>Waiting while directory is locked (%x)...</source> <target>Venter mens biblioteket er lÃ¥st (%x)...</target> + <source>Error setting directory lock:</source> <target>Fejl i at lÃ¥se bibliotek:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -133,27 +192,40 @@ <pluralform>1 sek</pluralform> <pluralform>%x sek</pluralform> </target> + <source>Info</source> <target>Info</target> + <source>Fatal Error</source> <target>Uoprettelig Fejl</target> + <source>Scanning:</source> <target>Skanner:</target> + <source>Encoding extended time information: %x</source> <target>Finder udvidet tids information: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> -<target></target> +<target> +<pluralform>[1 TrÃ¥d]</pluralform> +<pluralform>[%x TrÃ¥de]</pluralform> +</target> + <source>Invalid FreeFileSync config file!</source> <target>Ugyldig FreeFileSync config fil!</target> + <source>File does not exist:</source> <target>Filen findes ikke:</target> + <source>Error parsing configuration file:</source> <target>Fejl i at lave konfigurations filen:</target> + <source>/sec</source> <target>/sek</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -162,6 +234,7 @@ <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -170,6 +243,7 @@ <pluralform>1 timer</pluralform> <pluralform>%x timer</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -178,28 +252,40 @@ <pluralform>1 dag</pluralform> <pluralform>%x dage</pluralform> </target> + <source>S&ave configuration...</source> <target>G&em konfiguration...</target> + <source>&Load configuration...</source> <target>&Hent konfiguration...</target> + <source>&Quit</source> <target>&Afslut</target> + <source>&File</source> <target>&Fil</target> + <source>&Content</source> <target>&Indhold</target> + <source>&About...</source> <target>&Om...</target> + <source>&Help</source> <target>&Hjælp</target> + <source>Usage:</source> <target>Forbrug:</target> + <source>1. Select directories to monitor.</source> <target>1. Vælg biblioteker at holde øje med.</target> + <source>2. Enter a command line.</source> <target>2. Skriv en kommando linje.</target> + <source>3. Press 'Start'.</source> <target>3. Tryk 'Start'.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -210,310 +296,461 @@ Kommando linjen bliver afviklet hver gang: - Alle biblioteker bliver tilgængelige (eks. USB stick sættes i) - Filer i disse biblioteker eller underbiblioteker bliver ændret </target> + <source>Directories to watch</source> <target>Biblioteker at overvÃ¥ge</target> + <source>Add folder</source> <target>Tilføj mappe</target> + <source>Remove folder</source> <target>Fjern mappe</target> + <source>Select a folder</source> <target>Vælg en mappe</target> + <source>Command line</source> <target>Kommando linje</target> + <source>Minimum Idle Time [seconds]</source> <target>Minimum pausetid [sekunder]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>Tid imellem sidste ændring og afvikling af kommando linjen i sekunder</target> + <source>Start</source> <target>Start</target> + <source>(Build: %x)</source> <target>(Build: %x)</target> + <source>RealtimeSync configuration</source> <target>RealtimeSynk konfiguration</target> + <source>File already exists. Overwrite?</source> <target>Filen findes. Overskriv?</target> + <source>&Restore</source> <target>&Gendan</target> + <source>&Exit</source> <target>&Afslut</target> + <source>Monitoring active...</source> <target>OvervÃ¥gning aktiv...</target> + <source>Waiting for missing directories...</source> <target>Venter pÃ¥ manglende biblioteker...</target> + <source>A directory input field is empty.</source> <target>Et biblioteks felt er tomt.</target> + <source>Drag && drop</source> <target>Træk && slip</target> + <source>Could not initialize directory monitoring:</source> <target>Kunne ikke initialiserer biblioteks overvÃ¥gningen:</target> + <source>Error when monitoring directories.</source> <target>Fejl i overvÃ¥gning af biblioteker.</target> + <source>Conversion error:</source> <target>Konverterings fejl:</target> + +<source>Error deleting file:</source> +<target>Fejl i sletning af fil:</target> + <source>Error moving file:</source> <target>Fejl i flytning af fil:</target> + <source>Target file already existing!</source> <target>Filen findes i forvejen!</target> + <source>Error moving directory:</source> <target>Fejl i flytning af bibliotek:</target> + <source>Target directory already existing!</source> <target>Bibliotek findes i forvejen!</target> + <source>Error deleting directory:</source> <target>Fejl i sletning af bibliotek:</target> + <source>Error changing modification time:</source> <target>Fejl i ændring af modificerings tiden:</target> + <source>Error loading library function:</source> <target>Fejl i biblioteks funktionen:</target> + <source>Error reading security context:</source> <target>Fejl i læsning af sikkerhedstilladelser:</target> + <source>Error writing security context:</source> <target>Fejl i skrivning af sikkerhedstilladelser:</target> + <source>Error copying file permissions:</source> <target>Fejl i kopiering af filtilladelser:</target> + <source>Error creating directory:</source> <target>Fejl i oprettelse af bibliotek:</target> + <source>Error copying symbolic link:</source> <target>Fejl i kopiering af link:</target> + <source>Error copying file:</source> <target>Fejl i kopiering af fil:</target> + <source>Error opening file:</source> <target>Fejl i Ã¥bning af fil:</target> + <source>Error writing file:</source> <target>Fejl i at skrive fil:</target> + <source>Error reading file:</source> <target>Fejl i læsning af fil:</target> + <source>Operation aborted!</source> <target>Operation afbrudt!</target> + +<source>Could not load a required DLL:</source> +<target>Kunne ikke hente en krævet DLL:</target> + <source>Endless loop when traversing directory:</source> <target>Uendelig løkke ved gennemgang af bibliotek:</target> + <source>Error traversing directory:</source> <target>Fejl i gennemgang af bibliotek:</target> + <source>Windows Error Code %x:</source> <target>Windows Fejl kode %x:</target> + <source>Linux Error Code %x:</source> <target>Linux Fejl kode %x:</target> + <source>Error setting privilege:</source> <target>Fejl i at sætte privilegier:</target> + <source>Error moving to Recycle Bin:</source> <target>Fejl i at flytte til skraldespand:</target> -<source>Could not load a required DLL:</source> -<target>Kunne ikke hente en krævet DLL:</target> + <source>Error writing to synchronization database:</source> <target>Fejl i skrivning til synkroniserings databasen:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>Fejl i start af Drev Spejl Kopierings Service!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target>Fejl i adgang til Enhedens Kopi Service</target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>At lave spejl kopier af WOW64 er ikke understøttet. Brug venligst FreeFileSync 64-bit version.</target> + <source>Could not determine volume name for file:</source> <target>Kunne ikke finde drev navn til filen:</target> + <source>Volume name %x not part of filename %y!</source> <target>Drev navn %x ikke en del af filnavn %y!</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>Kunne ikke læse værdierne for følgende XML punkter:</target> + <source>Logging</source> <target>Logger</target> + <source>FreeFileSync batch file</source> <target>FreeFileSync batch fil</target> + <source>FreeFileSync configuration</source> <target>FreeFileSync konfiguration</target> + <source>FreeFileSync Batch Job</source> <target>FreeFileSync Batch Job</target> + <source>Unable to create logfile!</source> <target>Kan ikke oprette logfil!</target> + <source>Batch execution</source> <target>Batch afvikling</target> + <source>Log-messages:</source> <target>Log-beskeder:</target> + <source>Stop</source> <target>Stop</target> + <source>Total time:</source> <target>Samlet tid:</target> + <source>Synchronization aborted!</source> <target>Synkronisering afbrudt!</target> + <source>Synchronization completed with errors!</source> <target>Synkronisering afsluttet med fejl!</target> + <source>Synchronization completed successfully!</source> <target>Synkronisering afsluttet uden fejl!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>Tryk "Skift" for at Ã¥bne FreeFileSync i GUI mode.</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>Skifter til FreeFileSync GUI mode...</target> + <source>Unable to connect to sourceforge.net!</source> <target>Kan ikke forbinde til sourceforge.net!</target> + <source>A newer version of FreeFileSync is available:</source> <target>En nyere version af FreeFileSync er tilgængelig:</target> + <source>Download now?</source> <target>Download nu?</target> + <source>Information</source> <target>Information</target> + <source>FreeFileSync is up to date!</source> <target>FreeFileSync er opdateret!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>Skal FreeFileSync automatisk checke efter opdateringer hver uge?</target> + <source>(Requires an Internet connection!)</source> <target>(Kræver en Internet forbindelse!)</target> + <source>1. &Compare</source> <target>1. &Sammenlign</target> + <source>2. &Synchronize...</source> <target>2. &Synkroniser...</target> + <source>S&witch view</source> <target>S&kift udseende</target> + <source>&New</source> <target>&Ny</target> + <source>&Program</source> <target>&Program</target> + <source>&Language</source> <target>&Sprog</target> + <source>&Global settings...</source> <target>&Fælles indstillinger...</target> + <source>&Create batch job...</source> <target>&Opret batch job...</target> + <source>&Export file list...</source> <target>&Eksporter fil liste...</target> + <source>&Advanced</source> <target>&Avanceret</target> + <source>&Check for new version</source> <target>&Kig efter ny version</target> + <source>Compare</source> <target>Sammenlign</target> + <source>Compare both sides</source> <target>Sammenlign begge sider</target> + <source>&Abort</source> <target>&Afbryd</target> + <source>Synchronize...</source> <target>Synkroniser...</target> + <source>Start synchronization</source> <target>Start synkronisering</target> -<source>Swap sides</source> -<target>Byt sider</target> + <source>Add folder pair</source> <target>Tilføj mappe par</target> + <source>Remove folder pair</source> <target>Fjern mappe par</target> + +<source>Swap sides</source> +<target>Byt sider</target> + <source>Save current configuration to file</source> <target>Gem nuværende konfiguration i fil</target> + <source>Load configuration from file</source> <target>Læs konfiguration fra fil</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>Senest brugte konfigurationer (tryk DEL for at fjerne fra listen)</target> + <source>Hide excluded items</source> <target>Skjul udelukkede emner</target> + <source>Hide filtered or temporarily excluded files</source> <target>Skjul filtrerede eller midlertidigt udelukkede filer</target> + <source>Number of files and directories that will be created</source> <target>Antal filer og biblioteker der vil blive oprettet</target> + <source>Number of files that will be overwritten</source> <target>Antal filer der vil blive overskrevet</target> + <source>Number of files and directories that will be deleted</source> <target>Antal filer og biblioteker der vil blive slettet</target> + <source>Total amount of data that will be transferred</source> <target>Samlet antal data der vil blive overført</target> -<source>Left</source> -<target>Venstre</target> -<source>Right</source> -<target>Højre</target> + <source>Batch job</source> <target>Batch job</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>Opret en batch fil til automatisk synkronisering. For at starte i batch mode dobbelt-click pÃ¥ filen eller afvikle med kommandoen: FreeFileSync.exe <batchfil>. Dette kan ogsÃ¥ planlægges i dit systems opgavestyring.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target>Lav en batch til til automatiseret synkronisering. For at starte i batch mode dobbelt-klik pÃ¥ filen eller afvikle via. kommando linjen: FreeFileSync.exe <ffs_batch file>. Dette kan ogsÃ¥ planlægges i dit operativsystems opgavestyring.</target> + <source>Help</source> <target>Hjælp</target> + <source>Filter files</source> <target>Filter filer</target> + <source>Error handling</source> <target>Fejl hÃ¥ndtering</target> + +<source>Left</source> +<target>Venstre</target> + +<source>Right</source> +<target>Højre</target> + <source>Overview</source> <target>Overblik</target> + <source>Status feedback</source> <target>Status feedback</target> + <source>Run minimized</source> -<target></target> +<target>Kør minimeret</target> + <source>Maximum number of logfiles:</source> <target>Maksimalt antal log filer:</target> + <source>Select logfile directory:</source> <target>Vælg log fil bibliotek:</target> + <source>Batch settings</source> -<target></target> +<target>Batch indstillinger</target> + <source>&Save</source> <target>&Gem</target> + <source>&Load</source> <target>&Hent</target> + <source>&Cancel</source> <target>&Anuller</target> + <source>Elements found:</source> <target>Enheder fundet:</target> + <source>Elements remaining:</source> <target>Enheder tilbage:</target> + <source>Speed:</source> <target>Hastighed:</target> + <source>Time remaining:</source> <target>Tid tilbage:</target> + <source>Time elapsed:</source> <target>Tid gÃ¥et:</target> + <source>Operation:</source> <target>Igang:</target> + <source>Select variant:</source> <target>Vælg variant:</target> + <source><Automatic></source> <target><Automatisk></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>Indentifiser og udbred ændringer pÃ¥ begge sider via. database. Sletninger og konflikter opdages automatisk.</target> + <source>Mirror ->></source> <target>Spejl ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Spejling af venstre mappe. Højre mappe tilpasses sÃ¥ den ligner den venstre efter synkronisering.</target> + <source>Update -></source> <target>Opdater -></target> + <source>Copy new or updated files to right folder.</source> <target>Kopier nye eller opdaterede filer til højre mappe.</target> + <source>Custom</source> <target>Brugerdefineret</target> + <source>Configure your own synchronization rules.</source> <target>Konfigurer dine egne synkroniserings regler.</target> + <source>Deletion handling</source> <target>Slette hÃ¥ndtering</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>Konfiguration</target> + <source>Category</source> <target>Kategori</target> + <source>Action</source> <target>Handling</target> + <source>File/folder exists on left side only</source> <target>Fil/mappe findes kun til venstre</target> + <source>File/folder exists on right side only</source> <target>Fil/mappe findes kun til højre</target> + <source>Left file is newer</source> <target>Fil til venstre er nyere</target> + <source>Right file is newer</source> <target>Fil til højre er nyere</target> + <source>Files have different content</source> <target>Filer har forskelligt indhold</target> + <source>Conflict/file cannot be categorized</source> <target>Konflikt/filen kan ikke kategoriseres</target> + <source>Compare by...</source> <target>Sammenlign ved...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> <target> -Filer er ens hvis +Filer bliver set som ens hvis + - sidst skrevne tid og dato - fil størrelse - - gemme tid og dato -er det samme +er ens </target> -<source>File size and date</source> -<target>Fil størrelse og dato</target> + +<source>File time and size</source> +<target>Fil tid og størrelse</target> + <source> Files are found equal if - file content @@ -524,92 +761,85 @@ Filer er ens hvis - fil indhold er det samme </target> + <source>File content</source> <target>Fil indhold</target> + <source>Symbolic Link handling</source> <target>Link hÃ¥ndtering</target> + <source>Synchronizing...</source> <target>Synkroniserer...</target> + <source>Elements processed:</source> <target>Enheder behandlet:</target> + <source>&Pause</source> <target>&Pause</target> -<source>Compare by "File size and date"</source> -<target>Sammenlign ved "Fil størelse og dato"</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>Denne variant vurderer to filer med samme navn som værende ens nÃ¥r de har samme fil størelse OG gemt pÃ¥ samme dato og tid.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>NÃ¥r der sammenlignes ved denne mulighed bruges følgende fremgangsmetode:</target> -<source>As a result the files are separated into the following categories:</source> -<target>Som resultat bliver filerne delt op i følgende kategorier:</target> -<source>- equal</source> -<target>- ens</target> -<source>- left newer</source> -<target>- venstre nyest</target> -<source>- right newer</source> -<target>- højre nyest</target> -<source>- exists left only</source> -<target>- findes kun til venstre</target> -<source>- exists right only</source> -<target>- findes kun til køjre</target> -<source>- conflict (same date, different size)</source> -<target>- konflikt (samme dato, forskellig størrelse)</target> -<source>Compare by "File content"</source> -<target>Sammenlign ved "Fil indhold"</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. - -With this option enabled the decision tree is smaller: -</source> -<target> -Som navnet antyder, to filer der deler samme navn findes ens hvis de har samme indhold. Denne mulighed er god til at checke indhold i stedet for at udføre backup. Derfor bliver dato og tid ikke taget i betragtning. -Ved denne mulighed er beslutningstræet mindre: -</target> -<source>- different</source> -<target>- forskellig</target> <source>Source code written in C++ utilizing:</source> <target>Source code skrevet i C++:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>Stor tak for lokalisering af FreeFileSync gÃ¥r til:</target> + <source>Feedback and suggestions are welcome at:</source> <target>Feedback og forslag er velkommen pÃ¥:</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync pÃ¥ Sourceforge</target> + <source>Homepage</source> <target>Hjemmeside</target> + <source>If you like FFS</source> <target>Hvis du kan lide FFS</target> + <source>Donate with PayPal</source> <target>Doner med PayPal</target> + <source>Email</source> <target>E-mail</target> + <source>Report translation error</source> <target>Rapporter oversættelses fejl</target> + <source>Published under the GNU General Public License:</source> <target>Udgivet under GNU General Public Licence:</target> + <source>Ignore subsequent errors</source> <target>Ignorer underliggende fejl</target> + <source>Hide further error messages during the current process</source> <target>Skjul yderligere fejl beskeder under nuværende opgave</target> + <source>&Ignore</source> <target>&Ignorer</target> + <source>&Retry</source> <target>&Prøv igen</target> + <source>Do not show this dialog again</source> <target>Vis ikke denne dialog igen</target> + <source>&Switch</source> <target>&Skift</target> + <source>&Yes</source> <target>&Ja</target> + <source>&No</source> <target>&Nej</target> + <source>Delete on both sides</source> <target>Slet pÃ¥ begge sider</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>Slet pÃ¥ begge sider selvom der kun er valgt en side</target> + <source>Use Recycle Bin</source> <target>Brug skraldespanden</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -618,16 +848,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire Kun filer/biblioteker der passer til alle filter indstillinger vil blive valgt til synkronisering. Bemærk: Navnefilteret skal være faktisk specificeret(!) til hoved synkroniserings bibliotekerne. </target> + <source>Hints:</source> <target>Vejledninger:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. Skriv faktiske fil eller bibliotek navne adskilt af ';' eller en ny linje.</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. Brug wildcard tegn '*' og '?'.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. Udeluk filer direkte.</target> + <source>Example</source> <target>Eksempel</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -636,30 +872,40 @@ Exclude: \stuff\temp\* Inkluder: *.doc;*.zip;*.exe Udeluk: \ting\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>Synkroniserer alle .doc, .zip and .exe filer pÃ¥nær alt i undermappen "temp".</target> + <source>Include</source> <target>Inkluder</target> + <source>Exclude</source> <target>Udeluk</target> -<source>Select time span:</source> -<target>Fælg tidsrum:</target> -<source>Minimum file size:</source> -<target>Mindste fil størelse:</target> -<source>Maximum file size:</source> -<target>Største fil størelse:</target> + +<source>Minimum file size</source> +<target>Minimum fil størrelse</target> + +<source>Maximum file size</source> +<target>Maksimum fil størrelse</target> + <source>&Default</source> <target>&Standard</target> + <source>Move column up</source> <target>Flyt kolonne op</target> + <source>Move column down</source> <target>Flyt kolonne ned</target> -<source>Transactional File Copy</source> -<target></target> + +<source>Transactional file copy</source> +<target>Transaktionel fil kopiering</target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> -<target></target> +<target>Skriv filer til en midlertidig (*.ffs_tmp) først og omdøb dem. Dette garanterer en sikkerhed, selv i situationer med fatale fejl.</target> + <source>Copy locked files</source> <target>Kopier lÃ¥ste filer</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -668,8 +914,10 @@ Copy shared or locked files using Volume Shadow Copy Service Kopier delte eller lÃ¥ste filer ved hjælp af Drev Kopi Servicen (Kræver Administrator rettigheder) </target> -<source>Copy filesystem permissions</source> -<target>Kopier filsystem tilladelser</target> + +<source>Copy file access permissions</source> +<target>Kopier fil adgangs tilladelser</target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -678,138 +926,205 @@ Transfer file and directory permissions Overfør fil og biblioteks tilladelser (Kræver Administrator rettigheder) </target> + <source>Hidden dialogs:</source> <target>Skjulte dialoger:</target> + <source>Reset</source> <target>Nulstil</target> + <source>Show hidden dialogs</source> <target>Vi skjulte dialoger</target> + <source>External applications</source> <target>Eksterne programmer</target> + <source>Description</source> <target>Beskrivelse</target> + <source>Variant</source> <target>Variation</target> + <source>Statistics</source> <target>Statestik</target> + <source>Find what:</source> <target>Find:</target> + <source>Match case</source> <target>Sammenlign stor og smÃ¥ bogstaver</target> + <source>&Find next</source> <target>&Find næste</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>Du kan prøve at synkroniserer igen (UDEN at skulle sammenligne igen)!</target> -<source>Batch file created successfully!</source> -<target>Batch fil oprettet!</target> + <source>Main bar</source> <target>Hoved værktøjslinjen</target> + <source>Folder pairs</source> <target>Mappe par</target> + <source>Select view</source> <target>Vælg udseende</target> + <source>Set direction:</source> <target>Sæt handlevejen:</target> + <source>Exclude temporarily</source> <target>Ekskluder midlertidigt</target> + <source>Include temporarily</source> <target>Inkluder midlertidigt</target> + <source>Exclude via filter:</source> <target>Ekskluder via filter:</target> + <source><multiple selection></source> <target><flere valg></target> + <source>D-Click</source> <target>Dobbelt-klik</target> + <source>Delete</source> <target>Slet</target> + <source>Customize...</source> <target>Tilpas...</target> + +<source>Select time span...</source> +<target>Vælg tidsomrÃ¥de...</target> + <source>Auto-adjust columns</source> <target>Auto-juster kolonner</target> + <source>Include all rows</source> <target>Inkluder alle rækker</target> + <source>Exclude all rows</source> <target>Ekskluder alle rækker</target> + <source>Reset view</source> <target>Nulstil udseende</target> + <source>Show "%x"</source> <target>Vis "%x"</target> + <source><Last session></source> <target><Sidste opgave></target> + <source>Configuration saved!</source> <target>Konfiguration gemt!</target> + <source>Save changes to current configuration?</source> <target>Gem ændringer til nuværende konfiguration?</target> + <source>Configuration loaded!</source> <target>Konfiguration hentet!</target> + <source>Folder Comparison and Synchronization</source> <target>Mappe sammenligning og synkronisering</target> + <source>Hide files that exist on left side only</source> <target>Skjul filder der kun findes pÃ¥ venstre side</target> + <source>Show files that exist on left side only</source> <target>Vis filer der kun findes pÃ¥ venstre side</target> + <source>Hide files that exist on right side only</source> <target>Skjul filer der kun findes pÃ¥ højre side</target> + <source>Show files that exist on right side only</source> <target>Vis filer der kun findes pÃ¥ højre side</target> + <source>Hide files that are newer on left</source> <target>Skjul filer der er nyere til venstre</target> + <source>Show files that are newer on left</source> <target>Vis filer der er nyere til venstre</target> + <source>Hide files that are newer on right</source> <target>Skjul filer der er nyere til højre</target> + <source>Show files that are newer on right</source> <target>Vis filer der er nyere til højre</target> + <source>Hide files that are equal</source> <target>Skjul ens filer</target> + <source>Show files that are equal</source> <target>Vis ens filer</target> + <source>Hide files that are different</source> <target>Skjul uens filer</target> + <source>Show files that are different</source> <target>Vis uens filer</target> + <source>Hide conflicts</source> <target>Skjul konflikter</target> + <source>Show conflicts</source> <target>Vis konflikter</target> + <source>Hide files that will be created on the left side</source> <target>Skjul filer der vil blive oprettet til venstre</target> + <source>Show files that will be created on the left side</source> <target>Vis filer der vil blive oprettet til venstre</target> + <source>Hide files that will be created on the right side</source> <target>Skjul filer der vil blive oprettet til højre</target> + <source>Show files that will be created on the right side</source> <target>Vis filer der vil blive oprettet til højre</target> + <source>Hide files that will be deleted on the left side</source> <target>Skjul filer der bliver slettet til venstre</target> + <source>Show files that will be deleted on the left side</source> <target>Vis filer der bliver slettet til venstre</target> + <source>Hide files that will be deleted on the right side</source> <target>Skjul filer der bliver slettet til højre</target> + <source>Show files that will be deleted on the right side</source> <target>Vis filer der bliver slettet til højre</target> + <source>Hide files that will be overwritten on left side</source> <target>Skjul filer der bliver overskrevet til venstre</target> + <source>Show files that will be overwritten on left side</source> <target>Vis filer der bliver overskrevet til venstre</target> + <source>Hide files that will be overwritten on right side</source> <target>Skjul filer der bliver overskrevet til højre</target> + <source>Show files that will be overwritten on right side</source> <target>Vis filer der bliver overskrevet til højre</target> + <source>Hide files that won't be copied</source> <target>Skjul filer der ikke bliver kopieret</target> + <source>Show files that won't be copied</source> <target>Vis filer der ikke bliver kopieret</target> + <source>All directories in sync!</source> <target>Alle biblioteker er synkroniseret!</target> + <source>Please run a Compare first before synchronizing!</source> <target>Kør venligst en sammenligning inden synkronisering!</target> + <source>Comma separated list</source> <target>Komma separeret list</target> + <source>Legend</source> <target>Legend</target> + <source>File list exported!</source> <target>Fil listen er eksporteret!</target> + +<source>Batch file created successfully!</source> +<target>Batch fil oprettet!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -818,6 +1133,7 @@ Overfør fil og biblioteks tilladelser <pluralform>Emnet er slettet!</pluralform> <pluralform>%x emner er slettet!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -826,6 +1142,7 @@ Overfør fil og biblioteks tilladelser <pluralform>1 bibliotek</pluralform> <pluralform>%x biblioteker</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -834,6 +1151,7 @@ Overfør fil og biblioteks tilladelser <pluralform>1 fil</pluralform> <pluralform>%x filer</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -842,72 +1160,97 @@ Overfør fil og biblioteks tilladelser <pluralform>%x af 1 række</pluralform> <pluralform>%x af %y rækker</pluralform> </target> + <source>Scanning...</source> <target>Skanner...</target> + <source>Comparing content...</source> <target>Sammenligner indhold...</target> + <source>Paused</source> <target>Pauset</target> + <source>Aborted</source> <target>Afbrudt</target> + <source>Completed</source> <target>Fuldført</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>Afbrydelse: Venter pÃ¥ nuværende opgave afsluttes...</target> + <source>Continue</source> <target>Fortsæt</target> + <source>Pause</source> <target>Pause</target> + <source>Cannot find %x</source> <target>Kan ikke finde %x</target> -<source>DECISION TREE</source> -<target>BESLUTNINGS TRÆ</target> -<source>file exists on both sides</source> -<target>fil findes pÃ¥ begge sider</target> -<source>on one side only</source> -<target>kun pÃ¥ en side</target> -<source>same date</source> -<target>samme dato</target> -<source>different date</source> -<target>forskellig dato</target> + <source>Inactive</source> <target>Inaktiv</target> -<source>Second</source> -<target>Sekund</target> -<source>Minute</source> -<target>Minut</target> -<source>Hour</source> -<target>Time</target> -<source>Day</source> -<target>Dag</target> + +<source>Last x hours</source> +<target>Sidste x timer</target> + +<source>Today</source> +<target>Idag</target> + +<source>This week</source> +<target>Denne uge</target> + +<source>This month</source> +<target>Denne mÃ¥ned</target> + +<source>This year</source> +<target>Dette Ã¥r</target> + <source>Byte</source> <target>Byte</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>Filter: Alle par</target> + <source>Filter: Single pair</source> <target>Filter: Par</target> + <source>Ignore</source> <target>Ignorer</target> + <source>Direct</source> <target>Direkte</target> + <source>Follow</source> <target>Følg</target> + +<source>Copy NTFS permissions</source> +<target>Kopier NTFS tilladelser</target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>Integrere eksterne programme. Følgende macroer er mulige:</target> + <source>- full file or directory name</source> <target>- komplet fil eller bibliotek navn</target> + <source>- directory part only</source> <target>- kun bibliotek</target> + <source>- Other side's counterpart to %name</source> <target>- Modsatte sides modpart til %name</target> + <source>- Other side's counterpart to %dir</source> <target>- Modsatte sides modpart til %dir</target> + <source>Restore all hidden dialogs?</source> <target>Gendan alle skjulte dialoger?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -916,6 +1259,7 @@ Overfør fil og biblioteks tilladelser <pluralform>Vil du flytte emnet til skraldespanden?</pluralform> <pluralform>Vil du flytte følgende %x emner til skraldespanden?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -924,139 +1268,211 @@ Overfør fil og biblioteks tilladelser <pluralform>Vil du slette følgende emne?</pluralform> <pluralform>Vil du slette følgende %x emner?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>Efterlad som uløste konflikter</target> + <source>Delete permanently</source> <target>Slet permanent</target> + <source>Delete or overwrite files permanently</source> <target>Slet eller overskriv filer permanent</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>Brug skraldespand ved sletning eller overskrivning</target> + <source>Versioning</source> <target>Versionering</target> + <source>Move files into a time-stamped subdirectory</source> <target>Flyt filer til et datomærket underbibliotek</target> -<source>Cannot determine sync-direction:</source> -<target>Kan ikke bestemme synkroniseringsvej:</target> -<source>Filter settings have changed!</source> -<target>Filter indstillinger er ændret!</target> + <source>Both sides have changed since last synchronization!</source> <target>Begge sider er ændret siden sidste synkronisering!</target> + +<source>Cannot determine sync-direction:</source> +<target>Kan ikke bestemme synkroniseringsvej:</target> + <source>No change since last synchronization!</source> <target>Ingen ændringer siden sidste synkronisering!</target> + +<source>Filter settings have changed!</source> +<target>Filter indstillinger er ændret!</target> + <source>The file was not processed by last synchronization!</source> <target>filen blev ikke behandlet ved sidste synkronisering!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>Planlagt sletning af biblioteket er i konflikt med underbiblioteker og filer!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Sætter standard synkroniseringsvej: Gamle filer bliver overskrevet med nyere.</target> + <source>The file does not contain a valid configuration:</source> <target>Filen indeholder ikke en gyldig konfiguration:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>Du kan ignorer denne fejl, og opfatte biblioteket som tomt.</target> + <source>Directory does not exist:</source> <target>Biblioteket findes ikke:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Biblioteker er afhængige! Vær forsigtig nÃ¥r du laver synkroniserings reglerne:</target> + <source>Comparing content of files %x</source> <target>Sammenligner indhold af filer %x</target> + <source>Memory allocation failed!</source> <target>Hukommelses fejl!</target> + <source>File %x has an invalid date!</source> <target>Filen %x har en ugyldig dato!</target> + <source>Conflict detected:</source> <target>Konflik fundet:</target> + <source>Files %x have the same date but a different size!</source> <target>Filerne %x har den samme dato men forskellig størrelse!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>Links %x har den samme dato men forskellige destinationerl!</target> + <source>Comparing files by content failed.</source> <target>Fejl i sammenligning af filernes indhold.</target> + <source>Generating file list...</source> <target>Laver fil liste...</target> + <source>Multiple...</source> <target>Flere...</target> + <source>Both sides are equal</source> <target>Begge sider er ens</target> + <source>Files/folders differ in attributes only</source> <target>Filer/mapper har forskellige attributter</target> + <source>Copy new file/folder to left</source> <target>Kopiere ny fil/mappe til venstre</target> + <source>Copy new file/folder to right</source> <target>Kopiere ny fil/mappe til højre</target> + <source>Delete left file/folder</source> <target>Slet venstre fil/mappe</target> + <source>Delete right file/folder</source> <target>Slet højre fil/mappe</target> + <source>Overwrite left file/folder with right one</source> <target>Overskriv venstre fil/mappe med højre</target> + <source>Overwrite right file/folder with left one</source> <target>Overskriv højre fil/mappe med venstre</target> + <source>Do nothing</source> <target>Gør intet</target> + <source>Copy file attributes only to left</source> <target>Kopiere fil attributter kun til venstre</target> + <source>Copy file attributes only to right</source> <target>Kopiere fil attributter kun til højre</target> + <source>Deleting file %x</source> <target>Sletter fil %x</target> -<source>Deleting Symbolic Link %x</source> -<target>Sletter Link %x</target> + <source>Deleting folder %x</source> <target>Sletter mappe %x</target> -<source>Moving %x to Recycle Bin</source> -<target>Flytter %x til skraldespanden</target> -<source>Moving file %x to user-defined directory %y</source> -<target>Flytter fil %x til bruger-defineret bibliotek %y</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>Flytter mappe %x til bruger-defineret bibliotek %y</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>Flytter Link %x til bruger-defineret bibliotek %y</target> -<source>Copying new file %x to %y</source> -<target>Kopierer ny fil %x til %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>Kopierer nyt Link %x til %y</target> -<source>Overwriting file %x in %y</source> -<target>Overskriver fil %x i %y</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>Overskriver Link %x i %y</target> + +<source>Deleting symbolic link %x</source> +<target>Sletter symbolks link %x</target> + +<source>Moving file %x to recycle bin</source> +<target>Flytter fil %x til papirkurven</target> + +<source>Moving folder %x to recycle bin</source> +<target>Flytter mappe %x til papirkurven</target> + +<source>Moving symbolic link %x to recycle bin</source> +<target>Flytter link %x til papirkurven</target> + +<source>Moving file %x to %y</source> +<target>Flytter filen %x til %y</target> + +<source>Moving folder %x to %y</source> +<target>Flytter mappen %x til %y</target> + +<source>Moving symbolic link %x to %y</source> +<target>Flytter linket %x til %y</target> + +<source>Creating file %x</source> +<target>Opretter filen %x</target> + +<source>Creating symbolic link %x</source> +<target>Opretter linket %x</target> + <source>Creating folder %x</source> <target>Opretter mappe %x</target> + +<source>Overwriting file %x</source> +<target>Overskriver filen %x</target> + +<source>Overwriting symbolic link %x</source> +<target>Overskriver linket %x</target> + <source>Verifying file %x</source> <target>Verificerer fil %x</target> + <source>Updating attributes of %x</source> <target>Opdaterer attributter af %x</target> -<source>Source directory does not exist anymore:</source> -<target>Kilde biblioteket findes ikke mere:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>Intet at synkroniserer ifølge dokumentationen!</target> + <source>Target directory name must not be empty!</source> <target>Navnet pÃ¥ destinations biblioteket mÃ¥ ikke være tomt!</target> + <source>User-defined directory for deletion was not specified!</source> <target>Bruger-defineret bibliotek til sletning ikke defineret!</target> + +<source>Source directory does not exist anymore:</source> +<target>Kilde biblioteket findes ikke mere:</target> + <source>Unresolved conflicts existing!</source> <target>Er er uløste konflikter!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>Du kan ignorere konflikter og fortsætte synkronisering.</target> + <source>Significant difference detected:</source> <target>Betydelig forskel fundet:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>Mere end 50% af det samlede antal filer vil blive kopieret eller slettet!</target> + <source>Not enough free disk space available in:</source> <target>Ikke nok ledig diskplads pÃ¥:</target> + <source>Free disk space required:</source> <target>Krævet ledig diskplads:</target> + <source>Free disk space available:</source> <target>Ledig diskplads tilgængelig:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target></target> +<target>Papirkurven kan ikke bruges pÃ¥ følgende stier! Filerne vil blive slettet permanent i stedet for:</target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>Et bibliotek vil blive ændret som er en del af et mappe par! Gennemse venligst synkroniserings indstillingerne!</target> + <source>Processing folder pair:</source> <target>Behandler mappe par:</target> + <source>Generating database...</source> <target>Opretter database...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>Intet at synkroniserer ifølge dokumentationen!</target> + <source>Error copying locked file %x!</source> <target>Fejl i kopiering af lÃ¥st fil %x!</target> + <source>Data verification error: Source and target file have different content!</source> <target>Data godkendelses fejl: Kilde og destinations fil har forskelligt indhold!</target> + diff --git a/BUILD/Languages/dutch.lng b/BUILD/Languages/dutch.lng index 106e2a69..3a93e3fb 100644 --- a/BUILD/Languages/dutch.lng +++ b/BUILD/Languages/dutch.lng @@ -9,74 +9,115 @@ <source>Searching for directory %x...</source> <target></target> + <source>Show in Explorer</source> <target>Toon in de verkenner</target> + <source>Open with default application</source> <target>Open met standaardapplicatie</target> + <source>Browse directory</source> <target>Verken map</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Geautomatiseerde Synchronisatie</target> + <source>Browse</source> <target>Verkennen</target> -<source>Invalid commandline: %x</source> -<target>Ongeldige invoer: %x</target> + +<source>Invalid command line: %x</source> +<target></target> + <source>Error resolving symbolic link:</source> <target>Fout tijdens opzoeken van symbolische koppeling:</target> -<source>Show popup</source> -<target>Toon opspringvenster</target> -<source>Show popup on errors or warnings</source> -<target>Toon opspringvenster bij fouten of waarschuwingen</target> + +<source>Show pop-up</source> +<target></target> + +<source>Show pop-up on errors or warnings</source> +<target></target> + <source>Ignore errors</source> <target>Negeer foutmeldingen</target> + <source>Hide all error and warning messages</source> <target>Verberg alle fout- en waarschuwingsberichten</target> + <source>Exit instantly</source> <target>Sluit meteen af</target> + <source>Abort synchronization immediately</source> <target>Stop synchronisatie onmiddelijk</target> + +<source>Select alternate comparison settings</source> +<target></target> + <source>Select alternate synchronization settings</source> <target>Selecteer alternatieve synchronisatie instellingen</target> + <source>No filter selected</source> <target>Geen filter geselecteerd</target> + <source>Filter is active</source> <target>Filter is actief</target> -<source>Clear filter settings</source> -<target>Verwijder filter instellingen</target> + <source>Remove alternate settings</source> <target>Verwijder alternatieve instellingen</target> + +<source>Clear filter settings</source> +<target>Verwijder filter instellingen</target> + <source>Create a batch job</source> <target>Creëer een taaklijst</target> + <source>Synchronization settings</source> <target>Synchronisatie instellingen</target> + <source>Comparison settings</source> <target>Vergelijk instellingen</target> + <source>About</source> <target>Informatie</target> + <source>Error</source> <target>Fout</target> + <source>Warning</source> <target>Waarschuwing</target> + <source>Question</source> <target>Vraag</target> + <source>Confirm</source> <target>Bevestig</target> + <source>Configure filter</source> <target>Filter configuratie</target> + <source>Customize columns</source> <target>Aanpassen kolommen</target> + <source>Global settings</source> <target>Algemene instellingen</target> + <source>Synchronization Preview</source> <target>Synchronisatie voorbeeldweergave</target> + <source>Find</source> <target>Vind</target> + +<source>Select time span</source> +<target></target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -85,46 +126,64 @@ <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> </target> + <source><Symlink></source> <target><Symlink></target> + <source><Directory></source> <target><Map></target> + <source>Size</source> <target>Grootte</target> + <source>Date</source> <target>Datum</target> + <source>Full path</source> <target>Volledig pad</target> + <source>Filename</source> <target>Bestandsnaam</target> + <source>Relative path</source> <target>Relatief pad</target> + <source>Directory</source> <target>Map</target> + <source>Extension</source> <target>Extensie</target> + <source>Comparison Result</source> <target>Resultaat vergelijken</target> + <source>Incompatible synchronization database format:</source> <target>Opmaak van synchronisatie-database komt niet overeen:</target> + <source>Initial synchronization:</source> <target>Initiële synchronisatie:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>Eén van de FreeFileSync database bestanden bestaat nog niet:</target> + <source>Error reading from synchronization database:</source> <target>Fout tijdens uitlezen van synchronisatie-database:</target> + <source>Database files do not share a common synchronization session:</source> <target></target> + <source>An exception occurred!</source> <target>Er heeft een uitzondering plaatsgevonden!</target> -<source>Error deleting file:</source> -<target>Fout tijdens verwijderen van bestand:</target> + <source>Error reading file attributes:</source> <target>Fout tijdens lezen van bestandsattributen</target> + <source>Waiting while directory is locked (%x)...</source> <target>Wacht totdat map is vergrendeld (%x)...</target> + <source>Error setting directory lock:</source> <target>Fout tijdens mapvergrendeling:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -133,27 +192,37 @@ <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> </target> + <source>Info</source> <target>Info</target> + <source>Fatal Error</source> <target>Fatale fout</target> + <source>Scanning:</source> <target>Doorzoekt:</target> + <source>Encoding extended time information: %x</source> <target>Coderen uitgebreide tijd informatie: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> <target></target> + <source>Invalid FreeFileSync config file!</source> <target>Foutief FreeFileSync configuratiebestand!</target> + <source>File does not exist:</source> <target>Bestand bestaat niet:</target> + <source>Error parsing configuration file:</source> <target>Fout tijdens verwerking configuratiebestand:</target> + <source>/sec</source> <target>/sec</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -162,6 +231,7 @@ <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -170,6 +240,7 @@ <pluralform>1 uur</pluralform> <pluralform>%x uren</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -178,28 +249,40 @@ <pluralform>1 dag</pluralform> <pluralform>%x dagen</pluralform> </target> + <source>S&ave configuration...</source> <target>Sl&a configuratie op...</target> + <source>&Load configuration...</source> <target>&Laad configuratie...</target> + <source>&Quit</source> <target>&Afsluiten</target> + <source>&File</source> <target>&Bestand</target> + <source>&Content</source> <target>&Inhoud</target> + <source>&About...</source> <target>&Informatie...</target> + <source>&Help</source> <target>&Help</target> + <source>Usage:</source> <target>Gebruik:</target> + <source>1. Select directories to monitor.</source> <target>1. Selecteer mappen om te observeren.</target> + <source>2. Enter a command line.</source> <target>2. Geef een opdrachtregel in.</target> + <source>3. Press 'Start'.</source> <target>3. Klik op 'Start'.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -210,310 +293,456 @@ De opdrachtregel wordt telkens uitgevoerd indien: - alle mappen beschikbaar worden (bijv. invoegen van USB stick) - bestanden binnen deze mappen of submappen veranderd zijn </target> + <source>Directories to watch</source> <target>Mappen om te bekijken</target> + <source>Add folder</source> <target>Map toevoegen</target> + <source>Remove folder</source> <target>Verwijder map</target> + <source>Select a folder</source> <target>Selecteer een map</target> + <source>Command line</source> <target>Opdrachtregel</target> + <source>Minimum Idle Time [seconds]</source> <target>Minimale inactieve tijd [seconden]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>Aantal inactieve seconden tussen detectie van de laatste verandering en uitvoering van een commando</target> + <source>Start</source> <target>Start</target> + <source>(Build: %x)</source> <target>(Build: %x)</target> + <source>RealtimeSync configuration</source> <target>RealtimeSync configuratie</target> + <source>File already exists. Overwrite?</source> <target>Bestand bestaat al. Overschrijven?</target> + <source>&Restore</source> <target>&Herstellen</target> + <source>&Exit</source> <target>&Afsluiten</target> + <source>Monitoring active...</source> <target>Observeren actief...</target> + <source>Waiting for missing directories...</source> <target>Wacht op missende mappen...</target> + <source>A directory input field is empty.</source> <target>Een tekstveld over de map is leeg.</target> + <source>Drag && drop</source> <target>Drag en drop</target> + <source>Could not initialize directory monitoring:</source> <target>Initaliseren van map-observatie niet mogelijk:</target> + <source>Error when monitoring directories.</source> <target>Fout tijdens observeren van mappen.</target> + <source>Conversion error:</source> <target>Converteer fout:</target> + +<source>Error deleting file:</source> +<target>Fout tijdens verwijderen van bestand:</target> + <source>Error moving file:</source> <target>Fout tijdens verplaatsen van bestand:</target> + <source>Target file already existing!</source> <target>Doelbestand bestaat al!</target> + <source>Error moving directory:</source> <target>Fout tijdens verplaatsen van map:</target> + <source>Target directory already existing!</source> <target>Doelmap bestaat al!</target> + <source>Error deleting directory:</source> <target>Fout tijdens het verwijderen van map:</target> + <source>Error changing modification time:</source> <target>Fout tijdens aanpassing van de wijzigingstijd:</target> + <source>Error loading library function:</source> <target>Fout tijdens laden van bibliotheek functie:</target> + <source>Error reading security context:</source> <target>Fout tijdens lezen van beveiligingscontext:</target> + <source>Error writing security context:</source> <target>Fout tijdens schrijven van beveiligingscontext:</target> + <source>Error copying file permissions:</source> <target>Fout tijdens kopiëren van bestandspermissies:</target> + <source>Error creating directory:</source> <target>Fout tijdens het aanmaken van map:</target> + <source>Error copying symbolic link:</source> <target>Fout tijdens kopiëren van symbolische koppeling:</target> + <source>Error copying file:</source> <target>Fout tijdens kopiëren van bestand:</target> + <source>Error opening file:</source> <target>Fout tijdens openen van bestand:</target> + <source>Error writing file:</source> <target>Fout tijdens schrijven van bestand:</target> + <source>Error reading file:</source> <target>Fout tijdens lezen van bestand:</target> + <source>Operation aborted!</source> <target>Bewerking afgebroken!</target> + <source>Endless loop when traversing directory:</source> <target>Oneindige lus bij het doorlopen van map:</target> + <source>Error traversing directory:</source> <target>Fout tijdens doorzoeken van map:</target> + <source>Windows Error Code %x:</source> <target>Windows Fout Code %x:</target> + <source>Linux Error Code %x:</source> <target>Linux Fout Code %x:</target> + <source>Error setting privilege:</source> <target>Fout tijdens instellen van privileges:</target> + <source>Error moving to Recycle Bin:</source> <target>Fout tijdens verplaatsen naar prullenbak:</target> + <source>Could not load a required DLL:</source> <target>Kon een benodigde DLL niet laden:</target> + <source>Error writing to synchronization database:</source> <target>Fout tijdens schrijven naar synchronisatie-database:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>Fout tijdens het opstarten van de Volume Shadow Copy Service!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target></target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>Het aanmaken van schaduwkopieën op WOW64 wordt niet ondersteund. Gebruik alstublieft de 64-bit versie van FreeFileSync.</target> + <source>Could not determine volume name for file:</source> <target>Kon de schijfnaam niet vaststellen van bestand:</target> + <source>Volume name %x not part of filename %y!</source> <target>Schijfnaam %x maakt geen deel uit van bestandsnaam %y!</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>Kon geen waarden inlezen voor de volgende XML punten:</target> + <source>Logging</source> <target>Loggen</target> + <source>FreeFileSync batch file</source> <target>FreeFileSync taakbestand</target> + <source>FreeFileSync configuration</source> <target>FreeFileSync configuratie</target> + <source>FreeFileSync Batch Job</source> <target>FreeFileSync Taaklijst</target> + <source>Unable to create logfile!</source> <target>Niet in staat om een logbestand aan te maken!</target> + <source>Batch execution</source> <target>Taak uitvoeren</target> + <source>Log-messages:</source> <target>Logberichten:</target> + <source>Stop</source> <target>Stop</target> + <source>Total time:</source> <target>Totale tijd:</target> + <source>Synchronization aborted!</source> <target>Synchronisatie afgebroken!</target> + <source>Synchronization completed with errors!</source> <target>Synchronisatie is met fouten afgerond!</target> + <source>Synchronization completed successfully!</source> <target>Synchronisatie succesvol afgerond!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>Toets "Switch" om FreeFileSync GUI mode te openen.</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>Schakelt over naar FreeFileSync GUI mode...</target> + <source>Unable to connect to sourceforge.net!</source> <target>Niet in staat verbinding te maken met sourceforge.net!</target> + <source>A newer version of FreeFileSync is available:</source> <target>Een nieuwe versie van FreeFileSync is beschikbaar:</target> + <source>Download now?</source> <target>Nu downloaden?</target> + <source>Information</source> <target>Informatie</target> + <source>FreeFileSync is up to date!</source> <target>U gebruikt de nieuwste versie van FreeFileSync!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>Wilt u FreeFileSync elke week automatisch laten controleren of er een nieuwe versie is?</target> + <source>(Requires an Internet connection!)</source> <target>(Vereist een internetverbinding!)</target> + <source>1. &Compare</source> <target>1. &Vergelijk</target> + <source>2. &Synchronize...</source> <target>2. &Synchroniseer...</target> + <source>S&witch view</source> <target>&Wijzig weergave</target> + <source>&New</source> <target>&Nieuw</target> + <source>&Program</source> <target>&Programma</target> + <source>&Language</source> <target>&Taal</target> + <source>&Global settings...</source> <target>&Algemene instellingen...</target> + <source>&Create batch job...</source> <target>&Creëer taaklijst...</target> + <source>&Export file list...</source> <target>&Exporteer bestandslijst...</target> + <source>&Advanced</source> <target>&Geavanceerd</target> + <source>&Check for new version</source> <target>&Controleer op nieuwe versie</target> + <source>Compare</source> <target>Vergelijk</target> + <source>Compare both sides</source> <target>Vergelijk beide zijdes</target> + <source>&Abort</source> <target>&Afbreken</target> + <source>Synchronize...</source> <target>Synchroniseer...</target> + <source>Start synchronization</source> <target>Start synchronisatie</target> -<source>Swap sides</source> -<target>Wissel zijdes</target> + <source>Add folder pair</source> <target>Voeg gekoppelde mappen toe</target> + <source>Remove folder pair</source> <target>Verwijder gekoppelde mappen</target> + +<source>Swap sides</source> +<target>Wissel zijdes</target> + <source>Save current configuration to file</source> <target>Sla de huidige configuratie op in een bestand</target> + <source>Load configuration from file</source> <target>Laad configuratie uit bestand</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>Laatst gebruikte instellingen (druk op DEL om iets te verwijderen)</target> + <source>Hide excluded items</source> <target>Verberg uitgesloten items</target> + <source>Hide filtered or temporarily excluded files</source> <target>Verberg gefilterde of tijdelijk uitgesloten bestanden</target> + <source>Number of files and directories that will be created</source> <target>Aantal bestanden en mappen die aangemaakt zullen worden</target> + <source>Number of files that will be overwritten</source> <target>Aantal bestanden die overschreven zullen worden</target> + <source>Number of files and directories that will be deleted</source> <target>Aantal bestanden en mappen die verwijderd zullen worden</target> + <source>Total amount of data that will be transferred</source> <target>Totale hoeveelheid data die verplaatst wordt</target> -<source>Left</source> -<target>Links</target> -<source>Right</source> -<target>Rechts</target> + <source>Batch job</source> <target>Taaklijst</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>Creëer een taakbestand voor geautomatiseerde synchronisatie. Om te starten in taakmodus dubbelklik op het bestand of uitvoeren via opdrachtregel: FreeFileSync.exe <takenbestand>. Dit kan ook gepland worden met de taakplanner van uw OS.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target></target> + <source>Help</source> <target>Help</target> + <source>Filter files</source> <target>Filter bestanden</target> + <source>Error handling</source> <target>Fout afhandeling</target> + +<source>Left</source> +<target>Links</target> + +<source>Right</source> +<target>Rechts</target> + <source>Overview</source> <target>Overzicht</target> + <source>Status feedback</source> <target>Status terugkoppeling</target> + <source>Run minimized</source> <target></target> + <source>Maximum number of logfiles:</source> <target>Maximale aantal van logbestanden:</target> + <source>Select logfile directory:</source> <target>Selecteer een map voor het logbestand:</target> + <source>Batch settings</source> <target></target> + <source>&Save</source> <target>&Opslaan</target> + <source>&Load</source> <target>&Laden</target> + <source>&Cancel</source> <target>&Annuleren</target> + <source>Elements found:</source> <target>Onderdelen gevonden:</target> + <source>Elements remaining:</source> <target>Onderdelen te gaan:</target> + <source>Speed:</source> <target>Snelheid:</target> + <source>Time remaining:</source> <target>Benodigde tijd:</target> + <source>Time elapsed:</source> <target>Verstreken tijd:</target> + <source>Operation:</source> <target>Bewerking:</target> + <source>Select variant:</source> <target>Selecteer een variant:</target> + <source><Automatic></source> <target><Automatisch></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>Identificeer en verwerk veranderingen aan beide zijdes dmv een database. Verwijderingen en conflicten worden automatisch gedetecteerd.</target> + <source>Mirror ->></source> <target>Spiegelen ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Spiegel backup van linker map. Rechter map is bewerk om precies hetzelfde te hebben na synchronisatie.</target> + <source>Update -></source> <target>Bijwerken -></target> + <source>Copy new or updated files to right folder.</source> <target>Kopieer nieuwe of geupdate bestanden naar de rechter map.</target> + <source>Custom</source> <target>Aangepast</target> + <source>Configure your own synchronization rules.</source> <target>Configureer uw eigen synchronisatieregels.</target> + <source>Deletion handling</source> <target>Verwijder-afhandeling</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>Configuratie</target> + <source>Category</source> <target>Categorie</target> + <source>Action</source> <target>Actie</target> + <source>File/folder exists on left side only</source> <target>Bestand/Map bestaat alleen aan de linkerkant</target> + <source>File/folder exists on right side only</source> <target>Bestand/Map bestaat alleen aan de rechterkant</target> + <source>Left file is newer</source> <target>Linker bestand is nieuwer</target> + <source>Right file is newer</source> <target>Rechter bestand is nieuwer</target> + <source>Files have different content</source> <target>Bestanden hebben verschillende inhoud</target> + <source>Conflict/file cannot be categorized</source> <target>Conflict/Bestand kan niet worden gecategoriseerd</target> + <source>Compare by...</source> <target>Vergelijk met...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> -<target> -Bestanden worden als gelijk beschouwd indien, - - de bestandsgrootte - - laatste wijzigingstijd en datum -overeenkomt -</target> -<source>File size and date</source> -<target>Bestandsgrootte en -datum</target> +<target></target> + +<source>File time and size</source> +<target></target> + <source> Files are found equal if - file content @@ -524,92 +753,85 @@ Bestanden worden als gelijk beschouwd indien, - de bestandsinhoud overeenkomt </target> + <source>File content</source> <target>Bestandsinhoud</target> + <source>Symbolic Link handling</source> <target>Symbolische Koppeling afhandeling</target> + <source>Synchronizing...</source> <target>Synchroniseert...</target> + <source>Elements processed:</source> <target>Onderdelen verwerkt:</target> + <source>&Pause</source> <target>&Pauze</target> -<source>Compare by "File size and date"</source> -<target>Vergelijk met "bestandsgrootte en -datum"</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>Deze variant beschouwt twee gelijknamige bestanden als gelijk wanneer ze dezelfde bestandsgrootte EN dezelfde datum en tijdstempel hebben.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>Wanneer de vergelijking met deze optie aan gestart wordt zal de volgende besluitboom gehanteerd worden:</target> -<source>As a result the files are separated into the following categories:</source> -<target>Als resultaat worden de bestanden in de volgende categorieën gescheiden:</target> -<source>- equal</source> -<target>- gelijk</target> -<source>- left newer</source> -<target>- links is nieuwer</target> -<source>- right newer</source> -<target>- rechts is nieuwer</target> -<source>- exists left only</source> -<target>- bestaat alleen links</target> -<source>- exists right only</source> -<target>- bestaat alleen rechts</target> -<source>- conflict (same date, different size)</source> -<target>- conflict (zelfde datum, verschillende grootte)</target> -<source>Compare by "File content"</source> -<target>Vergelijk met "bestandsinhoud"</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. - -With this option enabled the decision tree is smaller: -</source> -<target> -Zoals de naam suggereert worden twee bestanden met dezelfde naam alleen als gelijk bestempeld als ze precies dezelfde inhoud hebben. Deze optie is handig voor een consistentiecontrole in plaats van back-up handelingen. Daarom worden de tijdstempels niet bekeken. - Met deze optie geselecteerd is de beslissingsboom korter: -</target> -<source>- different</source> -<target>- verschillend</target> <source>Source code written in C++ utilizing:</source> <target>Broncode geschreven in C++ met behulp van:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>Extra dank voor het vertalen van FreeFileSync gaat naar:</target> + <source>Feedback and suggestions are welcome at:</source> <target>Tips en suggesties zijn welkom op:</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync op Sourceforge</target> + <source>Homepage</source> <target>Homepage</target> + <source>If you like FFS</source> <target>Indien FreeFileSync u bevalt</target> + <source>Donate with PayPal</source> <target>Doneer met PayPal</target> + <source>Email</source> <target>E-mail</target> + <source>Report translation error</source> <target>Rapporteer een vertaalfout</target> + <source>Published under the GNU General Public License:</source> <target>Gepubliceerd onder de GNU General Public License:</target> + <source>Ignore subsequent errors</source> <target>Negeer erop volgende foutmeldingen</target> + <source>Hide further error messages during the current process</source> <target>Verberg eventuele foutmeldingen gedurende de huidige bewerking</target> + <source>&Ignore</source> <target>&Negeren</target> + <source>&Retry</source> <target>&Opnieuw proberen</target> + <source>Do not show this dialog again</source> <target>Toon deze melding niet meer</target> + <source>&Switch</source> <target>&Verander</target> + <source>&Yes</source> <target>&Ja</target> + <source>&No</source> <target>&Nee</target> + <source>Delete on both sides</source> <target>Verwijder aan beide zijdes</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>Verwijder aan beide zijdes ook al is het bestand maar aan één zijde geselecteerd</target> + <source>Use Recycle Bin</source> <target>Gebruik de prullenbak</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -618,16 +840,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire Alleen bestanden/mappen die overeenkomen met de filter instellingen worden geselecteerd voor synchronisatie. Aantekening: De naam van de filter moet relatief gespecificeerd zijn (!) aan de hoofd synchronisatie map. </target> + <source>Hints:</source> <target>Tips:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. Vul de relatieve bestands- of mapnaam in, gescheiden door ';' of een nieuwe regel.</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. Gebruik wildcard karakters zoals '*' en '?'.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. Sluit bestanden in het hoofdscherm direct uit via het contextmenu</target> + <source>Example</source> <target>Voorbeeld</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -636,30 +864,40 @@ Exclude: \stuff\temp\* Opnemen: *.doc;*.zip;*.exe Uitsluiten: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>Synchroniseer alle .doc, .zip en .exe bestanden behalve wat in submap "temp" staat.</target> + <source>Include</source> <target>Opnemen</target> + <source>Exclude</source> <target>Uitsluiten</target> -<source>Select time span:</source> -<target>Slecteer tijdspanne:</target> -<source>Minimum file size:</source> -<target>Minimum bestandsgrootte:</target> -<source>Maximum file size:</source> -<target>Maximum bestandsgrootte:</target> + +<source>Minimum file size</source> +<target></target> + +<source>Maximum file size</source> +<target></target> + <source>&Default</source> <target>&Standaard</target> + <source>Move column up</source> <target>Verplaats kolom naar boven</target> + <source>Move column down</source> <target>Verplaats kolom naar beneden</target> -<source>Transactional File Copy</source> + +<source>Transactional file copy</source> <target></target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> <target></target> + <source>Copy locked files</source> <target>Kopieer vergrendelde bestanden</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -668,8 +906,10 @@ Copy shared or locked files using Volume Shadow Copy Service Kopieer gedeelde of vergrendelde bestanden met Volume Shadow Copy Service (Vereist Administrator rechten) </target> -<source>Copy filesystem permissions</source> -<target>Kopieer bestandssysteem toegangsrechten</target> + +<source>Copy file access permissions</source> +<target></target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -678,138 +918,205 @@ Transfer file and directory permissions Zet bestand en map permissies over (Vereist Administrator rechten) </target> + <source>Hidden dialogs:</source> <target>Verborgen dialogen:</target> + <source>Reset</source> <target>Opnieuw instellen</target> + <source>Show hidden dialogs</source> <target>Toon verborgen dialogen</target> + <source>External applications</source> <target>Externe applicaties</target> + <source>Description</source> <target>Omschrijving</target> + <source>Variant</source> <target>Variant</target> + <source>Statistics</source> <target>Statistieken</target> + <source>Find what:</source> <target>Vind wat:</target> + <source>Match case</source> <target>Hoofdlettergevoelig</target> + <source>&Find next</source> <target>&Vind volgende</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>U kunt proberen om de resterende items opnieuw te synchroniseren (ZONDER opnieuw te hoeven vergelijken)!</target> -<source>Batch file created successfully!</source> -<target>Taakbestand is succesvol aangemaakt!</target> + <source>Main bar</source> <target>Hoofdbalk</target> + <source>Folder pairs</source> <target>Map paren</target> + <source>Select view</source> <target>Kies weergave</target> + <source>Set direction:</source> <target>Stel richting in:</target> + <source>Exclude temporarily</source> <target>Sluit tijdelijk uit</target> + <source>Include temporarily</source> <target>Tijdelijk opnemen</target> + <source>Exclude via filter:</source> <target>Sluit via filter uit:</target> + <source><multiple selection></source> <target><meervoudige selectie></target> + <source>D-Click</source> <target>Dubbele klik</target> + <source>Delete</source> <target>Verwijderen</target> + <source>Customize...</source> <target>Aanpassen...</target> + +<source>Select time span...</source> +<target></target> + <source>Auto-adjust columns</source> <target>Kolommen automatisch aanpassen</target> + <source>Include all rows</source> <target>Alle rijen opnemen</target> + <source>Exclude all rows</source> <target>Sluit alle rijen uit</target> + <source>Reset view</source> <target>Stel weergave opnieuw in</target> + <source>Show "%x"</source> <target>Toon "%x"</target> + <source><Last session></source> <target><Laatste sessie></target> + <source>Configuration saved!</source> <target>Configuratie opgeslagen!</target> + <source>Save changes to current configuration?</source> <target>Veranderingen opslaan in de huidige configuratie?</target> + <source>Configuration loaded!</source> <target>Configuratie geladen!</target> + <source>Folder Comparison and Synchronization</source> <target>Mappen vergelijken en synchroniseren</target> + <source>Hide files that exist on left side only</source> <target>Verberg bestanden die alleen aan de linkerzijde bestaan</target> + <source>Show files that exist on left side only</source> <target>Toon bestanden die alleen aan de linkerzijde bestaan</target> + <source>Hide files that exist on right side only</source> <target>Verberg bestanden die alleen aan de rechterzijde bestaan</target> + <source>Show files that exist on right side only</source> <target>Toon bestanden die alleen aan de rechterzijde bestaan</target> + <source>Hide files that are newer on left</source> <target>Verberg bestanden die aan de linkerzijde nieuwer zijn</target> + <source>Show files that are newer on left</source> <target>Toon bestanden die aan de linkerzijde nieuwer zijn</target> + <source>Hide files that are newer on right</source> <target>Verberg bestanden die aan de rechterzijde nieuwer zijn</target> + <source>Show files that are newer on right</source> <target>Toon bestanden die aan de rechterzijde nieuwer zijn</target> + <source>Hide files that are equal</source> <target>Verberg bestanden die gelijk zijn</target> + <source>Show files that are equal</source> <target>Toon bestanden die gelijk zijn</target> + <source>Hide files that are different</source> <target>Verberg bestanden die verschillen</target> + <source>Show files that are different</source> <target>Toon bestanden die verschillend zijn</target> + <source>Hide conflicts</source> <target>Verberg conflicten</target> + <source>Show conflicts</source> <target>Toon conflicten</target> + <source>Hide files that will be created on the left side</source> <target>Verberg bestanden die aan de linkerzijde zullen worden aangemaakt</target> + <source>Show files that will be created on the left side</source> <target>Toon bestanden die aan de linkerzijde aangemaakt zullen worden</target> + <source>Hide files that will be created on the right side</source> <target>Verberg bestanden die aan de rechterzijde zullen worden aangemaakt</target> + <source>Show files that will be created on the right side</source> <target>Toon bestanden die aan de rechterzijde aangemaakt zullen worden</target> + <source>Hide files that will be deleted on the left side</source> <target>Verberg bestanden die aan de linkerzijde zullen worden verwijderd</target> + <source>Show files that will be deleted on the left side</source> <target>Toon bestanden die van de linkerzijde verwijderd zullen worden</target> + <source>Hide files that will be deleted on the right side</source> <target>Verberg bestanden die aan de rechterzijde zullen worden verwijderd</target> + <source>Show files that will be deleted on the right side</source> <target>Toon bestanden die van de rechterzijde verwijderd zullen worden</target> + <source>Hide files that will be overwritten on left side</source> <target>Verberg bestanden die aan de linkerzijde zullen worden overschreven</target> + <source>Show files that will be overwritten on left side</source> <target>Toon bestanden die aan de linkerzijde overschreven zullen worden</target> + <source>Hide files that will be overwritten on right side</source> <target>Verberg bestanden die aan de rechterzijde zullen worden overschreven</target> + <source>Show files that will be overwritten on right side</source> <target>Toon bestanden die aan de rechterzijde overschreven zullen worden</target> + <source>Hide files that won't be copied</source> <target>Verberg bestanden die niet zullen worden gekopieerd</target> + <source>Show files that won't be copied</source> <target>Toon bestanden die niet gekopieerd zullen worden</target> + <source>All directories in sync!</source> <target>Alle mappen zijn gesynchroniseerd!</target> + <source>Please run a Compare first before synchronizing!</source> <target>Voer alstublieft eerst een Vergelijking uit voordat u synchroniseert.</target> + <source>Comma separated list</source> <target>Komma gescheiden lijst</target> + <source>Legend</source> <target>Legenda</target> + <source>File list exported!</source> <target>Bestandslijst geëxporteerd!</target> + +<source>Batch file created successfully!</source> +<target>Taakbestand is succesvol aangemaakt!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -818,6 +1125,7 @@ Zet bestand en map permissies over <pluralform>Object succesvol verwijderd!</pluralform> <pluralform>%x objecten succesvol verwijderd!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -826,6 +1134,7 @@ Zet bestand en map permissies over <pluralform>1 map</pluralform> <pluralform>%x mappen</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -834,6 +1143,7 @@ Zet bestand en map permissies over <pluralform>1 bestand</pluralform> <pluralform>%x bestanden</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -842,72 +1152,97 @@ Zet bestand en map permissies over <pluralform>%x van 1 rij in het overzicht</pluralform> <pluralform>%x van %y rijen in het overzicht</pluralform> </target> + <source>Scanning...</source> <target>Doorzoekt...</target> + <source>Comparing content...</source> <target>Inhoud vergelijken...</target> + <source>Paused</source> <target>Gepauzeerd</target> + <source>Aborted</source> <target>Afgebroken</target> + <source>Completed</source> <target>Volbracht</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>Bezig met afbreken: Wacht op beëindiging huidige bewerking...</target> + <source>Continue</source> <target>Doorgaan</target> + <source>Pause</source> <target>Pauze</target> + <source>Cannot find %x</source> <target>Kan %x niet vinden</target> -<source>DECISION TREE</source> -<target>BESLISSINGSBOOM</target> -<source>file exists on both sides</source> -<target>bestand bestaat aan beide zijdes</target> -<source>on one side only</source> -<target>alleen aan één zijde</target> -<source>same date</source> -<target>dezelfde datum</target> -<source>different date</source> -<target>verschillende datum</target> + <source>Inactive</source> <target>Niet actief</target> -<source>Second</source> -<target>Seconde</target> -<source>Minute</source> -<target>Minuut</target> -<source>Hour</source> -<target>Uur</target> -<source>Day</source> -<target>Dag</target> + +<source>Last x hours</source> +<target></target> + +<source>Today</source> +<target></target> + +<source>This week</source> +<target></target> + +<source>This month</source> +<target></target> + +<source>This year</source> +<target></target> + <source>Byte</source> <target>Byte</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>Filter: Alle paren</target> + <source>Filter: Single pair</source> <target>Filter: Enkel paar</target> + <source>Ignore</source> <target>Negeer</target> + <source>Direct</source> <target>Direct</target> + <source>Follow</source> <target>Volg</target> + +<source>Copy NTFS permissions</source> +<target></target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>Integreer externe applicaties in het context menu. De volgende macros zijn beschikbaar:</target> + <source>- full file or directory name</source> <target>- volledig bestand of mapnaam</target> + <source>- directory part only</source> <target>- alleen de map</target> + <source>- Other side's counterpart to %name</source> <target>- Tegenhanger andere zijde naar %naam</target> + <source>- Other side's counterpart to %dir</source> <target>- Tegenhanger andere zijde naar %dir</target> + <source>Restore all hidden dialogs?</source> <target>Alle verborgen dialogen herstellen?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -916,6 +1251,7 @@ Zet bestand en map permissies over <pluralform>Weet u zeker dat u dit object naar de Prullenbak wil verplaatsen?</pluralform> <pluralform>Weet u zeker dat u deze %x objecten naar de Prullenbak wil verplaatsen?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -924,139 +1260,211 @@ Zet bestand en map permissies over <pluralform>Weet u zeker dat u dit object wilt verwijderen?</pluralform> <pluralform>Weet u zeker dat u deze %x objecten wilt verwijderen?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>Beschouw als onopgelost conflict</target> + <source>Delete permanently</source> <target>Verwijder onomkeerbaar</target> + <source>Delete or overwrite files permanently</source> <target>Verwijder of overschrijf bestanden onomkeerbaar</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>Gebruik de prullenbak bij verwijderen of overschrijven van bestanden</target> + <source>Versioning</source> <target>Versieën</target> + <source>Move files into a time-stamped subdirectory</source> <target>Verplaats de bestanden naar een tijd-gemarkeerde submap</target> -<source>Cannot determine sync-direction:</source> -<target>Kan de synchronisatie-richting niet bepalen:</target> -<source>Filter settings have changed!</source> -<target>Filter instellingen zijn veranderd!</target> + <source>Both sides have changed since last synchronization!</source> <target>Beide zijdes zijn veranderd sinds de laatste synchronisatie!</target> + +<source>Cannot determine sync-direction:</source> +<target>Kan de synchronisatie-richting niet bepalen:</target> + <source>No change since last synchronization!</source> <target>Geen veranderingen sinds de laatste synchronisatie!</target> + +<source>Filter settings have changed!</source> +<target>Filter instellingen zijn veranderd!</target> + <source>The file was not processed by last synchronization!</source> <target>Het bestand werd niet verwerkt tijdens de laatste synchronisatie!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>Geplande map verwijdering veroorzaakt een conflict met onderliggende submappen en bestanden!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Stel standaard synchronisatie richtingen in: Oude bestanden worden door nieuwere bestanden overschreven.</target> + <source>The file does not contain a valid configuration:</source> <target>Het bestand bevat geen geldige configuratie:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>Je kan deze error negeren als de map leeg is.</target> + <source>Directory does not exist:</source> <target>Map bestaat niet:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Mappen zijn afhankelijk van elkaar! Wees voorzichtig met het maken van synchronisatieregels:</target> + <source>Comparing content of files %x</source> <target>De inhoud van %x bestanden wordt vergeleken</target> + <source>Memory allocation failed!</source> <target>RAM geheugen error!</target> + <source>File %x has an invalid date!</source> <target>Bestand %x heeft een ongeldige datum!</target> + <source>Conflict detected:</source> <target>Conflict gedetecteerd:</target> + <source>Files %x have the same date but a different size!</source> <target>Bestanden %x hebben dezelfde datums maar een afwijkende grootte!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>Symbolische koppeling %x heeft dezelfde datum maar een ander doel!</target> + <source>Comparing files by content failed.</source> <target>Bestand-inhoudvergelijking mislukt.</target> + <source>Generating file list...</source> <target>Genereren van bestandslijst...</target> + <source>Multiple...</source> <target>Meerdere...</target> + <source>Both sides are equal</source> <target>Beide kanten zijn gelijk</target> + <source>Files/folders differ in attributes only</source> <target>Bestanden/Mappen verschillen alleen in attributen</target> + <source>Copy new file/folder to left</source> <target>Kopieer nieuw bestand/map naar links</target> + <source>Copy new file/folder to right</source> <target>Kopieer nieuw bestand/map naar rechts</target> + <source>Delete left file/folder</source> <target>Verwijder linker bestand/map</target> + <source>Delete right file/folder</source> <target>Verwijder rechter bestand/map</target> + <source>Overwrite left file/folder with right one</source> <target>Overschrijf linker bestand/map met de rechter</target> + <source>Overwrite right file/folder with left one</source> <target>Overschrijf rechter bestand/map met de linker</target> + <source>Do nothing</source> <target>Geen actie ondernemen</target> + <source>Copy file attributes only to left</source> <target>Kopieer bestandsattributen alleen naar links</target> + <source>Copy file attributes only to right</source> <target>Kopieer bestandsattributen allen naar rechts</target> + <source>Deleting file %x</source> <target>Verwijderen van bestand %x</target> -<source>Deleting Symbolic Link %x</source> -<target>Verwijderen van Symbolische Link %x</target> + <source>Deleting folder %x</source> <target>Verwijderen van map %x</target> -<source>Moving %x to Recycle Bin</source> -<target>Verplaatst %x naar de Prullenbak</target> -<source>Moving file %x to user-defined directory %y</source> -<target>Verplaatst bestand %x naar een door de gebruiker gedefinieerde map %y</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>Verplaatst map %x naar een door de gebruiker gedefinieerde map %y</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>Verplaatst Symbolische Koppeling %x naar een door de gebruiker gedefinieerde map %y</target> -<source>Copying new file %x to %y</source> -<target>Kopieert nieuw bestand van %x naar %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>Kopieer nieuwe Symbolische Link van %x naar %y</target> -<source>Overwriting file %x in %y</source> -<target>Overschrijft bestand %x over %y</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>Overschrijft Symbolische Koppeling %x over %y</target> + +<source>Deleting symbolic link %x</source> +<target></target> + +<source>Moving file %x to recycle bin</source> +<target></target> + +<source>Moving folder %x to recycle bin</source> +<target></target> + +<source>Moving symbolic link %x to recycle bin</source> +<target></target> + +<source>Moving file %x to %y</source> +<target></target> + +<source>Moving folder %x to %y</source> +<target></target> + +<source>Moving symbolic link %x to %y</source> +<target></target> + +<source>Creating file %x</source> +<target></target> + +<source>Creating symbolic link %x</source> +<target></target> + <source>Creating folder %x</source> <target>Map %x wordt aangemaakt</target> + +<source>Overwriting file %x</source> +<target></target> + +<source>Overwriting symbolic link %x</source> +<target></target> + <source>Verifying file %x</source> <target>Verifieert bestand %x</target> + <source>Updating attributes of %x</source> <target>Attributen bijwerken van %x</target> -<source>Source directory does not exist anymore:</source> -<target>Bronmap bestaat niet meer:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>Volgens de configuratie hoeft er niets gesynchroniseerd te worden!</target> + <source>Target directory name must not be empty!</source> <target>Doel mapnaam mag niet leeg zijn!</target> + <source>User-defined directory for deletion was not specified!</source> <target>De door de gebruiker gedefinieerde map ter verwijdering was niet opgegeven!</target> + +<source>Source directory does not exist anymore:</source> +<target>Bronmap bestaat niet meer:</target> + <source>Unresolved conflicts existing!</source> <target>Er bestaan onopgeloste conflicten!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>U kunt de conflicten negeren en doorgaan met synchronisatie.</target> + <source>Significant difference detected:</source> <target>Significant verschil gedetecteerd:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>Meer dan 50% van alle bestanden zal gekopieerd of verwijderd worden!</target> + <source>Not enough free disk space available in:</source> <target>Niet genoeg vrije schijfruimte beschikbaar op:</target> + <source>Free disk space required:</source> <target>Vrije ruimte op harde schrijf nodig:</target> + <source>Free disk space available:</source> <target>Beschikbare vrije schijfruimte :</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> <target></target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>Een map wordt bewerkt die deel is van meerdere mappen! Controleer de synchronisatie instellingen!</target> + <source>Processing folder pair:</source> <target>Verwerking van gekoppelde mappen:</target> + <source>Generating database...</source> <target>Genereren van database...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>Volgens de configuratie hoeft er niets gesynchroniseerd te worden!</target> + <source>Error copying locked file %x!</source> <target>Fout tijdens kopiëren van vergrendeld bestand %x!</target> + <source>Data verification error: Source and target file have different content!</source> <target>Dataverificatie-fout: Bron en doelbestand hebben verschillende inhoud!</target> + diff --git a/BUILD/Languages/english_uk.lng b/BUILD/Languages/english_uk.lng index 9ab9dc15..0c3478fa 100644 --- a/BUILD/Languages/english_uk.lng +++ b/BUILD/Languages/english_uk.lng @@ -9,74 +9,115 @@ <source>Searching for directory %x...</source> <target>Searching for directory %x...</target> + <source>Show in Explorer</source> <target>Show in Explorer</target> + <source>Open with default application</source> <target>Open with default application</target> + <source>Browse directory</source> <target>Browse directory</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Automated Synchronisation</target> + <source>Browse</source> <target>Browse</target> -<source>Invalid commandline: %x</source> -<target>Invalid commandline: %x</target> + +<source>Invalid command line: %x</source> +<target>Invalid command line: %x</target> + <source>Error resolving symbolic link:</source> <target>Error resolving symbolic link:</target> -<source>Show popup</source> -<target>Show popup</target> -<source>Show popup on errors or warnings</source> -<target>Show popup on errors or warnings</target> + +<source>Show pop-up</source> +<target>Show pop-up</target> + +<source>Show pop-up on errors or warnings</source> +<target>Show pop-up on errors or warnings</target> + <source>Ignore errors</source> <target>Ignore errors</target> + <source>Hide all error and warning messages</source> <target>Hide all error and warning messages</target> + <source>Exit instantly</source> <target>Exit instantly</target> + <source>Abort synchronization immediately</source> <target>Abort synchronisation immediately</target> + +<source>Select alternate comparison settings</source> +<target>Select alternate comparison settings</target> + <source>Select alternate synchronization settings</source> <target>Select alternate synchronisation settings</target> + <source>No filter selected</source> <target>No filter selected</target> + <source>Filter is active</source> <target>Filter is active</target> -<source>Clear filter settings</source> -<target>Clear filter settings</target> + <source>Remove alternate settings</source> <target>Remove alternate settings</target> + +<source>Clear filter settings</source> +<target>Clear filter settings</target> + <source>Create a batch job</source> <target>Create a batch job</target> + <source>Synchronization settings</source> <target>Synchronisation settings</target> + <source>Comparison settings</source> <target>Comparison settings</target> + <source>About</source> <target>About</target> + <source>Error</source> <target>Error</target> + <source>Warning</source> <target>Warning</target> + <source>Question</source> <target>Question</target> + <source>Confirm</source> <target>Confirm</target> + <source>Configure filter</source> <target>Configure filter</target> + <source>Customize columns</source> <target>Customise columns</target> + <source>Global settings</source> <target>Global settings</target> + <source>Synchronization Preview</source> <target>Synchronisation Preview</target> + <source>Find</source> <target>Find</target> + +<source>Select time span</source> +<target>Select time span</target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -85,46 +126,64 @@ <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> </target> + <source><Symlink></source> <target><Symlink></target> + <source><Directory></source> <target><Directory></target> + <source>Size</source> <target>Size</target> + <source>Date</source> <target>Date</target> + <source>Full path</source> <target>Full path</target> + <source>Filename</source> <target>Filename</target> + <source>Relative path</source> <target>Relative path</target> + <source>Directory</source> <target>Directory</target> + <source>Extension</source> <target>Extension</target> + <source>Comparison Result</source> <target>Comparison Result</target> + <source>Incompatible synchronization database format:</source> <target>Incompatible synchronisation database format:</target> + <source>Initial synchronization:</source> <target>Initial synchronisation:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>One of the FreeFileSync database files is not yet existing:</target> + <source>Error reading from synchronization database:</source> <target>Error reading from synchronisation database:</target> + <source>Database files do not share a common synchronization session:</source> <target>Database files do not share a common synchronisation session:</target> + <source>An exception occurred!</source> <target>An exception occurred!</target> -<source>Error deleting file:</source> -<target>Error deleting file:</target> + <source>Error reading file attributes:</source> <target>Error reading file attributes:</target> + <source>Waiting while directory is locked (%x)...</source> <target>Waiting while directory is locked (%x)...</target> + <source>Error setting directory lock:</source> <target>Error setting directory lock:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -133,14 +192,19 @@ <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> </target> + <source>Info</source> <target>Info</target> + <source>Fatal Error</source> <target>Fatal Error</target> + <source>Scanning:</source> <target>Scanning:</target> + <source>Encoding extended time information: %x</source> <target>Encoding extended time information: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> @@ -149,14 +213,19 @@ <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </target> + <source>Invalid FreeFileSync config file!</source> <target>Invalid FreeFileSync config file!</target> + <source>File does not exist:</source> <target>File does not exist:</target> + <source>Error parsing configuration file:</source> <target>Error parsing configuration file:</target> + <source>/sec</source> <target>/sec</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -165,6 +234,7 @@ <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -173,6 +243,7 @@ <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -181,28 +252,40 @@ <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> </target> + <source>S&ave configuration...</source> <target>S&ave configuration...</target> + <source>&Load configuration...</source> <target>&Load configuration...</target> + <source>&Quit</source> <target>&Quit</target> + <source>&File</source> <target>&File</target> + <source>&Content</source> <target>&Content</target> + <source>&About...</source> <target>&About...</target> + <source>&Help</source> <target>&Help</target> + <source>Usage:</source> <target>Usage:</target> + <source>1. Select directories to monitor.</source> <target>1. Select directories to monitor.</target> + <source>2. Enter a command line.</source> <target>2. Enter a command line.</target> + <source>3. Press 'Start'.</source> <target>3. Press 'Start'.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -213,310 +296,461 @@ The command line is executed each time: - all directories become available (e.g. USB stick insert) - files within these directories or subdirectories are modified </target> + <source>Directories to watch</source> <target>Directories to watch</target> + <source>Add folder</source> <target>Add folder</target> + <source>Remove folder</source> <target>Remove folder</target> + <source>Select a folder</source> <target>Select a folder</target> + <source>Command line</source> <target>Command line</target> + <source>Minimum Idle Time [seconds]</source> <target>Minimum Idle Time [seconds]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>Idle time between detection of last change and execution of command line in seconds</target> + <source>Start</source> <target>Start</target> + <source>(Build: %x)</source> <target>(Build: %x)</target> + <source>RealtimeSync configuration</source> <target>RealtimeSync configuration</target> + <source>File already exists. Overwrite?</source> <target>File already exists. Overwrite?</target> + <source>&Restore</source> <target>&Restore</target> + <source>&Exit</source> <target>&Exit</target> + <source>Monitoring active...</source> <target>Monitoring active...</target> + <source>Waiting for missing directories...</source> <target>Waiting for missing directories...</target> + <source>A directory input field is empty.</source> <target>A directory input field is empty.</target> + <source>Drag && drop</source> <target>Drag && drop</target> + <source>Could not initialize directory monitoring:</source> <target>Could not initialise directory monitoring:</target> + <source>Error when monitoring directories.</source> <target>Error when monitoring directories.</target> + <source>Conversion error:</source> <target>Conversion error:</target> + +<source>Error deleting file:</source> +<target>Error deleting file:</target> + <source>Error moving file:</source> <target>Error moving file:</target> + <source>Target file already existing!</source> <target>Target file already existing!</target> + <source>Error moving directory:</source> <target>Error moving directory:</target> + <source>Target directory already existing!</source> <target>Target directory already existing!</target> + <source>Error deleting directory:</source> <target>Error deleting directory:</target> + <source>Error changing modification time:</source> <target>Error changing modification time:</target> + <source>Error loading library function:</source> <target>Error loading library function:</target> + <source>Error reading security context:</source> <target>Error reading security context:</target> + <source>Error writing security context:</source> <target>Error writing security context:</target> + <source>Error copying file permissions:</source> <target>Error copying file permissions:</target> + <source>Error creating directory:</source> <target>Error creating directory:</target> + <source>Error copying symbolic link:</source> <target>Error copying symbolic link:</target> + <source>Error copying file:</source> <target>Error copying file:</target> + <source>Error opening file:</source> <target>Error opening file:</target> + <source>Error writing file:</source> <target>Error writing file:</target> + <source>Error reading file:</source> <target>Error reading file:</target> + <source>Operation aborted!</source> <target>Operation aborted!</target> + <source>Endless loop when traversing directory:</source> <target>Endless loop when traversing directory:</target> + <source>Error traversing directory:</source> <target>Error traversing directory:</target> + <source>Windows Error Code %x:</source> <target>Windows Error Code %x:</target> + <source>Linux Error Code %x:</source> <target>Linux Error Code %x:</target> + <source>Error setting privilege:</source> <target>Error setting privilege:</target> + <source>Error moving to Recycle Bin:</source> <target>Error moving to Recycle Bin:</target> + <source>Could not load a required DLL:</source> <target>Could not load a required DLL:</target> + <source>Error writing to synchronization database:</source> <target>Error writing to synchronisation database:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>Error starting Volume Shadow Copy Service!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target>Error accessing Volume Shadow Copy Service!</target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</target> + <source>Could not determine volume name for file:</source> <target>Could not determine volume name for file:</target> + <source>Volume name %x not part of filename %y!</source> <target>Volume name %x not part of filename %y!</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>Could not read values for the following XML nodes:</target> + <source>Logging</source> <target>Logging</target> + <source>FreeFileSync batch file</source> <target>FreeFileSync batch file</target> + <source>FreeFileSync configuration</source> <target>FreeFileSync configuration</target> + <source>FreeFileSync Batch Job</source> <target>FreeFileSync Batch Job</target> + <source>Unable to create logfile!</source> <target>Unable to create logfile!</target> + <source>Batch execution</source> <target>Batch execution</target> + <source>Log-messages:</source> <target>Log-messages:</target> + <source>Stop</source> <target>Stop</target> + <source>Total time:</source> <target>Total time:</target> + <source>Synchronization aborted!</source> <target>Synchronisation aborted!</target> + <source>Synchronization completed with errors!</source> <target>Synchronisation completed with errors!</target> + <source>Synchronization completed successfully!</source> <target>Synchronisation completed successfully!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>Press "Switch" to open FreeFileSync GUI mode.</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>Switching to FreeFileSync GUI mode...</target> + <source>Unable to connect to sourceforge.net!</source> <target>Unable to connect to sourceforge.net!</target> + <source>A newer version of FreeFileSync is available:</source> <target>A newer version of FreeFileSync is available:</target> + <source>Download now?</source> <target>Download now?</target> + <source>Information</source> <target>Information</target> + <source>FreeFileSync is up to date!</source> <target>FreeFileSync is up to date!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>Do you want FreeFileSync to automatically check for updates every week?</target> + <source>(Requires an Internet connection!)</source> <target>(Requires an Internet connection!)</target> + <source>1. &Compare</source> <target>1. &Compare</target> + <source>2. &Synchronize...</source> <target>2. &Synchronise...</target> + <source>S&witch view</source> <target>S&witch view</target> + <source>&New</source> <target>&New</target> + <source>&Program</source> <target>&Program</target> + <source>&Language</source> <target>&Language</target> + <source>&Global settings...</source> <target>&Global settings...</target> + <source>&Create batch job...</source> <target>&Create batch job...</target> + <source>&Export file list...</source> <target>&Export file list...</target> + <source>&Advanced</source> <target>&Advanced</target> + <source>&Check for new version</source> <target>&Check for new version</target> + <source>Compare</source> <target>Compare</target> + <source>Compare both sides</source> <target>Compare both sides</target> + <source>&Abort</source> <target>&Abort</target> + <source>Synchronize...</source> <target>Synchronise...</target> + <source>Start synchronization</source> <target>Start synchronisation</target> -<source>Swap sides</source> -<target>Swap sides</target> + <source>Add folder pair</source> <target>Add folder pair</target> + <source>Remove folder pair</source> <target>Remove folder pair</target> + +<source>Swap sides</source> +<target>Swap sides</target> + <source>Save current configuration to file</source> <target>Save current configuration to file</target> + <source>Load configuration from file</source> <target>Load configuration from file</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>Last used configurations (press DEL to remove from list)</target> + <source>Hide excluded items</source> <target>Hide excluded items</target> + <source>Hide filtered or temporarily excluded files</source> <target>Hide filtered or temporarily excluded files</target> + <source>Number of files and directories that will be created</source> <target>Number of files and directories that will be created</target> + <source>Number of files that will be overwritten</source> <target>Number of files that will be overwritten</target> + <source>Number of files and directories that will be deleted</source> <target>Number of files and directories that will be deleted</target> + <source>Total amount of data that will be transferred</source> <target>Total amount of data that will be transferred</target> -<source>Left</source> -<target>Left</target> -<source>Right</source> -<target>Right</target> + <source>Batch job</source> <target>Batch job</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>Create a batch file for automated synchronisation. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target>Create a batch file for automated synchronisation. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</target> + <source>Help</source> <target>Help</target> + <source>Filter files</source> <target>Filter files</target> + <source>Error handling</source> <target>Error handling</target> + +<source>Left</source> +<target>Left</target> + +<source>Right</source> +<target>Right</target> + <source>Overview</source> <target>Overview</target> + <source>Status feedback</source> <target>Status feedback</target> + <source>Run minimized</source> <target>Run minimised</target> + <source>Maximum number of logfiles:</source> <target>Maximum number of logfiles:</target> + <source>Select logfile directory:</source> <target>Select logfile directory:</target> + <source>Batch settings</source> <target>Batch settings</target> + <source>&Save</source> <target>&Save</target> + <source>&Load</source> <target>&Load</target> + <source>&Cancel</source> <target>&Cancel</target> + <source>Elements found:</source> <target>Elements found:</target> + <source>Elements remaining:</source> <target>Elements remaining:</target> + <source>Speed:</source> <target>Speed:</target> + <source>Time remaining:</source> <target>Time remaining:</target> + <source>Time elapsed:</source> <target>Time elapsed:</target> + <source>Operation:</source> <target>Operation:</target> + <source>Select variant:</source> <target>Select variant:</target> + <source><Automatic></source> <target><Automatic></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</target> + <source>Mirror ->></source> <target>Mirror ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronisation.</target> + <source>Update -></source> <target>Update -></target> + <source>Copy new or updated files to right folder.</source> <target>Copy new or updated files to right folder.</target> + <source>Custom</source> <target>Custom</target> + <source>Configure your own synchronization rules.</source> <target>Configure your own synchronisation rules.</target> + <source>Deletion handling</source> <target>Deletion handling</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>Configuration</target> + <source>Category</source> <target>Category</target> + <source>Action</source> <target>Action</target> + <source>File/folder exists on left side only</source> <target>File/folder exists on left side only</target> + <source>File/folder exists on right side only</source> <target>File/folder exists on right side only</target> + <source>Left file is newer</source> <target>Left file is newer</target> + <source>Right file is newer</source> <target>Right file is newer</target> + <source>Files have different content</source> <target>Files have different content</target> + <source>Conflict/file cannot be categorized</source> <target>Conflict/file cannot be categorised</target> + <source>Compare by...</source> <target>Compare by...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> <target> Files are found equal if - - file size - last write time and date + - file size are the same </target> -<source>File size and date</source> -<target>File size and date</target> + +<source>File time and size</source> +<target>File time and size</target> + <source> Files are found equal if - file content @@ -527,92 +761,85 @@ Files are found equal if - file content is the same </target> + <source>File content</source> <target>File content</target> + <source>Symbolic Link handling</source> <target>Symbolic Link handling</target> + <source>Synchronizing...</source> <target>Synchronising...</target> + <source>Elements processed:</source> <target>Elements processed:</target> + <source>&Pause</source> <target>&Pause</target> -<source>Compare by "File size and date"</source> -<target>Compare by "File size and date"</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>When the comparison is started with this option set the following decision tree is processed:</target> -<source>As a result the files are separated into the following categories:</source> -<target>As a result the files are separated into the following categories:</target> -<source>- equal</source> -<target>- equal</target> -<source>- left newer</source> -<target>- left newer</target> -<source>- right newer</source> -<target>- right newer</target> -<source>- exists left only</source> -<target>- exists left only</target> -<source>- exists right only</source> -<target>- exists right only</target> -<source>- conflict (same date, different size)</source> -<target>- conflict (same date, different size)</target> -<source>Compare by "File content"</source> -<target>Compare by "File content"</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. - -With this option enabled the decision tree is smaller: -</source> -<target> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. -With this option enabled the decision tree is smaller: -</target> -<source>- different</source> -<target>- different</target> <source>Source code written in C++ utilizing:</source> <target>Source code written in C++ utilising:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>Big thanks for localising FreeFileSync goes out to:</target> + <source>Feedback and suggestions are welcome at:</source> <target>Feedback and suggestions are welcome at:</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync at Sourceforge</target> + <source>Homepage</source> <target>Homepage</target> + <source>If you like FFS</source> <target>If you like FFS</target> + <source>Donate with PayPal</source> <target>Donate with PayPal</target> + <source>Email</source> <target>E-mail</target> + <source>Report translation error</source> <target>Report translation error</target> + <source>Published under the GNU General Public License:</source> <target>Published under the GNU General Public Licence:</target> + <source>Ignore subsequent errors</source> <target>Ignore subsequent errors</target> + <source>Hide further error messages during the current process</source> <target>Hide further error messages during the current process</target> + <source>&Ignore</source> <target>&Ignore</target> + <source>&Retry</source> <target>&Retry</target> + <source>Do not show this dialog again</source> <target>Do not show this dialogue again</target> + <source>&Switch</source> <target>&Switch</target> + <source>&Yes</source> <target>&Yes</target> + <source>&No</source> <target>&No</target> + <source>Delete on both sides</source> <target>Delete on both sides</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>Delete on both sides even if the file is selected on one side only</target> + <source>Use Recycle Bin</source> <target>Use Recycle Bin</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -621,16 +848,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire Only files/directories that match all filter settings will be selected for synchronisation. Note: The name filter must be specified relative(!) to main synchronisation directories. </target> + <source>Hints:</source> <target>Hints:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. Enter relative file or directory names separated by ';' or a new line.</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. Use wildcard characters '*' and '?'.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. Exclude files directly on main grid via context menu.</target> + <source>Example</source> <target>Example</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -639,30 +872,40 @@ Exclude: \stuff\temp\* Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>Synchronise all .doc, .zip and .exe files except everything in subfolder "temp".</target> + <source>Include</source> <target>Include</target> + <source>Exclude</source> <target>Exclude</target> -<source>Select time span:</source> -<target>Select time span:</target> -<source>Minimum file size:</source> -<target>Minimum file size:</target> -<source>Maximum file size:</source> -<target>Maximum file size:</target> + +<source>Minimum file size</source> +<target>Minimum file size</target> + +<source>Maximum file size</source> +<target>Maximum file size</target> + <source>&Default</source> <target>&Default</target> + <source>Move column up</source> <target>Move column up</target> + <source>Move column down</source> <target>Move column down</target> -<source>Transactional File Copy</source> -<target></target> + +<source>Transactional file copy</source> +<target>Transactional file copy</target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> -<target></target> +<target>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</target> + <source>Copy locked files</source> <target>Copy locked files</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -671,8 +914,10 @@ Copy shared or locked files using Volume Shadow Copy Service Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) </target> -<source>Copy filesystem permissions</source> -<target>Copy filesystem permissions</target> + +<source>Copy file access permissions</source> +<target>Copy file access permissions</target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -681,138 +926,205 @@ Transfer file and directory permissions Transfer file and directory permissions (Requires Administrator rights) </target> + <source>Hidden dialogs:</source> <target>Hidden dialogues:</target> + <source>Reset</source> <target>Reset</target> + <source>Show hidden dialogs</source> <target>Show hidden dialogues</target> + <source>External applications</source> <target>External applications</target> + <source>Description</source> <target>Description</target> + <source>Variant</source> <target>Variant</target> + <source>Statistics</source> <target>Statistics</target> + <source>Find what:</source> <target>Find what:</target> + <source>Match case</source> <target>Match case</target> + <source>&Find next</source> <target>&Find next</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>You may try to synchronise remaining items again (WITHOUT having to re-compare)!</target> -<source>Batch file created successfully!</source> -<target>Batch file created successfully!</target> + <source>Main bar</source> <target>Main bar</target> + <source>Folder pairs</source> <target>Folder pairs</target> + <source>Select view</source> <target>Select view</target> + <source>Set direction:</source> <target>Set direction:</target> + <source>Exclude temporarily</source> <target>Exclude temporarily</target> + <source>Include temporarily</source> <target>Include temporarily</target> + <source>Exclude via filter:</source> <target>Exclude via filter:</target> + <source><multiple selection></source> <target><multiple selection></target> + <source>D-Click</source> <target>D-Click</target> + <source>Delete</source> <target>Delete</target> + <source>Customize...</source> <target>Customise...</target> + +<source>Select time span...</source> +<target>Select time span...</target> + <source>Auto-adjust columns</source> <target>Auto-adjust columns</target> + <source>Include all rows</source> <target>Include all rows</target> + <source>Exclude all rows</source> <target>Exclude all rows</target> + <source>Reset view</source> <target>Reset view</target> + <source>Show "%x"</source> <target>Show "%x"</target> + <source><Last session></source> <target><Last session></target> + <source>Configuration saved!</source> <target>Configuration saved!</target> + <source>Save changes to current configuration?</source> <target>Save changes to current configuration?</target> + <source>Configuration loaded!</source> <target>Configuration loaded!</target> + <source>Folder Comparison and Synchronization</source> <target>Folder Comparison and Synchronisation</target> + <source>Hide files that exist on left side only</source> <target>Hide files that exist on left side only</target> + <source>Show files that exist on left side only</source> <target>Show files that exist on left side only</target> + <source>Hide files that exist on right side only</source> <target>Hide files that exist on right side only</target> + <source>Show files that exist on right side only</source> <target>Show files that exist on right side only</target> + <source>Hide files that are newer on left</source> <target>Hide files that are newer on left</target> + <source>Show files that are newer on left</source> <target>Show files that are newer on left</target> + <source>Hide files that are newer on right</source> <target>Hide files that are newer on right</target> + <source>Show files that are newer on right</source> <target>Show files that are newer on right</target> + <source>Hide files that are equal</source> <target>Hide files that are equal</target> + <source>Show files that are equal</source> <target>Show files that are equal</target> + <source>Hide files that are different</source> <target>Hide files that are different</target> + <source>Show files that are different</source> <target>Show files that are different</target> + <source>Hide conflicts</source> <target>Hide conflicts</target> + <source>Show conflicts</source> <target>Show conflicts</target> + <source>Hide files that will be created on the left side</source> <target>Hide files that will be created on the left side</target> + <source>Show files that will be created on the left side</source> <target>Show files that will be created on the left side</target> + <source>Hide files that will be created on the right side</source> <target>Hide files that will be created on the right side</target> + <source>Show files that will be created on the right side</source> <target>Show files that will be created on the right side</target> + <source>Hide files that will be deleted on the left side</source> <target>Hide files that will be deleted on the left side</target> + <source>Show files that will be deleted on the left side</source> <target>Show files that will be deleted on the left side</target> + <source>Hide files that will be deleted on the right side</source> <target>Hide files that will be deleted on the right side</target> + <source>Show files that will be deleted on the right side</source> <target>Show files that will be deleted on the right side</target> + <source>Hide files that will be overwritten on left side</source> <target>Hide files that will be overwritten on left side</target> + <source>Show files that will be overwritten on left side</source> <target>Show files that will be overwritten on left side</target> + <source>Hide files that will be overwritten on right side</source> <target>Hide files that will be overwritten on right side</target> + <source>Show files that will be overwritten on right side</source> <target>Show files that will be overwritten on right side</target> + <source>Hide files that won't be copied</source> <target>Hide files that won't be copied</target> + <source>Show files that won't be copied</source> <target>Show files that won't be copied</target> + <source>All directories in sync!</source> <target>All directories in sync!</target> + <source>Please run a Compare first before synchronizing!</source> <target>Please run a Compare first before synchronising!</target> + <source>Comma separated list</source> <target>Comma separated list</target> + <source>Legend</source> <target>Legend</target> + <source>File list exported!</source> <target>File list exported!</target> + +<source>Batch file created successfully!</source> +<target>Batch file created successfully!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -821,6 +1133,7 @@ Transfer file and directory permissions <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -829,6 +1142,7 @@ Transfer file and directory permissions <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -837,6 +1151,7 @@ Transfer file and directory permissions <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -845,72 +1160,97 @@ Transfer file and directory permissions <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> </target> + <source>Scanning...</source> <target>Scanning...</target> + <source>Comparing content...</source> <target>Comparing content...</target> + <source>Paused</source> <target>Paused</target> + <source>Aborted</source> <target>Aborted</target> + <source>Completed</source> <target>Completed</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>Abort requested: Waiting for current operation to finish...</target> + <source>Continue</source> <target>Continue</target> + <source>Pause</source> <target>Pause</target> + <source>Cannot find %x</source> <target>Cannot find %x</target> -<source>DECISION TREE</source> -<target>DECISION TREE</target> -<source>file exists on both sides</source> -<target>file exists on both sides</target> -<source>on one side only</source> -<target>on one side only</target> -<source>same date</source> -<target>same date</target> -<source>different date</source> -<target>different date</target> + <source>Inactive</source> <target>Inactive</target> -<source>Second</source> -<target>Second</target> -<source>Minute</source> -<target>Minute</target> -<source>Hour</source> -<target>Hour</target> -<source>Day</source> -<target>Day</target> + +<source>Last x hours</source> +<target>Last x hours</target> + +<source>Today</source> +<target>Today</target> + +<source>This week</source> +<target>This week</target> + +<source>This month</source> +<target>This month</target> + +<source>This year</source> +<target>This year</target> + <source>Byte</source> <target>Byte</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>Filter: All pairs</target> + <source>Filter: Single pair</source> <target>Filter: Single pair</target> + <source>Ignore</source> <target>Ignore</target> + <source>Direct</source> <target>Direct</target> + <source>Follow</source> <target>Follow</target> + +<source>Copy NTFS permissions</source> +<target>Copy NTFS permissions</target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>Integrate external applications into context menu. The following macros are available:</target> + <source>- full file or directory name</source> <target>- full file or directory name</target> + <source>- directory part only</source> <target>- directory part only</target> + <source>- Other side's counterpart to %name</source> <target>- Other side's counterpart to %name</target> + <source>- Other side's counterpart to %dir</source> <target>- Other side's counterpart to %dir</target> + <source>Restore all hidden dialogs?</source> <target>Restore all hidden dialogs?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -919,6 +1259,7 @@ Transfer file and directory permissions <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -927,139 +1268,211 @@ Transfer file and directory permissions <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>Leave as unresolved conflict</target> + <source>Delete permanently</source> <target>Delete permanently</target> + <source>Delete or overwrite files permanently</source> <target>Delete or overwrite files permanently</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>Use Recycle Bin when deleting or overwriting files</target> + <source>Versioning</source> <target>Versioning</target> + <source>Move files into a time-stamped subdirectory</source> <target>Move files into a time-stamped subdirectory</target> -<source>Cannot determine sync-direction:</source> -<target>Cannot determine sync-direction:</target> -<source>Filter settings have changed!</source> -<target>Filter settings have changed!</target> + <source>Both sides have changed since last synchronization!</source> <target>Both sides have changed since last synchronisation!</target> + +<source>Cannot determine sync-direction:</source> +<target>Cannot determine sync-direction:</target> + <source>No change since last synchronization!</source> <target>No change since last synchronisation!</target> + +<source>Filter settings have changed!</source> +<target>Filter settings have changed!</target> + <source>The file was not processed by last synchronization!</source> <target>The file was not processed by last synchronisation!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>Planned directory deletion is in conflict with its subdirectories and -files!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Setting default synchronisation directions: Old files will be overwritten with newer files.</target> + <source>The file does not contain a valid configuration:</source> <target>The file does not contain a valid configuration:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>You can ignore this error to consider the directory as empty.</target> + <source>Directory does not exist:</source> <target>Directory does not exist:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Directories are dependent! Be careful when setting up synchronisation rules:</target> + <source>Comparing content of files %x</source> <target>Comparing content of files %x</target> + <source>Memory allocation failed!</source> <target>Memory allocation failed!</target> + <source>File %x has an invalid date!</source> <target>File %x has an invalid date!</target> + <source>Conflict detected:</source> <target>Conflict detected:</target> + <source>Files %x have the same date but a different size!</source> <target>Files %x have the same date but a different size!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>Symlinks %x have the same date but a different target!</target> + <source>Comparing files by content failed.</source> <target>Comparing files by content failed.</target> + <source>Generating file list...</source> <target>Generating file list...</target> + <source>Multiple...</source> <target>Multiple...</target> + <source>Both sides are equal</source> <target>Both sides are equal</target> + <source>Files/folders differ in attributes only</source> <target>Files/folders differ in attributes only</target> + <source>Copy new file/folder to left</source> <target>Copy new file/folder to left</target> + <source>Copy new file/folder to right</source> <target>Copy new file/folder to right</target> + <source>Delete left file/folder</source> <target>Delete left file/folder</target> + <source>Delete right file/folder</source> <target>Delete right file/folder</target> + <source>Overwrite left file/folder with right one</source> <target>Overwrite left file/folder with right one</target> + <source>Overwrite right file/folder with left one</source> <target>Overwrite right file/folder with left one</target> + <source>Do nothing</source> <target>Do nothing</target> + <source>Copy file attributes only to left</source> <target>Copy file attributes only to left</target> + <source>Copy file attributes only to right</source> <target>Copy file attributes only to right</target> + <source>Deleting file %x</source> <target>Deleting file %x</target> -<source>Deleting Symbolic Link %x</source> -<target>Deleting Symbolic Link %x</target> + <source>Deleting folder %x</source> <target>Deleting folder %x</target> -<source>Moving %x to Recycle Bin</source> -<target>Moving %x to Recycle Bin</target> -<source>Moving file %x to user-defined directory %y</source> -<target>Moving file %x to user-defined directory %y</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>Moving folder %x to user-defined directory %y</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>Moving Symbolic Link %x to user-defined directory %y</target> -<source>Copying new file %x to %y</source> -<target>Copying new file %x to %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>Copying new Symbolic Link %x to %y</target> -<source>Overwriting file %x in %y</source> -<target>Overwriting file %x in %y</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>Overwriting Symbolic Link %x in %y</target> + +<source>Deleting symbolic link %x</source> +<target>Deleting symbolic link %x</target> + +<source>Moving file %x to recycle bin</source> +<target>Moving file %x to recycle bin</target> + +<source>Moving folder %x to recycle bin</source> +<target>Moving folder %x to recycle bin</target> + +<source>Moving symbolic link %x to recycle bin</source> +<target>Moving symbolic link %x to recycle bin</target> + +<source>Moving file %x to %y</source> +<target>Moving file %x to %y</target> + +<source>Moving folder %x to %y</source> +<target>Moving folder %x to %y</target> + +<source>Moving symbolic link %x to %y</source> +<target>Moving symbolic link %x to %y</target> + +<source>Creating file %x</source> +<target>Creating file %x</target> + +<source>Creating symbolic link %x</source> +<target>Creating symbolic link %x</target> + <source>Creating folder %x</source> <target>Creating folder %x</target> + +<source>Overwriting file %x</source> +<target>Overwriting file %x</target> + +<source>Overwriting symbolic link %x</source> +<target>Overwriting symbolic link %x</target> + <source>Verifying file %x</source> <target>Verifying file %x</target> + <source>Updating attributes of %x</source> <target>Updating attributes of %x</target> -<source>Source directory does not exist anymore:</source> -<target>Source directory does not exist anymore:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>Nothing to synchronise according to configuration!</target> + <source>Target directory name must not be empty!</source> <target>Target directory name must not be empty!</target> + <source>User-defined directory for deletion was not specified!</source> <target>User-defined directory for deletion was not specified!</target> + +<source>Source directory does not exist anymore:</source> +<target>Source directory does not exist anymore:</target> + <source>Unresolved conflicts existing!</source> <target>Unresolved conflicts existing!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>You can ignore conflicts and continue synchronisation.</target> + <source>Significant difference detected:</source> <target>Significant difference detected:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>More than 50% of the total number of files will be copied or deleted!</target> + <source>Not enough free disk space available in:</source> <target>Not enough free disk space available in:</target> + <source>Free disk space required:</source> <target>Free disk space required:</target> + <source>Free disk space available:</source> <target>Free disk space available:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> <target>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>A directory will be modified which is part of multiple folder pairs! Please review synchronisation settings!</target> + <source>Processing folder pair:</source> <target>Processing folder pair:</target> + <source>Generating database...</source> <target>Generating database...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>Nothing to synchronise according to configuration!</target> + <source>Error copying locked file %x!</source> <target>Error copying locked file %x!</target> + <source>Data verification error: Source and target file have different content!</source> <target>Data verification error: Source and target file have different content!</target> + diff --git a/BUILD/Languages/finnish.lng b/BUILD/Languages/finnish.lng index 1a704371..698bef7a 100644 --- a/BUILD/Languages/finnish.lng +++ b/BUILD/Languages/finnish.lng @@ -9,74 +9,115 @@ <source>Searching for directory %x...</source> <target></target> + <source>Show in Explorer</source> <target>Näytä Explorerissa</target> + <source>Open with default application</source> <target>Avaa oletus sovelluksessa</target> + <source>Browse directory</source> <target>Selaa hakemistoa</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Automaattinen täsmäytys</target> + <source>Browse</source> <target>Selaa</target> -<source>Invalid commandline: %x</source> -<target>Virheellinen komento: %x</target> + +<source>Invalid command line: %x</source> +<target></target> + <source>Error resolving symbolic link:</source> <target>Virhe selvittäessä symbolista linkkiä:</target> -<source>Show popup</source> -<target>Näytä Popup</target> -<source>Show popup on errors or warnings</source> -<target>Näytä virheet ja varoitukset Popupissa</target> + +<source>Show pop-up</source> +<target></target> + +<source>Show pop-up on errors or warnings</source> +<target></target> + <source>Ignore errors</source> <target>Älä huomioi virheitä</target> + <source>Hide all error and warning messages</source> <target>Piilota kaikki virhe- ja varoitusviestit</target> + <source>Exit instantly</source> <target>Poistu välittömästi</target> + <source>Abort synchronization immediately</source> <target>Lopeta täsmäytys välittömästi</target> + +<source>Select alternate comparison settings</source> +<target></target> + <source>Select alternate synchronization settings</source> <target>Valitse toiset asetukset täsmäytykselles</target> + <source>No filter selected</source> <target>Suodin valitsematta</target> + <source>Filter is active</source> <target>Suodin aktivoitu</target> -<source>Clear filter settings</source> -<target>Nollaa suodin</target> + <source>Remove alternate settings</source> <target>Poista toinen asetus</target> + +<source>Clear filter settings</source> +<target>Nollaa suodin</target> + <source>Create a batch job</source> <target>Eräajon luonti</target> + <source>Synchronization settings</source> <target>Täsmäytyksen asetukset</target> + <source>Comparison settings</source> <target>Vertailun asetukset</target> + <source>About</source> <target>Ohje</target> + <source>Error</source> <target>Virhe</target> + <source>Warning</source> <target>Varoitus</target> + <source>Question</source> <target>Kysymys</target> + <source>Confirm</source> <target>Vahvista</target> + <source>Configure filter</source> <target>Määritä suodin</target> + <source>Customize columns</source> <target>Sovita sarake</target> + <source>Global settings</source> <target>Yleiset asetukset</target> + <source>Synchronization Preview</source> <target>Täsmäytyksen esikatselu</target> + <source>Find</source> <target>Etsi</target> + +<source>Select time span</source> +<target></target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -85,46 +126,64 @@ <pluralform>1 tavu</pluralform> <pluralform>%x tavua</pluralform> </target> + <source><Symlink></source> <target><Pikakuvake></target> + <source><Directory></source> <target><Hakemisto></target> + <source>Size</source> <target>Koko</target> + <source>Date</source> <target>Päiväys</target> + <source>Full path</source> <target>Koko polku</target> + <source>Filename</source> <target>Tiedostonimi</target> + <source>Relative path</source> <target>Suhteellinen polku</target> + <source>Directory</source> <target>Hakemisto</target> + <source>Extension</source> <target>Laajennus</target> + <source>Comparison Result</source> <target>Vertailun tulos</target> + <source>Incompatible synchronization database format:</source> <target>Täsmäytyksen tietokannan muoto on virheellinen:</target> + <source>Initial synchronization:</source> <target>Ensi täsmäytys:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>Jokin FreeFileSynk tietokannan tiedostoista puuttuu vielä:</target> + <source>Error reading from synchronization database:</source> <target>Virhe lukiessa täsmäytyksen tietokantaa:</target> + <source>Database files do not share a common synchronization session:</source> <target></target> + <source>An exception occurred!</source> <target>Virhe havaittu!</target> -<source>Error deleting file:</source> -<target>Virhe poistettaessa tiedostoa:</target> + <source>Error reading file attributes:</source> <target>Virhe lukiessa tiedoston ominaisuuksia:</target> + <source>Waiting while directory is locked (%x)...</source> <target>Odotan hakemiston lukitusta (%x)...</target> + <source>Error setting directory lock:</source> <target>Virhe asettaessa hakemiston lukkoa:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -133,27 +192,37 @@ <pluralform>1 s</pluralform> <pluralform>%x s</pluralform> </target> + <source>Info</source> <target>Info</target> + <source>Fatal Error</source> <target>Kohtalokas virhe</target> + <source>Scanning:</source> <target>Haen:</target> + <source>Encoding extended time information: %x</source> <target>Tulkitaan laajennettua aikatietoa: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> <target></target> + <source>Invalid FreeFileSync config file!</source> <target>Virheellinen FreeFileSync asetustiedosto!</target> + <source>File does not exist:</source> <target>Tiedosto puuttuu:</target> + <source>Error parsing configuration file:</source> <target>Virhe jäsentäessä asetustiedostoa:</target> + <source>/sec</source> <target>/s</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -162,6 +231,7 @@ <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -170,6 +240,7 @@ <pluralform>1 tunti</pluralform> <pluralform>%x tuntia</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -178,28 +249,40 @@ <pluralform>1 päivä</pluralform> <pluralform>%x päivää</pluralform> </target> + <source>S&ave configuration...</source> <target>Asetukset t&allennetaan...</target> + <source>&Load configuration...</source> <target>Asetusten &lataus...</target> + <source>&Quit</source> <target>&Lopeta</target> + <source>&File</source> <target>&Tiedosto</target> + <source>&Content</source> <target>&Sisältö</target> + <source>&About...</source> <target>&Ohje...</target> + <source>&Help</source> <target>&Ohje</target> + <source>Usage:</source> <target>Käyttö:</target> + <source>1. Select directories to monitor.</source> <target>1. Valitse seurattavat hakemistot</target> + <source>2. Enter a command line.</source> <target>2. Anna komentokehoite</target> + <source>3. Press 'Start'.</source> <target>3. Paina 'Käynnistä'.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -210,310 +293,456 @@ Komento suoritetaan kun: - nämä hakemistot ovat saatavilla (esim. USB tikku asennetaan) - tiedostot näissä hakemistoissa tai alihakemistoissa muutetaan </target> + <source>Directories to watch</source> <target>Tarkkailtavat hakemistot</target> + <source>Add folder</source> <target>Lisää hakemisto</target> + <source>Remove folder</source> <target>Poista hakemisto</target> + <source>Select a folder</source> <target>Valitse hakemisto</target> + <source>Command line</source> <target>Komentokehote</target> + <source>Minimum Idle Time [seconds]</source> <target>Minimi joutoaika [sekunttia]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>Joutoaika viimeisen muutos havainnon ja käskyn suorittamisen välillä, sekunneissa</target> + <source>Start</source> <target>Käynnistä</target> + <source>(Build: %x)</source> <target>(Versio: %x)</target> + <source>RealtimeSync configuration</source> <target>RealtimeSync Asetukset</target> + <source>File already exists. Overwrite?</source> <target>Tiedosto on jo olemassa. Ylikirjoitetaanko?</target> + <source>&Restore</source> <target>&Palauta</target> + <source>&Exit</source> <target>&Poistu</target> + <source>Monitoring active...</source> <target>Seuranta käynnissä...</target> + <source>Waiting for missing directories...</source> <target>Odottaa puuttuvia hakemistoja...</target> + <source>A directory input field is empty.</source> <target>Hekemistokenttä on tyhjä.</target> + <source>Drag && drop</source> <target>Vedä ja pudota</target> + <source>Could not initialize directory monitoring:</source> <target>Hakemiston tarkkailua ei voitu käynnistää:</target> + <source>Error when monitoring directories.</source> <target>Virhe seuratessa hakemistoa.</target> + <source>Conversion error:</source> <target>Konversio virhe:</target> + +<source>Error deleting file:</source> +<target>Virhe poistettaessa tiedostoa:</target> + <source>Error moving file:</source> <target>Virhe siirtäessä tiedostoa:</target> + <source>Target file already existing!</source> <target>Kohde tiedosto on jo olemassa!</target> + <source>Error moving directory:</source> <target>Virhe siirtäessä hakemistoa:</target> + <source>Target directory already existing!</source> <target>Haluttu tiedosto on jo olemassa!</target> + <source>Error deleting directory:</source> <target>Virhe poistettaessa hakemistoa:</target> + <source>Error changing modification time:</source> <target>Virhe muuttaessa tiedoston aikaa:</target> + <source>Error loading library function:</source> <target>Virhe ladattaessa kirjastotoimintoa:</target> + <source>Error reading security context:</source> <target>Virhe lukiessa tuvatietoja:</target> + <source>Error writing security context:</source> <target>Virhe kirjottaessa turvatietoja:</target> + <source>Error copying file permissions:</source> <target>Virhe kopioitaessa tiedoston oikeuksia:</target> + <source>Error creating directory:</source> <target>Virhe hakemistoa luotassa:</target> + <source>Error copying symbolic link:</source> <target>Symbolisen linkin kopiointi epäonnistui:</target> + <source>Error copying file:</source> <target>Virhe kopioitaessa tiedostoa:</target> + <source>Error opening file:</source> <target>Virhe avatessa tiedostoa:</target> + <source>Error writing file:</source> <target>Virhe kirjottaessa tiedostoa:</target> + <source>Error reading file:</source> <target>Virhe lukiessa tiedostoa:</target> + <source>Operation aborted!</source> <target>Toiminto lopetettiin!</target> + <source>Endless loop when traversing directory:</source> <target>Suorita hakemiston läpikulku jatkuvana:</target> + <source>Error traversing directory:</source> <target>Virhe hakemistoa läpikäydessä:</target> + <source>Windows Error Code %x:</source> <target>Windows virhekoodi %x:</target> + <source>Linux Error Code %x:</source> <target>Linux virhekoodi %x:</target> + <source>Error setting privilege:</source> <target>Virte oikeuksia asettaessa:</target> + <source>Error moving to Recycle Bin:</source> <target>Virhe siirtäessä Roskakoriin:</target> + <source>Could not load a required DLL:</source> <target>Tarvittu DLL ei lataudu:</target> + <source>Error writing to synchronization database:</source> <target>Virhe kirjottaessa täsmäytyksen tietokantaa:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>Virhe käynnistäessä Volume Shadow Copy Service!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target></target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>WOW64 varjokopiointia ei tueta. Käytä FreeFileSync 64-bittistä versiota.</target> + <source>Could not determine volume name for file:</source> <target>Levyasemaa ei tunnistettu tiedostolle:</target> + <source>Volume name %x not part of filename %y!</source> <target>Osan nimi %x ei esiinny tiedostonimessä %y!</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>Tietoja lukeminen epäonnistui, XML jäsen:</target> + <source>Logging</source> <target>Kirjaa</target> + <source>FreeFileSync batch file</source> <target>FreeFileSync eräajotiedosto</target> + <source>FreeFileSync configuration</source> <target>FreeFileSync asetukset</target> + <source>FreeFileSync Batch Job</source> <target>FreeFileSync Eräajo</target> + <source>Unable to create logfile!</source> <target>Lokitiedostoa ei pystytä luomaan!</target> + <source>Batch execution</source> <target>Eräajon suoritus</target> + <source>Log-messages:</source> <target>Lokin viestit:</target> + <source>Stop</source> <target>Seis</target> + <source>Total time:</source> <target>Kokonaisaika:</target> + <source>Synchronization aborted!</source> <target>Täsmäytys lopetettiin!</target> + <source>Synchronization completed with errors!</source> <target>Täsmäytys päättyi virheisiin!</target> + <source>Synchronization completed successfully!</source> <target>Täsmäytys suoritettu onnistuneesti!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>Paina "Vaihda" Avaa FreeFileSync GUI toimintoa.</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>Siirtyminen FreeFileSync GUI toimintoon...</target> + <source>Unable to connect to sourceforge.net!</source> <target>Kytkeytyminen ei onnistu kohteeseen sourceforge.net!</target> + <source>A newer version of FreeFileSync is available:</source> <target>FreeFileSync:n uusi versio on saatavilla:</target> + <source>Download now?</source> <target>Lataa nyt?</target> + <source>Information</source> <target>Tietoja</target> + <source>FreeFileSync is up to date!</source> <target>FreeFileSync on ajan tasalla!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>Haluatko että FreeFileSync hakee päivityksiä automaattisesti viikoittain?</target> + <source>(Requires an Internet connection!)</source> <target>(Vaatii Internet-yhteyden!)</target> + <source>1. &Compare</source> <target>1. &Vertaa</target> + <source>2. &Synchronize...</source> <target>2. &Täsmäytä...</target> + <source>S&witch view</source> <target>Vaihda &näkymää</target> + <source>&New</source> <target>&Uusi</target> + <source>&Program</source> <target>&Ohjelma</target> + <source>&Language</source> <target>&Kieli</target> + <source>&Global settings...</source> <target>&Yleiset asetukset...</target> + <source>&Create batch job...</source> <target>&Luo eräajo...</target> + <source>&Export file list...</source> <target>&Vie tiedostojoukko...</target> + <source>&Advanced</source> <target>&Laajennettu</target> + <source>&Check for new version</source> <target>Etsi &uusi versio</target> + <source>Compare</source> <target>Vertaile</target> + <source>Compare both sides</source> <target>Vertaile puolet keskenään</target> + <source>&Abort</source> <target>&Lopeta</target> + <source>Synchronize...</source> <target>Täsmäytä...</target> + <source>Start synchronization</source> <target>Käynnistä täsmäytys</target> -<source>Swap sides</source> -<target>Puolten vaihto</target> + <source>Add folder pair</source> <target>Lisää hakemistopari</target> + <source>Remove folder pair</source> <target>Poista hakemistopari</target> + +<source>Swap sides</source> +<target>Puolten vaihto</target> + <source>Save current configuration to file</source> <target>Tallenna nämä asetukset tiedostoon</target> + <source>Load configuration from file</source> <target>Lataa asetuksia tiedostosta</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>Viimeksi käytetty asetus (poista listalta paina DEL)</target> + <source>Hide excluded items</source> <target>Piilota suodatetut</target> + <source>Hide filtered or temporarily excluded files</source> <target>Piilota suodatetut ja tilapäisesti poistetut</target> + <source>Number of files and directories that will be created</source> <target>Kirjataan tiedostojen ja hakemistojen lukumäärää</target> + <source>Number of files that will be overwritten</source> <target>Ylikirjoitettavien tiedostojen ja hakemistojen lukumäärä</target> + <source>Number of files and directories that will be deleted</source> <target>Poistetaan tiedostojen ja hakemistojen lukumäärää</target> + <source>Total amount of data that will be transferred</source> <target>Siirrettävän datan määrä</target> -<source>Left</source> -<target>Vasen</target> -<source>Right</source> -<target>Oikea</target> + <source>Batch job</source> <target>Eräajo</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>Luo automaattisen täsmäytyksen eräajotiedosto. Käynnistä se kaksois klikillä tai komennolla: FreeFileSync.exe <eräajotiedosto>. Käyttöjärjestelmän tehtävien ajoitustoiminnolla voit ajastaa suorittaminen.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target></target> + <source>Help</source> <target>Ohje</target> + <source>Filter files</source> <target>Suodata tiedostoja</target> + <source>Error handling</source> <target>Virhe käsitellessä</target> + +<source>Left</source> +<target>Vasen</target> + +<source>Right</source> +<target>Oikea</target> + <source>Overview</source> <target>Yleiskatsaus</target> + <source>Status feedback</source> <target>Tilan palaute</target> + <source>Run minimized</source> <target></target> + <source>Maximum number of logfiles:</source> <target>Lokitiedostojen enimmäismäärä:</target> + <source>Select logfile directory:</source> <target>Hakemisto lokitiedostoille:</target> + <source>Batch settings</source> <target></target> + <source>&Save</source> <target>&Tallenna</target> + <source>&Load</source> <target>&Lataa</target> + <source>&Cancel</source> <target>&Lopeta</target> + <source>Elements found:</source> <target>Osia löytyi:</target> + <source>Elements remaining:</source> <target>Osia jäljellä:</target> + <source>Speed:</source> <target>Nopeus:</target> + <source>Time remaining:</source> <target>Aikaa jäljellä:</target> + <source>Time elapsed:</source> <target>Kulunut aika:</target> + <source>Operation:</source> <target>Toiminto:</target> + <source>Select variant:</source> <target>Valitse vaihtoehto:</target> + <source><Automatic></source> <target><- Automaattinen -></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>Tunnista ja monista muutokset molemmilla puolilla tietokannalla. Poistot ja ristiriidat hoidetaan automaattisesti.</target> + <source>Mirror ->></source> <target>Peilaava ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Peilaava varmuuskopio. Oikeanpuoleinen hakemisto muutetaan täsmäytyksessä vastaamaan tarkasti vasenta.</target> + <source>Update -></source> <target>Päivittävä -></target> + <source>Copy new or updated files to right folder.</source> <target>Kopioidaan uudet tai muuttuneet tiedostot oikeaan hakemistoon.</target> + <source>Custom</source> <target>Oma määritelmä</target> + <source>Configure your own synchronization rules.</source> <target>Määrittele oma täsmäytyssääntö.</target> + <source>Deletion handling</source> <target>Poistotapa</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>Asetukset</target> + <source>Category</source> <target>Luokka</target> + <source>Action</source> <target>Suorita</target> + <source>File/folder exists on left side only</source> <target>Tiedosto/hakemisto löytyy vain vasemmalta</target> + <source>File/folder exists on right side only</source> <target>Tiedosto/hakemisto löytyy vain vasemmalta</target> + <source>Left file is newer</source> <target>Tiedosto vasemmalla on uudempi</target> + <source>Right file is newer</source> <target>Tiedosto oikealla on uudempi</target> + <source>Files have different content</source> <target>Tiedostojen sisältö on eri</target> + <source>Conflict/file cannot be categorized</source> <target>Poikeaman/tiedoston luokittelu ei onnistu</target> + <source>Compare by...</source> <target>Vertaile...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> -<target> -Tiedosto samat jos, - - koko - - viimeinen tallennusaika -on sama -</target> -<source>File size and date</source> -<target>Tiedoston koko ja päiväys</target> +<target></target> + +<source>File time and size</source> +<target></target> + <source> Files are found equal if - file content @@ -524,92 +753,85 @@ Tiedostot samat jos, - tiedoston sisältö on sama </target> + <source>File content</source> <target>Tiedoston sisältö</target> + <source>Symbolic Link handling</source> <target>Pikakuvakkeiden hallinta</target> + <source>Synchronizing...</source> <target>Täsmäytetään...</target> + <source>Elements processed:</source> <target>Osia käsitelty:</target> + <source>&Pause</source> <target>&Keskeytä</target> -<source>Compare by "File size and date"</source> -<target>Vertaa: "tiedoston koko ja -päiväys"</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>Tämä vaihtoehto todentaan kaksi samannimistä tiedostoa samaksi, jos koko JA viimeinen tallennusaika on sama.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>Käynnistäessä täsmäytystä näillä asetuksilla ottaa käyttöön tämä päätöspuu:</target> -<source>As a result the files are separated into the following categories:</source> -<target>Tiedoston on avattu seuraaviin luokkiin:</target> -<source>- equal</source> -<target>- yhtenevät</target> -<source>- left newer</source> -<target>- uudempi vasemmalla</target> -<source>- right newer</source> -<target>- uudempi oikealla</target> -<source>- exists left only</source> -<target>- olemassa vain vasemmalla</target> -<source>- exists right only</source> -<target>- olemassa vain oikealla</target> -<source>- conflict (same date, different size)</source> -<target>- eroavuus (sama päivämäärä, eri koko)</target> -<source>Compare by "File content"</source> -<target>Vertaa: "tietosisältöä"</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. - -With this option enabled the decision tree is smaller: -</source> -<target> -Nimensä mukaisesti, tiedostot joilla on sama nimi, merkitään samoiksi vain jos niiden sisältö täsmää. Ominaisuus soveltuu paremmin yhdenpitävyyden tarkistukseen kuin varmistukseen. Siksi tiedostojen aikaleimaa ohitetaan. -Päätöksentekopuu on tästä syystä pienempi: -</target> -<source>- different</source> -<target>- erilainen</target> <source>Source code written in C++ utilizing:</source> <target>Koodikieli on C++ käyttäen:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>Suuret kiitokset FreeFileSync:n kääntämisestä:</target> + <source>Feedback and suggestions are welcome at:</source> <target>Palaute ja ehdotukset saa lähettää:</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync Sourceforge:lla</target> + <source>Homepage</source> <target>Kotisivu</target> + <source>If you like FFS</source> <target>Jos pidät FFS:tä</target> + <source>Donate with PayPal</source> <target>Lahjoita PayPal:lla</target> + <source>Email</source> <target>S-posti</target> + <source>Report translation error</source> <target>Ilmoita käännösvirheestä</target> + <source>Published under the GNU General Public License:</source> <target>Julkaistu lisenssillä GNU General Public License:</target> + <source>Ignore subsequent errors</source> <target>Jätä toistuvia virheitä huomiotta</target> + <source>Hide further error messages during the current process</source> <target>Piilota toistuvat virheet tässä suorituksessa</target> + <source>&Ignore</source> <target>&Unohda</target> + <source>&Retry</source> <target>&Uudestaan</target> + <source>Do not show this dialog again</source> <target>Älä näytä tätä jatkossa</target> + <source>&Switch</source> <target>&Vaihda</target> + <source>&Yes</source> <target>&Kyllä</target> + <source>&No</source> <target>&Ei</target> + <source>Delete on both sides</source> <target>Poista molemmilta puolilta</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>Poista molemmilta puolilta vaikka tiedosto valittu vain toisella puolella</target> + <source>Use Recycle Bin</source> <target>Käytä Roskakoria</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -618,16 +840,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire Täsmäytykseen valitaan vain ne tiedostot/hakemistot jotka täyttävät kaikkia kriteerejä. HUOM: Nimetty suodin on oltava määritelty relatiivisesti(!) päähakemistoon nähden. </target> + <source>Hints:</source> <target>Vihje:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. Anna tiedostojen tai hakemistojen suhteelliset nimet eroteltuina ';' tai rivivaihto</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. Käytä jokerimerkkejä '*' ja '?' .</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. Sulje tiedostoja pois suoraan pääikkunassa viitehakemiston avulla.</target> + <source>Example</source> <target>Esimerkki</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -636,30 +864,40 @@ Exclude: \stuff\temp\* Sisällytä : *.doc;*.zip;*.exe Sulje pois: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>Täsmäytä kaikki .doc, .zip und .exe tiedostot paitsi hakemistossa "temp" olevat.</target> + <source>Include</source> <target>Sisällytä</target> + <source>Exclude</source> <target>Sulje pois</target> -<source>Select time span:</source> -<target>Valitse aikajana:</target> -<source>Minimum file size:</source> -<target>Tiedoston pienin koko:</target> -<source>Maximum file size:</source> -<target>Tiedoston suurin koko:</target> + +<source>Minimum file size</source> +<target></target> + +<source>Maximum file size</source> +<target></target> + <source>&Default</source> <target>&Vakio</target> + <source>Move column up</source> <target>Siirrä sarake ylös</target> + <source>Move column down</source> <target>Siirrä sarake alas</target> -<source>Transactional File Copy</source> + +<source>Transactional file copy</source> <target></target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> <target></target> + <source>Copy locked files</source> <target>Kopioi lukitut tiedostot</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -668,8 +906,10 @@ Copy shared or locked files using Volume Shadow Copy Service Kopioi jaetut/lukitut tiedostot Volume Shadow Copy prosessilla (Vaatii Järjestelmävalvojan oikeuksia) </target> -<source>Copy filesystem permissions</source> -<target>Monista tiedosto-oikeudet</target> + +<source>Copy file access permissions</source> +<target></target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -678,138 +918,205 @@ Transfer file and directory permissions Siirrä tiedosto- ja hekimisto-oikeuksia (Vaatii Järjestelmävalvojan oikeuksia) </target> + <source>Hidden dialogs:</source> <target>Piiloitetut ikkunat:</target> + <source>Reset</source> <target>Palauta</target> + <source>Show hidden dialogs</source> <target>Näytä piiloitetut ikkunat</target> + <source>External applications</source> <target>Ulkopuolinen sovellus</target> + <source>Description</source> <target>Seloste</target> + <source>Variant</source> <target>Vaihtoehto</target> + <source>Statistics</source> <target>Tilastot</target> + <source>Find what:</source> <target>Etsi:</target> + <source>Match case</source> <target>Täsmää kirjainkoko</target> + <source>&Find next</source> <target>&Esi seuraava</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>Yritä täsmäytystä lopuille uudestaan (ILMAN uutta vertailua)!</target> -<source>Batch file created successfully!</source> -<target>Eräajotiedoston luonti onnistui!</target> + <source>Main bar</source> <target>Päävalikko</target> + <source>Folder pairs</source> <target>Hakemistoparit</target> + <source>Select view</source> <target>Valitse näkymä</target> + <source>Set direction:</source> <target>Aseta suunta:</target> + <source>Exclude temporarily</source> <target>Sulje pois, tilapäisesti</target> + <source>Include temporarily</source> <target>Sisällytä tilapäisesti</target> + <source>Exclude via filter:</source> <target>Sulje pois suotimella:</target> + <source><multiple selection></source> <target><monivalinta></target> + <source>D-Click</source> <target>2*Klikkaa</target> + <source>Delete</source> <target>Poista</target> + <source>Customize...</source> <target>Sovita...</target> + +<source>Select time span...</source> +<target></target> + <source>Auto-adjust columns</source> <target>Säädä sarakeleveys automaattisesti</target> + <source>Include all rows</source> <target>Sisällytä kaikki rivit</target> + <source>Exclude all rows</source> <target>Sulje pois, kaikki rivit</target> + <source>Reset view</source> <target>Palauta näkymä</target> + <source>Show "%x"</source> <target>Näytä "%x"</target> + <source><Last session></source> <target><Edellinen istunto></target> + <source>Configuration saved!</source> <target>Asetukset tallennettu!</target> + <source>Save changes to current configuration?</source> <target>Tallenna asetuksiin tehdyt muutokset?</target> + <source>Configuration loaded!</source> <target>Asetukset ladattu!</target> + <source>Folder Comparison and Synchronization</source> <target>Hakemistojen vertailu ja täsmäytys</target> + <source>Hide files that exist on left side only</source> <target>Piilota vain vasemmalla olevat tiedostot</target> + <source>Show files that exist on left side only</source> <target>Näytä vain vasemmalla esiintyvät tiedostot</target> + <source>Hide files that exist on right side only</source> <target>Piilota vain oikealla olevat tiedostot</target> + <source>Show files that exist on right side only</source> <target>Näytä vain oikealla esiintyvät tiedostot</target> + <source>Hide files that are newer on left</source> <target>Piilota vasemalla olevat uudemmat tiedostot</target> + <source>Show files that are newer on left</source> <target>Näytä vasemmalla olevat uudemmat tiedostot</target> + <source>Hide files that are newer on right</source> <target>Piilota oikealla olevat uudemmat tiedostot</target> + <source>Show files that are newer on right</source> <target>Näytä uudemmat tiedostot oikealla</target> + <source>Hide files that are equal</source> <target>Piilota yhteneväiset tiedostot</target> + <source>Show files that are equal</source> <target>Näytä yhtenevät tiedostot</target> + <source>Hide files that are different</source> <target>Piilota erilaiset tiedostot</target> + <source>Show files that are different</source> <target>Näytä poikkeavat tiedostot</target> + <source>Hide conflicts</source> <target>Piilota ristiriidat</target> + <source>Show conflicts</source> <target>Näytä ristiriidat</target> + <source>Hide files that will be created on the left side</source> <target>Piilota tiedostot jotka luodaan vasemmalle</target> + <source>Show files that will be created on the left side</source> <target>Näytä vasemmalle luotavat tiedostot</target> + <source>Hide files that will be created on the right side</source> <target>Piilota tiedostot jotka luodaan oikealla</target> + <source>Show files that will be created on the right side</source> <target>Näytä oikealle luotavat tiedostot</target> + <source>Hide files that will be deleted on the left side</source> <target>Piilota tiedostot jotka poistetaan vasemmalta</target> + <source>Show files that will be deleted on the left side</source> <target>Näytä vasemmallta poistettavat tiedostot</target> + <source>Hide files that will be deleted on the right side</source> <target>Piilota tiedostot jotka poistetaan oikealta</target> + <source>Show files that will be deleted on the right side</source> <target>Näytä oikealta poistettavat tiedostot</target> + <source>Hide files that will be overwritten on left side</source> <target>Piilota tiedostot jotka ylikirjoitetaan vasemmalla</target> + <source>Show files that will be overwritten on left side</source> <target>Näytä vasemmalla ylikirjoitettavat tiedostot</target> + <source>Hide files that will be overwritten on right side</source> <target>Piilota tiedostot jotka ylikirjoitetaan oikealla</target> + <source>Show files that will be overwritten on right side</source> <target>Näytä oikealla ylikirjoitettavat tiedostot</target> + <source>Hide files that won't be copied</source> <target>Piilota tiedostot jotka eivät kopioida</target> + <source>Show files that won't be copied</source> <target>Näytä kopioimatta jäävät tiedostot</target> + <source>All directories in sync!</source> <target>Kaikki hakemistot täsmäävät!</target> + <source>Please run a Compare first before synchronizing!</source> <target>Aja tarkistus ennen täsmäytystä.</target> + <source>Comma separated list</source> <target>CSV-muotoinen lista</target> + <source>Legend</source> <target>Selite</target> + <source>File list exported!</source> <target>Tiedosto lista viety!</target> + +<source>Batch file created successfully!</source> +<target>Eräajotiedoston luonti onnistui!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -818,6 +1125,7 @@ Siirrä tiedosto- ja hekimisto-oikeuksia <pluralform>Kohde poistettu onnistuneesti!</pluralform> <pluralform>%x kohdetta poistettu onnistuneesti!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -826,6 +1134,7 @@ Siirrä tiedosto- ja hekimisto-oikeuksia <pluralform>1 hakemisto</pluralform> <pluralform>%x hakemistoja</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -834,6 +1143,7 @@ Siirrä tiedosto- ja hekimisto-oikeuksia <pluralform>1 tiedosto</pluralform> <pluralform>%x tiedostoja</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -842,72 +1152,97 @@ Siirrä tiedosto- ja hekimisto-oikeuksia <pluralform>%x / 1:stä rivistä näytössä</pluralform> <pluralform>%x / %y:tä rivistä näytössä</pluralform> </target> + <source>Scanning...</source> <target>Haen tiedostoja...</target> + <source>Comparing content...</source> <target>Tietosisällön vertailu...</target> + <source>Paused</source> <target>Pysäytetty</target> + <source>Aborted</source> <target>Lopetettu</target> + <source>Completed</source> <target>Valmis</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>Keskeytys pyydetty: Odotetaan toiminnon loppumista...</target> + <source>Continue</source> <target>Jatka</target> + <source>Pause</source> <target>Tauko</target> + <source>Cannot find %x</source> <target>En löydä %x</target> -<source>DECISION TREE</source> -<target>PÄÄTÖSPUU</target> -<source>file exists on both sides</source> -<target>tiedosto löytyy molemmilla puolilla</target> -<source>on one side only</source> -<target>vain yhdellä puolella</target> -<source>same date</source> -<target>sama päiväys</target> -<source>different date</source> -<target>eri päiväys</target> + <source>Inactive</source> <target>Lepotilassa</target> -<source>Second</source> -<target>sekunttia</target> -<source>Minute</source> -<target>minuuttia</target> -<source>Hour</source> -<target>tuntia</target> -<source>Day</source> -<target>päivää</target> + +<source>Last x hours</source> +<target></target> + +<source>Today</source> +<target></target> + +<source>This week</source> +<target></target> + +<source>This month</source> +<target></target> + +<source>This year</source> +<target></target> + <source>Byte</source> <target>tavua</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>Suodata: Kaikki parit</target> + <source>Filter: Single pair</source> <target>Suodata: Yksi pari</target> + <source>Ignore</source> <target>Sivuta</target> + <source>Direct</source> <target>Suoraan</target> + <source>Follow</source> <target>Seuraa</target> + +<source>Copy NTFS permissions</source> +<target></target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>Liitä ulkoinen sovellus viitekehysvalikkoon. Seuraavat makrot ovat valittavissa:</target> + <source>- full file or directory name</source> <target>- tiedoston tai hakemiston koko nimi</target> + <source>- directory part only</source> <target>- vain hakemisto-osa</target> + <source>- Other side's counterpart to %name</source> <target>- Toisen puolen vastaavuus on %name</target> + <source>- Other side's counterpart to %dir</source> <target>- Toisen puolen vastaavuus on %dir</target> + <source>Restore all hidden dialogs?</source> <target>Palauta piiloitetut ikkunat?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -916,6 +1251,7 @@ Siirrä tiedosto- ja hekimisto-oikeuksia <pluralform>Haluatko varmasti siirtää seuraava kohde Roskakoriin?</pluralform> <pluralform>Haluatko varmasti siirtää seuraavat %x kohteet Roskakoriin?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -924,139 +1260,211 @@ Siirrä tiedosto- ja hekimisto-oikeuksia <pluralform>Haluatko varmasti poistaa seuraava kohde?</pluralform> <pluralform>Haluatko varmasti poistaa seuraavat %x kohteet?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>Jätä ratkaisemattomana virheenä</target> + <source>Delete permanently</source> <target>Poista pysyvästi</target> + <source>Delete or overwrite files permanently</source> <target>Poista tai ylikirjoita tiedostoja pysyvästi</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>Käytä Roskakoria kun poistat tai ylikirjoitat tiedostoja</target> + <source>Versioning</source> <target>Versiointi</target> + <source>Move files into a time-stamped subdirectory</source> <target>Siirrä tiedostot aikaleimattuun hakemistoon</target> -<source>Cannot determine sync-direction:</source> -<target>Tuntematon täsmäytys suunta:</target> -<source>Filter settings have changed!</source> -<target>Suodinasetukset muutettu!</target> + <source>Both sides have changed since last synchronization!</source> <target>Molemmat puolet muuttuneet edellisestä täsmäytyksestä!</target> + +<source>Cannot determine sync-direction:</source> +<target>Tuntematon täsmäytys suunta:</target> + <source>No change since last synchronization!</source> <target>Ei muutoksia edellisen täsmäytyksen jälkeen!</target> + +<source>Filter settings have changed!</source> +<target>Suodinasetukset muutettu!</target> + <source>The file was not processed by last synchronization!</source> <target>Tiedostoa ei käsitelty viime täsmäytyksessä!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>Suunniteltu hakemiston poistaminen on ristiriidassa alihakemiston ja tiedostojen kanssa!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Aseta oletettu suunta täsmäytykselle: Vanhat tiedostot ylikirjoitetaan uudemilla tiedostoilla.</target> + <source>The file does not contain a valid configuration:</source> <target>Asetustiedosto ei ole kelvollinen:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>Jätää virhe huomiotta ja tulkitse hakemisto tyhjäksi.</target> + <source>Directory does not exist:</source> <target>Puuttuva hakemisto:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Hakemistot riippuvuussuhteessa! Aseta täsmäytyssääntöjä varovasti:</target> + <source>Comparing content of files %x</source> <target>Vertaa tiedostojen %x tietosisältöä</target> + <source>Memory allocation failed!</source> <target>Muistin varaus epäonnistui!</target> + <source>File %x has an invalid date!</source> <target>Tiedostolla %x on virheellinen päiväys!</target> + <source>Conflict detected:</source> <target>Ristiriita todettu:</target> + <source>Files %x have the same date but a different size!</source> <target>Tiedostoilla %x on sama päiväys mutta eri koko!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>Pikakuvakkeilla %x on sama päiväys mutta kohde on toinen!</target> + <source>Comparing files by content failed.</source> <target>Tietosisällön vertailu epäonnistui.</target> + <source>Generating file list...</source> <target>Luodaan tiedostolista...</target> + <source>Multiple...</source> <target>Moninkertainen...</target> + <source>Both sides are equal</source> <target>Puolet ovat denttiset</target> + <source>Files/folders differ in attributes only</source> <target>Tiedostot/hakemistot eroavat vain ominaisuuksissa</target> + <source>Copy new file/folder to left</source> <target>Kopioi uusi tiedosto/hakemisto vasemmalle</target> + <source>Copy new file/folder to right</source> <target>Kopioi uusi tiedosto/hakemisto oikealle</target> + <source>Delete left file/folder</source> <target>Poista tiedosto/hakemisto vasemmalta</target> + <source>Delete right file/folder</source> <target>Poista tiedosto/hakemisto oikealta</target> + <source>Overwrite left file/folder with right one</source> <target>Ylikirjoita oikea tiedosto/hakemista vasemanpuolisella</target> + <source>Overwrite right file/folder with left one</source> <target>Ylikirjoita vasen tiedosto/hakemista oikeannpuolisella</target> + <source>Do nothing</source> <target>Älä tee mitään</target> + <source>Copy file attributes only to left</source> <target>Monista tiedosto-ominaisuudet vasemmalle</target> + <source>Copy file attributes only to right</source> <target>Monista tiedosto-ominaisuudet oikealle</target> + <source>Deleting file %x</source> <target>Poista tiedosto %x</target> -<source>Deleting Symbolic Link %x</source> -<target>Poista pikakuvake %x</target> + <source>Deleting folder %x</source> <target>Poista hakemisto %x</target> -<source>Moving %x to Recycle Bin</source> -<target>Siirrä %x Roskakoriin</target> -<source>Moving file %x to user-defined directory %y</source> -<target>Siirretään tiedostoa %x haluttuun hakemistoon %y</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>Siirrä hakemisto %x haluttuun hakemistoon %y</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>Siirrä pikakuvake %x haluttuun hakemistoon %y</target> -<source>Copying new file %x to %y</source> -<target>Kopioi uusi tiedosto %x -> %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>Kopioi uusi pikakuvake %x -> %y</target> -<source>Overwriting file %x in %y</source> -<target>Ylikirjoita tiedosto %x kohdassa %y</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>Ylikirjoita pikakuvake %x kohdassa %y</target> + +<source>Deleting symbolic link %x</source> +<target></target> + +<source>Moving file %x to recycle bin</source> +<target></target> + +<source>Moving folder %x to recycle bin</source> +<target></target> + +<source>Moving symbolic link %x to recycle bin</source> +<target></target> + +<source>Moving file %x to %y</source> +<target></target> + +<source>Moving folder %x to %y</source> +<target></target> + +<source>Moving symbolic link %x to %y</source> +<target></target> + +<source>Creating file %x</source> +<target></target> + +<source>Creating symbolic link %x</source> +<target></target> + <source>Creating folder %x</source> <target>Luo hakemisto %x</target> + +<source>Overwriting file %x</source> +<target></target> + +<source>Overwriting symbolic link %x</source> +<target></target> + <source>Verifying file %x</source> <target>Tarkistan tiedostoa %x</target> + <source>Updating attributes of %x</source> <target>Päivitän %x:n ominaisuudet</target> -<source>Source directory does not exist anymore:</source> -<target>Lähdehakemisto puuttuu:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>Asetusten mukaan ei löydy täsmäytettävää!</target> + <source>Target directory name must not be empty!</source> <target>Kohdehakemisto ei saa olla tyhjä!</target> + <source>User-defined directory for deletion was not specified!</source> <target>Poistolle ei ole valittu hakemistoa!</target> + +<source>Source directory does not exist anymore:</source> +<target>Lähdehakemisto puuttuu:</target> + <source>Unresolved conflicts existing!</source> <target>Ratkaisemattomia ristiriitoja!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>Voit jatkaa täsmäytystä, ristiriidoista huolimatta.</target> + <source>Significant difference detected:</source> <target>Merkittävä eroavavuus todettu:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>Yli 50% tiedostoista kopioidaan tai poistetaan!</target> + <source>Not enough free disk space available in:</source> <target>Levytila ei riitä:</target> + <source>Free disk space required:</source> <target>Tarvittava vapaa levytila:</target> + <source>Free disk space available:</source> <target>Levytilaa jäljellä:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> <target></target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>Moniosaisen hakemistoparin hakemisto muutetaan! Tarkista täsmäytys asetuksia!</target> + <source>Processing folder pair:</source> <target>Käsitellään hakemistoparia:</target> + <source>Generating database...</source> <target>Luodaan tietokantaa...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>Asetusten mukaan ei löydy täsmäytettävää!</target> + <source>Error copying locked file %x!</source> <target>Virhe kopioitaessa lukittua tiedostoa %x!</target> + <source>Data verification error: Source and target file have different content!</source> <target>Tiedon varmennusvirhe: Lähteellä ja kohteella on eri sisältö!</target> + diff --git a/BUILD/Languages/french.lng b/BUILD/Languages/french.lng index e06c7bcc..f8c57231 100644 --- a/BUILD/Languages/french.lng +++ b/BUILD/Languages/french.lng @@ -8,75 +8,116 @@ </header> <source>Searching for directory %x...</source> -<target></target> +<target>Recherche du répertoire %x...</target> + <source>Show in Explorer</source> <target>Montrer dans l'explorateur</target> + <source>Open with default application</source> <target>Ouvrir avec l'application par défaut</target> + <source>Browse directory</source> <target>Parcourir le répertoire</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Synchronisation Automatisée</target> + <source>Browse</source> <target>Parcourir</target> -<source>Invalid commandline: %x</source> -<target>Ligne de commande invalide: %x</target> + +<source>Invalid command line: %x</source> +<target>Ligne de commande incorrecte : %x</target> + <source>Error resolving symbolic link:</source> <target>Erreur lors de la résolution du lien symbolique :</target> -<source>Show popup</source> -<target>Afficher la boîte de dialogue</target> -<source>Show popup on errors or warnings</source> -<target>Affiche la boîte de dialogue pour chaque erreur ou avertissement</target> + +<source>Show pop-up</source> +<target>Montrer les boîtes de dialogue</target> + +<source>Show pop-up on errors or warnings</source> +<target>Montrer les messages d'avertissement ou d'erreur</target> + <source>Ignore errors</source> <target>Ignorer les erreurs</target> + <source>Hide all error and warning messages</source> <target>Masquer tous les messages d'erreurs et les avertissements</target> + <source>Exit instantly</source> <target>Sortie immédiate</target> + <source>Abort synchronization immediately</source> <target>Abandon immédiat de la synchronisation</target> + +<source>Select alternate comparison settings</source> +<target>Choisir d'autres paramètres de comparaison</target> + <source>Select alternate synchronization settings</source> <target>Sélectionner une autre configuration de la synchronisation</target> + <source>No filter selected</source> <target>Aucun filtre sélectionné</target> + <source>Filter is active</source> <target>Le filtre est actif</target> -<source>Clear filter settings</source> -<target>Effecer la configuration du filtrage</target> + <source>Remove alternate settings</source> <target>Supprimer les paramètres de rechange</target> + +<source>Clear filter settings</source> +<target>Effecer la configuration du filtrage</target> + <source>Create a batch job</source> -<target>Créer une tâche de traitement par lots</target> +<target>Créer un traitement batch</target> + <source>Synchronization settings</source> <target>Paramétrage de la synchronisation</target> + <source>Comparison settings</source> <target>Paramètres de comparaison</target> + <source>About</source> <target>A propos de</target> + <source>Error</source> <target>Erreur</target> + <source>Warning</source> <target>Attention</target> + <source>Question</source> <target>Question</target> + <source>Confirm</source> <target>Confirmation</target> + <source>Configure filter</source> <target>Configuration des filtres</target> + <source>Customize columns</source> <target>Personnaliser les colonnes</target> + <source>Global settings</source> <target>Paramètres généraux</target> + <source>Synchronization Preview</source> <target>Prévisualisation de la Synchronisation</target> + <source>Find</source> <target>Chercher</target> + +<source>Select time span</source> +<target>choisir un intervalle de temps</target> + <source>%x MB</source> <target>%x Mo</target> + <source>%x KB</source> <target>%x Ko</target> + <source>%x GB</source> <target>%x Go</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -85,46 +126,64 @@ <pluralform>%x octet</pluralform> <pluralform>%x octets</pluralform> </target> + <source><Symlink></source> <target><Lien_symbolique></target> + <source><Directory></source> <target><Répertoire></target> + <source>Size</source> <target>Taille</target> + <source>Date</source> <target>Date</target> + <source>Full path</source> <target>Chemin complet</target> + <source>Filename</source> <target>Nom du fichier</target> + <source>Relative path</source> <target>Chemin relatif</target> + <source>Directory</source> <target>Répertoire</target> + <source>Extension</source> <target>Extension</target> + <source>Comparison Result</source> <target>Résultat de la comparaison</target> + <source>Incompatible synchronization database format:</source> <target>Format de la base de données de synchro incompatible :</target> + <source>Initial synchronization:</source> <target>Première synchronisation :</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>L'un des fichiers de la base de données FreeFileSync n'existe plus :</target> + <source>Error reading from synchronization database:</source> <target>Erreur lors de la lecture de la base de données de synchro :</target> + <source>Database files do not share a common synchronization session:</source> -<target></target> +<target>Les fichiers de la base de données ne font pas partie de la même session de synchronisation</target> + <source>An exception occurred!</source> <target>Une erreur s'est produite !</target> -<source>Error deleting file:</source> -<target>Erreur lors de la suppression d'un fichier :</target> + <source>Error reading file attributes:</source> <target>Erreur lors de la lecture des attributs du fichier :</target> + <source>Waiting while directory is locked (%x)...</source> <target>En attente tant que le répertoire est verrouillé (%x)...</target> + <source>Error setting directory lock:</source> <target>Erreur lors du verrouillage du répertoire :</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -133,27 +192,40 @@ <pluralform>%x sec</pluralform> <pluralform>%x sec</pluralform> </target> + <source>Info</source> <target>Info</target> + <source>Fatal Error</source> <target>Erreur Fatale</target> + <source>Scanning:</source> <target>Lecture en cours :</target> + <source>Encoding extended time information: %x</source> <target>Codage de l'heure au format étendu : %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> -<target></target> +<target> +<pluralform>[1 Tâche]</pluralform> +<pluralform>[%x Tâches]</pluralform> +</target> + <source>Invalid FreeFileSync config file!</source> <target>Fichier de configuration FreeFileSync invalide !</target> + <source>File does not exist:</source> <target>Le fichier n'existe pas :</target> + <source>Error parsing configuration file:</source> <target>Erreur lors de l'analyse du fichier de configuration :</target> + <source>/sec</source> <target>/sec</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -162,6 +234,7 @@ <pluralform>%x min</pluralform> <pluralform>%x min</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -170,6 +243,7 @@ <pluralform>%x heure</pluralform> <pluralform>%x heures</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -178,28 +252,40 @@ <pluralform>%x jour</pluralform> <pluralform>%x jours</pluralform> </target> + <source>S&ave configuration...</source> <target>S&auvegarder la configuration...</target> + <source>&Load configuration...</source> <target>&Charger la configuration...</target> + <source>&Quit</source> <target>&Quitter</target> + <source>&File</source> <target>&Fichier</target> + <source>&Content</source> <target>&Contenu</target> + <source>&About...</source> <target>&A propos de...</target> + <source>&Help</source> <target>&Aide</target> + <source>Usage:</source> <target>Utilisation :</target> + <source>1. Select directories to monitor.</source> <target>1. Sélectionner les répertoires à surveiller.</target> + <source>2. Enter a command line.</source> <target>2. Entrez une ligne de commande.</target> + <source>3. Press 'Start'.</source> <target>3. Cliquez sur 'Démarrer'.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -210,406 +296,550 @@ La ligne de commande est exécutée chaque fois que : - tous les répertoires deviennent accessibles (par exemple, lors de l'insertion d'une clé USB) - les fichiers de ces répertoires ou sous-répertoires sont modifiés </target> + <source>Directories to watch</source> <target>Réperoires à surveiller</target> + <source>Add folder</source> <target>Ajout d'un dossier</target> + <source>Remove folder</source> <target>Supprimer le dossier</target> + <source>Select a folder</source> <target>Choisissez un dossier</target> + <source>Command line</source> <target>Ligne de commande</target> + <source>Minimum Idle Time [seconds]</source> <target>Délai minimum (secondes)</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>Temps mort entre la détection de la dernière modification et l'éxécution de la ligne de commande en secondes</target> + <source>Start</source> <target>Démarrer</target> + <source>(Build: %x)</source> <target>(Généré : %x)</target> + <source>RealtimeSync configuration</source> <target>Configuration RealtimeSync</target> + <source>File already exists. Overwrite?</source> <target>Le fichier existe déjà . Voulez-vous le remplacer ?</target> + <source>&Restore</source> <target>&Restaurer</target> + <source>&Exit</source> <target>&Quitter</target> + <source>Monitoring active...</source> <target>Surveillance en cours...</target> + <source>Waiting for missing directories...</source> <target>En attente des répertoires absents ...</target> + <source>A directory input field is empty.</source> <target>Un champ répertoire est vide</target> + <source>Drag && drop</source> <target>Glisser && Déposer</target> + <source>Could not initialize directory monitoring:</source> <target>Impossible d'initialiser la surveillance des dossiers :</target> + <source>Error when monitoring directories.</source> <target>Erreur lors de la surveillance des répertoires.</target> + <source>Conversion error:</source> <target>Erreur de conversion :</target> + +<source>Error deleting file:</source> +<target>Erreur lors de la suppression d'un fichier :</target> + <source>Error moving file:</source> <target>Erreur lors du déplacement du fichier :</target> + <source>Target file already existing!</source> <target>Le fichier de destination existe déjà !</target> + <source>Error moving directory:</source> <target>Erreur lors du déplacement du répertoire :</target> + <source>Target directory already existing!</source> <target>Le répertoire de destination existe déjà !</target> + <source>Error deleting directory:</source> <target>Erreur lors de la suppression d'un répertoire :</target> + <source>Error changing modification time:</source> <target>Erreur lors du changement de la date de modification :</target> + <source>Error loading library function:</source> <target>Erreur lors du chargement de la bibliothèque de fonctions :</target> + <source>Error reading security context:</source> <target>Erreur de lecture du contexte de sécurité:</target> + <source>Error writing security context:</source> <target>Erreur d'écriture du contexte de sécurité:</target> + <source>Error copying file permissions:</source> <target>Erreur lors de la copie des attributs système</target> + <source>Error creating directory:</source> <target>Erreur lors de la création d'un répertoire :</target> + <source>Error copying symbolic link:</source> <target>Erreur lors de la copie du lien symbolique :</target> + <source>Error copying file:</source> <target>Erreur lors de la copie du fichier :</target> + <source>Error opening file:</source> <target>Erreur lors de l'ouverture du fichier :</target> + <source>Error writing file:</source> <target>Erreur lors de l'écriture du fichier :</target> + <source>Error reading file:</source> <target>Erreur lors de la lecture du fichier :</target> + <source>Operation aborted!</source> <target>Opération abandonnée !</target> + <source>Endless loop when traversing directory:</source> <target>Boucle sans fin lors du parcours du répertoire :</target> + <source>Error traversing directory:</source> <target>Erreur lors du parcours du répertoire :</target> + <source>Windows Error Code %x:</source> <target>Code erreur Windows %x:</target> + <source>Linux Error Code %x:</source> <target>Code erreur Linux %x:</target> + <source>Error setting privilege:</source> <target>Erreur de paramétrage de privilège</target> + <source>Error moving to Recycle Bin:</source> <target>Erreur lors du déplacement dans la Corbeille :</target> + <source>Could not load a required DLL:</source> <target>Impossible de charger une DLL :</target> + <source>Error writing to synchronization database:</source> <target>Erreur lors de l'écriture de la base de données de synchro :</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>Erreur lors du démarrage du service 'Volume Shadow Copy' !</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target>Erreur lors de l'accès au Volume Shadow Copy Service !</target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>La copie en tâche de fond sur WOW64 n'est pas possible. Utilisez pour cela la version 64 bits de FreeFileSync.</target> + <source>Could not determine volume name for file:</source> <target>Impossible de trouver le nom de volume pour le fichier :</target> + <source>Volume name %x not part of filename %y!</source> <target>Le nom de volume %x ne fait pas partie du nom de fichier %y !</target> + <source>%x TB</source> <target>%x To</target> + <source>%x PB</source> <target>%x Po</target> + <source>%x%</source> <target>%x %</target> + <source>Could not read values for the following XML nodes:</source> <target>Impossible de lire les valeurs des noeuds XML suivants :</target> + <source>Logging</source> <target>Connexion</target> + <source>FreeFileSync batch file</source> <target>FreeFileSync fichier de commandes</target> + <source>FreeFileSync configuration</source> <target>FreeFileSync configuration</target> + <source>FreeFileSync Batch Job</source> <target>FreeFileSync Fichier de commandes</target> + <source>Unable to create logfile!</source> <target>Impossible de créer un fichier log !</target> + <source>Batch execution</source> -<target>Exécution du traitement par lots</target> +<target>Exécution du traitement batch</target> + <source>Log-messages:</source> <target>Messages log :</target> + <source>Stop</source> <target>Arrêt</target> + <source>Total time:</source> <target>Durée totale :</target> + <source>Synchronization aborted!</source> <target>Synchronisation abandonnée !</target> + <source>Synchronization completed with errors!</source> <target>Synchronisation terminée avec des erreurs !</target> + <source>Synchronization completed successfully!</source> <target>Synchronisation terminée avec succès !</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>Appuyer sur "Changer " pour ouvrir le mode FreeFileSync GUI</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>Changement en mode FreeFileSync GUI...</target> + <source>Unable to connect to sourceforge.net!</source> <target>Impossible de se connecter à sourceforge.net !</target> + <source>A newer version of FreeFileSync is available:</source> <target>Une version plus récente de FreeFileSync est disponible :</target> + <source>Download now?</source> <target>Télécharger maintenant ?</target> + <source>Information</source> <target>Information</target> + <source>FreeFileSync is up to date!</source> <target>FreeFileSync est à jour !</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>Voulez-vous que FreeFileSync recherche automatiquement une nouvelle version chaque semaine ?</target> + <source>(Requires an Internet connection!)</source> <target>(Nécessite une connexion Internet)</target> + <source>1. &Compare</source> <target>1. &Comparer</target> + <source>2. &Synchronize...</source> <target>2. &Synchroniser...</target> + <source>S&witch view</source> <target>Changer de &vue</target> + <source>&New</source> <target>&Nouveau</target> + <source>&Program</source> <target>&Actions</target> + <source>&Language</source> <target>&Langue</target> + <source>&Global settings...</source> <target>&Paramètres généraux...</target> + <source>&Create batch job...</source> -<target>&Créer une tâche de traitement par lots...</target> +<target>&Créer une tâche de traitement batch...</target> + <source>&Export file list...</source> <target>&Exportation de la liste des fichiers...</target> + <source>&Advanced</source> <target>&Avancé</target> + <source>&Check for new version</source> <target>&Rechercher une nouvelle version</target> + <source>Compare</source> <target>Comparer</target> + <source>Compare both sides</source> <target>Comparer les deux listes</target> + <source>&Abort</source> <target>&Abandonner</target> + <source>Synchronize...</source> <target>Synchroniser...</target> + <source>Start synchronization</source> <target>Démarrer la synchronisation</target> -<source>Swap sides</source> -<target>Permuter les côtés</target> + <source>Add folder pair</source> <target>Ajout d'un couple de dossiers</target> + <source>Remove folder pair</source> <target>Supprimer le couple de dossiers</target> + +<source>Swap sides</source> +<target>Permuter les côtés</target> + <source>Save current configuration to file</source> <target>Enregistrer la configuration actuelle</target> + <source>Load configuration from file</source> <target>Charger la configuration à partir du fichier</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>Dernière configuration utilisée (Appuyez sur SUPPR pour l'enlever de la liste)</target> + <source>Hide excluded items</source> <target>Masquer les éléments exclus</target> + <source>Hide filtered or temporarily excluded files</source> <target>Masquer les fichiers filtrés ou exclus temporairement</target> + <source>Number of files and directories that will be created</source> <target>Nombre de fichiers et de répertoires qui seront créés</target> + <source>Number of files that will be overwritten</source> <target>Nombre de fichiers qui seront remplacés</target> + <source>Number of files and directories that will be deleted</source> <target>Nombre de fichiers et de répertoires qui seront supprimés</target> + <source>Total amount of data that will be transferred</source> <target>Volume de données à transférer</target> -<source>Left</source> -<target>Gauche</target> -<source>Right</source> -<target>Droite</target> + <source>Batch job</source> <target>Fichier de commandes</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>Créer un fichier de commandes pour la synchronisation automatique. Pour démarrer en mode batch il suffit de double-cliquez sur le fichier de commandes ou d'exécuter en ligne de commande: FreeFileSync.exe <fichier de commandes>. Vous pouvez aussi le programmer à l'aide du planificateur de tâches de votre système d'exploitation.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target>Créer un fichier batch pour la synchronisation automatique. Pour lancer le mode batch il suffit de double-cliquer sur le fichier ou d'exécuter sur la ligne de commande : FreeFileSync.exe <fichier ffs_batch>. Vous pouvez aussi paramètrer le traitement dans le planificateur de tâches de votre système d'exploitation.</target> + <source>Help</source> <target>Aide</target> + <source>Filter files</source> <target>Filtrage des fichiers</target> + <source>Error handling</source> <target>Erreur de gestion de fichiers</target> + +<source>Left</source> +<target>Gauche</target> + +<source>Right</source> +<target>Droite</target> + <source>Overview</source> <target>Présentation</target> + <source>Status feedback</source> <target>Retour d'informations</target> + <source>Run minimized</source> -<target></target> +<target>Lancer em affichage réduit</target> + <source>Maximum number of logfiles:</source> <target>Nombre maximum de fichiers Log</target> + <source>Select logfile directory:</source> <target>Choisissez un dossier pour le fichier .log :</target> + <source>Batch settings</source> -<target></target> +<target>Configuration du traitement batch</target> + <source>&Save</source> <target>&Sauvegarder</target> + <source>&Load</source> <target>&Charger</target> + <source>&Cancel</source> <target>&Annuler</target> + <source>Elements found:</source> <target>Elements trouvés :</target> + <source>Elements remaining:</source> <target>Elements restants :</target> + <source>Speed:</source> <target>Vitesse :</target> + <source>Time remaining:</source> <target>Temps restant :</target> + <source>Time elapsed:</source> <target>Temps écoulé :</target> + <source>Operation:</source> <target>Opération :</target> + <source>Select variant:</source> <target>Choisissez une variante :</target> + <source><Automatic></source> <target><Automatique></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>Identifier et propager les modifications des deux côtés en utilisant une base de données. Les suppressions et les conflits sont détectés automatiquement.</target> + <source>Mirror ->></source> <target>Miroir ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Copie miroir du dossier de gauche. Le dossier de droite est modifié pour être strictement identique après la synchronisation.</target> + <source>Update -></source> <target>Mise à Jour -></target> + <source>Copy new or updated files to right folder.</source> <target>Copie les fichiers nouveaux ou modifiés dans le dossier de droite.</target> + <source>Custom</source> <target>Personnaliser</target> + <source>Configure your own synchronization rules.</source> <target>Paramétrage de vos règles de synchronisation.</target> + <source>Deletion handling</source> <target>Gestion des suppressions</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>Configuration</target> + <source>Category</source> <target>Catégorie</target> + <source>Action</source> <target>Action</target> + <source>File/folder exists on left side only</source> <target>Fichier/Dossier existant seulement à gauche</target> + <source>File/folder exists on right side only</source> <target>Fichier/Dossier existant seulement à droite</target> + <source>Left file is newer</source> <target>Le fichier à gauche est nouveau</target> + <source>Right file is newer</source> <target>Le fichier à droite est nouveau</target> + <source>Files have different content</source> <target>Les fichiers ont un contenu différent</target> + <source>Conflict/file cannot be categorized</source> <target>Conflit ou fichier indéterminé</target> + <source>Compare by...</source> <target>Comparaison par...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> <target> -Les fichiers sont considérés comme identiques, si - - leur taille - - leur date et heure de dernière modification -sont identiques +Les fichiers sont considérés comme identiques si + - la date et l'heure de modification + - la taille des fichiers +sont les mêmes </target> -<source>File size and date</source> -<target>Taille et date du fichier</target> + +<source>File time and size</source> +<target>Date et heure de modification du fichier</target> + <source> Files are found equal if - file content is the same </source> <target> -Les fichiers sont considérés comme identiques, si +Les fichiers sont considérés comme identiques si - leur contenu est identique </target> + <source>File content</source> <target>Contenu du fichier</target> + <source>Symbolic Link handling</source> <target>Gestion des Liens Symboliques</target> + <source>Synchronizing...</source> <target>Synchronisation en cours...</target> + <source>Elements processed:</source> <target>Elements traités :</target> + <source>&Pause</source> <target>&Pause</target> -<source>Compare by "File size and date"</source> -<target>Comparaison par "Date et taille des fichiers"</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>Cette variante définit comme identiques deux fichiers de même nom lorsqu'ils ont la même taille ET les mêmes date et heure de modification.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>Lorsque la comparaison démarre avec cette option, l'arbre de décision suivant est exécuté :</target> -<source>As a result the files are separated into the following categories:</source> -<target>En conclusion, les fichiers sont répartis dans les catégories suivantes :</target> -<source>- equal</source> -<target>- fichiers identiques</target> -<source>- left newer</source> -<target>- fichier de gauche plus récent</target> -<source>- right newer</source> -<target>- fichier de droite plus récent</target> -<source>- exists left only</source> -<target>- le fichier existe seulement à gauche</target> -<source>- exists right only</source> -<target>- le fichier existe seulement à droite</target> -<source>- conflict (same date, different size)</source> -<target>- conflit (même date, taille différente)</target> -<source>Compare by "File content"</source> -<target>Comparaison par "Contenu des fichiers"</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. -With this option enabled the decision tree is smaller: -</source> -<target> -Comme le nom le suggère, deux fichiers qui ont le même nom sont considérés comme identiques si, et seulement si, leur contenu est identique. Cette option est utile pour les contrôles de cohérence plutôt que pour les opérations de sauvegarde. Toutefois, les dates et heures ne sont pas du tout prises en compte. - -Avec cette option, l'arbre de décision est plus simple : -</target> -<source>- different</source> -<target>- fichiers différents</target> <source>Source code written in C++ utilizing:</source> <target>Code source écrit en C++ utilisant :</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>Pour les traductions de FreeFileSync, un grand merci à :</target> + <source>Feedback and suggestions are welcome at:</source> <target>Commentaires et suggestions sont les bienvenus à :</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync par Sourceforge</target> + <source>Homepage</source> <target>Accueil</target> + <source>If you like FFS</source> <target>Si vous aimez FFS</target> + <source>Donate with PayPal</source> <target>Faites un don avec PayPal</target> + <source>Email</source> <target>Email</target> + <source>Report translation error</source> <target>Etat des erreurs de transfert</target> + <source>Published under the GNU General Public License:</source> <target>Publié sous licence GNU General Public License :</target> + <source>Ignore subsequent errors</source> <target>Ignorer les erreurs ultérieures</target> + <source>Hide further error messages during the current process</source> <target>Masquer les messages d'erreur suivants pendant le traitement</target> + <source>&Ignore</source> <target>&Ignorer</target> + <source>&Retry</source> <target>&Réessayer</target> + <source>Do not show this dialog again</source> <target>Ne plus afficher ce message la prochaine fois</target> + <source>&Switch</source> <target>&Changer</target> + <source>&Yes</source> <target>&Oui</target> + <source>&No</source> <target>&Non</target> + <source>Delete on both sides</source> <target>Suppression des deux côtés</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>Suppression des deux côtés même si le fichier n'est sélectionné que d'un seul côté</target> + <source>Use Recycle Bin</source> <target>Utiliser la Corbeille</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -618,16 +848,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire Seuls les fichiers / répertoires qui correspondent à tous les paramètres de filtrage seront sélectionnés pour la synchronisation. Note: Le définition du filtre doit être relative (!) aux répertoires principaux de la synchronisation. </target> + <source>Hints:</source> <target>Conseils :</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. Entrez les noms relatifs des fichiers ou des répertoires séparés par un ';' ou par un passage à la ligne.</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. Les caractères génériques '*' et '?' sont acceptés.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. Exclure les fichiers directement sur le tableau principal à l'aide du menu contextuel.</target> + <source>Example</source> <target>Exemple</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -636,30 +872,40 @@ Exclude: \stuff\temp\* Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>Synchroniser tous les fichiers .doc, .zip et .exe sauf ceux du dossier "temp".</target> + <source>Include</source> <target>Inclure</target> + <source>Exclude</source> <target>Exclure</target> -<source>Select time span:</source> -<target>Sélectionner la période :</target> -<source>Minimum file size:</source> -<target>Taille minimum du fichier :</target> -<source>Maximum file size:</source> -<target>Taille maximum du fichier :</target> + +<source>Minimum file size</source> +<target>Taille minimale du fichier</target> + +<source>Maximum file size</source> +<target>Taille maximale du fichier</target> + <source>&Default</source> <target>&Défaut</target> + <source>Move column up</source> <target>Déplacer la colonne vers le haut</target> + <source>Move column down</source> <target>Déplacer la colonne vers le bas</target> -<source>Transactional File Copy</source> -<target></target> + +<source>Transactional file copy</source> +<target>Copie de fichiers transactionnelle</target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> -<target></target> +<target>L'écriture préalable de fichiers dans un répertoire temporaire (*.ffs_tmp) avant de les renommer garantit la cohérence et la sécurité en cas d'erreur fatale.</target> + <source>Copy locked files</source> <target>Copier les fichiers verrouillés</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -668,8 +914,10 @@ Copy shared or locked files using Volume Shadow Copy Service La copie des fichiers partagés ou verrouillés nécessite le Service Volume Shadow Copy (avec les droits administrateur) </target> -<source>Copy filesystem permissions</source> -<target>Copie des droits d'accès</target> + +<source>Copy file access permissions</source> +<target>Copie des droits d'accès aux fichiers</target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -678,138 +926,205 @@ Transfer file and directory permissions Transfert des attributs système des fichiers et des répertoires (avec les droits administrateur) </target> + <source>Hidden dialogs:</source> <target>Boîtes de dialogue masquées :</target> + <source>Reset</source> <target>Réinitialiser</target> + <source>Show hidden dialogs</source> <target>Afficher les boîtes de dialogue masquées</target> + <source>External applications</source> <target>Applications externes</target> + <source>Description</source> <target>Description</target> + <source>Variant</source> <target>Variante</target> + <source>Statistics</source> <target>Statistiques</target> + <source>Find what:</source> <target>Chercher cela :</target> + <source>Match case</source> <target>Respecter la casse</target> + <source>&Find next</source> <target>&Chercher le suivant</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>Vous pouvez essayer de synchroniser à nouveau les éléments restants (SANS avoir à les comparer à nouveau) !</target> -<source>Batch file created successfully!</source> -<target>Fichier de traitement par lots créé avec succès !</target> + <source>Main bar</source> <target>Barre principale</target> + <source>Folder pairs</source> <target>Paires de dossiers</target> + <source>Select view</source> <target>Choisissez une vue</target> + <source>Set direction:</source> <target>Choix de la direction :</target> + <source>Exclude temporarily</source> <target>Exclure temporairement</target> + <source>Include temporarily</source> <target>Inclure temporairement</target> + <source>Exclude via filter:</source> <target>Exclure à l'aide du filtre :</target> + <source><multiple selection></source> <target><sélection multiple></target> + <source>D-Click</source> <target>Clic Droit</target> + <source>Delete</source> <target>Supprimer</target> + <source>Customize...</source> <target>Personnaliser...</target> + +<source>Select time span...</source> +<target>choisir un intervalle de temps...</target> + <source>Auto-adjust columns</source> <target>Auto-ajustement des colonnes</target> + <source>Include all rows</source> <target>Inclure toutes les lignes</target> + <source>Exclude all rows</source> <target>Exclure toutes les lignes</target> + <source>Reset view</source> <target>Réinitialiser la vue</target> + <source>Show "%x"</source> <target>Afficher "%x"</target> + <source><Last session></source> <target><Dernière session></target> + <source>Configuration saved!</source> <target>Configuration enregistrée !</target> + <source>Save changes to current configuration?</source> <target>Voulez-vous enregistrer les modifications dans la configuration actuelle ?</target> + <source>Configuration loaded!</source> <target>Configuration chargée !</target> + <source>Folder Comparison and Synchronization</source> <target>Comparaison de dossiers et Synchronisation</target> + <source>Hide files that exist on left side only</source> <target>Masquer les fichiers n'existant qu'à gauche</target> + <source>Show files that exist on left side only</source> <target>Afficher les fichiers existant seulement à gauche</target> + <source>Hide files that exist on right side only</source> <target>Masquer les fichiers n'existant qu'à droite</target> + <source>Show files that exist on right side only</source> <target>Afficher les fichiers existant seulement à droite</target> + <source>Hide files that are newer on left</source> <target>Masquer les fichiers plus récents à gauche</target> + <source>Show files that are newer on left</source> <target>Afficher les fichiers de gauche plus récents que ceux de droite</target> + <source>Hide files that are newer on right</source> <target>Masquer les fichiers plus récents à droite</target> + <source>Show files that are newer on right</source> <target>Afficher les fichiers de droite plus récents que ceux de gauche</target> + <source>Hide files that are equal</source> <target>Masquer les fichiers identiques</target> + <source>Show files that are equal</source> <target>Afficher les fichiers identiques</target> + <source>Hide files that are different</source> <target>Masquer les fichiers différents</target> + <source>Show files that are different</source> <target>Afficher les fichiers différents</target> + <source>Hide conflicts</source> <target>Masquer les conflits</target> + <source>Show conflicts</source> <target>Afficher les conflits</target> + <source>Hide files that will be created on the left side</source> <target>Masquer les fichiers qui seront créés à gauche</target> + <source>Show files that will be created on the left side</source> <target>Afficher les fichiers qui seront créés à gauche</target> + <source>Hide files that will be created on the right side</source> <target>Masquer les fichiers qui seront créés à droite</target> + <source>Show files that will be created on the right side</source> <target>Afficher les fichiers qui seront créés à droite</target> + <source>Hide files that will be deleted on the left side</source> <target>Masquer les fichiers qui seront supprimés à gauche</target> + <source>Show files that will be deleted on the left side</source> <target>Afficher les fichiers qui seront supprimés à gauche</target> + <source>Hide files that will be deleted on the right side</source> <target>Masquer les fichiers qui seront supprimés à droite</target> + <source>Show files that will be deleted on the right side</source> <target>Afficher les fichiers qui seront supprimés à droite</target> + <source>Hide files that will be overwritten on left side</source> <target>Fichiers masqués qui ont été écrasés à gauche</target> + <source>Show files that will be overwritten on left side</source> <target>Afficher les fichiers qui seront écrasés à gauche</target> + <source>Hide files that will be overwritten on right side</source> <target>Fichiers masqués qui ont été écrasés à droite</target> + <source>Show files that will be overwritten on right side</source> <target>Afficher les fichiers qui seront écrasés à droite</target> + <source>Hide files that won't be copied</source> <target>Masquer les fichiers qui ne seront pas copiés</target> + <source>Show files that won't be copied</source> <target>Afficher les fichiers qui ne seront pas copiés</target> + <source>All directories in sync!</source> <target>Tous les répertoires sont synchronisés !</target> + <source>Please run a Compare first before synchronizing!</source> <target>Veuillez lancer une Comparaison avant de lancer la synchronisation !</target> + <source>Comma separated list</source> <target>Liste d'éléments séparés par une virgule</target> + <source>Legend</source> <target>Légende</target> + <source>File list exported!</source> <target>Liste des fichiers exportée !</target> + +<source>Batch file created successfully!</source> +<target>Fichier de traitement batch créé avec succès !</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -818,6 +1133,7 @@ Transfert des attributs système des fichiers et des répertoires <pluralform>Objet supprimé avec suucès!</pluralform> <pluralform>%x objets supprimés avec succès!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -826,6 +1142,7 @@ Transfert des attributs système des fichiers et des répertoires <pluralform>%x répertoire</pluralform> <pluralform>%x répertoires</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -834,6 +1151,7 @@ Transfert des attributs système des fichiers et des répertoires <pluralform>%x fichier</pluralform> <pluralform>%x fichiers</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -842,72 +1160,97 @@ Transfert des attributs système des fichiers et des répertoires <pluralform>%x of %y ligne affichée</pluralform> <pluralform>%x of %y lignes affichées</pluralform> </target> + <source>Scanning...</source> <target>Lecture en cours...</target> + <source>Comparing content...</source> <target>Comparaison du contenu...</target> + <source>Paused</source> <target>En pause</target> + <source>Aborted</source> <target>Abandonné</target> + <source>Completed</source> <target>Terminé</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>Abandon demandé : En attente de la fin de l'opération en cours...</target> + <source>Continue</source> <target>Continuer</target> + <source>Pause</source> <target>Pause</target> + <source>Cannot find %x</source> <target>Impossible de trouver %x</target> -<source>DECISION TREE</source> -<target>ARBRE DE DECISION</target> -<source>file exists on both sides</source> -<target>le fichier existe des deux côtés</target> -<source>on one side only</source> -<target>le fichier existe d'un seul côté seulement</target> -<source>same date</source> -<target>même date</target> -<source>different date</source> -<target>date différente</target> + <source>Inactive</source> <target>Inactif</target> -<source>Second</source> -<target>Seconde</target> -<source>Minute</source> -<target>Minute</target> -<source>Hour</source> -<target>Heure</target> -<source>Day</source> -<target>Jour</target> + +<source>Last x hours</source> +<target>Dernières x heures</target> + +<source>Today</source> +<target>Aujourd'hui</target> + +<source>This week</source> +<target>Cette semaine</target> + +<source>This month</source> +<target>Ce mois</target> + +<source>This year</source> +<target>Cette année</target> + <source>Byte</source> <target>Octet</target> + <source>KB</source> <target>Ko</target> + <source>MB</source> <target>Mo</target> + <source>Filter: All pairs</source> <target>Filtre : Toutes les paires</target> + <source>Filter: Single pair</source> <target>Filtre : Une seule paire</target> + <source>Ignore</source> <target>Ignorer</target> + <source>Direct</source> <target>Direct</target> + <source>Follow</source> <target>Suivre</target> + +<source>Copy NTFS permissions</source> +<target>Copie des droits NTFS</target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>Inclure les applications externes dans le menu contextuel. Les macros suivantes sont disponibles :</target> + <source>- full file or directory name</source> <target>- nom complet du fichier ou du répertoire</target> + <source>- directory part only</source> <target>- seulement les répertoires</target> + <source>- Other side's counterpart to %name</source> <target>- équivalent de %name de l'autre côté</target> + <source>- Other side's counterpart to %dir</source> <target>- équivalent de %dir de l'autre côté</target> + <source>Restore all hidden dialogs?</source> <target>Restaurer toutes les boîtes de dialogue cachées ?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -916,6 +1259,7 @@ Transfert des attributs système des fichiers et des répertoires <pluralform>Voulez-vous vraiment mettre cet objet dans la corbeille ?</pluralform> <pluralform>Voulez-vous vraiment mettre ces %x objets dans la corbeille ?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -924,139 +1268,211 @@ Transfert des attributs système des fichiers et des répertoires <pluralform>Voulez-vous vraiment supprimer cet objet ?</pluralform> <pluralform>Voulez-vous vraiment supprimer ces %x objets ?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>Abandonner en tant que conflit non résolu</target> + <source>Delete permanently</source> <target>Suppression définitive</target> + <source>Delete or overwrite files permanently</source> <target>Supprimer ou écraser les fichiers définitivement</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>Utiliser la Corbeille lors de la suppression ou du remplacement d'un fichier</target> + <source>Versioning</source> <target>Choisir un dossier</target> + <source>Move files into a time-stamped subdirectory</source> <target>Déplacer les fichiers vers un sous-répertoire daté</target> -<source>Cannot determine sync-direction:</source> -<target>Impossible de déterminer le sens de la synchro :</target> -<source>Filter settings have changed!</source> -<target>La configuration du filtre a changé !</target> + <source>Both sides have changed since last synchronization!</source> <target>Les deux côtés ont changé depuis la dernière synchronisation !</target> + +<source>Cannot determine sync-direction:</source> +<target>Impossible de déterminer le sens de la synchro :</target> + <source>No change since last synchronization!</source> <target>Aucun changement depuis la dernière synchronisation !</target> + +<source>Filter settings have changed!</source> +<target>La configuration du filtre a changé !</target> + <source>The file was not processed by last synchronization!</source> <target>Le fichier n'a pas été traité par la dernière synchronisation !</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>Le répertoire de suppression choisi est en conflit avec ses sous-répertoires et -fichiers !</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Directions de la synchronisation par défaut : les anciens fichiers seront remplacés par les nouveaux.</target> + <source>The file does not contain a valid configuration:</source> <target>Le fichier ne contient pas de configuration valide :</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>Vous pouvez ignorer cette erreur en considérant le répertoire comme vide.</target> + <source>Directory does not exist:</source> <target>Le répertoire n'existe pas :</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Les répertoires sont imbriqués ! Attention à la mise à jour des règles de synchronisation :</target> + <source>Comparing content of files %x</source> <target>Comparaison du contenu des fichiers %x</target> + <source>Memory allocation failed!</source> <target>Erreur d'allocation de mémoire!</target> + <source>File %x has an invalid date!</source> <target>Le fichier %x a une date invalide !</target> + <source>Conflict detected:</source> <target>Conflit détecté :</target> + <source>Files %x have the same date but a different size!</source> <target>Les fichiers %x ont la même date mais une taille différente !</target> + <source>Symlinks %x have the same date but a different target!</source> <target>Le lien symbolique %x a la même date mais une destination différente !</target> + <source>Comparing files by content failed.</source> <target>La comparaison des fichiers par leur contenu a échoué.</target> + <source>Generating file list...</source> <target>Génération de la liste des fichiers...</target> + <source>Multiple...</source> <target>Multiple...</target> + <source>Both sides are equal</source> <target>Les deux cotés sont identiques</target> + <source>Files/folders differ in attributes only</source> <target>Fichiers/Dossiers différant seulement par leurs attributs</target> + <source>Copy new file/folder to left</source> <target>Copier les nouveaux fichiers/dossiers à gauche</target> + <source>Copy new file/folder to right</source> <target>Copier les nouveaux fichiers/dossiers à droite</target> + <source>Delete left file/folder</source> <target>Supprimer les fichiers/dossiers de gauche</target> + <source>Delete right file/folder</source> <target>Supprimer les fichiers/dossiers de droite</target> + <source>Overwrite left file/folder with right one</source> <target>Remplacer le fichier/dossier de gauche avec celui de droite</target> + <source>Overwrite right file/folder with left one</source> <target>Remplacer le fichier/dossier de droite avec celui de gauche</target> + <source>Do nothing</source> <target>Ne rien faire</target> + <source>Copy file attributes only to left</source> <target>Copier seulement les attributs du fichier à gauche</target> + <source>Copy file attributes only to right</source> <target>Copier seulement les attributs du fichier à droite</target> + <source>Deleting file %x</source> <target>Suppression du fichier %x</target> -<source>Deleting Symbolic Link %x</source> -<target>Suppression du Lien Symbolique %x</target> + <source>Deleting folder %x</source> <target>Suppression du dossier %x</target> -<source>Moving %x to Recycle Bin</source> -<target>Déplacement de %x vers la Corbeille</target> -<source>Moving file %x to user-defined directory %y</source> -<target>Déplacement du fichier %x vers le répertoire utilisateur %y</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>Déplacement du dossier %x vers le répertoire utilisateur %y</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>Déplacement du Lien Symbolique %x vers le répertoire utilisateur %y</target> -<source>Copying new file %x to %y</source> -<target>Copie le nouveau fichier %x vers %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>Copie le nouveau Lien Symbolique %x vers %y</target> -<source>Overwriting file %x in %y</source> -<target>Remplacement du fichier %x par %y</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>Remplacement du Lien Symbolique %x par %y</target> + +<source>Deleting symbolic link %x</source> +<target>Suppression du lien symbomique %x</target> + +<source>Moving file %x to recycle bin</source> +<target>Envoi du fichier %x dans la corbeille</target> + +<source>Moving folder %x to recycle bin</source> +<target>Envoi du dossier %x dans la corbeille</target> + +<source>Moving symbolic link %x to recycle bin</source> +<target>Envoi du lien symbolique %x dans la corbeille</target> + +<source>Moving file %x to %y</source> +<target>Déplacement du fichier %x vers %y</target> + +<source>Moving folder %x to %y</source> +<target>Déplacement du dossier %x vers %y</target> + +<source>Moving symbolic link %x to %y</source> +<target>Déplacement du lien symbolique %x vers %y</target> + +<source>Creating file %x</source> +<target>Création du fichier %x</target> + +<source>Creating symbolic link %x</source> +<target>Création du lien symbolique %x</target> + <source>Creating folder %x</source> <target>Création du dossier %x</target> + +<source>Overwriting file %x</source> +<target>Remplacement du fichier %x</target> + +<source>Overwriting symbolic link %x</source> +<target>Remplacement du lien symbomique %x</target> + <source>Verifying file %x</source> <target>Contrôle du fichier %x</target> + <source>Updating attributes of %x</source> <target>Mise à jour des attributs de %x</target> -<source>Source directory does not exist anymore:</source> -<target>Le répertoire source n'existe plus :</target> -<source>Nothing to synchronize according to configuration!</source> -<target>Rien à synchroniser dans cette configuration !</target> + <source>Target directory name must not be empty!</source> <target>Le répertoire destination ne doit pas être vide !</target> + <source>User-defined directory for deletion was not specified!</source> <target>Le répertoire défini par l'utilisateur pour la suppression n'a pas été indiqué !</target> + +<source>Source directory does not exist anymore:</source> +<target>Le répertoire source n'existe plus :</target> + <source>Unresolved conflicts existing!</source> <target>Il y a des conflits non résolus !</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>Vous pouvez ignorer ces conflits et continuer la synchronisation.</target> + <source>Significant difference detected:</source> <target>Différence significative détectée :</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>Plus de 50% des fichiers seront copiés ou détruits !</target> + <source>Not enough free disk space available in:</source> <target>Espace disque insuffisant sur :</target> + <source>Free disk space required:</source> <target>Espace disque nécessaire :</target> + <source>Free disk space available:</source> <target>Espace disque disponible :</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target></target> +<target>La corbeille n'est pas valable pour les chemins suivants ! Les fichiers seront détruits définitivement :</target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>Un répertoire faisant partie de paires multiples doit être modifié ! Vérifiez les paramètres de la synchronisation !</target> + <source>Processing folder pair:</source> <target>Traitement de la paire de dossiers :</target> + <source>Generating database...</source> <target>Génération de la base de données...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>Rien à synchroniser dans cette configuration !</target> + <source>Error copying locked file %x!</source> <target>Erreur lors de la copie du fichier verrouillé %x !</target> + <source>Data verification error: Source and target file have different content!</source> <target>Erreur lors du contrôle des données : Les fichiers source et destination ont des contenus différents !</target> + diff --git a/BUILD/Languages/german.lng b/BUILD/Languages/german.lng index efc1a0ba..d71dde81 100644 --- a/BUILD/Languages/german.lng +++ b/BUILD/Languages/german.lng @@ -9,74 +9,115 @@ <source>Searching for directory %x...</source> <target>Suche Verzeichnis %x...</target> + <source>Show in Explorer</source> <target>Im Explorer anzeigen</target> + <source>Open with default application</source> <target>Mit Standardanwendung öffnen</target> + <source>Browse directory</source> <target>Verzeichnis öffnen</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Automatisierte Synchronisation</target> + <source>Browse</source> <target>Auswählen</target> -<source>Invalid commandline: %x</source> + +<source>Invalid command line: %x</source> <target>Ungültige Befehlszeile: %x</target> + <source>Error resolving symbolic link:</source> <target>Fehler beim Auflösen des Symbolischen Links:</target> -<source>Show popup</source> -<target>Popup zeigen</target> -<source>Show popup on errors or warnings</source> + +<source>Show pop-up</source> +<target>Pop-up zeigen</target> + +<source>Show pop-up on errors or warnings</source> <target>Ein Auswahlfenster bei Fehlern oder Warnungen anzeigen</target> + <source>Ignore errors</source> <target>Fehler ignorieren</target> + <source>Hide all error and warning messages</source> <target>Alle Fehler- und Warnmeldungen unterdrücken</target> + <source>Exit instantly</source> <target>Sofort beenden</target> + <source>Abort synchronization immediately</source> <target>Synchronisation sofort abbrechen</target> + +<source>Select alternate comparison settings</source> +<target>Alternative Vergleichseinstellungen auswählen</target> + <source>Select alternate synchronization settings</source> <target>Alternative Synchronisationseinstellungen auswählen</target> + <source>No filter selected</source> <target>Kein Filter ausgewählt</target> + <source>Filter is active</source> <target>Filter ist aktiv</target> -<source>Clear filter settings</source> -<target>Filtereinstellungen löschen</target> + <source>Remove alternate settings</source> <target>Alternative Einstellungen entfernen</target> + +<source>Clear filter settings</source> +<target>Filtereinstellungen löschen</target> + <source>Create a batch job</source> <target>Batch-Job erstellen</target> + <source>Synchronization settings</source> <target>Synchronisationseinstellungen</target> + <source>Comparison settings</source> <target>Vergleichseinstellungen</target> + <source>About</source> <target>Ãœber</target> + <source>Error</source> <target>Fehler</target> + <source>Warning</source> <target>Warnung</target> + <source>Question</source> <target>Frage</target> + <source>Confirm</source> <target>Bestätigen</target> + <source>Configure filter</source> <target>Konfiguriere Filter</target> + <source>Customize columns</source> <target>Spalten anpassen</target> + <source>Global settings</source> <target>Globale Einstellungen</target> + <source>Synchronization Preview</source> <target>Synchronisationsvorschau</target> + <source>Find</source> <target>Suchen</target> + +<source>Select time span</source> +<target>Zeitspanne auswählen</target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -85,46 +126,64 @@ <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> </target> + <source><Symlink></source> <target><Symlink></target> + <source><Directory></source> <target><Verzeichnis></target> + <source>Size</source> <target>Größe</target> + <source>Date</source> <target>Datum</target> + <source>Full path</source> <target>Absoluter Pfad</target> + <source>Filename</source> <target>Dateiname</target> + <source>Relative path</source> <target>Relativer Pfad</target> + <source>Directory</source> <target>Verzeichnis</target> + <source>Extension</source> <target>Dateiendung</target> + <source>Comparison Result</source> <target>Ergebnis des Vergleichs</target> + <source>Incompatible synchronization database format:</source> <target>Inkompatibles Datenbankformat:</target> + <source>Initial synchronization:</source> <target>Erstmalige Synchronisation:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>Eine der FreeFileSync Datenbankdateien existiert noch nicht:</target> + <source>Error reading from synchronization database:</source> <target>Fehler beim Lesen der Synchronisationsdatenbank:</target> + <source>Database files do not share a common synchronization session:</source> <target>Die Datenbankdateien enthalten keine gemeinsame Synchronisationssitzung:</target> + <source>An exception occurred!</source> <target>Eine Ausnahme ist aufgetreten!</target> -<source>Error deleting file:</source> -<target>Fehler beim Löschen der Datei:</target> + <source>Error reading file attributes:</source> <target>Fehler beim Lesen der Dateiattribute:</target> + <source>Waiting while directory is locked (%x)...</source> <target>Warte während Verzeichnis gesperrt ist (%x)...</target> + <source>Error setting directory lock:</source> <target>Fehler beim Setzen der Verzeichnissperre:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -133,14 +192,19 @@ <pluralform>1 Sek.</pluralform> <pluralform>%x Sek.</pluralform> </target> + <source>Info</source> <target>Info</target> + <source>Fatal Error</source> <target>Schwerer Fehler</target> + <source>Scanning:</source> <target>Suche Dateien:</target> + <source>Encoding extended time information: %x</source> <target>Speichere erweiterte Zeitinformation: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> @@ -149,14 +213,19 @@ <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </target> + <source>Invalid FreeFileSync config file!</source> <target>Ungültige FreeFileSync Konfigurationsdatei!</target> + <source>File does not exist:</source> <target>Die Datei existiert nicht:</target> + <source>Error parsing configuration file:</source> <target>Fehler beim Auswerten der Konfigurationsdatei:</target> + <source>/sec</source> <target>/s</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -165,6 +234,7 @@ <pluralform>1 Min.</pluralform> <pluralform>%x Min.</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -173,6 +243,7 @@ <pluralform>1 Stunde</pluralform> <pluralform>%x Stunden</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -181,28 +252,40 @@ <pluralform>1 Tag</pluralform> <pluralform>%x Tage</pluralform> </target> + <source>S&ave configuration...</source> <target>Konfiguration s&peichern...</target> + <source>&Load configuration...</source> <target>Konfiguration &laden...</target> + <source>&Quit</source> <target>&Beenden</target> + <source>&File</source> <target>&Datei</target> + <source>&Content</source> <target>&Inhalt</target> + <source>&About...</source> <target>&Ãœber...</target> + <source>&Help</source> <target>&Hilfe</target> + <source>Usage:</source> <target>Verwendung:</target> + <source>1. Select directories to monitor.</source> <target>1. Zu überwachende Verzeichnisse wählen.</target> + <source>2. Enter a command line.</source> <target>2. Eine Befehlszeile angeben.</target> + <source>3. Press 'Start'.</source> <target>3. 'Start' drücken.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -213,310 +296,461 @@ Die Befehlszeile wird ausgeführt wenn: - alle Verzeichnisse verfügbar werden (z.B. beim Anschluss eines USB Sticks) - Dateien innerhalb dieser Verzeichnisse oder Unterverzeichnisse geändert werden </target> + <source>Directories to watch</source> <target>Zu überwachende Verzeichnisse</target> + <source>Add folder</source> <target>Verzeichnis hinzufügen</target> + <source>Remove folder</source> <target>Verzeichnis entfernen</target> + <source>Select a folder</source> <target>Verzeichnis auswählen</target> + <source>Command line</source> <target>Befehlszeile</target> + <source>Minimum Idle Time [seconds]</source> <target>Minimale Ruhezeit [Sekunden]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>Ruhezeit zwischen Erkennung der letzten Änderung und Aufrufen der Kommandozeile in Sekunden</target> + <source>Start</source> <target>Start</target> + <source>(Build: %x)</source> <target>(Build: %x)</target> + <source>RealtimeSync configuration</source> <target>RealtimeSync Konfiguration</target> + <source>File already exists. Overwrite?</source> <target>Die Datei existiert bereits. Ãœberschreiben?</target> + <source>&Restore</source> <target>&Wiederherstellen</target> + <source>&Exit</source> <target>&Beenden</target> + <source>Monitoring active...</source> <target>Ãœberwachung aktiv...</target> + <source>Waiting for missing directories...</source> <target>Warte auf fehlende Verzeichnisse...</target> + <source>A directory input field is empty.</source> <target>Ein Verzeichniseingabefeld ist leer.</target> + <source>Drag && drop</source> <target>Drag && Drop</target> + <source>Could not initialize directory monitoring:</source> <target>Die Verzeichnisüberwachung konnte nicht gestartet werden:</target> + <source>Error when monitoring directories.</source> <target>Fehler beim Ãœberwachen der Verzeichnisse.</target> + <source>Conversion error:</source> <target>Fehler bei Konvertierung:</target> + +<source>Error deleting file:</source> +<target>Fehler beim Löschen der Datei:</target> + <source>Error moving file:</source> <target>Fehler beim Verschieben der Datei:</target> + <source>Target file already existing!</source> <target>Die Zieldatei existiert bereits!</target> + <source>Error moving directory:</source> <target>Fehler beim Verschieben des Verzeichnisses:</target> + <source>Target directory already existing!</source> <target>Zielverzeichnis existiert bereits!</target> + <source>Error deleting directory:</source> <target>Fehler beim Löschen des Verzeichnisses:</target> + <source>Error changing modification time:</source> <target>Fehler beim Setzen der Dateiänderungszeit:</target> + <source>Error loading library function:</source> <target>Fehler beim Laden der Bibliotheksfunktion:</target> + <source>Error reading security context:</source> <target>Fehler beim Lesen des Sicherheitskontextes:</target> + <source>Error writing security context:</source> <target>Fehler beim Schreiben des Sicherheitskontextes:</target> + <source>Error copying file permissions:</source> <target>Fehler beim Kopieren der Dateiberechtigungen:</target> + <source>Error creating directory:</source> <target>Fehler beim Erstellen des Verzeichnisses:</target> + <source>Error copying symbolic link:</source> <target>Fehler beim Kopieren des Symbolischen Links:</target> + <source>Error copying file:</source> <target>Fehler beim Kopieren der Datei:</target> + <source>Error opening file:</source> <target>Fehler beim Öffnen der Datei:</target> + <source>Error writing file:</source> <target>Fehler beim Schreiben der Datei:</target> + <source>Error reading file:</source> <target>Fehler beim Lesen der Datei:</target> + <source>Operation aborted!</source> <target>Vorgang abgebrochen!</target> + <source>Endless loop when traversing directory:</source> <target>Endlosschleife beim Lesen des Verzeichnisses:</target> + <source>Error traversing directory:</source> <target>Fehler beim Durchsuchen des Verzeichnisses:</target> + <source>Windows Error Code %x:</source> <target>Windows Fehlercode %x:</target> + <source>Linux Error Code %x:</source> <target>Linux Fehlercode %x:</target> + <source>Error setting privilege:</source> <target>Fehler beim Setzen des Privilegs:</target> + <source>Error moving to Recycle Bin:</source> <target>Fehler beim Verschieben in den Papierkorb:</target> + <source>Could not load a required DLL:</source> <target>Eine benötigte DLL konnte nicht geladen werden:</target> + <source>Error writing to synchronization database:</source> <target>Fehler beim Schreiben der Synchronisationsdatenbank:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>Fehler beim Starten des Volumenschattenkopie-Dienstes!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target>Fehler beim Zugriff auf den Volumenschattenkopiedienst!</target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>Das Erstellen von Schattenkopien unter WOW64 wird nicht unterstützt. Bitte benutzen Sie die FreeFileSync 64-Bit Version.</target> + <source>Could not determine volume name for file:</source> <target>Der Laufwerksname für folgende Datei konnte nicht ermittelt werden:</target> + <source>Volume name %x not part of filename %y!</source> <target>Laufwerksname %x ist kein Teil des Dateinamens %y!</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>Die folgenden XML Knoten konnten nicht gelesen werden:</target> + <source>Logging</source> <target>Protokoll</target> + <source>FreeFileSync batch file</source> <target>FreeFileSync Batchdatei</target> + <source>FreeFileSync configuration</source> <target>FreeFileSync Konfiguration</target> + <source>FreeFileSync Batch Job</source> <target>FreeFileSync Batch-Job</target> + <source>Unable to create logfile!</source> <target>Die Protokolldatei konnte nicht erstellt werden!</target> + <source>Batch execution</source> <target>Batchlauf</target> + <source>Log-messages:</source> <target>Meldungen:</target> + <source>Stop</source> <target>Stop</target> + <source>Total time:</source> <target>Gesamtzeit:</target> + <source>Synchronization aborted!</source> <target>Synchronisation abgebrochen!</target> + <source>Synchronization completed with errors!</source> <target>Synchronisation mit Fehlern abgeschlossen!</target> + <source>Synchronization completed successfully!</source> <target>Synchronisation erfolgreich abgeschlossen!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>"Wechseln" öffnet FreeFileSync in der graphischen Ansicht.</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>Wechsle in die graphische Ansicht...</target> + <source>Unable to connect to sourceforge.net!</source> <target>Es konnte keine Verbindung zu sourceforge.net aufgebaut werden!</target> + <source>A newer version of FreeFileSync is available:</source> <target>Eine neuere Version von FreeFileSync ist verfügbar:</target> + <source>Download now?</source> <target>Jetzt herunterladen?</target> + <source>Information</source> <target>Information</target> + <source>FreeFileSync is up to date!</source> <target>FreeFileSync ist auf dem neuesten Stand!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>Soll FreeFileSync automatisch jede Woche nach Aktualisierungen suchen?</target> + <source>(Requires an Internet connection!)</source> <target>(Eine Internetverbindung wird benötigt!)</target> + <source>1. &Compare</source> <target>1. &Vergleichen</target> + <source>2. &Synchronize...</source> <target>2. &Synchronisieren...</target> + <source>S&witch view</source> <target>Ansicht &wechseln</target> + <source>&New</source> <target>&Neu</target> + <source>&Program</source> <target>&Programm</target> + <source>&Language</source> <target>&Sprache</target> + <source>&Global settings...</source> <target>&Globale Einstellungen...</target> + <source>&Create batch job...</source> <target>&Batch-Job erstellen...</target> + <source>&Export file list...</source> <target>Dateiliste e&xportieren...</target> + <source>&Advanced</source> <target>&Erweitert</target> + <source>&Check for new version</source> <target>&Auf neuere Version prüfen</target> + <source>Compare</source> <target>Vergleichen</target> + <source>Compare both sides</source> <target>Beide Seiten vergleichen</target> + <source>&Abort</source> <target>&Abbrechen</target> + <source>Synchronize...</source> <target>Synchronisieren</target> + <source>Start synchronization</source> <target>Synchronisation starten</target> -<source>Swap sides</source> -<target>Seiten vertauschen</target> + <source>Add folder pair</source> <target>Verzeichnispaar hinzufügen</target> + <source>Remove folder pair</source> <target>Verzeichnispaar entfernen</target> + +<source>Swap sides</source> +<target>Seiten vertauschen</target> + <source>Save current configuration to file</source> <target>Aktuelle Konfiguration in Datei speichern</target> + <source>Load configuration from file</source> <target>Konfiguration aus Datei laden</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>Zuletzt benutzte Konfigurationen (Entf-Taste löscht Einträge)</target> + <source>Hide excluded items</source> <target>Ausgeschlossene Elemente verstecken</target> + <source>Hide filtered or temporarily excluded files</source> <target>Gefilterte oder temporär ausgeschlossene Dateien ausblenden</target> + <source>Number of files and directories that will be created</source> <target>Anzahl der zu erstellenden Dateien und Verzeichnisse</target> + <source>Number of files that will be overwritten</source> <target>Anzahl der zu überschreibenden Dateien</target> + <source>Number of files and directories that will be deleted</source> <target>Anzahl der zu löschenden Dateien und Verzeichnisse</target> + <source>Total amount of data that will be transferred</source> <target>Gesamtmenge der zu übertragenden Daten</target> -<source>Left</source> -<target>Links</target> -<source>Right</source> -<target>Rechts</target> + <source>Batch job</source> <target>Batch-Job</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>Erzeuge eine Batchdatei für die automatisierte Synchronisation. Um den Batchmodus zu starten, einfach auf die Datei doppelklicken oder über die Befehlszeile ausführen: FreeFileSync.exe <Batchdatei>. Dies kann auch in den Taskplaner des Betriebssystems eingetragen werden.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target>Erzeuge eine Batchdatei für die automatisierte Synchronisation. Um den Batchmodus zu starten, einfach auf die Datei doppelklicken oder über die Befehlszeile ausführen: FreeFileSync.exe <ffs_batch-Datei>. Dies kann auch in den Taskplaner des Betriebssystems eingetragen werden.</target> + <source>Help</source> <target>Hilfe</target> + <source>Filter files</source> <target>Dateien filtern</target> + <source>Error handling</source> <target>Fehlerbehandlung</target> + +<source>Left</source> +<target>Links</target> + +<source>Right</source> +<target>Rechts</target> + <source>Overview</source> <target>Ãœbersicht</target> + <source>Status feedback</source> <target>Statusrückmeldung</target> + <source>Run minimized</source> <target>Minimiert ausführen</target> + <source>Maximum number of logfiles:</source> <target>Maximale Anzahl an Logdateien:</target> + <source>Select logfile directory:</source> <target>Verzeichnis für Logdatei wählen:</target> + <source>Batch settings</source> <target>Batch Einstellungen</target> + <source>&Save</source> <target>&Speichern</target> + <source>&Load</source> <target>&Laden</target> + <source>&Cancel</source> <target>&Abbrechen</target> + <source>Elements found:</source> <target>Gefundene Elemente:</target> + <source>Elements remaining:</source> <target>Verbleibende Elemente:</target> + <source>Speed:</source> <target>Geschwindigkeit:</target> + <source>Time remaining:</source> <target>Verbleibende Zeit:</target> + <source>Time elapsed:</source> <target>Vergangene Zeit:</target> + <source>Operation:</source> <target>Vorgang:</target> + <source>Select variant:</source> <target>Variante auswählen:</target> + <source><Automatic></source> <target><Automatik></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>Identifiziere und propagiere Änderungen auf beiden Seiten mit Hilfe einer Datenbank. Löschungen und Konflikte werden automatisch erkannt.</target> + <source>Mirror ->></source> <target>Spiegeln ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Spiegelkopie des linken Verzeichnisses erstellen. Das rechte Verzeichnis wird dem linken exakt angeglichen.</target> + <source>Update -></source> <target>Aktualisieren -></target> + <source>Copy new or updated files to right folder.</source> <target>Neue oder aktualisierte Dateien vom linken in das rechte Verzeichnis kopieren.</target> + <source>Custom</source> <target>Eigene</target> + <source>Configure your own synchronization rules.</source> <target>Eigene Synchronisationsregeln definieren.</target> + <source>Deletion handling</source> <target>Behandlung von Löschungen</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>Konfiguration</target> + <source>Category</source> <target>Kategorie</target> + <source>Action</source> <target>Aktion</target> + <source>File/folder exists on left side only</source> <target>Datei/Ordner existiert nur links</target> + <source>File/folder exists on right side only</source> <target>Datei/Ordner existiert nur rechts</target> + <source>Left file is newer</source> <target>Linke Datei ist neuer</target> + <source>Right file is newer</source> <target>Rechte Datei ist neuer</target> + <source>Files have different content</source> <target>Dateien haben unterschiedlichen Inhalt</target> + <source>Conflict/file cannot be categorized</source> <target>Konflikt/Datei, die nicht eingeordnet werden kann</target> + <source>Compare by...</source> <target>Vergleichen nach...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> <target> Dateien gelten als gleich, wenn - - die Größe - Datum und Uhrzeit der letzten Änderung + - die Größe gleich sind </target> -<source>File size and date</source> -<target>Dateigröße und -datum</target> + +<source>File time and size</source> +<target>Dateizeit und -größe</target> + <source> Files are found equal if - file content @@ -527,92 +761,85 @@ Dateien gelten als gleich, wenn - der Inhalt gleich ist </target> + <source>File content</source> <target>Dateiinhalt</target> + <source>Symbolic Link handling</source> <target>Behandlung Symbolischer Links</target> + <source>Synchronizing...</source> <target>Synchronisiere...</target> + <source>Elements processed:</source> <target>Verarbeitete Elemente:</target> + <source>&Pause</source> <target>&Pause</target> -<source>Compare by "File size and date"</source> -<target>Vergleich nach "Dateigröße und -datum"</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>Diese Variante identifiziert zwei gleichnamige Dateien als gleich, wenn sie die gleiche Dateigröße haben UND der Zeitpunkt der letzten Änderung derselbe ist.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>Wenn der Vergleich mit dieser Option gestartet wurde, wird folgender Entscheidungsbaum abgearbeitet:</target> -<source>As a result the files are separated into the following categories:</source> -<target>Das Ergebnis ist eine Aufteilung in folgende Kategorien:</target> -<source>- equal</source> -<target>- gleich</target> -<source>- left newer</source> -<target>- links neuer</target> -<source>- right newer</source> -<target>- rechts neuer</target> -<source>- exists left only</source> -<target>- existiert nur links</target> -<source>- exists right only</source> -<target>- existiert nur rechts</target> -<source>- conflict (same date, different size)</source> -<target>- Konflikt (gleiches Datum, unterschiedliche Größe)</target> -<source>Compare by "File content"</source> -<target>Vergleich nach "Dateiinhalt"</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. - -With this option enabled the decision tree is smaller: -</source> -<target> -Wie der Name andeutet, werden zwei Dateien mit gleichem Namen genau dann als gleich angesehen, wenn sie den gleichen Dateiinhalt haben. Diese Einstellung ist eher für Konsistenzprüfungen geeignet als für Backup-Operationen. Aus diesem Grund wird der Zeitpunkt der letzten Änderung der Dateien nicht berücksichtigt. -Der Entscheidungsbaum ist in diesem Fall kleiner: -</target> -<source>- different</source> -<target>- verschieden</target> <source>Source code written in C++ utilizing:</source> <target>Sourcecode in C++ geschrieben mit Hilfe von:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>Vielen Dank für die Lokalisation von FreeFileSync an:</target> + <source>Feedback and suggestions are welcome at:</source> <target>Feedback und Vorschläge sind willkommen unter:</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync auf Sourceforge</target> + <source>Homepage</source> <target>Homepage</target> + <source>If you like FFS</source> <target>FFS unterstützen</target> + <source>Donate with PayPal</source> <target>Mit PayPal spenden</target> + <source>Email</source> <target>Email</target> + <source>Report translation error</source> <target>Ãœbersetzungsfehler melden</target> + <source>Published under the GNU General Public License:</source> <target>Veröffentlicht unter der GNU General Public License:</target> + <source>Ignore subsequent errors</source> <target>Nachfolgende Fehler ignorieren</target> + <source>Hide further error messages during the current process</source> <target>Weitere Fehlermeldungen während des laufenden Prozesses ausblenden</target> + <source>&Ignore</source> <target>&Ignorieren</target> + <source>&Retry</source> <target>&Wiederholen</target> + <source>Do not show this dialog again</source> <target>Diesen Dialog nicht mehr anzeigen</target> + <source>&Switch</source> <target>&Wechseln</target> + <source>&Yes</source> <target>&Ja</target> + <source>&No</source> <target>&Nein</target> + <source>Delete on both sides</source> <target>Auf beiden Seiten löschen</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>Lösche auf beiden Seiten, auch wenn die Datei nur auf einer Seite markiert ist</target> + <source>Use Recycle Bin</source> <target>Papierkorb verwenden</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -621,16 +848,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire Für die Synchronisation werden nur Dateien/Verzeichnisse berücksichtigt, die zu allen Filtereinstellungen passen. Achtung: Der Namensfilter muss relativ zu den Hauptsynchronisationsverzeichnissen eingegeben werden. </target> + <source>Hints:</source> <target>Tipps:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. Relative Datei- oder Verzeichnisnamen getrennt durch ';' oder eine Neuzeile eingeben.</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. Die Platzhalter '*' und '?' werden unterstützt.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. Dateien können direkt über das Kontextmenü im Hauptfenster ausgeschlossen werden.</target> + <source>Example</source> <target>Beispiel</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -639,30 +872,40 @@ Exclude: \stuff\temp\* Einschließen: *.doc;*.zip;*.exe Ausschließen: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>Alle .doc, .zip und .exe Dateien mit Ausnahme des Unterordners "temp" werden synchronisiert.</target> + <source>Include</source> <target>Einschließen</target> + <source>Exclude</source> <target>Ausschließen</target> -<source>Select time span:</source> -<target>Zeitspanne auswählen:</target> -<source>Minimum file size:</source> -<target>Minimale Dateigröße:</target> -<source>Maximum file size:</source> -<target>Maximale Dateigröße:</target> + +<source>Minimum file size</source> +<target>Minimale Dateigröße</target> + +<source>Maximum file size</source> +<target>Maximale Dateigröße</target> + <source>&Default</source> <target>&Standard</target> + <source>Move column up</source> <target>Spalte nach oben verschieben</target> + <source>Move column down</source> <target>Spalte nach unten verschieben</target> -<source>Transactional File Copy</source> + +<source>Transactional file copy</source> <target>Kopiere Dateien als Transaktion</target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> -<target>Dateien zuerst temporär speichern (*.ffs_tmp) und dann umbenennen. Dadurch wird ein konsistenter Status auch im größten Fehlerfall sichergestellt.</target> +<target>Dateien zuerst temporär schreiben (*.ffs_tmp), anschließend umbenennen. Dadurch wird ein konsistenter Status auch im größten Fehlerfall sichergestellt.</target> + <source>Copy locked files</source> <target>Gesperrte Dateien kopieren</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -671,8 +914,10 @@ Copy shared or locked files using Volume Shadow Copy Service Kopiere gesperrte Dateien mit Hilfe des Volumenschattenkopie-Dienstes (Benötigt Administratorrechte) </target> -<source>Copy filesystem permissions</source> -<target>Dateisystemberechtigungen kopieren</target> + +<source>Copy file access permissions</source> +<target>Dateizugriffsberechtigungen kopieren</target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -681,138 +926,205 @@ Transfer file and directory permissions Ãœbertrage Datei- und Verzeichnisberechtigungen (Benötigt Administratorrechte) </target> + <source>Hidden dialogs:</source> <target>Versteckte Dialoge:</target> + <source>Reset</source> <target>Zurücksetzen</target> + <source>Show hidden dialogs</source> <target>Zeige versteckte Dialoge</target> + <source>External applications</source> <target>Externe Anwendungen</target> + <source>Description</source> <target>Beschreibung</target> + <source>Variant</source> <target>Variante</target> + <source>Statistics</source> <target>Statistiken</target> + <source>Find what:</source> <target>Suchen nach:</target> + <source>Match case</source> <target>Groß-/Kleinschreibung</target> + <source>&Find next</source> <target>&Weitersuchen</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>Verbliebene Elemente können nochmals synchronisiert werden (OHNE dass ein erneuter Vergleich notwendig ist)!</target> -<source>Batch file created successfully!</source> -<target>Batchdatei wurde erfolgreich erstellt!</target> + <source>Main bar</source> <target>Hauptleiste</target> + <source>Folder pairs</source> <target>Verzeichnispaare</target> + <source>Select view</source> <target>Ansicht auswählen</target> + <source>Set direction:</source> <target>Setze Richtung:</target> + <source>Exclude temporarily</source> <target>Temporär ausschließen</target> + <source>Include temporarily</source> <target>Temporär einschließen</target> + <source>Exclude via filter:</source> <target>Ãœber Filter ausschließen:</target> + <source><multiple selection></source> <target><Mehrfachauswahl></target> + <source>D-Click</source> <target>D-Klick</target> + <source>Delete</source> <target>Löschen</target> + <source>Customize...</source> <target>Anpassen...</target> + +<source>Select time span...</source> +<target>Zeitspanne auswählen...</target> + <source>Auto-adjust columns</source> <target>Spalten automatisch ausrichten</target> + <source>Include all rows</source> <target>Alle Zeilen einschließen</target> + <source>Exclude all rows</source> <target>Alle Zeilen ausschließen</target> + <source>Reset view</source> <target>Ansicht zurücksetzen</target> + <source>Show "%x"</source> <target>Zeige "%x"</target> + <source><Last session></source> <target><Letzte Sitzung></target> + <source>Configuration saved!</source> <target>Konfiguration gespeichert!</target> + <source>Save changes to current configuration?</source> <target>Änderungen der aktuellen Konfiguration sichern?</target> + <source>Configuration loaded!</source> <target>Konfiguration geladen!</target> + <source>Folder Comparison and Synchronization</source> <target>Verzeichnisvergleich und Synchronisation</target> + <source>Hide files that exist on left side only</source> <target>Nur links existierende Dateien ausblenden</target> + <source>Show files that exist on left side only</source> <target>Nur links existierende Dateien anzeigen</target> + <source>Hide files that exist on right side only</source> <target>Nur rechts existierende Dateien ausblenden</target> + <source>Show files that exist on right side only</source> <target>Nur rechts existierende Dateien anzeigen</target> + <source>Hide files that are newer on left</source> <target>Auf beiden Seiten existierende Dateien ausblenden; linke Datei ist neuer</target> + <source>Show files that are newer on left</source> <target>Auf beiden Seiten existierende Dateien anzeigen; linke Datei ist neuer</target> + <source>Hide files that are newer on right</source> <target>Auf beiden Seiten existierende Dateien ausblenden; rechte Datei ist neuer</target> + <source>Show files that are newer on right</source> <target>Auf beiden Seiten existierende Dateien anzeigen; rechte Datei ist neuer</target> + <source>Hide files that are equal</source> <target>Gleiche Dateien ausblenden</target> + <source>Show files that are equal</source> <target>Gleiche Dateien anzeigen</target> + <source>Hide files that are different</source> <target>Ungleiche Dateien ausblenden</target> + <source>Show files that are different</source> <target>Ungleiche Dateien anzeigen</target> + <source>Hide conflicts</source> <target>Konflikte ausblenden</target> + <source>Show conflicts</source> <target>Konflikte zeigen</target> + <source>Hide files that will be created on the left side</source> <target>Dateien die links erstellt werden ausblenden</target> + <source>Show files that will be created on the left side</source> <target>Dateien die links erstellt werden anzeigen</target> + <source>Hide files that will be created on the right side</source> <target>Dateien die rechts erstellt werden ausblenden</target> + <source>Show files that will be created on the right side</source> <target>Dateien die rechts erstellt werden anzeigen</target> + <source>Hide files that will be deleted on the left side</source> <target>Dateien die links gelöscht werden ausblenden</target> + <source>Show files that will be deleted on the left side</source> <target>Dateien die links gelöscht werden anzeigen</target> + <source>Hide files that will be deleted on the right side</source> <target>Dateien die rechts gelöscht werden ausblenden</target> + <source>Show files that will be deleted on the right side</source> <target>Dateien die rechts gelöscht werden anzeigen</target> + <source>Hide files that will be overwritten on left side</source> <target>Dateien die links überschrieben werden ausblenden</target> + <source>Show files that will be overwritten on left side</source> <target>Dateien die links überschrieben werden anzeigen</target> + <source>Hide files that will be overwritten on right side</source> <target>Dateien die rechts überschrieben werden ausblenden</target> + <source>Show files that will be overwritten on right side</source> <target>Dateien die rechts überschrieben werden anzeigen</target> + <source>Hide files that won't be copied</source> <target>Dateien die nicht kopiert werden ausblenden</target> + <source>Show files that won't be copied</source> <target>Dateien die nicht kopiert werden anzeigen</target> + <source>All directories in sync!</source> <target>Alle Verzeichnisse sind synchron!</target> + <source>Please run a Compare first before synchronizing!</source> <target>Vor der Synchronisation bitte zuerst einen Vergleich ausführen!</target> + <source>Comma separated list</source> <target>Kommagetrennte Liste</target> + <source>Legend</source> <target>Legende</target> + <source>File list exported!</source> <target>Dateiliste exportiert!</target> + +<source>Batch file created successfully!</source> +<target>Batchdatei wurde erfolgreich erstellt!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -821,6 +1133,7 @@ Transfer file and directory permissions <pluralform>Objekt erfolgreich gelöscht!</pluralform> <pluralform>%x Objekte erfolgreich gelöscht!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -829,6 +1142,7 @@ Transfer file and directory permissions <pluralform>1 Verzeichnis</pluralform> <pluralform>%x Verzeichnisse</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -837,6 +1151,7 @@ Transfer file and directory permissions <pluralform>1 Datei</pluralform> <pluralform>%x Dateien</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -845,72 +1160,97 @@ Transfer file and directory permissions <pluralform>%x von 1 Zeile zur Ansicht</pluralform> <pluralform>%x von %y Zeilen zur Ansicht</pluralform> </target> + <source>Scanning...</source> <target>Suche Dateien...</target> + <source>Comparing content...</source> <target>Vergleiche Dateiinhalt...</target> + <source>Paused</source> <target>Angehalten</target> + <source>Aborted</source> <target>Abgebrochen</target> + <source>Completed</source> <target>Fertig</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>Abbruch initiiert: Warte, bis aktuelle Operation beendet ist...</target> + <source>Continue</source> <target>Fortfahren</target> + <source>Pause</source> <target>Pause</target> + <source>Cannot find %x</source> <target>%x wurde nicht gefunden.</target> -<source>DECISION TREE</source> -<target>ENTSCHEIDUNGSBAUM</target> -<source>file exists on both sides</source> -<target>Datei existiert auf beiden Seiten</target> -<source>on one side only</source> -<target>nur auf einer Seite</target> -<source>same date</source> -<target>gleiches Datum</target> -<source>different date</source> -<target>unterschiedliches Datum</target> + <source>Inactive</source> <target>Inaktiv</target> -<source>Second</source> -<target>Sekunde</target> -<source>Minute</source> -<target>Minute</target> -<source>Hour</source> -<target>Stunde</target> -<source>Day</source> -<target>Tag</target> + +<source>Last x hours</source> +<target>Letzte x Stunden</target> + +<source>Today</source> +<target>Heute</target> + +<source>This week</source> +<target>Diese Woche</target> + +<source>This month</source> +<target>Dieser Monat</target> + +<source>This year</source> +<target>Dieses Jahr</target> + <source>Byte</source> <target>Byte</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>Filter: Alle Verzeichnispaare</target> + <source>Filter: Single pair</source> <target>Filter: Einzelnes Verzeichnispaar</target> + <source>Ignore</source> <target>Ignorieren</target> + <source>Direct</source> <target>Direkt</target> + <source>Follow</source> <target>Folgen</target> + +<source>Copy NTFS permissions</source> +<target>NTFS Berechtigungen kopieren</target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>Integriert externe Anwendungen in das Kontextmenü. Die folgenden Makros stehen zur Verfügung:</target> + <source>- full file or directory name</source> <target>- kompletter Datei oder Verzeichnisname</target> + <source>- directory part only</source> <target>- nur Verzeichnisanteil</target> + <source>- Other side's counterpart to %name</source> <target>- Entsprechung der anderen Seite zu %name</target> + <source>- Other side's counterpart to %dir</source> <target>- Entsprechung der anderen Seite zu %dir</target> + <source>Restore all hidden dialogs?</source> -<target>Alle versteckten Dialoge wieder anzeigen?</target> +<target>Alle versteckten Dialoge wieder sichtbar machen?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -919,6 +1259,7 @@ Transfer file and directory permissions <pluralform>Soll das folgende Element wirklich in den Papierkorb verschoben werden?</pluralform> <pluralform>Sollen die folgenden %x Elemente wirklich in den Papierkorb verschoben werden?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -927,139 +1268,211 @@ Transfer file and directory permissions <pluralform>Soll das folgende Element wirklich gelöscht werden?</pluralform> <pluralform>Sollen die folgenden %x Elemente wirklich gelöscht werden?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>Als unbehandelten Konflikt belassen</target> + <source>Delete permanently</source> <target>Endgültig löschen</target> + <source>Delete or overwrite files permanently</source> <target>Dateien endgültig löschen oder überschreiben</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>Papierkorb für zu löschende oder zu überschreibende Dateien nutzen</target> + <source>Versioning</source> <target>Versionierung</target> + <source>Move files into a time-stamped subdirectory</source> <target>Verschiebe Dateien in ein Unterverzeichnis mit Zeitstempel</target> -<source>Cannot determine sync-direction:</source> -<target>Die Synchronisationsrichtung konnte nicht bestimmt werden:</target> -<source>Filter settings have changed!</source> -<target>Die Filtereinstellungen wurden geändert!</target> + <source>Both sides have changed since last synchronization!</source> <target>Beide Seiten wurden seit der letzten Synchronisation verändert!</target> + +<source>Cannot determine sync-direction:</source> +<target>Die Synchronisationsrichtung konnte nicht bestimmt werden:</target> + <source>No change since last synchronization!</source> <target>Keine Änderungen seit der letzten Synchronisation!</target> + +<source>Filter settings have changed!</source> +<target>Die Filtereinstellungen wurden geändert!</target> + <source>The file was not processed by last synchronization!</source> <target>Die Datei wurde in der letzten Synchronisation nicht verarbeitet!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>Das geplante Löschen des Verzeichnisses steht in Konflikt mit seinen Unterverzeichnissen und -dateien</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Setze Standardwerte für Synchronisationsrichtungen: Alte Dateien werden durch neuere überschrieben.</target> + <source>The file does not contain a valid configuration:</source> <target>Die Datei enthält keine gültige Konfiguration:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>Dieser Fehler kann ignoriert werden, um das Verzeichnis als leer anzusehen.</target> + <source>Directory does not exist:</source> <target>Das Verzeichnis existiert nicht:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Die Verzeichnisse sind voneinander abhängig! Achtung beim Festlegen der Synchronisationseinstellungen:</target> + <source>Comparing content of files %x</source> <target>Vergleiche Inhalt der Dateien %x</target> + <source>Memory allocation failed!</source> <target>Speicherallokation fehlgeschlagen!</target> + <source>File %x has an invalid date!</source> <target>Die Datei %x hat ein ungültiges Datum!</target> + <source>Conflict detected:</source> <target>Ein Konflikt wurde erkannt:</target> + <source>Files %x have the same date but a different size!</source> <target>Die Dateien %x haben dasselbe Datum, aber unterschiedliche Größen!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>Die Symbolischen Links %x haben dasselbe Datum, aber ein unterschiedliches Ziel!</target> + <source>Comparing files by content failed.</source> <target>Vergleich nach Dateiinhalt ist fehlgeschlagen.</target> + <source>Generating file list...</source> <target>Erzeuge Dateiliste...</target> + <source>Multiple...</source> <target>Verschiedene...</target> + <source>Both sides are equal</source> <target>Beide Seiten sind gleich</target> + <source>Files/folders differ in attributes only</source> <target>Dateien/Ordner unterscheiden sich nur in Attributen</target> + <source>Copy new file/folder to left</source> <target>Kopiere neue Datei nach links</target> + <source>Copy new file/folder to right</source> <target>Kopiere neue Datei nach rechts</target> + <source>Delete left file/folder</source> <target>Lösche linke Datei</target> + <source>Delete right file/folder</source> <target>Lösche rechte Datei</target> + <source>Overwrite left file/folder with right one</source> <target>Ãœberschreibe linke Datei mit rechter</target> + <source>Overwrite right file/folder with left one</source> <target>Ãœberschreibe rechte Datei mit linker</target> + <source>Do nothing</source> <target>Nichts tun</target> + <source>Copy file attributes only to left</source> <target>Kopiere nur die Dateiattribute nach links</target> + <source>Copy file attributes only to right</source> <target>Kopiere nur die Dateiattribute nach rechts</target> + <source>Deleting file %x</source> <target>Lösche Datei %x</target> -<source>Deleting Symbolic Link %x</source> -<target>Lösche Symbolischen Link %x</target> + <source>Deleting folder %x</source> <target>Lösche Verzeichnis %x</target> -<source>Moving %x to Recycle Bin</source> -<target>Verschiebe %x in den Papierkorb</target> -<source>Moving file %x to user-defined directory %y</source> -<target>Verschiebe Datei %x in benutzerdefiniertes Verzeichnis %y</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>Verschiebe Ordner %x in benutzerdefiniertes Verzeichnis %y</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>Verschiebe Symbolischen Link %x in benutzerdefiniertes Verzeichnis %y</target> -<source>Copying new file %x to %y</source> -<target>Kopiere neue Datei %x nach %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>Kopiere neuen Symbolischen Link %x nach %y</target> -<source>Overwriting file %x in %y</source> -<target>Ãœberschreibe Datei %x in %y</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>Ãœberschreibe Symbolischen Link %x in %y</target> + +<source>Deleting symbolic link %x</source> +<target>Lösche Symbolischen Link %x</target> + +<source>Moving file %x to recycle bin</source> +<target>Verschiebe Datei %x in den Papierkorb</target> + +<source>Moving folder %x to recycle bin</source> +<target>Verschiebe Verzeichnis %x in den Papierkorb</target> + +<source>Moving symbolic link %x to recycle bin</source> +<target>Verschiebe Symbolischen Link %x in den Papierkorb</target> + +<source>Moving file %x to %y</source> +<target>Verschiebe Datei %x nach %y</target> + +<source>Moving folder %x to %y</source> +<target>Verschiebe Verzeichnis %x nach %y</target> + +<source>Moving symbolic link %x to %y</source> +<target>Verschiebe Symbolischen Link %x nach %y</target> + +<source>Creating file %x</source> +<target>Erstelle Datei %x</target> + +<source>Creating symbolic link %x</source> +<target>Erstelle Symbolischen Link %x</target> + <source>Creating folder %x</source> <target>Erstelle Verzeichnis %x</target> + +<source>Overwriting file %x</source> +<target>Ãœberschreibe Datei %x</target> + +<source>Overwriting symbolic link %x</source> +<target>Ãœberschreibe Symbolischen Link %x</target> + <source>Verifying file %x</source> <target>Verifiziere Datei %x</target> + <source>Updating attributes of %x</source> <target>Aktualisiere Attribute von %x</target> -<source>Source directory does not exist anymore:</source> -<target>Quellverzeichnis existiert nicht mehr:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>Nichts zu synchronisieren gemäß den aktuellen Einstellungen!</target> + <source>Target directory name must not be empty!</source> <target>Der Zielverzeichnisname darf nicht leer sein!</target> + <source>User-defined directory for deletion was not specified!</source> <target>Kein benutzerdefiniertes Verzeichnis zum Löschen angegeben!</target> + +<source>Source directory does not exist anymore:</source> +<target>Quellverzeichnis existiert nicht mehr:</target> + <source>Unresolved conflicts existing!</source> <target>Es existieren ungelöste Konflikte!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>Die Konflikte können ignoriert und die Synchronisation fortgesetzt werden.</target> + <source>Significant difference detected:</source> <target>Ein erheblicher Unterschied wurde festgestellt:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>Mehr als 50% aller Dateien werden kopiert oder gelöscht!</target> + <source>Not enough free disk space available in:</source> <target>Nicht genügend freier Speicher verfügbar unter:</target> + <source>Free disk space required:</source> <target>Benötigter freier Speicherplatz:</target> + <source>Free disk space available:</source> <target>Verfügbarer freier Speicherplatz:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> <target>Der Papierkorb ist auf nachfolgenden Verzeichnissen nicht verfügbar! Die Dateien werden stattdessen permanent gelöscht:</target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>Es wird ein Verzeichnis verändert werden, das Teil mehrerer Verzeichnispaare ist! Bitte die Synchronisationseinstellungen prüfen!</target> + <source>Processing folder pair:</source> <target>Bearbeite Verzeichnispaar:</target> + <source>Generating database...</source> <target>Erzeuge Synchronisationsdatenbank...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>Nichts zu synchronisieren gemäß den aktuellen Einstellungen!</target> + <source>Error copying locked file %x!</source> <target>Fehler beim Kopieren der gesperrten Datei %x!</target> + <source>Data verification error: Source and target file have different content!</source> <target>Verifizierungsfehler: Quell- und Zieldatei haben unterschiedlichen Inhalt!</target> + diff --git a/BUILD/Languages/greek.lng b/BUILD/Languages/greek.lng index df546ef8..07f01fd2 100644 --- a/BUILD/Languages/greek.lng +++ b/BUILD/Languages/greek.lng @@ -9,74 +9,115 @@ <source>Searching for directory %x...</source> <target></target> + <source>Show in Explorer</source> <target>Εμφάνιση στην ΕξεÏεÏνηση</target> + <source>Open with default application</source> <target>Άνοιγμα με την Ï€ÏοεπιλεγμÎνη εφαÏμογή</target> + <source>Browse directory</source> <target>Αναζήτηση υποκαταλόγου</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - ΑυτοματοποιημÎνος ΣυγχÏονισμός</target> + <source>Browse</source> <target>Αναζήτηση</target> -<source>Invalid commandline: %x</source> -<target>ΕσφαλμÎνη εντολή: %x</target> + +<source>Invalid command line: %x</source> +<target></target> + <source>Error resolving symbolic link:</source> <target>Σφάλμα κατά την επίλυση του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î´ÎµÏƒÎ¼Î¿Ï:</target> -<source>Show popup</source> -<target>Εμφάνιση αναδυόμενου παÏάθυÏου</target> -<source>Show popup on errors or warnings</source> -<target>Εμφάνιση αναδυόμενου παÏάθυÏου σε σφάλματα ή Ï€Ïοειδοποιήσεις</target> + +<source>Show pop-up</source> +<target></target> + +<source>Show pop-up on errors or warnings</source> +<target></target> + <source>Ignore errors</source> <target>ΠαÏάβλεψη των σφαλμάτων</target> + <source>Hide all error and warning messages</source> <target>ΑπόκÏυψη όλων των σφαλμάτων και Ï€Ïοειδοποιήσεων</target> + <source>Exit instantly</source> <target>Άμεση Îξοδος</target> + <source>Abort synchronization immediately</source> <target>Άμεση ματαίωση του συγχÏονισμοÏ</target> + +<source>Select alternate comparison settings</source> +<target></target> + <source>Select alternate synchronization settings</source> <target>Επιλογή διαφοÏοποιημÎνων Ïυθμίσεων συγχÏονισμοÏ</target> + <source>No filter selected</source> <target>Δεν Îχει επιλεχθεί φίλτÏο</target> + <source>Filter is active</source> <target>Το φίλτÏο είναι ενεÏγό</target> -<source>Clear filter settings</source> -<target>ΔιαγÏαφή όλων των Ïυθμίσεων φίλτÏου</target> + <source>Remove alternate settings</source> <target>ΔιαγÏαφή των διαφοÏοποιημÎνων Ïυθμίσεων</target> + +<source>Clear filter settings</source> +<target>ΔιαγÏαφή όλων των Ïυθμίσεων φίλτÏου</target> + <source>Create a batch job</source> <target>ΔημιουÏγία μιας δÎσμης ενεÏγειών</target> + <source>Synchronization settings</source> <target>Ρυθμίσεις συγχÏονισμοÏ</target> + <source>Comparison settings</source> <target>Ρυθμίσεις σÏγκÏισης</target> + <source>About</source> <target>Σχετικά με το...</target> + <source>Error</source> <target>Σφάλματα</target> + <source>Warning</source> <target>Î Ïοειδοποίηση</target> + <source>Question</source> <target>ΕÏώτηση</target> + <source>Confirm</source> <target>Επιβεβαίωση</target> + <source>Configure filter</source> <target>ΡÏθμιση του φίλτÏου</target> + <source>Customize columns</source> <target>Î ÏοσαÏμογή στηλών</target> + <source>Global settings</source> <target>ΓενικÎÏ‚ Ïυθμίσεις</target> + <source>Synchronization Preview</source> <target>Î Ïοεπισκόπηση του συγχÏονισμοÏ</target> + <source>Find</source> <target>Αναζήτηση</target> + +<source>Select time span</source> +<target></target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -85,46 +126,64 @@ <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> </target> + <source><Symlink></source> <target><Συμβολικός δεσμός></target> + <source><Directory></source> <target><Υποκατάλογος></target> + <source>Size</source> <target>ÎœÎγεθος</target> + <source>Date</source> <target>ΗμεÏομηνία</target> + <source>Full path</source> <target>ΠλήÏης διαδÏομή</target> + <source>Filename</source> <target>Όνομα αÏχείου</target> + <source>Relative path</source> <target>Σχετική διαδÏομή</target> + <source>Directory</source> <target>Υποκατάλογος</target> + <source>Extension</source> <target>ΕπÎκταση</target> + <source>Comparison Result</source> <target>ΑποτÎλεσμα της σÏγκÏισης</target> + <source>Incompatible synchronization database format:</source> <target>Η μοÏφή της βάσης δεδομÎνων συγχÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï Î´ÎµÎ½ είναι συμβατή:</target> + <source>Initial synchronization:</source> <target>ΑÏχικός συγχÏονισμός:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>Μια από τις βάσεις δεδομÎνων του FreeFileSync δεν υπάÏχει ακόμα:</target> + <source>Error reading from synchronization database:</source> <target>Σφάλμα κατά την ανάγνωση από τη βάση δεδομÎνων συγχÏονισμοÏ:</target> + <source>Database files do not share a common synchronization session:</source> <target></target> + <source>An exception occurred!</source> <target>ΠαÏουσιάστηκε σφάλμα!</target> -<source>Error deleting file:</source> -<target>Σφάλμα κατά τη διαγÏαφή του αÏχείου:</target> + <source>Error reading file attributes:</source> <target>Σφάλμα κατά την ανάγνωση των χαÏακτηÏιστικών του αÏχείου:</target> + <source>Waiting while directory is locked (%x)...</source> <target>Αναμονή μÎχÏι να κλειδωθεί ο υποκατάλογος (%x)...</target> + <source>Error setting directory lock:</source> <target>Σφάλμα κατά το κλείδωμα του υποκαταλόγου:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -133,27 +192,37 @@ <pluralform>1 δ/λεπτο</pluralform> <pluralform>%x δ/λεπτα</pluralform> </target> + <source>Info</source> <target>ΠληÏοφοÏίες</target> + <source>Fatal Error</source> <target>Σημαντικό Σφάλμα</target> + <source>Scanning:</source> <target>Ανίχνευση:</target> + <source>Encoding extended time information: %x</source> <target>Κωδικοποίηση εκτεταμÎνων πληÏοφοÏιών για την ÏŽÏα: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> <target></target> + <source>Invalid FreeFileSync config file!</source> <target>Το αÏχείο διάταξης του FreeFileSync δεν είναι ÎγκυÏο!</target> + <source>File does not exist:</source> <target>Το αÏχείο δεν υπάÏχει:</target> + <source>Error parsing configuration file:</source> <target>Σφάλμα κατά την ανάλυση του αÏχείου διάταξης:</target> + <source>/sec</source> <target>/δευτεÏόλεπτο</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -162,6 +231,7 @@ <pluralform>1 λεπτό</pluralform> <pluralform>%x λεπτά</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -170,6 +240,7 @@ <pluralform>1 ÏŽÏα</pluralform> <pluralform>%x ÏŽÏες</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -178,28 +249,40 @@ <pluralform>1 μÎÏα</pluralform> <pluralform>%x μÎÏες</pluralform> </target> + <source>S&ave configuration...</source> <target>Α&ποθήκευση διάταξης...</target> + <source>&Load configuration...</source> <target>Ά&νοιγμα διάταξης...</target> + <source>&Quit</source> <target>&Έξοδος</target> + <source>&File</source> <target>&ΑÏχείο</target> + <source>&Content</source> <target>&ΠεÏιεχόμενα</target> + <source>&About...</source> <target>&Σχετικά...</target> + <source>&Help</source> <target>&Βοήθεια</target> + <source>Usage:</source> <target>ΧÏήση:</target> + <source>1. Select directories to monitor.</source> <target>1. ΕπιλÎξτε τους υποκαταλόγους που θα παÏακολουθοÏνται.</target> + <source>2. Enter a command line.</source> <target>2. Εισάγετε μια γÏαμμή εντολών.</target> + <source>3. Press 'Start'.</source> <target>3. Πατήστε το 'ΈναÏξη'.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -210,310 +293,456 @@ The command line is executed each time: - όλοι οι υποκατάλογοι γίνονται διαθÎσιμοι (Ï€.χ. εισαγωγή ενός USB stick) - κάποια αÏχεία σε αυτοÏÏ‚ τους καταλόγους ή υποκαταλόγους τους Îχουν Ï„Ïοποποιηθεί </target> + <source>Directories to watch</source> <target>Υποκατάλογοι για παÏακολοÏθηση</target> + <source>Add folder</source> <target>Î Ïοσθήκη υποκαταλόγου</target> + <source>Remove folder</source> <target>ΔιαγÏαφή του υποκαταλόγου</target> + <source>Select a folder</source> <target>Επιλογή υποκαταλόγου</target> + <source>Command line</source> <target>ΓÏαμμή εντολών</target> + <source>Minimum Idle Time [seconds]</source> <target>Ελάχιστος ΧÏόνος Αναμονής [δευτεÏόλεπτα]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>ΧÏόνος αναμονής Î¼ÎµÏ„Î±Î¾Ï Ï„Î·Ï‚ ανίχνευσης της τελευταίας αλλαγής και της εκτÎλεσης της γÏαμμής εντολών [δευτεÏόλεπτα]</target> + <source>Start</source> <target>ΈναÏξη</target> + <source>(Build: %x)</source> <target>(ΔημιουÏγήθηκε : %x)</target> + <source>RealtimeSync configuration</source> <target>ΔιαμόÏφωση του RealtimeSync</target> + <source>File already exists. Overwrite?</source> <target>Το αÏχείο υπάÏχει ήδη. Îα αντικατασταθεί;</target> + <source>&Restore</source> <target>&ΕπαναφοÏά</target> + <source>&Exit</source> <target>&Έξοδος</target> + <source>Monitoring active...</source> <target>ΕνεÏγή παÏακολοÏθηση...</target> + <source>Waiting for missing directories...</source> <target>Αναμονή για τους υποκαταλόγους που απουσιάζουν...</target> + <source>A directory input field is empty.</source> <target>Ένα πεδίο εισόδου είναι κενό.</target> + <source>Drag && drop</source> <target>ΜεταφοÏά && Απόθεση</target> + <source>Could not initialize directory monitoring:</source> <target>Δεν ήταν δυνατό να γίνει ÎναÏξη παÏακολοÏθησης του υποκαταλόγου:</target> + <source>Error when monitoring directories.</source> <target>Σφάλμα κατά την παÏακολοÏθηση υποκαταλόγων.</target> + <source>Conversion error:</source> <target>Σφάλμα μετατÏοπής:</target> + +<source>Error deleting file:</source> +<target>Σφάλμα κατά τη διαγÏαφή του αÏχείου:</target> + <source>Error moving file:</source> <target>Σφάλμα κατά τη μεταφοÏά του αÏχείου:</target> + <source>Target file already existing!</source> <target>Το αÏχείο Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï…Ï€Î¬Ïχει ήδη!</target> + <source>Error moving directory:</source> <target>Σφάλμα κατά τη μεταφοÏά του υποκαταλόγου:</target> + <source>Target directory already existing!</source> <target>Ο υποκατάλογος Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï…Ï€Î¬Ïχει ήδη!</target> + <source>Error deleting directory:</source> <target>Σφάλμα κατά τη διαγÏαφή του υποκαταλόγου:</target> + <source>Error changing modification time:</source> <target>Σφάλμα κατά την αλλαγή της ÏŽÏας Ï„Ïοποποίησης:</target> + <source>Error loading library function:</source> <target>Σφάλμα κατά τη φόÏτωση της συνάÏτησης βιβλιοθήκης:</target> + <source>Error reading security context:</source> <target>Σφάλμα κατά την ανάγνωση του πλαισίου ασφαλείας:</target> + <source>Error writing security context:</source> <target>Σφάλμα κατά την εγγÏαφή του πλαισίου ασφάλειας:</target> + <source>Error copying file permissions:</source> <target>Σφάλμα κατά την αντιγÏαφή των αδειών των αÏχείων:</target> + <source>Error creating directory:</source> <target>Σφάλμα κατά τη δημιουÏγία του υποκαταλόγου:</target> + <source>Error copying symbolic link:</source> <target>Σφάλμα κατά την αντιγÏαφή του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î´ÎµÏƒÎ¼Î¿Ï:</target> + <source>Error copying file:</source> <target>Σφάλμα κατά την αντιγÏαφή του αÏχείου:</target> + <source>Error opening file:</source> <target>Σφάλμα κατά το άνοιγμα του αÏχείου:</target> + <source>Error writing file:</source> <target>Σφάλμα κατά την εγγÏαφή του αÏχείου:</target> + <source>Error reading file:</source> <target>Σφάλμα κατά την ανάγνωση του αÏχείου:</target> + <source>Operation aborted!</source> <target>Η λειτουÏγία ματαιώθηκε!</target> + <source>Endless loop when traversing directory:</source> <target>ΑτÎÏμονος βÏόχος κατά την την ανάλυση του υποκαταλόγου:</target> + <source>Error traversing directory:</source> <target>Σφάλμα κατά την ανάλυση του υποκαταλόγου:</target> + <source>Windows Error Code %x:</source> <target>Κωδικός Σφάλματος των Windows %x:</target> + <source>Linux Error Code %x:</source> <target>Κωδικός Σφάλματος του Linux %x:</target> + <source>Error setting privilege:</source> <target>Σφάλμα κατά τον οÏισμό δικαιωμάτων:</target> + <source>Error moving to Recycle Bin:</source> <target>Σφάλμα κατά τη μεταφοÏά στον Κάδο ΑνακÏκλωσης:</target> + <source>Could not load a required DLL:</source> <target>Δεν φοÏτώθηκε μια απαιτοÏμενη βιβλιοθήκη DLL:</target> + <source>Error writing to synchronization database:</source> <target>Σφάλμα κατά την εγγÏαφή στη βάση δεδομÎνων συγχÏονισμοÏ:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>Σφάλμα κατά την ÎναÏξη της υπηÏεσίας Volume Shadow Copy!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target></target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>Δεν είναι δυνατή η δημιουÏγία σκιώδους αντίγÏαφου σε WOW64. ΧÏησιμοποιείστε την 64-bit Îκδοση του FreeFileSync.</target> + <source>Could not determine volume name for file:</source> <target>Δεν ήταν δυνατό να Ï€ÏοσδιοÏιστεί το όνομα τόμου για το αÏχείο:</target> + <source>Volume name %x not part of filename %y!</source> <target>Το όνομα τόμου %x δεν είναι μÎÏος του ονόματος του αÏχείου %y!</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>Δεν αναγνώστηκαν τιμÎÏ‚ για τους ακόλουθους κόμβους XML:</target> + <source>Logging</source> <target>ΚαταγÏαφή μηνυμάτων</target> + <source>FreeFileSync batch file</source> <target>FreeFileSync αÏχείο δÎσμης</target> + <source>FreeFileSync configuration</source> <target>ΑÏχείο διάταξης FreeFileSync</target> + <source>FreeFileSync Batch Job</source> <target>FreeFileSync ΔÎσμη ΕνεÏγειών</target> + <source>Unable to create logfile!</source> <target>Δεν είναι δυνατή η δημιουÏγία ενός αÏχείου καταγÏαφής!</target> + <source>Batch execution</source> <target>ΕκτÎλεση δÎσμης ενεÏγειών</target> + <source>Log-messages:</source> <target>ΑποθηκευμÎνα μηνÏματα:</target> + <source>Stop</source> <target>Λήξη</target> + <source>Total time:</source> <target>Συνολική διάÏκεια:</target> + <source>Synchronization aborted!</source> <target>Ο συγχÏονισμός ματαιώθηκε!</target> + <source>Synchronization completed with errors!</source> <target>Ο συγχÏονισμός ολοκληÏώθηκε με σφάλματα!</target> + <source>Synchronization completed successfully!</source> <target>Ο συγχÏονισμός ολοκληÏώθηκε επιτυχώς!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>Πατήστε "Εναλλαγή" για να ανοίξετε το γÏαφικό πεÏιβάλλον του FreeFileSync</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>Εναλλαγή στο γÏαφικό πεÏιβάλλον του FreeFileSync...</target> + <source>Unable to connect to sourceforge.net!</source> <target>Δεν είναι δυνατή η σÏνδεση με το sourceforge.net!</target> + <source>A newer version of FreeFileSync is available:</source> <target>Μια νεότεÏη Îκδοση του FreeFileSync είναι διαθÎσιμη:</target> + <source>Download now?</source> <target>Λήψη Ï„ÏŽÏα;</target> + <source>Information</source> <target>ΠληÏοφοÏία</target> + <source>FreeFileSync is up to date!</source> <target>Το FreeFileSync είναι ενημεÏωμÎνο!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>ΘÎλετε το FreeFileSync να ελÎγχει αυτόματα για ενημεÏώσεις κάθε εβδομάδα;</target> + <source>(Requires an Internet connection!)</source> <target>(Απαιτεί σÏνδεση με το Internet)</target> + <source>1. &Compare</source> <target>1. &ΣÏγκÏιση</target> + <source>2. &Synchronize...</source> <target>2. &ΣυγχÏονισμός...</target> + <source>S&witch view</source> <target>Α&λλαγή εμφάνισης</target> + <source>&New</source> <target>&ΔημιουÏγία</target> + <source>&Program</source> <target>&Î ÏόγÏαμμα</target> + <source>&Language</source> <target>&Γλώσσα</target> + <source>&Global settings...</source> <target>&ΓενικÎÏ‚ Ïυθμίσεις...</target> + <source>&Create batch job...</source> <target>&ΔημιουÏγία μιας δÎσμης ενεÏγειών...</target> + <source>&Export file list...</source> <target>&Εξαγωγή καταλόγου αÏχείων...</target> + <source>&Advanced</source> <target>&Για Ï€ÏοχωÏημÎνους</target> + <source>&Check for new version</source> <target>&Έλεγχος για νÎα Îκδοση</target> + <source>Compare</source> <target>ΣÏγκÏιση</target> + <source>Compare both sides</source> <target>ΣÏγκÏιση των δÏο πλευÏών</target> + <source>&Abort</source> <target>&ΆκυÏο</target> + <source>Synchronize...</source> <target>ΣυγχÏονισμός...</target> + <source>Start synchronization</source> <target>ΈναÏξη του συγχÏονισμοÏ</target> -<source>Swap sides</source> -<target>Ανταλλαγή πλευÏών</target> + <source>Add folder pair</source> <target>Î Ïοσθήκη ζεÏγους υποκαταλόγων</target> + <source>Remove folder pair</source> <target>ΔιαγÏαφή του ζεÏγους υποκαταλόγων</target> + +<source>Swap sides</source> +<target>Ανταλλαγή πλευÏών</target> + <source>Save current configuration to file</source> <target>Αποθήκευση της Ï„ÏÎχουσας διάταξης</target> + <source>Load configuration from file</source> <target>Άνοιγμα διάταξης από αÏχείο</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>Διατάξεις που χÏησιμοποιήθηκαν τελευταία (πατήστε DEL για διαγÏαφή από τη λίστα)</target> + <source>Hide excluded items</source> <target>ΑπόκÏυψη των εξαιÏεθÎντων στοιχείων</target> + <source>Hide filtered or temporarily excluded files</source> <target>ΑπόκÏυψη των αÏχείων που φιλτÏαÏίστηκαν ή εξαιÏÎθηκαν Ï€ÏοσωÏινά</target> + <source>Number of files and directories that will be created</source> <target>ΑÏιθμός αÏχείων και υποκαταλόγων που θα δημιουÏγηθοÏν</target> + <source>Number of files that will be overwritten</source> <target>ΑÏιθμός αÏχείων και υποκαταλόγων που θα αντικατασταθοÏν</target> + <source>Number of files and directories that will be deleted</source> <target>ΑÏιθμός αÏχείων και υποκαταλόγων που θα διαγÏαφοÏν</target> + <source>Total amount of data that will be transferred</source> <target>Συνολικός όγκος δεδομÎνων που θα μεταφεÏθοÏν</target> -<source>Left</source> -<target>ΑÏιστεÏά</target> -<source>Right</source> -<target>Δεξιά</target> + <source>Batch job</source> <target>ΔÎσμη ενεÏγειών</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>Για την αυτοματοποίηση του συγχÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï Î´Î·Î¼Î¹Î¿Ï…Ïγείστε Îνα αÏχείο δÎσμης ενεÏγειών. Για να ξεκινήσετε σε κατάσταση λειτουÏγίας της δÎσμης, απλώς κάντε διπλό κλικ στο αÏχείο ή γÏάψτε στη γÏαμμή εντολών: FreeFileSync.exe <batchfile>. ΜποÏείτε επίσης το Ï€ÏογÏαμματίσετε αυτήν την εÏγασία, χÏησιμοποιώντας το χÏονοδιάγÏαμμα εÏγασιών του λειτουÏÎ³Î¹ÎºÎ¿Ï ÏƒÎ±Ï‚ συστήματος.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target></target> + <source>Help</source> <target>Βοήθεια</target> + <source>Filter files</source> <target>ΦιλτÏάÏισμα</target> + <source>Error handling</source> <target>ΔιαχείÏιση σφαλμάτων</target> + +<source>Left</source> +<target>ΑÏιστεÏά</target> + +<source>Right</source> +<target>Δεξιά</target> + <source>Overview</source> <target>ΣÏνοψη</target> + <source>Status feedback</source> <target>ΑναφοÏά κατάστασης</target> + <source>Run minimized</source> <target></target> + <source>Maximum number of logfiles:</source> <target>ÎœÎγιστος αÏιθμός αÏχείων καταγÏαφής:</target> + <source>Select logfile directory:</source> <target>ΕπιλÎξτε Îναν κατάλογο για το αÏχείο καταγÏαφής:</target> + <source>Batch settings</source> <target></target> + <source>&Save</source> <target>&Αποθήκευση</target> + <source>&Load</source> <target>&Άνοιγμα</target> + <source>&Cancel</source> <target>&ΆκυÏο</target> + <source>Elements found:</source> <target>Î’ÏÎθηκαν στοιχεία:</target> + <source>Elements remaining:</source> <target>ΠεÏισσεÏουν στοιχεία:</target> + <source>Speed:</source> <target>ΤαχÏτητα:</target> + <source>Time remaining:</source> <target>ΑπομÎνει χÏόνος:</target> + <source>Time elapsed:</source> <target>Î ÎÏασε χÏόνος:</target> + <source>Operation:</source> <target>ΛειτουÏγία:</target> + <source>Select variant:</source> <target>ΕπιλÎξτε μια μÎθοδο:</target> + <source><Automatic></source> <target><Αυτόματα></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>Ανίχνευση και εφαÏμογή των αλλαγών και στις δυο πλευÏÎÏ‚ με τη χÏήση βάσης δεδομÎνων. ΔιαγÏαφÎÏ‚ και διενÎξεις ανιχνεÏονται αυτόματα.</target> + <source>Mirror ->></source> <target>ΚατοπτÏισμός ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>ΚατοπτÏικό αντίγÏαφο του αÏιστεÏÎ¿Ï Ï…Ï€Î¿ÎºÎ±Ï„Î±Î»ÏŒÎ³Î¿Ï…. Ο υποκατάλογος δεξιά θα Ï„Ïοποποιηθεί και θα αντιστοιχεί εξολοκλήÏου στον αÏιστεÏÏŒ μετά το συγχÏονισμό</target> + <source>Update -></source> <target>ΕνημÎÏωση -></target> + <source>Copy new or updated files to right folder.</source> <target>ΑντιγÏαφή των νÎων ή πιο Ï€Ïόσφατων αÏχείων στον υποκατάλογο δεξιά.</target> + <source>Custom</source> <target>Εξατομίκευση</target> + <source>Configure your own synchronization rules.</source> <target>ΟÏίστε τους δικοÏÏ‚ σας κανόνες συγχÏονισμοÏ.</target> + <source>Deletion handling</source> <target>ΔιαχείÏιση των διαγÏαφών</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>Διάταξη</target> + <source>Category</source> <target>ΚατηγοÏία</target> + <source>Action</source> <target>ΕνÎÏγεια</target> + <source>File/folder exists on left side only</source> <target>Το αÏχείο / ο υποκατάλογος υπάÏχει μόνο στην αÏιστεÏή πλευÏά</target> + <source>File/folder exists on right side only</source> <target>Το αÏχείο / ο υποκατάλογος υπάÏχει μόνο στη δεξιά πλευÏά</target> + <source>Left file is newer</source> <target>Το αÏχείο στα αÏιστεÏά είναι πιο Ï€Ïόσφατο</target> + <source>Right file is newer</source> <target>Το αÏχείο στα δεξιά είναι πιο Ï€Ïόσφατο</target> + <source>Files have different content</source> <target>Τα αÏχεία Îχουν διαφοÏετικό πεÏιεχόμενο</target> + <source>Conflict/file cannot be categorized</source> <target>Η διÎνεξη / το αÏχείο δεν μποÏεί να κατηγοÏιοποιηθεί</target> + <source>Compare by...</source> <target>ΣÏγκÏιση με βάση το...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> -<target> -Τα αÏχεία θεωÏοÏνται ίδια, εάν - - το μÎγεθός τους - - η ημεÏομηνία και ÏŽÏα τελευταίας Ï„Ïοποποίησης -είναι ίδια. -</target> -<source>File size and date</source> -<target>ÎœÎγεθος και ημεÏομηνία αÏχείων</target> +<target></target> + +<source>File time and size</source> +<target></target> + <source> Files are found equal if - file content @@ -524,92 +753,85 @@ is the same - το πεÏιεχόμενό τους είναι ίδιο. </target> + <source>File content</source> <target>ΠεÏιεχόμενο αÏχείων</target> + <source>Symbolic Link handling</source> <target>ΤÏόπος διαχείÏισης των συμβολικών δεσμών</target> + <source>Synchronizing...</source> <target>Γίνεται συγχÏονισμός...</target> + <source>Elements processed:</source> <target>ΕπεξεÏγάστηκαν στοιχεία:</target> + <source>&Pause</source> <target>&ΠαÏση</target> -<source>Compare by "File size and date"</source> -<target>ΣÏγκÏιση με βάση το "ÎœÎγεθος και ΗμεÏομηνία αÏχείων"</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>Με βάση αυτήν την επιλογή, δÏο αÏχεία που Îχουν το ίδιο όνομα θεωÏοÏνται ίδια, όταν Îχουν το ίδιο μÎγεθος ΚΑΙ ίδια ημÎÏα και ÏŽÏα τελευταίας Ï„Ïοποποίησης.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>Εάν γίνει σÏγκÏιση με αυτήν την επιλογή, ακολουθείται το παÏακάτω δÎνδÏο απόφασης:</target> -<source>As a result the files are separated into the following categories:</source> -<target>Ως αποτÎλεσμα, τα αÏχεία χωÏίζονται στις εξής κατηγοÏίες:</target> -<source>- equal</source> -<target>- ίδια</target> -<source>- left newer</source> -<target>- αÏιστεÏά πιο Ï€Ïόσφατο</target> -<source>- right newer</source> -<target>- δεξιά πιο Ï€Ïόσφατο</target> -<source>- exists left only</source> -<target>- υπάÏχει μόνο στα αÏιστεÏά</target> -<source>- exists right only</source> -<target>- υπάÏχει μόνο στα δεξιά</target> -<source>- conflict (same date, different size)</source> -<target>- διÎνεξη (ίδια ημεÏομηνία, διαφοÏετικό μÎγεθος)</target> -<source>Compare by "File content"</source> -<target>ΣÏγκÏιση με βάση το "ΠεÏιεχόμενο αÏχείων"</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. - -With this option enabled the decision tree is smaller: -</source> -<target> -Όπως λÎει και ο τίτλος, δÏο αÏχεία που Îχουν το ίδιο όνομα θεωÏοÏνται ίδια μόνο και μόνον εάν Îχουν το ίδιο πεÏιεχόμενο. Αυτή η επιλογή είναι χÏήσιμη για Îλεγχο αξιοπιστίας παÏά για αντίγÏαφα ασφαλείας. ΕπομÎνως οι ημεÏομηνίες των αÏχείων δε λαμβάνονται υπόψη καθόλου. -Με αυτήν την επιλογή το δÎνδÏο απόφασης είναι μικÏότεÏο: -</target> -<source>- different</source> -<target>- διαφοÏετικά</target> <source>Source code written in C++ utilizing:</source> <target>Ο πηγαίος κώδικας γÏάφτηκε σε C++ χÏησιμοποιώντας τα:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>Για τις μεταφÏάσεις του FreeFileSync, ευχαÏιστοÏμε τους:</target> + <source>Feedback and suggestions are welcome at:</source> <target>Σχόλια και Ï€Ïοτάσεις είναι ευπÏόσδεκτα στα:</target> + <source>FreeFileSync at Sourceforge</source> <target>Το FreeFileSync στο Sourceforge</target> + <source>Homepage</source> <target>Ιστοσελίδα</target> + <source>If you like FFS</source> <target>Αν σας αÏÎσει το FFS</target> + <source>Donate with PayPal</source> <target>Κάντε μια δωÏεά μÎσω PayPal</target> + <source>Email</source> <target>Email</target> + <source>Report translation error</source> <target>ΑναφÎÏετε λάθη μετάφÏασης</target> + <source>Published under the GNU General Public License:</source> <target>ΔιανÎμεται υπό την Γενική Άδεια Δημόσιας ΧÏήσης GNU:</target> + <source>Ignore subsequent errors</source> <target>ΠαÏάβλεψη των επόμενων σφαλμάτων</target> + <source>Hide further error messages during the current process</source> <target>ΑπόκÏυψη επόμενων μηνυμάτων σφάλματος στην Ï„ÏÎχουσα διαδικασία</target> + <source>&Ignore</source> <target>&ΠαÏάβλεψη</target> + <source>&Retry</source> <target>&Επανάληψη</target> + <source>Do not show this dialog again</source> <target>Îα μην εμφανιστεί ξανά αυτό το μήνυμα</target> + <source>&Switch</source> <target>&Εναλλαγή</target> + <source>&Yes</source> <target>&Îαι</target> + <source>&No</source> <target>&Όχι</target> + <source>Delete on both sides</source> <target>ΔιαγÏαφή και στις δυο πλευÏÎÏ‚</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>ΔιαγÏαφή και στις δυο πλευÏÎÏ‚, ακόμα κι αν το αÏχείο Îχει επιλεχθεί μόνο στη μια πλευÏά</target> + <source>Use Recycle Bin</source> <target>ΧÏήση του Κάδου ΑνακÏκλωσης</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -618,16 +840,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire Μόνον αÏχεία/υποκατάλογοι που ταιÏιάζουν με όλες τις Ïυθμίσεις φίλτÏου θα επιλεχθοÏν για συγχÏονισμό. Σημείωση: Το φίλτÏο ονόματος Ï€ÏÎπει να οÏιστεί σε σχÎση(!) με τους κÏÏιους υποκαταλόγους συγχÏονισμοÏ. </target> + <source>Hints:</source> <target>ΣυμβουλÎÏ‚:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. Εισάγετε τα σχετικά ονόματα των αÏχείων ή των υποκαταλόγων χωÏισμÎνα με ';' ή με αλλαγή γÏαμμής.</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. ΜποÏείτε να χÏησιμοποιήσετε τους χαÏακτήÏες-μπαλαντÎÏ '*' και '?'.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. ΜποÏείτε να εξαιÏÎσετε αÏχεία στη βασική οθόνη κάνοντας δεξί κλικ.</target> + <source>Example</source> <target>ΠαÏάδειγμα</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -636,30 +864,40 @@ Exclude: \stuff\temp\* ΣυμπεÏίληψη: *.doc;*.zip;*.exe ΕξαίÏεση: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>ΣυγχÏονισμός όλων των αÏχείων .doc, .zip και .exe εκτός αυτών στον υποκατάλογο "temp".</target> + <source>Include</source> <target>ΣυμπεÏίληψη</target> + <source>Exclude</source> <target>ΕξαίÏεση</target> -<source>Select time span:</source> -<target>ΕπιλÎξτε εÏÏος χÏόνου:</target> -<source>Minimum file size:</source> -<target>Ελάχιστο μÎγεθος αÏχείου:</target> -<source>Maximum file size:</source> -<target>ÎœÎγιστο μÎγεθος αÏχείου:</target> + +<source>Minimum file size</source> +<target></target> + +<source>Maximum file size</source> +<target></target> + <source>&Default</source> <target>&Î Ïοεπιλογή</target> + <source>Move column up</source> <target>Μετακίνηση της στήλης πάνω</target> + <source>Move column down</source> <target>Μετακίνηση της στήλης κάτω</target> -<source>Transactional File Copy</source> + +<source>Transactional file copy</source> <target></target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> <target></target> + <source>Copy locked files</source> <target>ΑντιγÏαφή κλειδωμÎνων αÏχείων</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -668,8 +906,10 @@ Copy shared or locked files using Volume Shadow Copy Service ΑντιγÏαφή κλειδωμÎνων ή διαμοιÏασμÎνων αÏχείων με την υπηÏεσία Volume Shadow Copy (απαιτεί δικαιώματα Administrator) </target> -<source>Copy filesystem permissions</source> -<target>ΑντιγÏαφή των αδειών των αÏχείων</target> + +<source>Copy file access permissions</source> +<target></target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -678,138 +918,205 @@ Transfer file and directory permissions ΜεταφοÏά των αδειών για τα αÏχεία και τους υποκαταλόγους (Απαιτεί δικαιώματα Aministrator) </target> + <source>Hidden dialogs:</source> <target>ΚÏυμμÎνα παÏάθυÏα διαλόγου:</target> + <source>Reset</source> <target>Επανεμφάνιση</target> + <source>Show hidden dialogs</source> <target>Επανεμφάνιση των κÏυμμÎνων παÏαθÏÏων διαλόγου</target> + <source>External applications</source> <target>ΕξωτεÏικÎÏ‚ εφαÏμογÎÏ‚</target> + <source>Description</source> <target>ΠεÏιγÏαφή</target> + <source>Variant</source> <target>ÎœÎθοδος</target> + <source>Statistics</source> <target>Στατιστικά</target> + <source>Find what:</source> <target>Αναζήτηση του:</target> + <source>Match case</source> <target>Αντιστοίχιση πεζών-κεφαλαίων</target> + <source>&Find next</source> <target>&ΕÏÏεση επομÎνου</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>ΜποÏείτε να Ï€Ïοσπαθήσετε να συγχÏονίσετε τα υπόλοιπα στοιχεία (ΧΩΡΙΣ να χÏειάζεται να τα ξανασυγκÏίνετε)!</target> -<source>Batch file created successfully!</source> -<target>Το αÏχείο δÎσμης ενεÏγειών δημιουÏγήθηκε επιτυχώς!</target> + <source>Main bar</source> <target>ΓÏαμμή εÏγαλείων</target> + <source>Folder pairs</source> <target>ΖεÏγη υποκαταλόγων</target> + <source>Select view</source> <target>Επιλογή εμφάνισης</target> + <source>Set direction:</source> <target>Επιλογή κατεÏθυνσης:</target> + <source>Exclude temporarily</source> <target>Î ÏοσωÏινή εξαίÏεση</target> + <source>Include temporarily</source> <target>Î ÏοσωÏινή συμπεÏίληψη</target> + <source>Exclude via filter:</source> <target>ΕξαίÏεση με βάση το φίλτÏο:</target> + <source><multiple selection></source> <target><πολλαπλή επιλογή></target> + <source>D-Click</source> <target>Διπλό κλικ</target> + <source>Delete</source> <target>ΔιαγÏαφή</target> + <source>Customize...</source> <target>Î ÏοσαÏμογή...</target> + +<source>Select time span...</source> +<target></target> + <source>Auto-adjust columns</source> <target>Αυτόματη Ï€ÏοσαÏμογή των στηλών</target> + <source>Include all rows</source> <target>ΣυμπεÏίληψη όλων των γÏαμμών</target> + <source>Exclude all rows</source> <target>ΕξαίÏεση όλων των γÏαμμών</target> + <source>Reset view</source> <target>ΕπαναφοÏά αÏχικής εμφάνισης</target> + <source>Show "%x"</source> <target>Εμφάνιση της γÏαμμής "%x"</target> + <source><Last session></source> <target><Τελευταία χÏήση></target> + <source>Configuration saved!</source> <target>Η διάταξη αποθηκεÏτηκε!</target> + <source>Save changes to current configuration?</source> <target>Îα αποθηκευτοÏν οι αλλαγÎÏ‚ στην Ï„ÏÎχουσα διάταξη;</target> + <source>Configuration loaded!</source> <target>Η διάταξη Îχει ανοιχθεί!</target> + <source>Folder Comparison and Synchronization</source> <target>ΣÏγκÏιση υποκαταλόγων και ΣυγχÏονισμός</target> + <source>Hide files that exist on left side only</source> <target>ΑπόκÏυψη των αÏχείων που υπάÏχουν μόνο στα αÏιστεÏά</target> + <source>Show files that exist on left side only</source> <target>Εμφάνιση των αÏχείων που υπάÏχουν μόνο στα αÏιστεÏά</target> + <source>Hide files that exist on right side only</source> <target>ΑπόκÏυψη των αÏχείων που υπάÏχουν μόνο στα δεξιά</target> + <source>Show files that exist on right side only</source> <target>Εμφάνιση των αÏχείων που υπάÏχουν μόνο στα δεξιά</target> + <source>Hide files that are newer on left</source> <target>ΑπόκÏυψη των αÏχείων που είναι πιο Ï€Ïόσφατα στα αÏιστεÏά</target> + <source>Show files that are newer on left</source> <target>Εμφάνιση των αÏχείων που είναι πιο Ï€Ïόσφατα στα αÏιστεÏά</target> + <source>Hide files that are newer on right</source> <target>ΑπόκÏυψη των αÏχείων που είναι πιο Ï€Ïόσφατα στα δεξιά</target> + <source>Show files that are newer on right</source> <target>Εμφάνιση των αÏχείων που είναι πιο Ï€Ïόσφατα στα δεξιά</target> + <source>Hide files that are equal</source> <target>ΑπόκÏυψη των αÏχείων που είναι ίδια</target> + <source>Show files that are equal</source> <target>Εμφάνιση των αÏχείων που είναι ίδια</target> + <source>Hide files that are different</source> <target>ΑπόκÏυψη των αÏχείων που είναι διαφοÏετικά</target> + <source>Show files that are different</source> <target>Εμφάνιση των αÏχείων που είναι διαφοÏετικά</target> + <source>Hide conflicts</source> <target>ΑπόκÏυψη διενÎξεων</target> + <source>Show conflicts</source> <target>Εμφάνιση διενÎξεων</target> + <source>Hide files that will be created on the left side</source> <target>ΑπόκÏυψη των αÏχείων που θα δημιουÏγηθοÏν στα αÏιστεÏά</target> + <source>Show files that will be created on the left side</source> <target>Εμφάνιση των αÏχείων που θα δημιουÏγηθοÏν στα αÏιστεÏά</target> + <source>Hide files that will be created on the right side</source> <target>ΑπόκÏυψη των αÏχείων που θα δημιουÏγηθοÏν στα δεξιά</target> + <source>Show files that will be created on the right side</source> <target>Εμφάνιση των αÏχείων που θα δημιουÏγηθοÏν στα δεξιά</target> + <source>Hide files that will be deleted on the left side</source> <target>ΑπόκÏυψη των αÏχείων που θα διαγÏαφοÏν στα αÏιστεÏά</target> + <source>Show files that will be deleted on the left side</source> <target>Εμφάνιση των αÏχείων που θα διαγÏαφοÏν στα αÏιστεÏά</target> + <source>Hide files that will be deleted on the right side</source> <target>ΑπόκÏυψη των αÏχείων που θα διαγÏαφοÏν στα δεξιά</target> + <source>Show files that will be deleted on the right side</source> <target>Εμφάνιση των αÏχείων που θα διαγÏαφοÏν στα δεξιά</target> + <source>Hide files that will be overwritten on left side</source> <target>ΑπόκÏυψη των αÏχείων που θα αντικατασταθοÏν στα αÏιστεÏά</target> + <source>Show files that will be overwritten on left side</source> <target>Εμφάνιση των αÏχείων που θα αντικατασταθοÏν στα αÏιστεÏά</target> + <source>Hide files that will be overwritten on right side</source> <target>ΑπόκÏυψη των αÏχείων που θα αντικατασταθοÏν στα δεξιά</target> + <source>Show files that will be overwritten on right side</source> <target>Εμφάνιση των αÏχείων που θα αντικατασταθοÏν στα αÏιστεÏά</target> + <source>Hide files that won't be copied</source> <target>ΑπόκÏυψη των αÏχείων που δε θα αντιγÏαφοÏν</target> + <source>Show files that won't be copied</source> <target>Εμφάνιση των αÏχείων που δε θα αντιγÏαφοÏν</target> + <source>All directories in sync!</source> <target>Όλοι οι υποκατάλογοι είναι συγχÏονισμÎνοι!</target> + <source>Please run a Compare first before synchronizing!</source> <target>ΠαÏακαλώ εκτελÎστε Ï€Ïώτα ΣÏγκÏιση Ï€Ïιν το ΣυγχÏονισμό!</target> + <source>Comma separated list</source> <target>Κατάλογος οÏιοθετημÎνος με κόμματα</target> + <source>Legend</source> <target>Εξήγηση των συμβόλων για κάθε κατηγοÏία</target> + <source>File list exported!</source> <target>Ο κατάλογος των αÏχείων Îχει εξαχθεί!</target> + +<source>Batch file created successfully!</source> +<target>Το αÏχείο δÎσμης ενεÏγειών δημιουÏγήθηκε επιτυχώς!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -818,6 +1125,7 @@ Transfer file and directory permissions <pluralform>Το αντικείμενο διαγÏάφηκε επιτυχώς!</pluralform> <pluralform>%x αντικείμενα διαγÏάφηκαν επιτυχώς!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -826,6 +1134,7 @@ Transfer file and directory permissions <pluralform>1 υποκατάλογος</pluralform> <pluralform>%x υποκατάλογοι</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -834,6 +1143,7 @@ Transfer file and directory permissions <pluralform>1 αÏχείο</pluralform> <pluralform>%x αÏχεία</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -842,72 +1152,97 @@ Transfer file and directory permissions <pluralform>%x από τη 1 φανεÏή γÏαμμή</pluralform> <pluralform>%x από τις %y φανεÏÎÏ‚ γÏαμμÎÏ‚</pluralform> </target> + <source>Scanning...</source> <target>Ανίχνευση...</target> + <source>Comparing content...</source> <target>ΣÏγκÏιση του πεÏιεχομÎνου...</target> + <source>Paused</source> <target>Σε παÏση</target> + <source>Aborted</source> <target>Ματαιώθηκε</target> + <source>Completed</source> <target>ΟλοκληÏώθηκε</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>Ζητήθηκε ματαίωση: Αναμονή για την λήξη της Ï„ÏÎχουσας εÏγασίας...</target> + <source>Continue</source> <target>ΣυνÎχεια</target> + <source>Pause</source> <target>ΠαÏση</target> + <source>Cannot find %x</source> <target>Δεν μποÏεί να βÏεθεί το %x</target> -<source>DECISION TREE</source> -<target>ΔΕÎΔΡΟ ΑΠΟΦΑΣΗΣ</target> -<source>file exists on both sides</source> -<target>Το αÏχείο υπάÏχει και στις δυο πλευÏÎÏ‚</target> -<source>on one side only</source> -<target>το αÏχείο υπάÏχει μόνο στη μια πλευÏά</target> -<source>same date</source> -<target>ίδια ημεÏομηνία</target> -<source>different date</source> -<target>διαφοÏετική ημεÏομηνία</target> + <source>Inactive</source> <target>ΑνενεÏγό</target> -<source>Second</source> -<target>ΔευτεÏόλεπτα</target> -<source>Minute</source> -<target>Λεπτά</target> -<source>Hour</source> -<target>ÎÏες</target> -<source>Day</source> -<target>ΗμÎÏες</target> + +<source>Last x hours</source> +<target></target> + +<source>Today</source> +<target></target> + +<source>This week</source> +<target></target> + +<source>This month</source> +<target></target> + +<source>This year</source> +<target></target> + <source>Byte</source> <target>Byte</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>ΦίλτÏο: Όλα τα ζεÏγη</target> + <source>Filter: Single pair</source> <target>ΦίλτÏο: Ένα ζεÏγος</target> + <source>Ignore</source> <target>ΠαÏάβλεψη</target> + <source>Direct</source> <target>Ως δεσμό</target> + <source>Follow</source> <target>Ως πεÏιεχόμενο</target> + +<source>Copy NTFS permissions</source> +<target></target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>Ένταξη εξωτεÏικών εφαÏμογών στο Î¼ÎµÎ½Î¿Ï Ï€ÎµÏιβάλλοντος. Οι ακόλουθες μακÏοεντολÎÏ‚ είναι διαθÎσιμες:</target> + <source>- full file or directory name</source> <target>- πλήÏες όνομα του αÏχείου ή υποκαταλόγου</target> + <source>- directory part only</source> <target>- μόνο τους υποκαταλόγους</target> + <source>- Other side's counterpart to %name</source> <target>- Το αντίστοιχο %name της άλλης πλευÏάς</target> + <source>- Other side's counterpart to %dir</source> <target>- Ο αντίστοιχος %dir της άλλης πλευÏάς</target> + <source>Restore all hidden dialogs?</source> <target>Επανεμφάνιση των κÏυμμÎνων παÏαθÏÏων διαλόγου;</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -916,6 +1251,7 @@ Transfer file and directory permissions <pluralform>Είστε σίγουÏοι ότι θÎλετε να μετακινήσετε το ακόλουθο αντικείμενο στον Κάδο ΑνακÏκλωσης;</pluralform> <pluralform>Είστε σίγουÏοι ότι θÎλετε να μετακινήσετε τα ακόλουθα %x αντικείμενα στον Κάδο ΑνακÏκλωσης;</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -924,139 +1260,211 @@ Transfer file and directory permissions <pluralform>Είστε σίγουÏοι ότι θÎλετε να διαγÏάψετε το ακόλουθο αντικείμενο;</pluralform> <pluralform>Είστε σίγουÏοι ότι θÎλετε να διαγÏάψετε τα ακόλουθα %x αντικείμενα;</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>ΠαÏάβλεψη ως ανεπίλυτη διÎνεξη</target> + <source>Delete permanently</source> <target>Μόνιμη διαγÏαφή</target> + <source>Delete or overwrite files permanently</source> <target>Μόνιμη διαγÏαφή ή αντικατάσταση των αÏχείων</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>ΧÏήση του Κάδου ΑνακÏκλωσης κατά τη διαγÏαφή ή αντικατάσταση αÏχείων</target> + <source>Versioning</source> <target>ΔιατήÏηση παλιών εκδόσεων</target> + <source>Move files into a time-stamped subdirectory</source> <target>ΜεταφοÏά των αÏχείων σε Îναν υποκατάλογο με Îνδειξη ÏŽÏας</target> -<source>Cannot determine sync-direction:</source> -<target>Δεν μποÏεί να Ï€ÏοσδιοÏιστεί η κατεÏθυνση συγχÏονισμοÏ:</target> -<source>Filter settings have changed!</source> -<target>Οι Ïυθμίσεις φίλτÏου Îχουν αλλάξει!</target> + <source>Both sides have changed since last synchronization!</source> <target>Και οι δυο πλευÏÎÏ‚ Îχουν αλλάξει από τον τελευταίο συγχÏονισμό!</target> + +<source>Cannot determine sync-direction:</source> +<target>Δεν μποÏεί να Ï€ÏοσδιοÏιστεί η κατεÏθυνση συγχÏονισμοÏ:</target> + <source>No change since last synchronization!</source> <target>Καμία αλλαγή από τον Ï€ÏοηγοÏμενο συγχÏονισμό!</target> + +<source>Filter settings have changed!</source> +<target>Οι Ïυθμίσεις φίλτÏου Îχουν αλλάξει!</target> + <source>The file was not processed by last synchronization!</source> <target>Το αÏχείο δεν συμμετείχε στον τελευταίο συγχÏονισμό!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>Η διαγÏαφή του επιλεγμÎνου καταλόγου είναι σε διÎνεξη με τους υποκαταλόγους και τα -αÏχεία του!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>ΡÏθμιση Ï€ÏοεπιλεγμÎνης κατεÏθυνσης συγχÏονισμοÏ: Τα νεότεÏα αÏχεία θα αντικαταστήσουν τα παλιότεÏα.</target> + <source>The file does not contain a valid configuration:</source> <target>Το αÏχείο δεν πεÏιÎχει μια ÎγκυÏη διάταξη:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>ΜποÏείτε να αγνοήσετε αυτό το σφάλμα και να θεωÏήσετε τον υποκατάλογο κενό.</target> + <source>Directory does not exist:</source> <target>Ο υποκατάλογος δεν υπάÏχει:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Οι υποκατάλογοι είναι εξαÏτώμενοι. Î Ïοσοχή κατά την εισαγωγή των κανόνων συγχÏονισμοÏ:</target> + <source>Comparing content of files %x</source> <target>ΣÏγκÏιση του πεÏιεχομÎνου των αÏχείων %x</target> + <source>Memory allocation failed!</source> <target>Η δÎσμευση χώÏου μνήμης απÎτυχε!</target> + <source>File %x has an invalid date!</source> <target>Το αÏχείο %x δεν Îχει ÎγκυÏη ημεÏομηνία!</target> + <source>Conflict detected:</source> <target>ΑνιχνεÏθηκε διÎνεξη:</target> + <source>Files %x have the same date but a different size!</source> <target>Τα αÏχεία %x Îχουν την ίδια ημεÏομηνία αλλά διαφοÏετικό μÎγεθος!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>Οι συμβολικοί δεσμοί %x Îχουν την ίδια ημεÏομηνία αλλά διαφοÏετικό Ï€ÏοοÏισμό!</target> + <source>Comparing files by content failed.</source> <target>Η σÏγκÏιση του πεÏιεχομÎνου των αÏχείων απÎτυχε.</target> + <source>Generating file list...</source> <target>ΔημιουÏγία καταλόγου αÏχείων...</target> + <source>Multiple...</source> <target>ΠολλαπλÎÏ‚ Ïυθμίσεις...</target> + <source>Both sides are equal</source> <target>Οι δυο πλευÏÎÏ‚ είναι ίδιες</target> + <source>Files/folders differ in attributes only</source> <target>Τα αÏχεία / οι υποκατάλογοι διαφÎÏουν μόνο στα χαÏακτηÏιστικά τους</target> + <source>Copy new file/folder to left</source> <target>ΑντιγÏαφή του νÎου αÏχείου/υποκαταλόγου στα αÏιστεÏά</target> + <source>Copy new file/folder to right</source> <target>ΑντιγÏαφή του νÎου αÏχείου/υποκαταλόγου στα δεξιά</target> + <source>Delete left file/folder</source> <target>ΔιαγÏαφή του αÏχείου/υποκαταλόγου στα αÏιστεÏά</target> + <source>Delete right file/folder</source> <target>ΔιαγÏαφή του αÏχείου/υποκαταλόγου στα δεξιά</target> + <source>Overwrite left file/folder with right one</source> <target>Αντικατάσταση του αÏχείου/υποκαταλόγου στα αÏιστεÏά από το(ν) αντίστοιχο στα δεξιά</target> + <source>Overwrite right file/folder with left one</source> <target>Αντικατάσταση του αÏχείου/υποκαταλόγου στα δεξιά από το(ν) αντίστοιχο στα αÏιστεÏά</target> + <source>Do nothing</source> <target>Καμία ενÎÏγεια</target> + <source>Copy file attributes only to left</source> <target>ΑντιγÏαφή μόνο των χαÏακτηÏιστικών του αÏχείου στα αÏιστεÏά</target> + <source>Copy file attributes only to right</source> <target>ΑντιγÏαφή μόνο των χαÏακτηÏιστικών του αÏχείου στα δεξιά</target> + <source>Deleting file %x</source> <target>ΔιαγÏαφή του αÏχείου %x</target> -<source>Deleting Symbolic Link %x</source> -<target>ΔιαγÏαφή του Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x</target> + <source>Deleting folder %x</source> <target>ΔιαγÏαφή του υποκαταλόγου %x</target> -<source>Moving %x to Recycle Bin</source> -<target>ΜεταφοÏά του %x στον Κάδο ΑνακÏκλωσης</target> -<source>Moving file %x to user-defined directory %y</source> -<target>ΜεταφοÏά του αÏχείου %x στον υποκατάλογο %y που οÏίστηκε από το χÏήστη</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>ΜεταφοÏά του υποκαταλόγου %x στον υποκατάλογο %y που οÏίστηκε από το χÏήστη</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>ΜεταφοÏά του Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x στον υποκατάλογο %y που οÏίστηκε από το χÏήστη</target> -<source>Copying new file %x to %y</source> -<target>ΑντιγÏαφή του νÎου αÏχείου %x στο %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>ΑντιγÏαφή του νÎου Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x στο %y</target> -<source>Overwriting file %x in %y</source> -<target>Αντικατάσταση του αÏχείου %x στο %y</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>Αντικατάσταση του Î£Ï…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î”ÎµÏƒÎ¼Î¿Ï %x στο %y</target> + +<source>Deleting symbolic link %x</source> +<target></target> + +<source>Moving file %x to recycle bin</source> +<target></target> + +<source>Moving folder %x to recycle bin</source> +<target></target> + +<source>Moving symbolic link %x to recycle bin</source> +<target></target> + +<source>Moving file %x to %y</source> +<target></target> + +<source>Moving folder %x to %y</source> +<target></target> + +<source>Moving symbolic link %x to %y</source> +<target></target> + +<source>Creating file %x</source> +<target></target> + +<source>Creating symbolic link %x</source> +<target></target> + <source>Creating folder %x</source> <target>ΔημιουÏγία του υποκαταλόγου %x</target> + +<source>Overwriting file %x</source> +<target></target> + +<source>Overwriting symbolic link %x</source> +<target></target> + <source>Verifying file %x</source> <target>ΕπικÏÏωση του αÏχείου %x</target> + <source>Updating attributes of %x</source> <target>ΕνημÎÏωση των χαÏακτηÏιστικών αÏχείου του %x</target> -<source>Source directory does not exist anymore:</source> -<target>Ο υποκατάλογος Ï€ÏοÎλευσης δεν υπάÏχει πλÎον:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>Τίποτα Ï€Ïος συγχÏονισμό με βάση τη διάταξη!</target> + <source>Target directory name must not be empty!</source> <target>Το όνομα του υποκαταλόγου Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï€ÏÎπει να μην είναι κενό!</target> + <source>User-defined directory for deletion was not specified!</source> <target>Δεν οÏίστηκε από τον χÏήστη υποκατάλογος για τα αÏχεία Ï€Ïος διαγÏαφή!</target> + +<source>Source directory does not exist anymore:</source> +<target>Ο υποκατάλογος Ï€ÏοÎλευσης δεν υπάÏχει πλÎον:</target> + <source>Unresolved conflicts existing!</source> <target>ΥπάÏχουν ανεπίλυτες διενÎξεις!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>ΜποÏείτε να αγνοήσετε τις διενÎξεις και να συνεχίσετε το συγχÏονισμό.</target> + <source>Significant difference detected:</source> <target>ΑνιχνεÏθηκαν σημαντικÎÏ‚ διαφοÏÎÏ‚:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>ΠεÏισσότεÏα από το 50% των αÏχείων θα αντιγÏαφοÏν ή διαγÏαφοÏν!</target> + <source>Not enough free disk space available in:</source> <target>Δεν υπάÏχει αÏκετός διαθÎσιμος χώÏος στο δίσκο:</target> + <source>Free disk space required:</source> <target>ΑπαιτοÏμενος ελεÏθεÏος χώÏος δίσκου:</target> + <source>Free disk space available:</source> <target>ΔιαθÎσιμος ελεÏθεÏος χώÏος δίσκου:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> <target></target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>Θα Ï„Ïοποποιηθεί Îνας υποκατάλογος που ανήκει σε πολλαπλά ζεÏγη υποκαταλόγων! ΠαÏακαλώ αναθεωÏείστε τις Ïυθμίσεις συγχÏονισμοÏ.</target> + <source>Processing folder pair:</source> <target>ΣÏγκÏιση του ζεÏγους υποκαταλόγων:</target> + <source>Generating database...</source> <target>ΔημιουÏγία βάσης δεδομÎνων...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>Τίποτα Ï€Ïος συγχÏονισμό με βάση τη διάταξη!</target> + <source>Error copying locked file %x!</source> <target>Σφάλμα κατά την αντιγÏαφή του κλειδωμÎνου αÏχείου %x !</target> + <source>Data verification error: Source and target file have different content!</source> <target>Σφάλμα επικÏÏωσης δεδομÎνων: Τα αÏχεία Ï€ÏοÎλευσης και Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Îχουν διαφοÏετικό πεÏιεχόμενο!</target> + diff --git a/BUILD/Languages/hebrew.lng b/BUILD/Languages/hebrew.lng index 8005b501..783227a6 100644 --- a/BUILD/Languages/hebrew.lng +++ b/BUILD/Languages/hebrew.lng @@ -8,75 +8,116 @@ </header> <source>Searching for directory %x...</source> -<target></target> +<target>מחפש מחיצה %x</target> + <source>Show in Explorer</source> <target>הר××” בסייר הקבצי×</target> + <source>Open with default application</source> <target>פתח ב×מצ×ות ×”×פליקציה המת×ימה</target> + <source>Browse directory</source> <target>עיין במחיצה</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - ×¡×™× ×›×¨×•×Ÿ ×וטומטי</target> + <source>Browse</source> <target>עיין</target> -<source>Invalid commandline: %x</source> -<target>שורת פקודות שגויה: %x</target> + +<source>Invalid command line: %x</source> +<target>שורת פקודה בלתי חוקית: %x</target> + <source>Error resolving symbolic link:</source> <target>שגי××” ×‘×¤×¢× ×•×— קישור סימבולי (Symbolic Link)</target> -<source>Show popup</source> -<target>הר××” ×—×œ×•× ×•×ª קופצי×</target> -<source>Show popup on errors or warnings</source> -<target>הר××” ×—×œ×•× ×•×ª ×§×•×¤×¦×™× ×‘×–×ž×Ÿ שגי××” ×ו תקלה</target> + +<source>Show pop-up</source> +<target>הר××” ×—×œ×•× ×•×ª מוקפצי×</target> + +<source>Show pop-up on errors or warnings</source> +<target>הר××” ×—×œ×•× ×•×ª ×ž×•×§×¤×¦×™× ×¢×‘×•×¨ שגי×ות ×ו ×זהרות</target> + <source>Ignore errors</source> <target>×”×ª×¢×œ× ×ž×˜×¢×•×™×•×ª</target> + <source>Hide all error and warning messages</source> <target>הסתר ×ת כל הודעות ההזהרה והשגי××”</target> + <source>Exit instantly</source> <target>×¦× ×ž×™×“×™×ª</target> + <source>Abort synchronization immediately</source> <target>הפסק ×¡× ×›×¨×•×Ÿ מידית</target> + +<source>Select alternate comparison settings</source> +<target>בחר הגדרות השוו××” חליפיות</target> + <source>Select alternate synchronization settings</source> -<target>בחר הגדרות ×¡× ×›×¨×•×Ÿ ××œ×˜×¨× ×˜×™×‘×™×•×ª</target> +<target>בחר הגדרות ×¡× ×›×¨×•×Ÿ חליפיות</target> + <source>No filter selected</source> <target>×œ× × ×‘×—×¨ ×ž×¡× ×Ÿ פעיל</target> + <source>Filter is active</source> <target>×ž×¡× ×Ÿ פעיל</target> + +<source>Remove alternate settings</source> +<target>הסר הגדרות תצורה חליפיות</target> + <source>Clear filter settings</source> <target>× ×§×” בחירת ×ž×¡× ×Ÿ</target> -<source>Remove alternate settings</source> -<target>הסר הגדרות תצורה ××œ×˜×¨× ×˜×™×‘×™×ª</target> + <source>Create a batch job</source> <target>יוצר עבודת ×צווה</target> + <source>Synchronization settings</source> <target>הגדרות ×¡× ×›×¨×•×Ÿ</target> + <source>Comparison settings</source> <target>הגדרות השוו××”</target> + <source>About</source> <target>×ודות</target> + <source>Error</source> <target>שגי××”</target> + <source>Warning</source> <target>×זהרה</target> + <source>Question</source> <target>ש×לה</target> + <source>Confirm</source> <target>×שר</target> + <source>Configure filter</source> <target>תצורת ×ž×¡× ×Ÿ</target> + <source>Customize columns</source> <target>סדר עמודות</target> + <source>Global settings</source> <target>×ž×©×ª× ×™× ×’×œ×•×‘×œ×™×™×</target> + <source>Synchronization Preview</source> <target>תצוגה מקדימה של ×¡× ×›×¨×•×Ÿ</target> + <source>Find</source> <target>חפש</target> + +<source>Select time span</source> +<target>בחר ×ª×—×•× ×–×ž×Ÿ</target> + <source>%x MB</source> <target>%x מגה בייט</target> + <source>%x KB</source> <target>%x קילו בייט</target> + <source>%x GB</source> <target>%x ×’×™×’×” בייט</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -85,46 +126,64 @@ <pluralform>1 בייט</pluralform> <pluralform>%x בייט</pluralform> </target> + <source><Symlink></source> <target><קשור סימבולי></target> + <source><Directory></source> <target><מחיצה></target> + <source>Size</source> <target>גודל</target> + <source>Date</source> <target>ת×רין</target> + <source>Full path</source> <target>× ×ª×™×‘ מל×</target> + <source>Filename</source> <target>×©× ×§×•×‘×¥</target> + <source>Relative path</source> <target>× ×ª×™×‘ יחסי</target> + <source>Directory</source> <target>מחיצה</target> + <source>Extension</source> <target>סיומת</target> + <source>Comparison Result</source> <target>תוצ×ות ההשוו××”</target> + <source>Incompatible synchronization database format:</source> <target>מסד × ×ª×•× ×™× ×©×œ ×”×¡× ×›×¨×•×Ÿ ×œ× ×ª×•××:</target> + <source>Initial synchronization:</source> <target>×¡× ×›×¨×•×Ÿ ר××©×•× ×™:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>×חד מקובצי בסיס ×”× ×ª×•× ×™× ×”×‘× ×¢×“×™×™×Ÿ ×œ× ×§×™×™×</target> + <source>Error reading from synchronization database:</source> <target>שגי××” בקרי××” מבסיס ×”× ×ª×•× ×™× ×©×œ ×”×¡× ×›×¨×•×Ÿ:</target> + <source>Database files do not share a common synchronization session:</source> -<target></target> +<target>קבצי בסיס ×”× ×ª×•× ×™× ××™× × ×—×•×œ×§×™× ×רוע ×¡× ×›×¨×•×Ÿ משותף:</target> + <source>An exception occurred!</source> <target>×ירוע חריג!</target> -<source>Error deleting file:</source> -<target>שגי××” במחיקת קובץ:</target> + <source>Error reading file attributes:</source> <target>שגי××” בקרי×ת ×ª×›×•× ×•×ª קובץ:</target> + <source>Waiting while directory is locked (%x)...</source> <target>ממתין ×›×שר מחיצה × ×¢×•×œ×” (%x)...</target> + <source>Error setting directory lock:</source> <target>שגי××” ×‘× ×¢×™×œ×ª מחיצה:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -133,27 +192,40 @@ <pluralform>1 ×©× ×™×™×”</pluralform> <pluralform>%x ×©× ×™×•×ª</pluralform> </target> + <source>Info</source> <target>מידע</target> + <source>Fatal Error</source> <target>שגי××” פטלית</target> + <source>Scanning:</source> <target>סורק:</target> + <source>Encoding extended time information: %x</source> <target>מקודד ××™× ×¤×•×¨×ž×¦×™×ª זמן מורחבת: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> -<target></target> +<target> +<pluralform>[תהליכון 1]</pluralform> +<pluralform>[%x ×ª×”×œ×™×›×•× ×™×]</pluralform> +</target> + <source>Invalid FreeFileSync config file!</source> <target>קובץ תצורה בלתי חוקי!</target> + <source>File does not exist:</source> <target>קובץ ×œ× ×§×™×™×:</target> + <source>Error parsing configuration file:</source> <target>שגי××” ×‘× ×™×ª×•×— קובץ תצורה:</target> + <source>/sec</source> <target>/×©× </target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -162,6 +234,7 @@ <pluralform>1 דקה</pluralform> <pluralform>%x דקות</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -170,6 +243,7 @@ <pluralform>1 שעה</pluralform> <pluralform>%x שעות</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -178,28 +252,40 @@ <pluralform>1 יו×</pluralform> <pluralform>%x ימי×</pluralform> </target> + <source>S&ave configuration...</source> <target>&שמור תצורה...</target> + <source>&Load configuration...</source> <target>&טען תצורה...</target> + <source>&Quit</source> <target>&יצי××”</target> + <source>&File</source> <target>&קובץ</target> + <source>&Content</source> <target>&תוכן</target> + <source>&About...</source> <target>&×ודות...</target> + <source>&Help</source> <target>&עזרה</target> + <source>Usage:</source> <target>שימוש:</target> + <source>1. Select directories to monitor.</source> <target>1. בחר מחיצות ×œ× ×™×˜×•×¨.</target> + <source>2. Enter a command line.</source> <target>2. הקש שורת פקודות.</target> + <source>3. Press 'Start'.</source> <target>3. לחץ 'הפעל'.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -210,310 +296,461 @@ The command line is executed each time: - כל המחיצות הופכות ×–×ž×™× ×•×ª (לדוגמה חיבור זכרון × ×ª×™×§) - ×§×‘×¦×™× ×‘×ž×—×™×¦×•×ª ×לו ×ž×©×ª× ×™× </target> + <source>Directories to watch</source> <target>מחיצות ×œ× ×™×˜×•×¨</target> + <source>Add folder</source> <target>הוסף מחיצה</target> + <source>Remove folder</source> <target>הסר מחיצה</target> + <source>Select a folder</source> <target>בחר מחיצה</target> + <source>Command line</source> <target>שורת פקודות</target> + <source>Minimum Idle Time [seconds]</source> <target>זמן ×ž× ×•×—×” ×ž×™× ×™×ž×œ×™ [×©× ×™×•×ª]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>זמן ×ž× ×•×—×” מגילוי ×©×™× ×•×™ ×חרון עד לביצוע שורת פקודה ×‘×©× ×™×•×ª</target> + <source>Start</source> <target>התחל</target> + <source>(Build: %x)</source> <target>(×ž×‘× ×”: %x)</target> + <source>RealtimeSync configuration</source> <target>RealtimeSync בקרת תצורה</target> + <source>File already exists. Overwrite?</source> <target>קובץ ×§×™×™× ×”×× ×œ×“×¨×•×¡?</target> + <source>&Restore</source> <target>&טען מחדש</target> + <source>&Exit</source> <target>&יצי××”</target> + <source>Monitoring active...</source> <target>× ×˜×¨ ×רכיב...</target> + <source>Waiting for missing directories...</source> <target>מחכה למחיצות חסרות...</target> + <source>A directory input field is empty.</source> <target>שדה ×›× ×™×¡×ª מחיצה ריק.</target> + <source>Drag && drop</source> <target>גרור והשלך</target> + <source>Could not initialize directory monitoring:</source> <target>×œ× ×™×›×•×œ ל×תחל × ×™×˜×•×¨ מחיצה:</target> + <source>Error when monitoring directories.</source> <target>שגי××” בזמן × ×™×˜×•×¨ מחיצות.</target> + <source>Conversion error:</source> <target>שגי××” בהסבה:</target> + +<source>Error deleting file:</source> +<target>שגי××” במחיקת קובץ:</target> + <source>Error moving file:</source> <target>שגי××” בהעברת קובץ:</target> + <source>Target file already existing!</source> <target>קובץ מטרה כבר קיי×!</target> + <source>Error moving directory:</source> <target>שגי××” בהעברת מחיצה:</target> + <source>Target directory already existing!</source> <target>מחיצת מטרה כבר קיימת!</target> + <source>Error deleting directory:</source> <target>שגי××” במחיקת מחיצה:</target> + <source>Error changing modification time:</source> <target>שגי××” ×‘×©×™× ×•×™ זמן:</target> + <source>Error loading library function:</source> <target>שגי××” ×‘×˜×¢×™× ×ª ספרית ×¤×•× ×§×¦×™×•×ª:</target> + <source>Error reading security context:</source> <target>שגי××” בכתיבת הקשר בטיחות:</target> + <source>Error writing security context:</source> <target>שגי××” בכתיבת הקשר בטיחות:</target> + <source>Error copying file permissions:</source> <target>שגי××” בהעתקת הרש×ות קובץ:</target> + <source>Error creating directory:</source> <target>שגי××” ביצירת מחיצה:</target> + <source>Error copying symbolic link:</source> <target>שגי××” בהעתקת קישור :</target> + <source>Error copying file:</source> <target>שגי××” בהעתקת קובץ:</target> + <source>Error opening file:</source> <target>שגי××” בפתיחת קובץ:</target> + <source>Error writing file:</source> <target>שגי××” בכתיבת קובץ:</target> + <source>Error reading file:</source> <target>שגי××” בקרי×ת קובץ:</target> + <source>Operation aborted!</source> <target>הפעולה בוטלה!</target> + +<source>Could not load a required DLL:</source> +<target>:× ×“×¨×© DLL ×œ× ×™×›×œ לטעון</target> + <source>Endless loop when traversing directory:</source> <target>× ×•×¦×¨×ª לול××” ××™× ×¡×•×¤×™×ª בחצית מחיצות</target> + <source>Error traversing directory:</source> <target>שגי××” בהצלבת מחיצות</target> + <source>Windows Error Code %x:</source> <target>קוד שגי×ת ×—×œ×•× ×•×ª %x:</target> + <source>Linux Error Code %x:</source> <target>קוד שגי×ת ×œ×™× ×•×§×¡ %x:</target> + <source>Error setting privilege:</source> <target>שגי××” בהשמת פריווילגיה</target> + <source>Error moving to Recycle Bin:</source> <target>שגי××” בהעברה לסל המיחזור:</target> -<source>Could not load a required DLL:</source> -<target>:× ×“×¨×© DLL ×œ× ×™×›×œ לטעון</target> + <source>Error writing to synchronization database:</source> <target>שגי××” ×‘×¨×™×©×•× ×œ×‘×¡×™×¡ × ×ª×•× ×™ ×¡× ×›×¨×•×Ÿ:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>שגיעה ×‘×”×ª× ×¢×ª שרות העתקת צללי ×›×¨×›×™× (Volume Shadow Copy Service)!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target>שגי××” בגישה לשרות Volume Shadow Copy Service</target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>×œ× × ×ª×ž×›×ª בגרסה ×–×ת ×× × ×”×ª×§×Ÿ גרסה 64 WOW64 העתקת צל ב</target> + <source>Could not determine volume name for file:</source> <target>×œ× ×™×›×•×œ לקבוע ×©× ×›×¨×š לקובץ:</target> + <source>Volume name %x not part of filename %y!</source> <target>×›× ×•× ×Ÿ %x ×œ× ×‘× ×ª×™×‘ של קובץ %y!</target> + <source>%x TB</source> <target>%x טרה בייט</target> + <source>%x PB</source> <target>%x פטה בייט</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>XML ×œ× ×™×›×•×œ ×œ×§×¨× ×¢×¨×›×™× ×ž×¦×ž×ª×™ :</target> + <source>Logging</source> <target>×¨×™×©×•× ×‘×™×•×ž×Ÿ</target> + <source>FreeFileSync batch file</source> <target>FreeFileSync קובץ ×צווה</target> + <source>FreeFileSync configuration</source> <target>FreeFileSync הגדרות</target> + <source>FreeFileSync Batch Job</source> <target>FreeFileSync עבודת ×צווה</target> + <source>Unable to create logfile!</source> <target>×œ× ×ž×¡×•×’×œ ליצור יומן!</target> + <source>Batch execution</source> <target>פעולת ×צווה</target> + <source>Log-messages:</source> <target>הודעת יומן:</target> + <source>Stop</source> <target>עצור</target> + <source>Total time:</source> <target>זמן כולל:</target> + <source>Synchronization aborted!</source> <target>×¡×™× ×›×¨×•×Ÿ בוטל!</target> + <source>Synchronization completed with errors!</source> <target>×¡× ×›×¨×•×Ÿ ×”×•×©×œ× ×¢× ×©×’×™×ות!</target> + <source>Synchronization completed successfully!</source> <target>×¡×™× ×›×¨×•×Ÿ ×”×•×©×œ× ×‘×”×¦×œ×—×”!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>"לחץ" לפתיחת FreeFileSync בממשק גרפי.</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>החלף לתצורת ממשק חזותי...</target> + <source>Unable to connect to sourceforge.net!</source> <target>×ין תקשורת ל sourceforge.net!</target> + <source>A newer version of FreeFileSync is available:</source> <target>קיימת גירסה חדשה יותר:</target> + <source>Download now?</source> <target>הורד עכשיו?</target> + <source>Information</source> <target>מידע</target> + <source>FreeFileSync is up to date!</source> <target>FreeFileSync מעודכן לגירסה ×”××—×¨×•× ×”!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>×”×× ×‘×¨×¦×•× ×š ×©×”×ª×•×›× ×” תבדוק לעדכון בכל שבוע?</target> + <source>(Requires an Internet connection!)</source> <target>(מחייב קישור ××™× ×˜×¨× ×˜×™ פעיל!)</target> + <source>1. &Compare</source> <target>1. &השווה</target> + <source>2. &Synchronize...</source> <target>2. &×¡× ×›×¨×Ÿ...</target> + <source>S&witch view</source> <target>החל&×£ תצוגה</target> + <source>&New</source> <target>&חדש</target> + <source>&Program</source> <target>&×ª×•×›× ×”</target> + <source>&Language</source> <target>&שפה</target> + <source>&Global settings...</source> <target>&×ž×©×ª× ×™× ×’×œ×•×‘×œ×™×™×...</target> + <source>&Create batch job...</source> <target>&צור קובץ ×צווה...</target> + <source>&Export file list...</source> <target>&×™×¦× ×¨×©×™×ž×ª קבצי×...</target> + <source>&Advanced</source> <target>&מתקד×</target> + <source>&Check for new version</source> <target>&בדוק ×œ×’×™×¨×¡× ×—×“×©×”</target> + <source>Compare</source> <target>השוו××”</target> + <source>Compare both sides</source> <target>השווה בין ×©× ×™ הצדדי×</target> + <source>&Abort</source> <target>&× ×˜×•×©</target> + <source>Synchronize...</source> <target>...×¡× ×›×¨×Ÿ</target> + <source>Start synchronization</source> <target>התחל ×¡× ×›×¨×•×Ÿ</target> -<source>Swap sides</source> -<target>החלף צדדי×</target> + <source>Add folder pair</source> <target>הוסף זוג מחיצות</target> + <source>Remove folder pair</source> <target>הסר זוג מחיצות</target> + +<source>Swap sides</source> +<target>החלף צדדי×</target> + <source>Save current configuration to file</source> <target>שמור תצורה × ×•×›×—×™×ª לקובץ</target> + <source>Load configuration from file</source> <target>טען ×§×•× ×¤×™×’×•×¨×¦×™×” מקובץ</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>תצורות ××—×¨×•× ×•×ª שהיו בשמוש (לחץ DEL להסרה מהרשימה)</target> + <source>Hide excluded items</source> <target>×”×—×‘× ×¤×¨×™×˜×™× × ×©×œ×œ×™×</target> + <source>Hide filtered or temporarily excluded files</source> <target>×”×—×‘× ×§×‘×¦×™× ×ž×¡×•× × ×™× ×ו × ×©×œ×œ×™×</target> + <source>Number of files and directories that will be created</source> <target>מספר התקיות ×•×”×§×‘×¦×™× ×שר ×¢×•×ž×“×™× ×œ×”×™×•×¦×¨</target> + <source>Number of files that will be overwritten</source> <target>מספר ×”×§×‘×¦×™× ×”×¢×•×ž×“×™× ×œ×”×™×›×ª×‘ מחדש</target> + <source>Number of files and directories that will be deleted</source> <target>מספר ×”×§×‘×¦×™× ×•×”×ª×™×§×™×•×ª ×”×¢×•×ž×“×™× ×œ×”×™×ž×—×§</target> + <source>Total amount of data that will be transferred</source> <target>סך הכל × ×ª×•× ×™× ×œ×”×¢×‘×¨×”</target> -<source>Left</source> -<target>שמ×ל</target> -<source>Right</source> -<target>ימין</target> + <source>Batch job</source> <target>עבודת ×צווה</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>יצור קובץ ×צווה ×œ×¡× ×›×¨×•×Ÿ ×וטומטי. להפעלה ב×צווה העבר ×ת ×©× ×”×§×•×‘×¥ כפרמטר ×œ×ª×•×›× ×” FreeFileSync.exe <batchfile>. ×פשר ×’× ×œ×”×©×ª×ž×© ×‘×ž× ×”×œ המשימות ×”×ž×ª×•×–×ž× ×•×ª של המערכת.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target>צור קובץ ×צווה ×œ×¡×™× ×›×¨×•×Ÿ ×וטומטי. הפעל ב×מצעות הקשה כפולה על הקובץ ×ו ב×מצעות שורת פקודה: FreeFileSync <ffs_batch_file>. ההפעלה × ×™×ª× ×ª לתזמון במתזמן המשימות של המערכת.</target> + <source>Help</source> <target>עזרה</target> + <source>Filter files</source> <target>קבצי ×”×ž×¡× ×Ÿ</target> + <source>Error handling</source> <target>טיפול בשגי×ות</target> + +<source>Left</source> +<target>שמ×ל</target> + +<source>Right</source> +<target>ימין</target> + <source>Overview</source> <target>מבט כללי</target> + <source>Status feedback</source> <target>משוב מצב</target> + <source>Run minimized</source> -<target></target> +<target>הרץ במצב מוקטן</target> + <source>Maximum number of logfiles:</source> <target>מספר מכסימלי של קבצי יומן</target> + <source>Select logfile directory:</source> <target>בחר מחיצה לקבצי יומן</target> + <source>Batch settings</source> -<target></target> +<target>הגדרות ×צווה</target> + <source>&Save</source> <target>&שמירה</target> + <source>&Load</source> <target>&טען</target> + <source>&Cancel</source> <target>&בטל</target> + <source>Elements found:</source> <target>××œ×ž× ×˜×™× × ×ž×¦×ו:</target> + <source>Elements remaining:</source> <target>××œ×ž× ×ª×™× × ×•×ª×¨×•:</target> + <source>Speed:</source> <target>מהירות:</target> + <source>Time remaining:</source> <target>זמן × ×•×ª×¨:</target> + <source>Time elapsed:</source> <target>זמן עבר:</target> + <source>Operation:</source> <target>פעולה:</target> + <source>Select variant:</source> <target>בחר ×ž×©×ª× ×”:</target> + <source><Automatic></source> <target><×וטומטי></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>×–×”×” והפץ ×©×™× ×•×™×™× ×‘×©× ×™ ×”×¦×“×“×™× ×‘×¢×–×¨×ª בסיס × ×ª×•× ×™×. מחיקות ×•×§×•× ×¤×œ×™×§×˜×™× ×ž×–×•×”×™× ×‘×ופן ×וטומטי.</target> + <source>Mirror ->></source> <target><<- מר××”</target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>גיבוי מר××” של מחיצה שמ×לית. מחיצה ×™×ž× ×™×ª תהיה ×–×”×” לשמ×לית ל×חר ×”×¡×™× ×›×¨×•×Ÿ.</target> + <source>Update -></source> <target><- שדרג</target> + <source>Copy new or updated files to right folder.</source> <target>העתק ×§×‘×¦×™× ×—×“×©×™× ×ו ×ž×¢×•×“×›× ×™× ×œ×ž×—×™×¦×” ×”×™×ž× ×™×ª.</target> + <source>Custom</source> <target>מות××</target> + <source>Configure your own synchronization rules.</source> <target>סדר ×ת כללי ×”×¡× ×›×¨×•×Ÿ שלך.</target> + <source>Deletion handling</source> <target>טיפול במחיקות</target> + <source>&OK</source> <target>&×שר</target> + <source>Configuration</source> <target>תצורה</target> + <source>Category</source> <target>קטגוריה</target> + <source>Action</source> <target>פעולה</target> + <source>File/folder exists on left side only</source> <target>קובץ\מחיצה ×§×™×™× ×‘×¦×“ שמ×ל בלבד</target> + <source>File/folder exists on right side only</source> <target>קובץ\מחיצה ×§×™×™× ×‘×¦×“ ימין בלבד</target> + <source>Left file is newer</source> <target>צד שמ×ל חדש יותר</target> + <source>Right file is newer</source> <target>צד ימין חדש יותר</target> + <source>Files have different content</source> <target>×”×§×‘×¦×™× ×‘×¢×œ×™ תכולה ×©×•× ×”</target> + <source>Conflict/file cannot be categorized</source> <target>×§×•× ×¤×œ×™×§×˜\קובץ ××™× ×• יכול לקבל סיווג</target> + <source>Compare by...</source> <target>השווה ×¢"×™...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> <target> -×§×‘×¦×™× ×ž×•×’×“×¨×™× ×›×–×”×™× ×× - - גודל הקובץ +×”×§×‘×¦×™× ×™×™×ž×¦×ו ×›×–×”×™× ×× - זמן ות×ריך שמירה ××—×¨×•× ×™× + - גודל קובץ ×”× ×–×”×™× </target> -<source>File size and date</source> -<target>גודל קובץ ות×ריך</target> + +<source>File time and size</source> +<target>זמן וגודל קובץ</target> + <source> Files are found equal if - file content @@ -524,92 +761,85 @@ is the same - תכולת הקובץ ×”×™× ×–×”×” </target> + <source>File content</source> <target>תכולת הקובץ</target> + <source>Symbolic Link handling</source> <target>טיפול בקישור סימבולי</target> + <source>Synchronizing...</source> <target>×ž×¡× ×›×¨×Ÿ...</target> + <source>Elements processed:</source> <target>××œ×ž× ×˜×™× ×¢×•×‘×“×•:</target> + <source>&Pause</source> <target>&עצור</target> -<source>Compare by "File size and date"</source> -<target>"File size and date" השווה ×¢"×™ גודל הקובץ ות×ריך</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>הורי×ציה ×”×–×ת מעריכה ×ת 2 ×”×§×‘×¦×™× ×‘×ž×™×“×” שווה ×›×שר ×©×ž× ×–×”×” ויש ×œ×”× ×’×•×“×œ ×–×”×” ות×ריך ×”×¨×™×©×•× ×”×חרון ×–×”×”</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>×›×שר ההשוו××” מתחילה בעזרת הבחירות ×”× ×‘×—×¨×•×ª ×¢×¥ ההחלטות ×”×‘× ×ž×ª×‘×¦×¢:</target> -<source>As a result the files are separated into the following categories:</source> -<target>כתוצ××” ×”×§×‘×¦×™× ×¡×•×•×’×• לפי הקטגוריות הב×ות:</target> -<source>- equal</source> -<target>- שווה</target> -<source>- left newer</source> -<target>- שמ×לי חדש יותר</target> -<source>- right newer</source> -<target>- ×™×ž× ×™ חדש יותר</target> -<source>- exists left only</source> -<target>- × ×ž×¦× ×ž×©×ž×ל בלבד</target> -<source>- exists right only</source> -<target>- × ×ž×¦× ×ž×™×ž×™×Ÿ בלבד</target> -<source>- conflict (same date, different size)</source> -<target>- ת×ריך ×–×”×” - גודל ×©×•× ×”) ×§×•× ×¤×œ×™×§×˜)</target> -<source>Compare by "File content"</source> -<target>"File content" השווה ×¢"×™ תכולת הקובץ</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. -With this option enabled the decision tree is smaller: -</source> -<target> -כמשתמע, ×©× ×™ ×§×‘×¦×™× ×”×—×•×œ×§×™× ×©× ×–×”×” ×ž×¡×•×ž× ×™× ×›×–×”×™× ×× ×•×¨×§ ×× ×”× ×‘×¢×œ×™ תכולה ×–×”×”. פעולה זו שימושית לבדיקת עקביות יותר מ×שר לעולות גיבוי. לכן תגי הזמן ××™× × ×ž×©×ž×©×™× ×›×œ×œ לצורך הבדיקה. - -×›×שר ×פשרות זו פעילה ×¢×¥ ההחלטות ×”×•× ×§×˜×Ÿ יותר: -</target> -<source>- different</source> -<target>- ×©×•× ×”</target> <source>Source code written in C++ utilizing:</source> <target>קוד מקור × ×›×ª×‘ ב- C++ ב×מצעות:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>תודות עבור עבודות ×”×ª×¨×’×•× ×©×œ ×ª×•×›× ×ª ×”×¡× ×›×¨×•×Ÿ:</target> + <source>Feedback and suggestions are welcome at:</source> <target>תגובות והצעות ותקבלו בברכה:</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync ב Sourceforge</target> + <source>Homepage</source> <target>×תר-הבית:</target> + <source>If you like FFS</source> <target>במידה ו-FFS מוצ×ת חן ×‘×¢×™× ×›×</target> + <source>Donate with PayPal</source> <target>×ª×¨×•× ×¢× ×¤×™×™×¤×œ</target> + <source>Email</source> <target>דו×"ל:</target> + <source>Report translation error</source> <target>דווח שגי×ת תרגו×:</target> + <source>Published under the GNU General Public License:</source> <target>×ž×¤×•×¨×¡× ×‘×ž×¡×’×¨×ª GNU General Public License:</target> + <source>Ignore subsequent errors</source> <target>×”×ª×¢×œ× ×ž×©×’×™×ות × ×™×©× ×•×ª</target> + <source>Hide further error messages during the current process</source> <target>הסתר הודעות שגי××” × ×•×¡×¤×•×ª בהמשך התהליך ×”× ×•×›×—×™</target> + <source>&Ignore</source> <target>&התעל×</target> + <source>&Retry</source> <target>&× ×¡×” ×©× ×™×ª</target> + <source>Do not show this dialog again</source> <target>×ל תר××” מסך ×–×” ×©× ×™×ª</target> + <source>&Switch</source> <target>&החלפה</target> + <source>&Yes</source> <target>&כן</target> + <source>&No</source> <target>&ל×</target> + <source>Delete on both sides</source> <target>מחק ×‘×©× ×™ הצדדי×</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>מחק ×‘×©× ×™ ×”×¦×“×“×™× ××£ ×× ×”×§×•×‘×¥ × ×‘×—×¨ בצד ×חד בלבד</target> + <source>Use Recycle Bin</source> <target>השתמש בסל המיחזור</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -618,16 +848,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire רק קבצי×\מחיצות המת××™×ž×™× ×œ×›×œ הגדרות ×”×ž×¡× ×Ÿ ×™×¡×•×ž× ×• ×œ×¡×™× ×›×¨×•×Ÿ. הערה: ×”×©× ×œ×¡×™× ×•×Ÿ חייב להיות מוגדר ב×ו×ן יחסי (!) למחיצות הר×שיות ×œ×¡×™× ×›×¨×•×Ÿ. </target> + <source>Hints:</source> <target>טיפי×:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. ×”×›× ×¡ ×©× ×§×•×‘×¥ ×ו ×©× ×ª×™×§×™×” ×ž×•×¤×¨×“×™× ×¢"×™ ';' ×ו דורה חדשה</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. השתמש ב××©×¤×™× '*' ×ו '?'לבחירה מרובה.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. ×”×•×¦× ×§×‘×¦×™× ×”×™×™×©×¨ ב×סכלה עיקרית דרך תפריט הקשר.</target> + <source>Example</source> <target>דוגמה</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -636,30 +872,40 @@ Exclude: \stuff\temp\* כלול: *.doc;*.zip;*.exe ×ל תכלול: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>×¡× ×›×¨×Ÿ .doc, .zip und .exe כל ×”×§×‘×¦×™× ×‘×ª×™×§×™×ª ×ž×©× ×” "temp".</target> + <source>Include</source> <target>כלול</target> + <source>Exclude</source> <target>×ל תכלול</target> -<source>Select time span:</source> -<target>סמן טווח זמן</target> -<source>Minimum file size:</source> + +<source>Minimum file size</source> <target>גודל קובץ ×ž×™× ×™×ž×œ×™</target> -<source>Maximum file size:</source> -<target>גודל קובץ מכסימלי</target> + +<source>Maximum file size</source> +<target>גודל קובץ מקסימלי</target> + <source>&Default</source> <target>&ברירת מחדל</target> + <source>Move column up</source> <target>העלה עמודה</target> + <source>Move column down</source> <target>הורד עמודה</target> -<source>Transactional File Copy</source> -<target></target> + +<source>Transactional file copy</source> +<target>העתקת קובץ בעסקה</target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> -<target></target> +<target>×¨×©×•× ×§×‘×¦×™× ×›×–×ž× ×™×™× (*.ffs_tmp) ו××—"×› ×©× ×” שמ×. פעולה זו מבטיחה עקביות ×ž×©×ª× ×™ × ×ž×¦×‘ ×’× ×‘×ž×§×¨×” של שגי××” ×§×˜×œ× ×™×ª</target> + <source>Copy locked files</source> <target>העתק ×§×‘×¦×™× × ×¢×•×œ×™×</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -668,8 +914,10 @@ Copy shared or locked files using Volume Shadow Copy Service העתק ×§×‘×¦×™× ×‘×©×™×ª×•×£ ×ו × ×¢×•×œ×™× ×‘×מצעות שרות Volume Shadow Copy Service (דורש הרש×ות ×ž× ×”×œ מערכת) </target> -<source>Copy filesystem permissions</source> -<target>העתק הרש×ות של מערכת הקבצי×</target> + +<source>Copy file access permissions</source> +<target>העתק הרש×ות גישה של הקובץ</target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -678,138 +926,205 @@ Transfer file and directory permissions העבר הרש×ות ×§×‘×¦×™× ×•×ž×—×™×¦×•×ª (דורש הרש×ות ×ž× ×”×œ מערכת) </target> + <source>Hidden dialogs:</source> <target>די××œ×•×’×™× ×ž×•×¡×ª×¨×™×:</target> + <source>Reset</source> <target>×פס</target> + <source>Show hidden dialogs</source> <target>הר××” די××œ×•×’×™× × ×¡×ª×¨×™×</target> + <source>External applications</source> <target>×ª×•×›× ×” ×—×™×¦×•× ×™×ª</target> + <source>Description</source> <target>ת×ור</target> + <source>Variant</source> <target>×ž×©×ª× ×”</target> + <source>Statistics</source> <target>סטטיסטיקה</target> + <source>Find what:</source> <target>חפש מה:</target> + <source>Match case</source> <target>הת×× ×¨×™×©×™×•×ª</target> + <source>&Find next</source> <target>&×ž×¦× ×”×‘×</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>!ב×פשרותך ×œ× ×¡×•×ª ×œ×¡× ×›×¨×Ÿ ×ת ×”×¢×¦×ž×™× ×”× ×•×ª×¨×™× ×ž×‘×œ×™ להשוות מחדש</target> -<source>Batch file created successfully!</source> -<target>קובץ ×צווה × ×•×¦×¨ בהצלחה!</target> + <source>Main bar</source> <target>סרגל ר×שי</target> + <source>Folder pairs</source> <target>זוגות מחיצות</target> + <source>Select view</source> <target>בחר תצוגה</target> + <source>Set direction:</source> <target>בחר כוון:</target> + <source>Exclude temporarily</source> <target>×ל תכלול ×–×ž× ×™×ª</target> + <source>Include temporarily</source> <target>כלול ×–×ž× ×™×ª</target> + <source>Exclude via filter:</source> <target>×ל תכלול בעזרת ×¡× ×Ÿ:</target> + <source><multiple selection></source> <target><בחירה מרובה></target> + <source>D-Click</source> <target>לחיצה-כפולה</target> + <source>Delete</source> <target>מחק</target> + <source>Customize...</source> <target>מות×× ×ישית...</target> + +<source>Select time span...</source> +<target>בחר ×ª×—×•× ×–×ž×Ÿ...</target> + <source>Auto-adjust columns</source> <target>עימוד ×וטומטי</target> + <source>Include all rows</source> <target>כלול ×ת כל השורות</target> + <source>Exclude all rows</source> <target>×ל תכלול ×ת כל השורות</target> + <source>Reset view</source> <target>×פס תצוגה</target> + <source>Show "%x"</source> <target>הר××” "%x"</target> + <source><Last session></source> <target><פעילות ××—×¨×•× ×”></target> + <source>Configuration saved!</source> <target>תצורה × ×©×ž×¨×”!</target> + <source>Save changes to current configuration?</source> <target>שמור ×©×™× ×•×™×™× ×œ×ª×¦×•×¨×” × ×•×›×—×™×ª?</target> + <source>Configuration loaded!</source> <target>תצורה ×”×•×˜×¢× ×”!</target> + <source>Folder Comparison and Synchronization</source> <target>×¡× ×›×¨×•×Ÿ ×§×‘×¦×™× ×•×ž×—×™×¦×•×ª</target> + <source>Hide files that exist on left side only</source> <target>הסתר ×§×‘×¦×™× ×”×§×™×ž×™× ×ך ורק בצד שמ×ל</target> + <source>Show files that exist on left side only</source> <target>הר××” ×§×‘×¦×™× ×”× ×ž×¦××™× ×ך ורק בצד שמ×ל</target> + <source>Hide files that exist on right side only</source> <target>הסתר ×§×‘×¦×™× ×”×§×™×ž×™× ×ך ורק בצד ימין</target> + <source>Show files that exist on right side only</source> <target>הר××” ×§×‘×¦×™× ×”× ×ž×¦××™× ×ך ורק בצד ימין</target> + <source>Hide files that are newer on left</source> <target>הסתר ×§×‘×¦×™× ×—×“×©×™× ×™×•×ª×¨ בצד שמ×ל</target> + <source>Show files that are newer on left</source> <target>הר××” ×§×‘×¦×™× ×—×“×©×™× ×™×•×ª×¨ בצד שמ×ל</target> + <source>Hide files that are newer on right</source> <target>הסתר ×§×‘×¦×™× ×—×“×©×™× ×™×•×ª×¨ בצד ימין</target> + <source>Show files that are newer on right</source> <target>הר××” ×§×‘×¦×™× ×—×“×©×™× ×™×•×ª×¨ בצד ימין</target> + <source>Hide files that are equal</source> <target>הסתר ×§×‘×¦×™× ×©××™× × ×©×•×•×™×</target> + <source>Show files that are equal</source> <target>הר××” ×§×‘×¦×™× ×©×•×•×™×</target> + <source>Hide files that are different</source> <target>הסתר ×§×‘×¦×™× ×©×•× ×™×</target> + <source>Show files that are different</source> <target>הר××” ×§×‘×¦×™× ×©×•× ×™×</target> + <source>Hide conflicts</source> <target>הסתר ×§×•× ×¤×œ×™×§×˜×™×</target> + <source>Show conflicts</source> <target>הר××” ×§×•× ×¤×œ×™×§×˜×™×</target> + <source>Hide files that will be created on the left side</source> <target>הסתר ×§×‘×¦×™× ×©×™×™×•×¦×¨×• בצד שמ×ל</target> + <source>Show files that will be created on the left side</source> <target>הר××” ×§×‘×¦×™× ×©×™×•×•×¦×¨×• בצד שמ×ל</target> + <source>Hide files that will be created on the right side</source> <target>הסתר ×§×‘×¦×™× ×©×™×™×•×¦×¨×• בצד ימין</target> + <source>Show files that will be created on the right side</source> <target>הר××” ×§×‘×¦×™× ×©×™×•×•×¦×¨×• בצד ימין</target> + <source>Hide files that will be deleted on the left side</source> <target>הסתר ×§×‘×¦×™× ×©×™×ž×—×§×• בצד שמ×ל</target> + <source>Show files that will be deleted on the left side</source> <target>הר××” ×§×‘×¦×™× ×©×™×ž×—×§×• בצד שמ×ל</target> + <source>Hide files that will be deleted on the right side</source> <target>הסתר ×§×‘×¦×™× ×©×™×ž×—×§×• בצד ימין</target> + <source>Show files that will be deleted on the right side</source> <target>הר××” ×§×‘×¦×™× ×©×™×ž×—×§×• בצד ימין</target> + <source>Hide files that will be overwritten on left side</source> <target>הסתר ×§×‘×¦×™× ×©×™×“×¨×¡×• בצד שמ×ל</target> + <source>Show files that will be overwritten on left side</source> <target>הר××” ×§×‘×¦×™× ×©×™×“×¨×¡×• בצד שמ×ל</target> + <source>Hide files that will be overwritten on right side</source> <target>הסתר ×§×‘×¦×™× ×©×™×“×¨×¡×• בצד ימין</target> + <source>Show files that will be overwritten on right side</source> <target>הר××” ×§×‘×¦×™× ×©×™×“×¨×¡×• בצד ימין</target> + <source>Hide files that won't be copied</source> <target>הסתר ×§×‘×¦×™× ×שר ×œ× ×™×•×¢×ª×§×•</target> + <source>Show files that won't be copied</source> <target>הר××” ×§×‘×¦×™× ×©×œ× ×™×•×¢×ª×§×•</target> + <source>All directories in sync!</source> <target>כל המחיצות ×ž×¡×•× ×›×¨× ×•×ª!</target> + <source>Please run a Compare first before synchronizing!</source> <target>הרץ השוו××” ×œ×¤× ×™ ×¡× ×›×¨×•×Ÿ!</target> + <source>Comma separated list</source> <target>רשימה מופרדת פסיקי×</target> + <source>Legend</source> <target>מקר×</target> + <source>File list exported!</source> <target>רשימת ×§×‘×¦×™× ×™×•×¦××”!</target> + +<source>Batch file created successfully!</source> +<target>קובץ ×צווה × ×•×¦×¨ בהצלחה!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -818,6 +1133,7 @@ Transfer file and directory permissions <pluralform>×”×¢×¦× × ×ž×—×§ בהצלחה!</pluralform> <pluralform>%x ×¢×¦×ž×™× × ×ž×—×§×• בהצלחה!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -826,6 +1142,7 @@ Transfer file and directory permissions <pluralform>1 מחיצה</pluralform> <pluralform>%x מחיצות</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -834,6 +1151,7 @@ Transfer file and directory permissions <pluralform>1 קובץ</pluralform> <pluralform>%x קבצי×</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -842,72 +1160,97 @@ Transfer file and directory permissions <pluralform>%x מתוך 1 שורה בתצוגה</pluralform> <pluralform>%x מתוך %y שורות בתצוגה</pluralform> </target> + <source>Scanning...</source> <target>סורק...</target> + <source>Comparing content...</source> <target>משווה תכולה...</target> + <source>Paused</source> <target>עצור</target> + <source>Aborted</source> <target>הופסק</target> + <source>Completed</source> <target>הושל×</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>התקבלה בקשת ביטול: מחכה לפעולה ×”× ×•×›×—×™×ª להסתיי×...</target> + <source>Continue</source> <target>המשך</target> + <source>Pause</source> <target>עצור</target> + <source>Cannot find %x</source> <target>×œ× ×ž×•×¦× %x</target> -<source>DECISION TREE</source> -<target>×¢×¥-החלטה</target> -<source>file exists on both sides</source> -<target>קובץ × ×ž×¦× ×‘×©× ×™ הצדדי×</target> -<source>on one side only</source> -<target>בצד ×חד בלבד</target> -<source>same date</source> -<target>ת×ריך ×–×”×”</target> -<source>different date</source> -<target>ת×ריך ×©×•× ×”</target> + <source>Inactive</source> <target>בלתי פעיל</target> -<source>Second</source> -<target>×©× ×™×™×”</target> -<source>Minute</source> -<target>דקה</target> -<source>Hour</source> -<target>שעה</target> -<source>Day</source> -<target>יממה</target> + +<source>Last x hours</source> +<target>x שעות ××—×¨×•× ×•×ª</target> + +<source>Today</source> +<target>היו×</target> + +<source>This week</source> +<target>בשבוע ×”× ×•×›×—×™</target> + +<source>This month</source> +<target>בחודש ×”× ×•×›×—×™</target> + +<source>This year</source> +<target>×‘×©× ×” ×”× ×•×›×—×™×ª</target> + <source>Byte</source> <target>בייט</target> + <source>KB</source> <target>קילו-בייט</target> + <source>MB</source> <target>מגה-בייט</target> + <source>Filter: All pairs</source> <target>כל הזוגות :×ž×¡×•× ×Ÿ</target> + <source>Filter: Single pair</source> <target>זוג ×חד :×ž×¡×•× ×Ÿ</target> + <source>Ignore</source> <target>התעל×</target> + <source>Direct</source> <target>כוון</target> + <source>Follow</source> <target>עקוב</target> + +<source>Copy NTFS permissions</source> +<target>העתק הרש×ות NTFS</target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>הטמע ×ª×•×›× ×•×ª ×—×™×¦×•× ×™×•×ª. תפריטי המקרו הב××™× ×–×ž×™× ×™×:</target> + <source>- full file or directory name</source> <target>- ×©× ×ž×œ× ×©×œ קובץ ×ו תיקיה</target> + <source>- directory part only</source> <target>- חלק התיקיה בלבד</target> + <source>- Other side's counterpart to %name</source> <target>- הצד ×”×©× ×™ מקביל ל- %name</target> + <source>- Other side's counterpart to %dir</source> <target>- הצד ×”×©× ×™ מקביל ל- %dir</target> + <source>Restore all hidden dialogs?</source> <target>שחזר כל הדי××œ×•×’×™× ×”× ×¡×ª×¨×™×?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -916,6 +1259,7 @@ Transfer file and directory permissions <pluralform>×”×× ×œ×”×¢×‘×™×¨ ×ת ×”×¢×¦× ×”×‘× ×œ×¡×œ המיחזור?</pluralform> <pluralform>×”×× ×œ×”×¢×‘×™×¨ ×ת %x ×”×¢×¦×ž×™× ×”×‘××™× ×œ×¡×œ המיחזור?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -924,139 +1268,211 @@ Transfer file and directory permissions <pluralform>×”×× ×œ×ž×—×•×§ ×ת ×”×¢×¦× ×”×‘×?</pluralform> <pluralform>×”×× ×œ×ž×—×•×§ ×ת %x ×”×¢×¦×ž×™× ×”×‘××™×?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>הש×ר ×›×§×•× ×¤×œ×™×§×˜ ×œ× ×ž×˜×•×¤×œ</target> + <source>Delete permanently</source> <target>מחק לצמיתות</target> + <source>Delete or overwrite files permanently</source> <target>מחק ×ו דרוס ×§×‘×¦×™× ×œ×¦×ž×™×ª×•×ª</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>השתמש בסל המיחזור ×›×שר מוחק ×ו דורס קבצי×</target> + <source>Versioning</source> <target>עדכון גרס×ות</target> + <source>Move files into a time-stamped subdirectory</source> <target>העבר ×§×‘×¦×™× ×œ×ª×•×š מחיצות ×¢× ×©× ×”×ž×›×™×œ טביעת זמן ות×ריך</target> -<source>Cannot determine sync-direction:</source> -<target>×œ× ×ž×–×”×” כוון ×¡× ×›×¨×•×Ÿ:</target> -<source>Filter settings have changed!</source> -<target>קביעת ×”×ž×¡× ×Ÿ ×©×•× ×•!</target> + <source>Both sides have changed since last synchronization!</source> <target>×©× ×™ ×”×¦×“×“×™× ×©×•× ×• מ××– ×”×¡× ×›×¨×•×Ÿ ×”×חרון!</target> + +<source>Cannot determine sync-direction:</source> +<target>×œ× ×ž×–×”×” כוון ×¡× ×›×¨×•×Ÿ:</target> + <source>No change since last synchronization!</source> <target>×ין ×©×™× ×•×™ מ××– ×”×¡× ×›×¨×•×Ÿ ×”×חרון!</target> + +<source>Filter settings have changed!</source> +<target>קביעת ×”×ž×¡× ×Ÿ ×©×•× ×•!</target> + <source>The file was not processed by last synchronization!</source> <target>קובץ ×–×” ×œ× ×˜×•×¤×œ ×‘×¡× ×›×¨×•×Ÿ ×”×חרון!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>מחיצה המיועדת למחיקה מצויה בסתירה לתקיות ×”×ž×©× ×” ולקבצי×!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>בחר ברירת מחדל של ×¡× ×›×¨×•×Ÿ: ×§×‘×¦×™× ×™×©× ×™× ×™×“×¨×¡×• ×¢"×™ ×§×‘×¦×™× ×—×“×©×™× ×™×•×ª×¨.</target> + <source>The file does not contain a valid configuration:</source> <target>קובץ ×–×” ×œ× ×ž×›×™×œ ×§×•× ×¤×™×’×•×¨×¦×™×” ברת תוקף</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>×פשר ×œ×”×ª×¢×œ× ×ž×©×’×™××” זו ×•×œ×”× ×™×— ×›×™ המחיצה ריקה.</target> + <source>Directory does not exist:</source> <target>מחיצה ×œ× ×§×™×™×ž×ª:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>מחיצות תלויות! זהירות בהגדרת כללי ×¡× ×›×¨×•×Ÿ:</target> + <source>Comparing content of files %x</source> <target>השווה תכולה של ×§×‘×¦×™× %x</target> + <source>Memory allocation failed!</source> <target>הקצ×ת זכרון × ×›×©×œ×”!</target> + <source>File %x has an invalid date!</source> <target>קובץ %x מכיל ת×ריך שגוי!</target> + <source>Conflict detected:</source> <target>התגלה ×§×•× ×¤×œ×™×§×˜:</target> + <source>Files %x have the same date but a different size!</source> <target>קובץ %x בעל ת×ריך ×–×”×” ×ך גודל ×©×•× ×”!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>קשור סימבולי %x בעל ת×ריך ×–×”×” ×ך מטרה ×©×•× ×”!</target> + <source>Comparing files by content failed.</source> <target>השוו×ת ×§×‘×¦×™× ×‘×מצעות תכולה × ×›×©×œ×”.</target> + <source>Generating file list...</source> <target>מייצר רשימת קבצי×...</target> + <source>Multiple...</source> <target>הכפל...</target> + <source>Both sides are equal</source> <target>×©× ×™ ×”×¦×“×“×™× ×©×•×•×™×</target> + <source>Files/folders differ in attributes only</source> <target>קבצי×\מחיצות ×©×•× ×™× ×‘×¢×¨×›×™ ×”×ª×›×•× ×•×ª בלבד</target> + <source>Copy new file/folder to left</source> <target>העתק קובץ\מחיצה חדש\×” מימין לשמ×ל</target> + <source>Copy new file/folder to right</source> <target>העתק קובץ\מחיצה חדש\×” משמ×ל לימין</target> + <source>Delete left file/folder</source> <target>מחק קובץ\מחיצה בצד שמ×ל</target> + <source>Delete right file/folder</source> <target>מחק קובץ\מחיצה בצד ימין</target> + <source>Overwrite left file/folder with right one</source> <target>העתק ודרוס קובץ\מחיצה מימין לשמ×ל</target> + <source>Overwrite right file/folder with left one</source> <target>העתק ודרוס קובץ\מחיצה משמ×ל לימין</target> + <source>Do nothing</source> <target>×ל תעשה כלו×</target> + <source>Copy file attributes only to left</source> <target>העתק ×ª×›×•× ×•×ª קובץ בלבד מימין לשמ×ל</target> + <source>Copy file attributes only to right</source> <target>העתק ×ª×›×•× ×•×ª קובץ בלבד משמ×ל לימין</target> + <source>Deleting file %x</source> <target>מוחק קובץ %x</target> -<source>Deleting Symbolic Link %x</source> -<target>מוחק קישור סימבולי %x</target> + <source>Deleting folder %x</source> <target>מוחק מחיצה %x</target> -<source>Moving %x to Recycle Bin</source> -<target>מעביר %x לסל המיחזור</target> -<source>Moving file %x to user-defined directory %y</source> -<target>מעביר קובץ %x למחיצה מוגדרת משתמש %y</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>מעביר תיקיה %x למחיצה מוגדרת משתמש %y</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>מעביר קישור סימבולי %x למחיצה מוגדרת משתמש %y</target> -<source>Copying new file %x to %y</source> -<target>מעתיק קובץ חדש %x ×ל %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>מעתיק קישור סימבולי חדש %x ×ל %y</target> -<source>Overwriting file %x in %y</source> -<target>דורס קובץ %x ב %y</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>דורס קיור סימבולי %x ב %y</target> + +<source>Deleting symbolic link %x</source> +<target>מוחק קישור סימבולי %x</target> + +<source>Moving file %x to recycle bin</source> +<target>מעביר קטבץ %x לסל מחזור</target> + +<source>Moving folder %x to recycle bin</source> +<target>מעביר מחיצה %x לסל מחזור</target> + +<source>Moving symbolic link %x to recycle bin</source> +<target>מעביר קישור סימבולי %x לסל מחזור</target> + +<source>Moving file %x to %y</source> +<target>מעביר קובץ %x ×ל %y</target> + +<source>Moving folder %x to %y</source> +<target>מעביר מחיצה %x ×ל %y</target> + +<source>Moving symbolic link %x to %y</source> +<target>מעביר קישור סימבולי %x ×ל %y</target> + +<source>Creating file %x</source> +<target>יוצר קובץ %x</target> + +<source>Creating symbolic link %x</source> +<target>יוצר קישור סימבולי %x</target> + <source>Creating folder %x</source> <target>יוצר מחיצה %x</target> + +<source>Overwriting file %x</source> +<target>דורס קובץ %x</target> + +<source>Overwriting symbolic link %x</source> +<target>דורס קישור סימבולי %x</target> + <source>Verifying file %x</source> <target>מ×מת קובץ %x</target> + <source>Updating attributes of %x</source> <target>מעדכן ×ª×›×•× ×•×ª של %x</target> -<source>Source directory does not exist anymore:</source> -<target>מחיצת המקור ×œ× × ×ž×¦×ת:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>×ין מה ×œ×¡× ×›×¨×Ÿ ×¢"פ ×”×§×•× ×¤×™×’×•×¨×¦×™×”!</target> + <source>Target directory name must not be empty!</source> <target>×©× ×©×œ מחיצת מטרה ××™× ×• יכול להיות ריק!</target> + <source>User-defined directory for deletion was not specified!</source> <target>מחיצה מוגדרת משתמש למחיקה ×œ× ×ž×•×’×“×¨×ª!</target> + +<source>Source directory does not exist anymore:</source> +<target>מחיצת המקור ×œ× × ×ž×¦×ת:</target> + <source>Unresolved conflicts existing!</source> <target>×§×™×™× ×§×•× ×¤×œ×™×§×˜ ×œ× ×¤×ª×•×¨!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>ב×פשרותך ×œ×”×ª×¢×œ× ×ž×”×§×•× ×¤×œ×™×§×˜×™× ×•×œ×”×ž×©×™×š ×‘×¡× ×›×¨×•×Ÿ.</target> + <source>Significant difference detected:</source> <target>התגלה ×©×•× ×™ גדול מידי:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>יותר מ 50% ×ž×”×§×‘×¦×™× ×™×ž×—×§×• ×ו יועתקו!</target> + <source>Not enough free disk space available in:</source> <target>×ין מספיק ×ž×§×•× ×“×™×¡×§ ×¤× ×•×™ ב:</target> + <source>Free disk space required:</source> <target>×ž×§×•× ×“×™×¡×§ ×¤× ×•×™ × ×“×¨×©:</target> + <source>Free disk space available:</source> <target>×ž×§×•× ×¤× ×•×™ בדיסק:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target></target> +<target>סל מחזור ××™× ×• זמין עבור ×”× ×ª×™×‘×™× ×”×‘××™×! ×§×‘×¦×™× ×™×ž×—×§×• לצמיתות:</target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>מחיצה ×©×ª×©×ª× ×” ×”×™× ×—×œ×§ מריבוי זוגות מחיצות! בבקשה בדוק הגדרות ×¡×™× ×›×¨×•×Ÿ!</target> + <source>Processing folder pair:</source> <target>מבצע זוג מחיצות:</target> + <source>Generating database...</source> <target>מיצר בסיס × ×ª×•× ×™×...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>×ין מה ×œ×¡× ×›×¨×Ÿ ×¢"פ ×”×§×•× ×¤×™×’×•×¨×¦×™×”!</target> + <source>Error copying locked file %x!</source> <target>שגי××” בהעתקת קובץ × ×¢×•×œ %x!</target> + <source>Data verification error: Source and target file have different content!</source> <target>שגי××” של ×ימות × ×ª×•× ×™× ×§×•×‘×¥ מקור ומטרה בעלי תכולת × ×ª×•× ×™× ×©×•× ×”!</target> + diff --git a/BUILD/Languages/hungarian.lng b/BUILD/Languages/hungarian.lng index f5d6cd91..2fbca577 100644 --- a/BUILD/Languages/hungarian.lng +++ b/BUILD/Languages/hungarian.lng @@ -8,75 +8,116 @@ </header> <source>Searching for directory %x...</source> -<target></target> +<target>Mappa keresése: %x...</target> + <source>Show in Explorer</source> <target>Mutatás az IntézÅ‘ben</target> + <source>Open with default application</source> <target>Megnyitás az alapértelmezett alkalmazással</target> + <source>Browse directory</source> <target>Mappa tallózása</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Automatikus szinkronizálás</target> + <source>Browse</source> <target>Tallózás</target> -<source>Invalid commandline: %x</source> + +<source>Invalid command line: %x</source> <target>Érvénytelen parancssor: %x</target> + <source>Error resolving symbolic link:</source> <target>A szimbolikus link feloldása sikertelen:</target> -<source>Show popup</source> -<target>Felbukkanó ablak mutatása</target> -<source>Show popup on errors or warnings</source> -<target>ÉrtesÃtés felbukkanó ablakban a hibákról és figyelmeztetésekrÅ‘l</target> + +<source>Show pop-up</source> +<target>Párbeszédablak mutatása</target> + +<source>Show pop-up on errors or warnings</source> +<target>Párbeszédablakok mutatása hiba vagy figyelmeztetés esetén</target> + <source>Ignore errors</source> <target>Hibák figyelmen kÃvül hagyása</target> + <source>Hide all error and warning messages</source> <target>Összes hibaüzenet és figyelmeztetés elrejtése</target> + <source>Exit instantly</source> <target>Kilépés azonnal</target> + <source>Abort synchronization immediately</source> <target>Szinkronizáció azonnali megszakÃtása</target> + +<source>Select alternate comparison settings</source> +<target>AlternatÃv összehasonlÃtás beállÃtásai</target> + <source>Select alternate synchronization settings</source> <target>AlternatÃv szinkronizációs beállÃtások kiválasztása</target> + <source>No filter selected</source> <target>Nincs szűrÅ‘ kiválasztva</target> + <source>Filter is active</source> <target>A szűrÅ‘ aktÃv</target> -<source>Clear filter settings</source> -<target>SzűrÅ‘beállÃtások törlése</target> + <source>Remove alternate settings</source> <target>AlternatÃv beállÃtások eltávolÃtása</target> + +<source>Clear filter settings</source> +<target>SzűrÅ‘beállÃtások törlése</target> + <source>Create a batch job</source> <target>Kötegelt feladat létrehozása</target> + <source>Synchronization settings</source> <target>Szinkronizáció beállÃtásai</target> + <source>Comparison settings</source> <target>ÖsszehasonlÃtási beállÃtások</target> + <source>About</source> <target>A programról</target> + <source>Error</source> <target>Hiba</target> + <source>Warning</source> <target>Figyelem</target> + <source>Question</source> <target>Kérdés</target> + <source>Confirm</source> <target>MegerÅ‘sÃtés</target> + <source>Configure filter</source> <target>SzűrÅ‘ beállÃtása</target> + <source>Customize columns</source> <target>Oszlopok testreszabása</target> + <source>Global settings</source> <target>Globális beállÃtások</target> + <source>Synchronization Preview</source> <target>Szinkronizáció elÅ‘nézete</target> + <source>Find</source> <target>Keresés:</target> + +<source>Select time span</source> +<target>IdÅ‘intervallum kiválasztása</target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -85,46 +126,64 @@ <pluralform>1 Bájt</pluralform> <pluralform>%x Bájt</pluralform> </target> + <source><Symlink></source> <target><Symlink></target> + <source><Directory></source> <target><Mappa></target> + <source>Size</source> <target>Méret</target> + <source>Date</source> <target>Dátum</target> + <source>Full path</source> <target>Teljes elérési útvonal</target> + <source>Filename</source> <target>Fájlnév</target> + <source>Relative path</source> <target>RelatÃv útvonal</target> + <source>Directory</source> <target>Mappa</target> + <source>Extension</source> <target>Kiterjesztés</target> + <source>Comparison Result</source> <target>Az összehasonlÃtás eredménye</target> + <source>Incompatible synchronization database format:</source> <target>Inkompatibilis szinkronizációs adatbázis formátum:</target> + <source>Initial synchronization:</source> <target>ElsÅ‘ szinkronizáció:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>A FreeFileSync egyik adatbázisfájlja nem létezik:</target> + <source>Error reading from synchronization database:</source> <target>Hiba történt a szinkronizációs adatbázis olvasása közben:</target> + <source>Database files do not share a common synchronization session:</source> -<target></target> +<target>Az adatbázisfájlok nem osztoznak egy közös szinkronizációs munkameneten:</target> + <source>An exception occurred!</source> <target>Kivétel keletkezett!</target> -<source>Error deleting file:</source> -<target>A fájl törlése sikertelen:</target> + <source>Error reading file attributes:</source> <target>A fájl attribútumainak olvasása sikertelen:</target> + <source>Waiting while directory is locked (%x)...</source> <target>Várakozás a mappa zárolásának a feloldására (%x)...</target> + <source>Error setting directory lock:</source> <target>Hiba történt a mappa zárolása közben:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -133,27 +192,40 @@ <pluralform>1 másodperc</pluralform> <pluralform>%x másodperc</pluralform> </target> + <source>Info</source> <target>Információ</target> + <source>Fatal Error</source> <target>Kritikus hiba</target> + <source>Scanning:</source> <target>Vizsgálat:</target> + <source>Encoding extended time information: %x</source> <target>KibÅ‘vÃtett idÅ‘információk kódolása: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> -<target></target> +<target> +<pluralform>[1 szál]</pluralform> +<pluralform>[%x szál]</pluralform> +</target> + <source>Invalid FreeFileSync config file!</source> <target>Érvénytelen a FreeFileSync beállÃtásait tartalmazó fájl!</target> + <source>File does not exist:</source> <target>A következÅ‘ fájl nem létezik:</target> + <source>Error parsing configuration file:</source> <target>A beállÃtásokat tartalmazó fájl feldolgozása sikertelen:</target> + <source>/sec</source> <target>/másodperc</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -162,6 +234,7 @@ <pluralform>1 perc</pluralform> <pluralform>%x perc</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -170,6 +243,7 @@ <pluralform>1 óra</pluralform> <pluralform>%x óra</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -178,28 +252,40 @@ <pluralform>1 nap</pluralform> <pluralform>%x nap</pluralform> </target> + <source>S&ave configuration...</source> <target>BeállÃtások mentés&e...</target> + <source>&Load configuration...</source> <target>&BeállÃtások betöltése...</target> + <source>&Quit</source> <target>&Kilépés</target> + <source>&File</source> <target>&Fájl</target> + <source>&Content</source> <target>&Tartalom</target> + <source>&About...</source> <target>&A programról...</target> + <source>&Help</source> <target>&Súgó</target> + <source>Usage:</source> <target>Használat:</target> + <source>1. Select directories to monitor.</source> <target>1. Válaszd ki a figyelendÅ‘ mappákat.</target> + <source>2. Enter a command line.</source> <target>2. Add meg a parancssort.</target> + <source>3. Press 'Start'.</source> <target>3. Nyomd meg a Start gombot.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -210,409 +296,551 @@ A parancssor végrehajtódik minden alkalommal, ha: - minden mappa elérhetÅ‘vé válik (pl. USB-kulcs csatlakoztatása) - fájlok módosulnak az adott mappákban és almappákban </target> + <source>Directories to watch</source> <target>FigyelendÅ‘ mappák</target> + <source>Add folder</source> <target>Mappa hozzáadása</target> + <source>Remove folder</source> <target>Mappa eltávolÃtása</target> + <source>Select a folder</source> <target>Mappa kiválasztása</target> + <source>Command line</source> <target>Parancssor</target> + <source>Minimum Idle Time [seconds]</source> <target>Minimális tétlenségi idÅ‘ (másodpercek)</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>A tétlenség hossza másodpercekben az utolsó változás észlelése és a parancssor végrehajtása között.</target> + <source>Start</source> <target>IndÃtás</target> + <source>(Build: %x)</source> <target>(Build: %x)</target> + <source>RealtimeSync configuration</source> <target>RealtimeSync beállÃtások</target> + <source>File already exists. Overwrite?</source> <target>A fájl már létezik. FelülÃrjuk?</target> + <source>&Restore</source> <target>&VisszaállÃtás</target> + <source>&Exit</source> <target>&Kilépés</target> + <source>Monitoring active...</source> <target>Figyelés aktÃv...</target> + <source>Waiting for missing directories...</source> <target>Várakozás a hiányzó mappákra...</target> + <source>A directory input field is empty.</source> <target>Valamelyik mappa megadására szolgáló mezÅ‘ üres.</target> + <source>Drag && drop</source> <target>Húzd && Ejtsd</target> + <source>Could not initialize directory monitoring:</source> <target>A mappafigyelés inicializálása sikertelen:</target> + <source>Error when monitoring directories.</source> <target>Hiba történt a mappák figyelése közben.</target> + <source>Conversion error:</source> <target>Konverziós hiba:</target> + +<source>Error deleting file:</source> +<target>A fájl törlése sikertelen:</target> + <source>Error moving file:</source> <target>Hiba a fájl mozgatásakor:</target> + <source>Target file already existing!</source> <target>A célként megadott fájl már létezik!</target> + <source>Error moving directory:</source> <target>Hiba a mappa mozgatásakor:</target> + <source>Target directory already existing!</source> <target>A célmappa már létezik!</target> + <source>Error deleting directory:</source> <target>A mappa törlése sikertelen:</target> + <source>Error changing modification time:</source> <target>Az utolsó változtatás dátumának módosÃtása sikertelen:</target> + <source>Error loading library function:</source> <target>A könyvtári funkció betöltése sikertelen:</target> + <source>Error reading security context:</source> <target>A biztonsági cÃmke olvasása sikertelen:</target> + <source>Error writing security context:</source> <target>A biztonsági cÃmke Ãrása sikertelen:</target> + <source>Error copying file permissions:</source> <target>Hiba történt a fájl jogosultságainak másolása közben:</target> + <source>Error creating directory:</source> <target>A mappa létrehozása sikertelen:</target> + <source>Error copying symbolic link:</source> <target>Hiba történt a szimbolikus link másolása közben:</target> + <source>Error copying file:</source> <target>A fájl másolása sikertelen:</target> + <source>Error opening file:</source> <target>A fájl megnyitása sikertelen:</target> + <source>Error writing file:</source> <target>A fájl Ãrása sikertelen:</target> + <source>Error reading file:</source> <target>A fájl olvasása sikertelen:</target> + <source>Operation aborted!</source> <target>Művelet megszakÃtva!</target> + +<source>Could not load a required DLL:</source> +<target>A szükséges DLL betöltése sikertelen:</target> + <source>Endless loop when traversing directory:</source> <target>Végtelen hurok a mappák bejárásakor:</target> + <source>Error traversing directory:</source> <target>A mappa átnézése sikertelen:</target> + <source>Windows Error Code %x:</source> <target>Windows hibakód %x:</target> + <source>Linux Error Code %x:</source> <target>Linux hibakód %x:</target> + <source>Error setting privilege:</source> <target>Hiba történt a jogok beállÃtása közben:</target> + <source>Error moving to Recycle Bin:</source> <target>A Lomtárba (Recycle Bin) mozgatás sikertelen:</target> -<source>Could not load a required DLL:</source> -<target>A szükséges DLL betöltése sikertelen:</target> + <source>Error writing to synchronization database:</source> <target>Hiba történt a szinkronizációs adatbázis Ãrása közben:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>Hiba történt a Volume Shadow Copy szolgáltatás indÃtása közben!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target>Hiba történt a Volume Shadow Copy szolgáltatás elérése közben!</target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>A Shadow Copy a WOW64-en nem támogatott. Kérjük, használja a 64-bites FreeFileSync-et.</target> + <source>Could not determine volume name for file:</source> <target>A következÅ‘ fájlnak nem lehet meghatározni a kötetnevét:</target> + <source>Volume name %x not part of filename %y!</source> <target>A(z) %x kötetnevet nem tartalmazza a(z) %y fájlnév!</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>A következÅ‘ XML-csomópontok értékének beolvasása sikertelen:</target> + <source>Logging</source> <target>Naplózás</target> + <source>FreeFileSync batch file</source> <target>FreeFileSync kötegelt fájl</target> + <source>FreeFileSync configuration</source> <target>FreeFileSync beállÃtások</target> + <source>FreeFileSync Batch Job</source> <target>FreeFileSync kötegelt feladat</target> + <source>Unable to create logfile!</source> <target>Nem lehet létrehozni a naplófájlt!</target> + <source>Batch execution</source> <target>Kötegelt végrehajtás</target> + <source>Log-messages:</source> <target>Naplóbejegyzések:</target> + <source>Stop</source> <target>MegállÃtás</target> + <source>Total time:</source> <target>Becsült idÅ‘:</target> + <source>Synchronization aborted!</source> <target>A szinkronizáció megszakÃtva!</target> + <source>Synchronization completed with errors!</source> <target>A szinkronizáció befejezÅ‘dött, de akadtak hibák!</target> + <source>Synchronization completed successfully!</source> <target>A szinkronizáció sikeresen befejezÅ‘dött!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>Kérjük, nyomja meg a "Váltás" gombot a GUI mód megnyitásához.</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>Váltás a FreeFileSync GUI módjára...</target> + <source>Unable to connect to sourceforge.net!</source> <target>A csatlakozás a sourceforge.net-hez sikertelen!</target> + <source>A newer version of FreeFileSync is available:</source> <target>ElérhetÅ‘ a FreeFileSync egy újabb verziója:</target> + <source>Download now?</source> <target>Letöltsem most?</target> + <source>Information</source> <target>Információ</target> + <source>FreeFileSync is up to date!</source> <target>A FreeFileSync naprakész!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>Akarod, hogy a FreeFileSync automatikusan minden héten keressen frissÃtést?</target> + <source>(Requires an Internet connection!)</source> <target>(Internetkapcsolat szükséges!)</target> + <source>1. &Compare</source> <target>1. &ÖsszehasonlÃtás</target> + <source>2. &Synchronize...</source> <target>2. &Szinkronizálás</target> + <source>S&witch view</source> <target>Nézet v&áltása</target> + <source>&New</source> <target>&Új</target> + <source>&Program</source> <target>&Program</target> + <source>&Language</source> <target>&Nyelv</target> + <source>&Global settings...</source> <target>&Globális beállÃtások...</target> + <source>&Create batch job...</source> <target>&Kötegelt feladat létrehozása...</target> + <source>&Export file list...</source> <target>&Fájllista exportálása...</target> + <source>&Advanced</source> <target>&Haladó</target> + <source>&Check for new version</source> <target>&Új verzió keresése</target> + <source>Compare</source> <target>ÖsszehasonlÃtás</target> + <source>Compare both sides</source> <target>Mindkét oldal összehasonlÃtása</target> + <source>&Abort</source> <target>&MegszakÃt</target> + <source>Synchronize...</source> <target>Szinkronizálás</target> + <source>Start synchronization</source> <target>Szinkronizáció indÃtása</target> -<source>Swap sides</source> -<target>Oldalak felcserélése</target> + <source>Add folder pair</source> <target>Mappa pár megadása</target> + <source>Remove folder pair</source> <target>Mappa párok eltávolÃtása</target> + +<source>Swap sides</source> +<target>Oldalak felcserélése</target> + <source>Save current configuration to file</source> <target>Aktuális beállÃtások mentése fájlba</target> + <source>Load configuration from file</source> <target>BeállÃtások betöltése fájlból</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>Utoljára használt beállÃtások (DEL billentyűvel törölhetÅ‘ a listából)</target> + <source>Hide excluded items</source> <target>A kizárt elemek elrejtése</target> + <source>Hide filtered or temporarily excluded files</source> <target>A kiszűrt vagy ideiglenesen kizárt fájlok elrejtése</target> + <source>Number of files and directories that will be created</source> <target>A létrehozandó fájlok és mappák száma</target> + <source>Number of files that will be overwritten</source> <target>A felülÃrandó fájlok száma</target> + <source>Number of files and directories that will be deleted</source> <target>A törlendÅ‘ fájlok és mappák száma</target> + <source>Total amount of data that will be transferred</source> <target>A mozgatandó adatok összmérete</target> -<source>Left</source> -<target>Bal oldal</target> -<source>Right</source> -<target>Jobb oldal</target> + <source>Batch job</source> <target>Kötegelt feladat</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>Kötegelt feladat fájl létrehozása az automatizált szinkronizációhoz. Kötegelt feladat módban való indÃtáshoz csak simán duplát kell kattintani a fájlon vagy a parancssorból kell futtatni: FreeFileSync.exe <kötegelt feladat fájl>.futtasd egyszerűen meg kell adni a fájl nevét a FreeFileSync.exe-nek: FreeFileSync.exe <kötegelt feladat fájl>. Ezt ütemezni is lehet az operációs rendszer feladatkezelÅ‘jével.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target>Kötegelt feladat fájl létrehozása automatikus szinkronizációhoz. Kötegelt módban történÅ‘ indÃtáshoz duplán kell kattintani a fájlon, vagy végre kell hajttatni a parancssorból: FreeFileSync.exe <kötegelt feladat fájl>. Az operációs rendszer feladatütemezÅ‘jével ez akár ütemezhetÅ‘ is.</target> + <source>Help</source> <target>Súgó</target> + <source>Filter files</source> <target>Fájlok szűrése</target> + <source>Error handling</source> <target>Hibakezelés</target> + +<source>Left</source> +<target>Bal oldal</target> + +<source>Right</source> +<target>Jobb oldal</target> + <source>Overview</source> <target>Összefoglaló</target> + <source>Status feedback</source> <target>Státusz visszajelzés</target> + <source>Run minimized</source> -<target></target> +<target>IndÃtás lekicsinyÃtve</target> + <source>Maximum number of logfiles:</source> <target>Naplófájlok maximális száma:</target> + <source>Select logfile directory:</source> <target>Naplófájl mappájának kiválasztása:</target> + <source>Batch settings</source> -<target></target> +<target>BeállÃtások</target> + <source>&Save</source> <target>&Mentés</target> + <source>&Load</source> <target>&Betöltés</target> + <source>&Cancel</source> <target>&Mégsem</target> + <source>Elements found:</source> <target>Talált elemek száma:</target> + <source>Elements remaining:</source> <target>HátralévÅ‘ elemek száma:</target> + <source>Speed:</source> <target>Sebesség:</target> + <source>Time remaining:</source> <target>HátralévÅ‘ idÅ‘:</target> + <source>Time elapsed:</source> <target>Eltelt idÅ‘:</target> + <source>Operation:</source> <target>Művelet:</target> + <source>Select variant:</source> <target>Változat kiválasztása:</target> + <source><Automatic></source> <target><Automatikus></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>Mindkét oldal változásainak azonosÃtása és tárolása adatbázis segÃtségével. A törlések és ütközések automatikusan észlelÅ‘dnek.</target> + <source>Mirror ->></source> <target>Tükrözés ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>A bal oldali mappa tükrözött másolata. A jobb oldali mappa úgy lesz megváltoztatva, hogy a szinkronizáció után pontosan megegyezzen a bal oldalival.</target> + <source>Update -></source> <target>FrissÃtés -></target> + <source>Copy new or updated files to right folder.</source> <target>Új vagy frissÃtett fájlok másolása a jobb oldali mappába.</target> + <source>Custom</source> <target>Egyedi</target> + <source>Configure your own synchronization rules.</source> <target>Saját szinkronizálási szabályok beállÃtása.</target> + <source>Deletion handling</source> <target>Törlések kezelése</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>BeállÃtás</target> + <source>Category</source> <target>Kategória</target> + <source>Action</source> <target>Művelet</target> + <source>File/folder exists on left side only</source> <target>Csak a bal oldalon létezÅ‘ fájlok/mappák</target> + <source>File/folder exists on right side only</source> <target>Csak a jobb oldalon létezÅ‘ fájlok/mappák</target> + <source>Left file is newer</source> <target>A bal oldalon lévÅ‘ fájl újabb</target> + <source>Right file is newer</source> <target>A jobb oldalon lévÅ‘ fájl újabb</target> + <source>Files have different content</source> <target>A fájlok tartalma különbözÅ‘</target> + <source>Conflict/file cannot be categorized</source> <target>Kategorizálhatatlan ütközések/fájlok</target> + <source>Compare by...</source> <target>ÖsszehasonlÃtás</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> <target> -A fájlok megegyeznek, ha - - a fájlméret - - az utolsó módosÃtás dátuma -megegyezik +A fájlok egyezÅ‘nek tekintendÅ‘k, ha megegyezik + - az utolsó módosÃtásuk dátuma és ideje + - a fájlméret </target> -<source>File size and date</source> -<target>fájlméret és dátum alapján</target> + +<source>File time and size</source> +<target>Fájl dátuma és mérete</target> + <source> Files are found equal if - file content is the same </source> <target> -A fájlok megegyeznek, ha +A fájlok megegyeznek, ha megegyezik - a fájlok tartalma -megegyezik </target> + <source>File content</source> <target>fájl tartalma alapján</target> + <source>Symbolic Link handling</source> <target>Symlink kezelés</target> + <source>Synchronizing...</source> <target>Szinkronizálás folyamatban...</target> + <source>Elements processed:</source> <target>Feldolgozott elemek száma:</target> + <source>&Pause</source> <target>&Szünet</target> -<source>Compare by "File size and date"</source> -<target>ÖsszehasonlÃtás "fájlméret és dátum alapján"</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>Ez a változat akkor tekint egyezÅ‘nek két azonos nevű fájlt, ha azok mérete ÉS az utolsó módosÃtásuk ideje azonos.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>Ha az összehasonlÃtás ezekkel a beállÃtásokkal lesz elindÃtva, akkor a következÅ‘ döntési fa érvényesül:</target> -<source>As a result the files are separated into the following categories:</source> -<target>Eredményképpen a fájlok a következÅ‘ kategóriákra bomlanak:</target> -<source>- equal</source> -<target>- egyezik</target> -<source>- left newer</source> -<target>- a bal oldali újabb</target> -<source>- right newer</source> -<target>- a jobb oldali újabb</target> -<source>- exists left only</source> -<target>- csak a bal oldalon létezik</target> -<source>- exists right only</source> -<target>- csak a jobb oldalon létezik</target> -<source>- conflict (same date, different size)</source> -<target>- ütközés (ugyanaz a dátum, különbözÅ‘ méret)</target> -<source>Compare by "File content"</source> -<target>ÖsszehasonlÃtás "fájltartalom" alapján</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. -With this option enabled the decision tree is smaller: -</source> -<target> -Ahogy a neve is mutatja, két fájl, melyeknek ugyanaz a nevük, akkor és csakis akkor lesz egyezÅ‘ként jelölve, ha a tartalmuk megegyezik. Ez az opció leginkább a konzisztencia-viszgálatokhoz jó, mintsem a biztonsági mentésekhez. Ãgy a fájlok dátuma nem számÃt semmit. - -Ennek az opciónak az engedélyezésével a döntési fa kisebb lesz: -</target> -<source>- different</source> -<target>- különbözÅ‘</target> <source>Source code written in C++ utilizing:</source> <target>A programot C++-ban fejlesztették a következÅ‘k felhasználásával:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target> Nagy köszönet a FreeFileSync lokalizációjáért a következÅ‘ személyeknek: </target> + <source>Feedback and suggestions are welcome at:</source> <target>A visszajelzéseket és javaslatokat ide várjuk:</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync a Sourceforge-on</target> + <source>Homepage</source> <target>Honlap</target> + <source>If you like FFS</source> <target>FFS támogatása</target> + <source>Donate with PayPal</source> <target>Ha szereted a FreeFileSync-et, támogasd a PayPal segÃtségével.</target> + <source>Email</source> <target>E-mail</target> + <source>Report translation error</source> <target>FordÃtói hiba bejelentése</target> + <source>Published under the GNU General Public License:</source> <target>Kiadva a GNU General Public License alatt:</target> + <source>Ignore subsequent errors</source> <target>KésÅ‘bbi hibák figyelmen kÃvül hagyása</target> + <source>Hide further error messages during the current process</source> <target>A további hibaüzenetek elrejtése az aktuális folyamat során</target> + <source>&Ignore</source> <target>&Kihagy</target> + <source>&Retry</source> <target>&Ismét</target> + <source>Do not show this dialog again</source> <target>Ne mutasd újra ezt a párbeszédablakot</target> + <source>&Switch</source> <target>&Váltás</target> + <source>&Yes</source> <target>&Igen</target> + <source>&No</source> <target>&Nem</target> + <source>Delete on both sides</source> <target>Törlés mindkét oldalon</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>Törlés mindkét oldalon, még akkor is, ha csak egyik oldalon lett kijelölve</target> + <source>Use Recycle Bin</source> <target>Lomtár (Recycle Bin) használata</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -621,16 +849,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire Csak azok a fájlok/mappák lesznek kiválasztva a szinkronizáláshoz, amelyek minden szűrÅ‘beállÃtásnak megfelelnek. Megjegyzés: A névszűrésnek relatÃvnak(!) kell lennie a fÅ‘ szinkronizációs mappához képest. </target> + <source>Hints:</source> <target>Tippek:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. A relatÃv fájl- és mappanevek megadása pontosvesszÅ‘vel elválasztva vagy új sorban.</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. A csillag ('*') és a kérdÅ‘jel ('?') helyettesÃtÅ‘ karakterek megengedettek.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. Fájlok közvetlen kizárása a fÅ‘ listából helyi menü segÃtségével.</target> + <source>Example</source> <target>Példa</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -639,30 +873,40 @@ Exclude: \stuff\temp\* Csatolni: *.doc; *.zip; *.exe Kizárni: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>Minden .doc, .zip és .exe fájl szinkronizálása a "temp" almappában találhatók kivételével.</target> + <source>Include</source> <target>Csatolni</target> + <source>Exclude</source> <target>Kizárni</target> -<source>Select time span:</source> -<target>IdÅ‘tartam kiválasztása:</target> -<source>Minimum file size:</source> -<target>Minimális fájlméret</target> -<source>Maximum file size:</source> -<target>Maximális fájlméret:</target> + +<source>Minimum file size</source> +<target>Legkisebb fájlméret</target> + +<source>Maximum file size</source> +<target>Legnagyobb fájlméret</target> + <source>&Default</source> <target>&Alapértelmezett</target> + <source>Move column up</source> <target>Oszlop mozgatása felfelé</target> + <source>Move column down</source> <target>Oszlop mozgatása lefelé</target> -<source>Transactional File Copy</source> -<target></target> + +<source>Transactional file copy</source> +<target>Tranzakciós fájlmásolás</target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> -<target></target> +<target>A fájlok elÅ‘ször ideglenes fájlokba (*.ffs_tmp) lesznek Ãrva, majd azok át lesznek nevezve. Ez egyezÅ‘ állapotot garantál még végzetes hiba esetén is.</target> + <source>Copy locked files</source> <target>Zárolt fájlok másolása</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -671,8 +915,10 @@ Copy shared or locked files using Volume Shadow Copy Service A megosztott vagy zárolt fájlok másolása a Volume Shadow Copy szolgáltatással (Adminisztrátori jogok szükségesek) </target> -<source>Copy filesystem permissions</source> -<target>Fájlrendszer jogosultságok másolása</target> + +<source>Copy file access permissions</source> +<target>Fájl hozzáférési jogosultságainak másolása</target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -681,138 +927,217 @@ Transfer file and directory permissions Fájlok és mappák jogosultságainak átvitele (Adminisztrátori jogok szükségesek) </target> + <source>Hidden dialogs:</source> <target>Rejtett párbeszédablakok:</target> + <source>Reset</source> <target>HelyreállÃtás</target> + <source>Show hidden dialogs</source> <target>Rejtett párbeszédablakok mutatása</target> + <source>External applications</source> <target>KülsÅ‘ alkalmazások</target> + <source>Description</source> <target>Megjegyzés</target> + <source>Variant</source> <target>Variáns</target> + <source>Statistics</source> <target>Statisztikák</target> + <source>Find what:</source> <target>Mit keresünk:</target> + <source>Match case</source> <target>Kis-/nagybetű egyezés</target> + <source>&Find next</source> <target>&KövetkezÅ‘ keresése</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>Meg lehet próbálni újra a megmaradt elemek szinkronizálását (az összehasonlÃtás újbóli elvégzése NÉLKÃœL)!</target> -<source>Batch file created successfully!</source> -<target>A kötegelt feladat fájl létrehozása sikerült!</target> + <source>Main bar</source> <target>FÅ‘ panel</target> + <source>Folder pairs</source> <target>Mappa párok</target> + <source>Select view</source> <target>Nézet kiválasztása</target> + <source>Set direction:</source> <target>Irány</target> + <source>Exclude temporarily</source> <target>Ideiglenesen kizár</target> + <source>Include temporarily</source> <target>Ideiglenesen csatolni</target> + <source>Exclude via filter:</source> <target>Kizárás szűrÅ‘ segÃtségével:</target> + <source><multiple selection></source> <target><többszörös kijelölés></target> + <source>D-Click</source> <target>D-Klikk</target> + <source>Delete</source> <target>Törlés</target> + <source>Customize...</source> <target>Testreszabás...</target> + +<source>Select time span...</source> +<target>IdÅ‘intervallum kiválasztása...</target> + <source>Auto-adjust columns</source> <target>Oszlopok automatikus igazÃtása</target> + +<source>Icon size:</source> +<target></target> + +<source>Small</source> +<target></target> + +<source>Medium</source> +<target></target> + +<source>Large</source> +<target></target> + <source>Include all rows</source> <target>Minden sort csatolni</target> + <source>Exclude all rows</source> <target>Minden sor kizárása</target> + <source>Reset view</source> <target>Nézet visszaállÃtása</target> + <source>Show "%x"</source> <target>"%x" mutatása</target> + <source><Last session></source> <target><Utolsó munkamenet></target> + <source>Configuration saved!</source> <target>BeállÃtások elmentve!</target> + <source>Save changes to current configuration?</source> <target>Mentsük a beállÃtások változásait?</target> + <source>Configuration loaded!</source> <target>BeállÃtások betöltve!</target> + <source>Folder Comparison and Synchronization</source> <target>Mappa összehasonlÃtás és szinkronizáció</target> + <source>Hide files that exist on left side only</source> <target>Csak a bal oldalon létezÅ‘ fájlok elrejtése</target> + <source>Show files that exist on left side only</source> <target>Csak a bal oldalon létezÅ‘ fájlok mutatása</target> + <source>Hide files that exist on right side only</source> <target>Csak a jobb oldalon létezÅ‘ fájlok elrejtése</target> + <source>Show files that exist on right side only</source> <target>Csak a jobb oldalon létezÅ‘ fájlok mutatása</target> + <source>Hide files that are newer on left</source> <target>A bal oldalon lévÅ‘ újabb fájlok elrejtése</target> + <source>Show files that are newer on left</source> <target>A bal oldali újabb fájlok mutatása</target> + <source>Hide files that are newer on right</source> <target>A jobb oldalon lévÅ‘ újabb fájlok elrejtése</target> + <source>Show files that are newer on right</source> <target>A jobb oldali újabb fájlok mutatása</target> + <source>Hide files that are equal</source> <target>Az egyezÅ‘ fájlok elrejtése</target> + <source>Show files that are equal</source> <target>EgyezÅ‘ fájlok mutatása</target> + <source>Hide files that are different</source> <target>A nem egyezÅ‘ fájlok elrejtése</target> + <source>Show files that are different</source> <target>EltérÅ‘ fájlok mutatása</target> + <source>Hide conflicts</source> <target>Ãœtközések elrejtése</target> + <source>Show conflicts</source> <target>Ãœtközések mutatása</target> + <source>Hide files that will be created on the left side</source> <target>A bal oldalon létrehozandó fájlok elrejtése.</target> + <source>Show files that will be created on the left side</source> <target>A bal oldalon létrehozandó fájlok mutatása</target> + <source>Hide files that will be created on the right side</source> <target>A jobb oldalon létrehozandó fájlok elrejtése.</target> + <source>Show files that will be created on the right side</source> <target>A jobb oldalon létrehozandó fájlok mutatása</target> + <source>Hide files that will be deleted on the left side</source> <target>A bal oldalon törlendÅ‘ fájlok elrejtése.</target> + <source>Show files that will be deleted on the left side</source> <target>A bal oldalon törlendÅ‘ fájlok mutatása</target> + <source>Hide files that will be deleted on the right side</source> <target>A jobb oldalon törlendÅ‘ fájlok elrejtése.</target> + <source>Show files that will be deleted on the right side</source> <target>A jobb oldalon törlendÅ‘ fájlok mutatása</target> + <source>Hide files that will be overwritten on left side</source> <target>A bal oldalon felülÃrandó fájlok elrejtése</target> + <source>Show files that will be overwritten on left side</source> <target>A bal oldalon felülÃrandó fájlok mutatása</target> + <source>Hide files that will be overwritten on right side</source> <target>A jobb oldalon felülÃrandó fájlok elrejtése</target> + <source>Show files that will be overwritten on right side</source> <target>A jobb oldalon felülÃrandó fájlok mutatása</target> + <source>Hide files that won't be copied</source> <target>A nem másolandó fájlok elrejtése</target> + <source>Show files that won't be copied</source> <target>A nem másolandó fájlok mutatása</target> + <source>All directories in sync!</source> <target>Minden mappa szinkronban!</target> + <source>Please run a Compare first before synchronizing!</source> <target>Kérjük, futtass le egy összehasonlÃtást mielÅ‘tt szinkronizálnál!</target> + <source>Comma separated list</source> <target>Comma separated values</target> + <source>Legend</source> <target>ElÅ‘zmény</target> + <source>File list exported!</source> <target>A fájllista exportálása befejezÅ‘dött!</target> + +<source>Batch file created successfully!</source> +<target>A kötegelt feladat fájl létrehozása sikerült!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -821,6 +1146,7 @@ Fájlok és mappák jogosultságainak átvitele <pluralform>Sikeresen töröltük az objektumot!</pluralform> <pluralform>Sikeresen töröltünk %x objektumot!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -829,6 +1155,7 @@ Fájlok és mappák jogosultságainak átvitele <pluralform>1 mappát</pluralform> <pluralform>%x mappát</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -837,6 +1164,7 @@ Fájlok és mappák jogosultságainak átvitele <pluralform>1 fájlt</pluralform> <pluralform>%x fájlt</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -845,80 +1173,106 @@ Fájlok és mappák jogosultságainak átvitele <pluralform>%x/1 sor a nézetben</pluralform> <pluralform>%x/%y sor a nézetben</pluralform> </target> + <source>Scanning...</source> <target>Vizsgálat folyamatban...</target> + <source>Comparing content...</source> <target>Tartalom összehasonlÃtása...</target> + <source>Paused</source> <target>Szüneteltetve</target> + <source>Aborted</source> <target>MegszakÃtva</target> + <source>Completed</source> <target>Befejezve</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>MegszakÃtási kérelem: Várakozás a folyamatban lévÅ‘ művelet befejezésére...</target> + <source>Continue</source> <target>Folytatás</target> + <source>Pause</source> <target>Szünet</target> + <source>Cannot find %x</source> <target>Nem található: %x</target> -<source>DECISION TREE</source> -<target>DÖNTÉSI FA</target> -<source>file exists on both sides</source> -<target>mindkét oldalon létezÅ‘ fájlok</target> -<source>on one side only</source> -<target>csak az egy oldalon létezÅ‘ fájlok</target> -<source>same date</source> -<target>megegyezÅ‘ dátum</target> -<source>different date</source> -<target>különbözÅ‘ dátum</target> + <source>Inactive</source> <target>InaktÃv</target> -<source>Second</source> -<target>Másodperc</target> -<source>Minute</source> -<target>Perc</target> -<source>Hour</source> -<target>Óra</target> -<source>Day</source> -<target>Nap</target> + +<source>Last x hours</source> +<target>Utolsó x óra</target> + +<source>Today</source> +<target>Mai</target> + +<source>This week</source> +<target>Eheti</target> + +<source>This month</source> +<target>Ehavi</target> + +<source>This year</source> +<target>Idei</target> + <source>Byte</source> <target>Bájt</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>SzűrÅ‘: Minden pár</target> + <source>Filter: Single pair</source> <target>SzűrÅ‘: Egy pár</target> + <source>Ignore</source> <target>Figyelmen kÃvül hagy</target> + <source>Direct</source> <target>Közvetlen</target> + <source>Follow</source> <target>Követés</target> + +<source>Copy NTFS permissions</source> +<target>NTFS jogosultságok másolása</target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>KülsÅ‘ alkalmazás integrálása a helyi menübe. Az elérhetÅ‘ makrók a következÅ‘k:</target> + <source>- full file or directory name</source> <target>- teljes fájl- vagy mappanév</target> + <source>- directory part only</source> <target>- csak a mappa részét</target> + <source>- Other side's counterpart to %name</source> <target>- A %name másik oldalon szereplÅ‘ párja</target> + <source>- Other side's counterpart to %dir</source> <target>- A %dir másik oldalon szereplÅ‘ párja</target> + <source>Restore all hidden dialogs?</source> <target>Az összes rejtett párbeszédablakot visszaállÃtsuk?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> </source> <target> -<pluralform>Valóban a Lomtárba akarod mozgatni a következÅ‘ objektumot?</pluralform> -<pluralform>Valóban a Lomtárba akarod mozgatni a következÅ‘ %x objektumot?</pluralform> +<pluralform>Valóban a Lomtárba (Recycle Bin) akarod mozgatni a következÅ‘ objektumot?</pluralform> +<pluralform>Valóban a Lomtárba (Recycle Bin) akarod mozgatni a következÅ‘ %x objektumot?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -927,139 +1281,211 @@ Fájlok és mappák jogosultságainak átvitele <pluralform>Valóban törölni akarod a következÅ‘ objektumot?</pluralform> <pluralform>Valóban törölni akarod a következÅ‘ %x objektumot?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>Feloldatlan ütközésként hagyni</target> + <source>Delete permanently</source> <target>Folyamatosan törölni</target> + <source>Delete or overwrite files permanently</source> <target>A fájlok folyamatos törlése vagy felülÃrása</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>A Lomtár (Recycle Bin) használata fájlok törlésénél vagy felülÃrásánál</target> + <source>Versioning</source> <target>Verziókövetés</target> + <source>Move files into a time-stamped subdirectory</source> <target>Fájlok másolása idÅ‘bélyeggel ellátott almappába</target> -<source>Cannot determine sync-direction:</source> -<target>Nem lehet meghatározni a szinkronizáció irányát:</target> -<source>Filter settings have changed!</source> -<target>A szűrÅ‘beállÃtások megváltoztak!</target> + <source>Both sides have changed since last synchronization!</source> <target>Mindkét oldal megváltozott az utolsó szikronizálás óta!</target> + +<source>Cannot determine sync-direction:</source> +<target>Nem lehet meghatározni a szinkronizáció irányát:</target> + <source>No change since last synchronization!</source> <target>Az utolsó szinkronizálás után nem történt változás.</target> + +<source>Filter settings have changed!</source> +<target>A szűrÅ‘beállÃtások megváltoztak!</target> + <source>The file was not processed by last synchronization!</source> <target>A fájl nem lett feldolgozva az utolsó szinkronizáció alkalmával!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>A tervezett mappának a törlése ütközik az almappáival és fájljaival.</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Alapértelmezett szinkronizációs irányok beállÃtása: a régebbi fájlok felülÃródnak az újabbakkal.</target> + <source>The file does not contain a valid configuration:</source> <target>A következÅ‘ fájl nem tartalmaz érvényes beállÃtásokat:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>Figyelmen kÃvül hagyhatod ezt a hibát, üresnek tekintve a mappát.</target> + <source>Directory does not exist:</source> <target>A mappa nem létezik:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>A mappák függenek egymástól! Legyen óvatos, amikor megadja a szinkronizálási szabályokat:</target> + <source>Comparing content of files %x</source> <target>%x fájlok tartalmának összehasonlÃtása</target> + <source>Memory allocation failed!</source> <target>Sikertelen memóriafoglalás!</target> + <source>File %x has an invalid date!</source> <target>A(z) %x fájlnak érvénytelen a dátuma!</target> + <source>Conflict detected:</source> <target>Ãœtközés történt:</target> + <source>Files %x have the same date but a different size!</source> <target>A(z) %x fájlok dátuma megegyezik, de a mérete nem!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>A(z) %x symlinknek megegyezik a dátuma, de a célpontja nem!</target> + <source>Comparing files by content failed.</source> <target>Sikertelen a fájlok összehasonlÃtása tartalom alapján.</target> + <source>Generating file list...</source> <target>Fájllista generálása...</target> + <source>Multiple...</source> <target>SokszorosÃtás</target> + <source>Both sides are equal</source> <target>Mindkét oldal egyforma</target> + <source>Files/folders differ in attributes only</source> <target>Csak attribútumokban különbözÅ‘ fájlok/mappák</target> + <source>Copy new file/folder to left</source> <target>Új fájl/mappa másolása a bal oldalra</target> + <source>Copy new file/folder to right</source> <target>Új fájl/mappa másolása a jobb oldalra</target> + <source>Delete left file/folder</source> <target>Bal oldali fájl/mappa törlése</target> + <source>Delete right file/folder</source> <target>Jobb oldali fájl/mappa törlése</target> + <source>Overwrite left file/folder with right one</source> <target>Bal oldali fájl/mappa felülÃrása a jobb oldalival</target> + <source>Overwrite right file/folder with left one</source> <target>Jobb oldali fájl/mappa felülÃrása a bal oldalival</target> + <source>Do nothing</source> <target>Nincs mit csinálni</target> + <source>Copy file attributes only to left</source> <target>Fájl attribútumok másolása csak a bal oldalra</target> + <source>Copy file attributes only to right</source> <target>Fájl attribútumok másolása csak a jobb oldalra</target> + <source>Deleting file %x</source> <target>Fájl törlése %x</target> -<source>Deleting Symbolic Link %x</source> -<target>Symlink törlése: %x</target> + <source>Deleting folder %x</source> <target>Mappa törlése %x</target> -<source>Moving %x to Recycle Bin</source> -<target>%x mozgatása a Lomtárba (Recycle Bin)</target> -<source>Moving file %x to user-defined directory %y</source> -<target>%x fájl mozgatása a felhasználó által megadott %y mappába</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>%x mappa mozgatása a felhasználó által megadott %y mappába</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>A(z) %x symlink másolása a felhasználó által megadott %y mappába</target> -<source>Copying new file %x to %y</source> -<target>A(z) %x új fájl másolása a(z) %y fájlba</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>A(z) %x új symlink másolása a(z) %y symlinkbe</target> -<source>Overwriting file %x in %y</source> -<target>A(z) %x fájl fölülÃrása a(z) %y mappában</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>A(z) %x symlink fölülÃrása a(z) %y mappában</target> + +<source>Deleting symbolic link %x</source> +<target>Symlink törlése: %x</target> + +<source>Moving file %x to recycle bin</source> +<target>%x fájl mozgatása a Lomtárba (Recycle Bin)</target> + +<source>Moving folder %x to recycle bin</source> +<target>%x mappa mozgatása a Lomtárba (Recycle Bin)</target> + +<source>Moving symbolic link %x to recycle bin</source> +<target>%x symlink mozgatása a Lomtárba (Recycle Bin)</target> + +<source>Moving file %x to %y</source> +<target>%x fájl mozgatása ide: %y</target> + +<source>Moving folder %x to %y</source> +<target>%x mappa mozgatása ide: %y</target> + +<source>Moving symbolic link %x to %y</source> +<target>%x symlink mozgatása ide: %y</target> + +<source>Creating file %x</source> +<target>%x fájl létrehozása</target> + +<source>Creating symbolic link %x</source> +<target>%x symlink létrehozása</target> + <source>Creating folder %x</source> <target>%x mappa létrehozása</target> + +<source>Overwriting file %x</source> +<target>%x fájl felülÃrása</target> + +<source>Overwriting symbolic link %x</source> +<target>%x symlink felülÃrása</target> + <source>Verifying file %x</source> <target>%x fájl ellenÅ‘rzése</target> + <source>Updating attributes of %x</source> <target>A(z) %x attribútumainak frissÃtése</target> -<source>Source directory does not exist anymore:</source> -<target>A forrásként megadott mappa többé nem létezik:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>A beállÃtásoknak megfelelÅ‘en nincs mit szinkronizálni!</target> + <source>Target directory name must not be empty!</source> <target>A célmappa neve nem lehet üres!</target> + <source>User-defined directory for deletion was not specified!</source> <target>A törléshez nem lett mappa megadva a felhasználó által!</target> + +<source>Source directory does not exist anymore:</source> +<target>A forrásként megadott mappa többé nem létezik:</target> + <source>Unresolved conflicts existing!</source> <target>Feloldatlan ütközések vannak!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>Figyelmen kÃvül hagyhatod az ütközéseket és folytathatod a szinkronizálást.</target> + <source>Significant difference detected:</source> <target>JelentÅ‘s különbség érzékelve:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>Az összes fájl több mint 50%-a másolva vagy törölve lesz!</target> + <source>Not enough free disk space available in:</source> <target>Nincs elég szabad lemezterület:</target> + <source>Free disk space required:</source> <target>Szükséges szabad lemezterület:</target> + <source>Free disk space available:</source> <target>Szabad lemezterület:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target></target> +<target>A Lomtár (Recycle Bin) nem elérhetÅ‘ a következÅ‘ útvonalakhoz! A fájlok azonnali törlésre kerülnek helyette:</target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>Egy olyan mappa kerül módosÃtásra, amely tagja több mappa párosnak! Kérjük, nézd át a szinkronizációs beállÃtásokat!</target> + <source>Processing folder pair:</source> <target>Mappapár feldolgozása:</target> + <source>Generating database...</source> <target>Adatbázis generálása...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>A beállÃtásoknak megfelelÅ‘en nincs mit szinkronizálni!</target> + <source>Error copying locked file %x!</source> <target>Hiba történt a(z) %x zárolt fájl másolása közben!</target> + <source>Data verification error: Source and target file have different content!</source> <target>AdatellenÅ‘rzési hiba: A forrás és cél fájl tartalma különbözik!</target> + diff --git a/BUILD/Languages/italian.lng b/BUILD/Languages/italian.lng index fb0d5836..45866294 100644 --- a/BUILD/Languages/italian.lng +++ b/BUILD/Languages/italian.lng @@ -9,74 +9,115 @@ <source>Searching for directory %x...</source> <target></target> + <source>Show in Explorer</source> <target>Mostra in Esplora Risorse</target> + <source>Open with default application</source> <target>Apri con applicazione di default</target> + <source>Browse directory</source> <target>Sfoglia cartelle</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Sincronizzazione Automatizzata</target> + <source>Browse</source> <target>Sfoglia</target> -<source>Invalid commandline: %x</source> -<target>Comando non valido: %x</target> + +<source>Invalid command line: %x</source> +<target></target> + <source>Error resolving symbolic link:</source> <target>Errore nella risoluzione di collegamento simbolico:</target> -<source>Show popup</source> -<target>Mostra popup</target> -<source>Show popup on errors or warnings</source> -<target>Mostra popup degli errori o avvisi</target> + +<source>Show pop-up</source> +<target></target> + +<source>Show pop-up on errors or warnings</source> +<target></target> + <source>Ignore errors</source> <target>Ignora gli errori</target> + <source>Hide all error and warning messages</source> <target>Nascondi tutti gli errori e i messaggi d'avviso</target> + <source>Exit instantly</source> <target>Esci istantaneamente</target> + <source>Abort synchronization immediately</source> <target>Interrompi immediatamente la sincronizzazione</target> + +<source>Select alternate comparison settings</source> +<target></target> + <source>Select alternate synchronization settings</source> <target>Seleziona impostazioni di sincronizzazione alternative</target> + <source>No filter selected</source> <target>Nessun filtro selezionato</target> + <source>Filter is active</source> <target>Il filtro e' attivo</target> -<source>Clear filter settings</source> -<target>Pulisci impostazioni filtro</target> + <source>Remove alternate settings</source> <target>Rimuovi impostazioni alternative</target> + +<source>Clear filter settings</source> +<target>Pulisci impostazioni filtro</target> + <source>Create a batch job</source> <target>Creazione di un job batch</target> + <source>Synchronization settings</source> <target>Parametri di sincronizzazione</target> + <source>Comparison settings</source> <target>Impostazioni di comparazione</target> + <source>About</source> <target>A proposito di</target> + <source>Error</source> <target>Errore</target> + <source>Warning</source> <target>Attenzione</target> + <source>Question</source> <target>Domanda</target> + <source>Confirm</source> <target>Conferma</target> + <source>Configure filter</source> <target>Configurazione dei filtri</target> + <source>Customize columns</source> <target>Personalizza colonne</target> + <source>Global settings</source> <target>Preferenze</target> + <source>Synchronization Preview</source> <target>Anteprima Sincronizzazione</target> + <source>Find</source> <target>Trova</target> + +<source>Select time span</source> +<target></target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -85,46 +126,64 @@ <pluralform>1 Byte</pluralform> <pluralform>%x Byte</pluralform> </target> + <source><Symlink></source> <target><Symlink></target> + <source><Directory></source> <target><Directory></target> + <source>Size</source> <target>Dimensione</target> + <source>Date</source> <target>Data</target> + <source>Full path</source> <target>Percorso completo</target> + <source>Filename</source> <target>Nome del file</target> + <source>Relative path</source> <target>Percorso relativo</target> + <source>Directory</source> <target>Directory</target> + <source>Extension</source> <target>Estensione</target> + <source>Comparison Result</source> <target>Risultato della comparazione</target> + <source>Incompatible synchronization database format:</source> <target>Formato database di sincronizzazione incompatibile:</target> + <source>Initial synchronization:</source> <target>Prima sincronizzazione:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>Un file database di FreeFileSync non è ancora stato creato:</target> + <source>Error reading from synchronization database:</source> <target>Errore in lettura dal database di sincronizzione:</target> + <source>Database files do not share a common synchronization session:</source> <target></target> + <source>An exception occurred!</source> <target>Si è verificato un problema!</target> -<source>Error deleting file:</source> -<target>Errore durante l'eliminazione del file:</target> + <source>Error reading file attributes:</source> <target>Errore di lettura degli attributi file:</target> + <source>Waiting while directory is locked (%x)...</source> <target>Attendi mentre la directory è bloccata (%x)...</target> + <source>Error setting directory lock:</source> <target>Errore nell'impostazione del blocco directory:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -133,27 +192,37 @@ <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> </target> + <source>Info</source> <target>Info</target> + <source>Fatal Error</source> <target>Errore Fatale</target> + <source>Scanning:</source> <target>Analisi in corso:</target> + <source>Encoding extended time information: %x</source> <target>Codifica estesa informazioni orario: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> <target></target> + <source>Invalid FreeFileSync config file!</source> <target>File di configurazione FreeFileSync non valido!</target> + <source>File does not exist:</source> <target>Il file non esiste:</target> + <source>Error parsing configuration file:</source> <target>Errore nell'analisi del file di configurazione:</target> + <source>/sec</source> <target>/sec</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -162,6 +231,7 @@ <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -170,6 +240,7 @@ <pluralform>1 ora</pluralform> <pluralform>%x ore</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -178,28 +249,40 @@ <pluralform>1 giorno</pluralform> <pluralform>%x giorni</pluralform> </target> + <source>S&ave configuration...</source> <target>S&alva la configurazione...</target> + <source>&Load configuration...</source> <target>&Carica la configurazione...</target> + <source>&Quit</source> <target>&Esci</target> + <source>&File</source> <target>&File</target> + <source>&Content</source> <target>&Contenuto</target> + <source>&About...</source> <target>&Informazioni...</target> + <source>&Help</source> <target>&Aiuto</target> + <source>Usage:</source> <target>Uso:</target> + <source>1. Select directories to monitor.</source> <target>1. Seleziona cartelle da monitorare.</target> + <source>2. Enter a command line.</source> <target>2. Inserisci linea di comando.</target> + <source>3. Press 'Start'.</source> <target>3. Premi 'Start'.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -210,309 +293,456 @@ La linea di comando è eseguita ogni volta che: - tutte le cartelle diventano disponibili (es: inserimento memoria USB) - file in queste cartelle o sottocartelle vengono modificati </target> + <source>Directories to watch</source> <target>Directory da controllare</target> + <source>Add folder</source> <target>Aggiungi cartella</target> + <source>Remove folder</source> <target>Rimuovi cartella</target> + <source>Select a folder</source> <target>Seleziona una cartella</target> + <source>Command line</source> <target>Linea di comando</target> + <source>Minimum Idle Time [seconds]</source> <target>Tempo minimo di attesa [seconds]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>Tempo di attesa in secondi fra il rilevamento dell'ultima modifica e l'esecuzione della linea di comando</target> + <source>Start</source> <target>Avvia</target> + <source>(Build: %x)</source> <target>(Build: %x)</target> + <source>RealtimeSync configuration</source> <target>Configurazione di RealtimeSync</target> + <source>File already exists. Overwrite?</source> <target>Il file esiste già . Lo vuoi sovrascrivere?</target> + <source>&Restore</source> <target>&Ripristina</target> + <source>&Exit</source> <target>&Esci</target> + <source>Monitoring active...</source> <target>Monitoraggio attivo...</target> + <source>Waiting for missing directories...</source> <target>In attesa delle directory mancanti...</target> + <source>A directory input field is empty.</source> <target>Un campo directory di input è vuoto.</target> + <source>Drag && drop</source> <target>Drag && drop</target> + <source>Could not initialize directory monitoring:</source> <target>Monitoraggio directory non inizializzabile:</target> + <source>Error when monitoring directories.</source> <target>Errore durante il monitoraggio directory.</target> + <source>Conversion error:</source> <target>Errore di conversione:</target> + +<source>Error deleting file:</source> +<target>Errore durante l'eliminazione del file:</target> + <source>Error moving file:</source> <target>Errore nello spostamento file:</target> + <source>Target file already existing!</source> <target>File destinazione già esistente!</target> + <source>Error moving directory:</source> <target>Errore nello spostamento directory:</target> + <source>Target directory already existing!</source> <target>Directory di destinazione già esistente!</target> + <source>Error deleting directory:</source> <target>Errore durante l'eliminazione delle directory:</target> + <source>Error changing modification time:</source> <target>Errore durante la modifica della data:</target> + <source>Error loading library function:</source> <target>Errore nel caricamento della funzione libreria:</target> + <source>Error reading security context:</source> <target>Errore in lettura del contesto di sicurezza:</target> + <source>Error writing security context:</source> <target>Errore in scrittura del contesto di sicurezza:</target> + <source>Error copying file permissions:</source> <target>Errore durante la copia dei permessi su file:</target> + <source>Error creating directory:</source> <target>Errore durante la creazione della directory:</target> + <source>Error copying symbolic link:</source> <target>Errore durante la copia del link simbolico:</target> + <source>Error copying file:</source> <target>Errore durante la copia del file:</target> + <source>Error opening file:</source> <target>Errore in apertura file:</target> + <source>Error writing file:</source> <target>Errore durante la scrittura del file:</target> + <source>Error reading file:</source> <target>Errore durante la lettura del file:</target> + <source>Operation aborted!</source> <target>Operazione abortita!</target> + <source>Endless loop when traversing directory:</source> <target>Loop senza fine attraverso le directory:</target> + <source>Error traversing directory:</source> <target>Errore nel percorso della directory:</target> + <source>Windows Error Code %x:</source> <target>Errore Windows Codice %x:</target> + <source>Linux Error Code %x:</source> <target>Errore Linux Codice %x:</target> + <source>Error setting privilege:</source> <target>Errore nell'impostazione dei privilegi:</target> + <source>Error moving to Recycle Bin:</source> <target>Errore durante lo spostamento nel Cestino:</target> + <source>Could not load a required DLL:</source> <target>Impossibile caricare una DLL richiesta:</target> + <source>Error writing to synchronization database:</source> <target>Errore in scrittura sul database di sincronizzazione:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>Errore in avvio del Servizio Volume Shadow Copy!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target></target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>La creazione di copie shadow su WOW64 non e' supportata. Utilizzare FreeFileSync in versione 64-bit.</target> + <source>Could not determine volume name for file:</source> <target>Impossibile determinare il nome volume per il file:</target> + <source>Volume name %x not part of filename %y!</source> <target>Il nome volume %x non è parte del nome file %y!</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>Impossibile leggere i valori per i seguenti nodi XML:</target> + <source>Logging</source> <target>Logging</target> + <source>FreeFileSync batch file</source> <target>FreeFileSync batch file</target> + <source>FreeFileSync configuration</source> <target>Configurazione di FreeFileSync</target> + <source>FreeFileSync Batch Job</source> <target>FreeFileSync Batch Job</target> + <source>Unable to create logfile!</source> <target>Impossibile creaer il file di log!</target> + <source>Batch execution</source> <target>Esecuzione in batch</target> + <source>Log-messages:</source> <target>Log-messages:</target> + <source>Stop</source> <target>Stop</target> + <source>Total time:</source> <target>Tempo totale:</target> + <source>Synchronization aborted!</source> <target>Sincronizzazione abortita!</target> + <source>Synchronization completed with errors!</source> <target>Sincronizzazione terminata con errori!</target> + <source>Synchronization completed successfully!</source> <target>Sincronizzazione completata con successo!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>Premi "Switch" per aprire modalità GUI di FreeFileSync</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>Switch alla modalità GUI di FreeFileSync...</target> + <source>Unable to connect to sourceforge.net!</source> <target>Impossibile collegarsi a sourceforge.net!</target> + <source>A newer version of FreeFileSync is available:</source> <target>E' disponibile una nuova versione di FreeFileSync:</target> + <source>Download now?</source> <target>Scaricare ora?</target> + <source>Information</source> <target>Informazioni</target> + <source>FreeFileSync is up to date!</source> <target>FreeFileSync è aggiornato!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>Vuoi che FreeFileSync controlli automaticamente gli aggiornamenti ogni settimana?</target> + <source>(Requires an Internet connection!)</source> <target>(Richiede una connessione Internet!)</target> + <source>1. &Compare</source> <target>1. &Compara</target> + <source>2. &Synchronize...</source> <target>2. &Sincronizza...</target> + <source>S&witch view</source> <target>C&ommuta vista</target> + <source>&New</source> <target>&Nuovo</target> + <source>&Program</source> <target>&Programma</target> + <source>&Language</source> <target>&Lingua</target> + <source>&Global settings...</source> <target>&Preferenze...</target> + <source>&Create batch job...</source> <target>&Crea un job in batch...</target> + <source>&Export file list...</source> <target>&Esporta la lista dei file...</target> + <source>&Advanced</source> <target>&Avanzate</target> + <source>&Check for new version</source> <target>&Controlla la presenza di nuove versioni</target> + <source>Compare</source> <target>Compara</target> + <source>Compare both sides</source> <target>Compara le due liste</target> + <source>&Abort</source> <target>&Abbandona</target> + <source>Synchronize...</source> <target>Sincronizza...</target> + <source>Start synchronization</source> <target>Avvia sincronizzazione</target> -<source>Swap sides</source> -<target>Inverti i lati</target> + <source>Add folder pair</source> <target>Aggiungi una coppia di cartelle</target> + <source>Remove folder pair</source> <target>Elimina la coppia di cartelle</target> + +<source>Swap sides</source> +<target>Inverti i lati</target> + <source>Save current configuration to file</source> <target>Salva su file la configurazione corrente</target> + <source>Load configuration from file</source> <target>Carica configurazione da file</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>Ultima configurazione utilizzata (premi DEL per rimuovere dalla lista)</target> + <source>Hide excluded items</source> <target>Nascondi oggetti esclusi</target> + <source>Hide filtered or temporarily excluded files</source> <target>Nascondi file filtrati o temporaneamente esclusi</target> + <source>Number of files and directories that will be created</source> <target>Numero di file e cartelle che verranno creati</target> + <source>Number of files that will be overwritten</source> <target>Numero di file che verranno sovrascritti</target> + <source>Number of files and directories that will be deleted</source> <target>Numero di file e cartelle che verranno eliminati</target> + <source>Total amount of data that will be transferred</source> <target>Volume dei dati che verranno trasferiti</target> -<source>Left</source> -<target>Sinistra</target> -<source>Right</source> -<target>Destra</target> + <source>Batch job</source> <target>Batch job</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>Crea un file batch per sincronizzazione automatica. Per partire in modalità batch effettua semplicemente doppio click sul file o esegui da linea di comando: FreeFileSync.exe <batchfile>. Puoi anche schedulare il batch nelle operazioni pianificate del tuo sistema operativo.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target></target> + <source>Help</source> <target>Aiuto</target> + <source>Filter files</source> <target>Filtro dei files</target> + <source>Error handling</source> <target>Gestione degli errori</target> + +<source>Left</source> +<target>Sinistra</target> + +<source>Right</source> +<target>Destra</target> + <source>Overview</source> <target>Controllo generale</target> + <source>Status feedback</source> <target>Feedback di stato</target> + <source>Run minimized</source> <target></target> + <source>Maximum number of logfiles:</source> <target>Numero massimo di logfiles:</target> + <source>Select logfile directory:</source> <target>Seleziona cartella per il file di log:</target> + <source>Batch settings</source> <target></target> + <source>&Save</source> <target>&Salva</target> + <source>&Load</source> <target>&Carica</target> + <source>&Cancel</source> <target>&Annulla</target> + <source>Elements found:</source> <target>Elementi trovati:</target> + <source>Elements remaining:</source> <target>Elementi rimanenti:</target> + <source>Speed:</source> <target>Velocita':</target> + <source>Time remaining:</source> <target>Tempo rimanente:</target> + <source>Time elapsed:</source> <target>Tempo trascorso:</target> + <source>Operation:</source> <target>Operazione:</target> + <source>Select variant:</source> <target>Selezionare una variante:</target> + <source><Automatic></source> <target><Automatico></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>Identifica e propaga cambiamenti su entrambi i lati usando un database. Cancellazioni e conflitti sono riconosciuti automaticamente.</target> + <source>Mirror ->></source> <target>Mirror ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Mirror backup della cartella di sinistra. La cartella destra verrà modificata per corrispondere esattamente alla cartella di sinistra dopo la sincronizzazione.</target> + <source>Update -></source> <target>Aggiorna -></target> + <source>Copy new or updated files to right folder.</source> <target>Copia file nuovi o aggiornati nella cartella di destra.</target> + <source>Custom</source> <target>Personalizza</target> + <source>Configure your own synchronization rules.</source> <target>Configura le tue regole di sincronizzazione.</target> + <source>Deletion handling</source> <target>Gestione cancellazione</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>Configurazione</target> + <source>Category</source> <target>Categoria</target> + <source>Action</source> <target>Azioni</target> + <source>File/folder exists on left side only</source> <target>File/cartella esiste solo sul lato sinistro</target> + <source>File/folder exists on right side only</source> <target>File/cartella esiste solo sul lato destro</target> + <source>Left file is newer</source> <target>File di sinistra è più recente</target> + <source>Right file is newer</source> <target>File di destra è più recente</target> + <source>Files have different content</source> <target>I file hanno differente contenuto</target> + <source>Conflict/file cannot be categorized</source> <target>Conflitti/file non possono essere categorizzati</target> + <source>Compare by...</source> <target>Compara per...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> -<target> -I file sono considerati identici se - - dimensione - - data e ora sono identici -</target> -<source>File size and date</source> -<target>Dimensione e data del file</target> +<target></target> + +<source>File time and size</source> +<target></target> + <source> Files are found equal if - file content @@ -523,92 +753,85 @@ I file sono considerati identici se - il contenuto è identico </target> + <source>File content</source> <target>Contenuto del file</target> + <source>Symbolic Link handling</source> <target>Gestione Link Simbolico</target> + <source>Synchronizing...</source> <target>Sincronizzazione in corso...</target> + <source>Elements processed:</source> <target>Elementi processati:</target> + <source>&Pause</source> <target>&Pausa</target> -<source>Compare by "File size and date"</source> -<target>Compara per "Data e dimensione"</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>Questa variante definisce identici due file con lo stesso nome quando hanno la stessa dimensione E la stessa data e ora.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>Quando questo set di opzioni viene selezionato per la comparazione viene processato il seguente albero di decisioni:</target> -<source>As a result the files are separated into the following categories:</source> -<target>I file risultano infine ripartiti nelle seguenti categorie:</target> -<source>- equal</source> -<target>- file identici</target> -<source>- left newer</source> -<target>- file di sinistra più recente</target> -<source>- right newer</source> -<target>- file di destra più recente</target> -<source>- exists left only</source> -<target>- il file esiste solo a sinistra</target> -<source>- exists right only</source> -<target>- il file esiste solo a destra</target> -<source>- conflict (same date, different size)</source> -<target>- conflitto (stessa data, dimensione diversa)</target> -<source>Compare by "File content"</source> -<target>Compara per "Contenuto dei file"</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. - -With this option enabled the decision tree is smaller: -</source> -<target> -Come suggerisce il nome, due file con lo stesso nome sono considerati come identici se, e solamente se, il loro contenuto è identico. Questa opzione è utile sia per i contrlli di coerenza che per le operazioni di backup. Tuttavia, data e ora vengono ignorate. -Abilitando questa opzione l'albero delle decisioni è semplificato: -</target> -<source>- different</source> -<target>- file diversi</target> <source>Source code written in C++ utilizing:</source> <target>Codice sorgente scritto in C++ utilizzando:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>Per la traduzione di FreeFileSync, un grazie va a:</target> + <source>Feedback and suggestions are welcome at:</source> <target>Commenti e suggerimenti sono i benvenuti:</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync su Sourceforge</target> + <source>Homepage</source> <target>Homepage</target> + <source>If you like FFS</source> <target>Se ti piace FFS</target> + <source>Donate with PayPal</source> <target>Fai una donazione con PayPal</target> + <source>Email</source> <target>Email</target> + <source>Report translation error</source> <target>Segnala errori di traduzione</target> + <source>Published under the GNU General Public License:</source> <target>Pubblicato sotto licenza GNU General Public:</target> + <source>Ignore subsequent errors</source> <target>Ignora gli errori successivi</target> + <source>Hide further error messages during the current process</source> <target>Non mostrare i successivi messaggi d'errore durante il processo corrente</target> + <source>&Ignore</source> <target>&Ignora</target> + <source>&Retry</source> <target>&Riprova</target> + <source>Do not show this dialog again</source> <target>Non visualizzare più questo messaggio</target> + <source>&Switch</source> <target>&Switch</target> + <source>&Yes</source> <target>&Si</target> + <source>&No</source> <target>&No</target> + <source>Delete on both sides</source> <target>Cancella su entrambi i lati</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>Cancella su entrambi i lati anche se il file è selezionato su un solo lato.</target> + <source>Use Recycle Bin</source> <target>Usa il Cestino</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -617,16 +840,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire Solo file/cartelle che corrispondono a tutti i filtri impostati saranno selezionati per la sincronizzazione. Nota: Il nome filtro deve essere specificato relativo(!) nelle directory principali di sincronizzazione. </target> + <source>Hints:</source> <target>Consigli:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. Inserisci i nomi relativi di file o directory separati da ';' o su una nuova riga.</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. Sono ammessi i caratteri generici '*' e '?'.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. Escludi i file direttamente sulla griglia principale tramite il menu contestuale.</target> + <source>Example</source> <target>Esempio</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -635,30 +864,40 @@ Exclude: \stuff\temp\* Includi: *.doc;*.zip;*.exe Escludi: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>Sincronizza tutti i file .doc, .zip e .exe eccetto tutti quelli nella cartella "temp".</target> + <source>Include</source> <target>Includi</target> + <source>Exclude</source> <target>Escludi</target> -<source>Select time span:</source> -<target>Seleziona intervallo temporale:</target> -<source>Minimum file size:</source> -<target>Dimensione minima file:</target> -<source>Maximum file size:</source> -<target>Dimensione massima file:</target> + +<source>Minimum file size</source> +<target></target> + +<source>Maximum file size</source> +<target></target> + <source>&Default</source> <target>&Default</target> + <source>Move column up</source> <target>Sposta colonna su'</target> + <source>Move column down</source> <target>Sposta colonna giu'</target> -<source>Transactional File Copy</source> + +<source>Transactional file copy</source> <target></target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> <target></target> + <source>Copy locked files</source> <target>Copia file bloccati</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -667,8 +906,10 @@ Copy shared or locked files using Volume Shadow Copy Service Copia file condivisi o bloccati usando il Servizio Volume Shadow Copy (Richiede diritti di Administrator) </target> -<source>Copy filesystem permissions</source> -<target>Copia permessi del filesystem</target> + +<source>Copy file access permissions</source> +<target></target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -677,138 +918,205 @@ Transfer file and directory permissions Trasferisci file e permessi sulle cartelle (Richiede diritti di Administrator) </target> + <source>Hidden dialogs:</source> <target>Messaggi nascosti:</target> + <source>Reset</source> <target>Reset</target> + <source>Show hidden dialogs</source> <target>Mostra messaggi nascosti</target> + <source>External applications</source> <target>Applicazioni esterne</target> + <source>Description</source> <target>Descrizione</target> + <source>Variant</source> <target>Variante</target> + <source>Statistics</source> <target>Statistiche</target> + <source>Find what:</source> <target>Trova cosa:</target> + <source>Match case</source> <target>Corrispondenza</target> + <source>&Find next</source> <target>&Trova successivo</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>Puoi provare a sincronizzare di nuovo gli elementi restanti (SENZA doverli ri-comparare) !</target> -<source>Batch file created successfully!</source> -<target>Creazione batch file riuscita!</target> + <source>Main bar</source> <target>Barra principale</target> + <source>Folder pairs</source> <target>Coppia di cartelle</target> + <source>Select view</source> <target>Seleziona vista</target> + <source>Set direction:</source> <target>Imposta direzione:</target> + <source>Exclude temporarily</source> <target>Escludi temporaneamente</target> + <source>Include temporarily</source> <target>Includi temporaneamente</target> + <source>Exclude via filter:</source> <target>Escludi tramite filtro:</target> + <source><multiple selection></source> <target><selezione multipla></target> + <source>D-Click</source> <target>D-Click</target> + <source>Delete</source> <target>Cancella</target> + <source>Customize...</source> <target>Personalizza...</target> + +<source>Select time span...</source> +<target></target> + <source>Auto-adjust columns</source> <target>Larghezza automatica colonne</target> + <source>Include all rows</source> <target>Includi tutte le righe</target> + <source>Exclude all rows</source> <target>Escludi tutte le righe</target> + <source>Reset view</source> <target>Resetta vista</target> + <source>Show "%x"</source> <target>Mostra "%x"</target> + <source><Last session></source> <target><Ultima sessione></target> + <source>Configuration saved!</source> <target>Configurazione salvata!</target> + <source>Save changes to current configuration?</source> <target>Salvare i cambiamenti alla configurazione corrente?</target> + <source>Configuration loaded!</source> <target>Configurazione caricata!</target> + <source>Folder Comparison and Synchronization</source> <target>Comparazione di Cartelle e Sincronizzazione</target> + <source>Hide files that exist on left side only</source> <target>Nascondi i file esistenti solo a sinistra</target> + <source>Show files that exist on left side only</source> <target>Mostra file esistenti solo a sinistra</target> + <source>Hide files that exist on right side only</source> <target>Nascondi i file esistenti solo a destra</target> + <source>Show files that exist on right side only</source> <target>Mostra file esistenti solo a destra</target> + <source>Hide files that are newer on left</source> <target>Nascondi i file più recenti a sinistra</target> + <source>Show files that are newer on left</source> <target>Mostra file di sinistra più recenti che a destra</target> + <source>Hide files that are newer on right</source> <target>Nascondi i file più recenti a destra</target> + <source>Show files that are newer on right</source> <target>Mostra file di destra più recenti che a sinistra</target> + <source>Hide files that are equal</source> <target>Nascondi i file identici</target> + <source>Show files that are equal</source> <target>Mostra file identici</target> + <source>Hide files that are different</source> <target>Nascondi i file differenti</target> + <source>Show files that are different</source> <target>Mostra file differenti</target> + <source>Hide conflicts</source> <target>Nascondi i conflitti</target> + <source>Show conflicts</source> <target>Mostra conflitti</target> + <source>Hide files that will be created on the left side</source> <target>Nascondi i file che verranno creati sul lato sinistro</target> + <source>Show files that will be created on the left side</source> <target>Mostra file che verranno creati sul lato sinistro</target> + <source>Hide files that will be created on the right side</source> <target>Nascondi i file che verranno creati sul lato destro</target> + <source>Show files that will be created on the right side</source> <target>Mostra file che verranno creati sul lato destro</target> + <source>Hide files that will be deleted on the left side</source> <target>Nascondi i file che verranno cancellati sul lato sinistro</target> + <source>Show files that will be deleted on the left side</source> <target>Mostra file che verranno cancellati sul lato sinistro</target> + <source>Hide files that will be deleted on the right side</source> <target>Nascondi i file che verranno cancellati sul lato destro</target> + <source>Show files that will be deleted on the right side</source> <target>Mostra file che verranno cancellati sul lato destro</target> + <source>Hide files that will be overwritten on left side</source> <target>Nascondi i file che verranno sovrascritti sul lato sinistro</target> + <source>Show files that will be overwritten on left side</source> <target>Mostra file che verranno sovrascritti sul lato sinistro</target> + <source>Hide files that will be overwritten on right side</source> <target>Nascondi i file che verranno sovrascritti sul lato destro</target> + <source>Show files that will be overwritten on right side</source> <target>Mostra file che verranno sovrascritti sul lato destro</target> + <source>Hide files that won't be copied</source> <target>Nascondi i file che non saranno copiati</target> + <source>Show files that won't be copied</source> <target>Mostra file che non saranno copiati</target> + <source>All directories in sync!</source> <target>Tutte le directory in sync!</target> + <source>Please run a Compare first before synchronizing!</source> <target>Prima di sincronizzare effettua una Comparazione!</target> + <source>Comma separated list</source> <target>Lista di elementi separati da virgola</target> + <source>Legend</source> <target>Legenda</target> + <source>File list exported!</source> <target>Lista dei file esportata!</target> + +<source>Batch file created successfully!</source> +<target>Creazione batch file riuscita!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -817,6 +1125,7 @@ Trasferisci file e permessi sulle cartelle <pluralform>Eliminazione oggetto riuscita!</pluralform> <pluralform>%x oggetti eliminati con successo!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -825,6 +1134,7 @@ Trasferisci file e permessi sulle cartelle <pluralform>1 cartella</pluralform> <pluralform>%x cartelle</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -833,6 +1143,7 @@ Trasferisci file e permessi sulle cartelle <pluralform>1 file</pluralform> <pluralform>%x file</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -841,72 +1152,97 @@ Trasferisci file e permessi sulle cartelle <pluralform>%x di 1 riga in vista</pluralform> <pluralform>%x di %y righe in vista</pluralform> </target> + <source>Scanning...</source> <target>Scansione in corso...</target> + <source>Comparing content...</source> <target>Comparazione contenuto...</target> + <source>Paused</source> <target>In pausa</target> + <source>Aborted</source> <target>Abbandono riuscito</target> + <source>Completed</source> <target>Completato</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>Abbandono richiesto: in attesa della fine dell'operazione in corso...</target> + <source>Continue</source> <target>Continua</target> + <source>Pause</source> <target>Pausa</target> + <source>Cannot find %x</source> <target>Impossibile trovare %x</target> -<source>DECISION TREE</source> -<target>ALBERO DELLE DECISIONI</target> -<source>file exists on both sides</source> -<target>file esistente su entrambi i lati</target> -<source>on one side only</source> -<target>file esistente su un solo lato</target> -<source>same date</source> -<target>stessa data</target> -<source>different date</source> -<target>data diversa</target> + <source>Inactive</source> <target>Inattivo</target> -<source>Second</source> -<target>Secondo</target> -<source>Minute</source> -<target>Minuto</target> -<source>Hour</source> -<target>Ora</target> -<source>Day</source> -<target>Giorno</target> + +<source>Last x hours</source> +<target></target> + +<source>Today</source> +<target></target> + +<source>This week</source> +<target></target> + +<source>This month</source> +<target></target> + +<source>This year</source> +<target></target> + <source>Byte</source> <target>Byte</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>Filtro: Tutte le coppie</target> + <source>Filter: Single pair</source> <target>Filtro: Singola coppia</target> + <source>Ignore</source> <target>Ignora</target> + <source>Direct</source> <target>Diretto</target> + <source>Follow</source> <target>Segui</target> + +<source>Copy NTFS permissions</source> +<target></target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>Integra applicazioni esterne nel menu contestuale. Sono disponibili le seguenti macro:</target> + <source>- full file or directory name</source> <target>- file completo o nome directory</target> + <source>- directory part only</source> <target>- solo parte di directory</target> + <source>- Other side's counterpart to %name</source> <target>- L'altro lato e' equivalente a %name</target> + <source>- Other side's counterpart to %dir</source> <target>- L'altro lato e' equivalente a %dir</target> + <source>Restore all hidden dialogs?</source> <target>Ripristinare tutti i dialoghi nascosti?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -915,6 +1251,7 @@ Trasferisci file e permessi sulle cartelle <pluralform>Vuoi veramente spostare il seguente oggetto nel Cestino?</pluralform> <pluralform>Vuoi veramente spostare i seguenti %x oggetti nel Cestino?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -923,139 +1260,211 @@ Trasferisci file e permessi sulle cartelle <pluralform>Vuoi veramente cancellare il seguente oggetto?</pluralform> <pluralform>Vuoi veramente cancellare i seguenti %x oggetti?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>Lascia come conflitti irrisolti</target> + <source>Delete permanently</source> <target>Cancella definitivamente</target> + <source>Delete or overwrite files permanently</source> <target>Cancella o sovrascrivi file definitivamente</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>Usa il Cestino quando si cancella o sovrascrive un file</target> + <source>Versioning</source> <target>Versioning</target> + <source>Move files into a time-stamped subdirectory</source> <target>Sposta file in una sotto-cartella datata</target> -<source>Cannot determine sync-direction:</source> -<target>Impossibile determinare direzione di sincronia:</target> -<source>Filter settings have changed!</source> -<target>Le impostazioni del filtro sono cambiate!</target> + <source>Both sides have changed since last synchronization!</source> <target>Entrambi i lati sono cambiati dall'ultima sincronizzazione!</target> + +<source>Cannot determine sync-direction:</source> +<target>Impossibile determinare direzione di sincronia:</target> + <source>No change since last synchronization!</source> <target>Nessun cambiamento dall'ultima sincronizzazione!</target> + +<source>Filter settings have changed!</source> +<target>Le impostazioni del filtro sono cambiate!</target> + <source>The file was not processed by last synchronization!</source> <target>Il file non era processato nell'ultima sincronizzazione!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>La cancellazione della directory pianificata e' in conflitto con queste sottodirectory e files!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Imposta direzioni di sincronizzazione di default: I vecchi file saranno sovrascritti dai nuovi.</target> + <source>The file does not contain a valid configuration:</source> <target>Il file non contiene una configurazione valida</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>Puoi ignorare questo errore per considerare la directory come vuota.</target> + <source>Directory does not exist:</source> <target>La directory non esiste:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Le directory sono dipendenti! Fai attenzione quando configuri le regole di sincronizzazione:</target> + <source>Comparing content of files %x</source> <target>Comparazione contenuto del file %x</target> + <source>Memory allocation failed!</source> <target>Allocazione di memoria fallita!</target> + <source>File %x has an invalid date!</source> <target>Il file %x ha una data non valida!</target> + <source>Conflict detected:</source> <target>Rilevato conflitto:</target> + <source>Files %x have the same date but a different size!</source> <target>I file %x hanno la stessa data ma dimensione diversa!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>Symlinks %x hanno stessa data ma differente target!</target> + <source>Comparing files by content failed.</source> <target>Comparazione file in base al contenuto fallita.</target> + <source>Generating file list...</source> <target>Generazione lista dei file...</target> + <source>Multiple...</source> <target>Multiplo...</target> + <source>Both sides are equal</source> <target>Entrambi i lati sono uguali</target> + <source>Files/folders differ in attributes only</source> <target>File/cartelle differiscono solo negli attributi</target> + <source>Copy new file/folder to left</source> <target>Copia nuovo file/cartella verso sinistra</target> + <source>Copy new file/folder to right</source> <target>Copia nuovo file/cartella verso destra</target> + <source>Delete left file/folder</source> <target>Cancella file/cartella di sinistra</target> + <source>Delete right file/folder</source> <target>Cancella file/cartella di destra</target> + <source>Overwrite left file/folder with right one</source> <target>Sovrascrivi file/cartella di sinistra con quello di destra</target> + <source>Overwrite right file/folder with left one</source> <target>Sovrascrivi file/cartella di destra con quello di sinistra</target> + <source>Do nothing</source> <target>Non fare nulla</target> + <source>Copy file attributes only to left</source> <target>Copia i soli attributi file verso sinistra</target> + <source>Copy file attributes only to right</source> <target>Copia i soli attributi file verso destra</target> + <source>Deleting file %x</source> <target>Eliminazione file %x</target> -<source>Deleting Symbolic Link %x</source> -<target>Eliminazione Link Simbolico %x</target> + <source>Deleting folder %x</source> <target>Eliminazione cartella %x</target> -<source>Moving %x to Recycle Bin</source> -<target>Spostamento di %x nel Cestino</target> -<source>Moving file %x to user-defined directory %y</source> -<target>Spostamento del file %x nella directory personalizzata %y</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>Spostamento di cartella %x nella directory personalizzata %y</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>Spostamento Link Simbolico %x su directory definita dall'utente %y</target> -<source>Copying new file %x to %y</source> -<target>Copia di nuovo file %x su %y in corso</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>Copia di nuovo Link Simbolico %x su %y in corso</target> -<source>Overwriting file %x in %y</source> -<target>Sovrascrittura di file %x in %y in corso</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>Sovrascrittura di Link Simbolico %x in %y in corso</target> + +<source>Deleting symbolic link %x</source> +<target></target> + +<source>Moving file %x to recycle bin</source> +<target></target> + +<source>Moving folder %x to recycle bin</source> +<target></target> + +<source>Moving symbolic link %x to recycle bin</source> +<target></target> + +<source>Moving file %x to %y</source> +<target></target> + +<source>Moving folder %x to %y</source> +<target></target> + +<source>Moving symbolic link %x to %y</source> +<target></target> + +<source>Creating file %x</source> +<target></target> + +<source>Creating symbolic link %x</source> +<target></target> + <source>Creating folder %x</source> <target>Creazione cartella %x</target> + +<source>Overwriting file %x</source> +<target></target> + +<source>Overwriting symbolic link %x</source> +<target></target> + <source>Verifying file %x</source> <target>Verifica di file %x</target> + <source>Updating attributes of %x</source> <target>Aggiornamento attributi di %x</target> -<source>Source directory does not exist anymore:</source> -<target>La directory sorgente non è più esistente:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>Niente da sincronizzare in questa configurazione!</target> + <source>Target directory name must not be empty!</source> <target>Il nome della cartella di destinazione non può essere nullo!</target> + <source>User-defined directory for deletion was not specified!</source> <target>Directory personalizzata per la cancellazione non specificata!</target> + +<source>Source directory does not exist anymore:</source> +<target>La directory sorgente non è più esistente:</target> + <source>Unresolved conflicts existing!</source> <target>Sono presenti conflitti irrisolti!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>Puoi ignorare i conflitti e continuare la sincronizzazione.</target> + <source>Significant difference detected:</source> <target>Riscontrate differenze significative:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>Piu' del 50% del totale dei files saranno copiati o cancellati!</target> + <source>Not enough free disk space available in:</source> <target>Spazio libero su disco insufficiente in:</target> + <source>Free disk space required:</source> <target>Spazio libero su disco richiesto:</target> + <source>Free disk space available:</source> <target>Spazio libero su disco disponibile:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> <target></target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>Una directory che fa parte di più coppie di cartelle sarà modificata! Ricontrolla le impostazioni di sincronizzazione!</target> + <source>Processing folder pair:</source> <target>Elaborazione coppia di cartelle:</target> + <source>Generating database...</source> <target>Generazione database...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>Niente da sincronizzare in questa configurazione!</target> + <source>Error copying locked file %x!</source> <target>Errore durante la copia del file bloccato %x!</target> + <source>Data verification error: Source and target file have different content!</source> <target>Errore in verifica data: I file sorgente e destinazione hanno differente contenuto!</target> + diff --git a/BUILD/Languages/japanese.lng b/BUILD/Languages/japanese.lng index b25c6685..7731c0d7 100644 --- a/BUILD/Languages/japanese.lng +++ b/BUILD/Languages/japanese.lng @@ -9,74 +9,115 @@ <source>Searching for directory %x...</source> <target></target> + <source>Show in Explorer</source> <target>エクスプãƒãƒ¼ãƒ©ã§è¡¨ç¤º</target> + <source>Open with default application</source> <target>既定アプリケーションã§é–‹ã</target> + <source>Browse directory</source> <target>ディレクトリをå‚ç…§</target> + <source>RealtimeSync - Automated Synchronization</source> <target>リアルタイムåŒæœŸ - 自動åŒæœŸ</target> + <source>Browse</source> <target>å‚ç…§</target> -<source>Invalid commandline: %x</source> -<target>無効ãªã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³: %x</target> + +<source>Invalid command line: %x</source> +<target></target> + <source>Error resolving symbolic link:</source> <target>シンボリックリンクã®è§£æ±ºã«å¤±æ•—:</target> -<source>Show popup</source> -<target>ãƒãƒƒãƒ—アップ表示</target> -<source>Show popup on errors or warnings</source> -<target>エラー/è¦å‘Šã‚’ãƒãƒƒãƒ—アップ表示</target> + +<source>Show pop-up</source> +<target></target> + +<source>Show pop-up on errors or warnings</source> +<target></target> + <source>Ignore errors</source> <target>エラーを無視</target> + <source>Hide all error and warning messages</source> <target>ã™ã¹ã¦ã®ã‚¨ãƒ©ãƒ¼ã¨è¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’éžè¡¨ç¤º</target> + <source>Exit instantly</source> <target>ã™ãã«çµ‚了</target> + <source>Abort synchronization immediately</source> <target>今ã™ãã«åŒæœŸå‡¦ç†ã‚’ä¸æ–</target> + +<source>Select alternate comparison settings</source> +<target></target> + <source>Select alternate synchronization settings</source> <target>代替åŒæœŸè¨å®šã‚’é¸æŠž</target> + <source>No filter selected</source> <target>フィルターé¸æŠžãªã—</target> + <source>Filter is active</source> <target>フィルターを有効化</target> -<source>Clear filter settings</source> -<target>フィルターè¨å®šã‚’クリア</target> + <source>Remove alternate settings</source> <target>代替è¨å®šã‚’除去</target> + +<source>Clear filter settings</source> +<target>フィルターè¨å®šã‚’クリア</target> + <source>Create a batch job</source> <target>一括ジョブを作æˆ</target> + <source>Synchronization settings</source> <target>åŒæœŸå‡¦ç†è¨å®š</target> + <source>Comparison settings</source> <target>比較è¨å®š</target> + <source>About</source> <target>æƒ…å ±</target> + <source>Error</source> <target>エラー</target> + <source>Warning</source> <target>è¦å‘Š</target> + <source>Question</source> <target>質å•</target> + <source>Confirm</source> <target>確èª</target> + <source>Configure filter</source> <target>フィルターè¨å®š</target> + <source>Customize columns</source> <target>列ã®èª¿æ•´</target> + <source>Global settings</source> <target>全般的ãªè¨å®š</target> + <source>Synchronization Preview</source> <target>åŒæœŸå‡¦ç†ã®ãƒ—レビュー</target> + <source>Find</source> <target>検索</target> + +<source>Select time span</source> +<target></target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -84,46 +125,64 @@ <target> <pluralform>%x ãƒã‚¤ãƒˆ</pluralform> </target> + <source><Symlink></source> <target><シンボリックリンク></target> + <source><Directory></source> <target><ディレクトリ></target> + <source>Size</source> <target>サイズ</target> + <source>Date</source> <target>データ</target> + <source>Full path</source> <target>フルパス</target> + <source>Filename</source> <target>ファイルå</target> + <source>Relative path</source> <target>相対パス</target> + <source>Directory</source> <target>ディレクトリ</target> + <source>Extension</source> <target>æ‹¡å¼µå</target> + <source>Comparison Result</source> <target>比較çµæžœ</target> + <source>Incompatible synchronization database format:</source> <target>åŒæœŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®æ›¸å¼ã«äº’æ›æ€§ãŒã‚ã‚Šã¾ã›ã‚“:</target> + <source>Initial synchronization:</source> <target>åŒæœŸå‡¦ç†ã®åˆæœŸåŒ–:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>FreeFileSync データベースファイルãŒå˜åœ¨ã—ã¾ã›ã‚“:</target> + <source>Error reading from synchronization database:</source> <target>åŒæœŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‹ã‚‰ã®èªã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:</target> + <source>Database files do not share a common synchronization session:</source> <target></target> + <source>An exception occurred!</source> <target>例外ãŒç™ºç”Ÿã—ã¾ã—ãŸ!</target> -<source>Error deleting file:</source> -<target>ファイルã®å‰Šé™¤ã‚¨ãƒ©ãƒ¼:</target> + <source>Error reading file attributes:</source> <target>ファイル属性ã®å–å¾—ã«å¤±æ•—:</target> + <source>Waiting while directory is locked (%x)...</source> <target>待機時間ä¸ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ãƒãƒƒã‚¯ã•ã‚Œã¾ã™(%x)...</target> + <source>Error setting directory lock:</source> <target>ディレクトリè¨å®šã«å¤±æ•—(ãƒãƒƒã‚¯):</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -131,27 +190,37 @@ <target> <pluralform>%x 秒.</pluralform> </target> + <source>Info</source> <target>æƒ…å ±</target> + <source>Fatal Error</source> <target>致命的ãªã‚¨ãƒ©ãƒ¼</target> + <source>Scanning:</source> <target>スã‚ャン:</target> + <source>Encoding extended time information: %x</source> <target>æ‹¡å¼µã•ã‚ŒãŸæ™‚é–“æƒ…å ±ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> <target></target> + <source>Invalid FreeFileSync config file!</source> <target>無効㪠FreeFileSync 構æˆãƒ•ã‚¡ã‚¤ãƒ«ã§ã™!</target> + <source>File does not exist:</source> <target>ファイルãŒå˜åœ¨ã—ã¾ã›ã‚“:</target> + <source>Error parsing configuration file:</source> <target>構æˆãƒ•ã‚¡ã‚¤ãƒ«ã®æ§‹æ–‡ã«èª¤ã‚ŠãŒã‚ã‚Šã¾ã™:</target> + <source>/sec</source> <target>/秒</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -159,6 +228,7 @@ <target> <pluralform>%x 分.</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -166,6 +236,7 @@ <target> <pluralform>%x 時間</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -173,28 +244,40 @@ <target> <pluralform>%x æ—¥</pluralform> </target> + <source>S&ave configuration...</source> <target>構æˆè¨å®šã‚’ä¿å˜(&A)...</target> + <source>&Load configuration...</source> <target>構æˆè¨å®šã®èªã¿è¾¼ã¿(&L)...</target> + <source>&Quit</source> <target>終了(&Q)</target> + <source>&File</source> <target>ファイル(&F)</target> + <source>&Content</source> <target>トピック(&C)</target> + <source>&About...</source> <target>æƒ…å ±(&A)...</target> + <source>&Help</source> <target>ヘルプ(&H)</target> + <source>Usage:</source> <target>使用方法:</target> + <source>1. Select directories to monitor.</source> <target>1. 監視ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠž</target> + <source>2. Enter a command line.</source> <target>2. コマンドラインを入力</target> + <source>3. Press 'Start'.</source> <target>3. 'スタート'をクリック</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -205,310 +288,456 @@ The command line is executed each time: - ã™ã¹ã¦ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§åˆ©ç”¨å¯èƒ½ã§ã™ (例. USB スティックã®æŒ¿å…¥æ™‚) - ディレクトリã€ã¾ãŸã¯ã‚µãƒ–ディレクトリ内ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ›´æ–°ã•ã‚Œã¾ã™ã€‚ </target> + <source>Directories to watch</source> <target>ディレクトリを監視</target> + <source>Add folder</source> <target>ãƒ•ã‚©ãƒ«ãƒ€ã‚’è¿½åŠ </target> + <source>Remove folder</source> <target>フォルダ除去</target> + <source>Select a folder</source> <target>フォルダをé¸æŠž</target> + <source>Command line</source> <target>コマンドライン</target> + <source>Minimum Idle Time [seconds]</source> <target>最å°å¾…機時間[秒]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>最後ã®å¤‰æ›´ã®æ¤œå‡ºã‹ã‚‰ã€æ¬¡ã«ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã‚’実行ã™ã‚‹ã¾ã§ã®å¾…機時間(秒)</target> + <source>Start</source> <target>開始</target> + <source>(Build: %x)</source> <target>(ビルド: %x)</target> + <source>RealtimeSync configuration</source> <target>リアルタイムåŒæœŸã®æ§‹æˆè¨å®š</target> + <source>File already exists. Overwrite?</source> <target>ファイルã¯å˜åœ¨ã—ã¾ã™ã€ä¸Šæ›¸ãã—ã¾ã™ã‹?</target> + <source>&Restore</source> <target>修復(&R)</target> + <source>&Exit</source> <target>終了(&E)</target> + <source>Monitoring active...</source> <target>監視を開始ã—ã¾ã™...</target> + <source>Waiting for missing directories...</source> <target>見失ã£ãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®å¾…æ©Ÿä¸</target> + <source>A directory input field is empty.</source> <target>ディレクトリãŒå…¥åŠ›ã•ã‚Œã¦ã„ã¾ã›ã‚“</target> + <source>Drag && drop</source> <target>ドラッグ && ドãƒãƒƒãƒ—</target> + <source>Could not initialize directory monitoring:</source> <target>監視ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“:</target> + <source>Error when monitoring directories.</source> <target>ディレクトリã®ç›£è¦–エラー</target> + <source>Conversion error:</source> <target>変æ›ã‚¨ãƒ©ãƒ¼:</target> + +<source>Error deleting file:</source> +<target>ファイルã®å‰Šé™¤ã‚¨ãƒ©ãƒ¼:</target> + <source>Error moving file:</source> <target>ファイルã®ç§»å‹•ã«å¤±æ•—:</target> + <source>Target file already existing!</source> <target>対象ファイルã¯æ—¢ã«å˜åœ¨ã—ã¾ã™!</target> + <source>Error moving directory:</source> <target>ディレクトリ移動ã«å¤±æ•—:</target> + <source>Target directory already existing!</source> <target>対象ディレクトリã¯ã™ã§ã«å˜åœ¨ã—ã¾ã™!</target> + <source>Error deleting directory:</source> <target>ディレクトリã®å‰Šé™¤ã‚¨ãƒ©ãƒ¼:</target> + <source>Error changing modification time:</source> <target>時間ã®ä¿®æ£ä¸ã®ã‚¨ãƒ©ãƒ¼:</target> + <source>Error loading library function:</source> <target>ライブラリèªã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:</target> + <source>Error reading security context:</source> <target>ã‚»ã‚ュリティ・コンテã‚ストã®èªã¿å–りエラー:</target> + <source>Error writing security context:</source> <target>ã‚»ã‚ュリティ・コンテã‚ストã®æ›¸ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼:</target> + <source>Error copying file permissions:</source> <target>パーミッションコピーä¸ã®ã‚¨ãƒ©ãƒ¼</target> + <source>Error creating directory:</source> <target>ディレクトリ作æˆã‚¨ãƒ©ãƒ¼:</target> + <source>Error copying symbolic link:</source> <target>シンボリックリンクã®ã‚³ãƒ”ーã«å¤±æ•—:</target> + <source>Error copying file:</source> <target>ファイルã®ã‚³ãƒ”ーã«å¤±æ•—:</target> + <source>Error opening file:</source> <target>ファイルã®ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—:</target> + <source>Error writing file:</source> <target>ファイル書ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼:</target> + <source>Error reading file:</source> <target>ファイルèªã¿è¾¼ã¿ã‚¨ãƒ©ãƒ¼:</target> + <source>Operation aborted!</source> <target>æ“作ã®ä¸æ–!</target> + <source>Endless loop when traversing directory:</source> <target>ディレクトリ移動ä¸ã«ç„¡é™ãƒ«ãƒ¼ãƒ—ãŒç™ºç”Ÿ:</target> + <source>Error traversing directory:</source> <target>ディレクトリã®ç§»å‹•ã‚¨ãƒ©ãƒ¼:</target> + <source>Windows Error Code %x:</source> <target>Windows エラーコード %x:</target> + <source>Linux Error Code %x:</source> <target>Linux エラーコード %x:</target> + <source>Error setting privilege:</source> <target>特権ã®è¨å®šã‚¨ãƒ©ãƒ¼:</target> + <source>Error moving to Recycle Bin:</source> <target>ゴミ箱ã¸ã®ç§»å‹•ã«å¤±æ•—:</target> + <source>Could not load a required DLL:</source> <target>å¿…è¦ãªDLLã‚’èªã¿è¾¼ã‚ã¾ã›ã‚“:</target> + <source>Error writing to synchronization database:</source> <target>åŒæœŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¸ã®æ›¸ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>ボリュームシャドウコピーã®é–‹å§‹ã«å¤±æ•—!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target></target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>WOW64 ã§ã¯ã€ãƒœãƒªãƒ¥ãƒ¼ãƒ シャドウコピーã«å¯¾å¿œã—ã¦ã„ã¾ã›ã‚“ã€FreeFileSync 64-bit 版をãŠè©¦ã—ãã ã•ã„。</target> + <source>Could not determine volume name for file:</source> <target>ファイルã®ãƒœãƒªãƒ¥ãƒ¼ãƒ åãŒæ±ºå®šã•ã‚Œã¦ã„ã¾ã›ã‚“:</target> + <source>Volume name %x not part of filename %y!</source> <target>ボリュームå %x ã«ãƒ•ã‚¡ã‚¤ãƒ«å %y ã¯ã‚ã‚Šã¾ã›ã‚“!</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>以下㮠XMLノードã®å€¤ã‚’èªã¿è¾¼ã‚€ã“ã¨ãŒå‡ºæ¥ã¾ã›ã‚“:</target> + <source>Logging</source> <target>ãƒã‚°</target> + <source>FreeFileSync batch file</source> <target>FreeFileSync ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«</target> + <source>FreeFileSync configuration</source> <target>FreeFileSync 構æˆè¨å®š</target> + <source>FreeFileSync Batch Job</source> <target>FreeFileSync 一括ジョブ</target> + <source>Unable to create logfile!</source> <target>ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆå‡ºæ¥ã¾ã›ã‚“!</target> + <source>Batch execution</source> <target>一括処ç†ã‚’実行</target> + <source>Log-messages:</source> <target>ãƒã‚°ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸:</target> + <source>Stop</source> <target>åœæ¢</target> + <source>Total time:</source> <target>åˆè¨ˆæ™‚é–“:</target> + <source>Synchronization aborted!</source> <target>åŒæœŸå‡¦ç†ã‚’ä¸æ–!</target> + <source>Synchronization completed with errors!</source> <target>åŒæœŸå‡¦ç†ã¯ã€ã‚¨ãƒ©ãƒ¼ã§çµ‚了ã—ã¦ã„ã¾ã™!</target> + <source>Synchronization completed successfully!</source> <target>åŒæœŸå‡¦ç†ã¯ã™ã¹ã¦æ£å¸¸ã«å®Œäº†ã—ã¾ã—ãŸ!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>"切り替ãˆ" を押ã™ã¨ FreeFileSync GUI モードã§é–‹ãã¾ã™</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>FreeFileSync GUI モードã®åˆ‡ã‚Šæ›¿ãˆä¸...</target> + <source>Unable to connect to sourceforge.net!</source> <target>Sourceforge.net ã«æŽ¥ç¶šã§ãã¾ã›ã‚“!</target> + <source>A newer version of FreeFileSync is available:</source> <target>FreeFileSync ã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã§ã™:</target> + <source>Download now?</source> <target>ダウンãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹?</target> + <source>Information</source> <target>インフォメーション</target> + <source>FreeFileSync is up to date!</source> <target>FreeFileSync ã¯æœ€æ–°ã§ã™!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>FreeFileSync ã®æ›´æ–°ç¢ºèªã‚’毎週自動的ã«è¡Œã„ã¾ã™ã‹?</target> + <source>(Requires an Internet connection!)</source> <target>(インターãƒãƒƒãƒˆæŽ¥ç¶šã‚’å¿…è¦ã¨ã—ã¾ã™!)</target> + <source>1. &Compare</source> <target>1. 比較(&C)</target> + <source>2. &Synchronize...</source> <target>2. åŒæœŸå‡¦ç†(&S)...</target> + <source>S&witch view</source> <target>表示切り替ãˆ(&W)</target> + <source>&New</source> <target>æ–°è¦(&N)</target> + <source>&Program</source> <target>プãƒã‚°ãƒ©ãƒ (&P)</target> + <source>&Language</source> <target>使用言語(&L)</target> + <source>&Global settings...</source> <target>全般的ãªè¨å®š(&G)...</target> + <source>&Create batch job...</source> <target>一括ジョブを作æˆ(&C)...</target> + <source>&Export file list...</source> <target>ファイル一覧をエクスãƒãƒ¼ãƒˆ(&E)...</target> + <source>&Advanced</source> <target>æ‹¡å¼µ(&A)</target> + <source>&Check for new version</source> <target>ãƒãƒ¼ã‚¸ãƒ§ãƒ³æ›´æ–°ã®ç¢ºèª(&C)</target> + <source>Compare</source> <target>比較</target> + <source>Compare both sides</source> <target>両方を比較</target> + <source>&Abort</source> <target>æƒ…å ±(&A)</target> + <source>Synchronize...</source> <target>åŒæœŸå‡¦ç†...</target> + <source>Start synchronization</source> <target>åŒæœŸã®é–‹å§‹</target> -<source>Swap sides</source> -<target>パãƒãƒ«ã‚’入れ替ãˆ</target> + <source>Add folder pair</source> <target>フォルダã®ãƒšã‚¢ã‚’è¿½åŠ </target> + <source>Remove folder pair</source> <target>フォルダペアを除去</target> + +<source>Swap sides</source> +<target>パãƒãƒ«ã‚’入れ替ãˆ</target> + <source>Save current configuration to file</source> <target>ç¾åœ¨ã®è¨å®šã‚’ファイルã«ä¿å˜</target> + <source>Load configuration from file</source> <target>外部ファイルã‹ã‚‰æ§‹æˆè¨å®šã‚’èªã¿è¾¼ã¿ã¾ã™</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>å‰å›žä½¿ç”¨ã—ãŸæ§‹æˆè¨å®š(DEL ã‚ーã§ãƒªã‚¹ãƒˆã‹ã‚‰é™¤åŽ»ã—ã¾ã™)</target> + <source>Hide excluded items</source> <target>é™¤å¤–ã‚¢ã‚¤ãƒ†ãƒ ã‚’éš ã™</target> + <source>Hide filtered or temporarily excluded files</source> <target>フィルターã€ã¾ãŸã¯ä¸€æ™‚é™¤å¤–ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éš ã™</target> + <source>Number of files and directories that will be created</source> <target>作æˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ•°</target> + <source>Number of files that will be overwritten</source> <target>上書ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«æ•°</target> + <source>Number of files and directories that will be deleted</source> <target>削除ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ•°</target> + <source>Total amount of data that will be transferred</source> <target>転é€ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã®ç·é‡</target> -<source>Left</source> -<target>å·¦å´</target> -<source>Right</source> -<target>å³å´</target> + <source>Batch job</source> <target>一括処ç†</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>åŒæœŸã‚’一括ã§è‡ªå‹•çš„ã«å®Ÿè¡Œã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã—ã¾ã™ã€‚実行ã¯.BAT ファイルをダブルクリックã€ã¾ãŸã¯æ¬¡ã®ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã‚’実行ã—ã¾ã™: FreeFileSync.exe<batchfile>.BAT ファイルã¯ã€OS ã®ã‚¿ã‚¹ã‚¯ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒ©ã§å®Ÿè¡Œã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target></target> + <source>Help</source> <target>ヘルプ</target> + <source>Filter files</source> <target>ファイルフィルター</target> + <source>Error handling</source> <target>ãƒãƒ³ãƒ‰ãƒªãƒ³ã‚°ã®ã‚¨ãƒ©ãƒ¼æ™‚:</target> + +<source>Left</source> +<target>å·¦å´</target> + +<source>Right</source> +<target>å³å´</target> + <source>Overview</source> <target>概è¦</target> + <source>Status feedback</source> <target>状態 フィードãƒãƒƒã‚¯</target> + <source>Run minimized</source> <target></target> + <source>Maximum number of logfiles:</source> <target>ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€å¤§æ•°:</target> + <source>Select logfile directory:</source> <target>ãƒã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¿å˜å…ˆã‚’é¸æŠž:</target> + <source>Batch settings</source> <target></target> + <source>&Save</source> <target>ä¿å˜(&S)</target> + <source>&Load</source> <target>èªã¿è¾¼ã¿(&L)</target> + <source>&Cancel</source> <target>ã‚ャンセル(&C)</target> + <source>Elements found:</source> <target>見ã¤ã‹ã£ãŸè¦ç´ :</target> + <source>Elements remaining:</source> <target>残りã®è¦ç´ :</target> + <source>Speed:</source> <target>速度:</target> + <source>Time remaining:</source> <target>残り時間:</target> + <source>Time elapsed:</source> <target>経éŽæ™‚é–“:</target> + <source>Operation:</source> <target>æ“作:</target> + <source>Select variant:</source> <target>変数をé¸æŠž:</target> + <source><Automatic></source> <target><自動></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>データベースを使用ã—ã¦ã€ä¸¡å´ã‚¢ã‚¤ãƒ†ãƒ ã®å¤‰æ›´ã‚’特定ã—ã¾ã™ã€‚ 削除ã€ç«¶åˆã¯è‡ªå‹•çš„ã«æ¤œå‡ºã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚</target> + <source>Mirror ->></source> <target>ミラー >></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>å·¦å´ã«åˆã‚ã›ã¦ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—. å³å´ã®ãƒ•ã‚©ãƒ«ãƒ€å†…容ãŒåŒæœŸå‡¦ç†å¾Œã«å·¦å´ã¨åŒã˜ã«ãªã‚‹ã‚ˆã†ã«ã—ã¾ã™ã€‚</target> + <source>Update -></source> <target>æ›´æ–° -></target> + <source>Copy new or updated files to right folder.</source> <target>æ–°ã—ã„(æ›´æ–°)ファイルをå³ãƒ•ã‚©ãƒ«ãƒ€ã«ã‚³ãƒ”ー</target> + <source>Custom</source> <target>カスタム</target> + <source>Configure your own synchronization rules.</source> <target>ã‚ãªãŸã®è¨å®šã—ãŸåŒæœŸè¦å‰‡ã‚’使用ã—ã¾ã™ã€‚</target> + <source>Deletion handling</source> <target>削除ã®å–り扱ã„</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>構æˆè¨å®š</target> + <source>Category</source> <target>カテゴリ</target> + <source>Action</source> <target>æ“作</target> + <source>File/folder exists on left side only</source> <target>å·¦å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダ</target> + <source>File/folder exists on right side only</source> <target>å³å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダ</target> + <source>Left file is newer</source> <target>å·¦å´ã®æ–°ã—ã„ファイル</target> + <source>Right file is newer</source> <target>å³å´ã®æ–°ã—ã„ファイル</target> + <source>Files have different content</source> <target>ファイル内容ã¯ç•°ãªã‚Šã¾ã™</target> + <source>Conflict/file cannot be categorized</source> <target>競åˆãŒã‚ã‚‹ãŸã‚分類ã§ãã¾ã›ã‚“</target> + <source>Compare by...</source> <target>比較対象...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> -<target> -ファイルãŒåŒæ§˜ã ã£ãŸå ´åˆ - - ファイルサイズ - - 最終書ãè¾¼ã¿æ™‚é–“ã¨æ—¥ä»˜ -ã§åˆ¤æ–ã™ã‚‹ -</target> -<source>File size and date</source> -<target>ファイルサイズã¨æ—¥ä»˜</target> +<target></target> + +<source>File time and size</source> +<target></target> + <source> Files are found equal if - file content @@ -519,92 +748,85 @@ is the same - ファイル内容 ã§åˆ¤æ–ã™ã‚‹ </target> + <source>File content</source> <target>ファイルã®å†…容</target> + <source>Symbolic Link handling</source> <target>シンボリックリンク・リンクã®å–り扱ã„</target> + <source>Synchronizing...</source> <target>åŒæœŸå‡¦ç†ä¸...</target> + <source>Elements processed:</source> <target>処ç†ã•ã‚ŒãŸè¦ç´ :</target> + <source>&Pause</source> <target>一時åœæ¢(&P)</target> -<source>Compare by "File size and date"</source> -<target>"ファイルサイズã¨æ—¥ä»˜" を比較</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>ã“ã®å¤‰æ•°ã§ã¯ã€ãµãŸã¤ã®åŒåファイルãŒå˜åœ¨ã—ãŸå ´åˆã€ ãã‚Œãžã‚Œã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºã¨æœ€çµ‚更新日付/時間を比較ã—ã¾ã™ã€‚</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>ã“ã®ã‚ªãƒ—ションã§æ¯”較を開始ã—ãŸå ´åˆã¯ã€ä»¥ä¸‹ã®ãƒ„リーã«å¾“ã£ã¦å‡¦ç†ãŒè¡Œã‚ã‚Œã¾ã™:</target> -<source>As a result the files are separated into the following categories:</source> -<target>ファイルã¯ä»¥ä¸‹ã®ã‚«ãƒ†ã‚´ãƒªã«åˆ†é¡žã•ã‚Œã¾ã™:</target> -<source>- equal</source> -<target>- åŒä¸€</target> -<source>- left newer</source> -<target>- å·¦å´ã®æ–¹ãŒæ–°ã—ã„</target> -<source>- right newer</source> -<target>- å³å´ã®æ–¹ãŒæ–°ã—ã„</target> -<source>- exists left only</source> -<target>- å·¦å´ã«ã®ã¿å˜åœ¨</target> -<source>- exists right only</source> -<target>- å³å´ã«ã®ã¿å˜åœ¨</target> -<source>- conflict (same date, different size)</source> -<target>- ä¸ä¸€è‡´ (åŒã˜æ—¥ä»˜, ç•°ãªã‚‹ã‚µã‚¤ã‚º)</target> -<source>Compare by "File content"</source> -<target>"ファイルã®å†…容" を比較</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. - -With this option enabled the decision tree is smaller: -</source> -<target> -ã“ã®ã‚ªãƒ—ションã§ã¯ã€åŒã˜åå‰ã‚’共有ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã§å†…容ãŒåŒã˜å ´åˆã¯ã€åŒä¸€ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚ ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—æ“作よりã€ã‚€ã—ã‚æ•´åˆæ€§ã®ãƒã‚§ãƒƒã‚¯ã‚’è¡Œã†æ™‚ã«å½¹ç«‹ã¤ã‚ªãƒ—ションã§ã™ã€‚ 従ã£ã¦ãƒ•ã‚¡ã‚¤ãƒ«ã®æ—¥æ™‚ã«ã¤ã„ã¦ã¯å…¨ã考慮ã•ã‚Œã¦ã„ã¾ã›ã‚“。 -è¨å®šãŒæœ‰åŠ¹ãªæ™‚ã¯ã€ãƒ„リー表示ãŒå°ã•ããªã‚Šã¾ã™ã€‚ -</target> -<source>- different</source> -<target>- 差異ã‚ã‚Š</target> <source>Source code written in C++ utilizing:</source> <target>ソースコード㯠C++ ã§æ›¸ã‹ã‚Œã¦ã„ã¾ã™</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>FreeFileSync ã®ãƒãƒ¼ã‚«ãƒ©ã‚¤ã‚ºã¸ã®å”力ã«æ„Ÿè¬ã—ã¾ã™:</target> + <source>Feedback and suggestions are welcome at:</source> <target>フィードãƒãƒƒã‚¯ã€æ案ãªã©:</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync at Sourceforge</target> + <source>Homepage</source> <target>ホームページ</target> + <source>If you like FFS</source> <target>FFS ãŒæ°—ã«å…¥ã£ãŸå ´åˆ</target> + <source>Donate with PayPal</source> <target>PayPal ã‹ã‚‰å¯„付ã™ã‚‹</target> + <source>Email</source> <target>E-メール</target> + <source>Report translation error</source> <target>翻訳エラーã®è©³ç´°</target> + <source>Published under the GNU General Public License:</source> <target>Published under the GNU General Public License:</target> + <source>Ignore subsequent errors</source> <target>以é™ã®ã‚¨ãƒ©ãƒ¼ã‚’無視</target> + <source>Hide further error messages during the current process</source> <target>ç¾åœ¨ã®å‡¦ç†ä¸ã¯ä»¥é™ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ãªã„</target> + <source>&Ignore</source> <target>無視(&I)</target> + <source>&Retry</source> <target>å†è©¦è¡Œ(&R)</target> + <source>Do not show this dialog again</source> <target>次回ã‹ã‚‰è¡¨ç¤ºã—ãªã„</target> + <source>&Switch</source> <target>切り替ãˆ(&S)</target> + <source>&Yes</source> <target>ã¯ã„(&Y)</target> + <source>&No</source> <target>ã„ã„ãˆ(&N)</target> + <source>Delete on both sides</source> <target>両方を削除</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>片å´ã®ãƒšã‚¤ãƒ³ã®ã¿é¸æŠžã•ã‚Œã¦ã„ã‚‹å ´åˆã§ã‚‚両方を削除ã™ã‚‹</target> + <source>Use Recycle Bin</source> <target>ゴミ箱を使用</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -613,16 +835,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire ã™ã¹ã¦ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼è¨å®šã«é©åˆã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/ディレクトリã®ã¿ãŒåŒæœŸå¯¾è±¡ã«é¸æŠžã•ã‚Œã¾ã™ã€‚ 注æ„: åå‰ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã¯ã€ãƒ¡ã‚¤ãƒ³åŒæœŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨åŒæ§˜ã®åå‰ã«é©ç”¨ </target> + <source>Hints:</source> <target>ヒント:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. 相対ファイルã€ã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’ ';' ã¾ãŸã¯ 改行ã§åŒºåˆ‡ã£ã¦å…¥åŠ›</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. ワイルドカード㫠' * ' 㨠' ? ' を使用出æ¥ã¾ã™ã€‚</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. コンテã‚ストメニューã‹ã‚‰ç›´æŽ¥ãƒ•ã‚¡ã‚¤ãƒ«ã‚’除外出æ¥ã¾ã™ã€‚</target> + <source>Example</source> <target>例</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -631,30 +859,40 @@ Exclude: \stuff\temp\* å«ã‚ã‚‹: *.doc;*.zip;*.exe 除外: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>"temp" ã®ã‚µãƒ–フォルダを除ã„ã¦ã€ã™ã¹ã¦ã®.docã€.zipã€ãŠã‚ˆã³.exeファイルをåŒæœŸ</target> + <source>Include</source> <target>å«ã‚ã‚‹</target> + <source>Exclude</source> <target>除外</target> -<source>Select time span:</source> -<target>タイムスパンをé¸æŠž</target> -<source>Minimum file size:</source> -<target>最å°ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚º:</target> -<source>Maximum file size:</source> -<target>最大ファイルサイズ:</target> + +<source>Minimum file size</source> +<target></target> + +<source>Maximum file size</source> +<target></target> + <source>&Default</source> <target>デフォルト(&D)</target> + <source>Move column up</source> <target>列を上ã«ç§»å‹•</target> + <source>Move column down</source> <target>列を下ã«ç§»å‹•</target> -<source>Transactional File Copy</source> + +<source>Transactional file copy</source> <target></target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> <target></target> + <source>Copy locked files</source> <target>ãƒãƒƒã‚¯ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’コピー</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -663,8 +901,10 @@ Copy shared or locked files using Volume Shadow Copy Service ボリュームシャドーコピーを使用ã—ã¦å…±æœ‰/ãƒãƒƒã‚¯ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’コピー (管ç†è€…権é™ãŒå¿…è¦) </target> -<source>Copy filesystem permissions</source> -<target>ファイルシステム・パーミッションをコピー</target> + +<source>Copy file access permissions</source> +<target></target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -673,138 +913,205 @@ Transfer file and directory permissions ファイルã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒ‘ãƒ¼ãƒŸãƒƒã‚·ãƒ§ãƒ³è»¢é€ (管ç†è€…権é™ãŒå¿…è¦) </target> + <source>Hidden dialogs:</source> <target>ダイアãƒã‚°ã‚’éš ã™</target> + <source>Reset</source> <target>リセット</target> + <source>Show hidden dialogs</source> <target>éžè¡¨ç¤ºãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’表示</target> + <source>External applications</source> <target>外部アプリケーション</target> + <source>Description</source> <target>説明</target> + <source>Variant</source> <target>変化</target> + <source>Statistics</source> <target>統計</target> + <source>Find what:</source> <target>検索語:</target> + <source>Match case</source> <target>æ–‡å—種を区別</target> + <source>&Find next</source> <target>次を検索(&F)</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>残ã£ã¦ã„るファイルã¯ã€å†ã³åŒæœŸã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ (å†æ¯”較ã¨ã¯åˆ¥ã®å‹•ä½œ)!</target> -<source>Batch file created successfully!</source> -<target>ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«ãŒä½œæˆã•ã‚Œã¾ã—ãŸ!</target> + <source>Main bar</source> <target>メインãƒãƒ¼</target> + <source>Folder pairs</source> <target>フォルダ・ペア</target> + <source>Select view</source> <target>表示é¸æŠž</target> + <source>Set direction:</source> <target>æ–¹å‘ã®è¨å®š:</target> + <source>Exclude temporarily</source> <target>一時フォルダを除外</target> + <source>Include temporarily</source> <target>一時フォルダをå«ã‚ã‚‹</target> + <source>Exclude via filter:</source> <target>フィルターを通ã—ã¦é™¤å¤–</target> + <source><multiple selection></source> <target><複数é¸æŠž></target> + <source>D-Click</source> <target>W-クリック</target> + <source>Delete</source> <target>削除</target> + <source>Customize...</source> <target>カスタマイズ...</target> + +<source>Select time span...</source> +<target></target> + <source>Auto-adjust columns</source> <target>列ã®è‡ªå‹•èª¿æ•´</target> + <source>Include all rows</source> <target>ã™ã¹ã¦ã®è¡Œã‚’å«ã‚ã‚‹</target> + <source>Exclude all rows</source> <target>ã™ã¹ã¦ã®è¡Œã‚’除外</target> + <source>Reset view</source> <target>表示リセット</target> + <source>Show "%x"</source> <target>"%x" を表示</target> + <source><Last session></source> <target><最後ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³></target> + <source>Configuration saved!</source> <target>構æˆè¨å®šã¯ä¿å˜ã•ã‚Œã¾ã—ãŸ!</target> + <source>Save changes to current configuration?</source> <target>ç¾åœ¨ã®æ§‹æˆã®å¤‰æ›´ã‚’ä¿å˜ã—ã¾ã™ã‹?</target> + <source>Configuration loaded!</source> <target>構æˆè¨å®šã‚’èªã¿è¾¼ã¿ä¸!</target> + <source>Folder Comparison and Synchronization</source> <target>フォルダã®æ¯”較ã¨åŒæœŸ</target> + <source>Hide files that exist on left side only</source> <target>å·¦å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º</target> + <source>Show files that exist on left side only</source> <target>å·¦å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> + <source>Hide files that exist on right side only</source> <target>å³å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º</target> + <source>Show files that exist on right side only</source> <target>å³å´ã®ã¿ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> + <source>Hide files that are newer on left</source> <target>å·¦å´ã®æ–°ã—ã„ファイルをéžè¡¨ç¤º</target> + <source>Show files that are newer on left</source> <target>å·¦å´ã®æ–°ã—ã„ファイルを表示</target> + <source>Hide files that are newer on right</source> <target>å³å´ã®æ–°ã—ã„ファイルをéžè¡¨ç¤º</target> + <source>Show files that are newer on right</source> <target>å³å´ã®æ–°ã—ã„ファイルを表示</target> + <source>Hide files that are equal</source> <target>åŒæ§˜ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º</target> + <source>Show files that are equal</source> <target>åŒã˜å†…容ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> + <source>Hide files that are different</source> <target>ç•°ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤º</target> + <source>Show files that are different</source> <target>差異ã®ã‚るファイルを表示</target> + <source>Hide conflicts</source> <target>ä¸ä¸€è‡´ã‚’éš ã™</target> + <source>Show conflicts</source> <target>ä¸ä¸€è‡´ã‚’表示</target> + <source>Hide files that will be created on the left side</source> <target>å·¦å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹</target> + <source>Show files that will be created on the left side</source> <target>å·¦å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> + <source>Hide files that will be created on the right side</source> <target>å³å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹</target> + <source>Show files that will be created on the right side</source> <target>å³å´ã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> + <source>Hide files that will be deleted on the left side</source> <target>å·¦å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹</target> + <source>Show files that will be deleted on the left side</source> <target>å·¦å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> + <source>Hide files that will be deleted on the right side</source> <target>å³å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹</target> + <source>Show files that will be deleted on the right side</source> <target>å³å´ã§å‰Šé™¤ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> + <source>Hide files that will be overwritten on left side</source> <target>å·¦å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹</target> + <source>Show files that will be overwritten on left side</source> <target>å·¦å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> + <source>Hide files that will be overwritten on right side</source> <target>å³å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éžè¡¨ç¤ºã«ã™ã‚‹</target> + <source>Show files that will be overwritten on right side</source> <target>å³å´ã§ä¸Šæ›¸ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> + <source>Hide files that won't be copied</source> <target>コピーã—ãªã‹ã£ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’éš ã™</target> + <source>Show files that won't be copied</source> <target>コピーã•ã‚Œãªã‹ã£ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target> + <source>All directories in sync!</source> <target>ã™ã¹ã¦ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’åŒæœŸ!</target> + <source>Please run a Compare first before synchronizing!</source> <target>åŒæœŸå‡¦ç†ã‚’実行ã™ã‚‹å‰ã«æ¯”較を行ã£ã¦ãã ã•ã„!</target> + <source>Comma separated list</source> <target>カンマ区切り</target> + <source>Legend</source> <target>凡例</target> + <source>File list exported!</source> <target>ファイル一覧ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãŒå®Œäº†!</target> + +<source>Batch file created successfully!</source> +<target>ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«ãŒä½œæˆã•ã‚Œã¾ã—ãŸ!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -812,6 +1119,7 @@ Transfer file and directory permissions <target> <pluralform>%x ã®ã‚ªãƒ–ジェクトãŒå‰Šé™¤ã•ã‚Œã¾ã—ãŸ!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -819,6 +1127,7 @@ Transfer file and directory permissions <target> <pluralform>%x ディレクトリ</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -826,6 +1135,7 @@ Transfer file and directory permissions <target> <pluralform>%x ファイル</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -833,72 +1143,97 @@ Transfer file and directory permissions <target> <pluralform>%x / %y 行を表示</pluralform> </target> + <source>Scanning...</source> <target>スã‚ャンä¸...</target> + <source>Comparing content...</source> <target>内容を比較ä¸...</target> + <source>Paused</source> <target>一時åœæ¢ä¸</target> + <source>Aborted</source> <target>ä¸æ–</target> + <source>Completed</source> <target>完了ã—ã¾ã—ãŸ</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>ユーザã«ã‚ˆã‚‹ä¸æ–: ç¾åœ¨ã®å‡¦ç†ã‚’終了ã—ã¦ã„ã¾ã™.. ãŠå¾…ã¡ãã ã•ã„...</target> + <source>Continue</source> <target>続行</target> + <source>Pause</source> <target>一時åœæ¢</target> + <source>Cannot find %x</source> <target>%x ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“</target> -<source>DECISION TREE</source> -<target>[判定ツリー]</target> -<source>file exists on both sides</source> -<target>両å´ã«å˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«</target> -<source>on one side only</source> -<target>片å´ã®ã¿</target> -<source>same date</source> -<target>日時ãŒåŒä¸€</target> -<source>different date</source> -<target>日時ãŒç•°ãªã‚‹</target> + <source>Inactive</source> <target>éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–</target> -<source>Second</source> -<target>秒</target> -<source>Minute</source> -<target>分</target> -<source>Hour</source> -<target>時間</target> -<source>Day</source> -<target>æ—¥</target> + +<source>Last x hours</source> +<target></target> + +<source>Today</source> +<target></target> + +<source>This week</source> +<target></target> + +<source>This month</source> +<target></target> + +<source>This year</source> +<target></target> + <source>Byte</source> <target>ãƒã‚¤ãƒˆ</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>フィルター:ã™ã¹ã¦ã®ãƒšã‚¢</target> + <source>Filter: Single pair</source> <target>フィルター:å˜ä¸€ãƒšã‚¢</target> + <source>Ignore</source> <target>無視</target> + <source>Direct</source> <target>æ–¹å‘</target> + <source>Follow</source> <target>フォãƒãƒ¼</target> + +<source>Copy NTFS permissions</source> +<target></target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>外部ã®ã‚¢ãƒ—リケーションをコンテã‚ストメニューã«çµ±åˆã€ä»¥ä¸‹ã®ãƒžã‚¯ãƒãŒåˆ©ç”¨ã§ãã¾ã™:</target> + <source>- full file or directory name</source> <target>- 完全ãªãƒ•ã‚¡ã‚¤ãƒ«/フォルダå</target> + <source>- directory part only</source> <target>- ディレクトリ部ã®ã¿</target> + <source>- Other side's counterpart to %name</source> <target>- %name ã®å対å´ã®å¯¾è±¡</target> + <source>- Other side's counterpart to %dir</source> <target>- %dir ã®å対å´ã®å¯¾è±¡</target> + <source>Restore all hidden dialogs?</source> <target>éžè¡¨ç¤ºãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’ã™ã¹ã¦æˆ»ã—ã¾ã™ã‹?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -906,6 +1241,7 @@ Transfer file and directory permissions <target> <pluralform>本当㫠%x ã®ã‚ªãƒ–ジェクトをゴミ箱ã«ç§»å‹•ã—ã¾ã™ã‹?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -913,139 +1249,211 @@ Transfer file and directory permissions <target> <pluralform>本当ã«ä»¥ä¸‹ %x ã®ã‚ªãƒ–ジェクトを削除ã—ã¾ã™ã‹?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>未解決ã®ç«¶åˆã¯ãã®ã¾ã¾æ®‹ã™</target> + <source>Delete permanently</source> <target>完全ã«å‰Šé™¤</target> + <source>Delete or overwrite files permanently</source> <target>ファイルを上書ãã€ã¾ãŸã¯å®Œå…¨ã«å‰Šé™¤</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>ファイルã®å‰Šé™¤ã€ä¸Šæ›¸ã時ã«ã‚´ãƒŸç®±ã‚’使用ã™ã‚‹</target> + <source>Versioning</source> <target>ãƒãƒ¼ã‚¸ãƒ§ãƒ³ä»˜ã‘</target> + <source>Move files into a time-stamped subdirectory</source> <target>ファイルをタイムスタンプåã®ã‚µãƒ–フォルダã«ç§»å‹•</target> -<source>Cannot determine sync-direction:</source> -<target>åŒæœŸæ–¹å‘ãŒæ±ºå®šã•ã‚Œã¦ã„ã¾ã›ã‚“:</target> -<source>Filter settings have changed!</source> -<target>フィルターè¨å®šã¯å¤‰æ›´ã•ã‚Œã¦ã„ã¾ã™!</target> + <source>Both sides have changed since last synchronization!</source> <target>å‰å›žæœ€å¾Œã®åŒæœŸå‡¦ç†ä»¥é™ã€ä¸¡å´ã¨ã‚‚変更ãŒã‚ã‚Šã¾ã™!</target> + +<source>Cannot determine sync-direction:</source> +<target>åŒæœŸæ–¹å‘ãŒæ±ºå®šã•ã‚Œã¦ã„ã¾ã›ã‚“:</target> + <source>No change since last synchronization!</source> <target>å‰å›žã®åŒæœŸä»¥é™ã€å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“!</target> + +<source>Filter settings have changed!</source> +<target>フィルターè¨å®šã¯å¤‰æ›´ã•ã‚Œã¦ã„ã¾ã™!</target> + <source>The file was not processed by last synchronization!</source> <target>ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æœ€å¾Œã®åŒæœŸæ“作時ã«å‡¦ç†ã•ã‚Œã¦ã„ã¾ã›ã‚“!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>ディレクトリを削除ã™ã‚‹ã¨ã€ã‚µãƒ–ディレクトリã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ç«¶åˆãŒèµ·ã“ã‚‹å¯èƒ½å§“ãŒã‚ã‚Šã¾ã™!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>åŒæœŸæ–¹å‘ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆè¨å®š: å¤ã„ファイルã«æ–°ã—ã„ファイルを上書ã</target> + <source>The file does not contain a valid configuration:</source> <target>ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã¯æœ‰åŠ¹ãªæ§‹æˆãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>ディレクトリãŒç©ºã¨è€ƒæ…®ã™ã‚‹å ´åˆã€ã“ã®ã‚¨ãƒ©ãƒ¼ã¯ç„¡è¦–ã§ãã¾ã™ã€‚</target> + <source>Directory does not exist:</source> <target>ディレクトリãŒå˜åœ¨ã—ã¾ã›ã‚“:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>ディレクトリãŒä¾å˜é–¢ä¿‚ã«ã‚ã‚Šã¾ã™! åŒæœŸè¦å‰‡ã®è¨å®šæ™‚ã«ã¯æ³¨æ„ã—ã¦ãã ã•ã„:</target> + <source>Comparing content of files %x</source> <target>ファイル %x ã®å†…容を比較ä¸</target> + <source>Memory allocation failed!</source> <target>メモリ割り当ã¦ã«å¤±æ•—!</target> + <source>File %x has an invalid date!</source> <target>ファイル %x ã®æ—¥ä»˜ã¯ç„¡åŠ¹ãªã‚‚ã®ã§ã™!</target> + <source>Conflict detected:</source> <target>検出ã•ã‚ŒãŸç«¶åˆ:</target> + <source>Files %x have the same date but a different size!</source> <target>ファイル %x ã¯ã€åŒã˜æ™‚é–“ã§ã™ãŒã‚µã‚¤ã‚ºãŒç•°ãªã£ã¦ã„ã¾ã™!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>シンボリックリンク %x ã®æ—¥ä»˜ã¯åŒä¸€ã§ã™ãŒã€ç•°ãªã‚‹å¯¾è±¡ãŒã‚ã‚Šã¾ã™!</target> + <source>Comparing files by content failed.</source> <target>ファイル内容ã®æ¯”較ã«å¤±æ•—ã—ã¾ã—ãŸ</target> + <source>Generating file list...</source> <target>ファイル一覧を作æˆä¸...</target> + <source>Multiple...</source> <target>複数処ç†...</target> + <source>Both sides are equal</source> <target>両å´ã¨ã‚‚ç‰ã—ã</target> + <source>Files/folders differ in attributes only</source> <target>属性ã®ç•°ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダã®ã¿</target> + <source>Copy new file/folder to left</source> <target>æ–°ã—ã„ファイル/フォルダを左å´ã«ã‚³ãƒ”ー</target> + <source>Copy new file/folder to right</source> <target>æ–°ã—ã„ファイル/フォルダをå³å´ã«ã‚³ãƒ”ー</target> + <source>Delete left file/folder</source> <target>å·¦å´ã®ãƒ•ã‚¡ã‚¤ãƒ«/フォルダを削除</target> + <source>Delete right file/folder</source> <target>å³å´ã®ãƒ•ã‚¡ã‚¤ãƒ«/フォルダを削除</target> + <source>Overwrite left file/folder with right one</source> <target>å³å´ã®ã‚‚ã®ã‚’å·¦å´ã®ãƒ•ã‚¡ã‚¤ãƒ«/フォルダã«ä¸Šæ›¸ã</target> + <source>Overwrite right file/folder with left one</source> <target>å·¦å´ã®ã‚‚ã®ã‚’å³å´ã®ãƒ•ã‚¡ã‚¤ãƒ«/フォルダã«ä¸Šæ›¸ã</target> + <source>Do nothing</source> <target>何もã—ãªã„</target> + <source>Copy file attributes only to left</source> <target>ファイル属性ã®ã¿å·¦å´ã«ã‚³ãƒ”ー</target> + <source>Copy file attributes only to right</source> <target>ファイル属性ã®ã¿å³å´ã«ã‚³ãƒ”ー</target> + <source>Deleting file %x</source> <target>ファイル %x を削除ä¸</target> -<source>Deleting Symbolic Link %x</source> -<target>シンボリックリンク %x を削除ä¸</target> + <source>Deleting folder %x</source> <target>フォルダ %x を削除ä¸</target> -<source>Moving %x to Recycle Bin</source> -<target>%x をゴミ箱ã«ç§»å‹•ä¸</target> -<source>Moving file %x to user-defined directory %y</source> -<target>ファイル %x をユーザ定義ディレクトリ %y ã«ç§»å‹•</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>フォルダ %x をユーザ定義ディレクトリ %y ã«ç§»å‹•</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>シンボリックリンク %x をユーザ定義ディレクトリ %y ã«ã‚³ãƒ”ーä¸</target> -<source>Copying new file %x to %y</source> -<target>ファイル %x ã‚’ %y ã«ã‚³ãƒ”ーä¸</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>シンボリックリンク %x ã‚’ %y ã«ã‚³ãƒ”ーä¸</target> -<source>Overwriting file %x in %y</source> -<target>ファイル %x ã‚’ %y ã«ä¸Šæ›¸ãä¸</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>シンボリックリンク %x ã‚’ %y ã«ä¸Šæ›¸ãä¸</target> + +<source>Deleting symbolic link %x</source> +<target></target> + +<source>Moving file %x to recycle bin</source> +<target></target> + +<source>Moving folder %x to recycle bin</source> +<target></target> + +<source>Moving symbolic link %x to recycle bin</source> +<target></target> + +<source>Moving file %x to %y</source> +<target></target> + +<source>Moving folder %x to %y</source> +<target></target> + +<source>Moving symbolic link %x to %y</source> +<target></target> + +<source>Creating file %x</source> +<target></target> + +<source>Creating symbolic link %x</source> +<target></target> + <source>Creating folder %x</source> <target>フォルダ %x を作æˆä¸</target> + +<source>Overwriting file %x</source> +<target></target> + +<source>Overwriting symbolic link %x</source> +<target></target> + <source>Verifying file %x</source> <target>ファイル %x ã®æ¤œè¨¼ä¸</target> + <source>Updating attributes of %x</source> <target>%x ã®å±žæ€§ã‚’æ›´æ–°</target> -<source>Source directory does not exist anymore:</source> -<target>ソースディレクトリãŒå˜åœ¨ã—ã¾ã›ã‚“:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>構æˆè¨å®šã«å¯¾å¿œã™ã‚‹åŒæœŸãŒã¿ã¤ã‹ã‚Šã¾ã›ã‚“!</target> + <source>Target directory name must not be empty!</source> <target>対象ディレクトリåãŒç©ºç™½ã§ã™!</target> + <source>User-defined directory for deletion was not specified!</source> <target>ユーザ定義ディレクトリãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“!</target> + +<source>Source directory does not exist anymore:</source> +<target>ソースディレクトリãŒå˜åœ¨ã—ã¾ã›ã‚“:</target> + <source>Unresolved conflicts existing!</source> <target>未解決ã®ä¸ä¸€è‡´ãŒã‚ã‚Šã¾ã™!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>ã“ã®ä¸ä¸€è‡´ã‚’無視ã—ã¦åŒæœŸã‚’続行ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚</target> + <source>Significant difference detected:</source> <target>é‡å¤§ãªå·®ç•°ãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸ:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>ファイルåˆè¨ˆç·æ•°ã® 50% 以上ãŒå‰Šé™¤ã€ã¾ãŸã¯ã‚³ãƒ”ーã•ã‚Œã¾ã™</target> + <source>Not enough free disk space available in:</source> <target>利用å¯èƒ½ãªãƒ‡ã‚£ã‚¹ã‚¯ç©ºã容é‡ãŒè¶³ã‚Šã¾ã›ã‚“:</target> + <source>Free disk space required:</source> <target>å¿…è¦ãªãƒ‡ã‚£ã‚¹ã‚¯ç©ºã容é‡:</target> + <source>Free disk space available:</source> <target>利用å¯èƒ½ãªãƒ‡ã‚£ã‚¹ã‚¯ç©ºã容é‡:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> <target></target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>複数ペアã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªè¨å®šéƒ¨åˆ†ã«å¤‰æ›´ã•ã‚ŒãŸç®‡æ‰€ãŒã‚ã‚Šã¾ã™! åŒæœŸè¨å®šã‚’å†ç¢ºèªã—ã¦ã¿ã¦ãã ã•ã„!</target> + <source>Processing folder pair:</source> <target>フォルダペアを処ç†ä¸:</target> + <source>Generating database...</source> <target>データベースを作æˆä¸...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>構æˆè¨å®šã«å¯¾å¿œã™ã‚‹åŒæœŸãŒã¿ã¤ã‹ã‚Šã¾ã›ã‚“!</target> + <source>Error copying locked file %x!</source> <target>コピーã«å¤±æ•—! ファイル%x ã¯ãƒãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™!</target> + <source>Data verification error: Source and target file have different content!</source> <target>データ検証エラー: ソースã¨å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ã«ç•°ãªã‚‹å†…容ãŒå«ã¾ã‚Œã¦ã„ã¾ã™!</target> + diff --git a/BUILD/Languages/korean.lng b/BUILD/Languages/korean.lng index 3aa02086..1d433404 100644 --- a/BUILD/Languages/korean.lng +++ b/BUILD/Languages/korean.lng @@ -8,75 +8,116 @@ </header> <source>Searching for directory %x...</source> -<target></target> +<target>ë””ë ‰í† ë¦¬ %x 검색 중...</target> + <source>Show in Explorer</source> <target>íƒìƒ‰ê¸°ì— 표시</target> + <source>Open with default application</source> <target>기본값 ì• í”Œë¦¬ì¼€ì´ì…˜ìœ¼ë¡œ 열기</target> + <source>Browse directory</source> <target>ë””ë ‰í† ë¦¬ 찾아보기</target> + <source>RealtimeSync - Automated Synchronization</source> <target>실시간 ë™ê¸°í™” - ìžë™ ë™ê¸°í™”</target> + <source>Browse</source> <target>찾아보기</target> -<source>Invalid commandline: %x</source> -<target></target> + +<source>Invalid command line: %x</source> +<target>ìž˜ëª»ëœ ëª…ë ¹ì¤„ : %x</target> + <source>Error resolving symbolic link:</source> <target>ì‹¬ë³¼ë¦ ë§í¬ë¥¼ í•´ê²°í•˜ë˜ ì¤‘ ë°œìƒí•œ 오류 :</target> -<source>Show popup</source> -<target>íŒì—… 표시</target> -<source>Show popup on errors or warnings</source> -<target>오류/ê²½ê³ ê´€ë ¨ íŒì—… 표시</target> + +<source>Show pop-up</source> +<target>íŒì—… ë³´ì´ê¸°</target> + +<source>Show pop-up on errors or warnings</source> +<target>오류 ë˜ëŠ” ê²½ê³ ì— ëŒ€í•œ íŒì—… ë³´ì´ê¸°</target> + <source>Ignore errors</source> <target>오류 무시</target> + <source>Hide all error and warning messages</source> <target>ëª¨ë“ ì˜¤ë¥˜/ê²½ê³ ë©”ì„¸ì§€ 숨기기</target> + <source>Exit instantly</source> <target>즉시 종료</target> + <source>Abort synchronization immediately</source> <target>ë™ê¸°í™” ìž‘ì—… 즉시 중단</target> + +<source>Select alternate comparison settings</source> +<target>대체 ë¹„êµ ì„¤ì • ì„ íƒ</target> + <source>Select alternate synchronization settings</source> <target>대체 ë™ê¸°í™” ì„¤ì • ì„ íƒ</target> + <source>No filter selected</source> <target>ì„ íƒí•œ í•„í„°ê°€ ì—†ìŒ</target> + <source>Filter is active</source> <target>í•„í„° 활성화</target> -<source>Clear filter settings</source> -<target>í•„í„° ì„¤ì • 지우기</target> + <source>Remove alternate settings</source> <target>ëŒ€ì²´ì„¤ì • ì œê±°</target> + +<source>Clear filter settings</source> +<target>í•„í„° ì„¤ì • 지우기</target> + <source>Create a batch job</source> <target>ì¼ê´„ìž‘ì—… ìƒì„±</target> + <source>Synchronization settings</source> <target>ë™ê¸°í™” ì„¤ì •</target> + <source>Comparison settings</source> <target>ë¹„êµ ì„¤ì •</target> + <source>About</source> <target>ìƒì„¸ì •ë³´</target> + <source>Error</source> <target>오류</target> + <source>Warning</source> <target>ê²½ê³ </target> + <source>Question</source> <target>질문</target> + <source>Confirm</source> <target>확ì¸</target> + <source>Configure filter</source> <target>í•„í„° ì„¤ì •</target> + <source>Customize columns</source> <target>ê°œì¸ ì„¤ì • - ì—´(세로칸) ì¡°ì •</target> + <source>Global settings</source> <target>ì „ì²´ ì„¤ì •</target> + <source>Synchronization Preview</source> <target>ë™ê¸°í™” 미리보기</target> + <source>Find</source> <target>검색</target> + +<source>Select time span</source> +<target>시간간격(타임스팬) ì„ íƒ</target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -84,46 +125,64 @@ <target> <pluralform>%x ë°”ì´íŠ¸</pluralform> </target> + <source><Symlink></source> <target><심ë§í¬></target> + <source><Directory></source> <target><ë””ë ‰í† ë¦¬></target> + <source>Size</source> <target>í¬ê¸°</target> + <source>Date</source> <target>ë‚ ì§œ</target> + <source>Full path</source> <target>ì „ì²´ 경로</target> + <source>Filename</source> <target>íŒŒì¼ ì´ë¦„</target> + <source>Relative path</source> <target>ëŒ€ìƒ ê²½ë¡œ</target> + <source>Directory</source> <target>ë””ë ‰í† ë¦¬</target> + <source>Extension</source> <target>확장ìž</target> + <source>Comparison Result</source> <target>ë¹„êµ ê²°ê³¼</target> + <source>Incompatible synchronization database format:</source> <target>호환ë˜ì§€ 않는 ë™ê¸°í™” ë°ì´í„°ë² ì´ìŠ¤ í˜•ì‹ :</target> + <source>Initial synchronization:</source> <target>초기 ë™ê¸°í™” :</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>FreeFileSync ë°ì´í„°ë² ì´ìŠ¤ íŒŒì¼ ì¤‘ 하나가 ì•„ì§ ì¡´ìž¬í•˜ì§€ 않습니다 :</target> + <source>Error reading from synchronization database:</source> <target>ë™ê¸°í™” ë°ì´í„°ë² ì´ìŠ¤ë¡œë¶€í„° ì½ì–´ 들ì´ë˜ 중 ë°œìƒí•œ 오류 :</target> + <source>Database files do not share a common synchronization session:</source> -<target></target> +<target>ë°ì´í„°ë² ì´ìŠ¤ 파ì¼ì´ 공통 ë™ê¸°í™” ì„¸ì…˜ì„ ê³µìœ í•˜ì§€ 않습니다 :</target> + <source>An exception occurred!</source> <target>예외 ë°œìƒ!</target> -<source>Error deleting file:</source> -<target>íŒŒì¼ ì‚ì œ 중 ë°œìƒí•œ 오류 :</target> + <source>Error reading file attributes:</source> <target>íŒŒì¼ ì†ì„±ì„ ì½ë˜ 중 ë°œìƒí•œ 오류 :</target> + <source>Waiting while directory is locked (%x)...</source> <target>ë””ë ‰í† ë¦¬ ìž ê¸ˆ 대기 중 (%x)...</target> + <source>Error setting directory lock:</source> <target>ë””ë ‰í† ë¦¬ ìž ê¸ˆ ì„¤ì • 중 ë°œìƒí•œ 오류 :</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -131,27 +190,39 @@ <target> <pluralform>%xì´ˆ</pluralform> </target> + <source>Info</source> <target>ì •ë³´</target> + <source>Fatal Error</source> <target>치명ì 오류</target> + <source>Scanning:</source> <target>스캔 :</target> + <source>Encoding extended time information: %x</source> <target>ì¸ì½”딩 확장 시간 ì •ë³´ : %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> -<target></target> +<target> +<pluralform>[%x ìŠ¤ë ˆë“œ]</pluralform> +</target> + <source>Invalid FreeFileSync config file!</source> <target>ìž˜ëª»ëœ FreeFileSync ì„¤ì • 파ì¼!</target> + <source>File does not exist:</source> <target>파ì¼ì´ 존재하지 않습니다 :</target> + <source>Error parsing configuration file:</source> <target>ì„¤ì •íŒŒì¼ ë¶„ì„ ì¤‘ ë°œìƒí•œ 오류 :</target> + <source>/sec</source> <target>/ì´ˆ</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -159,6 +230,7 @@ <target> <pluralform>%x분</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -166,6 +238,7 @@ <target> <pluralform>%x시간</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -173,436 +246,594 @@ <target> <pluralform>%xì¼</pluralform> </target> + <source>S&ave configuration...</source> <target>ì„¤ì • ì €ìž¥</target> + <source>&Load configuration...</source> <target>ì„¤ì • 로드</target> + <source>&Quit</source> <target>종료</target> + <source>&File</source> <target>파ì¼(&F)</target> + <source>&Content</source> <target>ë„ì›€ë§ ë‚´ìš©</target> + <source>&About...</source> <target>ìƒì„¸ ì •ë³´(&A)</target> + <source>&Help</source> <target>ë„움ë§(&H)</target> + <source>Usage:</source> <target>사용 :</target> + <source>1. Select directories to monitor.</source> <target>1. 모니터 대ìƒì´ ë ë””ë ‰í† ë¦¬ë¥¼ ì„ íƒí•˜ì„¸ìš”.</target> + <source>2. Enter a command line.</source> -<target>2. 커맨드ë¼ì¸ì„ ìž…ë ¥í•˜ì„¸ìš”.</target> +<target>2. ëª…ë ¹ì¤„ì„ ìž…ë ¥í•˜ì„¸ìš”.</target> + <source>3. Press 'Start'.</source> <target>3. '시작'ì„ ëˆ„ë¥´ì„¸ìš”.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) - files within these directories or subdirectories are modified </source> <target> -커맨드ë¼ì¸ì€ 다ìŒê³¼ ê°™ì€ ê²½ìš°ì— ë§¤ë²ˆ 실행 ë©ë‹ˆë‹¤: +ëª…ë ¹ì¤„ì€ ë‹¤ìŒê³¼ ê°™ì€ ê²½ìš°ì— ë§¤ë²ˆ 실행 ë©ë‹ˆë‹¤: - ëª¨ë“ ë””ë ‰í† ë¦¬ê°€ 사용 ê°€ëŠ¥í• ê²½ìš° (예. USB 스틱 삽입시) - 해당 ë””ë ‰í† ë¦¬ ë˜ëŠ” ì„œë¸Œë””ë ‰í† ë¦¬ ë‚´ì˜ íŒŒì¼ì´ 변경ë 경우 </target> + <source>Directories to watch</source> <target>ê°ì‹œ ëŒ€ìƒ ë””ë ‰í† ë¦¬</target> + <source>Add folder</source> <target>í´ë” 추가</target> + <source>Remove folder</source> <target>í´ë” ì œê±°</target> + <source>Select a folder</source> <target>í´ë” ì„ íƒ</target> + <source>Command line</source> -<target>커맨드ë¼ì¸</target> +<target>ëª…ë ¹ì¤„(커맨드ë¼ì¸)</target> + <source>Minimum Idle Time [seconds]</source> <target>최소 대기시간 [ì´ˆ 단위]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> -<target>마지막 변경내용 ê°ì§€ë¡œë¶€í„° ë‹¤ìŒ ì»¤ë§¨ë“œë¼ì¸ 실행까지 대기시간 [ì´ˆ 단위]</target> +<target>마지막 변경내용 ê°ì§€ë¡œë¶€í„° ë‹¤ìŒ ëª…ë ¹ì¤„ 실행까지 대기시간 [ì´ˆ 단위]</target> + <source>Start</source> <target>시작</target> + <source>(Build: %x)</source> <target>(빌드: %x)</target> + <source>RealtimeSync configuration</source> <target>실시간 ë™ê¸°í™” ì„¤ì •</target> + <source>File already exists. Overwrite?</source> <target>파ì¼ì´ ì´ë¯¸ 존재합니다. ë®ì–´ ì“°ì‹œê² ìŠµë‹ˆê¹Œ?</target> + <source>&Restore</source> <target>ë³µì›(&R)</target> + <source>&Exit</source> <target>나가기(&E)</target> + <source>Monitoring active...</source> <target>ëª¨ë‹ˆí„°ë§ í™œì„±í™”...</target> + <source>Waiting for missing directories...</source> <target>ëˆ„ë½ ë””ë ‰í† ë¦¬ 대기 중...</target> + <source>A directory input field is empty.</source> <target>ë””ë ‰í† ë¦¬ ìž…ë ¥ 필드가 비어 있습니다.</target> + <source>Drag && drop</source> <target>드래그 && ë“œëž</target> + <source>Could not initialize directory monitoring:</source> <target>ë””ë ‰í† ë¦¬ 모니터ë§ì„ 초기화 í• ìˆ˜ 없습니다 :</target> + <source>Error when monitoring directories.</source> <target>ë””ë ‰í† ë¦¬ ëª¨ë‹ˆí„°ë§ ì¤‘ ë°œìƒí•œ 오류 :</target> + <source>Conversion error:</source> <target>변환 오류 :</target> + +<source>Error deleting file:</source> +<target>íŒŒì¼ ì‚ì œ 중 ë°œìƒí•œ 오류 :</target> + <source>Error moving file:</source> <target>íŒŒì¼ ì´ë™ 중 ë°œìƒí•œ 오류 :</target> + <source>Target file already existing!</source> <target>ëŒ€ìƒ íŒŒì¼ì´ ì´ë¯¸ 존재합니다!</target> + <source>Error moving directory:</source> <target>ë””ë ‰í† ë¦¬ ì´ë™ 중 ë°œìƒí•œ 오류 :</target> + <source>Target directory already existing!</source> <target>ëŒ€ìƒ ë””ë ‰í† ë¦¬ê°€ ì´ë¯¸ 존재합니다!</target> + <source>Error deleting directory:</source> <target>ë””ë ‰í† ë¦¬ ì‚ì œ 중 ë°œìƒí•œ 오류 :</target> + <source>Error changing modification time:</source> <target>시간 ìˆ˜ì • 중 ë°œìƒí•œ 오류 :</target> + <source>Error loading library function:</source> <target>ë¼ì´ë¸ŒëŸ¬ë¦¬ 기능 로드 중 ë°œìƒí•œ 오류 :</target> + <source>Error reading security context:</source> <target>보안 컨í…스트를 ì½ë˜ 중 ë°œìƒí•œ 오류 :</target> + <source>Error writing security context:</source> <target>보안 컨í…스트를 ì“°ë˜ ì¤‘ ë°œìƒí•œ 오류 :</target> + <source>Error copying file permissions:</source> <target>íŒŒì¼ ê¶Œí•œ 복사 중 ë°œìƒí•œ 오류 :</target> + <source>Error creating directory:</source> <target>ë””ë ‰í† ë¦¬ ìƒì„± 중 ë°œìƒí•œ 오류 :</target> + <source>Error copying symbolic link:</source> <target>ì‹¬ë³¼ë¦ ë§í¬ 복사 중 ë°œìƒí•œ 오류 :</target> + <source>Error copying file:</source> <target>íŒŒì¼ ë³µì‚¬ 중 ë°œìƒí•œ 오류 :</target> + <source>Error opening file:</source> <target>파ì¼ì„ ì—´ë˜ ì¤‘ ë°œìƒí•œ 오류 :</target> + <source>Error writing file:</source> <target>파ì¼ì„ ì“°ë˜ ì¤‘ ë°œìƒí•œ 오류 :</target> + <source>Error reading file:</source> <target>파ì¼ì„ ì½ë˜ 중 ë°œìƒí•œ 오류 :</target> + <source>Operation aborted!</source> <target>ìž‘ì—… 중단!</target> + +<source>Could not load a required DLL:</source> +<target>필요한 DLLì„ ë¡œë“œí• ìˆ˜ 없습니다 :</target> + <source>Endless loop when traversing directory:</source> <target>ë””ë ‰í† ë¦¬ ì´ë™ 중 무한 루프 ë°œìƒ :</target> + <source>Error traversing directory:</source> <target>ë””ë ‰í† ë¦¬ ì´ë™ 중 ë°œìƒí•œ 오류 :</target> + <source>Windows Error Code %x:</source> <target>윈ë„ìš° ì—러 코드 %x:</target> + <source>Linux Error Code %x:</source> <target>리눅스 ì—러 코드 %x:</target> + <source>Error setting privilege:</source> <target>권한 ì„¤ì • 중 ë°œìƒí•œ 오류 :</target> + <source>Error moving to Recycle Bin:</source> <target>휴지통으로 ì´ë™ 중 ë°œìƒí•œ 오류 :</target> -<source>Could not load a required DLL:</source> -<target>필요한 DLLì„ ë¡œë“œí• ìˆ˜ 없습니다 :</target> + <source>Error writing to synchronization database:</source> <target>ë™ê¸°í™” ë°ì´í„°ë² ì´ìŠ¤ì— ì“°ë˜ ì¤‘ ë°œìƒí•œ 오류 :</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>Volume Shadow Copy Service 시작 중 오류 ë°œìƒ!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target>볼륨 ì„€ë„ ë³µì‚¬ë³¸ ì„œë¹„ìŠ¤ì— ì•¡ì„¸ìŠ¤í•˜ë˜ ì¤‘ 오류 ë°œìƒ!</target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>WOW64 ì—ì„œì˜ Shadow Copy 는 지ì›í•˜ì§€ 않습니다. FreeFileSync 64-bit ë²„ì „ì„ ì‚¬ìš©í•˜ì„¸ìš”.</target> + <source>Could not determine volume name for file:</source> <target>íŒŒì¼ ë³¼ë¥¨ ì´ë¦„ì„ ê²°ì •í• ìˆ˜ 없습니다 :</target> + <source>Volume name %x not part of filename %y!</source> <target>볼륨 ì´ë¦„ %x ì´(ê°€) íŒŒì¼ ì´ë¦„ %y ì˜ ì¼ë¶€ê°€ 아닙니다!</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>ë‹¤ìŒ XML 노드 ê°’ì„ ì½ì–´ ë“¤ì¼ ìˆ˜ 없습니다 :</target> + <source>Logging</source> <target>로그 중</target> + <source>FreeFileSync batch file</source> <target>FreeFileSync ì¼ê´„ 파ì¼</target> + <source>FreeFileSync configuration</source> <target>FreeFileSync 구성 ì„¤ì •</target> + <source>FreeFileSync Batch Job</source> <target>FreeFileSync ì¼ê´„ ìž‘ì—…</target> + <source>Unable to create logfile!</source> <target>ë¡œê·¸íŒŒì¼ ìƒì„±ì„ í• ìˆ˜ 없습니다!</target> + <source>Batch execution</source> <target>ì¼ê´„ 실행</target> + <source>Log-messages:</source> <target>로그 메세지 :</target> + <source>Stop</source> <target>ì •ì§€</target> + <source>Total time:</source> <target>ì „ì²´ 시간 :</target> + <source>Synchronization aborted!</source> <target>ë™ê¸°í™” 중단!</target> + <source>Synchronization completed with errors!</source> <target>ë™ê¸°í™”ê°€ 완료ë˜ê¸´ 했으나, 오류가 있습니다!</target> + <source>Synchronization completed successfully!</source> <target>ë™ê¸°í™”ê°€ 성공ì 으로 완료 ë습니다!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>FreeFileSync GUI 모드는 "ì „í™˜" ì„ ëˆ„ë¥´ë©´ 열립니다.</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>FreeFileSync GUI 모드로 ì „í™˜ 중...</target> + <source>Unable to connect to sourceforge.net!</source> <target>Sourceforge.netì— ì ‘ì†í• 수 없습니다!</target> + <source>A newer version of FreeFileSync is available:</source> <target>새로운 ë²„ì „ì˜ FreeFileSyncê°€ 나왔습니다.</target> + <source>Download now?</source> <target>지금 다운로드 í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</target> + <source>Information</source> <target>ì¸í¬ë©”ì´ì…˜ (ì •ë³´)</target> + <source>FreeFileSync is up to date!</source> <target>FreeFileSync 는 현재 ìµœì‹ ë²„ì „ ìƒíƒœìž…니다!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>FreeFileSyncê°€ 매주 ìžë™ìœ¼ë¡œ ì—…ë°ì´íŠ¸ë¥¼ 확ì¸í•˜ë„ë¡ í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</target> + <source>(Requires an Internet connection!)</source> <target>(ì¸í„°ë„· ì—°ê²°ì´ í•„ìš”í•©ë‹ˆë‹¤!)</target> + <source>1. &Compare</source> <target>1. 비êµ</target> + <source>2. &Synchronize...</source> <target>2. ë™ê¸°í™”</target> + <source>S&witch view</source> <target>보기 ì „í™˜</target> + <source>&New</source> <target>ì‹ ê·œ ìž‘ì—…</target> + <source>&Program</source> <target>프로그램(&P)</target> + <source>&Language</source> <target>언어 ì„ íƒ(&L)</target> + <source>&Global settings...</source> <target>ì „ì²´ ì„¤ì •(&G)</target> + <source>&Create batch job...</source> <target>ì¼ê´„ìž‘ì—… ìƒì„±(&C)</target> + <source>&Export file list...</source> <target>íŒŒì¼ ë¦¬ìŠ¤íŠ¸ 내보내기(&E)</target> + <source>&Advanced</source> <target>ê³ ê¸‰ê¸°ëŠ¥(&A)</target> + <source>&Check for new version</source> <target>ë²„ì „ ì—…ë°ì´íŠ¸ 확ì¸(&C)</target> + <source>Compare</source> <target>비 êµ</target> + <source>Compare both sides</source> <target>양측 비êµ</target> + <source>&Abort</source> <target>ìž‘ì—… 중지(&A)</target> + <source>Synchronize...</source> <target>ë™ ê¸° í™”</target> + <source>Start synchronization</source> <target>ë™ê¸°í™” 시작</target> -<source>Swap sides</source> -<target>양측 위치 바꾸기</target> + <source>Add folder pair</source> <target>í´ë” 페어(ì§) 추가</target> + <source>Remove folder pair</source> <target>í´ë” 페어(ì§) ì œê±°</target> + +<source>Swap sides</source> +<target>양측 위치 바꾸기</target> + <source>Save current configuration to file</source> <target>현재 ì„¤ì •ì„ íŒŒì¼ë¡œ ì €ìž¥</target> + <source>Load configuration from file</source> <target>외부 파ì¼ë¡œë¶€í„° ì„¤ì • 로드</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>마지막으로 사용한 ì„¤ì • (DEL 키를 누르면 리스트ì—ì„œ ì‚ì œ)</target> + <source>Hide excluded items</source> <target>ì œì™¸ ì•„ì´í…œ 숨기기</target> + <source>Hide filtered or temporarily excluded files</source> <target>í•„í„°ë§ ë˜ê±°ë‚˜ ìž„ì‹œ ì œì™¸ë íŒŒì¼ ìˆ¨ê¸°ê¸°</target> + <source>Number of files and directories that will be created</source> <target>ìƒì„±ë íŒŒì¼ ë° ë””ë ‰í† ë¦¬ 개수</target> + <source>Number of files that will be overwritten</source> <target>ë®ì–´ 씌어질 íŒŒì¼ ê°œìˆ˜</target> + <source>Number of files and directories that will be deleted</source> <target>ì‚ì œë íŒŒì¼ ë° ë””ë ‰í† ë¦¬ 개수</target> + <source>Total amount of data that will be transferred</source> <target>ì „ì†¡í•˜ê²Œ ë ì „ì²´ ë°ì´í„° 용량</target> -<source>Left</source> -<target>좌측</target> -<source>Right</source> -<target>우측</target> + <source>Batch job</source> <target>ì¼ê´„ ìž‘ì—…</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>ìžë™ ë™ê¸°í™”를 위한 ì¼ê´„íŒŒì¼ ìƒì„±. ì¼ê´„모드 ìž‘ì—…ì€ í•´ë‹¹ 파ì¼ì„ ë”블í´ë¦ 하거나 커맨드ë¼ì¸: FreeFileSync.exe <ì¼ê´„파ì¼>ì„ í†µí•´ 실행 가능합니다. ë˜í•œ ìš´ì˜ì²´ì œ(O/S)ì˜ ìž‘ì—…ê´€ë¦¬ìžì—ì„œë„ ì˜ˆì•½í• ìˆ˜ 있습니다.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target>ìžë™ ë™ê¸°í™”를 위한 ì¼ê´„ íŒŒì¼ ìƒì„±. ì¼ê´„모드 ì‹œìž‘ì„ ì›í• 경우, 해당 파ì¼ì„ ë”블í´ë¦í•˜ê±°ë‚˜ ëª…ë ¹ì¤„: FreeFileSync.exe <ffs_batch file>ì„ ì‹¤í–‰í•˜ì‹ì‹œì˜¤. ì´ ìž‘ì—…ì€ ìš´ì˜ì²´ì œ 작업관리 기능ì—ì„œë„ ì˜ˆì•½ 가능합니다.</target> + <source>Help</source> <target>ë„움ë§</target> + <source>Filter files</source> <target>íŒŒì¼ í•„í„°</target> + <source>Error handling</source> <target>오류 ë°œìƒì‹œ :</target> + +<source>Left</source> +<target>좌측</target> + +<source>Right</source> +<target>우측</target> + <source>Overview</source> <target>개요</target> + <source>Status feedback</source> <target>ìƒíƒœ 피드백</target> + <source>Run minimized</source> -<target></target> +<target>최소화 실행</target> + <source>Maximum number of logfiles:</source> <target>최대 ë¡œê·¸íŒŒì¼ ê°œìˆ˜ :</target> + <source>Select logfile directory:</source> <target>ë¡œê·¸íŒŒì¼ ë””ë ‰í† ë¦¬ ì„ íƒ :</target> + <source>Batch settings</source> -<target></target> +<target>ì¼ê´„ ì„¤ì •</target> + <source>&Save</source> <target>ì €ìž¥(&S)</target> + <source>&Load</source> <target>로드(&L)</target> + <source>&Cancel</source> <target>취소(&C)</target> + <source>Elements found:</source> <target>ë°œê²¬ëœ ìš”ì†Œ :</target> + <source>Elements remaining:</source> <target>ë‚¨ì€ ìš”ì†Œ :</target> + <source>Speed:</source> <target>ì†ë„ :</target> + <source>Time remaining:</source> <target>ë‚¨ì€ ì‹œê°„ :</target> + <source>Time elapsed:</source> <target>경과 시간 :</target> + <source>Operation:</source> <target>ìž‘ì—… :</target> + <source>Select variant:</source> <target>옵션 ì„ íƒ :</target> + <source><Automatic></source> <target><ìžë™></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 사용하여, 양측 변경사í•ì„ 확ì¸í•©ë‹ˆë‹¤. ì‚ì œ ë° ì¶©ëŒ ë‚´ì—ì€ ìžë™ ê°ì§€ë©ë‹ˆë‹¤.</target> + <source>Mirror ->></source> <target>미러 ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>좌측 í´ë” 백업 미러. ë™ê¸°í™” ì´í›„ 우측 í´ë”는 좌측 í´ë”와 ì™„ì „ížˆ ë˜‘ê°™ì´ ë§¤ì¹˜ ë˜ë„ë¡ ë³€ê²½ ë©ë‹ˆë‹¤.</target> + <source>Update -></source> <target>ì—…ë°ì´íŠ¸ -></target> + <source>Copy new or updated files to right folder.</source> <target>ì‹ ê·œ ë˜ëŠ” ì—…ë°ì´íŠ¸ ëœ íŒŒì¼ì„ 우측 í´ë”ë¡œ 복사</target> + <source>Custom</source> <target>ê°œì¸ ì„¤ì •</target> + <source>Configure your own synchronization rules.</source> <target>ê°œì¸ ë™ê¸°í™” 규칙 ì„¤ì •</target> + <source>Deletion handling</source> <target>ì‚ì œ 처리 옵션</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>구성 ì„¤ì •</target> + <source>Category</source> <target>ì¹´í…Œê³ ë¦¬</target> + <source>Action</source> <target>실행</target> + <source>File/folder exists on left side only</source> <target>파ì¼/í´ë”ê°€ 좌측ì—만 존재</target> + <source>File/folder exists on right side only</source> <target>파ì¼/í´ë”ê°€ 우측ì—만 존재</target> + <source>Left file is newer</source> <target>좌측 파ì¼ì´ ë” ìµœì‹ </target> + <source>Right file is newer</source> <target>우측 파ì¼ì´ ë” ìµœì‹ </target> + <source>Files have different content</source> <target>íŒŒì¼ ë‚´ìš©ì´ ë‹¤ë¦„</target> + <source>Conflict/file cannot be categorized</source> <target>충ëŒ/íŒŒì¼ ë¶„ë¥˜ 불가능</target> + <source>Compare by...</source> <target>ëŒ€ìƒ ë³„ 비êµ...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> <target> -양쪽 파ì¼ì˜ í¬ê¸°ì™€ -최종작성 시간 ë° ë‚ ì§œê°€ ê°™ì„ ê²½ìš°, -ë™ì¼í•œ 파ì¼ë¡œ 간주함. +비êµëœ 양쪽 파ì¼ì€ +마지막 쓰기 시간과 ë‚ ì§œ, +ê·¸ë¦¬ê³ íŒŒì¼ í¬ê¸°ê°€ ê°™ì„ ê²½ìš°, +ë™ì¼í•œ 파ì¼ë¡œ 간주ë©ë‹ˆë‹¤. </target> -<source>File size and date</source> -<target>íŒŒì¼ í¬ê¸° ë° ë‚ ì§œ</target> + +<source>File time and size</source> +<target>íŒŒì¼ ì‹œê°„ ë° í¬ê¸°</target> + <source> Files are found equal if - file content is the same </source> <target> -양쪽 파ì¼ì˜ ë‚´ìš©ì´ ê°™ì„ ê²½ìš°, -ë™ì¼í•œ 파ì¼ë¡œ 간주함. +비êµëœ 양쪽 파ì¼ì€ +íŒŒì¼ ë‚´ìš©ì´ ê°™ì„ ê²½ìš°, +ë™ì¼í•œ 파ì¼ë¡œ 간주ë©ë‹ˆë‹¤. </target> + <source>File content</source> <target>íŒŒì¼ ë‚´ìš©</target> + <source>Symbolic Link handling</source> <target>ì‹¬ë³¼ë¦ ë§í¬ 처리</target> + <source>Synchronizing...</source> <target>ë™ê¸°í™” ìž‘ì—… 중...</target> + <source>Elements processed:</source> <target>ì²˜ë¦¬ëœ ìš”ì†Œ :</target> + <source>&Pause</source> <target>ì¼ì‹œì •ì§€(&P)</target> -<source>Compare by "File size and date"</source> -<target>"íŒŒì¼ í¬ê¸° ë° ë‚ ì§œ" 별 비êµ</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>ì´ ì˜µì…˜ì€ ë™ì¼í•œ ì´ë¦„ì˜ 2ê°œ 파ì¼ì´ ê°™ì€ í¬ê¸° ë° ê°™ì€ ìµœì¢…ìž‘ì„± ë‚ ì§œì™€ ì‹œê°„ì„ ê°–ì„ ê²½ìš°, ì´ë“¤ 2ê°œ 파ì¼ì„ í‰ê°€í•©ë‹ˆë‹¤.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>ì´ ì˜µì…˜ìœ¼ë¡œ 비êµí• 경우, 다ìŒê³¼ ê°™ì€ ì˜ì‚¬ê²°ì • 트리 ì„¤ì •ìœ¼ë¡œ 처리ë©ë‹ˆë‹¤ :</target> -<source>As a result the files are separated into the following categories:</source> -<target>파ì¼ì€ 다ìŒê³¼ ê°™ì€ ì¹´í…Œê³ ë¦¬ë¡œ 분류ë©ë‹ˆë‹¤ :</target> -<source>- equal</source> -<target>- ê°™ìŒ</target> -<source>- left newer</source> -<target>- ì¢Œì¸¡ì´ ë” ìµœì‹ </target> -<source>- right newer</source> -<target>- ìš°ì¸¡ì´ ë” ìµœì‹ </target> -<source>- exists left only</source> -<target>- 좌측ì—만 존재함</target> -<source>- exists right only</source> -<target>- 우측ì—만 존재함</target> -<source>- conflict (same date, different size)</source> -<target>- 충ëŒ/불ì¼ì¹˜ (ë‚ ì§œëŠ” 같으나, í¬ê¸°ê°€ 다름)</target> -<source>Compare by "File content"</source> -<target>"íŒŒì¼ ë‚´ìš©" 별 비êµ</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. -With this option enabled the decision tree is smaller: -</source> -<target> -ì´ ì˜µì…˜ì—서는 2ê°œ 파ì¼ì´ ê°™ì€ ì´ë¦„ì„ ê°–ëŠ” 경우, ë‚´ìš©ë„ ì •í™•ížˆ ë™ì¼í• ì‹œì—만 ê°™ì€ íŒŒì¼ë¡œ 간주합니다. 백업 작업보다는 파ì¼ë“¤ì˜ ì¼ê´€ì„± ì²´í¬ì— ë” ìœ ìš©í•œ 옵션으로ì¨, íŒŒì¼ ë‚ ì§œ ë° ì‹œê°„ì€ ì „í˜€ ê³ ë ¤ë˜ì§€ 않습니다. - -ë˜í•œ í™œì„±í™”ëœ ì˜ì‚¬ê²°ì • íŠ¸ë¦¬ë„ ë‹¤ìŒê³¼ ê°™ì´ ì¢€ ë” ìž‘ì•„ì§‘ë‹ˆë‹¤ : -</target> -<source>- different</source> -<target>- 다름</target> <source>Source code written in C++ utilizing:</source> <target>소스코드는 C++ 언어로 아래 íˆ´ì„ ì‚¬ìš©í•˜ì—¬ 작성ë˜ì—ˆìŠµë‹ˆë‹¤ :</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>FreeFileSync í˜„ì§€í™”ì— ë„ì›€ì„ ì£¼ì‹ ë¶„ë“¤ê»˜ ê°ì‚¬ 드립니다 :</target> + <source>Feedback and suggestions are welcome at:</source> <target>피드백 ë° ì œì•ˆì‚¬í•ì€ 아래로 ë³´ë‚´ 주ì‹ì‹œì˜¤ :</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync at Sourceforge [오픈소스 보기]</target> + <source>Homepage</source> <target>홈페ì´ì§€</target> + <source>If you like FFS</source> <target>기부하기^^</target> + <source>Donate with PayPal</source> <target>PayPalë¡œ 기부하기</target> + <source>Email</source> <target>ì´ë©”ì¼</target> + <source>Report translation error</source> <target>ë²ˆì— ê´€ë ¨ 오류 ë³´ê³ </target> + <source>Published under the GNU General Public License:</source> <target>GNU ì¼ë°˜ 공용 ë¼ì´ì„¼ìŠ¤ì— ì˜í•œ 출시 :</target> + <source>Ignore subsequent errors</source> <target>ì´í›„ ì¼ì–´ë‚˜ëŠ” 오류 무시</target> + <source>Hide further error messages during the current process</source> <target>현재 ì²˜ë¦¬ê³¼ì • ë™ì•ˆ 추가오류 메세지 숨기기</target> + <source>&Ignore</source> <target>무시(&I)</target> + <source>&Retry</source> <target>다시 ì‹œë„(&R)</target> + <source>Do not show this dialog again</source> <target>다ìŒë¶€í„° 표시하지 ì•ŠìŒ</target> + <source>&Switch</source> <target>스위치[ì „í™˜](&S)</target> + <source>&Yes</source> <target>예(&Y)</target> + <source>&No</source> <target>아니오(&N)</target> + <source>Delete on both sides</source> <target>양측 ëª¨ë‘ ì‚ì œ</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>ì–´ëŠ í•œìª½ì˜ íŒŒì¼ë§Œ ì„ íƒí•˜ë”ë¼ë„ 양측 ëª¨ë‘ ì‚ì œ</target> + <source>Use Recycle Bin</source> <target>휴지통 사용</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -611,16 +842,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire ëª¨ë“ í•„í„° ì„¤ì •ê³¼ ì¼ì¹˜í•˜ëŠ” 파ì¼/ë””ë ‰í† ë¦¬ ë§Œì„ ë™ê¸°í™” 대ìƒìœ¼ë¡œ ì„ íƒí•©ë‹ˆë‹¤. ì°¸ê³ : ë©”ì¸ ë™ê¸°í™” ë””ë ‰í† ë¦¬ì™€ 대비하여 í•„í„° ì´ë¦„ì„ ì§€ì •í•´ì•¼ 합니다. </target> + <source>Hints:</source> <target>힌트 :</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. ê´€ë ¨ 파ì¼ì´ë‚˜ ë””ë ‰í† ë¦¬ ì´ë¦„ì„ ';'ë¡œ 구분하거나, ì¤„ì„ ë°”ê¿” ìž…ë ¥í•˜ì„¸ìš”.</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. 와ì¼ë“œì¹´ë“œ ë¬¸ìž '*' ë° '?' ì„ ì‚¬ìš©í•©ë‹ˆë‹¤.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. 컨í…스트 메뉴ì—ì„œ ì§ì ‘ 파ì¼ì„ ì œì™¸í•©ë‹ˆë‹¤.</target> + <source>Example</source> <target>보기/예</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -629,30 +866,40 @@ Exclude: \stuff\temp\* í¬í•¨ : *.doc;*.zip;*.exe ì œì™¸ : \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>서브í´ë” "temp" ì— ìžˆëŠ” 파ì¼ë“¤ì€ ì œì™¸í•˜ê³ , ì´ì™¸ ëª¨ë“ .doc, .zip, .exe í™•ìž¥ìž íŒŒì¼ ë™ê¸°í™”</target> + <source>Include</source> <target>í¬í•¨</target> + <source>Exclude</source> <target>ì œì™¸</target> -<source>Select time span:</source> -<target>기간 ì„ íƒ :</target> -<source>Minimum file size:</source> -<target>최소 파ì¼í¬ê¸° :</target> -<source>Maximum file size:</source> -<target>최대 파ì¼í¬ê¸° :</target> + +<source>Minimum file size</source> +<target>최소 íŒŒì¼ í¬ê¸°</target> + +<source>Maximum file size</source> +<target>최대 íŒŒì¼ í¬ê¸°</target> + <source>&Default</source> <target>기본 ì„¤ì •/ê°’(&D)</target> + <source>Move column up</source> <target>ì—´ 위로 ì´ë™</target> + <source>Move column down</source> <target>ì—´ 아래로 ì´ë™</target> -<source>Transactional File Copy</source> -<target></target> + +<source>Transactional file copy</source> +<target>트랜ìžì…˜ íŒŒì¼ ë³µì‚¬</target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> -<target></target> +<target>ìš°ì„ ìž„ì‹œ (*.ffs_tmp)ì— íŒŒì¼ì„ ìž‘ì„±í•˜ê³ íŒŒì¼ëª…ì„ ë³€ê²½í•˜ì„¸ìš”. ì´ ê°™ì€ ì¡°ì¹˜ëŠ” 치명ì ì¸ ì˜¤ë¥˜ ìƒí™©ì—ì„œë„ ì¼ê´€ì„± 있는 ìƒíƒœë¥¼ 보장합니다.</target> + <source>Copy locked files</source> <target>ë½ ê±¸ë¦° íŒŒì¼ ë³µì‚¬</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -661,8 +908,10 @@ Copy shared or locked files using Volume Shadow Copy Service Volume Shadow Copy를 사용하여 ê³µìœ ë˜ëŠ” ë½ ê±¸ë¦° 파ì¼ì„ 복사 (ê´€ë¦¬ìž ê¶Œí•œ í•„ìš”) </target> -<source>Copy filesystem permissions</source> -<target>íŒŒì¼ ì‹œìŠ¤í…œ 권한 복사</target> + +<source>Copy file access permissions</source> +<target>íŒŒì¼ ì ‘ê·¼ 권한 복사</target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -671,138 +920,205 @@ Transfer file and directory permissions íŒŒì¼ ë° ë””ë ‰í† ë¦¬ 권한 ì „ì†¡ (ê´€ë¦¬ìž ê¶Œí•œì´ í•„ìš”í•¨) </target> + <source>Hidden dialogs:</source> <target>다ì´ì–¼ë¡œê·¸ 숨기기</target> + <source>Reset</source> <target>리셋</target> + <source>Show hidden dialogs</source> <target>숨긴 다ì´ì–¼ë¡œê·¸ 표시</target> + <source>External applications</source> <target>외부 ì• í”Œë¦¬ì¼€ì´ì…˜</target> + <source>Description</source> <target>설명</target> + <source>Variant</source> <target>옵션(변수)</target> + <source>Statistics</source> <target>통계</target> + <source>Find what:</source> <target>검색어 :</target> + <source>Match case</source> <target>대문ìž/ì†Œë¬¸ìž êµ¬ë¶„</target> + <source>&Find next</source> <target>ë‹¤ìŒ ê²€ìƒ‰(&F)</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>잔여 ì•„ì´í…œì— 대한 ë™ê¸°í™”를 (다시 비êµí• 필요없ì´) 재시ë„í• ìˆ˜ 있습니다!</target> -<source>Batch file created successfully!</source> -<target>ì¼ê´„ 파ì¼ì´ 성공ì 으로 ìƒì„± ë습니다!</target> + <source>Main bar</source> <target>ë©”ì¸ ë°”</target> + <source>Folder pairs</source> <target>í´ë” 페어(ì§)</target> + <source>Select view</source> <target>보기 ì„ íƒ</target> + <source>Set direction:</source> <target>ë°©í–¥ ì„¤ì • :</target> + <source>Exclude temporarily</source> <target>ìž„ì‹œ ì œì™¸</target> + <source>Include temporarily</source> <target>ìž„ì‹œ í¬í•¨</target> + <source>Exclude via filter:</source> <target>필터를 통하여 ì œì™¸</target> + <source><multiple selection></source> <target><복수 ì„ íƒ></target> + <source>D-Click</source> <target>D-í´ë¦</target> + <source>Delete</source> <target>ì‚ì œ</target> + <source>Customize...</source> <target>ê°œì¸ ì„¤ì •í™”...</target> + +<source>Select time span...</source> +<target>시간간격(타임스팬) ì„ íƒ...</target> + <source>Auto-adjust columns</source> <target>ì—´ ìžë™ì •ë ¬</target> + <source>Include all rows</source> <target>ëª¨ë“ í–‰ í¬í•¨</target> + <source>Exclude all rows</source> <target>ì „ì²´ í–‰ ì œì™¸</target> + <source>Reset view</source> <target>보기 리셋</target> + <source>Show "%x"</source> <target>"%x" 표시</target> + <source><Last session></source> <target><마지막 세션></target> + <source>Configuration saved!</source> <target>ì„¤ì • ì €ìž¥ 완료!</target> + <source>Save changes to current configuration?</source> <target>현재 ì„¤ì •ì˜ ë³€ê²½ ë‚´ìš©ì„ ì €ìž¥í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</target> + <source>Configuration loaded!</source> <target>ì„¤ì • 로드 완료!</target> + <source>Folder Comparison and Synchronization</source> <target>í´ë” ë¹„êµ ë° ë™ê¸°í™”</target> + <source>Hide files that exist on left side only</source> <target>좌측ì—만 존재하는 íŒŒì¼ ìˆ¨ê¸°ê¸°</target> + <source>Show files that exist on left side only</source> <target>좌측ì—만 존재하는 íŒŒì¼ í‘œì‹œ</target> + <source>Hide files that exist on right side only</source> <target>우측ì—만 존재하는 íŒŒì¼ ìˆ¨ê¸°ê¸°</target> + <source>Show files that exist on right side only</source> <target>우측ì—만 존재하는 íŒŒì¼ í‘œì‹œ</target> + <source>Hide files that are newer on left</source> <target>ì¢Œì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ ìˆ¨ê¸°ê¸°</target> + <source>Show files that are newer on left</source> <target>ì¢Œì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ í‘œì‹œ</target> + <source>Hide files that are newer on right</source> <target>ìš°ì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ ìˆ¨ê¸°ê¸°</target> + <source>Show files that are newer on right</source> <target>ìš°ì¸¡ì´ ë” ì‹ ê·œì¸ íŒŒì¼ í‘œì‹œ</target> + <source>Hide files that are equal</source> <target>ë‚´ìš©ì´ ê°™ì€ íŒŒì¼ ìˆ¨ê¸°ê¸°</target> + <source>Show files that are equal</source> <target>ë‚´ìš©ì´ ê°™ì€ íŒŒì¼ í‘œì‹œ</target> + <source>Hide files that are different</source> <target>ë‚´ìš©ì´ ë‹¤ë¥¸ íŒŒì¼ ìˆ¨ê¸°ê¸°</target> + <source>Show files that are different</source> <target>ë‚´ìš©ì´ ë‹¤ë¥¸ íŒŒì¼ í‘œì‹œ</target> + <source>Hide conflicts</source> <target>ì¶©ëŒ ë‚´ìš© 숨기기</target> + <source>Show conflicts</source> <target>ì¶©ëŒ í‘œì‹œ</target> + <source>Hide files that will be created on the left side</source> <target>ì¢Œì¸¡ì— ìƒì„±ë íŒŒì¼ ìˆ¨ê¸°ê¸°</target> + <source>Show files that will be created on the left side</source> <target>ì¢Œì¸¡ì— ìƒì„±ë íŒŒì¼ í‘œì‹œ</target> + <source>Hide files that will be created on the right side</source> <target>ìš°ì¸¡ì— ìƒì„±ë íŒŒì¼ ìˆ¨ê¸°ê¸°</target> + <source>Show files that will be created on the right side</source> <target>ìš°ì¸¡ì— ìƒì„±ë íŒŒì¼ í‘œì‹œ</target> + <source>Hide files that will be deleted on the left side</source> <target>좌측ì—ì„œ ì‚ì œë íŒŒì¼ ìˆ¨ê¸°ê¸°</target> + <source>Show files that will be deleted on the left side</source> <target>좌측ì—ì„œ ì‚ì œë íŒŒì¼ í‘œì‹œ</target> + <source>Hide files that will be deleted on the right side</source> <target>우측ì—ì„œ ì‚ì œë íŒŒì¼ ìˆ¨ê¸°ê¸°</target> + <source>Show files that will be deleted on the right side</source> <target>우측ì—ì„œ ì‚ì œë íŒŒì¼ í‘œì‹œ</target> + <source>Hide files that will be overwritten on left side</source> <target>ì¢Œì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ ìˆ¨ê¸°ê¸°</target> + <source>Show files that will be overwritten on left side</source> <target>ì¢Œì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ í‘œì‹œ</target> + <source>Hide files that will be overwritten on right side</source> <target>ìš°ì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ ìˆ¨ê¸°ê¸°</target> + <source>Show files that will be overwritten on right side</source> <target>ìš°ì¸¡ì— ë®ì–´ì“°ì—¬ì§ˆ íŒŒì¼ í‘œì‹œ</target> + <source>Hide files that won't be copied</source> <target>복사ë˜ì§€ ì•Šì„ íŒŒì¼ ìˆ¨ê¸°ê¸°</target> + <source>Show files that won't be copied</source> <target>복사ë˜ì§€ ì•Šì„ íŒŒì¼ í‘œì‹œ</target> + <source>All directories in sync!</source> <target>ëª¨ë“ ë””ë ‰í† ë¦¬ ë™ê¸°í™”!</target> + <source>Please run a Compare first before synchronizing!</source> <target>ë™ê¸°í™” ìž‘ì—… ì´ì „ì— ë¹„êµë¥¼ ë¨¼ì € 실행해 주ì‹ì‹œì˜¤!</target> + <source>Comma separated list</source> <target>콤마 분리 목ë¡</target> + <source>Legend</source> <target>범례</target> + <source>File list exported!</source> <target>íŒŒì¼ ë¦¬ìŠ¤íŠ¸ 내보내기 완료!</target> + +<source>Batch file created successfully!</source> +<target>ì¼ê´„ 파ì¼ì´ 성공ì 으로 ìƒì„± ë습니다!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -810,6 +1126,7 @@ Transfer file and directory permissions <target> <pluralform>%xê°œ 대ìƒì´ 성공ì 으로 ì‚ì œ ë습니다!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -817,6 +1134,7 @@ Transfer file and directory permissions <target> <pluralform>%xê°œ ë””ë ‰í† ë¦¬</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -824,6 +1142,7 @@ Transfer file and directory permissions <target> <pluralform>%xê°œ 파ì¼</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -831,72 +1150,97 @@ Transfer file and directory permissions <target> <pluralform>ë³´ê¸°ì— ë‚˜íƒ€ë‚œ %yê°œ í–‰ì˜ %xê°œ 대ìƒ</pluralform> </target> + <source>Scanning...</source> <target>스캔 중...</target> + <source>Comparing content...</source> <target>ë‚´ìš© ë¹„êµ ì¤‘...</target> + <source>Paused</source> <target>ì¼ì‹œì •ì§€ 중</target> + <source>Aborted</source> <target>중단ë¨</target> + <source>Completed</source> <target>완료</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>사용ìžì— ì˜í•œ ìž‘ì—… 중단 : 현재 ìž‘ì—… 종료 대기 중...</target> + <source>Continue</source> <target>계ì†</target> + <source>Pause</source> <target>ì¼ì‹œì •ì§€</target> + <source>Cannot find %x</source> <target>%x ì„(를) ì°¾ì„ ìˆ˜ 없습니다.</target> -<source>DECISION TREE</source> -<target>[ì˜ì‚¬ê²°ì • 트리]</target> -<source>file exists on both sides</source> -<target>양측 모ë‘ì— íŒŒì¼ì´ 존재</target> -<source>on one side only</source> -<target>한쪽ì—만 존재</target> -<source>same date</source> -<target>ê°™ì€ ë‚ ì§œ</target> -<source>different date</source> -<target>다른 ë‚ ì§œ</target> + <source>Inactive</source> <target>비활성화</target> -<source>Second</source> -<target>ì´ˆ</target> -<source>Minute</source> -<target>분</target> -<source>Hour</source> -<target>시간</target> -<source>Day</source> -<target>ì¼</target> + +<source>Last x hours</source> +<target>최근 x 시간</target> + +<source>Today</source> +<target>오늘</target> + +<source>This week</source> +<target>ì´ë²ˆ 주</target> + +<source>This month</source> +<target>ì´ë²ˆ 달</target> + +<source>This year</source> +<target>올해</target> + <source>Byte</source> <target>ë°”ì´íŠ¸</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>í•„í„° : ëª¨ë“ íŽ˜ì–´(ì§)</target> + <source>Filter: Single pair</source> <target>í•„í„° : ë‹¨ì¼ íŽ˜ì–´(ì§)</target> + <source>Ignore</source> <target>무시</target> + <source>Direct</source> <target>다ì´ë ‰íŠ¸</target> + <source>Follow</source> <target>팔로우</target> + +<source>Copy NTFS permissions</source> +<target>NTFS 권한 복사</target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>외부 ì• í”Œë¦¬ì¼€ì´ì…˜ì„ Context Menuì— í†µí•©. ë‹¤ìŒ ë§¤í¬ë¡œê°€ 사용 가능합니다 :</target> + <source>- full file or directory name</source> <target>- ì „ì²´ íŒŒì¼ ë˜ëŠ” ë””ë ‰í† ë¦¬ ì´ë¦„</target> + <source>- directory part only</source> <target>- ë””ë ‰í† ë¦¬ 부분만</target> + <source>- Other side's counterpart to %name</source> <target>- %name ì˜ ë°˜ëŒ€ì¸¡ 대ìƒ</target> + <source>- Other side's counterpart to %dir</source> <target>- %dir ì˜ ë°˜ëŒ€ì¸¡ 대ìƒ</target> + <source>Restore all hidden dialogs?</source> <target>ëª¨ë“ ìˆ¨ê¸´ 다ì´ì–¼ë¡œê·¸ë¥¼ ë³µì› í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -904,6 +1248,7 @@ Transfer file and directory permissions <target> <pluralform>ë‹¤ìŒ %xê°œ 대ìƒì„ ì •ë§ë¡œ 휴지통으로 ì´ë™í•˜ì‹œê¸¸ ì›í•˜ì‹ë‹ˆê¹Œ?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -911,139 +1256,211 @@ Transfer file and directory permissions <target> <pluralform>ë‹¤ìŒ %xê°œ 대ìƒì„ ì •ë§ë¡œ ì‚ì œí•˜ì‹œê¸¸ ì›í•˜ì‹ë‹ˆê¹Œ?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>í•´ê²°ë˜ì§€ ì•Šì€ ì¶©ëŒë¡œ 놔ë‘기</target> + <source>Delete permanently</source> <target>ì˜êµ¬ ì‚ì œ</target> + <source>Delete or overwrite files permanently</source> <target>íŒŒì¼ ì˜êµ¬ ì‚ì œ ë˜ëŠ” ë®ì–´ì“°ê¸°</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>파ì¼ì„ ì‚ì œí•˜ê±°ë‚˜ ë®ì–´ì“°ê¸° í• ë•Œ, 휴지통 사용</target> + <source>Versioning</source> <target>ë²„ì €ë‹</target> + <source>Move files into a time-stamped subdirectory</source> <target>파ì¼ì„ 타임스탬프 ëœ ì„œë¸Œ í´ë”ë¡œ ì´ë™</target> -<source>Cannot determine sync-direction:</source> -<target>ë™ê¸°í™” ë°©í–¥ì„ ê²°ì •í• ìˆ˜ 없습니다 :</target> -<source>Filter settings have changed!</source> -<target>í•„í„° ì„¤ì •ì´ ë³€ê²½ ë습니다!</target> + <source>Both sides have changed since last synchronization!</source> <target>마지막 ë™ê¸°í™” ìž‘ì—… ì´í›„, 양측 ëª¨ë‘ ë³€ê²½ ë˜ì—ˆìŠµë‹ˆë‹¤!</target> + +<source>Cannot determine sync-direction:</source> +<target>ë™ê¸°í™” ë°©í–¥ì„ ê²°ì •í• ìˆ˜ 없습니다 :</target> + <source>No change since last synchronization!</source> <target>마지막 ë™ê¸°í™” ì´í›„ ë³€ê²½ì‚¬í• ì—†ìŒ!</target> + +<source>Filter settings have changed!</source> +<target>í•„í„° ì„¤ì •ì´ ë³€ê²½ ë습니다!</target> + <source>The file was not processed by last synchronization!</source> <target>ì´ íŒŒì¼ì€ 마지막 ë™ê¸°í™”ì—ì„œ 처리ë˜ì§€ 않았습니다!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>ë””ë ‰í† ë¦¬ë¥¼ ì‚ì œí•˜ë©´ 서브 ë””ë ‰í† ë¦¬ ë° íŒŒì¼ê³¼ 충ëŒí•˜ê²Œ ë©ë‹ˆë‹¤!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>기본값 ë™ê¸°í™” ë°©í–¥ ì„¤ì • : ì´ì „ 파ì¼ë“¤ì€ ì‹ ê·œ 파ì¼ë“¤ë¡œ ë®ì–´ 쓰여집니다.</target> + <source>The file does not contain a valid configuration:</source> <target>ì´ íŒŒì¼ì€ ìœ íš¨í•œ ì„¤ì • ê°’ì„ ê°–ê³ ìžˆì§€ 않습니다 :</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>ë””ë ‰í† ë¦¬ê°€ 비었다는 오류는 무시 가능합니다.</target> + <source>Directory does not exist:</source> <target>ë””ë ‰í† ë¦¬ê°€ 존재하지 않습니다 :</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>ë””ë ‰í† ë¦¬ê°€ ì˜ì¡´ ê´€ê³„ì— ìžˆìŠµë‹ˆë‹¤. ë™ê¸°í™” 규칙 ì„¤ì •ì‹œ 주ì˜í•˜ì‹ì‹œì˜¤.</target> + <source>Comparing content of files %x</source> <target>íŒŒì¼ %x ë‚´ìš© 별 ë¹„êµ ì¤‘</target> + <source>Memory allocation failed!</source> <target>메모리 í• ë‹¹ 실패!</target> + <source>File %x has an invalid date!</source> <target>íŒŒì¼ %x ì˜ ë‚ ì§œê°€ ìœ íš¨í•˜ì§€ 않습니다!</target> + <source>Conflict detected:</source> <target>íƒì§€ëœ 충ëŒ/불ì¼ì¹˜ :</target> + <source>Files %x have the same date but a different size!</source> <target>íŒŒì¼ %x ì˜ ë‚ ì§œëŠ” 같으나, í¬ê¸°ê°€ 다릅니다!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>심ë§í¬ %x ì˜ ë‚ ì§œëŠ” 같으나, 대ìƒì´ 다릅니다!</target> + <source>Comparing files by content failed.</source> <target>ë‚´ìš© 별 íŒŒì¼ ë¹„êµ ì‹¤íŒ¨</target> + <source>Generating file list...</source> <target>íŒŒì¼ ë¦¬ìŠ¤íŠ¸ ìƒì„± 중...</target> + <source>Multiple...</source> <target>다중처리 (멀티플) ìž‘ì—…...</target> + <source>Both sides are equal</source> <target>ì–‘ì¸¡ì´ ê°™ìŒ</target> + <source>Files/folders differ in attributes only</source> <target>파ì¼/í´ë”ê°€ ì†ì„±ë§Œ 다름</target> + <source>Copy new file/folder to left</source> <target>ì‹ ê·œ 파ì¼/í´ë”를 좌측으로 복사</target> + <source>Copy new file/folder to right</source> <target>ì‹ ê·œ 파ì¼/í´ë”를 우측으로 복사</target> + <source>Delete left file/folder</source> <target>ë‚¨ì€ íŒŒì¼/í´ë” ì‚ì œ</target> + <source>Delete right file/folder</source> <target>우측 파ì¼/í´ë” ì‚ì œ</target> + <source>Overwrite left file/folder with right one</source> <target>우측 파ì¼/í´ë”ë¡œ 좌측 파ì¼/í´ë” ë®ì–´ì“°ê¸°</target> + <source>Overwrite right file/folder with left one</source> <target>좌측 파ì¼/í´ë”ë¡œ 우측 파ì¼/í´ë” ë®ì–´ì“°ê¸°</target> + <source>Do nothing</source> <target>아무 ê²ƒë„ í•˜ì§€ ì•ŠìŒ</target> + <source>Copy file attributes only to left</source> <target>íŒŒì¼ ì†ì„±ë§Œ 좌측으로 복사</target> + <source>Copy file attributes only to right</source> <target>íŒŒì¼ ì†ì„±ë§Œ 우측으로 복사</target> + <source>Deleting file %x</source> <target>íŒŒì¼ %x ì‚ì œ 중</target> -<source>Deleting Symbolic Link %x</source> -<target>ì‹¬ë³¼ë¦ ë§í¬ %x ì‚ì œ 중</target> + <source>Deleting folder %x</source> <target>í´ë” %x ì‚ì œ 중</target> -<source>Moving %x to Recycle Bin</source> -<target>%x ì„(를) 휴지통으로 ì´ë™ 중</target> -<source>Moving file %x to user-defined directory %y</source> -<target>íŒŒì¼ %x ì„(를) ì‚¬ìš©ìž ì§€ì • ë””ë ‰í† ë¦¬ %y (으)ë¡œ ì´ë™ 중</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>í´ë” %x ì„(를) ì‚¬ìš©ìž ì§€ì • ë””ë ‰í† ë¦¬ %y (으)ë¡œ ì´ë™ 중</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>ì‹¬ë³¼ë¦ ë§í¬ %x ì„(를) ì‚¬ìš©ìž ì§€ì • ë””ë ‰í† ë¦¬ %y (으)ë¡œ ì´ë™ 중</target> -<source>Copying new file %x to %y</source> -<target>ì‹ ê·œ íŒŒì¼ %x ì„(를) %y (으)ë¡œ 복사 중</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>ì‹ ê·œ ì‹¬ë³¼ë¦ ë§í¬ %x ì„(를) %y (으)ë¡œ 복사 중</target> -<source>Overwriting file %x in %y</source> -<target>íŒŒì¼ %x ì„(를) %y ì— ë®ì–´ì“°ëŠ” 중</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>ì‹¬ë³¼ë¦ ë§í¬ %x ì„(를) %y ì— ë®ì–´ì“°ëŠ” 중</target> + +<source>Deleting symbolic link %x</source> +<target>ì‹¬ë³¼ë¦ ë§í¬ %x ì‚ì œ 중</target> + +<source>Moving file %x to recycle bin</source> +<target>íŒŒì¼ %x를(ì„) 휴지통으로 ì´ë™ 중</target> + +<source>Moving folder %x to recycle bin</source> +<target>í´ë” %x를(ì„) 휴지통으로 ì´ë™ 중</target> + +<source>Moving symbolic link %x to recycle bin</source> +<target>ì‹¬ë³¼ë¦ ë§í¬ %x를(ì„) 휴지통으로 ì´ë™ 중</target> + +<source>Moving file %x to %y</source> +<target>íŒŒì¼ %x를(ì„) %y(으)ë¡œ ì´ë™ 중</target> + +<source>Moving folder %x to %y</source> +<target>í´ë” %x를(ì„) %y(으)ë¡œ ì´ë™ 중</target> + +<source>Moving symbolic link %x to %y</source> +<target>ì‹¬ë³¼ë¦ ë§í¬ %x를(ì„) %y(으)ë¡œ ì´ë™ 중</target> + +<source>Creating file %x</source> +<target>íŒŒì¼ %x ìƒì„± 중</target> + +<source>Creating symbolic link %x</source> +<target>ì‹¬ë³¼ë¦ ë§í¬ %x ìƒì„± 중</target> + <source>Creating folder %x</source> <target>í´ë” %x ìƒì„± 중</target> + +<source>Overwriting file %x</source> +<target>íŒŒì¼ %x ë®ì–´ì“°ëŠ” 중</target> + +<source>Overwriting symbolic link %x</source> +<target>ì‹¬ë³¼ë¦ ë§í¬ %x ë®ì–´ì“°ëŠ” 중</target> + <source>Verifying file %x</source> -<target>íŒŒì¼ %x 확ì¸</target> +<target>íŒŒì¼ %x í™•ì¸ ì¤‘</target> + <source>Updating attributes of %x</source> -<target>%x ì†ì„± ì—…ë°ì´íŠ¸</target> -<source>Source directory does not exist anymore:</source> -<target>소스 ë””ë ‰í† ë¦¬ê°€ ë” ì´ìƒ 존재하지 않습니다 :</target> -<source>Nothing to synchronize according to configuration!</source> -<target>구성 ì„¤ì •ì— ë”°ë¼ ë™ê¸°í™” í• ë‚´ìš©ì´ ì—†ìŠµë‹ˆë‹¤!</target> +<target>%x ì†ì„± ì—…ë°ì´íŠ¸ 중</target> + <source>Target directory name must not be empty!</source> <target>ëŒ€ìƒ ë””ë ‰í† ë¦¬ ì´ë¦„ì´ ë¹„ì–´ì„œëŠ” 안 ë©ë‹ˆë‹¤!</target> + <source>User-defined directory for deletion was not specified!</source> <target>ì‚ì œí•˜ë ¤ëŠ” ì‚¬ìš©ìž ì§€ì • ë””ë ‰í† ë¦¬ê°€ ì •í•´ì§€ì§€ 않았습니다!</target> + +<source>Source directory does not exist anymore:</source> +<target>소스 ë””ë ‰í† ë¦¬ê°€ ë” ì´ìƒ 존재하지 않습니다 :</target> + <source>Unresolved conflicts existing!</source> <target>í•´ê²°ë˜ì§€ ì•Šì€ ì¶©ëŒì´ 있습니다!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>충ëŒì„ ë¬´ì‹œí•˜ê³ ë™ê¸°í™”를 계ì†í• 수 있습니다.</target> + <source>Significant difference detected:</source> <target>ìƒë‹¹í•œ ì°¨ì´ê°€ ê°ì§€ë습니다 :</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>ì´ íŒŒì¼ ê°œìˆ˜ì˜ 50% ì´ìƒì´ 복사ë˜ê±°ë‚˜ ì‚ì œ ë©ë‹ˆë‹¤!</target> + <source>Not enough free disk space available in:</source> <target>사용 가능한 ë””ìŠ¤í¬ ì—¬ìœ ê³µê°„ì´ ë¶€ì¡±í•©ë‹ˆë‹¤ :</target> + <source>Free disk space required:</source> <target>필요한 ë””ìŠ¤í¬ ì—¬ìœ ê³µê°„ :</target> + <source>Free disk space available:</source> <target>사용 가능한 ë””ìŠ¤í¬ ì—¬ìœ ê³µê°„ :</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target></target> +<target>ë‹¤ìŒ ê²½ë¡œë¡œëŠ” íœ´ì§€í†µì„ ì‚¬ìš©í• ìˆ˜ 없습니다! ëŒ€ì‹ íŒŒì¼ì„ ì˜êµ¬ì 으로 ì‚ì œí•©ë‹ˆë‹¤ :</target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>다중í´ë” íŽ˜ì–´ì˜ ì¼ë¶€ì¸ ë””ë ‰í† ë¦¬ê°€ 변경ë©ë‹ˆë‹¤. ë™ê¸°í™” ì„¤ì •ì„ ìž¬ê²€í† í•´ 주세요.</target> + <source>Processing folder pair:</source> <target>í´ë” 페어 처리 중 :</target> + <source>Generating database...</source> <target>ë°ì´í„°ë² ì´ìŠ¤ ìƒì„± 중...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>구성 ì„¤ì •ì— ë”°ë¼ ë™ê¸°í™” í• ë‚´ìš©ì´ ì—†ìŠµë‹ˆë‹¤!</target> + <source>Error copying locked file %x!</source> <target>복사 실패! íŒŒì¼ %x ì— ë½ì´ ê±¸ë ¤ 있습니다.</target> + <source>Data verification error: Source and target file have different content!</source> <target>ë°ì´í„° í™•ì¸ ì˜¤ë¥˜ : 소스 ë° íƒ€ê²Ÿ 파ì¼ì˜ ë‚´ìš©ì´ ë‹¤ë¦…ë‹ˆë‹¤!</target> + diff --git a/BUILD/Languages/polish.lng b/BUILD/Languages/polish.lng index 8fbc5e3c..ca75fd95 100644 --- a/BUILD/Languages/polish.lng +++ b/BUILD/Languages/polish.lng @@ -1,6 +1,6 @@ <header> <language name>Polski</language name> - <translator>Wojtek Pietruszewski</translator> + <translator>Wojciech Pietruszewski</translator> <locale>pl_PL</locale> <flag file>poland.png</flag file> <plural forms>3</plural forms> @@ -8,75 +8,116 @@ </header> <source>Searching for directory %x...</source> -<target></target> +<target>Szukanie katalogu %x...</target> + <source>Show in Explorer</source> -<target>WyÅ›wietl w explorerze</target> +<target>WyÅ›wietl w Exlporerze</target> + <source>Open with default application</source> <target>Otwórz za pomocÄ… domyÅ›lnej aplikacji</target> + <source>Browse directory</source> <target>PrzeglÄ…daj katalog</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Automatyczna Synchronizacja</target> + <source>Browse</source> <target>PrzeglÄ…daj</target> -<source>Invalid commandline: %x</source> + +<source>Invalid command line: %x</source> <target>NieprawidÅ‚owa komenda: %x</target> + <source>Error resolving symbolic link:</source> <target>BÅ‚Ä…d odczytu dowiÄ…zania symbolicznego:</target> -<source>Show popup</source> -<target>Pokaż okno popup</target> -<source>Show popup on errors or warnings</source> -<target>Pokaż okno popup dla bÅ‚Ä™dów i ostrzeżeÅ„</target> + +<source>Show pop-up</source> +<target>Pokazuj okna pop-up</target> + +<source>Show pop-up on errors or warnings</source> +<target>Pokazuj okna pop-up dla bÅ‚Ä™dów i ostrzeżeÅ„</target> + <source>Ignore errors</source> <target>Ignoruj bÅ‚Ä™dy</target> + <source>Hide all error and warning messages</source> <target>Ukryj wszystkie informacje bÅ‚Ä™dach i ostrzeżeniach</target> + <source>Exit instantly</source> -<target>Wyjdź natychmiastowo</target> +<target>Wyjdź natychmiast</target> + <source>Abort synchronization immediately</source> <target>Natychmiast zakoÅ„cz synchronizacjÄ™</target> + +<source>Select alternate comparison settings</source> +<target>OkreÅ›l alternatywne ustawienia porównywania</target> + <source>Select alternate synchronization settings</source> <target>Stwórz alternatywne reguÅ‚y synchronizacji</target> + <source>No filter selected</source> <target>Nie wybrano żadnego filtra</target> + <source>Filter is active</source> <target>Filtr jest aktywny</target> -<source>Clear filter settings</source> -<target>Wyczyść ustawienia filtra</target> + <source>Remove alternate settings</source> <target>UsuÅ„ alternatywne ustawienia</target> + +<source>Clear filter settings</source> +<target>Wyczyść ustawienia filtra</target> + <source>Create a batch job</source> <target>Utwórz plik wsadowy</target> + <source>Synchronization settings</source> <target>Ustawienia synchronizacji</target> + <source>Comparison settings</source> <target>Ustawienia porównywania</target> + <source>About</source> <target>O Programie</target> + <source>Error</source> <target>BÅ‚Ä…d</target> + <source>Warning</source> <target>Ostrzerzenie</target> + <source>Question</source> <target>Pytanie</target> + <source>Confirm</source> <target>Potwierdź</target> + <source>Configure filter</source> <target>Konfiguruj filtr</target> + <source>Customize columns</source> <target>Dostosuj kolumny</target> + <source>Global settings</source> <target>Ustawienia programu</target> + <source>Synchronization Preview</source> <target>PodglÄ…d synchronizacji</target> + <source>Find</source> <target>Znajdź</target> + +<source>Select time span</source> +<target>OkreÅ›l przedziaÅ‚ czasowy</target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -86,46 +127,64 @@ <pluralform>%x Bajty</pluralform> <pluralform>%x Bajtów</pluralform> </target> + <source><Symlink></source> <target><DowiÄ…zanie symboliczne></target> + <source><Directory></source> <target><Katalog></target> + <source>Size</source> <target>Rozmiar</target> + <source>Date</source> <target>Data</target> + <source>Full path</source> <target>PeÅ‚na scieżka</target> + <source>Filename</source> <target>Nazwa pliku</target> + <source>Relative path</source> <target>Relatywna Å›cieżka</target> + <source>Directory</source> <target>Katalog</target> + <source>Extension</source> <target>Rozszerzenie</target> + <source>Comparison Result</source> <target>Rezultat porównywania</target> + <source>Incompatible synchronization database format:</source> <target>Niepoprawny format bazy danych dla synchronizacji:</target> + <source>Initial synchronization:</source> <target>WstÄ™pna synchronizacja:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>Jeden z plików bazy danych FreeFileSync nie istnieje:</target> + <source>Error reading from synchronization database:</source> <target>BÅ‚Ä…d odczytu z bazy danych synchronizacji:</target> + <source>Database files do not share a common synchronization session:</source> -<target></target> +<target>Pliki danych nie współdzielÄ… wspólnej sesji synchronizacji:</target> + <source>An exception occurred!</source> <target>WystÄ…piÅ‚ wyjÄ…tek!</target> -<source>Error deleting file:</source> -<target>BÅ‚Ä…d podczas usuwania pliku:</target> + <source>Error reading file attributes:</source> <target>BÅ‚Ä…d odczytu atrybutów pliku:</target> + <source>Waiting while directory is locked (%x)...</source> <target>Blokada katalogu (%x), oczekiwanie...</target> + <source>Error setting directory lock:</source> <target>BÅ‚Ä…d ustawiania blokady katalogu:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -135,27 +194,41 @@ <pluralform>%x sekundy</pluralform> <pluralform>%x sekund</pluralform> </target> + <source>Info</source> <target>Info</target> + <source>Fatal Error</source> <target>BÅ‚Ä…d krytyczny</target> + <source>Scanning:</source> <target>Skanowanie:</target> + <source>Encoding extended time information: %x</source> <target>Odkodowywanie rozszerzonych informacji o czasie: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> -<target></target> +<target> +<pluralform>[1 WÄ…tek]</pluralform> +<pluralform>[%x WÄ…tki]</pluralform> +<pluralform>[%x WÄ…tków]</pluralform> +</target> + <source>Invalid FreeFileSync config file!</source> <target>NieprawidÅ‚owy plik konfiguracyjny!</target> + <source>File does not exist:</source> <target>Plik nie istnieje:</target> + <source>Error parsing configuration file:</source> <target>BÅ‚Ä…d parsowania pliku konfiguracyjnego:</target> + <source>/sec</source> <target>/sekundÄ™</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -165,6 +238,7 @@ <pluralform>%x minuty</pluralform> <pluralform>%x minut</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -174,6 +248,7 @@ <pluralform>%x godziny</pluralform> <pluralform>%x godzin</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -183,28 +258,40 @@ <pluralform>%x dni</pluralform> <pluralform>%x dni</pluralform> </target> + <source>S&ave configuration...</source> <target>Z&apisz konfiguracjÄ™...</target> + <source>&Load configuration...</source> <target>&Wczytaj konfiguracjÄ™...</target> + <source>&Quit</source> <target>&Zamknij</target> + <source>&File</source> <target>&Plik</target> + <source>&Content</source> <target>&Zawartość</target> + <source>&About...</source> <target>&O Programie...</target> + <source>&Help</source> <target>&Pomoc</target> + <source>Usage:</source> <target>Użycie:</target> + <source>1. Select directories to monitor.</source> <target>1. Wprowadź katalogi do nadzorowania</target> + <source>2. Enter a command line.</source> <target>2. Wprowadź komendÄ™.</target> + <source>3. Press 'Start'.</source> <target>3. WciÅ›nij 'Start'.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -215,310 +302,461 @@ Komenda jest wykonwywana za każdym razem gdy: - wszystkie katalogi bÄ™dÄ… dostÄ™pne (np. wÅ‚ożenie USB) - pliki w obrÄ™bie tych katalogów i podkatalogów ulegnÄ… zmianie </target> + <source>Directories to watch</source> <target>Katalogi do obserwacji</target> + <source>Add folder</source> <target>Dodaj folder</target> + <source>Remove folder</source> <target>UsuÅ„ folder</target> + <source>Select a folder</source> <target>Wybierz folder</target> + <source>Command line</source> <target>Linia komend</target> + <source>Minimum Idle Time [seconds]</source> <target>Minimalny czas bezczynnoÅ›ci [sekundy]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>OdstÄ™p czasu w sekundach pomiÄ™dzy pomiÄ™dzy ostatniÄ… wykrytÄ… zmianÄ…, a wykonaniem komendy</target> + <source>Start</source> <target>Rozpocznij</target> + <source>(Build: %x)</source> -<target>(BudujÄ™: %x)</target> +<target>(Zbudowano: %x)</target> + <source>RealtimeSync configuration</source> <target>RealtimeSync konfiguracja</target> + <source>File already exists. Overwrite?</source> <target>Nadpisać istniejÄ…cy już plik?</target> + <source>&Restore</source> <target>&Przywróć</target> + <source>&Exit</source> <target>&WyjÅ›cie</target> + <source>Monitoring active...</source> <target>Monitorowanie aktywne...</target> + <source>Waiting for missing directories...</source> <target>Oczekiwanie na brakujÄ…ce katalogi...</target> + <source>A directory input field is empty.</source> <target>Pole ze Å›cieżkÄ… katalogu jest puste.</target> + <source>Drag && drop</source> <target>Drag && Drop</target> + <source>Could not initialize directory monitoring:</source> <target>Nie można uruchomić monitora katalogów:</target> + <source>Error when monitoring directories.</source> <target>BÅ‚Ä…d podczas monitorowania katalogów.</target> + <source>Conversion error:</source> <target>BÅ‚Ä…d konwersji:</target> + +<source>Error deleting file:</source> +<target>BÅ‚Ä…d podczas usuwania pliku:</target> + <source>Error moving file:</source> <target>BÅ‚Ä…d podczas przenoszenia pliku:</target> + <source>Target file already existing!</source> <target>Plik docelowy już istnieje!</target> + <source>Error moving directory:</source> <target>BÅ‚Ä…d podczas przenoszenia katalogu:</target> + <source>Target directory already existing!</source> <target>Katalog docelowy już istnieje!</target> + <source>Error deleting directory:</source> <target>BÅ‚Ä…d podczas usuwania katalogu:</target> + <source>Error changing modification time:</source> <target>BÅ‚Ä…d zmiany godziny modyfikacji:</target> + <source>Error loading library function:</source> <target>BÅ‚Ä…d wczytywania funkcji:</target> + <source>Error reading security context:</source> <target>BÅ‚Ä…d odczytu kontekstu bezpieczeÅ„stwa:</target> + <source>Error writing security context:</source> <target>BÅ‚Ä…d zapisu kontekstu bezpieczeÅ„stwa:</target> + <source>Error copying file permissions:</source> <target>BÅ‚Ä…d podczas kopiowania uprawnieÅ„ pliku:</target> + <source>Error creating directory:</source> <target>BÅ‚Ä…d podczas tworzenia katalogu:</target> + <source>Error copying symbolic link:</source> <target>BÅ‚Ä…d podczas kopiowania dowiÄ…zania symbolicznego (symlink)</target> + <source>Error copying file:</source> <target>BÅ‚Ä…d podczas kopiowania pliku:</target> + <source>Error opening file:</source> <target>BÅ‚Ä…d odczytu pliku:</target> + <source>Error writing file:</source> <target>BÅ‚Ä…d zapisu pliku:</target> + <source>Error reading file:</source> <target>BÅ‚Ä…d odczytu pliku:</target> + <source>Operation aborted!</source> <target>Operacja przerwana!</target> + +<source>Could not load a required DLL:</source> +<target>Nie można zaÅ‚adować wymaganej biblioteki DLL:</target> + <source>Endless loop when traversing directory:</source> <target>ZapÄ™tlenie podczas przeglÄ…dania katalogu:</target> + <source>Error traversing directory:</source> <target>BÅ‚Ä…d podczas odczytywania katalogu:</target> + <source>Windows Error Code %x:</source> <target>BÅ‚Ä…d systemu Windows %x:</target> + <source>Linux Error Code %x:</source> <target>BÅ‚Ä…d systemu linux %x:</target> + <source>Error setting privilege:</source> <target>BÅ‚Ä…d ustawiania uprawnieÅ„:</target> + <source>Error moving to Recycle Bin:</source> <target>BÅ‚Ä…d podczas przenoszenia do kosza:</target> -<source>Could not load a required DLL:</source> -<target>Nie można zaÅ‚adować wymaganej biblioteki DLL:</target> + <source>Error writing to synchronization database:</source> <target>BÅ‚Ä…d zapisu do bazy danych synchronizacji:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>BÅ‚Ä…d podczas uruchamianiu usÅ‚ugi Shadow Copy!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target>BÅ‚Ä…d podczas dostÄ™pdu do usÅ‚ugi Volume Shadow Copy!</target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>Tworzenie Shadow Copies dla WOW64 nie jest obsÅ‚ugiwane. Zainstaluj 64 bitowÄ… wersjÄ™ FreeFileSync.</target> + <source>Could not determine volume name for file:</source> <target>Nie można okreÅ›lić nazwy dysku dla pliku:</target> + <source>Volume name %x not part of filename %y!</source> <target>Dysk %x nie jest częściÄ… pliku %y!</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>Nie można odczytać wartoÅ›ci dla danych gaÅ‚Ä™zi XML:</target> + <source>Logging</source> <target>Tworzenie logów</target> + <source>FreeFileSync batch file</source> <target>FreeFileSync plik wsadowy</target> + <source>FreeFileSync configuration</source> <target>Konfiguracja FreeFileSync</target> + <source>FreeFileSync Batch Job</source> <target>FreeFileSync plik wsadowy</target> + <source>Unable to create logfile!</source> <target>Nie można utworzyć pliku z logami!</target> + <source>Batch execution</source> <target>Uruchomienie pliku wsadowego</target> + <source>Log-messages:</source> <target>Logi:</target> + <source>Stop</source> <target>Zatrzymaj</target> + <source>Total time:</source> <target>CaÅ‚kowity czas:</target> + <source>Synchronization aborted!</source> <target>Synchronizacja przerwana!</target> + <source>Synchronization completed with errors!</source> <target>Synchronizacja zakoÅ„czona z bÅ‚Ä™dami.</target> + <source>Synchronization completed successfully!</source> <target>Synchronizacja zakoÅ„czona pomyÅ›lnie!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>NaciÅ›nij "PrzeÅ‚Ä…cz" aby otworzyć moduÅ‚ GUI.</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>PrzeÅ‚Ä…czanie do trybu GUI FreeFileSync</target> + <source>Unable to connect to sourceforge.net!</source> <target>Nie można siÄ™ poÅ‚Ä…czyć z sourceforge.net!</target> + <source>A newer version of FreeFileSync is available:</source> <target>DostÄ™pna jest nowa wersja FreeFileSync:</target> + <source>Download now?</source> <target>Pobrać teraz?</target> + <source>Information</source> <target>Informacja</target> + <source>FreeFileSync is up to date!</source> <target>FreeFileSync jest już uaktualniony!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>Czy chcesz aby FreeFileSync sprawdzaÅ‚ uaktualnienia co tydzieÅ„?</target> + <source>(Requires an Internet connection!)</source> <target>(Wymaga poÅ‚Ä…czenia z Internetem!)</target> + <source>1. &Compare</source> <target>1. &Porównaj</target> + <source>2. &Synchronize...</source> <target>2. &Synchronizuj...</target> + <source>S&witch view</source> <target>P&rzeÅ‚Ä…cz widok</target> + <source>&New</source> <target>&Nowy</target> + <source>&Program</source> <target>&Program</target> + <source>&Language</source> <target>&JÄ™zyk</target> + <source>&Global settings...</source> <target>&Ustawienia programu...</target> + <source>&Create batch job...</source> <target>&Twórz plik wsadowy...</target> + <source>&Export file list...</source> <target>&Eksportuj listÄ™ plików...</target> + <source>&Advanced</source> <target>&Zaawansowane</target> + <source>&Check for new version</source> <target>&Aktualizuj</target> + <source>Compare</source> <target>Porównaj</target> + <source>Compare both sides</source> <target>Porównaj foldery</target> + <source>&Abort</source> <target>&Przerwij</target> + <source>Synchronize...</source> <target>Synchronizuj...</target> + <source>Start synchronization</source> <target>Rozpocznij synchronizacjÄ™</target> -<source>Swap sides</source> -<target>ZamieÅ„ stronami</target> + <source>Add folder pair</source> <target>Dodaj foldery do porównania</target> + <source>Remove folder pair</source> <target>UsuÅ„ parÄ™ folderów</target> + +<source>Swap sides</source> +<target>ZamieÅ„ stronami</target> + <source>Save current configuration to file</source> <target>Zapisz aktualny plik konfiguracyjny</target> + <source>Load configuration from file</source> <target>Wczytaj konfiguracjÄ™ z pliku</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>Ostatnio użyta konfiguracja (naciÅ›nij DEL żeby usunąć z listy)</target> + <source>Hide excluded items</source> <target>Ukryj wykluczone pliki</target> + <source>Hide filtered or temporarily excluded files</source> <target>Ukryj pliki filtrowane lub tymczasowo wykluczone</target> + <source>Number of files and directories that will be created</source> <target>Liczba plików i katalogów, które zostanÄ… utworzone</target> + <source>Number of files that will be overwritten</source> <target>Liczba plików, które zostanÄ… nadpisane</target> + <source>Number of files and directories that will be deleted</source> <target>Liczba plików i katalogów, które zostanÄ… usuniÄ™te</target> + <source>Total amount of data that will be transferred</source> <target>Liczba danych do przekopiowania</target> -<source>Left</source> -<target>Lewy</target> -<source>Right</source> -<target>Prawy</target> + <source>Batch job</source> <target>Plik wsadowy</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>Utwórz plik wsadowy dla automatycznej synchronizacji. Aby uruchomić synchronizacjÄ™ w trybie wsadowym po prostu kliknij dwa razy na plik lub uruchom go z konsoli: FreeFileSync.exe <plikwsadowy>. Możesz to dodać do programu planujÄ…cego zadania w Twoim systemie.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target>Utwórz plik wsadowy do automatycznej synchronizacji. Aby uruchomić zadanie w trybie wsadowym, kliknij dwa razy na plik. Możesz je również wywoÅ‚ać z konsoli poleceniem FreeFileSync.exe <ffs_batch file>. Plik wsadowy może być również wywoÅ‚ywany przez planer zadaÅ„ w Twoim systemie.</target> + <source>Help</source> <target>Pomoc</target> + <source>Filter files</source> <target>Filtruj pliki</target> + <source>Error handling</source> <target>ObsÅ‚uga bÅ‚Ä™dów</target> + +<source>Left</source> +<target>Lewy</target> + +<source>Right</source> +<target>Prawy</target> + <source>Overview</source> <target>PrzeglÄ…d</target> + <source>Status feedback</source> <target>Opinia statusu</target> + <source>Run minimized</source> -<target></target> +<target>Uruchom zminimalizowane</target> + <source>Maximum number of logfiles:</source> <target>Maksymalna liczba plików z logami:</target> + <source>Select logfile directory:</source> <target>Wybierz katalog z logami:</target> + <source>Batch settings</source> -<target></target> +<target>Ustawienia trybu wsadowego</target> + <source>&Save</source> <target>&Zapisz</target> + <source>&Load</source> <target>&Wczytaj</target> + <source>&Cancel</source> <target>&Anuluj</target> + <source>Elements found:</source> <target>Znalezione elementy:</target> + <source>Elements remaining:</source> <target>PozostaÅ‚e elementy:</target> + <source>Speed:</source> <target>PrÄ™dkość:</target> + <source>Time remaining:</source> <target>PozostaÅ‚y czas:</target> + <source>Time elapsed:</source> <target>Czas:</target> + <source>Operation:</source> <target>Operacja:</target> + <source>Select variant:</source> <target>Wybierz wariant:</target> + <source><Automatic></source> <target><Automatycznie></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>Wykryj i zastosuj zmiany po obu stronach używajÄ…c bazy danych. UsuniÄ™cia i konflikty sÄ… wykrywane automatycznie.</target> + <source>Mirror ->></source> <target>Lustrzana ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Lustrzana kopia lewego folderu. Prawy folder po synchronizacji jest lustrzanÄ… kopiÄ… lewego folderu.</target> + <source>Update -></source> <target>Uaktualnij -></target> + <source>Copy new or updated files to right folder.</source> <target>Kopiuj nowe lub aktualniejsze pliki na prawÄ… stronÄ™.</target> + <source>Custom</source> <target>WÅ‚asne</target> + <source>Configure your own synchronization rules.</source> <target>Skonfiguruj swoje wÅ‚asne zasady synchronizacji.</target> + <source>Deletion handling</source> <target>ObsÅ‚uga usuwania</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>Konfiguracja</target> + <source>Category</source> <target>Kategoria</target> + <source>Action</source> <target>Akcja</target> + <source>File/folder exists on left side only</source> <target>Plik/folder istnieje tylko po lewej stronie</target> + <source>File/folder exists on right side only</source> <target>Plik/folder istnieje tylko po prawej stronie</target> + <source>Left file is newer</source> <target>Lewy plik jest nowszy</target> + <source>Right file is newer</source> <target>Prawy plik jest nowszy</target> + <source>Files have different content</source> <target>Pliki różniÄ… siÄ™ zawartoÅ›ciÄ…</target> + <source>Conflict/file cannot be categorized</source> <target>Konflikt/plik nie może zostać skategoryzowany</target> + <source>Compare by...</source> <target>Porównaj przez...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> <target> -Pliki sÄ… jednakowe jeżeli - - rozmiar pliku - - czas i data modyfikacji -sÄ… identyczne +Pliki sÄ… równe jeżeli + - ostatni czas zapisu + - rozmiar pliku +sÄ… równe </target> -<source>File size and date</source> -<target>Rozmiar i data pliku</target> + +<source>File time and size</source> +<target>Czas modyfikacji i rozmiar</target> + <source> Files are found equal if - file content @@ -529,92 +767,85 @@ Pliki sÄ… jednakowe jeżeli - zawartość pliku jest identyczna </target> + <source>File content</source> <target>Zawartość pliku</target> + <source>Symbolic Link handling</source> <target>ObsÅ‚uga dowiÄ…zaÅ„ symbolicznych</target> + <source>Synchronizing...</source> <target>SynchronizujÄ™...</target> + <source>Elements processed:</source> <target>Przetworzeone elementy:</target> + <source>&Pause</source> <target>&Pauza</target> -<source>Compare by "File size and date"</source> -<target>Porównaj przez "Rozmiar i data pliku"</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>Ten wariant traktuje dwa pliki jako równe w przypadku gdy majÄ… jednakowy rozmiar oraz tÄ… samÄ… datÄ™ i czas ostatniej modyfikacji.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>Gdy porównywanie z zaznaczonÄ… opcjÄ… jest w toku, podejmowane sÄ… nastÄ™pujÄ…ce dezyje:</target> -<source>As a result the files are separated into the following categories:</source> -<target>W rezultacie pliki zostaÅ‚y podzielone na nastÄ™pujÄ…ce kategorie:</target> -<source>- equal</source> -<target>- równy</target> -<source>- left newer</source> -<target>- lewy jest nowszy</target> -<source>- right newer</source> -<target>- prawy jest nowszy</target> -<source>- exists left only</source> -<target>- istnieje tylko po lewej stronie</target> -<source>- exists right only</source> -<target>- istnieje tylko po prawej stronie</target> -<source>- conflict (same date, different size)</source> -<target>- konflikt (ta sama data, różny rozmiar)</target> -<source>Compare by "File content"</source> -<target>Porównaj przez "Zawartość pliku"</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. - -With this option enabled the decision tree is smaller: -</source> -<target> -Jak wskazuje nazwa, dwa pliki o tej samej nazwie sÄ… równe tylko i wyÅ‚Ä…cznie jeżeli ich zawartość jest jednakowa. Czas modyfikacji nie jest brany pod uwagÄ™. Ta opcja jest raczej użyteczna do sprawdzania spójnoÅ›ci plików niż zadaÅ„ kopii zapasowej. -Drzewko decyzyjne dla tej opcji jest mniejsze: -</target> -<source>- different</source> -<target>- różny</target> <source>Source code written in C++ utilizing:</source> <target>Kod stworzony w C++ z wykorzystaniem:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>PodziÄ™kowania za tÅ‚umaczenie FreeFileSync:</target> + <source>Feedback and suggestions are welcome at:</source> <target>Komentarze i sugestie mile widziane na:</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync na Sourceforge</target> + <source>Homepage</source> <target>Strona domowa</target> + <source>If you like FFS</source> <target>Jeżeli Ci siÄ™ podoba</target> + <source>Donate with PayPal</source> <target>Wesprzyj z PayPal</target> + <source>Email</source> <target>Poczta</target> + <source>Report translation error</source> <target>ZgÅ‚oÅ› bÅ‚Ä…d w tÅ‚umaczeniu</target> + <source>Published under the GNU General Public License:</source> <target>UdostÄ™pnione na zasadach licencji GNU General Public License:</target> + <source>Ignore subsequent errors</source> <target>Ignoruj kolejne bÅ‚Ä™dy</target> + <source>Hide further error messages during the current process</source> <target>Ukryj kolejne informacje o bÅ‚Ä™dach dla tego zadania</target> + <source>&Ignore</source> <target>&Ignoruj</target> + <source>&Retry</source> <target>&Powtórz</target> + <source>Do not show this dialog again</source> <target>Nie pokazuj tego okna ponownie</target> + <source>&Switch</source> <target>&ZamieÅ„</target> + <source>&Yes</source> <target>&Tak</target> + <source>&No</source> <target>&Nie</target> + <source>Delete on both sides</source> <target>UsuÅ„ po obu stronach</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>UsuÅ„ po obu stronach nawet jeżeli plik zaznaczony jest tylko po jednej stronie</target> + <source>Use Recycle Bin</source> <target>Użyj kosza</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -623,16 +854,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire Tylko pliki i katalogi, które speÅ‚niÅ‚y wszystkie kryteria filtrów bÄ™dÄ… poddane synchronizacji. Uwaga: Podana nazwa musi być relatywnÄ… Å›cieżkÄ… wzglÄ™dem synchronizowanych katalogów. </target> + <source>Hints:</source> <target>Wskazówki:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. Wprowdź relatywne scieżki do plików lub katalogów oddzielone ';' lub nowÄ… liniÄ….</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. Użyj wieloznacznika (wildcard) '*' i '?'.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. Wyklucz pliki i foldery używajÄ…c prawego przycisku myszki.</target> + <source>Example</source> <target>PrzykÅ‚ad</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -641,30 +878,40 @@ Exclude: \stuff\temp\* UwzglÄ™dnik: *.doc;*zip*.exe Wyklucz: \moje\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>Synchronizuj wszystkie pliki .doc, .zip i exe z wyjÄ…tkiem folderu "temp"</target> + <source>Include</source> <target>DoÅ‚Ä…cz</target> + <source>Exclude</source> <target>Wyklucz</target> -<source>Select time span:</source> -<target>OkreÅ›l różnicÄ™ czasu:</target> -<source>Minimum file size:</source> -<target>Minimalny rozmiar pliku:</target> -<source>Maximum file size:</source> -<target>Maksymalny rozmiar pliku:</target> + +<source>Minimum file size</source> +<target>Minimalny rozmiar pliku</target> + +<source>Maximum file size</source> +<target>Maksymalny rozmiar pliku</target> + <source>&Default</source> <target>&DomyÅ›lne</target> + <source>Move column up</source> <target>PrzesuÅ„ kolumnÄ™ do góry</target> + <source>Move column down</source> <target>PrzesuÅ„ kolumnÄ™ w dół</target> -<source>Transactional File Copy</source> -<target></target> + +<source>Transactional file copy</source> +<target>Transakcyjne kopiowanie pliku</target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> -<target></target> +<target>Zapisz pliki tymczasowo pod nazwÄ… (*.ffs_tmp), a nastÄ™pnie zmieÅ„ nazwÄ™. Gwarantuje to spójność kopiowania nawat podczas awarii.</target> + <source>Copy locked files</source> <target>Kopiuj zablokowane pliki</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -673,8 +920,10 @@ Copy shared or locked files using Volume Shadow Copy Service Kopiuj pliki udostÄ™pnione i zablokowane używajÄ…c usÅ‚ugi Volume Shadow Copy (Wymaga uprawnieÅ„ administratora) </target> -<source>Copy filesystem permissions</source> + +<source>Copy file access permissions</source> <target>Kopiuj uprawnienia plików</target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -683,138 +932,205 @@ Transfer file and directory permissions Transfer uprawnieÅ„ plików i katalogów (Wymaga uprawnieÅ„ Administratora) </target> + <source>Hidden dialogs:</source> <target>Ukryte dialogi:</target> + <source>Reset</source> <target>Resetuj</target> + <source>Show hidden dialogs</source> <target>Pokaż ukryte dialogi</target> + <source>External applications</source> <target>Aplikacje zewnÄ™trzne</target> + <source>Description</source> <target>Opis</target> + <source>Variant</source> <target>Wariant</target> + <source>Statistics</source> <target>Statystyki</target> + <source>Find what:</source> <target>Co:</target> + <source>Match case</source> <target>UwzglÄ™dnij wielkość liter</target> + <source>&Find next</source> <target>&Znajdź nastÄ™pny</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>Możesz spróbować synchronizować pozostaÅ‚e elementy ponownie (bez koniecznoÅ›ci ponownego porównywania)!</target> -<source>Batch file created successfully!</source> -<target>Plik wsadowy utworzony pomyÅ›lnie!</target> + <source>Main bar</source> <target>Główny pasek</target> + <source>Folder pairs</source> <target>Pary folderów</target> + <source>Select view</source> <target>OkreÅ›l widok</target> + <source>Set direction:</source> <target>Kierunek synchronizacji:</target> + <source>Exclude temporarily</source> <target>Wyklucz tymczasowo</target> + <source>Include temporarily</source> <target>DoÅ‚Ä…cz tymczasowo</target> + <source>Exclude via filter:</source> <target>Dodaj filtr:</target> + <source><multiple selection></source> <target><zaznaczone elementy></target> + <source>D-Click</source> <target>Podw. klikniÄ™cie</target> + <source>Delete</source> <target>UsuÅ„</target> + <source>Customize...</source> <target>Dostosuj...</target> + +<source>Select time span...</source> +<target>OkreÅ›l przedziaÅ‚ czasowy...</target> + <source>Auto-adjust columns</source> <target>Autodopasowanie kolumn</target> + <source>Include all rows</source> <target>DoÅ‚Ä…cz wszystkie rzÄ™dy</target> + <source>Exclude all rows</source> <target>Wyklucz wszystkie rzÄ™dy</target> + <source>Reset view</source> <target>Resetuj widok</target> + <source>Show "%x"</source> <target>Pokaż "%x"</target> + <source><Last session></source> <target><Ostatnia sesja></target> + <source>Configuration saved!</source> <target>Konfiguracja zapisana!</target> + <source>Save changes to current configuration?</source> <target>Zapisać zmiany obecnej konfiguracji?</target> + <source>Configuration loaded!</source> <target>Konfiguracja wczytana!</target> + <source>Folder Comparison and Synchronization</source> <target>Porównywanie i Synchronizacja folderów</target> + <source>Hide files that exist on left side only</source> <target>Ukryj pliki, które istniejÄ… tylko po lewej stronie</target> + <source>Show files that exist on left side only</source> <target>Pokaż pliki istniejÄ…ce tylko po lewej stronie</target> + <source>Hide files that exist on right side only</source> <target>Ukryj pliki, które istniejÄ… tylko po prawej stronie</target> + <source>Show files that exist on right side only</source> <target>Pokaż pliki istniejÄ…ce tylko po prawej stronie</target> + <source>Hide files that are newer on left</source> <target>Ukryj pliki, które sÄ… nowsze po lewej stronie</target> + <source>Show files that are newer on left</source> <target>Pokaż pliki nowsze po lewej stronie</target> + <source>Hide files that are newer on right</source> <target>Ukryj pliki, które sÄ… nowsze po prawej stronie</target> + <source>Show files that are newer on right</source> <target>Pokaż pliki nowsze po prawej stronie</target> + <source>Hide files that are equal</source> <target>Ukryj pliki, które sÄ… równe</target> + <source>Show files that are equal</source> <target>Pokaż pliki, które sÄ… równe</target> + <source>Hide files that are different</source> <target>Ukryj pliki, które sÄ… różne</target> + <source>Show files that are different</source> <target>Pokaż pliki, które siÄ™ różniÄ…</target> + <source>Hide conflicts</source> <target>Ukryj konflikty</target> + <source>Show conflicts</source> <target>Pokaż konflikty</target> + <source>Hide files that will be created on the left side</source> <target>Ukryj pliki, które bÄ™dÄ… utworzone po lewej stronie</target> + <source>Show files that will be created on the left side</source> <target>Pokaż pliki, które bÄ™dÄ… utworzone po lewej stronie</target> + <source>Hide files that will be created on the right side</source> <target>Ukryj pliki, które bÄ™dÄ… utworzone po prawej stronie</target> + <source>Show files that will be created on the right side</source> <target>Pokaż pliki, które bÄ™dÄ… utworzone po prawej stronie</target> + <source>Hide files that will be deleted on the left side</source> <target>Ukryj pliki, które bÄ™dÄ… usuniÄ™te po lewej stronie</target> + <source>Show files that will be deleted on the left side</source> <target>Pokaż pliki, które bÄ™dÄ… usuniÄ™te po lewej stronie</target> + <source>Hide files that will be deleted on the right side</source> <target>Ukryj pliki, które bÄ™dÄ… usuniÄ™te po lewej stronie</target> + <source>Show files that will be deleted on the right side</source> <target>Pokaż pliki, które bÄ™dÄ… usuniÄ™te po prawej stronie</target> + <source>Hide files that will be overwritten on left side</source> <target>Ukryj pliki, które zostanÄ… nadpisane po lewej stronie</target> + <source>Show files that will be overwritten on left side</source> <target>Pokaż pliki, które zostanÄ… nadpisane po lewej stronie</target> + <source>Hide files that will be overwritten on right side</source> <target>Ukryj pliki, które zostanÄ… nadpisane po prawej stronie</target> + <source>Show files that will be overwritten on right side</source> <target>Pokaż pliki, które zostanÄ… nadpisane po prawej stronie</target> + <source>Hide files that won't be copied</source> <target>Ukryj pliki, które nie bÄ™dÄ… kopiowane</target> + <source>Show files that won't be copied</source> <target>Pokaż pliki, które nie bÄ™dÄ… kopiowane</target> + <source>All directories in sync!</source> <target>Wszystkie katalogi zsynchronizowane!</target> + <source>Please run a Compare first before synchronizing!</source> <target>Przed synchronizacjÄ… należy uruchomić Porównaj!</target> + <source>Comma separated list</source> <target>Lista oddzielona przecinkami</target> + <source>Legend</source> <target>Legenda</target> + <source>File list exported!</source> <target>Lista plików wyeksportowana!</target> + +<source>Batch file created successfully!</source> +<target>Plik wsadowy utworzony pomyÅ›lnie!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -824,6 +1140,7 @@ Transfer uprawnieÅ„ plików i katalogów <pluralform>%x obiekty pomyÅ›lnie usuniÄ™te!</pluralform> <pluralform>%x pomyÅ›lnie usuniÄ™tych!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -833,6 +1150,7 @@ Transfer uprawnieÅ„ plików i katalogów <pluralform>%x katalogi</pluralform> <pluralform>%x katalogów</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -842,6 +1160,7 @@ Transfer uprawnieÅ„ plików i katalogów <pluralform>%x pliki</pluralform> <pluralform>%x plików</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -851,72 +1170,97 @@ Transfer uprawnieÅ„ plików i katalogów <pluralform>%x z %y rzÄ™dów w widoku</pluralform> <pluralform>%x z %y rzÄ™dów w widoku</pluralform> </target> + <source>Scanning...</source> <target>Skanowanie...</target> + <source>Comparing content...</source> <target>Porównywanie zawartoÅ›ci...</target> + <source>Paused</source> <target>Pauza</target> + <source>Aborted</source> <target>Przerwana</target> + <source>Completed</source> <target>ZakoÅ„czono</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>Żądanie przerwania: Czekaj na koniec aktualnie wykonywanego zadania...</target> + <source>Continue</source> <target>Kontynuuj</target> + <source>Pause</source> <target>Pauza</target> + <source>Cannot find %x</source> <target>Nie można znaleźć %x</target> -<source>DECISION TREE</source> -<target>DRZEWO DECYZYJNE</target> -<source>file exists on both sides</source> -<target>plik istnieje po obu stronach</target> -<source>on one side only</source> -<target>tylko po jednej stronie</target> -<source>same date</source> -<target>ta sama data</target> -<source>different date</source> -<target>różna data</target> + <source>Inactive</source> <target>Nieaktywny</target> -<source>Second</source> -<target>Sekund</target> -<source>Minute</source> -<target>Minut</target> -<source>Hour</source> -<target>Godzin</target> -<source>Day</source> -<target>Dni</target> + +<source>Last x hours</source> +<target>Ostatnie x godzin</target> + +<source>Today</source> +<target>Dzisiaj</target> + +<source>This week</source> +<target>W tym tygodniu</target> + +<source>This month</source> +<target>W tym miesiÄ…cu</target> + +<source>This year</source> +<target>W tym roku</target> + <source>Byte</source> <target>Bajtów</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>Filtr: Wszystkie pary</target> + <source>Filter: Single pair</source> <target>Filtr: PojedyÅ„cza para</target> + <source>Ignore</source> <target>Ignoruj</target> + <source>Direct</source> <target>BezpoÅ›rednio</target> + <source>Follow</source> <target>PodÄ…rzaj</target> + +<source>Copy NTFS permissions</source> +<target>Kopiuj uprawnienia NTFS</target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>DoÅ‚Ä…cz zewnÄ™trznÄ… aplikacjÄ™ do menu kontekstowego. DostÄ™pne macra:</target> + <source>- full file or directory name</source> <target>- peÅ‚na nazwa pliku lub katalogu</target> + <source>- directory part only</source> <target>- tylko część katalogu</target> + <source>- Other side's counterpart to %name</source> <target>- Odpowiednik %name</target> + <source>- Other side's counterpart to %dir</source> <target>- Odpowiednik %dir</target> + <source>Restore all hidden dialogs?</source> <target>Przywrócić wszystkie ukryte dialogi?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -926,6 +1270,7 @@ Transfer uprawnieÅ„ plików i katalogów <pluralform>Czy na pewno chcesz przenieÅ› %x obiekty do kosza?</pluralform> <pluralform>Czy na pewno chcesz przenieÅ› %x obiektów do kosza?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -935,139 +1280,211 @@ Transfer uprawnieÅ„ plików i katalogów <pluralform>Czy na pewno chcesz usunÄ…c %x obiekty do kosza?</pluralform> <pluralform>Czy na pewno chcesz usunąć %x obiektów do kosza?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>Zostaw jako nierozwiÄ…zany konflikt</target> + <source>Delete permanently</source> <target>UsuÅ„ na staÅ‚e</target> + <source>Delete or overwrite files permanently</source> <target>UsuÅ„ lub nadpisz pliki na staÅ‚e</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>Używaj Kosza podczas usuwania lub nadpisywania plików</target> + <source>Versioning</source> <target>Wersjonowanie</target> + <source>Move files into a time-stamped subdirectory</source> <target>PrzenieÅ› pliki do oznaczonego podkatalogu</target> -<source>Cannot determine sync-direction:</source> -<target>Nie można okreÅ›lić kierunku synchronizacji:</target> -<source>Filter settings have changed!</source> -<target>Ustawienia filtra ulegÅ‚y zmianie!</target> + <source>Both sides have changed since last synchronization!</source> <target>Obie strony ulegÅ‚y zmianie od ostatniej synchronizacji!</target> + +<source>Cannot determine sync-direction:</source> +<target>Nie można okreÅ›lić kierunku synchronizacji:</target> + <source>No change since last synchronization!</source> <target>Brak zmian od ostatniej synchronizacji!</target> + +<source>Filter settings have changed!</source> +<target>Ustawienia filtra ulegÅ‚y zmianie!</target> + <source>The file was not processed by last synchronization!</source> <target>Plik nie zostaÅ‚ przetworzony podczas ostatniej synchronizacji!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>UsuniÄ™cie katalogów jest w konflikcie podkatalogami oraz plikami!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Ustawianie domyÅ›lnego kierunku synchronizacji: Stare pliki zostanÄ… nadpisane nowszymi.</target> + <source>The file does not contain a valid configuration:</source> <target>NieprawidÅ‚owy format pliku:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>Możesz zignorować ten bÅ‚Ä…d uznająć jeden z katalogów jako pusty.</target> + <source>Directory does not exist:</source> <target>Katalog nie istnieje:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Katalogi sÄ… zależne! PamiÄ™taj o tym podczas ustawiania zasad synchronizacji:</target> + <source>Comparing content of files %x</source> <target>Porównywanie zawartoÅ›ci plików %x</target> + <source>Memory allocation failed!</source> <target>BÅ‚Ä…d alokacji zasobów!</target> + <source>File %x has an invalid date!</source> <target>Plik %x ma nieprawidÅ‚owÄ… datÄ™!</target> + <source>Conflict detected:</source> <target>Wykryto konflikt:</target> + <source>Files %x have the same date but a different size!</source> <target>Pliki %x majÄ… tÄ… samÄ… datÄ™ lecz różne rozmiary!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>DowiÄ…zanie symboliczne %x ma te same dane, ale inny cel!</target> + <source>Comparing files by content failed.</source> <target>Porównywanie przez zawartość zakoÅ„czone niepowodzeniem.</target> + <source>Generating file list...</source> <target>Generowanie listy plików...</target> + <source>Multiple...</source> <target>Wiele...</target> + <source>Both sides are equal</source> <target>Obie strony sÄ… równe</target> + <source>Files/folders differ in attributes only</source> <target>Pliki/foldery różniÄ… siÄ™ tylko atrybutami</target> + <source>Copy new file/folder to left</source> <target>Skopiuj nowy plik/katalog na lewÄ… stronÄ…</target> + <source>Copy new file/folder to right</source> <target>Skopiuj nowy plik/katalog na prawÄ… stronÄ…</target> + <source>Delete left file/folder</source> <target>UsuÅ„ plik/katalog po lewej stronie</target> + <source>Delete right file/folder</source> <target>UsuÅ„ plik/katalog po prawej stronie</target> + <source>Overwrite left file/folder with right one</source> <target>Nadpisz plik/katalog po lewej stronie tym po prawej</target> + <source>Overwrite right file/folder with left one</source> <target>Nadpisz plik/katalog po prawej stronie tym po lewej</target> + <source>Do nothing</source> <target>Nic nie rób</target> + <source>Copy file attributes only to left</source> <target>Kopiuj atrybuty plików tylko na lewÄ… stronÄ™</target> + <source>Copy file attributes only to right</source> <target>Kopiuj atrybuty plików tylko na prawÄ… stronÄ™</target> + <source>Deleting file %x</source> <target>Usuwanie pliku %x</target> -<source>Deleting Symbolic Link %x</source> -<target>Usuwanie dowiÄ…zania symbolicznego %x</target> + <source>Deleting folder %x</source> <target>Usuwanie folderu %x</target> -<source>Moving %x to Recycle Bin</source> -<target>Przenoszenie %x do kosza.</target> -<source>Moving file %x to user-defined directory %y</source> -<target>Przenoszenie pliku %x do katalogu użytkownia %y</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>Przenoszenie folderu %x do katalogu użytkownika %y</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>Przenoszenie dowiÄ…zania symbolicznego %x do zdefiniowanego katalogu %y</target> -<source>Copying new file %x to %y</source> -<target>Kopiowanie nowego pliku %x do %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>Kopiowanie nowego dowiÄ…zania symbolicznego %x</target> -<source>Overwriting file %x in %y</source> -<target>Nadpisywanie pliku %x plikiem %y</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>Nadpisywanie dowiÄ…zania symbolicznego %x, %y</target> + +<source>Deleting symbolic link %x</source> +<target>Usuwanie dowiÄ…zania symbolicznego %x</target> + +<source>Moving file %x to recycle bin</source> +<target>Przenoszenie pliku %x do kosza</target> + +<source>Moving folder %x to recycle bin</source> +<target>Przenoszenie katalogu %x do kosza</target> + +<source>Moving symbolic link %x to recycle bin</source> +<target>Przenoszenie dowiÄ…zania symbolicznego %x do kosza</target> + +<source>Moving file %x to %y</source> +<target>Przenoszenie pliku %x do %y</target> + +<source>Moving folder %x to %y</source> +<target>Przenoszenie katalogu %x do %y</target> + +<source>Moving symbolic link %x to %y</source> +<target>Przenoszenie dowiÄ…zania symbolicznego %x do %y</target> + +<source>Creating file %x</source> +<target>Tworzenie pliku %x</target> + +<source>Creating symbolic link %x</source> +<target>Tworzenie dowiÄ…zania symbolicznego %x</target> + <source>Creating folder %x</source> <target>Tworzenie folderu %x</target> + +<source>Overwriting file %x</source> +<target>Nadpisywanie pliku %x</target> + +<source>Overwriting symbolic link %x</source> +<target>Nadpisywanie dowiÄ…zania symbolicznego %x</target> + <source>Verifying file %x</source> <target>Weryfikowanie pliku %x</target> + <source>Updating attributes of %x</source> <target>Aktualizowanie atrybutów %x</target> -<source>Source directory does not exist anymore:</source> -<target>Katalog źródÅ‚owy nie istnieje:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>Brak elementów do synchronizacji!</target> + <source>Target directory name must not be empty!</source> <target>Katalog docelowy nie może być pusty!</target> + <source>User-defined directory for deletion was not specified!</source> <target>Katalog użytkownika dla elementów usuniÄ™tych nie zostaÅ‚ okreÅ›lony!</target> + +<source>Source directory does not exist anymore:</source> +<target>Katalog źródÅ‚owy nie istnieje:</target> + <source>Unresolved conflicts existing!</source> <target>IstniejÄ… nierozwiÄ…zane konflikty!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>Możesz je zignorować i kontynuować synchronizacjÄ™.</target> + <source>Significant difference detected:</source> <target>Wykryto znaczÄ…ce zmiany:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>Ponad 50% plików zostanie skopiowanych lub usuniÄ™tych!</target> + <source>Not enough free disk space available in:</source> <target>Brak wystarczajÄ…cej przestrzeni dyskowej na:</target> + <source>Free disk space required:</source> <target>Wymagane wolne miejsce:</target> + <source>Free disk space available:</source> <target>Wolne miejsce:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target></target> +<target>Kosz nie jest dostÄ™pny dla okreÅ›lonych Å›cieżek! Pliki zostanÄ… nieodwracalnie usuniÄ™tÄ™:</target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>Katalog zostanie zmodyfikowany w efekcie synchronizacji wielu par folderów! Zweryfikuj ustawienia synchronizacji!</target> + <source>Processing folder pair:</source> <target>Przetwarzanie folderów:</target> + <source>Generating database...</source> <target>Generowanie bazy danych...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>Brak elementów do synchronizacji!</target> + <source>Error copying locked file %x!</source> <target>BÅ‚Ä…d podczas kopiowania zablokowanego pliku %x!</target> + <source>Data verification error: Source and target file have different content!</source> <target>BÅ‚Ä…d weryfikacji danych: Plik źródÅ‚owy i docelowy różniÄ… siÄ™ zawartoÅ›ciÄ…!</target> + diff --git a/BUILD/Languages/portuguese.lng b/BUILD/Languages/portuguese.lng index 21178e5b..15d0e501 100644 --- a/BUILD/Languages/portuguese.lng +++ b/BUILD/Languages/portuguese.lng @@ -8,75 +8,116 @@ </header> <source>Searching for directory %x...</source> -<target></target> +<target>A procurar o directório %x...</target> + <source>Show in Explorer</source> <target>Mostrar no Explorer</target> + <source>Open with default application</source> <target>Abrir com a aplicação associada</target> + <source>Browse directory</source> <target>Procurar directório</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Sincronização Automática</target> + <source>Browse</source> <target>Procurar</target> -<source>Invalid commandline: %x</source> -<target>Comando inválido: %x</target> + +<source>Invalid command line: %x</source> +<target>Linha de comando inválida: %x</target> + <source>Error resolving symbolic link:</source> <target>Erro na resolução do link simbólico:</target> -<source>Show popup</source> -<target>Mostrar popups</target> -<source>Show popup on errors or warnings</source> -<target>Mostrar popup c/ erros ou avisos</target> + +<source>Show pop-up</source> +<target>Mostrar popup</target> + +<source>Show pop-up on errors or warnings</source> +<target>Mostrar popup em caso de erros ou avisos</target> + <source>Ignore errors</source> <target>Ignorar erros</target> + <source>Hide all error and warning messages</source> <target>Ocultar todas as mensagens de erro/aviso</target> + <source>Exit instantly</source> <target>Sair imediatamente</target> + <source>Abort synchronization immediately</source> <target>Abortar sincronização imediatamente</target> + +<source>Select alternate comparison settings</source> +<target>Selecionar opções alternativas de comparação</target> + <source>Select alternate synchronization settings</source> -<target>Seleccionar opções alternativas de sincronização</target> +<target>Selecionar opções alternativas de sincronização</target> + <source>No filter selected</source> -<target>Nenhum filtro seleccionado</target> +<target>Nenhum filtro selecionado</target> + <source>Filter is active</source> <target>Filtro activo</target> -<source>Clear filter settings</source> -<target>Limpar opções do filtro</target> + <source>Remove alternate settings</source> <target>Remover opções alternativas</target> + +<source>Clear filter settings</source> +<target>Limpar opções do filtro</target> + <source>Create a batch job</source> <target>Criar ficheiro batch</target> + <source>Synchronization settings</source> -<target>Parâmetros de sincronização</target> +<target>Parametros de sincronização</target> + <source>Comparison settings</source> -<target>Opções de Comparação</target> +<target>Opções de comparação</target> + <source>About</source> <target>Sobre</target> + <source>Error</source> <target>Erro</target> + <source>Warning</source> <target>Atenção</target> + <source>Question</source> <target>Questão</target> + <source>Confirm</source> <target>Confirmar</target> + <source>Configure filter</source> -<target>Configuração dos filtros</target> +<target>Configurar filtros</target> + <source>Customize columns</source> <target>Personalizar colunas</target> + <source>Global settings</source> <target>Opções</target> + <source>Synchronization Preview</source> <target>Previsualizar sincronização</target> + <source>Find</source> <target>Procurar</target> + +<source>Select time span</source> +<target>Selecionar intervalo de tempo</target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -85,46 +126,64 @@ <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> </target> + <source><Symlink></source> <target><Link Simbólico></target> + <source><Directory></source> <target><Directório></target> + <source>Size</source> <target>Tamanho</target> + <source>Date</source> <target>Data</target> + <source>Full path</source> <target>Caminho completo</target> + <source>Filename</source> <target>Nome do ficheiro</target> + <source>Relative path</source> <target>Caminho</target> + <source>Directory</source> <target>Directório</target> + <source>Extension</source> <target>Extensão</target> + <source>Comparison Result</source> -<target>Resultados da Comparação</target> +<target>Resultados da comparação</target> + <source>Incompatible synchronization database format:</source> <target>Formato de base de dados de sincronização incompatÃvel:</target> + <source>Initial synchronization:</source> <target>Sincronização inicial:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>Um dos ficheiros da base de dados não existe:</target> + <source>Error reading from synchronization database:</source> <target>Erro ao ler a base de dados de sincronização:</target> + <source>Database files do not share a common synchronization session:</source> -<target></target> +<target>Bases de dados não partilham a mesma sessão de sincronização:</target> + <source>An exception occurred!</source> <target>Ocorreu uma excepção!</target> -<source>Error deleting file:</source> -<target>Erro ao eliminar o ficheiro:</target> + <source>Error reading file attributes:</source> <target>Erro ao ler atributos do ficheiro:</target> + <source>Waiting while directory is locked (%x)...</source> <target>Aguardar enquanto o directório é bloqueado (%x)...</target> + <source>Error setting directory lock:</source> <target>Erro ao bloquear directório:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -133,27 +192,40 @@ <pluralform>1 seg</pluralform> <pluralform>%x segs</pluralform> </target> + <source>Info</source> <target>Info</target> + <source>Fatal Error</source> -<target>Erro fatal</target> +<target>Erro crÃtico</target> + <source>Scanning:</source> <target>A pesquisar:</target> + <source>Encoding extended time information: %x</source> <target>A codificar dados temporais extendidos: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> -<target></target> +<target> +<pluralform>[1 Thread]</pluralform> +<pluralform>[%x Threads]</pluralform> +</target> + <source>Invalid FreeFileSync config file!</source> -<target>Ficheiro de configuração do FreeFileSync inválido!</target> +<target>Ficheiro de configuração inválido!</target> + <source>File does not exist:</source> <target>O ficheiro não existe:</target> + <source>Error parsing configuration file:</source> <target>Erro de leitura do ficheiro de configuração:</target> + <source>/sec</source> <target>/seg</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -162,6 +234,7 @@ <pluralform>1 min</pluralform> <pluralform>%x mins</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -170,6 +243,7 @@ <pluralform>1 hora</pluralform> <pluralform>%x horas</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -178,28 +252,40 @@ <pluralform>1 dia</pluralform> <pluralform>%x dias</pluralform> </target> + <source>S&ave configuration...</source> <target>G&uardar a configuração...</target> + <source>&Load configuration...</source> <target>&Carregar configuração...</target> + <source>&Quit</source> <target>S&air</target> + <source>&File</source> <target>&Ficheiro</target> + <source>&Content</source> <target>C&onteúdo</target> + <source>&About...</source> <target>&Sobre...</target> + <source>&Help</source> <target>A&juda</target> + <source>Usage:</source> <target>Uso:</target> + <source>1. Select directories to monitor.</source> -<target>1. Seleccionar directórios a monitorizar.</target> +<target>1. Selecionar directórios a monitorizar.</target> + <source>2. Enter a command line.</source> -<target>2. Insira linha de comando.</target> +<target>2. Insirir a linha de comando.</target> + <source>3. Press 'Start'.</source> <target>3. Pressione 'Iniciar'.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -210,309 +296,461 @@ A linha de comandos é executada cada vez que: - os directórios ficam disponÃveis (i.e. pen USB) - ficheiros nos directórios ou subdirectórios são modificados </target> + <source>Directories to watch</source> <target>Directórios a observar</target> + <source>Add folder</source> <target>Adicionar pasta</target> + <source>Remove folder</source> <target>Remover pasta(s)</target> + <source>Select a folder</source> -<target>Seleccione uma pasta</target> +<target>Selecione uma pasta</target> + <source>Command line</source> <target>Linha de comandos</target> + <source>Minimum Idle Time [seconds]</source> <target>Tempo de espera [segundos]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> -<target>Tempo de espera entre a última alteração e a execução do comando em segundos</target> +<target>Tempo de espera entre a última alteração e a execução do comando, em segundos</target> + <source>Start</source> <target>Iniciar</target> + <source>(Build: %x)</source> <target>(Build: %x)</target> + <source>RealtimeSync configuration</source> <target>Configuração do RealtimeSync</target> + <source>File already exists. Overwrite?</source> <target>O ficheiro já existe. Deseja substituir?</target> + <source>&Restore</source> <target>&Restaurar</target> + <source>&Exit</source> <target>&Sair</target> + <source>Monitoring active...</source> <target>Monitorizar activado...</target> + <source>Waiting for missing directories...</source> <target>Aguardar pelos directórios em falta...</target> + <source>A directory input field is empty.</source> <target>Um campo de directório está vazio.</target> + <source>Drag && drop</source> <target>Arrastar && Largar</target> + <source>Could not initialize directory monitoring:</source> <target>Não é possÃvel iniciar monitorização do directório:</target> + <source>Error when monitoring directories.</source> <target>Erro ao monitorizar os directórios.</target> + <source>Conversion error:</source> <target>Erro de conversão:</target> + +<source>Error deleting file:</source> +<target>Erro ao eliminar o ficheiro:</target> + <source>Error moving file:</source> <target>Erro ao mover o ficheiro:</target> + <source>Target file already existing!</source> <target>Ficheiro de destino já existe!</target> + <source>Error moving directory:</source> <target>Erro ao mover o directório:</target> + <source>Target directory already existing!</source> <target>Directório de destino já existe!</target> + <source>Error deleting directory:</source> <target>Erro ao eliminar a pasta:</target> + <source>Error changing modification time:</source> <target>Erro ao mudar a hora de modificação:</target> + <source>Error loading library function:</source> <target>Erro ao carregar a livraria:</target> + <source>Error reading security context:</source> <target>Erro ao ler contexto de segurança:</target> + <source>Error writing security context:</source> <target>Erro de escrita no contexto de segurança:</target> + <source>Error copying file permissions:</source> <target>Erro ao copiar permissões dos ficheiros:</target> + <source>Error creating directory:</source> <target>Erro ao criar a pasta:</target> + <source>Error copying symbolic link:</source> <target>Erro ao copiar o link:</target> + <source>Error copying file:</source> <target>Erro ao copiar ficheiro:</target> + <source>Error opening file:</source> <target>Erro ao abrir ficheiro:</target> + <source>Error writing file:</source> <target>Erro de escrita no ficheiro:</target> + <source>Error reading file:</source> <target>Erro de leitura de ficheiro:</target> + <source>Operation aborted!</source> <target>Operação abortada!</target> + +<source>Could not load a required DLL:</source> +<target>Não foi possÃvel carregar a DLL:</target> + <source>Endless loop when traversing directory:</source> <target>Loop infinito ao percorrer directório:</target> + <source>Error traversing directory:</source> <target>Erro ao percorrer a pasta:</target> + <source>Windows Error Code %x:</source> <target>Código de erro do Windows %x:</target> + <source>Linux Error Code %x:</source> <target>Código de erro do Linux %x:</target> + <source>Error setting privilege:</source> <target>Erro ao estabelecer privilégios:</target> + <source>Error moving to Recycle Bin:</source> <target>Erro ao mover para a Reciclagem:</target> -<source>Could not load a required DLL:</source> -<target>Não foi possÃvel carregar a DLL:</target> + <source>Error writing to synchronization database:</source> <target>Erro na escrita da base de dados de sincronização:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>Erro ao iniciar o serviço Volume Shadow Copy!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target>Erro no acesso ao serviço Volume Shadow Copy!</target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>Fazer cópias fantasma em WOW64 não é suportado. Por favor usar a versão 64-bit.</target> + <source>Could not determine volume name for file:</source> <target>Não é possÃvel determinar o nome do volume para o ficheiro:</target> + <source>Volume name %x not part of filename %y!</source> <target>Nome do volume %x não faz parte do ficheiro %y!</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>Não foi possÃvel ler os valores dos seguintes nós XML:</target> + <source>Logging</source> <target>A escrever em log</target> + <source>FreeFileSync batch file</source> -<target>FreeFileSync Ficheiro batch</target> +<target>FreeFileSync ficheiro batch</target> + <source>FreeFileSync configuration</source> <target>FreeFileSync configuração</target> + <source>FreeFileSync Batch Job</source> -<target>FreeFileSync Ficheiro batch</target> +<target>FreeFileSync ficheiro batch</target> + <source>Unable to create logfile!</source> <target>Não é possÃvel criar ficheiro log!</target> + <source>Batch execution</source> <target>Execução do batch</target> + <source>Log-messages:</source> <target>Log de mensagens:</target> + <source>Stop</source> <target>Parar</target> + <source>Total time:</source> <target>Tempo total:</target> + <source>Synchronization aborted!</source> <target>Sincronização abortada!</target> + <source>Synchronization completed with errors!</source> <target>Sincronização completa com erros!</target> + <source>Synchronization completed successfully!</source> <target>Sincronização completa com sucesso!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>Clique "Trocar" para abrir o GUI do FreeFileSync.</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>A abrir o GUI do FreeFileSync...</target> + <source>Unable to connect to sourceforge.net!</source> <target>Não é possÃvel ligar a sourceforge.net!</target> + <source>A newer version of FreeFileSync is available:</source> <target>Mais recente versão do FreeFileSync disponÃvel:</target> + <source>Download now?</source> <target>Fazer download agora?</target> + <source>Information</source> <target>Informação</target> + <source>FreeFileSync is up to date!</source> <target>FreeFileSync está actualizado!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>Deseja que o FreeFileSync procure automaticamente actualizações todas as semanas?</target> + <source>(Requires an Internet connection!)</source> <target>(Necessita acesso à Internet!)</target> + <source>1. &Compare</source> <target>1. &Comparar</target> + <source>2. &Synchronize...</source> <target>2. &Sincronizar...</target> + <source>S&witch view</source> <target>&Mudar vista</target> + <source>&New</source> <target>&Novo</target> + <source>&Program</source> <target>&Programa</target> + <source>&Language</source> <target>&LÃngua</target> + <source>&Global settings...</source> -<target>&Opções......</target> +<target>&Opções...</target> + <source>&Create batch job...</source> <target>&Criar um ficheiro batch...</target> + <source>&Export file list...</source> <target>&Exportar lista de ficheiros...</target> + <source>&Advanced</source> <target>&Avançado</target> + <source>&Check for new version</source> <target>&Procurar actualizações</target> + <source>Compare</source> <target>Comparar</target> + <source>Compare both sides</source> <target>Comparar listas</target> + <source>&Abort</source> <target>&Abortar</target> + <source>Synchronize...</source> <target>Sincronizar...</target> + <source>Start synchronization</source> <target>Iniciar a sincronização</target> -<source>Swap sides</source> -<target>Trocar lados</target> + <source>Add folder pair</source> <target>Adicionar um par de pastas</target> + <source>Remove folder pair</source> <target>Remover o par de pastas</target> + +<source>Swap sides</source> +<target>Trocar lados</target> + <source>Save current configuration to file</source> <target>Guardar o actual ficheiro de configuração</target> + <source>Load configuration from file</source> <target>Carregar configuração do ficheiro</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>Última configuração utilizada (pressione DEL para remover da lista)</target> + <source>Hide excluded items</source> <target>Ocultar itens excluidos</target> + <source>Hide filtered or temporarily excluded files</source> <target>Ocultar ficheiros filtrados ou temporariamente excluidos</target> + <source>Number of files and directories that will be created</source> <target>Número de itens a ser criados</target> + <source>Number of files that will be overwritten</source> <target>Número de ficheiros substituidos</target> + <source>Number of files and directories that will be deleted</source> <target>Número de itens a ser eliminados</target> + <source>Total amount of data that will be transferred</source> <target>Volume de dados a ser transferido</target> -<source>Left</source> -<target>Esquerda</target> -<source>Right</source> -<target>Direita</target> + <source>Batch job</source> <target>Ficheiro Batch</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>Criar um batch para sincronização automática. Para iniciar o batch, basta fazer duplo-clique no ficheiro ou executar via linha de comandos: FreeFileSync.exe <batch>. Também pode ser inserido no programador de tarefas do sistema operativo.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target>Criar ficheiro batch para sincronização automática. Para iniciar em modo batch, faço duplo-clique sobre o ficheiro ou execute via linha de comando: FreeFileSync.exe <ficheiro ffs_batch>. Também pode ser programado no gestor de tarefas do sistema operativo.</target> + <source>Help</source> <target>Ajuda</target> + <source>Filter files</source> <target>Filtrar ficheiros</target> + <source>Error handling</source> <target>Controlador de erros</target> + +<source>Left</source> +<target>Esquerda</target> + +<source>Right</source> +<target>Direita</target> + <source>Overview</source> <target>Vista</target> + <source>Status feedback</source> <target>Retorno de estado</target> + <source>Run minimized</source> -<target></target> +<target>Correr minimizado</target> + <source>Maximum number of logfiles:</source> <target>Número máximo de ficheiros log:</target> + <source>Select logfile directory:</source> -<target>Seleccione directório para ficheiro log:</target> +<target>Selecione directório para ficheiro log:</target> + <source>Batch settings</source> -<target></target> +<target>Opções do batch</target> + <source>&Save</source> <target>&Guardar</target> + <source>&Load</source> <target>&Carregar</target> + <source>&Cancel</source> <target>&Cancelar</target> + <source>Elements found:</source> <target>Elementos encontrados:</target> + <source>Elements remaining:</source> <target>Elementos restantes:</target> + <source>Speed:</source> <target>Velocidade:</target> + <source>Time remaining:</source> <target>Tempo restante:</target> + <source>Time elapsed:</source> <target>Tempo passado:</target> + <source>Operation:</source> <target>Operação:</target> + <source>Select variant:</source> -<target>Seleccione uma variante:</target> +<target>Selecione uma variante:</target> + <source><Automatic></source> <target><Automático></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>Identificar e propagar as mudanças usando base de dados. Eliminações e conflitos serão detectados automaticamente.</target> + <source>Mirror ->></source> <target>Espelhar ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Cópia de segurança do directório à esquerda. O directório da direita é alterado para ficar igual ao da esquerda após sincronização.</target> + <source>Update -></source> <target>Actualizar -></target> + <source>Copy new or updated files to right folder.</source> <target>Copiar ficheiros novos ou actualizados para a direita</target> + <source>Custom</source> <target>Personalizado</target> + <source>Configure your own synchronization rules.</source> <target>Configure as suas regras de sincronização.</target> + <source>Deletion handling</source> <target>Controlo eliminação</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>Configuração</target> + <source>Category</source> <target>Categoria</target> + <source>Action</source> -<target>Acção</target> +<target>Ação</target> + <source>File/folder exists on left side only</source> <target>Ficheiro/pasta existe apenas à esquerda</target> + <source>File/folder exists on right side only</source> <target>Ficheiro/pasta existe apenas à direita</target> + <source>Left file is newer</source> <target>Ficheiro mais recente à esquerda</target> + <source>Right file is newer</source> <target>Ficheiro mais recente à direita</target> + <source>Files have different content</source> <target>Ficheiros são diferentes</target> + <source>Conflict/file cannot be categorized</source> <target>Ficheiro/conflito não pode ser categorizado</target> + <source>Compare by...</source> <target>Comparar por...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> <target> -Os ficheiros são considerados iguais se - - o tamanho - - data e hora são iguais +Ficheiros considerados iguais se + - data da última modificação + - tamanho +são iguais </target> -<source>File size and date</source> + +<source>File time and size</source> <target>Data e tamanho do ficheiro</target> + <source> Files are found equal if - file content @@ -522,110 +760,109 @@ is the same Os ficheiros são considerados iguais se - o conteúdo é o mesmo </target> + <source>File content</source> <target>Conteúdo do ficheiro</target> + <source>Symbolic Link handling</source> <target>Tratamento de links simbólicos</target> + <source>Synchronizing...</source> <target>A sincronizar...</target> + <source>Elements processed:</source> <target>Elementos processados:</target> + <source>&Pause</source> <target>&Pausa</target> -<source>Compare by "File size and date"</source> -<target>Comparar por "Data e tamanho dos ficheiros"</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>Esta variante avalia dois ficheiros de nome igual como iguais quando têm o mesmo tamanho e a mesma data e hora de modificação.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>Usar a seguinte árvore de decisão quando inicia com estas opções de comparação:</target> -<source>As a result the files are separated into the following categories:</source> -<target>Como resultado, os ficheiros foram separados nas seguintes categorias:</target> -<source>- equal</source> -<target>- ficheiros iguais</target> -<source>- left newer</source> -<target>- mais novo à esquerda</target> -<source>- right newer</source> -<target>- mais novo à direita</target> -<source>- exists left only</source> -<target>- existe apenas à esquerda</target> -<source>- exists right only</source> -<target>- existe apenas à direita</target> -<source>- conflict (same date, different size)</source> -<target>- conflito (mesma data, tamanho diferente)</target> -<source>Compare by "File content"</source> -<target>Comparar por "Conteúdo dos ficheiros"</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. -With this option enabled the decision tree is smaller: -</source> -<target> -Como o nome sugere, dois ficheiros com o mesmo nome são assinalados iguais se e só se o seu conteúdo for idêntico. Esta opção é útil para controles de consistência mais do que para efeitos de backup. Portanto, a data dos ficheiros não é tomada em conta. - -Com esta opção, a arvoré de decisão é menor: -</target> -<source>- different</source> -<target>- ficheiros diferentes</target> <source>Source code written in C++ utilizing:</source> <target>Código fonte escrito em C++ usando:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>Pela tradução de FreeFileSync, um agradecimento a:</target> + <source>Feedback and suggestions are welcome at:</source> <target>Comentários e sugestões são benvindos em:</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync na Sourceforge</target> + <source>Homepage</source> <target>Site</target> + <source>If you like FFS</source> <target>Se gosta do FreeFileSync</target> + <source>Donate with PayPal</source> <target>Doar usando PayPal</target> + <source>Email</source> <target>Email</target> + <source>Report translation error</source> <target>Informar um erro de tradução</target> + <source>Published under the GNU General Public License:</source> <target>Publicado sobre GNU General Public License:</target> + <source>Ignore subsequent errors</source> <target>Ignorar erros subsequentes</target> + <source>Hide further error messages during the current process</source> <target>Ocultar próximas mensagens de erro durante este processo</target> + <source>&Ignore</source> <target>&Ignorar</target> + <source>&Retry</source> <target>&Tentar de Novo</target> + <source>Do not show this dialog again</source> <target>Não mostrar novamente</target> + <source>&Switch</source> <target>&Trocar</target> + <source>&Yes</source> <target>&Sim</target> + <source>&No</source> <target>&Não</target> + <source>Delete on both sides</source> <target>Eliminar em ambos os lados</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>Eliminar em ambos os lados mesmo se o ficheiro só está seleccionado num lado</target> + <source>Use Recycle Bin</source> <target>Utilizar Reciclagem</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. </source> <target> -Apenas ficheiros/directórios que coincidam com as opções de filtros vão ser seleccionados para sincronização. +Apenas ficheiros/directórios que coincidam com as opções de filtros vão ser selecionados para sincronização. Nota: Os filtros devem ser especificados em relação aos directórios principais de sincronização. </target> + <source>Hints:</source> <target>Dicas:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. Inserir caminho(s) do(s) ficheiro(s) ou pasta(s) separados por ';' ou numa nova linha.</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. Usar '*' e '?' como caracteres de procura.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. Excluir ficheiros directamente da grelha através do menu de contexto.</target> + <source>Example</source> <target>Exemplo</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -634,30 +871,40 @@ Exclude: \stuff\temp\* Incluir: *.doc;*.zip;*.exe Excluir: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>Sincronizar todos os ficheiros .doc, .zip e .exe excepto os da pasta "temp".</target> + <source>Include</source> <target>Incluir</target> + <source>Exclude</source> <target>Excluir</target> -<source>Select time span:</source> -<target>Selecionar intervalo de tempo:</target> -<source>Minimum file size:</source> -<target>Tamanho mÃnimo de ficheiro:</target> -<source>Maximum file size:</source> -<target>Tamanho máximo de ficheiro:</target> + +<source>Minimum file size</source> +<target>Tamanho ficheiro mÃnimo</target> + +<source>Maximum file size</source> +<target>Tamanho ficheiro máximo</target> + <source>&Default</source> <target>&Config. Iniciais</target> + <source>Move column up</source> <target>Mover coluna para cima</target> + <source>Move column down</source> <target>Mover coluna para baixo</target> -<source>Transactional File Copy</source> -<target></target> + +<source>Transactional file copy</source> +<target>Copia ficheiro transacional</target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> -<target></target> +<target>Escrever num ficheiro temporário (*.ffs_tmp) e renomear. Garante consistência mesmo em situações de falha crÃtica.</target> + <source>Copy locked files</source> <target>Copiar ficheiros bloqueados</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -666,8 +913,10 @@ Copy shared or locked files using Volume Shadow Copy Service Copiar ficheiros partilhados ou bloqueados usando o serviço Volume Shadow Copy (Requer direitos de administrador) </target> -<source>Copy filesystem permissions</source> -<target>Copiar permissões do sistema de ficheiros</target> + +<source>Copy file access permissions</source> +<target>Copiar permissões de acesso do ficheiro</target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -676,138 +925,205 @@ Transfer file and directory permissions Transferir ficheiro e permissões (Requer direitos de administrador) </target> + <source>Hidden dialogs:</source> <target>Diálogos ocultos:</target> + <source>Reset</source> <target>Reiniciar</target> + <source>Show hidden dialogs</source> <target>Mostrar diálogos ocultos</target> + <source>External applications</source> <target>Aplicações externas</target> + <source>Description</source> <target>Descrição</target> + <source>Variant</source> <target>Variável</target> + <source>Statistics</source> <target>EstatÃsticas</target> + <source>Find what:</source> <target>Procurar:</target> + <source>Match case</source> <target>Correspondência</target> + <source>&Find next</source> <target>&Procurar seguinte</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>Pode tentar sincronizar os restantes elementos outra vez (SEM TER QUE comparar de novo) !</target> -<source>Batch file created successfully!</source> -<target>Ficheiro batch criado com sucesso!</target> + <source>Main bar</source> <target>Barra principal</target> + <source>Folder pairs</source> <target>Par de directório</target> + <source>Select view</source> <target>Seleccionar vista</target> + <source>Set direction:</source> <target>Escolher direcção:</target> + <source>Exclude temporarily</source> <target>Excluir temporariamente</target> + <source>Include temporarily</source> <target>Incluir temporariamente</target> + <source>Exclude via filter:</source> <target>Excluir por filtro:</target> + <source><multiple selection></source> <target><selecção múltipla></target> + <source>D-Click</source> <target>Duplo Clique</target> + <source>Delete</source> <target>Eliminar</target> + <source>Customize...</source> <target>Personalizar...</target> + +<source>Select time span...</source> +<target>Selecione intervalo de tempo...</target> + <source>Auto-adjust columns</source> <target>Auto ajustar colunas</target> + <source>Include all rows</source> <target>Incluir todas as linhas</target> + <source>Exclude all rows</source> <target>Excluir todas linhas</target> + <source>Reset view</source> <target>Restaurar vista</target> + <source>Show "%x"</source> <target>Mostrar "%x"</target> + <source><Last session></source> <target><Última Sessão></target> + <source>Configuration saved!</source> <target>Configuração guardada!</target> + <source>Save changes to current configuration?</source> <target>Guardar alterações à configuração?</target> + <source>Configuration loaded!</source> <target>Configuração carregada!</target> + <source>Folder Comparison and Synchronization</source> -<target>Comparação e Sincronização de pastas</target> +<target>Comparação e Sincronização de Pastas</target> + <source>Hide files that exist on left side only</source> <target>Ocultar ficheiros existentes somente à esquerda</target> + <source>Show files that exist on left side only</source> <target>Mostrar ficheiros existentes somente à esquerda</target> + <source>Hide files that exist on right side only</source> <target>Ocultar ficheiros existentes somente à direita</target> + <source>Show files that exist on right side only</source> <target>Mostrar ficheiros existentes somente à direita</target> + <source>Hide files that are newer on left</source> <target>Ocultar ficheiros mais recentes à esquerda</target> + <source>Show files that are newer on left</source> <target>Mostrar ficheiros mais recentes à esquerda</target> + <source>Hide files that are newer on right</source> <target>Ocultar ficheiros mais recentes à direita</target> + <source>Show files that are newer on right</source> <target>Mostrar ficheiros mais recentes à direita</target> + <source>Hide files that are equal</source> <target>Ocultar ficheiros iguais</target> + <source>Show files that are equal</source> <target>Mostrar ficheiros iguais</target> + <source>Hide files that are different</source> <target>Ocultar ficheiros diferentes</target> + <source>Show files that are different</source> <target>Mostrar ficheiros diferentes</target> + <source>Hide conflicts</source> <target>Ocultar conflitos</target> + <source>Show conflicts</source> <target>Mostrar conflitos</target> + <source>Hide files that will be created on the left side</source> <target>Ocultar ficheiros a ser criados à esquerda</target> + <source>Show files that will be created on the left side</source> <target>Mostrar ficheiros a ser criados à esquerda</target> + <source>Hide files that will be created on the right side</source> <target>Ocultar ficheiros a ser criados à direita</target> + <source>Show files that will be created on the right side</source> <target>Mostrar ficheiros a ser criados à direita</target> + <source>Hide files that will be deleted on the left side</source> <target>Ocultar ficheiros a ser apagados à esquerda</target> + <source>Show files that will be deleted on the left side</source> <target>Mostrar ficheiros a ser apagados à esquerda</target> + <source>Hide files that will be deleted on the right side</source> <target>Ocultar ficheiros a ser apagados à direita</target> + <source>Show files that will be deleted on the right side</source> <target>Mostrar ficheiros a ser apagados à direita</target> + <source>Hide files that will be overwritten on left side</source> <target>Ocultar ficheiros a ser substituidos do lado esquerdo</target> + <source>Show files that will be overwritten on left side</source> <target>Mostrar ficheiros a ser substituidos do lado esquerdo</target> + <source>Hide files that will be overwritten on right side</source> <target>Ocultar ficheiros a ser substituidos do lado direito</target> + <source>Show files that will be overwritten on right side</source> <target>Mostrar ficheiros a ser substituidos do lado direito</target> + <source>Hide files that won't be copied</source> <target>Ocultar ficheiros que não serão copiados</target> + <source>Show files that won't be copied</source> <target>Mostrar ficheiros que não serão copiados</target> + <source>All directories in sync!</source> <target>Todas as pastas sincronizadas!</target> + <source>Please run a Compare first before synchronizing!</source> <target>Use Comparar antes da primeira sincronização!</target> + <source>Comma separated list</source> <target>Lista de itens separados por virgula</target> + <source>Legend</source> <target>Legenda</target> + <source>File list exported!</source> <target>Lista dos ficheiros exportada!</target> + +<source>Batch file created successfully!</source> +<target>Ficheiro batch criado com sucesso!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -816,6 +1132,7 @@ Transferir ficheiro e permissões <pluralform>Objecto eliminado com sucesso!</pluralform> <pluralform>%x objectos eliminados com sucesso!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -824,6 +1141,7 @@ Transferir ficheiro e permissões <pluralform>1 directório</pluralform> <pluralform>%x directórios</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -832,6 +1150,7 @@ Transferir ficheiro e permissões <pluralform>1 ficheiro</pluralform> <pluralform>%x ficheiros</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -840,72 +1159,97 @@ Transferir ficheiro e permissões <pluralform>%x de 1 linha em vista</pluralform> <pluralform>%x de %y linhas em vista</pluralform> </target> + <source>Scanning...</source> <target>A pesquisar...</target> + <source>Comparing content...</source> <target>A comparar...</target> + <source>Paused</source> <target>Em pausa</target> + <source>Aborted</source> <target>Abortado</target> + <source>Completed</source> <target>Terminado</target> + <source>Abort requested: Waiting for current operation to finish...</source> -<target>Abortar pedido: À espera do fim da operação...</target> +<target>Abortar pedido: À espera do fim da operação atual...</target> + <source>Continue</source> <target>Continuar</target> + <source>Pause</source> <target>Pausa</target> + <source>Cannot find %x</source> <target>Não é possÃvel descobrir %x</target> -<source>DECISION TREE</source> -<target>ÃRVORE DE DECISÃO</target> -<source>file exists on both sides</source> -<target>ficheiro existente em ambos os lados</target> -<source>on one side only</source> -<target>ficheiro existente apenas num lado</target> -<source>same date</source> -<target>data igual</target> -<source>different date</source> -<target>data diferente</target> + <source>Inactive</source> <target>Inactivo</target> -<source>Second</source> -<target>Segundo</target> -<source>Minute</source> -<target>Minuto</target> -<source>Hour</source> -<target>Hora</target> -<source>Day</source> -<target>Dia</target> + +<source>Last x hours</source> +<target>Demora x horas</target> + +<source>Today</source> +<target>Hoje</target> + +<source>This week</source> +<target>Esta semana</target> + +<source>This month</source> +<target>Este mês</target> + +<source>This year</source> +<target>Este ano</target> + <source>Byte</source> <target>Byte</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>Filtro: Todos os pares</target> + <source>Filter: Single pair</source> <target>Filtro: Par simples</target> + <source>Ignore</source> <target>Ignorar</target> + <source>Direct</source> <target>Direto</target> + <source>Follow</source> <target>Seguir</target> + +<source>Copy NTFS permissions</source> +<target>Copiar permissões NTFS</target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>Integrar aplicações externas no menu de contexto. As seguintes macros estão disponÃveis:</target> + <source>- full file or directory name</source> <target>- nome completo do ficheiro ou directório</target> + <source>- directory part only</source> <target>- apenas parte do directório</target> + <source>- Other side's counterpart to %name</source> <target>- Contrapartida de %name</target> + <source>- Other side's counterpart to %dir</source> <target>- Contrapartida de %dir</target> + <source>Restore all hidden dialogs?</source> <target>Restaurar os diálogos escondidos?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -914,6 +1258,7 @@ Transferir ficheiro e permissões <pluralform>Deseja mesmo mover o seguinte objecto para a Reciclagem?</pluralform> <pluralform>Deseja mesmo mover os seguintes %x objectos para a Reciclagem?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -922,139 +1267,211 @@ Transferir ficheiro e permissões <pluralform>Deseja mesmo eliminar o seguinte objecto?</pluralform> <pluralform>Deseja mesmo eliminar os seguintes %x objectos?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>Deixar como conflito</target> + <source>Delete permanently</source> <target>Apagar permanentemente</target> + <source>Delete or overwrite files permanently</source> <target>Apagar ou substituir ficheiros permanentemente</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>Utilizar Reciclagem ao apagar ou substituir ficheiros</target> + <source>Versioning</source> <target>Manter versões anteriores</target> + <source>Move files into a time-stamped subdirectory</source> -<target>Mover ficheiros para uma pasta com a data</target> -<source>Cannot determine sync-direction:</source> -<target>Não é possÃvel saber a direcção de sincronização:</target> -<source>Filter settings have changed!</source> -<target>Opções de filtro alteradas!</target> +<target>Mover ficheiros para uma subpasta datada</target> + <source>Both sides have changed since last synchronization!</source> <target>Ambos os lados tiveram alterações desde a última sincronização!</target> + +<source>Cannot determine sync-direction:</source> +<target>Não é possÃvel saber a direção de sincronização:</target> + <source>No change since last synchronization!</source> <target>Não há alterações desde a sincronização!</target> + +<source>Filter settings have changed!</source> +<target>Opções de filtro alteradas!</target> + <source>The file was not processed by last synchronization!</source> <target>O ficheiro não foi processado na última sincronização!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>Eliminação de directorio planeada está em conflito com subdirectorios e/ou ficheiros!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Escolher direcção de sincronização por defeito: Os ficheiros antigos serão substituÃdos pelos novos.</target> + <source>The file does not contain a valid configuration:</source> <target>O ficheiro não contém uma configuração válida:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>Pode ignorar este erro para considerar o directório como vazio.</target> + <source>Directory does not exist:</source> <target>A pasta não existe:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Directórios são dependentes! Cuidado ao definir as regras de sincronização:</target> + <source>Comparing content of files %x</source> <target>A comparar o conteúdo do ficheiro %x</target> + <source>Memory allocation failed!</source> <target>Alocação de memória falhou!</target> + <source>File %x has an invalid date!</source> <target>Ficheiro %x tem data inválida!</target> + <source>Conflict detected:</source> <target>Conflito detectado:</target> + <source>Files %x have the same date but a different size!</source> <target>Os ficheiros %x têm a mesma data, mas tamanho diferente!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>Links simbólicos %x tem a mesma data mas diferente destino!</target> + <source>Comparing files by content failed.</source> <target>A comparação de ficheiros por conteúdo falhou.</target> + <source>Generating file list...</source> <target>A gerar lista ficheiros...</target> + <source>Multiple...</source> <target>Multiplo...</target> + <source>Both sides are equal</source> <target>Ambos os lados iguais</target> + <source>Files/folders differ in attributes only</source> <target>Ficheiros/pastas diferem apenas nos atributos</target> + <source>Copy new file/folder to left</source> <target>Copiar novo ficheiro/pasta para a esquerda</target> + <source>Copy new file/folder to right</source> <target>Copiar novo ficheiro/pasta para a direita</target> + <source>Delete left file/folder</source> <target>Eliminar ficheiro/pasta à esquerda</target> + <source>Delete right file/folder</source> <target>Eliminar ficheiro/pasta à direita</target> + <source>Overwrite left file/folder with right one</source> <target>Substituir ficheiro/pasta da esquerda (pelo da direita)</target> + <source>Overwrite right file/folder with left one</source> <target>Substituir ficheiro/pasta da direita (pelo da esquerda)</target> + <source>Do nothing</source> <target>Não fazer nada</target> + <source>Copy file attributes only to left</source> <target>Copiar apenas atributos de ficheiro para a esquerda</target> + <source>Copy file attributes only to right</source> <target>Copiar apenas atributos de ficheiro para a direita</target> + <source>Deleting file %x</source> <target>Apagar ficheiro %x</target> -<source>Deleting Symbolic Link %x</source> -<target>Apagar link simbólico %x</target> + <source>Deleting folder %x</source> <target>Apagar pasta %x</target> -<source>Moving %x to Recycle Bin</source> -<target>A mover %x para a Reciclagem</target> -<source>Moving file %x to user-defined directory %y</source> -<target>A mover ficheiro %x para o directório &y</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>A mover pasta %x para o directório %y</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>A mover link simbólico %x para o directório %y</target> -<source>Copying new file %x to %y</source> -<target>Copiar novo ficheiro %x para %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>Copiar novo link simbólico %x para %y</target> -<source>Overwriting file %x in %y</source> -<target>Sobrepor ficheiro %x em %y</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>Sobrepor link simbólico %x em %y</target> + +<source>Deleting symbolic link %x</source> +<target>Eliminar link simbólico %x</target> + +<source>Moving file %x to recycle bin</source> +<target>Mover ficheiro %x para a Reciclagem</target> + +<source>Moving folder %x to recycle bin</source> +<target>Mover pasta %x para Reciclagem</target> + +<source>Moving symbolic link %x to recycle bin</source> +<target>Mover link simbólico %x para a Reciclagem</target> + +<source>Moving file %x to %y</source> +<target>Mover ficheiro %x para %y</target> + +<source>Moving folder %x to %y</source> +<target>Mover pasta %x para %y</target> + +<source>Moving symbolic link %x to %y</source> +<target>Mover link simbólico %x para %y</target> + +<source>Creating file %x</source> +<target>Criar ficheiro %x</target> + +<source>Creating symbolic link %x</source> +<target>Criar link simbólico %x</target> + <source>Creating folder %x</source> <target>Criar pasta %x</target> + +<source>Overwriting file %x</source> +<target>Substituir ficheiro %x</target> + +<source>Overwriting symbolic link %x</source> +<target>Substituir link simbólico %x</target> + <source>Verifying file %x</source> <target>A verificar ficheiro %x</target> + <source>Updating attributes of %x</source> <target>Actualizar atributos de %x</target> -<source>Source directory does not exist anymore:</source> -<target>A pasta de origem já não existe:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>Nada a sincronizar de acordo com a configuração!</target> + <source>Target directory name must not be empty!</source> <target>Nome do directório de destino não pode estar vazio!</target> + <source>User-defined directory for deletion was not specified!</source> <target>Directório para eliminação não foi especificado!</target> + +<source>Source directory does not exist anymore:</source> +<target>A pasta de origem já não existe:</target> + <source>Unresolved conflicts existing!</source> <target>Existem conflitos por resolver!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>Pode ignorar os conflitos e continuar a sincronização.</target> + <source>Significant difference detected:</source> <target>Diferença significativa detectada:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>Mais de 50% dos ficheiros vai ser copiado ou apagado!</target> + <source>Not enough free disk space available in:</source> <target>Não há espaço livre suficiente em:</target> + <source>Free disk space required:</source> <target>Espaço livre necessário em disco:</target> + <source>Free disk space available:</source> -<target>Espaço livre em disco:</target> +<target>Espaço livre disponÃvel em disco:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target></target> +<target>Reciclagem não disponÃvel para os seguintes caminhos! Ficheiros serão apagados permanentemente:</target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>Um directório que pertencente a conjunto de vários directórios vai ser alterado! Por favor, verifique as opções de sincronização!</target> + <source>Processing folder pair:</source> <target>A processar o par do directorio:</target> + <source>Generating database...</source> <target>A gerar base de dados...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>Nada a sincronizar de acordo com a configuração!</target> + <source>Error copying locked file %x!</source> <target>Erro ao copiar ficheiro bloqueado %x!</target> + <source>Data verification error: Source and target file have different content!</source> <target>Erro na verificação de dados: ficheiro fonte e de destino têm conteúdo diferente!</target> + diff --git a/BUILD/Languages/portuguese_br.lng b/BUILD/Languages/portuguese_br.lng index 7736c1e4..700abdf2 100644 --- a/BUILD/Languages/portuguese_br.lng +++ b/BUILD/Languages/portuguese_br.lng @@ -8,75 +8,116 @@ </header> <source>Searching for directory %x...</source> -<target></target> +<target>Procurando pelo diretório %x...</target> + <source>Show in Explorer</source> <target>Mostrar no Explorer</target> + <source>Open with default application</source> <target>Abrir com aplicativo padrão</target> + <source>Browse directory</source> <target>Navegar pelo diretório</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Sincronização Automatizada</target> + <source>Browse</source> <target>Procurar</target> -<source>Invalid commandline: %x</source> -<target>Comando de linha inválido: %x</target> + +<source>Invalid command line: %x</source> +<target>Linha de comando inválida: %x</target> + <source>Error resolving symbolic link:</source> <target>Erro na resolução de link simbólico:</target> -<source>Show popup</source> -<target>Mostrar popup</target> -<source>Show popup on errors or warnings</source> -<target>Mostrar popup com erros ou avisos</target> + +<source>Show pop-up</source> +<target>Mostrar pop-up</target> + +<source>Show pop-up on errors or warnings</source> +<target>Mostrar pop-up em erros e avisos</target> + <source>Ignore errors</source> <target>Ignorar erros</target> + <source>Hide all error and warning messages</source> <target>Ocultar todas as mensagens de erro ou aviso</target> + <source>Exit instantly</source> <target>Sair instantaneamente</target> + <source>Abort synchronization immediately</source> <target>Cancelar a sincronização imediatamente</target> + +<source>Select alternate comparison settings</source> +<target>Selecionar configuração de comparação alternativa</target> + <source>Select alternate synchronization settings</source> <target>Selecionar configuração de sincronização alternativa</target> + <source>No filter selected</source> <target>Nenhum filtro selecionado</target> + <source>Filter is active</source> <target>Filtro está ativo</target> -<source>Clear filter settings</source> -<target>Limpar configurações do filtro</target> + <source>Remove alternate settings</source> <target>Remover configurações alternativas</target> + +<source>Clear filter settings</source> +<target>Limpar configurações do filtro</target> + <source>Create a batch job</source> <target>Criar arquivo batch</target> + <source>Synchronization settings</source> <target>Parâmetros de sincronização</target> + <source>Comparison settings</source> <target>Configurações da comparação</target> + <source>About</source> <target>Sobre</target> + <source>Error</source> <target>Erro</target> + <source>Warning</source> <target>Atenção</target> + <source>Question</source> <target>Questão</target> + <source>Confirm</source> <target>Confirmar</target> + <source>Configure filter</source> <target>Configurar filtros</target> + <source>Customize columns</source> <target>Personalizar colunas</target> + <source>Global settings</source> <target>Configurações</target> + <source>Synchronization Preview</source> <target>Pré-visualização da Sincronização</target> + <source>Find</source> <target>Localizar</target> + +<source>Select time span</source> +<target>Selecionar perÃodo de tempo</target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -85,46 +126,64 @@ <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> </target> + <source><Symlink></source> <target><Link Simbólico></target> + <source><Directory></source> <target><Diretório></target> + <source>Size</source> <target>Tamanho</target> + <source>Date</source> <target>Data</target> + <source>Full path</source> <target>Caminho completo</target> + <source>Filename</source> <target>Nome do arquivo</target> + <source>Relative path</source> <target>Caminho relativo</target> + <source>Directory</source> <target>Diretório</target> + <source>Extension</source> <target>Extensão</target> + <source>Comparison Result</source> <target>Resultado da Comparação</target> + <source>Incompatible synchronization database format:</source> <target>Formato de banco de dados de sincronização incompatÃvel:</target> + <source>Initial synchronization:</source> <target>Sincronização inicial:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>Um dos arquivos de banco de dados do FreeFileSync ainda não existe:</target> + <source>Error reading from synchronization database:</source> <target>Erro ao ler do banco de dados de sincronização:</target> + <source>Database files do not share a common synchronization session:</source> -<target></target> +<target>Arquivos de banco de dados não compartilham uma sessão de sincronização comum:</target> + <source>An exception occurred!</source> <target>Ocorreu uma exceção!</target> -<source>Error deleting file:</source> -<target>Erro ao apagar arquivo:</target> + <source>Error reading file attributes:</source> <target>Erro ao ler atributos do arquivo:</target> + <source>Waiting while directory is locked (%x)...</source> <target>Esperando enquanto o diretório é travado (%x)...</target> + <source>Error setting directory lock:</source> <target>Erro ao definir bloqueio no diretório:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -133,27 +192,40 @@ <pluralform>1 seg</pluralform> <pluralform>%x seg</pluralform> </target> + <source>Info</source> <target>Info</target> + <source>Fatal Error</source> <target>Erro fatal</target> + <source>Scanning:</source> <target>Pesquisando:</target> + <source>Encoding extended time information: %x</source> <target>Codificando informações adicionais de tempo: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> -<target></target> +<target> +<pluralform>[1 Thread]</pluralform> +<pluralform>[%x Threads]</pluralform> +</target> + <source>Invalid FreeFileSync config file!</source> <target>Arquivo de configuração do FreeFileSync inválido!</target> + <source>File does not exist:</source> <target>O arquivo não existe:</target> + <source>Error parsing configuration file:</source> <target>Erro de leitura do arquivo de configuração:</target> + <source>/sec</source> <target>/seg</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -162,6 +234,7 @@ <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -170,6 +243,7 @@ <pluralform>1 hora</pluralform> <pluralform>%x horas</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -178,28 +252,40 @@ <pluralform>1 dia</pluralform> <pluralform>%x dias</pluralform> </target> + <source>S&ave configuration...</source> <target>S&alvar configuração...</target> + <source>&Load configuration...</source> <target>&Carregar configuração...</target> + <source>&Quit</source> <target>&Sair</target> + <source>&File</source> <target>&Arquivo</target> + <source>&Content</source> <target>&Conteúdo</target> + <source>&About...</source> <target>&Sobre...</target> + <source>&Help</source> <target>&Ajuda</target> + <source>Usage:</source> <target>Uso:</target> + <source>1. Select directories to monitor.</source> <target>1. Selecione os diretórios para monitorar.</target> + <source>2. Enter a command line.</source> <target>2. Entre uma linha de comando.</target> + <source>3. Press 'Start'.</source> <target>3. Pressione 'Iniciar'.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -210,310 +296,461 @@ A linha de comando é executada cada vez que: - todos os diretórios ficam disponÃveis (ex.: inserção de uma Pen Drive) - arquivos dentro desses diretórios ou subdiretórios são modificados </target> + <source>Directories to watch</source> <target>Diretórios para monitorar</target> + <source>Add folder</source> <target>Adicionar pasta</target> + <source>Remove folder</source> <target>Remover pasta</target> + <source>Select a folder</source> <target>Selecionar uma pasta</target> + <source>Command line</source> <target>Linha de comando</target> + <source>Minimum Idle Time [seconds]</source> <target>MÃnimo Tempo Ocioso [segundos]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>Tempo ocioso entre detecção da última mudança e da execução da linha de comando em segundos</target> + <source>Start</source> <target>Iniciar</target> + <source>(Build: %x)</source> <target>(Versão: %x)</target> + <source>RealtimeSync configuration</source> <target>Configuração do RealtimeSync</target> + <source>File already exists. Overwrite?</source> <target>O arquivo já existe. Deseja substituir?</target> + <source>&Restore</source> <target>&Restaurar</target> + <source>&Exit</source> <target>&Sair</target> + <source>Monitoring active...</source> <target>Monitoramento ativo...</target> + <source>Waiting for missing directories...</source> <target>Esperando por diretórios faltantes...</target> + <source>A directory input field is empty.</source> <target>Um campo de entrada de diretório está vazio.</target> + <source>Drag && drop</source> <target>Arrastar && Soltar</target> + <source>Could not initialize directory monitoring:</source> <target>Não foi possÃvel inicializar o monitoramento de diretórios:</target> + <source>Error when monitoring directories.</source> <target>Erro ao monitorar os diretórios.</target> + <source>Conversion error:</source> <target>Erro de conversão:</target> + +<source>Error deleting file:</source> +<target>Erro ao apagar arquivo:</target> + <source>Error moving file:</source> <target>Erro ao mover arquivo:</target> + <source>Target file already existing!</source> <target>Arquivo de destino já existe!</target> + <source>Error moving directory:</source> <target>Erro ao mover diretório:</target> + <source>Target directory already existing!</source> <target>Diretório de destino já existe!</target> + <source>Error deleting directory:</source> <target>Erro ao apagar diretório:</target> + <source>Error changing modification time:</source> <target>Erro ao mudar a hora de modificação:</target> + <source>Error loading library function:</source> <target>Erro ao carregar a biblioteca de funções:</target> + <source>Error reading security context:</source> <target>Erro ao ler contexto de segurança:</target> + <source>Error writing security context:</source> <target>Erro ao escrever contexto de segurança:</target> + <source>Error copying file permissions:</source> <target>Erro ao copiar permissões do arquivo:</target> + <source>Error creating directory:</source> <target>Erro ao criar diretório:</target> + <source>Error copying symbolic link:</source> <target>Erro ao copiar links simbólicos:</target> + <source>Error copying file:</source> <target>Erro ao copiar arquivo:</target> + <source>Error opening file:</source> <target>Erro ao abrir arquivo:</target> + <source>Error writing file:</source> <target>Erro ao escrever arquivo:</target> + <source>Error reading file:</source> <target>Erro ao ler arquivo:</target> + <source>Operation aborted!</source> <target>Operação cancelada!</target> + +<source>Could not load a required DLL:</source> +<target>Não foi possÃvel carregar uma DLL requerida:</target> + <source>Endless loop when traversing directory:</source> <target>Loop infinito quando percorrendo diretório:</target> + <source>Error traversing directory:</source> <target>Erro ao percorrer diretório:</target> + <source>Windows Error Code %x:</source> <target>Código de Erro do Windows %x:</target> + <source>Linux Error Code %x:</source> <target>Código de Erro do Linux %x:</target> + <source>Error setting privilege:</source> <target>Erro ao definir privilégio:</target> + <source>Error moving to Recycle Bin:</source> <target>Erro ao mover para a Lixeira:</target> -<source>Could not load a required DLL:</source> -<target>Não foi possÃvel carregar uma DLL requerida:</target> + <source>Error writing to synchronization database:</source> <target>Erro ao escrever no banco de dados de sincronização:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>Erro ao inicializar o Serviço de Cópias de Sombra de Volume!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target>Erro ao acessar o Serviço de Cópia de Sombra de Volume!</target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>Cópias de sombra no WOW64 não são suportadas. Por favor use a versão 64-bits do FreeFileSync.</target> + <source>Could not determine volume name for file:</source> <target>Não foi possÃvel determinar o nome do volume para o arquivo:</target> + <source>Volume name %x not part of filename %y!</source> <target>Nome do volume %x não é parte do arquivo %y!</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>Não foi possÃvel ler os valores para os seguintes nós XML:</target> + <source>Logging</source> <target>Gravando log</target> + <source>FreeFileSync batch file</source> <target>FreeFileSync arquivo batch</target> + <source>FreeFileSync configuration</source> <target>FreeFileSync configuração</target> + <source>FreeFileSync Batch Job</source> <target>FreeFileSync Arquivo batch</target> + <source>Unable to create logfile!</source> <target>Não foi possÃvel criar arquivo de log!</target> + <source>Batch execution</source> <target>Execução do batch</target> + <source>Log-messages:</source> <target>Log de mensagens:</target> + <source>Stop</source> <target>Parar</target> + <source>Total time:</source> <target>Tempo total:</target> + <source>Synchronization aborted!</source> <target>Sincronização cancelada!</target> + <source>Synchronization completed with errors!</source> <target>Sincronização finalizada com erros!</target> + <source>Synchronization completed successfully!</source> <target>Sincronização finalizada com sucesso!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>Pressione "Alterar" para abrir o modo GUI do FreeFileSync.</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>Alterando para o modo GUI do FreeFileSync...</target> + <source>Unable to connect to sourceforge.net!</source> <target>Não foi possÃvel conectar a sourceforge.net!</target> + <source>A newer version of FreeFileSync is available:</source> <target>Uma nova versão do FreeFileSync está disponÃvel:</target> + <source>Download now?</source> <target>Baixar agora?</target> + <source>Information</source> <target>Informação</target> + <source>FreeFileSync is up to date!</source> <target>FreeFileSync está atualizado!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>Deseja que o FreeFileSync procure automaticamente novas versões toda semana?</target> + <source>(Requires an Internet connection!)</source> <target>(Requer conexão com a Internet!)</target> + <source>1. &Compare</source> <target>1. C&omparar</target> + <source>2. &Synchronize...</source> <target>2. S&incronizar...</target> + <source>S&witch view</source> <target>A<erar visualização</target> + <source>&New</source> <target>&Novo</target> + <source>&Program</source> <target>&Programa</target> + <source>&Language</source> <target>&Idioma</target> + <source>&Global settings...</source> <target>&Configurações...</target> + <source>&Create batch job...</source> <target>C&riar um arquivo batch...</target> + <source>&Export file list...</source> <target>&Exportar lista de arquivos...</target> + <source>&Advanced</source> <target>&Avançado</target> + <source>&Check for new version</source> <target>&Procurar novas versões</target> + <source>Compare</source> <target>Comparar</target> + <source>Compare both sides</source> <target>Comparar os dois lados</target> + <source>&Abort</source> <target>&Abortar</target> + <source>Synchronize...</source> <target>Sincronizar...</target> + <source>Start synchronization</source> <target>Iniciar sincronização</target> -<source>Swap sides</source> -<target>Inverter lados</target> + <source>Add folder pair</source> <target>Adicionar par de pastas</target> + <source>Remove folder pair</source> <target>Remover par de pastas</target> + +<source>Swap sides</source> +<target>Inverter lados</target> + <source>Save current configuration to file</source> <target>Salvar configuração atual para arquivo</target> + <source>Load configuration from file</source> <target>Carregar configuração do arquivo</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>Últimas configurações usadas (pressione DEL para remover da lista)</target> + <source>Hide excluded items</source> <target>Ocultar itens excluÃdos</target> + <source>Hide filtered or temporarily excluded files</source> <target>Ocultar arquivos filtrados ou temporariamente excluÃdos</target> + <source>Number of files and directories that will be created</source> <target>Número de arquivos e diretórios que serão criados</target> + <source>Number of files that will be overwritten</source> <target>Número de arquivos que serão substituÃdos</target> + <source>Number of files and directories that will be deleted</source> <target>Número de arquivos e diretórios que serão apagados</target> + <source>Total amount of data that will be transferred</source> <target>Volume total de dados que será transferido</target> -<source>Left</source> -<target>Esquerda</target> -<source>Right</source> -<target>Direita</target> + <source>Batch job</source> <target>Arquivo Batch</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>Cria um arquivo batch para sincronização automática. Para iniciar o modo batch, simplesmente dê um duplo click no arquivo ou execute via linha de comando: FreeFileSync.exe <arquivo batch>. Também pode ser agendado pelo agendador de tarefas do sistema operacional.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target>Cria um arquivo batch para sincronização automática. Para iniciar o modo batch, simplesmente dê um click-duplo no arquivo ou execute via linha de comando: FreeFileSync.exe <arquivo ffs_batch>. Também pode ser agendado no Agendador de Tarefas do sistema operacional.</target> + <source>Help</source> <target>Ajuda</target> + <source>Filter files</source> <target>Filtrar arquivos</target> + <source>Error handling</source> <target>Tratamento de erros</target> + +<source>Left</source> +<target>Esquerda</target> + +<source>Right</source> +<target>Direita</target> + <source>Overview</source> <target>Parâmetros</target> + <source>Status feedback</source> <target>Informação do Status</target> + <source>Run minimized</source> -<target></target> +<target>Executar minimizado</target> + <source>Maximum number of logfiles:</source> <target>Número máximo de arquivos de log:</target> + <source>Select logfile directory:</source> <target>Escolha um diretório para salvar o arquivo de log:</target> + <source>Batch settings</source> -<target></target> +<target>Configurações</target> + <source>&Save</source> <target>&Salvar</target> + <source>&Load</source> <target>&Carregar</target> + <source>&Cancel</source> <target>&Cancelar</target> + <source>Elements found:</source> <target>Elementos encontrados:</target> + <source>Elements remaining:</source> <target>Elementos faltantes:</target> + <source>Speed:</source> <target>Velocidade:</target> + <source>Time remaining:</source> <target>Tempo restante:</target> + <source>Time elapsed:</source> <target>Tempo passado:</target> + <source>Operation:</source> <target>Operação:</target> + <source>Select variant:</source> <target>Selecione um modo:</target> + <source><Automatic></source> <target><Automático></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>Identifica e propaga mudanças em ambos os lados utilizando um banco de dados. Exclusões e conflitos serão detectados automaticamente.</target> + <source>Mirror ->></source> <target>Espelhar ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Backup espelho da pasta da esquerda. A pasta da direita será modificada para ficar exatamente igual à pasta da esquerda após a sincronização.</target> + <source>Update -></source> <target>Atualizar -></target> + <source>Copy new or updated files to right folder.</source> <target>Copia arquivos novos ou atualizados para a pasta da direita</target> + <source>Custom</source> <target>Personalizado</target> + <source>Configure your own synchronization rules.</source> <target>Configure as suas próprias regras de sincronização.</target> + <source>Deletion handling</source> <target>Tratamento da exclusão</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>Configuração</target> + <source>Category</source> <target>Categoria</target> + <source>Action</source> <target>Ação</target> + <source>File/folder exists on left side only</source> <target>Arquivo/pasta existente somente no lado esquerdo</target> + <source>File/folder exists on right side only</source> <target>Arquivo/pasta existente somente no lado direito</target> + <source>Left file is newer</source> <target>Arquivo à esquerda é mais novo</target> + <source>Right file is newer</source> <target>Arquivo à direita é mais novo</target> + <source>Files have different content</source> <target>Arquivos possuem diferentes conteúdos</target> + <source>Conflict/file cannot be categorized</source> <target>Conflito/arquivo não pode ser categorizado</target> + <source>Compare by...</source> <target>Comparar por...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> <target> Os arquivos são considerados iguais se - - o tamanho - - e a data e hora da última modificação -são iguais + - data e hora de modificação e + - tamanho do arquivo +são os mesmos </target> -<source>File size and date</source> + +<source>File time and size</source> <target>Data e tamanho do arquivo</target> + <source> Files are found equal if - file content @@ -524,92 +761,85 @@ Os arquivos são considerados iguais se - o conteúdo do arquivo é o mesmo </target> + <source>File content</source> <target>Conteúdo do arquivo</target> + <source>Symbolic Link handling</source> <target>Tratamento de Links Simbólicos</target> + <source>Synchronizing...</source> <target>Sincronizando...</target> + <source>Elements processed:</source> <target>Elementos processados:</target> + <source>&Pause</source> <target>&Pausar</target> -<source>Compare by "File size and date"</source> -<target>Comparar por "Data e tamanho dos arquivos"</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>Esta variante avalia dois arquivos de nomes equivalentes como sendo iguais quando têm o mesmo tamanho E a mesma data e hora de modificação.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>Quando a comparação é iniciada com esta opção, a seguinte árvore de decisão é processada:</target> -<source>As a result the files are separated into the following categories:</source> -<target>Como resultado, os arquivos são separados nas seguintes categorias:</target> -<source>- equal</source> -<target>- igual</target> -<source>- left newer</source> -<target>- mais recente à esquerda</target> -<source>- right newer</source> -<target>- mais recente à direita</target> -<source>- exists left only</source> -<target>- existe apenas à esquerda</target> -<source>- exists right only</source> -<target>- existe apenas à direita</target> -<source>- conflict (same date, different size)</source> -<target>- conflito (mesma data, tamanho diferente)</target> -<source>Compare by "File content"</source> -<target>Comparar por "Conteúdo dos arquivos"</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. - -With this option enabled the decision tree is smaller: -</source> -<target> -Como o nome sugere, dois arquivos com o mesmo nome são assinalados como iguais se e somente se eles tiverem o mesmo conteúdo. Esta opção é útil para controles de consistência mais do que para efeitos de backup. Portanto, a data dos arquivos não é levada em consideração. -Com esta opção habilitada, a árvore de decisão é menor: -</target> -<source>- different</source> -<target>- diferente</target> <source>Source code written in C++ utilizing:</source> <target>Código-fonte escrito em C++ utilizando:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>Pela tradução do FreeFileSync, um agradecimento a:</target> + <source>Feedback and suggestions are welcome at:</source> <target>Comentários e sugestões são bem-vindos:</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync na Sourceforge</target> + <source>Homepage</source> <target>Homepage</target> + <source>If you like FFS</source> <target>Se você gosta do FFS</target> + <source>Donate with PayPal</source> <target>Doar usando PayPal</target> + <source>Email</source> <target>E-mail</target> + <source>Report translation error</source> <target>Reportar erro de tradução</target> + <source>Published under the GNU General Public License:</source> <target>Publicado sobre a GNU General Public License:</target> + <source>Ignore subsequent errors</source> <target>Ignorar erros subsequentes</target> + <source>Hide further error messages during the current process</source> <target>Ocultar próximas mensagens de erro durante este processo</target> + <source>&Ignore</source> <target>&Ignorar</target> + <source>&Retry</source> <target>&Tentar Novamente</target> + <source>Do not show this dialog again</source> <target>Não mostrar esse diálogo novamente</target> + <source>&Switch</source> <target>&Alterar</target> + <source>&Yes</source> <target>&Sim</target> + <source>&No</source> <target>&Não</target> + <source>Delete on both sides</source> <target>Apagar em ambos os lados</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>Apagar em ambos os lados mesmo se o arquivo está selecionado só em um lado</target> + <source>Use Recycle Bin</source> <target>Utilizar Lixeira</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -618,16 +848,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire Apenas arquivos/diretórios que satisfazem todos as configurações dos filtros serão selecionados para sincronização. Nota: O nome do filtro deve ser especificado relativo(!) ao diretório principal de sincronização. </target> + <source>Hints:</source> <target>Dicas:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. Entre os nomes dos arquivos ou diretórios relativos separados por ';' ou uma nova linha.</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. Use '*' e '?' como caracteres coringa.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. Exclua arquivos diretamente do grid principal através do menu de contexto.</target> + <source>Example</source> <target>Exemplo</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -636,180 +872,259 @@ Exclude: \stuff\temp\* Incluir: *.doc;*.zip;*.exe Excluir: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>Sincronizar todos arquivos .doc, .zip e .exe exceto tudo que estiver na subpasta "temp".</target> + <source>Include</source> <target>Incluir</target> + <source>Exclude</source> <target>Excluir</target> -<source>Select time span:</source> -<target>Selecionar o perÃodo de tempo:</target> -<source>Minimum file size:</source> -<target>Tamanho mÃnimo do arquivo:</target> -<source>Maximum file size:</source> -<target>Tamanho máximo do arquivo:</target> + +<source>Minimum file size</source> +<target>Tamanho mÃnimo do arquivo</target> + +<source>Maximum file size</source> +<target>Tamanho máximo do arquivo</target> + <source>&Default</source> <target>&Config. Padrão</target> + <source>Move column up</source> <target>Mover coluna para cima</target> + <source>Move column down</source> <target>Mover coluna para baixo</target> -<source>Transactional File Copy</source> -<target></target> + +<source>Transactional file copy</source> +<target>Cópia de arquivo transacional</target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> -<target></target> +<target>Copia os arquivos para um temporário (*.ffs_tmp) primeiro e depois os renomeia. Isso garante um estado consistente mesmo em situações de erro fatal.</target> + <source>Copy locked files</source> <target>Copiar arquivos bloqueados (em uso)</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) </source> <target> -Copiar arquivos compartilhados ou bloqueados (em uso) usando o Serviço de Cópias de Sombra de Volume +Copia os arquivos compartilhados ou bloqueados (em uso) usando o Serviço de Cópia de Sombra de Volume (Requer direitos de Administrador) </target> -<source>Copy filesystem permissions</source> -<target>Copiar permissões de arquivos e diretórios</target> + +<source>Copy file access permissions</source> +<target>Copiar permissões de acesso aos arquivos</target> + <source> Transfer file and directory permissions (Requires Administrator rights) </source> <target> -Transferir permissões de arquivos e diretórios +Transfere as permissões de arquivos e diretórios (Requer direitos de Administrador) </target> + <source>Hidden dialogs:</source> <target>Diálogos ocultados:</target> + <source>Reset</source> <target>Restaurar</target> + <source>Show hidden dialogs</source> <target>Mostrar diálogos ocultados</target> + <source>External applications</source> <target>Aplicações externas</target> + <source>Description</source> <target>Descrição</target> + <source>Variant</source> <target>Modo</target> + <source>Statistics</source> <target>EstatÃsticas</target> + <source>Find what:</source> <target>Localizar o que:</target> + <source>Match case</source> <target>Diferenciar maiúsculas e minúsculas</target> + <source>&Find next</source> <target>&Localizar próxima</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>Você pode tentar sincronizar os elementos restantes outra vez (SEM ter que comparar novamente)!</target> -<source>Batch file created successfully!</source> -<target>Arquivo batch criado com sucesso!</target> + <source>Main bar</source> <target>Barra principal</target> + <source>Folder pairs</source> <target>Pares de pastas</target> + <source>Select view</source> <target>Selecionar visualização</target> + <source>Set direction:</source> <target>Configurar direção</target> + <source>Exclude temporarily</source> <target>Excluir temporariamente</target> + <source>Include temporarily</source> <target>Incluir temporariamente</target> + <source>Exclude via filter:</source> <target>Excluir via filtro:</target> + <source><multiple selection></source> <target><seleção múltipla></target> + <source>D-Click</source> <target>Duplo Click</target> + <source>Delete</source> <target>Apagar</target> + <source>Customize...</source> <target>Personalizar...</target> + +<source>Select time span...</source> +<target>Selecionar perÃodo de tempo...</target> + <source>Auto-adjust columns</source> <target>Autoajustar colunas</target> + <source>Include all rows</source> <target>Incluir todas as linhas</target> + <source>Exclude all rows</source> <target>Excluir todas as linhas</target> + <source>Reset view</source> <target>Restaurar visualização</target> + <source>Show "%x"</source> <target>Mostrar "%x"</target> + <source><Last session></source> <target><Última sessão></target> + <source>Configuration saved!</source> <target>Configuração salva!</target> + <source>Save changes to current configuration?</source> <target>Salvar modificações para a configuração atual?</target> + <source>Configuration loaded!</source> <target>Configuração carregada!</target> + <source>Folder Comparison and Synchronization</source> <target>Comparação e Sincronização de Pastas</target> + <source>Hide files that exist on left side only</source> <target>Ocultar arquivos que existem somente à esquerda</target> + <source>Show files that exist on left side only</source> <target>Mostrar arquivos que existem somente à esquerda</target> + <source>Hide files that exist on right side only</source> <target>Ocultar arquivos que existem somente à direita</target> + <source>Show files that exist on right side only</source> <target>Mostrar arquivos que existem somente à direita</target> + <source>Hide files that are newer on left</source> <target>Ocultar arquivos que são mais recentes à esquerda</target> + <source>Show files that are newer on left</source> <target>Mostrar arquivos que são mais recentes à esquerda</target> + <source>Hide files that are newer on right</source> <target>Ocultar arquivos que são mais recentes à direita</target> + <source>Show files that are newer on right</source> <target>Mostrar arquivos que são mais recentes à direita</target> + <source>Hide files that are equal</source> <target>Ocultar arquivos que são iguais</target> + <source>Show files that are equal</source> <target>Mostrar arquivos que são iguais</target> + <source>Hide files that are different</source> <target>Ocultar arquivos que são diferentes</target> + <source>Show files that are different</source> <target>Mostrar arquivos que são diferentes</target> + <source>Hide conflicts</source> <target>Ocultar conflitos</target> + <source>Show conflicts</source> <target>Mostrar conflitos</target> + <source>Hide files that will be created on the left side</source> <target>Ocultar arquivos que serão criados no lado esquerdo</target> + <source>Show files that will be created on the left side</source> <target>Mostrar arquivos que serão criados no lado esquerdo</target> + <source>Hide files that will be created on the right side</source> <target>Ocultar arquivos que serão criados no lado direito</target> + <source>Show files that will be created on the right side</source> <target>Mostrar arquivos que serão criados no lado direito</target> + <source>Hide files that will be deleted on the left side</source> <target>Ocultar arquivos que serão apagados no lado esquerdo</target> + <source>Show files that will be deleted on the left side</source> <target>Mostrar arquivos que serão apagados no lado esquerdo</target> + <source>Hide files that will be deleted on the right side</source> <target>Ocultar arquivos que serão apagados no lado direito</target> + <source>Show files that will be deleted on the right side</source> <target>Mostrar arquivos que serão apagados no lado direito</target> + <source>Hide files that will be overwritten on left side</source> <target>Ocultar arquivos que serão substituÃdos no lado esquerdo</target> + <source>Show files that will be overwritten on left side</source> <target>Mostrar arquivos que serão substituÃdos no lado esquerdo</target> + <source>Hide files that will be overwritten on right side</source> <target>Ocultar arquivos que serão substituÃdos no lado direito</target> + <source>Show files that will be overwritten on right side</source> <target>Mostrar arquivos que serão substituÃdos no lado direito</target> + <source>Hide files that won't be copied</source> <target>Ocultar arquivos que não serão copiados</target> + <source>Show files that won't be copied</source> <target>Mostrar arquivos que não serão copiados</target> + <source>All directories in sync!</source> <target>Todos os diretórios em sincronismo!</target> + <source>Please run a Compare first before synchronizing!</source> <target>Por favor execute primeiro a Comparação antes de sincronizar!</target> + <source>Comma separated list</source> <target>Lista de itens separada por vÃrgula</target> + <source>Legend</source> <target>Legenda</target> + <source>File list exported!</source> <target>Lista de arquivos exportada!</target> + +<source>Batch file created successfully!</source> +<target>Arquivo batch criado com sucesso!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -818,6 +1133,7 @@ Transferir permissões de arquivos e diretórios <pluralform>Objeto apagado com sucesso!</pluralform> <pluralform>%x objetos apagados com sucesso!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -826,6 +1142,7 @@ Transferir permissões de arquivos e diretórios <pluralform>1 diretório</pluralform> <pluralform>%x diretórios</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -834,6 +1151,7 @@ Transferir permissões de arquivos e diretórios <pluralform>1 arquivo</pluralform> <pluralform>%x arquivos</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -842,72 +1160,97 @@ Transferir permissões de arquivos e diretórios <pluralform>%x de 1 linha</pluralform> <pluralform>%x de %y linhas</pluralform> </target> + <source>Scanning...</source> <target>Pesquisando...</target> + <source>Comparing content...</source> <target>Comparando conteúdo...</target> + <source>Paused</source> <target>Pausado</target> + <source>Aborted</source> <target>Cancelado</target> + <source>Completed</source> <target>Finalizado</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>Cancelar solicitado: Esperando fim da operação...</target> + <source>Continue</source> <target>Continuar</target> + <source>Pause</source> <target>Pausar</target> + <source>Cannot find %x</source> <target>Não foi possÃvel encontrar %x</target> -<source>DECISION TREE</source> -<target>ÃRVORE DE DECISÃO</target> -<source>file exists on both sides</source> -<target>arquivo existe em ambos os lados</target> -<source>on one side only</source> -<target>existente apenas em um lado</target> -<source>same date</source> -<target>mesma data</target> -<source>different date</source> -<target>data diferente</target> + <source>Inactive</source> <target>Inativo</target> -<source>Second</source> -<target>Segundo</target> -<source>Minute</source> -<target>Minuto</target> -<source>Hour</source> -<target>Hora</target> -<source>Day</source> -<target>Dia</target> + +<source>Last x hours</source> +<target>Últimas x horas</target> + +<source>Today</source> +<target>Hoje</target> + +<source>This week</source> +<target>Esta semana</target> + +<source>This month</source> +<target>Este mês</target> + +<source>This year</source> +<target>Este ano</target> + <source>Byte</source> <target>Byte</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>Filtro: Todos os pares</target> + <source>Filter: Single pair</source> <target>Filtro: Apenas um par</target> + <source>Ignore</source> <target>Ignorar</target> + <source>Direct</source> <target>Direcionar</target> + <source>Follow</source> <target>Seguir</target> + +<source>Copy NTFS permissions</source> +<target>Copiar permissões NTFS</target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>Integrar aplicações externas no menu de contexto. As seguintes macros estão disponÃveis:</target> + <source>- full file or directory name</source> <target>- nome completo do arquivo ou diretório</target> + <source>- directory part only</source> <target>- apenas a parte do diretório</target> + <source>- Other side's counterpart to %name</source> <target>- Correspondente do outro lado a %name</target> + <source>- Other side's counterpart to %dir</source> <target>- Correspondente do outro lado a %dir</target> + <source>Restore all hidden dialogs?</source> <target>Restaurar todos os diálogos ocultados?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -916,6 +1259,7 @@ Transferir permissões de arquivos e diretórios <pluralform>Você tem certeza que deseja mover o seguinte objeto para a Lixeira?</pluralform> <pluralform>Você tem certeza que deseja mover os seguintes %x objetos para a Lixeira?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -924,139 +1268,211 @@ Transferir permissões de arquivos e diretórios <pluralform>Você tem certeza que deseja apagar o seguinte objeto?</pluralform> <pluralform>Você tem certeza que deseja apagar os seguintes %x objetos?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>Deixar como conflito não resolvido</target> + <source>Delete permanently</source> <target>Apagar permanentemente</target> + <source>Delete or overwrite files permanently</source> <target>Apagar ou substituir arquivos permanentemente</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>Usar a Lixeira quando apagar ou substituir arquivos</target> + <source>Versioning</source> <target>Controle de versões</target> + <source>Move files into a time-stamped subdirectory</source> <target>Mover arquivos para um subdiretório com carimbo de tempo</target> -<source>Cannot determine sync-direction:</source> -<target>Não foi possÃvel determinar a direção de sincronização:</target> -<source>Filter settings have changed!</source> -<target>As configurações do filtro foram alteradas!</target> + <source>Both sides have changed since last synchronization!</source> <target>Ambos os lados foram alterados desde a última sincronização!</target> + +<source>Cannot determine sync-direction:</source> +<target>Não foi possÃvel determinar a direção de sincronização:</target> + <source>No change since last synchronization!</source> <target>Nenhuma mudança desde a última sincronização!</target> + +<source>Filter settings have changed!</source> +<target>As configurações do filtro foram alteradas!</target> + <source>The file was not processed by last synchronization!</source> <target>O arquivo não foi processado pela última sincronização!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>O diretório a ser apagado está em conflito com seus subdiretórios e -arquivos!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Configurando direções padrões de sincronização: Arquivos antigos serão substituÃdos por arquivos mais novos.</target> + <source>The file does not contain a valid configuration:</source> <target>O arquivo não contém uma configuração válida:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>Você pode ignorar esse erro para considerar o diretório como vazio.</target> + <source>Directory does not exist:</source> <target>Diretório não existe:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Diretórios são dependentes! Cuidado ao definir as regras de sincronização:</target> + <source>Comparing content of files %x</source> <target>Comparando conteúdo do arquivo %x</target> + <source>Memory allocation failed!</source> <target>Alocação de memória falhou!</target> + <source>File %x has an invalid date!</source> <target>Arquivo %x tem uma data inválida!</target> + <source>Conflict detected:</source> <target>Conflito detectado:</target> + <source>Files %x have the same date but a different size!</source> <target>Arquivos %x têm a mesma data mas tamanhos diferentes!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>Links Simbólicos %x têm a mesma data mas um destino diferente!</target> + <source>Comparing files by content failed.</source> <target>Comparação de arquivos pelo conteúdo falhou.</target> + <source>Generating file list...</source> <target>Gerando lista de arquivos...</target> + <source>Multiple...</source> <target>Múltiplos...</target> + <source>Both sides are equal</source> <target>Ambos os lados são iguais</target> + <source>Files/folders differ in attributes only</source> <target>Arquivos/pastas se diferenciam apenas nos atributos</target> + <source>Copy new file/folder to left</source> <target>Copiar arquivos/pastas novos para a esquerda</target> + <source>Copy new file/folder to right</source> <target>Copiar arquivos/pastas novos para a direita</target> + <source>Delete left file/folder</source> <target>Apagar arquivos/pastas da esquerda</target> + <source>Delete right file/folder</source> <target>Apagar arquivos/pastas da direita</target> + <source>Overwrite left file/folder with right one</source> <target>Substituir arquivos/pastas da esquerda pelos da direita</target> + <source>Overwrite right file/folder with left one</source> <target>Substituir arquivos/pastas da direita pelos da esquerda</target> + <source>Do nothing</source> <target>Não fazer nada</target> + <source>Copy file attributes only to left</source> <target>Copiar apenas os atributos do arquivo para a esquerda</target> + <source>Copy file attributes only to right</source> <target>Copiar apenas os atributos do arquivo para a direita</target> + <source>Deleting file %x</source> <target>Apagando arquivo %x</target> -<source>Deleting Symbolic Link %x</source> -<target>Apagando Link Simbólico %x</target> + <source>Deleting folder %x</source> <target>Apagando pasta %x</target> -<source>Moving %x to Recycle Bin</source> -<target>Movendo %x para a Lixeira</target> -<source>Moving file %x to user-defined directory %y</source> -<target>Movendo arquivo %x para o diretório especificado %y</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>Movendo pasta %x para o diretório especificado %y</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>Movendo Link Simbólico %x para o diretório especificado %y</target> -<source>Copying new file %x to %y</source> -<target>Copiando novo arquivo %x para %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>Copiando novo Link Simbólico %x para %y</target> -<source>Overwriting file %x in %y</source> -<target>Substituindo arquivo %x em %y</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>Substituindo Link Simbólico %x em %y</target> + +<source>Deleting symbolic link %x</source> +<target>Apagando link simbólico %x</target> + +<source>Moving file %x to recycle bin</source> +<target>Movendo arquivo %x para a lixeira</target> + +<source>Moving folder %x to recycle bin</source> +<target>Movendo pasta %x para a lixeira</target> + +<source>Moving symbolic link %x to recycle bin</source> +<target>Movendo link simbólico %x para a lixeira</target> + +<source>Moving file %x to %y</source> +<target>Movendo arquivo %x para %y</target> + +<source>Moving folder %x to %y</source> +<target>Movendo pasta %x para %y</target> + +<source>Moving symbolic link %x to %y</source> +<target>Movendo link simbólico %x para %y</target> + +<source>Creating file %x</source> +<target>Criando arquivo %x</target> + +<source>Creating symbolic link %x</source> +<target>Criando link simbólico %x</target> + <source>Creating folder %x</source> <target>Criando pasta %x</target> + +<source>Overwriting file %x</source> +<target>Substituindo arquivo %x</target> + +<source>Overwriting symbolic link %x</source> +<target>Substituindo link simbólico %x</target> + <source>Verifying file %x</source> <target>Verificando arquivo %x</target> + <source>Updating attributes of %x</source> <target>Atualizando atributos de %x</target> -<source>Source directory does not exist anymore:</source> -<target>Diretório de origem não existe mais:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>Nada para sincronizar de acordo com a configuração!</target> + <source>Target directory name must not be empty!</source> <target>Nome do diretório de destino não pode estar vazio!</target> + <source>User-defined directory for deletion was not specified!</source> <target>Diretório especificado para arquivos apagados não foi definido!</target> + +<source>Source directory does not exist anymore:</source> +<target>Diretório de origem não existe mais:</target> + <source>Unresolved conflicts existing!</source> <target>Conflitos não resolvidos existentes!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>Você pode ignorar os conflitos e continuar a sincronização.</target> + <source>Significant difference detected:</source> <target>Diferença significativa detectada:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>Mais de 50% do número total de arquivos será copiado ou apagado!</target> + <source>Not enough free disk space available in:</source> <target>Espaço em disco insuficiente em:</target> + <source>Free disk space required:</source> <target>Espaço livre em disco requerido:</target> + <source>Free disk space available:</source> <target>Espaço livre em disco:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target></target> +<target>A Lixeira não está disponÃvel para os seguintes caminhos! Os arquivos serão apagados permanentemente:</target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>Um diretório que faz parte de múltiplos pares de pastas será modificado! Por favor revise suas configurações de sincronização!</target> + <source>Processing folder pair:</source> <target>Processando par de pastas:</target> + <source>Generating database...</source> <target>Gerando banco de dados...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>Nada para sincronizar de acordo com a configuração!</target> + <source>Error copying locked file %x!</source> <target>Erro ao copiar arquivo bloqueado %x!</target> + <source>Data verification error: Source and target file have different content!</source> <target>Erro de verificação de dados: Arquivo de origem e destino têm o mesmo conteúdo!</target> + diff --git a/BUILD/Languages/romanian.lng b/BUILD/Languages/romanian.lng index bde4caf7..a2c21e54 100644 --- a/BUILD/Languages/romanian.lng +++ b/BUILD/Languages/romanian.lng @@ -8,75 +8,116 @@ </header> <source>Searching for directory %x...</source> -<target></target> +<target>Caut dosarul %x...</target> + <source>Show in Explorer</source> <target>Arată în Explorator</target> + <source>Open with default application</source> <target>Deschide cu AplicaÈ›ia Implicită</target> + <source>Browse directory</source> <target>Explorează Dosarul</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Sincronizare Inteligentă</target> + <source>Browse</source> <target>Explorează</target> -<source>Invalid commandline: %x</source> + +<source>Invalid command line: %x</source> <target>Linie de comandă nevalidă: %x</target> + <source>Error resolving symbolic link:</source> <target>Eroare la rezolvarea legăturii simbolice:</target> -<source>Show popup</source> -<target>Arată casete de dialog</target> -<source>Show popup on errors or warnings</source> -<target>Este arătată o casetă de dialog pentru fiecare eroare sau avertisment</target> + +<source>Show pop-up</source> +<target>Este arătat un popîc</target> + +<source>Show pop-up on errors or warnings</source> +<target>Se afiÈ™ează o fereastră popîc [popup] la erori sau avertizări</target> + <source>Ignore errors</source> -<target>Ignoră erorile</target> +<target>Erorile sînt ignorate</target> + <source>Hide all error and warning messages</source> <target>Sînt ascunse toate mesajele de eroare È™i de avertizare</target> + <source>Exit instantly</source> <target>IeÈ™i imediat</target> + <source>Abort synchronization immediately</source> <target>Abandonează imediat sincronizarea</target> + +<source>Select alternate comparison settings</source> +<target>Selectează setările alternative de comparare</target> + <source>Select alternate synchronization settings</source> <target>Selectează o altă configuraÈ›ie a sincronizării</target> + <source>No filter selected</source> <target>Nu a fost selectat nici un filtru</target> + <source>Filter is active</source> <target>Filtrul este activ</target> -<source>Clear filter settings</source> -<target>Curăță Setările Filtrului</target> + <source>Remove alternate settings</source> <target>ÃŽnlătură setările alternative</target> + +<source>Clear filter settings</source> +<target>Curăță Setările Filtrului</target> + <source>Create a batch job</source> <target>Creează o Sarcină Set</target> + <source>Synchronization settings</source> <target>Setările Sincronizării</target> + <source>Comparison settings</source> <target>Setările Comparării</target> + <source>About</source> <target>Despre</target> + <source>Error</source> <target>Eroare</target> + <source>Warning</source> <target>AtenÈ›ie</target> + <source>Question</source> <target>ÃŽntrebare</target> + <source>Confirm</source> <target>Confirmare</target> + <source>Configure filter</source> <target>Configurează Filtrul</target> + <source>Customize columns</source> <target>Personalizează coloanele</target> + <source>Global settings</source> <target>Setări Globale</target> + <source>Synchronization Preview</source> <target>Previzionarea Sincronizării</target> + <source>Find</source> <target>GăseÈ™te</target> + +<source>Select time span</source> +<target>Selectează intervalul de timp</target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -86,46 +127,64 @@ <pluralform>%x BaiÈ›i</pluralform> <pluralform>%x de BaiÈ›i</pluralform> </target> + <source><Symlink></source> <target><Simlegătură></target> + <source><Directory></source> <target><Dosar></target> + <source>Size</source> <target>Mărime</target> + <source>Date</source> <target>Dată</target> + <source>Full path</source> <target>Cale completă</target> + <source>Filename</source> <target>Numele Elementului</target> + <source>Relative path</source> <target>Calea Relativă</target> + <source>Directory</source> <target>Dosar</target> + <source>Extension</source> <target>Extensie</target> + <source>Comparison Result</source> <target>Rezultatul Comparării</target> + <source>Incompatible synchronization database format:</source> <target>Format al bazei de date necompatibil cu versiunea softului:</target> + <source>Initial synchronization:</source> <target>Sincronizare iniÈ›ială:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>Una dintre părÈ›i nu are o filă de tip bază de date FreeFileSync:</target> + <source>Error reading from synchronization database:</source> <target>Eroare la citirea din baza de date a sincronizării:</target> + <source>Database files do not share a common synchronization session:</source> -<target></target> +<target>Filele bază de date nu partajează o sesiune comună de sincronizare</target> + <source>An exception occurred!</source> <target>A apărut o excepÈ›ie !</target> -<source>Error deleting file:</source> -<target>Eroare la È™tergerea filei:</target> + <source>Error reading file attributes:</source> <target>Eroare la citirea atributelor filei:</target> + <source>Waiting while directory is locked (%x)...</source> <target>AÈ™tept ca dosarul să fie zăvorît (%x)...</target> + <source>Error setting directory lock:</source> <target>Eroare la efectuarea zăvorîrii dosarului:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -135,27 +194,41 @@ <pluralform>%x sec</pluralform> <pluralform>%x de sec</pluralform> </target> + <source>Info</source> <target>InformaÈ›ii</target> + <source>Fatal Error</source> <target>Eroare Fatală</target> + <source>Scanning:</source> <target>Scanez:</target> + <source>Encoding extended time information: %x</source> <target>Codarea informaÈ›iilor timpului extins: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> -<target></target> +<target> +<pluralform>[1 Fir]</pluralform> +<pluralform>[%x Fire]</pluralform> +<pluralform>[%x de Fire]</pluralform> +</target> + <source>Invalid FreeFileSync config file!</source> <target>Filă de configurare FreeFileSync nevalidă!</target> + <source>File does not exist:</source> <target>Fila nu există:</target> + <source>Error parsing configuration file:</source> <target>Eroare la parsarea filei de configurare:</target> + <source>/sec</source> <target>/sec</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -165,6 +238,7 @@ <pluralform>%x min</pluralform> <pluralform>%x de min</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -174,6 +248,7 @@ <pluralform>%x ore</pluralform> <pluralform>%x de ore</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -183,28 +258,40 @@ <pluralform>%x zile</pluralform> <pluralform>%x de zile</pluralform> </target> + <source>S&ave configuration...</source> <target>S&alvează ConfiguraÈ›ia...</target> + <source>&Load configuration...</source> <target>&Deschide ConfiguraÈ›ia...</target> + <source>&Quit</source> <target>&IeÈ™i</target> + <source>&File</source> <target>&Filă</target> + <source>&Content</source> <target>&ConÈ›inut</target> + <source>&About...</source> <target>&Despre...</target> + <source>&Help</source> <target>&Ajutor</target> + <source>Usage:</source> <target>Utilizare:</target> + <source>1. Select directories to monitor.</source> <target>1. Selectează dosarele de monitorizat.</target> + <source>2. Enter a command line.</source> <target>2. Scrie calea.</target> + <source>3. Press 'Start'.</source> <target>3. Apasă 'PorneÈ™te'.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -215,310 +302,461 @@ Linia de comandă este executată de fiecare dată cînd: - toate dosarele devin disponibile (de ex. se introduce un dispozitiv USB) - filele conÈ›inute în aceste dosare sau subdosare sînt modificate </target> + <source>Directories to watch</source> <target>Dosare de monitorizat</target> + <source>Add folder</source> <target>Adaugă Dosar</target> + <source>Remove folder</source> <target>ÃŽnlătură Dosarul</target> + <source>Select a folder</source> -<target>Selectează un dosar</target> +<target>Selectează un Dosar</target> + <source>Command line</source> <target>Linie de comandă</target> + <source>Minimum Idle Time [seconds]</source> <target>Timp Minim de Inactivitate [secunde]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>Timp de inactivitate (în secunde) între detectarea ultimei modificări È™i executarea liniei de comandă</target> + <source>Start</source> <target>PorneÈ™te</target> + <source>(Build: %x)</source> <target>(CompilaÈ›ia: %x)</target> + <source>RealtimeSync configuration</source> <target>ConfiguraÈ›ia RealtimeSync</target> + <source>File already exists. Overwrite?</source> <target>Fila există deja. Vrei s-o suprascrii?</target> + <source>&Restore</source> <target>&Restaurează</target> + <source>&Exit</source> <target>&IeÈ™i</target> + <source>Monitoring active...</source> <target>Monitorizare activă...</target> + <source>Waiting for missing directories...</source> <target>AÈ™tept ca dosarele lipsă să devină disponibile...</target> + <source>A directory input field is empty.</source> <target>Cel puÈ›in unul din dosarele de comparat este nespecificat.</target> + <source>Drag && drop</source> -<target>Trage un dosar peste compartimentul de mai jos sau foloseÈ™te butonul Explorează</target> +<target>Trage È™i lasă un dosar peste compartimentul de mai jos sau selectează-l cu butonul de explorare</target> + <source>Could not initialize directory monitoring:</source> <target>Nu pot iniÈ›ializa monitorizarea dosarelor:</target> + <source>Error when monitoring directories.</source> <target>Eroare la monitorizarea dosarelor.</target> + <source>Conversion error:</source> <target>Eroare de convertire:</target> + +<source>Error deleting file:</source> +<target>Eroare la È™tergerea filei:</target> + <source>Error moving file:</source> <target>Eroare la mutarea filei:</target> + <source>Target file already existing!</source> <target>Fila È›intă există deja!</target> + <source>Error moving directory:</source> <target>Eroare la mutarea dosarului:</target> + <source>Target directory already existing!</source> <target>Dosarul È›intă există deja!</target> + <source>Error deleting directory:</source> <target>Eroare la È™tergerea dosarului:</target> + <source>Error changing modification time:</source> <target>Eroare la schimbarea datei de modificare:</target> + <source>Error loading library function:</source> <target>Eroare la încărcarea bibliotecii de funcÈ›ii:</target> + <source>Error reading security context:</source> <target>Eroare la citirea contextului de securitate:</target> + <source>Error writing security context:</source> <target>Eroare la scrierea contextului de securitate:</target> + <source>Error copying file permissions:</source> <target>Eroare la copierea permisiunilor filei:</target> + <source>Error creating directory:</source> <target>Eroare la crearea dosarului:</target> + <source>Error copying symbolic link:</source> <target>Eroare la copierea legăturii simbolice:</target> + <source>Error copying file:</source> <target>Eroare la copierea filei:</target> + <source>Error opening file:</source> <target>Eroare la deschiderea filei:</target> + <source>Error writing file:</source> <target>Eroare la scrierea filei:</target> + <source>Error reading file:</source> <target>Eroare la citirea filei:</target> + <source>Operation aborted!</source> <target>OperaÈ›ie abandonată!</target> + +<source>Could not load a required DLL:</source> +<target>Nu pot încărca o filă DLL necesară:</target> + <source>Endless loop when traversing directory:</source> <target>Buclă infinită la parcurgerea dosarului:</target> + <source>Error traversing directory:</source> <target>Eroare la parcurgerea dosarului:</target> + <source>Windows Error Code %x:</source> <target>Codul Erorii Windows %x:</target> + <source>Linux Error Code %x:</source> <target>Codul Erorii Linux %x:</target> + <source>Error setting privilege:</source> <target>Eroare la setarea privilegiului:</target> + <source>Error moving to Recycle Bin:</source> <target>Eroare la mutarea în Reciclator:</target> -<source>Could not load a required DLL:</source> -<target>Nu pot încărca o filă DLL necesară:</target> + <source>Error writing to synchronization database:</source> <target>Eroare la scrierea în baza de date a sincronizării:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>Eroare la pornirea serviciului Volume Shadow Copy!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target>Eroare la accesarea Serviciului de Conservare a Volumelor [Volume Shadow Copy]!</target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> -<target>Realizarea de copii de rezervă prin sistemul WOW64 nu este suportată. FoloseÈ™te versiunea pe 64-biÈ›i a FreeFileSync.</target> +<target>Realizarea de conservări (copii de rezervă) prin sistemul WOW64 nu este suportată. FoloseÈ™te versiunea pe 64-biÈ›i a FreeFileSync.</target> + <source>Could not determine volume name for file:</source> <target>Nu pot determina numele volumului pentru fila:</target> + <source>Volume name %x not part of filename %y!</source> <target>Numele volumului %x nu face parte din numele filei %y !</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>Nu pot citi valorile pentru următoarele noduri XML:</target> + <source>Logging</source> <target>Jurnalizez</target> + <source>FreeFileSync batch file</source> <target>Filă cu set de comenzi FreeFileSync</target> + <source>FreeFileSync configuration</source> <target>ConfiguraÈ›ie FreeFileSync</target> + <source>FreeFileSync Batch Job</source> <target>Sarcină cu set de comenzi FreeFileSync</target> + <source>Unable to create logfile!</source> <target>Fila jurnal nu poate fi creată!</target> + <source>Batch execution</source> <target>Execută Fila Set</target> + <source>Log-messages:</source> <target>Mesaje de jurnalizare:</target> + <source>Stop</source> <target>OpreÈ™te</target> + <source>Total time:</source> <target>Timp Total:</target> + <source>Synchronization aborted!</source> <target>Sincronizare abandonată!</target> + <source>Synchronization completed with errors!</source> <target>Sincronizare terminată cu erori!</target> + <source>Synchronization completed successfully!</source> <target>Sincronizare terminată cu succes!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>Apasă "Comută" pentru a deschide modul grafic al FreeFileSync</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>Comut la modul grafic al FreeFileSync...</target> + <source>Unable to connect to sourceforge.net!</source> <target>Conectarea la situl sourceforge.net nu poate fi realizată!</target> + <source>A newer version of FreeFileSync is available:</source> <target>Este disponibilă o versiune nouă a softului:</target> + <source>Download now?</source> <target>Vrei s-o descarci acum ?</target> + <source>Information</source> <target>InformaÈ›ii</target> + <source>FreeFileSync is up to date!</source> <target>Ai deja ultima versiune a softului!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>Vrei ca FreeFileSync să caute automat actualizări în fiecare săptămînă ?</target> + <source>(Requires an Internet connection!)</source> <target>(Necesită o conexiune la internet!)</target> + <source>1. &Compare</source> <target>1. &Compară</target> + <source>2. &Synchronize...</source> <target>2. &Sincronizează...</target> + <source>S&witch view</source> <target>Schimbă &Vederea</target> + <source>&New</source> <target>ConfiguraÈ›ie &Nouă</target> + <source>&Program</source> <target>&Program</target> + <source>&Language</source> <target>&Limbă</target> + <source>&Global settings...</source> <target>&Setări Globale...</target> + <source>&Create batch job...</source> <target>&Creează o Sarcină Set...</target> + <source>&Export file list...</source> <target>&Exportă Lista de File...</target> + <source>&Advanced</source> <target>&Avansate</target> + <source>&Check for new version</source> <target>&Caută Versiune Nouă a Softului</target> + <source>Compare</source> <target>Compară</target> + <source>Compare both sides</source> <target>Compară PărÈ›ile Stîngă È™i Dreaptă</target> + <source>&Abort</source> <target>&Anulează</target> + <source>Synchronize...</source> <target>Sincronizează</target> + <source>Start synchronization</source> <target>PorneÈ™te Sincronizarea</target> -<source>Swap sides</source> -<target>Schimbă compartimentele stîng È™i drept între ele</target> + <source>Add folder pair</source> <target>Adaugă Pereche Nouă de Dosare</target> + <source>Remove folder pair</source> <target>ÃŽnlătură Perechea de Dosare</target> + +<source>Swap sides</source> +<target>Schimbă compartimentele stîng È™i drept între ele</target> + <source>Save current configuration to file</source> <target>Salvează într-o filă modificările configuraÈ›iei curente</target> + <source>Load configuration from file</source> -<target>ÃŽncarcă configuraÈ›ia dintr-o filă</target> +<target>Deschide configuraÈ›ia dintr-o filă</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>Ultimele configuraÈ›ii utilizate (apasă tasta DEL pentru a înlătura din listă)</target> + <source>Hide excluded items</source> -<target>Ascunde itemurile excluse</target> +<target>Ascunde elementele excluse</target> + <source>Hide filtered or temporarily excluded files</source> <target>Ascunde elementele (file/dosare) filtrate sau excluse temporar</target> + <source>Number of files and directories that will be created</source> <target>Numărul de file È™i dosare care vor fi create</target> + <source>Number of files that will be overwritten</source> <target>Numărul de file care vor fi suprascrise</target> + <source>Number of files and directories that will be deleted</source> <target>Numărul de file È™i dosare care vor fi È™terse</target> + <source>Total amount of data that will be transferred</source> <target>Volumul total de date care va fi transferat</target> -<source>Left</source> -<target>Stînga</target> -<source>Right</source> -<target>Dreapta</target> + <source>Batch job</source> <target>Sarcină Set</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>PoÈ›i crea o filă ce include un set de comenzi [batch file], în scopul folosirii ei la sincronizarea inteligentă. Pentru a porni în modul set, dublu-clichează fila sau execut-o folosind linia de comandă: FreeFileSync.exe <filaset>. Această operaÈ›ie poate fi programată în planificatorul de sarcini al sistemului de operare [task scheduler].</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target>Crearea unei file set [batch file] pentru sincronizarea inteligentă (automatizată). Pentru a porni în modul set de comenzi, trebuie dublu-clicată fila sau executată prin linia de comandă următoare: FreeFileSync.exe <ffs_batch file>. OperaÈ›ia poate fi de asemenea planificată cu ajutorul Planificatorului de Sarcini [Task Scheduler] din sistemul de operare.</target> + <source>Help</source> <target>Ajutor</target> + <source>Filter files</source> -<target>Filtru de File</target> +<target>Filtru de Elemente</target> + <source>Error handling</source> <target>Gestionarea Erorilor</target> + +<source>Left</source> +<target>Stînga</target> + +<source>Right</source> +<target>Dreapta</target> + <source>Overview</source> <target>Panoramă</target> + <source>Status feedback</source> <target>AfiÈ™area Stării</target> + <source>Run minimized</source> -<target></target> +<target>Rulare minimizată</target> + <source>Maximum number of logfiles:</source> <target>Numărul maxim de file jurnal:</target> + <source>Select logfile directory:</source> <target>Selectează un dosar pentru fila .log:</target> + <source>Batch settings</source> -<target></target> +<target>Setările Setului de Comenzi</target> + <source>&Save</source> <target>&Salvează</target> + <source>&Load</source> <target>&Deschide</target> + <source>&Cancel</source> <target>&Anulează</target> + <source>Elements found:</source> <target>Elemente Găsite:</target> + <source>Elements remaining:</source> <target>Elemente Rămase:</target> + <source>Speed:</source> <target>Viteză:</target> + <source>Time remaining:</source> <target>Timp Rămas:</target> + <source>Time elapsed:</source> <target>Timp Scurs:</target> + <source>Operation:</source> <target>OperaÈ›ie:</target> + <source>Select variant:</source> <target>Selectează Varianta de Sincronizare:</target> + <source><Automatic></source> <target><Sincronizare Inteligentă></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> -<target>Identifică È™i propagă modificările în ambele părÈ›i folosind o bază de date. Ștergerile È™i conflictele sînt detectate automat.</target> +<target>Modificările din ambele părÈ›i sînt identificate È™i propagate folosind o bază de date. Ștergerile È™i conflictele sînt detectate automat.</target> + <source>Mirror ->></source> <target>Clonare =>></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Conservare [backup] în oglindă a dosarului stîng. Dosarul drept e modificat pentru a fi identic după sincronizare cu cel stîng.</target> + <source>Update -></source> <target>Actualizare =></target> + <source>Copy new or updated files to right folder.</source> <target>Copiază în dosarul din dreapta filele actualizate sau noi.</target> + <source>Custom</source> <target>Sincronizare Personalizată</target> + <source>Configure your own synchronization rules.</source> <target>Reguli de sincronizare definite de utilizator pentru fiecare situaÈ›ie.</target> + <source>Deletion handling</source> <target>Gestionarea Ștergerii</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>ConfiguraÈ›ie</target> + <source>Category</source> <target>Categorie</target> + <source>Action</source> <target>AcÈ›iune</target> + <source>File/folder exists on left side only</source> <target>Fila/Dosarul există doar în partea stîngă</target> + <source>File/folder exists on right side only</source> <target>Fila/Dosarul există doar în partea dreaptă</target> + <source>Left file is newer</source> <target>Fila stîngă e mai nouă</target> + <source>Right file is newer</source> <target>Fila dreaptă e mai nouă</target> + <source>Files have different content</source> <target>Filele au conÈ›inut diferit</target> + <source>Conflict/file cannot be categorized</source> -<target>Conflictul/Fila nu pot fi incluse într-o anumită categorie</target> +<target>Conflictul de file nu poate fi inclus într-o anumită categorie</target> + <source>Compare by...</source> <target>Compară după:</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> <target> Filele sînt considerate identice dacă - - mărimea - - È™i data ultimei modificări -sînt identice + - data È™i ora ultimei scrieri + - mărimea filelor +sînt aceleaÈ™i </target> -<source>File size and date</source> -<target>Mărimea È™i Data Filelor</target> + +<source>File time and size</source> +<target>Timpul È™i Mărimea Filelor</target> + <source> Files are found equal if - file content @@ -526,113 +764,112 @@ is the same </source> <target> Filele sînt considerate identice dacă - - conÈ›inutul -este identic + - conÈ›inutul filelor +este acelaÈ™i </target> + <source>File content</source> <target>ConÈ›inutul Filelor</target> + <source>Symbolic Link handling</source> <target>Prelucrarea Legăturilor Simbolice (Simlegături)</target> + <source>Synchronizing...</source> <target>Sincronizare Aflată în Curs...</target> + <source>Elements processed:</source> <target>Elemente Procesate:</target> + <source>&Pause</source> <target>&Pauzează</target> -<source>Compare by "File size and date"</source> -<target>Compară după "Data È™i Mărimea Filelor"</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>Această variantă defineÈ™te două file cu acelaÈ™i nume ca fiind identice atunci cînd au aceeaÈ™i mărime ȘI aceeaÈ™i dată È™i oră a ultimei modificări.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>Cînd compararea este pornită cu acest set de opÈ›iuni, este executat următorul arbore de decizie:</target> -<source>As a result the files are separated into the following categories:</source> -<target>ÃŽn concluzie, filele sînt repartizate în categoriile următoare:</target> -<source>- equal</source> -<target>- identice</target> -<source>- left newer</source> -<target>- cea mai nouă e în stînga</target> -<source>- right newer</source> -<target>- cea mai nouă e în dreapta</target> -<source>- exists left only</source> -<target>- există doar în stînga</target> -<source>- exists right only</source> -<target>- există doar în dreapta</target> -<source>- conflict (same date, different size)</source> -<target>- conflict (dată identică, mărime diferită)</target> -<source>Compare by "File content"</source> -<target>Compară după "ConÈ›inutul Filelor"</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. - -With this option enabled the decision tree is smaller: -</source> -<target> -AÈ™a cum sugerează È™i numele, două file cu acelaÈ™i nume sînt considerate identice dacă È™i numai dacă este identic È™i conÈ›inutul lor. Această opÈ›iune este utilă mai degrabă pentru verificările de consecvență decît pentru operaÈ›iunile de conservare [backup]. AÈ™a că timpurile filelor (data È™i ora) nu sînt luate deloc în considerare. -Cu această opÈ›iune activată, arborele de decizie e mai simplu: -</target> -<source>- different</source> -<target>- diferite</target> <source>Source code written in C++ utilizing:</source> <target>Cod sursă scris în C++ folosind:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>MulÈ›umiri pentru traducerea FreeFileSync:</target> + <source>Feedback and suggestions are welcome at:</source> <target>Opiniile È™i sugestiile sînt binevenite:</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync la Sourceforge</target> + <source>Homepage</source> <target>Sit</target> + <source>If you like FFS</source> <target>Donează pentru FFS</target> + <source>Donate with PayPal</source> <target>Donează prin PayPal</target> + <source>Email</source> <target>Adresă</target> + <source>Report translation error</source> <target>Raportează erori de trad.</target> + <source>Published under the GNU General Public License:</source> <target>Publicat sub licenÈ›a GNU GPL:</target> + <source>Ignore subsequent errors</source> <target>Ignoră (nu lua în seamă) erorile ulterioare</target> + <source>Hide further error messages during the current process</source> <target>Ascunde mesajele de eroare apărute ulterior în timpul acestui proces</target> + <source>&Ignore</source> <target>&OK</target> + <source>&Retry</source> <target>&Reîncearcă</target> + <source>Do not show this dialog again</source> -<target>Nu afiÈ™a acest dialog din nou</target> +<target>Nu arăta acest dialog din nou</target> + <source>&Switch</source> <target>&Comută</target> + <source>&Yes</source> <target>&Da</target> + <source>&No</source> <target>&Nu</target> + <source>Delete on both sides</source> <target>Șterge din ambele părÈ›i</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>Șterge din ambele părÈ›i, chiar dacă fila e selecÈ›ionată într-o singură parte</target> + <source>Use Recycle Bin</source> -<target>Mută în Reciclator</target> +<target>Mutare în Reciclator</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. </source> <target> -Doar filele/dosarele care îndeplinesc toate condiÈ›iile filtrului vor fi selectate pentru sincronizare. -Notă: Filtrul de nume este relaÈ›ionat la calea dosarelor principale sincronizate (itemurile filtrate au specificată o cale relativă). +Doar filele/folderele care îndeplinesc toate condiÈ›iile filtrului vor fi selectate pentru sincronizare. +Notă: Filtrul de nume este pus în relaÈ›ie cu calea dosarelor principale sincronizate (elementele filtrate au specificată o cale relativă). </target> + <source>Hints:</source> <target>Sfaturi:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. Scrie numele relative ale filelor sau dosarelor, separate de semnul ';' sau de un rînd nou.</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. FoloseÈ™te metacaracterele '*' È™i '?' (asterisc È™i semn de întrebare).</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. Exclude filele È™i dosarele direct de pe grila principală, cu ajutorul meniului contextual.</target> + <source>Example</source> <target>Exemplu</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -641,30 +878,40 @@ Exclude: \stuff\temp\* Incluse: *.doc;*.zip;*.exe Excluse: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> -<target>Sincronizează filele .doc, .zip È™i .exe, cu excepÈ›ia celor din dosarul "temp".</target> +<target>Sincronizează filele .doc, .zip È™i .exe, cu excepÈ›ia celor din subdosarul "temp".</target> + <source>Include</source> <target>Incluse</target> + <source>Exclude</source> <target>Excluse</target> -<source>Select time span:</source> -<target>Intervalul de timp:</target> -<source>Minimum file size:</source> -<target>Mărimea minimă a filelor:</target> -<source>Maximum file size:</source> -<target>Mărimea maximă a filelor:</target> + +<source>Minimum file size</source> +<target>Mărimea minimă a filei</target> + +<source>Maximum file size</source> +<target>Mărimea maximă a filei</target> + <source>&Default</source> <target>&Implicite</target> + <source>Move column up</source> <target>Mută coloana în sus</target> + <source>Move column down</source> <target>Mută coloana în jos</target> -<source>Transactional File Copy</source> -<target></target> + +<source>Transactional file copy</source> +<target>Copiere tranzacÈ›ională a filelor</target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> -<target></target> +<target>Filele sînt scrise mai întîi cu un nume temporar (*.ffs_tmp), apoi renumite. Aceasta garantează consecvenÈ›a stării lor chiar în situaÈ›ii de erori fatale.</target> + <source>Copy locked files</source> -<target>Copiază filele zăvorîte [locked]</target> +<target>Copiere È™i a filelor zăvorîte [locked]</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -673,8 +920,10 @@ Copy shared or locked files using Volume Shadow Copy Service Copiază filele partajate sau zăvorîte folosind Serviciul de Conservare a Volumelor [Volume Shadow Copy] (Necesită drepturi de Administrator) </target> -<source>Copy filesystem permissions</source> -<target>Copiază permisiunile sistemului de file</target> + +<source>Copy file access permissions</source> +<target>Copiază permisiunile de acces ale filelor</target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -683,147 +932,215 @@ Transfer file and directory permissions Transferă permisiunile filelor È™i dosarelor (Necesită drepturi de Administrator) </target> + <source>Hidden dialogs:</source> <target>Casete de dialog ascunse:</target> + <source>Reset</source> <target>Resetează</target> + <source>Show hidden dialogs</source> <target>Arată casetele de dialog ascunse</target> + <source>External applications</source> <target>AplicaÈ›ii Externe</target> + <source>Description</source> <target>Descriere</target> + <source>Variant</source> <target>Varianta Sincronizării</target> + <source>Statistics</source> <target>Statistici</target> + <source>Find what:</source> <target>GăseÈ™te Asta:</target> + <source>Match case</source> <target>PotriveÈ™te MAJ/min</target> + <source>&Find next</source> <target>&GăseÈ™te Următorul</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>PoÈ›i încerca să sincronizezi din nou itemurile rămase (FÄ‚RÄ‚ recomparare) !</target> -<source>Batch file created successfully!</source> -<target>Fila cu lotul de comenzi a fost creată cu succces !</target> + <source>Main bar</source> <target>Bara Principală</target> + <source>Folder pairs</source> <target>Perechi de Dosare</target> + <source>Select view</source> <target>Selectează Vederea</target> + <source>Set direction:</source> <target>Setează AcÈ›iunea ca în Icoana Alăturată:</target> + <source>Exclude temporarily</source> <target>Exclude Temporar</target> + <source>Include temporarily</source> <target>Include Temporar</target> + <source>Exclude via filter:</source> <target>Exclude prin Filtru:</target> + <source><multiple selection></source> <target><selectare multiplă></target> + <source>D-Click</source> <target>Clic-Dreapta</target> + <source>Delete</source> <target>Șterge</target> + <source>Customize...</source> <target>Personalizează...</target> + +<source>Select time span...</source> +<target>Selectează intervalul de timp...</target> + <source>Auto-adjust columns</source> <target>Autoajustează Coloanele</target> + <source>Include all rows</source> <target>Include Toate Rîndurile</target> + <source>Exclude all rows</source> <target>Exclude Toate Rîndurile</target> + <source>Reset view</source> <target>Resetează Vederea</target> + <source>Show "%x"</source> <target>Arată "%x"</target> + <source><Last session></source> <target><Ultima Sesiune></target> + <source>Configuration saved!</source> <target>ConfiguraÈ›ie salvată !</target> + <source>Save changes to current configuration?</source> <target>Vrei să salvezi modificările configuraÈ›iei curente?</target> + <source>Configuration loaded!</source> <target>ConfiguraÈ›ie încărcată !</target> + <source>Folder Comparison and Synchronization</source> <target>Comparare È™i Sincronizare de Dosare</target> + <source>Hide files that exist on left side only</source> <target>Ascunde filele care există doar în stînga</target> + <source>Show files that exist on left side only</source> <target>Arată filele care există doar în stînga</target> + <source>Hide files that exist on right side only</source> <target>Ascunde filele care există doar în dreapta</target> + <source>Show files that exist on right side only</source> <target>Arată filele care există doar în dreapta</target> + <source>Hide files that are newer on left</source> <target>Ascunde filele care sînt mai noi în stînga</target> + <source>Show files that are newer on left</source> <target>Arată filele din stînga mai noi decît cele din dreapta</target> + <source>Hide files that are newer on right</source> <target>Ascunde filele care sînt mai noi în dreapta</target> + <source>Show files that are newer on right</source> <target>Arată filele din dreapta mai noi decît cele din stînga</target> + <source>Hide files that are equal</source> <target>Ascunde elementele (file/dosare) identice</target> + <source>Show files that are equal</source> <target>Arată elementele (file/dosare) identice</target> + <source>Hide files that are different</source> <target>Ascunde elementele (file/dosare) care sînt diferite</target> + <source>Show files that are different</source> <target>Arată elementele (file/dosare) diferite</target> + <source>Hide conflicts</source> <target>Ascunde conflictele</target> + <source>Show conflicts</source> <target>Arată conflictele</target> + <source>Hide files that will be created on the left side</source> <target>Ascunde elementele (file/dosare) care vor fi create în stînga</target> + <source>Show files that will be created on the left side</source> <target>Arată elementele (file/dosare) care vor fi create în stînga</target> + <source>Hide files that will be created on the right side</source> <target>Ascunde elementele (file/dosare) care vor fi create în dreapta</target> + <source>Show files that will be created on the right side</source> <target>Arată elementele (file/dosare) care vor fi create în dreapta</target> + <source>Hide files that will be deleted on the left side</source> <target>Ascunde elementele (file/dosare) care vor fi È™terse în stînga</target> + <source>Show files that will be deleted on the left side</source> <target>Arată elementele (file/dosare) care vor fi È™terse în stînga</target> + <source>Hide files that will be deleted on the right side</source> <target>Ascunde elementele (file/dosare) care vor fi È™terse în dreapta</target> + <source>Show files that will be deleted on the right side</source> <target>Arată elementele (file/dosare) care vor fi È™terse în dreapta</target> + <source>Hide files that will be overwritten on left side</source> <target>Ascunde elementele (file/dosare) care vor fi suprascrise în stînga</target> + <source>Show files that will be overwritten on left side</source> <target>Arată elementele (file/dosare) care vor fi suprascrise în stînga</target> + <source>Hide files that will be overwritten on right side</source> <target>Ascunde elementele (file/dosare) care vor fi suprascrise în dreapta</target> + <source>Show files that will be overwritten on right side</source> <target>Arată elementele (file/dosare) care vor fi suprascrise în dreapta</target> + <source>Hide files that won't be copied</source> <target>Ascunde elementele (file/dosare) care nu vor fi copiate</target> + <source>Show files that won't be copied</source> <target>Arată elementele (file/dosare) care nu vor fi copiate</target> + <source>All directories in sync!</source> <target>Toate dosarele au fost sincronizate!</target> + <source>Please run a Compare first before synchronizing!</source> <target>Rulează compararea înainte de a sincroniza!</target> + <source>Comma separated list</source> <target>Listă de elemente separate prin virgulă</target> + <source>Legend</source> <target>Legendă</target> + <source>File list exported!</source> <target>Lista de file a fost exportată!</target> + +<source>Batch file created successfully!</source> +<target>Fila cu setul de comenzi a fost creată cu succces !</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> </source> <target> -<pluralform>Item È™ters cu succes!</pluralform> +<pluralform>Element È™ters cu succes!</pluralform> <pluralform>%x elemente È™terse cu succes!</pluralform> <pluralform>%x de elemente È™terse cu succes!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -833,6 +1150,7 @@ Transferă permisiunile filelor È™i dosarelor <pluralform>%x dosare</pluralform> <pluralform>%x de dosare</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -842,6 +1160,7 @@ Transferă permisiunile filelor È™i dosarelor <pluralform>%x file</pluralform> <pluralform>%x de file</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -851,223 +1170,321 @@ Transferă permisiunile filelor È™i dosarelor <pluralform>%x din %y rînduri afiÈ™ate</pluralform> <pluralform>%x din %y de rînduri afiÈ™ate</pluralform> </target> + <source>Scanning...</source> <target>Scanez...</target> + <source>Comparing content...</source> <target>Compar conÈ›inutul...</target> + <source>Paused</source> <target>Sincronizare Pauzată</target> + <source>Aborted</source> <target>Sincronizare Abandonată</target> + <source>Completed</source> <target>Sincronizare Terminată</target> + <source>Abort requested: Waiting for current operation to finish...</source> -<target>Abandonare solicitată: Se aÈ™teaptă terminarea operaÈ›iunii în curs...</target> +<target>Abandonare solicitată: Se aÈ™teaptă terminarea operaÈ›iei în curs...</target> + <source>Continue</source> <target>Continuă</target> + <source>Pause</source> <target>Pauzează</target> + <source>Cannot find %x</source> <target>Nu pot găsi %x</target> -<source>DECISION TREE</source> -<target>ARBORE DECIZIONAL</target> -<source>file exists on both sides</source> -<target>fila există în ambele părÈ›i</target> -<source>on one side only</source> -<target>fila există doar într-o parte</target> -<source>same date</source> -<target>dată identică</target> -<source>different date</source> -<target>dată diferită</target> + <source>Inactive</source> <target>Dezactivat</target> -<source>Second</source> -<target>Secunde</target> -<source>Minute</source> -<target>Minute</target> -<source>Hour</source> -<target>Ore</target> -<source>Day</source> -<target>Zile</target> + +<source>Last x hours</source> +<target>Ultimele x ore</target> + +<source>Today</source> +<target>Azi</target> + +<source>This week</source> +<target>Săptămîna Asta</target> + +<source>This month</source> +<target>Luna Asta</target> + +<source>This year</source> +<target>Anul Ä‚sta</target> + <source>Byte</source> <target>BaiÈ›i</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>Filtru: Toate perechile</target> + <source>Filter: Single pair</source> <target>Filtru: O singură pereche</target> + <source>Ignore</source> <target>Ignoră</target> + <source>Direct</source> <target>DirecÈ›ionează</target> + <source>Follow</source> <target>UrmăreÈ™te</target> + +<source>Copy NTFS permissions</source> +<target>Copiere a permisiunilor NTFS</target> + <source>Integrate external applications into context menu. The following macros are available:</source> -<target>Include aplicaÈ›iile externe în meniul contextual. Sînt disponibile următoarele macrocomenzi:</target> +<target>Comenzi pentru aplicaÈ›ii externe incluse în meniul contextual al softului. Sînt disponibile următoarele macrocomenzi:</target> + <source>- full file or directory name</source> <target>- numele complet al filei sau dosarului</target> + <source>- directory part only</source> <target>- doar dosarele</target> + <source>- Other side's counterpart to %name</source> <target>- corespondentul din partea opusă al lui %name</target> + <source>- Other side's counterpart to %dir</source> <target>- corespondentul din partea opusă al lui %dir</target> + <source>Restore all hidden dialogs?</source> <target>Restaurezi toate casetele de dialog ascunse?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> </source> <target> -<pluralform>Sigur vrei să muÈ›i în Reciclator itemul următor?</pluralform> -<pluralform>Sigur vrei să muÈ›i în Reciclator următoarele %x itemuri?</pluralform> -<pluralform>Sigur vrei să muÈ›i în Reciclator următoarele %x de itemuri?</pluralform> +<pluralform>Sigur vrei să muÈ›i în Reciclator elementul următor?</pluralform> +<pluralform>Sigur vrei să muÈ›i în Reciclator următoarele %x elemente?</pluralform> +<pluralform>Sigur vrei să muÈ›i în Reciclator următoarele %x de elemente?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> </source> <target> -<pluralform>Sigur vrei să È™tergi definitiv itemul următor?</pluralform> -<pluralform>Sigur vrei să È™tergi definitiv următoarele %x itemuri?</pluralform> -<pluralform>Sigur vrei să È™tergi definitiv următoarele %x de itemuri?</pluralform> +<pluralform>Sigur vrei să È™tergi definitiv elementul următor?</pluralform> +<pluralform>Sigur vrei să È™tergi definitiv următoarele %x elemente?</pluralform> +<pluralform>Sigur vrei să È™tergi definitiv următoarele %x de elemente?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>Lasă ca Conflict Nerezolvat</target> + <source>Delete permanently</source> -<target>Șterge definitiv</target> +<target>Ștergere definitivă</target> + <source>Delete or overwrite files permanently</source> <target>Filele sînt È™terse sau suprascrise în mod definitiv</target> + <source>Use Recycle Bin when deleting or overwriting files</source> -<target>Se foloseÈ™te Reciclatorul [Recycle Bin] cu ocazia È™tergerii sau suprascrierii unei file</target> +<target>Se foloseÈ™te Reciclatorul [Recycle Bin] cu ocazia È™tergerii sau suprascrierii filelor</target> + <source>Versioning</source> <target>Versionare</target> + <source>Move files into a time-stamped subdirectory</source> -<target>Mută filele într-un subdosar cu marcaj de timp</target> -<source>Cannot determine sync-direction:</source> -<target>Nu se poate determina sensul de sincronizare:</target> -<source>Filter settings have changed!</source> -<target>Setările filtrului au fost schimbate!</target> +<target>Filele sînt mutate într-un subdosar cu marcaj de timp</target> + <source>Both sides have changed since last synchronization!</source> <target>Ambele părÈ›i s-au modificat de la ultima sincronizare!</target> + +<source>Cannot determine sync-direction:</source> +<target>Nu se poate determina sensul de sincronizare:</target> + <source>No change since last synchronization!</source> <target>Nu sînt schimbări de la ultima sincronizare!</target> + +<source>Filter settings have changed!</source> +<target>Setările filtrului au fost schimbate!</target> + <source>The file was not processed by last synchronization!</source> <target>Fila nu a fost procesată la ultima sincronizare!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>Ștergerea plănuită a dosarului intră în conflict cu subdosarele È™i filele sale!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Baza de date existentă va fi făcută compatibilă cu versiunea softului È™i apoi va fi setat sensul implicit de sincronizare: Filele vechi vor fi suprascrise de cele noi.</target> + <source>The file does not contain a valid configuration:</source> <target>Fila nu conÈ›ine o configuraÈ›ie validă:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>PoÈ›i ignora această eroare dacă vrei ca dosarul să fie considerat gol.</target> + <source>Directory does not exist:</source> <target>Dosarul nu există:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Dosarele sînt interdependente! AtenÈ›ie la setarea regulilor de sincronizare:</target> + <source>Comparing content of files %x</source> <target>Compar conÈ›inutul filelor %x</target> + <source>Memory allocation failed!</source> <target>Alocarea memoriei a eÈ™uat!</target> + <source>File %x has an invalid date!</source> <target>Fila %x are o dată nevalidă !</target> + <source>Conflict detected:</source> <target>Conflict detectat:</target> + <source>Files %x have the same date but a different size!</source> <target>Filele %x au dată identică, dar mărime diferită!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>Simlegăturile %x au dată identică, dar È›inte diferite!</target> + <source>Comparing files by content failed.</source> <target>Compararea filelor după conÈ›inut a eÈ™uat.</target> + <source>Generating file list...</source> <target>Generez lista de file...</target> + <source>Multiple...</source> <target>Multiplu...</target> + <source>Both sides are equal</source> -<target>Amblee părÈ›i sînt identice</target> +<target>Ambele părÈ›i sînt identice</target> + <source>Files/folders differ in attributes only</source> <target>File/Dosarele diferă doar prin atributele lor</target> + <source>Copy new file/folder to left</source> -<target>Copiază fila/dosarul nou în stînga</target> +<target>Copiază elementul nou în stînga</target> + <source>Copy new file/folder to right</source> -<target>Copiază fila/dosarul nou în dreapta</target> +<target>Copiază elementul nou în dreapta</target> + <source>Delete left file/folder</source> -<target>Șterge fila/dosarul stîng</target> +<target>Șterge elementul stîng</target> + <source>Delete right file/folder</source> -<target>Șterge fila/dosarul drept</target> +<target>Șterge elementul drept</target> + <source>Overwrite left file/folder with right one</source> <target>Suprascrie elementul stîng (fila/dosarul) cu cel drept</target> + <source>Overwrite right file/folder with left one</source> <target>Suprascrie elementul drept (fila/dosarul) cu cel stîng</target> + <source>Do nothing</source> <target>Nici o AcÈ›iune</target> + <source>Copy file attributes only to left</source> <target>Copiază atributele filelor doar înspre stînga</target> + <source>Copy file attributes only to right</source> <target>Copiază atributele filelor doar înspre dreapta</target> + <source>Deleting file %x</source> <target>Șterg fila %x</target> -<source>Deleting Symbolic Link %x</source> -<target>Șterg legătura simbolică %x</target> + <source>Deleting folder %x</source> <target>Șterg dosarul %x</target> -<source>Moving %x to Recycle Bin</source> -<target>Mut %x în Reciclator</target> -<source>Moving file %x to user-defined directory %y</source> -<target>Mut fila %x în dosarul %y ales de utilizator</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>Mut dosarul %x în dosarul %y ales de utilizator</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>Mut legătura simbolică %x în dosarul ales de utilizator %y</target> -<source>Copying new file %x to %y</source> -<target>Copiez fila nouă %x în %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>Copiez noua Legătură Simbolică %x în %y</target> -<source>Overwriting file %x in %y</source> -<target>Suprascriu fila %x în %y</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>Suprascriu Legătura Simbolică %x în %y</target> + +<source>Deleting symbolic link %x</source> +<target>Șterg legătura simbolică %x</target> + +<source>Moving file %x to recycle bin</source> +<target>Mut fila %x în Reciclator</target> + +<source>Moving folder %x to recycle bin</source> +<target>Mut dosarul %x în Reciclator</target> + +<source>Moving symbolic link %x to recycle bin</source> +<target>Mut legătura simbolică %x în Reciclator</target> + +<source>Moving file %x to %y</source> +<target>Mut fila %x în %y</target> + +<source>Moving folder %x to %y</source> +<target>Mut dosarul %x în %y</target> + +<source>Moving symbolic link %x to %y</source> +<target>Mut legătura simbolică %x în %y</target> + +<source>Creating file %x</source> +<target>Creez fila %x</target> + +<source>Creating symbolic link %x</source> +<target>Creez legătura simbolică %x</target> + <source>Creating folder %x</source> <target>Creez dosarul %x</target> + +<source>Overwriting file %x</source> +<target>Suprascriu fila %x</target> + +<source>Overwriting symbolic link %x</source> +<target>Suprascriu legătura simbolică %x</target> + <source>Verifying file %x</source> <target>Verific fila %x</target> + <source>Updating attributes of %x</source> <target>Actualizez atributele lui %x</target> -<source>Source directory does not exist anymore:</source> -<target>Dosarul sursă nu mai există:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>Nu este nimic de sincronizat conform configuraÈ›iei!</target> + <source>Target directory name must not be empty!</source> <target>Numele dosarului È›intă nu poate să lipsească!</target> + <source>User-defined directory for deletion was not specified!</source> <target>Dosarul ales de utilizator pentru È™tergere nu a fost specificat !</target> + +<source>Source directory does not exist anymore:</source> +<target>Dosarul sursă nu mai există:</target> + <source>Unresolved conflicts existing!</source> <target>Există conflicte nerezolvate!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>PoÈ›i ignora conflictele pentru a continua cu sincronizarea.</target> + <source>Significant difference detected:</source> <target>Diferență semnificativă detectată:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>Peste 50% din numărul total de file vor fi copiate sau distruse!</target> + <source>Not enough free disk space available in:</source> <target>SpaÈ›iu de stocare insuficient pe:</target> + <source>Free disk space required:</source> <target>SpaÈ›iu liber necesar:</target> + <source>Free disk space available:</source> <target>SpaÈ›iu liber disponibil:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target></target> +<target>Reciclatorul nu este disponibil pentru căile următoare! Filele vor fi deci È™terse definitiv:</target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>Va fi modificat un dosar care face parte din mai multe perechi de dosare! Reverifică setările de sincronizare!</target> + <source>Processing folder pair:</source> <target>Procesez perechea de dosare:</target> + <source>Generating database...</source> <target>Generez baza de date...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>Nu este nimic de sincronizat conform configuraÈ›iei!</target> + <source>Error copying locked file %x!</source> <target>Eroare la copierea filei zăvorîte %x!</target> + <source>Data verification error: Source and target file have different content!</source> <target>Eroare la verificarea datelor: Filele sursă È™i È›intă au conÈ›inut diferit!</target> + diff --git a/BUILD/Languages/russian.lng b/BUILD/Languages/russian.lng index 0c15459e..0057d050 100644 --- a/BUILD/Languages/russian.lng +++ b/BUILD/Languages/russian.lng @@ -8,75 +8,116 @@ </header> <source>Searching for directory %x...</source> -<target></target> +<target>ПоиÑк папки %x...</target> + <source>Show in Explorer</source> <target>Показать в Проводнике</target> + <source>Open with default application</source> <target>Открыть Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾-умолчанию</target> + <source>Browse directory</source> <target>Обзор папок</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - ÐвтоматичеÑÐºÐ°Ñ ÑинхронизациÑ</target> + <source>Browse</source> <target>Обзор</target> -<source>Invalid commandline: %x</source> + +<source>Invalid command line: %x</source> <target>ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока: %x</target> + <source>Error resolving symbolic link:</source> <target>Ошибка при решении ÑимволичеÑкой ÑÑылки:</target> -<source>Show popup</source> + +<source>Show pop-up</source> <target>Показывать вÑплывающие окна</target> -<source>Show popup on errors or warnings</source> + +<source>Show pop-up on errors or warnings</source> <target>Показывать вÑплывающие окна при ошибках и замечаниÑÑ…</target> + <source>Ignore errors</source> <target>Игнорировать ошибки</target> + <source>Hide all error and warning messages</source> <target>Скрывать вÑе ошибки и ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñми</target> + <source>Exit instantly</source> <target>Выйти немедленно</target> + <source>Abort synchronization immediately</source> <target>Отменить Ñинхронизацию немедленно</target> + +<source>Select alternate comparison settings</source> +<target>Выбрать альтернативные наÑтройки ÑравнениÑ</target> + <source>Select alternate synchronization settings</source> <target>Выбрать альтернативные наÑтройки Ñинхронизации</target> + <source>No filter selected</source> <target>Ðи один фильтр не выбран</target> + <source>Filter is active</source> <target>Фильтр активен</target> -<source>Clear filter settings</source> -<target>ОчиÑтить наÑтройки фильтра</target> + <source>Remove alternate settings</source> <target>Удалить альтернативные наÑтройки</target> + +<source>Clear filter settings</source> +<target>ОчиÑтить наÑтройки фильтра</target> + <source>Create a batch job</source> <target>Создать пакетное задание</target> + <source>Synchronization settings</source> <target>ÐаÑтройки Ñинхронизации</target> + <source>Comparison settings</source> <target>ÐаÑтройки ÑравнениÑ</target> + <source>About</source> <target>О программе</target> + <source>Error</source> <target>Ошибка</target> + <source>Warning</source> <target>Внимание</target> + <source>Question</source> <target>ВопроÑ</target> + <source>Confirm</source> <target>Подтвердить</target> + <source>Configure filter</source> <target>ÐаÑтройки фильтра</target> + <source>Customize columns</source> <target>Выбор колонок</target> + <source>Global settings</source> <target>Глобальные наÑтройки</target> + <source>Synchronization Preview</source> <target>ПредпроÑмотр Ñинхронизации</target> + <source>Find</source> <target>Ðайти</target> + +<source>Select time span</source> +<target>Выберите промежуток времени</target> + <source>%x MB</source> <target>%x МБ</target> + <source>%x KB</source> <target>%x КБ</target> + <source>%x GB</source> <target>%x ГБ</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -86,46 +127,64 @@ <pluralform>%x Байта</pluralform> <pluralform>%x Байт</pluralform> </target> + <source><Symlink></source> <target><Ð¡Ð¸Ð¼Ð²Ð¾Ð»ÑŒÐ½Ð°Ñ ÑÑылка></target> + <source><Directory></source> <target><Папка></target> + <source>Size</source> <target>Размер</target> + <source>Date</source> <target>Дата</target> + <source>Full path</source> <target>Полный путь</target> + <source>Filename</source> <target>Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°</target> + <source>Relative path</source> <target>ОтноÑительный путь</target> + <source>Directory</source> <target>Папка</target> + <source>Extension</source> <target>РаÑширение</target> + <source>Comparison Result</source> <target>Результаты ÑравнениÑ</target> + <source>Incompatible synchronization database format:</source> <target>ÐеÑовмеÑтимый формат базы данных Ñинхронизации:</target> + <source>Initial synchronization:</source> <target>ÐŸÐµÑ€Ð²Ð¾Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ ÑинхронизациÑ:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> -<target>Файла базы данных FreeFileSync еще не ÑущеÑтвует:</target> +<target>Одного из файлов баз данных FreeFileSync еще не ÑущеÑтвует:</target> + <source>Error reading from synchronization database:</source> <target>Ошибка при чтении из базы данных Ñинхронизации:</target> + <source>Database files do not share a common synchronization session:</source> -<target></target> +<target>Файлы баз данных не имеют общей ÑеÑÑии ÑинхронÐ¸Ð·Ð°Ñ†Ð¸Ð¸:***</target> + <source>An exception occurred!</source> <target>ИÑключение произошло!</target> -<source>Error deleting file:</source> -<target>Ошибка при удалении файла:</target> + <source>Error reading file attributes:</source> <target>Ошибка при чтении параметров файла:</target> + <source>Waiting while directory is locked (%x)...</source> <target>Ожидание ÑнÑÑ‚Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ Ñ Ð¿Ð°Ð¿ÐºÐ¸ (%x)...</target> + <source>Error setting directory lock:</source> <target>Ошибка блокировки папки:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -135,27 +194,41 @@ <pluralform>%x Ñекунды</pluralform> <pluralform>%x Ñекунд</pluralform> </target> + <source>Info</source> <target>ИнформациÑ</target> + <source>Fatal Error</source> <target>КритичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°</target> + <source>Scanning:</source> <target>Сканирую:</target> + <source>Encoding extended time information: %x</source> <target>Кодирование раÑширенной информации о времени: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> -<target></target> +<target> +<pluralform>[%x поток]</pluralform> +<pluralform>[%x потока]</pluralform> +<pluralform>[%x потоков]</pluralform> +</target> + <source>Invalid FreeFileSync config file!</source> <target>Ðеверный файл конфигурации FreeFileSync!</target> + <source>File does not exist:</source> <target>Файл не ÑущеÑтвует:</target> + <source>Error parsing configuration file:</source> <target>Ошибка при анализе файла наÑтроек Ñинхронизации:</target> + <source>/sec</source> <target>/Ñ</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -165,6 +238,7 @@ <pluralform>%x минуты</pluralform> <pluralform>%x минут</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -174,6 +248,7 @@ <pluralform>%x чаÑа</pluralform> <pluralform>%x чаÑов</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -183,28 +258,40 @@ <pluralform>%x днÑ</pluralform> <pluralform>%x дней</pluralform> </target> + <source>S&ave configuration...</source> <target>Сохранить наÑтройки Ñинхронизации...</target> + <source>&Load configuration...</source> <target>&Загрузить наÑтройки Ñинхронизации...</target> + <source>&Quit</source> <target>&Выход</target> + <source>&File</source> <target>&Файл</target> + <source>&Content</source> <target>&Справка</target> + <source>&About...</source> <target>&О программе...</target> + <source>&Help</source> <target>&Помощь</target> + <source>Usage:</source> <target>ИнÑтрукциÑ:</target> + <source>1. Select directories to monitor.</source> <target>1. Выберите папки Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ð°;</target> + <source>2. Enter a command line.</source> <target>2. Введите командную Ñтроку;</target> + <source>3. Press 'Start'.</source> <target>3. Ðажмите 'Старт'.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -215,404 +302,548 @@ The command line is executed each time: - вÑе папки ÑтановÑÑ‚ÑÑ Ð´Ð¾Ñтупны (например, подключение переноÑного ноÑителÑ) - файлы в папках или подпапках изменены </target> + <source>Directories to watch</source> <target>Папки Ð´Ð»Ñ Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ</target> + <source>Add folder</source> <target>Добавить папку</target> + <source>Remove folder</source> <target>Удалить папку</target> + <source>Select a folder</source> <target>Выбрать папку</target> + <source>Command line</source> <target>ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока</target> + <source>Minimum Idle Time [seconds]</source> <target>Минимальное Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾ÑÑ‚Ð¾Ñ [Ñекунд]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>Ð’Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾ÑÑ‚Ð¾Ñ Ð¼ÐµÐ¶Ð´Ñƒ обнаружением поÑледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ выполнением командной Ñтроки в Ñекундах</target> + <source>Start</source> <target>Старт</target> + <source>(Build: %x)</source> <target>(Ñборка %x)</target> + <source>RealtimeSync configuration</source> <target>ÐаÑтройка RealtimeSync</target> + <source>File already exists. Overwrite?</source> <target>Файл уже ÑущеÑтвует. ПерезапиÑать?</target> + <source>&Restore</source> <target>&ВоÑÑтановить</target> + <source>&Exit</source> <target>&Выход</target> + <source>Monitoring active...</source> <target>Мониторинг включен...</target> + <source>Waiting for missing directories...</source> <target>Ожидание пропущенных папок...</target> + <source>A directory input field is empty.</source> <target>Поле ввода пути папки пуÑтое.</target> + <source>Drag && drop</source> <target>Drag && drop</target> + <source>Could not initialize directory monitoring:</source> <target>Ðе удалоÑÑŒ инициализировать папку Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ð°:</target> + <source>Error when monitoring directories.</source> <target>Ошибка при мониторинге папок.</target> + <source>Conversion error:</source> <target>Ошибка преобразованиÑ:</target> + +<source>Error deleting file:</source> +<target>Ошибка при удалении файла:</target> + <source>Error moving file:</source> <target>Ошибка Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°:</target> + <source>Target file already existing!</source> <target>Конечный файл уже ÑущеÑтвует!</target> + <source>Error moving directory:</source> <target>Ошибка Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¿ÐºÐ¸:</target> + <source>Target directory already existing!</source> <target>ÐšÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° уже ÑущеÑтвует!</target> + <source>Error deleting directory:</source> <target>Ошибка при удалении папки:</target> + <source>Error changing modification time:</source> <target>Ошибка при изменении времени модификации файла:</target> + <source>Error loading library function:</source> <target>Ошибка при загрузке функции библиотеки:</target> + <source>Error reading security context:</source> <target>Ошибка при чтении контекÑта безобаÑноÑти:</target> + <source>Error writing security context:</source> <target>Ошибка при запиÑи контекÑта безобаÑноÑти:</target> + <source>Error copying file permissions:</source> <target>Ошибка при копировании прав доÑтупа:</target> + <source>Error creating directory:</source> <target>Ошибка при Ñоздании папки:</target> + <source>Error copying symbolic link:</source> <target>Ошибка при копировании Ñимвольной ÑÑылки:</target> + <source>Error copying file:</source> <target>Ошибка при копировании файла:</target> + <source>Error opening file:</source> <target>Ошибка при открытии файла:</target> + <source>Error writing file:</source> <target>Ошибка при запиÑи файла:</target> + <source>Error reading file:</source> <target>Ошибка при чтении файла:</target> + <source>Operation aborted!</source> <target>ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½ÐµÐ½Ð°!</target> + +<source>Could not load a required DLL:</source> +<target>Ðе удалоÑÑŒ загрузить необходимые DLL:</target> + <source>Endless loop when traversing directory:</source> <target>Зацикливание при вÑтрече переÑекающихÑÑ Ð¿ÑƒÑ‚ÐµÐ¹:</target> + <source>Error traversing directory:</source> <target>Ошибка при переÑечении папок:</target> + <source>Windows Error Code %x:</source> <target>Код ошибки Windows %x:</target> + <source>Linux Error Code %x:</source> <target>Код ошибки Linux %x:</target> + <source>Error setting privilege:</source> <target>Ошибка уÑтановки привилегий:</target> + <source>Error moving to Recycle Bin:</source> -<target>Ошибка при отправке в "Корзину":</target> -<source>Could not load a required DLL:</source> -<target>Ðе удалоÑÑŒ загрузить необходимые DLL:</target> +<target>Ошибка при перемещении в "Корзину":</target> + <source>Error writing to synchronization database:</source> <target>Ошибка при запиÑи в базу данных Ñинхронизации:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>Ошибка при запуÑке Ñлужбы Теневого ÐšÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¢Ð¾Ð¼Ð°!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target>Ошибка доÑтупа к Ñлужбе Теневого ÐšÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¢Ð¾Ð¼Ð°!</target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>Создание теневых копий на WOW64 не поддерживаетÑÑ. ПожалуйÑта, иÑпользуйте FreeFileSync 64-разрÑдной верÑии.</target> + <source>Could not determine volume name for file:</source> <target>Ðе удалоÑÑŒ определить название тома Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°:</target> + <source>Volume name %x not part of filename %y!</source> <target>Ð˜Ð¼Ñ Ñ‚Ð¾Ð¼Ð° %x не ÑвлÑетÑÑ Ñ‡Ð°Ñтью имени файла %y!</target> + <source>%x TB</source> <target>%x ТБ</target> + <source>%x PB</source> <target>%x ПБ</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>Ðе удалоÑÑŒ прочитать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñледующих XML запиÑей:</target> + <source>Logging</source> <target>Лог-файлы</target> + <source>FreeFileSync batch file</source> <target>Файл пакетного Ð·Ð°Ð´Ð°Ð½Ð¸Ñ FreeFileSync</target> + <source>FreeFileSync configuration</source> <target>ÐаÑтройка FreeFileSync</target> + <source>FreeFileSync Batch Job</source> <target>Пакетное задание FreeFileSync</target> + <source>Unable to create logfile!</source> <target>Ðевозможно Ñоздать лог-файл!</target> + <source>Batch execution</source> <target>Выполнение пакетного заданиÑ</target> + <source>Log-messages:</source> <target>Лог-ÑообщениÑ:</target> + <source>Stop</source> <target>Стоп</target> + <source>Total time:</source> <target>Общее времÑ:</target> + <source>Synchronization aborted!</source> <target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½ÐµÐ½Ð°!</target> + <source>Synchronization completed with errors!</source> <target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð·Ð°ÐºÐ¾Ð½Ñ‡ÐµÐ½Ð° Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸!</target> + <source>Synchronization completed successfully!</source> <target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¾ÑˆÐ»Ð° уÑпешно!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>Ðажмите "Переключить" Ð´Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкого графичеÑкого интерфейÑа FreeFileSync.</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>Переключение на пользовательÑкий графичеÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ FreeFileSync...</target> + <source>Unable to connect to sourceforge.net!</source> <target>Ðевозможно ÑоединитьÑÑ Ñ sourceforge.net!</target> + <source>A newer version of FreeFileSync is available:</source> <target>ДоÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ FreeFileSync:</target> + <source>Download now?</source> <target>Загрузить ÑейчаÑ?</target> + <source>Information</source> <target>ИнформациÑ</target> + <source>FreeFileSync is up to date!</source> <target>У Ð’Ð°Ñ ÑÐ°Ð¼Ð°Ñ Ð¿Ð¾ÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ FreeFileSync!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>Ð’Ñ‹ хотите, чтобы FreeFileSync автоматичеÑки проверÑл наличие обновлений каждую неделю?</target> + <source>(Requires an Internet connection!)</source> <target>(требуетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ðµ к Интернету!)</target> + <source>1. &Compare</source> <target>1. &Сравнить</target> + <source>2. &Synchronize...</source> <target>2. &Синхронизировать</target> + <source>S&witch view</source> <target>Переключить вид</target> + <source>&New</source> <target>&ÐоваÑ</target> + <source>&Program</source> <target>&Программа</target> + <source>&Language</source> <target>&Язык</target> + <source>&Global settings...</source> <target>&Глобальные наÑтройки...</target> + <source>&Create batch job...</source> <target>&Создать пакетное задание...</target> + <source>&Export file list...</source> <target>&ÐкÑпортировать ÑпиÑок файлов...</target> + <source>&Advanced</source> <target>&Дополнительно</target> + <source>&Check for new version</source> <target>&Проверить наличие новой верÑии</target> + <source>Compare</source> <target>Сравнить</target> + <source>Compare both sides</source> <target>Сравнить обе Ñтороны</target> + <source>&Abort</source> <target>&Отмена</target> + <source>Synchronize...</source> <target>Синхронизировать</target> + <source>Start synchronization</source> <target>Ðачать Ñинхронизацию</target> -<source>Swap sides</source> -<target>ПоменÑÑ‚ÑŒ направление</target> + <source>Add folder pair</source> <target>Добавить пару папок</target> + <source>Remove folder pair</source> <target>Удалить пару папок</target> + +<source>Swap sides</source> +<target>ПоменÑÑ‚ÑŒ направление</target> + <source>Save current configuration to file</source> <target>Сохранить текущие наÑтройки Ñинхронизации в файл</target> + <source>Load configuration from file</source> <target>Загрузить наÑтройки Ñинхронизации из файла</target> + <source>Last used configurations (press DEL to remove from list)</source> <target> ПоÑледние иÑпользованные наÑтройки Ñинхронизации (нажмите DEL Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð· ÑпиÑка) </target> + <source>Hide excluded items</source> <target>Скрыть иÑключенные пункты</target> + <source>Hide filtered or temporarily excluded files</source> <target>Скрыть отфильтрованные или временно иÑключенные файлы</target> + <source>Number of files and directories that will be created</source> <target>ЧиÑло файлов и папок, которые будут Ñозданы</target> + <source>Number of files that will be overwritten</source> <target>ЧиÑло файлов, которые будут перезапиÑаны</target> + <source>Number of files and directories that will be deleted</source> <target>ЧиÑло файлов и папок, которые будут удалены</target> + <source>Total amount of data that will be transferred</source> <target>Общий объем данных, который будет передаватьÑÑ</target> -<source>Left</source> -<target>Слева</target> -<source>Right</source> -<target>Справа</target> + <source>Batch job</source> <target>Пакетное задание</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>Создайте файл пакетного Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкой Ñинхронизации. Ð”Ð»Ñ Ð·Ð°Ð¿ÑƒÑка в пакетном режиме проÑто дважды щелкните по файлу или выполните командную Ñтроку: FreeFileSync.exe <batchfile>. Также Ñто может быть запланировано в планировщике задач операционной ÑиÑтемы.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target>Создайте файл пакетного Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкой Ñинхронизации. Ð”Ð»Ñ Ð·Ð°Ð¿ÑƒÑка в пакетном режиме проÑто дважды щелкните по файлу или выполните командную Ñтроку: FreeFileSync.exe <ffs_batch file>. Также запуÑк можно запланировать в планировщике задач операционной ÑиÑтемы.</target> + <source>Help</source> <target>Помощь</target> + <source>Filter files</source> <target>Фильтр файлов</target> + <source>Error handling</source> <target>Обработка ошибок</target> + +<source>Left</source> +<target>Слева</target> + +<source>Right</source> +<target>Справа</target> + <source>Overview</source> <target>ГлавнаÑ</target> + <source>Status feedback</source> <target>Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾Ð¹ ÑвÑзи</target> + <source>Run minimized</source> -<target></target> +<target>ЗапуÑтить Ñвернутым</target> + <source>Maximum number of logfiles:</source> <target>МакÑимальное количеÑтво лог-файлов:</target> + <source>Select logfile directory:</source> <target>Выберите папку Ð´Ð»Ñ Ð»Ð¾Ð³-файлов:</target> + <source>Batch settings</source> -<target></target> +<target>ÐаÑтройки пакетного заданиÑ</target> + <source>&Save</source> <target>&Сохранить</target> + <source>&Load</source> <target>&Загрузить</target> + <source>&Cancel</source> <target>&Отмена</target> + <source>Elements found:</source> <target>Ðлементов найдено:</target> + <source>Elements remaining:</source> <target>Ðлементов оÑталоÑÑŒ:</target> + <source>Speed:</source> <target>СкороÑÑ‚ÑŒ:</target> + <source>Time remaining:</source> <target>Времени оÑталоÑÑŒ:</target> + <source>Time elapsed:</source> <target>Времени прошло:</target> + <source>Operation:</source> <target>ОперациÑ:</target> + <source>Select variant:</source> <target>Выберите вариант:</target> + <source><Automatic></source> <target><ÐвтоматичеÑкий></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>Ð’Ñ‹Ñвление и раÑпроÑтранение изменений на обеих Ñторонах Ñ Ð¸Ñпользованием базы данных. Удаленные файлы и конфликты определÑÑŽÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки.</target> + <source>Mirror ->></source> <target>Зеркало ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Ð—ÐµÑ€ÐºÐ°Ð»ÑŒÐ½Ð°Ñ (резервнаÑ) ÐºÐ¾Ð¿Ð¸Ñ Ð»ÐµÐ²Ð¾Ð¹ чаÑти. Ð’ результате Ñинхронизации Ð¿Ñ€Ð°Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° будет изменена до полного ÑоответÑÑ‚Ð²Ð¸Ñ Ð»ÐµÐ²Ð¾Ð¹.</target> + <source>Update -></source> <target>Обновить -></target> + <source>Copy new or updated files to right folder.</source> <target>Копировать новые или обновлÑÑ‚ÑŒ файлы на правой Ñтороне.</target> + <source>Custom</source> <target>Выборочно</target> + <source>Configure your own synchronization rules.</source> <target>ÐаÑтроить Ñвои ÑобÑтвенные правила Ñинхронизации.</target> + <source>Deletion handling</source> <target>ÐаÑтройки удалениÑ</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>ÐаÑтройки</target> + <source>Category</source> <target>КатегориÑ</target> + <source>Action</source> <target>ДейÑтвие</target> + <source>File/folder exists on left side only</source> <target>Файл/папка ÑущеÑтвует только на левой Ñтороне</target> + <source>File/folder exists on right side only</source> <target>Файл/папка ÑущеÑтвует только на правой Ñтороне</target> + <source>Left file is newer</source> <target>Файл на левой Ñтороне новее</target> + <source>Right file is newer</source> <target>Файл на правой Ñтороне новее</target> + <source>Files have different content</source> <target>Файлы имеют различное Ñодержание</target> + <source>Conflict/file cannot be categorized</source> <target>Конфликт/файл не может быть отнеÑен к какой-либо категории</target> + <source>Compare by...</source> <target>Критерии ÑравнениÑ</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> <target> Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли одинаковые - - размер файла - дата и Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ + - размер файла </target> -<source>File size and date</source> -<target>Размер и дата файла</target> + +<source>File time and size</source> +<target>Дата и разамер файла</target> + <source> Files are found equal if - file content is the same </source> <target>Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли Ñодержание файлов одинаковое</target> + <source>File content</source> <target>Содержимое файла</target> + <source>Symbolic Link handling</source> <target>Обращение к Ñимвольной ÑÑылке</target> + <source>Synchronizing...</source> <target>СинхронизациÑ...</target> + <source>Elements processed:</source> <target>Ðлементов обработано:</target> + <source>&Pause</source> <target>&Пауза</target> -<source>Compare by "File size and date"</source> -<target>Сравнивать по размеру и дате</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>Ðтот вариант Ñравнивает два файла Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ‹Ð¼Ð¸ именами и Ñчитает их равными, еÑли они имеют одинаковый размер файла и одинаковую дату и Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего изменениÑ.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>Когда Ñравнение запущено Ñ Ñтими критериÑми, алгоритм Ñледующий:</target> -<source>As a result the files are separated into the following categories:</source> -<target>Как результат файлы разделÑÑŽÑ‚ÑÑ Ð½Ð° Ñледующие категории:</target> -<source>- equal</source> -<target>- одинаковые</target> -<source>- left newer</source> -<target>- левые новее</target> -<source>- right newer</source> -<target>- правые новее</target> -<source>- exists left only</source> -<target>- только левые ÑущеÑтвуют</target> -<source>- exists right only</source> -<target>- только правые ÑущеÑтвуют</target> -<source>- conflict (same date, different size)</source> -<target>- конфликт (даты Ñовпадают, размеры разные)</target> -<source>Compare by "File content"</source> -<target>Сравнивать по Ñодержимому</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. - -With this option enabled the decision tree is smaller: -</source> -<target> -Как напиÑано в названии, два файла Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ‹Ð¼ именем отмечаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, только еÑли они имеют то же Ñамое Ñодержание. Ðта Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð° Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ ÑоглаÑованноÑти, а не операции резервного копированиÑ. ПоÑтому даты файлов не учитываютÑÑ Ð²Ð¾Ð¾Ð±Ñ‰Ðµ. -С Ñтой опцией алгоритм короче: -</target> -<source>- different</source> -<target>- разные</target> <source>Source code written in C++ utilizing:</source> <target>ИÑходный код напиÑан на C++ Ñ Ð¸Ñпользованием:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>Большое ÑпаÑибо за перевод FreeFileSync:</target> + <source>Feedback and suggestions are welcome at:</source> <target>Отзывы и Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ñылайте по адреÑу:</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync на Sourceforge</target> + <source>Homepage</source> <target>Оф.Ñайт</target> + <source>If you like FFS</source> <target>ЕÑли Вам понравилÑÑ FFS</target> + <source>Donate with PayPal</source> <target>Отправить деньги через PayPal</target> + <source>Email</source> <target>Почта</target> + <source>Report translation error</source> <target>Сообщить об ошибке перевода</target> + <source>Published under the GNU General Public License:</source> <target>ИздаетÑÑ Ð¿Ð¾Ð´ лицензией GNU General Public License:</target> + <source>Ignore subsequent errors</source> <target>Игнорировать поÑледующие ошибки</target> + <source>Hide further error messages during the current process</source> <target>Скрыть поÑледующие ошибки во Ð²Ñ€ÐµÐ¼Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ процеÑÑа</target> + <source>&Ignore</source> <target>&Игнорировать</target> + <source>&Retry</source> <target>&Повторить</target> + <source>Do not show this dialog again</source> <target>Больше не показывать Ñто окно</target> + <source>&Switch</source> <target>&Переключить</target> + <source>&Yes</source> <target>&Да</target> + <source>&No</source> <target>&Ðет</target> + <source>Delete on both sides</source> <target>Удалить Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>Удалить Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон, еÑли даже файл выделен только на одной Ñтороне</target> + <source>Use Recycle Bin</source> <target>ИÑпользовать "Корзину"</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -621,16 +852,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire Только файлы/папки, ÑоответÑтвующие вÑем наÑтройкам фильтра, будут выбраны Ð´Ð»Ñ Ñинхронизации. Примечание: Фильтр имен должен быть задан отноÑительно оÑновных папок Ñинхронизации. </target> + <source>Hints:</source> <target>ПодÑказка:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. Введите имена файлов или папок, разделÑÑ Ð·Ð½Ð°ÐºÐ¾Ð¼ ';' или Ñ Ð½Ð¾Ð²Ð¾Ð¹ Ñтроки.</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. ИÑпользуйте Ñимволы '*' и '?' Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹ неизвеÑтных.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. ИÑключите файлы прÑмо в главном окне через контекÑтное меню.</target> + <source>Example</source> <target>Пример</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -639,30 +876,40 @@ Exclude: \stuff\temp\* ВключаÑ: *.doc;*.zip;*.exe ИÑключаÑ: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>Синхронизировать вÑе .doc, .zip и .exe файлы, за иÑключением вÑех файлов из подпапки "temp"</target> + <source>Include</source> <target>Включить</target> + <source>Exclude</source> <target>ИÑключить</target> -<source>Select time span:</source> -<target>Выберите промежуток времени:</target> -<source>Minimum file size:</source> -<target>Минимальный размер файла:</target> -<source>Maximum file size:</source> -<target>МакÑимальный размер файла:</target> + +<source>Minimum file size</source> +<target>Минимальный размер файла</target> + +<source>Maximum file size</source> +<target>МакÑимальный размер файла</target> + <source>&Default</source> <target>&По-умолчанию</target> + <source>Move column up</source> <target>ПеремеÑтить вверх</target> + <source>Move column down</source> <target>ПеремеÑтить вниз</target> -<source>Transactional File Copy</source> -<target></target> + +<source>Transactional file copy</source> +<target>БезопаÑное копирование файлов</target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> -<target></target> +<target>Сначала файлы копируютÑÑ Ð²Ð¾ временные (*.ffs_tmp) и затем переименовываютÑÑ. Ðто гарантирует, что заменÑемые файлы не будут иÑпорчены, в Ñлучае Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ñ„Ð°Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð¹ ошибки копированиÑ.</target> + <source>Copy locked files</source> -<target>Копировать заблокированные файлы</target> +<target>Копирование заблокированных файлов</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -672,148 +919,217 @@ Copy shared or locked files using Volume Shadow Copy Service Ñ Ð¸Ñпользованием Ñлужбы Теневого ÐšÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¢Ð¾Ð¼Ð° (требуютÑÑ Ð¿Ñ€Ð°Ð²Ð° ÐдминиÑтратора) </target> -<source>Copy filesystem permissions</source> -<target>Копировать права доÑтупа файловой ÑиÑтемы</target> + +<source>Copy file access permissions</source> +<target>Копирование прав доÑтупа к файлам</target> + <source> Transfer file and directory permissions (Requires Administrator rights) </source> <target> -Передача прав доÑтупа файла/папки +Передача прав доÑтупа к файлам/папкам (требуютÑÑ Ð¿Ñ€Ð°Ð²Ð° ÐдминиÑтратора) </target> + <source>Hidden dialogs:</source> <target>Скрытые диалоги</target> + <source>Reset</source> <target>СброÑить</target> + <source>Show hidden dialogs</source> <target>Показать Ñкрытые диалоги</target> + <source>External applications</source> <target>Внешние приложениÑ</target> + <source>Description</source> <target>ОпиÑание</target> + <source>Variant</source> <target>Вариант</target> + <source>Statistics</source> <target>СтатиÑтика</target> + <source>Find what:</source> <target>Ðайти:</target> + <source>Match case</source> <target>Учитывать региÑÑ‚Ñ€</target> + <source>&Find next</source> <target>&Ðайти далее</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>Ð’Ñ‹ можете попытатьÑÑ Ñинхронизировать оÑтавшиеÑÑ Ð¿ÑƒÐ½ÐºÑ‚Ñ‹ Ñнова (без повторного ÑравнениÑ)!</target> -<source>Batch file created successfully!</source> -<target>Файл пакетного Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ñоздан уÑпешно!</target> + <source>Main bar</source> <target>Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ</target> + <source>Folder pairs</source> <target>Пары папок Ð´Ð»Ñ Ñинхронизации</target> + <source>Select view</source> -<target>СпиÑок файлов</target> +<target>Вид ÑпиÑка файлов</target> + <source>Set direction:</source> <target>Выберите направление:</target> + <source>Exclude temporarily</source> <target>ИÑключить</target> + <source>Include temporarily</source> <target>Включить</target> + <source>Exclude via filter:</source> <target>ИÑключить через фильтр:</target> + <source><multiple selection></source> <target><групповое выделение></target> + <source>D-Click</source> <target>Двойной клик</target> + <source>Delete</source> <target>Удалить</target> + <source>Customize...</source> <target>Выбрать колонки...</target> + +<source>Select time span...</source> +<target>Выберите промежуток времени...</target> + <source>Auto-adjust columns</source> <target>Ðвтовыравнивание ширины колонок</target> + <source>Include all rows</source> <target>Отметить вÑе</target> + <source>Exclude all rows</source> <target>Ðе отмечать ничего</target> + <source>Reset view</source> <target>Ð¡Ð±Ñ€Ð¾Ñ Ð½Ð°Ñтроек вида</target> + <source>Show "%x"</source> <target>Показать "%x"</target> + <source><Last session></source> <target><ПоÑледнÑÑ ÑеÑÑиÑ></target> + <source>Configuration saved!</source> <target>ÐаÑтройки Ñинхронизации Ñохранены!</target> + <source>Save changes to current configuration?</source> <target>Сохранить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² текущих наÑтройках Ñинхронизации?</target> + <source>Configuration loaded!</source> <target>ÐаÑтройки Ñинхронизации загружены!</target> + <source>Folder Comparison and Synchronization</source> <target>Сравнение и ÑинхронизациÑ</target> + <source>Hide files that exist on left side only</source> <target>Скрыть файлы, ÑущеÑтвующие только Ñлева</target> + <source>Show files that exist on left side only</source> <target>Показать файлы, ÑущеÑтвующие только Ñлева</target> + <source>Hide files that exist on right side only</source> <target>Скрыть файлы, ÑущеÑтвующие только Ñправа</target> + <source>Show files that exist on right side only</source> <target>Показать файлы, ÑущеÑтвующие только Ñправа</target> + <source>Hide files that are newer on left</source> <target>Скрыть файлы, которые новее Ñлева</target> + <source>Show files that are newer on left</source> <target>Показать файлы, которые новее Ñлева</target> + <source>Hide files that are newer on right</source> <target>Скрыть файлы, которые новее Ñправа</target> + <source>Show files that are newer on right</source> <target>Показать файлы, которые новее Ñправа</target> + <source>Hide files that are equal</source> <target>Скрыть одинаковые файлы</target> + <source>Show files that are equal</source> <target>Показать одинаковые файлы</target> + <source>Hide files that are different</source> <target>Скрыть различающиеÑÑ Ñ„Ð°Ð¹Ð»Ñ‹</target> + <source>Show files that are different</source> <target>Показать различающиеÑÑ Ñ„Ð°Ð¹Ð»Ñ‹</target> + <source>Hide conflicts</source> <target>Скрыть конфликтующие файлы</target> + <source>Show conflicts</source> <target>Показать конфликтующие файлы</target> + <source>Hide files that will be created on the left side</source> <target>Скрыть файлы, которые будут Ñозданы на левой Ñтороне</target> + <source>Show files that will be created on the left side</source> <target>Показать файлы, которые будут Ñозданы на левой Ñтороне</target> + <source>Hide files that will be created on the right side</source> <target>Скрыть файлы, которые будут Ñозданы на правой Ñтороне</target> + <source>Show files that will be created on the right side</source> <target>Показать файлы, которые будут Ñозданы на правой Ñтороне</target> + <source>Hide files that will be deleted on the left side</source> <target>Скрыть файлы, которые будут удалены на левой Ñтороне</target> + <source>Show files that will be deleted on the left side</source> <target>Показать файлы, которые будут удалены на левой Ñтороне</target> + <source>Hide files that will be deleted on the right side</source> <target>Скрыть файлы, которые будут удалены на правой Ñтороне</target> + <source>Show files that will be deleted on the right side</source> <target>Показать файлы, которые будут удалены на правой Ñтороне</target> + <source>Hide files that will be overwritten on left side</source> <target>Скрыть файлы, которые будут перезапиÑаны на левой Ñтороне</target> + <source>Show files that will be overwritten on left side</source> <target>Показать файлы, которые будут перезапиÑаны на левой Ñтороне</target> + <source>Hide files that will be overwritten on right side</source> <target>Скрыть файлы, которые будут перезапиÑаны на правой Ñтороне</target> + <source>Show files that will be overwritten on right side</source> <target>Показать файлы, которые будут перезапиÑаны на правой Ñтороне</target> + <source>Hide files that won't be copied</source> <target>Скрыть файлы, которые не будут Ñкопированы</target> + <source>Show files that won't be copied</source> <target>Показать файлы, которые не будут Ñкопированы</target> + <source>All directories in sync!</source> <target>Ð’Ñе папки Ñинхронизированы!</target> + <source>Please run a Compare first before synchronizing!</source> <target>ПожалуйÑта, запуÑтите Ñравнение перед Ñинхронизацией!</target> + <source>Comma separated list</source> <target>СпиÑок, разделÑемый запÑтыми</target> + <source>Legend</source> <target>Легенда</target> + <source>File list exported!</source> <target>СпиÑок файлов ÑкÑпортирован!</target> + +<source>Batch file created successfully!</source> +<target>Файл пакетного Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ñоздан уÑпешно!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -823,6 +1139,7 @@ Transfer file and directory permissions <pluralform>%x объекта удалены уÑпешно!</pluralform> <pluralform>%x объектов удалены уÑпешно!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -832,6 +1149,7 @@ Transfer file and directory permissions <pluralform>%x папки</pluralform> <pluralform>%x папок</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -841,6 +1159,7 @@ Transfer file and directory permissions <pluralform>%x файла</pluralform> <pluralform>%x файлов</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -850,75 +1169,100 @@ Transfer file and directory permissions <pluralform>%x из %y Ñтрок показано</pluralform> <pluralform>%x из %y Ñтрок показано</pluralform> </target> + <source>Scanning...</source> <target>Сканирование...</target> + <source>Comparing content...</source> <target>Сравнение ÑодержаниÑ...</target> + <source>Paused</source> <target>Пауза</target> + <source>Aborted</source> <target>Отменено</target> + <source>Completed</source> <target>Завершено</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹: Ожидайте, пока Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ñ‚ÑÑ...</target> + <source>Continue</source> <target>Продолжить</target> + <source>Pause</source> <target>Пауза</target> + <source>Cannot find %x</source> <target>Ðевозможно найти %x</target> -<source>DECISION TREE</source> -<target>Древо решений</target> -<source>file exists on both sides</source> -<target>файлы ÑущеÑтвуют на обоих Ñторонах</target> -<source>on one side only</source> -<target>файлы ÑущеÑтвуют только на одной Ñтороне</target> -<source>same date</source> -<target>одинаковые даты</target> -<source>different date</source> -<target>разные даты</target> + <source>Inactive</source> <target>---</target> -<source>Second</source> -<target>Секунд</target> -<source>Minute</source> -<target>Минут</target> -<source>Hour</source> -<target>ЧаÑов</target> -<source>Day</source> -<target>Дней</target> + +<source>Last x hours</source> +<target>поÑление x чаÑов</target> + +<source>Today</source> +<target>ÑегоднÑ</target> + +<source>This week</source> +<target>на Ñтой неделе</target> + +<source>This month</source> +<target>в Ñтом меÑÑце</target> + +<source>This year</source> +<target>в Ñтом году</target> + <source>Byte</source> <target>Байт</target> + <source>KB</source> <target>КБ</target> + <source>MB</source> <target>МБ</target> + <source>Filter: All pairs</source> <target>Фильтр: Ð’Ñе пары</target> + <source>Filter: Single pair</source> <target>Фильтр: Одна пара</target> + <source>Ignore</source> <target>Игнорировать</target> + <source>Direct</source> <target>ПрÑмое</target> + <source>Follow</source> <target>ПоÑледовательное</target> + +<source>Copy NTFS permissions</source> +<target>Копирование NTFS прав доÑтупа</target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target> Интегрируйте внешние Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² контекÑтное меню. ДоÑтупны Ñледующие команды: </target> + <source>- full file or directory name</source> <target>- полный путь файла или папки</target> + <source>- directory part only</source> <target>- чаÑÑ‚ÑŒ пути папки</target> + <source>- Other side's counterpart to %name</source> <target>- аналогичный файл Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñтороны</target> + <source>- Other side's counterpart to %dir</source> <target>- Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñтороны</target> + <source>Restore all hidden dialogs?</source> <target>Отображать вÑе Ñкрытые диалоговые окна?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -928,6 +1272,7 @@ Transfer file and directory permissions <pluralform>Ð’Ñ‹ точно хотите перемеÑтить Ñледующие %x объекта в "Корзину"?</pluralform> <pluralform>Ð’Ñ‹ точно хотите перемеÑтить Ñледующие %x объектов в "Корзину"?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -937,142 +1282,214 @@ Transfer file and directory permissions <pluralform>Ð’Ñ‹ точно хотите удалить Ñледующие %x объекта?</pluralform> <pluralform>Ð’Ñ‹ точно хотите удалить Ñледующие %x объектов?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>ОÑтавить как нерешенный конфликт</target> + <source>Delete permanently</source> <target>УдалÑÑ‚ÑŒ, не Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ð² "Корзину"</target> + <source>Delete or overwrite files permanently</source> <target>УдалÑÑ‚ÑŒ или перезапиÑать файлы, не Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ð² "Корзину"</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>ИÑпользовать "Корзину" при удалении или перезапиÑи файлов</target> + <source>Versioning</source> <target>Перемещать удалÑемые файлы в заданную папку</target> + <source>Move files into a time-stamped subdirectory</source> <target>Перемещать файлы в заданную папку (можно Ñоздавать архивные верÑии удаленных файлов)</target> -<source>Cannot determine sync-direction:</source> -<target>Ðевозможно определить направление Ñинхронизации:</target> -<source>Filter settings have changed!</source> -<target>ÐаÑтройки фильтра были изменены!</target> + <source>Both sides have changed since last synchronization!</source> <target>Со времени поÑледней Ñинхронизации Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон произошли изменениÑ!</target> + +<source>Cannot determine sync-direction:</source> +<target>Ðевозможно определить направление Ñинхронизации:</target> + <source>No change since last synchronization!</source> <target>Ðикаких изменений Ñ Ð¿Ð¾Ñледней Ñинхронизации!</target> + +<source>Filter settings have changed!</source> +<target>ÐаÑтройки фильтра были изменены!</target> + <source>The file was not processed by last synchronization!</source> <target>Файл не был обработан при поÑледней Ñинхронизации!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>При удалении папки возник конфликт Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ð¼Ð¸ подпапками или файлами!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target> ÐаÑтройка Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñинхронизации по умолчанию: Старые файлы будут заменены более новыми файлами. </target> + <source>The file does not contain a valid configuration:</source> <target>Файл не Ñодержит дейÑтвительных наÑтроек Ñинхронизации:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>Ð’Ñ‹ можете проигнорировать ошибку, принÑв папку за пуÑтую.</target> + <source>Directory does not exist:</source> <target>Папка не ÑущеÑтвует:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>ЗавиÑимые папки! Будьте внимательны при наÑтройке правил Ñинхронизации:</target> + <source>Comparing content of files %x</source> <target>Сравнение ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² %x</target> + <source>Memory allocation failed!</source> <target>Ошибка Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼Ñти! (Ðе хватает памÑти)</target> + <source>File %x has an invalid date!</source> <target>Файл %x имеет недейÑтвительную дату!</target> + <source>Conflict detected:</source> <target>Обнаружен конфликт:</target> + <source>Files %x have the same date but a different size!</source> <target>Файлы %x имеют одинаковую дату, но различаютÑÑ Ð¿Ð¾ размеру!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>Ð¡Ð¸Ð¼Ð²Ð¾Ð»ÑŒÐ½Ð°Ñ ÑÑылка %x имеет ту же дату, но различное Ñодержание!</target> + <source>Comparing files by content failed.</source> <target>Сравнение файлов по Ñодержимому провалено.</target> + <source>Generating file list...</source> <target>Создание ÑпиÑка файлов...</target> + <source>Multiple...</source> <target>Различные варианты Ñинхронизации</target> + <source>Both sides are equal</source> <target>Обе Ñтороны равны</target> + <source>Files/folders differ in attributes only</source> <target>Файлы/папки разнÑÑ‚ÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ атрибутами</target> + <source>Copy new file/folder to left</source> <target>Скопировать новый файл/папку налево</target> + <source>Copy new file/folder to right</source> <target>Скопировать новый файл/папку направо</target> + <source>Delete left file/folder</source> <target>Удалить файл/папку Ñлева</target> + <source>Delete right file/folder</source> <target>Удалить файл/папку Ñправа</target> + <source>Overwrite left file/folder with right one</source> -<target>ПерезапиÑать файл/папку Ñлева на аналогичную Ñправа</target> +<target>ПерезапиÑать файл/папку Ñлева на аналогичную из правой чаÑти</target> + <source>Overwrite right file/folder with left one</source> -<target>ПерезапиÑать файл/папку Ñправа на аналогичную Ñлева</target> +<target>ПерезапиÑать файл/папку Ñправа на аналогичную из левой чаÑти</target> + <source>Do nothing</source> <target>Ðичего не делать</target> + <source>Copy file attributes only to left</source> <target>Скопировать только атрибуты файла налево</target> + <source>Copy file attributes only to right</source> <target>Скопировать только атрибуты файла направо</target> + <source>Deleting file %x</source> <target>Удаление файла %x</target> -<source>Deleting Symbolic Link %x</source> -<target>Удаление Ñимвольной ÑÑылки %x</target> + <source>Deleting folder %x</source> <target>Удаление папки %x</target> -<source>Moving %x to Recycle Bin</source> -<target>Отправка %x в "Корзину"</target> -<source>Moving file %x to user-defined directory %y</source> -<target>Перемещение файла %x в заданную пользователем папку %y</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>Перемещение папки %x в заданную пользователем папку %y</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>Перемещение Ñимвольной ÑÑылки %x в заданную пользователем папку %y</target> -<source>Copying new file %x to %y</source> -<target>Копирование нового файла %x в %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>Копирование новой Ñимвольной ÑÑылки %x в %y</target> -<source>Overwriting file %x in %y</source> -<target>ПерезапиÑÑŒ файла %x в %y</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>ПерезапиÑÑŒ Ñимвольной ÑÑылки %x в %y</target> + +<source>Deleting symbolic link %x</source> +<target>Удаление Ñимвольной ÑÑылки %x</target> + +<source>Moving file %x to recycle bin</source> +<target>Перемещение файла %x в "Корзину"</target> + +<source>Moving folder %x to recycle bin</source> +<target>Перемещение папки %x в "Корзину"</target> + +<source>Moving symbolic link %x to recycle bin</source> +<target>Перемещение Ñимвольной ÑÑылки %x в "Корзину"</target> + +<source>Moving file %x to %y</source> +<target>Перемещение файла %x в %y</target> + +<source>Moving folder %x to %y</source> +<target>Перемещение папки %x в %y</target> + +<source>Moving symbolic link %x to %y</source> +<target>Перемещение Ñимвольной ÑÑылки %x в %y</target> + +<source>Creating file %x</source> +<target>Создание файла %x</target> + +<source>Creating symbolic link %x</source> +<target>Создание Ñимвольной ÑÑылки %x</target> + <source>Creating folder %x</source> <target>Создание папки %x</target> + +<source>Overwriting file %x</source> +<target>ПерезапиÑÑŒ файла %x</target> + +<source>Overwriting symbolic link %x</source> +<target>ПерезапиÑÑŒ Ñимвольной ÑÑылки %x</target> + <source>Verifying file %x</source> <target>Проверка файла %x</target> + <source>Updating attributes of %x</source> <target>Обновление атрибутов %x</target> -<source>Source directory does not exist anymore:</source> -<target>ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° больше не ÑущеÑтвует:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>Ðичего нет Ð´Ð»Ñ Ñинхронизации в ÑоответÑтвии Ñ Ð½Ð°Ñтройками Ñинхронизации!</target> + <source>Target directory name must not be empty!</source> <target>Путь целевой папки не должен быть пуÑтым!</target> + <source>User-defined directory for deletion was not specified!</source> <target>ПользовательÑÐºÐ°Ñ Ð¿Ð°Ð¿ÐºÐ° Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ была указана!</target> + +<source>Source directory does not exist anymore:</source> +<target>ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° больше не ÑущеÑтвует:</target> + <source>Unresolved conflicts existing!</source> <target>СущеÑтвуют нерешенные конфликты</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>Ð’Ñ‹ можете проигнорировать их и продолжить Ñинхронизацию.</target> + <source>Significant difference detected:</source> <target>Обнаружено ÑущеÑтвенное различие:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>Более 50% общего количеÑтва файлов будет Ñкопировано или удалено!</target> + <source>Not enough free disk space available in:</source> <target>Ðе доÑтаточно Ñвободного меÑта в:</target> + <source>Free disk space required:</source> <target>Требуемое Ñвободное меÑто на диÑке:</target> + <source>Free disk space available:</source> <target>ДоÑтупно Ñвободного меÑта на диÑке:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target></target> +<target>Ð”Ð»Ñ Ñтого пути "Корзина" не доÑтупна! Файлы будут удалены безвозвратно:</target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>Папка, входÑÑ‰Ð°Ñ Ð² неÑколько пар папок, будет изменена. ПожалуйÑта, проверьте наÑтройки Ñинхронизации!</target> + <source>Processing folder pair:</source> <target>Обработка пары папок:</target> + <source>Generating database...</source> <target>Создание базы данных...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>Ðичего нет Ð´Ð»Ñ Ñинхронизации в ÑоответÑтвии Ñ Ð½Ð°Ñтройками Ñинхронизации!</target> + <source>Error copying locked file %x!</source> <target>Ошибка при копировании заблокированного файла %x!</target> + <source>Data verification error: Source and target file have different content!</source> <target>Ошибка проверки данных: иÑходный и конечный файлы имеют разное Ñодержание!</target> + diff --git a/BUILD/Languages/slovenian.lng b/BUILD/Languages/slovenian.lng index 99f7d887..ef5e3eb1 100644 --- a/BUILD/Languages/slovenian.lng +++ b/BUILD/Languages/slovenian.lng @@ -8,75 +8,116 @@ </header> <source>Searching for directory %x...</source> -<target></target> +<target>IÅ¡Äem imenik %x...</target> + <source>Show in Explorer</source> <target>Prikaži v Raziskovalcu</target> + <source>Open with default application</source> <target>Odpri s privzeto aplikacijo</target> + <source>Browse directory</source> <target>Brskaj po imeniku</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Avtomatizirana sinhronizacija</target> + <source>Browse</source> <target>Brskaj</target> -<source>Invalid commandline: %x</source> -<target>NapaÄen ukaz v vrstici: %x</target> + +<source>Invalid command line: %x</source> +<target>NapaÄna ukazna vrstica: %x</target> + <source>Error resolving symbolic link:</source> <target>Napaka pri razreÅ¡evanju simboliÄne povezave:</target> -<source>Show popup</source> + +<source>Show pop-up</source> <target>Prikaži pojavno okno</target> -<source>Show popup on errors or warnings</source> -<target>Prikaži pojavno okno pri napakah in opozorilih</target> + +<source>Show pop-up on errors or warnings</source> +<target>Prikaži pojavne napaka ali opozorila</target> + <source>Ignore errors</source> <target>Ignoriraj napake</target> + <source>Hide all error and warning messages</source> <target>Skrij vsa obvestila o napakah in opozorilih</target> + <source>Exit instantly</source> <target>Zapusti v trenutku</target> + <source>Abort synchronization immediately</source> <target>Takoj prekini sinhronizacijo</target> + +<source>Select alternate comparison settings</source> +<target>Izberite alternativne nastavitve primerjanja</target> + <source>Select alternate synchronization settings</source> <target>Izberite nadomestne nastavitve sinhronizacije</target> + <source>No filter selected</source> <target>Noben filter ni izbran</target> + <source>Filter is active</source> <target>Filter je aktiven</target> -<source>Clear filter settings</source> -<target>PoÄisti nastavitve filtra</target> + <source>Remove alternate settings</source> <target>Odstrani nadomestne nastavitve</target> + +<source>Clear filter settings</source> +<target>PoÄisti nastavitve filtra</target> + <source>Create a batch job</source> -<target>Ustvari batch opravilo</target> +<target>Ustvari paketno opravilo</target> + <source>Synchronization settings</source> <target>Nastavitve sinhronizacije</target> + <source>Comparison settings</source> <target>Nastavitve primerjanja</target> + <source>About</source> <target>O programu(1)</target> + <source>Error</source> <target>Napaka</target> + <source>Warning</source> <target>Pozor</target> + <source>Question</source> <target>VpraÅ¡anje</target> + <source>Confirm</source> <target>Potrdi</target> + <source>Configure filter</source> <target>Konfiguriraj filter</target> + <source>Customize columns</source> <target>Stolpce prikroji po meri</target> + <source>Global settings</source> <target>Globalne nastavitve</target> + <source>Synchronization Preview</source> <target>Predogled sinhronizacije</target> + <source>Find</source> <target>Najdi</target> + +<source>Select time span</source> +<target>Izberite Äasovni okvir</target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -87,46 +128,64 @@ <pluralform>%x Bajti</pluralform> <pluralform>%x Bajtov</pluralform> </target> + <source><Symlink></source> <target><SimboliÄna povezava></target> + <source><Directory></source> <target><Imenik></target> + <source>Size</source> <target>Velikost</target> + <source>Date</source> <target>Datum</target> + <source>Full path</source> <target>Polna pot</target> + <source>Filename</source> <target>Ime datoteke</target> + <source>Relative path</source> <target>Relativna pot</target> + <source>Directory</source> <target>Imenik</target> + <source>Extension</source> <target>RazÅ¡iritev</target> + <source>Comparison Result</source> <target>Rezultati primerjave</target> + <source>Incompatible synchronization database format:</source> <target>Nekompatibilen format sinhronizacijske podatkovne baze:</target> + <source>Initial synchronization:</source> <target>ZaÄetna sinhronizacija:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>Ena od FreeFileSync datotek podatkovne baze Å¡e en obstaja:</target> + <source>Error reading from synchronization database:</source> <target>Napaka pri branju iz sinhronizacijske podatkovne baze:</target> + <source>Database files do not share a common synchronization session:</source> -<target></target> +<target>Datoteke podatkovne baze si ne delijo skupne sinhronizacijske seje:</target> + <source>An exception occurred!</source> <target>Zgodila se je napaka!</target> -<source>Error deleting file:</source> -<target>Napaka pri brisanju datoteke:</target> + <source>Error reading file attributes:</source> <target>Napaka pri branju atributov datoteke:</target> + <source>Waiting while directory is locked (%x)...</source> <target>ÄŒakam, medtem ko se zaklepa imenik (%x)...</target> + <source>Error setting directory lock:</source> <target>Napaka pri nastavljanju zaklepanja imenika:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -137,27 +196,42 @@ <pluralform>%x sek</pluralform> <pluralform>%x sek</pluralform> </target> + <source>Info</source> <target>Info</target> + <source>Fatal Error</source> <target>Usodna napaka</target> + <source>Scanning:</source> <target>Pregledujem:</target> + <source>Encoding extended time information: %x</source> <target>Podrobne informacije o Äasu enkodiranja: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> -<target></target> +<target> +<pluralform>[1 nit]</pluralform> +<pluralform>[%x niti]</pluralform> +<pluralform>[%x niti]</pluralform> +<pluralform>[%x niti]</pluralform> +</target> + <source>Invalid FreeFileSync config file!</source> <target>Neveljavna FreeFileSync nastavitvena datoteka!</target> + <source>File does not exist:</source> <target>Datoteka ne obstaja:</target> + <source>Error parsing configuration file:</source> <target>Napaka pri preverjanju konfiguracijske datoteke:</target> + <source>/sec</source> <target>/sek</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -168,6 +242,7 @@ <pluralform>%x min</pluralform> <pluralform>%x min</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -178,6 +253,7 @@ <pluralform>%x ure</pluralform> <pluralform>%x ur</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -188,28 +264,40 @@ <pluralform>%x dni</pluralform> <pluralform>%x dni</pluralform> </target> + <source>S&ave configuration...</source> <target>Shr&ani konfiguracijo...</target> + <source>&Load configuration...</source> <target>Na&loži konfiguracijo...</target> + <source>&Quit</source> <target>&Zapri</target> + <source>&File</source> <target>&Datoteka</target> + <source>&Content</source> <target>&Vsebina</target> + <source>&About...</source> <target>&O programu...</target> + <source>&Help</source> <target>&PomoÄ</target> + <source>Usage:</source> <target>Uporaba:</target> + <source>1. Select directories to monitor.</source> <target>1. Izberite imenike za nadziranje</target> + <source>2. Enter a command line.</source> <target>2. Vnesite ukazno-vrstico.</target> + <source>3. Press 'Start'.</source> <target>3. Pritisnite 'ZaÄni'.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -220,310 +308,461 @@ Ukazna vrstica se izvrÅ¡i vsakiÄ ko: - vsi imeniki postanejo dostopni (npr. ob vstavitvi USB kljuÄa) - so datoteke znotraj teh imenikov in podimenikov spremenjene </target> + <source>Directories to watch</source> <target>Imenika za nadzorovanje</target> + <source>Add folder</source> <target>Dodaj mapo</target> + <source>Remove folder</source> <target>Odstrani v mapo</target> + <source>Select a folder</source> <target>Izberite mapo</target> + <source>Command line</source> <target>Ukazna vrstica</target> + <source>Minimum Idle Time [seconds]</source> <target>Minimalen Äas nedejavnosti [sekunde]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>ÄŒas nedejavnosti med zaznavanjem zadnje spremembe in izvrÅ¡itvijo ukazne vrstice v sekundah</target> + <source>Start</source> <target>ZaÄni</target> + <source>(Build: %x)</source> <target>(Izgradnja: %x)</target> + <source>RealtimeSync configuration</source> <target>RealtimeSync nastavitve</target> + <source>File already exists. Overwrite?</source> <target>Datoteka že obstaja. PrepiÅ¡em?</target> + <source>&Restore</source> <target>&Obnovi</target> + <source>&Exit</source> <target>&Izhod</target> + <source>Monitoring active...</source> <target>Nadziranje aktivno...</target> + <source>Waiting for missing directories...</source> <target>ÄŒakam na manjkajoÄe imenike...</target> + <source>A directory input field is empty.</source> <target>Vpisno polje za imenik je prazno.</target> + <source>Drag && drop</source> <target>Povleci && spusti</target> + <source>Could not initialize directory monitoring:</source> <target>Ne morem zaÄeti nadzorovanja imenikov:</target> + <source>Error when monitoring directories.</source> <target>Napaka pri nadzorovanju imenikov.</target> + <source>Conversion error:</source> <target>Napaka pri pretvorbi:</target> + +<source>Error deleting file:</source> +<target>Napaka pri brisanju datoteke:</target> + <source>Error moving file:</source> <target>Napaka pri premikanju datoteke:</target> + <source>Target file already existing!</source> <target>Ciljna datoteka že obstaja!</target> + <source>Error moving directory:</source> <target>Napaka pri premikanju imenika:</target> + <source>Target directory already existing!</source> <target>Ciljni imenik že obstaja!</target> + <source>Error deleting directory:</source> <target>Napaka pri brisanju imenika:</target> + <source>Error changing modification time:</source> <target>Napaka pri spreminjanju Äasa modifikacije:</target> + <source>Error loading library function:</source> <target>Napaka pri nalaganju funkcije iz knjižnice:</target> + <source>Error reading security context:</source> <target>Napaka pri branju varnostne skladnosti:</target> + <source>Error writing security context:</source> <target>Napaka pri pisanju varnostne skladnosti:</target> + <source>Error copying file permissions:</source> <target>Napaka pri kopiranju datoteÄnih dovoljenj:</target> + <source>Error creating directory:</source> <target>Napaka pri ustvarjanju imenika:</target> + <source>Error copying symbolic link:</source> <target>Napaka pri kopiranju simboliÄnih povezav:</target> + <source>Error copying file:</source> <target>Napaka pri kopiranju datoteke:</target> + <source>Error opening file:</source> <target>Napaka pri odpiranju datoteke:</target> + <source>Error writing file:</source> <target>Napaka pri pisanju datoteke:</target> + <source>Error reading file:</source> <target>Napaka pri branju datoteke:</target> + <source>Operation aborted!</source> <target>Operacija prekinjena!</target> + <source>Endless loop when traversing directory:</source> <target>NeskonÄna zanka pri prehodu imenika:</target> + <source>Error traversing directory:</source> <target>Napaka pri prehajanju imenika:</target> + <source>Windows Error Code %x:</source> <target>Windows koda napake %x:</target> + <source>Linux Error Code %x:</source> <target>Linux koda napake %x:</target> + <source>Error setting privilege:</source> <target>Napaka pri nastavljanju privilegija:</target> + <source>Error moving to Recycle Bin:</source> <target>Napaka pri premikanju v KoÅ¡:</target> + <source>Could not load a required DLL:</source> <target>Ne morem naložiti zahtevano DLL:</target> + <source>Error writing to synchronization database:</source> <target>Napaka pri pisanju v sinhronizacijsko podatkovno bazo:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>Napaka pri zagonu servisa Volume Shadow Copy!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target>Napaka pri dostopu do servisa senÄnih kopij!</target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>Ustvarjanje senÄnih kopij na WOW63 ni podprto. Prosimo uporabite 64-bitno FreeFileSync razliÄico.</target> + <source>Could not determine volume name for file:</source> <target>Ne morem doloÄiti imena volumna za datoteko:</target> + <source>Volume name %x not part of filename %y!</source> <target>Ime volumna %x ni del imena datoteke %y!</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>Ne morem brati vrednosti za naslednja XML vozliÅ¡Äa:</target> + <source>Logging</source> -<target>Beležim</target> +<target>Beleženje</target> + <source>FreeFileSync batch file</source> -<target>FreeFileSync batch datoteka</target> +<target>FreeFileSync paketna datoteka</target> + <source>FreeFileSync configuration</source> <target>FreeFileSync konfiguracija</target> + <source>FreeFileSync Batch Job</source> -<target>FreeFileSync Batch opravilo</target> +<target>FreeFileSync Paketno opravilo</target> + <source>Unable to create logfile!</source> <target>Ne morem ustvariti datoteko za beleženje!</target> + <source>Batch execution</source> -<target>Batch izvajanje</target> +<target>Paketno izvajanje</target> + <source>Log-messages:</source> <target>SporoÄila beleženja:</target> + <source>Stop</source> <target>Ustavi</target> + <source>Total time:</source> <target>Celoten Äas:</target> + <source>Synchronization aborted!</source> <target>Sinhronizacija prekinjena!</target> + <source>Synchronization completed with errors!</source> <target>Sinhronizacija se je konÄala z napakami!</target> + <source>Synchronization completed successfully!</source> <target>Sinhronizacija uspeÅ¡no zakljuÄena!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>Pritisnite "Zamenjaj", da odprete FreeFileSync GUI naÄin.</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>Preklapljam v FreeFileSync GUI naÄin...</target> + <source>Unable to connect to sourceforge.net!</source> <target>Ne morem se povezati na sourceforge.net!</target> + <source>A newer version of FreeFileSync is available:</source> <target>Na voljo je nova razliÄica FreeFileSync:</target> + <source>Download now?</source> <target>Prenesem sedaj?</target> + <source>Information</source> <target>Informacije</target> + <source>FreeFileSync is up to date!</source> <target>FreeFileSync je posodobljen!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>Ali želite, da FreeFileSync samodejno preverja za posodobitve vsak teden?</target> + <source>(Requires an Internet connection!)</source> <target>(Zahteva povezavo z Internetom!)</target> + <source>1. &Compare</source> <target>1. &Primerjaj</target> + <source>2. &Synchronize...</source> <target>2. &Sinhroniziraj...</target> + <source>S&witch view</source> <target>Sp&remeni pogled</target> + <source>&New</source> <target>&Novo</target> + <source>&Program</source> <target>&Program</target> + <source>&Language</source> <target>&Jezik</target> + <source>&Global settings...</source> <target>&Globalne nastavitve...</target> + <source>&Create batch job...</source> -<target>&Ustvari batch opravilo...</target> +<target>&Ustvari paketno opravilo...</target> + <source>&Export file list...</source> <target>&Izvozi seznam datotek...</target> + <source>&Advanced</source> <target>&Napredno</target> + <source>&Check for new version</source> <target>&Preveri za novo razliÄico</target> + <source>Compare</source> <target>Primerjaj</target> + <source>Compare both sides</source> <target>Primerjaj obe strani</target> + <source>&Abort</source> <target>&Prekini</target> + <source>Synchronize...</source> <target>Sinhroniziraj...</target> + <source>Start synchronization</source> <target>ZaÄni sinhronizacijo</target> -<source>Swap sides</source> -<target>Zamenjaj strani</target> + <source>Add folder pair</source> <target>Dodaj par imenikov</target> + <source>Remove folder pair</source> <target>Odstrani par imenikov</target> + +<source>Swap sides</source> +<target>Zamenjaj strani</target> + <source>Save current configuration to file</source> <target>Shrani trenutno konfiguracijo v datoteko</target> + <source>Load configuration from file</source> <target>Naloži konfiguracijo iz datoteke</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>Zadnje uporabljene konfiguracije (pritisite DEL za odstranitev s seznama)</target> + <source>Hide excluded items</source> <target>Skrij izkljuÄene predmete</target> + <source>Hide filtered or temporarily excluded files</source> <target>Skrij filtrirane ali zaÄasno izkljuÄene datoteke</target> + <source>Number of files and directories that will be created</source> <target>Å tevilo datotek in imenikov, ki bodo ustvarjeni</target> + <source>Number of files that will be overwritten</source> <target>Å tevilo datotek, ki bodo prepisane</target> + <source>Number of files and directories that will be deleted</source> <target>Å tevilo datotek in imenikov, ki bodo izbrisani</target> + <source>Total amount of data that will be transferred</source> <target>KoliÄina podatkov, ki bo preneÅ¡ena</target> -<source>Left</source> -<target>Levo</target> -<source>Right</source> -<target>Desno</target> + <source>Batch job</source> -<target>Batch opravilo</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>Ustvari batch datoteko za avtomatizirano sinhronizacijo. Da zaÄnete v batch naÄinu preprosto dvokliknite datoteko ali jo izvrÅ¡ite preko ukazne vrstice: FreeFileSync.exe <batchfile>. To se lahko nastavi v razpored opravil vaÅ¡ega operacijskega sistema.</target> +<target>Paketno opravilo</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target>Ustvarite paketno datoteko za avtomatizirano sinhronizacijo. Da zaÄnete v paketnem naÄinu preprosto dvokliknite datoteko ali izvrÅ¡ite ukaz preko ukazne vrstice: FreeFileSync.exe <ffs_paketna datoteka>. To se lahko nastavi tudi v urniku opravil vaÅ¡ega operacijskega sistema.</target> + <source>Help</source> <target>PomoÄ</target> + <source>Filter files</source> <target>Filtriraj datoteke</target> + <source>Error handling</source> <target>Napaka pri obravnavanju</target> + +<source>Left</source> +<target>Levo</target> + +<source>Right</source> +<target>Desno</target> + <source>Overview</source> <target>Pregled</target> + <source>Status feedback</source> <target>Povratne informacije statusa</target> + <source>Run minimized</source> -<target></target> +<target>Poženi pomanjÅ¡ano</target> + <source>Maximum number of logfiles:</source> <target>Maksimalno Å¡tevilo datotek beleženja:</target> + <source>Select logfile directory:</source> <target>Izberite imenik za datoteko beleženja:</target> + <source>Batch settings</source> -<target></target> +<target>Paketne nastavitve</target> + <source>&Save</source> <target>&Shrani</target> + <source>&Load</source> <target>&Naloži</target> + <source>&Cancel</source> <target>&PrekliÄi</target> + <source>Elements found:</source> <target>Najdenih elementov:</target> + <source>Elements remaining:</source> <target>Preostalih elementov:</target> + <source>Speed:</source> <target>Hitrost:</target> + <source>Time remaining:</source> <target>Preostali Äas:</target> + <source>Time elapsed:</source> <target>PreteÄen Äas:</target> + <source>Operation:</source> <target>Operacija:</target> + <source>Select variant:</source> <target>Izberite varianto:</target> + <source><Automatic></source> <target><Samodejno></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>Prepoznaj in Å¡iri spremembe na obeh straneh z uporabo podatkovne baze. Izbrisi in spori so zaznani samodejno.</target> + <source>Mirror ->></source> <target>Zrcalno ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Zrcalna varnostna kopija leve mape. Desna mapa bo spremenjena, da se bo natanÄno ujemala z levo mapo po sinhronizaciji.</target> + <source>Update -></source> <target>Posodobi -></target> + <source>Copy new or updated files to right folder.</source> <target>Kopiraj nove ali posodobljene datoteke v desno mapo.</target> + <source>Custom</source> <target>Po meri</target> + <source>Configure your own synchronization rules.</source> <target>Konfigurirajte vaÅ¡a lastna sinhronizacijska pravila.</target> + <source>Deletion handling</source> <target>Ravnanje pri brisanju</target> + <source>&OK</source> <target>&V redu</target> + <source>Configuration</source> <target>Konfiguracija</target> + <source>Category</source> <target>Kategorija</target> + <source>Action</source> <target>Ukrep</target> + <source>File/folder exists on left side only</source> <target>Datoteka/mapa obstaja samo na levi strani</target> + <source>File/folder exists on right side only</source> <target>Datoteka/mapa obstaja samo na desni strani</target> + <source>Left file is newer</source> <target>Leva datoteka je novejÅ¡a</target> + <source>Right file is newer</source> <target>Desna datoteka je novejÅ¡a</target> + <source>Files have different content</source> <target>Datoteki imata razliÄno vsebino</target> + <source>Conflict/file cannot be categorized</source> <target>Spor/datoteka ne more biti kategorizirana</target> + <source>Compare by...</source> <target>Primerjaj po...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> <target> -Datoteki sta enaki, Äe so +Datoteki sta enaki, Äe sta + - zadnji Äas zapisa in datum - velikost datoteke - - zadnji Äas spremembe in datum -enaki +enaka </target> -<source>File size and date</source> -<target>Velikosti in datumu datoteke</target> + +<source>File time and size</source> +<target>ÄŒas in velikost datoteke</target> + <source> Files are found equal if - file content @@ -534,110 +773,109 @@ Datoteki sta enaki, Äe - je vsebina datoteke enaka </target> + <source>File content</source> <target>Vsebini datoteke</target> + <source>Symbolic Link handling</source> <target>Rokovanje s simboliÄnimi povezavami</target> + <source>Synchronizing...</source> <target>Sinhroniziram...</target> + <source>Elements processed:</source> <target>Obdelanih elementov:</target> + <source>&Pause</source> <target>&Premor</target> -<source>Compare by "File size and date"</source> -<target>Primerjaj po "Datumu in velikosti"</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>Ta varianta oceni dve datoteki z enakim imenom kot enaki, ko imata enako velikost IN enak datum ter Äas zadnjega spreminjanja.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>Ko se primerjava zažene s tem setom možnosti, se obdela naslednje drevo odloÄitev:</target> -<source>As a result the files are separated into the following categories:</source> -<target>Kot rezultat so datoteke razdeljene v naslednje kategorije:</target> -<source>- equal</source> -<target>- enaki</target> -<source>- left newer</source> -<target>- leva novejÅ¡a</target> -<source>- right newer</source> -<target>- desna novejÅ¡a</target> -<source>- exists left only</source> -<target>- obstaja samo na levi</target> -<source>- exists right only</source> -<target>- obstaja samo na desni</target> -<source>- conflict (same date, different size)</source> -<target>- spor (isti datum, razliÄna velikost)</target> -<source>Compare by "File content"</source> -<target>Primerjaj po "Vsebini datotek"</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. - -With this option enabled the decision tree is smaller: -</source> -<target> -Kot že samo ime pove, sta dve datoteki oznaÄeni kot enaki samo takrat, ko imata enako vsebino. Ta možnost je bolj uporabna za preverjanje doslednosti kot za operacije varnostnega shranjevanja. Zaradi tega se Äasi datotek ne upoÅ¡tevajo. -Z omogoÄeno to možnostjo je drevo odloÄanja manjÅ¡e: -</target> -<source>- different</source> -<target>- razliÄni</target> <source>Source code written in C++ utilizing:</source> <target>Izvorna koda napisana v C++ z uporabo:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>Zahvale za prevod FreeFileSync gredo:</target> + <source>Feedback and suggestions are welcome at:</source> <target>Povratne informacije in predlogi so dobrodoÅ¡li na:</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync na Sourceforge</target> + <source>Homepage</source> <target>DomaÄa stran</target> + <source>If you like FFS</source> <target>ÄŒe vam je FFS vÅ¡eÄ</target> + <source>Donate with PayPal</source> <target>Doniraj s PayPal</target> + <source>Email</source> <target>Email</target> + <source>Report translation error</source> <target>PoroÄaj o napaki prevoda</target> + <source>Published under the GNU General Public License:</source> <target>Objavljeno pod licenco GNU General Public:</target> + <source>Ignore subsequent errors</source> <target>Ignoriraj vse nadaljnje napake</target> + <source>Hide further error messages during the current process</source> <target>Skrijte nadaljnja obvestila o napakah med trenutnim procesom</target> + <source>&Ignore</source> <target>&Ignoriraj</target> + <source>&Retry</source> <target>&Ponovi</target> + <source>Do not show this dialog again</source> <target>Ne prikaži veÄ tega pogovornega okna</target> + <source>&Switch</source> <target>&Zamenjaj</target> + <source>&Yes</source> <target>&Da</target> + <source>&No</source> <target>&Ne</target> + <source>Delete on both sides</source> <target>IzbriÅ¡i na obeh straneh</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>IzbriÅ¡i na obeh straneh, Äetudi je datoteka izbrana na samo eni strani</target> + <source>Use Recycle Bin</source> <target>Uporabi KoÅ¡</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. </source> <target> Samo datoteke/imeniki, ki ustrezajo vsem nastavitvam filtra bodo izbrani za sinhronizacjo. -Opomba: Ime filtra mora biti doloÄen relativno(!) glede na glavne sinhronizacijske imenike. +Opomba: Ime filtra mora biti doloÄeno relativno(!) glede na glavne sinhronizacijske imenike. </target> + <source>Hints:</source> <target>Namigi:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. Vnesite relativna imena datotek ali imenikov loÄenih s ';' ali novo vrstico.</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. Uporabite lahko tudi znake '*' in '?'.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. IzkljuÄite datoteke neposredno na glavni mreži s kontekstnim menujem.</target> + <source>Example</source> <target>Primer</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -646,30 +884,40 @@ Exclude: \stuff\temp\* VkljuÄi: *.doc;*.zip;*.exe IzkljuÄi: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>Sinhroniziraj vse .doc, .zip in .exe datoteke, razen iz podmape "temp".</target> + <source>Include</source> <target>VkljuÄi</target> + <source>Exclude</source> <target>IzkljuÄi</target> -<source>Select time span:</source> -<target>Izberite Äasovno obdobje:</target> -<source>Minimum file size:</source> -<target>Minimalna velikost datoteke:</target> -<source>Maximum file size:</source> -<target>Maksimalna velikost datoteke:</target> + +<source>Minimum file size</source> +<target>Minimalna velikost datoteke</target> + +<source>Maximum file size</source> +<target>Maksimalna velikost datoteke</target> + <source>&Default</source> <target>&Privzeto</target> + <source>Move column up</source> <target>Premakni stolpec gor</target> + <source>Move column down</source> <target>Premakni stolpec dol</target> -<source>Transactional File Copy</source> -<target></target> + +<source>Transactional file copy</source> +<target>Transakcijsko kopiranje datotek</target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> -<target></target> +<target>Najprej zapisuj datoteke v zaÄasno (*.ffs_tmp) in jih nato preimenuj. To zagotavlja konsistentno stanje celo v situacijah usodnih napak.</target> + <source>Copy locked files</source> <target>Kopiraj zaklenjene datoteke</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -678,8 +926,10 @@ Copy shared or locked files using Volume Shadow Copy Service Kopiraj deljene ali zaklenjene datoteke z uporabo servisa Shadow Copy (Zahteva pravice skrbnika) </target> -<source>Copy filesystem permissions</source> -<target>Kopiraj dovoljenja datoteÄnega sistema</target> + +<source>Copy file access permissions</source> +<target>Kopiraj dovoljenja dostopov datoteke</target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -688,138 +938,205 @@ Transfer file and directory permissions Prenesi dovoljenja datotek in imenikov (Zahteva pravice skrbnika) </target> + <source>Hidden dialogs:</source> <target>Skriti pogovori:</target> + <source>Reset</source> <target>Ponastavi</target> + <source>Show hidden dialogs</source> <target>Prikaži skrite pogovore</target> + <source>External applications</source> <target>Zunanje aplikacije</target> + <source>Description</source> <target>Opis</target> + <source>Variant</source> <target>RazliÄica</target> + <source>Statistics</source> <target>Statistika</target> + <source>Find what:</source> <target>Najdi kaj</target> + <source>Match case</source> <target>Ujemaj se s primerom</target> + <source>&Find next</source> <target>&Najdi naslednje</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>Naslednje predmete lahko ponovno poskusite sinhronizirati (BREZ ponovne primerjave) !</target> -<source>Batch file created successfully!</source> -<target>Datoteka batch je bila uspeÅ¡no ustvarjena!</target> + <source>Main bar</source> <target>Glavna vrstica</target> + <source>Folder pairs</source> <target>Pari map</target> + <source>Select view</source> <target>Izberite pogled</target> + <source>Set direction:</source> <target>Nastavi smer:</target> + <source>Exclude temporarily</source> <target>ZaÄasno izkljuÄi</target> + <source>Include temporarily</source> <target>Trenutno vkljuÄi</target> + <source>Exclude via filter:</source> <target>IzkljuÄi preko filtra:</target> + <source><multiple selection></source> <target><mnogokratna izbira></target> + <source>D-Click</source> <target>D-Klik</target> + <source>Delete</source> <target>IzbriÅ¡i</target> + <source>Customize...</source> <target>Prilagodi...</target> + +<source>Select time span...</source> +<target>Izberite Äasovni okvir...</target> + <source>Auto-adjust columns</source> <target>Samo-prilagodi stolpce</target> + <source>Include all rows</source> <target>VkljuÄi se vrstice</target> + <source>Exclude all rows</source> <target>IzkljuÄi vse vrstice</target> + <source>Reset view</source> <target>Ponastavi pogled</target> + <source>Show "%x"</source> <target>Prikaži "%x"</target> + <source><Last session></source> <target><Zadnja seja></target> + <source>Configuration saved!</source> <target>Konfiguracija shranjena!</target> + <source>Save changes to current configuration?</source> <target>Shranim spremembe trenutne konfiguracije?</target> + <source>Configuration loaded!</source> <target>Konfiguracija naložena!</target> + <source>Folder Comparison and Synchronization</source> <target>Primerjava in sinhronizacija imenika</target> + <source>Hide files that exist on left side only</source> <target>Skrij datoteke, ki obstajajo samo na levi strani</target> + <source>Show files that exist on left side only</source> <target>Prikaži datoteke, ki obstajajo samo na levi</target> + <source>Hide files that exist on right side only</source> <target>Skrij datoteke, ki obstajajo samo na desni strani</target> + <source>Show files that exist on right side only</source> <target>Prikaži datoteke, ki obstajajo samo na desni</target> + <source>Hide files that are newer on left</source> <target>Skrij najnovejÅ¡e datoteke na levi</target> + <source>Show files that are newer on left</source> <target>Prikaži datoteke, ki so novejÅ¡e na levi</target> + <source>Hide files that are newer on right</source> <target>Skrij najnovejÅ¡e datoteke na desni</target> + <source>Show files that are newer on right</source> <target>Prikaži datoteke, ki so novejÅ¡e na desni</target> + <source>Hide files that are equal</source> <target>Skrij enake datoteke</target> + <source>Show files that are equal</source> <target>Prikaži datoteke, ki so enake</target> + <source>Hide files that are different</source> <target>Skrij datoteke ki so razliÄne</target> + <source>Show files that are different</source> <target>Prikaži datoteke, ki so razliÄne</target> + <source>Hide conflicts</source> <target>Skrij spore</target> + <source>Show conflicts</source> <target>Prikaži spore</target> + <source>Hide files that will be created on the left side</source> <target>Skrij datoteke, ki bodo ustvarjene na levi strani</target> + <source>Show files that will be created on the left side</source> <target>Prikaži datoteke, ki bodo ustvarjene na levi strani</target> + <source>Hide files that will be created on the right side</source> <target>Skrij datoteke, ki bodo ustvarjene na desni strani</target> + <source>Show files that will be created on the right side</source> <target>Prikaži datoteke, ki bodo ustvarjene na desni strani</target> + <source>Hide files that will be deleted on the left side</source> <target>Skrij datoteke, ki bodo izbrisane na levi strani</target> + <source>Show files that will be deleted on the left side</source> <target>Prikaži datoteke, ki bodo izbrisane na levi strani</target> + <source>Hide files that will be deleted on the right side</source> <target>Skrij datoteke, ki bodo izbrisane na desni strani</target> + <source>Show files that will be deleted on the right side</source> <target>Prikaži datoteke, ki bodo izbrisane na desni strani</target> + <source>Hide files that will be overwritten on left side</source> <target>Skrij datoteke, ki bodo prepisane na levi strani</target> + <source>Show files that will be overwritten on left side</source> <target>Prikaži datoteke, ki bodo prepisane na levi strani</target> + <source>Hide files that will be overwritten on right side</source> <target>Skrij datoteke, ki bodo prepisane na desni strani</target> + <source>Show files that will be overwritten on right side</source> <target>Prikaži datoteke, ki bodo prepisane na desni strani</target> + <source>Hide files that won't be copied</source> <target>Skrij datoteke, ki ne bodo kopirane</target> + <source>Show files that won't be copied</source> <target>Prikaži datoteke, ki ne bodo kopirane</target> + <source>All directories in sync!</source> <target>Vsi imeniki so sinhronizirani!</target> + <source>Please run a Compare first before synchronizing!</source> <target>Prosim najprej zaženite Primerjaj preden sinhronizirate!</target> + <source>Comma separated list</source> <target>Seznam loÄen z vejico</target> + <source>Legend</source> <target>Legenda</target> + <source>File list exported!</source> <target>Seznam datotek je bil izvožen!</target> + +<source>Batch file created successfully!</source> +<target>Paketna datoteka je bila uspeÅ¡no ustvarjena!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -830,6 +1147,7 @@ Prenesi dovoljenja datotek in imenikov <pluralform>%x objekti uspeÅ¡no izbrisani!</pluralform> <pluralform>%x objektov uspeÅ¡no izbrisanih!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -840,6 +1158,7 @@ Prenesi dovoljenja datotek in imenikov <pluralform>%x imeniki</pluralform> <pluralform>%x imenikov</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -850,6 +1169,7 @@ Prenesi dovoljenja datotek in imenikov <pluralform>%x datoteke</pluralform> <pluralform>%x datotek</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -860,72 +1180,97 @@ Prenesi dovoljenja datotek in imenikov <pluralform>%x od %y vrstic v prikazu</pluralform> <pluralform>%x od %y vrstic v prikazu</pluralform> </target> + <source>Scanning...</source> <target>Pregledujem...</target> + <source>Comparing content...</source> <target>Primerjam vsebino...</target> + <source>Paused</source> <target>Na premoru</target> + <source>Aborted</source> <target>Prekinitev uspela</target> + <source>Completed</source> <target>ZakljuÄeno</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>Zahtevana je bila prekinitev: Äakam, da se zakljuÄi trenutna operacija...</target> + <source>Continue</source> <target>Nadaljuj</target> + <source>Pause</source> <target>Premor</target> + <source>Cannot find %x</source> <target>Ne najdem %x</target> -<source>DECISION TREE</source> -<target>DREVO ODLOÄŒITEV</target> -<source>file exists on both sides</source> -<target>datoteka obstaja na obeh straneh</target> -<source>on one side only</source> -<target>samo na eni strani</target> -<source>same date</source> -<target>enak datum</target> -<source>different date</source> -<target>razliÄen datum</target> + <source>Inactive</source> <target>Neaktivno</target> -<source>Second</source> -<target>Sekunda</target> -<source>Minute</source> -<target>Minuta</target> -<source>Hour</source> -<target>Ura</target> -<source>Day</source> -<target>Dan</target> + +<source>Last x hours</source> +<target>Zadnjih x ur</target> + +<source>Today</source> +<target>Danes</target> + +<source>This week</source> +<target>Ta teden</target> + +<source>This month</source> +<target>Ta mesec</target> + +<source>This year</source> +<target>To leto</target> + <source>Byte</source> <target>Bajt</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>Filtriraj: Vse pare</target> + <source>Filter: Single pair</source> <target>Filtriraj: En sam par</target> + <source>Ignore</source> <target>Ignoriraj</target> + <source>Direct</source> <target>Neposredno</target> + <source>Follow</source> <target>Sledi</target> + +<source>Copy NTFS permissions</source> +<target>Kopiraj NTFS dovoljenja</target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>Integriraj zunanje aplikacije v kontekstni menu. Na voljo so naslednji makri:</target> + <source>- full file or directory name</source> <target>- polno ime datoteke ali imenika</target> + <source>- directory part only</source> <target>- del, ki zajema samo imenike</target> + <source>- Other side's counterpart to %name</source> <target>- Duplikat z druge strani od %name</target> + <source>- Other side's counterpart to %dir</source> <target>- Duplikat z druge strani od %dir</target> + <source>Restore all hidden dialogs?</source> <target>Obnovim vse skrite pogovore?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -936,6 +1281,7 @@ Prenesi dovoljenja datotek in imenikov <pluralform>Ali resniÄno želite premakniti naslednje %x objekte v KoÅ¡?</pluralform> <pluralform>Ali resniÄno želite premakniti naslednjih %x objektov v KoÅ¡?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -946,139 +1292,211 @@ Prenesi dovoljenja datotek in imenikov <pluralform>Ali resniÄno želite izbrisati naslednje %x objekte?</pluralform> <pluralform>Ali resniÄno želite izbrisati naslednjih %x objektov?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>Pusti kot nereÅ¡eni spor</target> + <source>Delete permanently</source> <target>Trajno izbriÅ¡i</target> + <source>Delete or overwrite files permanently</source> <target>Trajno izbriÅ¡i ali prepiÅ¡i datoteke</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>Uporabi KoÅ¡ pri brisanju ali prepisovanju datotek</target> + <source>Versioning</source> <target>Ustvarjanje razliÄiÄ</target> + <source>Move files into a time-stamped subdirectory</source> <target>Premakni datoteke v Äasovno-oznaÄen podimenik</target> -<source>Cannot determine sync-direction:</source> -<target>Ne morem doloÄiti sinhronizacijske smeri.</target> -<source>Filter settings have changed!</source> -<target>Nastavitve filtra so bile spremenjene!</target> + <source>Both sides have changed since last synchronization!</source> <target>Obe strani sta se spremenili od zadnje sinhronizacije!</target> + +<source>Cannot determine sync-direction:</source> +<target>Ne morem doloÄiti sinhronizacijske smeri.</target> + <source>No change since last synchronization!</source> <target>Ni sprememb od zadnje sinhronizacije!</target> + +<source>Filter settings have changed!</source> +<target>Nastavitve filtra so bile spremenjene!</target> + <source>The file was not processed by last synchronization!</source> <target>Datoteka ni bila obdelana z zadnjo sinhronizacijo!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>NaÄrtovano brisanje imenika je v sporu z njegovimi podimeniki in -datotekami!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Nastavljanje privzetih smeri sinhronizacije: Stare datoteke bodo prepisane z novimi datotekami.</target> + <source>The file does not contain a valid configuration:</source> <target>Datoteka ne vsebuje veljavne konfiguracije:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>To napako z obravnavanjem imenika kot praznega lahko ignorirate.</target> + <source>Directory does not exist:</source> <target>Imenik ne obstaja:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Imeniki so v odvisnosti! Bodite pozorni, ko nastavljate sinhronizacijska pravila:</target> + <source>Comparing content of files %x</source> <target>Primerjam vsebino datotek %x</target> + <source>Memory allocation failed!</source> <target>NeuspeÅ¡no dodeljevanje pomnilnika!</target> + <source>File %x has an invalid date!</source> <target>Datoteka %x ima neveljaven datum!</target> + <source>Conflict detected:</source> <target>Zaznan spor:</target> + <source>Files %x have the same date but a different size!</source> <target>Datoteki %x imata enak datum ampak razliÄno velikost!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>SimboliÄne povezave %x imajo isti datum, vendar razliÄni cilj!</target> + <source>Comparing files by content failed.</source> <target>Primerjava datotek po vsebini ni uspela.</target> + <source>Generating file list...</source> <target>Ustvarjam seznam datotek...</target> + <source>Multiple...</source> <target>VeÄkratno...</target> + <source>Both sides are equal</source> <target>Obe strani sta enaki</target> + <source>Files/folders differ in attributes only</source> <target>Datoteke/mape se razlikujejo samo v atributih</target> + <source>Copy new file/folder to left</source> <target>Kopiraj novo datoteko/mapo na levo</target> + <source>Copy new file/folder to right</source> <target>Kopiraj novo datoteko/mapo na desno</target> + <source>Delete left file/folder</source> <target>IzbriÅ¡i levo datoteko/mapo</target> + <source>Delete right file/folder</source> <target>IzbriÅ¡i desno datoteko/mapo</target> + <source>Overwrite left file/folder with right one</source> <target>PrepiÅ¡i levo datoteko/mapo s tisto na desni</target> + <source>Overwrite right file/folder with left one</source> <target>PrepiÅ¡i desno datoteko/mapo s tisto na levi</target> + <source>Do nothing</source> <target>Ne naredi niÄesar</target> + <source>Copy file attributes only to left</source> <target>Kopiraj atribute datoteke samo na levo</target> + <source>Copy file attributes only to right</source> <target>Kopiraj atribute datoteke samo na desno</target> + <source>Deleting file %x</source> <target>Brisanje datoteke %x</target> -<source>Deleting Symbolic Link %x</source> -<target>Brisanje simboliÄne povezave %x</target> + <source>Deleting folder %x</source> <target>Brisanje mape %x</target> -<source>Moving %x to Recycle Bin</source> -<target>Premikam %x v KoÅ¡</target> -<source>Moving file %x to user-defined directory %y</source> -<target>Premikam datoteko %x v uporabniÅ¡ko-doloÄen imenik %y</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>Premikam mapo %x v uporabniÅ¡ko-doloÄen imenik %y</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>Premikam simboliÄno povezavo %x v uporabniÅ¡ko doloÄen imenik %y</target> -<source>Copying new file %x to %y</source> -<target>Kopiram novo datoteko %x v %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>Kopiram novo SimboliÄno povezavo %x v %y</target> -<source>Overwriting file %x in %y</source> -<target>Prepisujem datoteko %x v %y</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>Prepisujem SimboliÄno povezavo %x v %y</target> + +<source>Deleting symbolic link %x</source> +<target>Brisanje simboliÄnih povezav %x</target> + +<source>Moving file %x to recycle bin</source> +<target>Premikam datoteko %x v koÅ¡</target> + +<source>Moving folder %x to recycle bin</source> +<target>Premikam mapo %x v koÅ¡</target> + +<source>Moving symbolic link %x to recycle bin</source> +<target>Premikam simboliÄno povezavo %x v koÅ¡</target> + +<source>Moving file %x to %y</source> +<target>Premikam datoteko %x v %y</target> + +<source>Moving folder %x to %y</source> +<target>Premikam mapo %x v %y</target> + +<source>Moving symbolic link %x to %y</source> +<target>Premikam simboliÄno povezavo %x v %y</target> + +<source>Creating file %x</source> +<target>Ustvarjam datoteko %x</target> + +<source>Creating symbolic link %x</source> +<target>Ustvarjam simboliÄno povezavo %x</target> + <source>Creating folder %x</source> <target>Ustvarjam mapo %x</target> + +<source>Overwriting file %x</source> +<target>Prepisujem datoteko %x</target> + +<source>Overwriting symbolic link %x</source> +<target>Prepisujem simboliÄno povezavo %x</target> + <source>Verifying file %x</source> <target>Preverjam datoteko %x</target> + <source>Updating attributes of %x</source> <target>Posodabljam atribute od %x</target> -<source>Source directory does not exist anymore:</source> -<target>Izvorni imenik ne obstaja veÄ:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>Po trenutni konfiguraciji ni niÄ za sinhronizirati!</target> + <source>Target directory name must not be empty!</source> <target>Ime ciljnega imenika ne sme biti prazno!</target> + <source>User-defined directory for deletion was not specified!</source> <target>UporabniÅ¡ko-doloÄen imenik za brisanje ni bil naveden!</target> + +<source>Source directory does not exist anymore:</source> +<target>Izvorni imenik ne obstaja veÄ:</target> + <source>Unresolved conflicts existing!</source> <target>Obstajajo nereÅ¡eni spori!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>Lahko ignorirate spore in nadaljujete s sinhronizacijo.</target> + <source>Significant difference detected:</source> <target>Zaznana je važna razlika:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>VeÄ kot 50% od celotnega Å¡tevila datotek bo kopiranih ali izbrisanih!</target> + <source>Not enough free disk space available in:</source> <target>Na voljo ni dovolj prostega prostora na disku v:</target> + <source>Free disk space required:</source> <target>Potreben prostor na disku:</target> + <source>Free disk space available:</source> <target>Prosti disk, ki je na voljo:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target></target> +<target>KoÅ¡ ni na voljo za naslednje poti! Namesto tega bodo datoteke trajno izbrisane:</target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>Imenik bo spremenjen, kar je del veÄkratnih parov map! Prosimo preglejte nastavitve sinhronizacije!</target> + <source>Processing folder pair:</source> <target>Obdelujem par map:</target> + <source>Generating database...</source> <target>Ustvarjam podatkovno bazo...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>Po trenutni konfiguraciji ni niÄ za sinhronizirati!</target> + <source>Error copying locked file %x!</source> <target>Napaka pri kopiranju zaklenjene datoteke %x!</target> + <source>Data verification error: Source and target file have different content!</source> <target>Napaka pri preverjanju podatkov: izvorna in ciljna datoteka imata razliÄno vsebino!</target> + diff --git a/BUILD/Languages/spanish.lng b/BUILD/Languages/spanish.lng index b5fe1b11..36835e0a 100644 --- a/BUILD/Languages/spanish.lng +++ b/BUILD/Languages/spanish.lng @@ -8,75 +8,116 @@ </header> <source>Searching for directory %x...</source> -<target></target> +<target>Buscando directorio %x...</target> + <source>Show in Explorer</source> <target>Mostrar en Explorer</target> + <source>Open with default application</source> <target>Abrir con la aplicación por defecto</target> + <source>Browse directory</source> <target>Examinar directorio</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Sincronización Automática</target> + <source>Browse</source> <target>Examinar</target> -<source>Invalid commandline: %x</source> -<target>LÃnea de comandos inválida: %x</target> + +<source>Invalid command line: %x</source> +<target>LÃnea de comandos errónea: %x</target> + <source>Error resolving symbolic link:</source> <target>Error al resolver enlace simbólico:</target> -<source>Show popup</source> -<target>Mostrar ventanas emergentes</target> -<source>Show popup on errors or warnings</source> -<target>Mostrar ventanas emergentes de errores o avisos</target> + +<source>Show pop-up</source> +<target>Mostrar ventana emergente</target> + +<source>Show pop-up on errors or warnings</source> +<target>Mostrar ventana emergente de errores o avisos</target> + <source>Ignore errors</source> <target>Ignorar errores</target> + <source>Hide all error and warning messages</source> <target>Ocultar todos los mensajes de error y aviso</target> + <source>Exit instantly</source> <target>Salir inmediatamente</target> + <source>Abort synchronization immediately</source> <target>Abortar sincronización inmediatamente</target> + +<source>Select alternate comparison settings</source> +<target>Seleccionar opciones alternativas de comparación</target> + <source>Select alternate synchronization settings</source> <target>Seleccione opciones alternativas de sincronización</target> + <source>No filter selected</source> <target>Ningún filtro seleccionado</target> + <source>Filter is active</source> <target>Filtro activo</target> -<source>Clear filter settings</source> -<target>Limpiar opciones del filtrado</target> + <source>Remove alternate settings</source> <target>Eliminar opciones alternativas</target> + +<source>Clear filter settings</source> +<target>Limpiar opciones del filtrado</target> + <source>Create a batch job</source> <target>Crear una tarea batch</target> + <source>Synchronization settings</source> <target>Opciones de sincronización</target> + <source>Comparison settings</source> <target>Opciones de comparación</target> + <source>About</source> <target>Acerca de</target> + <source>Error</source> <target>Error</target> + <source>Warning</source> <target>Atención</target> + <source>Question</source> <target>Pregunta</target> + <source>Confirm</source> <target>Confirmar</target> + <source>Configure filter</source> <target>Configurar filtro</target> + <source>Customize columns</source> <target>Personalizar columnas</target> + <source>Global settings</source> <target>Opciones globales</target> + <source>Synchronization Preview</source> <target>Previsualización de la sincronización</target> + <source>Find</source> <target>Buscar</target> + +<source>Select time span</source> +<target></target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -85,46 +126,64 @@ <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> </target> + <source><Symlink></source> <target><Enlace simbólico></target> + <source><Directory></source> <target><Directorio></target> + <source>Size</source> <target>Tamaño</target> + <source>Date</source> <target>Fecha</target> + <source>Full path</source> <target>Ruta completa</target> + <source>Filename</source> <target>Nombre del archivo</target> + <source>Relative path</source> <target>Ruta relativa</target> + <source>Directory</source> <target>Directorio</target> + <source>Extension</source> <target>Extensión</target> + <source>Comparison Result</source> <target>Resultado de la comparación</target> + <source>Incompatible synchronization database format:</source> <target>Formato de base de datos de sincronización incompatible:</target> + <source>Initial synchronization:</source> <target>Sincronización inicial:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>Uno de los archivos de la base de datos de FreeFileSync aún no existe:</target> + <source>Error reading from synchronization database:</source> <target>Error al leer de la base de datos de sincronización:</target> + <source>Database files do not share a common synchronization session:</source> -<target></target> +<target>Archivos de base de datos no comparten la misma sesión de sincronización:</target> + <source>An exception occurred!</source> <target>¡Ha ocurrido una excepción!</target> -<source>Error deleting file:</source> -<target>Error al borrar archivo:</target> + <source>Error reading file attributes:</source> <target>Error al leer atributos del archivo:</target> + <source>Waiting while directory is locked (%x)...</source> <target>Esperando mientras el directorio se encuentre bloqueado (%x)...</target> + <source>Error setting directory lock:</source> <target>Error al establecer bloqueo del directorio:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -133,27 +192,40 @@ <pluralform>1 segundo</pluralform> <pluralform>%x segundos</pluralform> </target> + <source>Info</source> <target>Info</target> + <source>Fatal Error</source> <target>Error fatal</target> + <source>Scanning:</source> <target>Escanear:</target> + <source>Encoding extended time information: %x</source> <target>Información temporal extendida de la codificación: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> -<target></target> +<target> +<pluralform>[1 Hilo]</pluralform> +<pluralform>[%x Hilos]</pluralform> +</target> + <source>Invalid FreeFileSync config file!</source> <target>¡Archivo de configuración de FreeFileSync inválido!</target> + <source>File does not exist:</source> <target>El archivo no existe:</target> + <source>Error parsing configuration file:</source> <target>Error al analizar el archivo de configuración:</target> + <source>/sec</source> <target>/seg</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -162,6 +234,7 @@ <pluralform>1 minuto</pluralform> <pluralform>%x minutos</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -170,6 +243,7 @@ <pluralform>1 hora</pluralform> <pluralform>%x horas</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -178,28 +252,40 @@ <pluralform>1 dÃa</pluralform> <pluralform>%x dÃas</pluralform> </target> + <source>S&ave configuration...</source> <target>G&uardar configuración...</target> + <source>&Load configuration...</source> <target>&Cargar configuración...</target> + <source>&Quit</source> <target>&Salir</target> + <source>&File</source> <target>&Archivo</target> + <source>&Content</source> <target>&Contenido</target> + <source>&About...</source> <target>&Acerca de...</target> + <source>&Help</source> <target>&Ayuda</target> + <source>Usage:</source> <target>Uso:</target> + <source>1. Select directories to monitor.</source> <target>1. Seleccione los directorios a visualizar.</target> + <source>2. Enter a command line.</source> <target>2. Introduzca una lÃnea de comandos.</target> + <source>3. Press 'Start'.</source> <target>3. Presione 'Inicio'.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -210,310 +296,461 @@ La lÃnea de comandos se ejecuta cada vez: - todos los directorios estan disponibles (ej. inserción de un lápiz USB) - archivos dentro de directorios o subdirectorios son modificados </target> + <source>Directories to watch</source> <target>Directorios a visualizar</target> + <source>Add folder</source> <target>Añadir carpeta</target> + <source>Remove folder</source> <target>Eliminar carpeta</target> + <source>Select a folder</source> <target>Seleccione una carpeta</target> + <source>Command line</source> <target>LÃnea de comandos</target> + <source>Minimum Idle Time [seconds]</source> <target>Tiempo mÃnimo de espera [segundos]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>Tiempo de inactividad entre la detección del último cambio y la ejecución de la lÃnea de comandos en segundos</target> + <source>Start</source> <target>Iniciar</target> + <source>(Build: %x)</source> <target>(Completado: %x)</target> + <source>RealtimeSync configuration</source> <target>Configuración de RealtimeSync</target> + <source>File already exists. Overwrite?</source> <target>El archivo ya existe. ¿Quiere sobreescribirlo?</target> + <source>&Restore</source> <target>&Restaurar</target> + <source>&Exit</source> <target>&Salir</target> + <source>Monitoring active...</source> <target>Visualización activa...</target> + <source>Waiting for missing directories...</source> <target>Esperando directorios faltantes...</target> + <source>A directory input field is empty.</source> <target>Un campo de directorio está vacÃo.</target> + <source>Drag && drop</source> <target>Arrastrar y soltar</target> + <source>Could not initialize directory monitoring:</source> <target>No se ha podido inicializar la visualización de directorios:</target> + <source>Error when monitoring directories.</source> <target>Error al visualizar los directorios.</target> + <source>Conversion error:</source> <target>Error de conversión:</target> + +<source>Error deleting file:</source> +<target>Error al borrar archivo:</target> + <source>Error moving file:</source> <target>Error al mover archivo:</target> + <source>Target file already existing!</source> <target>¡El archivo de destino ya existe!</target> + <source>Error moving directory:</source> <target>Error al mover directorio:</target> + <source>Target directory already existing!</source> <target>¡El directorio de destino ya existe!</target> + <source>Error deleting directory:</source> <target>Error al borrar directorio:</target> + <source>Error changing modification time:</source> <target>Error al cambiar hora de modificación:</target> + <source>Error loading library function:</source> <target>Error al cargar la función de biblioteca:</target> + <source>Error reading security context:</source> <target>Error al leer en contexto de seguridad:</target> + <source>Error writing security context:</source> <target>Error al escribir en contexto de seguridad:</target> + <source>Error copying file permissions:</source> <target>Error al copiar permisos del fichero:</target> + <source>Error creating directory:</source> <target>Error al crear directorio:</target> + <source>Error copying symbolic link:</source> <target>Error al copiar enlace simbólico:</target> + <source>Error copying file:</source> <target>Error al copiar archivo:</target> + <source>Error opening file:</source> <target>Error al abrir archivo:</target> + <source>Error writing file:</source> <target>Error al escribir archivo:</target> + <source>Error reading file:</source> <target>Error al leer archivo:</target> + <source>Operation aborted!</source> <target>¡Operación abortada!</target> + +<source>Could not load a required DLL:</source> +<target>No se ha podido cargar el DLL solicitado:</target> + <source>Endless loop when traversing directory:</source> <target>Bucle infinito al buscar en el directorio:</target> + <source>Error traversing directory:</source> <target>Error al buscar en el directorio:</target> + <source>Windows Error Code %x:</source> <target>Código de error de Windows %x:</target> + <source>Linux Error Code %x:</source> <target>Código de error de Linux %x:</target> + <source>Error setting privilege:</source> <target>Error al establecer privilegios:</target> + <source>Error moving to Recycle Bin:</source> <target>Error al mover a la Papelera de Reciclaje:</target> -<source>Could not load a required DLL:</source> -<target>No se ha podido cargar el DLL solicitado:</target> + <source>Error writing to synchronization database:</source> <target>Error al escribir en la base de datos de sincronización:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>¡Error al iniciar el servicio "Volume Shadow Copy"!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target>¡Error al acceder al servicio Volume Shadow Copy!</target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>La realización de copias shadow en WOW64 no está soportado. Por favor, use la versión 64-bit de FreeFileSync.</target> + <source>Could not determine volume name for file:</source> <target>No se ha podido determinar el nombre del volumen para el archivo:</target> + <source>Volume name %x not part of filename %y!</source> <target>El nombre del volumen %x no es una parte del nombre de archivo %y</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>No se ha podido leer los valores para los siguientes nodos XML:</target> + <source>Logging</source> <target>Iniciando sesión</target> + <source>FreeFileSync batch file</source> <target>Archivo batch de FreeFileSync</target> + <source>FreeFileSync configuration</source> <target>Configuración de FreeFileSync</target> + <source>FreeFileSync Batch Job</source> <target>Tarea batch de FreeFileSync</target> + <source>Unable to create logfile!</source> <target>¡Incapaz de crear un archivo de registro!</target> + <source>Batch execution</source> <target>Ejecución batch</target> + <source>Log-messages:</source> <target>Registro de mensajes:</target> + <source>Stop</source> <target>Detener</target> + <source>Total time:</source> <target>Tiempo total:</target> + <source>Synchronization aborted!</source> <target>¡Sincronización abortada!</target> + <source>Synchronization completed with errors!</source> <target>¡Sincronización completada con errores!</target> + <source>Synchronization completed successfully!</source> <target>¡Sincronización completada con éxito!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>Presionar "Cambiar" para abrir el modo GUI de FreeFileSync.</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>Cambiando al modo GUI de FreeFileSync...</target> + <source>Unable to connect to sourceforge.net!</source> <target>¡Incapaz de conectar con sourceforge.net!</target> + <source>A newer version of FreeFileSync is available:</source> <target>Una nueva versión de FreeFileSync está disponible:</target> + <source>Download now?</source> <target>¿Descargar ahora?</target> + <source>Information</source> <target>Información</target> + <source>FreeFileSync is up to date!</source> <target>¡FreeFileSync está actualizado!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>¿Quiere que FreeFileSync detecte automáticamente actualizaciones cada semana?</target> + <source>(Requires an Internet connection!)</source> <target>(¡Conexión a Internet necesaria!)</target> + <source>1. &Compare</source> <target>1. &Comparar</target> + <source>2. &Synchronize...</source> <target>2. &Sincronizar...</target> + <source>S&witch view</source> <target>C&ambiar vista</target> + <source>&New</source> <target>&Nuevo</target> + <source>&Program</source> <target>&Programa</target> + <source>&Language</source> <target>&Idioma</target> + <source>&Global settings...</source> <target>&Opciones globales...</target> + <source>&Create batch job...</source> <target>&Crear tarea batch...</target> + <source>&Export file list...</source> <target>&Exportar lista de archivos...</target> + <source>&Advanced</source> <target>&Avanzado</target> + <source>&Check for new version</source> <target>&Comprobar si existe una nueva versión</target> + <source>Compare</source> <target>Comparar</target> + <source>Compare both sides</source> <target>Comparar ambos lados</target> + <source>&Abort</source> <target>&Abortar</target> + <source>Synchronize...</source> <target>Sincronizar...</target> + <source>Start synchronization</source> <target>Iniciar sincronización</target> -<source>Swap sides</source> -<target>Intercambiar lados</target> + <source>Add folder pair</source> <target>Añadir un par de carpetas</target> + <source>Remove folder pair</source> <target>Eliminar un par de carpetas</target> + +<source>Swap sides</source> +<target>Intercambiar lados</target> + <source>Save current configuration to file</source> <target>Guardar configuración actual en un archivo</target> + <source>Load configuration from file</source> <target>Cargar configuración desde archivo</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>Últimas configuraciones usadas (Pulsar DEL para quitar de la lista)</target> + <source>Hide excluded items</source> <target>Ocultar elementos excluidos</target> + <source>Hide filtered or temporarily excluded files</source> <target>Ocultar archivos filtrados o temporalmente excluidos</target> + <source>Number of files and directories that will be created</source> <target>Número de archivos y directorios que serán creados</target> + <source>Number of files that will be overwritten</source> <target>Número de archivos que serán sobreescritos</target> + <source>Number of files and directories that will be deleted</source> <target>Número de archivos y directorios que serán eliminados</target> + <source>Total amount of data that will be transferred</source> <target>Cantidad total de datos que serán transferidos</target> -<source>Left</source> -<target>Izquierda</target> -<source>Right</source> -<target>Derecha</target> + <source>Batch job</source> <target>Tarea batch</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>Crear un archivo batch para la sincronización automática. Para iniciar el modo batch, simplemente hacer doble clic sobre el archivo o ejectuar mediante la lÃnea de comandos: FreeFileSync.exe <archivo_batch>. También se puede programar en el planificador del tareas del sistema operativo.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target>Crear fichero batch para sincronización automática. Para empezar en modo batch, simplemente haga doble clic en el archivo o ejecútelo a través de la lÃnea de comandos: FreeFileSync.exe <ffs_batch file>. Esto también puede programado por el planificador de tareas del sistema operativo.</target> + <source>Help</source> <target>Ayuda</target> + <source>Filter files</source> <target>Filtrar archivos</target> + <source>Error handling</source> <target>Gestión de errores</target> + +<source>Left</source> +<target>Izquierda</target> + +<source>Right</source> +<target>Derecha</target> + <source>Overview</source> <target>Visión global</target> + <source>Status feedback</source> <target>Status feedback</target> + <source>Run minimized</source> -<target></target> +<target>Ejectuar minimizado</target> + <source>Maximum number of logfiles:</source> <target>Número máximo de archivos de registro:</target> + <source>Select logfile directory:</source> <target>Seleccione directorio para el archivo de registro:</target> + <source>Batch settings</source> -<target></target> +<target>Opciones de batch</target> + <source>&Save</source> <target>&Guardar</target> + <source>&Load</source> <target>&Cargar</target> + <source>&Cancel</source> <target>&Cancelar</target> + <source>Elements found:</source> <target>Elementos encontrados:</target> + <source>Elements remaining:</source> <target>Elementos restantes:</target> + <source>Speed:</source> <target>Velocidad:</target> + <source>Time remaining:</source> <target>Tiempo restante:</target> + <source>Time elapsed:</source> <target>Tiempo transcurrido:</target> + <source>Operation:</source> <target>Operación:</target> + <source>Select variant:</source> <target>Seleccione un tipo:</target> + <source><Automatic></source> <target><Automático></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>Identificar y aplicar cambios en ambos lados usando una base de datos. Las eliminaciones y los conflictos se detectan automáticamente.</target> + <source>Mirror ->></source> <target>Espejo ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Copia de seguridad en espejo de la carpeta izquierda. La carpeta derecha es modificada exactamente como la carpeta izquierda después de la sincronización.</target> + <source>Update -></source> <target>Actualizar -></target> + <source>Copy new or updated files to right folder.</source> <target>Copiar archivos nuevos o actualizados a la carpeta de la derecha.</target> + <source>Custom</source> <target>Personalizado</target> + <source>Configure your own synchronization rules.</source> <target>Configuración de sus propias reglas de sincronización.</target> + <source>Deletion handling</source> <target>Gestión de borrado</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>Configuración</target> + <source>Category</source> <target>CategorÃa</target> + <source>Action</source> <target>Acción</target> + <source>File/folder exists on left side only</source> <target>Archivo/carpeta existe sólo en el lado izquierdo</target> + <source>File/folder exists on right side only</source> <target>Archivo/carpeta existe sólo en el lado derecho</target> + <source>Left file is newer</source> <target>El archivo de la izquierda es más reciente</target> + <source>Right file is newer</source> <target>El archivo de la derecha es más reciente</target> + <source>Files have different content</source> <target>Los archivos tienen contenido diferentes</target> + <source>Conflict/file cannot be categorized</source> <target>Conflicto/el achivo no puede ser categorizado</target> + <source>Compare by...</source> <target>Comparar por...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> <target> Los archivos serán considerados iguales si - - tamaño del archivo - - la hora y fecha de la última escritura + - última hora y fecha de escritura + - tamaño del archivo son iguales </target> -<source>File size and date</source> + +<source>File time and size</source> <target>Fecha y tamaño del archivo</target> + <source> Files are found equal if - file content @@ -524,92 +761,85 @@ Los archivos serán considerados iguales si - el contenido del archivo es el mismo </target> + <source>File content</source> <target>Contenido del archivo</target> + <source>Symbolic Link handling</source> <target>Gestión de enlaces simbólicos</target> + <source>Synchronizing...</source> <target>Sincronizando...</target> + <source>Elements processed:</source> <target>Elementos procesados:</target> + <source>&Pause</source> <target>&Pausa</target> -<source>Compare by "File size and date"</source> -<target>Comparar por "Tamaño y fecha del archivo"</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>Este tipo evalúa dos archivos con el mismo nombre como iguales cuando tienen el mismo tamaño de archivo y la misma fecha de modificación.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>Cuando la comparación se inicia con este conjunto de opciones se procesa el siguiente árbol de decisiones:</target> -<source>As a result the files are separated into the following categories:</source> -<target>Como resultado, los archivos están separados en las siguientes categorÃas:</target> -<source>- equal</source> -<target>- iguales</target> -<source>- left newer</source> -<target>- más reciente en la izquierda</target> -<source>- right newer</source> -<target>- más reciente en la derecha</target> -<source>- exists left only</source> -<target>- existe sólo en la izquierda</target> -<source>- exists right only</source> -<target>- existe sólo en la derecha</target> -<source>- conflict (same date, different size)</source> -<target>- conflicto (misma fecha, diferente tamaño)</target> -<source>Compare by "File content"</source> -<target>Comparar por "Contenido del archivo"</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. - -With this option enabled the decision tree is smaller: -</source> -<target> -Como el tÃtulo sugiere, dos archivos que comparten el mismo nombre son marcados como iguales sólo si tienen el mismo contenido. Esta opción es útil para las comprobaciones de consistencia más que en operaciones de copia de seguridad. Por lo tanto, las fechas de los archivos no se tienen en cuenta. -Con esta opción habilitada el árbol de decisiones se reduce a: -</target> -<source>- different</source> -<target>- diferentes</target> <source>Source code written in C++ utilizing:</source> <target>Código fuente escrito en C++ utilizando:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>Agradecimientos por la traducción de FreeFileSync a:</target> + <source>Feedback and suggestions are welcome at:</source> <target>Comentarios y sugerencias son bienvenidos en:</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync en Sourceforge</target> + <source>Homepage</source> <target>Página de inicio</target> + <source>If you like FFS</source> <target>Si te gusta FFS</target> + <source>Donate with PayPal</source> <target>Donar a través de PayPal</target> + <source>Email</source> <target>Correo electrónico</target> + <source>Report translation error</source> <target>Informar de errores de traducción</target> + <source>Published under the GNU General Public License:</source> <target>Publicado bajo "GNU General Public License":</target> + <source>Ignore subsequent errors</source> <target>Ignorar errores posteriores</target> + <source>Hide further error messages during the current process</source> <target>Ocultar próximos mensajes de error durante el proceso actual</target> + <source>&Ignore</source> <target>&Ignorar</target> + <source>&Retry</source> <target>&Reintentar</target> + <source>Do not show this dialog again</source> <target>No volver a mostrar este diálogo</target> + <source>&Switch</source> <target>&Cambiar</target> + <source>&Yes</source> <target>&Si</target> + <source>&No</source> <target>&No</target> + <source>Delete on both sides</source> <target>Borrar en ambos lados</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>Borrar en ambos lados incluso si el archivo está seleccionado en un solo lado</target> + <source>Use Recycle Bin</source> <target>Utilizar Papelera de Reciclaje</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -618,16 +848,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire Sólo los archivos/directorios que cumplan con todos los filtros serán seleccionados para la sincronización. Nota: El nombre del filtro debe ser especificado en relación(!) a los directorios principales de sincronización. </target> + <source>Hints:</source> <target>Consejos:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. Introduzca los nombres de los archivos o directorios relativos separados por ';' o una nueva lÃnea.</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. Usar caracteres comodÃn '*' y '?'.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. Excluir directamente archivos sobre las celdas a través del menú de contexto.</target> + <source>Example</source> <target>Ejemplo</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -636,30 +872,40 @@ Exclude: \stuff\temp\* Incluir: *.doc;*.zip;*.exe Excluir: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>Sincronizar todos los archivos .doc, .zip y .exe excepto el contenido de la subcarpeta "temp".</target> + <source>Include</source> <target>Incluir</target> + <source>Exclude</source> <target>Excluir</target> -<source>Select time span:</source> -<target>Seleccionar intervalo de tiempo:</target> -<source>Minimum file size:</source> -<target>Tamaño mÃnimo de archivo:</target> -<source>Maximum file size:</source> -<target>Tamaño máximo de archivo</target> + +<source>Minimum file size</source> +<target>Tamaño mÃnimo de archivo</target> + +<source>Maximum file size</source> +<target>Taaño máximo de archivo</target> + <source>&Default</source> <target>&Configuración por defecto</target> + <source>Move column up</source> <target>Mover arriba la columna</target> + <source>Move column down</source> <target>Mover abajo la columna</target> -<source>Transactional File Copy</source> -<target></target> + +<source>Transactional file copy</source> +<target>Copia de archivos transaccionales</target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> -<target></target> +<target>Escribir archivos temporales (*.ffs_tmp) primero y reescribirlos después. Esto asegura un estado de consistencia incluso en situaciones de error fatal.</target> + <source>Copy locked files</source> <target>Copiar archivos bloqueados</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -668,8 +914,10 @@ Copy shared or locked files using Volume Shadow Copy Service Copiar archivos compartidos o bloqueados usando el servicio "Volume Shadow Copy" (Requiere derechos de administrador) </target> -<source>Copy filesystem permissions</source> -<target>Permisos de copia del sistema de ficheros</target> + +<source>Copy file access permissions</source> +<target>Copiar permisos de acceso al archivo</target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -678,138 +926,217 @@ Transfer file and directory permissions Transferir permisos de archivo y directorio (Requiere derechos de administrador) </target> + <source>Hidden dialogs:</source> <target>Diálogos ocultos:</target> + <source>Reset</source> <target>Reiniciar</target> + <source>Show hidden dialogs</source> <target>Mostrar diálogos ocultos</target> + <source>External applications</source> <target>Aplicaciones externas</target> + <source>Description</source> <target>Descripción</target> + <source>Variant</source> <target>Tipo</target> + <source>Statistics</source> <target>EstadÃstica</target> + <source>Find what:</source> <target>Buscar:</target> + <source>Match case</source> <target>Distinción entre mayúsculas y minúsculas</target> + <source>&Find next</source> <target>&Buscar siguiente</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>¡Puede intentar sincronizar los elementos restantes otra vez (SIN tener que volver a comparar)!</target> -<source>Batch file created successfully!</source> -<target>¡El archivo batch ha sido creado correctamente!</target> + <source>Main bar</source> <target>Barra principal</target> + <source>Folder pairs</source> <target>Pares de carpetas</target> + <source>Select view</source> <target>Sellecione vista</target> + <source>Set direction:</source> <target>Indicar dirección:</target> + <source>Exclude temporarily</source> <target>Excluir temporalmente</target> + <source>Include temporarily</source> <target>Incluir temporalmente</target> + <source>Exclude via filter:</source> <target>Excluir a través del filtro:</target> + <source><multiple selection></source> <target><selección múltiple></target> + <source>D-Click</source> <target>Doble click</target> + <source>Delete</source> <target>Eliminar</target> + <source>Customize...</source> <target>Personalizar...</target> + +<source>Select time span...</source> +<target>Seleccionar duración</target> + <source>Auto-adjust columns</source> <target>Ajustar automáticamente las columnas</target> + +<source>Icon size:</source> +<target></target> + +<source>Small</source> +<target></target> + +<source>Medium</source> +<target></target> + +<source>Large</source> +<target></target> + <source>Include all rows</source> <target>Incluir todas las filas</target> + <source>Exclude all rows</source> <target>Excluir todas las columnas</target> + <source>Reset view</source> <target>Reiniciar vista</target> + <source>Show "%x"</source> <target>Mostrar "%x"</target> + <source><Last session></source> <target><Última sesión></target> + <source>Configuration saved!</source> <target>¡Configuración guardada!</target> + <source>Save changes to current configuration?</source> <target>¿Guardar los cambios de la configuración actual?</target> + <source>Configuration loaded!</source> <target>¡Configuración cargada!</target> + <source>Folder Comparison and Synchronization</source> <target>Comparación y Sincronización de Carpetas</target> + <source>Hide files that exist on left side only</source> <target>Ocultar archivos que existen sólo en el lado izquierdo</target> + <source>Show files that exist on left side only</source> <target>Mostrar sólo archivos existentes en la izquierda</target> + <source>Hide files that exist on right side only</source> <target>Ocultar archivos que existen sólo en el lado derecho</target> + <source>Show files that exist on right side only</source> <target>Mostrar sólo archivos existentes en la derecha</target> + <source>Hide files that are newer on left</source> <target>Ocultar archivos más recientes en la izquierda</target> + <source>Show files that are newer on left</source> <target>Mostrar archivos más recientes a la izquierda</target> + <source>Hide files that are newer on right</source> <target>Ocultar archivos más recientes en la derecha</target> + <source>Show files that are newer on right</source> <target>Mostrar archivos más recientes a la derecha</target> + <source>Hide files that are equal</source> <target>Ocultar archivos iguales</target> + <source>Show files that are equal</source> <target>Mostrar archivos iguales</target> + <source>Hide files that are different</source> <target>Ocultar archivos diferentes</target> + <source>Show files that are different</source> <target>Mostrar archivos diferentes</target> + <source>Hide conflicts</source> <target>Ocultar conflictos</target> + <source>Show conflicts</source> <target>Mostrar conflictos</target> + <source>Hide files that will be created on the left side</source> <target>Ocultar archivos que serán creados en el lado izquierdo</target> + <source>Show files that will be created on the left side</source> <target>Mostrar archivos que serán creados en el lado izquierdo</target> + <source>Hide files that will be created on the right side</source> <target>Ocultar archivos que serán creados en el lado derecho</target> + <source>Show files that will be created on the right side</source> <target>Mostrar archivos que serán creados en el lado derecho</target> + <source>Hide files that will be deleted on the left side</source> <target>Ocultar archivos que serán eliminados en el lado izquierdo</target> + <source>Show files that will be deleted on the left side</source> <target>Mostrar archivos que serán eliminados en el lado izquierdo</target> + <source>Hide files that will be deleted on the right side</source> <target>Ocultar archivos que serán eliminados en el lado derecho</target> + <source>Show files that will be deleted on the right side</source> <target>Mostrar archivos que serán eliminados en el lado derecho</target> + <source>Hide files that will be overwritten on left side</source> <target>Ocultar archivos que serán sobreescritos en el lado izquierdo</target> + <source>Show files that will be overwritten on left side</source> <target>Mostrar archivos que serán sobreescritos en el lado izquierdo</target> + <source>Hide files that will be overwritten on right side</source> <target>Ocultar archivos que serán sobreescritos en el lado derecho</target> + <source>Show files that will be overwritten on right side</source> <target>Mostrar archivos que serán sobreescritos en el lado derecho</target> + <source>Hide files that won't be copied</source> <target>Ocultar archivos que no serán copiados</target> + <source>Show files that won't be copied</source> <target>Mostrar archivos que no serán copiados</target> + <source>All directories in sync!</source> <target>¡Todos los directorios en sincronización!</target> + <source>Please run a Compare first before synchronizing!</source> <target>¡Por favor, ejecute la comparación antes de la sincronización!</target> + <source>Comma separated list</source> <target>Lista separada por comas</target> + <source>Legend</source> <target>Leyenda</target> + <source>File list exported!</source> <target>¡Lista de archivos exportada!</target> + +<source>Batch file created successfully!</source> +<target>¡El archivo batch ha sido creado correctamente!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -818,6 +1145,7 @@ Transferir permisos de archivo y directorio <pluralform>¡Objeto eliminado satisfactoriamente!</pluralform> <pluralform>¡%x objetos eliminados satisfactoriamente!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -826,6 +1154,7 @@ Transferir permisos de archivo y directorio <pluralform>1 directorio</pluralform> <pluralform>%x directorios</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -834,6 +1163,7 @@ Transferir permisos de archivo y directorio <pluralform>1 archivo</pluralform> <pluralform>%x archivos</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -842,72 +1172,97 @@ Transferir permisos de archivo y directorio <pluralform>%x de una fila en vista</pluralform> <pluralform>%x de %y filas en vista</pluralform> </target> + <source>Scanning...</source> <target>Escaneando...</target> + <source>Comparing content...</source> <target>Comparando contenido...</target> + <source>Paused</source> <target>Pausado</target> + <source>Aborted</source> <target>Abortado</target> + <source>Completed</source> <target>Terminado</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>Solicitud de aborto: Esperando a que la operación actual finalice...</target> + <source>Continue</source> <target>Continuar</target> + <source>Pause</source> <target>Pausa</target> + <source>Cannot find %x</source> <target>No se puede encontrar %x</target> -<source>DECISION TREE</source> -<target>ÃRBOL DE DECISIÓN</target> -<source>file exists on both sides</source> -<target>el archivo existe en ambos lados</target> -<source>on one side only</source> -<target>sólo en un lado</target> -<source>same date</source> -<target>misma fecha</target> -<source>different date</source> -<target>fecha diferente</target> + <source>Inactive</source> <target>Inactivo</target> -<source>Second</source> -<target>Segundo</target> -<source>Minute</source> -<target>Minuto</target> -<source>Hour</source> -<target>Hora</target> -<source>Day</source> -<target>DÃa</target> + +<source>Last x hours</source> +<target>Últimas x horas</target> + +<source>Today</source> +<target>Hoy</target> + +<source>This week</source> +<target>Esta semana</target> + +<source>This month</source> +<target>Este mes</target> + +<source>This year</source> +<target>Este año</target> + <source>Byte</source> <target>Byte</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>Filtro: Todos los pares</target> + <source>Filter: Single pair</source> <target>Filtro: Sólo un par</target> + <source>Ignore</source> <target>Ignorar</target> + <source>Direct</source> <target>Enviar</target> + <source>Follow</source> <target>Seguir</target> + +<source>Copy NTFS permissions</source> +<target>Copiar permisos NTFS</target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>Integrar aplicaciones externas en el menú de contexto. Los siguientes macros están disponibles:</target> + <source>- full file or directory name</source> <target>- nombre completo del archivo o directorio</target> + <source>- directory part only</source> <target>- sólo parte del directorio</target> + <source>- Other side's counterpart to %name</source> <target>- El otro lado equivale a %name</target> + <source>- Other side's counterpart to %dir</source> <target>- El otro lado equivale a %dir</target> + <source>Restore all hidden dialogs?</source> <target>¿Restaurar diálogos ocultos?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -916,6 +1271,7 @@ Transferir permisos de archivo y directorio <pluralform>¿De verdad quiere mover el siguiente objeto a la papelera de reciclaje?</pluralform> <pluralform>¿De verdad quiere mover los siguientes %x objetos a la papelera de reciclaje?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -924,139 +1280,211 @@ Transferir permisos de archivo y directorio <pluralform>¿De verdad quiere eliminar el siguiente objeto?</pluralform> <pluralform>¿De verdad quiere eliminar los siguientes %x objetos?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>Dejar como conflicto sin resolver</target> + <source>Delete permanently</source> <target>Borrar permanentemente</target> + <source>Delete or overwrite files permanently</source> <target>Borrar o sobreescribir archivos permanentemente</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>Utilitzar Papelera de Reciclaje al eliminar o sobreescribir archivos</target> + <source>Versioning</source> <target>Control de versiones</target> + <source>Move files into a time-stamped subdirectory</source> <target>Mover archivos a un subdirectorio con marca de tiempo</target> -<source>Cannot determine sync-direction:</source> -<target>No se puede determinar la dirección de la sincronización:</target> -<source>Filter settings have changed!</source> -<target>¡Las opciones de filtrado han cambiado!</target> + <source>Both sides have changed since last synchronization!</source> <target>¡Ambos lados han cambiado desde la última sincronizacion!</target> + +<source>Cannot determine sync-direction:</source> +<target>No se puede determinar la dirección de la sincronización:</target> + <source>No change since last synchronization!</source> <target>¡Ningún cambio desde la última sincronización!</target> + +<source>Filter settings have changed!</source> +<target>¡Las opciones de filtrado han cambiado!</target> + <source>The file was not processed by last synchronization!</source> <target>¡El archivo no fue procesado por la última sincronización!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>¡La eliminación planeada del directorio se encuentra en conflicto con sus subdirectorios y archivos!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Fijando direcciones de sincronización por defecto: Los archivos viejos serán sobreescritos por los archivos nuevos.</target> + <source>The file does not contain a valid configuration:</source> <target>El archivo no contiene una configuración válida:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>Puede ignorar este error al considerar el directorio como vacÃo.</target> + <source>Directory does not exist:</source> <target>El directorio no existe:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>¡Los directorios son dependientes! Tenga cuidado al establecer las reglas de sincronización:</target> + <source>Comparing content of files %x</source> <target>Comparación del contenido de los archivos %x</target> + <source>Memory allocation failed!</source> <target>¡La asignación de memoria ha fallado!</target> + <source>File %x has an invalid date!</source> <target>¡El archivo %x tiene una fecha inválida!</target> + <source>Conflict detected:</source> <target>Conflicto detectado:</target> + <source>Files %x have the same date but a different size!</source> <target>¡Los archivos %x tienen la misma fecha pero un tamaño diferente!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>¡Los enlaces simbólicos %x tienen la misma fecha pero un destino diferente!</target> + <source>Comparing files by content failed.</source> <target>La comparación de archivos por el contenido ha fallado.</target> + <source>Generating file list...</source> <target>Generando lista de archivos...</target> + <source>Multiple...</source> <target>Múltiple...</target> + <source>Both sides are equal</source> <target>Ambos lados son iguales</target> + <source>Files/folders differ in attributes only</source> <target>Archivos/carpetas se diferencia sólo en los atributos</target> + <source>Copy new file/folder to left</source> <target>Copiar nuevo archivo/carpeta a la izquierda</target> + <source>Copy new file/folder to right</source> <target>Copiar nuevo archivo/carpeta a la derecha</target> + <source>Delete left file/folder</source> <target>Eliminar archivo/carpeta de la izquierda</target> + <source>Delete right file/folder</source> -<target>Eliinar archivo/carpeta de la derecha</target> +<target>Eliminar archivo/carpeta de la derecha</target> + <source>Overwrite left file/folder with right one</source> <target>Sobreescribir archivo/carpeta de la izquierda por el de la derecha</target> + <source>Overwrite right file/folder with left one</source> <target>Sobreescribir archivo/carpeta de la derecha por el de la izquierda</target> + <source>Do nothing</source> <target>No hacer nada</target> + <source>Copy file attributes only to left</source> <target>Copiar sólo atributos del archivo a la izquierda</target> + <source>Copy file attributes only to right</source> <target>Copiar sólo atributos del archivo a la derecha</target> + <source>Deleting file %x</source> <target>Borrar archivo %x</target> -<source>Deleting Symbolic Link %x</source> -<target>Eliminando enlace simbólico %x</target> + <source>Deleting folder %x</source> <target>Borrar carpeta %x</target> -<source>Moving %x to Recycle Bin</source> -<target>Mover %x a la Papelera de Reciclaje</target> -<source>Moving file %x to user-defined directory %y</source> -<target>Mover el archivo %x al directorio definido por el usuario %y</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>Mover la carpeta %x al directorio definido por el usuario %y</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>Mover enlace simbólico %x al directorio definido por el usuario %y</target> -<source>Copying new file %x to %y</source> -<target>Copiando archivo nuevo de %x a %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>Copiando enlace simbólico nuevo de %x a %y</target> -<source>Overwriting file %x in %y</source> -<target>Sobreescribiendo archivo %x en %y</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>Sobreescribiendo enlace simbólico %x en %y</target> + +<source>Deleting symbolic link %x</source> +<target>Borrar enlace simbólico %x</target> + +<source>Moving file %x to recycle bin</source> +<target>Mover archivo %x a la papelera de reciclaje</target> + +<source>Moving folder %x to recycle bin</source> +<target>Mover carpeta %x a la papelera de reciclaje</target> + +<source>Moving symbolic link %x to recycle bin</source> +<target>Mover enlace simbólico %x a la papelera de reciclaje</target> + +<source>Moving file %x to %y</source> +<target>Mover archivo de %x a %y</target> + +<source>Moving folder %x to %y</source> +<target>Mover carpeta de %x a %y</target> + +<source>Moving symbolic link %x to %y</source> +<target>Mover enlace simbólico de %x a %y</target> + +<source>Creating file %x</source> +<target>Creando archivo %x</target> + +<source>Creating symbolic link %x</source> +<target>Creando enlace simbólico %x</target> + <source>Creating folder %x</source> <target>Creando carpeta %x</target> + +<source>Overwriting file %x</source> +<target>Sobreescribir archivo %x</target> + +<source>Overwriting symbolic link %x</source> +<target>Sobreescribir enlance simbólico %x</target> + <source>Verifying file %x</source> <target>Verificación del archivo %x</target> + <source>Updating attributes of %x</source> <target>Actualizar atributos de %x</target> -<source>Source directory does not exist anymore:</source> -<target>El directorio origen ya no existe:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>¡Nada que sincronizar de acuerdo con la configuración!</target> + <source>Target directory name must not be empty!</source> <target>¡El nombre del directorio de destino no debe estar vacÃo!</target> + <source>User-defined directory for deletion was not specified!</source> <target>¡No se ha indicado el directorio definido por el usuario para el borrado!</target> + +<source>Source directory does not exist anymore:</source> +<target>El directorio origen ya no existe:</target> + <source>Unresolved conflicts existing!</source> <target>¡Existen conflictos sin resolver!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>Puede ignorar conflictos y continuar con la sincronización.</target> + <source>Significant difference detected:</source> <target>Diferencia significante detectada:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>¡Más del 50% del número total de archivos serán copiados o eliminados!</target> + <source>Not enough free disk space available in:</source> <target>Espacio en disco insuficiente en:</target> + <source>Free disk space required:</source> <target>Espacio de disco necesario:</target> + <source>Free disk space available:</source> <target>Espacio de disco disponible:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target></target> +<target>¡La papelera de reciclaje no está disponible para las siguientes rutas! Los archivos serán eliminados permanentemente:</target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>Un directorio será modificado, el cual es parte de mútiples pares de carpetas. ¡Por favor, revise la configuración de la sincronización!</target> + <source>Processing folder pair:</source> <target>Procesar un par de carpetas:</target> + <source>Generating database...</source> <target>Generando base de datos...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>¡Nada que sincronizar de acuerdo con la configuración!</target> + <source>Error copying locked file %x!</source> <target>¡Error al copiar archivo bloqueado %x!</target> + <source>Data verification error: Source and target file have different content!</source> <target>Error de verificación de datos: ¡Los archivos de origen y destino tienen un contenido diferente!</target> + diff --git a/BUILD/Languages/swedish.lng b/BUILD/Languages/swedish.lng index e46b7781..d1c7dd20 100644 --- a/BUILD/Languages/swedish.lng +++ b/BUILD/Languages/swedish.lng @@ -8,75 +8,116 @@ </header> <source>Searching for directory %x...</source> -<target></target> +<target>Söker efter katalogen</target> + <source>Show in Explorer</source> <target>Visa i Utforskaren</target> + <source>Open with default application</source> <target>Öppna med standardprogram</target> + <source>Browse directory</source> <target>Sök upp katalog</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Automatiserad synkronisering</target> + <source>Browse</source> <target>Bläddra</target> -<source>Invalid commandline: %x</source> + +<source>Invalid command line: %x</source> <target>Ogiltig kommandorad: %x</target> + <source>Error resolving symbolic link:</source> <target>Kan inte tyda symbolisk länk:</target> -<source>Show popup</source> -<target>Visa popup</target> -<source>Show popup on errors or warnings</source> -<target>Visa popup vid fel eller varningar</target> + +<source>Show pop-up</source> +<target>Visa pop-up</target> + +<source>Show pop-up on errors or warnings</source> +<target>Visa pop-up vid fel och varningar</target> + <source>Ignore errors</source> <target>Ignorera fel</target> + <source>Hide all error and warning messages</source> <target>Visa inte fel- och varningsmeddelanden</target> + <source>Exit instantly</source> <target>Avsluta omedelbart</target> + <source>Abort synchronization immediately</source> <target>Avbryt synkronisering omedelbart</target> + +<source>Select alternate comparison settings</source> +<target>Välj alternativa jämförelseinställningar</target> + <source>Select alternate synchronization settings</source> <target>Välj alternativa synkroniseringsinställningar</target> + <source>No filter selected</source> <target>Inga filter aktiverade</target> + <source>Filter is active</source> <target>Filter är aktiverat</target> -<source>Clear filter settings</source> -<target>Rensa filterinställningar</target> + <source>Remove alternate settings</source> <target>Ta bort alternativa inställningar</target> + +<source>Clear filter settings</source> +<target>Rensa filterinställningar</target> + <source>Create a batch job</source> <target>Skapa ett batch-jobb</target> + <source>Synchronization settings</source> <target>Synkroniseringsinställningar</target> + <source>Comparison settings</source> <target>Jämförelseinställningar</target> + <source>About</source> <target>Om</target> + <source>Error</source> <target>Fel</target> + <source>Warning</source> <target>Varning</target> + <source>Question</source> <target>FrÃ¥ga</target> + <source>Confirm</source> <target>Bekräfta</target> + <source>Configure filter</source> <target>Filterinställningar</target> + <source>Customize columns</source> <target>Anpassa kollumner</target> + <source>Global settings</source> <target>Allmäna inställningar</target> + <source>Synchronization Preview</source> <target>Förhandsvisning</target> + <source>Find</source> <target>Sök</target> + +<source>Select time span</source> +<target>Välj tidsintervall</target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -85,46 +126,64 @@ <pluralform>1 Byte</pluralform> <pluralform>%x Byte</pluralform> </target> + <source><Symlink></source> <target><Symboliska länkar></target> + <source><Directory></source> <target><Katalog></target> + <source>Size</source> <target>Storlek</target> + <source>Date</source> <target>Datum</target> + <source>Full path</source> <target>Fullständig sökväg</target> + <source>Filename</source> <target>Filnamn</target> + <source>Relative path</source> <target>Sökväg</target> + <source>Directory</source> <target>Katalog</target> + <source>Extension</source> <target>Filformat</target> + <source>Comparison Result</source> <target>Jämförelseresultat</target> + <source>Incompatible synchronization database format:</source> <target>Inkompatibelt databasformat:</target> + <source>Initial synchronization:</source> <target>Initial synkronisering:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>En av FreeFileSyncs databasfiler saknas:</target> + <source>Error reading from synchronization database:</source> <target>Kan inte läsa frÃ¥n databasen:</target> + <source>Database files do not share a common synchronization session:</source> -<target></target> +<target>Databasfiler delar inte en gemensam synkroniseringssession:</target> + <source>An exception occurred!</source> <target>Ett undantag inträffade!</target> -<source>Error deleting file:</source> -<target>Kan inte ta bort fil:</target> + <source>Error reading file attributes:</source> <target>Kan inte läsa filattribut:</target> + <source>Waiting while directory is locked (%x)...</source> <target>Väntar medan katalogen lÃ¥ses (%x)...</target> + <source>Error setting directory lock:</source> <target>Kan inte lÃ¥sa katalogen:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -133,27 +192,40 @@ <pluralform>1 sek</pluralform> <pluralform>%x sek</pluralform> </target> + <source>Info</source> <target>Info</target> + <source>Fatal Error</source> <target>Allvarligt fel</target> + <source>Scanning:</source> <target>Skannar:</target> + <source>Encoding extended time information: %x</source> <target>Kodar utökad tidsinformation: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> -<target></target> +<target> +<pluralform>[1 trÃ¥d]</pluralform> +<pluralform>[%x trÃ¥dar]</pluralform> +</target> + <source>Invalid FreeFileSync config file!</source> <target>Felaktig FreeFileSync konfigurationsfil!</target> + <source>File does not exist:</source> <target>Filen finns inte:</target> + <source>Error parsing configuration file:</source> <target>Kan inte läsa in konfigurationsfil:</target> + <source>/sec</source> <target>/s</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -162,6 +234,7 @@ <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -170,6 +243,7 @@ <pluralform>1 timma</pluralform> <pluralform>%x timmar</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -178,28 +252,40 @@ <pluralform>1 dag</pluralform> <pluralform>%x dagar</pluralform> </target> + <source>S&ave configuration...</source> <target>S¶ inställningar...</target> + <source>&Load configuration...</source> <target>&Hämta inställningar frÃ¥n fil...</target> + <source>&Quit</source> <target>&Avsluta</target> + <source>&File</source> <target>&Arkiv</target> + <source>&Content</source> <target>&InnehÃ¥ll</target> + <source>&About...</source> <target>&Om...</target> + <source>&Help</source> <target>&Hjälp</target> + <source>Usage:</source> <target>Användning:</target> + <source>1. Select directories to monitor.</source> <target>1. Välj kataloger att övervaka.</target> + <source>2. Enter a command line.</source> <target>2. Mata in ett kommando.</target> + <source>3. Press 'Start'.</source> <target>3. Tryck 'Start'.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -210,310 +296,461 @@ Kommandot verkställes när: - alla berörda kataloger blir tillgängliga (t.ex om USB-minne ansluts) - filer i berörda kataloger eller underkataloger ändras </target> + <source>Directories to watch</source> <target>Kataloger att övervaka</target> + <source>Add folder</source> <target>Lägg till katalog</target> + <source>Remove folder</source> <target>Ta bort katalog</target> + <source>Select a folder</source> <target>Markera en katalog</target> + <source>Command line</source> <target>Kommandofält</target> + <source>Minimum Idle Time [seconds]</source> <target>Minsta ledig tid [sekunder]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>Väntetid mellan upptäckt av senaste ändring och verkställande av kommando, i sekunder</target> + <source>Start</source> <target>Start</target> + <source>(Build: %x)</source> <target>(Bygge: %x)</target> + <source>RealtimeSync configuration</source> <target>RealtimeSync konfiguration</target> + <source>File already exists. Overwrite?</source> <target>Filen finns redan. Vill du skriva över:</target> + <source>&Restore</source> <target>&Ã…terställ</target> + <source>&Exit</source> <target>&Avsluta</target> + <source>Monitoring active...</source> <target>Övervakning aktiverad...</target> + <source>Waiting for missing directories...</source> <target>Väntar pÃ¥ saknade destinationer...</target> + <source>A directory input field is empty.</source> <target>Ett katalogfält är tomt</target> + <source>Drag && drop</source> <target>Dra && släpp</target> + <source>Could not initialize directory monitoring:</source> <target>Kan inte initiera katalogskanner:</target> + <source>Error when monitoring directories.</source> <target>Fel vid övervakning av kataloger.</target> + <source>Conversion error:</source> <target>Konversionsfel:</target> + +<source>Error deleting file:</source> +<target>Kan inte ta bort fil:</target> + <source>Error moving file:</source> <target>Kan inte flytta fil:</target> + <source>Target file already existing!</source> <target>Filen finns redan!</target> + <source>Error moving directory:</source> <target>Kan inte flytta katalog:</target> + <source>Target directory already existing!</source> <target>MÃ¥lkatalogen finns redan!</target> + <source>Error deleting directory:</source> <target>Kan inte ta bort katalog:</target> + <source>Error changing modification time:</source> <target>Kan inte modifiera tidsstämpel:</target> + <source>Error loading library function:</source> <target>Kan inte starta biblioteksfunktion:</target> + <source>Error reading security context:</source> <target>Kan inte läsa säkerhetskontext:</target> + <source>Error writing security context:</source> <target>Kan inte skriva säkerhetskontext:</target> + <source>Error copying file permissions:</source> <target>Kan inte kopiera filsystembehörighet:</target> + <source>Error creating directory:</source> <target>Kan inte skapa katalog:</target> + <source>Error copying symbolic link:</source> <target>Kan inte kopiera symbolisk länk:</target> + <source>Error copying file:</source> <target>Kan inte kopiera fil:</target> + <source>Error opening file:</source> <target>Kan inte öppna fil:</target> + <source>Error writing file:</source> <target>Kan inte skriva fil:</target> + <source>Error reading file:</source> <target>Kan inte läsa fil:</target> + <source>Operation aborted!</source> <target>Processen avbruten!</target> + <source>Endless loop when traversing directory:</source> <target>Oändlig loop vid accessförsök pÃ¥ katalog:</target> + <source>Error traversing directory:</source> <target>Accessfel pÃ¥ katalog:</target> + <source>Windows Error Code %x:</source> <target>Windows Felkod %x:</target> + <source>Linux Error Code %x:</source> <target>Linux Felkod %x:</target> + <source>Error setting privilege:</source> <target>Kan inte ange privilegie:</target> + <source>Error moving to Recycle Bin:</source> <target>Kan inte flytta till papperskorgen:</target> + <source>Could not load a required DLL:</source> <target>Kan inte läsa in nödvändig DLL:</target> + <source>Error writing to synchronization database:</source> <target>Kan inte skriva till databas:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>Kan inte starta 'Volume Shadow Copy Service'!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target>Kunde inte starta tjänsten Volume Shadow Copy (VSS)</target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>Skuggkopior av wow64 stöds ej. Använd FreeFileSync x64 istället!</target> + <source>Could not determine volume name for file:</source> <target>Kan inte bestämma volym för fil:</target> + <source>Volume name %x not part of filename %y!</source> <target>Volymnamn %x saknas i filnamn %y!</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>Kan inte läsa värden för följande XML-noder:</target> + <source>Logging</source> <target>Loggar</target> + <source>FreeFileSync batch file</source> <target>FreeFileSync batch-fil</target> + <source>FreeFileSync configuration</source> <target>FreeFileSync konfiguration</target> + <source>FreeFileSync Batch Job</source> <target>FreeFileSync Batch-jobb</target> + <source>Unable to create logfile!</source> <target>Kan inte skapa loggfil!</target> + <source>Batch execution</source> <target>Batch-körning</target> + <source>Log-messages:</source> <target>Logg-meddelanden:</target> + <source>Stop</source> <target>Stopp</target> + <source>Total time:</source> <target>Total tid:</target> + <source>Synchronization aborted!</source> <target>Synkronisering avbruten!</target> + <source>Synchronization completed with errors!</source> <target>Synkronisering slutförd med fel!</target> + <source>Synchronization completed successfully!</source> <target>Synkronisering slutförd!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>Tryck pÃ¥ "Växla" för att öppna FreeFileSyncs grafiska läge</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>Växlar till FreeFileSyncs grafiska läge</target> + <source>Unable to connect to sourceforge.net!</source> <target>Kan inte ansluta sourceforge.net!</target> + <source>A newer version of FreeFileSync is available:</source> <target>En nyare version av FreeFileSync finns tillgänglig:</target> + <source>Download now?</source> <target>Ladda ner nu?</target> + <source>Information</source> <target>Information</target> + <source>FreeFileSync is up to date!</source> <target>FreeFileSync är uppdaterad!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>Vill du att FreeFileSync skall söka efter uppdateringar varje vecka?</target> + <source>(Requires an Internet connection!)</source> <target>(Kräver Internetuppkoppling!)</target> + <source>1. &Compare</source> <target>1. &Jämför</target> + <source>2. &Synchronize...</source> <target>2. &Synkronisera...</target> + <source>S&witch view</source> <target>V&äxla sida</target> + <source>&New</source> <target>&Nytt</target> + <source>&Program</source> <target>&Program</target> + <source>&Language</source> <target>&SprÃ¥k</target> + <source>&Global settings...</source> <target>&Allmäna inställningar...</target> + <source>&Create batch job...</source> <target>&Skapa batch-jobb...</target> + <source>&Export file list...</source> <target>&Exportera fillista...</target> + <source>&Advanced</source> <target>&Avancerat</target> + <source>&Check for new version</source> <target>&Sök efter uppdatering</target> + <source>Compare</source> <target>Jämför</target> + <source>Compare both sides</source> <target>Jämför bÃ¥da sidor</target> + <source>&Abort</source> <target>&Avbryt</target> + <source>Synchronize...</source> <target>Synkronisera</target> + <source>Start synchronization</source> <target>Starta synkronisering</target> -<source>Swap sides</source> -<target>Byt sida</target> + <source>Add folder pair</source> <target>Lägg till katalogpar</target> + <source>Remove folder pair</source> <target>Ta bort katalogpar</target> + +<source>Swap sides</source> +<target>Byt sida</target> + <source>Save current configuration to file</source> <target>Spara aktuella inställningar till fil</target> + <source>Load configuration from file</source> <target>Hämta inställningar frÃ¥n fil</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>Senast använda konfigurationer (Tryck DEL för att ta bort)</target> + <source>Hide excluded items</source> <target>Visa inte undantagna objekt</target> + <source>Hide filtered or temporarily excluded files</source> <target>Visa inte filtrerade eller temporärt undantagna filer</target> + <source>Number of files and directories that will be created</source> <target>Antal filer och kataloger som kommer att skapas</target> + <source>Number of files that will be overwritten</source> <target>Antal filer som kommer att skrivas över</target> + <source>Number of files and directories that will be deleted</source> <target>Antal filer och kataloger som kommer att tas bort</target> + <source>Total amount of data that will be transferred</source> <target>Total mängd data som kommer att överföras</target> -<source>Left</source> -<target>Vänster</target> -<source>Right</source> -<target>Höger</target> + <source>Batch job</source> <target>Batch-jobb</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>Skapa en batch-fil för automatiserad synkronisering. För att starta i batch-läge, Dubbelklicka pÃ¥ filen eller starta den med kommandoraden: FreeFileSync.exe <batch-fil>. Batch-filen kan ocksÃ¥ schemaläggas i Windows Schemaläggare.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target>Skapa en batch-fil för automatisk synkronisering. För att starta i batch-läge dubbelklickar du pÃ¥ filen eller startar den med kommandoraden: FreeFileSync.exe <ffs_batch file>. Batch-filen kan ocksÃ¥ schemaläggas i Windows schemaläggare</target> + <source>Help</source> <target>Hjälp</target> + <source>Filter files</source> <target>Undantag</target> + <source>Error handling</source> <target>Felhantering</target> + +<source>Left</source> +<target>Vänster</target> + +<source>Right</source> +<target>Höger</target> + <source>Overview</source> <target>Översikt</target> + <source>Status feedback</source> <target>Status</target> + <source>Run minimized</source> -<target></target> +<target>Kör minimerad</target> + <source>Maximum number of logfiles:</source> <target>Max antal loggfiler:</target> + <source>Select logfile directory:</source> <target>Välj loggfilskatalog:</target> + <source>Batch settings</source> -<target></target> +<target>Batch-inställningar</target> + <source>&Save</source> <target>&Spara</target> + <source>&Load</source> <target>&Läs in</target> + <source>&Cancel</source> <target>&Avbryt</target> + <source>Elements found:</source> <target>Funna poster:</target> + <source>Elements remaining:</source> <target>Ã…terstÃ¥ende poster:</target> + <source>Speed:</source> <target>Hastighet:</target> + <source>Time remaining:</source> <target>Kvarvarande tid:</target> + <source>Time elapsed:</source> <target>Förfluten tid:</target> + <source>Operation:</source> <target>Arbetsuppgift:</target> + <source>Select variant:</source> <target>Välj variant:</target> + <source><Automatic></source> <target><Automatisk></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>Identifiera och visa förändringar pÃ¥ bÃ¥da sidor via databas. Borttagningar och konflikter upptäcks automatiskt.</target> + <source>Mirror ->></source> <target>Spegla ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Speglar säkerhetskopia av vänster katalog. Höger katalog ändras för att exakt matcha vänster efter synkroniseringen.</target> + <source>Update -></source> <target>Uppdatera -></target> + <source>Copy new or updated files to right folder.</source> <target>Kopiera nya och uppdaterade filer till höger katalog.</target> + <source>Custom</source> <target>Anpassat</target> + <source>Configure your own synchronization rules.</source> <target>Konfigurera dina egna synkroniseringsregler.</target> + <source>Deletion handling</source> <target>Borttagning</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>Inställningar</target> + <source>Category</source> <target>Kategori</target> + <source>Action</source> <target>Aktivitet</target> + <source>File/folder exists on left side only</source> <target>Fil/katalog finns bara pÃ¥ vänster sida</target> + <source>File/folder exists on right side only</source> <target>Fil/katalog finns bara pÃ¥ höger sida</target> + <source>Left file is newer</source> <target>Vänster fil är nyare</target> + <source>Right file is newer</source> <target>Höger fil är nyare</target> + <source>Files have different content</source> <target>Filerna har olika innehÃ¥ll</target> + <source>Conflict/file cannot be categorized</source> <target>Konflikt/Fil kan inte kategoriseras</target> + <source>Compare by...</source> <target>Jämför...</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> <target> -Filerna betecknas som lika om, +Filer betraktas som likvärdiga om + - tidsstämpel för 'Senast ändrad' - filstorlek - - 'senast ändrad' och datum -är lika +är samma. </target> -<source>File size and date</source> -<target>Filstorlek och datum</target> + +<source>File time and size</source> +<target>Tidsstämpling och storlek</target> + <source> Files are found equal if - file content @@ -524,92 +761,85 @@ Filerna betecknas som lika om, - filinnehÃ¥llet är lika </target> + <source>File content</source> <target>FilinnehÃ¥ll</target> + <source>Symbolic Link handling</source> <target>Hantering av Symboliska länkar</target> + <source>Synchronizing...</source> <target>Synkroniserar...</target> + <source>Elements processed:</source> <target>Processade poster</target> + <source>&Pause</source> <target>&Paus</target> -<source>Compare by "File size and date"</source> -<target>Jämför: "Filstorlek och datum"</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>Denna variant betecknar 2 filer med samma namn som lika, när dom har samma storlek OCH samma tidsstämpling.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>När jämförelse startas med detta alternativ aktiverat, processas följande beslutsträd:</target> -<source>As a result the files are separated into the following categories:</source> -<target>Som ett resultat blir filerna separerade i följande kategorier:</target> -<source>- equal</source> -<target>- lika</target> -<source>- left newer</source> -<target>- vänster nyare</target> -<source>- right newer</source> -<target>- höger nyare</target> -<source>- exists left only</source> -<target>- finns endast till vänster</target> -<source>- exists right only</source> -<target>- finns endast till höger</target> -<source>- conflict (same date, different size)</source> -<target>- konflikt (samma datum, olika storlek)</target> -<source>Compare by "File content"</source> -<target>Jämför: "FilinnehÃ¥ll"</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. -With this option enabled the decision tree is smaller: -</source> -<target> -Som namnet antyder, tvÃ¥ filer med samma namn beräknas som lika, endast om dom har samma innehÃ¥ll. Den här funktionen är mer användbar för konsistenskontroll, snarare än säkerhetskopiering. Därför tas inte tidsattributen med i beräkningen. - -Med det här alternativet aktiverat, blir beslutsträdet mindre: -</target> -<source>- different</source> -<target>- olika</target> <source>Source code written in C++ utilizing:</source> <target>Källkod skriven i C++ med hjälp av:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>Stort tack för översättningen av FreeFileSync gÃ¥r till:</target> + <source>Feedback and suggestions are welcome at:</source> <target>Feedback och förslag är välkommna här:</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync pÃ¥ Sourceforge</target> + <source>Homepage</source> <target>Hemsida</target> + <source>If you like FFS</source> <target>Om du gillar FFS</target> + <source>Donate with PayPal</source> <target>Donera via PayPal</target> + <source>Email</source> <target>E-post</target> + <source>Report translation error</source> <target>Rapportera översättningsfel</target> + <source>Published under the GNU General Public License:</source> <target>Publiserad under GNU General Public License:</target> + <source>Ignore subsequent errors</source> <target>Ignorera följdfel</target> + <source>Hide further error messages during the current process</source> <target>Dölj vidare felmeddelanden under aktuell process</target> + <source>&Ignore</source> <target>&Ignorera</target> + <source>&Retry</source> <target>&Försök igen</target> + <source>Do not show this dialog again</source> <target>Visa inte den här dialogrutan igen</target> + <source>&Switch</source> <target>&Växla</target> + <source>&Yes</source> <target>&Ja</target> + <source>&No</source> <target>&Nej</target> + <source>Delete on both sides</source> <target>Ta bort pÃ¥ bÃ¥da sidor</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>Ta bort pÃ¥ bÃ¥da sidor, även om filen är markerad pÃ¥ endast en sida</target> + <source>Use Recycle Bin</source> <target>Använd papperskorgen</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -618,16 +848,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire Endast filer/kataloger som matchar alla filterinställningar, kommer att väljas ut för synkronisering Notis: Namnfiltret mÃ¥ste specificeras relativt(!) till överordnade synkroniseringskataloger </target> + <source>Hints:</source> <target>Tips:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. Ange fil- eller katalognamn separerade med "," eller ny rad</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. Använd jokertecknen '*' och '?' .</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. Undanta filer direkt i huvudfönstret, via högerklicksmenyn.</target> + <source>Example</source> <target>Exempel</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -636,30 +872,40 @@ Exclude: \stuff\temp\* Inkludera: *.doc;*.zip;*.exe Undanta: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>Synkronisera alla .doc-, .zip- och .exe-filer, men utelämna allt i underkatalog "temp".</target> + <source>Include</source> <target>Inkludera</target> + <source>Exclude</source> <target>Undanta</target> -<source>Select time span:</source> -<target>Ange tidsspann:</target> -<source>Minimum file size:</source> -<target>Min. filstorlek:</target> -<source>Maximum file size:</source> -<target>Max. filstorlek:</target> + +<source>Minimum file size</source> +<target>Minimum filstorlek</target> + +<source>Maximum file size</source> +<target>Maximum filstorlek</target> + <source>&Default</source> <target>&Standard</target> + <source>Move column up</source> <target>Flytta upp kollumn</target> + <source>Move column down</source> <target>Flytta ner kollumn</target> -<source>Transactional File Copy</source> -<target></target> + +<source>Transactional file copy</source> +<target>Transaktionell filkopiering</target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> -<target></target> +<target>Skriver först filer till en temporär fil(*.ffs_tmp), och byter namn pÃ¥ dom. Detta garanterar ett konsekvent tillstÃ¥nd även i situationer av allvarliga fel.</target> + <source>Copy locked files</source> <target>Kopiera lÃ¥sta filer</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -668,8 +914,10 @@ Copy shared or locked files using Volume Shadow Copy Service Kopiera delade eller lÃ¥sta filer med hjälp av Volume Shadow Copy Service (Kräver administratörsrättighet) </target> -<source>Copy filesystem permissions</source> -<target>Kopiera filsystembehörigheter</target> + +<source>Copy file access permissions</source> +<target>Kopiera filÃ¥tkomstbehörigheter</target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -678,138 +926,205 @@ Transfer file and directory permissions Överför fil- och katalogrättigheter (Kräver administratörsrättigheter) </target> + <source>Hidden dialogs:</source> <target>Dolda meddelanden:</target> + <source>Reset</source> <target>Ã…terställ</target> + <source>Show hidden dialogs</source> <target>Visa dolda meddelanden</target> + <source>External applications</source> <target>Externa program</target> + <source>Description</source> <target>Beskrivning</target> + <source>Variant</source> <target>Variant</target> + <source>Statistics</source> <target>Statistik</target> + <source>Find what:</source> <target>Sök efter:</target> + <source>Match case</source> <target>Matcha gemener/VERSALER</target> + <source>&Find next</source> <target>&Sök nästa</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>Du kan försöka synkronisera Ã¥terstÃ¥ende objekt igen (utan att trycka "Jämför")!</target> -<source>Batch file created successfully!</source> -<target>Batch-filen skapades korrekt!</target> + <source>Main bar</source> <target>Huvudfält</target> + <source>Folder pairs</source> <target>Katalogpar</target> + <source>Select view</source> <target>Välj vy</target> + <source>Set direction:</source> <target>Ange riktning:</target> + <source>Exclude temporarily</source> <target>Undanta tillfälligt</target> + <source>Include temporarily</source> <target>Inkludera tillfälligt</target> + <source>Exclude via filter:</source> <target>Lägg till i undantag:</target> + <source><multiple selection></source> <target><flerval></target> + <source>D-Click</source> <target>HÃ¥ll ner D</target> + <source>Delete</source> <target>Ta bort</target> + <source>Customize...</source> <target>Anpassar...</target> + +<source>Select time span...</source> +<target>Välj tidsintervall...</target> + <source>Auto-adjust columns</source> <target>Autojustera kollumner</target> + <source>Include all rows</source> <target>Inkludera alla rader</target> + <source>Exclude all rows</source> <target>Undanta alla rader</target> + <source>Reset view</source> <target>Ã…terställ vy</target> + <source>Show "%x"</source> <target>Visa "%x"</target> + <source><Last session></source> <target><Senaste session></target> + <source>Configuration saved!</source> <target>Inställningar sparade!</target> + <source>Save changes to current configuration?</source> <target>Vill du spara ändringarna i aktuella inställningar?</target> + <source>Configuration loaded!</source> <target>Inställningar inlästa!</target> + <source>Folder Comparison and Synchronization</source> <target>Katalogjämförelse och synkronisering</target> + <source>Hide files that exist on left side only</source> <target>Visa inte filer som endast finns till vänster</target> + <source>Show files that exist on left side only</source> <target>Visa filer som endast finns till vänster</target> + <source>Hide files that exist on right side only</source> <target>Visa inte filer som endast finns till höger</target> + <source>Show files that exist on right side only</source> <target>Visa filer som endast finns till höger</target> + <source>Hide files that are newer on left</source> <target>Visa inte filer som är nyare till vänster</target> + <source>Show files that are newer on left</source> <target>Visa filer som är nyare till vänster</target> + <source>Hide files that are newer on right</source> <target>Visa inte filer som är nyare till höger</target> + <source>Show files that are newer on right</source> <target>Visa filer som är nyare till höger</target> + <source>Hide files that are equal</source> <target>Visa inte filer som är lika</target> + <source>Show files that are equal</source> <target>Visa filer som är lika</target> + <source>Hide files that are different</source> <target>Visa inte filer som är olika</target> + <source>Show files that are different</source> <target>Visa filer som är olika</target> + <source>Hide conflicts</source> <target>Visa inte konflikter</target> + <source>Show conflicts</source> <target>Visa konflikter</target> + <source>Hide files that will be created on the left side</source> <target>Visa inte filer som kommer att skapas pÃ¥ vänster sida</target> + <source>Show files that will be created on the left side</source> <target>Visa filer som kommer att skapas till vänster</target> + <source>Hide files that will be created on the right side</source> <target>Visa inte filer som kommer att skapas pÃ¥ höger sida</target> + <source>Show files that will be created on the right side</source> <target>Visa filer som kommer att skapas till höger</target> + <source>Hide files that will be deleted on the left side</source> <target>Visa inte filer som kommer att tas bort pÃ¥ vänster sida</target> + <source>Show files that will be deleted on the left side</source> <target>Visa filer som kommer att tas bort till vänster</target> + <source>Hide files that will be deleted on the right side</source> <target>Visa inte filer som kommer att tas bort pÃ¥ höger sida</target> + <source>Show files that will be deleted on the right side</source> <target>Visa filer som kommer att tas bort till höger</target> + <source>Hide files that will be overwritten on left side</source> <target>Visa inte filer som kommer att skrivas över pÃ¥ vänster sida</target> + <source>Show files that will be overwritten on left side</source> <target>Visa filer som skrivas över till vänster</target> + <source>Hide files that will be overwritten on right side</source> <target>Visa inte filer som kommer att skrivas över pÃ¥ höger sida</target> + <source>Show files that will be overwritten on right side</source> <target>Visa filer som skrivas över till höger</target> + <source>Hide files that won't be copied</source> <target>Visa inte filer som som inte kopieras</target> + <source>Show files that won't be copied</source> <target>Visa filer som inte kommer att kopieras</target> + <source>All directories in sync!</source> <target>Alla kataloger synkade!</target> + <source>Please run a Compare first before synchronizing!</source> <target>Du mÃ¥ste trycka "Jämför" innan du kan synkronisera.</target> + <source>Comma separated list</source> <target>Komma-separerad lista</target> + <source>Legend</source> <target>Förklaring</target> + <source>File list exported!</source> <target>Fillista exporterad!</target> + +<source>Batch file created successfully!</source> +<target>Batch-filen skapades korrekt!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -818,6 +1133,7 @@ Transfer file and directory permissions <pluralform>Objektet borttaget!</pluralform> <pluralform>%x objekt borttagna!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -826,6 +1142,7 @@ Transfer file and directory permissions <pluralform>1 katalog</pluralform> <pluralform>%x kataloger</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -834,6 +1151,7 @@ Transfer file and directory permissions <pluralform>1 fil</pluralform> <pluralform>%x filer</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -842,72 +1160,97 @@ Transfer file and directory permissions <pluralform>%x av 1 rad i vyn</pluralform> <pluralform>%x av %y rader i vyn</pluralform> </target> + <source>Scanning...</source> <target>Skannar...</target> + <source>Comparing content...</source> <target>Jämför innehÃ¥ll...</target> + <source>Paused</source> <target>Pausad</target> + <source>Aborted</source> <target>Användaren avbröt</target> + <source>Completed</source> <target>Slutförd</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>Avbryter: Väntar pÃ¥ att aktuell process skall slutföras...</target> + <source>Continue</source> <target>Fortsätt</target> + <source>Pause</source> <target>Paus</target> + <source>Cannot find %x</source> <target>Kan inte hitta %x</target> -<source>DECISION TREE</source> -<target>BESLUTSTRÄD</target> -<source>file exists on both sides</source> -<target>Filen finns pÃ¥ bÃ¥da sidor</target> -<source>on one side only</source> -<target>endast pÃ¥ en sida</target> -<source>same date</source> -<target>samma datum</target> -<source>different date</source> -<target>olika datum</target> + <source>Inactive</source> <target>Inaktiv</target> -<source>Second</source> -<target>Sekund</target> -<source>Minute</source> -<target>Minut</target> -<source>Hour</source> -<target>Timma</target> -<source>Day</source> -<target>Dag</target> + +<source>Last x hours</source> +<target>Senaste x timmarna</target> + +<source>Today</source> +<target>Idag</target> + +<source>This week</source> +<target>Denna veckan</target> + +<source>This month</source> +<target>Denna mÃ¥naden</target> + +<source>This year</source> +<target>I Ã¥r</target> + <source>Byte</source> <target>Byte</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>Filter: Generella undantag</target> + <source>Filter: Single pair</source> <target>Filter: Enstaka undantag</target> + <source>Ignore</source> <target>Ignorera</target> + <source>Direct</source> <target>Direkt</target> + <source>Follow</source> <target>Följ</target> + +<source>Copy NTFS permissions</source> +<target>Kopiera NTFS-behörigheter</target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>Integrera externa program i högerklicksmeny. Följande variabler finns tillgängliga:</target> + <source>- full file or directory name</source> <target>- Full sökväg</target> + <source>- directory part only</source> <target>- Endast fil-/katalognamn</target> + <source>- Other side's counterpart to %name</source> <target>- Andra sidans motsvarighet till %name</target> + <source>- Other side's counterpart to %dir</source> <target>- Andra sidans motsvarighet till %dir</target> + <source>Restore all hidden dialogs?</source> <target>Vill du Ã¥terställa alla dolda dialoger?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -916,6 +1259,7 @@ Transfer file and directory permissions <pluralform>Vill du verkligen flytta följande objekt till Papperskorgen?</pluralform> <pluralform>Vill du verkligen flytta följande %x objekt till Papperskorgen?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -924,139 +1268,211 @@ Transfer file and directory permissions <pluralform>Vill du verkligen ta bort följande objekt?</pluralform> <pluralform>Vill du verkligen ta bort följande %x objekt?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>Ignorera konflikt</target> + <source>Delete permanently</source> <target>Ta bort permanent</target> + <source>Delete or overwrite files permanently</source> <target>Ta bort eller skriv över permanent</target> + <source>Use Recycle Bin when deleting or overwriting files</source> -<target>Use Volume Shadow Copy Service to copy locked or shared files</target> +<target>Använd papperskorgen vid borttagning och överskrivning av filer</target> + <source>Versioning</source> <target>Versionshantering</target> + <source>Move files into a time-stamped subdirectory</source> <target>Flytta filer till en tidsstämplad underkatalog</target> -<source>Cannot determine sync-direction:</source> -<target>Kan inte bestämma synk-riktning:</target> -<source>Filter settings have changed!</source> -<target>Filterinställningar har ändrats!</target> + <source>Both sides have changed since last synchronization!</source> <target>BÃ¥da sidor har ändrats sedan senaste synkroniseringen!</target> + +<source>Cannot determine sync-direction:</source> +<target>Kan inte bestämma synk-riktning:</target> + <source>No change since last synchronization!</source> <target>Inga ändringar sedan senaste synkronisering!</target> + +<source>Filter settings have changed!</source> +<target>Filterinställningar har ändrats!</target> + <source>The file was not processed by last synchronization!</source> <target>Filen bearbetades inte vid senaste synkroniseringen</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>Planerad katalogborttagning är i konflikt med sina underkataloger och filer</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Standardsynkronisering: Gamla filer kommer att skrivas över av nyare versioner.</target> + <source>The file does not contain a valid configuration:</source> <target>Filen är ingen giltig konfigureringsfil:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>Du kan bortse frÃ¥n det här felet och utgÃ¥ ifrÃ¥n att katalogen är tom</target> + <source>Directory does not exist:</source> <target>Katalogen finns inte:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Kataloger är beroende! Var försiktig när du sätter upp synkroniseringsregler:</target> + <source>Comparing content of files %x</source> <target>Jämför filinnehÃ¥ll för %x</target> + <source>Memory allocation failed!</source> <target>Minnesallokering misslyckades!</target> + <source>File %x has an invalid date!</source> <target>Filen %x har ett ogiltigt datum!</target> + <source>Conflict detected:</source> <target>Konflikt upptäckt:</target> + <source>Files %x have the same date but a different size!</source> <target>Filerna %x har samma datum men olika storlek!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>Symbolisk länk %x har samma datum, men annat mÃ¥l!</target> + <source>Comparing files by content failed.</source> <target>Kunde inte jämföra filinnehÃ¥ll.</target> + <source>Generating file list...</source> <target>Skapar fillista...</target> + <source>Multiple...</source> <target>Multipla...</target> + <source>Both sides are equal</source> <target>Bägge sidor är lika</target> + <source>Files/folders differ in attributes only</source> <target>Endast attributskillnader i filer/kataloger</target> + <source>Copy new file/folder to left</source> <target>Kopiera ny fil/katalog Ã¥t vänster</target> + <source>Copy new file/folder to right</source> <target>Kopiera ny fil/katalog Ã¥t höger</target> + <source>Delete left file/folder</source> <target>Ta bort vänster fil/katalog</target> + <source>Delete right file/folder</source> <target>Ta bort höger fil/katalog</target> + <source>Overwrite left file/folder with right one</source> <target>Skriv över vänster fil/katalog med den högra</target> + <source>Overwrite right file/folder with left one</source> <target>Skriv över höger fil/katalog med den vänstra</target> + <source>Do nothing</source> <target>Gör ingenting</target> + <source>Copy file attributes only to left</source> <target>Kopiera endast filattribut Ã¥t vänster</target> + <source>Copy file attributes only to right</source> <target>Kopiera endast filattribut Ã¥t höger</target> + <source>Deleting file %x</source> <target>Tar bort filen %x</target> -<source>Deleting Symbolic Link %x</source> -<target>Tar bort symbolisk länk %x</target> + <source>Deleting folder %x</source> <target>Tar bort katalogen %x</target> -<source>Moving %x to Recycle Bin</source> -<target>Flyttar %x till papperskorgen</target> -<source>Moving file %x to user-defined directory %y</source> -<target>Flyttar %x till %y</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>Flyttar %x till %y</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>Flyttar symbolisk länk %x till användardefinierad plats %y</target> -<source>Copying new file %x to %y</source> -<target>Kopierar ny fil %x till %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>Kopierar ny symbolisk länk %x to %y</target> -<source>Overwriting file %x in %y</source> -<target>Skriver över fil %x i %y</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>Skriver över symbolisk länk %x i %y</target> + +<source>Deleting symbolic link %x</source> +<target>Tar bort den symboliska länken %x</target> + +<source>Moving file %x to recycle bin</source> +<target>Flyttar filen %x till papperskorgen</target> + +<source>Moving folder %x to recycle bin</source> +<target>Flyttar katalogen %x till papperskorgen</target> + +<source>Moving symbolic link %x to recycle bin</source> +<target>Flyttar den symboliska länken %x till papperskorgen</target> + +<source>Moving file %x to %y</source> +<target>Flyttar filen %x till %y</target> + +<source>Moving folder %x to %y</source> +<target>Flyttar katalogen %x till %y</target> + +<source>Moving symbolic link %x to %y</source> +<target>Flyttar den symboliska länken %x till %y</target> + +<source>Creating file %x</source> +<target>Skapar fil %x</target> + +<source>Creating symbolic link %x</source> +<target>Skapar den symboliska länken %x</target> + <source>Creating folder %x</source> <target>Skapar katalog %x</target> + +<source>Overwriting file %x</source> +<target>Skriver över filen %x</target> + +<source>Overwriting symbolic link %x</source> +<target>Skriver över den symboliska länken %x</target> + <source>Verifying file %x</source> <target>Verifierar %x</target> + <source>Updating attributes of %x</source> <target>Uppdaterar attribut för %x</target> -<source>Source directory does not exist anymore:</source> -<target>Källkatalogen finns inte längre:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>Inget att synkronisera enligt aktuella inställningar!</target> + <source>Target directory name must not be empty!</source> <target>MÃ¥lkatalogens namn mÃ¥ste anges</target> + <source>User-defined directory for deletion was not specified!</source> <target>Katalog för borttagning ej specifiserad!</target> + +<source>Source directory does not exist anymore:</source> +<target>Källkatalogen finns inte längre:</target> + <source>Unresolved conflicts existing!</source> <target>Obehandlad konflikt upptäckt!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>Du kan ignorera konflikter och fortsätta synkroniseringen.</target> + <source>Significant difference detected:</source> <target>Betydande skillnad upptäckt:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>mer än 50% av totalt filantal kommer att kopieras eller tas bort!</target> + <source>Not enough free disk space available in:</source> <target>Ej tillräckligt ledigt diskutrymme pÃ¥:</target> + <source>Free disk space required:</source> <target>Krav pÃ¥ ledigt diskutrymme:</target> + <source>Free disk space available:</source> <target>Ledigt diskutrymme:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> -<target></target> +<target>Papperskorgen är inte tillgänglig för följande sökvägar! Filerna tas i stället bort permanent.</target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>En katalog som är en del av flera katalogpar kommer att ändras! Kontrollera synkroniseringsinställningarna</target> + <source>Processing folder pair:</source> <target>Processar katalogpar:</target> + <source>Generating database...</source> <target>Skapar databas...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>Inget att synkronisera enligt aktuella inställningar!</target> + <source>Error copying locked file %x!</source> <target>Kan inte kopiera lÃ¥st fil %x!</target> + <source>Data verification error: Source and target file have different content!</source> <target>Verifikationsfel: Källfil och mÃ¥lfil har olika innehÃ¥ll!</target> + diff --git a/BUILD/Languages/turkish.lng b/BUILD/Languages/turkish.lng index 62ff7760..1ba8ff30 100644 --- a/BUILD/Languages/turkish.lng +++ b/BUILD/Languages/turkish.lng @@ -9,74 +9,115 @@ <source>Searching for directory %x...</source> <target></target> + <source>Show in Explorer</source> <target>Tarayıcıda Göster</target> + <source>Open with default application</source> <target>Varsayılan uygulama ile aç</target> + <source>Browse directory</source> <target>Klasöre gözat</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - KendiliÄŸinden EÅŸleÅŸtirme</target> + <source>Browse</source> <target>Gözat</target> -<source>Invalid commandline: %x</source> -<target>Geçersiz komut satırı: %x</target> + +<source>Invalid command line: %x</source> +<target></target> + <source>Error resolving symbolic link:</source> <target>Sembolik baÄŸlantı çözümlenirken hata:</target> -<source>Show popup</source> -<target>Açılır pencerede göster</target> -<source>Show popup on errors or warnings</source> -<target>Hata ve uyarıları açılır bir pencerede gösterir</target> + +<source>Show pop-up</source> +<target></target> + +<source>Show pop-up on errors or warnings</source> +<target></target> + <source>Ignore errors</source> <target>Hataları yoksay</target> + <source>Hide all error and warning messages</source> <target>Tüm hata ve uyarı iletilerini gizler</target> + <source>Exit instantly</source> <target>Hemen çık</target> + <source>Abort synchronization immediately</source> <target>EÅŸleÅŸtirmeyi hemen bırak</target> + +<source>Select alternate comparison settings</source> +<target></target> + <source>Select alternate synchronization settings</source> <target>Alternatif eÅŸleÅŸtirme ayarlarını seçin</target> + <source>No filter selected</source> <target>Hiç süzgeç seçilmedi</target> + <source>Filter is active</source> <target>Etkin süzgeç</target> -<source>Clear filter settings</source> -<target>Süzgeç ayarlarını temizle</target> + <source>Remove alternate settings</source> <target>Alternatif ayarları sil</target> + +<source>Clear filter settings</source> +<target>Süzgeç ayarlarını temizle</target> + <source>Create a batch job</source> <target>Toplu komut iÅŸi oluÅŸtur</target> + <source>Synchronization settings</source> <target>EÅŸleÅŸtirme ayarları</target> + <source>Comparison settings</source> <target>KarşılaÅŸtırma ayarları</target> + <source>About</source> <target>Hakkında</target> + <source>Error</source> <target>Hata</target> + <source>Warning</source> <target>Uyarı</target> + <source>Question</source> <target>Soru</target> + <source>Confirm</source> <target>DoÄŸrula</target> + <source>Configure filter</source> <target>Yapılandırma süzgeci</target> + <source>Customize columns</source> <target>Sütunları özelleÅŸtir</target> + <source>Global settings</source> <target>Genel ayarlar</target> + <source>Synchronization Preview</source> <target>EÅŸleÅŸtirme önizlemesi</target> + <source>Find</source> <target>Bul</target> + +<source>Select time span</source> +<target></target> + <source>%x MB</source> <target>%x MB</target> + <source>%x KB</source> <target>%x KB</target> + <source>%x GB</source> <target>%x GB</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -85,46 +126,64 @@ <pluralform>1 Bayt</pluralform> <pluralform>%x Bayt</pluralform> </target> + <source><Symlink></source> <target><SmblkbaÄŸlantı></target> + <source><Directory></source> <target><Klasör></target> + <source>Size</source> <target>Boyut</target> + <source>Date</source> <target>Tarih</target> + <source>Full path</source> <target>Tam yol</target> + <source>Filename</source> <target>Dosya adı</target> + <source>Relative path</source> <target>Bağıl klasör yolu</target> + <source>Directory</source> <target>Klasör</target> + <source>Extension</source> <target>Uzantı</target> + <source>Comparison Result</source> <target>KarşılaÅŸtırma sonucu</target> + <source>Incompatible synchronization database format:</source> <target>Uyumsuz eÅŸleÅŸtirme veritabanı biçimi:</target> + <source>Initial synchronization:</source> <target>BaÅŸlangıç eÅŸleÅŸtirmesi:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>FreeFileSync veritabanı dosyalarından biri henüz yok:</target> + <source>Error reading from synchronization database:</source> <target>EÅŸleÅŸtirme veri tabanı okunurken hata:</target> + <source>Database files do not share a common synchronization session:</source> <target></target> + <source>An exception occurred!</source> <target>OlaÄŸan dışı bir durum oluÅŸtu!</target> -<source>Error deleting file:</source> -<target>Dosya silinirken hata:</target> + <source>Error reading file attributes:</source> <target>Dosya öznitelikleri okunurken hata:</target> + <source>Waiting while directory is locked (%x)...</source> <target>Klasör kilitli olduÄŸundan bekleniyor (%x)...</target> + <source>Error setting directory lock:</source> <target>Klasör kilitlenirken hata:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -133,27 +192,37 @@ <pluralform>1 saniye</pluralform> <pluralform>%x saniye</pluralform> </target> + <source>Info</source> <target>Bilgi</target> + <source>Fatal Error</source> <target>Ölümcül Hata</target> + <source>Scanning:</source> <target>Taranıyor:</target> + <source>Encoding extended time information: %x</source> <target>Uzatılmış zaman bilgisi kodlanıyor: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> <target></target> + <source>Invalid FreeFileSync config file!</source> <target>Geçersiz FreeFileSync yapılandırma dosyası!</target> + <source>File does not exist:</source> <target>Dosya bulunamadı:</target> + <source>Error parsing configuration file:</source> <target>Yapılandırma dosyası çözümlenirken hata:</target> + <source>/sec</source> <target>/san</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -162,6 +231,7 @@ <pluralform>1 dakika</pluralform> <pluralform>%x dakika</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -170,6 +240,7 @@ <pluralform>1 saat</pluralform> <pluralform>%x saat</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -178,28 +249,40 @@ <pluralform>1 gün</pluralform> <pluralform>%x gün</pluralform> </target> + <source>S&ave configuration...</source> <target>Y&apılandırmayı kaydet...</target> + <source>&Load configuration...</source> <target>Yapılandırmayı a&l...</target> + <source>&Quit</source> <target>Çı&k</target> + <source>&File</source> <target>&Dosya</target> + <source>&Content</source> <target>İçe&rik</target> + <source>&About...</source> <target>H&akkında...</target> + <source>&Help</source> <target>&Yardım</target> + <source>Usage:</source> <target>Kullanım:</target> + <source>1. Select directories to monitor.</source> <target>1. Ä°zlenecek klasörleri seçin.</target> + <source>2. Enter a command line.</source> <target>2. Bir komut satırı yazın.</target> + <source>3. Press 'Start'.</source> <target>3. 'BaÅŸlat'a Tıklayın.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -210,310 +293,456 @@ Her seferinde çalıştırılacak komut satırı: - tüm klasörler geçerli (örneÄŸin USB bellek takıldığında) - bu klasörlerin ya da alt klasörlerin içindeki dosyalar deÄŸiÅŸtirildiÄŸinde </target> + <source>Directories to watch</source> <target>Ä°zlenecek klasörler</target> + <source>Add folder</source> <target>Klasör ekle</target> + <source>Remove folder</source> <target>Klasörü sil</target> + <source>Select a folder</source> <target>Bir klasör seçin</target> + <source>Command line</source> <target>Komut satırı</target> + <source>Minimum Idle Time [seconds]</source> <target>En az boÅŸta bekleme süresi [saniye]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>Son deÄŸiÅŸikliÄŸin algılanması ile komut satırının yürütülmesi arasındaki bekleme süresi</target> + <source>Start</source> <target>BaÅŸla</target> + <source>(Build: %x)</source> <target>(Yapım: %x)</target> + <source>RealtimeSync configuration</source> <target>RealtimeSync yapılandırması</target> + <source>File already exists. Overwrite?</source> <target>Dosya zaten var. Ãœzerine yazılsın mı?</target> + <source>&Restore</source> <target>Ge&ri yükle</target> + <source>&Exit</source> <target>Çı&kış</target> + <source>Monitoring active...</source> <target>Ä°zleme etkin...</target> + <source>Waiting for missing directories...</source> <target>Kayıp klasörler için bekleniyor...</target> + <source>A directory input field is empty.</source> <target>Bir klasör giriÅŸ alanı boÅŸ</target> + <source>Drag && drop</source> <target>Klasör ya da dosyaları buraya sürükleyip bırakabilirsiniz</target> + <source>Could not initialize directory monitoring:</source> <target>Klasör izlemesi baÅŸlatılamadı:</target> + <source>Error when monitoring directories.</source> <target>Klasörler izlenirken hata.</target> + <source>Conversion error:</source> <target>Dönüştürme hatası:</target> + +<source>Error deleting file:</source> +<target>Dosya silinirken hata:</target> + <source>Error moving file:</source> <target>Dosya taşınırken hata:</target> + <source>Target file already existing!</source> <target>Hedef dosya zaten var!</target> + <source>Error moving directory:</source> <target>Klasör taşınırken hata:</target> + <source>Target directory already existing!</source> <target>Hedef klasör zaten var!</target> + <source>Error deleting directory:</source> <target>Klasör silinirken hata:</target> + <source>Error changing modification time:</source> <target>DeÄŸiÅŸiklik tarihini deÄŸiÅŸtirirken hata:</target> + <source>Error loading library function:</source> <target>Kütüphane iÅŸlevi yüklenirken hata:</target> + <source>Error reading security context:</source> <target>Güüvenlik baÄŸlamı okunurken hata:</target> + <source>Error writing security context:</source> <target>Güvenlik baÄŸlamı yazılırken hata:</target> + <source>Error copying file permissions:</source> <target>Dosya izinleri kopyalanırken hata:</target> + <source>Error creating directory:</source> <target>Klasör oluÅŸturulurken hata:</target> + <source>Error copying symbolic link:</source> <target>Sembolik baÄŸlantı kopyalanırken hata:</target> + <source>Error copying file:</source> <target>Dosya kopyalanırken hata:</target> + <source>Error opening file:</source> <target>Dosya açılırken hata:</target> + <source>Error writing file:</source> <target>Dosya yazılırken hata:</target> + <source>Error reading file:</source> <target>Dosya okunurken hata:</target> + <source>Operation aborted!</source> <target>Ä°ÅŸlemden vazgeçildi!</target> + <source>Endless loop when traversing directory:</source> <target>Klasörlerde dolaşırken sonsuz döngü:</target> + <source>Error traversing directory:</source> <target>Klasörde dolaşırken hata:</target> + <source>Windows Error Code %x:</source> <target>Windows Hata Kodu %x:</target> + <source>Linux Error Code %x:</source> <target>Linux Hata Kodu %x:</target> + <source>Error setting privilege:</source> <target>Ä°zinler ayarlanırken hata:</target> + <source>Error moving to Recycle Bin:</source> <target>Geri Dönüşüm Kutusu'na atılırken hata:</target> + <source>Could not load a required DLL:</source> <target>Gerekli bir DLL yüklenemedi:</target> + <source>Error writing to synchronization database:</source> <target>EÅŸleÅŸtirme veri tabanına yazılırken hata:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>Birim Gölge Kopya hizmeti baÅŸlatılırken hata!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target></target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>WOW64 üzerinde gölge kopyalama desteklenmiyor. FreeFileSync 64-bit sürümünü kullanın</target> + <source>Could not determine volume name for file:</source> <target>Åžu dosya için birim adı belirlenemedi:</target> + <source>Volume name %x not part of filename %y!</source> <target>%x birim adı, %y dosya adının parçası deÄŸil!</target> + <source>%x TB</source> <target>%x TB</target> + <source>%x PB</source> <target>%x PB</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>Åžu XML düğümlerindeki deÄŸerler okunamadı:</target> + <source>Logging</source> <target>Günlükleme</target> + <source>FreeFileSync batch file</source> <target>FreeFileSync toplu komut dosyası</target> + <source>FreeFileSync configuration</source> <target>FreeFileSync yapılandırması</target> + <source>FreeFileSync Batch Job</source> <target>FreeFileSync Toplu Komut Ä°ÅŸi</target> + <source>Unable to create logfile!</source> <target>Günlük dosyası oluÅŸturulamıyor!</target> + <source>Batch execution</source> <target>Toplu komut yürütme</target> + <source>Log-messages:</source> <target>Günlük iletileri:</target> + <source>Stop</source> <target>Durdur</target> + <source>Total time:</source> <target>Toplam zaman:</target> + <source>Synchronization aborted!</source> <target>EÅŸleÅŸtirme durduruldu!</target> + <source>Synchronization completed with errors!</source> <target>EÅŸleÅŸtirme hatalarla tamamlandı!</target> + <source>Synchronization completed successfully!</source> <target>EÅŸleÅŸtirme sorunsuz tamamlandı!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>FreeFileSync grafik kullanıcı arayüzünü açmak için "Geç" düğmesine tıklayın</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>FreeFileSync grafik kullanıcı arayüzüne geçiliyor...</target> + <source>Unable to connect to sourceforge.net!</source> <target>sourceforge.net sitesine baÄŸlanılamıyor!</target> + <source>A newer version of FreeFileSync is available:</source> <target>FreeFileSync programının yeni bir sürümü yayınlanmış:</target> + <source>Download now?</source> <target>Åžimdi indir?</target> + <source>Information</source> <target>Bilgi</target> + <source>FreeFileSync is up to date!</source> <target>FreeFileSync güncel!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>FreeFileSync güncellemelerinin her hafta denetlenmesini ister misiniz?</target> + <source>(Requires an Internet connection!)</source> <target>(Ä°nternet baÄŸlantısı gereklidir!)</target> + <source>1. &Compare</source> <target>1. &KarşılaÅŸtır</target> + <source>2. &Synchronize...</source> <target>2. &EÅŸleÅŸtir...</target> + <source>S&witch view</source> <target>Orta görünümü &deÄŸiÅŸtir</target> + <source>&New</source> <target>Ye&ni</target> + <source>&Program</source> <target>&Program</target> + <source>&Language</source> <target>Di&l</target> + <source>&Global settings...</source> <target>&Genel ayarlar...</target> + <source>&Create batch job...</source> <target>&Toplu komut iÅŸi oluÅŸtur...</target> + <source>&Export file list...</source> <target>Dosya list&esini ver...</target> + <source>&Advanced</source> <target>&GeliÅŸmiÅŸ</target> + <source>&Check for new version</source> <target>Yeni &sürüm denetimi</target> + <source>Compare</source> <target>KarşılaÅŸtır</target> + <source>Compare both sides</source> <target>Ä°ki tarafı da karşılaÅŸtır</target> + <source>&Abort</source> <target>V&azgeç</target> + <source>Synchronize...</source> <target>EÅŸleÅŸtir...</target> + <source>Start synchronization</source> <target>EÅŸleÅŸtirmeyi baÅŸlat</target> -<source>Swap sides</source> -<target>SaÄŸ ve sol yanı deÄŸiÅŸtir</target> + <source>Add folder pair</source> <target>Klasör çifti ekle</target> + <source>Remove folder pair</source> <target>Klasör çiftini sil</target> + +<source>Swap sides</source> +<target>SaÄŸ ve sol yanı deÄŸiÅŸtir</target> + <source>Save current configuration to file</source> <target>Geçerli yapılandırmayı dosyaya kaydet</target> + <source>Load configuration from file</source> <target>Dosyadan yapılandırmayı yükle</target> + <source>Last used configurations (press DEL to remove from list)</source> <target>Son kullanılan yapılandırmalar (listeden silmek için DEL tuÅŸuna basın)</target> + <source>Hide excluded items</source> <target>Dışlanan ögeleri gizle</target> + <source>Hide filtered or temporarily excluded files</source> <target>Süzülmüş ya da geçici olarak dışlanmış dosyaları gizle</target> + <source>Number of files and directories that will be created</source> <target>OluÅŸturulacak dosya ve klasör sayısı</target> + <source>Number of files that will be overwritten</source> <target>Ãœzerine yazılacak dosya sayısı</target> + <source>Number of files and directories that will be deleted</source> <target>Silinecek dosya ve klasör sayısı</target> + <source>Total amount of data that will be transferred</source> <target>Aktarılacak toplam veri miktarı</target> -<source>Left</source> -<target>Sol</target> -<source>Right</source> -<target>SaÄŸ</target> + <source>Batch job</source> <target>Toplu komut iÅŸi</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>KendiliÄŸinden eÅŸleÅŸtirme için bir komut dosyası oluÅŸturun. Komut dosyasını iÅŸlemek için dosyanın üzerinde çift tıklayabilir ya da FreeFileSync.exe <komutdosyası> ÅŸeklinde bir komut satırı yazabilirsiniz. Bu iÅŸi iÅŸletim sisteminizin görev yöneticisi ile istediÄŸiniz zaman çalışacak ÅŸekilde ayarlayabilirsiniz.</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target></target> + <source>Help</source> <target>Yardım</target> + <source>Filter files</source> <target>Dosya süzgeci</target> + <source>Error handling</source> <target>Hata olduÄŸunda:</target> + +<source>Left</source> +<target>Sol</target> + +<source>Right</source> +<target>SaÄŸ</target> + <source>Overview</source> <target>Özet</target> + <source>Status feedback</source> <target>Durum geri bildirimi</target> + <source>Run minimized</source> <target></target> + <source>Maximum number of logfiles:</source> <target>En fazla günlük dosyası sayısı:</target> + <source>Select logfile directory:</source> <target>Kayıt dosyası klasörünü seçin:</target> + <source>Batch settings</source> <target></target> + <source>&Save</source> <target>&Kaydet</target> + <source>&Load</source> <target>Yük&le</target> + <source>&Cancel</source> <target>Ä°&ptal</target> + <source>Elements found:</source> <target>Bulunan bileÅŸenler:</target> + <source>Elements remaining:</source> <target>Kalan bileÅŸenler:</target> + <source>Speed:</source> <target>Hız:</target> + <source>Time remaining:</source> <target>Kalan zaman:</target> + <source>Time elapsed:</source> <target>Geçen zaman:</target> + <source>Operation:</source> <target>Ä°ÅŸlem:</target> + <source>Select variant:</source> <target>DeÄŸiÅŸkeni seçin:</target> + <source><Automatic></source> <target><KendiliÄŸinden></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>Bir veritabanı kullanarak iki yandaki deÄŸiÅŸiklikleri belirler ve günceller. Silinme ve tutarsızlıklar kendiliÄŸinden algılanır.</target> + <source>Mirror ->></source> <target>Yansı ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Sol klasörün yansı yedeÄŸi. EÅŸleÅŸtirmeden sonra saÄŸ klasör, sol klasörün tamamen aynısı olacak.</target> + <source>Update -></source> <target>Güncelle -></target> + <source>Copy new or updated files to right folder.</source> <target>Yalnız yeni ya da güncellenmiÅŸ dosyalar soldan saÄŸa kopyalanır.</target> + <source>Custom</source> <target>Özel</target> + <source>Configure your own synchronization rules.</source> <target>Buradan kendi eÅŸleÅŸtirme kurallarınızı yapılandırabilirsiniz.</target> + <source>Deletion handling</source> <target>Silme eyleminde:</target> + <source>&OK</source> <target>&Tamam</target> + <source>Configuration</source> <target>Yapılandırma</target> + <source>Category</source> <target>Kategori</target> + <source>Action</source> <target>Ä°ÅŸlem</target> + <source>File/folder exists on left side only</source> <target>Dosya/Klasör yalnız sol tarafta var</target> + <source>File/folder exists on right side only</source> <target>Dosya/Klasör yalnız saÄŸ tarafta var</target> + <source>Left file is newer</source> <target>Soldaki dosya daha yeni</target> + <source>Right file is newer</source> <target>SaÄŸdaki dosya daha yeni</target> + <source>Files have different content</source> <target>Farklı içeriÄŸe sahip dosyalar</target> + <source>Conflict/file cannot be categorized</source> <target>Çatışma/dosya kategorize edilemedi</target> + <source>Compare by...</source> <target>KarşılaÅŸtırma ölçütünü seçin:</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> -<target> -EÅŸit dosyalar aranırken - - dosya boyutu - - son kayıt zamanı ve tarihi -aynı olanlara bakılır -</target> -<source>File size and date</source> -<target>Dosya boyutu ve tarihi</target> +<target></target> + +<source>File time and size</source> +<target></target> + <source> Files are found equal if - file content @@ -524,92 +753,85 @@ EÅŸit dosyalar aranırken - dosya içeriÄŸi aynı olanlara bakılır </target> + <source>File content</source> <target>Dosya içeriÄŸi</target> + <source>Symbolic Link handling</source> <target>Sembolik baÄŸlantı iÅŸleme</target> + <source>Synchronizing...</source> <target>EÅŸleÅŸtiriliyor...</target> + <source>Elements processed:</source> <target>Ä°ÅŸlenen bileÅŸenler:</target> + <source>&Pause</source> <target>&Duraklat</target> -<source>Compare by "File size and date"</source> -<target>"Dosya boyutu ve tarihi"ne göre karşılaÅŸtırma</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>Bu seçenek, aynı adlı iki dosyanın, aynı boyuta ve aynı son deÄŸiÅŸiklik tarihine sahip olması durumunda eÅŸit olması anlamına gelir.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>Bu seçenekle karşılaÅŸtırma yapıldığında, ÅŸu karar aÄŸacı iÅŸlenir:</target> -<source>As a result the files are separated into the following categories:</source> -<target>Sonuç olarak dosyalar ÅŸu kategorilere göre ayrılır:</target> -<source>- equal</source> -<target>- eÅŸit</target> -<source>- left newer</source> -<target>- soldaki daha yeni</target> -<source>- right newer</source> -<target>- saÄŸdaki daha yeni</target> -<source>- exists left only</source> -<target>- yalnız solda olan</target> -<source>- exists right only</source> -<target>- yalnız saÄŸda olan</target> -<source>- conflict (same date, different size)</source> -<target>- tutarsızlık (aynı tarih, farklı boyut)</target> -<source>Compare by "File content"</source> -<target>"Dosya içeriÄŸi"ne göre karşılaÅŸtırma</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. - -With this option enabled the decision tree is smaller: -</source> -<target> -Bu seçenekte, yalnızca aynı ada sahip iki dosyanın içeriÄŸi aynıysa eÅŸit olarak kabul edilirler. Bu seçenek yedekleme iÅŸlemlerinden daha çok, uyuÅŸma denetimi için yararlıdır. Bu yüzden dosya tarihleri hiç bir zaman dikkate alınmaz. -Bu seçenekle karşılaÅŸtırma yapıldığında, ÅŸu karar aÄŸacı iÅŸlenir: -</target> -<source>- different</source> -<target>- farklı</target> <source>Source code written in C++ utilizing:</source> <target>Kaynak kodu C++ kullanılarak yazılmıştır:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>FreeFileSync çevirisinden dolayı çok teÅŸekkürler:</target> + <source>Feedback and suggestions are welcome at:</source> <target>Geri bildirim ve önerileriniz için:</target> + <source>FreeFileSync at Sourceforge</source> <target>Sourceforge sitesinde FreeFileSync</target> + <source>Homepage</source> <target>Ana sayfa</target> + <source>If you like FFS</source> <target>FFS’i beÄŸendiyseniz</target> + <source>Donate with PayPal</source> <target>PayPal ile bağış yapın</target> + <source>Email</source> <target>E-posta</target> + <source>Report translation error</source> <target>Çeviri hatasını bildir</target> + <source>Published under the GNU General Public License:</source> <target>GNU Genel Kamu Lisansına ÅŸartları altında yayınlanmıştır:</target> + <source>Ignore subsequent errors</source> <target>Sonraki hataları yoksay</target> + <source>Hide further error messages during the current process</source> <target>Yürürlükteki iÅŸlem boyunca baÅŸka hata iletisi gösterme</target> + <source>&Ignore</source> <target>&Yoksay</target> + <source>&Retry</source> <target>&Yeniden dene</target> + <source>Do not show this dialog again</source> <target>Bu iletiyi yeniden gösterme</target> + <source>&Switch</source> <target>&DeÄŸiÅŸtir</target> + <source>&Yes</source> <target>&Evet</target> + <source>&No</source> <target>&Hayır</target> + <source>Delete on both sides</source> <target>Her iki yandakini de sil</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>Dosya yalnız bir tarafta seçili olsa bile her iki yandakini de sil</target> + <source>Use Recycle Bin</source> <target>Geri Dönüşüm Kutusu'nu kullan</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -618,16 +840,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire Yalnızca tüm süzgeç koÅŸullarına uyan dosya ve klasörler eÅŸleÅŸtirilecek. Not: Ad süzgeci kök eÅŸleÅŸtirme klasörüne göre bağıl(!) olarak belirtilmelidir. </target> + <source>Hints:</source> <target>Ä°puçları:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. Bağıl dosya ya da klasör adlarını ';' ile ayırarak ya da ayrı satırlar ÅŸeklinde yazın.</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. '*' ve '?' jokerleri kullanılabilsin.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. Ana listedeki dosyaları saÄŸ fare tuÅŸu menüsüyle doÄŸrudan dışla.</target> + <source>Example</source> <target>Örnek</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -636,30 +864,40 @@ Exclude: \stuff\temp\* Kat: *.doc;*.zip;*.exe Katma: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>"temp" alt klasöründeki herÅŸey hariç, tüm .doc, .zip ve .exe dosyalarını eÅŸleÅŸtir.</target> + <source>Include</source> <target>Katılacaklar:</target> + <source>Exclude</source> <target>Dışlanacaklar:</target> -<source>Select time span:</source> -<target>Zaman aralığını seçin:</target> -<source>Minimum file size:</source> -<target>En küçük dosya boyutu:</target> -<source>Maximum file size:</source> -<target>En büyük dosya sayısı:</target> + +<source>Minimum file size</source> +<target></target> + +<source>Maximum file size</source> +<target></target> + <source>&Default</source> <target>&Varsayılan</target> + <source>Move column up</source> <target>Sütunu yukarı taşı</target> + <source>Move column down</source> <target>Sütunu aÅŸağı taşı</target> -<source>Transactional File Copy</source> + +<source>Transactional file copy</source> <target></target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> <target></target> + <source>Copy locked files</source> <target>Kilitli dosyaları da kopyala</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -668,8 +906,10 @@ Copy shared or locked files using Volume Shadow Copy Service Paylaşılmış ya da kilitli dosyaları Birim Gölge Kopya Hizmetini kullanarak kopyala (Yönetici izinlerine gerek duyar) </target> -<source>Copy filesystem permissions</source> -<target>Dosya sistemi izinlerini de kopyala</target> + +<source>Copy file access permissions</source> +<target></target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -678,138 +918,205 @@ Transfer file and directory permissions Dosya ve klasör izinlerini de aktar (Yönetici izinlerine gerek duyar) </target> + <source>Hidden dialogs:</source> <target>GizlenmiÅŸ iletiler:</target> + <source>Reset</source> <target>Sıfırla</target> + <source>Show hidden dialogs</source> <target>GizlenmiÅŸ iletileri göster</target> + <source>External applications</source> <target>Dış uygulamalar</target> + <source>Description</source> <target>Açıklama</target> + <source>Variant</source> <target>DeÄŸiÅŸken</target> + <source>Statistics</source> <target>Ä°statistikler</target> + <source>Find what:</source> <target>Aranacak:</target> + <source>Match case</source> <target>Büyük/küçük harf uydur</target> + <source>&Find next</source> <target>&Sonrakini bul</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>Kalan öğeleri yeniden eÅŸleÅŸtirmeyi deneyebilirsiniz (Tekrar kaşılaÅŸtırma yapmadan)!</target> -<source>Batch file created successfully!</source> -<target>Toplu komut dosyası sorunsuz oluÅŸturuldu!</target> + <source>Main bar</source> <target>Ana çubuk</target> + <source>Folder pairs</source> <target>Klasör çiftleri</target> + <source>Select view</source> <target>Görünümü seçin</target> + <source>Set direction:</source> <target>Yönü seçin:</target> + <source>Exclude temporarily</source> <target>Geçici olarak dışla</target> + <source>Include temporarily</source> <target>Geçici olarak kat</target> + <source>Exclude via filter:</source> <target>Süzerek dışarda bırak:</target> + <source><multiple selection></source> <target><çoklu seçim></target> + <source>D-Click</source> <target>D-TuÅŸu</target> + <source>Delete</source> <target>Sil</target> + <source>Customize...</source> <target>ÖzelleÅŸtir...</target> + +<source>Select time span...</source> +<target></target> + <source>Auto-adjust columns</source> <target>Sütunları kendiliÄŸinden hizala</target> + <source>Include all rows</source> <target>Tüm satırları kat</target> + <source>Exclude all rows</source> <target>Tüm satırları dışla</target> + <source>Reset view</source> <target>Görünümü sıfırla</target> + <source>Show "%x"</source> <target>"%x" panelini göster</target> + <source><Last session></source> <target><Önceki oturum></target> + <source>Configuration saved!</source> <target>Yapılandırma kaydedildi!</target> + <source>Save changes to current configuration?</source> <target>DeÄŸiÅŸiklikleri ÅŸu anki yapılandırmaya kaydetmek ister misiniz?</target> + <source>Configuration loaded!</source> <target>Yapılandırma yüklendi!</target> + <source>Folder Comparison and Synchronization</source> <target>Klasör KarşılaÅŸtırma ve EÅŸleÅŸtirme</target> + <source>Hide files that exist on left side only</source> <target>Yalnız sol yanda bulunan dosyaları gizle</target> + <source>Show files that exist on left side only</source> <target>Yalnız sol tarafta bulunan dosyaları göster</target> + <source>Hide files that exist on right side only</source> <target>Yalnız saÄŸ yanda bulunan dosyaları gizle</target> + <source>Show files that exist on right side only</source> <target>Yalnız saÄŸ tarafta bulunan dosyaları göster</target> + <source>Hide files that are newer on left</source> <target>Solda daha yeni olan dosyaları gizle</target> + <source>Show files that are newer on left</source> <target>Solda daha yeni olan dosyaları göster</target> + <source>Hide files that are newer on right</source> <target>SaÄŸda daha yeni olan dosyaları gizle</target> + <source>Show files that are newer on right</source> <target>SaÄŸda daha yeni olan dosyaları göster</target> + <source>Hide files that are equal</source> <target>EÅŸit olan dosyaları gizle</target> + <source>Show files that are equal</source> <target>EÅŸit olan dosyaları göster</target> + <source>Hide files that are different</source> <target>Farklı olan dosyaları gizle</target> + <source>Show files that are different</source> <target>Farklı olan dosyaları göster</target> + <source>Hide conflicts</source> <target>ÇeliÅŸkileri gizle</target> + <source>Show conflicts</source> <target>ÇeliÅŸkileri göster</target> + <source>Hide files that will be created on the left side</source> <target>Sol yanda oluÅŸturulacak dosyaları gizle</target> + <source>Show files that will be created on the left side</source> <target>Yalnız sol tarafta oluÅŸturulacak dosyaları göster</target> + <source>Hide files that will be created on the right side</source> <target>SaÄŸ yanda oluÅŸturulacak dosyaları gizle</target> + <source>Show files that will be created on the right side</source> <target>Yalnız saÄŸ tarafta oluÅŸturulacak dosyaları göster</target> + <source>Hide files that will be deleted on the left side</source> <target>Sol yanda silinecek dosyaları gizle</target> + <source>Show files that will be deleted on the left side</source> <target>Yalnız sol tarafta silinecek dosyaları göster</target> + <source>Hide files that will be deleted on the right side</source> <target>SaÄŸ yanda silinecek dosyaları gizle</target> + <source>Show files that will be deleted on the right side</source> <target>Yalnız saÄŸ tarafta silinecek dosyaları göster</target> + <source>Hide files that will be overwritten on left side</source> <target>Sol yanda üzerine yazılacak dosyaları gizle</target> + <source>Show files that will be overwritten on left side</source> <target>Yalnız sol tarafta üzerine yazılacak dosyaları göster</target> + <source>Hide files that will be overwritten on right side</source> <target>SaÄŸ yanda üzerine yazılacak dosyaları gizle</target> + <source>Show files that will be overwritten on right side</source> <target>Yalnız saÄŸ tarafta üzerine yazılacak dosyaları göster</target> + <source>Hide files that won't be copied</source> <target>Kopyalanmayacak dosyaları gizle</target> + <source>Show files that won't be copied</source> <target>Kopyalanmayacak dosyaları göster</target> + <source>All directories in sync!</source> <target>Tüm klasörler eÅŸ!</target> + <source>Please run a Compare first before synchronizing!</source> <target>Lütfen eÅŸleÅŸtirmeden önce karşılaÅŸtırma yapın!</target> + <source>Comma separated list</source> <target>Virgül ile ayrılmış liste</target> + <source>Legend</source> <target>Gösterge</target> + <source>File list exported!</source> <target>Dosya listesi verilmiÅŸ!</target> + +<source>Batch file created successfully!</source> +<target>Toplu komut dosyası sorunsuz oluÅŸturuldu!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -818,6 +1125,7 @@ Dosya ve klasör izinlerini de aktar <pluralform>Nesne silindi!</pluralform> <pluralform>%x nesne silindi!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -826,6 +1134,7 @@ Dosya ve klasör izinlerini de aktar <pluralform>1 klasör</pluralform> <pluralform>%x klasör</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -834,6 +1143,7 @@ Dosya ve klasör izinlerini de aktar <pluralform>1 dosya</pluralform> <pluralform>%x dosya</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -842,72 +1152,97 @@ Dosya ve klasör izinlerini de aktar <pluralform>%x / 1 satır gösteriliyor</pluralform> <pluralform>%x / %y satır gösteriliyor</pluralform> </target> + <source>Scanning...</source> <target>Taranıyor...</target> + <source>Comparing content...</source> <target>İçerik karşılaÅŸtırılıyor...</target> + <source>Paused</source> <target>Duraklatıldı</target> + <source>Aborted</source> <target>Vazgeçildi</target> + <source>Completed</source> <target>Tamamlandı</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>Vazgeçildi: Yürürlükteki iÅŸlemin bitmesi bekleniyor...</target> + <source>Continue</source> <target>Devam et</target> + <source>Pause</source> <target>Duraklat</target> + <source>Cannot find %x</source> <target>%x bulunamadı</target> -<source>DECISION TREE</source> -<target>KARAR AÄžACI</target> -<source>file exists on both sides</source> -<target>Dosya her iki yanda da var</target> -<source>on one side only</source> -<target>yalnız tek yanda</target> -<source>same date</source> -<target>aynı tarihli</target> -<source>different date</source> -<target>farklı tarihli</target> + <source>Inactive</source> <target>Devre dışı</target> -<source>Second</source> -<target>Saniye</target> -<source>Minute</source> -<target>Dakika</target> -<source>Hour</source> -<target>Saat</target> -<source>Day</source> -<target>Gün</target> + +<source>Last x hours</source> +<target></target> + +<source>Today</source> +<target></target> + +<source>This week</source> +<target></target> + +<source>This month</source> +<target></target> + +<source>This year</source> +<target></target> + <source>Byte</source> <target>Bayt</target> + <source>KB</source> <target>KB</target> + <source>MB</source> <target>MB</target> + <source>Filter: All pairs</source> <target>Süzgeç: Tüm çiftler</target> + <source>Filter: Single pair</source> <target>Süzgeç: Tek çift</target> + <source>Ignore</source> <target>Yoksay</target> + <source>Direct</source> <target>DoÄŸrudan</target> + <source>Follow</source> <target>Ä°zle</target> + +<source>Copy NTFS permissions</source> +<target></target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>Dış uygulamaları saÄŸ tuÅŸ menüsüne ekler. Åžu makrolar kullanılabilir:</target> + <source>- full file or directory name</source> <target>- tam dosya ya da klasör adı</target> + <source>- directory part only</source> <target>- Yalnız klasör kısmı</target> + <source>- Other side's counterpart to %name</source> <target>- %name diÄŸer taraftaki karşılığı</target> + <source>- Other side's counterpart to %dir</source> <target>- %dir klasörünün diÄŸer taraftaki karşılığı</target> + <source>Restore all hidden dialogs?</source> <target>Tüm gizlenmiÅŸ iletiler gösterilsin mi?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -916,6 +1251,7 @@ Dosya ve klasör izinlerini de aktar <pluralform>Åžu ögeyi geri dönüşüm kutusuna taşımak istediÄŸinizden emin misiniz?</pluralform> <pluralform>Åžu %x ögeyi geri dönüşüm kutusuna taşımak istediÄŸinizden emin misiniz?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -924,139 +1260,211 @@ Dosya ve klasör izinlerini de aktar <pluralform>Åžu ögeyi silmek istiyor musunuz?</pluralform> <pluralform>Åžu %x ögeyi silmek istiyor musunuz?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>ÇözülmemiÅŸ tutarsızlık olarak bırak</target> + <source>Delete permanently</source> <target>Kalıcı olarak sil</target> + <source>Delete or overwrite files permanently</source> <target>Dosyaları kalıcı olarak siler ya da üzerine yazar</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>Dosya silme ve üzerine yazma sırasında Geri Dönüşüm Kutusu'nu kullanır</target> + <source>Versioning</source> <target>Sürümlendirme</target> + <source>Move files into a time-stamped subdirectory</source> <target>Dosyaları zaman damgasıyla bir alt klasöre taşır</target> -<source>Cannot determine sync-direction:</source> -<target>EÅŸleÅŸtirme yönü belirlenemedi:</target> -<source>Filter settings have changed!</source> -<target>Süzgeç ayarları deÄŸiÅŸtirildi!</target> + <source>Both sides have changed since last synchronization!</source> <target>Son eÅŸleÅŸtirmeden bu yana iki yanın içeriÄŸi de deÄŸiÅŸmiÅŸ!</target> + +<source>Cannot determine sync-direction:</source> +<target>EÅŸleÅŸtirme yönü belirlenemedi:</target> + <source>No change since last synchronization!</source> <target>Son eÅŸleÅŸtirmeden bu yana deÄŸiÅŸik olmamış!</target> + +<source>Filter settings have changed!</source> +<target>Süzgeç ayarları deÄŸiÅŸtirildi!</target> + <source>The file was not processed by last synchronization!</source> <target>Dosya son eÅŸleÅŸtirmede iÅŸlenmemiÅŸ!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>Planlanmış klasörün silinmesi alt klasör ve dosyalarıyla çeliÅŸiyor!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target>Varsayılan eÅŸleÅŸtirme yönleri ayarlanıyor: Yeni dosyalar eski dosyaların üzerine yazılacak.</target> + <source>The file does not contain a valid configuration:</source> <target>Dosya geçerli bir yapılandırma içermiyor:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>Bu hatayı, klasörü boÅŸ sayacak ÅŸekilde yok sayabilirsiniz.</target> + <source>Directory does not exist:</source> <target>Klasör bulunamadı:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Klasörler bağımlı! EÅŸleÅŸtirme kurallarını koyarken dikkatli olun:</target> + <source>Comparing content of files %x</source> <target>%x dosyalarının içeriÄŸi karşılaÅŸtırılıyor</target> + <source>Memory allocation failed!</source> <target>Bellek ayrılamadı!</target> + <source>File %x has an invalid date!</source> <target>%x dosyasının tarihi geçersiz!</target> + <source>Conflict detected:</source> <target>ÇeliÅŸki bulundu:</target> + <source>Files %x have the same date but a different size!</source> <target>%x dosyalarının tarihleri aynı fakat boyutları farklı!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>Sembolik baÄŸlantılar %x aynı tarihli fakat hedefleri farklı!</target> + <source>Comparing files by content failed.</source> <target>Dosyaların içerikleri karşılaÅŸtırılamadı.</target> + <source>Generating file list...</source> <target>Dosya listesi oluÅŸturuluyor...</target> + <source>Multiple...</source> <target>Çoklu...</target> + <source>Both sides are equal</source> <target>Ä°ki tarafta aynı</target> + <source>Files/folders differ in attributes only</source> <target>Yalnız dosya/klasör öznitelikleri farklı olanlar</target> + <source>Copy new file/folder to left</source> <target>Yeni dosya/klasörleri sola kopyala</target> + <source>Copy new file/folder to right</source> <target>Yeni dosya/klasörleri saÄŸa kopyala</target> + <source>Delete left file/folder</source> <target>Soldaki dosya/klasörleri sil</target> + <source>Delete right file/folder</source> <target>SaÄŸdaki dosya/klasörleri sil</target> + <source>Overwrite left file/folder with right one</source> <target>Soldaki dosya/klasörlerin üzerine saÄŸdakileri yaz</target> + <source>Overwrite right file/folder with left one</source> <target>SaÄŸdaki dosya/klasörlerin üzerine soldakileri yaz</target> + <source>Do nothing</source> <target>Hiçbir ÅŸey yapma</target> + <source>Copy file attributes only to left</source> <target>Dosya özniteliklerini yalnız sola kopyalaya</target> + <source>Copy file attributes only to right</source> <target>Dosya özniteliklerini yalnız saÄŸa kopyalaya</target> + <source>Deleting file %x</source> <target>%x dosyası siliniyor</target> -<source>Deleting Symbolic Link %x</source> -<target>%z sembolik baÄŸlantısı siliniyor</target> + <source>Deleting folder %x</source> <target>%x klasörü siliniyor</target> -<source>Moving %x to Recycle Bin</source> -<target>%x Geri Dönüşüm Kutusu'na atılıyor</target> -<source>Moving file %x to user-defined directory %y</source> -<target>%x dosyası kullanıcının tanımladığı %y klasörüne taşınıyor</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>%x klasörü kullanıcının tanımladığı %y klasörüne taşınıyor</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>%x sembolik baÄŸlantısı kullanıcının belirttiÄŸi %y klasörüne taşınıyor</target> -<source>Copying new file %x to %y</source> -<target>Yeni dosya %x %y üzerine kopyalanıyor</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>Yeni sembolik baÄŸlantı %x %y üzerine kopyalanıyor</target> -<source>Overwriting file %x in %y</source> -<target>%y içindeki %x dosyasının üzerine yazılıyor</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>%y içindeki %x sembolik baÄŸlantısının üzerine yazılıyor</target> + +<source>Deleting symbolic link %x</source> +<target></target> + +<source>Moving file %x to recycle bin</source> +<target></target> + +<source>Moving folder %x to recycle bin</source> +<target></target> + +<source>Moving symbolic link %x to recycle bin</source> +<target></target> + +<source>Moving file %x to %y</source> +<target></target> + +<source>Moving folder %x to %y</source> +<target></target> + +<source>Moving symbolic link %x to %y</source> +<target></target> + +<source>Creating file %x</source> +<target></target> + +<source>Creating symbolic link %x</source> +<target></target> + <source>Creating folder %x</source> <target>%x klasörü oluÅŸturuluyor</target> + +<source>Overwriting file %x</source> +<target></target> + +<source>Overwriting symbolic link %x</source> +<target></target> + <source>Verifying file %x</source> <target>%x dosyası doÄŸrulanıyor</target> + <source>Updating attributes of %x</source> <target>%x öznitelikleri güncelleniyor</target> -<source>Source directory does not exist anymore:</source> -<target>Kaynak klasör artık yok:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>Yapılandırmaya göre eÅŸleÅŸtirilecek bir ÅŸey yok!</target> + <source>Target directory name must not be empty!</source> <target>Hedef klasör adı boÅŸ olamaz!</target> + <source>User-defined directory for deletion was not specified!</source> <target>Silme için kullanıcının belirttiÄŸi dizin belirtilmemiÅŸ!</target> + +<source>Source directory does not exist anymore:</source> +<target>Kaynak klasör artık yok:</target> + <source>Unresolved conflicts existing!</source> <target>ÇözülmemiÅŸ tutarsızlıklar var!</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>ÇeliÅŸkileri yoksayıp eÅŸleÅŸtirmeyi sürdürebilirsiniz.</target> + <source>Significant difference detected:</source> <target>Önemli fark saptandı:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>Dosyaların yarıdan fazlası kopyalanacak ya da silinecek!</target> + <source>Not enough free disk space available in:</source> <target>Åžurada yeterli disk alanı yok :</target> + <source>Free disk space required:</source> <target>Gereken boÅŸ disk alanı:</target> + <source>Free disk space available:</source> <target>Kullanılabilir disk alanı:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> <target></target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>Çoklu klasör çiftlerinin bir parçası olduÄŸan bir klasör düzenlenecek! Lütfen eÅŸleÅŸtirme ayarlarınızı gözden geçirin!</target> + <source>Processing folder pair:</source> <target>Ä°ÅŸlenen klasör çifti:</target> + <source>Generating database...</source> <target>Veri tabanı oluÅŸturuluyor...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>Yapılandırmaya göre eÅŸleÅŸtirilecek bir ÅŸey yok!</target> + <source>Error copying locked file %x!</source> <target>Kilitli dosya %x kopyalanırken hata!</target> + <source>Data verification error: Source and target file have different content!</source> <target>Veri doÄŸrulama hatası: Kaynak ve hedef dosyası içeriÄŸi farklı!</target> + diff --git a/BUILD/Languages/ukrainian.lng b/BUILD/Languages/ukrainian.lng index 3b25c430..6b08cfe7 100644 --- a/BUILD/Languages/ukrainian.lng +++ b/BUILD/Languages/ukrainian.lng @@ -9,74 +9,115 @@ <source>Searching for directory %x...</source> <target></target> + <source>Show in Explorer</source> <target>Показати у Провіднику</target> + <source>Open with default application</source> <target>Відкрити за допомогою програми за замовчуваннÑм</target> + <source>Browse directory</source> <target>ПереглÑнути каталог</target> + <source>RealtimeSync - Automated Synchronization</source> <target>RealtimeSync - Ðвтоматична ÑинхронізаціÑ</target> + <source>Browse</source> <target>ПереглÑнути</target> -<source>Invalid commandline: %x</source> -<target>Ðеправильний командний Ñ€Ñдок: %x</target> + +<source>Invalid command line: %x</source> +<target></target> + <source>Error resolving symbolic link:</source> <target>Помилка при вирішені Ñимволічного поÑиланнÑ:</target> -<source>Show popup</source> -<target>Показувати виринаючі вікна</target> -<source>Show popup on errors or warnings</source> -<target>Показувати виринаючі вікна при помилках та зауваженнÑÑ…</target> + +<source>Show pop-up</source> +<target></target> + +<source>Show pop-up on errors or warnings</source> +<target></target> + <source>Ignore errors</source> <target>Ігнорувати помилки</target> + <source>Hide all error and warning messages</source> <target>Приховати вÑÑ– помилки Ñ– Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· попередженнÑми</target> + <source>Exit instantly</source> <target>Вийти негайно</target> + <source>Abort synchronization immediately</source> <target>Перервати Ñинхронізацію негайно</target> + +<source>Select alternate comparison settings</source> +<target></target> + <source>Select alternate synchronization settings</source> <target>Вибрати альтернативні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації</target> + <source>No filter selected</source> <target>Ðе вибрано жодного фільтра</target> + <source>Filter is active</source> <target>Фільтр активний</target> -<source>Clear filter settings</source> -<target>ОчиÑтити Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð°</target> + <source>Remove alternate settings</source> <target>Вилучити альтернативні налаштуваннÑ</target> + +<source>Clear filter settings</source> +<target>ОчиÑтити Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð°</target> + <source>Create a batch job</source> <target>Створити пакетне завданнÑ</target> + <source>Synchronization settings</source> <target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації</target> + <source>Comparison settings</source> <target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ</target> + <source>About</source> <target>Про</target> + <source>Error</source> <target>Помилка</target> + <source>Warning</source> <target>Увага</target> + <source>Question</source> <target>ПитаннÑ</target> + <source>Confirm</source> <target>Підтвердити</target> + <source>Configure filter</source> <target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð°</target> + <source>Customize columns</source> <target>Вибір колонок</target> + <source>Global settings</source> <target>Глобальні налаштуваннÑ</target> + <source>Synchronization Preview</source> <target>Попередній оглÑд Ñинхронізації</target> + <source>Find</source> <target>Знайти</target> + +<source>Select time span</source> +<target></target> + <source>%x MB</source> <target>%x МБ</target> + <source>%x KB</source> <target>%x КБ</target> + <source>%x GB</source> <target>%x ГБ</target> + <source> <pluralform>1 Byte</pluralform> <pluralform>%x Bytes</pluralform> @@ -86,46 +127,64 @@ <pluralform>%x байти</pluralform> <pluralform>%x байтів</pluralform> </target> + <source><Symlink></source> <target><Символьне поÑиланнÑ></target> + <source><Directory></source> <target><Каталог></target> + <source>Size</source> <target>Розмір</target> + <source>Date</source> <target>Дата</target> + <source>Full path</source> <target>Повний шлÑÑ…</target> + <source>Filename</source> <target>Ð†Ð¼â€™Ñ Ñ„Ð°Ð¹Ð»Ð°</target> + <source>Relative path</source> <target>ВідноÑний шлÑÑ…</target> + <source>Directory</source> <target>Каталог</target> + <source>Extension</source> <target>РозширеннÑ</target> + <source>Comparison Result</source> <target>Результати порівнюваннÑ</target> + <source>Incompatible synchronization database format:</source> <target>ÐеÑуміÑний формат бази даних Ñинхронізації:</target> + <source>Initial synchronization:</source> <target>Ð’Ñтупна ÑинхронізаціÑ:</target> + <source>One of the FreeFileSync database files is not yet existing:</source> <target>Файла бази даних FreeFileSync ще не Ñ–Ñнує:</target> + <source>Error reading from synchronization database:</source> <target>Помилка при читанні з бази даних Ñинхронізації:</target> + <source>Database files do not share a common synchronization session:</source> <target></target> + <source>An exception occurred!</source> <target>ВідбулоÑÑŒ виключеннÑ!</target> -<source>Error deleting file:</source> -<target>Помилка при вилученні файла:</target> + <source>Error reading file attributes:</source> <target>Помилка при читанні параметрів файла:</target> + <source>Waiting while directory is locked (%x)...</source> <target>ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð½ÑÑ‚Ñ‚Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð· каталогу (%x)...</target> + <source>Error setting directory lock:</source> <target>Помилка Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ:</target> + <source> <pluralform>1 sec</pluralform> <pluralform>%x sec</pluralform> @@ -135,27 +194,37 @@ <pluralform>%x Ñек</pluralform> <pluralform>%x Ñек</pluralform> </target> + <source>Info</source> <target>ІнформаціÑ</target> + <source>Fatal Error</source> <target>Критична помилка</target> + <source>Scanning:</source> <target>Сканую:</target> + <source>Encoding extended time information: %x</source> <target>ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¾Ñ— інформації про чаÑ: %x</target> + <source> <pluralform>[1 Thread]</pluralform> <pluralform>[%x Threads]</pluralform> </source> <target></target> + <source>Invalid FreeFileSync config file!</source> <target>Ðеправильний файл конфігурації FreeFileSync!</target> + <source>File does not exist:</source> <target>Файл не Ñ–Ñнує:</target> + <source>Error parsing configuration file:</source> <target>Помилка при анализі файла налаштувань Ñинхронізації:</target> + <source>/sec</source> <target>/Ñек</target> + <source> <pluralform>1 min</pluralform> <pluralform>%x min</pluralform> @@ -165,6 +234,7 @@ <pluralform>%x хв</pluralform> <pluralform>%x хв</pluralform> </target> + <source> <pluralform>1 hour</pluralform> <pluralform>%x hours</pluralform> @@ -174,6 +244,7 @@ <pluralform>%x години</pluralform> <pluralform>%x годин</pluralform> </target> + <source> <pluralform>1 day</pluralform> <pluralform>%x days</pluralform> @@ -183,28 +254,40 @@ <pluralform>%x дні</pluralform> <pluralform>%x днів</pluralform> </target> + <source>S&ave configuration...</source> <target>Зберегти налаштуваннÑ...</target> + <source>&Load configuration...</source> <target>&Завантажити налаштуваннÑ...</target> + <source>&Quit</source> <target>&Вихід</target> + <source>&File</source> <target>&Файл</target> + <source>&Content</source> <target>&ЗміÑÑ‚</target> + <source>&About...</source> <target>&Про програму...</target> + <source>&Help</source> <target>&Допомога</target> + <source>Usage:</source> <target>ВикориÑтаннÑ:</target> + <source>1. Select directories to monitor.</source> <target>1. Виберіть каталоги Ð´Ð»Ñ Ð¼Ð¾Ð½Ñ–Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ñƒ;</target> + <source>2. Enter a command line.</source> <target>2. Уведіть Ñ€Ñдок команди;</target> + <source>3. Press 'Start'.</source> <target>3. ÐатиÑніть 'Старт'.</target> + <source> The command line is executed each time: - all directories become available (e.g. USB stick insert) @@ -215,404 +298,544 @@ The command line is executed each time: - вÑÑ– каталоги Ñтають доÑтупні (наприклад, Ð¿Ñ–Ð´â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ½Ð¾Ñного ноÑÑ–Ñ) - файли в каталогах чи підкаталогах змінені </target> + <source>Directories to watch</source> <target>Каталоги Ð´Ð»Ñ ÑпоÑтереженнÑ</target> + <source>Add folder</source> <target>Додати папку</target> + <source>Remove folder</source> <target>Вилучити папку</target> + <source>Select a folder</source> <target>Вибрати папку</target> + <source>Command line</source> <target>Командний Ñ€Ñдок</target> + <source>Minimum Idle Time [seconds]</source> <target>Мінімальний Ñ‡Ð°Ñ Ð¿Ñ€Ð¾Ñтою [Ñекунд]</target> + <source>Idle time between detection of last change and execution of command line in seconds</source> <target>Ð§Ð°Ñ Ð¿Ñ€Ð¾Ñтою між виÑвленнÑм оÑтанньої зміни та виконаннÑм командного Ñ€Ñдка в Ñекундах</target> + <source>Start</source> <target>Старт</target> + <source>(Build: %x)</source> <target>(компілÑÑ†Ñ–Ñ %x)</target> + <source>RealtimeSync configuration</source> <target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ RealtimeSync</target> + <source>File already exists. Overwrite?</source> <target>Файл уже Ñ–Ñнує. ПерезапиÑати?</target> + <source>&Restore</source> <target>&Відновити</target> + <source>&Exit</source> <target>&Вихід</target> + <source>Monitoring active...</source> <target>Моніторинг включений...</target> + <source>Waiting for missing directories...</source> <target>ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑ‰ÐµÐ½Ð¸Ñ… каталогів...</target> + <source>A directory input field is empty.</source> <target>Поле Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ ÑˆÐ»Ñху каталога порожнє.</target> + <source>Drag && drop</source> <target>Drag && drop</target> + <source>Could not initialize directory monitoring:</source> <target>Ðе вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–ÑŽÐ²Ð°Ñ‚Ð¸ каталог Ð´Ð»Ñ Ð¼Ð¾Ð½Ñ–Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ñƒ:</target> + <source>Error when monitoring directories.</source> <target>Помилка моніторингу каталогу.</target> + <source>Conversion error:</source> <target>Помилка перетвореннÑ:</target> + +<source>Error deleting file:</source> +<target>Помилка при вилученні файла:</target> + <source>Error moving file:</source> <target>Помилка Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð°:</target> + <source>Target file already existing!</source> <target>Кінцевий файл уже Ñ–Ñнує!</target> + <source>Error moving directory:</source> <target>Помилка Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ:</target> + <source>Target directory already existing!</source> <target>Кінцевий каталог вже Ñ–Ñнує!</target> + <source>Error deleting directory:</source> <target>Помилка при вилученні каталогу:</target> + <source>Error changing modification time:</source> <target>Помилка при зміні чаÑу модификації файла:</target> + <source>Error loading library function:</source> <target>Помилка при завантаженні функції бібліотеки:</target> + <source>Error reading security context:</source> <target>Помилка при читанні контекÑту безпеки:</target> + <source>Error writing security context:</source> <target>Помилка при запиÑÑ– контекÑту безпеки:</target> + <source>Error copying file permissions:</source> <target>Помилка при копіюванні прав доÑтупу:</target> + <source>Error creating directory:</source> <target>Помилка при Ñтворенні каталогу:</target> + <source>Error copying symbolic link:</source> <target>Помилка при копіюванні Ñимвольного поÑиланнÑ:</target> + <source>Error copying file:</source> <target>Помилка при копіюванні файла:</target> + <source>Error opening file:</source> <target>Помилка при відкриванні файла:</target> + <source>Error writing file:</source> <target>Помилка при запиÑÑ– файла:</target> + <source>Error reading file:</source> <target>Помилка при читанні файла:</target> + <source>Operation aborted!</source> <target>ÐžÐ¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð²Ñ–Ð´Ð¼Ñ–Ð½ÐµÐ½Ð°!</target> + <source>Endless loop when traversing directory:</source> <target>Ð—Ð°Ñ†Ð¸ÐºÐ»ÑŽÐ²Ð°Ð½Ð½Ð½Ñ Ð¿Ñ€Ð¸ обході каталогу:</target> + <source>Error traversing directory:</source> <target>Помилка обходу каталогу:</target> + <source>Windows Error Code %x:</source> <target>Код помилки Windows %x:</target> + <source>Linux Error Code %x:</source> <target>Код помилки Linux %x:</target> + <source>Error setting privilege:</source> <target>Помилка вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð²Ð¸Ð»ÐµÑ—Ð²:</target> + <source>Error moving to Recycle Bin:</source> <target>Помилка Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð² "Корзину":</target> + <source>Could not load a required DLL:</source> <target>Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ необхідні DLL:</target> + <source>Error writing to synchronization database:</source> <target>Помилка при запиÑÑ– у базу данних Ñинхронізації:</target> -<source>Error starting Volume Shadow Copy Service!</source> -<target>Помилка при запуÑку поÑлуги Тіньового ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð¢Ð¾Ð¼Ñƒ!</target> + +<source>Error accessing Volume Shadow Copy Service!</source> +<target></target> + <source>Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.</source> <target>Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ñ–Ð½ÑŒÐ¾Ð²Ð¸Ñ… копій на WOW64 не підтримуєтьÑÑ. Будь лаÑка, викориÑтайте FreeFileSync 64-розрÑдної верÑÑ–Ñ—.</target> + <source>Could not determine volume name for file:</source> <target>Ðе вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ назву тому Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°:</target> + <source>Volume name %x not part of filename %y!</source> <target>Ð†Ð¼â€™Ñ Ñ‚Ð¾Ð¼Ñƒ %x не Ñ” чаÑтиною імені файла %y!</target> + <source>%x TB</source> <target>%x ТБ</target> + <source>%x PB</source> <target>%x ПБ</target> + <source>%x%</source> <target>%x%</target> + <source>Could not read values for the following XML nodes:</source> <target>Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð°ÐºÐ¸Ñ… XML запиÑів:</target> + <source>Logging</source> <target>Лог-файли</target> + <source>FreeFileSync batch file</source> <target>Файл Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ FreeFileSync</target> + <source>FreeFileSync configuration</source> <target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ FreeFileSync</target> + <source>FreeFileSync Batch Job</source> <target>Пакетне Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ FreeFileSync</target> + <source>Unable to create logfile!</source> <target>Ðе можна Ñтворити лог-файл!</target> + <source>Batch execution</source> <target>Ð’Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÐµÑ‚Ð½Ð¾Ð³Ð¾ завданнÑ</target> + <source>Log-messages:</source> <target>Лог-повідомленнÑ:</target> + <source>Stop</source> <target>Стоп</target> + <source>Total time:</source> <target>Загальний чаÑ:</target> + <source>Synchronization aborted!</source> <target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð°!</target> + <source>Synchronization completed with errors!</source> <target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ð»Ð°ÑÑ Ð· помилками!</target> + <source>Synchronization completed successfully!</source> <target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾Ð¹ÑˆÐ»Ð° уÑпішно!</target> + <source>Press "Switch" to open FreeFileSync GUI mode.</source> <target>ÐатиÑніть "Змінити" Ð´Ð»Ñ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð³Ñ€Ð°Ñ„Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ інтерфейÑу FreeFileSync.</target> + <source>Switching to FreeFileSync GUI mode...</source> <target>Перехід до графічного інтерфейÑу FreeFileSync...</target> + <source>Unable to connect to sourceforge.net!</source> <target>Ðе можна з’єднатиÑÑ Ð· sourceforge.net!</target> + <source>A newer version of FreeFileSync is available:</source> <target>ДоÑтупна нова верÑÑ–Ñ FreeFileSync:</target> + <source>Download now?</source> <target>Завантажити зараз?</target> + <source>Information</source> <target>ІнформаціÑ</target> + <source>FreeFileSync is up to date!</source> <target>У Ð’Ð°Ñ Ð½Ð°Ð¹Ð½Ð¾Ð²Ñ–ÑˆÐ° верÑÑ–Ñ FreeFileSync!</target> + <source>Do you want FreeFileSync to automatically check for updates every week?</source> <target>Ви хочете, щоб FreeFileSync автоматично перевірÑв наÑвніÑÑ‚ÑŒ оновлень щотижнÑ?</target> + <source>(Requires an Internet connection!)</source> <target>(Ðеобхідне Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Інтернету!)</target> + <source>1. &Compare</source> <target>1. &ПорівнÑти</target> + <source>2. &Synchronize...</source> <target>2. &Синхронізувати</target> + <source>S&witch view</source> <target>Змінити відображеннÑ</target> + <source>&New</source> <target>&Ðова</target> + <source>&Program</source> <target>&Програма</target> + <source>&Language</source> <target>&Мова</target> + <source>&Global settings...</source> <target>&Глобальні налаштуваннÑ...</target> + <source>&Create batch job...</source> <target>&Створити завданнÑ...</target> + <source>&Export file list...</source> <target>&ЕкÑпортувати ÑпиÑок файлів...</target> + <source>&Advanced</source> <target>&Додатково</target> + <source>&Check for new version</source> <target>&Провірити наÑвніÑÑ‚ÑŒ нової верÑÑ–Ñ—</target> + <source>Compare</source> <target>ПорівнÑти</target> + <source>Compare both sides</source> <target>ПорівнÑти обидві Ñторони</target> + <source>&Abort</source> <target>&Припинити</target> + <source>Synchronize...</source> <target>Синхронізувати</target> + <source>Start synchronization</source> <target>Розпочати Ñинхронізацію</target> -<source>Swap sides</source> -<target>ПомінÑти міÑцÑми</target> + <source>Add folder pair</source> <target>Додати пару папок</target> + <source>Remove folder pair</source> <target>Вилучити пару папок</target> + +<source>Swap sides</source> +<target>ПомінÑти міÑцÑми</target> + <source>Save current configuration to file</source> <target>Зберегти активні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð² файлі</target> + <source>Load configuration from file</source> <target>Завантажити Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації з файла</target> + <source>Last used configurations (press DEL to remove from list)</source> <target> ОÑтанні викориÑтовувані Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації (тиÑніть DEL Ð´Ð»Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð·Ñ– ÑпиÑку) </target> + <source>Hide excluded items</source> <target>Приховати виключені пункти</target> + <source>Hide filtered or temporarily excluded files</source> <target>Приховати відфільтровані чи тимчаÑово виключені файли</target> + <source>Number of files and directories that will be created</source> <target>ЧиÑло файлів Ñ– каталогів, Ñкі будуть Ñтворені</target> + <source>Number of files that will be overwritten</source> <target>ЧиÑло файлів, Ñкі будуть перезапиÑані</target> + <source>Number of files and directories that will be deleted</source> <target>ЧиÑло файлів Ñ– каталогів, Ñкі будуть вилучені</target> + <source>Total amount of data that will be transferred</source> <target>Загальний об’єм даних, Ñкі будуть передаватиÑÑ</target> -<source>Left</source> -<target>Ліворуч</target> -<source>Right</source> -<target>Праворуч</target> + <source>Batch job</source> <target>Пакетне завданнÑ</target> -<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner.</source> -<target>Створити пакетний файл Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ñ— Ñинхронізації. Щоб запуÑтити пакетний режим проÑто двічі клацніть файл або виконайте командний Ñ€Ñдок: FreeFileSync.exe <batchfile>. Це можна також запланувати в менеджері ОС</target> + +<source>Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner.</source> +<target></target> + <source>Help</source> <target>Допомога</target> + <source>Filter files</source> <target>Фільтр файлів</target> + <source>Error handling</source> <target>Обробка помилок</target> + +<source>Left</source> +<target>Ліворуч</target> + +<source>Right</source> +<target>Праворуч</target> + <source>Overview</source> <target>Головна</target> + <source>Status feedback</source> <target>Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ð±ÐµÑ€Ð½ÐµÐ½Ð¾Ð³Ð¾ зв’Ñзку</target> + <source>Run minimized</source> <target></target> + <source>Maximum number of logfiles:</source> <target>МакÑимальна кількіÑÑ‚ÑŒ лог-файлів:</target> + <source>Select logfile directory:</source> <target>Виберіть каталог Ð´Ð»Ñ Ð»Ð¾Ð³-файлів:</target> + <source>Batch settings</source> <target></target> + <source>&Save</source> <target>&Зберегти</target> + <source>&Load</source> <target>&Завантажити</target> + <source>&Cancel</source> <target>&Відмінити</target> + <source>Elements found:</source> <target>Елементів знайдено:</target> + <source>Elements remaining:</source> <target>Елементів залишилоÑÑŒ:</target> + <source>Speed:</source> <target>ШвидкіÑÑ‚ÑŒ:</target> + <source>Time remaining:</source> <target>ЗалишилоÑÑŒ чаÑу:</target> + <source>Time elapsed:</source> <target>Пройшло чаÑу:</target> + <source>Operation:</source> <target>ОпераціÑ:</target> + <source>Select variant:</source> <target>Виберіть варіант:</target> + <source><Automatic></source> <target><Ðвтоматичний></target> + <source>Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically.</source> <target>ВиÑÐ²Ð»ÐµÐ½Ð½Ñ Ñ– Ð¿Ð¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ на обох Ñторінах з викориÑтаннÑм бази даних. Вилучені файли Ñ– конфлікти визначаютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾.</target> + <source>Mirror ->></source> <target>Дзеркало ->></target> + <source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source> <target>Дзеркальна (резервна) ÐºÐ¾Ð¿Ñ–Ñ Ð»Ñ–Ð²Ð¾Ñ— чаÑтини. Ð’ результаті Ñинхронізації права папка змінюєтьÑÑ Ð´Ð¾ полної відповідноÑÑ‚Ñ– лівій.</target> + <source>Update -></source> <target>Оновити -></target> + <source>Copy new or updated files to right folder.</source> <target>Копіювати нові чи оновлювати файли з правої Ñторони.</target> + <source>Custom</source> <target>Вибірково</target> + <source>Configure your own synchronization rules.</source> <target>Ðалаштувати влаÑні правила Ñинхронізації.</target> + <source>Deletion handling</source> <target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ</target> + <source>&OK</source> <target>&OK</target> + <source>Configuration</source> <target>ÐалаштуваннÑ</target> + <source>Category</source> <target>КатегоріÑ</target> + <source>Action</source> <target>ДіÑ</target> + <source>File/folder exists on left side only</source> <target>Файл/папка Ñ–Ñнує тільки ліворуч</target> + <source>File/folder exists on right side only</source> <target>Файл/папка Ñ–Ñнує тільки праворуч</target> + <source>Left file is newer</source> <target>Файл ліворуч Ñ” новішим</target> + <source>Right file is newer</source> <target>Файл праворуч Ñ” новішим</target> + <source>Files have different content</source> <target>Файли відрізнÑÑŽÑ‚ÑŒÑÑ Ð²Ð¼Ñ–Ñтом</target> + <source>Conflict/file cannot be categorized</source> <target>Ðе можна категоризувати конфлікт/файл</target> + <source>Compare by...</source> <target>Критерії порівнюваннÑ</target> + <source> Files are found equal if - - file size - last write time and date + - file size are the same </source> -<target> -Файли вважаютьÑÑ Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ð¸Ð¼Ð¸ Ñкщо - - розмір файла - - Ñ‡Ð°Ñ Ñ– дата оÑтаннього запиÑу -Ñпівпадають -</target> -<source>File size and date</source> -<target>Розмір Ñ– дата файла</target> +<target></target> + +<source>File time and size</source> +<target></target> + <source> Files are found equal if - file content is the same </source> <target>Файли вважаютьÑÑ Ñ€Ñ–Ð²Ð½Ð¸Ð¼Ð¸, Ñкщо вміÑÑ‚ файлів однаковий</target> + <source>File content</source> <target>ВміÑÑ‚ файла</target> + <source>Symbolic Link handling</source> <target>Обробка Ñимвольного поÑиланнÑ</target> + <source>Synchronizing...</source> <target>СинхронізаціÑ...</target> + <source>Elements processed:</source> <target>Елементів оброблено:</target> + <source>&Pause</source> <target>&Пауза</target> -<source>Compare by "File size and date"</source> -<target>Порівнювати по розміру Ñ– даті</target> -<source>This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time.</source> -<target>Цей варіант порівнює два файли з однаковими іменами Ñ– вважає Ñ—Ñ… рівними, Ñкщо вони мають однаковий розмір файла Ñ– однакову дату Ñ– Ñ‡Ð°Ñ Ð¾Ñтанньої зміни.</target> -<source>When the comparison is started with this option set the following decision tree is processed:</source> -<target>Коли порівнÑÐ½Ð½Ñ Ð·Ð°Ð¿ÑƒÑ‰ÐµÐ½Ð¾ з цими критеріÑми, алгоритм наÑтупний:</target> -<source>As a result the files are separated into the following categories:</source> -<target>У результаті файли розділено на такі категорії:</target> -<source>- equal</source> -<target>- однакові</target> -<source>- left newer</source> -<target>- ліві новіші</target> -<source>- right newer</source> -<target>- праві новіші</target> -<source>- exists left only</source> -<target>- тільки ліві Ñ–Ñнують</target> -<source>- exists right only</source> -<target>- Ñ–Ñнують тільки праворуч</target> -<source>- conflict (same date, different size)</source> -<target>- конфлікт (дати однакові, розміри різні)</target> -<source>Compare by "File content"</source> -<target>Порівнювати за вміÑтом</target> -<source> -As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all. -With this option enabled the decision tree is smaller: -</source> -<target> -Як випливає з назви, два файли, Ñкі мають однакове ім'Ñ Ð²Ð²Ð°Ð¶Ð°ÑŽÑ‚ÑŒÑÑ Ñ€Ñ–Ð²Ð½Ð¸Ð¼Ð¸, Ñкщо Ñ– тільки Ñкщо вони мають однаковий вміÑÑ‚. Ð¦Ñ Ð¾Ð¿Ñ†Ñ–Ñ ÐºÐ¾Ñ€Ð¸Ñна Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ ідентичноÑÑ‚Ñ–, а не Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ð¹ резервного копіюваннÑ. Тому дата файла не буде прийнÑта до уваги. - При цій опції дерево рішень Ñ” меншим: -</target> -<source>- different</source> -<target>- різні</target> <source>Source code written in C++ utilizing:</source> <target>Код програми напиÑаний на C++ з викориÑтаннÑм:</target> + <source>Big thanks for localizing FreeFileSync goes out to:</source> <target>Щира подÑка за переклад FreeFileSync:</target> + <source>Feedback and suggestions are welcome at:</source> <target>Відгуки та пропозиції виÑилайте на адреÑу:</target> + <source>FreeFileSync at Sourceforge</source> <target>FreeFileSync на Sourceforge</target> + <source>Homepage</source> <target>Оф.Ñайт</target> + <source>If you like FFS</source> <target>Якщо Вам ÑподобавÑÑ FFS</target> + <source>Donate with PayPal</source> <target>Пожертвувати через PayPal</target> + <source>Email</source> <target>Почта</target> + <source>Report translation error</source> <target>Повідомити: помилка перекладу</target> + <source>Published under the GNU General Public License:</source> <target>Видано за ліцензією GNU General Public License:</target> + <source>Ignore subsequent errors</source> <target>Ігнорувати наÑтупні помилки</target> + <source>Hide further error messages during the current process</source> <target>Приховати наÑтупні помилки Ð¿Ñ–Ð´Ñ‡Ð°Ñ Ñ†ÑŒÐ¾Ð³Ð¾ процеÑу</target> + <source>&Ignore</source> <target>&Ігнорувати</target> + <source>&Retry</source> <target>&Повторити</target> + <source>Do not show this dialog again</source> <target>Ðадалі не показувати це вікно</target> + <source>&Switch</source> <target>&Змінити</target> + <source>&Yes</source> <target>&Так</target> + <source>&No</source> <target>&ÐÑ–</target> + <source>Delete on both sides</source> <target>Вилучити з обох Ñторін</target> + <source>Delete on both sides even if the file is selected on one side only</source> <target>Вилучити з обох Ñторін, навіть Ñкщо файл виділений тільки з однієї Ñторони</target> + <source>Use Recycle Bin</source> <target>ВикориÑтовувати "Корзину"</target> + <source> Only files/directories that match all filter settings will be selected for synchronization. Note: The name filter must be specified relative(!) to main synchronization directories. @@ -621,16 +844,22 @@ Note: The name filter must be specified relative(!) to main synchronization dire Тільки файли/каталоги, Ñкі пройдуть фільтрацію будуть відібрані Ð´Ð»Ñ Ñинхронізації. Фільтр буде заÑтоÑовуватиÑÑ Ð´Ð¾ імен відноÑно(!) оÑновних Ñинхронізованих папок. </target> + <source>Hints:</source> <target>Підказка:</target> + <source>1. Enter relative file or directory names separated by ';' or a new line.</source> <target>1. Уведіть імена файлів чи каталогів, розділÑючи знаком ';' чи з нового Ñ€Ñдка.</target> + <source>2. Use wildcard characters '*' and '?'.</source> <target>2. ВикориÑтайте Ñимволи '*' Ñ– '?'.</target> + <source>3. Exclude files directly on main grid via context menu.</source> <target>3. Виключіть файли безпоÑередньо у головному вікні через контекÑтне меню.</target> + <source>Example</source> <target>Приклад</target> + <source> Include: *.doc;*.zip;*.exe Exclude: \stuff\temp\* @@ -639,30 +868,40 @@ Exclude: \stuff\temp\* Включити: *.doc;*.zip;*.exe Виключити: \stuff\temp\* </target> + <source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source> <target>Синхронізувати вÑÑ– .doc, .zip Ñ– .exe файли, за винÑтком вÑÑ–Ñ… файлів з подкаталогу "temp"</target> + <source>Include</source> <target>Включити</target> + <source>Exclude</source> <target>Виключити</target> -<source>Select time span:</source> -<target>Виберіть проміжок чаÑу</target> -<source>Minimum file size:</source> -<target>Мінімальний розмір файла</target> -<source>Maximum file size:</source> -<target>МакÑимальний розмір файла</target> + +<source>Minimum file size</source> +<target></target> + +<source>Maximum file size</source> +<target></target> + <source>&Default</source> <target>&За замовчуваннÑм</target> + <source>Move column up</source> <target>ПереміÑтити догори</target> + <source>Move column down</source> <target>ПереміÑтити донизу</target> -<source>Transactional File Copy</source> + +<source>Transactional file copy</source> <target></target> + <source>Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.</source> <target></target> + <source>Copy locked files</source> <target>Копіювати заблоковані файли</target> + <source> Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) @@ -672,8 +911,10 @@ Copy shared or locked files using Volume Shadow Copy Service з викориÑтаннÑм поÑлуги Тіньового ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð¢Ð¾Ð¼Ñƒ (потрібні права ÐдмініÑтратора) </target> -<source>Copy filesystem permissions</source> -<target>Копіювати права доÑтупу файлової ÑиÑтеми</target> + +<source>Copy file access permissions</source> +<target></target> + <source> Transfer file and directory permissions (Requires Administrator rights) @@ -682,138 +923,205 @@ Transfer file and directory permissions Передача прав доÑтупу файла/каталогу (потрібні права ÐдмініÑтратора) </target> + <source>Hidden dialogs:</source> <target>Приховані діалоги</target> + <source>Reset</source> <target>Скинути</target> + <source>Show hidden dialogs</source> <target>Показати приховані діалоги</target> + <source>External applications</source> <target>Зовнішні програми</target> + <source>Description</source> <target>ОпиÑ</target> + <source>Variant</source> <target>Варіант</target> + <source>Statistics</source> <target>СтатиÑтика</target> + <source>Find what:</source> <target>Знайти:</target> + <source>Match case</source> <target>Враховувати регіÑÑ‚Ñ€</target> + <source>&Find next</source> <target>&Знайти наÑтупний</target> -<source>You may try to synchronize remaining items again (WITHOUT having to re-compare)!</source> -<target>Ви можете Ñпробувати Ñинхронізувати решту пунктів знову (без повторного порівнюваннÑ)!</target> -<source>Batch file created successfully!</source> -<target>Файл Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ ÑƒÑпішно Ñтворений!</target> + <source>Main bar</source> <target>Головна панель</target> + <source>Folder pairs</source> <target>Пари папок</target> + <source>Select view</source> <target>СпиÑок файлів</target> + <source>Set direction:</source> <target>Виберіть напрÑм:</target> + <source>Exclude temporarily</source> <target>Виключити тимчаÑово</target> + <source>Include temporarily</source> <target>Включити</target> + <source>Exclude via filter:</source> <target>Виключити через фільтр:</target> + <source><multiple selection></source> <target><груповий вибір></target> + <source>D-Click</source> <target>Клацніть двічі</target> + <source>Delete</source> <target>Видалити</target> + <source>Customize...</source> <target>Вибрати колонки...</target> + +<source>Select time span...</source> +<target></target> + <source>Auto-adjust columns</source> <target>ÐÐ²Ñ‚Ð¾Ð²Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð¸ колонок</target> + <source>Include all rows</source> <target>Відмінити вÑÑ–</target> + <source>Exclude all rows</source> <target>Виключити вÑÑ– Ñ€Ñдки</target> + <source>Reset view</source> <target>Ð¡ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½ÑŒ відображеннÑ</target> + <source>Show "%x"</source> <target>Показати "%x"</target> + <source><Last session></source> <target><ОÑÑ‚Ð°Ð½Ð½Ñ ÑеÑÑ–Ñ></target> + <source>Configuration saved!</source> <target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації збережено!</target> + <source>Save changes to current configuration?</source> <target>Зберегти зміни в активних налаштуваннÑÑ…?</target> + <source>Configuration loaded!</source> <target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації загружено!</target> + <source>Folder Comparison and Synchronization</source> <target>ÐŸÐ¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ñ– ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð¿Ð°Ð¿Ð¾Ðº</target> + <source>Hide files that exist on left side only</source> <target>Приховати файли, Ñкі Ñ” тільки ліворуч</target> + <source>Show files that exist on left side only</source> <target>Показати файли, Ñкі Ñ” тільки ліворуч</target> + <source>Hide files that exist on right side only</source> <target>Приховати файли, Ñкі Ñ” тільки праворуч</target> + <source>Show files that exist on right side only</source> <target>Показати файли, Ñкі Ñ” тільки праворуч</target> + <source>Hide files that are newer on left</source> <target>Приховати файли, котрі новіші ліворуч</target> + <source>Show files that are newer on left</source> <target>Показати файли, Ñкі новіші ліворуч</target> + <source>Hide files that are newer on right</source> <target>Приховати файли, котрі новіші праворуч</target> + <source>Show files that are newer on right</source> <target>Показати файли, Ñкі новіші праворуч</target> + <source>Hide files that are equal</source> <target>Приховати однакові файли</target> + <source>Show files that are equal</source> <target>Показати однакові файли</target> + <source>Hide files that are different</source> <target>Приховати файли з відмінноÑÑ‚Ñми</target> + <source>Show files that are different</source> <target>Показати різні файли</target> + <source>Hide conflicts</source> <target>Приховати конфлікти</target> + <source>Show conflicts</source> <target>Показати конфлікти</target> + <source>Hide files that will be created on the left side</source> <target>Приховати файли, Ñкі будуть Ñтворені ліворуч</target> + <source>Show files that will be created on the left side</source> <target>Показати файли, Ñкі будуть Ñтворені ліворуч</target> + <source>Hide files that will be created on the right side</source> <target>Приховати файли, Ñкі будуть Ñтворені праворуч</target> + <source>Show files that will be created on the right side</source> <target>Показати файли, Ñкі будуть Ñтворені праворуч</target> + <source>Hide files that will be deleted on the left side</source> <target>Приховати файли, Ñкі будуть вилучені ліворуч</target> + <source>Show files that will be deleted on the left side</source> <target>Показати файли, Ñкі будуть вилучені ліворуч</target> + <source>Hide files that will be deleted on the right side</source> <target>Приховати файли, Ñкі будуть вилучені праворуч</target> + <source>Show files that will be deleted on the right side</source> <target>Показати файли, Ñкі будуть вилучені праворуч</target> + <source>Hide files that will be overwritten on left side</source> <target>Приховати файли, Ñкі будуть перезапиÑані ліворуч</target> + <source>Show files that will be overwritten on left side</source> <target>Показати файли, Ñкі будуть перезапиÑані ліворуч</target> + <source>Hide files that will be overwritten on right side</source> <target>Приховати файли, Ñкі будуть перезапиÑані праворуч</target> + <source>Show files that will be overwritten on right side</source> <target>Показати файли, Ñкі будуть перезапиÑані праворуч</target> + <source>Hide files that won't be copied</source> <target>Приховати файли, Ñкі не будуть зкопійовані</target> + <source>Show files that won't be copied</source> <target>Показати файли, Ñкі не будуть зкопійовані</target> + <source>All directories in sync!</source> <target>Ð’ÑÑ– каталоги Ñинхронізовані!</target> + <source>Please run a Compare first before synchronizing!</source> <target>Будь лаÑка, запуÑÑ‚Ñ–Ñ‚ÑŒ порівнÑÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ Ñинхронізацією!</target> + <source>Comma separated list</source> <target>Розділений комами ÑпиÑок</target> + <source>Legend</source> <target>Легенда</target> + <source>File list exported!</source> <target>СпиÑок файлів екÑпортовано!</target> + +<source>Batch file created successfully!</source> +<target>Файл Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ ÑƒÑпішно Ñтворений!</target> + <source> <pluralform>Object deleted successfully!</pluralform> <pluralform>%x objects deleted successfully!</pluralform> @@ -823,6 +1131,7 @@ Transfer file and directory permissions <pluralform>%x об'єкти уÑпішно вилучено!</pluralform> <pluralform>%x об'єктів уÑпішно вилучено!</pluralform> </target> + <source> <pluralform>1 directory</pluralform> <pluralform>%x directories</pluralform> @@ -832,6 +1141,7 @@ Transfer file and directory permissions <pluralform>%x каталоги</pluralform> <pluralform>%x каталогів</pluralform> </target> + <source> <pluralform>1 file</pluralform> <pluralform>%x files</pluralform> @@ -841,6 +1151,7 @@ Transfer file and directory permissions <pluralform>%x файли</pluralform> <pluralform>%x файлів</pluralform> </target> + <source> <pluralform>%x of 1 row in view</pluralform> <pluralform>%x of %y rows in view</pluralform> @@ -850,72 +1161,97 @@ Transfer file and directory permissions <pluralform>%x з %y Ñ€Ñдків</pluralform> <pluralform>%x з %y Ñ€Ñдків</pluralform> </target> + <source>Scanning...</source> <target>СкануваннÑ...</target> + <source>Comparing content...</source> <target>ÐŸÐ¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ð¼Ñ–Ñту...</target> + <source>Paused</source> <target>Ппризупинено</target> + <source>Aborted</source> <target>Перервано</target> + <source>Completed</source> <target>Завершено</target> + <source>Abort requested: Waiting for current operation to finish...</source> <target>Запит перериваннÑ: Ð’ очікуванні Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ñ— операції...</target> + <source>Continue</source> <target>Далі</target> + <source>Pause</source> <target>Пауза</target> + <source>Cannot find %x</source> <target>Ðе можна знайти %x</target> -<source>DECISION TREE</source> -<target>Дерево рішень</target> -<source>file exists on both sides</source> -<target>файли Ñ–Ñнують по обох Ñторонах</target> -<source>on one side only</source> -<target>файли Ñ–Ñнують тільки з однієї Ñторони</target> -<source>same date</source> -<target>така Ñама дата</target> -<source>different date</source> -<target>інша дата</target> + <source>Inactive</source> <target>Ðеактивний</target> -<source>Second</source> -<target>Секунда</target> -<source>Minute</source> -<target>Хвилина</target> -<source>Hour</source> -<target>Година</target> -<source>Day</source> -<target>День</target> + +<source>Last x hours</source> +<target></target> + +<source>Today</source> +<target></target> + +<source>This week</source> +<target></target> + +<source>This month</source> +<target></target> + +<source>This year</source> +<target></target> + <source>Byte</source> <target>Байт</target> + <source>KB</source> <target>КБ</target> + <source>MB</source> <target>МБ</target> + <source>Filter: All pairs</source> <target>Фільтр: Ð’ÑÑ– пари</target> + <source>Filter: Single pair</source> <target>Фільтр: Одна пара</target> + <source>Ignore</source> <target>Ігнорувати</target> + <source>Direct</source> <target>ПрÑмо</target> + <source>Follow</source> <target>ПоÑлідовно</target> + +<source>Copy NTFS permissions</source> +<target></target> + <source>Integrate external applications into context menu. The following macros are available:</source> <target>Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ–Ñ… додатків в контекÑтному меню. ДоÑтупні макроÑи:</target> + <source>- full file or directory name</source> <target>- повне Ñ–Ð¼â€™Ñ Ñ„Ð°Ð¹Ð»Ð° чи каталога</target> + <source>- directory part only</source> <target>- лише каталог</target> + <source>- Other side's counterpart to %name</source> <target>- аналогічний файл з другої Ñторони</target> + <source>- Other side's counterpart to %dir</source> <target>- аналогічна папка з другої Ñторони</target> + <source>Restore all hidden dialogs?</source> <target>Відновити вÑÑ– приховані діалогові вікна?</target> + <source> <pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform> <pluralform>Do you really want to move the following %x objects to the Recycle Bin?</pluralform> @@ -925,6 +1261,7 @@ Transfer file and directory permissions <pluralform>Ви Ñправді хочете переміÑтити у Корзину ці %x об'єкти?</pluralform> <pluralform>Ви Ñправді хочете переміÑтити у Корзину ці %x об'єктів?</pluralform> </target> + <source> <pluralform>Do you really want to delete the following object?</pluralform> <pluralform>Do you really want to delete the following %x objects?</pluralform> @@ -934,142 +1271,214 @@ Transfer file and directory permissions <pluralform>Ви Ñправді хочете вилучити ці %x об'єкти?</pluralform> <pluralform>Ви Ñправді хочете вилучити ці %x об'єктів?</pluralform> </target> + <source>Leave as unresolved conflict</source> <target>Залишити Ñк невирішений конфлікт</target> + <source>Delete permanently</source> <target>Вилучати назавжди</target> + <source>Delete or overwrite files permanently</source> <target>Вилучати чи перезапиÑати файли назавжди</target> + <source>Use Recycle Bin when deleting or overwriting files</source> <target>ВикориÑтовувати "Корзину" при вилученні чи перезапиÑÑ– файлів</target> + <source>Versioning</source> <target>Переміщати файли, Ñкі вилучаютьÑÑ, в задану папку</target> + <source>Move files into a time-stamped subdirectory</source> <target>Переміщати файли в підкатлог з чаÑовою міткою</target> -<source>Cannot determine sync-direction:</source> -<target>Ðе можна визначити напрÑм Ñинхронізації:</target> -<source>Filter settings have changed!</source> -<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð° були змінені!</target> + <source>Both sides have changed since last synchronization!</source> <target>З моменту оÑтанньої Ñинхронізації з обох Ñторін відбулиÑÑ Ð·Ð¼Ñ–Ð½Ð¸!</target> + +<source>Cannot determine sync-direction:</source> +<target>Ðе можна визначити напрÑм Ñинхронізації:</target> + <source>No change since last synchronization!</source> <target>Жодних змін з оÑтанньої Ñинхронізації!</target> + +<source>Filter settings have changed!</source> +<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð° були змінені!</target> + <source>The file was not processed by last synchronization!</source> <target>Файл не був оброблений при оÑтанній Ñинхронізації!</target> -<source>Planned directory deletion is in conflict with its subdirectories and -files!</source> -<target>Плановане Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ конфліктує з вкладеними підкаталогами чи файлами!</target> + <source>Setting default synchronization directions: Old files will be overwritten with newer files.</source> <target> ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ð¿Ñ€Ñму Ñинхронізації за замовчуваннÑм: Старі файли будуть замінені новішими файлами. </target> + <source>The file does not contain a valid configuration:</source> <target>Файл не міÑтить правильних налаштувань Ñинхронізації:</target> + <source>You can ignore this error to consider the directory as empty.</source> <target>Ви можете проігнорувати помилку, вважаючи каталог порожнім.</target> + <source>Directory does not exist:</source> <target>Каталог не Ñ–Ñнує:</target> + <source>Directories are dependent! Be careful when setting up synchronization rules:</source> <target>Залежні каталоги! Будьте уважні при налаштуванні правил Ñинхронізації:</target> + <source>Comparing content of files %x</source> <target>ÐŸÐ¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ð¼Ñ–Ñту файлів %x</target> + <source>Memory allocation failed!</source> <target>Помилка Ð²Ð¸Ð´Ñ–Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ð¼â€™ÑÑ‚Ñ–! (Ðе хватает памÑти)</target> + <source>File %x has an invalid date!</source> <target>Файл %x має неіÑнуючу дату!</target> + <source>Conflict detected:</source> <target>ВиÑвлено конфлікт:</target> + <source>Files %x have the same date but a different size!</source> <target>Файли %x мають однакову дату, але різні за розміром!</target> + <source>Symlinks %x have the same date but a different target!</source> <target>Символьне поÑÐ¸Ð»Ð°Ð½Ð½Ð½Ñ %x має таку ж дату, але різний вміÑÑ‚!</target> + <source>Comparing files by content failed.</source> <target>ÐŸÐ¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² за вміÑтом не вдалоÑÑ.</target> + <source>Generating file list...</source> <target>Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑпиÑку файлів...</target> + <source>Multiple...</source> <target>Різні варіанти...</target> + <source>Both sides are equal</source> <target>Сторони ідентичні</target> + <source>Files/folders differ in attributes only</source> <target>Файли/папки відрізнÑÑŽÑ‚ÑŒÑÑ Ð»Ð¸ÑˆÐµ атрибутами</target> + <source>Copy new file/folder to left</source> <target>Зкопіювати новий файл/папку ліворуч</target> + <source>Copy new file/folder to right</source> <target>Зкопіювати новий файл/папку праворуч</target> + <source>Delete left file/folder</source> <target>Вилучити файл/папку ліворуч</target> + <source>Delete right file/folder</source> <target>Вилучити файл/папку праворуч</target> + <source>Overwrite left file/folder with right one</source> <target>ПерезапиÑати файл/папку ліворуч відповідником зправа</target> + <source>Overwrite right file/folder with left one</source> <target>ПерезапиÑати файл/папку праворуч відповідником зліва</target> + <source>Do nothing</source> <target>Ðічого не робити</target> + <source>Copy file attributes only to left</source> <target>Зкопіювати ліворуч лише атрибути файла</target> + <source>Copy file attributes only to right</source> <target>Зкопіювати праворуч лише атрибути файла</target> + <source>Deleting file %x</source> <target>Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° %x</target> -<source>Deleting Symbolic Link %x</source> -<target>Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ñимвольного поÑÐ¸Ð»Ð°Ð½Ð½Ñ %x</target> + <source>Deleting folder %x</source> <target>Ð’Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ð¿ÐºÐ¸ %x</target> -<source>Moving %x to Recycle Bin</source> -<target>Ð’Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ %x в "Корзину"</target> -<source>Moving file %x to user-defined directory %y</source> -<target>ÐŸÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° %x у визначений кориÑтувачем каталог %y</target> -<source>Moving folder %x to user-defined directory %y</source> -<target>ÐŸÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð°Ð¿ÐºÐ¸ %x у визначений кориÑтувачем каталог %y</target> -<source>Moving Symbolic Link %x to user-defined directory %y</source> -<target>ÐŸÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñимвольного поÑÐ¸Ð»Ð°Ð½Ð½Ñ %x у визначений кориÑтувачем каталог %y</target> -<source>Copying new file %x to %y</source> -<target>ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ файла %x в %y</target> -<source>Copying new Symbolic Link %x to %y</source> -<target>ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ñимвольного поÑÐ¸Ð»Ð°Ð½Ð½Ñ %x в %y</target> -<source>Overwriting file %x in %y</source> -<target>ÐŸÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° %x в %y</target> -<source>Overwriting Symbolic Link %x in %y</source> -<target>ÐŸÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñ Ñимвольного поÑÐ¸Ð»Ð°Ð½Ð½Ñ %x в %y</target> + +<source>Deleting symbolic link %x</source> +<target></target> + +<source>Moving file %x to recycle bin</source> +<target></target> + +<source>Moving folder %x to recycle bin</source> +<target></target> + +<source>Moving symbolic link %x to recycle bin</source> +<target></target> + +<source>Moving file %x to %y</source> +<target></target> + +<source>Moving folder %x to %y</source> +<target></target> + +<source>Moving symbolic link %x to %y</source> +<target></target> + +<source>Creating file %x</source> +<target></target> + +<source>Creating symbolic link %x</source> +<target></target> + <source>Creating folder %x</source> <target>Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð°Ð¿ÐºÐ¸ %x</target> + +<source>Overwriting file %x</source> +<target></target> + +<source>Overwriting symbolic link %x</source> +<target></target> + <source>Verifying file %x</source> <target>Перевірка файла %x</target> + <source>Updating attributes of %x</source> <target>ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ñ–Ð² %x</target> -<source>Source directory does not exist anymore:</source> -<target>Каталог-джерело вже не Ñ–Ñнує:</target> -<source>Nothing to synchronize according to configuration!</source> -<target>Ðічого Ñинхронізувати згідно з налаштуваннÑми Ñинхронізації!</target> + <source>Target directory name must not be empty!</source> <target>Кінцевий каталог не повинен бути порожнім</target> + <source>User-defined directory for deletion was not specified!</source> <target>Каталог Ð´Ð»Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачем вказана не була!</target> + +<source>Source directory does not exist anymore:</source> +<target>Каталог-джерело вже не Ñ–Ñнує:</target> + <source>Unresolved conflicts existing!</source> <target>Є невирішені конфлікти</target> + <source>You can ignore conflicts and continue synchronization.</source> <target>Ви можете проігнорувати Ñ—Ñ… та продовжити Ñинхронізацію.</target> + <source>Significant difference detected:</source> <target>ВиÑвлена Ñ–Ñтотна різницÑ:</target> + <source>More than 50% of the total number of files will be copied or deleted!</source> <target>Понад 50% загальної кількоÑÑ‚Ñ– файлів буде зкопійовано чи вилучено!</target> + <source>Not enough free disk space available in:</source> <target>Ðе доÑтатньо вільного міÑÑ†Ñ Ð²:</target> + <source>Free disk space required:</source> <target>Потрібне вільне міÑце на диÑку:</target> + <source>Free disk space available:</source> <target>ДоÑтупно вільного міÑÑ†Ñ Ð½Ð° диÑку:</target> + <source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source> <target></target> + <source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source> <target>Каталог, Ñкий Ñ” чаÑтиною декількох пар папок, буде змінений. Будь лаÑка, перевірте Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації!</target> + <source>Processing folder pair:</source> <target>Обробка пари папок:</target> + <source>Generating database...</source> <target>Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¸ даних...</target> + +<source>Nothing to synchronize according to configuration!</source> +<target>Ðічого Ñинхронізувати згідно з налаштуваннÑми Ñинхронізації!</target> + <source>Error copying locked file %x!</source> <target>Помилка при копіюванні заблокованого файла %x!</target> + <source>Data verification error: Source and target file have different content!</source> <target>Помилка перевірки даних: вхідний Ñ– вихідний файли мають різний вміÑÑ‚!</target> + diff --git a/BUILD/Resources.dat b/BUILD/Resources.zip Binary files differindex 4bb39b2b..68d20ebd 100644 --- a/BUILD/Resources.dat +++ b/BUILD/Resources.zip diff --git a/FreeFileSync - wxWidgets v2.9.2 Beta.vcxproj b/FreeFileSync - wxWidgets v2.9.2 Beta.vcxproj index 541209c0..6504a03f 100644 --- a/FreeFileSync - wxWidgets v2.9.2 Beta.vcxproj +++ b/FreeFileSync - wxWidgets v2.9.2 Beta.vcxproj @@ -28,7 +28,7 @@ <ConfigurationType>Application</ConfigurationType> <UseDebugLibraries>true</UseDebugLibraries> <CharacterSet>Unicode</CharacterSet> - <PlatformToolset>v100</PlatformToolset> + <PlatformToolset>Windows7.1SDK</PlatformToolset> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <ConfigurationType>Application</ConfigurationType> @@ -41,7 +41,7 @@ <UseDebugLibraries>false</UseDebugLibraries> <WholeProgramOptimization>true</WholeProgramOptimization> <CharacterSet>Unicode</CharacterSet> - <PlatformToolset>v100</PlatformToolset> + <PlatformToolset>Windows7.1SDK</PlatformToolset> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <ConfigurationType>Application</ConfigurationType> @@ -257,9 +257,8 @@ <ClCompile Include="library\status_handler.cpp" /> <ClCompile Include="shared\app_main.cpp" /> <ClCompile Include="shared\custom_button.cpp" /> - <ClCompile Include="shared\custom_combo_box.cpp" /> + <ClCompile Include="shared\folder_history_box.cpp" /> <ClCompile Include="shared\custom_tooltip.cpp" /> - <ClCompile Include="shared\dll_loader.cpp" /> <ClCompile Include="shared\dir_name.cpp" /> <ClCompile Include="shared\dst_hack.cpp" /> <ClCompile Include="shared\file_handling.cpp" /> diff --git a/FreeFileSync.cbp b/FreeFileSync.cbp index 861db2be..62c8f985 100644 --- a/FreeFileSync.cbp +++ b/FreeFileSync.cbp @@ -13,6 +13,7 @@ <Option object_output="OBJ\FFS_Release_32_MinGW\" /> <Option type="0" /> <Option compiler="gcc" /> + <Option projectCompilerOptionsRelation="2" /> <Option projectLinkerOptionsRelation="2" /> <Compiler> <Add option="-O3" /> @@ -22,23 +23,24 @@ <Linker> <Add option="-s" /> <Add option="-static" /> + <Add library="libboost_thread-mgw45-mt-s-1_47.a" /> <Add library="libwxmsw28u_aui.a" /> <Add library="libwxmsw28u_adv.a" /> <Add library="libwxmsw28u_core.a" /> <Add library="libwxbase28u.a" /> + <Add library="libwxbase28u_net.a" /> <Add library="libwxpng.a" /> <Add library="libwxzlib.a" /> - <Add library="libwxbase28u_net.a" /> - <Add library="libboost_thread-mgw45-mt-s-1_47.a" /> <Add directory="C:\Programme\C++\wxWidgets\lib\gcc_lib" /> </Linker> </Target> - <Target title="Unit Test"> - <Option output="OBJ\Unit_Test_MinGW\Unit Test" prefix_auto="1" extension_auto="1" /> - <Option working_dir="OBJ\Unit_Test_MinGW\" /> - <Option object_output="OBJ\Unit_Test_MinGW\" /> - <Option type="1" /> + <Target title="Debug-DLL"> + <Option output="BUILD\Bin\FreeFileSync_Debug" prefix_auto="1" extension_auto="1" /> + <Option working_dir="BUILD" /> + <Option object_output="OBJ\FFS_Debug_32_MinGW\" /> + <Option type="0" /> <Option compiler="gcc" /> + <Option projectCompilerOptionsRelation="2" /> <Option projectLinkerOptionsRelation="2" /> <Compiler> <Add option="-g" /> @@ -46,25 +48,24 @@ <Add option='-include "shared/pch.h"' /> <Add option="-D__WXDEBUG__" /> <Add directory="C:\Programme\C++\wxWidgets\lib\gcc_dll\mswud" /> - <Add directory="library\gtest" /> - <Add directory="library\gtest\include" /> </Compiler> <Linker> + <Add library="libboost_thread-mgw45-mt-sd-1_47.a" /> + <Add library="libwxmsw28ud_aui.a" /> <Add library="libwxmsw28ud_adv.a" /> <Add library="libwxmsw28ud_core.a" /> <Add library="libwxbase28ud.a" /> - <Add library="libwxpngd.a" /> - <Add library="libwxzlibd.a" /> - <Add library="libboost_thread-mgw45-mt-sd-1_47.a" /> + <Add library="libwxbase28ud_net.a" /> <Add directory="C:\Programme\C++\wxWidgets\lib\gcc_dll" /> </Linker> </Target> - <Target title="Debug-DLL"> - <Option output="BUILD\Bin\FreeFileSync_Debug" prefix_auto="1" extension_auto="1" /> - <Option working_dir="BUILD" /> - <Option object_output="OBJ\FFS_Debug_32_MinGW\" /> - <Option type="0" /> + <Target title="Unit Test"> + <Option output="OBJ\Unit_Test_MinGW\Unit Test" prefix_auto="1" extension_auto="1" /> + <Option working_dir="OBJ\Unit_Test_MinGW\" /> + <Option object_output="OBJ\Unit_Test_MinGW\" /> + <Option type="1" /> <Option compiler="gcc" /> + <Option projectCompilerOptionsRelation="2" /> <Option projectLinkerOptionsRelation="2" /> <Compiler> <Add option="-g" /> @@ -72,14 +73,16 @@ <Add option='-include "shared/pch.h"' /> <Add option="-D__WXDEBUG__" /> <Add directory="C:\Programme\C++\wxWidgets\lib\gcc_dll\mswud" /> + <Add directory="library\gtest" /> + <Add directory="library\gtest\include" /> </Compiler> <Linker> + <Add library="libboost_thread-mgw45-mt-sd-1_47.a" /> <Add library="libwxmsw28ud_adv.a" /> <Add library="libwxmsw28ud_core.a" /> <Add library="libwxbase28ud.a" /> - <Add library="libwxbase28ud_net.a" /> - <Add library="libwxmsw28ud_aui.a" /> - <Add library="libboost_thread-mgw45-mt-sd-1_47.a" /> + <Add library="libwxpngd.a" /> + <Add library="libwxzlibd.a" /> <Add directory="C:\Programme\C++\wxWidgets\lib\gcc_dll" /> </Linker> </Target> @@ -233,6 +236,7 @@ <Option target="Release" /> <Option target="Debug-DLL" /> </Unit> + <Unit filename="shared\FindFilePlus\find_file_plus.h" /> <Unit filename="shared\Recycler.h" /> <Unit filename="shared\app_main.cpp"> <Option target="Release" /> @@ -253,8 +257,6 @@ <Option target="Release" /> <Option target="Debug-DLL" /> </Unit> - <Unit filename="shared\custom_combo_box.cpp" /> - <Unit filename="shared\custom_combo_box.h" /> <Unit filename="shared\custom_tooltip.cpp"> <Option target="Release" /> <Option target="Debug-DLL" /> @@ -267,7 +269,6 @@ <Unit filename="shared\dir_name.h" /> <Unit filename="shared\dir_picker_i18n.h" /> <Unit filename="shared\disable_standby.h" /> - <Unit filename="shared\dll_loader.cpp" /> <Unit filename="shared\dll_loader.h" /> <Unit filename="shared\dst_hack.cpp" /> <Unit filename="shared\dst_hack.h" /> @@ -282,6 +283,8 @@ <Unit filename="shared\file_traverser.cpp" /> <Unit filename="shared\file_traverser.h" /> <Unit filename="shared\file_update_handle.h" /> + <Unit filename="shared\folder_history_box.cpp" /> + <Unit filename="shared\folder_history_box.h" /> <Unit filename="shared\global_func.h" /> <Unit filename="shared\guid.cpp" /> <Unit filename="shared\guid.h" /> diff --git a/FreeFileSync.vcxproj b/FreeFileSync.vcxproj index 8b1de3a2..65fd497b 100644 --- a/FreeFileSync.vcxproj +++ b/FreeFileSync.vcxproj @@ -28,7 +28,7 @@ <ConfigurationType>Application</ConfigurationType> <UseDebugLibraries>true</UseDebugLibraries> <CharacterSet>Unicode</CharacterSet> - <PlatformToolset>v100</PlatformToolset> + <PlatformToolset>Windows7.1SDK</PlatformToolset> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <ConfigurationType>Application</ConfigurationType> @@ -41,7 +41,7 @@ <UseDebugLibraries>false</UseDebugLibraries> <WholeProgramOptimization>true</WholeProgramOptimization> <CharacterSet>Unicode</CharacterSet> - <PlatformToolset>v100</PlatformToolset> + <PlatformToolset>Windows7.1SDK</PlatformToolset> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <ConfigurationType>Application</ConfigurationType> @@ -70,16 +70,15 @@ <LinkIncremental>true</LinkIncremental> <OutDir>BUILD\Bin\</OutDir> <IntDir>OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir> - <TargetName>$(ProjectName)_$(PlatformName)</TargetName> <GenerateManifest>false</GenerateManifest> - <EmbedManifest>true</EmbedManifest> + <TargetName>$(ProjectName)_Debug</TargetName> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <LinkIncremental>true</LinkIncremental> <OutDir>BUILD\Bin\</OutDir> <IntDir>OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir> - <TargetName>$(ProjectName)_$(PlatformName)</TargetName> <GenerateManifest>false</GenerateManifest> + <TargetName>$(ProjectName)_Debug</TargetName> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <LinkIncremental>false</LinkIncremental> @@ -94,7 +93,6 @@ <IntDir>OBJ\$(ProjectName)_$(Configuration)_$(PlatformName)_VCPP\</IntDir> <GenerateManifest>false</GenerateManifest> <TargetName>$(ProjectName)_$(PlatformName)</TargetName> - <EmbedManifest>true</EmbedManifest> </PropertyGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ClCompile> @@ -105,17 +103,16 @@ <AdditionalIncludeDirectories>.\shared;C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> <PrecompiledHeaderFile>$(ProjectDir)shared\pch.h</PrecompiledHeaderFile> <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings> - <MultiProcessorCompilation>false</MultiProcessorCompilation> - <DisableLanguageExtensions>false</DisableLanguageExtensions> + <MultiProcessorCompilation>true</MultiProcessorCompilation> <PrecompiledHeaderOutputFile>$(IntDir)pch.obj</PrecompiledHeaderOutputFile> - <ForcedIncludeFiles>$(SolutionDir)shared/warn_static.h;$(ProjectDir)shared/pch.h</ForcedIncludeFiles> + <ForcedIncludeFiles>$(ProjectDir)shared/pch.h;$(SolutionDir)shared/warn_static.h</ForcedIncludeFiles> <DebugInformationFormat>EditAndContinue</DebugInformationFormat> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <MinimalRebuild>false</MinimalRebuild> </ClCompile> <Link> <SubSystem>Windows</SubSystem> <GenerateDebugInformation>true</GenerateDebugInformation> - <SuppressStartupBanner>true</SuppressStartupBanner> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> <AdditionalDependencies>wxmsw28ud_aui.lib;wxmsw28ud_adv.lib;wxmsw28ud_core.lib;wxbase28ud.lib;wxpngd.lib;wxzlibd.lib;wxbase28ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories> @@ -140,17 +137,15 @@ <AdditionalIncludeDirectories>.\shared;C:\Program Files\C++\wxWidgets-x64\include;C:\Program Files\C++\wxWidgets-x64\lib\vc_lib\mswud;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> <PrecompiledHeaderFile>$(ProjectDir)shared\pch.h</PrecompiledHeaderFile> <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings> - <MultiProcessorCompilation>false</MultiProcessorCompilation> - <DisableLanguageExtensions>false</DisableLanguageExtensions> + <MultiProcessorCompilation>true</MultiProcessorCompilation> <PrecompiledHeaderOutputFile>$(IntDir)pch.obj</PrecompiledHeaderOutputFile> - <ForcedIncludeFiles>$(SolutionDir)shared/warn_static.h;$(ProjectDir)shared/pch.h</ForcedIncludeFiles> + <ForcedIncludeFiles>$(ProjectDir)shared/pch.h;$(SolutionDir)shared/warn_static.h</ForcedIncludeFiles> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> - <SuppressStartupBanner>true</SuppressStartupBanner> + <MinimalRebuild>false</MinimalRebuild> </ClCompile> <Link> <SubSystem>Windows</SubSystem> <GenerateDebugInformation>true</GenerateDebugInformation> - <SuppressStartupBanner>true</SuppressStartupBanner> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> <AdditionalDependencies>wxmsw28ud_aui.lib;wxmsw28ud_adv.lib;wxmsw28ud_core.lib;wxbase28ud.lib;wxpngd.lib;wxzlibd.lib;wxbase28ud_net.lib;comctl32.lib;ws2_32.lib;Rpcrt4.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> @@ -172,14 +167,12 @@ <PrecompiledHeader>NotUsing</PrecompiledHeader> <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> - <IntrinsicFunctions>true</IntrinsicFunctions> <PreprocessorDefinitions>ZEN_PLATFORM_WINDOWS;wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <AdditionalIncludeDirectories>.\shared;C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <DisableSpecificWarnings>4100;4996</DisableSpecificWarnings> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <MultiProcessorCompilation>true</MultiProcessorCompilation> - <DisableLanguageExtensions>false</DisableLanguageExtensions> <InlineFunctionExpansion>Default</InlineFunctionExpansion> <ForcedIncludeFiles>$(SolutionDir)shared/warn_static.h;</ForcedIncludeFiles> </ClCompile> @@ -188,12 +181,12 @@ <GenerateDebugInformation>false</GenerateDebugInformation> <EnableCOMDATFolding>true</EnableCOMDATFolding> <OptimizeReferences>true</OptimizeReferences> - <SuppressStartupBanner>true</SuppressStartupBanner> <AdditionalDependencies>wxmsw28u_aui.lib;wxmsw28u_adv.lib;wxmsw28u_core.lib;wxbase28u.lib;wxpng.lib;wxzlib.lib;wxbase28u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets\lib\vc_lib;C:\Program Files\C++\Boost\stage\lib</AdditionalLibraryDirectories> <LinkStatus> </LinkStatus> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> </Link> <ResourceCompile> <AdditionalIncludeDirectories>C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc_lib\mswu</AdditionalIncludeDirectories> @@ -208,23 +201,19 @@ <PrecompiledHeader>NotUsing</PrecompiledHeader> <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> - <IntrinsicFunctions>true</IntrinsicFunctions> <PreprocessorDefinitions>ZEN_PLATFORM_WINDOWS;wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <AdditionalIncludeDirectories>.\shared;C:\Program Files\C++\wxWidgets-x64\include;C:\Program Files\C++\wxWidgets-x64\lib\vc_lib\mswu;C:\Program Files\C++\Boost</AdditionalIncludeDirectories> <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> <DisableSpecificWarnings>4512;4996;4100;4127</DisableSpecificWarnings> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <MultiProcessorCompilation>true</MultiProcessorCompilation> - <DisableLanguageExtensions>false</DisableLanguageExtensions> - <SuppressStartupBanner>true</SuppressStartupBanner> <ForcedIncludeFiles>$(SolutionDir)shared/warn_static.h;</ForcedIncludeFiles> </ClCompile> <Link> <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> + <GenerateDebugInformation>false</GenerateDebugInformation> <EnableCOMDATFolding>true</EnableCOMDATFolding> <OptimizeReferences>true</OptimizeReferences> - <SuppressStartupBanner>true</SuppressStartupBanner> <AdditionalDependencies>wxmsw28u_aui.lib;wxmsw28u_adv.lib;wxmsw28u_core.lib;wxbase28u.lib;wxpng.lib;wxzlib.lib;wxbase28u_net.lib;comctl32.lib;ws2_32.lib;winmm.lib;Rpcrt4.lib;%(AdditionalDependencies)</AdditionalDependencies> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> <AdditionalLibraryDirectories>C:\Program Files\C++\wxWidgets-x64\lib\vc_lib;C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories> @@ -238,6 +227,10 @@ <Culture> </Culture> </ResourceCompile> + <PreBuildEvent> + <Command> + </Command> + </PreBuildEvent> </ItemDefinitionGroup> <ItemGroup> <ClCompile Include="algorithm.cpp"> @@ -261,9 +254,8 @@ <ClCompile Include="library\status_handler.cpp" /> <ClCompile Include="shared\app_main.cpp" /> <ClCompile Include="shared\custom_button.cpp" /> - <ClCompile Include="shared\custom_combo_box.cpp" /> + <ClCompile Include="shared\folder_history_box.cpp" /> <ClCompile Include="shared\custom_tooltip.cpp" /> - <ClCompile Include="shared\dll_loader.cpp" /> <ClCompile Include="shared\dir_name.cpp" /> <ClCompile Include="shared\dst_hack.cpp" /> <ClCompile Include="shared\file_handling.cpp" /> @@ -88,7 +88,7 @@ FILE_LIST+=shared/zstring.cpp FILE_LIST+=shared/app_main.cpp FILE_LIST+=shared/custom_button.cpp FILE_LIST+=shared/toggle_button.cpp -FILE_LIST+=shared/custom_combo_box.cpp +FILE_LIST+=shared/folder_history_box.cpp FILE_LIST+=shared/serialize.cpp FILE_LIST+=shared/file_id.cpp FILE_LIST+=shared/recycler.cpp @@ -128,7 +128,7 @@ install: BUILD/Help/ \ BUILD/Compare_Complete.wav \ BUILD/Sync_Complete.wav \ - BUILD/Resources.dat \ + BUILD/Resources.zip \ BUILD/Changelog.txt \ BUILD/License.txt \ BUILD/styles.rc \ diff --git a/RealtimeSync/RealtimeSync.cbp b/RealtimeSync/RealtimeSync.cbp index 8464abfc..5a928487 100644 --- a/RealtimeSync/RealtimeSync.cbp +++ b/RealtimeSync/RealtimeSync.cbp @@ -65,6 +65,7 @@ <Add option="-pipe" /> <Add option="-mthreads" /> <Add option="-std=gnu++0x" /> + <Add option='-include "../shared/warn_static.h"' /> <Add option="-D__GNUWIN32__" /> <Add option="-D__WXMSW__" /> <Add option="-DwxUSE_UNICODE" /> @@ -125,7 +126,6 @@ <Unit filename="..\library\process_xml.cpp" /> <Unit filename="..\shared\dir_watcher.cpp" /> <Unit filename="..\shared\dir_watcher.h" /> - <Unit filename="..\shared\dll_loader.cpp" /> <Unit filename="..\shared\dll_loader.h" /> <Unit filename="..\shared\dst_hack.cpp" /> <Unit filename="..\shared\dst_hack.h" /> @@ -135,6 +135,7 @@ <Unit filename="..\shared\file_id.cpp" /> <Unit filename="..\shared\file_io.cpp" /> <Unit filename="..\shared\file_traverser.cpp" /> + <Unit filename="..\shared\folder_history_box.cpp" /> <Unit filename="..\shared\global_func.h" /> <Unit filename="..\shared\help_provider.cpp" /> <Unit filename="..\shared\i18n.cpp" /> diff --git a/RealtimeSync/RealtimeSync.vcxproj b/RealtimeSync/RealtimeSync.vcxproj index 5936b74c..f6f018a1 100644 --- a/RealtimeSync/RealtimeSync.vcxproj +++ b/RealtimeSync/RealtimeSync.vcxproj @@ -28,7 +28,7 @@ <ConfigurationType>Application</ConfigurationType> <UseDebugLibraries>true</UseDebugLibraries> <CharacterSet>Unicode</CharacterSet> - <PlatformToolset>v100</PlatformToolset> + <PlatformToolset>Windows7.1SDK</PlatformToolset> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <ConfigurationType>Application</ConfigurationType> @@ -41,7 +41,7 @@ <UseDebugLibraries>false</UseDebugLibraries> <WholeProgramOptimization>true</WholeProgramOptimization> <CharacterSet>Unicode</CharacterSet> - <PlatformToolset>v100</PlatformToolset> + <PlatformToolset>Windows7.1SDK</PlatformToolset> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <ConfigurationType>Application</ConfigurationType> @@ -230,12 +230,12 @@ <ClCompile Include="..\library\process_xml.cpp" /> <ClCompile Include="..\shared\custom_button.cpp" /> <ClCompile Include="..\shared\dir_watcher.cpp" /> - <ClCompile Include="..\shared\dll_loader.cpp" /> <ClCompile Include="..\shared\dir_name.cpp" /> <ClCompile Include="..\shared\dst_hack.cpp" /> <ClCompile Include="..\shared\file_handling.cpp" /> <ClCompile Include="..\shared\file_io.cpp" /> <ClCompile Include="..\shared\file_traverser.cpp" /> + <ClCompile Include="..\shared\folder_history_box.cpp" /> <ClCompile Include="..\shared\help_provider.cpp" /> <ClCompile Include="..\shared\i18n.cpp" /> <ClCompile Include="..\shared\localization.cpp" /> diff --git a/RealtimeSync/application.cpp b/RealtimeSync/application.cpp index 6b7e81e9..aa1a1385 100644 --- a/RealtimeSync/application.cpp +++ b/RealtimeSync/application.cpp @@ -93,7 +93,7 @@ int Application::OnRun() wxFile safeOutput(zen::getConfigDir() + wxT("LastError.txt"), wxFile::write); safeOutput.Write(wxString::FromAscii(e.what())); - wxSafeShowMessage(_("An exception occurred!"), wxString::FromAscii(e.what())); + wxSafeShowMessage(_("An exception occurred!") + L" - RTS", wxString::FromAscii(e.what())); return -9; } diff --git a/RealtimeSync/gui_generated.cpp b/RealtimeSync/gui_generated.cpp index 13f789f7..2ec50c11 100644 --- a/RealtimeSync/gui_generated.cpp +++ b/RealtimeSync/gui_generated.cpp @@ -14,7 +14,7 @@ MainDlgGenerated::MainDlgGenerated( 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( 420,440 ), wxDefaultSize ); + this->SetSizeHints( wxSize( 420, 440 ), wxDefaultSize ); m_menubar1 = new wxMenuBar( 0 ); m_menuFile = new wxMenu(); @@ -66,7 +66,7 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr m_staticText2->Wrap( -1 ); m_staticText2->SetFont( wxFont( 10, 74, 90, 90, true, wxEmptyString ) ); - sbSizer41->Add( m_staticText2, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + sbSizer41->Add( m_staticText2, 0, wxBOTTOM | wxRIGHT | wxLEFT, 5 ); m_staticText3 = new wxStaticText( m_panelMain, wxID_ANY, _("1. Select directories to monitor."), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText3->Wrap( -1 ); @@ -81,16 +81,16 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr sbSizer41->Add( m_staticText5, 0, wxLEFT, 10 ); m_staticline3 = new wxStaticLine( m_panelMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - sbSizer41->Add( m_staticline3, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); + sbSizer41->Add( m_staticline3, 0, wxEXPAND | wxTOP | wxBOTTOM, 5 ); m_staticText21 = new wxStaticText( m_panelMain, wxID_ANY, _("The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText21->Wrap( -1 ); - sbSizer41->Add( m_staticText21, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); + sbSizer41->Add( m_staticText21, 0, wxRIGHT | wxLEFT | wxEXPAND, 5 ); - bSizer1->Add( sbSizer41, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 40 ); + bSizer1->Add( sbSizer41, 0, wxALIGN_CENTER_HORIZONTAL | wxRIGHT | wxLEFT | wxEXPAND, 40 ); m_staticline2 = new wxStaticLine( m_panelMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer1->Add( m_staticline2, 0, wxTOP|wxBOTTOM|wxEXPAND, 10 ); + bSizer1->Add( m_staticline2, 0, wxTOP | wxBOTTOM | wxEXPAND, 10 ); wxBoxSizer* bSizer8; bSizer8 = new wxBoxSizer( wxVERTICAL ); @@ -104,15 +104,15 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr wxBoxSizer* bSizer781; bSizer781 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonAddFolder = new wxBitmapButton( m_panelMainFolder, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); + m_bpButtonAddFolder = new wxBitmapButton( m_panelMainFolder, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19, 21 ), wxBU_AUTODRAW ); m_bpButtonAddFolder->SetToolTip( _("Add folder") ); - bSizer781->Add( m_bpButtonAddFolder, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer781->Add( m_bpButtonAddFolder, 0, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5 ); - m_bpButtonRemoveTopFolder = new wxBitmapButton( m_panelMainFolder, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); + m_bpButtonRemoveTopFolder = new wxBitmapButton( m_panelMainFolder, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19, 21 ), wxBU_AUTODRAW ); m_bpButtonRemoveTopFolder->SetToolTip( _("Remove folder") ); - bSizer781->Add( m_bpButtonRemoveTopFolder, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer781->Add( m_bpButtonRemoveTopFolder, 0, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5 ); bSizer114->Add( bSizer781, 0, wxALIGN_CENTER_VERTICAL, 5 ); @@ -129,7 +129,7 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr bSizer114->Fit( m_panelMainFolder ); sbSizerDirToWatch->Add( m_panelMainFolder, 0, wxEXPAND, 5 ); - m_scrolledWinFolders = new wxScrolledWindow( m_panelMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_scrolledWinFolders = new wxScrolledWindow( m_panelMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL | wxVSCROLL ); m_scrolledWinFolders->SetScrollRate( 5, 5 ); bSizerFolders = new wxBoxSizer( wxVERTICAL ); @@ -138,7 +138,7 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr bSizerFolders->Fit( m_scrolledWinFolders ); sbSizerDirToWatch->Add( m_scrolledWinFolders, 0, wxEXPAND, 5 ); - bSizer8->Add( sbSizerDirToWatch, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + bSizer8->Add( sbSizerDirToWatch, 0, wxEXPAND | wxBOTTOM | wxRIGHT | wxLEFT, 5 ); bSizer1->Add( bSizer8, 1, wxEXPAND, 5 ); @@ -146,9 +146,9 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr sbSizer3 = new wxStaticBoxSizer( new wxStaticBox( m_panelMain, wxID_ANY, _("Command line") ), wxVERTICAL ); m_textCtrlCommand = new wxTextCtrl( m_panelMain, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - sbSizer3->Add( m_textCtrlCommand, 0, wxEXPAND|wxBOTTOM, 5 ); + sbSizer3->Add( m_textCtrlCommand, 0, wxEXPAND | wxBOTTOM, 5 ); - bSizer1->Add( sbSizer3, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); + bSizer1->Add( sbSizer3, 0, wxEXPAND | wxTOP | wxRIGHT | wxLEFT, 5 ); wxStaticBoxSizer* sbSizer4; sbSizer4 = new wxStaticBoxSizer( new wxStaticBox( m_panelMain, wxID_ANY, _("Minimum Idle Time [seconds]") ), wxVERTICAL ); @@ -156,20 +156,20 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr m_spinCtrlDelay = new wxSpinCtrl( m_panelMain, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); m_spinCtrlDelay->SetToolTip( _("Idle time between detection of last change and execution of command line in seconds") ); - sbSizer4->Add( m_spinCtrlDelay, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 ); + sbSizer4->Add( m_spinCtrlDelay, 0, wxBOTTOM | wxRIGHT | wxLEFT | wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizer1->Add( sbSizer4, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); + bSizer1->Add( sbSizer4, 0, wxEXPAND | wxRIGHT | wxLEFT, 5 ); m_staticline1 = new wxStaticLine( m_panelMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer1->Add( m_staticline1, 0, wxEXPAND|wxTOP|wxBOTTOM, 10 ); + bSizer1->Add( m_staticline1, 0, wxEXPAND | wxTOP | wxBOTTOM, 10 ); - m_buttonStart = new wxButtonWithImage( m_panelMain, wxID_ANY, _("Start"), wxDefaultPosition, wxSize( -1,40 ), 0 ); + m_buttonStart = new wxButtonWithImage( m_panelMain, wxID_ANY, _("Start"), wxDefaultPosition, wxSize( -1, 40 ), 0 ); m_buttonStart->SetDefault(); m_buttonStart->SetFont( wxFont( 14, 74, 90, 92, false, wxT("Arial Black") ) ); - bSizer1->Add( m_buttonStart, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + bSizer1->Add( m_buttonStart, 0, wxALL | wxALIGN_CENTER_HORIZONTAL, 5 ); - m_buttonCancel = new wxButton( m_panelMain, wxID_CANCEL, _("dummy"), wxDefaultPosition, wxSize( 0,0 ), 0 ); + m_buttonCancel = new wxButton( m_panelMain, wxID_CANCEL, _("dummy"), wxDefaultPosition, wxSize( 0, 0 ), 0 ); bSizer1->Add( m_buttonCancel, 0, 0, 5 ); m_panelMain->SetSizer( bSizer1 ); @@ -215,7 +215,7 @@ FolderGenerated::FolderGenerated( wxWindow* parent, wxWindowID id, const wxPoint wxBoxSizer* bSizer114; bSizer114 = new wxBoxSizer( wxHORIZONTAL ); - m_bpButtonRemoveFolder = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); + m_bpButtonRemoveFolder = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19, 21 ), wxBU_AUTODRAW ); m_bpButtonRemoveFolder->SetToolTip( _("Remove folder") ); bSizer114->Add( m_bpButtonRemoveFolder, 0, wxALIGN_CENTER_VERTICAL, 5 ); diff --git a/RealtimeSync/gui_generated.h b/RealtimeSync/gui_generated.h index aee6a5e8..fa31652f 100644 --- a/RealtimeSync/gui_generated.h +++ b/RealtimeSync/gui_generated.h @@ -89,7 +89,7 @@ protected: public: FfsDirPickerCtrl* m_dirPickerMain; - MainDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("RealtimeSync - Automated Synchronization"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); + MainDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("RealtimeSync - Automated Synchronization"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_FRAME_STYLE | wxTAB_TRAVERSAL ); ~MainDlgGenerated(); @@ -109,7 +109,7 @@ public: wxTextCtrl* m_txtCtrlDirectory; FfsDirPickerCtrl* m_dirPicker; - FolderGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); + FolderGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxTAB_TRAVERSAL ); ~FolderGenerated(); }; diff --git a/RealtimeSync/main_dlg.cpp b/RealtimeSync/main_dlg.cpp index e8851428..539a8bbe 100644 --- a/RealtimeSync/main_dlg.cpp +++ b/RealtimeSync/main_dlg.cpp @@ -42,7 +42,7 @@ MainDialog::MainDialog(wxDialog* dlg, const wxString& cfgFileName) Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(MainDialog::OnKeyPressed), NULL, this); //prepare drag & drop - dirNameFirst.reset(new zen::DirectoryName(*m_panelMainFolder, *m_dirPickerMain, *m_txtCtrlDirectoryMain, sbSizerDirToWatch)); + dirNameFirst.reset(new DirectoryName<wxTextCtrl>(*m_panelMainFolder, *m_dirPickerMain, *m_txtCtrlDirectoryMain, sbSizerDirToWatch)); #ifdef FFS_WIN @@ -127,9 +127,9 @@ const wxString& MainDialog::lastConfigFileName() void MainDialog::OnShowHelp(wxCommandEvent& event) { #ifdef FFS_WIN - zen::displayHelpEntry(wxT("html\\advanced\\RealtimeSync.html")); + zen::displayHelpEntry(wxT("html\\RealtimeSync.html")); #elif defined FFS_LINUX - zen::displayHelpEntry(wxT("html/advanced/RealtimeSync.html")); + zen::displayHelpEntry(wxT("html/RealtimeSync.html")); #endif } diff --git a/RealtimeSync/main_dlg.h b/RealtimeSync/main_dlg.h index 54d4d50c..ca054b65 100644 --- a/RealtimeSync/main_dlg.h +++ b/RealtimeSync/main_dlg.h @@ -30,7 +30,7 @@ public: wxString getName() const { return dirName.getName(); } private: - zen::DirectoryName dirName; + zen::DirectoryName<wxTextCtrl> dirName; }; @@ -69,7 +69,7 @@ private: static const wxString& lastConfigFileName(); - std::auto_ptr<zen::DirectoryName> dirNameFirst; + std::auto_ptr<zen::DirectoryName<wxTextCtrl>> dirNameFirst; std::vector<DirectoryPanel*> dirNamesExtra; //additional pairs to the standard pair wxString currentConfigFileName; diff --git a/RealtimeSync/makefile b/RealtimeSync/makefile index 3bc19061..c0ac3aa5 100644 --- a/RealtimeSync/makefile +++ b/RealtimeSync/makefile @@ -26,6 +26,7 @@ FILE_LIST+=xml_proc.cpp FILE_LIST+=xml_ffs.cpp FILE_LIST+=../library/process_xml.cpp FILE_LIST+=../structures.cpp +FILE_LIST+=../shared/folder_history_box.cpp FILE_LIST+=../shared/util.cpp FILE_LIST+=../shared/i18n.cpp FILE_LIST+=../shared/localization.cpp diff --git a/RealtimeSync/resources.cpp b/RealtimeSync/resources.cpp index e9231623..2a7e2818 100644 --- a/RealtimeSync/resources.cpp +++ b/RealtimeSync/resources.cpp @@ -41,7 +41,7 @@ GlobalResources::~GlobalResources() void GlobalResources::load() const { - wxFFileInputStream input(zen::getResourceDir() + wxT("Resources.dat")); + wxFFileInputStream input(zen::getResourceDir() + wxT("Resources.zip")); if (input.IsOk()) //if not... we don't want to react too harsh here { //activate support for .png files diff --git a/RealtimeSync/tray_menu.cpp b/RealtimeSync/tray_menu.cpp index 98c66cb5..cbdf6070 100644 --- a/RealtimeSync/tray_menu.cpp +++ b/RealtimeSync/tray_menu.cpp @@ -227,7 +227,7 @@ std::vector<Zstring> convert(const std::vector<wxString>& dirList) { std::set<Zstring, LessFilename> output; std::transform(dirList.begin(), dirList.end(), - std::inserter(output, output.end()), [](const wxString& str) { return zen::toZ(str); }); + std::inserter(output, output.end()), [](const wxString & str) { return zen::toZ(str); }); return std::vector<Zstring>(output.begin(), output.end()); } } @@ -291,15 +291,16 @@ watcher.h (low level wait for directory changes) rts::MonitorResponse rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& config, const wxString& jobname) { - const std::vector<Zstring> dirList = convert(config.directories); + Zstring lastFileChanged; + const std::vector<Zstring> dirList = convert(config.directories); try { WaitCallbackImpl callback(jobname); if (config.commandline.empty()) { - std::wstring errorMsg = _("Invalid commandline: %x"); + std::wstring errorMsg = _("Invalid command line: %x"); replace(errorMsg, L"%x", L"\"" + config.commandline + L"\""); throw FileError(errorMsg); } @@ -310,6 +311,8 @@ rts::MonitorResponse rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& while (true) { + ::wxSetEnv(L"changed_file", utf8CvrtTo<wxString>(lastFileChanged)); //some way to output what file changed to the user + //execute command zen::shellExecute(config.commandline, zen::EXEC_TYPE_SYNC); @@ -322,7 +325,8 @@ rts::MonitorResponse rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& while (true) { //wait for changes (and for all directories to become available) - switch (waitForChanges(dirList, &callback)) + WaitResult res = waitForChanges(dirList, &callback); + switch (res.type) { case CHANGE_DIR_MISSING: //don't execute the commandline before all directories are available! callback.scheduleNextSync(std::numeric_limits<long>::max()); //next sync not scheduled (yet) @@ -331,6 +335,7 @@ rts::MonitorResponse rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& callback.notifyAllDirectoriesExist(); break; case CHANGE_DETECTED: + lastFileChanged = res.filename; break; } diff --git a/RealtimeSync/watcher.cpp b/RealtimeSync/watcher.cpp index b17c63ba..37664d35 100644 --- a/RealtimeSync/watcher.cpp +++ b/RealtimeSync/watcher.cpp @@ -7,6 +7,7 @@ #include "watcher.h" #include "../shared/file_handling.h" #include "../shared/i18n.h" +#include "../shared/stl_tools.h" #include <set> #include <wx/timer.h> #include "../shared/resolve_path.h" @@ -32,112 +33,102 @@ bool rts::updateUiIsAllowed() return false; } - -class MonitorExistence //detect changes to directory availability +namespace { -public: - MonitorExistence() : allExisting_(true) {} - - //initialization - void addForMonitoring(const Zstring& dirName) - { - dirList.insert(dirName); - } - - bool allExisting() const //polling explicitly allowed! - { - const int UPDATE_INTERVAL = 1000; //1 second interval - - const wxLongLong current = wxGetLocalTimeMillis(); - if (current - lastCheck >= UPDATE_INTERVAL) - { - lastCheck = current; - allExisting_ = std::find_if(dirList.begin(), dirList.end(), std::not1(std::ptr_fun(&zen::dirExists))) == dirList.end(); - } - - return allExisting_; - } - -private: - mutable wxLongLong lastCheck; - mutable bool allExisting_; - - std::set<Zstring, LessFilename> dirList; //save avail. directories, avoid double-entries -}; - +const int CHECK_DIR_INTERVAL = 1000; //1 second interval +} -rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCallback* statusHandler) //throw(FileError) +rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNamesNonFmt, WaitCallback* statusHandler) //throw FileError { - if (dirNames.empty()) //pathological case, but check is needed nevertheless - throw zen::FileError(_("A directory input field is empty.")); + std::set<Zstring, LessFilename> dirNamesFmt; - //detect when volumes are removed/are not available anymore - MonitorExistence checkExist; - std::vector<std::shared_ptr<DirWatcher>> watches; - - for (std::vector<Zstring>::const_iterator i = dirNames.begin(); i != dirNames.end(); ++i) + std::for_each(dirNamesNonFmt.begin(), dirNamesNonFmt.end(), + [&](const Zstring& dirnameNonFmt) { - const Zstring formattedDir = zen::getFormattedDirectoryName(*i); + const Zstring& dirnameFmt = zen::getFormattedDirectoryName(dirnameNonFmt); - if (formattedDir.empty()) + if (dirnameFmt.empty()) throw zen::FileError(_("A directory input field is empty.")); + dirNamesFmt.insert(dirnameFmt); + }); + if (dirNamesFmt.empty()) //pathological case, but check is needed nevertheless + throw zen::FileError(_("A directory input field is empty.")); - checkExist.addForMonitoring(formattedDir); + //detect when volumes are removed/are not available anymore + std::vector<std::pair<Zstring, std::shared_ptr<DirWatcher>>> watches; + + for (auto iter = dirNamesFmt.begin(); iter != dirNamesFmt.end(); ++iter) + { + const Zstring& dirnameFmt = *iter; try { - watches.push_back(std::make_shared<DirWatcher>(formattedDir)); //throw FileError + watches.push_back(std::make_pair(dirnameFmt, std::make_shared<DirWatcher>(dirnameFmt))); //throw FileError } - catch (zen::FileError&) + catch (FileError&) { - if (!zen::dirExists(formattedDir)) //that's no good locking behavior, but better than nothing + //Note: checking for directory existence is NOT transactional!!! + if (!dirExists(dirnameFmt)) //that's no good locking behavior, but better than nothing return CHANGE_DIR_MISSING; throw; } } + wxLongLong lastCheck; while (true) { - //IMPORTANT CHECK: dirwatcher has problems detecting removal of top watched directories! - if (!checkExist.allExisting()) //check for removed devices: - return CHANGE_DIR_MISSING; + const bool checkDirExistNow = [&lastCheck]() -> bool //checking once per sec should suffice + { + const wxLongLong current = wxGetLocalTimeMillis(); + if (current - lastCheck >= CHECK_DIR_INTERVAL) + { + lastCheck = current; + return true; + } + return false; + }(); - try + + for (auto iter = watches.begin(); iter != watches.end(); ++iter) { - for (auto iter = watches.begin(); iter != watches.end(); ++iter) + const Zstring& dirname = iter->first; + DirWatcher& watcher = *(iter->second); + + //IMPORTANT CHECK: dirwatcher has problems detecting removal of top watched directories! + if (checkDirExistNow) + if (!dirExists(dirname)) //catch errors related to directory removal, e.g. ERROR_NETNAME_DELETED + return CHANGE_DIR_MISSING; + + try { - std::vector<Zstring> changedFiles = (*iter)->getChanges(); //throw FileError + std::vector<Zstring> changedFiles = watcher.getChanges(); //throw FileError //remove to be ignored changes - changedFiles.erase(std::remove_if(changedFiles.begin(), changedFiles.end(), - [](const Zstring& name) + vector_remove_if(changedFiles, [](const Zstring & name) { return endsWith(name, Zstr(".ffs_lock")) || //sync.ffs_lock, sync.Del.ffs_lock endsWith(name, Zstr(".ffs_db")); //sync.ffs_db, .sync.tmp.ffs_db //no need to ignore temporal recycle bin directory: this must be caused by a file deletion anyway - }), changedFiles.end()); + }); if (!changedFiles.empty()) { /* std::for_each(changedFiles.begin(), changedFiles.end(), [](const Zstring& fn) { wxMessageBox(toWx(fn));}); - - const wxString filename = toWx(changedFiles[0]); - ::wxSetEnv(wxT("RTS_CHANGE"), filename); */ - - return CHANGE_DETECTED; //directory change detected + return WaitResult(CHANGE_DETECTED, changedFiles[0]); //directory change detected } + + } + catch (FileError&) + { + //Note: checking for directory existence is NOT transactional!!! + if (!dirExists(dirname)) //catch errors related to directory removal, e.g. ERROR_NETNAME_DELETED + return CHANGE_DIR_MISSING; + throw; } - } - catch (FileError&) - { - //maybe some error is caused due to some unexpected removal/unavailability of a watched directory? If so we can remedy this error: - if (!checkExist.allExisting()) - return CHANGE_DIR_MISSING; - throw; } wxMilliSleep(rts::UI_UPDATE_INTERVAL); @@ -147,35 +138,29 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNames, WaitCa //support for monitoring newly connected directories volumes (e.g.: USB-sticks) -void rts::waitForMissingDirs(const std::vector<Zstring>& dirNames, WaitCallback* statusHandler) //throw(FileError) +void rts::waitForMissingDirs(const std::vector<Zstring>& dirNamesNonFmt, WaitCallback* statusHandler) //throw FileError { wxLongLong lastCheck; while (true) { - const int UPDATE_INTERVAL = 1000; //1 second interval const wxLongLong current = wxGetLocalTimeMillis(); - if (current - lastCheck >= UPDATE_INTERVAL) + if (current - lastCheck >= CHECK_DIR_INTERVAL) { lastCheck = current; - bool allExisting = true; - for (std::vector<Zstring>::const_iterator i = dirNames.begin(); i != dirNames.end(); ++i) - { - //support specifying volume by name => call getFormattedDirectoryName() repeatedly - const Zstring formattedDir = zen::getFormattedDirectoryName(*i); + if (std::find_if(dirNamesNonFmt.begin(), dirNamesNonFmt.end(), + [&](const Zstring& dirnameNonFmt) -> bool + { + //support specifying volume by name => call getFormattedDirectoryName() repeatedly + const Zstring formattedDir = zen::getFormattedDirectoryName(dirnameNonFmt); if (formattedDir.empty()) throw zen::FileError(_("A directory input field is empty.")); - if (!zen::dirExists(formattedDir)) - { - allExisting = false; - break; - } - } - if (allExisting) //check for newly arrived devices: - return; + return !dirExists(formattedDir); + }) == dirNamesNonFmt.end()) + return; } wxMilliSleep(rts::UI_UPDATE_INTERVAL); diff --git a/RealtimeSync/watcher.h b/RealtimeSync/watcher.h index 04a0d860..dd0dd88d 100644 --- a/RealtimeSync/watcher.h +++ b/RealtimeSync/watcher.h @@ -28,15 +28,24 @@ public: //wait until changes are detected or if a directory is not available (anymore) -enum WaitResult +enum ChangeType { CHANGE_DETECTED, CHANGE_DIR_MISSING }; -WaitResult waitForChanges(const std::vector<Zstring>& dirNames, WaitCallback* statusHandler); //throw(FileError) +struct WaitResult +{ + WaitResult(ChangeType tp, const Zstring& chgFile = Zstring()) : type(tp), filename(chgFile) {} + + ChangeType type; + Zstring filename; //filled if type == CHANGE_DETECTED +}; +WaitResult waitForChanges(const std::vector<Zstring>& dirNamesNonFmt, //non-formatted dir names that yet require call to getFormattedDirectoryName() + WaitCallback* statusHandler); //throw(FileError) //wait until all directories become available (again) -void waitForMissingDirs(const std::vector<Zstring>& dirNames, WaitCallback* statusHandler); //throw(FileError) +void waitForMissingDirs(const std::vector<Zstring>& dirNamesNonFmt, + WaitCallback* statusHandler); //throw(FileError) } #endif // WATCHER_H_INCLUDED diff --git a/RealtimeSync/xml_ffs.cpp b/RealtimeSync/xml_ffs.cpp index ed0a4331..23ee1b38 100644 --- a/RealtimeSync/xml_ffs.cpp +++ b/RealtimeSync/xml_ffs.cpp @@ -6,9 +6,7 @@ #include "xml_ffs.h" #include "../shared/standard_paths.h" -#include "../shared/global_func.h" #include "../shared/zstring.h" -//#include "functions.h" #include "../shared/xml_base.h" #include "../shared/string_conv.h" @@ -30,7 +28,7 @@ xmlAccess::XmlRealConfig convertBatchToReal(const xmlAccess::XmlBatchConfig& bat //additional folders std::for_each(batchCfg.mainCfg.additionalPairs.begin(), batchCfg.mainCfg.additionalPairs.end(), - [&](const FolderPairEnh& fp) + [&](const FolderPairEnh & fp) { uniqueFolders.insert(fp.leftDirectory); uniqueFolders.insert(fp.rightDirectory); @@ -40,7 +38,7 @@ xmlAccess::XmlRealConfig convertBatchToReal(const xmlAccess::XmlBatchConfig& bat output.directories.clear(); std::transform(uniqueFolders.begin(), uniqueFolders.end(), std::back_inserter(output.directories), - [](const Zstring& fn) { return toWx(fn); }); + [](const Zstring & fn) { return toWx(fn); }); output.commandline = wxT("\"") + zen::getLauncher() + wxT("\"") + wxT(" \"") + filename + wxT("\""); diff --git a/algorithm.cpp b/algorithm.cpp index 2daaee4c..8f09f0ef 100644 --- a/algorithm.cpp +++ b/algorithm.cpp @@ -7,13 +7,12 @@ #include "algorithm.h" #include <iterator> #include <stdexcept> -#include <wx/log.h> +//#include <wx/log.h> #include "library/resources.h" #include "shared/file_handling.h" #include "shared/recycler.h" #include <wx/msgdlg.h> #include "library/norm_filter.h" -#include <boost/bind.hpp> #include "shared/string_conv.h" #include "shared/global_func.h" #include "shared/i18n.h" @@ -21,14 +20,16 @@ #include "library/db_file.h" #include "shared/loki/ScopeGuard.h" #include "library/cmp_filetime.h" +#include "shared/stl_tools.h" #include "library/norm_filter.h" using namespace zen; +using namespace std::rel_ops; void zen::swapGrids(const MainConfiguration& config, FolderComparison& folderCmp) { - std::for_each(folderCmp.begin(), folderCmp.end(), boost::bind(&BaseDirMapping::swap, _1)); + std::for_each(begin(folderCmp), end(folderCmp), std::mem_fun_ref(&BaseDirMapping::flip)); redetermineSyncDirection(config, folderCmp, NULL); } @@ -41,47 +42,11 @@ public: void execute(HierarchyObject& hierObj) const { - util::ProxyForEach<const Redetermine> prx(*this); //grant std::for_each access to private parts of this class - - std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), prx); //process files - std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), prx); //process links - std::for_each(hierObj.refSubDirs(). begin(), hierObj.refSubDirs(). end(), prx); //process directories + std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FileMapping& fileMap) { (*this)(fileMap); }); + std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymLinkMapping& linkMap) { (*this)(linkMap); }); + std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirMapping& dirMap) { (*this)(dirMap); }); } - /* - void execute2(FileSystemObject& fsObj) const - { - struct RedetermineObject : public FSObjectVisitor - { - RedetermineObject(const Redetermine& parent, - FileSystemObject& fsObject) : parent_(parent), fsObj_(fsObject) {} - - virtual void visit(const FileMapping& fileObj) - { - parent_(static_cast<FileMapping&>(fsObj_)); - } - - virtual void visit(const SymLinkMapping& linkObj) - { - parent_(static_cast<SymLinkMapping&>(fsObj_)); - } - - virtual void visit(const DirMapping& dirObj) - { - parent_(static_cast<DirMapping&>(fsObj_)); - } - - private: - const Redetermine& parent_; - FileSystemObject& fsObj_; //hack - } redetObj(*this, fsObj); - fsObj.accept(redetObj); - } - */ - -private: - friend class util::ProxyForEach<const Redetermine>; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent! - void operator()(FileMapping& fileObj) const { switch (fileObj.getCategory()) @@ -108,7 +73,10 @@ private: fileObj.setSyncDir(dirCfg.different); break; case FILE_CONFLICT: - fileObj.setSyncDir(dirCfg.conflict); + if (dirCfg.conflict == SYNC_DIR_NONE) + fileObj.setSyncDirConflict(fileObj.getCatConflict()); //take over category conflict + else + fileObj.setSyncDir(dirCfg.conflict); break; case FILE_EQUAL: fileObj.setSyncDir(SYNC_DIR_NONE); @@ -136,7 +104,10 @@ private: linkObj.setSyncDir(dirCfg.rightNewer); break; case SYMLINK_CONFLICT: - linkObj.setSyncDir(dirCfg.conflict); + if (dirCfg.conflict == SYNC_DIR_NONE) + linkObj.setSyncDirConflict(linkObj.getCatConflict()); //take over category conflict + else + linkObj.setSyncDir(dirCfg.conflict); break; case SYMLINK_DIFFERENT: linkObj.setSyncDir(dirCfg.different); @@ -173,57 +144,52 @@ private: execute(dirObj); } +private: const DirectionSet dirCfg; }; //--------------------------------------------------------------------------------------------------------------- -class FindNonEqual //test if non-equal items exist in scanned data +class HaveNonEqual //test if non-equal items exist in scanned data { public: - bool findNonEqual(const HierarchyObject& hierObj) const + bool operator()(const HierarchyObject& hierObj) const { - return std::find_if(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), *this) != hierObj.refSubFiles().end() || //files - std::find_if(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), *this) != hierObj.refSubLinks(). end() || //symlinks - std::find_if(hierObj.refSubDirs(). begin(), hierObj.refSubDirs(). end(), *this) != hierObj.refSubDirs(). end(); //directories - } - - //logical private! => __find_if (used by std::find_if) needs public access - bool operator()(const FileMapping& fileObj) const - { - return fileObj.getCategory() != FILE_EQUAL; - } - - bool operator()(const SymLinkMapping& linkObj) const - { - return linkObj.getLinkCategory() != SYMLINK_EQUAL; - } + return std::find_if(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), + [](const FileMapping& fileObj) + { + return fileObj.getCategory() != FILE_EQUAL; + }) != hierObj.refSubFiles().end() || //files - bool operator()(const DirMapping& dirObj) const - { - if (dirObj.getDirCategory() != DIR_EQUAL) - return true; + std::find_if(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), + [](const SymLinkMapping& linkObj) + { + return linkObj.getLinkCategory() != SYMLINK_EQUAL; + }) != hierObj.refSubLinks().end() || //symlinks - return findNonEqual(dirObj); //recursion + std::find_if(hierObj.refSubDirs(). begin(), hierObj.refSubDirs(). end(), + [](const DirMapping& dirObj) -> bool + { + if (dirObj.getDirCategory() != DIR_EQUAL) + return true; + return HaveNonEqual()(dirObj); //recursion + }) != hierObj.refSubDirs ().end(); //directories } }; - -struct AllElementsEqual : public std::unary_function<BaseDirMapping, bool> +bool allElementsEqual(const BaseDirMapping& baseMap) { - bool operator()(const BaseDirMapping& baseMapping) const - { - return !FindNonEqual().findNonEqual(baseMapping); - } -}; + return !HaveNonEqual()(baseMap); +} bool zen::allElementsEqual(const FolderComparison& folderCmp) { - return std::find_if(folderCmp.begin(), folderCmp.end(), std::not1(AllElementsEqual())) == folderCmp.end(); + return std::find_if(begin(folderCmp), end(folderCmp), HaveNonEqual()) == end(folderCmp); } //--------------------------------------------------------------------------------------------------------------- + class DataSetFile { public: @@ -246,30 +212,25 @@ public: init<RIGHT_SIDE>(fileObj); } - bool operator==(const DataSetFile& other) const + inline friend + bool operator==(const DataSetFile& lhs, const DataSetFile& rhs) { - if (shortName.empty()) - return other.shortName.empty(); + if (lhs.shortName.empty()) + return rhs.shortName.empty(); else { - if (other.shortName.empty()) + if (rhs.shortName.empty()) return false; else { - return shortName == other.shortName && //detect changes in case (windows) + return lhs.shortName == rhs.shortName && //detect changes in case (windows) //respect 2 second FAT/FAT32 precision! copying a file to a FAT32 drive changes it's modification date by up to 2 seconds - sameFileTime(lastWriteTime, other.lastWriteTime, 2) && - fileSize == other.fileSize; + sameFileTime(lhs.lastWriteTime, rhs.lastWriteTime, 2) && + lhs.fileSize == rhs.fileSize; } } } - template <class T> - bool operator!=(const T& other) const - { - return !(*this == other); - } - private: template <SelectedSide side> void init(const FileMapping& fileObj) @@ -282,7 +243,7 @@ private: } } - Zstring shortName; //empty if object not existing + Zstring shortName; //empty if object not existing zen::Int64 lastWriteTime; zen::UInt64 fileSize; }; @@ -318,33 +279,28 @@ public: init<RIGHT_SIDE>(linkObj); } - bool operator==(const DataSetSymlink& other) const + inline friend + bool operator==(const DataSetSymlink& lhs, const DataSetSymlink& rhs) { - if (shortName.empty()) //test if object is existing at all - return other.shortName.empty(); + if (lhs.shortName.empty()) //test if object is existing at all + return rhs.shortName.empty(); else { - if (other.shortName.empty()) + if (rhs.shortName.empty()) return false; else { - return shortName == other.shortName && + return lhs.shortName == rhs.shortName && //respect 2 second FAT/FAT32 precision! copying a file to a FAT32 drive changes it's modification date by up to 2 seconds - sameFileTime(lastWriteTime, other.lastWriteTime, 2) && + sameFileTime(lhs.lastWriteTime, rhs.lastWriteTime, 2) && #ifdef FFS_WIN //comparison of symbolic link type is relevant for Windows only - type == other.type && + lhs.type == rhs.type && #endif - targetPath == other.targetPath; + lhs.targetPath == rhs.targetPath; } } } - template <class T> - bool operator!=(const T& other) const - { - return !(*this == other); - } - private: template <SelectedSide side> void init(const SymLinkMapping& linkObj) @@ -371,9 +327,9 @@ private: LinkDescriptor::LinkType type; #endif }; +//-------------------------------------------------------------------- -//-------------------------------------------------------------------- class DataSetDir { public: @@ -388,23 +344,17 @@ public: DataSetDir(const DirMapping& dirObj, Loki::Int2Type<RIGHT_SIDE>) : shortName(dirObj.getShortName<RIGHT_SIDE>()) {} - bool operator==(const DataSetDir& other) const + inline friend + bool operator==(const DataSetDir& lhs, const DataSetDir& rhs) { - return shortName == other.shortName; - } - - template <class T> - bool operator!=(const T& other) const - { - return !(*this == other); + return lhs.shortName == rhs.shortName; } private: Zstring shortName; //empty if object not existing }; - - //-------------------------------------------------------------------------------------------------------- + DataSetFile retrieveDataSetFile(const Zstring& objShortName, const DirContainer* dbDirectory) { if (dbDirectory) @@ -442,114 +392,6 @@ std::pair<DataSetDir, const DirContainer*> retrieveDataSetDir(const Zstring& obj return std::make_pair(DataSetDir(), static_cast<const DirContainer*>(NULL)); //object not found } - -//-------------------------------------------------------------------------------------------------------- -/* -class SetDirChangedFilter -{ -public: - SetDirChangedFilter() : - txtFilterChanged(wxString(_("Cannot determine sync-direction:")) + wxT(" \n") + _("Filter settings have changed!")) {} - - void execute(HierarchyObject& hierObj) const - { - util::ProxyForEach<const SetDirChangedFilter> prx(*this); //grant std::for_each access to private parts of this class - - std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), prx); //process files - std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), prx); //process links - std::for_each(hierObj.refSubDirs().begin(), hierObj.refSubDirs().end(), prx); //process directories - } - -private: - friend class util::ProxyForEach<const SetDirChangedFilter>; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent! - - void operator()(FileMapping& fileObj) const - { - const CompareFilesResult cat = fileObj.getCategory(); - - if (cat == FILE_EQUAL) - return; - - if (cat == FILE_LEFT_SIDE_ONLY) - fileObj.setSyncDir(SYNC_DIR_RIGHT); - else if (cat == FILE_RIGHT_SIDE_ONLY) - fileObj.setSyncDir(SYNC_DIR_LEFT); - else - fileObj.setSyncDirConflict(txtFilterChanged); //set syncDir = SYNC_DIR_INT_CONFLICT - } - - void operator()(SymLinkMapping& linkObj) const - { - const CompareSymlinkResult cat = linkObj.getLinkCategory(); - - if (cat == SYMLINK_EQUAL) - return; - - if (cat == SYMLINK_LEFT_SIDE_ONLY) - linkObj.setSyncDir(SYNC_DIR_RIGHT); - else if (cat == SYMLINK_RIGHT_SIDE_ONLY) - linkObj.setSyncDir(SYNC_DIR_LEFT); - else - linkObj.setSyncDirConflict(txtFilterChanged); //set syncDir = SYNC_DIR_INT_CONFLICT - } - - void operator()(DirMapping& dirObj) const - { - switch (dirObj.getDirCategory()) - { - case DIR_LEFT_SIDE_ONLY: - dirObj.setSyncDir(SYNC_DIR_RIGHT); - break; - case DIR_RIGHT_SIDE_ONLY: - dirObj.setSyncDir(SYNC_DIR_LEFT); - break; - case DIR_EQUAL: - break; - } - - execute(dirObj); //recursion - } - - const wxString txtFilterChanged; -}; -*/ - -//test whether planned deletion of a directory is in conflict with (direct!) sub-elements that are not categorized for deletion (e.g. shall be copied or are in conflict themselves) -class FindDeleteDirConflictNonRec -{ -public: - bool conflictFound(const HierarchyObject& hierObj) const - { - return std::find_if(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), *this) != hierObj.refSubFiles().end() || //files - std::find_if(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), *this) != hierObj.refSubLinks().end() || //symlinks - std::find_if(hierObj.refSubDirs(). begin(), hierObj.refSubDirs(). end(), *this) != hierObj.refSubDirs(). end(); //directories - } - - //logical private! => __find_if (used by std::find_if) needs public access - bool operator()(const FileSystemObject& fsObj) const - { - switch (fsObj.getSyncOperation()) - { - case SO_CREATE_NEW_LEFT: - case SO_CREATE_NEW_RIGHT: - case SO_UNRESOLVED_CONFLICT: - return true; - - case SO_DELETE_LEFT: - case SO_DELETE_RIGHT: - case SO_OVERWRITE_LEFT: - case SO_OVERWRITE_RIGHT: - case SO_DO_NOTHING: - case SO_EQUAL: - case SO_COPY_METADATA_TO_LEFT: - case SO_COPY_METADATA_TO_RIGHT: - ; - } - return false; - } -}; - - //---------------------------------------------------------------------------------------------- class RedetermineAuto { @@ -557,15 +399,12 @@ public: RedetermineAuto(BaseDirMapping& baseDirectory, DeterminationProblem* handler) : txtBothSidesChanged(_("Both sides have changed since last synchronization!")), - txtNoSideChanged(wxString(_("Cannot determine sync-direction:")) + wxT(" \n") + _("No change since last synchronization!")), - txtFilterChanged(wxString(_("Cannot determine sync-direction:")) + wxT(" \n") + _("Filter settings have changed!")), - txtLastSyncFail(wxString(_("Cannot determine sync-direction:")) + wxT(" \n") + _("The file was not processed by last synchronization!")), - txtDirDeleteConflict(_("Planned directory deletion is in conflict with its subdirectories and -files!")), - // dbFilterLeft(NULL), - // dbFilterRight(NULL), + txtNoSideChanged(_("Cannot determine sync-direction:") + L" \n" + _("No change since last synchronization!")), + txtFilterChanged(_("Cannot determine sync-direction:") + L" \n" + _("Filter settings have changed!")), + txtLastSyncFail (_("Cannot determine sync-direction:") + L" \n" + _("The file was not processed by last synchronization!")), handler_(handler) { - if (AllElementsEqual()(baseDirectory)) //nothing to do: abort and don't show any nag-screens + if (allElementsEqual(baseDirectory)) //nothing to do: abort and don't show any nag-screens return; //try to load sync-database files @@ -642,26 +481,20 @@ private: } */ - template<typename Iterator, typename Function> - friend Function std::for_each(Iterator, Iterator, Function); - - void execute(HierarchyObject& hierObj, const DirContainer* dbDirectoryLeft, const DirContainer* dbDirectoryRight) { - //process files std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), - boost::bind(&RedetermineAuto::processFile, this, _1, dbDirectoryLeft, dbDirectoryRight)); - //process symbolic links + [&](FileMapping& fileMap) { processFile(fileMap, dbDirectoryLeft, dbDirectoryRight); }); + std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), - boost::bind(&RedetermineAuto::processSymlink, this, _1, dbDirectoryLeft, dbDirectoryRight)); - //process directories + [&](SymLinkMapping& linkMap) { processSymlink(linkMap, dbDirectoryLeft, dbDirectoryRight); }); + std::for_each(hierObj.refSubDirs().begin(), hierObj.refSubDirs().end(), - boost::bind(&RedetermineAuto::processDir, this, _1, dbDirectoryLeft, dbDirectoryRight)); + [&](DirMapping& dirMap) { processDir(dirMap, dbDirectoryLeft, dbDirectoryRight); }); } - void processFile(FileMapping& fileObj, const DirContainer* dbDirectoryLeft, const DirContainer* dbDirectoryRight) @@ -692,7 +525,7 @@ private: else if (cat == FILE_RIGHT_SIDE_ONLY) fileObj.setSyncDir(SYNC_DIR_LEFT); else - fileObj.setSyncDirConflict(txtFilterChanged); //set syncDir = SYNC_DIR_INT_CONFLICT + fileObj.setSyncDirConflict(txtFilterChanged); return; } */ @@ -713,7 +546,7 @@ private: if (changeOnLeft) { if (changeOnRight) - fileObj.setSyncDirConflict(txtBothSidesChanged); //set syncDir = SYNC_DIR_INT_CONFLICT + fileObj.setSyncDirConflict(txtBothSidesChanged); else fileObj.setSyncDir(SYNC_DIR_RIGHT); } @@ -722,13 +555,13 @@ private: if (changeOnRight) fileObj.setSyncDir(SYNC_DIR_LEFT); else - fileObj.setSyncDirConflict(txtNoSideChanged); //set syncDir = SYNC_DIR_INT_CONFLICT + fileObj.setSyncDirConflict(txtNoSideChanged); } } - else //object did not complete last sync + else //object did not complete last sync: important check: user may have changed comparison variant, so what was in sync according to last variant is not any longer! { if (changeOnLeft && changeOnRight) - fileObj.setSyncDirConflict(txtBothSidesChanged); //set syncDir = SYNC_DIR_INT_CONFLICT + fileObj.setSyncDirConflict(txtBothSidesChanged); else { // if (cat == FILE_LEFT_SIDE_ONLY) @@ -736,7 +569,7 @@ private: // else if (cat == FILE_RIGHT_SIDE_ONLY) // fileObj.setSyncDir(SYNC_DIR_LEFT); // else - fileObj.setSyncDirConflict(txtLastSyncFail); //set syncDir = SYNC_DIR_INT_CONFLICT + fileObj.setSyncDirConflict(txtLastSyncFail); } } } @@ -758,7 +591,7 @@ private: else if (cat == SYMLINK_RIGHT_SIDE_ONLY) linkObj.setSyncDir(SYNC_DIR_LEFT); else - linkObj.setSyncDirConflict(txtFilterChanged); //set syncDir = SYNC_DIR_INT_CONFLICT + linkObj.setSyncDirConflict(txtFilterChanged); return; } */ @@ -779,7 +612,7 @@ private: if (changeOnLeft) { if (changeOnRight) - linkObj.setSyncDirConflict(txtBothSidesChanged); //set syncDir = SYNC_DIR_INT_CONFLICT + linkObj.setSyncDirConflict(txtBothSidesChanged); else linkObj.setSyncDir(SYNC_DIR_RIGHT); } @@ -788,15 +621,15 @@ private: if (changeOnRight) linkObj.setSyncDir(SYNC_DIR_LEFT); else - linkObj.setSyncDirConflict(txtNoSideChanged); //set syncDir = SYNC_DIR_INT_CONFLICT + linkObj.setSyncDirConflict(txtNoSideChanged); } } else //object did not complete last sync { if (changeOnLeft && changeOnRight) - linkObj.setSyncDirConflict(txtBothSidesChanged); //set syncDir = SYNC_DIR_INT_CONFLICT + linkObj.setSyncDirConflict(txtBothSidesChanged); else - linkObj.setSyncDirConflict(txtLastSyncFail); //set syncDir = SYNC_DIR_INT_CONFLICT + linkObj.setSyncDirConflict(txtLastSyncFail); } } @@ -844,7 +677,7 @@ private: if (changeOnLeft) { if (changeOnRight) - dirObj.setSyncDirConflict(txtBothSidesChanged); //set syncDir = SYNC_DIR_INT_CONFLICT + dirObj.setSyncDirConflict(txtBothSidesChanged); else dirObj.setSyncDir(SYNC_DIR_RIGHT); } @@ -855,14 +688,14 @@ private: else { assert(false); - dirObj.setSyncDirConflict(txtNoSideChanged); //set syncDir = SYNC_DIR_INT_CONFLICT + dirObj.setSyncDirConflict(txtNoSideChanged); } } } else //object did not complete last sync { if (changeOnLeft && changeOnRight) - dirObj.setSyncDirConflict(txtBothSidesChanged); //set syncDir = SYNC_DIR_INT_CONFLICT + dirObj.setSyncDirConflict(txtBothSidesChanged); else { // switch (cat) @@ -877,29 +710,18 @@ private: // assert(false); // } - dirObj.setSyncDirConflict(txtLastSyncFail); //set syncDir = SYNC_DIR_INT_CONFLICT + dirObj.setSyncDirConflict(txtLastSyncFail); } } } execute(dirObj, dataDbLeftStuff.second, dataDbRightStuff.second); //recursion - //################################################################################################### - - //if a directory is to be deleted on one side, ensure that directions of sub-elements are "d’accord" - const SyncOperation syncOp = dirObj.getSyncOperation(); - if (syncOp == SO_DELETE_LEFT || - syncOp == SO_DELETE_RIGHT) - { - if (FindDeleteDirConflictNonRec().conflictFound(dirObj)) - dirObj.setSyncDirConflict(txtDirDeleteConflict); - } } - const wxString txtBothSidesChanged; - const wxString txtNoSideChanged; - const wxString txtFilterChanged; - const wxString txtLastSyncFail; - const wxString txtDirDeleteConflict; + const std::wstring txtBothSidesChanged; + const std::wstring txtNoSideChanged; + const std::wstring txtFilterChanged; + const std::wstring txtLastSyncFail; //const HardFilter* dbFilterLeft; //optional //const HardFilter* dbFilterRight; //optional @@ -909,13 +731,33 @@ private: //--------------------------------------------------------------------------------------------------------------- -void zen::redetermineSyncDirection(const SyncConfig& config, BaseDirMapping& baseDirectory, DeterminationProblem* handler) +std::vector<DirectionConfig> zen::extractDirectionCfg(const MainConfiguration& mainCfg) { - if (config.var == SyncConfig::AUTOMATIC) + //merge first and additional pairs + std::vector<FolderPairEnh> allPairs; + allPairs.push_back(mainCfg.firstPair); + allPairs.insert(allPairs.end(), + mainCfg.additionalPairs.begin(), //add additional pairs + mainCfg.additionalPairs.end()); + + std::vector<DirectionConfig> output; + std::for_each(allPairs.begin(), allPairs.end(), + [&](const FolderPairEnh& fp) + { + output.push_back(fp.altSyncConfig.get() ? fp.altSyncConfig->directionCfg : mainCfg.syncCfg.directionCfg); + }); + + return output; +} + + +void zen::redetermineSyncDirection(const DirectionConfig& directConfig, BaseDirMapping& baseDirectory, DeterminationProblem* handler) +{ + if (directConfig.var == DirectionConfig::AUTOMATIC) RedetermineAuto(baseDirectory, handler); else { - DirectionSet dirCfg = extractDirections(config); + DirectionSet dirCfg = extractDirections(directConfig); Redetermine(dirCfg).execute(baseDirectory); } } @@ -925,20 +767,16 @@ void zen::redetermineSyncDirection(const MainConfiguration& mainCfg, FolderCompa { if (folderCmp.size() == 0) return; - else if (folderCmp.size() != mainCfg.additionalPairs.size() + 1) - throw std::logic_error("Programming Error: Contract violation!"); - //merge first and additional pairs - std::vector<FolderPairEnh> allPairs; - allPairs.push_back(mainCfg.firstPair); - allPairs.insert(allPairs.end(), - mainCfg.additionalPairs.begin(), //add additional pairs - mainCfg.additionalPairs.end()); + std::vector<DirectionConfig> directCfgs = extractDirectionCfg(mainCfg); + + if (folderCmp.size() != directCfgs.size()) + throw std::logic_error("Programming Error: Contract violation!"); - for (std::vector<FolderPairEnh>::const_iterator i = allPairs.begin(); i != allPairs.end(); ++i) + for (auto iter = folderCmp.begin(); iter != folderCmp.end(); ++iter) { - redetermineSyncDirection(i->altSyncConfig.get() ? i->altSyncConfig->syncConfiguration : mainCfg.syncConfiguration, - folderCmp[i - allPairs.begin()], handler); + const DirectionConfig& cfg = directCfgs[iter - folderCmp.begin()]; + redetermineSyncDirection(cfg, **iter, handler); } } @@ -969,15 +807,11 @@ public: } private: - friend class util::ProxyForEach<const SetNewDirection>; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent! - void execute(HierarchyObject& hierObj) const { - util::ProxyForEach<const SetNewDirection> prx(*this); //grant std::for_each access to private parts of this class - - std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), prx); //process files - std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), prx); //process links - std::for_each(hierObj.refSubDirs().begin(), hierObj.refSubDirs().end(), prx); //process directories + std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FileMapping& fileMap) { (*this)(fileMap); }); + std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymLinkMapping& linkMap) { (*this)(linkMap); }); + std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirMapping& dirMap) { (*this)(dirMap); }); } const SyncDirection newDirection_; @@ -1024,16 +858,12 @@ public: void execute(zen::HierarchyObject& hierObj) const //don't create ambiguity by replacing with operator() { - util::ProxyForEach<const InOrExcludeAllRows<include> > prx(*this); //grant std::for_each access to private parts of this class - - std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), prx); //process files - std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), prx); //process links - std::for_each(hierObj.refSubDirs().begin(), hierObj.refSubDirs().end(), prx); //process directories + std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FileMapping& fileMap) { (*this)(fileMap); }); + std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymLinkMapping& linkMap) { (*this)(linkMap); }); + std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirMapping& dirMap) { (*this)(dirMap); }); } private: - friend class util::ProxyForEach<const InOrExcludeAllRows<include> >; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent! - void operator()(zen::FileMapping& fileObj) const { fileObj.setActive(include); @@ -1055,9 +885,9 @@ private: void zen::setActiveStatus(bool newStatus, zen::FolderComparison& folderCmp) { if (newStatus) - std::for_each(folderCmp.begin(), folderCmp.end(), InOrExcludeAllRows<true>()); //include all rows + std::for_each(begin(folderCmp), end(folderCmp), InOrExcludeAllRows<true>()); //include all rows else - std::for_each(folderCmp.begin(), folderCmp.end(), InOrExcludeAllRows<false>()); //exclude all rows + std::for_each(begin(folderCmp), end(folderCmp), InOrExcludeAllRows<false>()); //exclude all rows } @@ -1125,16 +955,12 @@ public: void execute(zen::HierarchyObject& hierObj) const { - util::ProxyForEach<const ApplyHardFilter> prx(*this); //grant std::for_each access to private parts of this class - - std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), prx); //files - std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), prx); //symlinks - std::for_each(hierObj.refSubDirs(). begin(), hierObj.refSubDirs(). end(), prx); //directories + std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FileMapping& fileMap) { (*this)(fileMap); }); + std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymLinkMapping& linkMap) { (*this)(linkMap); }); + std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirMapping& dirMap) { (*this)(dirMap); }); }; private: - friend class util::ProxyForEach<const ApplyHardFilter>; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent! - void operator()(zen::FileMapping& fileObj) const { if (Eval<strategy>().process(fileObj)) @@ -1171,7 +997,6 @@ template <> class ApplyHardFilter<STRATEGY_OR>; //usage of InOrExcludeAllRows doesn't allow for strategy "or" - template <FilterStrategy strategy> class ApplySoftFilter //falsify only! -> can run directly after "hard/base filter" { @@ -1180,16 +1005,12 @@ public: void execute(zen::HierarchyObject& hierObj) const { - util::ProxyForEach<const ApplySoftFilter> prx(*this); //grant std::for_each access to private parts of this class - - std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), prx); //files - std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), prx); //symlinks - std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs(). end(), prx); //directories + std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FileMapping& fileMap) { (*this)(fileMap); }); + std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymLinkMapping& linkMap) { (*this)(linkMap); }); + std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirMapping& dirMap) { (*this)(dirMap); }); }; private: - friend class util::ProxyForEach<const ApplySoftFilter>; //friend declaration of std::for_each is NOT sufficient as implementation is compiler dependent! - void operator()(zen::FileMapping& fileObj) const { if (Eval<strategy>().process(fileObj)) @@ -1280,7 +1101,7 @@ void zen::addSoftFiltering(BaseDirMapping& baseMap, const SoftFilter& timeSizeFi void zen::applyFiltering(FolderComparison& folderCmp, const MainConfiguration& mainCfg) { - if (folderCmp.size() == 0) + if (folderCmp.empty()) return; else if (folderCmp.size() != mainCfg.additionalPairs.size() + 1) throw std::logic_error("Programming Error: Contract violation!"); @@ -1293,11 +1114,11 @@ void zen::applyFiltering(FolderComparison& folderCmp, const MainConfiguration& m mainCfg.additionalPairs.end()); - for (std::vector<FolderPairEnh>::const_iterator i = allPairs.begin(); i != allPairs.end(); ++i) + for (auto iter = allPairs.begin(); iter != allPairs.end(); ++iter) { - BaseDirMapping& baseDirectory = folderCmp[i - allPairs.begin()]; + BaseDirMapping& baseDirectory = *folderCmp[iter - allPairs.begin()]; - const NormalizedFilter normFilter = normalizeFilters(mainCfg.globalFilter, i->localFilter); + const NormalizedFilter normFilter = normalizeFilters(mainCfg.globalFilter, iter->localFilter); //"set" hard filter ApplyHardFilter<STRATEGY_SET>(*normFilter.nameFilter).execute(baseDirectory); @@ -1308,11 +1129,75 @@ void zen::applyFiltering(FolderComparison& folderCmp, const MainConfiguration& m } +class FilterByTimeSpan +{ +public: + FilterByTimeSpan(const Int64& timeFrom, + const Int64& timeTo) : + timeFrom_(timeFrom), + timeTo_(timeTo) {} + + void execute(zen::HierarchyObject& hierObj) const + { + std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FileMapping& fileMap) { (*this)(fileMap); }); + std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymLinkMapping& linkMap) { (*this)(linkMap); }); + std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirMapping& dirMap) { (*this)(dirMap); }); + }; + +private: + void operator()(zen::FileMapping& fileObj) const + { + if (fileObj.isEmpty<LEFT_SIDE>()) + fileObj.setActive(matchTime<RIGHT_SIDE>(fileObj)); + else if (fileObj.isEmpty<RIGHT_SIDE>()) + fileObj.setActive(matchTime<LEFT_SIDE>(fileObj)); + else + fileObj.setActive(matchTime<RIGHT_SIDE>(fileObj) || + matchTime<LEFT_SIDE>(fileObj)); + } + + void operator()(zen::SymLinkMapping& linkObj) const + { + if (linkObj.isEmpty<LEFT_SIDE>()) + linkObj.setActive(matchTime<RIGHT_SIDE>(linkObj)); + else if (linkObj.isEmpty<RIGHT_SIDE>()) + linkObj.setActive(matchTime<LEFT_SIDE>(linkObj)); + else + linkObj.setActive(matchTime<RIGHT_SIDE>(linkObj) || + matchTime<LEFT_SIDE> (linkObj)); + } + + void operator()(zen::DirMapping& dirObj) const + { + dirObj.setActive(false); + execute(dirObj); //recursion + } + + template <SelectedSide side, class T> + bool matchTime(const T& obj) const + { + return timeFrom_ <= obj.template getLastWriteTime<side>() && + obj.template getLastWriteTime<side>() <= timeTo_; + } + + const Int64 timeFrom_; + const Int64 timeTo_; +}; + + +void zen::applyTimeSpanFilter(FolderComparison& folderCmp, const Int64& timeFrom, const Int64& timeTo) +{ + FilterByTimeSpan spanFilter(timeFrom, timeTo); + + std::for_each(begin(folderCmp), end(folderCmp), [&](BaseDirMapping& baseMap) { spanFilter.execute(baseMap); }); +} + + //############################################################################################################ std::pair<wxString, int> zen::deleteFromGridAndHDPreview( //assemble message containing all files to be deleted const std::vector<FileSystemObject*>& rowsToDeleteOnLeft, const std::vector<FileSystemObject*>& rowsToDeleteOnRight, - const bool deleteOnBothSides) + bool deleteOnBothSides) { //fast replacement for wxString modelling exponential growth typedef Zbase<wchar_t> zxString; //for use with UI texts @@ -1377,10 +1262,8 @@ struct RemoveCallbackImpl : public zen::CallbackRemoveDir { RemoveCallbackImpl(DeleteFilesHandler& deleteCallback) : deleteCallback_(deleteCallback) {} - virtual void notifyDeletion(const Zstring& currentObject) - { - deleteCallback_.notifyDeletion(currentObject); - } + virtual void notifyFileDeletion(const Zstring& filename) { deleteCallback_.notifyDeletion(filename); } + virtual void notifyDirDeletion (const Zstring& dirname) { deleteCallback_.notifyDeletion(dirname); } private: DeleteFilesHandler& deleteCallback_; @@ -1390,22 +1273,23 @@ private: template <SelectedSide side, class InputIterator> void deleteFromGridAndHDOneSide(InputIterator first, InputIterator last, - const bool useRecycleBin, + bool useRecycleBin, DeleteFilesHandler& statusHandler) { - for (InputIterator i = first; i != last; ++i) + for (auto iter = first; iter != last; ++iter) //VS 2010 bug prevents replacing this by std::for_each + lamba { + FileSystemObject& fsObj = **iter; //all pointers are required(!) to be bound + while (true) { try { - FileSystemObject* const fsObj = *i; //all pointers are required(!) to be bound - if (!fsObj->isEmpty<side>()) //element may become implicitly delted, e.g. if parent folder was deleted first + if (!fsObj.isEmpty<side>()) //element may become implicitly delted, e.g. if parent folder was deleted first { if (useRecycleBin) { - if (zen::moveToRecycleBin(fsObj->getFullName<side>())) //throw (FileError) - statusHandler.notifyDeletion(fsObj->getFullName<side>()); + if (zen::moveToRecycleBin(fsObj.getFullName<side>())) //throw FileError + statusHandler.notifyDeletion(fsObj.getFullName<side>()); } else { @@ -1419,7 +1303,7 @@ void deleteFromGridAndHDOneSide(InputIterator first, InputIterator last, virtual void visit(const FileMapping& fileObj) { if (zen::removeFile(fileObj.getFullName<side>())) - remCallback_.notifyDeletion(fileObj.getFullName<side>()); + remCallback_.notifyFileDeletion(fileObj.getFullName<side>()); } virtual void visit(const SymLinkMapping& linkObj) @@ -1431,7 +1315,7 @@ void deleteFromGridAndHDOneSide(InputIterator first, InputIterator last, break; case LinkDescriptor::TYPE_FILE: if (zen::removeFile(linkObj.getFullName<side>())) - remCallback_.notifyDeletion(linkObj.getFullName<side>()); + remCallback_.notifyFileDeletion(linkObj.getFullName<side>()); break; } } @@ -1444,16 +1328,10 @@ void deleteFromGridAndHDOneSide(InputIterator first, InputIterator last, private: RemoveCallbackImpl& remCallback_; } delPerm(removeCallback); - fsObj->accept(delPerm); + fsObj.accept(delPerm); } - fsObj->removeObject<side>(); //if directory: removes recursively! - - //update sync direction: as this is a synchronization tool, the user most likely wants to delete the other side, too! - if (side == LEFT_SIDE) - setSyncDirectionRec(SYNC_DIR_RIGHT, *fsObj); //set new direction (recursively) - else - setSyncDirectionRec(SYNC_DIR_LEFT, *fsObj); + fsObj.removeObject<side>(); //if directory: removes recursively! } break; } @@ -1474,40 +1352,39 @@ void deleteFromGridAndHDOneSide(InputIterator first, InputIterator last, } -void zen::deleteFromGridAndHD(FolderComparison& folderCmp, //attention: rows will be physically deleted! - std::vector<FileSystemObject*>& rowsToDeleteOnLeft, //refresh GUI grid after deletion to remove invalid rows +void zen::deleteFromGridAndHD(std::vector<FileSystemObject*>& rowsToDeleteOnLeft, //refresh GUI grid after deletion to remove invalid rows std::vector<FileSystemObject*>& rowsToDeleteOnRight, //all pointers need to be bound! - const bool deleteOnBothSides, - const bool useRecycleBin, + FolderComparison& folderCmp, //attention: rows will be physically deleted! + const std::vector<DirectionConfig>& directCfgs, + bool deleteOnBothSides, + bool useRecycleBin, DeleteFilesHandler& statusHandler) { + if (folderCmp.size() == 0) + return; + else if (folderCmp.size() != directCfgs.size()) + throw std::logic_error("Programming Error: Contract violation!"); + + //build up mapping from base directory to corresponding direction config + std::map<const BaseDirMapping*, DirectionConfig> baseDirCfgs; + for (auto iter = folderCmp.begin(); iter != folderCmp.end(); ++iter) + baseDirCfgs[&** iter] = directCfgs[iter - folderCmp.begin()]; + //ensure cleanup: redetermination of sync-directions and removal of invalid rows - Loki::ScopeGuard guardFinalizeDeletion = Loki::MakeGuard([&]() { std::for_each(folderCmp.begin(), folderCmp.end(), BaseDirMapping::removeEmpty); }); - (void) guardFinalizeDeletion; + LOKI_ON_BLOCK_EXIT2( std::for_each(begin(folderCmp), end(folderCmp), BaseDirMapping::removeEmpty); ); - std::set<FileSystemObject*> deleteLeft; - std::set<FileSystemObject*> deleteRight; + std::set<FileSystemObject*> deleteLeft (rowsToDeleteOnLeft .begin(), rowsToDeleteOnLeft .end()); + std::set<FileSystemObject*> deleteRight(rowsToDeleteOnRight.begin(), rowsToDeleteOnRight.end()); if (deleteOnBothSides) { - //mix selected rows from left and right (and remove duplicates) - std::set<FileSystemObject*> tmp(rowsToDeleteOnLeft.begin(), rowsToDeleteOnLeft.end()); - tmp.insert(rowsToDeleteOnRight.begin(), rowsToDeleteOnRight.end()); - - std::remove_copy_if(tmp.begin(), tmp.end(), - std::inserter(deleteLeft, deleteLeft.begin()), std::mem_fun(&FileSystemObject::isEmpty<LEFT_SIDE>)); //remove empty rows to ensure correct statistics - - std::remove_copy_if(tmp.begin(), tmp.end(), - std::inserter(deleteRight, deleteRight.begin()), std::mem_fun(&FileSystemObject::isEmpty<RIGHT_SIDE>)); + deleteLeft.insert(deleteRight.begin(), deleteRight.end()); + deleteRight = deleteLeft; } - else - { - std::remove_copy_if(rowsToDeleteOnLeft.begin(), rowsToDeleteOnLeft.end(), - std::inserter(deleteLeft, deleteLeft.begin()), std::mem_fun(&FileSystemObject::isEmpty<LEFT_SIDE>)); //remove empty rows to ensure correct statistics - std::remove_copy_if(rowsToDeleteOnRight.begin(), rowsToDeleteOnRight.end(), - std::inserter(deleteRight, deleteRight.begin()), std::mem_fun(&FileSystemObject::isEmpty<RIGHT_SIDE>)); - } + set_remove_if(deleteLeft, std::mem_fun(&FileSystemObject::isEmpty<LEFT_SIDE>)); //remove empty rows to ensure correct statistics + set_remove_if(deleteRight, std::mem_fun(&FileSystemObject::isEmpty<RIGHT_SIDE>)); // + deleteFromGridAndHDOneSide<LEFT_SIDE>(deleteLeft.begin(), deleteLeft.end(), useRecycleBin, @@ -1516,6 +1393,36 @@ void zen::deleteFromGridAndHD(FolderComparison& folderCmp, deleteFromGridAndHDOneSide<RIGHT_SIDE>(deleteRight.begin(), deleteRight.end(), useRecycleBin, statusHandler); + + //update sync direction: we cannot do a full redetermination since the user may have committed manual changes + std::set<FileSystemObject*> deletedTotal = deleteLeft; + deletedTotal.insert(deleteRight.begin(), deleteRight.end()); + + for (auto iter = deletedTotal.begin(); iter != deletedTotal.end(); ++iter) + { + FileSystemObject& fsObj = **iter; //all pointers are required(!) to be bound + + if (fsObj.isEmpty<LEFT_SIDE>() != fsObj.isEmpty<RIGHT_SIDE>()) //make sure objects exists on one side only + { + auto cfgIter = baseDirCfgs.find(&fsObj.root()); + if (cfgIter != baseDirCfgs.end()) + { + SyncDirection newDir = SYNC_DIR_NONE; + + if (cfgIter->second.var == DirectionConfig::AUTOMATIC) + newDir = fsObj.isEmpty<LEFT_SIDE>() ? SYNC_DIR_RIGHT : SYNC_DIR_LEFT; + else + { + DirectionSet dirCfg = extractDirections(cfgIter->second); + newDir = fsObj.isEmpty<LEFT_SIDE>() ? dirCfg.exRightSideOnly : dirCfg.exLeftSideOnly; + } + + setSyncDirectionRec(newDir, fsObj); //set new direction (recursively) + } + else + assert(!"this should not happen!"); + } + } } diff --git a/algorithm.h b/algorithm.h index 16bb11eb..f85d1639 100644 --- a/algorithm.h +++ b/algorithm.h @@ -8,12 +8,10 @@ #define ALGORITHM_H_INCLUDED #include "file_hierarchy.h" - +#include "library/soft_filter.h" namespace zen { -class SoftFilter; - void swapGrids(const MainConfiguration& config, FolderComparison& folderCmp); struct DeterminationProblem //callback @@ -21,7 +19,9 @@ struct DeterminationProblem //callback virtual ~DeterminationProblem() {} virtual void reportWarning(const wxString& text) = 0; }; -void redetermineSyncDirection(const SyncConfig& config, BaseDirMapping& baseDirectory, DeterminationProblem* handler); //handler may be NULL +std::vector<DirectionConfig> extractDirectionCfg(const MainConfiguration& mainCfg); + +void redetermineSyncDirection(const DirectionConfig& directConfig, BaseDirMapping& baseDirectory, DeterminationProblem* handler); //handler may be NULL void redetermineSyncDirection(const MainConfiguration& mainCfg, FolderComparison& folderCmp, DeterminationProblem* handler); void setSyncDirectionRec(SyncDirection newDirection, FileSystemObject& fsObj); //set new direction (recursively) @@ -33,6 +33,8 @@ void applyFiltering (FolderComparison& folderCmp, const MainConfiguration& main void addHardFiltering(BaseDirMapping& baseMap, const Zstring& excludeFilter); //exclude additional entries only void addSoftFiltering(BaseDirMapping& baseMap, const SoftFilter& timeSizeFilter); //exclude additional entries only +void applyTimeSpanFilter(FolderComparison& folderCmp, const Int64& timeFrom, const Int64& timeTo); //overwrite current active/inactive settings + void setActiveStatus(bool newStatus, FolderComparison& folderCmp); //activate or deactivate all rows void setActiveStatus(bool newStatus, FileSystemObject& fsObj); //activate or deactivate row: (not recursively anymore) @@ -41,7 +43,7 @@ void setActiveStatus(bool newStatus, FileSystemObject& fsObj); //activate or std::pair<wxString, int> deleteFromGridAndHDPreview( //returns wxString with elements to be deleted and total count of selected(!) objects, NOT total files/dirs! const std::vector<FileSystemObject*>& rowsToDeleteOnLeft, //all pointers need to be bound! const std::vector<FileSystemObject*>& rowsToDeleteOnRight, // - const bool deleteOnBothSides); + bool deleteOnBothSides); class DeleteFilesHandler { @@ -59,11 +61,12 @@ public: //virtual void totalFilesToDelete(int objectsTotal) = 0; //informs about the total number of files to be deleted virtual void notifyDeletion(const Zstring& currentObject) = 0; //called for each file/folder that has been deleted }; -void deleteFromGridAndHD(FolderComparison& folderCmp, //attention: rows will be physically deleted! - std::vector<FileSystemObject*>& rowsToDeleteOnLeft, //refresh GUI grid after deletion to remove invalid rows +void deleteFromGridAndHD(std::vector<FileSystemObject*>& rowsToDeleteOnLeft, //refresh GUI grid after deletion to remove invalid rows std::vector<FileSystemObject*>& rowsToDeleteOnRight, //all pointers need to be bound! - const bool deleteOnBothSides, - const bool useRecycleBin, + FolderComparison& folderCmp, //attention: rows will be physically deleted! + const std::vector<DirectionConfig>& directCfgs, + bool deleteOnBothSides, + bool useRecycleBin, DeleteFilesHandler& statusHandler); } diff --git a/comparison.cpp b/comparison.cpp index 808874fe..33bc3548 100644 --- a/comparison.cpp +++ b/comparison.cpp @@ -39,9 +39,13 @@ std::vector<FolderPairCfg> zen::extractCompareCfg(const MainConfiguration& mainC { return FolderPairCfg(getFormattedDirectoryName(enhPair.leftDirectory), //ensure they end with FILE_NAME_SEPARATOR and replace macros getFormattedDirectoryName(enhPair.rightDirectory), + + enhPair.altCmpConfig.get() ? enhPair.altCmpConfig->compareVar : mainCfg.cmpConfig.compareVar, + enhPair.altCmpConfig.get() ? enhPair.altCmpConfig->handleSymlinks : mainCfg.cmpConfig.handleSymlinks, + normalizeFilters(mainCfg.globalFilter, enhPair.localFilter), - mainCfg.handleSymlinks, - enhPair.altSyncConfig.get() ? enhPair.altSyncConfig->syncConfiguration : mainCfg.syncConfiguration); + + enhPair.altSyncConfig.get() ? enhPair.altSyncConfig->directionCfg : mainCfg.syncCfg.directionCfg); }); return output; } @@ -84,16 +88,15 @@ void checkForIncompleteInput(const std::vector<FolderPairCfg>& folderPairsForm, } -void checkDirectoryExistence(const std::set<Zstring, LessFilename>& dirnames, ProcessCallback& procCallback) +void checkDirectoryExistence(const std::set<Zstring, LessFilename>& dirnames, + std::set<Zstring, LessFilename>& dirnamesExisting, + ProcessCallback& procCallback) { std::for_each(dirnames.begin(), dirnames.end(), [&](const Zstring& dirname) { - std::wstring statusText = _("Searching for directory %x..."); - replace(statusText, L"%x", std::wstring(L"\"") + dirname + L"\"", false); - procCallback.reportInfo(statusText); - if (!dirname.empty()) + { while (!dirExistsUpdating(dirname, procCallback)) { const std::wstring additionalInfo = _("You can ignore this error to consider the directory as empty."); @@ -101,12 +104,15 @@ void checkDirectoryExistence(const std::set<Zstring, LessFilename>& dirnames, Pr ProcessCallback::Response rv = procCallback.reportError(errorMessage + "\n\n" + additionalInfo /* + " " + getLastErrorFormatted()*/); if (rv == ProcessCallback::IGNORE_ERROR) - break; + return; else if (rv == ProcessCallback::RETRY) ; //continue with loop else throw std::logic_error("Programming Error: Unknown return value! (2)"); } + + dirnamesExisting.insert(dirname); + } }); } @@ -205,12 +211,7 @@ CompareProcess::CompareProcess(size_t fileTimeTol, txtComparingContentOfFiles(toZ(_("Comparing content of files %x")).Replace(Zstr("%x"), Zstr("\n\"%x\""), false)) {} -CompareProcess::~CompareProcess() {} //std::auto_ptr does not work with forward declarations (Or we need a non-inline ~CompareProcess())! - - -void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& directoryPairs, - const CompareVariant cmpVar, - FolderComparison& output) +void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& cfgList, FolderComparison& output) { /* #ifdef NDEBUG @@ -225,22 +226,26 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& direc //-------------------some basic checks:------------------------------------------ - checkForIncompleteInput(directoryPairs, procCallback); + checkForIncompleteInput(cfgList, procCallback); - std::set<Zstring, LessFilename> dirnames; - std::for_each(directoryPairs.begin(), directoryPairs.end(), - [&](const FolderPairCfg& fpCfg) + std::set<Zstring, LessFilename> dirnamesExisting; //list of directories that are *expected* to be existent (and need to be scanned)! { - dirnames.insert(fpCfg.leftDirectoryFmt); - dirnames.insert(fpCfg.rightDirectoryFmt); - }); + std::set<Zstring, LessFilename> dirnames; + std::for_each(cfgList.begin(), cfgList.end(), + [&](const FolderPairCfg& fpCfg) + { + dirnames.insert(fpCfg.leftDirectoryFmt); + dirnames.insert(fpCfg.rightDirectoryFmt); + }); + checkDirectoryExistence(dirnames, dirnamesExisting, procCallback); + } + auto dirAvailable = [&](const Zstring& dirnameFmt) { return dirnamesExisting.find(dirnameFmt) != dirnamesExisting.end(); }; - checkDirectoryExistence(dirnames, procCallback); { //check if folders have dependencies - wxString warningMessage = checkFolderDependency(directoryPairs); + wxString warningMessage = checkFolderDependency(cfgList); if (!warningMessage.empty()) procCallback.reportWarning(warningMessage.c_str(), m_warnings.warningDependentFolders); } @@ -253,11 +258,13 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& direc //------------------- fill directory buffer --------------------------------------------------- std::set<DirectoryKey> keysToRead; - std::for_each(directoryPairs.begin(), directoryPairs.end(), + std::for_each(cfgList.begin(), cfgList.end(), [&](const FolderPairCfg& fpCfg) { - keysToRead.insert(DirectoryKey(fpCfg.leftDirectoryFmt, fpCfg.filter.nameFilter, fpCfg.handleSymlinks)); - keysToRead.insert(DirectoryKey(fpCfg.rightDirectoryFmt, fpCfg.filter.nameFilter, fpCfg.handleSymlinks)); + if (dirAvailable(fpCfg.leftDirectoryFmt)) //only request *currently existing * directories: at this point user is aware that non-ex + empty string are seen as empty folder! + keysToRead.insert(DirectoryKey(fpCfg.leftDirectoryFmt, fpCfg.filter.nameFilter, fpCfg.handleSymlinks)); + if (dirAvailable(fpCfg.rightDirectoryFmt)) + keysToRead.insert(DirectoryKey(fpCfg.rightDirectoryFmt, fpCfg.filter.nameFilter, fpCfg.handleSymlinks)); }); class CbImpl : public FillBufferCallback @@ -272,8 +279,8 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& direc procCallback_.updateProcessedData(itemTotal - itemsReported, 0); //processed data is communicated in subfunctions! itemsReported = itemTotal; - procCallback_.reportInfo(statusMsg); //may throw - //procCallback_.requestUiRefresh(); //already called by reportInfo() + procCallback_.reportStatus(statusMsg); //may throw + //procCallback_.requestUiRefresh(); //already called by reportStatus() } virtual HandleError reportError(const std::wstring& errorText) @@ -308,22 +315,38 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& direc //traverse/process folders FolderComparison output_tmp; //write to output not before END of process! - switch (cmpVar) + + + //buffer "config"/"result of binary comparison" for latter processing as a single block + std::vector<std::pair<FolderPairCfg, BaseDirMapping*>> workLoadBinary; + + std::for_each(cfgList.begin(), cfgList.end(), + [&](const FolderPairCfg& fpCfg) { - case CMP_BY_TIME_SIZE: - compareByTimeSize(directoryPairs, output_tmp); - break; - case CMP_BY_CONTENT: - compareByContent(directoryPairs, output_tmp); - break; - } + output_tmp.push_back(std::make_shared<BaseDirMapping>(fpCfg.leftDirectoryFmt, + dirAvailable(fpCfg.leftDirectoryFmt), + fpCfg.rightDirectoryFmt, + dirAvailable(fpCfg.rightDirectoryFmt), + fpCfg.filter.nameFilter)); + switch (fpCfg.compareVar) + { + case CMP_BY_TIME_SIZE: + compareByTimeSize(fpCfg, *output_tmp.back()); + break; + case CMP_BY_CONTENT: + workLoadBinary.push_back(std::make_pair(fpCfg, &*output_tmp.back())); + break; + } + }); + //process binary comparison in one block + compareByContent(workLoadBinary); - assert (output_tmp.size() == directoryPairs.size()); + assert(output_tmp.size() == cfgList.size()); - for (FolderComparison::iterator j = output_tmp.begin(); j != output_tmp.end(); ++j) + for (auto j = begin(output_tmp); j != end(output_tmp); ++j) { - const FolderPairCfg& fpCfg = directoryPairs[j - output_tmp.begin()]; + const FolderPairCfg& fpCfg = cfgList[j - output_tmp.begin()]; //set initial sync-direction class RedetermineCallback : public DeterminationProblem @@ -342,7 +365,7 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& direc ProcessCallback& procCallback_; } redetCallback(m_warnings.warningSyncDatabase, procCallback); - zen::redetermineSyncDirection(fpCfg.syncConfiguration, *j, &redetCallback); + zen::redetermineSyncDirection(fpCfg.directionCfg, *j, &redetCallback); } //only if everything was processed correctly output is written to! @@ -362,12 +385,12 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& direc //--------------------assemble conflict descriptions--------------------------- //check for very old dates or date2s in the future -wxString getConflictInvalidDate(const Zstring& fileNameFull, Int64 utcTime) +std::wstring getConflictInvalidDate(const Zstring& fileNameFull, Int64 utcTime) { - wxString msg = _("File %x has an invalid date!"); - replace(msg, L"%x", wxString(L"\"") + fileNameFull + "\""); - msg += wxString(L"\n\n") + _("Date") + ": " + utcTimeToLocalString(utcTime); - return wxString(_("Conflict detected:")) + "\n" + msg; + std::wstring msg = _("File %x has an invalid date!"); + replace(msg, L"%x", std::wstring(L"\"") + fileNameFull + "\""); + msg += L"\n\n" + _("Date") + ": " + utcTimeToLocalString(utcTime); + return _("Conflict detected:") + "\n" + msg; } @@ -384,22 +407,14 @@ void makeSameLength(wxString& first, wxString& second) //check for changed files with same modification date -wxString getConflictSameDateDiffSize(const FileMapping& fileObj) +std::wstring getConflictSameDateDiffSize(const FileMapping& fileObj) { - //some beautification... - // wxString left = wxString(_("Left")) + wxT(": "); - // wxString right = wxString(_("Right")) + wxT(": "); - // makeSameLength(left, right); - - const wxString left = wxT("<-- "); - const wxString right = wxT("--> "); - - wxString msg = _("Files %x have the same date but a different size!"); + std::wstring msg = _("Files %x have the same date but a different size!"); replace(msg, wxT("%x"), wxString(wxT("\"")) + fileObj.getRelativeName<LEFT_SIDE>() + "\""); msg += L"\n\n"; - msg += left + "\t" + _("Date") + ": " + utcTimeToLocalString(fileObj.getLastWriteTime<LEFT_SIDE>()) + + msg += L"<-- \t" + _("Date") + ": " + utcTimeToLocalString(fileObj.getLastWriteTime<LEFT_SIDE>()) + " \t" + _("Size") + ": " + toStringSep(fileObj.getFileSize<LEFT_SIDE>()) + wxT("\n"); - msg += right + "\t" + _("Date") + ": " + utcTimeToLocalString(fileObj.getLastWriteTime<RIGHT_SIDE>()) + + msg += L"--> \t" + _("Date") + ": " + utcTimeToLocalString(fileObj.getLastWriteTime<RIGHT_SIDE>()) + " \t" + _("Size") + ": " + toStringSep(fileObj.getFileSize<RIGHT_SIDE>()); return _("Conflict detected:") + "\n" + msg; } @@ -445,8 +460,8 @@ void CompareProcess::categorizeSymlinkByTime(SymLinkMapping& linkObj) const } else { - wxString conflictMsg = _("Conflict detected:") + "\n" + _("Symlinks %x have the same date but a different target!"); - replace(conflictMsg, L"%x", wxString(L"\"") + linkObj.getRelativeName<LEFT_SIDE>() + "\""); + std::wstring conflictMsg = _("Conflict detected:") + "\n" + _("Symlinks %x have the same date but a different target!"); + replace(conflictMsg, L"%x", std::wstring(L"\"") + linkObj.getRelativeName<LEFT_SIDE>() + "\""); linkObj.setCategoryConflict(conflictMsg); } break; @@ -470,67 +485,55 @@ void CompareProcess::categorizeSymlinkByTime(SymLinkMapping& linkObj) const } -void CompareProcess::compareByTimeSize(const std::vector<FolderPairCfg>& directoryPairs, FolderComparison& output) +void CompareProcess::compareByTimeSize(const FolderPairCfg& fpConfig, BaseDirMapping& output) { - output.reserve(output.size() + directoryPairs.size()); - - //process one folder pair after each other - for (std::vector<FolderPairCfg>::const_iterator pair = directoryPairs.begin(); pair != directoryPairs.end(); ++pair) - { - BaseDirMapping newEntry(pair->leftDirectoryFmt, - pair->rightDirectoryFmt, - pair->filter.nameFilter); - output.push_back(newEntry); //attention: push_back() copies by value!!! performance: append BEFORE writing values into fileCmp! - - //do basis scan and retrieve files existing on both sides as "compareCandidates" - std::vector<FileMapping*> uncategorizedFiles; - std::vector<SymLinkMapping*> uncategorizedLinks; - performComparison(*pair, output.back(), uncategorizedFiles, uncategorizedLinks); + //do basis scan and retrieve files existing on both sides as "compareCandidates" + std::vector<FileMapping*> uncategorizedFiles; + std::vector<SymLinkMapping*> uncategorizedLinks; + performComparison(fpConfig, output, uncategorizedFiles, uncategorizedLinks); - //finish symlink categorization - std::for_each(uncategorizedLinks.begin(), uncategorizedLinks.end(), - [&](SymLinkMapping* linkMap) { this->categorizeSymlinkByTime(*linkMap); }); + //finish symlink categorization + std::for_each(uncategorizedLinks.begin(), uncategorizedLinks.end(), + [&](SymLinkMapping* linkMap) { this->categorizeSymlinkByTime(*linkMap); }); - //categorize files that exist on both sides - const CmpFileTime timeCmp(fileTimeTolerance); + //categorize files that exist on both sides + const CmpFileTime timeCmp(fileTimeTolerance); - for (std::vector<FileMapping*>::iterator i = uncategorizedFiles.begin(); i != uncategorizedFiles.end(); ++i) + std::for_each(uncategorizedFiles.begin(), uncategorizedFiles.end(), + [&](FileMapping* fileObj) + { + switch (timeCmp.getResult(fileObj->getLastWriteTime<LEFT_SIDE>(), + fileObj->getLastWriteTime<RIGHT_SIDE>())) { - FileMapping* const line = *i; - - switch (timeCmp.getResult(line->getLastWriteTime<LEFT_SIDE>(), - line->getLastWriteTime<RIGHT_SIDE>())) - { - case CmpFileTime::TIME_EQUAL: - if (line->getFileSize<LEFT_SIDE>() == line->getFileSize<RIGHT_SIDE>()) - { - if (line->getShortName<LEFT_SIDE>() == line->getShortName<RIGHT_SIDE>()) - line->setCategory<FILE_EQUAL>(); - else - line->setCategory<FILE_DIFFERENT_METADATA>(); - } + case CmpFileTime::TIME_EQUAL: + if (fileObj->getFileSize<LEFT_SIDE>() == fileObj->getFileSize<RIGHT_SIDE>()) + { + if (fileObj->getShortName<LEFT_SIDE>() == fileObj->getShortName<RIGHT_SIDE>()) + fileObj->setCategory<FILE_EQUAL>(); else - line->setCategoryConflict(getConflictSameDateDiffSize(*line)); //same date, different filesize - break; + fileObj->setCategory<FILE_DIFFERENT_METADATA>(); + } + else + fileObj->setCategoryConflict(getConflictSameDateDiffSize(*fileObj)); //same date, different filesize + break; - case CmpFileTime::TIME_LEFT_NEWER: - line->setCategory<FILE_LEFT_NEWER>(); - break; + case CmpFileTime::TIME_LEFT_NEWER: + fileObj->setCategory<FILE_LEFT_NEWER>(); + break; - case CmpFileTime::TIME_RIGHT_NEWER: - line->setCategory<FILE_RIGHT_NEWER>(); - break; + case CmpFileTime::TIME_RIGHT_NEWER: + fileObj->setCategory<FILE_RIGHT_NEWER>(); + break; - case CmpFileTime::TIME_LEFT_INVALID: - line->setCategoryConflict(getConflictInvalidDate(line->getFullName<LEFT_SIDE>(), line->getLastWriteTime<LEFT_SIDE>())); - break; + case CmpFileTime::TIME_LEFT_INVALID: + fileObj->setCategoryConflict(getConflictInvalidDate(fileObj->getFullName<LEFT_SIDE>(), fileObj->getLastWriteTime<LEFT_SIDE>())); + break; - case CmpFileTime::TIME_RIGHT_INVALID: - line->setCategoryConflict(getConflictInvalidDate(line->getFullName<RIGHT_SIDE>(), line->getLastWriteTime<RIGHT_SIDE>())); - break; - } + case CmpFileTime::TIME_RIGHT_INVALID: + fileObj->setCategoryConflict(getConflictInvalidDate(fileObj->getFullName<RIGHT_SIDE>(), fileObj->getLastWriteTime<RIGHT_SIDE>())); + break; } - } + }); } @@ -538,7 +541,7 @@ UInt64 getBytesToCompare(const std::vector<FileMapping*>& rowsToCompare) { UInt64 dataTotal; - for (std::vector<FileMapping*>::const_iterator j = rowsToCompare.begin(); j != rowsToCompare.end(); ++j) + for (auto j = rowsToCompare.begin(); j != rowsToCompare.end(); ++j) dataTotal += (*j)->getFileSize<LEFT_SIDE>(); //left and right filesizes should be the same return dataTotal * 2U; @@ -569,25 +572,20 @@ void CompareProcess::categorizeSymlinkByContent(SymLinkMapping& linkObj) const } -void CompareProcess::compareByContent(const std::vector<FolderPairCfg>& directoryPairs, FolderComparison& output) +void CompareProcess::compareByContent(std::vector<std::pair<FolderPairCfg, BaseDirMapping*>>& workLoad) { - //PERF_START; - std::vector<FileMapping*> compareCandidates; + if (workLoad.empty()) return; - //attention: make sure pointers in "compareCandidates" remain valid!!! - output.reserve(output.size() + directoryPairs.size()); + //PERF_START; + std::vector<FileMapping*> undefinedFiles; //process one folder pair after each other - for (std::vector<FolderPairCfg>::const_iterator pair = directoryPairs.begin(); pair != directoryPairs.end(); ++pair) + for (auto workItem = workLoad.begin(); workItem != workLoad.end(); ++workItem) { - BaseDirMapping newEntry(pair->leftDirectoryFmt, - pair->rightDirectoryFmt, - pair->filter.nameFilter); - output.push_back(newEntry); //attention: push_back() copies by value!!! performance: append BEFORE writing values into fileCmp! - std::vector<SymLinkMapping*> uncategorizedLinks; //do basis scan and retrieve candidates for binary comparison (files existing on both sides) - performComparison(*pair, output.back(), compareCandidates, uncategorizedLinks); + + performComparison(workItem->first, *workItem->second, undefinedFiles, uncategorizedLinks); //finish symlink categorization std::for_each(uncategorizedLinks.begin(), uncategorizedLinks.end(), @@ -600,19 +598,18 @@ void CompareProcess::compareByContent(const std::vector<FolderPairCfg>& director //content comparison of file content happens AFTER finding corresponding files //in order to separate into two processes (scanning and comparing) - for (std::vector<FileMapping*>::iterator i = compareCandidates.begin(); i != compareCandidates.end(); ++i) + std::for_each(undefinedFiles.begin(), undefinedFiles.end(), + [&](FileMapping* fileObj) { //pre-check: files have different content if they have a different filesize - if ((*i)->getFileSize<LEFT_SIDE>() != (*i)->getFileSize<RIGHT_SIDE>()) - (*i)->setCategory<FILE_DIFFERENT>(); + if (fileObj->getFileSize<LEFT_SIDE>() != fileObj->getFileSize<RIGHT_SIDE>()) + fileObj->setCategory<FILE_DIFFERENT>(); else - filesToCompareBytewise.push_back(*i); - } - - + filesToCompareBytewise.push_back(fileObj); + }); - const size_t objectsTotal = filesToCompareBytewise.size() * 2; - const UInt64 bytesTotal = getBytesToCompare(filesToCompareBytewise); + const size_t objectsTotal = filesToCompareBytewise.size() * 2; + const UInt64 bytesTotal = getBytesToCompare(filesToCompareBytewise); procCallback.initNewProcess(static_cast<int>(objectsTotal), to<Int64>(bytesTotal), @@ -621,33 +618,32 @@ void CompareProcess::compareByContent(const std::vector<FolderPairCfg>& director const CmpFileTime timeCmp(fileTimeTolerance); //compare files (that have same size) bytewise... - for (std::vector<FileMapping*>::const_iterator j = filesToCompareBytewise.begin(); j != filesToCompareBytewise.end(); ++j) + std::for_each(filesToCompareBytewise.begin(), filesToCompareBytewise.end(), + [&](FileMapping* fileObj) { - FileMapping* const line = *j; - Zstring statusText = txtComparingContentOfFiles; - statusText.Replace(Zstr("%x"), line->getRelativeName<LEFT_SIDE>(), false); - procCallback.reportInfo(utf8CvrtTo<wxString>(statusText)); + statusText.Replace(Zstr("%x"), fileObj->getRelativeName<LEFT_SIDE>(), false); + procCallback.reportStatus(utf8CvrtTo<wxString>(statusText)); //check files that exist in left and right model but have different content while (true) { try { - if (filesHaveSameContentUpdating(line->getFullName<LEFT_SIDE>(), - line->getFullName<RIGHT_SIDE>(), - line->getFileSize<LEFT_SIDE>() * 2U, + if (filesHaveSameContentUpdating(fileObj->getFullName<LEFT_SIDE>(), + fileObj->getFullName<RIGHT_SIDE>(), + fileObj->getFileSize<LEFT_SIDE>() * 2U, procCallback)) { - if (line->getShortName<LEFT_SIDE>() == line->getShortName<RIGHT_SIDE>() && - timeCmp.getResult(line->getLastWriteTime<LEFT_SIDE>(), - line->getLastWriteTime<RIGHT_SIDE>()) == CmpFileTime::TIME_EQUAL) - line->setCategory<FILE_EQUAL>(); + if (fileObj->getShortName<LEFT_SIDE>() == fileObj->getShortName<RIGHT_SIDE>() && + timeCmp.getResult(fileObj->getLastWriteTime<LEFT_SIDE>(), + fileObj->getLastWriteTime<RIGHT_SIDE>()) == CmpFileTime::TIME_EQUAL) + fileObj->setCategory<FILE_EQUAL>(); else - line->setCategory<FILE_DIFFERENT_METADATA>(); + fileObj->setCategory<FILE_DIFFERENT_METADATA>(); } else - line->setCategory<FILE_DIFFERENT>(); + fileObj->setCategory<FILE_DIFFERENT>(); procCallback.updateProcessedData(2, 0); //processed data is communicated in subfunctions! procCallback.requestUiRefresh(); //may throw @@ -658,7 +654,7 @@ void CompareProcess::compareByContent(const std::vector<FolderPairCfg>& director ProcessCallback::Response rv = procCallback.reportError(error.msg()); if (rv == ProcessCallback::IGNORE_ERROR) { - line->setCategoryConflict(wxString(_("Conflict detected:")) + wxT("\n") + _("Comparing files by content failed.")); + fileObj->setCategoryConflict(_("Conflict detected:") + L"\n" + _("Comparing files by content failed.")); break; } @@ -668,7 +664,7 @@ void CompareProcess::compareByContent(const std::vector<FolderPairCfg>& director throw std::logic_error("Programming Error: Unknown return value!"); } } - } + }); } @@ -696,11 +692,6 @@ private: template <> void MergeSides::fillOneSide<LEFT_SIDE>(const DirContainer& dirCont, HierarchyObject& output) { - //reserve() fulfills one task here: massive performance improvement! - output.refSubFiles().reserve(dirCont.files.size()); - output.refSubDirs(). reserve(dirCont.dirs. size()); - output.refSubLinks().reserve(dirCont.links.size()); - for (DirContainer::FileList::const_iterator i = dirCont.files.begin(); i != dirCont.files.end(); ++i) output.addSubFile(i->second, i->first); @@ -718,11 +709,6 @@ void MergeSides::fillOneSide<LEFT_SIDE>(const DirContainer& dirCont, HierarchyOb template <> void MergeSides::fillOneSide<RIGHT_SIDE>(const DirContainer& dirCont, HierarchyObject& output) { - //reserve() fulfills one task here: massive performance improvement! - output.refSubFiles().reserve(dirCont.files.size()); - output.refSubDirs ().reserve(dirCont.dirs. size()); - output.refSubLinks().reserve(dirCont.links.size()); - for (DirContainer::FileList::const_iterator i = dirCont.files.begin(); i != dirCont.files.end(); ++i) output.addSubFile(i->first, i->second); @@ -737,120 +723,127 @@ void MergeSides::fillOneSide<RIGHT_SIDE>(const DirContainer& dirCont, HierarchyO } -void MergeSides::execute(const DirContainer& leftSide, const DirContainer& rightSide, HierarchyObject& output) +//improve merge-perf by over 70% + more natural default sequence +template <class MapType, class ProcessLeftOnly, class ProcessRightOnly, class ProcessBoth> inline +void linearMerge(const MapType& mapLeft, const MapType& mapRight, ProcessLeftOnly lo, ProcessRightOnly ro, ProcessBoth bo) { - //ATTENTION: HierarchyObject::retrieveById() can only work correctly if the following conditions are fulfilled: - //1. on each level, files are added first, symlinks, then directories (=> file id < link id < dir id) - //2. when a directory is added, all subdirectories must be added immediately (recursion) before the next dir on this level is added - //3. entries may be deleted but NEVER new ones inserted!!! - //=> this allows for a quasi-binary search by id! + const auto lessVal = mapLeft.value_comp(); - //HierarchyObject::addSubFile() must not invalidate references used in "appendUndefined"! + auto iterLeft = mapLeft .begin(); + auto iterRight = mapRight.begin(); - //reserve() fulfills two task here: 1. massive performance improvement! 2. ensure references in appendUndefined remain valid! - output.refSubFiles().reserve(leftSide.files.size() + rightSide.files.size()); //assume worst case! - output.refSubDirs(). reserve(leftSide.dirs. size() + rightSide.dirs. size()); // - output.refSubLinks().reserve(leftSide.links.size() + rightSide.links.size()); // + auto finishLeft = [&]() { std::for_each(iterLeft, mapLeft .end(), lo); }; + auto finishRight = [&]() { std::for_each(iterRight, mapRight.end(), ro); }; - for (DirContainer::FileList::const_iterator i = leftSide.files.begin(); i != leftSide.files.end(); ++i) - { - DirContainer::FileList::const_iterator rightFile = rightSide.files.find(i->first); + if (iterLeft == mapLeft .end()) return finishRight(); + if (iterRight == mapRight.end()) return finishLeft(); - //find files that exist on left but not on right - if (rightFile == rightSide.files.end()) - output.addSubFile(i->second, i->first); - //find files that exist on left and right + for (;;) + if (lessVal(*iterLeft, *iterRight)) + { + lo(*iterLeft); + if (++iterLeft == mapLeft.end()) + return finishRight(); + } + else if (lessVal(*iterRight, *iterLeft)) + { + ro(*iterRight); + if (++iterRight == mapRight.end()) + return finishLeft(); + } else { - FileMapping& newEntry = output.addSubFile( - i->first, - i->second, - FILE_EQUAL, //FILE_EQUAL is just a dummy-value here - rightFile->first, - rightFile->second); - appendUndefinedFile.push_back(&newEntry); + bo(*iterLeft, *iterRight); + ++iterLeft; // + ++iterRight; //increment BOTH before checking for end of range! + if (iterLeft == mapLeft .end()) return finishRight(); + if (iterRight == mapRight.end()) return finishLeft(); } - } +} - //find files that exist on right but not on left - for (DirContainer::FileList::const_iterator j = rightSide.files.begin(); j != rightSide.files.end(); ++j) - { - if (leftSide.files.find(j->first) == leftSide.files.end()) - output.addSubFile(j->first, j->second); - } +void MergeSides::execute(const DirContainer& leftSide, const DirContainer& rightSide, HierarchyObject& output) +{ + //HierarchyObject::addSubFile() must NOT invalidate references used in "appendUndefined"! - //----------------------------------------------------------------------------------------------- - for (DirContainer::LinkList::const_iterator i = leftSide.links.begin(); i != leftSide.links.end(); ++i) - { - DirContainer::LinkList::const_iterator rightLink = rightSide.links.find(i->first); + typedef const DirContainer::FileList::value_type FileData; - //find links that exist on left but not on right - if (rightLink == rightSide.links.end()) - output.addSubLink(i->second, i->first); - //find links that exist on left and right - else - { - SymLinkMapping& newEntry = output.addSubLink( - i->first, - i->second, - SYMLINK_EQUAL, //SYMLINK_EQUAL is just a dummy-value here - rightLink->first, - rightLink->second); - appendUndefinedLink.push_back(&newEntry); - } - } + linearMerge(leftSide.files, rightSide.files, + [&](const FileData& fileLeft) { output.addSubFile(fileLeft.second, fileLeft.first); }, //left only + [&](const FileData& fileRight) { output.addSubFile(fileRight.first, fileRight.second); }, //right only - //find links that exist on right but not on left - for (DirContainer::LinkList::const_iterator j = rightSide.links.begin(); j != rightSide.links.end(); ++j) + [&](const FileData& fileLeft, const FileData& fileRight) //both sides { - if (leftSide.links.find(j->first) == leftSide.links.end()) - output.addSubLink(j->first, j->second); - } - + FileMapping& newEntry = output.addSubFile(fileLeft.first, + fileLeft.second, + FILE_EQUAL, //FILE_EQUAL is just a dummy-value here + fileRight.first, + fileRight.second); + appendUndefinedFile.push_back(&newEntry); + }); //----------------------------------------------------------------------------------------------- - for (DirContainer::DirList::const_iterator i = leftSide.dirs.begin(); i != leftSide.dirs.end(); ++i) + typedef const DirContainer::LinkList::value_type LinkData; + + linearMerge(leftSide.links, rightSide.links, + [&](const LinkData& linkLeft) { output.addSubLink(linkLeft.second, linkLeft.first); }, //left only + [&](const LinkData& linkRight) { output.addSubLink(linkRight.first, linkRight.second); }, //right only + + [&](const LinkData& linkLeft, const LinkData& linkRight) //both sides { - DirContainer::DirList::const_iterator rightDir = rightSide.dirs.find(i->first); + SymLinkMapping& newEntry = output.addSubLink(linkLeft.first, + linkLeft.second, + SYMLINK_EQUAL, //SYMLINK_EQUAL is just a dummy-value here + linkRight.first, + linkRight.second); + appendUndefinedLink.push_back(&newEntry); + }); - //find directories that exist on left but not on right - if (rightDir == rightSide.dirs.end()) - { - DirMapping& newDirMap = output.addSubDir(i->first, Zstring()); - fillOneSide<LEFT_SIDE>(i->second, newDirMap); //recurse into subdirectories - } - else //directories that exist on both sides - { - DirMapping& newDirMap = output.addSubDir(i->first, rightDir->first); - execute(i->second, rightDir->second, newDirMap); //recurse into subdirectories - } - } + //----------------------------------------------------------------------------------------------- + typedef const DirContainer::DirList::value_type DirData; - //find directories that exist on right but not on left - for (DirContainer::DirList::const_iterator j = rightSide.dirs.begin(); j != rightSide.dirs.end(); ++j) + linearMerge(leftSide.dirs, rightSide.dirs, + [&](const DirData& dirLeft) //left only { - if (leftSide.dirs.find(j->first) == leftSide.dirs.end()) - { - DirMapping& newDirMap = output.addSubDir(Zstring(), j->first); - fillOneSide<RIGHT_SIDE>(j->second, newDirMap); //recurse into subdirectories - } - } + DirMapping& newDirMap = output.addSubDir(dirLeft.first, Zstring()); + this->fillOneSide<LEFT_SIDE>(dirLeft.second, newDirMap); //recurse into subdirectories + }, + [&](const DirData& dirRight) //right only + { + DirMapping& newDirMap = output.addSubDir(Zstring(), dirRight.first); + this->fillOneSide<RIGHT_SIDE>(dirRight.second, newDirMap); //recurse into subdirectories + }, + + [&](const DirData& dirLeft, const DirData& dirRight) //both sides + { + DirMapping& newDirMap = output.addSubDir(dirLeft.first, dirRight.first); + execute(dirLeft.second, dirRight.second, newDirMap); //recurse into subdirectories + }); } -void setDirFilter(HierarchyObject& hierObj, const HardFilter& filterProc) +//mark excluded directories (see fillBuffer()) + remove superfluous excluded subdirectories +//note: this cannot be done while traversing directory, since both sides need to be taken into account, both for filtering AND removing subdirs! +void processFilteredDirs(HierarchyObject& hierObj, const HardFilter& filterProc) { - HierarchyObject::SubDirMapping& subDirs = hierObj.refSubDirs(); + auto& subDirs = hierObj.refSubDirs(); //process subdirs recursively std::for_each(subDirs.begin(), subDirs.end(), [&](DirMapping& dirObj) { dirObj.setActive(filterProc.passDirFilter(dirObj.getObjRelativeName().c_str(), NULL)); //subObjMightMatch is always true in this context! - setDirFilter(dirObj, filterProc); + processFilteredDirs(dirObj, filterProc); }); - //remove superfluous directories -> already done by fillBuffer(), secondly this would be dangerous here as it invalidates "std::vector<FileMapping*>& undefinedFiles" + //remove superfluous directories -> note: this does not invalidate "std::vector<FileMapping*>& undefinedFiles", since we delete folders only + //and there is no side-effect for memory positions of FileMapping and SymlinkMapping thanks to std::list! + subDirs.remove_if([](DirMapping& dirObj) + { + return !dirObj.isActive() && + dirObj.refSubDirs ().empty() && + dirObj.refSubLinks().empty() && + dirObj.refSubFiles().empty(); + }); } } @@ -866,28 +859,28 @@ void CompareProcess::performComparison(const FolderPairCfg& fpCfg, //PERF_START; + DirectoryValue emptyDummy; auto getDirValue = [&](const Zstring& dirnameFmt) -> const DirectoryValue& { auto iter = directoryBuffer.find(DirectoryKey(dirnameFmt, fpCfg.filter.nameFilter, fpCfg.handleSymlinks)); - if (iter == directoryBuffer.end()) - throw std::logic_error("Programming Error: directory buffer entry not found!"); - return iter->second; + return iter == directoryBuffer.end() ? emptyDummy : iter->second; }; const DirectoryValue& bufValueLeft = getDirValue(fpCfg.leftDirectoryFmt); const DirectoryValue& bufValueRight = getDirValue(fpCfg.rightDirectoryFmt); - procCallback.reportInfo(_("Generating file list...")); + procCallback.reportStatus(_("Generating file list...")); procCallback.forceUiRefresh(); //keep total number of scanned files up to date - //PERF_STOP; + //PERF_START; MergeSides(undefinedFiles, undefinedLinks).execute(bufValueLeft.dirCont, bufValueRight.dirCont, output); + //PERF_STOP; //##################### in/exclude rows according to filtering ##################### //attention: some excluded directories are still in the comparison result! (see include filter handling!) if (!fpCfg.filter.nameFilter->isNull()) - setDirFilter(output, *fpCfg.filter.nameFilter); //mark excluded directories (see fillBuffer()) + processFilteredDirs(output, *fpCfg.filter.nameFilter); //mark excluded directories (see fillBuffer()) + remove superfluous excluded subdirectories //apply soft filtering / hard filter already applied addSoftFiltering(output, fpCfg.filter.timeSizeFilter); diff --git a/comparison.h b/comparison.h index 2d1eab75..225a82e8 100644 --- a/comparison.h +++ b/comparison.h @@ -22,20 +22,26 @@ struct FolderPairCfg { FolderPairCfg(const Zstring& leftDir, //must be formatted folder pairs! const Zstring& rightDir, - const NormalizedFilter& filterIn, + CompareVariant cmpVar, SymLinkHandling handleSymlinksIn, - const SyncConfig& syncCfg) : + const NormalizedFilter& filterIn, + const DirectionConfig& directCfg) : leftDirectoryFmt(leftDir), rightDirectoryFmt(rightDir), - filter(filterIn), + compareVar(cmpVar), handleSymlinks(handleSymlinksIn), - syncConfiguration(syncCfg) {} + filter(filterIn), + directionCfg(directCfg) {} Zstring leftDirectoryFmt; //resolved folder pairs!!! Zstring rightDirectoryFmt; // - NormalizedFilter filter; + + CompareVariant compareVar; SymLinkHandling handleSymlinks; - SyncConfig syncConfiguration; + + NormalizedFilter filter; + + DirectionConfig directionCfg; }; std::vector<FolderPairCfg> extractCompareCfg(const MainConfiguration& mainCfg); //fill FolderPairCfg and resolve folder pairs @@ -49,25 +55,25 @@ public: xmlAccess::OptionalDialogs& warnings, ProcessCallback& handler); - void startCompareProcess(const std::vector<FolderPairCfg>& directoryPairs, - const CompareVariant cmpVar, - FolderComparison& output); - ~CompareProcess(); + void startCompareProcess(const std::vector<FolderPairCfg>& cfgList, FolderComparison& output); private: - void compareByTimeSize(const std::vector<FolderPairCfg>& directoryPairsFormatted, FolderComparison& output); - void compareByContent( const std::vector<FolderPairCfg>& directoryPairsFormatted, FolderComparison& output); + CompareProcess(const CompareProcess&); + CompareProcess& operator=(const CompareProcess&); //create comparison result table and fill category except for files existing on both sides: undefinedFiles and undefinedLinks are appended! void categorizeSymlinkByTime(SymLinkMapping& linkObj) const; void categorizeSymlinkByContent(SymLinkMapping& linkObj) const; + void compareByTimeSize(const FolderPairCfg& fpConfig, BaseDirMapping& output); + void compareByContent(std::vector<std::pair<FolderPairCfg, BaseDirMapping*>>& workLoad); + void performComparison(const FolderPairCfg& fpCfg, BaseDirMapping& output, std::vector<FileMapping*>& undefinedFiles, std::vector<SymLinkMapping*>& undefinedLinks); - std::map<DirectoryKey, DirectoryValue> directoryBuffer; + std::map<DirectoryKey, DirectoryValue> directoryBuffer; //contains only *existing* directories const size_t fileTimeTolerance; //max allowed file time deviation diff --git a/file_hierarchy.cpp b/file_hierarchy.cpp index 3b0f5a04..b3264c31 100644 --- a/file_hierarchy.cpp +++ b/file_hierarchy.cpp @@ -9,102 +9,35 @@ using namespace zen; -namespace -{ -struct LowerID -{ - bool operator()(const FileSystemObject& a, HierarchyObject::ObjectID b) const - { - return a.getId() < b; - } - - bool operator()(const FileSystemObject& a, const FileSystemObject& b) const //used by VC++ - { - return a.getId() < b.getId(); - } - bool operator()(HierarchyObject::ObjectID a, const FileSystemObject& b) const - { - return a < b.getId(); - } -}; -} - - -const FileSystemObject* HierarchyObject::retrieveById(ObjectID id) const //returns NULL if object is not found +void HierarchyObject::removeEmptyRec() { - //ATTENTION: HierarchyObject::retrieveById() can only work correctly if the following conditions are fulfilled: - //1. on each level, files are added first, symlinks, then directories (=> file id < link id < dir id) - //2. when a directory is added, all subdirectories must be added immediately (recursion) before the next dir on this level is added - //3. entries may be deleted but NEVER new ones inserted!!! - //=> this allows for a quasi-binary search by id! - - //See MergeSides::execute()! - - - //search within sub-files - SubFileMapping::const_iterator i = std::lower_bound(subFiles.begin(), subFiles.end(), id, LowerID()); //binary search! - if (i != subFiles.end()) + bool haveEmpty = false; + auto isEmpty = [&](const FileSystemObject& fsObj) -> bool { - //id <= i - if (LowerID()(id, *i)) - return NULL; // --i < id < i - else //id found - return &(*i); - } - - //search within sub-symlinks - SubLinkMapping::const_iterator j = std::lower_bound(subLinks.begin(), subLinks.end(), id, LowerID()); //binary search! - if (j != subLinks.end()) - { - //id <= i - if (LowerID()(id, *j)) - return NULL; // --i < id < i - else //id found - return &(*j); - } - - //search within sub-directories - SubDirMapping::const_iterator k = std::lower_bound(subDirs.begin(), subDirs.end(), id, LowerID()); //binary search! - if (k != subDirs.end() && !LowerID()(id, *k)) //id == j - return &(*k); - else if (k == subDirs.begin()) //either begin() == end() or id < begin() - return NULL; - else - return (--k)->retrieveById(id); //j != begin() and id < j -} - + bool objEmpty = fsObj.isEmpty(); + if (objEmpty) + haveEmpty = true; + return objEmpty; + }; -template <class V, class Predicate> inline -void vector_remove_if(V& vec, Predicate p) -{ - vec.erase(std::remove_if(vec.begin(), vec.end(), p), vec.end()); -} - - -void removeEmptyRec(HierarchyObject& hierObj) -{ - auto isEmpty = [](const FileSystemObject& fsObj) { return fsObj.isEmpty(); }; + refSubFiles().remove_if(isEmpty); + refSubLinks().remove_if(isEmpty); + refSubDirs ().remove_if(isEmpty); - vector_remove_if(hierObj.refSubFiles(), isEmpty); - vector_remove_if(hierObj.refSubLinks(), isEmpty); - vector_remove_if(hierObj.refSubDirs (), isEmpty); + if (haveEmpty) //notify if actual deletion happened + notifySyncCfgChanged(); //mustn't call this in ~FileSystemObject(), since parent, usually a DirMapping, is already partially destroyed and existing as a pure HierarchyObject! //recurse - std::for_each(hierObj.refSubDirs().begin(), hierObj.refSubDirs().end(), removeEmptyRec); -} - - -void BaseDirMapping::removeEmpty(BaseDirMapping& baseDir) -{ - removeEmptyRec(baseDir); + std::for_each(refSubDirs().begin(), refSubDirs().end(), std::mem_fun_ref(&HierarchyObject::removeEmptyRec)); } SyncOperation FileSystemObject::getSyncOperation( CompareFilesResult cmpResult, bool selectedForSynchronization, - SyncDirectionIntern syncDir) + SyncDirection syncDir, + const std::wstring& syncDirConflict) { if (!selectedForSynchronization) return cmpResult == FILE_EQUAL ? @@ -116,78 +49,125 @@ SyncOperation FileSystemObject::getSyncOperation( case FILE_LEFT_SIDE_ONLY: switch (syncDir) { - case SYNC_DIR_INT_LEFT: + case SYNC_DIR_LEFT: return SO_DELETE_LEFT; //delete files on left - case SYNC_DIR_INT_RIGHT: + case SYNC_DIR_RIGHT: return SO_CREATE_NEW_RIGHT; //copy files to right - case SYNC_DIR_INT_NONE: - return SO_DO_NOTHING; - case SYNC_DIR_INT_CONFLICT: - return SO_UNRESOLVED_CONFLICT; + case SYNC_DIR_NONE: + return syncDirConflict.empty() ? SO_DO_NOTHING : SO_UNRESOLVED_CONFLICT; } break; case FILE_RIGHT_SIDE_ONLY: switch (syncDir) { - case SYNC_DIR_INT_LEFT: + case SYNC_DIR_LEFT: return SO_CREATE_NEW_LEFT; //copy files to left - case SYNC_DIR_INT_RIGHT: + case SYNC_DIR_RIGHT: return SO_DELETE_RIGHT; //delete files on right - case SYNC_DIR_INT_NONE: - return SO_DO_NOTHING; - case SYNC_DIR_INT_CONFLICT: - return SO_UNRESOLVED_CONFLICT; + case SYNC_DIR_NONE: + return syncDirConflict.empty() ? SO_DO_NOTHING : SO_UNRESOLVED_CONFLICT; } break; case FILE_LEFT_NEWER: case FILE_RIGHT_NEWER: case FILE_DIFFERENT: - switch (syncDir) - { - case SYNC_DIR_INT_LEFT: - return SO_OVERWRITE_LEFT; //copy from right to left - case SYNC_DIR_INT_RIGHT: - return SO_OVERWRITE_RIGHT; //copy from left to right - case SYNC_DIR_INT_NONE: - return SO_DO_NOTHING; - case SYNC_DIR_INT_CONFLICT: - return SO_UNRESOLVED_CONFLICT; - } - break; - case FILE_CONFLICT: switch (syncDir) { - case SYNC_DIR_INT_LEFT: + case SYNC_DIR_LEFT: return SO_OVERWRITE_LEFT; //copy from right to left - case SYNC_DIR_INT_RIGHT: + case SYNC_DIR_RIGHT: return SO_OVERWRITE_RIGHT; //copy from left to right - case SYNC_DIR_INT_NONE: - case SYNC_DIR_INT_CONFLICT: - return SO_UNRESOLVED_CONFLICT; + case SYNC_DIR_NONE: + return syncDirConflict.empty() ? SO_DO_NOTHING : SO_UNRESOLVED_CONFLICT; } break; case FILE_DIFFERENT_METADATA: switch (syncDir) { - case SYNC_DIR_INT_LEFT: + case SYNC_DIR_LEFT: return SO_COPY_METADATA_TO_LEFT; - case SYNC_DIR_INT_RIGHT: + case SYNC_DIR_RIGHT: return SO_COPY_METADATA_TO_RIGHT; - case SYNC_DIR_INT_NONE: - return SO_DO_NOTHING; - case SYNC_DIR_INT_CONFLICT: - return SO_UNRESOLVED_CONFLICT; + case SYNC_DIR_NONE: + return syncDirConflict.empty() ? SO_DO_NOTHING : SO_UNRESOLVED_CONFLICT; } break; case FILE_EQUAL: - assert(syncDir == SYNC_DIR_INT_NONE); + assert(syncDir == SYNC_DIR_NONE); return SO_EQUAL; } return SO_DO_NOTHING; //dummy -}
\ No newline at end of file +} + + +namespace +{ +template <class Predicate> inline +bool hasDirectChild(const HierarchyObject& hierObj, Predicate p) +{ + return std::find_if(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), p) != hierObj.refSubFiles().end() || + std::find_if(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), p) != hierObj.refSubLinks().end() || + std::find_if(hierObj.refSubDirs(). begin(), hierObj.refSubDirs(). end(), p) != hierObj.refSubDirs ().end(); +} +} + + +SyncOperation DirMapping::getSyncOperation() const +{ + if (!syncOpUpToDate) + { + syncOpUpToDate = true; + //redetermine... + + //suggested operation for directory only + syncOpBuffered = FileSystemObject::getSyncOperation(); + + //action for child elements may occassionally have to overwrite parent task: + switch (syncOpBuffered) + { + case SO_OVERWRITE_LEFT: + case SO_OVERWRITE_RIGHT: + assert(false); + case SO_CREATE_NEW_LEFT: + case SO_CREATE_NEW_RIGHT: + case SO_COPY_METADATA_TO_LEFT: + case SO_COPY_METADATA_TO_RIGHT: + case SO_EQUAL: + break; //take over suggestion, no problem for child-elements + case SO_DELETE_LEFT: + case SO_DELETE_RIGHT: + case SO_DO_NOTHING: + case SO_UNRESOLVED_CONFLICT: + { + if (isEmpty<LEFT_SIDE>()) + { + //1. if at least one child-element is to be created, make sure parent folder is created also + //note: this automatically fulfills "create parent folders even if excluded"; + //see http://sourceforge.net/tracker/index.php?func=detail&aid=2628943&group_id=234430&atid=1093080 + if (hasDirectChild(*this, [](const FileSystemObject& fsObj) { return fsObj.getSyncOperation() == SO_CREATE_NEW_LEFT; })) + syncOpBuffered = SO_CREATE_NEW_LEFT; + //2. cancel parent deletion if only a single child is not also scheduled for deletion + else if (syncOpBuffered == SO_DELETE_RIGHT && + hasDirectChild(*this, [](const FileSystemObject& fsObj) { return fsObj.getSyncOperation() != SO_DELETE_RIGHT; })) + syncOpBuffered = SO_DO_NOTHING; + } + else if (isEmpty<RIGHT_SIDE>()) + { + if (hasDirectChild(*this, [](const FileSystemObject& fsObj) { return fsObj.getSyncOperation() == SO_CREATE_NEW_RIGHT; })) + syncOpBuffered = SO_CREATE_NEW_RIGHT; + else if (syncOpBuffered == SO_DELETE_LEFT && + hasDirectChild(*this, [](const FileSystemObject& fsObj) { return fsObj.getSyncOperation() != SO_DELETE_LEFT; })) + syncOpBuffered = SO_DO_NOTHING; + } + } + break; + } + } + return syncOpBuffered; +} diff --git a/file_hierarchy.h b/file_hierarchy.h index 43e35138..8424376c 100644 --- a/file_hierarchy.h +++ b/file_hierarchy.h @@ -9,34 +9,16 @@ #include "shared/zstring.h" #include <map> -#include <set> -#include <vector> -#include "structures.h" +#include <string> +#include <unordered_set> #include <memory> +#include "shared/fixed_list.h" +#include "structures.h" #include "shared/guid.h" -#include "library/hard_filter.h" #include "shared/file_id.h" #include "shared/int64.h" - -class DirectoryBuffer; - - -namespace util //helper class to grant algorithms like std::for_each access to private parts of a predicate class -{ -template <class T> -class ProxyForEach -{ -public: - ProxyForEach(T& target) : target_(target) {} - template <class FS> void operator()(FS& obj) const - { - target_(obj); - } - -private: - T& target_; -}; -} +#include "structures.h" +#include "library/hard_filter.h" namespace zen @@ -82,7 +64,17 @@ enum SelectedSide RIGHT_SIDE }; +template <SelectedSide side> +struct OtherSide; + +template <> +struct OtherSide<LEFT_SIDE> { static const SelectedSide result = RIGHT_SIDE; }; + +template <> +struct OtherSide<RIGHT_SIDE> { static const SelectedSide result = LEFT_SIDE; }; + +class BaseDirMapping; class DirMapping; class FileMapping; class SymLinkMapping; @@ -111,6 +103,7 @@ struct DirContainer //convenience DirContainer& addSubDir(const Zstring& shortName) { + //use C++11 emplace when available return dirs.insert(std::make_pair(shortName, DirContainer())).first->second; } @@ -125,9 +118,8 @@ struct DirContainer } }; - //------------------------------------------------------------------ -/* class hierarchy: +/* inheritance diagram: FileSystemObject HierarchyObject /|\ /|\ @@ -137,15 +129,16 @@ SymLinkMapping FileMapping DirMapping BaseDirMapping */ //------------------------------------------------------------------ - - class HierarchyObject { -public: - typedef long ObjectID; - FileSystemObject* retrieveById(ObjectID id); //returns NULL if object is not found; logarithmic complexity - const FileSystemObject* retrieveById(ObjectID id) const; // + friend class DirMapping; + friend class FileSystemObject; + + typedef zen::FixedList<FileMapping> SubFileVec; //MergeSides::execute() requires a structure that doesn't invalidate pointers after push_back() + typedef zen::FixedList<SymLinkMapping> SubLinkVec; //Note: deque<> has circular reference in VCPP! + typedef zen::FixedList<DirMapping> SubDirVec; +public: DirMapping& addSubDir(const Zstring& shortNameLeft, const Zstring& shortNameRight); @@ -169,61 +162,44 @@ public: void addSubLink(const Zstring& shortNameRight, //link exists on right side only const LinkDescriptor& right); - const Zstring& getRelativeNamePf() const; //get name relative to base sync dir with FILE_NAME_SEPARATOR postfix: "blah\" - template <SelectedSide side> const Zstring& getBaseDir() const; //postfixed! + const SubFileVec& refSubFiles() const { return subFiles; } + /**/ SubFileVec& refSubFiles() { return subFiles; } - typedef std::vector<FileMapping> SubFileMapping; //MergeSides::execute() requires a structure that doesn't invalidate pointers after push_back() - typedef std::vector<DirMapping> SubDirMapping; //Note: deque<> has circular reference in VCPP! - typedef std::vector<SymLinkMapping> SubLinkMapping; + const SubLinkVec& refSubLinks() const { return subLinks; } + /**/ SubLinkVec& refSubLinks() { return subLinks; } - SubFileMapping& refSubFiles(); - SubLinkMapping& refSubLinks(); - SubDirMapping& refSubDirs(); - const SubFileMapping& refSubFiles() const; - const SubLinkMapping& refSubLinks() const; - const SubDirMapping& refSubDirs() const; + const SubDirVec& refSubDirs() const { return subDirs; } + /**/ SubDirVec& refSubDirs() { return subDirs; } + + BaseDirMapping& getRoot() { return root_; } protected: - //constructor used by DirMapping - HierarchyObject(const HierarchyObject& parent, const Zstring& shortName) : - relNamePf( parent.getRelativeNamePf() + shortName + FILE_NAME_SEPARATOR), - baseDirLeft( parent.baseDirLeft), - baseDirRight(parent.baseDirRight) {} - - //constructor used by BaseDirMapping - HierarchyObject(const Zstring& dirPostfixedLeft, - const Zstring& dirPostfixedRight) : - baseDirLeft(dirPostfixedLeft), - baseDirRight(dirPostfixedRight) {} + HierarchyObject(const Zstring& relativeNamePf, + BaseDirMapping& baseMap) : + objRelNamePf(relativeNamePf), + root_(baseMap) {} ~HierarchyObject() {} //don't need polymorphic deletion - virtual void swap(); + virtual void flip(); + + void removeEmptyRec(); private: - SubFileMapping subFiles; //contained file maps - SubLinkMapping subLinks; //contained symbolic link maps - SubDirMapping subDirs; //contained directory maps + virtual void notifySyncCfgChanged() {} - Zstring relNamePf; - Zstring baseDirLeft; //directory name ending with FILE_NAME_SEPARATOR - Zstring baseDirRight; //directory name ending with FILE_NAME_SEPARATOR -}; + HierarchyObject(const HierarchyObject&); //this class is referenced by it's child elements => make it non-copyable/movable! + HierarchyObject& operator=(const HierarchyObject&); // -template <> -inline -const Zstring& HierarchyObject::getBaseDir<LEFT_SIDE>() const //postfixed! -{ - return baseDirLeft; -} + const Zstring& getObjRelativeNamePf() const { return objRelNamePf; } + SubFileVec subFiles; //contained file maps + SubLinkVec subLinks; //contained symbolic link maps + SubDirVec subDirs; //contained directory maps -template <> -inline -const Zstring& HierarchyObject::getBaseDir<RIGHT_SIDE>() const //postfixed! -{ - return baseDirRight; -} + Zstring objRelNamePf; + BaseDirMapping& root_; +}; //------------------------------------------------------------------ @@ -231,41 +207,78 @@ class BaseDirMapping : public HierarchyObject //synchronization base directory { public: BaseDirMapping(const Zstring& dirPostfixedLeft, + bool dirExistsLeft, const Zstring& dirPostfixedRight, + bool dirExistsRight, const HardFilter::FilterRef& filterIn) : - HierarchyObject(dirPostfixedLeft, dirPostfixedRight), - filter(filterIn) {} + HierarchyObject(Zstring(), *this), + filter(filterIn), + baseDirPfL(dirPostfixedLeft), + baseDirPfR(dirPostfixedRight), + dirExistsLeft_(dirExistsLeft), + dirExistsRight_(dirExistsRight) {} + + template <SelectedSide side> const Zstring& getBaseDirPf() const; //base sync directory postfixed with FILE_NAME_SEPARATOR + static void removeEmpty(BaseDirMapping& baseDir) { baseDir.removeEmptyRec(); }; //physically remove all invalid entries (where both sides are empty) recursively const HardFilter::FilterRef& getFilter() const; - virtual void swap(); + template <SelectedSide side> bool wasExisting() const; //status of directory existence at the time of comparison! - static void removeEmpty(BaseDirMapping& baseDir); //physically remove all invalid entries (where both sides are empty) recursively + virtual void flip(); private: + BaseDirMapping(const BaseDirMapping&); //this class is referenced by HierarchyObject => make it non-copyable/movable! + BaseDirMapping& operator=(const BaseDirMapping&); // + //this member is currently not used by the business logic -> may be removed! HardFilter::FilterRef filter; + + Zstring baseDirPfL; //base sync dir postfixed + Zstring baseDirPfR; // + + bool dirExistsLeft_; + bool dirExistsRight_; }; -typedef std::vector<BaseDirMapping> FolderComparison; +template <> inline +const Zstring& BaseDirMapping::getBaseDirPf<LEFT_SIDE>() const { return baseDirPfL; } -//------------------------------------------------------------------ -struct RelNamesBuffered -{ - RelNamesBuffered(const Zstring& baseDirPfLIn, //base sync dir postfixed - const Zstring& baseDirPfRIn, - const Zstring& parentRelNamePfIn) : //relative parent name postfixed - baseDirPfL(baseDirPfLIn), - baseDirPfR(baseDirPfRIn), - parentRelNamePf(parentRelNamePfIn) {} - - Zstring baseDirPfL; - Zstring baseDirPfR; - Zstring parentRelNamePf; +template <> inline +const Zstring& BaseDirMapping::getBaseDirPf<RIGHT_SIDE>() const { return baseDirPfR; } + + +//get rid of shared_ptr indirection +template < class IterTy, //underlying iterator type + class U > //target object type +class DerefIter : public std::iterator<std::bidirectional_iterator_tag, U> +{ +public: + DerefIter() {} + DerefIter(IterTy it) : iter(it) {} + DerefIter(const DerefIter& other) : iter(other.iter) {} + DerefIter& operator++() { ++iter; return *this; } + DerefIter& operator--() { --iter; return *this; } + DerefIter operator++(int) { DerefIter tmp(*this); operator++(); return tmp; } + DerefIter operator--(int) { DerefIter tmp(*this); operator--(); return tmp; } + inline friend ptrdiff_t operator-(const DerefIter& lhs, const DerefIter& rhs) { return lhs.iter - rhs.iter; } + inline friend bool operator==(const DerefIter& lhs, const DerefIter& rhs) { return lhs.iter == rhs.iter; } + inline friend bool operator!=(const DerefIter& lhs, const DerefIter& rhs) { return !(lhs == rhs); } + U& operator* () { return **iter; } + U* operator->() { return &** iter; } +private: + IterTy iter; }; +typedef std::vector<std::shared_ptr<BaseDirMapping>> FolderComparison; //make sure pointers to sub-elements remain valid +//don't change this back to std::vector<BaseDirMapping> too easily: comparison uses push_back to add entries which may result in a full copy! +DerefIter<typename FolderComparison::iterator, BaseDirMapping> inline begin(FolderComparison& vect) { return vect.begin(); } +DerefIter<typename FolderComparison::iterator, BaseDirMapping> inline end (FolderComparison& vect) { return vect.end (); } +DerefIter<typename FolderComparison::const_iterator, const BaseDirMapping> inline begin(const FolderComparison& vect) { return vect.begin(); } +DerefIter<typename FolderComparison::const_iterator, const BaseDirMapping> inline end (const FolderComparison& vect) { return vect.end (); } +//------------------------------------------------------------------ class FSObjectVisitor { public: @@ -275,112 +288,138 @@ public: virtual void visit(const DirMapping& dirObj) = 0; }; +//inherit from this class to allow safe access by id instead of unsafe raw pointer +//allow for similar semantics like std::weak_ptr without having to use std::shared_ptr +template <class T> +class ObjectMgr +{ +public: + typedef const ObjectMgr* ObjectID; + + ObjectID getId() { activeObjects().insert(this); return this; } + //unfortunately we need to keep this method non-const to get non-const "this" pointer + //we could instead put this into the constructor, but temporaries created by STL would lead to some overhead + + static T* retrieve(ObjectID id) //returns NULL if object is not found + { + auto iter = activeObjects().find(const_cast<ObjectMgr*>(id)); + return static_cast<T*>(iter == activeObjects().end() ? NULL : *iter); //static down-cast + } + +protected: + ObjectMgr() {} + ~ObjectMgr() { activeObjects().erase(this); } + +private: + ObjectMgr(const ObjectMgr& rhs); // + ObjectMgr& operator=(const ObjectMgr& rhs); //it's not well-defined what coping an objects means regarding object-identity in this context + + static std::unordered_set<ObjectMgr*>& activeObjects() + { + static std::unordered_set<ObjectMgr*> inst; //external linkage (even if in header file!) + return inst; + } +}; //------------------------------------------------------------------ -class FileSystemObject + +class FileSystemObject : public ObjectMgr<FileSystemObject> { public: virtual void accept(FSObjectVisitor& visitor) const = 0; - const Zstring getParentRelativeName() const; //get name relative to base sync dir without FILE_NAME_SEPARATOR postfix - const Zstring& getObjShortName () const; //same as getShortName() but also returns value if either side is empty - const Zstring getObjRelativeName () const; //same as getRelativeName() but also returns value if either side is empty - template <SelectedSide side> bool isEmpty() const; - template <SelectedSide side> const Zstring& getShortName() const; - template <SelectedSide side> const Zstring getRelativeName() const; //get name relative to base sync dir without FILE_NAME_SEPARATOR prefix - template <SelectedSide side> const Zstring& getBaseDirPf() const; //base sync directory postfixed with FILE_NAME_SEPARATOR - template <SelectedSide side> const Zstring getFullName() const; //getFullName() == getBaseDirPf() + getRelativeName() - - HierarchyObject::ObjectID getId() const; //get unique id; ^= logical key + Zstring getObjShortName () const; //same as getShortName() but also returns value if either side is empty + Zstring getObjRelativeName() const; //same as getRelativeName() but also returns value if either side is empty + template <SelectedSide side> bool isEmpty() const; + template <SelectedSide side> const Zstring& getShortName() const; + template <SelectedSide side> Zstring getRelativeName() const; //get name relative to base sync dir without FILE_NAME_SEPARATOR prefix + template <SelectedSide side> const Zstring& getBaseDirPf() const; //base sync directory postfixed with FILE_NAME_SEPARATOR + template <SelectedSide side> Zstring getFullName() const; //getFullName() == getBaseDirPf() + getRelativeName() //comparison result virtual CompareFilesResult getCategory() const = 0; - virtual wxString getCatConflict() const = 0; //only filled if getCategory() == FILE_CONFLICT + virtual std::wstring getCatConflict() const = 0; //only filled if getCategory() == FILE_CONFLICT //sync operation - SyncOperation getSyncOperation() const; - wxString getSyncOpConflict() const; //only filled if getSyncOperation() == SYNC_DIR_INT_CONFLICT - SyncOperation testSyncOperation(bool selected, SyncDirection syncDir) const; //get syncOp with provided settings + virtual SyncOperation getSyncOperation() const; + std::wstring getSyncOpConflict() const; //return conflict when determining sync direction or during categorization + SyncOperation testSyncOperation(SyncDirection syncDir) const; //get syncOp with provided settings //sync settings void setSyncDir(SyncDirection newDir); - void setSyncDirConflict(const wxString& description); //set syncDir = SYNC_DIR_INT_CONFLICT + void setSyncDirConflict(const std::wstring& description); //set syncDir = SYNC_DIR_NONE + fill conflict description bool isActive() const; void setActive(bool active); - void synchronizeSides(); //copy one side to the other (NOT recursive!!!) template <SelectedSide side> void removeObject(); //removes file or directory (recursively!) without physically removing the element: used by manual deletion + bool isEmpty() const; //true, if both sides are empty + const HierarchyObject& parent() const { return parent_; } + /**/ HierarchyObject& parent() { return parent_; } + const BaseDirMapping& root() const { return parent_.getRoot(); } + /**/ BaseDirMapping& root() { return parent_.getRoot(); } + protected: - FileSystemObject(const Zstring& shortNameLeft, const Zstring& shortNameRight, const HierarchyObject& parent) : + FileSystemObject(const Zstring& shortNameLeft, const Zstring& shortNameRight, HierarchyObject& parentObj) : selectedForSynchronization(true), - syncDir(SYNC_DIR_INT_NONE), - nameBuffer(parent.getBaseDir<LEFT_SIDE>(), parent.getBaseDir<RIGHT_SIDE>(), parent.getRelativeNamePf()), + syncDir(SYNC_DIR_NONE), shortNameLeft_(shortNameLeft), shortNameRight_(shortNameRight), //shortNameRight_(shortNameRight == shortNameLeft ? shortNameLeft : shortNameRight), -> strangely doesn't seem to shrink peak memory consumption at all! - uniqueId(getUniqueId()) {} + parent_(parentObj) + { + parent_.notifySyncCfgChanged(); + } ~FileSystemObject() {} //don't need polymorphic deletion + //mustn't call parent here, it is already partially destroyed and nothing more than a pure HierarchyObject! + - virtual void swap(); + virtual void flip(); + virtual void notifySyncCfgChanged() { parent().notifySyncCfgChanged(); /*propagate!*/ } + + void copyToL(); + void copyToR(); private: - virtual void removeObjectL() = 0; - virtual void removeObjectR() = 0; - virtual void copyToL() = 0; - virtual void copyToR() = 0; - static HierarchyObject::ObjectID getUniqueId(); + virtual void removeObjectL() = 0; + virtual void removeObjectR() = 0; - enum SyncDirectionIntern //same as SyncDirection, but one additional conflict type - { - SYNC_DIR_INT_LEFT = SYNC_DIR_LEFT, - SYNC_DIR_INT_RIGHT = SYNC_DIR_RIGHT, - SYNC_DIR_INT_NONE = SYNC_DIR_NONE, - SYNC_DIR_INT_CONFLICT //set if automatic synchronization cannot determine a direction - }; static SyncOperation getSyncOperation(CompareFilesResult cmpResult, bool selectedForSynchronization, - SyncDirectionIntern syncDir); //evaluate comparison result and sync direction + SyncDirection syncDir, + const std::wstring& syncDirConflict); //evaluate comparison result and sync direction bool selectedForSynchronization; - SyncDirectionIntern syncDir; - wxString syncOpConflictDescr; //only filled if syncDir == SYNC_DIR_INT_CONFLICT - - //buffer some redundant data: - RelNamesBuffered nameBuffer; //base sync dirs + relative parent name: this does NOT belong into FileDescriptor/DirDescriptor + SyncDirection syncDir; + std::wstring syncDirConflict; //non-empty if we have a conflict setting sync-direction Zstring shortNameLeft_; //slightly redundant under linux, but on windows the "same" filenames can differ in case Zstring shortNameRight_; //use as indicator: an empty name means: not existing! - HierarchyObject::ObjectID uniqueId; + HierarchyObject& parent_; }; //------------------------------------------------------------------ class DirMapping : public FileSystemObject, public HierarchyObject { + friend class CompareProcess; //only CompareProcess shall be allowed to change cmpResult + friend class HierarchyObject; + public: virtual void accept(FSObjectVisitor& visitor) const; virtual CompareFilesResult getCategory() const; CompareDirResult getDirCategory() const; //returns actually used subset of CompareFilesResult - virtual wxString getCatConflict() const; - -private: - friend class CompareProcess; //only CompareProcess shall be allowed to change cmpResult - friend class HierarchyObject; - virtual void swap(); - virtual void removeObjectL(); - virtual void removeObjectR(); - virtual void copyToL(); - virtual void copyToR(); - //------------------------------------------------------------------ + virtual std::wstring getCatConflict() const; DirMapping(const Zstring& shortNameLeft, //use empty shortname if "not existing" const Zstring& shortNameRight, // - const HierarchyObject& parent) : - FileSystemObject(shortNameLeft, shortNameRight, parent), - HierarchyObject(parent, shortNameRight.empty() ? shortNameLeft : shortNameRight) + HierarchyObject& parentObj) : + FileSystemObject(shortNameLeft, shortNameRight, parentObj), + HierarchyObject(getObjRelativeName() + FILE_NAME_SEPARATOR, parentObj.getRoot()), + syncOpBuffered(SO_DO_NOTHING), + syncOpUpToDate(false) { assert(!shortNameLeft.empty() || !shortNameRight.empty()); @@ -397,52 +436,66 @@ private: } } + virtual SyncOperation getSyncOperation() const; + + template <SelectedSide side> void copyTo(); //copy dir + +private: + virtual void flip(); + virtual void removeObjectL(); + virtual void removeObjectR(); + virtual void notifySyncCfgChanged() { syncOpUpToDate = false; FileSystemObject::notifySyncCfgChanged(); HierarchyObject::notifySyncCfgChanged(); } + //------------------------------------------------------------------ + //categorization CompareDirResult cmpResult; + + mutable SyncOperation syncOpBuffered; //determining sync-op for directory may be expensive as it depends on child-objects -> buffer it + mutable bool syncOpUpToDate; // }; //------------------------------------------------------------------ class FileMapping : public FileSystemObject { -public: - virtual void accept(FSObjectVisitor& visitor) const; - - template <SelectedSide side> zen::Int64 getLastWriteTime() const; - template <SelectedSide side> zen::UInt64 getFileSize() const; - template <SelectedSide side> const Zstring getExtension() const; - - virtual CompareFilesResult getCategory() const; - virtual wxString getCatConflict() const; - -private: friend class CompareProcess; //only CompareProcess shall be allowed to change cmpResult friend class HierarchyObject; //construction - template <CompareFilesResult res> - void setCategory(); - void setCategoryConflict(const wxString& description); +public: + virtual void accept(FSObjectVisitor& visitor) const; FileMapping(const Zstring& shortNameLeft, //use empty string if "not existing" const FileDescriptor& left, CompareFilesResult defaultCmpResult, const Zstring& shortNameRight, // const FileDescriptor& right, - const HierarchyObject& parent) : - FileSystemObject(shortNameLeft, shortNameRight, parent), + HierarchyObject& parentObj) : + FileSystemObject(shortNameLeft, shortNameRight, parentObj), cmpResult(defaultCmpResult), dataLeft(left), dataRight(right) {} - virtual void swap(); + template <SelectedSide side> Int64 getLastWriteTime() const; + template <SelectedSide side> UInt64 getFileSize() const; + template <SelectedSide side> const Zstring getExtension() const; + + virtual CompareFilesResult getCategory() const; + virtual std::wstring getCatConflict() const; + + template <SelectedSide side> void copyTo(const FileDescriptor* srcDescr); //copy + update file attributes + +private: + template <CompareFilesResult res> + void setCategory(); + void setCategoryConflict(const std::wstring& description); + + virtual void flip(); virtual void removeObjectL(); virtual void removeObjectR(); - virtual void copyToL(); - virtual void copyToR(); //------------------------------------------------------------------ //categorization CompareFilesResult cmpResult; - wxString cmpConflictDescr; //only filled if cmpResult == FILE_CONFLICT + std::wstring cmpConflictDescr; //only filled if cmpResult == FILE_CONFLICT FileDescriptor dataLeft; FileDescriptor dataRight; @@ -451,6 +504,9 @@ private: //------------------------------------------------------------------ class SymLinkMapping : public FileSystemObject //this class models a TRUE symbolic link, i.e. one that is NEVER dereferenced: deref-links should be directly placed in class File/DirMapping { + friend class CompareProcess; //only CompareProcess shall be allowed to change cmpResult + friend class HierarchyObject; //construction + public: virtual void accept(FSObjectVisitor& visitor) const; @@ -460,36 +516,34 @@ public: virtual CompareFilesResult getCategory() const; CompareSymlinkResult getLinkCategory() const; //returns actually used subset of CompareFilesResult - virtual wxString getCatConflict() const; - -private: - friend class CompareProcess; //only CompareProcess shall be allowed to change cmpResult - friend class HierarchyObject; //construction - virtual void swap(); - virtual void removeObjectL(); - virtual void removeObjectR(); - virtual void copyToL(); - virtual void copyToR(); - - template <CompareSymlinkResult res> - void setCategory(); - void setCategoryConflict(const wxString& description); + virtual std::wstring getCatConflict() const; SymLinkMapping(const Zstring& shortNameLeft, //use empty string if "not existing" const LinkDescriptor& left, CompareSymlinkResult defaultCmpResult, const Zstring& shortNameRight, //use empty string if "not existing" const LinkDescriptor& right, - const HierarchyObject& parent) : - FileSystemObject(shortNameLeft, shortNameRight, parent), + HierarchyObject& parentObj) : + FileSystemObject(shortNameLeft, shortNameRight, parentObj), cmpResult(defaultCmpResult), dataLeft(left), dataRight(right) {} + + template <SelectedSide side> void copyTo(); //copy + +private: + virtual void flip(); + virtual void removeObjectL(); + virtual void removeObjectR(); + + template <CompareSymlinkResult res> + void setCategory(); + void setCategoryConflict(const std::wstring& description); //------------------------------------------------------------------ //categorization CompareSymlinkResult cmpResult; - wxString cmpConflictDescr; //only filled if cmpResult == SYMLINK_CONFLICT + std::wstring cmpConflictDescr; //only filled if cmpResult == SYMLINK_CONFLICT LinkDescriptor dataLeft; LinkDescriptor dataRight; @@ -552,30 +606,6 @@ void SymLinkMapping::accept(FSObjectVisitor& visitor) const inline -FileSystemObject* HierarchyObject::retrieveById(ObjectID id) //returns NULL if object is not found -{ - //code re-use of const method: see Meyers Effective C++ - return const_cast<FileSystemObject*>(static_cast<const HierarchyObject&>(*this).retrieveById(id)); -} - - -inline -HierarchyObject::ObjectID FileSystemObject::getId() const -{ - return uniqueId; -} - - -inline -HierarchyObject::ObjectID FileSystemObject::getUniqueId() -{ - //warning: potential MT issue in the future! - static HierarchyObject::ObjectID id = 0; - return ++id; -} - - -inline CompareFilesResult FileMapping::getCategory() const { return cmpResult; @@ -583,7 +613,7 @@ CompareFilesResult FileMapping::getCategory() const inline -wxString FileMapping::getCatConflict() const +std::wstring FileMapping::getCatConflict() const { return cmpConflictDescr; } @@ -604,34 +634,36 @@ CompareDirResult DirMapping::getDirCategory() const inline -wxString DirMapping::getCatConflict() const +std::wstring DirMapping::getCatConflict() const { - return wxEmptyString; + return std::wstring(); } inline void FileSystemObject::setSyncDir(SyncDirection newDir) { - syncDir = static_cast<SyncDirectionIntern>(newDir); //should be safe by design + syncDir = newDir; //should be safe by design + syncDirConflict.clear(); + + notifySyncCfgChanged(); } inline -wxString FileSystemObject::getSyncOpConflict() const +void FileSystemObject::setSyncDirConflict(const std::wstring& description) { - //a sync operation conflict can occur when: - //1. category-conflict and syncDir == NONE -> problem finding category - //2. syncDir == SYNC_DIR_INT_CONFLICT -> problem finding sync direction - return syncDir == SYNC_DIR_INT_CONFLICT ? syncOpConflictDescr : getCatConflict(); + syncDir = SYNC_DIR_NONE; + syncDirConflict = description; + + notifySyncCfgChanged(); } inline -void FileSystemObject::setSyncDirConflict(const wxString& description) //set syncDir = SYNC_DIR_INT_CONFLICT +std::wstring FileSystemObject::getSyncOpConflict() const { - syncDir = SYNC_DIR_INT_CONFLICT; - syncOpConflictDescr = description; + return syncDirConflict; } @@ -646,20 +678,22 @@ inline void FileSystemObject::setActive(bool active) { selectedForSynchronization = active; + + notifySyncCfgChanged(); } inline SyncOperation FileSystemObject::getSyncOperation() const { - return getSyncOperation(getCategory(), selectedForSynchronization, syncDir); + return getSyncOperation(getCategory(), selectedForSynchronization, syncDir, syncDirConflict); } inline -SyncOperation FileSystemObject::testSyncOperation(bool selected, SyncDirection proposedDir) const +SyncOperation FileSystemObject::testSyncOperation(SyncDirection proposedDir) const { - return getSyncOperation(getCategory(), selected, static_cast<SyncDirectionIntern>(proposedDir)); //should be safe by design + return getSyncOperation(getCategory(), true, proposedDir, std::wstring()); //should be safe by design } @@ -700,121 +734,101 @@ const Zstring& FileSystemObject::getShortName<RIGHT_SIDE>() const template <SelectedSide side> inline -const Zstring FileSystemObject::getRelativeName() const +Zstring FileSystemObject::getRelativeName() const { - return isEmpty<side>() ? Zstring() : nameBuffer.parentRelNamePf + getShortName<side>(); + return isEmpty<side>() ? Zstring() : parent_.getObjRelativeNamePf() + getShortName<side>(); } inline -const Zstring FileSystemObject::getObjRelativeName() const +Zstring FileSystemObject::getObjRelativeName() const { - return nameBuffer.parentRelNamePf + getObjShortName(); + return parent_.getObjRelativeNamePf() + getObjShortName(); } inline -const Zstring& FileSystemObject::getObjShortName() const +Zstring FileSystemObject::getObjShortName() const { return isEmpty<LEFT_SIDE>() ? getShortName<RIGHT_SIDE>() : getShortName<LEFT_SIDE>(); } -inline -const Zstring FileSystemObject::getParentRelativeName() const -{ - return nameBuffer.parentRelNamePf.BeforeLast(FILE_NAME_SEPARATOR); //returns empty string if char not found -} - - template <SelectedSide side> inline -const Zstring FileSystemObject::getFullName() const +Zstring FileSystemObject::getFullName() const { - return isEmpty<side>() ? Zstring() : getBaseDirPf<side>() + nameBuffer.parentRelNamePf + getShortName<side>(); + return isEmpty<side>() ? Zstring() : getBaseDirPf<side>() + parent_.getObjRelativeNamePf() + getShortName<side>(); } -template <> -inline +template <> inline const Zstring& FileSystemObject::getBaseDirPf<LEFT_SIDE>() const { - return nameBuffer.baseDirPfL; + return root().getBaseDirPf<LEFT_SIDE>(); } -template <> -inline +template <> inline const Zstring& FileSystemObject::getBaseDirPf<RIGHT_SIDE>() const { - return nameBuffer.baseDirPfR; + return root().getBaseDirPf<RIGHT_SIDE>(); } -template <> -inline +template <> inline void FileSystemObject::removeObject<LEFT_SIDE>() { shortNameLeft_.clear(); removeObjectL(); + + setSyncDir(SYNC_DIR_NONE); //calls notifySyncCfgChanged() } -template <> -inline +template <> inline void FileSystemObject::removeObject<RIGHT_SIDE>() { shortNameRight_.clear(); removeObjectR(); + + setSyncDir(SYNC_DIR_NONE); //calls notifySyncCfgChanged() } inline -void FileSystemObject::synchronizeSides() +void FileSystemObject::copyToL() { - switch (syncDir) - { - case SYNC_DIR_INT_LEFT: - shortNameLeft_ = shortNameRight_; - copyToL(); - break; - case SYNC_DIR_INT_RIGHT: - shortNameRight_ = shortNameLeft_; - copyToR(); - break; - case SYNC_DIR_INT_NONE: - case SYNC_DIR_INT_CONFLICT: - assert(!"if nothing's todo then why arrive here?"); - break; - } - - syncDir = SYNC_DIR_INT_NONE; + assert(!isEmpty()); + shortNameLeft_ = shortNameRight_; + setSyncDir(SYNC_DIR_NONE); } inline -void FileSystemObject::swap() +void FileSystemObject::copyToR() { - std::swap(nameBuffer.baseDirPfL, nameBuffer.baseDirPfR); - std::swap(shortNameLeft_, shortNameRight_); + assert(!isEmpty()); + shortNameRight_ = shortNameLeft_; + setSyncDir(SYNC_DIR_NONE); } inline -void HierarchyObject::swap() +void FileSystemObject::flip() { - std::swap(baseDirLeft, baseDirRight); + std::swap(shortNameLeft_, shortNameRight_); - std::for_each(subFiles.begin(), subFiles.end(), std::mem_fun_ref(&FileMapping ::swap)); - std::for_each(subDirs .begin(), subDirs .end(), std::mem_fun_ref(&DirMapping ::swap)); - std::for_each(subLinks.begin(), subLinks.end(), std::mem_fun_ref(&SymLinkMapping::swap)); + notifySyncCfgChanged(); } inline -const Zstring& HierarchyObject::getRelativeNamePf() const +void HierarchyObject::flip() { - return relNamePf; + std::for_each(refSubFiles().begin(), refSubFiles().end(), std::mem_fun_ref(&FileMapping ::flip)); + std::for_each(refSubDirs ().begin(), refSubDirs ().end(), std::mem_fun_ref(&DirMapping ::flip)); + std::for_each(refSubLinks().begin(), refSubLinks().end(), std::mem_fun_ref(&SymLinkMapping::flip)); } @@ -822,7 +836,7 @@ inline DirMapping& HierarchyObject::addSubDir(const Zstring& shortNameLeft, const Zstring& shortNameRight) { - subDirs.push_back(DirMapping(shortNameLeft, shortNameRight, *this)); + subDirs.emplace_back(shortNameLeft, shortNameRight, *this); return subDirs.back(); } @@ -835,7 +849,7 @@ FileMapping& HierarchyObject::addSubFile( const Zstring& shortNameRight, const FileDescriptor& right) { - subFiles.push_back(FileMapping(shortNameLeft, left, defaultCmpResult, shortNameRight, right, *this)); + subFiles.emplace_back(shortNameLeft, left, defaultCmpResult, shortNameRight, right, *this); return subFiles.back(); } @@ -844,7 +858,7 @@ inline void HierarchyObject::addSubFile(const FileDescriptor& left, //file exists on left side only const Zstring& shortNameLeft) { - subFiles.push_back(FileMapping(shortNameLeft, left, FILE_LEFT_SIDE_ONLY, Zstring(), FileDescriptor(), *this)); + subFiles.emplace_back(shortNameLeft, left, FILE_LEFT_SIDE_ONLY, Zstring(), FileDescriptor(), *this); } @@ -852,7 +866,7 @@ inline void HierarchyObject::addSubFile(const Zstring& shortNameRight, //file exists on right side only const FileDescriptor& right) { - subFiles.push_back(FileMapping(Zstring(), FileDescriptor(), FILE_RIGHT_SIDE_ONLY, shortNameRight, right, *this)); + subFiles.emplace_back(Zstring(), FileDescriptor(), FILE_RIGHT_SIDE_ONLY, shortNameRight, right, *this); } @@ -864,7 +878,7 @@ SymLinkMapping& HierarchyObject::addSubLink( const Zstring& shortNameRight, const LinkDescriptor& right) { - subLinks.push_back(SymLinkMapping(shortNameLeft, left, defaultCmpResult, shortNameRight, right, *this)); + subLinks.emplace_back(shortNameLeft, left, defaultCmpResult, shortNameRight, right, *this); return subLinks.back(); } @@ -873,7 +887,7 @@ inline void HierarchyObject::addSubLink(const LinkDescriptor& left, //link exists on left side only const Zstring& shortNameLeft) { - subLinks.push_back(SymLinkMapping(shortNameLeft, left, SYMLINK_LEFT_SIDE_ONLY, Zstring(), LinkDescriptor(), *this)); + subLinks.emplace_back(shortNameLeft, left, SYMLINK_LEFT_SIDE_ONLY, Zstring(), LinkDescriptor(), *this); } @@ -881,66 +895,24 @@ inline void HierarchyObject::addSubLink(const Zstring& shortNameRight, //link exists on right side only const LinkDescriptor& right) { - subLinks.push_back(SymLinkMapping(Zstring(), LinkDescriptor(), SYMLINK_RIGHT_SIDE_ONLY, shortNameRight, right, *this)); -} - - -inline -const HierarchyObject::SubDirMapping& HierarchyObject::refSubDirs() const -{ - return subDirs; -} - - -inline -const HierarchyObject::SubFileMapping& HierarchyObject::refSubFiles() const -{ - return subFiles; -} - - -inline -const HierarchyObject::SubLinkMapping& HierarchyObject::refSubLinks() const -{ - return subLinks; -} - - -inline -HierarchyObject::SubDirMapping& HierarchyObject::refSubDirs() -{ - return const_cast<SubDirMapping&>(static_cast<const HierarchyObject*>(this)->refSubDirs()); -} - - -inline -HierarchyObject::SubFileMapping& HierarchyObject::refSubFiles() -{ - return const_cast<SubFileMapping&>(static_cast<const HierarchyObject*>(this)->refSubFiles()); + subLinks.emplace_back(Zstring(), LinkDescriptor(), SYMLINK_RIGHT_SIDE_ONLY, shortNameRight, right, *this); } inline -HierarchyObject::SubLinkMapping& HierarchyObject::refSubLinks() +void BaseDirMapping::flip() { - return const_cast<SubLinkMapping&>(static_cast<const HierarchyObject*>(this)->refSubLinks()); + HierarchyObject::flip(); + std::swap(baseDirPfL, baseDirPfR); } inline -void BaseDirMapping::swap() +void DirMapping::flip() { - //call base class versions - HierarchyObject::swap(); -} - -inline -void DirMapping::swap() -{ - //call base class versions - HierarchyObject::swap(); - FileSystemObject::swap(); + HierarchyObject ::flip(); //call base class versions + FileSystemObject::flip(); // //swap compare result switch (cmpResult) @@ -961,7 +933,7 @@ void DirMapping::swap() inline void DirMapping::removeObjectL() { - cmpResult = DIR_RIGHT_SIDE_ONLY; + cmpResult = isEmpty<RIGHT_SIDE>() ? DIR_EQUAL : DIR_RIGHT_SIDE_ONLY; std::for_each(refSubFiles().begin(), refSubFiles().end(), std::mem_fun_ref(&FileSystemObject::removeObject<LEFT_SIDE>)); std::for_each(refSubLinks().begin(), refSubLinks().end(), std::mem_fun_ref(&FileSystemObject::removeObject<LEFT_SIDE>)); std::for_each(refSubDirs(). begin(), refSubDirs() .end(), std::mem_fun_ref(&FileSystemObject::removeObject<LEFT_SIDE>)); @@ -971,7 +943,7 @@ void DirMapping::removeObjectL() inline void DirMapping::removeObjectR() { - cmpResult = DIR_LEFT_SIDE_ONLY; + cmpResult = isEmpty<LEFT_SIDE>() ? DIR_EQUAL : DIR_LEFT_SIDE_ONLY; std::for_each(refSubFiles().begin(), refSubFiles().end(), std::mem_fun_ref(&FileSystemObject::removeObject<RIGHT_SIDE>)); std::for_each(refSubLinks().begin(), refSubLinks().end(), std::mem_fun_ref(&FileSystemObject::removeObject<RIGHT_SIDE>)); std::for_each(refSubDirs(). begin(), refSubDirs(). end(), std::mem_fun_ref(&FileSystemObject::removeObject<RIGHT_SIDE>)); @@ -979,31 +951,30 @@ void DirMapping::removeObjectR() inline -void DirMapping::copyToL() +const HardFilter::FilterRef& BaseDirMapping::getFilter() const { - cmpResult = DIR_EQUAL; + return filter; } -inline -void DirMapping::copyToR() +template <> inline +bool BaseDirMapping::wasExisting<LEFT_SIDE>() const { - cmpResult = DIR_EQUAL; + return dirExistsLeft_; } -inline -const HardFilter::FilterRef& BaseDirMapping::getFilter() const +template <> inline +bool BaseDirMapping::wasExisting<RIGHT_SIDE>() const { - return filter; + return dirExistsRight_; } inline -void FileMapping::swap() +void FileMapping::flip() { - //call base class version - FileSystemObject::swap(); + FileSystemObject::flip(); //call base class version //swap compare result switch (cmpResult) @@ -1031,20 +1002,18 @@ void FileMapping::swap() } -template <CompareFilesResult res> -inline +template <CompareFilesResult res> inline void FileMapping::setCategory() { cmpResult = res; } -template <> -inline +template <> inline void FileMapping::setCategory<FILE_CONFLICT>(); //if conflict is detected, use setCategoryConflict! => method is not defined! inline -void FileMapping::setCategoryConflict(const wxString& description) +void FileMapping::setCategoryConflict(const std::wstring& description) { cmpResult = FILE_CONFLICT; cmpConflictDescr = description; @@ -1054,7 +1023,7 @@ void FileMapping::setCategoryConflict(const wxString& description) inline void FileMapping::removeObjectL() { - cmpResult = FILE_RIGHT_SIDE_ONLY; + cmpResult = isEmpty<RIGHT_SIDE>() ? FILE_EQUAL : FILE_RIGHT_SIDE_ONLY; dataLeft = FileDescriptor(); } @@ -1062,63 +1031,40 @@ void FileMapping::removeObjectL() inline void FileMapping::removeObjectR() { - cmpResult = FILE_LEFT_SIDE_ONLY; + cmpResult = isEmpty<LEFT_SIDE>() ? FILE_EQUAL : FILE_LEFT_SIDE_ONLY; dataRight = FileDescriptor(); } -inline -void FileMapping::copyToL() -{ - cmpResult = FILE_EQUAL; - dataLeft = dataRight; - //util::FileID()); //attention! do not copy FileID! It is retained on file renaming only! -} - - -inline -void FileMapping::copyToR() -{ - cmpResult = FILE_EQUAL; - dataRight = dataLeft; - //util::FileID()); //attention! do not copy FileID! It is retained on file renaming only! -} - - -template <> -inline +template <> inline zen::Int64 FileMapping::getLastWriteTime<LEFT_SIDE>() const { return dataLeft.lastWriteTimeRaw; } -template <> -inline +template <> inline zen::Int64 FileMapping::getLastWriteTime<RIGHT_SIDE>() const { return dataRight.lastWriteTimeRaw; } -template <> -inline +template <> inline zen::UInt64 FileMapping::getFileSize<LEFT_SIDE>() const { return dataLeft.fileSize; } -template <> -inline +template <> inline zen::UInt64 FileMapping::getFileSize<RIGHT_SIDE>() const { return dataRight.fileSize; } -template <SelectedSide side> -inline +template <SelectedSide side> inline const Zstring FileMapping::getExtension() const { //attention: Zstring::AfterLast() returns whole string if char not found! -> don't use @@ -1131,49 +1077,100 @@ const Zstring FileMapping::getExtension() const } -template <> -inline +template <> inline +void FileMapping::copyTo<LEFT_SIDE>(const FileDescriptor* srcDescr) //copy + update file attributes +{ + if (srcDescr) + dataRight = *srcDescr; + dataLeft = dataRight; + + cmpResult = FILE_EQUAL; + copyToL(); //copy FileSystemObject specific part +} + + +template <> inline +void FileMapping::copyTo<RIGHT_SIDE>(const FileDescriptor* srcDescr) //copy + update file attributes +{ + if (srcDescr) + dataLeft = *srcDescr; + dataRight = dataLeft; + + cmpResult = FILE_EQUAL; + copyToR(); //copy FileSystemObject specific part +} + + +template <> inline +void SymLinkMapping::copyTo<LEFT_SIDE>() //copy + update link attributes +{ + dataLeft = dataRight; + cmpResult = SYMLINK_EQUAL; + copyToL(); //copy FileSystemObject specific part +} + + +template <> inline +void SymLinkMapping::copyTo<RIGHT_SIDE>() //copy + update link attributes +{ + dataRight = dataLeft; + cmpResult = SYMLINK_EQUAL; + copyToR(); //copy FileSystemObject specific part +} + + +template <> inline +void DirMapping::copyTo<LEFT_SIDE>() +{ + cmpResult = DIR_EQUAL; + copyToL(); //copy FileSystemObject specific part +} + + +template <> inline +void DirMapping::copyTo<RIGHT_SIDE>() +{ + cmpResult = DIR_EQUAL; + copyToR(); //copy FileSystemObject specific part +} + + +template <> inline zen::Int64 SymLinkMapping::getLastWriteTime<LEFT_SIDE>() const { return dataLeft.lastWriteTimeRaw; } -template <> -inline +template <> inline zen::Int64 SymLinkMapping::getLastWriteTime<RIGHT_SIDE>() const { return dataRight.lastWriteTimeRaw; } -template <> -inline - +template <> inline LinkDescriptor::LinkType SymLinkMapping::getLinkType<LEFT_SIDE>() const { return dataLeft.type; } -template <> -inline +template <> inline LinkDescriptor::LinkType SymLinkMapping::getLinkType<RIGHT_SIDE>() const { return dataRight.type; } -template <> -inline +template <> inline const Zstring& SymLinkMapping::getTargetPath<LEFT_SIDE>() const { return dataLeft.targetPath; } -template <> -inline +template <> inline const Zstring& SymLinkMapping::getTargetPath<RIGHT_SIDE>() const { return dataRight.targetPath; @@ -1195,19 +1192,17 @@ CompareSymlinkResult SymLinkMapping::getLinkCategory() const inline -wxString SymLinkMapping::getCatConflict() const +std::wstring SymLinkMapping::getCatConflict() const { return cmpConflictDescr; } inline -void SymLinkMapping::swap() +void SymLinkMapping::flip() { - //call base class versions - FileSystemObject::swap(); + FileSystemObject::flip(); //call base class versions - //swap compare result switch (cmpResult) { case SYMLINK_LEFT_SIDE_ONLY: @@ -1236,7 +1231,7 @@ void SymLinkMapping::swap() inline void SymLinkMapping::removeObjectL() { - cmpResult = SYMLINK_RIGHT_SIDE_ONLY; + cmpResult = isEmpty<RIGHT_SIDE>() ? SYMLINK_EQUAL : SYMLINK_RIGHT_SIDE_ONLY; dataLeft = LinkDescriptor(); } @@ -1244,29 +1239,12 @@ void SymLinkMapping::removeObjectL() inline void SymLinkMapping::removeObjectR() { - cmpResult = SYMLINK_LEFT_SIDE_ONLY; + cmpResult = isEmpty<LEFT_SIDE>() ? SYMLINK_EQUAL : SYMLINK_LEFT_SIDE_ONLY; dataRight = LinkDescriptor(); } -inline -void SymLinkMapping::copyToL() -{ - cmpResult = SYMLINK_EQUAL; - dataLeft = dataRight; -} - - -inline -void SymLinkMapping::copyToR() -{ - cmpResult = SYMLINK_EQUAL; - dataRight = dataLeft; -} - - -template <CompareSymlinkResult res> -inline +template <CompareSymlinkResult res> inline void SymLinkMapping::setCategory() { cmpResult = res; @@ -1274,17 +1252,15 @@ void SymLinkMapping::setCategory() template <> -inline void SymLinkMapping::setCategory<SYMLINK_CONFLICT>(); //if conflict is detected, use setCategoryConflict! => method is not defined! inline -void SymLinkMapping::setCategoryConflict(const wxString& description) +void SymLinkMapping::setCategoryConflict(const std::wstring& description) { cmpResult = SYMLINK_CONFLICT; cmpConflictDescr = description; } - } #endif // FILEHIERARCHY_H_INCLUDED diff --git a/library/binary.cpp b/library/binary.cpp index 1fd8c55f..1e043d33 100644 --- a/library/binary.cpp +++ b/library/binary.cpp @@ -38,10 +38,7 @@ public: bufSize /= 2; } - operator size_t() const - { - return bufSize; - } + operator size_t() const { return bufSize; } private: static const size_t BUFFER_SIZE_MIN = 128 * 1024; @@ -69,13 +66,15 @@ private: bool zen::filesHaveSameContent(const Zstring& filename1, const Zstring& filename2, CompareCallback& callback) { - FileInput file1(filename1); //throw (FileError) - FileInput file2(filename2); //throw (FileError) + FileInput file1(filename1); //throw FileError + FileInput file2(filename2); //throw FileError static boost::thread_specific_ptr<std::vector<char>> cpyBuf1; static boost::thread_specific_ptr<std::vector<char>> cpyBuf2; - if (!cpyBuf1.get()) cpyBuf1.reset(new std::vector<char>()); - if (!cpyBuf2.get()) cpyBuf2.reset(new std::vector<char>()); + if (!cpyBuf1.get()) + cpyBuf1.reset(new std::vector<char>()); + if (!cpyBuf2.get()) + cpyBuf2.reset(new std::vector<char>()); std::vector<char>& memory1 = *cpyBuf1; std::vector<char>& memory2 = *cpyBuf2; diff --git a/library/custom_grid.cpp b/library/custom_grid.cpp index ccabbea9..b4d7af41 100644 --- a/library/custom_grid.cpp +++ b/library/custom_grid.cpp @@ -16,7 +16,6 @@ #include "../shared/custom_tooltip.h" #include "../shared/i18n.h" #include <wx/dcclient.h> -#include "icon_buffer.h" #include <wx/icon.h> #include <wx/tooltip.h> #include <wx/settings.h> @@ -272,100 +271,105 @@ protected: const FileSystemObject* fsObj = getRawData(row); if (fsObj) { - if (!fsObj->isEmpty<side>()) + struct GetValue : public FSObjectVisitor { - struct GetValue : public FSObjectVisitor + GetValue(xmlAccess::ColumnTypes colType, const FileSystemObject& fso) : colType_(colType), fsObj_(fso) {} + virtual void visit(const FileMapping& fileObj) { - GetValue(xmlAccess::ColumnTypes colType) : colType_(colType) {} - virtual void visit(const FileMapping& fileObj) + switch (colType_) { - switch (colType_) - { - case xmlAccess::FULL_PATH: - value = toWx(fileObj.getFullName<side>().BeforeLast(FILE_NAME_SEPARATOR)); - break; - case xmlAccess::FILENAME: //filename - value = toWx(fileObj.getShortName<side>()); - break; - case xmlAccess::REL_PATH: //relative path - value = toWx(fileObj.getParentRelativeName()); - break; - case xmlAccess::DIRECTORY: - value = toWx(fileObj.getBaseDirPf<side>()); - break; - case xmlAccess::SIZE: //file size + case xmlAccess::FULL_PATH: + value = toWx(fileObj.getFullName<side>().BeforeLast(FILE_NAME_SEPARATOR)); + break; + case xmlAccess::FILENAME: //filename + value = toWx(fileObj.getShortName<side>()); + break; + case xmlAccess::REL_PATH: //relative path + value = toWx(fileObj.getObjRelativeName().BeforeLast(FILE_NAME_SEPARATOR)); //returns empty string if ch not found + break; + case xmlAccess::DIRECTORY: + value = toWx(fileObj.getBaseDirPf<side>()); + break; + case xmlAccess::SIZE: //file size + if (!fsObj_.isEmpty<side>()) value = zen::toStringSep(fileObj.getFileSize<side>()); - break; - case xmlAccess::DATE: //date + break; + case xmlAccess::DATE: //date + if (!fsObj_.isEmpty<side>()) value = zen::utcTimeToLocalString(fileObj.getLastWriteTime<side>()); - break; - case xmlAccess::EXTENSION: //file extension - value = toWx(fileObj.getExtension<side>()); - break; - } + break; + case xmlAccess::EXTENSION: //file extension + value = toWx(fileObj.getExtension<side>()); + break; } + } - virtual void visit(const SymLinkMapping& linkObj) + virtual void visit(const SymLinkMapping& linkObj) + { + switch (colType_) { - switch (colType_) - { - case xmlAccess::FULL_PATH: - value = toWx(linkObj.getFullName<side>().BeforeLast(FILE_NAME_SEPARATOR)); - break; - case xmlAccess::FILENAME: //filename - value = toWx(linkObj.getShortName<side>()); - break; - case xmlAccess::REL_PATH: //relative path - value = toWx(linkObj.getParentRelativeName()); - break; - case xmlAccess::DIRECTORY: - value = toWx(linkObj.getBaseDirPf<side>()); - break; - case xmlAccess::SIZE: //file size + case xmlAccess::FULL_PATH: + value = toWx(linkObj.getFullName<side>().BeforeLast(FILE_NAME_SEPARATOR)); + break; + case xmlAccess::FILENAME: //filename + value = toWx(linkObj.getShortName<side>()); + break; + case xmlAccess::REL_PATH: //relative path + value = toWx(linkObj.getObjRelativeName().BeforeLast(FILE_NAME_SEPARATOR)); //returns empty string if ch not found + break; + case xmlAccess::DIRECTORY: + value = toWx(linkObj.getBaseDirPf<side>()); + break; + case xmlAccess::SIZE: //file size + if (!fsObj_.isEmpty<side>()) value = _("<Symlink>"); - break; - case xmlAccess::DATE: //date + break; + case xmlAccess::DATE: //date + if (!fsObj_.isEmpty<side>()) value = zen::utcTimeToLocalString(linkObj.getLastWriteTime<side>()); - break; - case xmlAccess::EXTENSION: //file extension - value = wxEmptyString; - break; - } + break; + case xmlAccess::EXTENSION: //file extension + value = wxEmptyString; + break; } + } - virtual void visit(const DirMapping& dirObj) + virtual void visit(const DirMapping& dirObj) + { + switch (colType_) { - switch (colType_) - { - case xmlAccess::FULL_PATH: - value = toWx(dirObj.getFullName<side>()); - break; - case xmlAccess::FILENAME: - value = toWx(dirObj.getShortName<side>()); - break; - case xmlAccess::REL_PATH: - value = toWx(dirObj.getParentRelativeName()); - break; - case xmlAccess::DIRECTORY: - value = toWx(dirObj.getBaseDirPf<side>()); - break; - case xmlAccess::SIZE: //file size + case xmlAccess::FULL_PATH: + value = toWx(dirObj.getFullName<side>()); + break; + case xmlAccess::FILENAME: + value = toWx(dirObj.getShortName<side>()); + break; + case xmlAccess::REL_PATH: + value = toWx(dirObj.getObjRelativeName().BeforeLast(FILE_NAME_SEPARATOR)); //returns empty string if ch not found + break; + case xmlAccess::DIRECTORY: + value = toWx(dirObj.getBaseDirPf<side>()); + break; + case xmlAccess::SIZE: //file size + if (!fsObj_.isEmpty<side>()) value = _("<Directory>"); - break; - case xmlAccess::DATE: //date - value = wxEmptyString; - break; - case xmlAccess::EXTENSION: //file extension + break; + case xmlAccess::DATE: //date + if (!fsObj_.isEmpty<side>()) value = wxEmptyString; - break; - } + break; + case xmlAccess::EXTENSION: //file extension + value = wxEmptyString; + break; } - xmlAccess::ColumnTypes colType_; - wxString value; - } getVal(getTypeAtPos(col)); - fsObj->accept(getVal); - return getVal.value; - } + } + xmlAccess::ColumnTypes colType_; + wxString value; + + const FileSystemObject& fsObj_; + } getVal(getTypeAtPos(col), *fsObj); + fsObj->accept(getVal); + return getVal.value; } //if data is not found: return wxEmptyString; @@ -381,12 +385,11 @@ protected: { virtual void visit(const FileMapping& fileObj) { - //Optimization: if filename exists on both sides, always use left side's file: - //Icon should be the same on both sides anyway... - if (!fileObj.isEmpty<LEFT_SIDE>() && !fileObj.isEmpty<RIGHT_SIDE>()) - iconName = fileObj.getFullName<LEFT_SIDE>(); - else - iconName = fileObj.getFullName<side>(); + //Optimization: if filename exists on both sides, always use left side's file + //if (!fileObj.isEmpty<LEFT_SIDE>() && !fileObj.isEmpty<RIGHT_SIDE>()) + // iconName = fileObj.getFullName<LEFT_SIDE>(); + //else -> now with thumbnails this isn't viable anymore + iconName = fileObj.getFullName<side>(); } virtual void visit(const SymLinkMapping& linkObj) { @@ -585,14 +588,15 @@ private: switch (fsObj->getCategory()) { case FILE_LEFT_SIDE_ONLY: - case FILE_RIGHT_SIDE_ONLY: + case FILE_LEFT_NEWER: result.first = *wxBLACK; - result.second = COLOR_CMP_GREEN; + result.second = COLOR_SYNC_BLUE; //COLOR_CMP_BLUE; break; - case FILE_LEFT_NEWER: + + case FILE_RIGHT_SIDE_ONLY: case FILE_RIGHT_NEWER: result.first = *wxBLACK; - result.second = COLOR_CMP_BLUE; + result.second = COLOR_SYNC_GREEN; //COLOR_CMP_GREEN; break; case FILE_DIFFERENT: result.first = *wxBLACK; @@ -688,10 +692,22 @@ bool CustomGrid::isLeadGrid() const } +void CustomGrid::setIconManager(const std::shared_ptr<IconBuffer>& iconBuffer) +{ + if (iconBuffer.get()) + SetDefaultRowSize(iconBuffer->getSize() + 1, true); //+ 1 for line between rows + else + SetDefaultRowSize(IconBuffer(IconBuffer::SIZE_SMALL).getSize() + 1, true); //currently iconBuffer is always bound, but we may use it as a "no icon" status at some time... + + enableFileIcons(iconBuffer); + Refresh(); +} + + void CustomGrid::RefreshCell(int row, int col) { wxRect rectScrolled(CellToRect(row, col)); - + //use: wxRect rect = CellToRect( row, col ); ? CalcScrolledPosition(rectScrolled.x, rectScrolled.y, &rectScrolled.x, &rectScrolled.y); GetGridWindow()->RefreshRect(rectScrolled); //note: CellToRect() and YToRow work on m_gridWindow NOT on the whole grid! @@ -943,8 +959,6 @@ bool gridsShouldBeCleared(const wxEvent& event) if (mouseEvent->ButtonDown(wxMOUSE_BTN_LEFT)) return true; - - return false; } else { @@ -980,8 +994,6 @@ bool gridsShouldBeCleared(const wxEvent& event) case WXK_ESCAPE: return true; } - - return false; } } @@ -1060,7 +1072,7 @@ void CustomGrid::adjustGridHeights(wxEvent& event) void CustomGrid::updateGridSizes() { - if(getGridDataTable()) + if (getGridDataTable()) getGridDataTable()->updateGridSizes(); } @@ -1100,9 +1112,9 @@ void CustomGrid::DrawColLabel(wxDC& dc, int col) if (col == m_marker.first) { if (m_marker.second == ASCENDING) - dc.DrawBitmap(GlobalResources::instance().getImage(wxT("smallUp")), GetColRight(col) - 16 - 2, 2, true); //respect 2-pixel border + dc.DrawBitmap(GlobalResources::getImage(wxT("smallUp")), GetColRight(col) - 16 - 2, 2, true); //respect 2-pixel border else - dc.DrawBitmap(GlobalResources::instance().getImage(wxT("smallDown")), GetColRight(col) - 16 - 2, 2, true); //respect 2-pixel border + dc.DrawBitmap(GlobalResources::getImage(wxT("smallDown")), GetColRight(col) - 16 - 2, 2, true); //respect 2-pixel border } } @@ -1178,13 +1190,15 @@ std::set<size_t> CustomGrid::getAllSelectedRows() const //############################################################################################ //CustomGrid specializations -template <bool showFileIcons> class GridCellRenderer : public wxGridCellStringRenderer { public: - GridCellRenderer(CustomGridRim::LoadSuccess& loadIconSuccess, const CustomGridTableRim* gridDataTable) : - m_loadIconSuccess(loadIconSuccess), - m_gridDataTable(gridDataTable) {} + GridCellRenderer(CustomGridRim::FailedIconLoad& failedLoads, + const CustomGridTableRim* gridDataTable, + const std::shared_ptr<zen::IconBuffer>& iconBuffer) : + failedLoads_(failedLoads), + m_gridDataTable(gridDataTable), + iconBuffer_(iconBuffer) {} virtual void Draw(wxGrid& grid, @@ -1196,79 +1210,68 @@ public: { //############## show windows explorer file icons ###################### - if (showFileIcons && //evaluate at compile time + if (iconBuffer_.get() && m_gridDataTable->getTypeAtPos(col) == xmlAccess::FILENAME) { - if (rect.GetWidth() >= IconBuffer::ICON_SIZE) + const int iconSize = iconBuffer_->getSize(); + if (rect.GetWidth() >= iconSize) { // Partitioning: - // _____________________ - // | 2 pix | icon | rest | - // --------------------- + // ____________________________ + // | 2 pix border | icon | rest | + // ---------------------------- + { + //clear area where icon will be placed (including border) + wxRect rectShrinked(rect); + rectShrinked.SetWidth(LEFT_BORDER + iconSize); //add 2 pixel border + wxGridCellRenderer::Draw(grid, attr, dc, rectShrinked, row, col, isSelected); + } - //clear area where icon will be placed - wxRect rectShrinked(rect); - rectShrinked.SetWidth(IconBuffer::ICON_SIZE + LEFT_BORDER); //add 2 pixel border - wxGridCellRenderer::Draw(grid, attr, dc, rectShrinked, row, col, isSelected); + { + //draw rest + wxRect rest(rect); //unscrolled + rest.x += LEFT_BORDER + iconSize; + rest.width -= LEFT_BORDER + iconSize; + wxGridCellStringRenderer::Draw(grid, attr, dc, rest, row, col, isSelected); + } - //draw rest - wxRect rest(rect); //unscrolled - rest.x += IconBuffer::ICON_SIZE + LEFT_BORDER; - rest.width -= IconBuffer::ICON_SIZE + LEFT_BORDER; - wxGridCellStringRenderer::Draw(grid, attr, dc, rest, row, col, isSelected); + wxRect rectIcon(rect); + rectIcon.SetWidth(iconSize); //set to icon area only + rectIcon.x += LEFT_BORDER; // //try to draw icon //retrieve grid data const Zstring fileName = m_gridDataTable->getIconFile(row); if (!fileName.empty()) { + wxIcon icon; + //first check if it is a directory icon: if (fileName == Zstr("folder")) - { - dc.DrawIcon(IconBuffer::getDirectoryIcon(), rectShrinked.GetX() + LEFT_BORDER, rectShrinked.GetY()); - m_loadIconSuccess[row] = true; //save status of last icon load -> used for async. icon loading - } + icon = iconBuffer_->genericDirIcon(); else //retrieve file icon { - wxIcon icon; - bool iconDrawnFully = false; + if (!iconBuffer_->requestFileIcon(fileName, &icon)) //returns false if icon is not in buffer { - const bool loadSuccess = IconBuffer::getInstance().requestFileIcon(fileName, &icon); //returns false if icon is not in buffer - if (loadSuccess) - { - //----------------------------------------------------------------------------------------------- - //only mark as successful if icon was drawn fully! - //(attention: when scrolling, rows get partially updated, which can result in the upper half being blank!) - - //rect where icon was placed - wxRect iconRect(rect); //unscrolled - iconRect.x += LEFT_BORDER; - iconRect.SetWidth(IconBuffer::ICON_SIZE); - - //convert to scrolled coordinates - grid.CalcScrolledPosition(iconRect.x, iconRect.y, &iconRect.x, &iconRect.y); - - wxRegionIterator regionsInv(grid.GetGridWindow()->GetUpdateRegion()); - while (regionsInv) - { - if (regionsInv.GetRect().Contains(iconRect)) - { - iconDrawnFully = true; - break; - } - ++regionsInv; - } - } - else - icon = IconBuffer::getFileIcon(); //better than nothing - } + icon = iconBuffer_->genericFileIcon(); //better than nothing - if (icon.IsOk()) - dc.DrawIcon(icon, rectShrinked.GetX() + LEFT_BORDER, rectShrinked.GetY()); + failedLoads_.insert(row); //save status of failed icon load -> used for async. icon loading + //falsify only! we want to avoid writing incorrect success values when only partially updating the DC, e.g. when scrolling, + //see repaint behavior of ::ScrollWindow() function! + } + } - //----------------------------------------------------------------------------------------------- - //save status of last icon load -> used for async. icon loading - m_loadIconSuccess[row] = iconDrawnFully; + if (icon.IsOk()) + { + int posX = rectIcon.GetX(); + int posY = rectIcon.GetY(); + //center icon if it is too small + if (rectIcon.GetWidth() > icon.GetWidth()) + posX += (rectIcon.GetWidth() - icon.GetWidth()) / 2; + if (rectIcon.GetHeight() > icon.GetHeight()) + posY += (rectIcon.GetHeight() - icon.GetHeight()) / 2; + + dc.DrawIcon(icon, posX, posY); } } return; @@ -1285,11 +1288,11 @@ public: wxDC& dc, int row, int col) { - if (showFileIcons && //evaluate at compile time + if (iconBuffer_.get() && //evaluate at compile time m_gridDataTable->getTypeAtPos(col) == xmlAccess::FILENAME) { wxSize rv = wxGridCellStringRenderer::GetBestSize(grid, attr, dc, row, col); - rv.SetWidth(rv.GetWidth() + LEFT_BORDER + IconBuffer::ICON_SIZE); + rv.SetWidth(rv.GetWidth() + LEFT_BORDER + iconBuffer_->getSize()); return rv; } @@ -1299,8 +1302,9 @@ public: private: - CustomGridRim::LoadSuccess& m_loadIconSuccess; + CustomGridRim::FailedIconLoad& failedLoads_; const CustomGridTableRim* const m_gridDataTable; + std::shared_ptr<zen::IconBuffer> iconBuffer_; static const int LEFT_BORDER = 2; }; @@ -1313,7 +1317,7 @@ CustomGridRim::CustomGridRim(wxWindow* parent, const wxSize& size, long style, const wxString& name) : - CustomGrid(parent, id, pos, size, style, name), fileIconsAreEnabled(false), otherGrid(NULL) + CustomGrid(parent, id, pos, size, style, name), otherGrid(NULL) { Connect(wxEVT_GRID_COL_SIZE, wxGridSizeEventHandler(CustomGridRim::OnResizeColumn), NULL, this); //row-based tooltip } @@ -1491,7 +1495,7 @@ void CustomGridRim::setColumnAttributes(const xmlAccess::ColumnAttributes& attr) if (getTypeAtPos(i) == xmlAccess::SIZE) { wxGridCellAttr* cellAttributes = GetOrCreateCellAttr(0, i); - cellAttributes->SetAlignment(wxALIGN_LEFT,wxALIGN_CENTRE); + cellAttributes->SetAlignment(wxALIGN_LEFT, wxALIGN_CENTRE); SetColAttr(i, cellAttributes); break; } @@ -1647,20 +1651,14 @@ void CustomGridRim::autoSizeColumns() //performance optimized column resizer (a } -void CustomGridRim::enableFileIcons(const bool value) +void CustomGridRim::enableFileIcons(const std::shared_ptr<IconBuffer>& iconBuffer) { - fileIconsAreEnabled = value; - - if (value) - SetDefaultRenderer(new GridCellRenderer<true>(loadIconSuccess, getGridDataTableRim())); //SetDefaultRenderer takes ownership! - else - SetDefaultRenderer(new GridCellRenderer<false>(loadIconSuccess, getGridDataTableRim())); - - Refresh(); + iconBuffer_ = iconBuffer; + SetDefaultRenderer(new GridCellRenderer(failedLoads, getGridDataTableRim(), iconBuffer)); //SetDefaultRenderer takes ownership! } -CustomGridRim::VisibleRowRange CustomGridRim::getVisibleRows() +std::pair<CustomGridRim::RowBegin, CustomGridRim::RowEnd> CustomGridRim::getVisibleRows() { int dummy = -1; int height = -1; @@ -1668,17 +1666,17 @@ CustomGridRim::VisibleRowRange CustomGridRim::getVisibleRows() if (height >= 0) { - const int topRow = mousePosToCell(wxPoint(0, 0)).first; - if (topRow >= 0) - { - const int rowCount = static_cast<int>(ceil(height / static_cast<double>(GetDefaultRowSize()))); // = height / rowHeight rounded up - const int bottomRow = topRow + rowCount - 1; + const int rowTop = mousePosToCell(wxPoint(0, 0)).first; + int rowEnd = mousePosToCell(wxPoint(0, height)).first; + if (rowEnd == -1) //when scrolling to the very end, there are a few border pixels that do not belong to any row + rowEnd = GetNumberRows(); + else + ++rowEnd; - return VisibleRowRange(topRow, bottomRow); //"top" means here top of the screen: => smaller value - } + if (0 <= rowTop && rowTop <= rowEnd) + return std::make_pair(rowTop, rowEnd); //"top" means here top of the screen => smaller value } - - return VisibleRowRange(0, 0); + return std::make_pair(0, 0); } @@ -1691,45 +1689,53 @@ CustomGridTableRim* CustomGridRim::getGridDataTableRim() const void CustomGridRim::getIconsToBeLoaded(std::vector<Zstring>& newLoad) //loads all (not yet) drawn icons { + //don't check too often! give worker thread some time to fetch data + newLoad.clear(); - if (fileIconsAreEnabled) //don't check too often! give worker thread some time to fetch data + if (iconBuffer_.get()) { const CustomGridTableRim* gridDataTable = getGridDataTableRim(); if (!gridDataTable) return; - const VisibleRowRange rowsOnScreen = getVisibleRows(); const int totalCols = const_cast<CustomGridTableRim*>(gridDataTable)->GetNumberCols(); const int totalRows = const_cast<CustomGridTableRim*>(gridDataTable)->GetNumberRows(); + //determine column + const int colFilename = [&]() -> int + { + for (int k = 0; k < totalCols; ++k) + if (gridDataTable->getTypeAtPos(k) == xmlAccess::FILENAME) + return k; + return -1; + }(); + if (colFilename < 0) + return; + + const auto rowsOnScreen = getVisibleRows(); + //loop over all visible rows const int firstRow = static_cast<int>(rowsOnScreen.first); - const int lastRow = std::min(int(rowsOnScreen.second), totalRows - 1); - const int rowNo = lastRow - firstRow + 1; + const int rowNo = std::min(static_cast<int>(rowsOnScreen.second), totalRows) - firstRow; - for (int i = 0; i < rowNo; ++i) + for (int i = 0; i < rowNo; ++i) { - //alternate when adding rows: first, last, first + 1, last - 1 ... - const int currentRow = i % 2 == 0 ? - firstRow + i / 2 : - lastRow - (i - 1) / 2; + //alternate when adding rows: first, last, first + 1, last - 1 ... -> Icon buffer will then load reversely, i.e. from inside out + const int currentRow = firstRow + (i % 2 == 0 ? + i / 2 : + rowNo - 1 - (i - 1) / 2); - LoadSuccess::const_iterator j = loadIconSuccess.find(currentRow); - if (j != loadIconSuccess.end() && j->second == false) //find failed attempts to load icon + if (failedLoads.find(currentRow) != failedLoads.end()) //find failed attempts to load icon { const Zstring fileName = gridDataTable->getIconFile(currentRow); if (!fileName.empty()) { //test if they are already loaded in buffer: - if (zen::IconBuffer::getInstance().requestFileIcon(fileName)) + if (iconBuffer_->requestFileIcon(fileName)) { //exists in buffer: refresh Row - for (int k = 0; k < totalCols; ++k) - if (gridDataTable->getTypeAtPos(k) == xmlAccess::FILENAME) - { - RefreshCell(currentRow, k); - break; - } + RefreshCell(currentRow, colFilename); //do a *full* refresh for *every* failed load to update partial DC updates while scrolling + failedLoads.erase(currentRow); // } else //not yet in buffer: mark for async. loading { @@ -1755,7 +1761,7 @@ IconUpdater::IconUpdater(CustomGridLeft* leftGrid, CustomGridRight* rightGrid) : } -IconUpdater::~IconUpdater() {} //non-inline destructor for std::auto_ptr to work with forward declaration +IconUpdater::~IconUpdater() {} void IconUpdater::loadIconsAsynchronously(wxEvent& event) //loads all (not yet) drawn icons @@ -1769,7 +1775,8 @@ void IconUpdater::loadIconsAsynchronously(wxEvent& event) //loads all (not yet) //merge vectors newLoad.insert(newLoad.end(), iconsLeft.begin(), iconsLeft.end()); - zen::IconBuffer::getInstance().setWorkload(newLoad); + if (m_leftGrid->iconBuffer_.get()) + m_leftGrid->iconBuffer_->setWorkload(newLoad); //event.Skip(); } @@ -1930,7 +1937,7 @@ CustomGridMiddle::CustomGridMiddle(wxWindow* parent, } -CustomGridMiddle::~CustomGridMiddle() {} //non-inline destructor for std::auto_ptr to work with forward declaration +CustomGridMiddle::~CustomGridMiddle() {} bool CustomGridMiddle::CreateGrid(int numRows, int numCols, wxGrid::wxGridSelectionModes selmode) @@ -2039,33 +2046,33 @@ void CustomGridMiddle::showToolTip(int rowNumber, wxPoint pos) switch (syncOp) { case SO_CREATE_NEW_LEFT: - toolTip->show(getDescription(syncOp), pos, &GlobalResources::instance().getImage(wxT("syncCreateLeftAct"))); + toolTip->show(getDescription(syncOp), pos, &GlobalResources::getImage(wxT("createLeft"))); break; case SO_CREATE_NEW_RIGHT: - toolTip->show(getDescription(syncOp), pos, &GlobalResources::instance().getImage(wxT("syncCreateRightAct"))); + toolTip->show(getDescription(syncOp), pos, &GlobalResources::getImage(wxT("createRight"))); break; case SO_DELETE_LEFT: - toolTip->show(getDescription(syncOp), pos, &GlobalResources::instance().getImage(wxT("syncDeleteLeftAct"))); + toolTip->show(getDescription(syncOp), pos, &GlobalResources::getImage(wxT("deleteLeft"))); break; case SO_DELETE_RIGHT: - toolTip->show(getDescription(syncOp), pos, &GlobalResources::instance().getImage(wxT("syncDeleteRightAct"))); + toolTip->show(getDescription(syncOp), pos, &GlobalResources::getImage(wxT("deleteRight"))); break; case SO_OVERWRITE_LEFT: case SO_COPY_METADATA_TO_LEFT: - toolTip->show(getDescription(syncOp), pos, &GlobalResources::instance().getImage(wxT("syncDirLeftAct"))); + toolTip->show(getDescription(syncOp), pos, &GlobalResources::getImage(wxT("updateLeft"))); break; case SO_OVERWRITE_RIGHT: case SO_COPY_METADATA_TO_RIGHT: - toolTip->show(getDescription(syncOp), pos, &GlobalResources::instance().getImage(wxT("syncDirRightAct"))); + toolTip->show(getDescription(syncOp), pos, &GlobalResources::getImage(wxT("updateRight"))); break; case SO_DO_NOTHING: - toolTip->show(getDescription(syncOp), pos, &GlobalResources::instance().getImage(wxT("syncDirNoneAct"))); + toolTip->show(getDescription(syncOp), pos, &GlobalResources::getImage(wxT("none"))); break; case SO_EQUAL: - toolTip->show(getDescription(syncOp), pos, &GlobalResources::instance().getImage(wxT("equalAct"))); + toolTip->show(getDescription(syncOp), pos, &GlobalResources::getImage(wxT("equal"))); break; case SO_UNRESOLVED_CONFLICT: - toolTip->show(fsObj->getSyncOpConflict(), pos, &GlobalResources::instance().getImage(wxT("conflictAct"))); + toolTip->show(fsObj->getSyncOpConflict(), pos, &GlobalResources::getImage(wxT("conflict"))); break; }; } @@ -2075,28 +2082,28 @@ void CustomGridMiddle::showToolTip(int rowNumber, wxPoint pos) switch (cmpRes) { case FILE_LEFT_SIDE_ONLY: - toolTip->show(getDescription(cmpRes), pos, &GlobalResources::instance().getImage(wxT("leftOnlyAct"))); + toolTip->show(getDescription(cmpRes), pos, &GlobalResources::getImage(wxT("leftOnly"))); break; case FILE_RIGHT_SIDE_ONLY: - toolTip->show(getDescription(cmpRes), pos, &GlobalResources::instance().getImage(wxT("rightOnlyAct"))); + toolTip->show(getDescription(cmpRes), pos, &GlobalResources::getImage(wxT("rightOnly"))); break; case FILE_LEFT_NEWER: - toolTip->show(getDescription(cmpRes), pos, &GlobalResources::instance().getImage(wxT("leftNewerAct"))); + toolTip->show(getDescription(cmpRes), pos, &GlobalResources::getImage(wxT("leftNewer"))); break; case FILE_RIGHT_NEWER: - toolTip->show(getDescription(cmpRes), pos, &GlobalResources::instance().getImage(wxT("rightNewerAct"))); + toolTip->show(getDescription(cmpRes), pos, &GlobalResources::getImage(wxT("rightNewer"))); break; case FILE_DIFFERENT: - toolTip->show(getDescription(cmpRes), pos, &GlobalResources::instance().getImage(wxT("differentAct"))); + toolTip->show(getDescription(cmpRes), pos, &GlobalResources::getImage(wxT("different"))); break; case FILE_EQUAL: - toolTip->show(getDescription(cmpRes), pos, &GlobalResources::instance().getImage(wxT("equalAct"))); + toolTip->show(getDescription(cmpRes), pos, &GlobalResources::getImage(wxT("equal"))); break; case FILE_DIFFERENT_METADATA: - toolTip->show(getDescription(cmpRes), pos, &GlobalResources::instance().getImage(wxT("conflictAct"))); + toolTip->show(getDescription(cmpRes), pos, &GlobalResources::getImage(wxT("conflict"))); break; case FILE_CONFLICT: - toolTip->show(fsObj->getCatConflict(), pos, &GlobalResources::instance().getImage(wxT("conflictAct"))); + toolTip->show(fsObj->getCatConflict(), pos, &GlobalResources::getImage(wxT("conflict"))); break; } } @@ -2259,16 +2266,14 @@ void GridCellRendererMiddle::Draw(wxGrid& grid, if (rowIsHighlighted && m_gridMiddle.highlightedPos == CustomGridMiddle::BLOCKPOS_CHECK_BOX) { - if (fsObj->isActive()) - dc.DrawLabel(wxEmptyString, GlobalResources::instance().getImage(wxT("checkboxTrueFocus")), rectShrinked, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); - else - dc.DrawLabel(wxEmptyString, GlobalResources::instance().getImage(wxT("checkboxFalseFocus")), rectShrinked, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); + dc.DrawLabel(wxEmptyString, GlobalResources::getImage(fsObj->isActive() ? + wxT("checkboxTrueFocus") : + wxT("checkboxFalseFocus")), rectShrinked, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); } - //default - else if (fsObj->isActive()) - dc.DrawLabel(wxEmptyString, GlobalResources::instance().getImage(wxT("checkboxTrue")), rectShrinked, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); - else - dc.DrawLabel(wxEmptyString, GlobalResources::instance().getImage(wxT("checkboxFalse")), rectShrinked, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); + else //default + dc.DrawLabel(wxEmptyString, GlobalResources::getImage(fsObj->isActive() ? + wxT("checkboxTrue") : + wxT("checkboxFalse")), rectShrinked, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); //clean remaining block of rect that will receive image of checkbox/directions rectShrinked.SetWidth(rect.GetWidth() - CHECK_BOX_WIDTH); @@ -2288,13 +2293,13 @@ void GridCellRendererMiddle::Draw(wxGrid& grid, case CustomGridMiddle::BLOCKPOS_CHECK_BOX: break; case CustomGridMiddle::BLOCKPOS_LEFT: - dc.DrawLabel(wxEmptyString, getSyncOpImage(fsObj->testSyncOperation(true, SYNC_DIR_LEFT)), rectShrinked, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); + dc.DrawLabel(wxEmptyString, getSyncOpImage(fsObj->testSyncOperation(SYNC_DIR_LEFT)), rectShrinked, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); break; case CustomGridMiddle::BLOCKPOS_MIDDLE: - dc.DrawLabel(wxEmptyString, getSyncOpImage(fsObj->testSyncOperation(true, SYNC_DIR_NONE)), rectShrinked, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL); + dc.DrawLabel(wxEmptyString, getSyncOpImage(fsObj->testSyncOperation(SYNC_DIR_NONE)), rectShrinked, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL); break; case CustomGridMiddle::BLOCKPOS_RIGHT: - dc.DrawLabel(wxEmptyString, getSyncOpImage(fsObj->testSyncOperation(true, SYNC_DIR_RIGHT)), rectShrinked, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL); + dc.DrawLabel(wxEmptyString, getSyncOpImage(fsObj->testSyncOperation(SYNC_DIR_RIGHT)), rectShrinked, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL); break; } else //default @@ -2308,26 +2313,26 @@ void GridCellRendererMiddle::Draw(wxGrid& grid, switch (fsObj->getCategory()) { case FILE_LEFT_SIDE_ONLY: - dc.DrawLabel(wxEmptyString, GlobalResources::instance().getImage(wxT("leftOnlySmall")), rectShrinked, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL); + dc.DrawLabel(wxEmptyString, GlobalResources::getImage(wxT("leftOnlySmall")), rectShrinked, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL); break; case FILE_RIGHT_SIDE_ONLY: - dc.DrawLabel(wxEmptyString, GlobalResources::instance().getImage(wxT("rightOnlySmall")), rectShrinked, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL); + dc.DrawLabel(wxEmptyString, GlobalResources::getImage(wxT("rightOnlySmall")), rectShrinked, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL); break; case FILE_LEFT_NEWER: - dc.DrawLabel(wxEmptyString, GlobalResources::instance().getImage(wxT("leftNewerSmall")), rectShrinked, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL); + dc.DrawLabel(wxEmptyString, GlobalResources::getImage(wxT("leftNewerSmall")), rectShrinked, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL); break; case FILE_RIGHT_NEWER: - dc.DrawLabel(wxEmptyString, GlobalResources::instance().getImage(wxT("rightNewerSmall")), rectShrinked, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL); + dc.DrawLabel(wxEmptyString, GlobalResources::getImage(wxT("rightNewerSmall")), rectShrinked, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL); break; case FILE_DIFFERENT: - dc.DrawLabel(wxEmptyString, GlobalResources::instance().getImage(wxT("differentSmall")), rectShrinked, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL); + dc.DrawLabel(wxEmptyString, GlobalResources::getImage(wxT("differentSmall")), rectShrinked, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL); break; case FILE_EQUAL: - dc.DrawLabel(wxEmptyString, GlobalResources::instance().getImage(wxT("equalSmall")), rectShrinked, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL); + dc.DrawLabel(wxEmptyString, GlobalResources::getImage(wxT("equalSmall")), rectShrinked, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL); break; case FILE_CONFLICT: case FILE_DIFFERENT_METADATA: - dc.DrawLabel(wxEmptyString, GlobalResources::instance().getImage(wxT("conflictSmall")), rectShrinked, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL); + dc.DrawLabel(wxEmptyString, GlobalResources::getImage(wxT("conflictSmall")), rectShrinked, wxALIGN_CENTER | wxALIGN_CENTER_VERTICAL); break; } } @@ -2362,9 +2367,9 @@ void CustomGridMiddle::DrawColLabel(wxDC& dc, int col) const wxRect rect(GetColLeft(col), 0, GetColWidth(col), GetColLabelSize()); if (getGridDataTableMiddle()->syncPreviewIsActive()) - dc.DrawLabel(wxEmptyString, GlobalResources::instance().getImage(wxT("syncViewSmall")), rect, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL); + dc.DrawLabel(wxEmptyString, GlobalResources::getImage(wxT("syncViewSmall")), rect, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL); else - dc.DrawLabel(wxEmptyString, GlobalResources::instance().getImage(wxT("cmpViewSmall")), rect, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL); + dc.DrawLabel(wxEmptyString, GlobalResources::getImage(wxT("cmpViewSmall")), rect, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL); } @@ -2373,25 +2378,25 @@ const wxBitmap& zen::getSyncOpImage(SyncOperation syncOp) switch (syncOp) //evaluate comparison result and sync direction { case SO_CREATE_NEW_LEFT: - return GlobalResources::instance().getImage(wxT("createLeftSmall")); + return GlobalResources::getImage(wxT("createLeftSmall")); case SO_CREATE_NEW_RIGHT: - return GlobalResources::instance().getImage(wxT("createRightSmall")); + return GlobalResources::getImage(wxT("createRightSmall")); case SO_DELETE_LEFT: - return GlobalResources::instance().getImage(wxT("deleteLeftSmall")); + return GlobalResources::getImage(wxT("deleteLeftSmall")); case SO_DELETE_RIGHT: - return GlobalResources::instance().getImage(wxT("deleteRightSmall")); + return GlobalResources::getImage(wxT("deleteRightSmall")); case SO_OVERWRITE_RIGHT: case SO_COPY_METADATA_TO_RIGHT: - return GlobalResources::instance().getImage(wxT("syncDirRightSmall")); + return GlobalResources::getImage(wxT("updateRightSmall")); case SO_OVERWRITE_LEFT: case SO_COPY_METADATA_TO_LEFT: - return GlobalResources::instance().getImage(wxT("syncDirLeftSmall")); + return GlobalResources::getImage(wxT("updateLeftSmall")); case SO_DO_NOTHING: - return GlobalResources::instance().getImage(wxT("syncDirNoneSmall")); + return GlobalResources::getImage(wxT("noneSmall")); case SO_EQUAL: - return GlobalResources::instance().getImage(wxT("equalSmall")); + return GlobalResources::getImage(wxT("equalSmall")); case SO_UNRESOLVED_CONFLICT: - return GlobalResources::instance().getImage(wxT("conflictSmall")); + return GlobalResources::getImage(wxT("conflictSmall")); } return wxNullBitmap; //dummy diff --git a/library/custom_grid.h b/library/custom_grid.h index 6b577011..a1bce692 100644 --- a/library/custom_grid.h +++ b/library/custom_grid.h @@ -10,10 +10,10 @@ #include <vector> #include <wx/grid.h> #include "process_xml.h" -#include <map> #include <memory> #include <set> #include "../file_hierarchy.h" +#include "icon_buffer.h" class CustomGridTable; @@ -75,20 +75,21 @@ public: //set sort direction indicator on UI typedef int SortColumn; + //notify wxGrid that underlying table size has changed + virtual void updateGridSizes(); + enum SortDirection { ASCENDING, DESCENDING }; - - //notify wxGrid that underlying table size has changed - virtual void updateGridSizes(); - typedef std::pair<SortColumn, SortDirection> SortMarker; void setSortMarker(SortMarker marker); bool isLeadGrid() const; + void setIconManager(const std::shared_ptr<zen::IconBuffer>& iconBuffer); + protected: void RefreshCell(int row, int col); virtual void DrawColLabel(wxDC& dc, int col); @@ -105,6 +106,7 @@ private: virtual void alignOtherGrids(CustomGrid* gridLeft, CustomGrid* gridMiddle, CustomGrid* gridRight) = 0; void adjustGridHeights(wxEvent& event); + virtual void enableFileIcons(const std::shared_ptr<zen::IconBuffer>& iconBuffer) = 0; CustomGrid* m_gridLeft; CustomGrid* m_gridMiddle; @@ -116,7 +118,6 @@ private: }; -template <bool showFileIcons> class GridCellRenderer; @@ -125,7 +126,7 @@ class IconUpdater : private wxEvtHandler //update file icons periodically: use S { public: IconUpdater(CustomGridLeft* leftGrid, CustomGridRight* rightGrid); - ~IconUpdater(); //non-inline destructor for std::auto_ptr to work with forward declaration + ~IconUpdater(); private: void loadIconsAsynchronously(wxEvent& event); //loads all (not yet) drawn icons @@ -133,7 +134,7 @@ private: CustomGridRim* m_leftGrid; CustomGridRim* m_rightGrid; - std::auto_ptr<wxTimer> m_timer; //user timer event to periodically update icons: better than idle event because also active when scrolling! :) + std::unique_ptr<wxTimer> m_timer; //user timer event to periodically update icons: better than idle event because also active when scrolling! :) }; @@ -141,7 +142,6 @@ private: class CustomGridRim : public CustomGrid { friend class IconUpdater; - template <bool showFileIcons> friend class GridCellRenderer; public: @@ -162,8 +162,6 @@ public: void autoSizeColumns(); //performance optimized column resizer - void enableFileIcons(const bool value); - virtual void updateGridSizes(); protected: @@ -174,6 +172,7 @@ protected: private: CustomGridTableRim* getGridDataTableRim() const; + virtual void enableFileIcons(const std::shared_ptr<zen::IconBuffer>& iconBuffer); void OnResizeColumn(wxGridSizeEvent& event); @@ -183,18 +182,15 @@ private: //asynchronous icon loading void getIconsToBeLoaded(std::vector<Zstring>& newLoad); //loads all (not yet) drawn icons - typedef size_t FromRow; - typedef size_t ToRow; - typedef std::pair<FromRow, ToRow> VisibleRowRange; - VisibleRowRange getVisibleRows(); - + typedef size_t RowBegin; + typedef size_t RowEnd; + std::pair<RowBegin, RowEnd> getVisibleRows(); //return [first, last) number pair typedef size_t RowNumber; - typedef bool IconLoaded; - typedef std::map<RowNumber, IconLoaded> LoadSuccess; - LoadSuccess loadIconSuccess; //save status of last icon load when drawing on GUI + typedef std::set<RowNumber> FailedIconLoad; + FailedIconLoad failedLoads; //save status of last icon load when drawing on GUI - bool fileIconsAreEnabled; + std::shared_ptr<zen::IconBuffer> iconBuffer_; xmlAccess::ColumnAttributes columnSettings; //set visibility, position and width of columns CustomGridRim* otherGrid; //sibling grid on other side @@ -259,7 +255,7 @@ public: long style = wxWANTS_CHARS, const wxString& name = wxGridNameStr); - ~CustomGridMiddle(); //non-inline destructor for std::auto_ptr to work with forward declaration + ~CustomGridMiddle(); virtual bool CreateGrid(int numRows, int numCols, wxGrid::wxGridSelectionModes selmode = wxGrid::wxGridSelectCells); @@ -274,6 +270,7 @@ private: virtual CustomGridTable* getGridDataTable() const; CustomGridTableMiddle* getGridDataTableMiddle() const; + virtual void enableFileIcons(const std::shared_ptr<zen::IconBuffer>& iconBuffer) {}; #ifdef FFS_WIN //get rid of scrollbars; Windows: overwrite virtual method virtual void SetScrollbar(int orientation, int position, int thumbSize, int range, bool refresh = true); #endif @@ -308,7 +305,7 @@ private: int highlightedRow; BlockPosition highlightedPos; - std::auto_ptr<CustomTooltip> toolTip; + std::unique_ptr<CustomTooltip> toolTip; }; //custom events for middle grid: diff --git a/library/db_file.cpp b/library/db_file.cpp index 994e8579..268e411e 100644 --- a/library/db_file.cpp +++ b/library/db_file.cpp @@ -48,7 +48,7 @@ Zstring getDBFilename(const BaseDirMapping& baseMap, bool tempfile = false) Zstring dbname = Zstring(Zstr(".sync")) + (tempfile ? Zstr(".tmp") : Zstr("")) + SYNC_DB_FILE_ENDING; #endif - return baseMap.getBaseDir<side>() + dbname; + return baseMap.getBaseDirPf<side>() + dbname; } @@ -56,12 +56,12 @@ Zstring getDBFilename(const BaseDirMapping& baseMap, bool tempfile = false) class FileInputStreamDB : public FileInputStream { public: - FileInputStreamDB(const Zstring& filename) : //throw (FileError) + FileInputStreamDB(const Zstring& filename) : //throw FileError FileInputStream(filename) { //read FreeFileSync file identifier char formatDescr[sizeof(FILE_FORMAT_DESCR)] = {}; - Read(formatDescr, sizeof(formatDescr)); //throw (FileError) + Read(formatDescr, sizeof(formatDescr)); //throw FileError if (!std::equal(FILE_FORMAT_DESCR, FILE_FORMAT_DESCR + sizeof(FILE_FORMAT_DESCR), formatDescr)) throw FileError(_("Incompatible synchronization database format:") + " \n" + "\"" + filename + "\""); @@ -74,11 +74,11 @@ private: class FileOutputStreamDB : public FileOutputStream { public: - FileOutputStreamDB(const Zstring& filename) : //throw (FileError) + FileOutputStreamDB(const Zstring& filename) : //throw FileError FileOutputStream(filename) { //write FreeFileSync file identifier - Write(FILE_FORMAT_DESCR, sizeof(FILE_FORMAT_DESCR)); //throw (FileError) + Write(FILE_FORMAT_DESCR, sizeof(FILE_FORMAT_DESCR)); //throw FileError } private: @@ -164,7 +164,7 @@ typedef std::map<UniqueId, MemoryStreamPtr> StreamMapping; //list of streams class ReadFileStream : public zen::ReadInputStream { public: - ReadFileStream(wxInputStream& stream, const wxString& filename, StreamMapping& streamList, bool leftSide) : ReadInputStream(stream, filename) + ReadFileStream(wxInputStream& stream, const wxString& filename, StreamMapping& streamList) : ReadInputStream(stream, filename) { //|------------------------------------------------------------------------------------- //| ensure 32/64 bit portability: used fixed size data types only e.g. boost::uint32_t | @@ -172,69 +172,28 @@ public: boost::int32_t version = readNumberC<boost::int32_t>(); -#ifndef _MSC_VER -#warning remove this check after migration! -#endif - if (version != 6) //migrate! - - if (version != FILE_FORMAT_VER) //read file format version - throw FileError(_("Incompatible synchronization database format:") + " \n" + "\"" + filename.c_str() + "\""); + if (version != FILE_FORMAT_VER) //read file format version + throw FileError(_("Incompatible synchronization database format:") + " \n" + "\"" + filename.c_str() + "\""); + streamList.clear(); -#ifndef _MSC_VER -#warning remove this case after migration! -#endif - - if (version == 6) + boost::uint32_t dbCount = readNumberC<boost::uint32_t>(); //number of databases: one for each sync-pair + while (dbCount-- != 0) { - streamList.clear(); + //DB id of partner databases + const CharArray tmp2 = readArrayC(); + const std::string sessionID(tmp2->begin(), tmp2->end()); - //read DB id - const CharArray tmp = readArrayC(); - std::string mainId(tmp->begin(), tmp->end()); + CharArray buffer = readArrayC(); //read db-entry stream (containing DirInformation) - boost::uint32_t dbCount = readNumberC<boost::uint32_t>(); //number of databases: one for each sync-pair - while (dbCount-- != 0) - { - //DB id of partner databases - const CharArray tmp2 = readArrayC(); - const std::string partnerID(tmp2->begin(), tmp2->end()); - - CharArray buffer = readArrayC(); //read db-entry stream (containing DirInformation) - - if (leftSide) - streamList.insert(std::make_pair(partnerID + mainId, buffer)); - else - streamList.insert(std::make_pair(mainId + partnerID, buffer)); - } - } - else - { - streamList.clear(); - - boost::uint32_t dbCount = readNumberC<boost::uint32_t>(); //number of databases: one for each sync-pair - while (dbCount-- != 0) - { - //DB id of partner databases - const CharArray tmp2 = readArrayC(); - const std::string sessionID(tmp2->begin(), tmp2->end()); - - CharArray buffer = readArrayC(); //read db-entry stream (containing DirInformation) - - streamList.insert(std::make_pair(sessionID, buffer)); - } + streamList.insert(std::make_pair(sessionID, buffer)); } } }; namespace { -StreamMapping loadStreams(const Zstring& filename, - -#ifndef _MSC_VER -#warning remove this parameter after migration! -#endif - bool leftSide) //throw (FileError) +StreamMapping loadStreams(const Zstring& filename) //throw FileError { if (!zen::fileExists(filename)) throw FileErrorDatabaseNotExisting(_("Initial synchronization:") + " \n\n" + @@ -244,12 +203,12 @@ StreamMapping loadStreams(const Zstring& filename, try { //read format description (uncompressed) - FileInputStreamDB uncompressed(filename); //throw (FileError) + FileInputStreamDB uncompressed(filename); //throw FileError wxZlibInputStream input(uncompressed, wxZLIB_ZLIB); StreamMapping streamList; - ReadFileStream(input, toWx(filename), streamList, leftSide); + ReadFileStream(input, toWx(filename), streamList); return streamList; } catch (const std::bad_alloc&) //this is most likely caused by a corrupted database file @@ -277,14 +236,14 @@ DirInfoPtr parseStream(const std::vector<char>& stream, const Zstring& fileName) } -std::pair<DirInfoPtr, DirInfoPtr> zen::loadFromDisk(const BaseDirMapping& baseMapping) //throw (FileError) +std::pair<DirInfoPtr, DirInfoPtr> zen::loadFromDisk(const BaseDirMapping& baseMapping) //throw FileError { const Zstring fileNameLeft = getDBFilename<LEFT_SIDE>(baseMapping); const Zstring fileNameRight = getDBFilename<RIGHT_SIDE>(baseMapping); //read file data: list of session ID + DirInfo-stream - const StreamMapping streamListLeft = ::loadStreams(fileNameLeft, true); //throw (FileError) - const StreamMapping streamListRight = ::loadStreams(fileNameRight, false); //throw (FileError) + const StreamMapping streamListLeft = ::loadStreams(fileNameLeft); //throw FileError + const StreamMapping streamListRight = ::loadStreams(fileNameRight); //throw FileError //find associated session: there can be at most one session within intersection of left and right ids StreamMapping::const_iterator streamLeft = streamListLeft .end(); @@ -484,11 +443,11 @@ public: //save/load DirContainer -void saveFile(const StreamMapping& streamList, const Zstring& filename) //throw (FileError) +void saveFile(const StreamMapping& streamList, const Zstring& filename) //throw FileError { { //write format description (uncompressed) - FileOutputStreamDB uncompressed(filename); //throw (FileError) + FileOutputStreamDB uncompressed(filename); //throw FileError wxZlibOutputStream output(uncompressed, 4, wxZLIB_ZLIB); /* 4 - best compromise between speed and compression: (scanning 200.000 objects) @@ -516,7 +475,7 @@ bool equalEntry(const MemoryStreamPtr& lhs, const MemoryStreamPtr& rhs) } -void zen::saveToDisk(const BaseDirMapping& baseMapping) //throw (FileError) +void zen::saveToDisk(const BaseDirMapping& baseMapping) //throw FileError { //transactional behaviour! write to tmp files first const Zstring dbNameLeftTmp = getDBFilename<LEFT_SIDE >(baseMapping, true); @@ -527,7 +486,7 @@ void zen::saveToDisk(const BaseDirMapping& baseMapping) //throw (FileError) //delete old tmp file, if necessary -> throws if deletion fails! removeFile(dbNameLeftTmp); // - removeFile(dbNameRightTmp); //throw (FileError) + removeFile(dbNameRightTmp); //throw FileError //(try to) load old database files... StreamMapping streamListLeft; @@ -535,14 +494,14 @@ void zen::saveToDisk(const BaseDirMapping& baseMapping) //throw (FileError) try //read file data: list of session ID + DirInfo-stream { - streamListLeft = ::loadStreams(dbNameLeft, true); + streamListLeft = ::loadStreams(dbNameLeft); } - catch(FileError&) {} //if error occurs: just overwrite old file! User is already informed about issues right after comparing! + catch (FileError&) {} //if error occurs: just overwrite old file! User is already informed about issues right after comparing! try { - streamListRight = ::loadStreams(dbNameRight, false); + streamListRight = ::loadStreams(dbNameRight); } - catch(FileError&) {} + catch (FileError&) {} //find associated session: there can be at most one session within intersection of left and right ids StreamMapping::iterator streamLeft = streamListLeft .end(); @@ -572,7 +531,7 @@ void zen::saveToDisk(const BaseDirMapping& baseMapping) //throw (FileError) oldDirInfoRight = parseStream(*streamRight->second, dbNameRight); //throw FileError } } - catch(FileError&) + catch (FileError&) { //if error occurs: just overwrite old file! User is already informed about issues right after comparing! oldDirInfoLeft .reset(); //read both or none! @@ -622,17 +581,17 @@ void zen::saveToDisk(const BaseDirMapping& baseMapping) //throw (FileError) //write (temp-) files... Loki::ScopeGuard guardTempFileLeft = Loki::MakeGuard(&zen::removeFile, dbNameLeftTmp); - saveFile(streamListLeft, dbNameLeftTmp); //throw (FileError) + saveFile(streamListLeft, dbNameLeftTmp); //throw FileError Loki::ScopeGuard guardTempFileRight = Loki::MakeGuard(&zen::removeFile, dbNameRightTmp); - saveFile(streamListRight, dbNameRightTmp); //throw (FileError) + saveFile(streamListRight, dbNameRightTmp); //throw FileError //operation finished: rename temp files -> this should work transactionally: //if there were no write access, creation of temp files would have failed removeFile(dbNameLeft); removeFile(dbNameRight); - renameFile(dbNameLeftTmp, dbNameLeft); //throw (FileError); - renameFile(dbNameRightTmp, dbNameRight); //throw (FileError); + renameFile(dbNameLeftTmp, dbNameLeft); //throw FileError; + renameFile(dbNameRightTmp, dbNameRight); //throw FileError; guardTempFileLeft. Dismiss(); //no need to delete temp file anymore guardTempFileRight.Dismiss(); // diff --git a/library/db_file.h b/library/db_file.h index dc9eb141..188d7d92 100644 --- a/library/db_file.h +++ b/library/db_file.h @@ -14,7 +14,7 @@ namespace zen { const Zstring SYNC_DB_FILE_ENDING = Zstr(".ffs_db"); -void saveToDisk(const BaseDirMapping& baseMapping); //throw (FileError) +void saveToDisk(const BaseDirMapping& baseMapping); //throw FileError struct DirInformation { @@ -25,7 +25,7 @@ typedef std::shared_ptr<const DirInformation> DirInfoPtr; DEFINE_NEW_FILE_ERROR(FileErrorDatabaseNotExisting); -std::pair<DirInfoPtr, DirInfoPtr> loadFromDisk(const BaseDirMapping& baseMapping); //throw (FileError, FileErrorDatabaseNotExisting) -> return value always bound! +std::pair<DirInfoPtr, DirInfoPtr> loadFromDisk(const BaseDirMapping& baseMapping); //throw FileError, FileErrorDatabaseNotExisting -> return value always bound! } #endif // DBFILE_H_INCLUDED diff --git a/library/dir_exist_async.h b/library/dir_exist_async.h index 60fa4582..cab82aa2 100644 --- a/library/dir_exist_async.h +++ b/library/dir_exist_async.h @@ -21,7 +21,9 @@ bool dirExistsUpdating(const Zstring& dirname, ProcessCallback& procCallback) { using namespace util; - //do NOT include info messages here! this method is used by synchronization also, so avoid flooding! + std::wstring statusText = _("Searching for directory %x..."); + replace(statusText, L"%x", std::wstring(L"\"") + dirname + L"\"", false); + procCallback.reportStatus(statusText); auto ft = dirExistsAsync(dirname); while (!ft.timed_wait(boost::posix_time::milliseconds(UI_UPDATE_INTERVAL))) diff --git a/library/dir_lock.cpp b/library/dir_lock.cpp index f653fa7c..7feb51ff 100644 --- a/library/dir_lock.cpp +++ b/library/dir_lock.cpp @@ -17,6 +17,7 @@ #include "../shared/serialize.h" #include "../shared/build_info.h" #include "../shared/int64.h" +#include "../shared/file_handling.h" #ifdef FFS_WIN #include <tlhelp32.h> @@ -24,7 +25,6 @@ #include "../shared/long_path_prefix.h" #elif defined FFS_LINUX -#include "../shared/file_handling.h" #include <sys/stat.h> #include <cerrno> #include <unistd.h> @@ -78,17 +78,15 @@ public: //although CreateFile/FILE_APPEND_DATA without SetFilePointerEx works locally, it MAY NOT work on some network shares creating a 4 gig file!!! const HANDLE fileHandle = ::CreateFile(applyLongPathPrefix(lockfilename_.c_str()).c_str(), - FILE_GENERIC_WRITE, + GENERIC_READ | GENERIC_WRITE, //use both when writing over network, see comment in file_io.cpp FILE_SHARE_READ, - NULL, + 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (fileHandle == INVALID_HANDLE_VALUE) return; - - Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, fileHandle); - (void)dummy; //silence warning "unused variable" + LOKI_ON_BLOCK_EXIT2(::CloseHandle(fileHandle)); const LARGE_INTEGER moveDist = {}; if (!::SetFilePointerEx(fileHandle, //__in HANDLE hFile, @@ -108,9 +106,7 @@ public: const int fileHandle = ::open(lockfilename_.c_str(), O_WRONLY | O_APPEND); //O_EXCL contains a race condition on NFS file systems: http://linux.die.net/man/2/open if (fileHandle == -1) return; - - Loki::ScopeGuard dummy = Loki::MakeGuard(::close, fileHandle); - (void)dummy; //silence warning "unused variable" + LOKI_ON_BLOCK_EXIT2(::close(fileHandle)); const ssize_t bytesWritten = ::write(fileHandle, buffer, 1); (void)bytesWritten; @@ -124,20 +120,7 @@ private: namespace { -void deleteLockFile(const Zstring& filename) //throw (FileError) -{ -#ifdef FFS_WIN - if (!::DeleteFile(applyLongPathPrefix(filename).c_str())) -#elif defined FFS_LINUX - if (::unlink(filename.c_str()) != 0) -#endif - { - throw FileError(_("Error deleting file:") + "\n\"" + filename + "\"" + "\n\n" + getLastErrorFormatted()); - } -} - - -zen::UInt64 getLockFileSize(const Zstring& filename) //throw (FileError, ErrorNotExisting) +UInt64 getLockFileSize(const Zstring& filename) //throw FileError, ErrorNotExisting { #ifdef FFS_WIN WIN32_FIND_DATA fileInfo = {}; @@ -192,13 +175,13 @@ namespace { //read string from file stream inline -std::string readString(wxInputStream& stream) //throw (std::exception) +std::string readString(wxInputStream& stream) //throw std::exception { - const boost::uint32_t strLength = readPOD<boost::uint32_t>(stream); + const auto strLength = readPOD<boost::uint32_t>(stream); std::string output; if (strLength > 0) { - output.resize(strLength); //may throw for corrupted data + output.resize(strLength); //throw std::bad_alloc stream.Read(&output[0], strLength); } return output; @@ -208,9 +191,8 @@ std::string readString(wxInputStream& stream) //throw (std::exception) inline void writeString(wxOutputStream& stream, const std::string& str) //write string to filestream { - const boost::uint32_t strLength = static_cast<boost::uint32_t>(str.length()); - writePOD<boost::uint32_t>(stream, strLength); - stream.Write(str.c_str(), strLength); + writePOD(stream, static_cast<boost::uint32_t>(str.length())); + stream.Write(str.c_str(), str.length()); } @@ -242,7 +224,7 @@ struct LockInformation LockInformation(wxInputStream& stream) //read { char formatDescr[sizeof(LOCK_FORMAT_DESCR)] = {}; - stream.Read(formatDescr, sizeof(LOCK_FORMAT_DESCR)); //file format header + stream.Read(formatDescr, sizeof(LOCK_FORMAT_DESCR)); //file format header const int lockFileVersion = readPOD<boost::int32_t>(stream); // (void)lockFileVersion; @@ -286,6 +268,7 @@ enum ProcessStatus { PROC_STATUS_NOT_RUNNING, PROC_STATUS_RUNNING, + PROC_STATUS_ITS_US, PROC_STATUS_NO_IDEA }; ProcessStatus getProcessStatus(const LockInformation::ProcessDescription& procDescr) @@ -295,15 +278,16 @@ ProcessStatus getProcessStatus(const LockInformation::ProcessDescription& procDe return PROC_STATUS_NO_IDEA; //lock owned by different computer #ifdef FFS_WIN + if (procDescr.processId == ::GetCurrentProcessId()) //may seem obscure, but it's possible: a lock file is "stolen" and put back while the program is running + return PROC_STATUS_ITS_US; + //note: ::OpenProcess() is no option as it may successfully return for crashed processes! HANDLE snapshot = ::CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, //__in DWORD dwFlags, 0); //__in DWORD th32ProcessID if (snapshot == INVALID_HANDLE_VALUE) return PROC_STATUS_NO_IDEA; - - Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, snapshot); - (void)dummy; //silence warning "unused variable" + LOKI_ON_BLOCK_EXIT2(::CloseHandle(snapshot)); PROCESSENTRY32 processEntry = {}; processEntry.dwSize = sizeof(processEntry); @@ -316,11 +300,14 @@ ProcessStatus getProcessStatus(const LockInformation::ProcessDescription& procDe if (processEntry.th32ProcessID == procDescr.processId) return PROC_STATUS_RUNNING; //process still running } - while(::Process32Next(snapshot, &processEntry)); + while (::Process32Next(snapshot, &processEntry)); return PROC_STATUS_NOT_RUNNING; #elif defined FFS_LINUX + if (procDescr.processId == ::getpid()) //may seem obscure, but it's possible: a lock file is "stolen" and put back while the program is running + return PROC_STATUS_ITS_US; + if (procDescr.processId <= 0 || procDescr.processId >= 65536) return PROC_STATUS_NO_IDEA; //invalid process id @@ -329,30 +316,30 @@ ProcessStatus getProcessStatus(const LockInformation::ProcessDescription& procDe } -void writeLockInfo(const Zstring& lockfilename) //throw (FileError) +void writeLockInfo(const Zstring& lockfilename) //throw FileError { //write GUID at the beginning of the file: this ID is a universal identifier for this lock (no matter what the path is, considering symlinks, distributed network, etc.) - FileOutputStream lockFile(lockfilename); //throw (FileError) + FileOutputStream lockFile(lockfilename); //throw FileError LockInformation().toStream(lockFile); } -LockInformation retrieveLockInfo(const Zstring& lockfilename) //throw (FileError, ErrorNotExisting) +LockInformation retrieveLockInfo(const Zstring& lockfilename) //throw FileError, ErrorNotExisting { //read GUID from beginning of file - FileInputStream lockFile(lockfilename); //throw (FileError, ErrorNotExisting) + FileInputStream lockFile(lockfilename); //throw FileError, ErrorNotExisting return LockInformation(lockFile); } -std::string retrieveLockId(const Zstring& lockfilename) //throw (FileError, ErrorNotExisting) +std::string retrieveLockId(const Zstring& lockfilename) //throw FileError, ErrorNotExisting { return retrieveLockInfo(lockfilename).lockId; } } -void waitOnDirLock(const Zstring& lockfilename, DirLockCallback* callback) //throw (FileError) +void waitOnDirLock(const Zstring& lockfilename, DirLockCallback* callback) //throw FileError { std::wstring infoMsg = _("Waiting while directory is locked (%x)..."); replace(infoMsg, L"%x", std::wstring(L"\"") + lockfilename + "\""); @@ -361,15 +348,26 @@ void waitOnDirLock(const Zstring& lockfilename, DirLockCallback* callback) //thr //--------------------------------------------------------------- try { - const LockInformation lockInfo = retrieveLockInfo(lockfilename); //throw (FileError, ErrorNotExisting) - const bool lockOwnderDead = getProcessStatus(lockInfo.procDescr) == PROC_STATUS_NOT_RUNNING; //convenience optimization: if we know the owning process crashed, we needn't wait DETECT_EXITUS_INTERVAL sec + const LockInformation lockInfo = retrieveLockInfo(lockfilename); //throw FileError, ErrorNotExisting + + bool lockOwnderDead = false; //convenience optimization: if we know the owning process crashed, we needn't wait DETECT_EXITUS_INTERVAL sec + switch (getProcessStatus(lockInfo.procDescr)) + { + case PROC_STATUS_ITS_US: //since we've already passed LockAdmin, the lock file seems abandoned ("stolen"?) although it's from this process + case PROC_STATUS_NOT_RUNNING: + lockOwnderDead = true; + break; + case PROC_STATUS_RUNNING: + case PROC_STATUS_NO_IDEA: + break; + } zen::UInt64 fileSizeOld; wxLongLong lockSilentStart = wxGetLocalTimeMillis(); while (true) { - const zen::UInt64 fileSizeNew = ::getLockFileSize(lockfilename); //throw (FileError, ErrorNotExisting) + const zen::UInt64 fileSizeNew = ::getLockFileSize(lockfilename); //throw FileError, ErrorNotExisting wxLongLong currentTime = wxGetLocalTimeMillis(); if (fileSizeNew != fileSizeOld) @@ -382,17 +380,17 @@ void waitOnDirLock(const Zstring& lockfilename, DirLockCallback* callback) //thr if (lockOwnderDead || //no need to wait any longer... currentTime - lockSilentStart > DETECT_EXITUS_INTERVAL) { - DirLock dummy(deleteAbandonedLockName(lockfilename), callback); //throw (FileError) + DirLock dummy(deleteAbandonedLockName(lockfilename), callback); //throw FileError //now that the lock is in place check existence again: meanwhile another process may have deleted and created a new lock! - if (retrieveLockId(lockfilename) != lockInfo.lockId) //throw (FileError, ErrorNotExisting) + if (retrieveLockId(lockfilename) != lockInfo.lockId) //throw FileError, ErrorNotExisting return; //another process has placed a new lock, leave scope: the wait for the old lock is technically over... - if (getLockFileSize(lockfilename) != fileSizeOld) //throw (FileError, ErrorNotExisting) + if (getLockFileSize(lockfilename) != fileSizeOld) //throw FileError, ErrorNotExisting continue; //belated lifesign - ::deleteLockFile(lockfilename); //throw (FileError) + removeFile(lockfilename); //throw FileError return; } @@ -432,24 +430,28 @@ void releaseLock(const Zstring& lockfilename) //throw () { try { - ::deleteLockFile(lockfilename); + removeFile(lockfilename); } - catch(...) {} + catch (...) {} } -bool tryLock(const Zstring& lockfilename) //throw (FileError) +bool tryLock(const Zstring& lockfilename) //throw FileError { #ifdef FFS_WIN const HANDLE fileHandle = ::CreateFile(applyLongPathPrefix(lockfilename).c_str(), - GENERIC_WRITE, + GENERIC_READ | GENERIC_WRITE, //use both when writing over network, see comment in file_io.cpp FILE_SHARE_READ, - NULL, + 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); if (fileHandle == INVALID_HANDLE_VALUE) { +#ifndef _MSC_VER +#warning fix this problem! + //read-only FTP may return: ERROR_FILE_EXISTS (NetDrive @ GNU) +#endif if (::GetLastError() == ERROR_FILE_EXISTS) return false; else @@ -471,10 +473,10 @@ bool tryLock(const Zstring& lockfilename) //throw (FileError) ::close(fileHandle); #endif - Loki::ScopeGuard guardLockFile = Loki::MakeGuard(::releaseLock, lockfilename); + Loki::ScopeGuard guardLockFile = Loki::MakeGuard(zen::removeFile, lockfilename); //write UUID at the beginning of the file: this ID is a universal identifier for this lock (no matter what the path is, considering symlinks, etc.) - writeLockInfo(lockfilename); //throw (FileError) + writeLockInfo(lockfilename); //throw FileError guardLockFile.Dismiss(); //lockfile created successfully return true; @@ -485,10 +487,10 @@ bool tryLock(const Zstring& lockfilename) //throw (FileError) class DirLock::SharedDirLock { public: - SharedDirLock(const Zstring& lockfilename, DirLockCallback* callback = NULL) : //throw (FileError) + SharedDirLock(const Zstring& lockfilename, DirLockCallback* callback = NULL) : //throw FileError lockfilename_(lockfilename) { - while (!::tryLock(lockfilename)) //throw (FileError) + while (!::tryLock(lockfilename)) //throw FileError ::waitOnDirLock(lockfilename, callback); // threadObj = boost::thread(LifeSigns(lockfilename)); @@ -522,7 +524,7 @@ public: } //create or retrieve a SharedDirLock - std::shared_ptr<SharedDirLock> retrieve(const Zstring& lockfilename, DirLockCallback* callback) //throw (FileError) + std::shared_ptr<SharedDirLock> retrieve(const Zstring& lockfilename, DirLockCallback* callback) //throw FileError { //optimization: check if there is an active(!) lock for "lockfilename" FileToUuidMap::const_iterator iterUuid = fileToUuid.find(lockfilename); @@ -535,7 +537,7 @@ public: try //actual check based on lock UUID, deadlock prevention: "lockfilename" may be an alternative name for an already active lock { - const std::string lockId = retrieveLockId(lockfilename); //throw (FileError, ErrorNotExisting) + const std::string lockId = retrieveLockId(lockfilename); //throw FileError, ErrorNotExisting const std::shared_ptr<SharedDirLock>& activeLock = findActive(lockId); //returns null-lock if not found if (activeLock) @@ -544,11 +546,11 @@ public: return activeLock; } } - catch (const ErrorNotExisting&) {} //let other FileError(s) propagate! + catch (...) {} //catch everything, let SharedDirLock constructor deal with errors, e.g. 0-sized/corrupted lock file //not yet in buffer, so create a new directory lock - std::shared_ptr<SharedDirLock> newLock(new SharedDirLock(lockfilename, callback)); //throw (FileError) - const std::string newLockId = retrieveLockId(lockfilename); //throw (FileError, ErrorNotExisting) + std::shared_ptr<SharedDirLock> newLock(new SharedDirLock(lockfilename, callback)); //throw FileError + const std::string newLockId = retrieveLockId(lockfilename); //throw FileError, ErrorNotExisting //update registry fileToUuid[lockfilename] = newLockId; //throw() @@ -579,7 +581,7 @@ private: }; -DirLock::DirLock(const Zstring& lockfilename, DirLockCallback* callback) //throw (FileError) +DirLock::DirLock(const Zstring& lockfilename, DirLockCallback* callback) //throw FileError { #ifdef FFS_WIN std::vector<wchar_t> volName(std::max(lockfilename.size(), static_cast<size_t>(10000))); diff --git a/library/dir_lock.h b/library/dir_lock.h index f4720e61..8cec9d69 100644 --- a/library/dir_lock.h +++ b/library/dir_lock.h @@ -24,7 +24,7 @@ RAII structure to place a directory lock against other FFS processes: class DirLock { public: - DirLock(const Zstring& lockfilename, DirLockCallback* callback = NULL); //throw (FileError), callback only used during construction + DirLock(const Zstring& lockfilename, DirLockCallback* callback = NULL); //throw FileError, callback only used during construction private: class LockAdmin; diff --git a/library/hard_filter.cpp b/library/hard_filter.cpp index c6d18f47..56fb091b 100644 --- a/library/hard_filter.cpp +++ b/library/hard_filter.cpp @@ -63,7 +63,7 @@ void addFilterEntry(const Zstring& filtername, std::set<Zstring>& fileFilter, st #ifdef FFS_WIN //Windows does NOT distinguish between upper/lower-case - MakeUpper(filterFormatted); + makeUpper(filterFormatted); #elif defined FFS_LINUX //Linux DOES distinguish between upper/lower-case: nothing to do here #endif @@ -133,19 +133,19 @@ bool matchesMask(const Zchar* str, const Zchar* mask) { switch (ch) { - case Zchar('?'): + case Zstr('?'): if (*str == 0) return false; break; - case Zchar('*'): + case Zstr('*'): //advance to next non-*/? char do { ++mask; ch = *mask; } - while (ch == Zchar('*') || ch == Zchar('?')); + while (ch == Zstr('*') || ch == Zstr('?')); //if mask ends with '*': if (ch == 0) return true; @@ -178,10 +178,10 @@ bool matchesMaskBegin(const Zchar* str, const Zchar* mask) switch (ch) { - case Zchar('?'): + case Zstr('?'): break; - case Zchar('*'): + case Zstr('*'): return true; default: @@ -273,7 +273,7 @@ bool NameFilter::passFileFilter(const Zstring& relFilename) const { #ifdef FFS_WIN //Windows does NOT distinguish between upper/lower-case Zstring nameFormatted = relFilename; - MakeUpper(nameFormatted); + makeUpper(nameFormatted); #elif defined FFS_LINUX //Linux DOES distinguish between upper/lower-case const Zstring& nameFormatted = relFilename; //nothing to do here #endif @@ -289,7 +289,7 @@ bool NameFilter::passDirFilter(const Zstring& relDirname, bool* subObjMightMatch #ifdef FFS_WIN //Windows does NOT distinguish between upper/lower-case Zstring nameFormatted = relDirname; - MakeUpper(nameFormatted); + makeUpper(nameFormatted); #elif defined FFS_LINUX //Linux DOES distinguish between upper/lower-case const Zstring& nameFormatted = relDirname; //nothing to do here #endif diff --git a/library/icon_buffer.cpp b/library/icon_buffer.cpp index 2c17f6da..b8ee66cd 100644 --- a/library/icon_buffer.cpp +++ b/library/icon_buffer.cpp @@ -5,19 +5,16 @@ // ************************************************************************** #include "icon_buffer.h" -#include <wx/msgdlg.h> -#include <map> -#include <vector> #include <queue> #include <set> -#include <wx/log.h> -#include "../shared/i18n.h" #include "../shared/boost_thread_wrap.h" //include <boost/thread.hpp> #include "../shared/loki/ScopeGuard.h" #include <boost/thread/once.hpp> #ifdef FFS_WIN #include <wx/msw/wrapwin.h> //includes "windows.h" +#include "../shared/dll_loader.h" +#include "../shared/Thumbnail/thumbnail.h" #elif defined FFS_LINUX #include <giomm/file.h> @@ -25,50 +22,32 @@ #include <gtkmm/main.h> #endif - using namespace zen; -const size_t BUFFER_SIZE_MAX = 800; //maximum number of icons to buffer - - -#ifdef FFS_WIN -Zstring getFileExtension(const Zstring& filename) -{ - const Zstring shortName = afterLast(filename, Zchar('\\')); //warning: using windows file name separator! - - return shortName.find(Zchar('.')) != Zstring::npos ? - filename.AfterLast(Zchar('.')) : - Zstring(); -} +const size_t BUFFER_SIZE_MAX = 800; //maximum number of icons to buffer -namespace -{ -std::set<Zstring, LessFilename> exceptions; //thread-safe! -boost::once_flag once = BOOST_ONCE_INIT; // -} -//test for extension for icons that physically have to be retrieved from disc -bool isPriceyExtension(const Zstring& extension) +int zen::IconBuffer::cvrtSize(IconSize sz) //get size in pixel { - boost::call_once(once, []() + switch (sz) { - exceptions.insert(L"exe"); - exceptions.insert(L"lnk"); - exceptions.insert(L"ico"); - exceptions.insert(L"ani"); - exceptions.insert(L"cur"); - exceptions.insert(L"url"); - exceptions.insert(L"msc"); - exceptions.insert(L"scr"); - }); - - return exceptions.find(extension) != exceptions.end(); -} + case SIZE_SMALL: +#ifdef FFS_WIN + return 16; +#elif defined FFS_LINUX + return 24; #endif + case SIZE_MEDIUM: + return 48; + case SIZE_LARGE: + return 128; + } + assert(false); + return 0; +} -//################################################################################################################################################ class IconHolder //handle HICON/GdkPixbuf ownership WITHOUT ref-counting to allow thread-safe usage (in contrast to wxIcon) { public: @@ -107,7 +86,7 @@ public: void swap(IconHolder& other) { std::swap(handle_, other.handle_); } //throw() - wxIcon toWxIcon() const //copy HandleType, caller needs to take ownership! + wxIcon toWxIcon(int expectedSize) const //copy HandleType, caller needs to take ownership! { if (handle_ == NULL) return wxNullIcon; @@ -116,8 +95,33 @@ public: wxIcon newIcon; //attention: wxIcon uses reference counting! #ifdef FFS_WIN - newIcon.SetHICON(clone.handle_); // - newIcon.SetSize(IconBuffer::ICON_SIZE, IconBuffer::ICON_SIZE); //icon is actually scaled to this size (just in case referenced HICON differs) + newIcon.SetHICON(clone.handle_); + + { //this block costs ~0.04 ms + ICONINFO icoInfo = {}; + if (::GetIconInfo(clone.handle_, &icoInfo)) + { + ::DeleteObject(icoInfo.hbmMask); //nice potential for a GDI leak! + LOKI_ON_BLOCK_EXIT2(::DeleteObject(icoInfo.hbmColor)); // + + BITMAP bmpInfo = {}; + if (::GetObject(icoInfo.hbmColor, //__in HGDIOBJ hgdiobj, + sizeof(BITMAP), //__in int cbBuffer, + &bmpInfo) != 0) // __out LPVOID lpvObject + { + const int maxExtent = std::max(bmpInfo.bmWidth, bmpInfo.bmHeight); + if (maxExtent > expectedSize) + { + bmpInfo.bmWidth = bmpInfo.bmWidth * expectedSize / maxExtent; //scale those Vista jumbo 256x256 icons down! + bmpInfo.bmHeight = bmpInfo.bmHeight * expectedSize / maxExtent; // + } + newIcon.SetSize(bmpInfo.bmWidth, bmpInfo.bmHeight); //wxIcon is stretched to this size + } + } + } + //no stretching for now + //newIcon.SetSize(defaultSize, defaultSize); //icon is stretched to this size if referenced HICON differs + #elif defined FFS_LINUX // newIcon.SetPixbuf(clone.handle_); // transfer ownership!! #endif // @@ -127,31 +131,206 @@ public: private: HandleType handle_; + struct ConversionToBool { int dummy; }; + +public: + //use member pointer as implicit conversion to bool (C++ Templates - Vandevoorde/Josuttis; chapter 20) + operator int ConversionToBool::* () const { return handle_ != NULL ? &ConversionToBool::dummy : NULL; } }; -IconHolder getAssociatedIcon(const Zstring& filename) -{ #ifdef FFS_WIN - //despite what docu says about SHGetFileInfo() it can't handle all relative filenames, e.g. "\DirName" - //but no problem, directory formatting takes care that filenames are always absolute! +namespace +{ +Zstring getFileExtension(const Zstring& filename) +{ + const Zstring shortName = afterLast(filename, Zchar('\\')); //warning: using windows file name separator! + + return shortName.find(Zchar('.')) != Zstring::npos ? + filename.AfterLast(Zchar('.')) : + Zstring(); +} + +std::set<Zstring, LessFilename> priceyExtensions; //thread-safe! +boost::once_flag initExtensionsOnce = BOOST_ONCE_INIT; // - SHFILEINFO fileInfo = {}; //initialize hIcon -> fix for weird error: SHGetFileInfo() might return successfully WITHOUT filling fileInfo.hIcon!! - //bug report: https://sourceforge.net/tracker/?func=detail&aid=2768004&group_id=234430&atid=1093080 +//test for extension for non-thumbnail icons that physically have to be retrieved from disc +bool isCheapExtension(const Zstring& extension) +{ + boost::call_once(initExtensionsOnce, []() + { + priceyExtensions.insert(L"exe"); + priceyExtensions.insert(L"lnk"); + priceyExtensions.insert(L"ico"); + priceyExtensions.insert(L"ani"); + priceyExtensions.insert(L"cur"); + priceyExtensions.insert(L"url"); + priceyExtensions.insert(L"msc"); + priceyExtensions.insert(L"scr"); + }); + return priceyExtensions.find(extension) == priceyExtensions.end(); +} + + +bool vistaOrLater() +{ + OSVERSIONINFO osvi = {}; + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + + //IFileOperation is supported with Vista and later + if (::GetVersionEx(&osvi)) + return osvi.dwMajorVersion > 5; + //XP has majorVersion == 5, minorVersion == 1 + //Vista has majorVersion == 6, minorVersion == 0 + //version overview: http://msdn.microsoft.com/en-us/library/ms724834(VS.85).aspx + return false; +} + + +bool wereVistaOrLater = false; +boost::once_flag initVistaFlagOnce = BOOST_ONCE_INIT; + + +int getShilIconType(IconBuffer::IconSize sz) +{ + boost::call_once(initVistaFlagOnce, []() + { + wereVistaOrLater = vistaOrLater(); + }); + + switch (sz) + { + case IconBuffer::SIZE_SMALL: + return SHIL_SMALL; //16x16, but the size can be customized by the user. + case IconBuffer::SIZE_MEDIUM: + return SHIL_EXTRALARGE; //typically 48x48, but the size can be customized by the user. + case IconBuffer::SIZE_LARGE: + return wereVistaOrLater ? SHIL_JUMBO //normally 256x256 pixels -> will be scaled down by IconHolder + : SHIL_EXTRALARGE; //XP doesn't have jumbo icons + } + return SHIL_SMALL; +} + + +util::DllFun<thumb::GetIconByIndexFct> getIconByIndex; +boost::once_flag initGetIconByIndexOnce = BOOST_ONCE_INIT; + + +IconHolder getIconByAttribute(LPCWSTR pszPath, DWORD dwFileAttributes, IconBuffer::IconSize sz) +{ //NOTE: CoInitializeEx()/CoUninitialize() needs to be called for THIS thread! - ::SHGetFileInfo(filename.c_str(), //zen::removeLongPathPrefix(fileName), //::SHGetFileInfo() can't handle \\?\-prefix! - 0, - &fileInfo, - sizeof(fileInfo), - SHGFI_ICON | SHGFI_SMALLICON); + SHFILEINFO fileInfo = {}; //initialize hIcon + DWORD_PTR imgList = ::SHGetFileInfo(pszPath, //Windows 7 doesn't like this parameter to be an empty string + dwFileAttributes, + &fileInfo, + sizeof(fileInfo), + SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES); + //no need to IUnknown::Release() imgList! + if (!imgList) + return NULL; + + boost::call_once(initGetIconByIndexOnce, []() //thread-safe init + { + getIconByIndex = util::DllFun<thumb::GetIconByIndexFct>(thumb::getDllName(), thumb::getIconByIndexFctName); + }); + return getIconByIndex ? static_cast<HICON>(getIconByIndex(fileInfo.iIcon, getShilIconType(sz))) : NULL; +} + + +IconHolder getAssociatedIconByExt(const Zstring& extension, IconBuffer::IconSize sz) +{ + //no read-access to disk! determine icon by extension + return getIconByAttribute((Zstr("dummy.") + extension).c_str(), FILE_ATTRIBUTE_NORMAL, sz); +} + + +util::DllFun<thumb::GetThumbnailFct> getThumbnailIcon; +boost::once_flag initThumbnailOnce = BOOST_ONCE_INIT; +} +#endif +//################################################################################################################################################ + + +IconHolder getThumbnail(const Zstring& filename, int requestedSize) //return 0 on failure +{ +#ifdef FFS_WIN + using namespace thumb; - return IconHolder(fileInfo.hIcon); //pass icon ownership (may be 0) + boost::call_once(initThumbnailOnce, []() //note: "getThumbnail" function itself is already thread-safe + { + getThumbnailIcon = util::DllFun<GetThumbnailFct>(getDllName(), getThumbnailFctName); + }); + return getThumbnailIcon ? static_cast< ::HICON>(getThumbnailIcon(filename.c_str(), requestedSize)) : NULL; #elif defined FFS_LINUX //call Gtk::Main::init_gtkmm_internals() on application startup!! try { + Glib::RefPtr<Gdk::Pixbuf> iconPixbuf = Gdk::Pixbuf::create_from_file(filename.c_str(), requestedSize, requestedSize); + if (iconPixbuf) + return IconHolder(iconPixbuf->gobj_copy()); //copy and pass icon ownership (may be 0) + } + catch (const Glib::Error&) {} + + return IconHolder(); +#endif +} + + +IconHolder getAssociatedIcon(const Zstring& filename, IconBuffer::IconSize sz) +{ + //1. try to load thumbnails + switch (sz) + { + case IconBuffer::SIZE_SMALL: + break; + case IconBuffer::SIZE_MEDIUM: + case IconBuffer::SIZE_LARGE: + { + IconHolder ico = getThumbnail(filename, IconBuffer::cvrtSize(sz)); + if (ico) + return ico; + //else: fallback to non-thumbnail icon + } + break; + } + + //2. retrieve file icons +#ifdef FFS_WIN + //perf: optimize fallback case for SIZE_MEDIUM and SIZE_LARGE: + const Zstring& extension = getFileExtension(filename); + if (isCheapExtension(extension)) //"pricey" extensions are stored with fullnames and are read from disk, while cheap ones require just the extension + return getAssociatedIconByExt(extension, sz); + //result will not be buffered under extension name, but full filename; this is okay, since we're in SIZE_MEDIUM or SIZE_LARGE context, + //which means the access to get thumbnail failed: thumbnail failure is not dependent from extension in general! + + SHFILEINFO fileInfo = {}; + DWORD_PTR imgList = ::SHGetFileInfo(filename.c_str(), //zen::removeLongPathPrefix(fileName), //::SHGetFileInfo() can't handle \\?\-prefix! + 0, + &fileInfo, + sizeof(fileInfo), + SHGFI_SYSICONINDEX); + //Quote: "The IImageList pointer type, such as that returned in the ppv parameter, can be cast as an HIMAGELIST as + // needed; for example, for use in a list view. Conversely, an HIMAGELIST can be cast as a pointer to an IImageList." + //http://msdn.microsoft.com/en-us/library/windows/desktop/bb762185(v=vs.85).aspx + + if (!imgList) + return NULL; + //imgList->Release(); //empiric study: crash on XP if we release this! Seems we do not own it... -> also no GDI leak on Win7 -> okay + //another comment on http://msdn.microsoft.com/en-us/library/bb762179(v=VS.85).aspx describes exact same behavior on Win7/XP + + boost::call_once(initGetIconByIndexOnce, []() //thread-safe init + { + getIconByIndex = util::DllFun<thumb::GetIconByIndexFct>(thumb::getDllName(), thumb::getIconByIndexFctName); + }); + return getIconByIndex ? static_cast<HICON>(getIconByIndex(fileInfo.iIcon, getShilIconType(sz))) : NULL; + +#elif defined FFS_LINUX + const int requestedSize = IconBuffer::cvrtSize(sz); + //call Gtk::Main::init_gtkmm_internals() on application startup!! + try + { Glib::RefPtr<Gio::File> fileObj = Gio::File::create_for_path(filename.c_str()); //never fails Glib::RefPtr<Gio::FileInfo> fileInfo = fileObj->query_info(G_FILE_ATTRIBUTE_STANDARD_ICON); if (fileInfo) @@ -162,7 +341,7 @@ IconHolder getAssociatedIcon(const Zstring& filename) Glib::RefPtr<Gtk::IconTheme> iconTheme = Gtk::IconTheme::get_default(); if (iconTheme) { - Gtk::IconInfo iconInfo = iconTheme->lookup_icon(gicon, IconBuffer::ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); //this may fail if icon is not installed on system + Gtk::IconInfo iconInfo = iconTheme->lookup_icon(gicon, requestedSize, Gtk::ICON_LOOKUP_USE_BUILTIN); //this may fail if icon is not installed on system if (iconInfo) { Glib::RefPtr<Gdk::Pixbuf> iconPixbuf = iconInfo.load_icon(); //render icon into Pixbuf @@ -180,9 +359,9 @@ IconHolder getAssociatedIcon(const Zstring& filename) Glib::RefPtr<Gtk::IconTheme> iconTheme = Gtk::IconTheme::get_default(); if (iconTheme) { - Glib::RefPtr<Gdk::Pixbuf> iconPixbuf = iconTheme->load_icon("misc", IconBuffer::ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); + Glib::RefPtr<Gdk::Pixbuf> iconPixbuf = iconTheme->load_icon("misc", requestedSize, Gtk::ICON_LOOKUP_USE_BUILTIN); if (!iconPixbuf) - iconPixbuf = iconTheme->load_icon("text-x-generic", IconBuffer::ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); + iconPixbuf = iconTheme->load_icon("text-x-generic", requestedSize, Gtk::ICON_LOOKUP_USE_BUILTIN); if (iconPixbuf) return IconHolder(iconPixbuf->gobj_copy()); //copy and pass icon ownership (may be 0) } @@ -194,91 +373,44 @@ IconHolder getAssociatedIcon(const Zstring& filename) #endif } -#ifdef FFS_WIN -IconHolder getAssociatedIconByExt(const Zstring& extension) -{ - SHFILEINFO fileInfo = {}; //initialize hIcon -> fix for weird error: SHGetFileInfo() might return successfully WITHOUT filling fileInfo.hIcon!! - - //no read-access to disk! determine icon by extension - ::SHGetFileInfo((Zstr("dummy.") + extension).c_str(), //Windows Seven doesn't like this parameter to be without short name - FILE_ATTRIBUTE_NORMAL, - &fileInfo, - sizeof(fileInfo), - SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES); - - return IconHolder(fileInfo.hIcon); //pass icon ownership (may be 0) -} -#endif - -wxIcon getDirectoryIcon() +IconHolder getDirectoryIcon(IconBuffer::IconSize sz) { #ifdef FFS_WIN - wxIcon folderIcon; - - SHFILEINFO fileInfo = {}; //initialize hIcon - - //NOTE: CoInitializeEx()/CoUninitialize() needs to be called for THIS thread! - if (::SHGetFileInfo(Zstr("dummy"), //Windows Seven doesn't like this parameter to be an empty string - FILE_ATTRIBUTE_DIRECTORY, - &fileInfo, - sizeof(fileInfo), - SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES) && - - fileInfo.hIcon != 0) //fix for weird error: SHGetFileInfo() might return successfully WITHOUT filling fileInfo.hIcon!! - { - folderIcon.SetHICON(fileInfo.hIcon); //transfer ownership! - folderIcon.SetSize(IconBuffer::ICON_SIZE, IconBuffer::ICON_SIZE); - } - - return folderIcon; - + return getIconByAttribute(L"dummy", //Windows 7 doesn't like this parameter to be an empty string! + FILE_ATTRIBUTE_DIRECTORY, sz); #elif defined FFS_LINUX - return ::getAssociatedIcon(Zstr("/usr/")).toWxIcon(); //all directories will look like "/usr/" + return ::getAssociatedIcon(Zstr("/usr/"), sz); //all directories will look like "/usr/" #endif } -wxIcon getFileIcon() +IconHolder getFileIcon(IconBuffer::IconSize sz) { - wxIcon fileIcon; - #ifdef FFS_WIN - SHFILEINFO fileInfo = {}; //initialize hIcon - - //NOTE: CoInitializeEx()/CoUninitialize() needs to be called for THIS thread! - if (::SHGetFileInfo(Zstr("dummy"), //Windows Seven doesn't like this parameter to be an empty string - FILE_ATTRIBUTE_NORMAL, - &fileInfo, - sizeof(fileInfo), - SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES) && - - fileInfo.hIcon != 0) //fix for weird error: SHGetFileInfo() might return successfully WITHOUT filling fileInfo.hIcon!! - { - fileIcon.SetHICON(fileInfo.hIcon); //transfer ownership! - fileIcon.SetSize(IconBuffer::ICON_SIZE, IconBuffer::ICON_SIZE); - } - + return getIconByAttribute(L"dummy", FILE_ATTRIBUTE_NORMAL, sz); #elif defined FFS_LINUX + const int requestedSize = IconBuffer::cvrtSize(sz); try { Glib::RefPtr<Gtk::IconTheme> iconTheme = Gtk::IconTheme::get_default(); if (iconTheme) { - Glib::RefPtr<Gdk::Pixbuf> iconPixbuf = iconTheme->load_icon("misc", IconBuffer::ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); + Glib::RefPtr<Gdk::Pixbuf> iconPixbuf = iconTheme->load_icon("misc", requestedSize, Gtk::ICON_LOOKUP_USE_BUILTIN); if (!iconPixbuf) - iconPixbuf = iconTheme->load_icon("text-x-generic", IconBuffer::ICON_SIZE, Gtk::ICON_LOOKUP_USE_BUILTIN); + iconPixbuf = iconTheme->load_icon("text-x-generic", requestedSize, Gtk::ICON_LOOKUP_USE_BUILTIN); if (iconPixbuf) - fileIcon.SetPixbuf(iconPixbuf->gobj_copy()); // transfer ownership!! + return IconHolder(iconPixbuf->gobj_copy()); // transfer ownership!! } } catch (const Glib::Error&) {} + + return IconHolder(); #endif - return fileIcon; } +//################################################################################################################################################ -//################################################################################################################################################ //---------------------- Shared Data ------------------------- struct WorkLoad { @@ -318,73 +450,64 @@ typedef std::queue<Zstring> IconDbSequence; //entryName class Buffer { public: - bool requestFileIcon(const Zstring& fileName, wxIcon* icon = NULL); - void insertIntoBuffer(const Zstring& entryName, const IconHolder& icon); //called by worker thread - -private: - boost::mutex lockBuffer; - NameIconMap iconMappping; //use synchronisation when accessing this! - IconDbSequence iconSequence; //save sequence of buffer entry to delete oldest elements -}; -//------------------------------------------------------------ - - -bool Buffer::requestFileIcon(const Zstring& fileName, wxIcon* icon) //context of main AND worker thread -{ - boost::lock_guard<boost::mutex> dummy(lockBuffer); - -#ifdef FFS_WIN - //"pricey" extensions are stored with fullnames and are read from disk, while cheap ones require just the extension - const Zstring extension = getFileExtension(fileName); - const Zstring searchString = isPriceyExtension(extension) ? fileName : extension; - auto iter = iconMappping.find(searchString); -#elif defined FFS_LINUX - auto iter = iconMappping.find(fileName); -#endif + bool requestFileIcon(const Zstring& fileName, IconHolder* icon = NULL) + { + boost::lock_guard<boost::mutex> dummy(lockBuffer); - if (iter == iconMappping.end()) + auto iter = iconMappping.find(fileName); + if (iter != iconMappping.end()) + { + if (icon != NULL) + *icon = iter->second; + return true; + } return false; + } - if (icon != NULL) - *icon = iter->second.toWxIcon(); - return true; -} - - -void Buffer::insertIntoBuffer(const Zstring& entryName, const IconHolder& icon) //called by worker thread -{ - boost::lock_guard<boost::mutex> dummy(lockBuffer); + void insertIntoBuffer(const Zstring& entryName, const IconHolder& icon) //called by worker thread + { + boost::lock_guard<boost::mutex> dummy(lockBuffer); - //thread saftey: icon uses ref-counting! But is NOT shared with main thread! - auto rc = iconMappping.insert(std::make_pair(entryName, icon)); - if (rc.second) //if insertion took place - iconSequence.push(entryName); //note: sharing Zstring with IconDB!!! + //thread saftey: icon uses ref-counting! But is NOT shared with main thread! + auto rc = iconMappping.insert(std::make_pair(entryName, icon)); + if (rc.second) //if insertion took place + iconSequence.push(entryName); //note: sharing Zstring with IconDB!!! - assert(iconMappping.size() == iconSequence.size()); + assert(iconMappping.size() == iconSequence.size()); - //remove elements if buffer becomes too big: - if (iconMappping.size() > BUFFER_SIZE_MAX) //limit buffer size: critical because GDI resources are limited (e.g. 10000 on XP per process) - { - //remove oldest element - iconMappping.erase(iconSequence.front()); - iconSequence.pop(); + //remove elements if buffer becomes too big: + if (iconMappping.size() > BUFFER_SIZE_MAX) //limit buffer size: critical because GDI resources are limited (e.g. 10000 on XP per process) + { + //remove oldest element + iconMappping.erase(iconSequence.front()); + iconSequence.pop(); + } } -} + +private: + boost::mutex lockBuffer; + NameIconMap iconMappping; //use synchronisation when accessing this! + IconDbSequence iconSequence; //save sequence of buffer entry to delete oldest elements +}; +//------------------------------------------------------------- //################################################################################################################################################ class WorkerThread //lifetime is part of icon buffer { public: WorkerThread(const std::shared_ptr<WorkLoad>& workload, - const std::shared_ptr<Buffer>& buffer) : + const std::shared_ptr<Buffer>& buffer, + IconBuffer::IconSize sz) : workload_(workload), - buffer_(buffer) {} + buffer_(buffer), + icoSize(sz) {} void operator()(); //thread entry private: std::shared_ptr<WorkLoad> workload_; //main/worker thread may access different shared_ptr instances safely (even though they have the same target!) std::shared_ptr<Buffer> buffer_; //http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm?sess=8153b05b34d890e02d48730db1ff7ddc#ThreadSafety + const IconBuffer::IconSize icoSize; }; @@ -392,9 +515,18 @@ void WorkerThread::operator()() //thread entry { //failure to initialize COM for each thread is a source of hard to reproduce bugs: https://sourceforge.net/tracker/?func=detail&aid=3160472&group_id=234430&atid=1093080 #ifdef FFS_WIN - ::CoInitializeEx(NULL, COINIT_MULTITHREADED | COINIT_DISABLE_OLE1DDE); - Loki::ScopeGuard dummy = Loki::MakeGuard([]() { ::CoUninitialize(); }); - (void)dummy; + //Prerequisites, see thumbnail.h + + //1. Initialize COM + ::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); + LOKI_ON_BLOCK_EXIT2(::CoUninitialize()); + + //2. Initialize system image list + typedef BOOL (WINAPI *FileIconInitFun)(BOOL fRestoreCache); + const util::DllFun<FileIconInitFun> fileIconInit(L"Shell32.dll", reinterpret_cast<LPCSTR>(660)); + assert(fileIconInit); + if (fileIconInit) + fileIconInit(false); //TRUE to restore the system image cache from disk; FALSE otherwise. #endif while (true) @@ -406,20 +538,9 @@ void WorkerThread::operator()() //thread entry if (buffer_->requestFileIcon(fileName)) continue; //icon already in buffer: skip -#ifdef FFS_WIN - const Zstring extension = getFileExtension(fileName); - if (isPriceyExtension(extension)) //"pricey" extensions are stored with fullnames and are read from disk, while cheap ones require just the extension - buffer_->insertIntoBuffer(fileName, getAssociatedIcon(fileName)); - else //no read-access to disk! determine icon by extension - buffer_->insertIntoBuffer(extension, getAssociatedIconByExt(extension)); - -#elif defined FFS_LINUX - const IconHolder newIcon = getAssociatedIcon(fileName); - buffer_->insertIntoBuffer(fileName, newIcon); -#endif + buffer_->insertIntoBuffer(fileName, getAssociatedIcon(fileName, icoSize)); } } - //######################### redirect to impl ##################################################### struct IconBuffer::Pimpl @@ -435,9 +556,13 @@ struct IconBuffer::Pimpl }; -IconBuffer::IconBuffer() : pimpl(new Pimpl) +IconBuffer::IconBuffer(IconSize sz) : + pimpl(new Pimpl), + icoSize(sz), + genDirIcon(::getDirectoryIcon(sz).toWxIcon(cvrtSize(icoSize))), + genFileIcon(::getFileIcon(sz).toWxIcon(cvrtSize(icoSize))) { - pimpl->worker = boost::thread(WorkerThread(pimpl->workload, pimpl->buffer)); + pimpl->worker = boost::thread(WorkerThread(pimpl->workload, pimpl->buffer, sz)); } @@ -449,24 +574,40 @@ IconBuffer::~IconBuffer() } -IconBuffer& IconBuffer::getInstance() +bool IconBuffer::requestFileIcon(const Zstring& filename, wxIcon* icon) { - static IconBuffer instance; - return instance; -} + auto getIcon = [&](const Zstring& entryName) -> bool + { + if (!icon) + return pimpl->buffer->requestFileIcon(entryName); -bool IconBuffer::requestFileIcon(const Zstring& fileName, wxIcon* icon) { return pimpl->buffer->requestFileIcon(fileName, icon); } + IconHolder heldIcon; + if (!pimpl->buffer->requestFileIcon(entryName, &heldIcon)) + return false; + *icon = heldIcon.toWxIcon(cvrtSize(icoSize)); + return true; + }; -void IconBuffer::setWorkload(const std::vector<Zstring>& load) { pimpl->workload->setWorkload(load); } +#ifdef FFS_WIN + //perf: let's read icons which don't need file access right away! No async delay justified! + if (icoSize == IconBuffer::SIZE_SMALL) //non-thumbnail view, we need file type icons only! + { + const Zstring& extension = getFileExtension(filename); + if (isCheapExtension(extension)) //"pricey" extensions are stored with fullnames and are read from disk, while cheap ones require just the extension + { + if (!getIcon(extension)) + { + IconHolder heldIcon = getAssociatedIconByExt(extension, icoSize); //fast! + pimpl->buffer->insertIntoBuffer(extension, heldIcon); + if (icon) + *icon = heldIcon.toWxIcon(cvrtSize(icoSize)); + } + return true; + } + } +#endif -const wxIcon& IconBuffer::getDirectoryIcon() -{ - static wxIcon dirIcon = ::getDirectoryIcon(); - return dirIcon; + return getIcon(filename); } -const wxIcon& IconBuffer::getFileIcon() -{ - static wxIcon fileIcon = ::getFileIcon(); - return fileIcon; -} +void IconBuffer::setWorkload(const std::vector<Zstring>& load) { pimpl->workload->setWorkload(load); } diff --git a/library/icon_buffer.h b/library/icon_buffer.h index 00370d1b..cbd582f2 100644 --- a/library/icon_buffer.h +++ b/library/icon_buffer.h @@ -17,25 +17,33 @@ namespace zen class IconBuffer { public: - static const wxIcon& getDirectoryIcon(); //generic icons - static const wxIcon& getFileIcon(); // + enum IconSize + { + SIZE_SMALL, + SIZE_MEDIUM, + SIZE_LARGE + }; + + IconBuffer(IconSize sz); + ~IconBuffer(); + + int getSize() const { return cvrtSize(icoSize); } //*maximum* icon size in pixel + + const wxIcon& genericDirIcon () { return genDirIcon; } + const wxIcon& genericFileIcon() { return genFileIcon; } - static IconBuffer& getInstance(); - bool requestFileIcon(const Zstring& fileName, wxIcon* icon = NULL); //returns false if icon is not in buffer + bool requestFileIcon(const Zstring& filename, wxIcon* icon = NULL); //returns false if icon is not in buffer void setWorkload(const std::vector<Zstring>& load); //(re-)set new workload of icons to be retrieved; -#ifdef FFS_WIN - static const int ICON_SIZE = 16; //size in pixel -#elif defined FFS_LINUX - static const int ICON_SIZE = 24; //size in pixel -#endif + static int cvrtSize(IconSize sz); private: - IconBuffer(); - ~IconBuffer(); - struct Pimpl; std::unique_ptr<Pimpl> pimpl; + + const IconSize icoSize; + const wxIcon genDirIcon; + const wxIcon genFileIcon; }; } diff --git a/library/lock_holder.h b/library/lock_holder.h index 65471d5f..b72b12c1 100644 --- a/library/lock_holder.h +++ b/library/lock_holder.h @@ -20,10 +20,6 @@ public: if (dirnameFmt.empty()) return; - std::wstring statusText = _("Searching for directory %x..."); - replace(statusText, L"%x", std::wstring(L"\"") + dirnameFmt + L"\"", false); - procCallback.reportInfo(statusText); - if (!dirExistsUpdating(dirnameFmt, procCallback)) return; @@ -35,7 +31,7 @@ public: public: WaitOnLockHandler(ProcessCallback& pc) : pc_(pc) {} virtual void requestUiRefresh() { pc_.requestUiRefresh(); } //allowed to throw exceptions - virtual void reportInfo(const std::wstring& text) { pc_.reportInfo(text); } + virtual void reportInfo(const std::wstring& text) { pc_.reportStatus(text); } private: ProcessCallback& pc_; } callback(procCallback); diff --git a/library/parallel_scan.cpp b/library/parallel_scan.cpp index 5ccb05fe..2c24600f 100644 --- a/library/parallel_scan.cpp +++ b/library/parallel_scan.cpp @@ -12,7 +12,6 @@ #include "../shared/file_traverser.h" #include "../shared/file_error.h" #include "../shared/string_conv.h" -#include "../shared/check_exist.h" #include "../shared/boost_thread_wrap.h" //include <boost/thread.hpp> #include "loki/ScopeGuard.h" //#include "../shared/file_id.h" @@ -96,15 +95,13 @@ DiskInfo retrieveDiskInfo(const Zstring& pathName) HANDLE hVolume = ::CreateFile(volnameFmt.c_str(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, + 0, OPEN_EXISTING, 0, NULL); if (hVolume == INVALID_HANDLE_VALUE) return output; - - Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hVolume); - (void)dummy; //silence warning "unused variable" + LOKI_ON_BLOCK_EXIT2(::CloseHandle(hVolume)); std::vector<char> buffer(sizeof(VOLUME_DISK_EXTENTS) + sizeof(DISK_EXTENT)); //reserve buffer for at most one disk! call below will then fail if volume spans multiple disks! @@ -196,19 +193,22 @@ public: FillBufferCallback::HandleError reportError(const std::wstring& msg) //blocking call: context of worker thread { boost::unique_lock<boost::mutex> dummy(lockErrorMsg); - while(!errorMsg.empty() || errorResponse.get()) + while (!errorMsg.empty() || errorResponse.get()) conditionCanReportError.timed_wait(dummy, boost::posix_time::milliseconds(50)); //interruption point! errorMsg = BasicWString(msg); - while(!errorResponse.get()) + while (!errorResponse.get()) conditionGotResponse.timed_wait(dummy, boost::posix_time::milliseconds(50)); //interruption point! FillBufferCallback::HandleError rv = *errorResponse; errorMsg.clear(); errorResponse.reset(); + + //dummy.unlock(); conditionCanReportError.notify_one(); + return rv; } @@ -219,6 +219,8 @@ public: { FillBufferCallback::HandleError rv = callback.reportError(cvrtString<std::wstring>(errorMsg)); //throw! errorResponse.reset(new FillBufferCallback::HandleError(rv)); + + //dummy.unlock(); conditionGotResponse.notify_one(); } } @@ -324,7 +326,6 @@ public: const HardFilter::FilterRef filterInstance; //always bound! std::set<Zstring>& failedReads_; //relative postfixed names of directories that could not be read (empty for root) - std::set<DirContainer*> excludedDirs; AsyncCallback& acb_; int threadID_; @@ -428,14 +429,12 @@ TraverseCallback::ReturnValDir DirCallback::onDir(const Zchar* shortName, const bool subObjMightMatch = true; const bool passFilter = cfg.filterInstance->passDirFilter(relName, &subObjMightMatch); if (!passFilter && !subObjMightMatch) - return Loki::Int2Type<ReturnValDir::TRAVERSING_DIR_IGNORE>(); //do NOT traverse subdirs - //else: attention! ensure directory filtering is applied later to exclude actually filtered directories + return Loki::Int2Type<ReturnValDir::TRAVERSING_DIR_IGNORE>(); //do NOT traverse subdirs + //else: attention! ensure directory filtering is applied later to exclude actually filtered directories DirContainer& subDir = output_.addSubDir(shortName); if (passFilter) - cfg.acb_.incItemsScanned(); //add 1 element to the progress indicator - else - cfg.excludedDirs.insert(&subDir); + cfg.acb_.incItemsScanned(); //add 1 element to the progress indicator TraverserShared::CallbackPointer subDirCallback = std::make_shared<DirCallback>(cfg, relName + FILE_NAME_SEPARATOR, subDir); cfg.callBackBox.push_back(subDirCallback); //handle lifetime @@ -484,38 +483,6 @@ private: #endif //------------------------------------------------------------------------------------------ -template <class M, class Predicate> inline -void map_remove_if(M& map, Predicate p) -{ - for (auto iter = map.begin(); iter != map.end();) - if (p(*iter)) - map.erase(iter++); - else - ++iter; -} - -void removeFilteredDirs(DirContainer& dirCont, const std::set<DirContainer*>& excludedDirs) -{ - //process subdirs recursively - std::for_each(dirCont.dirs.begin(), dirCont.dirs.end(), - [&](std::pair<const Zstring, DirContainer>& item) - { - removeFilteredDirs(item.second, excludedDirs); - }); - - //remove superfluous directories - map_remove_if(dirCont.dirs, - [&](std::pair<const Zstring, DirContainer>& item) -> bool - { - DirContainer& subDir = item.second; - return - subDir.dirs .empty() && - subDir.files.empty() && - subDir.links.empty() && - excludedDirs.find(&subDir) != excludedDirs.end(); - }); -} - class WorkerThread { @@ -530,8 +497,7 @@ public: void operator()() //thread entry { acb_->incActiveWorker(); - Loki::ScopeGuard dummy = Loki::MakeGuard([&]() { acb_->decActiveWorker(); }); - (void)dummy; + LOKI_ON_BLOCK_EXIT2(acb_->decActiveWorker();); std::for_each(workload_.begin(), workload_.end(), [&](std::pair<DirectoryKey, DirectoryValue*>& item) @@ -539,50 +505,40 @@ public: const Zstring& directoryName = item.first.dirnameFull_; DirectoryValue& dirVal = *item.second; - acb_->reportCurrentFile(directoryName, threadID_); //just in case directory existence check is blocking! + acb_->reportCurrentFile(directoryName, threadID_); //just in case first directory access is blocking + + TraverserShared travCfg(threadID_, + item.first.handleSymlinks_, //shared by all(!) instances of DirCallback while traversing a folder hierarchy + item.first.filter_, + dirVal.failedReads, + *acb_); - if (!directoryName.empty() && - util::dirExistsAsync(directoryName).get()) //blocking + interruption point! - //folder existence already checked in startCompareProcess(): do not treat as error when arriving here! - //perf note: missing network drives should not delay here, as Windows buffers result of last existence check for a short time + DirCallback traverser(travCfg, + Zstring(), + dirVal.dirCont); + + bool followSymlinks = false; + switch (item.first.handleSymlinks_) { - TraverserShared travCfg(threadID_, - item.first.handleSymlinks_, //shared by all(!) instances of DirCallback while traversing a folder hierarchy - item.first.filter_, - dirVal.failedReads, - *acb_); - - DirCallback traverser(travCfg, - Zstring(), - dirVal.dirCont); - - bool followSymlinks = false; - switch (item.first.handleSymlinks_) - { - case SYMLINK_IGNORE: - followSymlinks = false; //=> symlinks will be reported via onSymlink() where they are excluded - break; - case SYMLINK_USE_DIRECTLY: - followSymlinks = false; - break; - case SYMLINK_FOLLOW_LINK: - followSymlinks = true; - break; - } - - DstHackCallback* dstCallbackPtr = NULL; + case SYMLINK_IGNORE: + followSymlinks = false; //=> symlinks will be reported via onSymlink() where they are excluded + break; + case SYMLINK_USE_DIRECTLY: + followSymlinks = false; + break; + case SYMLINK_FOLLOW_LINK: + followSymlinks = true; + break; + } + + DstHackCallback* dstCallbackPtr = NULL; #ifdef FFS_WIN - DstHackCallbackImpl dstCallback(*acb_, threadID_); - dstCallbackPtr = &dstCallback; + DstHackCallbackImpl dstCallback(*acb_, threadID_); + dstCallbackPtr = &dstCallback; #endif - //get all files and folders from directoryPostfixed (and subdirectories) - traverseFolder(directoryName, followSymlinks, traverser, dstCallbackPtr); //exceptions may be thrown! - - //attention: some filtered directories are still in the comparison result! (see include filter handling!) - if (!travCfg.excludedDirs.empty()) - removeFilteredDirs(dirVal.dirCont, travCfg.excludedDirs); //remove all excluded directories (but keeps those serving as parent folders for not excl. elements) - } + //get all files and folders from directoryPostfixed (and subdirectories) + traverseFolder(directoryName, followSymlinks, traverser, dstCallbackPtr); //exceptions may be thrown! }); } diff --git a/library/parallel_scan.h b/library/parallel_scan.h index 5eaa6bd9..5c998969 100644 --- a/library/parallel_scan.h +++ b/library/parallel_scan.h @@ -45,7 +45,7 @@ bool operator<(const DirectoryKey& lhs, const DirectoryKey& rhs) struct DirectoryValue { DirContainer dirCont; - std::set<Zstring> failedReads; //relative postfixed names of directories that could not be read (empty for root), e.g. access denied, or temporal network drop + std::set<Zstring> failedReads; //relative postfixed names of directories that could not be read (empty string for root), e.g. access denied, or temporal network drop }; diff --git a/library/process_xml.cpp b/library/process_xml.cpp index aad96265..8362e073 100644 --- a/library/process_xml.cpp +++ b/library/process_xml.cpp @@ -98,22 +98,48 @@ xmlAccess::XmlGuiConfig xmlAccess::convertBatchToGui(const xmlAccess::XmlBatchCo { XmlGuiConfig output; output.mainCfg = batchCfg.mainCfg; + + switch (batchCfg.handleError) + { + case ON_ERROR_EXIT: + case ON_ERROR_POPUP: + output.handleError = ON_GUIERROR_POPUP; + break; + case ON_ERROR_IGNORE: + output.handleError = ON_GUIERROR_IGNORE; + break; + } return output; } -xmlAccess::XmlBatchConfig xmlAccess::convertGuiToBatch(const xmlAccess::XmlGuiConfig& guiCfg) +xmlAccess::XmlBatchConfig xmlAccess::convertGuiToBatch(const xmlAccess::XmlGuiConfig& guiCfg, const wxString& referenceFile) { - XmlBatchConfig output; + //try to take over batch-specific settings from reference + if (!referenceFile.empty() && getXmlType(referenceFile) == XML_TYPE_BATCH) + try + { + XmlBatchConfig output; + + std::vector<wxString> filenames; + filenames.push_back(referenceFile); + convertConfig(filenames, output); //throw xmlAccess::FfsXmlError + + output.mainCfg = guiCfg.mainCfg; + return output; + } + catch (xmlAccess::FfsXmlError&) {} + + XmlBatchConfig output; //use default batch-settings output.mainCfg = guiCfg.mainCfg; switch (guiCfg.handleError) { case ON_GUIERROR_POPUP: - output.handleError = xmlAccess::ON_ERROR_POPUP; + output.handleError = ON_ERROR_POPUP; break; case ON_GUIERROR_IGNORE: - output.handleError = xmlAccess::ON_ERROR_IGNORE; + output.handleError = ON_ERROR_IGNORE; break; } @@ -158,12 +184,12 @@ xmlAccess::MergeType xmlAccess::getMergeType(const std::vector<wxString>& filena namespace { template <class XmlCfg> -XmlCfg loadCfgImpl(const wxString& filename, std::unique_ptr<xmlAccess::FfsXmlError>& exeption) //throw (xmlAccess::FfsXmlError) +XmlCfg loadCfgImpl(const wxString& filename, std::unique_ptr<xmlAccess::FfsXmlError>& exeption) //throw xmlAccess::FfsXmlError { XmlCfg cfg; try { - xmlAccess::readConfig(filename, cfg); //throw (xmlAccess::FfsXmlError); + xmlAccess::readConfig(filename, cfg); //throw xmlAccess::FfsXmlError } catch (const xmlAccess::FfsXmlError& e) { @@ -177,7 +203,7 @@ XmlCfg loadCfgImpl(const wxString& filename, std::unique_ptr<xmlAccess::FfsXmlEr template <class XmlCfg> -void mergeConfigFilesImpl(const std::vector<wxString>& filenames, XmlCfg& config) //throw (xmlAccess::FfsXmlError) +void mergeConfigFilesImpl(const std::vector<wxString>& filenames, XmlCfg& config) //throw xmlAccess::FfsXmlError { using namespace xmlAccess; @@ -193,11 +219,11 @@ void mergeConfigFilesImpl(const std::vector<wxString>& filenames, XmlCfg& config switch (getXmlType(*i)) { case XML_TYPE_GUI: - mainCfgs.push_back(loadCfgImpl<XmlGuiConfig>(*i, savedException).mainCfg); //throw (xmlAccess::FfsXmlError) + mainCfgs.push_back(loadCfgImpl<XmlGuiConfig>(*i, savedException).mainCfg); //throw xmlAccess::FfsXmlError break; case XML_TYPE_BATCH: - mainCfgs.push_back(loadCfgImpl<XmlBatchConfig>(*i, savedException).mainCfg); //throw (xmlAccess::FfsXmlError) + mainCfgs.push_back(loadCfgImpl<XmlBatchConfig>(*i, savedException).mainCfg); //throw xmlAccess::FfsXmlError break; case XML_TYPE_GLOBAL: @@ -211,9 +237,9 @@ void mergeConfigFilesImpl(const std::vector<wxString>& filenames, XmlCfg& config try //...to init all non-"mainCfg" settings with first config file { - xmlAccess::readConfig(filenames[0], config); //throw (xmlAccess::FfsXmlError); + xmlAccess::readConfig(filenames[0], config); //throw xmlAccess::FfsXmlError } - catch (...) {} + catch (xmlAccess::FfsXmlError&) {} config.mainCfg = merge(mainCfgs); @@ -364,6 +390,41 @@ bool readText(const std::string& input, OnGuiError& value) template <> inline +void writeText(const FileIconSize& value, std::string& output) +{ + switch (value) + { + case ICON_SIZE_SMALL: + output = "Small"; + break; + case ICON_SIZE_MEDIUM: + output = "Medium"; + break; + case ICON_SIZE_LARGE: + output = "Large"; + break; + } +} + + +template <> inline +bool readText(const std::string& input, FileIconSize& value) +{ + std::string tmp = input; + zen::trim(tmp); + if (tmp == "Small") + value = ICON_SIZE_SMALL; + else if (tmp == "Medium") + value = ICON_SIZE_MEDIUM; + else if (tmp == "Large") + value = ICON_SIZE_LARGE; + else + return false; + return true; +} + + +template <> inline void writeText(const DeletionPolicy& value, std::string& output) { switch (value) @@ -439,17 +500,20 @@ void writeText(const UnitTime& value, std::string& output) case UTIME_NONE: output = "Inactive"; break; - case UTIME_SEC: - output = "Second"; + // case UTIME_LAST_X_HOURS: + // output = "x-hours"; + // break; + case UTIME_TODAY: + output = "Today"; break; - case UTIME_MIN: - output = "Minute"; + case UTIME_THIS_WEEK: + output = "Week"; break; - case UTIME_HOUR: - output = "Hour"; + case UTIME_THIS_MONTH: + output = "Month"; break; - case UTIME_DAY: - output = "Day"; + case UTIME_THIS_YEAR: + output = "Year"; break; } } @@ -461,14 +525,16 @@ bool readText(const std::string& input, UnitTime& value) zen::trim(tmp); if (tmp == "Inactive") value = UTIME_NONE; - else if (tmp == "Second") - value = UTIME_SEC; - else if (tmp == "Minute") - value = UTIME_MIN; - else if (tmp == "Hour") - value = UTIME_HOUR; - else if (tmp == "Day") - value = UTIME_DAY; + // else if (tmp == "x-hours") + // value = UTIME_LAST_X_HOURS; + else if (tmp == "Today") + value = UTIME_TODAY; + else if (tmp == "Week") + value = UTIME_THIS_WEEK; + else if (tmp == "Month") + value = UTIME_THIS_MONTH; + else if (tmp == "Year") + value = UTIME_THIS_YEAR; else return false; return true; @@ -529,38 +595,38 @@ bool readText(const std::string& input, UnitSize& value) template <> inline -void writeText(const SyncConfig::Variant& value, std::string& output) +void writeText(const DirectionConfig::Variant& value, std::string& output) { switch (value) { - case SyncConfig::AUTOMATIC: + case DirectionConfig::AUTOMATIC: output = "Automatic"; break; - case SyncConfig::MIRROR: + case DirectionConfig::MIRROR: output = "Mirror"; break; - case SyncConfig::UPDATE: + case DirectionConfig::UPDATE: output = "Update"; break; - case SyncConfig::CUSTOM: + case DirectionConfig::CUSTOM: output = "Custom"; break; } } template <> inline -bool readText(const std::string& input, SyncConfig::Variant& value) +bool readText(const std::string& input, DirectionConfig::Variant& value) { std::string tmp = input; zen::trim(tmp); if (tmp == "Automatic") - value = SyncConfig::AUTOMATIC; + value = DirectionConfig::AUTOMATIC; else if (tmp == "Mirror") - value = SyncConfig::MIRROR; + value = DirectionConfig::MIRROR; else if (tmp == "Update") - value = SyncConfig::UPDATE; + value = DirectionConfig::UPDATE; else if (tmp == "Custom") - value = SyncConfig::CUSTOM; + value = DirectionConfig::CUSTOM; else return false; return true; @@ -591,17 +657,33 @@ void writeValue(const ColumnAttrib& value, XmlElement& output) namespace { -void readConfig(const XmlIn& in, SyncConfig& syncCfg) +void readConfig(const XmlIn& in, CompConfig& cmpConfig) +{ + in["Variant" ](cmpConfig.compareVar); + in["HandleSymlinks"](cmpConfig.handleSymlinks); +} + + +void readConfig(const XmlIn& in, DirectionConfig& directCfg) { - in["Variant"](syncCfg.var); + in["Variant"](directCfg.var); XmlIn inCustDir = in["CustomDirections"]; - inCustDir["LeftOnly" ](syncCfg.custom.exLeftSideOnly); - inCustDir["RightOnly" ](syncCfg.custom.exRightSideOnly); - inCustDir["LeftNewer" ](syncCfg.custom.leftNewer); - inCustDir["RightNewer"](syncCfg.custom.rightNewer); - inCustDir["Different" ](syncCfg.custom.different); - inCustDir["Conflict" ](syncCfg.custom.conflict); + inCustDir["LeftOnly" ](directCfg.custom.exLeftSideOnly); + inCustDir["RightOnly" ](directCfg.custom.exRightSideOnly); + inCustDir["LeftNewer" ](directCfg.custom.leftNewer); + inCustDir["RightNewer"](directCfg.custom.rightNewer); + inCustDir["Different" ](directCfg.custom.different); + inCustDir["Conflict" ](directCfg.custom.conflict); +} + + +void readConfig(const XmlIn& in, SyncConfig& syncCfg) +{ + readConfig(in, syncCfg.directionCfg); + + in["DeletionPolicy" ](syncCfg.handleDeletion); + in["CustomDeletionFolder"](syncCfg.customDeletionDirectory); } @@ -628,18 +710,24 @@ void readConfig(const XmlIn& in, FolderPairEnh& enhPair) in["Right"](enhPair.rightDirectory); //########################################################### - //alternate sync configuration (optional) - XmlIn inAlt = in["AlternateSyncConfig"]; - if (inAlt) + //alternate comp configuration (optional) + XmlIn inAltCmp = in["AlternateCompareConfig"]; + if (inAltCmp) { - std::shared_ptr<AlternateSyncConfig> altSyncCfg = std::make_shared<AlternateSyncConfig>(); - enhPair.altSyncConfig = altSyncCfg; + CompConfig altCmpCfg; + readConfig(inAltCmp, altCmpCfg); - //read sync configuration - readConfig(inAlt, altSyncCfg->syncConfiguration); + enhPair.altCmpConfig = std::make_shared<CompConfig>(altCmpCfg);; + } + //########################################################### + //alternate sync configuration (optional) + XmlIn inAltSync = in["SyncConfig"]; + if (inAltSync) + { + SyncConfig altSyncCfg; + readConfig(inAltSync, altSyncCfg); - inAlt["DeletionPolicy" ](altSyncCfg->handleDeletion); - inAlt["CustomDeletionFolder"](altSyncCfg->customDeletionDirectory); + enhPair.altSyncConfig = std::make_shared<SyncConfig>(altSyncCfg); } //########################################################### @@ -650,24 +738,16 @@ void readConfig(const XmlIn& in, FolderPairEnh& enhPair) void readConfig(const XmlIn& in, MainConfiguration& mainCfg) { - XmlIn inCmp = in["MainConfig"]["Comparison"]; - - //read compare variant - inCmp["Variant"](mainCfg.compareVar); - - //include symbolic links at all? - inCmp["HandleSymlinks"](mainCfg.handleSymlinks); + //read compare settings + XmlIn inCmp = in["MainConfig"]["Comparison"]; + readConfig(inCmp, mainCfg.cmpConfig); //########################################################### + XmlIn inSync = in["MainConfig"]["SyncConfig"]; //read sync configuration - readConfig(inSync, mainCfg.syncConfiguration); - //########################################################### - - //misc - inSync["DeletionPolicy" ](mainCfg.handleDeletion); - inSync["CustomDeletionFolder"](mainCfg.customDeletionDirectory); + readConfig(inSync, mainCfg.syncCfg); //########################################################### XmlIn inFilter = in["MainConfig"]["GlobalFilter"]; @@ -731,7 +811,7 @@ void readConfig(const XmlIn& in, XmlGlobalSettings& config) inShared["CopyLockedFiles" ](config.copyLockedFiles); inShared["CopyFilePermissions" ](config.copyFilePermissions); - inShared["TransactionalFileCopy"](config.transactionalFileCopy); + inShared["TransactionalFileCopy"](config.transactionalFileCopy); inShared["VerifyCopiedFiles" ](config.verifyFileCopy); //max. allowed file time deviation @@ -765,13 +845,12 @@ void readConfig(const XmlIn& in, XmlGlobalSettings& config) inWnd["ManualDeletionUseRecycler"](config.gui.useRecyclerForManualDeletion); inWnd["RespectCaseOnSearch" ](config.gui.textSearchRespectCase); - //########################################################### + inWnd["IconSize"](config.gui.iconSize); + //########################################################### //read column attributes XmlIn inColLeft = inWnd["LeftColumns"]; - inColLeft.attribute("AutoAdjust", config.gui.autoAdjustColumnsLeft); - inColLeft.attribute("ShowFileIcons", config.gui.showFileIconsLeft); inColLeft(config.gui.columnAttribLeft); for (size_t i = 0; i < config.gui.columnAttribLeft.size(); ++i) @@ -779,9 +858,7 @@ void readConfig(const XmlIn& in, XmlGlobalSettings& config) //########################################################### XmlIn inColRight = inWnd["RightColumns"]; - inColRight.attribute("AutoAdjust", config.gui.autoAdjustColumnsRight); - inColRight.attribute("ShowFileIcons", config.gui.showFileIconsRight); inColRight(config.gui.columnAttribRight); for (size_t i = 0; i < config.gui.columnAttribRight.size(); ++i) @@ -850,17 +927,33 @@ void xmlAccess::readConfig(xmlAccess::XmlGlobalSettings& config) //################################################################################################ namespace { -void writeConfig(const SyncConfig& syncCfg, XmlOut& out) +void writeConfig(const CompConfig& cmpConfig, XmlOut& out) { - out["Variant"](syncCfg.var); + out["Variant" ](cmpConfig.compareVar); + out["HandleSymlinks"](cmpConfig.handleSymlinks); +} + + +void writeConfig(const DirectionConfig& directCfg, XmlOut& out) +{ + out["Variant"](directCfg.var); XmlOut outCustDir = out["CustomDirections"]; - outCustDir["LeftOnly" ](syncCfg.custom.exLeftSideOnly); - outCustDir["RightOnly" ](syncCfg.custom.exRightSideOnly); - outCustDir["LeftNewer" ](syncCfg.custom.leftNewer); - outCustDir["RightNewer"](syncCfg.custom.rightNewer); - outCustDir["Different" ](syncCfg.custom.different); - outCustDir["Conflict" ](syncCfg.custom.conflict); + outCustDir["LeftOnly" ](directCfg.custom.exLeftSideOnly); + outCustDir["RightOnly" ](directCfg.custom.exRightSideOnly); + outCustDir["LeftNewer" ](directCfg.custom.leftNewer); + outCustDir["RightNewer"](directCfg.custom.rightNewer); + outCustDir["Different" ](directCfg.custom.different); + outCustDir["Conflict" ](directCfg.custom.conflict); +} + + +void writeConfig(const SyncConfig& syncCfg, XmlOut& out) +{ + writeConfig(syncCfg.directionCfg, out); + + out["DeletionPolicy" ](syncCfg.handleDeletion); + out["CustomDeletionFolder"](syncCfg.customDeletionDirectory); } @@ -889,16 +982,20 @@ void writeConfigFolderPair(const FolderPairEnh& enhPair, XmlOut& out) outPair["Right"](enhPair.rightDirectory); //########################################################### + //alternate comp configuration (optional) + if (enhPair.altCmpConfig.get()) + { + XmlOut outAlt = outPair["AlternateCompareConfig"]; + + writeConfig(*enhPair.altCmpConfig, outAlt); + } + //########################################################### //alternate sync configuration (optional) if (enhPair.altSyncConfig.get()) { - XmlOut outAlt = outPair["AlternateSyncConfig"]; - - //read sync configuration - writeConfig(enhPair.altSyncConfig->syncConfiguration, outAlt); + XmlOut outAltSync = outPair["SyncConfig"]; - outAlt["DeletionPolicy" ](enhPair.altSyncConfig->handleDeletion); - outAlt["CustomDeletionFolder"](enhPair.altSyncConfig->customDeletionDirectory); + writeConfig(*enhPair.altSyncConfig, outAltSync); } //########################################################### @@ -910,24 +1007,14 @@ void writeConfigFolderPair(const FolderPairEnh& enhPair, XmlOut& out) void writeConfig(const MainConfiguration& mainCfg, XmlOut& out) { - XmlOut outCmp = out["MainConfig"]["Comparison"]; - - //write compare variant - outCmp["Variant"](mainCfg.compareVar); - - //include symbolic links at all? - outCmp["HandleSymlinks"](mainCfg.handleSymlinks); + XmlOut outCmp = out["MainConfig"]["Comparison"]; + writeConfig(mainCfg.cmpConfig, outCmp); //########################################################### - XmlOut outSync = out["MainConfig"]["SyncConfig"]; - //write sync configuration - writeConfig(mainCfg.syncConfiguration, outSync); - //########################################################### + XmlOut outSync = out["MainConfig"]["SyncConfig"]; - //misc - outSync["DeletionPolicy" ](mainCfg.handleDeletion); - outSync["CustomDeletionFolder"](mainCfg.customDeletionDirectory); + writeConfig(mainCfg.syncCfg, outSync); //########################################################### XmlOut outFilter = out["MainConfig"]["GlobalFilter"]; @@ -1018,21 +1105,19 @@ void writeConfig(const XmlGlobalSettings& config, XmlOut& out) outWnd["ManualDeletionUseRecycler"](config.gui.useRecyclerForManualDeletion); outWnd["RespectCaseOnSearch" ](config.gui.textSearchRespectCase); + outWnd["IconSize"](config.gui.iconSize); + //########################################################### //write column attributes XmlOut outColLeft = outWnd["LeftColumns"]; - outColLeft.attribute("AutoAdjust", config.gui.autoAdjustColumnsLeft); - outColLeft.attribute("ShowFileIcons", config.gui.showFileIconsLeft); outColLeft(config.gui.columnAttribLeft); //########################################################### XmlOut outColRight = outWnd["RightColumns"]; - outColRight.attribute("AutoAdjust", config.gui.autoAdjustColumnsRight); - outColRight.attribute("ShowFileIcons", config.gui.showFileIconsRight); outColRight(config.gui.columnAttribRight); diff --git a/library/process_xml.h b/library/process_xml.h index 8815e3fd..851b0d9c 100644 --- a/library/process_xml.h +++ b/library/process_xml.h @@ -75,22 +75,18 @@ struct XmlGuiConfig zen::MainConfiguration mainCfg; bool hideFilteredElements; - OnGuiError handleError; //reaction on error situation during synchronization bool syncPreviewEnabled; bool operator==(const XmlGuiConfig& other) const { - return mainCfg == other.mainCfg && - hideFilteredElements == other.hideFilteredElements && - handleError == other.handleError && - syncPreviewEnabled == other.syncPreviewEnabled; + return mainCfg == other.mainCfg && + hideFilteredElements == other.hideFilteredElements && + handleError == other.handleError && + syncPreviewEnabled == other.syncPreviewEnabled; } - bool operator!=(const XmlGuiConfig& other) const - { - return !(*this == other); - } + bool operator!=(const XmlGuiConfig& other) const { return !(*this == other); } }; @@ -112,10 +108,7 @@ struct XmlBatchConfig struct OptionalDialogs { - OptionalDialogs() - { - resetDialogs(); - } + OptionalDialogs() { resetDialogs();} void resetDialogs(); @@ -131,6 +124,14 @@ struct OptionalDialogs }; +enum FileIconSize +{ + ICON_SIZE_SMALL, + ICON_SIZE_MEDIUM, + ICON_SIZE_LARGE +}; + + wxString getGlobalConfigFile(); struct XmlGlobalSettings @@ -143,7 +144,7 @@ struct XmlGlobalSettings copyFilePermissions(false), fileTimeTolerance(2), //default 2s: FAT vs NTFS verifyFileCopy(false), - transactionalFileCopy(true) {} + transactionalFileCopy(true) {} int programLanguage; bool copyLockedFiles; //VSS usage @@ -151,7 +152,7 @@ struct XmlGlobalSettings size_t fileTimeTolerance; //max. allowed file time deviation bool verifyFileCopy; //verify copied files - bool transactionalFileCopy; + bool transactionalFileCopy; OptionalDialogs optDialogs; @@ -165,7 +166,7 @@ struct XmlGlobalSettings maxFolderPairsVisible(6), autoAdjustColumnsLeft(false), autoAdjustColumnsRight(false), - folderHistMax(12), + folderHistMax(15), deleteOnBothSides(false), useRecyclerForManualDeletion(true), //enable if OS supports it; else user will have to activate first and then get an error message #ifdef FFS_WIN @@ -173,8 +174,7 @@ struct XmlGlobalSettings #elif defined FFS_LINUX textSearchRespectCase(true), #endif - showFileIconsLeft(true), - showFileIconsRight(true), + iconSize(ICON_SIZE_MEDIUM), lastUpdateCheck(0) { //default external apps will be translated "on the fly"!!! @@ -208,15 +208,15 @@ struct XmlGlobalSettings std::vector<wxString> cfgFileHistory; std::vector<wxString> lastUsedConfigFiles; - std::vector<wxString> folderHistoryLeft; - std::vector<wxString> folderHistoryRight; + std::vector<Zstring> folderHistoryLeft; + std::vector<Zstring> folderHistoryRight; unsigned int folderHistMax; bool deleteOnBothSides; bool useRecyclerForManualDeletion; bool textSearchRespectCase; - bool showFileIconsLeft; - bool showFileIconsRight; + + FileIconSize iconSize; long lastUpdateCheck; //time of last update check @@ -252,17 +252,17 @@ bool sortByPositionAndVisibility(const ColumnAttrib& a, const ColumnAttrib& b) return a.position < b.position; } -void readConfig(const wxString& filename, XmlGuiConfig& config); //throw (xmlAccess::FfsXmlError) -void readConfig(const wxString& filename, XmlBatchConfig& config); //throw (xmlAccess::FfsXmlError) -void readConfig( XmlGlobalSettings& config); //throw (xmlAccess::FfsXmlError) +void readConfig(const wxString& filename, XmlGuiConfig& config); //throw xmlAccess::FfsXmlError +void readConfig(const wxString& filename, XmlBatchConfig& config); //throw xmlAccess::FfsXmlError +void readConfig( XmlGlobalSettings& config); //throw xmlAccess::FfsXmlError -void writeConfig(const XmlGuiConfig& config, const wxString& filename); //throw (xmlAccess::FfsXmlError) -void writeConfig(const XmlBatchConfig& config, const wxString& filename); //throw (xmlAccess::FfsXmlError) -void writeConfig(const XmlGlobalSettings& config); //throw (xmlAccess::FfsXmlError) +void writeConfig(const XmlGuiConfig& config, const wxString& filename); //throw xmlAccess::FfsXmlError +void writeConfig(const XmlBatchConfig& config, const wxString& filename); //throw xmlAccess::FfsXmlError +void writeConfig(const XmlGlobalSettings& config); //throw xmlAccess::FfsXmlError //config conversion utilities XmlGuiConfig convertBatchToGui(const XmlBatchConfig& batchCfg); -XmlBatchConfig convertGuiToBatch(const XmlGuiConfig& guiCfg); +XmlBatchConfig convertGuiToBatch(const XmlGuiConfig& guiCfg, const wxString& referenceFile); //convert (multiple) *.ffs_gui, *.ffs_batch files or combinations of both into target config structure: @@ -275,8 +275,8 @@ enum MergeType }; MergeType getMergeType(const std::vector<wxString>& filenames); //throw () -void convertConfig(const std::vector<wxString>& filenames, XmlGuiConfig& config); //throw (xmlAccess::FfsXmlError) -void convertConfig(const std::vector<wxString>& filenames, XmlBatchConfig& config); //throw (xmlAccess::FfsXmlError) +void convertConfig(const std::vector<wxString>& filenames, XmlGuiConfig& config); //throw xmlAccess::FfsXmlError +void convertConfig(const std::vector<wxString>& filenames, XmlBatchConfig& config); //throw xmlAccess::FfsXmlError } diff --git a/library/resources.cpp b/library/resources.cpp index cbfd7c06..d8dacc06 100644 --- a/library/resources.cpp +++ b/library/resources.cpp @@ -19,35 +19,13 @@ using namespace zen; const GlobalResources& GlobalResources::instance() { - static GlobalResources instance; - return instance; + static GlobalResources inst; + return inst; } -GlobalResources::GlobalResources() -{ - //init all the other resource files - animationMoney = new wxAnimation(wxNullAnimation); - animationSync = new wxAnimation(wxNullAnimation); - programIcon = new wxIcon(wxNullIcon); - - load(); -} - - -GlobalResources::~GlobalResources() +namespace { - //free bitmap resources - for (std::map<wxString, wxBitmap*>::iterator i = bitmapResource.begin(); i != bitmapResource.end(); ++i) - delete i->second; - - //free other resources - delete animationMoney; - delete animationSync; - delete programIcon; -} - - void loadAnimFromZip(wxZipInputStream& zipInput, wxAnimation* animation) { //Workaround for wxWidgets: @@ -64,11 +42,17 @@ void loadAnimFromZip(wxZipInputStream& zipInput, wxAnimation* animation) animation->Load(seekAbleStream, wxANIMATION_TYPE_GIF); } +} -void GlobalResources::load() +GlobalResources::GlobalResources() { - wxFFileInputStream input(zen::getResourceDir() + wxT("Resources.dat")); + //init all the other resource files + animationMoney = new wxAnimation(wxNullAnimation); + animationSync = new wxAnimation(wxNullAnimation); + programIcon = new wxIcon(wxNullIcon); + + wxFFileInputStream input(zen::getResourceDir() + wxT("Resources.zip")); if (input.IsOk()) //if not... we don't want to react too harsh here { //activate support for .png files @@ -78,7 +62,7 @@ void GlobalResources::load() while (true) { - std::auto_ptr<wxZipEntry> entry(resourceFile.GetNextEntry()); + std::unique_ptr<wxZipEntry> entry(resourceFile.GetNextEntry()); if (entry.get() == NULL) break; @@ -102,19 +86,37 @@ void GlobalResources::load() *programIcon = wxIcon(wxT("A_PROGRAM_ICON")); #else //use big logo bitmap for better quality - programIcon->CopyFromBitmap(getImage(wxT("FreeFileSync.png"))); + programIcon->CopyFromBitmap(getImageInt(wxT("FreeFileSync.png"))); + //attention: this is the reason we need a member getImage -> it must not implicitly create static object instance!!! + //erroneously calling static object constructor twice will deadlock on Linux!! #endif } -const wxBitmap& GlobalResources::getImage(const wxString& imageName) const +GlobalResources::~GlobalResources() { - const std::map<wxString, wxBitmap*>::const_iterator bmp = imageName.Find(wxChar('.')) == wxNOT_FOUND ? //assume .png ending if nothing else specified - bitmapResource.find(imageName + wxT(".png")) : - bitmapResource.find(imageName); + //free bitmap resources + for (std::map<wxString, wxBitmap*>::iterator i = bitmapResource.begin(); i != bitmapResource.end(); ++i) + delete i->second; + //free other resources + delete animationMoney; + delete animationSync; + delete programIcon; +} + + +const wxBitmap& GlobalResources::getImageInt(const wxString& imageName) const +{ + const std::map<wxString, wxBitmap*>::const_iterator bmp = bitmapResource.find( + imageName.Find(L'.') == wxNOT_FOUND ? //assume .png ending if nothing else specified + imageName + wxT(".png") : + imageName); if (bmp != bitmapResource.end()) return *bmp->second; else + { + assert(false); return wxNullBitmap; + } } diff --git a/library/resources.h b/library/resources.h index f812ac90..e985d9bf 100644 --- a/library/resources.h +++ b/library/resources.h @@ -16,9 +16,13 @@ class GlobalResources { public: - static const GlobalResources& instance(); + static const wxBitmap& getImage(const wxString& name) + { + const GlobalResources& inst = instance(); + return inst.getImageInt(name); + } - const wxBitmap& getImage(const wxString& imageName) const; + static const GlobalResources& instance(); //global image resource objects wxAnimation* animationMoney; @@ -26,10 +30,13 @@ public: wxIcon* programIcon; private: - void load(); //loads bitmap resources on program startup - GlobalResources(); ~GlobalResources(); + GlobalResources(const GlobalResources&); + GlobalResources& operator=(const GlobalResources&); + + const wxBitmap& getImageInt(const wxString& name) const; + //resource mapping std::map<wxString, wxBitmap*> bitmapResource; diff --git a/library/soft_filter.h b/library/soft_filter.h index bde812b0..f3c1bd41 100644 --- a/library/soft_filter.h +++ b/library/soft_filter.h @@ -28,9 +28,9 @@ public: size_t sizeMin, UnitSize unitSizeMin, size_t sizeMax, UnitSize unitSizeMax); - bool matchTime(Int64 writeTime) const { return currentTime - writeTime <= timeSpan_; } + bool matchTime(Int64 writeTime) const { return timeFrom_ <= writeTime; } bool matchSize(UInt64 fileSize) const { return sizeMin_ <= fileSize && fileSize <= sizeMax_; } - bool matchFolder() const { return timeSpan_ == std::numeric_limits<Int64>::max(); } + bool matchFolder() const { return timeFrom_ == std::numeric_limits<Int64>::min(); } //if date filter is active we deactivate all folders: effectively gets rid of empty folders! bool isNull() const; //filter is equivalent to NullFilter, but may be technically slower @@ -39,14 +39,13 @@ public: friend SoftFilter combineFilters(const SoftFilter& first, const SoftFilter& second); private: - SoftFilter(Int64 timeSpan, - UInt64 sizeMin, - UInt64 sizeMax); - - Int64 timeSpan_; //unit: seconds - UInt64 sizeMin_; //unit: bytes - UInt64 sizeMax_; //unit: bytes - Int64 currentTime; + SoftFilter(const Int64& timeFrom, + const UInt64& sizeMin, + const UInt64& sizeMax); + + Int64 timeFrom_; //unit: UTC, seconds + UInt64 sizeMin_; //unit: bytes + UInt64 sizeMax_; //unit: bytes }; } @@ -84,30 +83,28 @@ namespace zen inline SoftFilter::SoftFilter(size_t timeSpan, UnitTime unitTimeSpan, size_t sizeMin, UnitSize unitSizeMin, - size_t sizeMax, UnitSize unitSizeMax) : - currentTime(wxGetUTCTime()) + size_t sizeMax, UnitSize unitSizeMax) { resolveUnits(timeSpan, unitTimeSpan, sizeMin, unitSizeMin, sizeMax, unitSizeMax, - timeSpan_, //unit: seconds - sizeMin_, //unit: bytes - sizeMax_); //unit: bytes + timeFrom_, + sizeMin_, + sizeMax_); } inline -SoftFilter::SoftFilter(Int64 timeSpan, - UInt64 sizeMin, - UInt64 sizeMax) : - timeSpan_(timeSpan), +SoftFilter::SoftFilter(const Int64& timeFrom, + const UInt64& sizeMin, + const UInt64& sizeMax) : + timeFrom_(timeFrom), sizeMin_ (sizeMin), - sizeMax_ (sizeMax), - currentTime(wxGetUTCTime()) {} + sizeMax_ (sizeMax) {} inline SoftFilter combineFilters(const SoftFilter& first, const SoftFilter& second) { - return SoftFilter(std::min(first.timeSpan_, second.timeSpan_), + return SoftFilter(std::max(first.timeFrom_, second.timeFrom_), std::max(first.sizeMin_, second.sizeMin_), std::min(first.sizeMax_, second.sizeMax_)); } @@ -115,7 +112,7 @@ SoftFilter combineFilters(const SoftFilter& first, const SoftFilter& second) inline bool SoftFilter::isNull() const //filter is equivalent to NullFilter, but may be technically slower { - return timeSpan_ == std::numeric_limits<Int64>::max() && + return timeFrom_ == std::numeric_limits<Int64>::min() && sizeMin_ == 0U && sizeMax_ == std::numeric_limits<UInt64>::max(); } diff --git a/library/statistics.cpp b/library/statistics.cpp index a29f60af..f6ec01ad 100644 --- a/library/statistics.cpp +++ b/library/statistics.cpp @@ -24,8 +24,6 @@ RetrieveStatistics::RetrieveStatistics() : RetrieveStatistics::~RetrieveStatistics() { - //keep non-inline destructor for std::auto_ptr to work with forward declaration - //write statistics to a file wxFFile outputFile(wxT("statistics.dat"), wxT("w")); diff --git a/library/statistics.h b/library/statistics.h index 0ec82c14..cfa3e07c 100644 --- a/library/statistics.h +++ b/library/statistics.h @@ -35,7 +35,7 @@ private: }; std::vector<StatEntry> data; - std::auto_ptr<wxStopWatch> timer; + std::unique_ptr<wxStopWatch> timer; }; diff --git a/library/status_handler.cpp b/library/status_handler.cpp index 9c2fdd67..55f82c64 100644 --- a/library/status_handler.cpp +++ b/library/status_handler.cpp @@ -6,8 +6,7 @@ #include "status_handler.h" #include <wx/app.h> -#include <wx/timer.h> - +#include <ctime> void updateUiNow() { @@ -21,12 +20,14 @@ void updateUiNow() bool updateUiIsAllowed() { - static wxMilliClock_t lastExec = 0; - const wxMilliClock_t newExec = wxGetLocalTimeMillis(); + const std::clock_t CLOCK_UPDATE_INTERVAL = UI_UPDATE_INTERVAL * CLOCKS_PER_SEC / 1000; + + static std::clock_t lastExec = 0; + const std::clock_t now = std::clock(); //this is quite fast: 2 * 10^-5 - if (newExec - lastExec >= UI_UPDATE_INTERVAL) //perform ui updates not more often than necessary + if (now - lastExec >= CLOCK_UPDATE_INTERVAL) //perform ui updates not more often than necessary { - lastExec = newExec; + lastExec = now; return true; } return false; diff --git a/library/status_handler.h b/library/status_handler.h index a295b6a0..1282f9f1 100644 --- a/library/status_handler.h +++ b/library/status_handler.h @@ -11,7 +11,7 @@ #include <string> #include "../shared/int64.h" -const int UI_UPDATE_INTERVAL = 100; //perform ui updates not more often than necessary, 100 seems to be a good value with only a minimal performance loss +const int UI_UPDATE_INTERVAL = 100; //unit: [ms]; perform ui updates not more often than necessary, 100 seems to be a good value with only a minimal performance loss bool updateUiIsAllowed(); //test if a specific amount of time is over void updateUiNow(); //do the updating @@ -37,9 +37,6 @@ struct ProcessCallback //these methods have to be implemented in the derived classes to handle error and status information virtual void initNewProcess(int objectsTotal, zen::Int64 dataTotal, Process processID) = 0; //informs about the total amount of data that will be processed from now on - //called periodically after data was processed: expected(!) to update GUI! - virtual void reportInfo(const wxString& text) = 0; - //note: this one must NOT throw in order to properly allow undoing setting of statistics! //it is in general paired with a call to requestUiRefresh() to compensate! virtual void updateProcessedData(int objectsProcessed, zen::Int64 dataProcessed) = 0; //throw() @@ -50,15 +47,22 @@ struct ProcessCallback //this method is triggered repeatedly by requestUiRefresh() and can be used to refresh the ui by dispatching pending events virtual void forceUiRefresh() = 0; + //called periodically after data was processed: expected(!) to request GUI update + virtual void reportStatus(const wxString& text) = 0; //status info only, should not be logged! + + //called periodically after data was processed: expected(!) to request GUI update + virtual void reportInfo(const wxString& text) = 0; + + virtual void reportWarning(const wxString& warningMessage, bool& warningActive) = 0; + //error handling: enum Response { IGNORE_ERROR = 10, RETRY }; - virtual Response reportError (const wxString& errorMessage) = 0; //recoverable error situation - virtual void reportFatalError(const wxString& errorMessage) = 0; //non-recoverable error situation, implement abort! - virtual void reportWarning (const wxString& warningMessage, bool& warningActive) = 0; + virtual Response reportError (const wxString& errorMessage) = 0; //recoverable error situation + virtual void reportFatalError(const wxString& errorMessage) = 0; //non-recoverable error situation }; diff --git a/shared/FindFilePlus/FindFilePlus.vcxproj b/shared/FindFilePlus/FindFilePlus.vcxproj new file mode 100644 index 00000000..a49e99ba --- /dev/null +++ b/shared/FindFilePlus/FindFilePlus.vcxproj @@ -0,0 +1,245 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{70394AEF-5897-4911-AFA1-82EAF0581EFA}</ProjectGuid> + <RootNamespace>ShadowDll</RootNamespace> + <Keyword>Win32Proj</Keyword> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>Windows7.1SDK</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>Windows7.1SDK</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>Windows7.1SDK</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>Windows7.1SDK</PlatformToolset> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup> + <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">FindFilePlus_$(Platform)</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">FindFilePlus_$(Platform)</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">FindFilePlus_$(Platform)</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">FindFilePlus_$(Platform)</TargetName> + <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">D:\Data\WinDDK\inc\ddk;D:\Data\WinDDK\inc\api;D:\Data\WinDDK\inc\crt;$(WindowsSdkDir)\include;$(VCInstallDir)include</IncludePath> + <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">D:\Data\WinDDK\inc\ddk;D:\Data\WinDDK\inc\api;D:\Data\WinDDK\inc\crt;$(WindowsSdkDir)\include;$(VCInstallDir)include</IncludePath> + <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">D:\Data\WinDDK\inc\ddk;D:\Data\WinDDK\inc\api;D:\Data\WinDDK\inc\crt;$(WindowsSdkDir)\include;$(VCInstallDir)include</IncludePath> + <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">D:\Data\WinDDK\inc\ddk;D:\Data\WinDDK\inc\api;D:\Data\WinDDK\inc\crt;$(WindowsSdkDir)\include;$(VCInstallDir)include</IncludePath> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <BuildLog> + <Path>$(IntDir)Build.html</Path> + </BuildLog> + <ClCompile> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>_X86_;_DEBUG;_WINDOWS;_USRDLL;FIND_FILE_PLUS_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>true</MinimalRebuild> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>EditAndContinue</DebugInformationFormat> + <DisableSpecificWarnings>4100</DisableSpecificWarnings> + <AdditionalIncludeDirectories>C:\Program Files\C++\Projects\FreeFileSync\shared</AdditionalIncludeDirectories> + </ClCompile> + <Link> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <SubSystem>Windows</SubSystem> + <ProfileGuidedDatabase> + </ProfileGuidedDatabase> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX86</TargetMachine> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <BuildLog> + <Path>$(IntDir)Build.html</Path> + </BuildLog> + <Midl> + <TargetEnvironment>X64</TargetEnvironment> + </Midl> + <ClCompile> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>_AMD64_;_DEBUG;_WINDOWS;_USRDLL;FIND_FILE_PLUS_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>true</MinimalRebuild> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <DisableSpecificWarnings>4100</DisableSpecificWarnings> + <AdditionalIncludeDirectories>C:\Program Files\C++\Projects\FreeFileSync\shared</AdditionalIncludeDirectories> + </ClCompile> + <Link> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <SubSystem>Windows</SubSystem> + <ProfileGuidedDatabase> + </ProfileGuidedDatabase> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX64</TargetMachine> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <BuildLog> + <Path>$(IntDir)Build.html</Path> + </BuildLog> + <ClCompile> + <Optimization>MaxSpeed</Optimization> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>_X86_;NDEBUG;_WINDOWS;_USRDLL;FIND_FILE_PLUS_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <FunctionLevelLinking>true</FunctionLevelLinking> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <DisableSpecificWarnings>4100</DisableSpecificWarnings> + <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> + <AdditionalIncludeDirectories>C:\Program Files\C++\Projects\FreeFileSync\shared</AdditionalIncludeDirectories> + </ClCompile> + <Link> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>false</GenerateDebugInformation> + <SubSystem>Windows</SubSystem> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + <ProfileGuidedDatabase> + </ProfileGuidedDatabase> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX86</TargetMachine> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <BuildLog> + <Path>$(IntDir)Build.html</Path> + </BuildLog> + <Midl> + <TargetEnvironment>X64</TargetEnvironment> + </Midl> + <ClCompile> + <Optimization>MaxSpeed</Optimization> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>_AMD64_;NDEBUG;_WINDOWS;_USRDLL;FIND_FILE_PLUS_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <FunctionLevelLinking>true</FunctionLevelLinking> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <DisableSpecificWarnings>4100</DisableSpecificWarnings> + <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> + <AdditionalIncludeDirectories>C:\Program Files\C++\Projects\FreeFileSync\shared</AdditionalIncludeDirectories> + </ClCompile> + <Link> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>false</GenerateDebugInformation> + <SubSystem>Windows</SubSystem> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + <ProfileGuidedDatabase> + </ProfileGuidedDatabase> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX64</TargetMachine> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="dll_main.cpp"> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + </PrecompiledHeader> + <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + </PrecompiledHeader> + <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</CompileAsManaged> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + </PrecompiledHeader> + <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</CompileAsManaged> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + </PrecompiledHeader> + <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</CompileAsManaged> + </ClCompile> + <ClCompile Include="find_file_plus.cpp" /> + <ClCompile Include="load_dll.cpp" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="find_file_plus.h" /> + <ClInclude Include="load_dll.h" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project>
\ No newline at end of file diff --git a/shared/FindFilePlus/dll_main.cpp b/shared/FindFilePlus/dll_main.cpp new file mode 100644 index 00000000..3805c99d --- /dev/null +++ b/shared/FindFilePlus/dll_main.cpp @@ -0,0 +1,25 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** + + +#define WIN32_LEAN_AND_MEAN +#include <windows.h> + +//optional: add init/teardown logic here +BOOL APIENTRY DllMain(HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + case DLL_PROCESS_DETACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + break; + } + return TRUE; +} diff --git a/shared/FindFilePlus/find_file_plus.cpp b/shared/FindFilePlus/find_file_plus.cpp new file mode 100644 index 00000000..8b29efa2 --- /dev/null +++ b/shared/FindFilePlus/find_file_plus.cpp @@ -0,0 +1,305 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** + +#include "find_file_plus.h" +//#include <windows.h> //these two don't play nice with each other + +#include "load_dll.h" +#include <loki/ScopeGuard.h> + +using namespace dll; +using namespace findplus; + + +namespace +{ +//-------------------------------------------------------------------------------------------------------------- +typedef NTSTATUS (NTAPI* NtOpenFileFunc)(PHANDLE fileHandle, + ACCESS_MASK desiredAccess, + POBJECT_ATTRIBUTES objectAttributes, + PIO_STATUS_BLOCK ioStatusBlock, + ULONG shareAccess, + ULONG openOptions); + +typedef NTSTATUS (NTAPI* NtCloseFunc)(HANDLE handle); + +typedef NTSTATUS (NTAPI* NtQueryDirectoryFileFunc)(HANDLE fileHandle, + HANDLE event, + PIO_APC_ROUTINE apcRoutine, + PVOID apcContext, + PIO_STATUS_BLOCK ioStatusBlock, + PVOID fileInformation, + ULONG length, + FILE_INFORMATION_CLASS fileInformationClass, + BOOLEAN ReturnSingleEntry, + PUNICODE_STRING fileMask, + BOOLEAN restartScan); + +typedef ULONG (NTAPI* RtlNtStatusToDosErrorFunc)(NTSTATUS /*__in status*/); + +typedef struct _RTL_RELATIVE_NAME_U +{ + UNICODE_STRING RelativeName; + HANDLE ContainingDirectory; + PVOID /*PRTLP_CURDIR_REF*/ CurDirRef; +} RTL_RELATIVE_NAME_U, *PRTL_RELATIVE_NAME_U; + +typedef BOOLEAN (NTAPI* RtlDosPathNameToNtPathName_UFunc)(PCWSTR, //__in dosFileName, + PUNICODE_STRING, //__out ntFileName, + PCWSTR*, //__out_optFilePart, + PRTL_RELATIVE_NAME_U); //__out_opt relativeName + +typedef BOOLEAN (NTAPI* RtlDosPathNameToRelativeNtPathName_UFunc)(PCWSTR, //__in dosFileName, + PUNICODE_STRING, //__out ntFileName, + PWSTR*, //__out_optFilePart, + PRTL_RELATIVE_NAME_U); //__out_opt relativeName + +typedef VOID (NTAPI* RtlFreeUnicodeStringFunc)(PUNICODE_STRING); //__inout unicodeString + +//-------------------------------------------------------------------------------------------------------------- + +//it seems we cannot use any of the ntoskrnl.lib files in WinDDK as they produce access violations +//fortunately dynamic binding works fine: +NtOpenFileFunc ntOpenFile; +NtCloseFunc ntClose; +NtQueryDirectoryFileFunc ntQueryDirectoryFile; +RtlNtStatusToDosErrorFunc rtlNtStatusToDosError; +RtlFreeUnicodeStringFunc rtlFreeUnicodeString; +RtlDosPathNameToNtPathName_UFunc rtlDosPathNameToNtPathName_U; + + +template <class FunType> inline +void initDllFun(FunType& fun, const char* functionName) //throw FileError +{ + if (!fun) + { + fun = getSystemDllFun<FunType>(L"ntdll.dll", functionName); + if (!fun) + throw FileError(182); //== ERROR_INVALID_ORDINAL, verified at compile time in "load_dll.cpp"; we better not use rtlNtStatusToDosError(STATUS_ORDINAL_NOT_FOUND) here ;) + } +} + + +struct FileError +{ + FileError(ULONG errorCode) : win32Error(errorCode) {} + ULONG win32Error; +}; +} + +class findplus::FileSearcher +{ +public: + FileSearcher(const wchar_t* dirname); //throw FileError + ~FileSearcher(); + + void readdir(FileInformation& output); //throw FileError + +private: + UNICODE_STRING ntPathName; //it seems hDir implicitly keeps a reference to this, at least ::FindFirstFile() does no cleanup before ::FindClose()! + HANDLE hDir; + + ULONG nextEntryOffset; //!= 0 if entry is waiting in buffer + //::FindNextFileW() uses 0x1000 = 4096 = sizeof(FILE_BOTH_DIR_INFORMATION) + sizeof(TCHAR) * 2000 + //=> let's use the same, even if our header is 16 byte larger; maybe there is some packet size advantage for networks? Note that larger buffers seem to degrade performance. + static const ULONG BUFFER_SIZE = 4096; + LONGLONG buffer[BUFFER_SIZE / sizeof(LONGLONG)]; //buffer needs to be aligned at LONGLONG boundary + + static_assert(BUFFER_SIZE % sizeof(LONGLONG) == 0, "ups, our buffer is trimmed!"); +}; + + +FileSearcher::FileSearcher(const wchar_t* dirname) : + hDir(NULL), + nextEntryOffset(0) +{ + UNICODE_STRING cleanDummy = {}; + ntPathName = cleanDummy; + + Loki::ScopeGuard guardConstructor = Loki::MakeGuard([&]() { this->~FileSearcher(); }); + + //NT/ZwXxx Routines + //http://msdn.microsoft.com/en-us/library/ff567122(v=VS.85).aspx + + //Run-Time Library (RTL) Routines + //http://msdn.microsoft.com/en-us/library/ff563638(v=VS.85).aspx + + //init static dll functions + initDllFun(ntOpenFile, "NtOpenFile"); //throw FileError + initDllFun(ntClose, "NtClose"); + initDllFun(ntQueryDirectoryFile, "NtQueryDirectoryFile"); + initDllFun(rtlNtStatusToDosError, "RtlNtStatusToDosError"); + initDllFun(rtlFreeUnicodeString, "RtlFreeUnicodeString"); + try + { + initDllFun(rtlDosPathNameToNtPathName_U, "RtlDosPathNameToRelativeNtPathName_U"); //use the newer version if available + } + catch (const FileError&) + { + initDllFun(rtlDosPathNameToNtPathName_U, "RtlDosPathNameToNtPathName_U"); //fallback for XP + } + //-------------------------------------------------------------------------------------------------------------- + + //convert dosFileName, e.g. C:\Users or \\?\C:\Users to ntFileName \??\C:\Users + //in contrast to ::FindFirstFile() we don't evaluate the relativeName, however tests indicate ntFileName is *always* filled with an absolute name, even if dosFileName is relative + + //NOTE: RtlDosPathNameToNtPathName_U may be used on all XP/Win7/Win8 for compatibility + // RtlDosPathNameToNtPathName_U: used by Windows XP available with OS version 3.51 (Windows NT) and higher + // RtlDosPathNameToRelativeNtPathName_U: used by Win7/Win8 available with OS version 5.2 (Windows Server 2003) and higher + if (!rtlDosPathNameToNtPathName_U(dirname, //__in dosFileName, + &ntPathName, //__out ntFileName, + NULL, //__out_optFilePart, + NULL)) //__out_opt relativeName - empty if dosFileName is absolute + throw FileError(rtlNtStatusToDosError(STATUS_OBJECT_PATH_NOT_FOUND)); //translates to ERROR_PATH_NOT_FOUND, same behavior like ::FindFirstFileEx() + + OBJECT_ATTRIBUTES objAttr = {}; + InitializeObjectAttributes(&objAttr, //[out] POBJECT_ATTRIBUTES initializedAttributes, + &ntPathName, //[in] PUNICODE_STRING objectName, + OBJ_CASE_INSENSITIVE, //[in] ULONG attributes, + NULL, //[in] HANDLE rootDirectory, + NULL); //[in, optional] PSECURITY_DESCRIPTOR securityDescriptor + + { + IO_STATUS_BLOCK status = {}; + NTSTATUS rv = ntOpenFile(&hDir, //__out PHANDLE FileHandle, + FILE_LIST_DIRECTORY | SYNCHRONIZE, //__in ACCESS_MASK desiredAccess, - 100001 used by ::FindFirstFile() on all XP/Win7/Win8 + &objAttr, //__in POBJECT_ATTRIBUTES objectAttributes, + &status, //__out PIO_STATUS_BLOCK ioStatusBlock, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //__in ULONG shareAccess, - 7 on Win7/Win8, 3 on XP + FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT | FILE_OPEN_FOR_BACKUP_INTENT); //__in ULONG openOptions - 4021 used on all XP/Win7/Win8 + if (!NT_SUCCESS(rv)) + throw FileError(rtlNtStatusToDosError(rv)); + } + + guardConstructor.Dismiss(); +} + + +FileSearcher::~FileSearcher() +{ + //cleanup in reverse order + if (hDir) + ntClose(hDir); + + if (ntPathName.Buffer) + rtlFreeUnicodeString(&ntPathName); //cleanup identical to ::FindFirstFile() + //note that most if this function seems inlined by the linker, so that its assembly looks equivalent to "RtlFreeHeap(GetProcessHeap(), 0, ntPathName.Buffer)" +} + + +void FileSearcher::readdir(FileInformation& output) +{ + //although FILE_ID_FULL_DIR_INFORMATION should suffice for our purposes, there are problems on Windows XP for certain directories, e.g. "\\Vboxsvr\build" + //making NtQueryDirectoryFile() return with STATUS_INVALID_PARAMETER while other directories, e.g. "C:\" work fine for some reason + //FILE_ID_BOTH_DIR_INFORMATION on the other hand works on XP/Win7/Win8 + //performance: there is no noticable difference between FILE_ID_BOTH_DIR_INFORMATION and FILE_ID_FULL_DIR_INFORMATION + + /* corresponding first access in ::FindFirstFileW() + + NTSTATUS rv = ntQueryDirectoryFile(hDir, //__in HANDLE fileHandle, + NULL, //__in_opt HANDLE event, + NULL, //__in_opt PIO_APC_ROUTINE apcRoutine, + NULL, //__in_opt PVOID apcContext, + &status, //__out PIO_STATUS_BLOCK ioStatusBlock, + &buffer, //__out_bcount(Length) PVOID fileInformation, + BUFFER_SIZE, //__in ULONG length, ::FindFirstFileW() on all XP/Win7/Win8 uses sizeof(FILE_BOTH_DIR_INFORMATION) + sizeof(TCHAR) * MAX_PATH == 0x268 + FileIdBothDirectoryInformation, //__in FILE_INFORMATION_CLASS fileInformationClass - all XP/Win7/Win8 use "FileBothDirectoryInformation" + true, //__in BOOLEAN returnSingleEntry, + NULL, //__in_opt PUNICODE_STRING mask, + false); //__in BOOLEAN restartScan + */ + + //analog to ::FindNextFileW() with performance optimized access (in contrast to first access in ::FindFirstFileW()) + if (nextEntryOffset == 0) + { + IO_STATUS_BLOCK status = {}; + NTSTATUS rv = ntQueryDirectoryFile(hDir, //__in HANDLE fileHandle, + NULL, //__in_opt HANDLE event, + NULL, //__in_opt PIO_APC_ROUTINE apcRoutine, + NULL, //__in_opt PVOID apcContext, + &status, //__out PIO_STATUS_BLOCK ioStatusBlock, + &buffer, //__out_bcount(Length) PVOID fileInformation, + BUFFER_SIZE, //__in ULONG length, ::FindNextFileW() on all XP/Win7/Win8 uses sizeof(FILE_BOTH_DIR_INFORMATION) + sizeof(TCHAR) * 2000 == 0x1000 + FileIdBothDirectoryInformation, //__in FILE_INFORMATION_CLASS fileInformationClass - all XP/Win7/Win8 use "FileBothDirectoryInformation" + false, //__in BOOLEAN returnSingleEntry, + NULL, //__in_opt PUNICODE_STRING mask, + false); //__in BOOLEAN restartScan + if (!NT_SUCCESS(rv)) + throw FileError(rtlNtStatusToDosError(rv)); //throws STATUS_NO_MORE_FILES when finished + + if (status.Information == 0) //except for the first call to call ::NtQueryDirectoryFile(): + throw FileError(rtlNtStatusToDosError(STATUS_BUFFER_OVERFLOW)); //if buffer size is too small, return value is STATUS_SUCCESS and Information == 0 -> we don't expect this! + } + + const FILE_ID_BOTH_DIR_INFORMATION& dirInfo = *reinterpret_cast<FILE_ID_BOTH_DIR_INFORMATION*>(reinterpret_cast<char*>(buffer) + nextEntryOffset); + + if (dirInfo.NextEntryOffset == 0) + nextEntryOffset = 0; //our offset is relative to the beginning of the buffer + else + nextEntryOffset += dirInfo.NextEntryOffset; + + + auto toFileTime = [](const LARGE_INTEGER & rawTime) -> FILETIME + { + FILETIME tmp = { rawTime.LowPart, rawTime.HighPart }; + return tmp; + }; + + output.creationTime = toFileTime(dirInfo.CreationTime); + output.lastWriteTime = toFileTime(dirInfo.LastWriteTime); + output.fileSize.QuadPart = dirInfo.EndOfFile.QuadPart; + output.fileId.QuadPart = dirInfo.FileId.QuadPart; + output.fileAttributes = dirInfo.FileAttributes; + output.shortNameLength = dirInfo.FileNameLength / sizeof(TCHAR); //FileNameLength is in bytes! + + if (dirInfo.FileNameLength + sizeof(TCHAR) > sizeof(output.shortName)) //this may actually happen if ::NtQueryDirectoryFile() decides to return a + throw FileError(rtlNtStatusToDosError(STATUS_BUFFER_OVERFLOW)); //short name of length MAX_PATH + 1, 0-termination is not required! + + ::memcpy(output.shortName, dirInfo.FileName, dirInfo.FileNameLength); + output.shortName[output.shortNameLength] = 0; //NOTE: FILE_ID_BOTH_DIR_INFORMATION::FileName in general is NOT 0-terminated! It is on XP/Win7, but NOT on Win8! + + static_assert(sizeof(output.creationTime) == sizeof(dirInfo.CreationTime), "dang!"); + static_assert(sizeof(output.lastWriteTime) == sizeof(dirInfo.LastWriteTime), "dang!"); + static_assert(sizeof(output.fileSize) == sizeof(dirInfo.EndOfFile), "dang!"); + static_assert(sizeof(output.fileId) == sizeof(dirInfo.FileId), "dang!"); + static_assert(sizeof(output.fileAttributes) == sizeof(dirInfo.FileAttributes), "dang!"); +} + + +FindHandle findplus::openDir(const wchar_t* dirname) +{ + try + { + return new FileSearcher(dirname); //throw FileError + } + catch (const FileError& err) + { + setWin32Error(err.win32Error); + return NULL; + } +} + + +bool findplus::readDir(FindHandle hnd, FileInformation& output) +{ + try + { + hnd->readdir(output); //throw FileError + return true; + } + catch (const FileError& err) + { + setWin32Error(err.win32Error); + return false; + } +} + + +void findplus::closeDir(FindHandle hnd) +{ + if (hnd) //play a little "nice" + delete static_cast<FileSearcher*>(hnd); +} diff --git a/shared/FindFilePlus/find_file_plus.h b/shared/FindFilePlus/find_file_plus.h new file mode 100644 index 00000000..88cb13af --- /dev/null +++ b/shared/FindFilePlus/find_file_plus.h @@ -0,0 +1,78 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** + +#ifndef FIND_FIRST_FILE_PLUS_HEADER_087483434 +#define FIND_FIRST_FILE_PLUS_HEADER_087483434 + +#ifdef FIND_FILE_PLUS_DLL_EXPORTS +#define DLL_FUNCTION_DECLARATION extern "C" __declspec(dllexport) +#else +#define DLL_FUNCTION_DECLARATION extern "C" __declspec(dllimport) +#endif + + +#ifdef FIND_FILE_PLUS_DLL_EXPORTS +#include <Ntifs.h> //driver level headers must be included *before* windows api headers! +#endif +#include <windef.h> // +#undef min +#undef max + +#include "../build_info.h" + +namespace findplus +{ +/*-------------- + |declarations| + --------------*/ + +struct FileInformation +{ + FILETIME creationTime; + FILETIME lastWriteTime; + ULARGE_INTEGER fileSize; + ULARGE_INTEGER fileId; + DWORD fileAttributes; + DWORD shortNameLength; + WCHAR shortName[MAX_PATH + 1]; //shortName is 0-terminated +}; + +class FileSearcher; +typedef FileSearcher* FindHandle; + +DLL_FUNCTION_DECLARATION +FindHandle openDir(const wchar_t* dirname); //returns NULL on error, call ::GetLastError(); returns ERROR_INVALID_ORDINAL if ntdll-libraries could not be loaded +//note do NOT place an asterisk at end, e.g. C:\SomeDir\*, as one would do for ::FindFirstFile() + +DLL_FUNCTION_DECLARATION +bool readDir(FindHandle hnd, FileInformation& output); //returns false on error or if there are no more files; ::GetLastError() returns ERROR_NO_MORE_FILES + +DLL_FUNCTION_DECLARATION +void closeDir(FindHandle hnd); + +/*---------- + |typedefs| + ----------*/ +typedef FindHandle (*OpenDirFunc )(const wchar_t* dirname); +typedef bool (*ReadDirFunc )(FindHandle hnd, FileInformation& dirInfo); +typedef void (*CloseDirFunc)(FindHandle hnd); + +/*-------------- + |symbol names| + --------------*/ +//const pointers ensure internal linkage +const char openDirFuncName [] = "openDir"; +const char readDirFuncName [] = "readDir"; +const char closeDirFuncName[] = "closeDir"; + +/*--------------- + |library names| + ---------------*/ +inline const wchar_t* getDllName() { return util::is64BitBuild ? L"FindFilePlus_x64.dll" : L"FindFilePlus_Win32.dll"; } +} + + +#endif //FIND_FIRST_FILE_PLUS_HEADER_087483434 diff --git a/shared/FindFilePlus/load_dll.cpp b/shared/FindFilePlus/load_dll.cpp new file mode 100644 index 00000000..51ec1f0c --- /dev/null +++ b/shared/FindFilePlus/load_dll.cpp @@ -0,0 +1,25 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** + +#define WIN32_LEAN_AND_MEAN +#include <windows.h> // yes, this sequence is mad, but ddk and api headers contain plenty of redefinitions +#include "load_dll.h" // + +void* /*FARPROC*/ dll::loadSymbol(const wchar_t* libraryName, const char* functionName) +{ + return ::GetProcAddress(::GetModuleHandle(libraryName), functionName); + //cleanup neither required nor allowed (::FreeLibrary()) + +} +//note: void* and FARPROC function pointer have same binary size on Windows + + +void dll::setWin32Error(unsigned long lastError) +{ + ::SetLastError(lastError); +} + +static_assert(ERROR_INVALID_ORDINAL == 182, "dang!");
\ No newline at end of file diff --git a/shared/FindFilePlus/load_dll.h b/shared/FindFilePlus/load_dll.h new file mode 100644 index 00000000..f152dd74 --- /dev/null +++ b/shared/FindFilePlus/load_dll.h @@ -0,0 +1,39 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** + +#ifndef LOAD_DLL_HEADER_0312463214872163832174 +#define LOAD_DLL_HEADER_0312463214872163832174 + +namespace dll +{ +template <typename FunctionType> +FunctionType getSystemDllFun(const wchar_t* libraryName, const char* functionName); //NOTE: uses ::GetModuleHandle => call for system DLLs only! + +void setWin32Error(unsigned long lastError); + + + + + + + + + + + + + +void* /*FARPROC*/ loadSymbol(const wchar_t* libraryName, const char* functionName); + +template <typename FunctionType> inline +FunctionType getSystemDllFun(const wchar_t* libraryName, const char* functionName) +{ + return reinterpret_cast<FunctionType>(loadSymbol(libraryName, functionName)); +} +} + +#endif //LOAD_DLL_HEADER_0312463214872163832174 + diff --git a/shared/IFileOperation/FileOperation_Vista.vcxproj b/shared/IFileOperation/FileOperation_Vista.vcxproj index 9f9a9c28..5de402f4 100644 --- a/shared/IFileOperation/FileOperation_Vista.vcxproj +++ b/shared/IFileOperation/FileOperation_Vista.vcxproj @@ -29,10 +29,12 @@ <ConfigurationType>DynamicLibrary</ConfigurationType> <CharacterSet>Unicode</CharacterSet> <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>Windows7.1SDK</PlatformToolset> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <ConfigurationType>DynamicLibrary</ConfigurationType> <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>Windows7.1SDK</PlatformToolset> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <ConfigurationType>DynamicLibrary</ConfigurationType> @@ -63,10 +65,10 @@ <PropertyGroup Label="UserMacros" /> <PropertyGroup> <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> - <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\</OutDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\</OutDir> <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental> - <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\</OutDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\</OutDir> <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental> <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\</OutDir> diff --git a/shared/IFileOperation/file_op.cpp b/shared/IFileOperation/file_op.cpp index a2cf9413..8b632972 100644 --- a/shared/IFileOperation/file_op.cpp +++ b/shared/IFileOperation/file_op.cpp @@ -61,13 +61,15 @@ bool fileop::moveToRecycleBin(const wchar_t* fileNames[], return false; } + int operationCount = 0; + for (size_t i = 0; i < fileNo; ++i) { //create file/folder item object ComPtr<IShellItem> psiFile; - hr = SHCreateItemFromParsingName(fileNames[i], - NULL, - IID_PPV_ARGS(psiFile.init())); + hr = ::SHCreateItemFromParsingName(fileNames[i], + NULL, + IID_PPV_ARGS(psiFile.init())); if (FAILED(hr)) { if (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || //file not existing anymore @@ -87,8 +89,13 @@ bool fileop::moveToRecycleBin(const wchar_t* fileNames[], lastErrorMessage = generateErrorMsg(L"Error calling \"DeleteItem\".", hr); return false; } + + ++operationCount; } + if (operationCount == 0) //calling PerformOperations() without anything to do results in E_UNEXPECTED + return true; + //perform actual operations hr = fileOp->PerformOperations(); if (FAILED(hr)) diff --git a/shared/IFileOperation/file_op.h b/shared/IFileOperation/file_op.h index c1bb26a2..dbe00196 100644 --- a/shared/IFileOperation/file_op.h +++ b/shared/IFileOperation/file_op.h @@ -13,6 +13,8 @@ #define FILE_OP_DLL_API extern "C" __declspec(dllimport) #endif +#include "../build_info.h" + namespace fileop { @@ -48,6 +50,11 @@ typedef void (*GetLastErrorFct)(wchar_t* errorMessage, size_t errorBufferLen); const char moveToRecycleBinFctName[] = "moveToRecycleBin"; const char copyFileFctName[] = "copyFile"; const char getLastErrorFctName[] = "getLastError"; + +/*--------------- + |library names| + ---------------*/ +inline const wchar_t* getDllName() { return util::is64BitBuild ? L"FileOperation_x64.dll" : L"FileOperation_Win32.dll"; } } diff --git a/shared/ShadowCopy/Shadow_2003.vcxproj b/shared/ShadowCopy/Shadow_2003.vcxproj index 5351cc1d..710b65bf 100644 --- a/shared/ShadowCopy/Shadow_2003.vcxproj +++ b/shared/ShadowCopy/Shadow_2003.vcxproj @@ -30,10 +30,12 @@ <CharacterSet>Unicode</CharacterSet> <WholeProgramOptimization>true</WholeProgramOptimization> <UseOfAtl>false</UseOfAtl> + <PlatformToolset>Windows7.1SDK</PlatformToolset> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <ConfigurationType>DynamicLibrary</ConfigurationType> <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>Windows7.1SDK</PlatformToolset> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <ConfigurationType>DynamicLibrary</ConfigurationType> @@ -64,10 +66,10 @@ <PropertyGroup Label="UserMacros" /> <PropertyGroup> <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> - <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\</OutDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\</OutDir> <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental> - <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\</OutDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\</OutDir> <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental> <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\</OutDir> diff --git a/shared/ShadowCopy/Shadow_XP.vcxproj b/shared/ShadowCopy/Shadow_XP.vcxproj index d096297a..6211afd5 100644 --- a/shared/ShadowCopy/Shadow_XP.vcxproj +++ b/shared/ShadowCopy/Shadow_XP.vcxproj @@ -29,10 +29,12 @@ <ConfigurationType>DynamicLibrary</ConfigurationType> <CharacterSet>Unicode</CharacterSet> <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>Windows7.1SDK</PlatformToolset> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <ConfigurationType>DynamicLibrary</ConfigurationType> <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>Windows7.1SDK</PlatformToolset> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <ConfigurationType>DynamicLibrary</ConfigurationType> @@ -63,10 +65,10 @@ <PropertyGroup Label="UserMacros" /> <PropertyGroup> <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> - <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\</OutDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\</OutDir> <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental> - <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\</OutDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\</OutDir> <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental> <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\</OutDir> diff --git a/shared/ShadowCopy/shadow.h b/shared/ShadowCopy/shadow.h index b21395da..8721b906 100644 --- a/shared/ShadowCopy/shadow.h +++ b/shared/ShadowCopy/shadow.h @@ -13,6 +13,8 @@ #define SHADOWDLL_API extern "C" __declspec(dllimport) #endif +#include "../build_info.h" + namespace shadow { @@ -60,6 +62,43 @@ typedef void (*ReleaseShadowCopyFct)(ShadowHandle handle); //(use const pointers to ensure internal linkage) const char createShadowCopyFctName[] = "createShadowCopy"; const char releaseShadowCopyFctName[] = "releaseShadowCopy"; + +/*--------------- + |library names| + ---------------*/ +namespace impl +{ +bool newerThanXP() +{ + OSVERSIONINFO osvi = {}; + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + + if (::GetVersionEx(&osvi)) + return osvi.dwMajorVersion > 5 || + (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion > 1) ; + //XP has majorVersion == 5, minorVersion == 1 + //Server 2003 has majorVersion == 5, minorVersion == 2 + //version overview: http://msdn.microsoft.com/en-us/library/ms724834(VS.85).aspx + return false; +} +} + +inline +const wchar_t* getDllName() +{ + /* + distinguish a bunch of VSS builds: we use XP and Server 2003 implementations... + VSS version and compatibility overview: http://msdn.microsoft.com/en-us/library/aa384627(VS.85).aspx + */ + return impl::newerThanXP() ? + (util::is64BitBuild ? + L"Shadow_Server2003_x64.dll" : + L"Shadow_Server2003_Win32.dll") : + + (util::is64BitBuild ? + L"Shadow_XP_x64.dll" : + L"Shadow_XP_Win32.dll"); +} } diff --git a/shared/Taskbar_Seven/Taskbar_Seven.vcxproj b/shared/Taskbar_Seven/Taskbar_Seven.vcxproj index 5b04a98c..8437bc09 100644 --- a/shared/Taskbar_Seven/Taskbar_Seven.vcxproj +++ b/shared/Taskbar_Seven/Taskbar_Seven.vcxproj @@ -32,6 +32,7 @@ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <ConfigurationType>DynamicLibrary</ConfigurationType> <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>Windows7.1SDK</PlatformToolset> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <ConfigurationType>DynamicLibrary</ConfigurationType> @@ -62,10 +63,10 @@ <PropertyGroup Label="UserMacros" /> <PropertyGroup> <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> - <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\</OutDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</OutDir> <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental> - <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\</OutDir> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</OutDir> <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental> <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\</OutDir> diff --git a/shared/Taskbar_Seven/taskbar.cpp b/shared/Taskbar_Seven/taskbar.cpp index bbbaaf7d..2a739e6c 100644 --- a/shared/Taskbar_Seven/taskbar.cpp +++ b/shared/Taskbar_Seven/taskbar.cpp @@ -30,10 +30,10 @@ ComPtr<ITaskbarList3> getInstance() static ComPtr<ITaskbarList3> taskbarlist; if (!taskbarlist) { - HRESULT hr = CoCreateInstance(CLSID_TaskbarList, - NULL, - CLSCTX_ALL, - IID_PPV_ARGS(taskbarlist.init())); + HRESULT hr = ::CoCreateInstance(CLSID_TaskbarList, + NULL, + CLSCTX_ALL, + IID_PPV_ARGS(taskbarlist.init())); if (FAILED(hr)) lastErrorMessage = generateErrorMsg(L"Error calling \"CoCreateInstance\".", hr); } diff --git a/shared/Taskbar_Seven/taskbar.h b/shared/Taskbar_Seven/taskbar.h index 3bae28a9..507920c7 100644 --- a/shared/Taskbar_Seven/taskbar.h +++ b/shared/Taskbar_Seven/taskbar.h @@ -13,6 +13,8 @@ #define DLL_FUNCTION_DECLARATION extern "C" __declspec(dllimport) #endif +#include "../build_info.h" + namespace tbseven { @@ -60,6 +62,11 @@ typedef void (*GetLastErrorFct)(wchar_t* errorMessage, size_t errorBufferLen); const char setStatusFctName[] = "setStatus"; const char setProgressFctName[] = "setProgress"; const char getLastErrorFctName[] = "getLastError"; + +/*--------------- + |library names| + ---------------*/ +inline const wchar_t* getDllName() { return util::is64BitBuild ? L"Taskbar7_x64.dll" : L"Taskbar7_Win32.dll"; } } #endif //TASKBAR_SEVEN_DLL_H diff --git a/shared/Thumbnail/Thumbnail.vcxproj b/shared/Thumbnail/Thumbnail.vcxproj new file mode 100644 index 00000000..05196e0a --- /dev/null +++ b/shared/Thumbnail/Thumbnail.vcxproj @@ -0,0 +1,235 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{70394AEF-5897-4911-AFA1-82EAF0581EFA}</ProjectGuid> + <RootNamespace>ShadowDll</RootNamespace> + <Keyword>Win32Proj</Keyword> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>Windows7.1SDK</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>Windows7.1SDK</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PlatformToolset>Windows7.1SDK</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <CharacterSet>Unicode</CharacterSet> + <PlatformToolset>Windows7.1SDK</PlatformToolset> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup> + <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental> + <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\</OutDir> + <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir> + <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Thumbnail_$(Platform)</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Thumbnail_$(Platform)</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Thumbnail_$(Platform)</TargetName> + <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Thumbnail_$(Platform)</TargetName> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <BuildLog> + <Path>$(IntDir)Build.html</Path> + </BuildLog> + <ClCompile> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;THUMBNAIL_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>true</MinimalRebuild> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>EditAndContinue</DebugInformationFormat> + <DisableSpecificWarnings>4100</DisableSpecificWarnings> + </ClCompile> + <Link> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <SubSystem>Windows</SubSystem> + <ProfileGuidedDatabase> + </ProfileGuidedDatabase> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX86</TargetMachine> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <BuildLog> + <Path>$(IntDir)Build.html</Path> + </BuildLog> + <Midl> + <TargetEnvironment>X64</TargetEnvironment> + </Midl> + <ClCompile> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;THUMBNAIL_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <MinimalRebuild>true</MinimalRebuild> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <DisableSpecificWarnings>4100</DisableSpecificWarnings> + </ClCompile> + <Link> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>true</GenerateDebugInformation> + <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile> + <SubSystem>Windows</SubSystem> + <ProfileGuidedDatabase> + </ProfileGuidedDatabase> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX64</TargetMachine> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <BuildLog> + <Path>$(IntDir)Build.html</Path> + </BuildLog> + <ClCompile> + <Optimization>MaxSpeed</Optimization> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;THUMBNAIL_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <FunctionLevelLinking>true</FunctionLevelLinking> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <DisableSpecificWarnings>4100</DisableSpecificWarnings> + <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> + </ClCompile> + <Link> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>false</GenerateDebugInformation> + <SubSystem>Windows</SubSystem> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + <ProfileGuidedDatabase> + </ProfileGuidedDatabase> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX86</TargetMachine> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <BuildLog> + <Path>$(IntDir)Build.html</Path> + </BuildLog> + <Midl> + <TargetEnvironment>X64</TargetEnvironment> + </Midl> + <ClCompile> + <Optimization>MaxSpeed</Optimization> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;THUMBNAIL_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <FunctionLevelLinking>true</FunctionLevelLinking> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <SuppressStartupBanner>true</SuppressStartupBanner> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <DisableSpecificWarnings>4100</DisableSpecificWarnings> + <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> + </ClCompile> + <Link> + <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile> + <SuppressStartupBanner>true</SuppressStartupBanner> + <GenerateDebugInformation>false</GenerateDebugInformation> + <SubSystem>Windows</SubSystem> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + <ProfileGuidedDatabase> + </ProfileGuidedDatabase> + <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary> + <TargetMachine>MachineX64</TargetMachine> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClCompile Include="dll_main.cpp"> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + </PrecompiledHeader> + <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsManaged> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + </PrecompiledHeader> + <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</CompileAsManaged> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + </PrecompiledHeader> + <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</CompileAsManaged> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + </PrecompiledHeader> + <CompileAsManaged Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</CompileAsManaged> + </ClCompile> + <ClCompile Include="thumbnail.cpp" /> + </ItemGroup> + <ItemGroup> + <ClInclude Include="thumbnail.h" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project>
\ No newline at end of file diff --git a/shared/Thumbnail/dll_main.cpp b/shared/Thumbnail/dll_main.cpp new file mode 100644 index 00000000..3805c99d --- /dev/null +++ b/shared/Thumbnail/dll_main.cpp @@ -0,0 +1,25 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** + + +#define WIN32_LEAN_AND_MEAN +#include <windows.h> + +//optional: add init/teardown logic here +BOOL APIENTRY DllMain(HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + case DLL_PROCESS_DETACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + break; + } + return TRUE; +} diff --git a/shared/Thumbnail/thumbnail.cpp b/shared/Thumbnail/thumbnail.cpp new file mode 100644 index 00000000..51635ff9 --- /dev/null +++ b/shared/Thumbnail/thumbnail.cpp @@ -0,0 +1,167 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** + +#include "thumbnail.h" + +#define WIN32_LEAN_AND_MEAN +#include "windows.h" + +#define STRICT_TYPED_ITEMIDS //better type safety for IDLists +#include <Shlobj.h> + +#include <Shellapi.h> +#include <CommonControls.h> +#include "../com_ptr.h" +#include "../string_tools.h" +#include "../loki/ScopeGuard.h" +//#include "../perf.h" + +using namespace zen; + + +thumb::HICON thumb::getThumbnail(const wchar_t* filename, int requestedSize) //return 0 on failure, caller takes ownership! +{ + const std::wstring filenameStr(filename); + + util::ComPtr<IShellFolder> shellFolder; + { + HRESULT hr = ::SHGetDesktopFolder(shellFolder.init()); + if (FAILED(hr) || !shellFolder) + return NULL; + } + + PIDLIST_RELATIVE pidlFolder = NULL; + { + const std::wstring pathName = beforeLast(filenameStr, '\\'); + HRESULT hr = shellFolder->ParseDisplayName(NULL, // [in] HWND hwnd, + NULL, // [in] IBindCtx *pbc, + const_cast<LPWSTR>(pathName.c_str()), // [in] LPWSTR pszDisplayName, + NULL, // [out] ULONG *pchEaten, + &pidlFolder, // [out] PIDLIST_RELATIVE* ppidl, + NULL); // [in, out] ULONG *pdwAttributes + if (FAILED(hr) || !pidlFolder) + return NULL; + } + LOKI_ON_BLOCK_EXIT2(::ILFree(pidlFolder)); //older version: ::CoTaskMemFree + + util::ComPtr<IShellFolder> imageFolder; + { + HRESULT hr = shellFolder->BindToObject(pidlFolder, // [in] PCUIDLIST_RELATIVE pidl, + NULL, + IID_PPV_ARGS(imageFolder.init())); + if (FAILED(hr) || !imageFolder) + return NULL; + } + + PIDLIST_RELATIVE pidImage = NULL; + { + const std::wstring shortName = afterLast(filenameStr, '\\'); + HRESULT hr = imageFolder->ParseDisplayName(NULL, // [in] HWND hwnd, + NULL, // [in] IBindCtx *pbc, + const_cast<LPWSTR>(shortName.c_str()), // [in] LPWSTR pszDisplayName, + NULL, // [out] ULONG *pchEaten, + &pidImage, // [out] PIDLIST_RELATIVE *ppidl, + NULL); // [in, out] ULONG *pdwAttributes + if (FAILED(hr) || !pidImage) + return NULL; + } + LOKI_ON_BLOCK_EXIT2(::ILFree(pidImage)); //older version: ::CoTaskMemFree + + util::ComPtr<IExtractImage> extractImage; + { + PCUITEMID_CHILD_ARRAY pidlIn = reinterpret_cast<PCUITEMID_CHILD_ARRAY>(&pidImage); + //this is where STRICT_TYPED_ITEMIDS gets us ;) + + HRESULT hr = imageFolder->GetUIObjectOf(NULL, // [in] HWND hwndOwner, + 1, // [in] UINT cidl, + pidlIn, // [in] PCUITEMID_CHILD_ARRAY apidl, + IID_IExtractImage, // [in] REFIID riid, + NULL, // [in, out] UINT *rgfReserved, + reinterpret_cast<void**>(extractImage.init())); // [out] void **ppv + if (FAILED(hr) || !extractImage) + return NULL; + } + + { + wchar_t pathBuffer[MAX_PATH]; + DWORD priority = 0; + const SIZE prgSize = { requestedSize, requestedSize }; //preferred size only! + DWORD clrDepth = 32; + DWORD flags = IEIFLAG_SCREEN | IEIFLAG_OFFLINE; + + HRESULT hr = extractImage->GetLocation(pathBuffer, // [out] LPWSTR pszPathBuffer, + MAX_PATH, // [in] DWORD cchMax, + &priority, // [out] DWORD *pdwPriority, + &prgSize, // [in] const SIZE *prgSize, + clrDepth, // [in] DWORD dwRecClrDepth, + &flags); // [in, out] DWORD *pdwFlags + if (FAILED(hr)) + return NULL; + } + + HBITMAP bitmap = NULL; + { + HRESULT hr = extractImage->Extract(&bitmap); + if (FAILED(hr) || !bitmap) + return NULL; + } + LOKI_ON_BLOCK_EXIT2(::DeleteObject(bitmap)); + + + BITMAP bmpInfo = {}; + if (::GetObject(bitmap, //__in HGDIOBJ hgdiobj, + sizeof(bmpInfo), //__in int cbBuffer, + &bmpInfo) == 0) //__out LPVOID lpvObject + return NULL; + + HBITMAP bitmapMask = ::CreateCompatibleBitmap(::GetDC(NULL), bmpInfo.bmWidth, bmpInfo.bmHeight); + if (bitmapMask == 0) + return NULL; + LOKI_ON_BLOCK_EXIT2(::DeleteObject(bitmapMask)); + + ICONINFO iconInfo = {}; + iconInfo.fIcon = true; + iconInfo.hbmColor = bitmap; + iconInfo.hbmMask = bitmapMask; + + return ::CreateIconIndirect(&iconInfo); +} + + +thumb::HICON thumb::getIconByIndex(int iconIndex, int shilIconType) //return 0 on failure, caller takes ownership! +{ + //Note: using IExtractIcon::Extract is *no* alternative, just as ::SHGetFileInfo(), it only supports small (16x16) and large (32x32) icons + + util::ComPtr<IImageList> imageList; //perf: 0,12 µs only to get the image list + { + HRESULT hr = ::SHGetImageList(shilIconType, //__in int iImageList, + IID_PPV_ARGS(imageList.init())); + if (FAILED(hr) || !imageList) + return NULL; + } + + bool hasAlpha = false; //perf: 0,14 µs + { + DWORD flags = 0; + HRESULT hr = imageList->GetItemFlags(iconIndex, //[in] int i, + &flags); //[out] DWORD *dwFlags + if (SUCCEEDED(hr)) + hasAlpha = flags & ILIF_ALPHA; + } + + ::HICON hIcon = NULL; //perf: 1,5 ms - the dominant block + { + HRESULT hr = imageList->GetIcon(iconIndex, // [in] int i, + hasAlpha ? ILD_IMAGE : ILD_NORMAL, // [in] UINT flags, + //ILD_IMAGE -> do not draw mask - fixes glitch with ILD_NORMAL where both mask *and* alpha channel are applied, e.g. for ffs_batch and folder icon + //other flags: http://msdn.microsoft.com/en-us/library/windows/desktop/bb775230(v=vs.85).aspx + &hIcon); // [out] HICON *picon + if (FAILED(hr) || !hIcon) + return NULL; + } + + return hIcon; +}
\ No newline at end of file diff --git a/shared/Thumbnail/thumbnail.h b/shared/Thumbnail/thumbnail.h new file mode 100644 index 00000000..ae62cf5d --- /dev/null +++ b/shared/Thumbnail/thumbnail.h @@ -0,0 +1,68 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** + +#ifndef TASKBAR_SEVEN_DLL_H +#define TASKBAR_SEVEN_DLL_H + +#ifdef THUMBNAIL_DLL_EXPORTS +#define DLL_FUNCTION_DECLARATION extern "C" __declspec(dllexport) +#else +#define DLL_FUNCTION_DECLARATION extern "C" __declspec(dllimport) +#endif + +#include "../build_info.h" +//#include <WinDef.h> + +namespace thumb +{ +/* +PREREQUISITES: + +1. COM must be initialized for the current thread via ::CoInitialize(NULL) or ::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED), + but NOT ::CoInitializeEx(NULL, COINIT_MULTITHREADED) -> internal access violation crash! +2. call ::FileIconInit() on app start to remedy obscure errors like SHELL_E_WRONG_BITDEPTH (0x80270102) + for certain file types, e.g. lnk, mpg - required on Windows 7 see http://msdn.microsoft.com/en-us/library/ms683212(v=VS.85).aspx +*/ + +/*-------------- + |declarations| + --------------*/ +typedef void* HICON; + +DLL_FUNCTION_DECLARATION +HICON getThumbnail(const wchar_t* filename, int requestedSize); //return 0 on failure, caller takes ownership! +//Note: not all file types support thumbnails! make sure to implement fallback to file icon! + +DLL_FUNCTION_DECLARATION +HICON getIconByIndex(int iconIndex, int shilIconType); //return 0 on failure, caller takes ownership! +/* +"iconType" refers to parameter "iImageList" of ::SHGetImageList(); sample values: + SHIL_SMALL - 16x16, but the size can be customized by the user. + SHIL_EXTRALARGE - 48x48, but the size can be customized by the user. + SHIL_JUMBO - Vista and later; normally 256x256 pixels +"iconIndex" as returned by ::SHGetFileInfo() +*/ + +/*---------- + |typedefs| + ----------*/ +typedef HICON (*GetThumbnailFct )(const wchar_t* filename, int requestedSize); +typedef HICON (*GetIconByIndexFct)(int iconIndex, int shilIconType); + +/*-------------- + |symbol names| + --------------*/ +//(use const pointers to ensure internal linkage) +const char getThumbnailFctName [] = "getThumbnail"; +const char getIconByIndexFctName [] = "getIconByIndex"; + +/*--------------- + |library names| + ---------------*/ +inline const wchar_t* getDllName() { return util::is64BitBuild ? L"Thumbnail_x64.dll" : L"Thumbnail_Win32.dll"; } +} + +#endif //TASKBAR_SEVEN_DLL_H diff --git a/shared/check_exist.h b/shared/check_exist.h index 14a8a3f8..8078d388 100644 --- a/shared/check_exist.h +++ b/shared/check_exist.h @@ -48,7 +48,7 @@ boost::unique_future<bool> objExistsAsync(const Zstring& objname) { //thread safety: make it a pure value type for use in the thread! const Zstring objnameVal = objname; //atomic ref-count => binary value-type semantics! - boost::packaged_task<bool> pt([=] { return (*fun)(objnameVal); }); + boost::packaged_task<bool> pt([ = ] { return (*fun)(objnameVal); }); auto fut = pt.get_future(); boost::thread(std::move(pt)); return std::move(fut); diff --git a/shared/com_error.h b/shared/com_error.h index 39f26555..e3d51d4b 100644 --- a/shared/com_error.h +++ b/shared/com_error.h @@ -9,31 +9,22 @@ #include <string> #include <cstdio> -#include <comdef.h> +#include <windows.h> +#undef min +#undef max namespace util { std::wstring generateErrorMsg(const std::wstring& input, HRESULT hr); +std::wstring formatWin32Msg(DWORD dwMessageId); //return empty string on error + + + -class ComException -{ -public: - ComException(const std::wstring& message, HRESULT hr = NO_ERROR) - : message_(message), hr_(hr) {} - std::wstring show() const - { - return hr_ != NO_ERROR ? generateErrorMsg(message_, hr_) : message_; - } -private: - ComException(const ComException&); - ComException& operator=(const ComException&); - const std::wstring message_; - const HRESULT hr_; -}; @@ -56,6 +47,144 @@ private: //################# implementation ##################### +std::wstring formatWin32Msg(DWORD dwMessageId) //return empty string on error +{ + std::wstring output; + LPWSTR buffer = NULL; + if (::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_MAX_WIDTH_MASK | + FORMAT_MESSAGE_IGNORE_INSERTS | //important: without this flag ::FormatMessage() will fail if message contains placeholders + FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwMessageId, 0, reinterpret_cast<LPWSTR>(&buffer), 0, NULL) != 0) + { + if (buffer) //just to be sure + { + output = buffer; + ::LocalFree(buffer); + } + } + return output; +} + +namespace +{ +std::wstring formatFacility(HRESULT hr) +{ + switch (HRESULT_FACILITY(hr)) + { + case FACILITY_XPS: + return L"XPS"; + case FACILITY_WINRM: + return L"Windows Resource Manager"; + case FACILITY_WINDOWSUPDATE: + return L"Windows Update"; + case FACILITY_WINDOWS_DEFENDER: + return L"Windows Defender Component"; + case FACILITY_WINDOWS_CE: + return L"Windows CE"; + case FACILITY_WINDOWS: + return L"Windows Subsystem"; + case FACILITY_USERMODE_VOLMGR: + return L"User Mode Volume Manager"; + case FACILITY_USERMODE_VIRTUALIZATION: + return L"User Mode Virtualization Subsystem"; + case FACILITY_USERMODE_VHD: + return L"User Mode Virtual Hard Disk Support"; + case FACILITY_URT: + return L".NET CLR"; + case FACILITY_UMI: + return L"Ubiquitous Memoryintrospection Service"; + case FACILITY_UI: + return L"UI"; + case FACILITY_TPM_SOFTWARE: + return L"Trusted Platform Module Applications"; + case FACILITY_TPM_SERVICES: + return L"Trusted Platform Module Services"; + case FACILITY_SXS: + return L"Side-by-side Servicing"; + case FACILITY_STORAGE: + return L"OLE Storage"; + case FACILITY_STATE_MANAGEMENT: + return L"State Management Services"; + case FACILITY_SCARD: + return L"Smart-card Subsystem"; + case FACILITY_SHELL: + return L"User Shell"; + case FACILITY_SETUPAPI: + return L"Setup API"; + case FACILITY_SECURITY: + return L"Security API Layer"; + case FACILITY_SDIAG: + return L"System Diagnostics"; + case FACILITY_RPC: + return L"RPC Subsystem"; + case FACILITY_RAS: + return L"RAS"; + case FACILITY_PLA: + return L"Performance Logs and Alerts"; + case FACILITY_OPC: + return L"Open Connectivity Service"; + case FACILITY_WIN32: + return L"Win32"; + case FACILITY_CONTROL: + return L"Control Mechanism"; + case FACILITY_WEBSERVICES: + return L"Web Services"; + case FACILITY_NDIS: + return L"Network Driver Interface"; + case FACILITY_METADIRECTORY: + return L"Microsoft Identity Server"; + case FACILITY_MSMQ: + return L"Microsoft Message Queue"; + case FACILITY_MEDIASERVER: + return L"Windows Media Server"; + case FACILITY_MBN: + return L"MBN"; + case FACILITY_INTERNET: + return L"Wininet"; + case FACILITY_ITF: + return L"COM/OLE Interface Management"; + case FACILITY_USERMODE_HYPERVISOR: + return L"Usermode Hypervisor Components"; + case FACILITY_HTTP: + return L"HTTP Support"; + case FACILITY_GRAPHICS: + return L"Graphics Drivers"; + case FACILITY_FWP: + return L"Firewall Platform"; + case FACILITY_FVE: + return L"Full volume encryption"; + case FACILITY_USERMODE_FILTER_MANAGER: + return L"User Mode Filter Manager"; + case FACILITY_DPLAY: + return L"Direct Play"; + case FACILITY_DISPATCH: + return L"COM Dispatch"; + case FACILITY_DIRECTORYSERVICE: + return L"Active Directory"; + case FACILITY_CONFIGURATION: + return L"Configuration Services"; + case FACILITY_COMPLUS: + return L"COM+"; + case FACILITY_USERMODE_COMMONLOG: + return L"Common Logging Support"; + case FACILITY_CMI: + return L"Configuration Management Infrastructure"; + case FACILITY_CERT: + return L"Certificate"; + case FACILITY_BCD: + return L"Boot Configuration Database"; + case FACILITY_BACKGROUNDCOPY: + return L"Background Copy Control"; + case FACILITY_ACS: + return L"Audit Collection Service"; + case FACILITY_AAF: + return L"Microsoft Agent"; + default: + return L"Unknown"; + } +} +} + inline std::wstring numberToHexString(long number) { @@ -69,11 +198,18 @@ inline std::wstring generateErrorMsg(const std::wstring& input, HRESULT hr) { std::wstring output(input); - output += L" ("; - output += numberToHexString(hr); - output += L": "; - output += _com_error(hr).ErrorMessage(); - output += L")"; + output += L"\n"; + output += L"HRESULT: " + numberToHexString(hr) + L",\n"; + + //don't use _com_error(hr).ErrorMessage(), this is nothing more than a call to ::FormatMessage() + std::wstring win32Msg = formatWin32Msg(hr); + if (!win32Msg.empty()) //empty string on error + output += win32Msg; + else + { + output += L"Facility: " + formatFacility(hr) + L",\n"; + output += L"Win32 Error: " + formatWin32Msg(HRESULT_CODE(hr)); //interpet hr as a Win32 code; this is often useful + } return output; } } diff --git a/shared/custom_button.cpp b/shared/custom_button.cpp index 0c4c3019..606db4f2 100644 --- a/shared/custom_button.cpp +++ b/shared/custom_button.cpp @@ -10,37 +10,9 @@ #include <algorithm> #include <limits> #include <cmath> +#include "image_tools.h" - -namespace -{ -bool isEqual(const wxBitmap& lhs, const wxBitmap& rhs) -{ - if (lhs.IsOk() != rhs.IsOk()) - return false; - - if (!lhs.IsOk()) - return true; - - const int pixelCount = lhs.GetWidth() * lhs.GetHeight(); - if (pixelCount != rhs.GetWidth() * rhs.GetHeight()) - return false; - - wxImage imLhs = lhs.ConvertToImage(); - wxImage imRhs = rhs.ConvertToImage(); - - if (imLhs.HasAlpha() != imRhs.HasAlpha()) - return false; - - if (imLhs.HasAlpha()) - { - if (!std::equal(imLhs.GetAlpha(), imLhs.GetAlpha() + pixelCount, imRhs.GetAlpha())) - return false; - } - - return std::equal(imLhs.GetData(), imLhs.GetData() + pixelCount * 3, imRhs.GetData()); -} -} +using namespace zen; void setBitmapLabel(wxBitmapButton& button, const wxBitmap& bmp) diff --git a/shared/custom_combo_box.cpp b/shared/custom_combo_box.cpp deleted file mode 100644 index fb16a303..00000000 --- a/shared/custom_combo_box.cpp +++ /dev/null @@ -1,111 +0,0 @@ -// ************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * -// ************************************************************************** - -#include "custom_combo_box.h" - - -CustomComboBox::CustomComboBox(wxWindow* parent, - wxWindowID id, - const wxString& value, - const wxPoint& pos, - const wxSize& size, - int n, - const wxString choices[], - long style, - const wxValidator& validator, - const wxString& name) : - wxComboBox(parent, id, value, pos, size, n, choices, style, validator, name) -#if wxCHECK_VERSION(2, 9, 1) - , dropDownShown(false) -#endif -{ - //register key event to enable item deletion - this->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(CustomComboBox::OnKeyEvent), NULL, this ); - -#if wxCHECK_VERSION(2, 9, 1) - this->Connect(wxEVT_COMMAND_COMBOBOX_DROPDOWN, wxCommandEventHandler(CustomComboBox::OnShowDropDown), NULL, this ); - this->Connect(wxEVT_COMMAND_COMBOBOX_CLOSEUP, wxCommandEventHandler(CustomComboBox::OnHideDropDown), NULL, this ); -#endif -} - - -#if wxCHECK_VERSION(2, 9, 1) -void CustomComboBox::OnShowDropDown(wxCommandEvent& event) -{ - dropDownShown = true; - event.Skip(); -} - - -void CustomComboBox::OnHideDropDown(wxCommandEvent& event) -{ - dropDownShown = false; - event.Skip(); -} -#endif - - -void CustomComboBox::OnKeyEvent(wxKeyEvent& event) -{ - const int keyCode = event.GetKeyCode(); - if (keyCode == WXK_DELETE || keyCode == WXK_NUMPAD_DELETE) - { - //try to delete the currently selected config history item - const int selectedItem = this->GetCurrentSelection(); - if (0 <= selectedItem && selectedItem < static_cast<int>(this->GetCount()) && -#if wxCHECK_VERSION(2, 9, 1) - dropDownShown) -#else - //what a mess...: - (GetValue() != GetString(selectedItem) || //avoid problems when a character shall be deleted instead of list item - GetValue() == wxEmptyString)) //exception: always allow removing empty entry -#endif - { - //save old (selected) value: deletion seems to have influence on this - const wxString currentVal = this->GetValue(); - this->SetSelection(wxNOT_FOUND); - - //delete selected row - this->Delete(selectedItem); - - //(re-)set value - this->SetValue(currentVal); - - //eat up key event - return; - } - } - event.Skip(); -} - - -void CustomComboBox::addPairToFolderHistory(const wxString& newFolder, unsigned int maxHistSize) -{ - //don't add empty directories - if (newFolder.empty()) - return; - - const wxString oldVal = this->GetValue(); - - //insert new folder or put it to the front if already existing -#ifdef FFS_WIN //don't respect case in windows build - const int pos = FindString(newFolder, false); -#elif defined FFS_LINUX - const int pos = FindString(newFolder, true); -#endif - if (pos != wxNOT_FOUND) - this->Delete(pos); - - this->Insert(newFolder, 0); - - //keep maximal size of history list - if (this->GetCount() > maxHistSize) - this->Delete(maxHistSize); - - this->SetSelection(wxNOT_FOUND); //don't select anything - this->SetValue(oldVal); //but preserve main text! -} - diff --git a/shared/custom_combo_box.h b/shared/custom_combo_box.h deleted file mode 100644 index 3ddd73b0..00000000 --- a/shared/custom_combo_box.h +++ /dev/null @@ -1,42 +0,0 @@ -// ************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * -// ************************************************************************** - -#ifndef CUSTOMCOMBOBOX_H_INCLUDED -#define CUSTOMCOMBOBOX_H_INCLUDED - -#include <wx/combobox.h> - -//combobox with history function + functionality to delete items (DEL) - -class CustomComboBox : public wxComboBox -{ -public: - CustomComboBox(wxWindow* parent, - wxWindowID id, - const wxString& value = wxEmptyString, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - int n = 0, - const wxString choices[] = NULL, - long style = 0, - const wxValidator& validator = wxDefaultValidator, - const wxString& name = wxComboBoxNameStr); - - void addPairToFolderHistory(const wxString& newFolder, unsigned int maxHistSize); - -private: - void OnKeyEvent(wxKeyEvent& event); - -#if wxCHECK_VERSION(2, 9, 1) - void OnShowDropDown(wxCommandEvent& event); - void OnHideDropDown(wxCommandEvent& event); - - bool dropDownShown; -#endif -}; - - -#endif // CUSTOMCOMBOBOX_H_INCLUDED diff --git a/shared/custom_tooltip.cpp b/shared/custom_tooltip.cpp index 184c2716..0e1c5172 100644 --- a/shared/custom_tooltip.cpp +++ b/shared/custom_tooltip.cpp @@ -17,7 +17,7 @@ public: wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxSize( -1,-1 ), + const wxSize& size = wxSize( -1, -1 ), long style = wxFRAME_NO_TASKBAR | wxSTAY_ON_TOP | wxSTATIC_BORDER); wxStaticText* m_staticTextMain; @@ -41,7 +41,7 @@ CustomTooltip::PopupFrameGenerated::PopupFrameGenerated( 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 ); + bSizer158->Add( m_bitmapLeft, 0, wxALL | wxALIGN_CENTER_VERTICAL, 5 ); m_staticTextMain = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); bSizer158->Add( m_staticTextMain, 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5 ); diff --git a/shared/debug_new.h b/shared/debug_new.h index b8911b4d..ba31e489 100644 --- a/shared/debug_new.h +++ b/shared/debug_new.h @@ -21,7 +21,7 @@ Usage: - Include everywhere before any other file: $(ProjectDir)\shared\debug_new.h For Minidumps: - Compile "debug_new.cpp" -- Compile in Debug build (need Symbols and less restrictive Optimization) +- Compile with debugging symbols and optimization deactivated */ namespace mem_check diff --git a/shared/dir_name.cpp b/shared/dir_name.cpp index f1b0c3c2..a14367c9 100644 --- a/shared/dir_name.cpp +++ b/shared/dir_name.cpp @@ -15,6 +15,7 @@ #include "check_exist.h" #include "util.h" #include "i18n.h" +#include "folder_history_box.h" using namespace zen; @@ -37,7 +38,7 @@ void setDirectoryNameImpl(const wxString& dirname, wxDirPickerCtrl* dirPicker, w staticBox->GetStaticBox()->SetLabel(dirNormalized == dirFormatted ? wxString(_("Drag && drop")) : dirFormatted); } - + if (dirPicker) { if (!dirFormatted.empty() && @@ -61,162 +62,113 @@ void setDirectoryName(const wxString& dirname, void setDirectoryName(const wxString& dirname, - wxComboBox* comboBox, + FolderHistoryBox* comboBox, wxDirPickerCtrl* dirPicker, wxWindow& tooltipWnd, - wxStaticBoxSizer& staticBox, + wxStaticBoxSizer* staticBox, size_t timeout = 200) //pointers are optional { if (comboBox) - { - comboBox->SetSelection(wxNOT_FOUND); - comboBox->SetValue(dirname); - } - setDirectoryNameImpl(dirname, dirPicker, tooltipWnd, &staticBox, timeout); + comboBox->setValue(dirname); + setDirectoryNameImpl(dirname, dirPicker, tooltipWnd, staticBox, timeout); } } - - //############################################################################################################## -using zen::DirectoryNameMainDlg; - -DirectoryNameMainDlg::DirectoryNameMainDlg(wxWindow& dropWindow1, - wxWindow& dropWindow2, - wxDirPickerCtrl& dirPicker, - wxComboBox& dirName, - wxStaticBoxSizer& staticBox) : - dropWindow1_(dropWindow1), + +template <class NameControl> +DirectoryName<NameControl>::DirectoryName(wxWindow& dropWindow, + wxDirPickerCtrl& dirPicker, + NameControl& dirName, + wxStaticBoxSizer* staticBox, + wxWindow* dropWindow2) : + dropWindow_(dropWindow), dropWindow2_(dropWindow2), dirPicker_(dirPicker), dirName_(dirName), staticBox_(staticBox) { //prepare drag & drop - setupFileDrop(dropWindow1); - setupFileDrop(dropWindow2); + setupFileDrop(dropWindow); + if (dropWindow2) + setupFileDrop(*dropWindow2); //redirect drag & drop event back to this class - dropWindow1.Connect(FFS_DROP_FILE_EVENT, FFSFileDropEventHandler(DirectoryNameMainDlg::OnFilesDropped), NULL, this); - dropWindow2.Connect(FFS_DROP_FILE_EVENT, FFSFileDropEventHandler(DirectoryNameMainDlg::OnFilesDropped), NULL, this); + dropWindow.Connect(FFS_DROP_FILE_EVENT, FFSFileDropEventHandler(DirectoryName::OnFilesDropped), NULL, this); + if (dropWindow2) + dropWindow2->Connect(FFS_DROP_FILE_EVENT, FFSFileDropEventHandler(DirectoryName::OnFilesDropped), NULL, this); //keep dirPicker and dirName synchronous - dirName .Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DirectoryNameMainDlg::OnWriteDirManually), NULL, this ); - dirPicker.Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler(DirectoryNameMainDlg::OnDirSelected), NULL, this ); + dirName_ .Connect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DirectoryName::OnWriteDirManually), NULL, this); + dirPicker_.Connect(wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler(DirectoryName::OnDirSelected ), NULL, this); +} + + +template <class NameControl> +DirectoryName<NameControl>::~DirectoryName() +{ + dirName_ .Disconnect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DirectoryName::OnWriteDirManually), NULL, this); + dirPicker_.Disconnect(wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler(DirectoryName::OnDirSelected ), NULL, this); } -void DirectoryNameMainDlg::OnFilesDropped(FFSFileDropEvent& event) +template <class NameControl> +void DirectoryName<NameControl>::OnFilesDropped(FFSFileDropEvent& event) { if (event.getFiles().empty()) return; - if (AcceptDrop(event.getFiles())) + if (acceptDrop(event.getFiles())) { - wxString fileName = event.getFiles()[0]; + const wxString fileName = event.getFiles()[0]; if (dirExists(toZ(fileName))) setDirectoryName(fileName, &dirName_, &dirPicker_, dirName_, staticBox_); else { - fileName = beforeLast(fileName, FILE_NAME_SEPARATOR); - if (dirExists(toZ(fileName))) + wxString parentName = beforeLast(fileName, FILE_NAME_SEPARATOR); //returns empty string if ch not found +#ifdef FFS_WIN + if (endsWith(parentName, L":")) //volume name + parentName += FILE_NAME_SEPARATOR; +#endif + if (dirExists(toZ(parentName))) + setDirectoryName(parentName, &dirName_, &dirPicker_, dirName_, staticBox_); + else //set original name unconditionally: usecase: inactive mapped network shares setDirectoryName(fileName, &dirName_, &dirPicker_, dirName_, staticBox_); } } } -void DirectoryNameMainDlg::OnWriteDirManually(wxCommandEvent& event) +template <class NameControl> +void DirectoryName<NameControl>::OnWriteDirManually(wxCommandEvent& event) { - setDirectoryName(event.GetString(), NULL, &dirPicker_, dirName_, staticBox_, 100); //potentially slow network access: wait 100 ms at most + setDirectoryName(event.GetString(), static_cast<NameControl*>(NULL), &dirPicker_, dirName_, staticBox_, 100); //potentially slow network access: wait 100 ms at most event.Skip(); } -void DirectoryNameMainDlg::OnDirSelected(wxFileDirPickerEvent& event) +template <class NameControl> +void DirectoryName<NameControl>::OnDirSelected(wxFileDirPickerEvent& event) { const wxString newPath = event.GetPath(); setDirectoryName(newPath, &dirName_, NULL, dirName_, staticBox_); - event.Skip(); } -wxString DirectoryNameMainDlg::getName() const +template <class NameControl> +wxString DirectoryName<NameControl>::getName() const { return dirName_.GetValue(); } -void DirectoryNameMainDlg::setName(const wxString& dirname) +template <class NameControl> +void DirectoryName<NameControl>::setName(const wxString& dirname) { setDirectoryName(dirname, &dirName_, &dirPicker_, dirName_, staticBox_); } -//############################################################################################################## -using zen::DirectoryName; - -DirectoryName::DirectoryName(wxWindow& dropWindow, - wxDirPickerCtrl& dirPicker, - wxTextCtrl& dirName, - wxStaticBoxSizer* staticBox) : - dropWindow_(dropWindow), - dirPicker_(dirPicker), - dirName_(dirName), - staticBox_(staticBox) -{ - //prepare drag & drop - setupFileDrop(dropWindow); - - //redirect drag & drop event back to this class - dropWindow.Connect(FFS_DROP_FILE_EVENT, FFSFileDropEventHandler(DirectoryName::OnFilesDropped), NULL, this); - - //keep dirPicker and dirName synchronous - dirName.Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DirectoryName::OnWriteDirManually ), NULL, this ); - dirPicker.Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( DirectoryName::OnDirSelected ), NULL, this ); -} - - -void DirectoryName::OnFilesDropped(FFSFileDropEvent& event) -{ - if (event.getFiles().empty()) - return; - - wxString fileName = event.getFiles()[0]; - if (dirExists(toZ(fileName))) - setDirectoryName(fileName, &dirName_, &dirPicker_, dirName_, staticBox_); - else - { - fileName = beforeLast(fileName, FILE_NAME_SEPARATOR); - if (dirExists(toZ(fileName))) - setDirectoryName(fileName, &dirName_, &dirPicker_, dirName_, staticBox_); - } -} - - -void DirectoryName::OnWriteDirManually(wxCommandEvent& event) -{ - setDirectoryName(event.GetString(), NULL, &dirPicker_, dirName_, staticBox_, 100); //potentially slow network access: wait 100 ms at most - event.Skip(); -} - - -void DirectoryName::OnDirSelected(wxFileDirPickerEvent& event) -{ - const wxString newPath = event.GetPath(); - setDirectoryName(newPath, &dirName_, NULL, dirName_, staticBox_); - - event.Skip(); -} - - -wxString DirectoryName::getName() const -{ - return dirName_.GetValue(); -} - - -void DirectoryName::setName(const wxString& dirname) -{ - setDirectoryName(dirname, &dirName_, &dirPicker_, dirName_, staticBox_); -} +//explicit template instantiation +template class DirectoryName<wxTextCtrl>; +template class DirectoryName<FolderHistoryBox>; diff --git a/shared/dir_name.h b/shared/dir_name.h index 6e783d75..7c7b3bc4 100644 --- a/shared/dir_name.h +++ b/shared/dir_name.h @@ -11,64 +11,38 @@ #include <wx/event.h> #include <wx/sizer.h> #include <wx/filepicker.h> -#include <wx/combobox.h> #include "file_drop.h" - -class wxFileDirPickerEvent; - namespace zen { //handle drag and drop, tooltip, label and manual input, coordinating a wxWindow, wxDirPickerCtrl, and wxComboBox/wxTextCtrl -class DirectoryNameMainDlg : private wxEvtHandler +template <class NameControl> //NameControl may be wxTextCtrl, FolderHistoryBox +class DirectoryName: private wxEvtHandler { public: - DirectoryNameMainDlg(wxWindow& dropWindow1, - wxWindow& dropWindow2, - wxDirPickerCtrl& dirPicker, - wxComboBox& dirName, - wxStaticBoxSizer& staticBox); + DirectoryName(wxWindow& dropWindow, + wxDirPickerCtrl& dirPicker, + NameControl& dirName, + wxStaticBoxSizer* staticBox = NULL, + wxWindow* dropWindow2 = NULL); //optional - virtual ~DirectoryNameMainDlg() {} + ~DirectoryName(); wxString getName() const; void setName(const wxString& dirname); - virtual bool AcceptDrop(const std::vector<wxString>& droppedFiles) = 0; //return true if drop should be processed - private: - void OnFilesDropped(FFSFileDropEvent& event); - void OnWriteDirManually(wxCommandEvent& event); - void OnDirSelected(wxFileDirPickerEvent& event); - - const wxWindow& dropWindow1_; - const wxWindow& dropWindow2_; - wxDirPickerCtrl& dirPicker_; - wxComboBox& dirName_; - wxStaticBoxSizer& staticBox_; -}; + virtual bool acceptDrop(const std::vector<wxString>& droppedFiles) { return true; }; //return true if drop should be processed - -class DirectoryName: private wxEvtHandler -{ -public: - DirectoryName(wxWindow& dropWindow, - wxDirPickerCtrl& dirPicker, - wxTextCtrl& dirName, - wxStaticBoxSizer* staticBox = NULL); //optional - - wxString getName() const; - void setName(const wxString& dirname); - -private: void OnFilesDropped(FFSFileDropEvent& event); void OnWriteDirManually(wxCommandEvent& event); void OnDirSelected(wxFileDirPickerEvent& event); - const wxWindow& dropWindow_; - wxDirPickerCtrl& dirPicker_; - wxTextCtrl& dirName_; + const wxWindow& dropWindow_; + const wxWindow* dropWindow2_; + wxDirPickerCtrl& dirPicker_; + NameControl& dirName_; wxStaticBoxSizer* staticBox_; //optional }; } diff --git a/shared/dir_watcher.cpp b/shared/dir_watcher.cpp index 9c3a00c7..5d178734 100644 --- a/shared/dir_watcher.cpp +++ b/shared/dir_watcher.cpp @@ -28,77 +28,88 @@ using namespace zen; - #ifdef FFS_WIN namespace { -typedef Zbase<wchar_t> BasicWString; //thread safe string class for UI texts - - -struct SharedData +class SharedData { - boost::mutex lockAccess; - std::set<Zstring> changedFiles; //get rid of duplicate entries (actually occur!) - BasicWString errorMsg; //non-empty if errors occured in thread -}; - - -void addChanges(SharedData& shared, const char* buffer, DWORD bytesWritten, const Zstring& dirname) //throw () -{ - boost::lock_guard<boost::mutex> dummy(shared.lockAccess); +public: + //context of worker thread + void addChanges(const char* buffer, DWORD bytesWritten, const Zstring& dirname) //throw () + { + boost::lock_guard<boost::mutex> dummy(lockAccess); - std::set<Zstring>& output = shared.changedFiles; + std::set<Zstring>& output = changedFiles; - if (bytesWritten == 0) //according to docu this may happen in case of internal buffer overflow: report some "dummy" change - output.insert(L"Overflow!"); - else - { - const char* bufPos = &buffer[0]; - while (true) + if (bytesWritten == 0) //according to docu this may happen in case of internal buffer overflow: report some "dummy" change + output.insert(L"Overflow!"); + else { - const FILE_NOTIFY_INFORMATION& notifyInfo = reinterpret_cast<const FILE_NOTIFY_INFORMATION&>(*bufPos); + const char* bufPos = &buffer[0]; + while (true) + { + const FILE_NOTIFY_INFORMATION& notifyInfo = reinterpret_cast<const FILE_NOTIFY_INFORMATION&>(*bufPos); - const Zstring fullname = dirname + Zstring(notifyInfo.FileName, notifyInfo.FileNameLength / sizeof(WCHAR)); + const Zstring fullname = dirname + Zstring(notifyInfo.FileName, notifyInfo.FileNameLength / sizeof(WCHAR)); - //skip modifications sent by changed directories: reason for change, child element creation/deletion, will notify separately! - bool skip = false; - if (notifyInfo.Action == FILE_ACTION_MODIFIED) - { - //note: this check will not work if top watched directory has been renamed - const DWORD ret = ::GetFileAttributes(applyLongPathPrefix(fullname).c_str()); - bool isDir = ret != INVALID_FILE_ATTRIBUTES && (ret & FILE_ATTRIBUTE_DIRECTORY); //returns true for (dir-)symlinks also - skip = isDir; - } + //skip modifications sent by changed directories: reason for change, child element creation/deletion, will notify separately! + bool skip = false; + if (notifyInfo.Action == FILE_ACTION_RENAMED_OLD_NAME) //FILE_ACTION_RENAMED_NEW_NAME should suffice + skip = true; + else if (notifyInfo.Action == FILE_ACTION_MODIFIED) + { + //note: this check will not work if top watched directory has been renamed + const DWORD ret = ::GetFileAttributes(applyLongPathPrefix(fullname).c_str()); + bool isDir = ret != INVALID_FILE_ATTRIBUTES && (ret & FILE_ATTRIBUTE_DIRECTORY); //returns true for (dir-)symlinks also + skip = isDir; + } - if (!skip) - output.insert(fullname); + if (!skip) + output.insert(fullname); - if (notifyInfo.NextEntryOffset == 0) - break; - bufPos += notifyInfo.NextEntryOffset; + if (notifyInfo.NextEntryOffset == 0) + break; + bufPos += notifyInfo.NextEntryOffset; + } } } -} + //context of main thread + void addChange(const Zstring& dirname) //throw () + { + boost::lock_guard<boost::mutex> dummy(lockAccess); + changedFiles.insert(dirname); + } -void getChanges(SharedData& shared, std::vector<Zstring>& output) //throw FileError -{ - boost::lock_guard<boost::mutex> dummy(shared.lockAccess); - //first check whether errors occured in thread - if (!shared.errorMsg.empty()) - throw zen::FileError(shared.errorMsg.c_str()); + //context of main thread + void getChanges(std::vector<Zstring>& output) //throw FileError + { + boost::lock_guard<boost::mutex> dummy(lockAccess); - output.assign(shared.changedFiles.begin(), shared.changedFiles.end()); - shared.changedFiles.clear(); -} + //first check whether errors occured in thread + if (!errorMsg.empty()) + throw zen::FileError(errorMsg.c_str()); + output.assign(changedFiles.begin(), changedFiles.end()); + changedFiles.clear(); + } -void reportError(SharedData& shared, const BasicWString& errorMsg) //throw () -{ - boost::lock_guard<boost::mutex> dummy(shared.lockAccess); - shared.errorMsg = errorMsg; -} + + //context of worker thread + void reportError(const std::wstring& msg) //throw () + { + boost::lock_guard<boost::mutex> dummy(lockAccess); + errorMsg = cvrtString<BasicWString>(msg); + } + +private: + typedef Zbase<wchar_t> BasicWString; //thread safe string class for UI texts + + boost::mutex lockAccess; + std::set<Zstring> changedFiles; //get rid of duplicate entries (actually occur!) + BasicWString errorMsg; //non-empty if errors occured in thread +}; class ReadChangesAsync @@ -129,7 +140,7 @@ public: OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL); - if(hDir == INVALID_HANDLE_VALUE ) + if (hDir == INVALID_HANDLE_VALUE ) throw FileError(_("Could not initialize directory monitoring:") + "\n\"" + utf8CvrtTo<std::wstring>(dirname) + "\"" + "\n\n" + zen::getLastErrorFormatted()); //Loki::ScopeGuard guardDir = Loki::MakeGuard(::CloseHandle, hDir); @@ -146,7 +157,7 @@ public: { try { - std::vector<char> buffer(64 * 1024); //maximum buffer size restricted by some networks protocols (according to docu) + std::vector<char> buffer(64 * 1024); //needs to be aligned on a DWORD boundary; maximum buffer size restricted by some networks protocols (according to docu) while (true) { @@ -159,7 +170,7 @@ public: false, //__in BOOL bInitialState, NULL); //__in_opt LPCTSTR lpName if (overlapped.hEvent == NULL) - return ::reportError(*shared_, BasicWString(_("Error when monitoring directories.") + "\n\n" + getLastErrorFormatted())); //throw () + quit thread + return shared_->reportError(_("Error when monitoring directories.") + " (CreateEvent)" + "\n\n" + getLastErrorFormatted()); //throw () + quit thread Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, overlapped.hEvent); (void)dummy; @@ -176,14 +187,13 @@ public: NULL, // __out_opt LPDWORD lpBytesReturned, &overlapped, // __inout_opt LPOVERLAPPED lpOverlapped, NULL)) // __in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine - return ::reportError(*shared_, BasicWString(_("Error when monitoring directories.") + "\n\n" + getLastErrorFormatted())); //throw () + quit thread + return shared_->reportError(_("Error when monitoring directories.") + " (ReadDirectoryChangesW)" + "\n\n" + getLastErrorFormatted()); //throw () + quit thread //async I/O is a resource that needs to be guarded since it will write to local variable "buffer"! Loki::ScopeGuard lockAio = Loki::MakeGuard([&]() { //http://msdn.microsoft.com/en-us/library/aa363789(v=vs.85).aspx - bool cancelSuccess = ::CancelIo(hDir) == TRUE; //cancel all async I/O related to this handle and thread - if (cancelSuccess) + if (::CancelIo(hDir) == TRUE) //cancel all async I/O related to this handle and thread { DWORD bytesWritten = 0; ::GetOverlappedResult(hDir, &overlapped, &bytesWritten, true); //wait until cancellation is complete @@ -199,7 +209,7 @@ public: false)) //__in BOOL bWait { if (::GetLastError() != ERROR_IO_INCOMPLETE) - return ::reportError(*shared_, BasicWString(_("Error when monitoring directories.") + "\n\n" + getLastErrorFormatted())); //throw () + quit thread + return shared_->reportError(_("Error when monitoring directories.") + " (GetOverlappedResult)" + "\n\n" + getLastErrorFormatted()); //throw () + quit thread //execute asynchronous procedure calls (APC) queued on this thread ::SleepEx(50, // __in DWORD dwMilliseconds, @@ -209,7 +219,7 @@ public: } lockAio.Dismiss(); - ::addChanges(*shared_, &buffer[0], bytesWritten, dirname); //throw () + shared_->addChanges(&buffer[0], bytesWritten, dirname); //throw () } } catch (boost::thread_interrupted&) @@ -222,7 +232,7 @@ public: } } - ReadChangesAsync(ReadChangesAsync&& other) : + ReadChangesAsync(ReadChangesAsync && other) : hDir(INVALID_HANDLE_VALUE) { shared_ = std::move(other.shared_); @@ -269,10 +279,7 @@ private: //now hDir should have been released //report removal as change to main directory - { - boost::lock_guard<boost::mutex> dummy(shared_->lockAccess); - shared_->changedFiles.insert(dirname_); - } + shared_->addChange(dirname_); removalRequested = true; } //don't throw! @@ -327,7 +334,7 @@ DirWatcher::~DirWatcher() std::vector<Zstring> DirWatcher::getChanges() //throw FileError { std::vector<Zstring> output; - ::getChanges(*pimpl_->shared, output); //throw FileError + pimpl_->shared->getChanges(output); //throw FileError return output; } diff --git a/shared/dll_loader.cpp b/shared/dll_loader.cpp deleted file mode 100644 index 4e2c0e65..00000000 --- a/shared/dll_loader.cpp +++ /dev/null @@ -1,83 +0,0 @@ -// ************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * -// ************************************************************************** - -#include "dll_loader.h" -#include <map> - -namespace -{ -class DllHandler -{ -public: - static DllHandler& getInstance() - { - static DllHandler instance; - return instance; - } - - HMODULE getHandle(const std::wstring& libraryName) - { - if (libraryName.empty()) - return ::GetModuleHandle(NULL); //return handle to calling executable - - HandleMap::const_iterator iter = handles.find(libraryName); - if (iter != handles.end()) - return iter->second; - - HMODULE newHandle = ::LoadLibrary(libraryName.c_str()); - if (newHandle != NULL) - handles.insert(std::make_pair(libraryName, newHandle)); - - return newHandle; - } - -private: - DllHandler() {} - DllHandler(const DllHandler&); - DllHandler& operator=(const DllHandler&); - - ~DllHandler() - { - for (HandleMap::const_iterator i = handles.begin(); i != handles.end(); ++i) - ::FreeLibrary(i->second); - } - - typedef std::map<std::wstring, HMODULE> HandleMap; - HandleMap handles; //only valid handles here! -}; -} - - -FARPROC util::loadSymbol(const std::wstring& libraryName, const std::string& functionName) -{ - const HMODULE libHandle = DllHandler::getInstance().getHandle(libraryName); - return libHandle != NULL ? ::GetProcAddress(libHandle, functionName.c_str()) : NULL; -} - - -std::string util::getResourceStream(const std::wstring& libraryName, size_t resourceId) -{ - std::string output; - const HMODULE module = DllHandler::getInstance().getHandle(libraryName); - if (module) - { - const HRSRC res = ::FindResource(module, MAKEINTRESOURCE(resourceId), RT_RCDATA); - if (res != NULL) - { - const HGLOBAL resHandle = ::LoadResource(module, res); - if (resHandle != NULL) - { - const char* stream = static_cast<const char*>(::LockResource(resHandle)); - if (stream) - { - const DWORD streamSize = ::SizeofResource(module, res); - output.assign(stream, streamSize); - } - } - } - } - return output; -} diff --git a/shared/dll_loader.h b/shared/dll_loader.h index 252e7598..e34fc4a9 100644 --- a/shared/dll_loader.h +++ b/shared/dll_loader.h @@ -7,7 +7,9 @@ #ifndef DLLLOADER_H_INCLUDED #define DLLLOADER_H_INCLUDED +#include <memory> #include <string> +#include "loki\ScopeGuard.h" #ifdef __WXMSW__ //we have wxWidgets #include <wx/msw/wrapwin.h> //includes "windows.h" @@ -20,13 +22,35 @@ namespace util { - /* -load function from a DLL library, e.g. from kernel32.dll -NOTE: you're allowed to take a static reference to the return value! :) +Manage DLL function and library ownership + - thread safety: like built-in type + - full value semantics + + Usage: + typedef BOOL (WINAPI *IsWow64ProcessFun)(HANDLE hProcess, PBOOL Wow64Process); + const util::DllFun<IsWow64ProcessFun> isWow64Process(L"kernel32.dll", "IsWow64Process"); + if (isWow64Process) */ -template <typename FunctionType> -FunctionType getDllFun(const std::wstring& libraryName, const std::string& functionName); + +template <class Func> +class DllFun +{ +public: + DllFun() : fun(NULL) {} + + DllFun(const wchar_t* libraryName, const char* functionName) : + hLibRef(new HMODULE(::LoadLibrary(libraryName)), deleter), + fun(*hLibRef ? reinterpret_cast<Func>(::GetProcAddress(*hLibRef, functionName)) : NULL) {} + + operator Func() const { return fun; } + +private: + static void deleter(HMODULE* ptr) { if (*ptr) ::FreeLibrary(*ptr); delete ptr; } + + std::shared_ptr<HMODULE> hLibRef; + Func fun; +}; /* extract binary resources from .exe/.dll: @@ -48,13 +72,38 @@ std::string getResourceStream(const std::wstring& libraryName, size_t resourceId -//---------------Inline Implementation--------------------------------------------------- -FARPROC loadSymbol(const std::wstring& libraryName, const std::string& functionName); -template <typename FunctionType> inline -FunctionType getDllFun(const std::wstring& libraryName, const std::string& functionName) + + + + + +//---------------Inline Implementation--------------------------------------------------- +inline +std::string getResourceStream(const wchar_t* libraryName, size_t resourceId) { - return reinterpret_cast<FunctionType>(loadSymbol(libraryName, functionName)); + std::string output; + HMODULE module = ::LoadLibrary(libraryName); + if (module) + { + LOKI_ON_BLOCK_EXIT2(::FreeLibrary(module)); + + const HRSRC res = ::FindResource(module, MAKEINTRESOURCE(resourceId), RT_RCDATA); + if (res != NULL) + { + const HGLOBAL resHandle = ::LoadResource(module, res); + if (resHandle != NULL) + { + const char* stream = static_cast<const char*>(::LockResource(resHandle)); + if (stream) + { + const DWORD streamSize = ::SizeofResource(module, res); + output.assign(stream, streamSize); + } + } + } + } + return output; } } diff --git a/shared/dst_hack.cpp b/shared/dst_hack.cpp index d52a335f..aa7a0f3e 100644 --- a/shared/dst_hack.cpp +++ b/shared/dst_hack.cpp @@ -9,6 +9,7 @@ #include <limits> #include "int64.h" #include "file_error.h" +#include "dll_loader.h" using namespace zen; @@ -78,11 +79,64 @@ bool dst::isFatDrive(const Zstring& fileName) //throw() assert(false); //shouldn't happen return false; } - const Zstring fileSystem = fsName; + //DST hack seems to be working equally well for FAT and FAT32 (in particular creation time has 10^-2 s precision as advertised) + return fsName == Zstring(L"FAT") || + fsName == Zstring(L"FAT32"); +} + + +bool dst::vistaOrLater() +{ + OSVERSIONINFO osvi = {}; + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + + //IFileOperation is supported with Vista and later + if (::GetVersionEx(&osvi)) + return osvi.dwMajorVersion > 5; + //XP has majorVersion == 5, minorVersion == 1 + //Vista has majorVersion == 6, minorVersion == 0 + //version overview: http://msdn.microsoft.com/en-us/library/ms724834(VS.85).aspx + return false; +} + +bool dst::isFatDrive(HANDLE hFile) //throw() +{ + //dynamically load windows API function + typedef BOOL (WINAPI *GetVolumeInformationByHandleWFunc)(HANDLE hFile, + LPWSTR lpVolumeNameBuffer, + DWORD nVolumeNameSize, + LPDWORD lpVolumeSerialNumber, + LPDWORD lpMaximumComponentLength, + LPDWORD lpFileSystemFlags, + LPWSTR lpFileSystemNameBuffer, + DWORD nFileSystemNameSize); + + const util::DllFun<GetVolumeInformationByHandleWFunc> getVolumeInformationByHandle(L"kernel32.dll", "GetVolumeInformationByHandleW"); + if (!getVolumeInformationByHandle) + { + assert(false); + return false; + } + + const size_t BUFFER_SIZE = MAX_PATH + 1; + wchar_t fsName[BUFFER_SIZE]; + + if (!getVolumeInformationByHandle(hFile, //__in HANDLE hFile, + NULL, //__out LPTSTR lpVolumeNameBuffer, + 0, //__in DWORD nVolumeNameSize, + NULL, //__out_opt LPDWORD lpVolumeSerialNumber, + NULL, //__out_opt LPDWORD lpMaximumComponentLength, + NULL, //__out_opt LPDWORD lpFileSystemFlags, + fsName, //__out LPTSTR lpFileSystemNameBuffer, + BUFFER_SIZE)) //__in DWORD nFileSystemNameSize + { + assert(false); //shouldn't happen + return false; + } //DST hack seems to be working equally well for FAT and FAT32 (in particular creation time has 10^-2 s precision as advertised) - return fileSystem == Zstr("FAT") || - fileSystem == Zstr("FAT32"); + return fsName == Zstring(L"FAT") || + fsName == Zstring(L"FAT32"); } @@ -244,7 +298,7 @@ std::bitset<UTC_LOCAL_OFFSET_BITS> getUtcLocalShift() const int absValue = common::abs(timeShiftQuarter); //MSVC C++0x bug: std::bitset<>(unsigned long) is ambiguous - if (std::bitset<UTC_LOCAL_OFFSET_BITS - 1>(absValue).to_ulong() != static_cast<unsigned long>(absValue) || //time shifts that big shouldn't be possible! + if (std::bitset < UTC_LOCAL_OFFSET_BITS - 1 > (absValue).to_ulong() != static_cast<unsigned long>(absValue) || //time shifts that big shouldn't be possible! timeShiftSec % (60 * 15) != 0) //all known time shift have at least 15 minute granularity! { const std::wstring errorMessage = _("Conversion error:") + " Unexpected UTC <-> local time shift: " + diff --git a/shared/dst_hack.h b/shared/dst_hack.h index 550098a2..2e25cf81 100644 --- a/shared/dst_hack.h +++ b/shared/dst_hack.h @@ -19,6 +19,8 @@ Solve DST +-1h and time zone shift issues on FAT drives */ bool isFatDrive(const Zstring& fileName); //throw () +bool isFatDrive(HANDLE hFile); //throw() -> call ONLY if vistaOrLater() == true! +bool vistaOrLater(); //all subsequent functions may throw the std::runtime_error exception! diff --git a/shared/file_handling.cpp b/shared/file_handling.cpp index 8fa8568a..c9e85c15 100644 --- a/shared/file_handling.cpp +++ b/shared/file_handling.cpp @@ -17,6 +17,7 @@ #include "assert_static.h" #include <boost/thread/tss.hpp> #include <boost/thread/once.hpp> +#include "file_id_internal.h" #ifdef FFS_WIN #include "privilege.h" @@ -98,63 +99,99 @@ bool zen::somethingExists(const Zstring& objname) //throw() check whether } -#ifdef FFS_WIN namespace { -zen::UInt64 getFileSizeSymlink(const Zstring& linkName) //throw (FileError) -{ - //open handle to target of symbolic link - const HANDLE hFile = ::CreateFile(applyLongPathPrefix(linkName).c_str(), - 0, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - NULL, - OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS, - NULL); - if (hFile == INVALID_HANDLE_VALUE) - throw FileError(_("Error reading file attributes:") + "\n\"" + linkName + "\"" + "\n\n" + getLastErrorFormatted()); - - Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hFile); - (void)dummy; //silence warning "unused variable" - - BY_HANDLE_FILE_INFORMATION fileInfo = {}; - if (!::GetFileInformationByHandle(hFile, &fileInfo)) - throw FileError(_("Error reading file attributes:") + "\n\"" + linkName + "\"" + "\n\n" + getLastErrorFormatted()); - - return UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh); -} -} -#endif - - -UInt64 zen::getFilesize(const Zstring& filename) //throw (FileError) +void getFileAttrib(const Zstring& filename, FileAttrib& attr, ProcSymlink procSl) //throw FileError { #ifdef FFS_WIN WIN32_FIND_DATA fileInfo = {}; - const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(filename).c_str(), &fileInfo); - if (searchHandle == INVALID_HANDLE_VALUE) - throw FileError(_("Error reading file attributes:") + "\n\"" + filename + "\"" + "\n\n" + getLastErrorFormatted()); - - ::FindClose(searchHandle); + { + const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(filename).c_str(), &fileInfo); + if (searchHandle == INVALID_HANDLE_VALUE) + throw FileError(_("Error reading file attributes:") + "\n\"" + filename + "\"" + "\n\n" + getLastErrorFormatted()); + ::FindClose(searchHandle); + } + // WIN32_FILE_ATTRIBUTE_DATA sourceAttr = {}; + // if (!::GetFileAttributesEx(applyLongPathPrefix(sourceObj).c_str(), //__in LPCTSTR lpFileName, + // GetFileExInfoStandard, //__in GET_FILEEX_INFO_LEVELS fInfoLevelId, + // &sourceAttr)) //__out LPVOID lpFileInformation const bool isSymbolicLink = (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0; - if (isSymbolicLink) - return getFileSizeSymlink(filename); //throw (FileError) + if (!isSymbolicLink || procSl == SYMLINK_DIRECT) + { + //####################################### DST hack ########################################### + const bool isDirectory = (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; + if (!isDirectory && dst::isFatDrive(filename)) //throw() + { + const dst::RawTime rawTime(fileInfo.ftCreationTime, fileInfo.ftLastWriteTime); + if (dst::fatHasUtcEncoded(rawTime)) //throw (std::runtime_error) + { + fileInfo.ftLastWriteTime = dst::fatDecodeUtcTime(rawTime); //return last write time in real UTC, throw (std::runtime_error) + ::GetSystemTimeAsFileTime(&fileInfo.ftCreationTime); //real creation time information is not available... + } + } + //####################################### DST hack ########################################### - return UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh); + attr.fileSize = UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh); + attr.modificationTime = toTimeT(fileInfo.ftLastWriteTime); + } + else + { + const HANDLE hFile = ::CreateFile(applyLongPathPrefix(filename).c_str(), //open handle to target of symbolic link + 0, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + 0, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, + NULL); + if (hFile == INVALID_HANDLE_VALUE) + throw FileError(_("Error reading file attributes:") + "\n\"" + filename + "\"" + "\n\n" + getLastErrorFormatted()); + LOKI_ON_BLOCK_EXIT2(::CloseHandle(hFile)); + + BY_HANDLE_FILE_INFORMATION fileInfoHnd = {}; + if (!::GetFileInformationByHandle(hFile, &fileInfoHnd)) + throw FileError(_("Error reading file attributes:") + "\n\"" + filename + "\"" + "\n\n" + getLastErrorFormatted()); + + attr.fileSize = UInt64(fileInfoHnd.nFileSizeLow, fileInfoHnd.nFileSizeHigh); + attr.modificationTime = toTimeT(fileInfoHnd.ftLastWriteTime); + } #elif defined FFS_LINUX struct stat fileInfo = {}; - if (::stat(filename.c_str(), &fileInfo) != 0) //follow symbolic links + + const int rv = procSl == SYMLINK_FOLLOW ? + :: stat(filename.c_str(), &fileInfo) : + ::lstat(filename.c_str(), &fileInfo); + if (rv != 0) //follow symbolic links throw FileError(_("Error reading file attributes:") + "\n\"" + filename + "\"" + "\n\n" + getLastErrorFormatted()); - return UInt64(fileInfo.st_size); + attr.fileSize = UInt64(fileInfo.st_size); + attr.modificationTime = fileInfo.st_mtime; #endif } +} + + +UInt64 zen::getFilesize(const Zstring& filename) //throw FileError +{ + FileAttrib attr; + getFileAttrib(filename, attr, SYMLINK_FOLLOW); //throw FileError + return attr.fileSize; +} + + +Int64 zen::getFileTime(const Zstring& filename, ProcSymlink procSl) //throw FileError +{ + FileAttrib attr; + getFileAttrib(filename, attr, procSl); //throw FileError + return attr.modificationTime; +} namespace { + + #ifdef FFS_WIN DWORD retrieveVolumeSerial(const Zstring& pathName) //return 0 on error! { @@ -218,7 +255,7 @@ zen::ResponseSame zen::onSameVolume(const Zstring& folderLeft, const Zstring& fo } -bool zen::removeFile(const Zstring& filename) //throw (FileError); +bool zen::removeFile(const Zstring& filename) //throw FileError; { #ifdef FFS_WIN //remove file, support for \\?\-prefix @@ -261,16 +298,15 @@ namespace { DEFINE_NEW_FILE_ERROR(ErrorDifferentVolume); -/* Usage overview: +/* Usage overview: (avoid circular pattern!) - renameFile() --> renameFileInternal() + renameFile() --> renameFile_sub() | /|\ \|/ | - fix8Dot3NameClash() + Fix8Dot3NameClash() */ //wrapper for file system rename function: -//throw (FileError); ErrorDifferentVolume if it is due to moving file to another volume -void renameFileInternal(const Zstring& oldName, const Zstring& newName) //throw (FileError: ErrorDifferentVolume, ErrorTargetExisting) +void renameFile_sub(const Zstring& oldName, const Zstring& newName) //throw FileError, ErrorDifferentVolume, ErrorTargetExisting { #ifdef FFS_WIN const Zstring oldNameFmt = applyLongPathPrefix(oldName); @@ -361,12 +397,12 @@ Zstring getFilenameFmt(const Zstring& filename, Function fun) //throw(); returns } -Zstring createTemp8Dot3Name(const Zstring& fileName) //find a unique 8.3 short name +Zstring findUnused8Dot3Name(const Zstring& filename) //find a unique 8.3 short name { - const Zstring pathPrefix = fileName.find(FILE_NAME_SEPARATOR) != Zstring::npos ? - (fileName.BeforeLast(FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR) : Zstring(); + const Zstring pathPrefix = filename.find(FILE_NAME_SEPARATOR) != Zstring::npos ? + (filename.BeforeLast(FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR) : Zstring(); - Zstring extension = fileName.AfterLast(FILE_NAME_SEPARATOR).AfterLast(Zchar('.')); //extension needn't contain reasonable data + Zstring extension = filename.AfterLast(FILE_NAME_SEPARATOR).AfterLast(Zchar('.')); //extension needn't contain reasonable data if (extension.empty()) extension = Zstr("FFS"); extension.Truncate(3); @@ -382,63 +418,82 @@ Zstring createTemp8Dot3Name(const Zstring& fileName) //find a unique 8.3 short n } -//try to handle issues with already existing short 8.3 file names on Windows 7 -bool fix8Dot3NameClash(const Zstring& oldName, const Zstring& newName) //throw (FileError); return "true" if rename operation succeeded +bool have8dot3NameClash(const Zstring& filename) { - using namespace zen; - - if (newName.find(FILE_NAME_SEPARATOR) == Zstring::npos) + if (filename.find(FILE_NAME_SEPARATOR) == Zstring::npos) return false; - if (somethingExists(newName)) //name OR directory! + if (somethingExists(filename)) //name OR directory! { - const Zstring fileNameOrig = newName.AfterLast(FILE_NAME_SEPARATOR); //returns the whole string if ch not found - const Zstring fileNameShort = getFilenameFmt(newName, ::GetShortPathName).AfterLast(FILE_NAME_SEPARATOR); //throw() returns empty string on error - const Zstring fileNameLong = getFilenameFmt(newName, ::GetLongPathName) .AfterLast(FILE_NAME_SEPARATOR); //throw() returns empty string on error - - if (!fileNameShort.empty() && - !fileNameLong.empty() && - EqualFilename() (fileNameOrig, fileNameShort) && - !EqualFilename()(fileNameShort, fileNameLong)) + const Zstring origName = filename.AfterLast(FILE_NAME_SEPARATOR); //returns the whole string if ch not found + const Zstring shortName = getFilenameFmt(filename, ::GetShortPathName).AfterLast(FILE_NAME_SEPARATOR); //throw() returns empty string on error + const Zstring longName = getFilenameFmt(filename, ::GetLongPathName) .AfterLast(FILE_NAME_SEPARATOR); // + + if (!shortName.empty() && + !longName.empty() && + EqualFilename()(origName, shortName) && + !EqualFilename()(shortName, longName)) { - //we detected an event where newName is in shortname format (although it is intended to be a long name) and - //writing target file failed because another unrelated file happens to have the same short name + //for filename short and long file name are equal and another unrelated file happens to have the same short name + //e.g. filename == "TESTWE~1", but another file is existing named "TestWeb" with short name ""TESTWE~1" + return true; + } + } + return false; +} - const Zstring unrelatedPathLong = newName.BeforeLast(FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR + fileNameLong; +class Fix8Dot3NameClash +{ +public: + Fix8Dot3NameClash(const Zstring& filename) + { + const Zstring longName = getFilenameFmt(filename, ::GetLongPathName).AfterLast(FILE_NAME_SEPARATOR); //throw() returns empty string on error - //find another name in short format: this ensures the actual short name WILL be renamed as well! - const Zstring parkedTarget = createTemp8Dot3Name(newName); + unrelatedFile = filename.BeforeLast(FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR + longName; - //move already existing short name out of the way for now - renameFileInternal(unrelatedPathLong, parkedTarget); //throw (FileError: ErrorDifferentVolume); - //DON'T call renameFile() to avoid reentrance! + //find another name in short format: this ensures the actual short name WILL be renamed as well! + unrelatedFileParked = findUnused8Dot3Name(filename); - //schedule cleanup; the file system should assign this unrelated file a new (unique) short name - Loki::ScopeGuard guard = Loki::MakeGuard(renameFileInternal, parkedTarget, unrelatedPathLong);//equivalent to Boost.ScopeExit in this case - (void)guard; //silence warning "unused variable" + //move already existing short name out of the way for now + renameFile_sub(unrelatedFile, unrelatedFileParked); //throw FileError, ErrorDifferentVolume + //DON'T call renameFile() to avoid reentrance! + } - renameFileInternal(oldName, newName); //the short filename name clash is solved, this should work now - return true; + ~Fix8Dot3NameClash() + { + //the file system should assign this unrelated file a new (unique) short name + try + { + renameFile_sub(unrelatedFileParked, unrelatedFile); //throw FileError, ErrorDifferentVolume } + catch (...) {} } - return false; //issue not fixed -} +private: + Zstring unrelatedFile; + Zstring unrelatedFileParked; +}; #endif } //rename file: no copying!!! -void zen::renameFile(const Zstring& oldName, const Zstring& newName) //throw (FileError: ErrorDifferentVolume, ErrorTargetExisting); +void zen::renameFile(const Zstring& oldName, const Zstring& newName) //throw FileError, ErrorDifferentVolume, ErrorTargetExisting { try { - renameFileInternal(oldName, newName); //throw (FileError: ErrorDifferentVolume, ErrorTargetExisting) + renameFile_sub(oldName, newName); //throw FileError, ErrorDifferentVolume, ErrorTargetExisting } catch (const FileError&) { #ifdef FFS_WIN - if (fix8Dot3NameClash(oldName, newName)) //throw (FileError); try to handle issues with already existing short 8.3 file names on Windows 7 + //try to handle issues with already existing short 8.3 file names on Windows + if (have8dot3NameClash(newName)) + { + Fix8Dot3NameClash dummy(newName); //move clashing filename to the side + //now try again... + renameFile_sub(oldName, newName); //throw FileError return; + } #endif throw; } @@ -458,12 +513,15 @@ public: } private: + CopyCallbackImpl(const CopyCallbackImpl&); + CopyCallbackImpl& operator=(const CopyCallbackImpl&); + const Zstring sourceFile_; CallbackMoveFile& moveCallback; }; -void zen::moveFile(const Zstring& sourceFile, const Zstring& targetFile, bool ignoreExisting, CallbackMoveFile* callback) //throw (FileError); +void zen::moveFile(const Zstring& sourceFile, const Zstring& targetFile, bool ignoreExisting, CallbackMoveFile* callback) //throw FileError; { //call back once per file (moveFile() is called by moveDirectory()) if (callback) @@ -480,24 +538,24 @@ void zen::moveFile(const Zstring& sourceFile, const Zstring& targetFile, bool ig //try to move the file directly without copying try { - renameFile(sourceFile, targetFile); //throw (FileError: ErrorDifferentVolume); + renameFile(sourceFile, targetFile); //throw FileError, ErrorDifferentVolume return; //great, we get away cheaply! } //if moving failed treat as error (except when it tried to move to a different volume: in this case we will copy the file) catch (const ErrorDifferentVolume&) {} //file is on a different volume: let's copy it - std::auto_ptr<CopyCallbackImpl> copyCallback(callback != NULL ? new CopyCallbackImpl(sourceFile, *callback) : NULL); + std::unique_ptr<CopyCallbackImpl> copyCallback(callback != NULL ? new CopyCallbackImpl(sourceFile, *callback) : NULL); if (symlinkExists(sourceFile)) - copySymlink(sourceFile, targetFile, SYMLINK_TYPE_FILE, false); //throw (FileError) dont copy filesystem permissions + copySymlink(sourceFile, targetFile, false); //throw FileError; don't copy filesystem permissions else - copyFile(sourceFile, targetFile, false, true, copyCallback.get()); //throw (FileError); + copyFile(sourceFile, targetFile, false, true, copyCallback.get()); //throw FileError; //attention: if copy-operation was cancelled an exception is thrown => sourcefile is not deleted, as we wish! } - removeFile(sourceFile); //throw (FileError) + removeFile(sourceFile); //throw FileError //note: copying file is NOT undone in case of exception: currently this function is called in context of user-defined deletion dir, where this behavior is fine } @@ -535,6 +593,9 @@ public: virtual HandleError onError(const std::wstring& errorText) { throw FileError(errorText); } private: + TraverseOneLevel(const TraverseOneLevel&); + TraverseOneLevel& operator=(const TraverseOneLevel&); + NameList& files_; NameList& dirs_; }; @@ -547,22 +608,21 @@ struct RemoveCallbackImpl : public CallbackRemoveDir sourceDir_(sourceDir), moveCallback_(moveCallback) {} - virtual void notifyDeletion(const Zstring& currentObject) - { - moveCallback_.requestUiRefresh(sourceDir_); - } + virtual void notifyFileDeletion(const Zstring& filename) { moveCallback_.requestUiRefresh(sourceDir_); } + virtual void notifyDirDeletion(const Zstring& dirname) { moveCallback_.requestUiRefresh(sourceDir_); } private: + RemoveCallbackImpl(const RemoveCallbackImpl&); + RemoveCallbackImpl& operator=(const RemoveCallbackImpl&); + const Zstring sourceDir_; CallbackMoveFile& moveCallback_; }; } -void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool ignoreExisting, CallbackMoveFile* callback) //throw (FileError); +void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool ignoreExisting, CallbackMoveFile* callback) //throw FileError; { - using namespace zen; - //call back once per folder if (callback) callback->requestUiRefresh(sourceDir); @@ -580,7 +640,7 @@ void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool //first try to move the directory directly without copying try { - renameFile(sourceDir, targetDir); //throw (FileError: ErrorDifferentVolume, ErrorTargetExisting); + renameFile(sourceDir, targetDir); //throw FileError, ErrorDifferentVolume, ErrorTargetExisting return; //great, we get away cheaply! } //if moving failed treat as error (except when it tried to move to a different volume: in this case we will copy the directory) @@ -588,9 +648,9 @@ void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool //create target if (isSymlink) - copySymlink(sourceDir, targetDir, SYMLINK_TYPE_DIR, false); //throw (FileError) -> don't copy permissions + copySymlink(sourceDir, targetDir, false); //throw FileError -> don't copy permissions else - createDirectory(targetDir, sourceDir, false); //throw (FileError) + createDirectory(targetDir, sourceDir, false); //throw FileError } if (!isSymlink) //handle symbolic links @@ -609,7 +669,7 @@ void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool //move files for (TraverseOneLevel::NameList::const_iterator i = fileList.begin(); i != fileList.end(); ++i) - moveFile(i->second, targetDirFormatted + i->first, ignoreExisting, callback); //throw (FileError: ErrorTargetExisting); + moveFile(i->second, targetDirFormatted + i->first, ignoreExisting, callback); //throw FileError, ErrorTargetExisting //move directories for (TraverseOneLevel::NameList::const_iterator i = dirList.begin(); i != dirList.end(); ++i) @@ -619,12 +679,12 @@ void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, bool } //delete source - std::auto_ptr<RemoveCallbackImpl> removeCallback(callback != NULL ? new RemoveCallbackImpl(sourceDir, *callback) : NULL); - removeDirectory(sourceDir, removeCallback.get()); //throw (FileError); + std::unique_ptr<RemoveCallbackImpl> removeCallback(callback != NULL ? new RemoveCallbackImpl(sourceDir, *callback) : NULL); + removeDirectory(sourceDir, removeCallback.get()); //throw FileError; } -void zen::moveDirectory(const Zstring& sourceDir, const Zstring& targetDir, bool ignoreExisting, CallbackMoveFile* callback) //throw (FileError); +void zen::moveDirectory(const Zstring& sourceDir, const Zstring& targetDir, bool ignoreExisting, CallbackMoveFile* callback) //throw FileError; { #ifdef FFS_WIN const Zstring& sourceDirFormatted = sourceDir; @@ -671,6 +731,9 @@ public: virtual HandleError onError(const std::wstring& errorText) { throw FileError(errorText); } private: + FilesDirsOnlyTraverser(const FilesDirsOnlyTraverser&); + FilesDirsOnlyTraverser& operator=(const FilesDirsOnlyTraverser&); + std::vector<Zstring>& m_files; std::vector<Zstring>& m_dirs; }; @@ -699,7 +762,8 @@ void zen::removeDirectory(const Zstring& directory, CallbackRemoveDir* callback) #endif throw FileError(_("Error deleting directory:") + "\n\"" + directory + "\"" + "\n\n" + getLastErrorFormatted()); - if (callback) callback->notifyDeletion(directory); //once per symlink + if (callback) + callback->notifyDirDeletion(directory); //once per symlink return; } @@ -714,7 +778,8 @@ void zen::removeDirectory(const Zstring& directory, CallbackRemoveDir* callback) for (std::vector<Zstring>::const_iterator i = fileList.begin(); i != fileList.end(); ++i) { const bool workDone = removeFile(*i); - if (callback && workDone) callback->notifyDeletion(*i); //call once per file + if (callback && workDone) + callback->notifyFileDeletion(*i); //call once per file } //delete directories recursively @@ -730,76 +795,25 @@ void zen::removeDirectory(const Zstring& directory, CallbackRemoveDir* callback) { throw FileError(_("Error deleting directory:") + "\n\"" + directory + "\"" + "\n\n" + getLastErrorFormatted()); } - if (callback) callback->notifyDeletion(directory); //and once per folder + if (callback) + callback->notifyDirDeletion(directory); //and once per folder } -void zen::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, bool deRefSymlinks) //throw (FileError) +void zen::setFileTime(const Zstring& filename, const Int64& modificationTime, ProcSymlink procSl) //throw FileError { #ifdef FFS_WIN - FILETIME creationTime = {}; - FILETIME lastWriteTime = {}; + FILETIME creationTime = {}; + FILETIME lastWriteTime = tofiletime(modificationTime); + //####################################### DST hack ########################################### + if (dst::isFatDrive(filename)) //throw() { - WIN32_FILE_ATTRIBUTE_DATA sourceAttr = {}; - if (!::GetFileAttributesEx(applyLongPathPrefix(sourceObj).c_str(), //__in LPCTSTR lpFileName, - GetFileExInfoStandard, //__in GET_FILEEX_INFO_LEVELS fInfoLevelId, - &sourceAttr)) //__out LPVOID lpFileInformation - throw FileError(_("Error reading file attributes:") + "\n\"" + sourceObj + "\"" + "\n\n" + getLastErrorFormatted()); - - const bool isReparsePoint = (sourceAttr.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0; - const bool isDirectory = (sourceAttr.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; - - if (isReparsePoint && deRefSymlinks) //we have a symlink AND need to dereference... - { - HANDLE hSource = ::CreateFile(applyLongPathPrefix(sourceObj).c_str(), - FILE_READ_ATTRIBUTES, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - NULL, - OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS, //needed to open a directory; no FILE_FLAG_OPEN_REPARSE_POINT => deref symlinks - NULL); - if (hSource == INVALID_HANDLE_VALUE) - throw FileError(_("Error reading file attributes:") + "\n\"" + sourceObj + "\"" + "\n\n" + getLastErrorFormatted()); - - Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hSource); - (void)dummy; //silence warning "unused variable" - - if (!::GetFileTime(hSource, //__in HANDLE hFile, - &creationTime, //__out_opt LPFILETIME lpCreationTime, - NULL, //__out_opt LPFILETIME lpLastAccessTime, - &lastWriteTime)) //__out_opt LPFILETIME lpLastWriteTime - throw FileError(_("Error reading file attributes:") + "\n\"" + sourceObj + "\"" + "\n\n" + getLastErrorFormatted()); - } - else - { - creationTime = sourceAttr.ftCreationTime; - lastWriteTime = sourceAttr.ftLastWriteTime; - } - - //####################################### DST hack ########################################### - if (!isDirectory) //dst hack not (yet) required for directories (symlinks implicitly checked by isFatDrive()) - { - if (dst::isFatDrive(sourceObj)) //throw() - { - const dst::RawTime rawTime(creationTime, lastWriteTime); - if (dst::fatHasUtcEncoded(rawTime)) //throw (std::runtime_error) - { - lastWriteTime = dst::fatDecodeUtcTime(rawTime); //return last write time in real UTC, throw (std::runtime_error) - ::GetSystemTimeAsFileTime(&creationTime); //real creation time information is not available... - } - } - - if (dst::isFatDrive(targetObj)) //throw() - { - const dst::RawTime encodedTime = dst::fatEncodeUtcTime(lastWriteTime); //throw (std::runtime_error) - creationTime = encodedTime.createTimeRaw; - lastWriteTime = encodedTime.writeTimeRaw; - } - } - //####################################### DST hack ########################################### + const dst::RawTime encodedTime = dst::fatEncodeUtcTime(lastWriteTime); //throw (std::runtime_error) + creationTime = encodedTime.createTimeRaw; + lastWriteTime = encodedTime.writeTimeRaw; } - + //####################################### DST hack ########################################### //privilege SE_BACKUP_NAME doesn't seem to be required here for symbolic links //note: setting privileges requires admin rights! @@ -815,20 +829,20 @@ void zen::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, bool */ //may need to remove the readonly-attribute (e.g. FAT usb drives) - FileUpdateHandle targetHandle(targetObj, [=]() + FileUpdateHandle targetHandle(filename, [ = ]() { - return ::CreateFile(applyLongPathPrefix(targetObj).c_str(), - FILE_GENERIC_WRITE, //ATTENTION: although FILE_WRITE_ATTRIBUTES should(!) be sufficient, this may leads to access denied on NAS shares, unless we specify FILE_GENERIC_WRITE + return ::CreateFile(applyLongPathPrefix(filename).c_str(), + GENERIC_READ | GENERIC_WRITE, //use both when writing over network, see comment in file_io.cpp FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - NULL, + 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | //needed to open a directory - (deRefSymlinks ? 0 : FILE_FLAG_OPEN_REPARSE_POINT), //process symlinks + (procSl == SYMLINK_DIRECT ? FILE_FLAG_OPEN_REPARSE_POINT : 0), //process symlinks NULL); }); if (targetHandle.get() == INVALID_HANDLE_VALUE) - throw FileError(_("Error changing modification time:") + "\n\"" + targetObj + "\"" + "\n\n" + getLastErrorFormatted()); + throw FileError(_("Error changing modification time:") + "\n\"" + filename + "\"" + "\n\n" + getLastErrorFormatted()); /* if (hTarget == INVALID_HANDLE_VALUE && ::GetLastError() == ERROR_SHARING_VIOLATION) @@ -838,17 +852,19 @@ void zen::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, bool } */ + auto isNullTime = [](const FILETIME & ft) { return ft.dwLowDateTime == 0 && ft.dwHighDateTime == 0; }; + if (!::SetFileTime(targetHandle.get(), - &creationTime, + isNullTime(creationTime) ? NULL : &creationTime, NULL, &lastWriteTime)) - throw FileError(_("Error changing modification time:") + "\n\"" + targetObj + "\"" + "\n\n" + getLastErrorFormatted()); + throw FileError(_("Error changing modification time:") + "\n\"" + filename + "\"" + "\n\n" + getLastErrorFormatted()); #ifndef NDEBUG //dst hack: verify data written - if (dst::isFatDrive(targetObj) && !dirExists(targetObj)) //throw() + if (dst::isFatDrive(filename) && !dirExists(filename)) //throw() { WIN32_FILE_ATTRIBUTE_DATA debugeAttr = {}; - assert(::GetFileAttributesEx(applyLongPathPrefix(targetObj).c_str(), //__in LPCTSTR lpFileName, + assert(::GetFileAttributesEx(applyLongPathPrefix(filename).c_str(), //__in LPCTSTR lpFileName, GetFileExInfoStandard, //__in GET_FILEEX_INFO_LEVELS fInfoLevelId, &debugeAttr)); //__out LPVOID lpFileInformation @@ -858,35 +874,27 @@ void zen::copyFileTimes(const Zstring& sourceObj, const Zstring& targetObj, bool #endif #elif defined FFS_LINUX - if (deRefSymlinks) + if (procSl == SYMLINK_FOLLOW) { - struct stat objInfo = {}; - if (::stat(sourceObj.c_str(), &objInfo) != 0) //read file attributes from source directory - throw FileError(_("Error reading file attributes:") + "\n\"" + sourceObj + "\"" + "\n\n" + getLastErrorFormatted()); - struct utimbuf newTimes = {}; - newTimes.actime = objInfo.st_atime; - newTimes.modtime = objInfo.st_mtime; + newTimes.actime = ::time(NULL); + newTimes.modtime = to<time_t>(modificationTime); - //(try to) set new "last write time" - if (::utime(targetObj.c_str(), &newTimes) != 0) //return value not evaluated! - throw FileError(_("Error changing modification time:") + "\n\"" + targetObj + "\"" + "\n\n" + getLastErrorFormatted()); + // set new "last write time" + if (::utime(filename.c_str(), &newTimes) != 0) + throw FileError(_("Error changing modification time:") + "\n\"" + filename + "\"" + "\n\n" + getLastErrorFormatted()); } else { - struct stat objInfo = {}; - if (::lstat(sourceObj.c_str(), &objInfo) != 0) //read file attributes from source directory - throw FileError(_("Error reading file attributes:") + "\n\"" + sourceObj + "\"" + "\n\n" + getLastErrorFormatted()); - struct timeval newTimes[2] = {}; - newTimes[0].tv_sec = objInfo.st_atime; /* seconds */ - newTimes[0].tv_usec = 0; /* microseconds */ + newTimes[0].tv_sec = ::time(NULL); /* seconds */ + newTimes[0].tv_usec = 0; /* microseconds */ - newTimes[1].tv_sec = objInfo.st_mtime; /* seconds */ - newTimes[1].tv_usec = 0; /* microseconds */ + newTimes[1].tv_sec = to<time_t>(modificationTime); + newTimes[1].tv_usec = 0; - if (::lutimes(targetObj.c_str(), newTimes) != 0) //return value not evaluated! - throw FileError(_("Error changing modification time:") + "\n\"" + targetObj + "\"" + "\n\n" + getLastErrorFormatted()); + if (::lutimes(filename.c_str(), newTimes) != 0) + throw FileError(_("Error changing modification time:") + "\n\"" + filename + "\"" + "\n\n" + getLastErrorFormatted()); } #endif } @@ -901,56 +909,50 @@ Zstring resolveDirectorySymlink(const Zstring& dirLinkName) //get full target pa const HANDLE hDir = ::CreateFile(applyLongPathPrefix(dirLinkName).c_str(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - NULL, + 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, //needed to open a directory NULL); if (hDir == INVALID_HANDLE_VALUE) throw FileError(_("Error resolving symbolic link:") + "\n\"" + dirLinkName + "\"" + "\n\n" + getLastErrorFormatted()); + LOKI_ON_BLOCK_EXIT2(::CloseHandle(hDir)); - Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hDir); - (void)dummy; //silence warning "unused variable" - - const size_t BUFFER_SIZE = 10000; - TCHAR targetPath[BUFFER_SIZE]; + const DWORD BUFFER_SIZE = 10000; + std::vector<wchar_t> targetPath(BUFFER_SIZE); //dynamically load windows API function - typedef DWORD (WINAPI *GetFinalPathNameByHandleWFunc)( - HANDLE hFile, - LPTSTR lpszFilePath, - DWORD cchFilePath, - DWORD dwFlags); - const GetFinalPathNameByHandleWFunc getFinalPathNameByHandle = - util::getDllFun<GetFinalPathNameByHandleWFunc>(L"kernel32.dll", "GetFinalPathNameByHandleW"); - - if (getFinalPathNameByHandle == NULL) + typedef DWORD (WINAPI *GetFinalPathNameByHandleWFunc)(HANDLE hFile, + LPTSTR lpszFilePath, + DWORD cchFilePath, + DWORD dwFlags); + const util::DllFun<GetFinalPathNameByHandleWFunc> getFinalPathNameByHandle(L"kernel32.dll", "GetFinalPathNameByHandleW"); + if (!getFinalPathNameByHandle) throw FileError(_("Error loading library function:") + "\n\"" + "GetFinalPathNameByHandleW" + "\""); - const DWORD rv = getFinalPathNameByHandle( - hDir, //__in HANDLE hFile, - targetPath, //__out LPTSTR lpszFilePath, - BUFFER_SIZE,//__in DWORD cchFilePath, - 0); //__in DWORD dwFlags - if (rv >= BUFFER_SIZE || rv == 0) + const DWORD charsWritten = getFinalPathNameByHandle(hDir, //__in HANDLE hFile, + &targetPath[0], //__out LPTSTR lpszFilePath, + BUFFER_SIZE, //__in DWORD cchFilePath, + FILE_NAME_NORMALIZED); //__in DWORD dwFlags + if (charsWritten >= BUFFER_SIZE || charsWritten == 0) { std::wstring errorMessage = _("Error resolving symbolic link:") + "\n\"" + dirLinkName + "\""; - if (rv == 0) + if (charsWritten == 0) errorMessage += L"\n\n" + getLastErrorFormatted(); throw FileError(errorMessage); } - return targetPath; + return Zstring(&targetPath[0], charsWritten); } #endif #ifdef HAVE_SELINUX //copy SELinux security context -void copySecurityContext(const Zstring& source, const Zstring& target, bool derefSymlinks) //throw (FileError) +void copySecurityContext(const Zstring& source, const Zstring& target, ProcSymlink procSl) //throw FileError { security_context_t contextSource = NULL; - const int rv = derefSymlinks ? - ::getfilecon (source.c_str(), &contextSource) : + const int rv = procSl == SYMLINK_FOLLOW ? + ::getfilecon(source.c_str(), &contextSource) : ::lgetfilecon(source.c_str(), &contextSource); if (rv < 0) { @@ -960,13 +962,12 @@ void copySecurityContext(const Zstring& source, const Zstring& target, bool dere throw FileError(_("Error reading security context:") + "\n\"" + source + "\"" + "\n\n" + getLastErrorFormatted()); } - Loki::ScopeGuard dummy1 = Loki::MakeGuard(::freecon, contextSource); - (void)dummy1; //silence warning "unused variable" + LOKI_ON_BLOCK_EXIT2(::freecon(contextSource)); { security_context_t contextTarget = NULL; - const int rv2 = derefSymlinks ? - ::getfilecon (target.c_str(), &contextTarget) : + const int rv2 = procSl == SYMLINK_FOLLOW ? + ::getfilecon(target.c_str(), &contextTarget) : ::lgetfilecon(target.c_str(), &contextTarget); if (rv2 < 0) { @@ -976,16 +977,15 @@ void copySecurityContext(const Zstring& source, const Zstring& target, bool dere } else { - Loki::ScopeGuard dummy2 = Loki::MakeGuard(::freecon, contextTarget); - (void)dummy2; //silence warning "unused variable" + LOKI_ON_BLOCK_EXIT2(::freecon(contextTarget)); if (::strcmp(contextSource, contextTarget) == 0) //nothing to do return; } } - const int rv3 = derefSymlinks ? - ::setfilecon (target.c_str(), contextSource) : + const int rv3 = procSl == SYMLINK_FOLLOW ? + ::setfilecon(target.c_str(), contextSource) : ::lsetfilecon(target.c_str(), contextSource); if (rv3 < 0) throw FileError(_("Error writing security context:") + "\n\"" + target + "\"" + "\n\n" + getLastErrorFormatted()); @@ -994,7 +994,7 @@ void copySecurityContext(const Zstring& source, const Zstring& target, bool dere //copy permissions for files, directories or symbolic links: requires admin rights -void copyObjectPermissions(const Zstring& source, const Zstring& target, bool derefSymlinks) //throw (FileError); +void copyObjectPermissions(const Zstring& source, const Zstring& target, ProcSymlink procSl) //throw FileError; { #ifdef FFS_WIN //setting privileges requires admin rights! @@ -1024,15 +1024,13 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de const HANDLE hSource = ::CreateFile(applyLongPathPrefix(source).c_str(), READ_CONTROL | ACCESS_SYSTEM_SECURITY, //ACCESS_SYSTEM_SECURITY required for SACL access FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - NULL, + 0, OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS | (derefSymlinks ? 0 : FILE_FLAG_OPEN_REPARSE_POINT), //FILE_FLAG_BACKUP_SEMANTICS needed to open a directory + FILE_FLAG_BACKUP_SEMANTICS | (procSl == SYMLINK_DIRECT ? FILE_FLAG_OPEN_REPARSE_POINT : 0), //FILE_FLAG_BACKUP_SEMANTICS needed to open a directory NULL); if (hSource == INVALID_HANDLE_VALUE) throw FileError(_("Error copying file permissions:") + "\n\"" + source + "\" ->\n\"" + target + "\"" + "\n\n" + getLastErrorFormatted() + " (OR)"); - - Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hSource); - (void)dummy; //silence warning "unused variable" + LOKI_ON_BLOCK_EXIT2(::CloseHandle(hSource)); // DWORD rc = ::GetNamedSecurityInfo(const_cast<WCHAR*>(applyLongPathPrefix(source).c_str()), -> does NOT dereference symlinks! DWORD rc = ::GetSecurityInfo(hSource, //__in LPTSTR pObjectName, @@ -1045,20 +1043,17 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de &buffer); //__out_opt PSECURITY_DESCRIPTOR *ppSecurityDescriptor if (rc != ERROR_SUCCESS) throw FileError(_("Error copying file permissions:") + "\n\"" + source + "\" ->\n\"" + target + "\"" + "\n\n" + getLastErrorFormatted(rc) + " (R)"); - - Loki::ScopeGuard dummy4 = Loki::MakeGuard(::LocalFree, buffer); - (void)dummy4; //silence warning "unused variable" - + LOKI_ON_BLOCK_EXIT2(::LocalFree(buffer)); //may need to remove the readonly-attribute (e.g. FAT usb drives) - FileUpdateHandle targetHandle(target, [=]() + FileUpdateHandle targetHandle(target, [ = ]() { - return ::CreateFile(applyLongPathPrefix(target).c_str(), // lpFileName - FILE_GENERIC_WRITE | WRITE_OWNER | WRITE_DAC | ACCESS_SYSTEM_SECURITY, // dwDesiredAccess: all four seem to be required!!! - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, // dwShareMode - NULL, // lpSecurityAttributes + return ::CreateFile(applyLongPathPrefix(target).c_str(), // lpFileName + GENERIC_WRITE | WRITE_OWNER | WRITE_DAC | ACCESS_SYSTEM_SECURITY, // dwDesiredAccess: all four seem to be required!!! + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, // dwShareMode + 0, // lpSecurityAttributes OPEN_EXISTING, // dwCreationDisposition - FILE_FLAG_BACKUP_SEMANTICS | (derefSymlinks ? 0 : FILE_FLAG_OPEN_REPARSE_POINT), // dwFlagsAndAttributes + FILE_FLAG_BACKUP_SEMANTICS | (procSl == SYMLINK_DIRECT ? FILE_FLAG_OPEN_REPARSE_POINT : 0), // dwFlagsAndAttributes NULL); // hTemplateFile }); @@ -1066,14 +1061,13 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de throw FileError(_("Error copying file permissions:") + "\n\"" + source + "\" ->\n\"" + target + "\"" + "\n\n" + getLastErrorFormatted() + " (OW)"); // rc = ::SetNamedSecurityInfo(const_cast<WCHAR*>(applyLongPathPrefix(target).c_str()), //__in LPTSTR pObjectName, -> does NOT dereference symlinks! - rc = ::SetSecurityInfo( - targetHandle.get(), //__in LPTSTR pObjectName, - SE_FILE_OBJECT, //__in SE_OBJECT_TYPE ObjectType, - OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION, //__in SECURITY_INFORMATION SecurityInfo, - owner, //__in_opt PSID psidOwner, - group, //__in_opt PSID psidGroup, - dacl, //__in_opt PACL pDacl, - sacl); //__in_opt PACL pSacl + rc = ::SetSecurityInfo(targetHandle.get(), //__in LPTSTR pObjectName, + SE_FILE_OBJECT, //__in SE_OBJECT_TYPE ObjectType, + OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION, //__in SECURITY_INFORMATION SecurityInfo, + owner, //__in_opt PSID psidOwner, + group, //__in_opt PSID psidGroup, + dacl, //__in_opt PACL pDacl, + sacl); //__in_opt PACL pSacl if (rc != ERROR_SUCCESS) throw FileError(_("Error copying file permissions:") + "\n\"" + source + "\" ->\n\"" + target + "\"" + "\n\n" + getLastErrorFormatted(rc) + " (W)"); @@ -1081,21 +1075,20 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de #elif defined FFS_LINUX #ifdef HAVE_SELINUX //copy SELinux security context - copySecurityContext(source, target, derefSymlinks); //throw (FileError) + copySecurityContext(source, target, procSl); //throw FileError #endif - if (derefSymlinks) + struct stat fileInfo = {}; + if (procSl == SYMLINK_FOLLOW) { - struct stat fileInfo = {}; - if (::stat (source.c_str(), &fileInfo) != 0 || + if (::stat(source.c_str(), &fileInfo) != 0 || ::chown(target.c_str(), fileInfo.st_uid, fileInfo.st_gid) != 0 || // may require admin rights! ::chmod(target.c_str(), fileInfo.st_mode) != 0) throw FileError(_("Error copying file permissions:") + "\n\"" + source + "\" ->\n\"" + target + "\"" + "\n\n" + getLastErrorFormatted() + " (R)"); } else { - struct stat fileInfo = {}; - if (::lstat (source.c_str(), &fileInfo) != 0 || + if (::lstat(source.c_str(), &fileInfo) != 0 || ::lchown(target.c_str(), fileInfo.st_uid, fileInfo.st_gid) != 0 || // may require admin rights! (!symlinkExists(target) && ::chmod(target.c_str(), fileInfo.st_mode) != 0)) //setting access permissions doesn't make sense for symlinks on Linux: there is no lchmod() throw FileError(_("Error copying file permissions:") + "\n\"" + source + "\" ->\n\"" + target + "\"" + "\n\n" + getLastErrorFormatted() + " (W)"); @@ -1104,35 +1097,8 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, bool de } -namespace -{ -//provide uniform binary interface: -void removeDirSimple(const Zstring& directory) { removeDirectory(directory); } //throw (FileError) -void removeFileSimple(const Zstring& filename) { removeFile(filename); } //throw (FileError) -} - - -void createDirectoryRecursively(const Zstring& directory, const Zstring& templateDir, bool copyFilePermissions, int level) +void createDirectory_straight(const Zstring& directory, const Zstring& templateDir, bool copyFilePermissions, int level) { - using namespace zen; - - if (dirExists(directory)) - return; - - if (level == 100) //catch endless recursion - return; - - //try to create parent folders first - const Zstring dirParent = directory.BeforeLast(FILE_NAME_SEPARATOR); - if (!dirParent.empty() && !dirExists(dirParent)) - { - //call function recursively - const Zstring templateParent = templateDir.BeforeLast(FILE_NAME_SEPARATOR); - createDirectoryRecursively(dirParent, templateParent, copyFilePermissions, level + 1); - } - - //now creation should be possible - //default directory creation #ifdef FFS_WIN //don't use ::CreateDirectoryEx: @@ -1159,11 +1125,11 @@ void createDirectoryRecursively(const Zstring& directory, const Zstring& templat try { //get target directory of symbolic link - sourcePath = resolveDirectorySymlink(templateDir); //throw (FileError) + sourcePath = resolveDirectorySymlink(templateDir); //throw FileError } catch (FileError&) {} //dereferencing a symbolic link usually fails if it is located on network drive or client is XP: NOT really an error... } - else //no symbolic link + else //no symbolic link sourcePath = templateDir; //try to copy file attributes @@ -1185,14 +1151,13 @@ void createDirectoryRecursively(const Zstring& directory, const Zstring& templat HANDLE hDir = ::CreateFile(applyLongPathPrefix(directory).c_str(), GENERIC_READ | GENERIC_WRITE, //read access required for FSCTL_SET_COMPRESSION FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - NULL, + 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (hDir != INVALID_HANDLE_VALUE) { - Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hDir); - (void)dummy; //silence warning "unused variable" + LOKI_ON_BLOCK_EXIT2(::CloseHandle(hDir)); USHORT cmpState = COMPRESSION_FORMAT_DEFAULT; @@ -1210,23 +1175,51 @@ void createDirectoryRecursively(const Zstring& directory, const Zstring& templat } } #endif - - //try to copy file times: NOT mission critical for a directory, since modification time is changed on each added, deleted file, however creation time will stay - try - { - copyFileTimes(templateDir, directory, true); //throw (FileError) - } - catch (FileError&) {} - - Loki::ScopeGuard guardNewDir = Loki::MakeGuard(&removeDirSimple, directory); //ensure cleanup: + Loki::ScopeGuard guardNewDir = Loki::MakeGuard([&]() { removeDirectory(directory); }); //ensure cleanup: //enforce copying file permissions: it's advertized on GUI... if (copyFilePermissions) - copyObjectPermissions(templateDir, directory, true); //throw (FileError) + copyObjectPermissions(templateDir, directory, SYMLINK_FOLLOW); //throw FileError guardNewDir.Dismiss(); //target has been created successfully! } } + + +void createDirectoryRecursively(const Zstring& directory, const Zstring& templateDir, bool copyFilePermissions, int level) +{ + if (level == 100) //catch endless recursion + return; + +#ifdef FFS_WIN + std::unique_ptr<Fix8Dot3NameClash> fnc; + if (somethingExists(directory)) + { + //handle issues with already existing short 8.3 file names on Windows + if (have8dot3NameClash(directory)) + fnc.reset(new Fix8Dot3NameClash(directory)); //move clashing object to the side + else if (dirExists(directory)) + return; + } +#elif defined FFS_LINUX + if (dirExists(directory)) + return; +#endif + else //if "somethingExists" we needn't create the parent directory + { + //try to create parent folders first + const Zstring dirParent = directory.BeforeLast(FILE_NAME_SEPARATOR); + if (!dirParent.empty() && !dirExists(dirParent)) + { + //call function recursively + const Zstring templateParent = templateDir.BeforeLast(FILE_NAME_SEPARATOR); //returns empty string if ch not found + createDirectoryRecursively(dirParent, templateParent, copyFilePermissions, level + 1); + } + } + + //now creation should be possible + createDirectory_straight(directory, templateDir, copyFilePermissions, level); //throw FileError +} } @@ -1251,38 +1244,51 @@ void zen::createDirectory(const Zstring& directory) } -void zen::copySymlink(const Zstring& sourceLink, const Zstring& targetLink, zen::SymlinkType type, bool copyFilePermissions) //throw (FileError) +void zen::copySymlink(const Zstring& sourceLink, const Zstring& targetLink, bool copyFilePermissions) //throw FileError { - const Zstring linkPath = getSymlinkRawTargetString(sourceLink); //accept broken symlinks; throw (FileError) + const Zstring linkPath = getSymlinkRawTargetString(sourceLink); //accept broken symlinks; throw FileError #ifdef FFS_WIN + const bool isDirLink = [&]() -> bool + { + const DWORD ret = ::GetFileAttributes(applyLongPathPrefix(sourceLink).c_str()); + return ret != INVALID_FILE_ATTRIBUTES && (ret& FILE_ATTRIBUTE_DIRECTORY); + }(); + //dynamically load windows API function typedef BOOLEAN (WINAPI *CreateSymbolicLinkFunc)(LPCTSTR lpSymlinkFileName, LPCTSTR lpTargetFileName, DWORD dwFlags); - const CreateSymbolicLinkFunc createSymbolicLink = util::getDllFun<CreateSymbolicLinkFunc>(L"kernel32.dll", "CreateSymbolicLinkW"); - if (createSymbolicLink == NULL) - throw FileError(_("Error loading library function:") + "\n\"" + "CreateSymbolicLinkW" + "\""); - if (!createSymbolicLink( //seems no long path prefix is required... - targetLink.c_str(), //__in LPTSTR lpSymlinkFileName, - linkPath.c_str(), //__in LPTSTR lpTargetFileName, - (type == SYMLINK_TYPE_DIR ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0))) //__in DWORD dwFlags - throw FileError(_("Error copying symbolic link:") + "\n\"" + sourceLink + "\" ->\n\"" + targetLink + "\"" + "\n\n" + getLastErrorFormatted()); + const util::DllFun<CreateSymbolicLinkFunc> createSymbolicLink(L"kernel32.dll", "CreateSymbolicLinkW"); + if (!createSymbolicLink) + throw FileError(_("Error loading library function:") + "\n\"" + "CreateSymbolicLinkW" + "\""); + if (!createSymbolicLink(targetLink.c_str(), //__in LPTSTR lpSymlinkFileName, - seems no long path prefix is required... + linkPath.c_str(), //__in LPTSTR lpTargetFileName, + (isDirLink ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0))) //__in DWORD dwFlags #elif defined FFS_LINUX if (::symlink(linkPath.c_str(), targetLink.c_str()) != 0) - throw FileError(_("Error copying symbolic link:") + "\n\"" + sourceLink + "\" ->\n\"" + targetLink + "\"" + "\n\n" + getLastErrorFormatted()); #endif + throw FileError(_("Error copying symbolic link:") + "\n\"" + sourceLink + "\" ->\n\"" + targetLink + "\"" + "\n\n" + getLastErrorFormatted()); //allow only consistent objects to be created -> don't place before ::symlink, targetLink may already exist - Loki::ScopeGuard guardNewDir = type == SYMLINK_TYPE_DIR ? - Loki::MakeGuard(&removeDirSimple, targetLink) : - Loki::MakeGuard(&removeFileSimple, targetLink); + Loki::ScopeGuard guardNewDir = Loki::MakeGuard([&]() + { +#ifdef FFS_WIN + if (isDirLink) + removeDirectory(targetLink); + else +#endif + removeFile(targetLink); + }); //file times: essential for a symlink: enforce this! (don't just try!) - copyFileTimes(sourceLink, targetLink, false); //throw (FileError) + { + const Int64 modTime = getFileTime(sourceLink, SYMLINK_DIRECT); //throw FileError + setFileTime(targetLink, modTime, SYMLINK_DIRECT); //throw FileError + } if (copyFilePermissions) - copyObjectPermissions(sourceLink, targetLink, false); //throw (FileError) + copyObjectPermissions(sourceLink, targetLink, SYMLINK_DIRECT); //throw FileError guardNewDir.Dismiss(); //target has been created successfully! } @@ -1302,16 +1308,57 @@ Zstring createTempName(const Zstring& filename) } #ifdef FFS_WIN -struct CallbackData +class CallbackData { - CallbackData(CallbackCopyFile& cb) : - callback(cb), - callNr(0), - exceptionCaught(false) {} - - CallbackCopyFile& callback; - size_t callNr; - bool exceptionCaught; +public: + CallbackData(CallbackCopyFile* cb, //may be NULL + const Zstring& sourceFile, + const Zstring& targetFile, + bool osIsvistaOrLater) : + userCallback(cb), + sourceFile_(sourceFile), + targetFile_(targetFile), + osIsvistaOrLater_(osIsvistaOrLater), + exceptionInUserCallback(false) {} + + CallbackCopyFile* userCallback; //optional! + const Zstring& sourceFile_; + const Zstring& targetFile_; + const bool osIsvistaOrLater_; + + //there is some mixed responsibility in this class, pure read-only data and abstraction for error reporting + //however we need to keep it at one place as ::CopyFileEx() requires! + + void reportUserException(const UInt64& bytesTransferred) + { + exceptionInUserCallback = true; + bytesTransferredOnException = bytesTransferred; + } + + void reportError(const std::wstring& message) { errorMsg = message; } + + void evaluateErrors() //throw + { + if (exceptionInUserCallback) + { + assert(userCallback); + if (userCallback) + userCallback->updateCopyStatus(bytesTransferredOnException); //rethrow (hopefully!) + } + if (!errorMsg.empty()) + throw FileError(errorMsg); + } + + void setSrcAttr(const FileAttrib& attr) { sourceAttr = attr; } + FileAttrib getSrcAttr() const { assert(sourceAttr.modificationTime != 0); return sourceAttr; } + +private: + CallbackData(const CallbackData&); + CallbackData& operator=(const CallbackData&); + + FileAttrib sourceAttr; + std::wstring errorMsg; // + bool exceptionInUserCallback; //these two are exclusive! UInt64 bytesTransferredOnException; }; @@ -1327,36 +1374,81 @@ DWORD CALLBACK copyCallbackInternal( HANDLE hDestinationFile, LPVOID lpData) { - if (lpData) + //this callback is invoked for block sizes managed by Windows, these may vary from e.g. 64 kB up to 1MB. It seems this is dependent from file size amongst others. + + //symlink handling: + //if source is a symlink and COPY_FILE_COPY_SYMLINK is specified, this callback is NOT invoked! + //if source is a symlink and COPY_FILE_COPY_SYMLINK is NOT specified, this callback is called and hSourceFile is a handle to the *target* of the link! + + //file time handling: + //::CopyFileEx() will copy file modification time (only) over from source file AFTER the last inocation of this callback + //=> it is possible to adapt file creation time of target in here, but NOT file modification time! + + CallbackData& cbd = *static_cast<CallbackData*>(lpData); + + //#################### return source file attributes ################################ + if (dwCallbackReason == CALLBACK_STREAM_SWITCH) //called up front for every file (even if 0-sized) { - CallbackData& cbd = *static_cast<CallbackData*>(lpData); + BY_HANDLE_FILE_INFORMATION fileInfo = {}; + if (!::GetFileInformationByHandle(hSourceFile, &fileInfo)) + { + cbd.reportError(_("Error reading file attributes:") + "\n\"" + cbd.sourceFile_ + "\"" + "\n\n" + getLastErrorFormatted()); + return PROGRESS_CANCEL; + } + + const FileAttrib attr = { UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh), + toTimeT(fileInfo.ftLastWriteTime) + }; + //extractFileID(fileInfo)); + + cbd.setSrcAttr(attr); + + //#################### copy file creation time ################################ + FILETIME creationTime = {}; + + if (!::GetFileTime(hSourceFile, //__in HANDLE hFile, + &creationTime, //__out_opt LPFILETIME lpCreationTime, + NULL, //__out_opt LPFILETIME lpLastAccessTime, + NULL)) //__out_opt LPFILETIME lpLastWriteTime + { + cbd.reportError(_("Error reading file attributes:") + "\n\"" + cbd.sourceFile_ + "\"" + "\n\n" + getLastErrorFormatted()); + return PROGRESS_CANCEL; + } - //small performance optimization: it seems this callback function is called for every 64 kB (depending on cluster size). - if (++cbd.callNr % 4 == 0) //executing callback every 256 kB should suffice + if (!::SetFileTime(hDestinationFile, + &creationTime, + NULL, + NULL)) { - //some odd check for some possible(?) error condition - if (totalBytesTransferred.QuadPart < 0) //let's see if someone answers the call... - ::MessageBox(NULL, L"You've just discovered a bug in WIN32 API function \"CopyFileEx\"! \n\n\ + cbd.reportError(_("Error changing modification time:") + "\n\"" + cbd.targetFile_ + "\"" + "\n\n" + getLastErrorFormatted()); + return PROGRESS_CANCEL; + } + //############################################################################## + } + + //if (totalFileSize.QuadPart == totalBytesTransferred.QuadPart) {} //called after copy operation is finished - note: for 0-sized files this callback is invoked just ONCE! + + if (cbd.userCallback) + { + //some odd check for some possible(?) error condition + if (totalBytesTransferred.QuadPart < 0) //let's see if someone answers the call... + ::MessageBox(NULL, L"You've just discovered a bug in WIN32 API function \"CopyFileEx\"! \n\n\ Please write a mail to the author of FreeFileSync at zhnmju123@gmx.de and simply state that\n\ \"totalBytesTransferred.HighPart can be below zero\"!\n\n\ This will then be handled in future versions of FreeFileSync.\n\nThanks -ZenJu", - NULL, 0); - try - { - cbd.callback.updateCopyStatus(UInt64(totalBytesTransferred.QuadPart)); - } - catch (...) - { -#ifndef _MSC_VER -#warning migrate to std::exception_ptr when available -#endif - cbd.exceptionCaught = true; - cbd.bytesTransferredOnException = UInt64(totalBytesTransferred.QuadPart); - return PROGRESS_CANCEL; - } + NULL, 0); + try + { + cbd.userCallback->updateCopyStatus(UInt64(totalBytesTransferred.QuadPart)); } - } + catch (...) + { +//#warning migrate to std::exception_ptr when available + cbd.reportUserException(UInt64(totalBytesTransferred.QuadPart)); + return PROGRESS_CANCEL; + } + } return PROGRESS_CONTINUE; } @@ -1379,36 +1471,43 @@ bool supportForNonEncryptedDestination() } -void rawCopyWinApi(const Zstring& sourceFile, - const Zstring& targetFile, - CallbackCopyFile* callback) //throw (FileError: ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked) +void rawCopyWinApi_sub(const Zstring& sourceFile, + const Zstring& targetFile, + CallbackCopyFile* callback, + FileAttrib* sourceAttr) //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked { - Loki::ScopeGuard guardTarget = Loki::MakeGuard(&removeFile, targetFile); //transactional behavior: guard just before starting copy! + Loki::ScopeGuard guardTarget = Loki::MakeGuard(&removeFile, targetFile); //transactional behavior: guard just before starting copy, we don't trust ::CopyFileEx(), do we ;) DWORD copyFlags = COPY_FILE_FAIL_IF_EXISTS; //allow copying from encrypted to non-encrytped location - static bool nonEncSupported = false; - static boost::once_flag once = BOOST_ONCE_INIT; //caveat: function scope static initialization is not thread-safe in VS 2010! - boost::call_once(once, []() { nonEncSupported = supportForNonEncryptedDestination(); }); - + { + static boost::once_flag initNonEncOnce = BOOST_ONCE_INIT; //caveat: function scope static initialization is not thread-safe in VS 2010! + boost::call_once(initNonEncOnce, []() { nonEncSupported = supportForNonEncryptedDestination(); }); + } if (nonEncSupported) copyFlags |= COPY_FILE_ALLOW_DECRYPTED_DESTINATION; - std::unique_ptr<CallbackData> cbd(callback ? new CallbackData(*callback) : NULL); - - if (!::CopyFileEx( //same performance like CopyFile() - applyLongPathPrefix(sourceFile).c_str(), - applyLongPathPrefix(targetFile).c_str(), - callback ? copyCallbackInternal : NULL, - cbd.get(), - NULL, - copyFlags)) + static bool osIsvistaOrLater = false; { - if (cbd.get() && cbd->exceptionCaught) - callback->updateCopyStatus(cbd->bytesTransferredOnException); //rethrow (hopefully!) + static boost::once_flag initVistaLaterOnce = BOOST_ONCE_INIT; //caveat: function scope static initialization is not thread-safe in VS 2010! + boost::call_once(initVistaLaterOnce, []() { osIsvistaOrLater = dst::vistaOrLater(); }); + } + + CallbackData cbd(callback, sourceFile, targetFile, osIsvistaOrLater); + const bool success = ::CopyFileEx( //same performance like CopyFile() + applyLongPathPrefix(sourceFile).c_str(), + applyLongPathPrefix(targetFile).c_str(), + copyCallbackInternal, + &cbd, + NULL, + copyFlags) == TRUE; //silence x64 perf warning + + cbd.evaluateErrors(); //throw ?, process errors in callback first! + if (!success) + { const DWORD lastError = ::GetLastError(); //don't suppress "lastError == ERROR_REQUEST_ABORTED": a user aborted operation IS an error condition! @@ -1439,38 +1538,56 @@ void rawCopyWinApi(const Zstring& sourceFile, //trying to copy > 4GB file to FAT/FAT32 volume gives obscure ERROR_INVALID_PARAMETER (FAT can indeed handle files up to 4 Gig, tested!) if (lastError == ERROR_INVALID_PARAMETER && dst::isFatDrive(targetFile) && - getFilesize(sourceFile) >= 4U * UInt64(1024U * 1024 * 1024)) //throw (FileError) + getFilesize(sourceFile) >= 4U * UInt64(1024U * 1024 * 1024)) //throw FileError errorMessage += L"\nFAT volume cannot store files larger than 4 gigabyte!"; //note: ERROR_INVALID_PARAMETER can also occur when copying to a SharePoint server or MS SkyDrive and the target filename is of a restricted type. } - catch(...) {} + catch (...) {} throw FileError(errorMessage); } - try //adapt file modification time - { - //this is optional, since ::CopyFileEx already copies modification time (but not creation time) - //chances are good this also avoids a number of unnecessary access-denied errors on NAS shares! - //(one is: missing permission to change file attributes, remove read-only in particular) - copyFileTimes(sourceFile, targetFile, true); //throw FileError - } - catch (FileError&) + if (sourceAttr) + *sourceAttr = cbd.getSrcAttr(); + { - //CAVEAT: in case one of the drives is FAT, we still(!) need copyFileTimes to apply the DST hack! - if (dst::isFatDrive(sourceFile) || dst::isFatDrive(targetFile)) //throw() - throw; - assert(false); //maybe this catches some test-case left-overs? + const Int64 modTime = getFileTime(sourceFile, SYMLINK_FOLLOW); //throw FileError + setFileTime(targetFile, modTime, SYMLINK_FOLLOW); //throw FileError + //note: this sequence leads to a loss of precision of up to 1 sec! + //perf-loss on USB sticks with many small files of about 30%! damn! } guardTarget.Dismiss(); //target has been created successfully! } +inline +void rawCopyWinApi(const Zstring& sourceFile, + const Zstring& targetFile, + CallbackCopyFile* callback, + FileAttrib* sourceAttr) //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked +{ + try + { + rawCopyWinApi_sub(sourceFile, targetFile, callback, sourceAttr); // throw ... + } + catch (ErrorTargetExisting&) + { + //try to handle issues with already existing short 8.3 file names on Windows + if (have8dot3NameClash(targetFile)) + { + Fix8Dot3NameClash dummy(targetFile); //move clashing filename to the side + rawCopyWinApi_sub(sourceFile, targetFile, callback, sourceAttr); //throw FileError; the short filename name clash is solved, this should work now + return; + } + throw; + } +} + //void rawCopyWinOptimized(const Zstring& sourceFile, // const Zstring& targetFile, -// CallbackCopyFile* callback) //throw (FileError: ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked) +// CallbackCopyFile* callback) //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked //{ // /* // BackupRead() FileRead() CopyFileEx() @@ -1491,7 +1608,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // HANDLE hFileIn = ::CreateFile(applyLongPathPrefix(sourceFile).c_str(), // GENERIC_READ, // FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //all shared modes are required to read files that are open in other applications -// NULL, +// 0, // OPEN_EXISTING, // FILE_FLAG_SEQUENTIAL_SCAN, // NULL); @@ -1507,8 +1624,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // // throw FileError(errorMessage); // } -// Loki::ScopeGuard dummy1 = Loki::MakeGuard(::CloseHandle, hFileIn); -// (void)dummy1; //silence warning "unused variable" +// LOKI_ON_BLOCK_EXIT2(::CloseHandle, hFileIn); // // // BY_HANDLE_FILE_INFORMATION infoFileIn = {}; @@ -1545,7 +1661,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // HANDLE hFileOut = ::CreateFile(applyLongPathPrefix(targetFile).c_str(), // GENERIC_READ | GENERIC_WRITE, //read access required for FSCTL_SET_COMPRESSION // FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, -// NULL, +// 0, // CREATE_NEW, // (infoFileIn.dwFileAttributes & validAttribs) | FILE_FLAG_SEQUENTIAL_SCAN, // NULL); @@ -1565,8 +1681,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // } // Loki::ScopeGuard guardTarget = Loki::MakeGuard(&removeFile, targetFile); //transactional behavior: guard just after opening target and before managing hFileOut // -// Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hFileOut); -// (void)dummy; //silence warning "unused variable" +// LOKI_ON_BLOCK_EXIT2(::CloseHandle, hFileOut); // // //#ifndef _MSC_VER @@ -1773,7 +1888,7 @@ void rawCopyWinApi(const Zstring& sourceFile, // HANDLE hSparse = ::CreateFile(L"C:\\sparse.file", // GENERIC_READ | GENERIC_WRITE, //read access required for FSCTL_SET_COMPRESSION // FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, -// NULL, +// 0, // CREATE_NEW, // FILE_FLAG_SEQUENTIAL_SCAN, // NULL); @@ -1800,19 +1915,20 @@ void rawCopyWinApi(const Zstring& sourceFile, //} #endif - +#ifdef FFS_LINUX void rawCopyStream(const Zstring& sourceFile, const Zstring& targetFile, - CallbackCopyFile* callback) //throw (FileError: ErrorTargetPathMissing, ErrorTargetExisting) + CallbackCopyFile* callback, + FileAttrib* sourceAttr) //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting { Loki::ScopeGuard guardTarget = Loki::MakeGuard(&removeFile, targetFile); //transactional behavior: place guard before lifetime of FileOutput try { //open sourceFile for reading - FileInput fileIn(sourceFile); //throw (FileError) + FileInput fileIn(sourceFile); //throw FileError //create targetFile and open it for writing - FileOutput fileOut(targetFile, FileOutput::ACC_CREATE_NEW); //throw (FileError: ErrorTargetPathMissing, ErrorTargetExisting) + FileOutput fileOut(targetFile, FileOutput::ACC_CREATE_NEW); //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting static boost::thread_specific_ptr<std::vector<char>> cpyBuf; if (!cpyBuf.get()) @@ -1823,35 +1939,55 @@ void rawCopyStream(const Zstring& sourceFile, UInt64 totalBytesTransferred; do { - const size_t bytesRead = fileIn.read(&buffer[0], buffer.size()); //throw (FileError) + const size_t bytesRead = fileIn.read(&buffer[0], buffer.size()); //throw FileError - fileOut.write(&buffer[0], bytesRead); //throw (FileError) + fileOut.write(&buffer[0], bytesRead); //throw FileError totalBytesTransferred += bytesRead; //invoke callback method to update progress indicators - if (callback != NULL) + if (callback) callback->updateCopyStatus(totalBytesTransferred); } while (!fileIn.eof()); } - catch(ErrorTargetExisting&) + catch (ErrorTargetExisting&) { guardTarget.Dismiss(); //don't delete file that existed previously! throw; } //adapt file modification time: - copyFileTimes(sourceFile, targetFile, true); //throw (FileError) + { + struct stat srcInfo = {}; + if (::stat(sourceFile.c_str(), &srcInfo) != 0) //read file attributes from source directory + throw FileError(_("Error reading file attributes:") + "\n\"" + sourceFile + "\"" + "\n\n" + getLastErrorFormatted()); + + if (sourceAttr) + { + sourceAttr->fileSize = UInt64(srcInfo.st_size); + sourceAttr->modificationTime = srcInfo.st_mtime; + } + + struct utimbuf newTimes = {}; + newTimes.actime = srcInfo.st_atime; + newTimes.modtime = srcInfo.st_mtime; + + //set new "last write time" + if (::utime(targetFile.c_str(), &newTimes) != 0) + throw FileError(_("Error changing modification time:") + "\n\"" + targetFile + "\"" + "\n\n" + getLastErrorFormatted()); + } guardTarget.Dismiss(); //target has been created successfully! } +#endif inline void copyFileImpl(const Zstring& sourceFile, const Zstring& targetFile, - CallbackCopyFile* callback) //throw (FileError: ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked) + CallbackCopyFile* callback, + FileAttrib* sourceAttr) //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked { #ifdef FFS_WIN /* @@ -1867,21 +2003,22 @@ void copyFileImpl(const Zstring& sourceFile, SAMBA, ect. YES UNKNOWN! -> issues writing ADS to Samba, issues reading from NAS, error copying files having "blocked" state... ect. damn! */ - rawCopyWinApi(sourceFile, targetFile, callback); //throw (FileError: ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked) - //rawCopyWinOptimized(sourceFile, targetFile, callback); //throw (FileError: ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked) ->about 8% faster + rawCopyWinApi(sourceFile, targetFile, callback, sourceAttr); //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked + //rawCopyWinOptimized(sourceFile, targetFile, callback); //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked ->about 8% faster #elif defined FFS_LINUX - rawCopyStream(sourceFile, targetFile, callback); //throw (FileError: ErrorTargetPathMissing, ErrorTargetExisting) + rawCopyStream(sourceFile, targetFile, callback, sourceAttr); //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting #endif } } -void zen::copyFile(const Zstring& sourceFile, //throw (FileError: ErrorTargetPathMissing, ErrorFileLocked); +void zen::copyFile(const Zstring& sourceFile, //throw FileError, ErrorTargetPathMissing, ErrorFileLocked const Zstring& targetFile, bool copyFilePermissions, bool transactionalCopy, - CallbackCopyFile* callback) + CallbackCopyFile* callback, + FileAttrib* sourceAttr) { if (transactionalCopy) { @@ -1891,7 +2028,7 @@ void zen::copyFile(const Zstring& sourceFile, //throw (FileError: ErrorTargetPat //raw file copy try { - copyFileImpl(sourceFile, temporary, callback); //throw FileError: ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked + copyFileImpl(sourceFile, temporary, callback, sourceAttr); //throw FileError: ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked } catch (ErrorTargetExisting&) { @@ -1900,40 +2037,39 @@ void zen::copyFile(const Zstring& sourceFile, //throw (FileError: ErrorTargetPat temporary = createTempName(targetFile); //retry - copyFileImpl(sourceFile, temporary, callback); //throw FileError + copyFileImpl(sourceFile, temporary, callback, sourceAttr); //throw FileError } //have target file deleted (after read access on source and target has been confirmed) => allow for almost transactional overwrite - if (callback) callback->deleteTargetFile(targetFile); + if (callback) + callback->deleteTargetFile(targetFile); //rename temporary file: //perf: this call is REALLY expensive on unbuffered volumes! ~40% performance decrease on FAT USB stick! - renameFile(temporary, targetFile); //throw (FileError) + renameFile(temporary, targetFile); //throw FileError guardTempFile.Dismiss(); - - //perf: interestingly it is much faster to apply file times BEFORE renaming temporary! } else { //have target file deleted if (callback) callback->deleteTargetFile(targetFile); - copyFileImpl(sourceFile, targetFile, callback); //throw FileError: ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked + copyFileImpl(sourceFile, targetFile, callback, sourceAttr); //throw FileError: ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked } -/* - Note: non-transactional file copy solves at least four problems: - -> skydrive - doesn't allow for .ffs_tmp extension and returns ERROR_INVALID_PARAMETER - -> network renaming issues - -> allow for true delete before copy to handle low disk space problems - -> higher performance on non-buffered drives (e.g. usb sticks) -*/ + /* + Note: non-transactional file copy solves at least four problems: + -> skydrive - doesn't allow for .ffs_tmp extension and returns ERROR_INVALID_PARAMETER + -> network renaming issues + -> allow for true delete before copy to handle low disk space problems + -> higher performance on non-buffered drives (e.g. usb sticks) + */ //set file permissions if (copyFilePermissions) { Loki::ScopeGuard guardTargetFile = Loki::MakeGuard(&removeFile, targetFile); - copyObjectPermissions(sourceFile, targetFile, true); //throw (FileError) + copyObjectPermissions(sourceFile, targetFile, SYMLINK_FOLLOW); //throw FileError guardTargetFile.Dismiss(); //target has been created successfully! } } diff --git a/shared/file_handling.h b/shared/file_handling.h index bdd73bea..f1ed2d98 100644 --- a/shared/file_handling.h +++ b/shared/file_handling.h @@ -33,52 +33,55 @@ enum ResponseSame }; ResponseSame onSameVolume(const Zstring& folderLeft, const Zstring& folderRight); //throw() -void checkthis(const Zstring& folderLeft); //throw() +enum ProcSymlink +{ + SYMLINK_DIRECT, + SYMLINK_FOLLOW +}; -//copy file or directory create/last change date, -void copyFileTimes(const Zstring& sourceDir, const Zstring& targetDir, bool derefSymlinks); //throw (FileError) +Int64 getFileTime(const Zstring& filename, ProcSymlink procSl); //throw FileError +void setFileTime(const Zstring& filename, const Int64& modificationTime, ProcSymlink procSl); //throw FileError //symlink handling: always evaluate target -UInt64 getFilesize(const Zstring& filename); //throw (FileError) - +UInt64 getFilesize(const Zstring& filename); //throw FileError //file handling bool removeFile(const Zstring& filename); //return "true" if file was actually deleted; throw (FileError) -void removeDirectory(const Zstring& directory, CallbackRemoveDir* callback = NULL); //throw (FileError) +void removeDirectory(const Zstring& directory, CallbackRemoveDir* callback = NULL); //throw FileError //rename file or directory: no copying!!! -void renameFile(const Zstring& oldName, const Zstring& newName); //throw (FileError); +void renameFile(const Zstring& oldName, const Zstring& newName); //throw FileError; //move source to target; expectations: all super-directories of target exist //"ignoreExisting": if target already exists, source is deleted -void moveFile(const Zstring& sourceFile, const Zstring& targetFile, bool ignoreExisting, CallbackMoveFile* callback); //throw (FileError); +void moveFile(const Zstring& sourceFile, const Zstring& targetFile, bool ignoreExisting, CallbackMoveFile* callback); //throw FileError; //move source to target including subdirectories //"ignoreExisting": existing directories and files will be enriched -void moveDirectory(const Zstring& sourceDir, const Zstring& targetDir, bool ignoreExisting, CallbackMoveFile* callback); //throw (FileError); +void moveDirectory(const Zstring& sourceDir, const Zstring& targetDir, bool ignoreExisting, CallbackMoveFile* callback); //throw FileError; //creates superdirectories automatically: -void createDirectory(const Zstring& directory, const Zstring& templateDir, bool copyFilePermissions); //throw (FileError); -void createDirectory(const Zstring& directory); //throw (FileError); -> function overload avoids default parameter ambiguity issues! +void createDirectory(const Zstring& directory, const Zstring& templateDir, bool copyFilePermissions); //throw FileError; +void createDirectory(const Zstring& directory); //throw FileError; -> function overload avoids default parameter ambiguity issues! +struct FileAttrib +{ + UInt64 fileSize; + Int64 modificationTime; //size_t UTC compatible +}; -void copyFile(const Zstring& sourceFile, //throw (FileError: ErrorTargetPathMissing, ErrorFileLocked (Windows-only)); - const Zstring& targetFile, +void copyFile(const Zstring& sourceFile, //throw FileError, ErrorTargetPathMissing, ErrorFileLocked (Windows-only) + const Zstring& targetFile, //symlink handling: dereference source bool copyFilePermissions, bool transactionalCopy, - CallbackCopyFile* callback); //may be NULL + CallbackCopyFile* callback, //may be NULL + FileAttrib* sourceAttr = NULL); //return current attributes at the time of copy //Note: it MAY happen that copyFile() 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: const Zstring TEMP_FILE_ENDING = Zstr(".ffs_tmp"); -enum SymlinkType -{ - SYMLINK_TYPE_FILE, - SYMLINK_TYPE_DIR -}; -void copySymlink(const Zstring& sourceLink, const Zstring& targetLink, SymlinkType type, bool copyFilePermissions); //throw (FileError) - +void copySymlink(const Zstring& sourceLink, const Zstring& targetLink, bool copyFilePermissions); //throw FileError @@ -87,7 +90,8 @@ void copySymlink(const Zstring& sourceLink, const Zstring& targetLink, SymlinkTy struct CallbackRemoveDir { virtual ~CallbackRemoveDir() {} - virtual void notifyDeletion(const Zstring& currentObject) = 0; + virtual void notifyFileDeletion(const Zstring& filename) = 0; + virtual void notifyDirDeletion(const Zstring& dirname) = 0; }; @@ -101,7 +105,7 @@ struct CallbackCopyFile //callback functionality //may throw: //Linux: unconditionally - //Windows: first exception is swallowed, requestUiRefresh() is then called again where it may throw again and exception will propagate as expected + //Windows: first exception is swallowed, requestUiRefresh() is then called again where it should throw again and exception will propagate as expected virtual void updateCopyStatus(UInt64 totalBytesTransferred) = 0; }; diff --git a/shared/file_id.cpp b/shared/file_id.cpp index e6c016e7..198598b4 100644 --- a/shared/file_id.cpp +++ b/shared/file_id.cpp @@ -5,6 +5,7 @@ // ************************************************************************** #include "file_id.h" +#include "file_id_internal.h" #ifdef FFS_WIN #include <wx/msw/wrapwin.h> //includes "windows.h" @@ -16,21 +17,8 @@ #endif -namespace -{ -template <class T> inline -std::string numberToBytes(T number) -{ - const char* rawBegin = reinterpret_cast<const char*>(&number); - return std::string(rawBegin, rawBegin + sizeof(number)); -} -} - - std::string util::retrieveFileID(const Zstring& filename) { - std::string fileID; - #ifdef FFS_WIN //WARNING: CreateFile() is SLOW, while GetFileInformationByHandle() is cheap! //http://msdn.microsoft.com/en-us/library/aa363788(VS.85).aspx @@ -40,34 +28,27 @@ std::string util::retrieveFileID(const Zstring& filename) const HANDLE hFile = ::CreateFile(zen::applyLongPathPrefix(filename).c_str(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - NULL, + 0, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, //FILE_FLAG_BACKUP_SEMANTICS needed to open a directory NULL); if (hFile != INVALID_HANDLE_VALUE) { - Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hFile); - (void)dummy; //silence warning "unused variable" + LOKI_ON_BLOCK_EXIT2(::CloseHandle(hFile)); BY_HANDLE_FILE_INFORMATION fileInfo = {}; if (::GetFileInformationByHandle(hFile, &fileInfo)) - { - fileID += numberToBytes(fileInfo.dwVolumeSerialNumber); - fileID += numberToBytes(fileInfo.nFileIndexHigh); - fileID += numberToBytes(fileInfo.nFileIndexLow); - } + return extractFileID(fileInfo); } #elif defined FFS_LINUX struct stat fileInfo = {}; if (::lstat(filename.c_str(), &fileInfo) == 0) //lstat() does not follow symlinks - { - fileID += numberToBytes(fileInfo.st_dev); - fileID += numberToBytes(fileInfo.st_ino); - } + return extractFileID(fileInfo); #endif - assert(!fileID.empty()); - return fileID; + + assert(false); + return std::string(); } diff --git a/shared/file_id_internal.h b/shared/file_id_internal.h new file mode 100644 index 00000000..a8a7042d --- /dev/null +++ b/shared/file_id_internal.h @@ -0,0 +1,48 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** + +#ifndef FILE_ID_INTERNAL_HEADER_013287632486321493 +#define FILE_ID_INTERNAL_HEADER_013287632486321493 + +#include <string> + +#ifdef FFS_WIN +#include <wx/msw/wrapwin.h> //includes "windows.h" + +#elif defined FFS_LINUX +#include <sys/stat.h> +#endif + +namespace +{ +template <class T> inline +std::string numberToBytes(T number) +{ + const char* rawBegin = reinterpret_cast<const char*>(&number); + return std::string(rawBegin, rawBegin + sizeof(number)); +} + +#ifdef FFS_WIN +inline +std::string extractFileID(const BY_HANDLE_FILE_INFORMATION& fileInfo) +{ + return numberToBytes(fileInfo.dwVolumeSerialNumber) + + numberToBytes(fileInfo.nFileIndexHigh) + + numberToBytes(fileInfo.nFileIndexLow); +} +#elif defined FFS_LINUX +inline +std::string extractFileID(const struct stat& fileInfo) +{ + return numberToBytes(fileInfo.st_dev) + + numberToBytes(fileInfo.st_ino); +} +#endif + +} + + +#endif //FILE_ID_INTERNAL_HEADER_013287632486321493 diff --git a/shared/file_io.cpp b/shared/file_io.cpp index 2614ac06..59b78044 100644 --- a/shared/file_io.cpp +++ b/shared/file_io.cpp @@ -23,7 +23,7 @@ FileInput::FileInput(FileHandle handle, const Zstring& filename) : filename_(filename) {} -FileInput::FileInput(const Zstring& filename) : //throw (FileError, ErrorNotExisting) +FileInput::FileInput(const Zstring& filename) : //throw FileError, ErrorNotExisting eofReached(false), filename_(filename) { @@ -31,7 +31,7 @@ FileInput::FileInput(const Zstring& filename) : //throw (FileError, ErrorNotExi fileHandle = ::CreateFile(zen::applyLongPathPrefix(filename).c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //all shared modes are required to read open files that are shared by other applications - NULL, + 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, /* possible values: (Reference http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx#caching_behavior) @@ -112,7 +112,7 @@ size_t FileInput::read(void* buffer, size_t bytesToRead) //returns actual number const size_t bytesRead = ::fread(buffer, 1, bytesToRead, fileHandle); if (::ferror(fileHandle) != 0) #endif - throw FileError(_("Error reading file:") + "\n\"" + filename_ + "\"" + "\n\n" + zen::getLastErrorFormatted()); + throw FileError(_("Error reading file:") + "\n\"" + filename_ + "\"" + "\n\n" + zen::getLastErrorFormatted() + " (r)"); #ifdef FFS_WIN if (bytesRead < bytesToRead) //falsify only! @@ -137,14 +137,19 @@ bool FileInput::eof() //end of file reached FileOutput::FileOutput(FileHandle handle, const Zstring& filename) : fileHandle(handle), filename_(filename) {} -FileOutput::FileOutput(const Zstring& filename, AccessFlag access) : //throw (FileError, ErrorTargetPathMissing, ErrorTargetExisting) +FileOutput::FileOutput(const Zstring& filename, AccessFlag access) : //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting filename_(filename) { #ifdef FFS_WIN fileHandle = ::CreateFile(zen::applyLongPathPrefix(filename).c_str(), - GENERIC_WRITE, + GENERIC_READ | GENERIC_WRITE, + /* http://msdn.microsoft.com/en-us/library/aa363858(v=vs.85).aspx + quote: When an application creates a file across a network, it is better + to use GENERIC_READ | GENERIC_WRITE for dwDesiredAccess than to use GENERIC_WRITE alone. + The resulting code is faster, because the redirector can use the cache manager and send fewer SMBs with more data. + This combination also avoids an issue where writing to a file across a network can occasionally return ERROR_ACCESS_DENIED. */ FILE_SHARE_READ | FILE_SHARE_DELETE, //note: FILE_SHARE_DELETE is required to rename file while handle is open! - NULL, + 0, access == ACC_OVERWRITE ? CREATE_ALWAYS : CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); @@ -192,7 +197,7 @@ FileOutput::~FileOutput() } -void FileOutput::write(const void* buffer, size_t bytesToWrite) //throw (FileError) +void FileOutput::write(const void* buffer, size_t bytesToWrite) //throw FileError { #ifdef FFS_WIN DWORD bytesWritten = 0; diff --git a/shared/file_io.h b/shared/file_io.h index 6f87845b..76713e5b 100644 --- a/shared/file_io.h +++ b/shared/file_io.h @@ -29,11 +29,11 @@ typedef FILE* FileHandle; class FileInput { public: - FileInput(const Zstring& filename); //throw (FileError: ErrorNotExisting) + FileInput(const Zstring& filename); //throw FileError, ErrorNotExisting FileInput(FileHandle handle, const Zstring& filename); //takes ownership! ~FileInput(); - size_t read(void* buffer, size_t bytesToRead); //throw (FileError); returns actual number of bytes read + size_t read(void* buffer, size_t bytesToRead); //throw FileError; returns actual number of bytes read bool eof(); //end of file reached private: @@ -54,11 +54,11 @@ public: ACC_OVERWRITE, ACC_CREATE_NEW }; - FileOutput(const Zstring& filename, AccessFlag access); //throw (FileError: ErrorTargetPathMissing, ErrorTargetExisting) + FileOutput(const Zstring& filename, AccessFlag access); //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting FileOutput(FileHandle handle, const Zstring& filename); //takes ownership! ~FileOutput(); - void write(const void* buffer, size_t bytesToWrite); //throw (FileError) + void write(const void* buffer, size_t bytesToWrite); //throw FileError private: FileOutput(const FileOutput&); diff --git a/shared/file_traverser.cpp b/shared/file_traverser.cpp index 595b2768..eb79b0e7 100644 --- a/shared/file_traverser.cpp +++ b/shared/file_traverser.cpp @@ -15,6 +15,8 @@ #include "long_path_prefix.h" #include "dst_hack.h" #include "file_update_handle.h" +#include "dll_loader.h" +#include "FindFilePlus/find_file_plus.h" #elif defined FFS_LINUX #include <sys/stat.h> @@ -55,41 +57,36 @@ bool tryReportingError(Command cmd, zen::TraverseCallback& callback) #ifdef FFS_WIN inline -zen::Int64 filetimeToTimeT(const FILETIME& lastWriteTime) -{ - //convert UTC FILETIME to ANSI C format (number of seconds since Jan. 1st 1970 UTC) - zen::Int64 writeTimeLong = to<zen::Int64>(zen::UInt64(lastWriteTime.dwLowDateTime, lastWriteTime.dwHighDateTime) / 10000000U); //reduce precision to 1 second (FILETIME has unit 10^-7 s) - writeTimeLong -= zen::Int64(3054539008UL, 2); //timeshift between ansi C time and FILETIME in seconds == 11644473600s - return writeTimeLong; -} - - -inline bool setWin32FileInformationFromSymlink(const Zstring& linkName, zen::TraverseCallback::FileInfo& output) { //open handle to target of symbolic link HANDLE hFile = ::CreateFile(zen::applyLongPathPrefix(linkName).c_str(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - NULL, + 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); if (hFile == INVALID_HANDLE_VALUE) return false; - - Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hFile); - (void)dummy; //silence warning "unused variable" + LOKI_ON_BLOCK_EXIT2(::CloseHandle(hFile)); BY_HANDLE_FILE_INFORMATION fileInfoByHandle = {}; if (!::GetFileInformationByHandle(hFile, &fileInfoByHandle)) return false; //write output - output.lastWriteTimeRaw = filetimeToTimeT(fileInfoByHandle.ftLastWriteTime); + output.lastWriteTimeRaw = toTimeT(fileInfoByHandle.ftLastWriteTime); output.fileSize = zen::UInt64(fileInfoByHandle.nFileSizeLow, fileInfoByHandle.nFileSizeHigh); return true; } + +/* +warn_static("finish") + util::DllFun<findplus::OpenDirFunc> openDir (findplus::getDllName(), findplus::openDirFuncName); + util::DllFun<findplus::ReadDirFunc> readDir (findplus::getDllName(), findplus::readDirFuncName); + util::DllFun<findplus::CloseDirFunc> closeDir(findplus::getDllName(), findplus::closeDirFuncName); +*/ #endif } @@ -102,8 +99,8 @@ public: : isFatFileSystem(dst::isFatDrive(baseDirectory)) #endif { - //format base directory name #ifdef FFS_WIN + //format base directory name const Zstring& directoryFormatted = baseDirectory; #elif defined FFS_LINUX @@ -143,57 +140,75 @@ private: return true; }, sink); - #ifdef FFS_WIN +/* //ensure directoryPf ends with backslash const Zstring& directoryPf = directory.EndsWith(FILE_NAME_SEPARATOR) ? directory : directory + FILE_NAME_SEPARATOR; - WIN32_FIND_DATA fileInfo = {}; - HANDLE searchHandle = INVALID_HANDLE_VALUE; + FindHandle searchHandle = NULL; tryReportingError([&](std::wstring& errorMsg) -> bool { - searchHandle = ::FindFirstFile(applyLongPathPrefix(directoryPf + L'*').c_str(), &fileInfo); + searchHandle = this->openDir(applyLongPathPrefix(directoryPf).c_str()); //no noticable performance difference compared to FindFirstFileEx with FindExInfoBasic, FIND_FIRST_EX_CASE_SENSITIVE and/or FIND_FIRST_EX_LARGE_FETCH - if (searchHandle == INVALID_HANDLE_VALUE) + if (searchHandle == NULL) { - const DWORD lastError = ::GetLastError(); - if (lastError == ERROR_FILE_NOT_FOUND) - return true; //fine: empty directory + //const DWORD lastError = ::GetLastError(); + //if (lastError == ERROR_FILE_NOT_FOUND) -> actually NOT okay, even for an empty directory this should not occur (., ..) + //return true; //fine: empty directory //else: we have a problem... report it: - errorMsg = _("Error traversing directory:") + "\n\"" + directory + "\"" + "\n\n" + zen::getLastErrorFormatted(lastError); + errorMsg = _("Error traversing directory:") + "\n\"" + directory + "\"" + "\n\n" + zen::getLastErrorFormatted(); return false; } return true; }, sink); - if (searchHandle == INVALID_HANDLE_VALUE) + if (searchHandle == NULL) return; //empty dir or ignore error + LOKI_ON_BLOCK_EXIT2(this->closeDir(searchHandle)); - Loki::ScopeGuard dummy = Loki::MakeGuard(::FindClose, searchHandle); - (void)dummy; //silence warning "unused variable" - - do + FileInformation fileInfo = {}; + for (;;) { + bool moreData = false; + tryReportingError([&](std::wstring& errorMsg) -> bool + { + if (!this->readDir(searchHandle, fileInfo)) + { + if (::GetLastError() == ERROR_NO_MORE_FILES) //this is fine + return true; + + //else we have a problem... report it: + errorMsg = _("Error traversing directory:") + "\n\"" + directory + "\"" + "\n\n" + zen::getLastErrorFormatted(); + return false; + } + + moreData = true; + return true; + }, sink); + if (!moreData) //no more items or ignore error + return; + + //don't return "." and ".." - const Zchar* const shortName = fileInfo.cFileName; + const Zchar* const shortName = fileInfo.shortName; if (shortName[0] == L'.' && (shortName[1] == L'\0' || (shortName[1] == L'.' && shortName[2] == L'\0'))) continue; const Zstring& fullName = directoryPf + shortName; - const bool isSymbolicLink = (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0; + const bool isSymbolicLink = (fileInfo.fileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0; if (isSymbolicLink && !followSymlinks) //evaluate symlink directly { TraverseCallback::SymlinkInfo details; try { - details.targetPath = getSymlinkRawTargetString(fullName); //throw (FileError) + details.targetPath = getSymlinkRawTargetString(fullName); //throw FileError } catch (FileError& e) { @@ -203,11 +218,11 @@ private: #endif } - details.lastWriteTimeRaw = filetimeToTimeT(fileInfo.ftLastWriteTime); - details.dirLink = (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; //directory symlinks have this flag on Windows + details.lastWriteTimeRaw = toTimeT(fileInfo.lastWriteTime); + details.dirLink = (fileInfo.fileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; //directory symlinks have this flag on Windows sink.onSymlink(shortName, fullName, details); } - else if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //a directory... or symlink that needs to be followed (for directory symlinks this flag is set too!) + else if (fileInfo.fileAttributes & FILE_ATTRIBUTE_DIRECTORY) //a directory... or symlink that needs to be followed (for directory symlinks this flag is set too!) { const TraverseCallback::ReturnValDir rv = sink.onDir(shortName, fullName); switch (rv.returnCode) @@ -238,45 +253,155 @@ private: //####################################### DST hack ########################################### if (isFatFileSystem) { - const dst::RawTime rawTime(fileInfo.ftCreationTime, fileInfo.ftLastWriteTime); + const dst::RawTime rawTime(fileInfo.creationTime, fileInfo.lastWriteTime); if (dst::fatHasUtcEncoded(rawTime)) //throw (std::runtime_error) - fileInfo.ftLastWriteTime = dst::fatDecodeUtcTime(rawTime); //return real UTC time; throw (std::runtime_error) + fileInfo.lastWriteTime = dst::fatDecodeUtcTime(rawTime); //return real UTC time; throw (std::runtime_error) else - markForDstHack.push_back(std::make_pair(fullName, fileInfo.ftLastWriteTime)); + markForDstHack.push_back(std::make_pair(fullName, fileInfo.lastWriteTime)); } //####################################### DST hack ########################################### - details.lastWriteTimeRaw = filetimeToTimeT(fileInfo.ftLastWriteTime); - details.fileSize = zen::UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh); + + details.lastWriteTimeRaw = toTimeT(fileInfo.lastWriteTime); + details.fileSize = fileInfo.fileSize.QuadPart; } sink.onFile(shortName, fullName, details); } } - while ([&]() -> bool - { - bool moreData = false; +*/ - tryReportingError([&](std::wstring& errorMsg) -> bool - { - if (!::FindNextFile(searchHandle, // handle to search - &fileInfo)) // pointer to structure for data on found file + + + //ensure directoryPf ends with backslash + const Zstring& directoryPf = directory.EndsWith(FILE_NAME_SEPARATOR) ? + directory : + directory + FILE_NAME_SEPARATOR; + WIN32_FIND_DATA fileInfo = {}; + + HANDLE searchHandle = INVALID_HANDLE_VALUE; + tryReportingError([&](std::wstring& errorMsg) -> bool { - if (::GetLastError() == ERROR_NO_MORE_FILES) //this is fine - return true; + searchHandle = ::FindFirstFile(applyLongPathPrefix(directoryPf + L'*').c_str(), &fileInfo); + //no noticable performance difference compared to FindFirstFileEx with FindExInfoBasic, FIND_FIRST_EX_CASE_SENSITIVE and/or FIND_FIRST_EX_LARGE_FETCH - //else we have a problem... report it: - errorMsg = _("Error traversing directory:") + "\n\"" + directory + "\"" + "\n\n" + zen::getLastErrorFormatted(); - return false; - } + if (searchHandle == INVALID_HANDLE_VALUE) + { + //const DWORD lastError = ::GetLastError(); + //if (lastError == ERROR_FILE_NOT_FOUND) -> actually NOT okay, even for an empty directory this should not occur (., ..) + //return true; //fine: empty directory - moreData = true; - return true; - }, sink); + //else: we have a problem... report it: + errorMsg = _("Error traversing directory:") + "\n\"" + directory + "\"" + "\n\n" + zen::getLastErrorFormatted(); + return false; + } + return true; + }, sink); + + if (searchHandle == INVALID_HANDLE_VALUE) + return; //empty dir or ignore error + LOKI_ON_BLOCK_EXIT2(::FindClose(searchHandle)); - return moreData; - }()); + do + { + //don't return "." and ".." + const Zchar* const shortName = fileInfo.cFileName; + if (shortName[0] == L'.' && + (shortName[1] == L'\0' || (shortName[1] == L'.' && shortName[2] == L'\0'))) + continue; + const Zstring& fullName = directoryPf + shortName; + + const bool isSymbolicLink = (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0; + + if (isSymbolicLink && !followSymlinks) //evaluate symlink directly + { + TraverseCallback::SymlinkInfo details; + try + { + details.targetPath = getSymlinkRawTargetString(fullName); //throw FileError + } + catch (FileError& e) + { + (void)e; + #ifndef NDEBUG //show broken symlink / access errors in debug build! + sink.onError(e.msg()); + #endif + } + + details.lastWriteTimeRaw = toTimeT(fileInfo.ftLastWriteTime); + details.dirLink = (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; //directory symlinks have this flag on Windows + sink.onSymlink(shortName, fullName, details); + } + else if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //a directory... or symlink that needs to be followed (for directory symlinks this flag is set too!) + { + const TraverseCallback::ReturnValDir rv = sink.onDir(shortName, fullName); + switch (rv.returnCode) + { + case TraverseCallback::ReturnValDir::TRAVERSING_DIR_IGNORE: + break; + + case TraverseCallback::ReturnValDir::TRAVERSING_DIR_CONTINUE: + traverse<followSymlinks>(fullName, *rv.subDirCb, level + 1); + break; + } + } + else //a file or symlink that is followed... + { + TraverseCallback::FileInfo details; + + if (isSymbolicLink) //dereference symlinks! + { + if (!setWin32FileInformationFromSymlink(fullName, details)) + { + //broken symlink... + details.lastWriteTimeRaw = 0; //we are not interested in the modification time of the link + details.fileSize = 0U; + } + } + else + { + //####################################### DST hack ########################################### + if (isFatFileSystem) + { + const dst::RawTime rawTime(fileInfo.ftCreationTime, fileInfo.ftLastWriteTime); + + if (dst::fatHasUtcEncoded(rawTime)) //throw (std::runtime_error) + fileInfo.ftLastWriteTime = dst::fatDecodeUtcTime(rawTime); //return real UTC time; throw (std::runtime_error) + else + markForDstHack.push_back(std::make_pair(fullName, fileInfo.ftLastWriteTime)); + } + //####################################### DST hack ########################################### + details.lastWriteTimeRaw = toTimeT(fileInfo.ftLastWriteTime); + details.fileSize = zen::UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh); + } + + sink.onFile(shortName, fullName, details); + } + } + while ([&]() -> bool + { + bool moreData = false; + + tryReportingError([&](std::wstring& errorMsg) -> bool + { + if (!::FindNextFile(searchHandle, // handle to search + &fileInfo)) // pointer to structure for data on found file + { + if (::GetLastError() == ERROR_NO_MORE_FILES) //this is fine + return true; + + //else we have a problem... report it: + errorMsg = _("Error traversing directory:") + "\n\"" + directory + "\"" + "\n\n" + zen::getLastErrorFormatted(); + return false; + } + + moreData = true; + return true; + }, sink); + + return moreData; + }()); #elif defined FFS_LINUX DIR* dirObj = NULL; @@ -291,9 +416,7 @@ private: return true; }, sink)) return; - - Loki::ScopeGuard dummy = Loki::MakeGuard(::closedir, dirObj); //never close NULL handles! -> crash - (void)dummy; //silence warning "unused variable" + LOKI_ON_BLOCK_EXIT2(::closedir(dirObj)); //never close NULL handles! -> crash while (true) { @@ -357,7 +480,7 @@ private: TraverseCallback::SymlinkInfo details; try { - details.targetPath = getSymlinkRawTargetString(fullName); //throw (FileError) + details.targetPath = getSymlinkRawTargetString(fullName); //throw FileError } catch (FileError& e) { @@ -418,12 +541,12 @@ private: const dst::RawTime encodedTime = dst::fatEncodeUtcTime(i->second); //throw (std::runtime_error) { //may need to remove the readonly-attribute (e.g. FAT usb drives) - FileUpdateHandle updateHandle(i->first, [=]() + FileUpdateHandle updateHandle(i->first, [ = ]() { return ::CreateFile(zen::applyLongPathPrefix(i->first).c_str(), - GENERIC_WRITE, //just FILE_WRITE_ATTRIBUTES may not be enough for some NAS shares! + GENERIC_READ | GENERIC_WRITE, //use both when writing over network, see comment in file_io.cpp FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - NULL, + 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); diff --git a/shared/file_traverser.h b/shared/file_traverser.h index aa9dffad..7da86c3a 100644 --- a/shared/file_traverser.h +++ b/shared/file_traverser.h @@ -44,7 +44,7 @@ public: ReturnValDir(Loki::Int2Type<TRAVERSING_DIR_IGNORE>) : returnCode(TRAVERSING_DIR_IGNORE), subDirCb(NULL) {} ReturnValDir(Loki::Int2Type<TRAVERSING_DIR_CONTINUE>, TraverseCallback& subDirCallback) : returnCode(TRAVERSING_DIR_CONTINUE), subDirCb(&subDirCallback) {} - const ReturnValueEnh returnCode; + ReturnValueEnh returnCode; TraverseCallback* subDirCb; }; diff --git a/shared/fixed_list.h b/shared/fixed_list.h new file mode 100644 index 00000000..97976149 --- /dev/null +++ b/shared/fixed_list.h @@ -0,0 +1,142 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** + +#ifndef PTR_WRAP_012384670856841394535 +#define PTR_WRAP_012384670856841394535 + +#include <iterator> + +namespace zen +{ +//std::list(C++11) compatible class supporting inplace element construction for non-copyable/movable types +//may be replaced by C++11 std::list when available +template <class T> +class FixedList +{ + struct Node + { + Node() : next(NULL) {} + template <class A> Node(A && a) : next(NULL), val(a) {} + template <class A, class B> Node(A && a, B && b) : next(NULL), val(a, b) {} + template <class A, class B, class C> Node(A && a, B && b, C && c) : next(NULL), val(a, b, c) {} + template <class A, class B, class C, class D> Node(A && a, B && b, C && c, D && d) : next(NULL), val(a, b, c, d) {} + template <class A, class B, class C, class D, class E> Node(A && a, B && b, C && c, D && d, E && e) : next(NULL), val(a, b, c, d, e) {} + template <class A, class B, class C, class D, class E, class F> Node(A && a, B && b, C && c, D && d, E && e, F && f) : next(NULL), val(a, b, c, d, e, f) {} + + Node* next; //singly linked list is sufficient + T val; + }; + +public: + FixedList() : + first(NULL), + lastInsert(NULL), + sz(0) {} + + ~FixedList() { clear(); } + + template <class NodeT, class U> + class ListIterator : public std::iterator<std::forward_iterator_tag, U> + { + public: + ListIterator(NodeT* it = NULL) : iter(it) {} + ListIterator& operator++() { iter = iter->next; return *this; } + inline friend bool operator==(const ListIterator& lhs, const ListIterator& rhs) { return lhs.iter == rhs.iter; } + inline friend bool operator!=(const ListIterator& lhs, const ListIterator& rhs) { return !(lhs == rhs); } + U& operator* () { return iter->val; } + U* operator->() { return &iter->val; } + private: + NodeT* iter; + }; + + typedef T value_type; + typedef ListIterator<Node, T> iterator; + typedef ListIterator<const Node, const T> const_iterator; + typedef T& reference; + typedef const T& const_reference; + + iterator begin() { return first; } + iterator end() { return iterator(); } + + const_iterator begin() const { return first; } + const_iterator end () const { return const_iterator(); } + + reference front() { return first->val; } + const_reference front() const { return first->val; } + + reference& back() { return lastInsert->val; } + const_reference& back() const { return lastInsert->val; } + + void emplace_back() { pushNode(new Node); } + template <class A> void emplace_back(A && a) { pushNode(new Node(std::forward<A>(a))); } + template <class A, class B> void emplace_back(A && a, B && b) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b))); } + template <class A, class B, class C> void emplace_back(A && a, B && b, C && c) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c))); } + template <class A, class B, class C, class D> void emplace_back(A && a, B && b, C && c, D && d) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d))); } + template <class A, class B, class C, class D, class E> void emplace_back(A && a, B && b, C && c, D && d, E && e) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e))); } + template <class A, class B, class C, class D, class E, class F> void emplace_back(A && a, B && b, C && c, D && d, E && e, F && f) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e), std::forward<F>(f))); } + + template <class Predicate> + void remove_if(Predicate pred) + { + Node* prev = NULL; + for (auto ptr = first; ptr;) + if (pred(ptr->val)) + { + Node* tmp = ptr->next; + deleteNode(ptr); + if (prev) + prev->next = ptr = tmp; + else + first = ptr = tmp; + if (tmp == NULL) + lastInsert = prev; + } + else + { + prev = ptr; + ptr = ptr->next; + } + } + + void clear() { remove_if([](T&) { return true; }); } + bool empty() const { return first == NULL; } + size_t size() const { return sz; } + +private: + FixedList(const FixedList&); + FixedList& operator=(const FixedList&); + + void pushNode(Node* newNode) + { + ++sz; + if (lastInsert == NULL) + { + assert(first == NULL); + first = lastInsert = newNode; + } + else + { + assert(lastInsert->next == NULL); + lastInsert->next = newNode; + lastInsert = newNode; + } + } + + void deleteNode(Node* oldNode) + { + assert(sz > 0); + --sz; + delete oldNode; + } + + Node* first; + Node* lastInsert; //point to last insertion; required by emplace_back() + size_t sz; +}; +} + + +#endif //PTR_WRAP_012384670856841394535 diff --git a/shared/folder_history_box.cpp b/shared/folder_history_box.cpp new file mode 100644 index 00000000..f787e2cb --- /dev/null +++ b/shared/folder_history_box.cpp @@ -0,0 +1,139 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** + +#include "folder_history_box.h" +#include "resolve_path.h" +#include <list> + +using namespace zen; + +FolderHistoryBox::FolderHistoryBox(wxWindow* parent, + wxWindowID id, + const wxString& value, + const wxPoint& pos, + const wxSize& size, + int n, + const wxString choices[], + long style, + const wxValidator& validator, + const wxString& name) : + wxComboBox(parent, id, value, pos, size, n, choices, style, validator, name) +#if wxCHECK_VERSION(2, 9, 1) + , dropDownShown(false) +#endif +{ + //##################################### + /*##*/ SetMinSize(wxSize(150, -1)); //## workaround yet another wxWidgets bug: default minimum size is much too large for a wxComboBox + //##################################### + + //register key event to enable item deletion + Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(FolderHistoryBox::OnKeyEvent), NULL, this); + + //refresh history list on mouse click + Connect(wxEVT_LEFT_DOWN, wxEventHandler(FolderHistoryBox::OnUpdateList), NULL, this); + + Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(FolderHistoryBox::OnSelection), NULL, this); + +#if wxCHECK_VERSION(2, 9, 1) + Connect(wxEVT_COMMAND_COMBOBOX_DROPDOWN, wxCommandEventHandler(FolderHistoryBox::OnShowDropDown), NULL, this); + Connect(wxEVT_COMMAND_COMBOBOX_CLOSEUP, wxCommandEventHandler(FolderHistoryBox::OnHideDropDown), NULL, this); +#endif +} + + +#if wxCHECK_VERSION(2, 9, 1) +void FolderHistoryBox::OnShowDropDown(wxCommandEvent& event) +{ + dropDownShown = true; + event.Skip(); +} + + +void FolderHistoryBox::OnHideDropDown(wxCommandEvent& event) +{ + dropDownShown = false; + event.Skip(); +} +#endif + + +void FolderHistoryBox::update() +{ + std::list<Zstring> dirList; + + //add some aliases to allow user changing to volume name and back, if possible +#ifdef FFS_WIN + const Zstring activePath = toZ(GetValue()); + std::vector<Zstring> aliases = getDirectoryAliases(activePath); + dirList.insert(dirList.end(), aliases.begin(), aliases.end()); +#endif + + if (sharedHistory_.get()) + { + auto tmp = sharedHistory_->getList(); + //std::sort(tmp.begin(), tmp.end(), LessFilename()); + + if (!dirList.empty() && !tmp.empty()) + dirList.push_back(FolderHistory::lineSeparator()); + + dirList.insert(dirList.end(), tmp.begin(), tmp.end()); + } + //########################################################################################### + + + //it may be a little lame to update the list on each mouse-button click, but it should be working and we dont't have to manipulate wxComboBox internals + const wxString oldVal = this->GetValue(); + + Clear(); + std::for_each(dirList.begin(), dirList.end(), + [&](const Zstring& dir) { this->Append(toWx(dir)); }); + + this->SetSelection(wxNOT_FOUND); //don't select anything + this->SetValue(oldVal); //but preserve main text! +} + + +void FolderHistoryBox::OnSelection(wxCommandEvent& event) +{ + event.Skip(); +} + + +void FolderHistoryBox::OnKeyEvent(wxKeyEvent& event) +{ + const int keyCode = event.GetKeyCode(); + if (keyCode == WXK_DELETE || keyCode == WXK_NUMPAD_DELETE) + { + //try to delete the currently selected config history item + int pos = this->GetCurrentSelection(); + if (0 <= pos && pos < static_cast<int>(this->GetCount()) && +#if wxCHECK_VERSION(2, 9, 1) + dropDownShown) +#else + //what a mess...: + (GetValue() != GetString(pos) || //avoid problems when a character shall be deleted instead of list item + GetValue() == wxEmptyString)) //exception: always allow removing empty entry +#endif + { + //save old (selected) value: deletion seems to have influence on this + const wxString currentVal = this->GetValue(); + //this->SetSelection(wxNOT_FOUND); + + //delete selected row + if (sharedHistory_.get()) + sharedHistory_->delItem(toZ(GetString(pos))); + SetString(pos, wxString()); //in contrast to Delete(), this one does not kill the drop-down list and gives a nice visual feedback! + //Delete(pos); + + //(re-)set value + this->SetValue(currentVal); + + //eat up key event + return; + } + } + event.Skip(); +} diff --git a/shared/folder_history_box.h b/shared/folder_history_box.h new file mode 100644 index 00000000..3b4fd57e --- /dev/null +++ b/shared/folder_history_box.h @@ -0,0 +1,109 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** + +#ifndef CUSTOMCOMBOBOX_H_INCLUDED +#define CUSTOMCOMBOBOX_H_INCLUDED + +#include <wx/combobox.h> +#include <memory> +#include "zstring.h" +#include "string_conv.h" +#include "stl_tools.h" + +//combobox with history function + functionality to delete items (DEL) +using namespace zen; + + +class FolderHistory +{ +public: + FolderHistory() : maxSize_(0) {} + + FolderHistory(const std::vector<Zstring>& dirnames, size_t maxSize) : + maxSize_(maxSize), + dirnames_(dirnames) + { + if (dirnames_.size() > maxSize_) //keep maximal size of history list + dirnames_.resize(maxSize_); + } + + const std::vector<Zstring>& getList() const { return dirnames_; } + + static const Zstring lineSeparator() { return Zstr("---------------------------------------------------------------------------------------------------------------"); } + + void addItem(const Zstring& dirname) + { + if (dirname.empty() || dirname == lineSeparator()) + return; + + Zstring nameTmp = dirname; + zen::trim(nameTmp); + + //insert new folder or put it to the front if already existing + auto iter = std::find_if(dirnames_.begin(), dirnames_.end(), + [&](const Zstring& entry) { return ::EqualFilename()(entry, nameTmp); }); + + if (iter != dirnames_.end()) + dirnames_.erase(iter); + dirnames_.insert(dirnames_.begin(), nameTmp); + + if (dirnames_.size() > maxSize_) //keep maximal size of history list + dirnames_.resize(maxSize_); + } + + void delItem(const Zstring& dirname) { vector_remove_if(dirnames_, [&](const Zstring& entry) { return ::EqualFilename()(entry, dirname); }); } + +private: + + size_t maxSize_; + std::vector<Zstring> dirnames_; +}; + + +class FolderHistoryBox : public wxComboBox +{ +public: + FolderHistoryBox(wxWindow* parent, + wxWindowID id, + const wxString& value = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + int n = 0, + const wxString choices[] = NULL, + long style = 0, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = wxComboBoxNameStr); + + void init(const std::shared_ptr<FolderHistory>& sharedHistory) { sharedHistory_ = sharedHistory; } + + void setValue(const wxString& dirname) + { + SetSelection(wxNOT_FOUND); + SetValue(dirname); + update(); //required for Linux to ensure the dropdown is shown as being populated + } + + // GetValue + +private: + void OnKeyEvent(wxKeyEvent& event); + void OnSelection(wxCommandEvent& event); + void OnUpdateList(wxEvent& event) { update(); event.Skip(); } + + void update(); + +#if wxCHECK_VERSION(2, 9, 1) + void OnShowDropDown(wxCommandEvent& event); + void OnHideDropDown(wxCommandEvent& event); + + bool dropDownShown; +#endif + + std::shared_ptr<FolderHistory> sharedHistory_; +}; + + +#endif // CUSTOMCOMBOBOX_H_INCLUDED diff --git a/shared/global_func.h b/shared/global_func.h index 861e2081..b3c13a24 100644 --- a/shared/global_func.h +++ b/shared/global_func.h @@ -7,106 +7,21 @@ #ifndef GLOBALFUNCTIONS_H_INCLUDED #define GLOBALFUNCTIONS_H_INCLUDED -#include <string> -#include <algorithm> -#include <vector> -#include <set> -#include <wx/string.h> +#include <cmath> namespace common { //little rounding function -inline int round(double d) { return static_cast<int>(d < 0 ? d - 0.5 : d + 0.5); } - -//absolute value -template <class T> inline T abs(const T& d) { return d < 0 ? -d : d; } - -size_t getDigitCount(size_t number); //count number of digits - -//Note: the following lines are a performance optimization for deleting elements from a vector: linear runtime at most! -template <class T> -void removeRowsFromVector(const std::set<size_t>& rowsToRemove, std::vector<T>& grid); - -//enhanced binary search template: returns an iterator -template <class ForwardIterator, class T, typename Compare> -ForwardIterator custom_binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp = std::less<T>()); -} - - -//############################################################################ - - - - - - - - - - - - - - - - - - - - - -//---------------Inline Implementation--------------------------------------------------- inline -size_t common::getDigitCount(size_t number) //count number of digits -{ - return number == 0 ? 1 : static_cast<size_t>(::log10(static_cast<double>(number))) + 1; -} - - -//Note: the following lines are a performance optimization for deleting elements from a vector: linear runtime at most! -template <class T> -void common::removeRowsFromVector(const std::set<size_t>& rowsToRemove, std::vector<T>& grid) -{ - if (rowsToRemove.empty()) - return; - - std::set<size_t>::const_iterator rowToSkipIndex = rowsToRemove.begin(); - size_t rowToSkip = *rowToSkipIndex; - - if (rowToSkip >= grid.size()) - return; - - typename std::vector<T>::iterator insertPos = grid.begin() + rowToSkip; - - for (size_t i = rowToSkip; i < grid.size(); ++i) - { - if (i != rowToSkip) - { - *insertPos = grid[i]; - ++insertPos; - } - else - { - ++rowToSkipIndex; - if (rowToSkipIndex != rowsToRemove.end()) - rowToSkip = *rowToSkipIndex; - } - } - grid.erase(insertPos, grid.end()); -} +int round(double d) { return static_cast<int>(d < 0 ? d - 0.5 : d + 0.5); } +//absolute value +template <class T> inline +T abs(const T& d) { return d < 0 ? -d : d; } -//enhanced binary search template: returns an iterator -template <class ForwardIterator, class T, typename Compare> inline -ForwardIterator common::custom_binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp) -{ - first = std::lower_bound(first, last, value, comp); - if (first != last && !comp(value, *first)) - return first; - else - return last; +size_t getDigitCount(size_t number) { return number == 0 ? 1 : static_cast<size_t>(std::log10(static_cast<double>(number))) + 1; } //count number of digits } -#endif // GLOBALFUNCTIONS_H_INCLUDED +#endif //GLOBALFUNCTIONS_H_INCLUDED diff --git a/shared/help_provider.cpp b/shared/help_provider.cpp index 7eb043cd..666482eb 100644 --- a/shared/help_provider.cpp +++ b/shared/help_provider.cpp @@ -18,9 +18,9 @@ public: { controller.Initialize(zen::getResourceDir() + #ifdef FFS_WIN - wxT("FreeFileSync.chm")); + L"FreeFileSync.chm"); #elif defined FFS_LINUX - wxT("Help/FreeFileSync.hhp")); + L"Help/FreeFileSync.hhp"); #endif } diff --git a/shared/i18n.cpp b/shared/i18n.cpp index f22dca56..a5fb32dd 100644 --- a/shared/i18n.cpp +++ b/shared/i18n.cpp @@ -3,6 +3,7 @@ using namespace zen; + namespace { std::unique_ptr<TranslationHandler> globalHandler; diff --git a/shared/image_tools.h b/shared/image_tools.h new file mode 100644 index 00000000..e78e7ced --- /dev/null +++ b/shared/image_tools.h @@ -0,0 +1,157 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** + +#ifndef IMAGE_TOOLS_HEADER_45782456427634254 +#define IMAGE_TOOLS_HEADER_45782456427634254 + +#include <numeric> +#include <wx/bitmap.h> +#include <wx/dcmemory.h> + + +namespace zen +{ +wxBitmap greyScale(const wxBitmap& bmp); //greyscale + brightness adaption +wxBitmap layOver(const wxBitmap& foreground, const wxBitmap& background); //merge + +void move(wxImage& img, int up, int left = 0); +void adjustBrightness(wxImage& img, int targetLevel); +double getAvgBrightness(const wxImage& img); //in [0, 255] +void brighten(wxImage& img, int level); //level: delta per channel in points + +bool isEqual(const wxBitmap& lhs, const wxBitmap& rhs); //pixel-wise equality (respecting alpha channel) + + + + + + + + + + + + + + + + + +//################################### implementation ################################### +inline +void move(wxImage& img, int up, int left) +{ + img = img.GetSubImage(wxRect(std::max(0, left), std::max(0, up), img.GetWidth() - abs(left), img.GetHeight() - abs(up))); + img.Resize(wxSize(img.GetWidth() + abs(left), img.GetHeight() + abs(up)), wxPoint(-std::min(0, left), -std::min(0, up))); +} + + +inline +wxBitmap greyScale(const wxBitmap& bmp) +{ + wxImage output = bmp.ConvertToImage().ConvertToGreyscale(1.0/3, 1.0/3, 1.0/3); //treat all channels equally! + //wxImage output = bmp.ConvertToImage().ConvertToGreyscale(); + adjustBrightness(output, 170); + return output; +} + + +inline +double getAvgBrightness(const wxImage& img) +{ + const int pixelCount = img.GetWidth() * img.GetHeight(); + auto pixBegin = img.GetData(); + if (pixBegin) + { + auto pixEnd = pixBegin + 3 * pixelCount; //RGB + + if (img.HasAlpha()) + { + const unsigned char* alphaFirst = img.GetAlpha(); + + //calculate average weighted by alpha channel + double dividend = 0; + for (auto iter = pixBegin; iter != pixEnd; ++iter) + dividend += *iter * static_cast<double>(alphaFirst[(iter - pixBegin) / 3]); + + const int divisor = 3.0 * std::accumulate(alphaFirst, alphaFirst + pixelCount, 0.0); + + return dividend / divisor; + } + else + return std::accumulate(pixBegin, pixEnd, 0.0) / (3.0 * pixelCount); + } + return 0; +} + + +inline +void brighten(wxImage& img, int level) +{ + const int pixelCount = img.GetWidth() * img.GetHeight(); + auto pixBegin = img.GetData(); + if (pixBegin) + { + auto pixEnd = pixBegin + 3 * pixelCount; //RGB + if (level > 0) + std::for_each(pixBegin, pixEnd, [&](unsigned char& c) { c = std::min(255, c + level); }); + else + std::for_each(pixBegin, pixEnd, [&](unsigned char& c) { c = std::max(0, c + level); }); + } +} + + +inline +void adjustBrightness(wxImage& img, int targetLevel) +{ + brighten(img, targetLevel - getAvgBrightness(img)); +} + + +inline +wxBitmap layOver(const wxBitmap& foreground, const wxBitmap& background) +{ + wxBitmap output = background; + { + wxMemoryDC dc; + dc.SelectObject(output); + dc.DrawBitmap(foreground, 0, 0, true); + dc.SelectObject(wxNullBitmap); + } + return output; +} + + +inline +bool isEqual(const wxBitmap& lhs, const wxBitmap& rhs) +{ + if (lhs.IsOk() != rhs.IsOk()) + return false; + if (!lhs.IsOk()) + return true; + + const int pixelCount = lhs.GetWidth() * lhs.GetHeight(); + if (pixelCount != rhs.GetWidth() * rhs.GetHeight()) + return false; + + wxImage imLhs = lhs.ConvertToImage(); + wxImage imRhs = rhs.ConvertToImage(); + + if (imLhs.HasAlpha() != imRhs.HasAlpha()) + return false; + + if (imLhs.HasAlpha()) + { + if (!std::equal(imLhs.GetAlpha(), imLhs.GetAlpha() + pixelCount, imRhs.GetAlpha())) + return false; + } + + return std::equal(imLhs.GetData(), imLhs.GetData() + pixelCount * 3, imRhs.GetData()); +} +} + + +#endif //IMAGE_TOOLS_HEADER_45782456427634254 diff --git a/shared/int64.h b/shared/int64.h index 61ef1716..cfd3e3d1 100644 --- a/shared/int64.h +++ b/shared/int64.h @@ -120,7 +120,6 @@ inline Int64 operator<<(const Int64& lhs, int rhs) { return Int64(lhs) <<= rhs; inline Int64 operator>>(const Int64& lhs, int rhs) { return Int64(lhs) >>= rhs; } - class UInt64 { struct DummyClass { operator size_t() { return 0U; } }; @@ -201,6 +200,28 @@ inline UInt64 operator>>(const UInt64& lhs, int rhs) { return UInt64(lhs) >>= rh template <> inline UInt64 to(Int64 number) { checkRange<boost::uint64_t>(number.value); return UInt64(number.value); } template <> inline Int64 to(UInt64 number) { checkRange<boost:: int64_t>(number.value); return Int64(number.value); } + + +#ifdef FFS_WIN +//convert FILETIME (number of 100-nanosecond intervals since January 1, 1601 UTC) +// to time_t (number of seconds since Jan. 1st 1970 UTC) +// +//FAT32 time is preserved exactly: FAT32 -> toTimeT -> tofiletime -> FAT32 +inline +Int64 toTimeT(const FILETIME& ft) +{ + return to<Int64>(UInt64(ft.dwLowDateTime, ft.dwHighDateTime) / 10000000U) - Int64(3054539008UL, 2); + //timeshift between ansi C time and FILETIME in seconds == 11644473600s +} + +inline +FILETIME tofiletime(const Int64& utcTime) +{ + const UInt64 fileTimeLong = to<UInt64>(utcTime + Int64(3054539008UL, 2)) * 10000000U; + const FILETIME output = { fileTimeLong.getLo(), fileTimeLong.getHi() }; + return output; +} +#endif } diff --git a/shared/localization.cpp b/shared/localization.cpp index 66b2d97b..73aa5b72 100644 --- a/shared/localization.cpp +++ b/shared/localization.cpp @@ -69,7 +69,7 @@ private: Translation transMapping; //map original text |-> translation TranslationPlural transMappingPl; - std::auto_ptr<PluralForm> pluralParser; + std::unique_ptr<PluralForm> pluralParser; wxLanguage langId_; }; @@ -385,7 +385,7 @@ void zen::setLanguage(int language) //handle RTL swapping: we need wxWidgets to do this - static std::auto_ptr<CustomLocale> dummy; + static std::unique_ptr<CustomLocale> dummy; dummy.reset(); //avoid global locale lifetime overlap! wxWidgets cannot handle this and will crash! dummy.reset(new CustomLocale(languageFile.empty() ? wxLANGUAGE_ENGLISH : language)); diff --git a/shared/loki/AbstractFactory.h b/shared/loki/AbstractFactory.h index 9a30583b..615652bd 100644 --- a/shared/loki/AbstractFactory.h +++ b/shared/loki/AbstractFactory.h @@ -170,8 +170,8 @@ class AbstractFact, class TList = typename AbstractFact::ProductList > class ConcreteFactory - : public GenLinearHierarchy< - typename TL::Reverse<TList>::Result, Creator, AbstractFact> + : public GenLinearHierarchy < + typename TL::Reverse<TList>::Result, Creator, AbstractFact > { public: typedef typename AbstractFact::ProductList ProductList; diff --git a/shared/loki/AssocVector.h b/shared/loki/AssocVector.h index ad43d152..7f259281 100644 --- a/shared/loki/AssocVector.h +++ b/shared/loki/AssocVector.h @@ -182,8 +182,8 @@ public: //http://developer.apple.com/documentation/DeveloperTools/gcc-3.3/libstdc++/23_containers/howto.html#4 iterator insert(iterator pos, const value_type& val) { - if( (pos == begin() || this->operator()(*(pos-1),val)) && - (pos == end() || this->operator()(val, *pos)) ) + if ( (pos == begin() || this->operator()(*(pos - 1), val)) && + (pos == end() || this->operator()(val, *pos)) ) { return Base::insert(pos, val); } diff --git a/shared/loki/CachedFactory.h b/shared/loki/CachedFactory.h index 567b035c..dc5a76ae 100644 --- a/shared/loki/CachedFactory.h +++ b/shared/loki/CachedFactory.h @@ -81,7 +81,7 @@ protected: AbstractProduct* release(ProductReturn& pProduct) { AbstractProduct* pPointer(pProduct); - pProduct=NULL; + pProduct = NULL; return pPointer; } const char* name() {return "pointer";} @@ -172,9 +172,9 @@ private: { using namespace std; clock_t currentTime = clock(); - D( cout << "currentTime = " << currentTime<< endl; ) - D( cout << "currentTime - lastUpdate = " << currentTime - lastUpdate<< endl; ) - if(currentTime - lastUpdate > timeValidity) + D( cout << "currentTime = " << currentTime << endl; ) + D( cout << "currentTime - lastUpdate = " << currentTime - lastUpdate << endl; ) + if (currentTime - lastUpdate > timeValidity) { m_vTimes.clear(); D( cout << " is less than time validity " << timeValidity; ) @@ -213,7 +213,7 @@ protected: bool canCreate() { cleanVector(); - if(m_vTimes.size()>maxCreation) + if (m_vTimes.size() > maxCreation) throw Exception(); else return true; @@ -233,10 +233,10 @@ public: // No more than maxCreation within byTime milliseconds void setRate(unsigned maxCreation, unsigned byTime) { - assert(byTime>0); + assert(byTime > 0); this->maxCreation = maxCreation; this->timeValidity = static_cast<clock_t>(byTime * CLOCKS_PER_SEC / 1000); - D( std::cout << "Setting no more than "<< maxCreation <<" creation within " << this->timeValidity <<" ms"<< std::endl; ) + D( std::cout << "Setting no more than " << maxCreation << " creation within " << this->timeValidity << " ms" << std::endl; ) } }; @@ -262,7 +262,7 @@ protected: bool canCreate() { - return !(created>=maxCreation); + return !(created >= maxCreation); } void onCreate() @@ -279,9 +279,9 @@ public: // set the creation max amount void setMaxCreation(unsigned maxCreation) { - assert(maxCreation>0); + assert(maxCreation > 0); this->maxCreation = maxCreation; - D( std::cout << "Setting no more than " << maxCreation <<" creation" << std::endl; ) + D( std::cout << "Setting no more than " << maxCreation << " creation" << std::endl; ) } }; @@ -324,9 +324,9 @@ protected: assert(!m_mHitCount.empty()); // inserting the swapped pair into a multimap SwappedHitMap copyMap; - for(HitMapItr itr = m_mHitCount.begin(); itr != m_mHitCount.end(); ++itr) + for (HitMapItr itr = m_mHitCount.begin(); itr != m_mHitCount.end(); ++itr) copyMap.insert(SwappedPair((*itr).second, (*itr).first)); - if((*copyMap.rbegin()).first == 0) // the higher score is 0 ... + if ((*copyMap.rbegin()).first == 0) // the higher score is 0 ... throw EvictionException(); // there is no key evict return (*copyMap.begin()).second; } @@ -381,7 +381,7 @@ protected: // this function is implemented in Cache and redirected // to the Storage Policy - virtual void remove(DT const key)=0; + virtual void remove(DT const key) = 0; // LRU Eviction policy void evict() @@ -422,7 +422,7 @@ private: updateCounter(const DT& key): key_(key) {} void operator()(T x) { - x.second = (x.first == key_ ? (x.second >> 1) | ( 1 << ((sizeof(ST)-1)*8) ) : x.second >> 1); + x.second = (x.first == key_ ? (x.second >> 1) | ( 1 << ((sizeof(ST) - 1) * 8) ) : x.second >> 1); D( std::cout << x.second << std::endl; ) } const DT& key_; @@ -461,7 +461,7 @@ protected: // this function is implemented in Cache and redirected // to the Storage Policy - virtual void remove(DT const key)=0; + virtual void remove(DT const key) = 0; // LRU with Aging Eviction policy void evict() @@ -515,15 +515,15 @@ protected: } // Implemented in Cache and redirected to the Storage Policy - virtual void remove(DT const key)=0; + virtual void remove(DT const key) = 0; // Random Eviction policy void evict() { - if(m_vKeys.empty()) + if (m_vKeys.empty()) throw EvictionException(); - size_type random = static_cast<size_type>((m_vKeys.size()*rand())/(static_cast<size_type>(RAND_MAX) + 1)); - remove(*(m_vKeys.begin()+random)); + size_type random = static_cast<size_type>((m_vKeys.size() * rand()) / (static_cast<size_type>(RAND_MAX) + 1)); + remove(*(m_vKeys.begin() + random)); } const char* name() {return "random";} }; @@ -592,9 +592,9 @@ protected: cout << "## + Currently allocated : " << allocated << endl; cout << "## + Currently out : " << out << endl; cout << "############################" << endl; - if(fetched!=0) + if (fetched != 0) { - cout << "## Overall efficiency " << 100*double(hit)/fetched <<"%"<< endl; + cout << "## Overall efficiency " << 100 * double(hit) / fetched << "%" << endl; cout << "############################" << endl; } cout << endl; @@ -629,7 +629,7 @@ public: unsigned getMissed() {return fetched - hit;} unsigned getAllocated() {return allocated;} unsigned getOut() {return out;} - unsigned getDestroyed() {return created-allocated;} + unsigned getDestroyed() {return created - allocated;} }; /////////////////////////////////////////////////////////////////////////// @@ -712,7 +712,7 @@ private: AbstractProduct* const getPointerToObjectInContainer(ObjVector& entry) { - if(entry.empty()) // No object available + if (entry.empty()) // No object available { // the object will be created in the calling function. // It has to be created in the calling function because of @@ -723,7 +723,7 @@ private: { // returning the found object AbstractProduct* pObject(entry.back()); - assert(pObject!=NULL); + assert(pObject != NULL); entry.pop_back(); return pObject; } @@ -731,9 +731,9 @@ private: bool shouldCreateObject(AbstractProduct* const pProduct) { - if(pProduct!=NULL) // object already exists + if (pProduct != NULL) // object already exists return false; - if(CP::canCreate()==false) // Are we allowed to Create ? + if (CP::canCreate() == false) // Are we allowed to Create ? EP::evict(); // calling Eviction Policy to clean up return true; } @@ -797,16 +797,16 @@ protected: virtual void remove(AbstractProduct* const pProduct) { typename FetchedObjToKeyMap::iterator fetchedItr = providedObjects.find(pProduct); - if(fetchedItr!=providedObjects.end()) // object is unreleased. + if (fetchedItr != providedObjects.end()) // object is unreleased. throw CacheException(); bool productRemoved = false; typename KeyToObjVectorMap::iterator objVectorItr; typename ObjVector::iterator objItr; - for(objVectorItr=fromKeyToObjVector.begin(); objVectorItr!=fromKeyToObjVector.end(); ++objVectorItr) + for (objVectorItr = fromKeyToObjVector.begin(); objVectorItr != fromKeyToObjVector.end(); ++objVectorItr) { ObjVector& v((*objVectorItr).second); objItr = remove_if(v.begin(), v.end(), std::bind2nd(std::equal_to<AbstractProduct*>(), pProduct)); - if(objItr != v.end()) // we found the vector containing pProduct and removed it + if (objItr != v.end()) // we found the vector containing pProduct and removed it { onDestroy(pProduct); // warning policies we are about to destroy an object v.erase(objItr, v.end()); // real removing @@ -814,7 +814,7 @@ protected: break; } } - if(productRemoved==false) + if (productRemoved == false) throw CacheException(); // the product is not in the cache ?! delete pProduct; // deleting it } @@ -833,14 +833,14 @@ public: for_each(fromKeyToObjVector.begin(), fromKeyToObjVector.end(), deleteVectorObjects< typename KeyToObjVectorMap::value_type >() ); - if(!providedObjects.empty()) + if (!providedObjects.empty()) { // The factory is responsible for the creation and destruction of objects. // If objects are out during the destruction of the Factory : deleting anyway. // This might not be a good idea. But throwing an exception in a destructor is // considered as a bad pratice and asserting might be too much. // What to do ? Leaking memory or corrupting in use pointers ? hmm... - D( cout << "====>> Cache destructor : deleting "<< providedObjects.size()<<" in use objects <<====" << endl << endl; ) + D( cout << "====>> Cache destructor : deleting " << providedObjects.size() << " in use objects <<====" << endl << endl; ) for_each(providedObjects.begin(), providedObjects.end(), deleteMapKeys< typename FetchedObjToKeyMap::value_type >() ); @@ -878,7 +878,7 @@ public: { MyKey key(id); AbstractProduct* pProduct(getPointerToObjectInContainer(getContainerFromKey(key))); - if(shouldCreateObject(pProduct)) + if (shouldCreateObject(pProduct)) { pProduct = factory.CreateObject(key.id); onCreate(pProduct); @@ -891,11 +891,11 @@ public: ProductReturn CreateObject(const IdentifierType& id, Parm1 p1) { - MyKey key(id,p1); + MyKey key(id, p1); AbstractProduct* pProduct(getPointerToObjectInContainer(getContainerFromKey(key))); - if(shouldCreateObject(pProduct)) + if (shouldCreateObject(pProduct)) { - pProduct = factory.CreateObject(key.id,key.p1); + pProduct = factory.CreateObject(key.id, key.p1); onCreate(pProduct); } onFetch(pProduct); @@ -906,11 +906,11 @@ public: ProductReturn CreateObject(const IdentifierType& id, Parm1 p1, Parm2 p2) { - MyKey key(id,p1,p2); + MyKey key(id, p1, p2); AbstractProduct* pProduct(getPointerToObjectInContainer(getContainerFromKey(key))); - if(shouldCreateObject(pProduct)) + if (shouldCreateObject(pProduct)) { - pProduct = factory.CreateObject(key.id,key.p1,key.p2); + pProduct = factory.CreateObject(key.id, key.p1, key.p2); onCreate(pProduct); } onFetch(pProduct); @@ -921,11 +921,11 @@ public: ProductReturn CreateObject(const IdentifierType& id, Parm1 p1, Parm2 p2, Parm3 p3) { - MyKey key(id,p1,p2,p3); + MyKey key(id, p1, p2, p3); AbstractProduct* pProduct(getPointerToObjectInContainer(getContainerFromKey(key))); - if(shouldCreateObject(pProduct)) + if (shouldCreateObject(pProduct)) { - pProduct = factory.CreateObject(key.id,key.p1,key.p2,key.p3); + pProduct = factory.CreateObject(key.id, key.p1, key.p2, key.p3); onCreate(pProduct); } onFetch(pProduct); @@ -936,12 +936,12 @@ public: ProductReturn CreateObject(const IdentifierType& id, Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4) { - MyKey key(id,p1,p2,p3,p4); + MyKey key(id, p1, p2, p3, p4); AbstractProduct* pProduct(getPointerToObjectInContainer(getContainerFromKey(key))); - if(shouldCreateObject(pProduct)) + if (shouldCreateObject(pProduct)) { - pProduct = factory.CreateObject(key.id,key.p1,key.p2,key.p3 - ,key.p4); + pProduct = factory.CreateObject(key.id, key.p1, key.p2, key.p3 + , key.p4); onCreate(pProduct); } onFetch(pProduct); @@ -952,12 +952,12 @@ public: ProductReturn CreateObject(const IdentifierType& id, Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5) { - MyKey key(id,p1,p2,p3,p4,p5); + MyKey key(id, p1, p2, p3, p4, p5); AbstractProduct* pProduct(getPointerToObjectInContainer(getContainerFromKey(key))); - if(shouldCreateObject(pProduct)) + if (shouldCreateObject(pProduct)) { - pProduct = factory.CreateObject(key.id,key.p1,key.p2,key.p3 - ,key.p4,key.p5); + pProduct = factory.CreateObject(key.id, key.p1, key.p2, key.p3 + , key.p4, key.p5); onCreate(pProduct); } onFetch(pProduct); @@ -969,12 +969,12 @@ public: Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5, Parm6 p6) { - MyKey key(id,p1,p2,p3,p4,p5,p6); + MyKey key(id, p1, p2, p3, p4, p5, p6); AbstractProduct* pProduct(getPointerToObjectInContainer(getContainerFromKey(key))); - if(shouldCreateObject(pProduct)) + if (shouldCreateObject(pProduct)) { - pProduct = factory.CreateObject(key.id,key.p1,key.p2,key.p3 - ,key.p4,key.p5,key.p6); + pProduct = factory.CreateObject(key.id, key.p1, key.p2, key.p3 + , key.p4, key.p5, key.p6); onCreate(pProduct); } onFetch(pProduct); @@ -986,12 +986,12 @@ public: Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5, Parm6 p6, Parm7 p7 ) { - MyKey key(id,p1,p2,p3,p4,p5,p6,p7); + MyKey key(id, p1, p2, p3, p4, p5, p6, p7); AbstractProduct* pProduct(getPointerToObjectInContainer(getContainerFromKey(key))); - if(shouldCreateObject(pProduct)) + if (shouldCreateObject(pProduct)) { - pProduct = factory.CreateObject(key.id,key.p1,key.p2,key.p3 - ,key.p4,key.p5,key.p6,key.p7); + pProduct = factory.CreateObject(key.id, key.p1, key.p2, key.p3 + , key.p4, key.p5, key.p6, key.p7); onCreate(pProduct); } onFetch(pProduct); @@ -1003,12 +1003,12 @@ public: Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5, Parm6 p6, Parm7 p7, Parm8 p8) { - MyKey key(id,p1,p2,p3,p4,p5,p6,p7,p8); + MyKey key(id, p1, p2, p3, p4, p5, p6, p7, p8); AbstractProduct* pProduct(getPointerToObjectInContainer(getContainerFromKey(key))); - if(shouldCreateObject(pProduct)) + if (shouldCreateObject(pProduct)) { - pProduct = factory.CreateObject(key.id,key.p1,key.p2,key.p3 - ,key.p4,key.p5,key.p6,key.p7,key.p8); + pProduct = factory.CreateObject(key.id, key.p1, key.p2, key.p3 + , key.p4, key.p5, key.p6, key.p7, key.p8); onCreate(pProduct); } onFetch(pProduct); @@ -1020,12 +1020,12 @@ public: Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5, Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9) { - MyKey key(id,p1,p2,p3,p4,p5,p6,p7,p8,p9); + MyKey key(id, p1, p2, p3, p4, p5, p6, p7, p8, p9); AbstractProduct* pProduct(getPointerToObjectInContainer(getContainerFromKey(key))); - if(shouldCreateObject(pProduct)) + if (shouldCreateObject(pProduct)) { - pProduct = factory.CreateObject(key.id,key.p1,key.p2,key.p3 - ,key.p4,key.p5,key.p6,key.p7,key.p8,key.p9); + pProduct = factory.CreateObject(key.id, key.p1, key.p2, key.p3 + , key.p4, key.p5, key.p6, key.p7, key.p8, key.p9); onCreate(pProduct); } onFetch(pProduct); @@ -1035,14 +1035,14 @@ public: ProductReturn CreateObject(const IdentifierType& id, Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5, - Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9,Parm10 p10) + Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10) { - MyKey key(id,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10); + MyKey key(id, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10); AbstractProduct* pProduct(getPointerToObjectInContainer(getContainerFromKey(key))); - if(shouldCreateObject(pProduct)) + if (shouldCreateObject(pProduct)) { - pProduct = factory.CreateObject(key.id,key.p1,key.p2,key.p3 - ,key.p4,key.p5,key.p6,key.p7,key.p8,key.p9,key.p10); + pProduct = factory.CreateObject(key.id, key.p1, key.p2, key.p3 + , key.p4, key.p5, key.p6, key.p7, key.p8, key.p9, key.p10); onCreate(pProduct); } onFetch(pProduct); @@ -1055,12 +1055,12 @@ public: Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11) { - MyKey key(id,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11); + MyKey key(id, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11); AbstractProduct* pProduct(getPointerToObjectInContainer(getContainerFromKey(key))); - if(shouldCreateObject(pProduct)) + if (shouldCreateObject(pProduct)) { - pProduct = factory.CreateObject(key.id,key.p1,key.p2,key.p3 - ,key.p4,key.p5,key.p6,key.p7,key.p8,key.p9,key.p10,key.p11); + pProduct = factory.CreateObject(key.id, key.p1, key.p2, key.p3 + , key.p4, key.p5, key.p6, key.p7, key.p8, key.p9, key.p10, key.p11); onCreate(pProduct); } onFetch(pProduct); @@ -1073,12 +1073,12 @@ public: Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11, Parm12 p12) { - MyKey key(id,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12); + MyKey key(id, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12); AbstractProduct* pProduct(getPointerToObjectInContainer(getContainerFromKey(key))); - if(shouldCreateObject(pProduct)) + if (shouldCreateObject(pProduct)) { - pProduct = factory.CreateObject(key.id,key.p1,key.p2,key.p3 - ,key.p4,key.p5,key.p6,key.p7,key.p8,key.p9,key.p10,key.p11,key.p12); + pProduct = factory.CreateObject(key.id, key.p1, key.p2, key.p3 + , key.p4, key.p5, key.p6, key.p7, key.p8, key.p9, key.p10, key.p11, key.p12); onCreate(pProduct); } onFetch(pProduct); @@ -1091,13 +1091,13 @@ public: Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11, Parm12 p12, Parm13 p13) { - MyKey key(id,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13); + MyKey key(id, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13); AbstractProduct* pProduct(getPointerToObjectInContainer(getContainerFromKey(key))); - if(shouldCreateObject(pProduct)) + if (shouldCreateObject(pProduct)) { - pProduct = factory.CreateObject(key.id,key.p1,key.p2,key.p3 - ,key.p4,key.p5,key.p6,key.p7,key.p8,key.p9,key.p10,key.p11,key.p12 - ,key.p13); + pProduct = factory.CreateObject(key.id, key.p1, key.p2, key.p3 + , key.p4, key.p5, key.p6, key.p7, key.p8, key.p9, key.p10, key.p11, key.p12 + , key.p13); onCreate(pProduct); } onFetch(pProduct); @@ -1110,13 +1110,13 @@ public: Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11, Parm12 p12, Parm13 p13, Parm14 p14) { - MyKey key(id,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14); + MyKey key(id, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14); AbstractProduct* pProduct(getPointerToObjectInContainer(getContainerFromKey(key))); - if(shouldCreateObject(pProduct)) + if (shouldCreateObject(pProduct)) { - pProduct = factory.CreateObject(key.id,key.p1,key.p2,key.p3 - ,key.p4,key.p5,key.p6,key.p7,key.p8,key.p9,key.p10,key.p11,key.p12 - ,key.p13,key.p14); + pProduct = factory.CreateObject(key.id, key.p1, key.p2, key.p3 + , key.p4, key.p5, key.p6, key.p7, key.p8, key.p9, key.p10, key.p11, key.p12 + , key.p13, key.p14); onCreate(pProduct); } onFetch(pProduct); @@ -1129,13 +1129,13 @@ public: Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10, Parm11 p11, Parm12 p12, Parm13 p13, Parm14 p14, Parm15 p15) { - MyKey key(id,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15); + MyKey key(id, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15); AbstractProduct* pProduct(getPointerToObjectInContainer(getContainerFromKey(key))); - if(shouldCreateObject(pProduct)) + if (shouldCreateObject(pProduct)) { - pProduct = factory.CreateObject(key.id,key.p1,key.p2,key.p3 - ,key.p4,key.p5,key.p6,key.p7,key.p8,key.p9,key.p10,key.p11,key.p12 - ,key.p13,key.p14,key.p15); + pProduct = factory.CreateObject(key.id, key.p1, key.p2, key.p3 + , key.p4, key.p5, key.p6, key.p7, key.p8, key.p9, key.p10, key.p11, key.p12 + , key.p13, key.p14, key.p15); onCreate(pProduct); } onFetch(pProduct); @@ -1153,7 +1153,7 @@ public: { AbstractProduct* pProduct(NP::release(object)); typename FetchedObjToKeyMap::iterator itr = providedObjects.find(pProduct); - if(itr == providedObjects.end()) + if (itr == providedObjects.end()) throw CacheException(); onRelease(pProduct); ReleaseObjectFromContainer(getContainerFromKey((*itr).second), pProduct); diff --git a/shared/loki/Factory.h b/shared/loki/Factory.h index abf4ab3b..bf31afc5 100644 --- a/shared/loki/Factory.h +++ b/shared/loki/Factory.h @@ -140,25 +140,25 @@ struct FactoryImpl<AP, Id, NullType> virtual AP* CreateObject(const Id& id ) = 0; }; template <typename AP, typename Id, typename P1 > -struct FactoryImpl<AP,Id, Seq<P1> > +struct FactoryImpl<AP, Id, Seq<P1> > : public FactoryImplBase { typedef typename TypeTraits<P1>::ParameterType Parm1; virtual ~FactoryImpl() {} - virtual AP* CreateObject(const Id& id,Parm1 ) = 0; + virtual AP* CreateObject(const Id& id, Parm1 ) = 0; }; -template<typename AP, typename Id, typename P1,typename P2 > +template<typename AP, typename Id, typename P1, typename P2 > struct FactoryImpl<AP, Id, Seq<P1, P2> > : public FactoryImplBase { typedef typename TypeTraits<P1>::ParameterType Parm1; typedef typename TypeTraits<P2>::ParameterType Parm2; virtual ~FactoryImpl() {} - virtual AP* CreateObject(const Id& id,Parm1, Parm2 ) = 0; + virtual AP* CreateObject(const Id& id, Parm1, Parm2 ) = 0; }; -template<typename AP, typename Id, typename P1,typename P2,typename P3 > +template<typename AP, typename Id, typename P1, typename P2, typename P3 > struct FactoryImpl<AP, Id, Seq<P1, P2, P3> > : public FactoryImplBase { @@ -166,10 +166,10 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3> > typedef typename TypeTraits<P2>::ParameterType Parm2; typedef typename TypeTraits<P3>::ParameterType Parm3; virtual ~FactoryImpl() {} - virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3 ) = 0; + virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3 ) = 0; }; -template<typename AP, typename Id, typename P1,typename P2,typename P3,typename P4 > +template<typename AP, typename Id, typename P1, typename P2, typename P3, typename P4 > struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4> > : public FactoryImplBase { @@ -178,11 +178,11 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4> > typedef typename TypeTraits<P3>::ParameterType Parm3; typedef typename TypeTraits<P4>::ParameterType Parm4; virtual ~FactoryImpl() {} - virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4 ) = 0; + virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4 ) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5 > +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5 > struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5> > : public FactoryImplBase { @@ -192,12 +192,12 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5> > typedef typename TypeTraits<P4>::ParameterType Parm4; typedef typename TypeTraits<P5>::ParameterType Parm5; virtual ~FactoryImpl() {} - virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5 ) = 0; + virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5 ) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6> +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6 > struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6> > : public FactoryImplBase { @@ -208,14 +208,14 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6> > typedef typename TypeTraits<P5>::ParameterType Parm5; typedef typename TypeTraits<P6>::ParameterType Parm6; virtual ~FactoryImpl() {} - virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, + virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, Parm6 ) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6,typename P7> +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6, typename P7 > struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7> > : public FactoryImplBase { @@ -227,14 +227,14 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7> > typedef typename TypeTraits<P6>::ParameterType Parm6; typedef typename TypeTraits<P7>::ParameterType Parm7; virtual ~FactoryImpl() {} - virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, + virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7 ) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6,typename P7,typename P8> +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6, typename P7, typename P8 > struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8> > : public FactoryImplBase { @@ -247,14 +247,14 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8> > typedef typename TypeTraits<P7>::ParameterType Parm7; typedef typename TypeTraits<P8>::ParameterType Parm8; virtual ~FactoryImpl() {} - virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, + virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6,typename P7,typename P8,typename P9> +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6, typename P7, typename P8, typename P9 > struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9> > : public FactoryImplBase { @@ -268,14 +268,14 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9> > typedef typename TypeTraits<P8>::ParameterType Parm8; typedef typename TypeTraits<P9>::ParameterType Parm9; virtual ~FactoryImpl() {} - virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, + virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6,typename P7,typename P8,typename P9,typename P10> +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6, typename P7, typename P8, typename P9, typename P10 > struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10> > : public FactoryImplBase { @@ -290,15 +290,15 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10> > typedef typename TypeTraits<P9>::ParameterType Parm9; typedef typename TypeTraits<P10>::ParameterType Parm10; virtual ~FactoryImpl() {} - virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, - Parm6, Parm7, Parm8, Parm9,Parm10) + virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, + Parm6, Parm7, Parm8, Parm9, Parm10) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6,typename P7,typename P8,typename P9,typename P10, - typename P11> +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6, typename P7, typename P8, typename P9, typename P10, + typename P11 > struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11> > : public FactoryImplBase { @@ -314,16 +314,16 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11> > typedef typename TypeTraits<P10>::ParameterType Parm10; typedef typename TypeTraits<P11>::ParameterType Parm11; virtual ~FactoryImpl() {} - virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, - Parm6, Parm7, Parm8, Parm9,Parm10, + virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, + Parm6, Parm7, Parm8, Parm9, Parm10, Parm11) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6,typename P7,typename P8,typename P9,typename P10, - typename P11,typename P12> +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6, typename P7, typename P8, typename P9, typename P10, + typename P11, typename P12 > struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12> > : public FactoryImplBase { @@ -340,16 +340,16 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12 typedef typename TypeTraits<P11>::ParameterType Parm11; typedef typename TypeTraits<P12>::ParameterType Parm12; virtual ~FactoryImpl() {} - virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, - Parm6, Parm7, Parm8, Parm9,Parm10, - Parm11,Parm12) + virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, + Parm6, Parm7, Parm8, Parm9, Parm10, + Parm11, Parm12) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6,typename P7,typename P8,typename P9,typename P10, - typename P11,typename P12,typename P13> +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6, typename P7, typename P8, typename P9, typename P10, + typename P11, typename P12, typename P13 > struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13> > : public FactoryImplBase { @@ -367,16 +367,16 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12 typedef typename TypeTraits<P12>::ParameterType Parm12; typedef typename TypeTraits<P13>::ParameterType Parm13; virtual ~FactoryImpl() {} - virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, - Parm6, Parm7, Parm8, Parm9,Parm10, - Parm11,Parm12,Parm13) + virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, + Parm6, Parm7, Parm8, Parm9, Parm10, + Parm11, Parm12, Parm13) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6,typename P7,typename P8,typename P9,typename P10, - typename P11,typename P12,typename P13,typename P14> +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6, typename P7, typename P8, typename P9, typename P10, + typename P11, typename P12, typename P13, typename P14 > struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14> > : public FactoryImplBase { @@ -395,16 +395,16 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12 typedef typename TypeTraits<P13>::ParameterType Parm13; typedef typename TypeTraits<P14>::ParameterType Parm14; virtual ~FactoryImpl() {} - virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, - Parm6, Parm7, Parm8, Parm8,Parm10, - Parm11,Parm12,Parm13,Parm14) + virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, + Parm6, Parm7, Parm8, Parm8, Parm10, + Parm11, Parm12, Parm13, Parm14) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6,typename P7,typename P8,typename P9,typename P10, - typename P11,typename P12,typename P13,typename P14,typename P15 > +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6, typename P7, typename P8, typename P9, typename P10, + typename P11, typename P12, typename P13, typename P14, typename P15 > struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15> > : public FactoryImplBase { @@ -424,34 +424,34 @@ struct FactoryImpl<AP, Id, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12 typedef typename TypeTraits<P14>::ParameterType Parm14; typedef typename TypeTraits<P15>::ParameterType Parm15; virtual ~FactoryImpl() {} - virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, - Parm6, Parm7, Parm8, Parm9,Parm10, - Parm11,Parm12,Parm13,Parm14,Parm15 ) + virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, + Parm6, Parm7, Parm8, Parm9, Parm10, + Parm11, Parm12, Parm13, Parm14, Parm15 ) = 0; }; #ifndef LOKI_DISABLE_TYPELIST_MACROS template <typename AP, typename Id, typename P1 > -struct FactoryImpl<AP,Id, LOKI_TYPELIST_1( P1 )> +struct FactoryImpl<AP, Id, LOKI_TYPELIST_1( P1 )> : public FactoryImplBase { typedef typename TypeTraits<P1>::ParameterType Parm1; virtual ~FactoryImpl() {} -virtual AP* CreateObject(const Id& id,Parm1 ) = 0; +virtual AP* CreateObject(const Id& id, Parm1 ) = 0; }; -template<typename AP, typename Id, typename P1,typename P2 > +template<typename AP, typename Id, typename P1, typename P2 > struct FactoryImpl<AP, Id, LOKI_TYPELIST_2( P1, P2 )> : public FactoryImplBase { typedef typename TypeTraits<P1>::ParameterType Parm1; typedef typename TypeTraits<P2>::ParameterType Parm2; virtual ~FactoryImpl() {} -virtual AP* CreateObject(const Id& id,Parm1, Parm2 ) = 0; +virtual AP* CreateObject(const Id& id, Parm1, Parm2 ) = 0; }; -template<typename AP, typename Id, typename P1,typename P2,typename P3 > +template<typename AP, typename Id, typename P1, typename P2, typename P3 > struct FactoryImpl<AP, Id, LOKI_TYPELIST_3( P1, P2, P3 )> : public FactoryImplBase { @@ -459,10 +459,10 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_3( P1, P2, P3 )> typedef typename TypeTraits<P2>::ParameterType Parm2; typedef typename TypeTraits<P3>::ParameterType Parm3; virtual ~FactoryImpl() {} -virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3 ) = 0; +virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3 ) = 0; }; -template<typename AP, typename Id, typename P1,typename P2,typename P3,typename P4 > +template<typename AP, typename Id, typename P1, typename P2, typename P3, typename P4 > struct FactoryImpl<AP, Id, LOKI_TYPELIST_4( P1, P2, P3, P4 )> : public FactoryImplBase { @@ -471,11 +471,11 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_4( P1, P2, P3, P4 )> typedef typename TypeTraits<P3>::ParameterType Parm3; typedef typename TypeTraits<P4>::ParameterType Parm4; virtual ~FactoryImpl() {} -virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4 ) = 0; +virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4 ) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5 > +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5 > struct FactoryImpl<AP, Id, LOKI_TYPELIST_5( P1, P2, P3, P4, P5 )> : public FactoryImplBase { @@ -485,12 +485,12 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_5( P1, P2, P3, P4, P5 )> typedef typename TypeTraits<P4>::ParameterType Parm4; typedef typename TypeTraits<P5>::ParameterType Parm5; virtual ~FactoryImpl() {} -virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5 ) = 0; +virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5 ) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6> +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6 > struct FactoryImpl<AP, Id, LOKI_TYPELIST_6( P1, P2, P3, P4, P5, P6 )> : public FactoryImplBase { @@ -501,14 +501,14 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_6( P1, P2, P3, P4, P5, P6 )> typedef typename TypeTraits<P5>::ParameterType Parm5; typedef typename TypeTraits<P6>::ParameterType Parm6; virtual ~FactoryImpl() {} -virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, +virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, Parm6 ) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6,typename P7> +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6, typename P7 > struct FactoryImpl<AP, Id, LOKI_TYPELIST_7( P1, P2, P3, P4, P5, P6, P7 )> : public FactoryImplBase { @@ -520,14 +520,14 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_7( P1, P2, P3, P4, P5, P6, P7 )> typedef typename TypeTraits<P6>::ParameterType Parm6; typedef typename TypeTraits<P7>::ParameterType Parm7; virtual ~FactoryImpl() {} -virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, +virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7 ) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6,typename P7,typename P8> +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6, typename P7, typename P8 > struct FactoryImpl<AP, Id, LOKI_TYPELIST_8( P1, P2, P3, P4, P5, P6, P7, P8 )> : public FactoryImplBase { @@ -540,14 +540,14 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_8( P1, P2, P3, P4, P5, P6, P7, P8 )> typedef typename TypeTraits<P7>::ParameterType Parm7; typedef typename TypeTraits<P8>::ParameterType Parm8; virtual ~FactoryImpl() {} -virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, +virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6,typename P7,typename P8,typename P9> +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6, typename P7, typename P8, typename P9 > struct FactoryImpl<AP, Id, LOKI_TYPELIST_9( P1, P2, P3, P4, P5, P6, P7, P8, P9 )> : public FactoryImplBase { @@ -561,14 +561,14 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_9( P1, P2, P3, P4, P5, P6, P7, P8, P9 ) typedef typename TypeTraits<P8>::ParameterType Parm8; typedef typename TypeTraits<P9>::ParameterType Parm9; virtual ~FactoryImpl() {} -virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, +virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6,typename P7,typename P8,typename P9,typename P10> +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6, typename P7, typename P8, typename P9, typename P10 > struct FactoryImpl<AP, Id, LOKI_TYPELIST_10( P1, P2, P3, P4, P5, P6, P7, P8, P9, P10 )> : public FactoryImplBase { @@ -583,15 +583,15 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_10( P1, P2, P3, P4, P5, P6, P7, P8, P9, typedef typename TypeTraits<P9>::ParameterType Parm9; typedef typename TypeTraits<P10>::ParameterType Parm10; virtual ~FactoryImpl() {} -virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, - Parm6, Parm7, Parm8, Parm9,Parm10) +virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, + Parm6, Parm7, Parm8, Parm9, Parm10) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6,typename P7,typename P8,typename P9,typename P10, - typename P11> +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6, typename P7, typename P8, typename P9, typename P10, + typename P11 > struct FactoryImpl<AP, Id, LOKI_TYPELIST_11( P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11 )> : public FactoryImplBase { @@ -607,16 +607,16 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_11( P1, P2, P3, P4, P5, P6, P7, P8, P9, typedef typename TypeTraits<P10>::ParameterType Parm10; typedef typename TypeTraits<P11>::ParameterType Parm11; virtual ~FactoryImpl() {} -virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, - Parm6, Parm7, Parm8, Parm9,Parm10, +virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, + Parm6, Parm7, Parm8, Parm9, Parm10, Parm11) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6,typename P7,typename P8,typename P9,typename P10, - typename P11,typename P12> +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6, typename P7, typename P8, typename P9, typename P10, + typename P11, typename P12 > struct FactoryImpl<AP, Id, LOKI_TYPELIST_12( P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12 )> : public FactoryImplBase { @@ -633,16 +633,16 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_12( P1, P2, P3, P4, P5, P6, P7, P8, P9, typedef typename TypeTraits<P11>::ParameterType Parm11; typedef typename TypeTraits<P12>::ParameterType Parm12; virtual ~FactoryImpl() {} -virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, - Parm6, Parm7, Parm8, Parm9,Parm10, - Parm11,Parm12) +virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, + Parm6, Parm7, Parm8, Parm9, Parm10, + Parm11, Parm12) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6,typename P7,typename P8,typename P9,typename P10, - typename P11,typename P12,typename P13> +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6, typename P7, typename P8, typename P9, typename P10, + typename P11, typename P12, typename P13 > struct FactoryImpl<AP, Id, LOKI_TYPELIST_13( P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13 )> : public FactoryImplBase { @@ -660,16 +660,16 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_13( P1, P2, P3, P4, P5, P6, P7, P8, P9, typedef typename TypeTraits<P12>::ParameterType Parm12; typedef typename TypeTraits<P13>::ParameterType Parm13; virtual ~FactoryImpl() {} -virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, - Parm6, Parm7, Parm8, Parm9,Parm10, - Parm11,Parm12,Parm13) +virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, + Parm6, Parm7, Parm8, Parm9, Parm10, + Parm11, Parm12, Parm13) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6,typename P7,typename P8,typename P9,typename P10, - typename P11,typename P12,typename P13,typename P14> +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6, typename P7, typename P8, typename P9, typename P10, + typename P11, typename P12, typename P13, typename P14 > struct FactoryImpl<AP, Id, LOKI_TYPELIST_14( P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14 )> : public FactoryImplBase { @@ -688,16 +688,16 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_14( P1, P2, P3, P4, P5, P6, P7, P8, P9, typedef typename TypeTraits<P13>::ParameterType Parm13; typedef typename TypeTraits<P14>::ParameterType Parm14; virtual ~FactoryImpl() {} -virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, - Parm6, Parm7, Parm8, Parm8,Parm10, - Parm11,Parm12,Parm13,Parm14) +virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, + Parm6, Parm7, Parm8, Parm8, Parm10, + Parm11, Parm12, Parm13, Parm14) = 0; }; -template<typename AP, typename Id, - typename P1,typename P2,typename P3,typename P4,typename P5, - typename P6,typename P7,typename P8,typename P9,typename P10, - typename P11,typename P12,typename P13,typename P14,typename P15 > +template < typename AP, typename Id, + typename P1, typename P2, typename P3, typename P4, typename P5, + typename P6, typename P7, typename P8, typename P9, typename P10, + typename P11, typename P12, typename P13, typename P14, typename P15 > struct FactoryImpl<AP, Id, LOKI_TYPELIST_15( P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15 )> : public FactoryImplBase { @@ -717,9 +717,9 @@ struct FactoryImpl<AP, Id, LOKI_TYPELIST_15( P1, P2, P3, P4, P5, P6, P7, P8, P9, typedef typename TypeTraits<P14>::ParameterType Parm14; typedef typename TypeTraits<P15>::ParameterType Parm15; virtual ~FactoryImpl() {} -virtual AP* CreateObject(const Id& id,Parm1, Parm2, Parm3, Parm4, Parm5, - Parm6, Parm7, Parm8, Parm9,Parm10, - Parm11,Parm12,Parm13,Parm14,Parm15 ) +virtual AP* CreateObject(const Id& id, Parm1, Parm2, Parm3, Parm4, Parm5, + Parm6, Parm7, Parm8, Parm9, Parm10, + Parm11, Parm12, Parm13, Parm14, Parm15 ) = 0; }; @@ -809,8 +809,8 @@ public: std::vector<IdentifierType> RegisteredIds() { std::vector<IdentifierType> ids; - for(typename IdToProductMap::iterator it = associations_.begin(); - it != associations_.end(); ++it) + for (typename IdToProductMap::iterator it = associations_.begin(); + it != associations_.end(); ++it) { ids.push_back(it->first); } @@ -839,7 +839,7 @@ public: { typename IdToProductMap::iterator i = associations_.find(id); if (i != associations_.end()) - return (i->second)( p1,p2 ); + return (i->second)( p1, p2 ); return this->OnUnknownType(id); } @@ -848,7 +848,7 @@ public: { typename IdToProductMap::iterator i = associations_.find(id); if (i != associations_.end()) - return (i->second)( p1,p2,p3 ); + return (i->second)( p1, p2, p3 ); return this->OnUnknownType(id); } @@ -857,7 +857,7 @@ public: { typename IdToProductMap::iterator i = associations_.find(id); if (i != associations_.end()) - return (i->second)( p1,p2,p3,p4 ); + return (i->second)( p1, p2, p3, p4 ); return this->OnUnknownType(id); } @@ -866,7 +866,7 @@ public: { typename IdToProductMap::iterator i = associations_.find(id); if (i != associations_.end()) - return (i->second)( p1,p2,p3,p4,p5 ); + return (i->second)( p1, p2, p3, p4, p5 ); return this->OnUnknownType(id); } @@ -876,7 +876,7 @@ public: { typename IdToProductMap::iterator i = associations_.find(id); if (i != associations_.end()) - return (i->second)( p1,p2,p3,p4,p5,p6 ); + return (i->second)( p1, p2, p3, p4, p5, p6 ); return this->OnUnknownType(id); } @@ -886,7 +886,7 @@ public: { typename IdToProductMap::iterator i = associations_.find(id); if (i != associations_.end()) - return (i->second)( p1,p2,p3,p4,p5,p6,p7 ); + return (i->second)( p1, p2, p3, p4, p5, p6, p7 ); return this->OnUnknownType(id); } @@ -896,7 +896,7 @@ public: { typename IdToProductMap::iterator i = associations_.find(id); if (i != associations_.end()) - return (i->second)( p1,p2,p3,p4,p5,p6,p7,p8 ); + return (i->second)( p1, p2, p3, p4, p5, p6, p7, p8 ); return this->OnUnknownType(id); } @@ -906,16 +906,16 @@ public: { typename IdToProductMap::iterator i = associations_.find(id); if (i != associations_.end()) - return (i->second)( p1,p2,p3,p4,p5,p6,p7,p8,p9 ); + return (i->second)( p1, p2, p3, p4, p5, p6, p7, p8, p9 ); return this->OnUnknownType(id); } AbstractProduct* CreateObject(const IdentifierType& id, Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5, - Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9,Parm10 p10) + Parm6 p6, Parm7 p7, Parm8 p8, Parm9 p9, Parm10 p10) { typename IdToProductMap::iterator i = associations_.find(id); if (i != associations_.end()) - return (i->second)( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10 ); + return (i->second)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 ); return this->OnUnknownType(id); } @@ -926,7 +926,7 @@ public: { typename IdToProductMap::iterator i = associations_.find(id); if (i != associations_.end()) - return (i->second)( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11 ); + return (i->second)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 ); return this->OnUnknownType(id); } @@ -937,7 +937,7 @@ public: { typename IdToProductMap::iterator i = associations_.find(id); if (i != associations_.end()) - return (i->second)( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12 ); + return (i->second)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 ); return this->OnUnknownType(id); } @@ -948,7 +948,7 @@ public: { typename IdToProductMap::iterator i = associations_.find(id); if (i != associations_.end()) - return (i->second)( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13 ); + return (i->second)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 ); return this->OnUnknownType(id); } @@ -959,7 +959,7 @@ public: { typename IdToProductMap::iterator i = associations_.find(id); if (i != associations_.end()) - return (i->second)( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14 ); + return (i->second)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 ); return this->OnUnknownType(id); } @@ -970,7 +970,7 @@ public: { typename IdToProductMap::iterator i = associations_.find(id); if (i != associations_.end()) - return (i->second)( p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15 ); + return (i->second)( p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 ); return this->OnUnknownType(id); } diff --git a/shared/loki/Function.h b/shared/loki/Function.h index f2badfe9..5f388d3c 100644 --- a/shared/loki/Function.h +++ b/shared/loki/Function.h @@ -54,7 +54,7 @@ struct Function<R()> : public Functor<R> Function(const Function& func) : FBase() { - if( !func.empty()) + if ( !func.empty()) FBase::operator=(func); } @@ -62,14 +62,14 @@ Function(const Function& func) : FBase() template<class R2> Function(Function<R2()> func) : FBase() { - if(!func.empty()) + if (!func.empty()) FBase::operator=(func); } // clear by '= 0' Function(const int i) : FBase() { - if(i==0) + if (i == 0) FBase::clear(); else throw std::runtime_error("Loki::Function(const int i): i!=0"); @@ -79,7 +79,7 @@ template<class Func> Function(Func func) : FBase(func) {} template<class Host, class Func> -Function(const Host& host, const Func& func) : FBase(host,func) {} +Function(const Host& host, const Func& func) : FBase(host, func) {} }; @@ -89,38 +89,38 @@ Function(const Host& host, const Func& func) : FBase(host,func) {} //////////////////////////////////////////////////////////////////////////////// #define LOKI_FUNCTION_BODY \ - \ - Function() : FBase() {} \ - \ - Function(const Function& func) : FBase() \ - { \ - if( !func.empty()) \ - FBase::operator=(func); \ - } \ - \ - Function(const int i) : FBase() \ - { \ - if(i==0) \ - FBase::clear(); \ - else \ - throw std::runtime_error( \ - "Loki::Function(const int i): i!=0"); \ - } \ - \ - template<class Func> \ - Function(Func func) : FBase(func) {} \ - \ - template<class Host, class Func> \ - Function(const Host& host, const Func& func): FBase(host,func) {} + \ + Function() : FBase() {} \ + \ + Function(const Function& func) : FBase() \ + { \ + if( !func.empty()) \ + FBase::operator=(func); \ + } \ + \ + Function(const int i) : FBase() \ + { \ + if(i==0) \ + FBase::clear(); \ + else \ + throw std::runtime_error( \ + "Loki::Function(const int i): i!=0"); \ + } \ + \ + template<class Func> \ + Function(Func func) : FBase(func) {} \ + \ + template<class Host, class Func> \ + Function(const Host& host, const Func& func): FBase(host,func) {} #define LOKI_FUNCTION_R2_CTOR_BODY \ - \ - : FBase() \ - { \ - if(!func.empty()) \ - FBase::operator=(func); \ - } + \ + : FBase() \ + { \ + if(!func.empty()) \ + FBase::operator=(func); \ + } //////////////////////////////////////////////////////////////////////////////// @@ -143,225 +143,225 @@ struct Function<> // or define LOKI_ENABLE_FUNCTION }; -template<class R,class P01> +template<class R, class P01> struct Function<R(P01)> : public Loki::Functor<R, Seq<P01> > { typedef Functor<R, Seq<P01> > FBase; - template<class R2,class Q01> + template<class R2, class Q01> Function(Function<R2(Q01)> func) LOKI_FUNCTION_R2_CTOR_BODY LOKI_FUNCTION_BODY }; -template<class R,class P01,class P02> -struct Function<R(P01,P02)> -: public Functor<R, Seq<P01,P02> > +template<class R, class P01, class P02> +struct Function<R(P01, P02)> +: public Functor<R, Seq<P01, P02> > { - typedef Functor<R, Seq<P01,P02> > FBase; + typedef Functor<R, Seq<P01, P02> > FBase; - template<class R2,class Q01, class Q02> - Function(Function<R2(Q01,Q02)> func) + template<class R2, class Q01, class Q02> + Function(Function<R2(Q01, Q02)> func) LOKI_FUNCTION_R2_CTOR_BODY LOKI_FUNCTION_BODY }; -template<class R,class P01,class P02, class P03> -struct Function<R(P01,P02,P03)> -: public Functor<R, Seq<P01,P02,P03> > +template<class R, class P01, class P02, class P03> +struct Function<R(P01, P02, P03)> +: public Functor<R, Seq<P01, P02, P03> > { - typedef Functor<R, Seq<P01,P02,P03> > FBase; + typedef Functor<R, Seq<P01, P02, P03> > FBase; - template<class R2,class Q01, class Q02,class Q03> - Function(Function<R2(Q01,Q02,Q03)> func) + template<class R2, class Q01, class Q02, class Q03> + Function(Function<R2(Q01, Q02, Q03)> func) LOKI_FUNCTION_R2_CTOR_BODY LOKI_FUNCTION_BODY }; -template<class R,class P01,class P02, class P03,class P04> -struct Function<R(P01,P02,P03,P04)> -: public Functor<R, Seq<P01,P02,P03,P04> > +template<class R, class P01, class P02, class P03, class P04> +struct Function<R(P01, P02, P03, P04)> +: public Functor<R, Seq<P01, P02, P03, P04> > { - typedef Functor<R, Seq<P01,P02,P03,P04> > FBase; + typedef Functor<R, Seq<P01, P02, P03, P04> > FBase; - template<class R2,class Q01,class Q02, class Q03,class Q04> - Function(Function<R2(Q01,Q02,Q03,Q04)> func) + template<class R2, class Q01, class Q02, class Q03, class Q04> + Function(Function<R2(Q01, Q02, Q03, Q04)> func) LOKI_FUNCTION_R2_CTOR_BODY LOKI_FUNCTION_BODY }; -template<class R,class P01,class P02, class P03,class P04,class P05> -struct Function<R(P01,P02,P03,P04,P05)> -: public Functor<R, Seq<P01,P02,P03,P04,P05> > +template<class R, class P01, class P02, class P03, class P04, class P05> +struct Function<R(P01, P02, P03, P04, P05)> +: public Functor<R, Seq<P01, P02, P03, P04, P05> > { - typedef Functor<R, Seq<P01,P02,P03,P04,P05> > FBase; + typedef Functor<R, Seq<P01, P02, P03, P04, P05> > FBase; - template<class R2,class Q01,class Q02, class Q03,class Q04,class Q05> - Function(Function<R2(Q01,Q02,Q03,Q04,Q05)> func) + template<class R2, class Q01, class Q02, class Q03, class Q04, class Q05> + Function(Function<R2(Q01, Q02, Q03, Q04, Q05)> func) LOKI_FUNCTION_R2_CTOR_BODY LOKI_FUNCTION_BODY }; -template<class R, class P01,class P02, class P03,class P04,class P05, - class P06> -struct Function<R(P01,P02,P03,P04,P05,P06)> -: public Functor<R, Seq<P01,P02,P03,P04,P05,P06> > +template < class R, class P01, class P02, class P03, class P04, class P05, + class P06 > +struct Function<R(P01, P02, P03, P04, P05, P06)> +: public Functor<R, Seq<P01, P02, P03, P04, P05, P06> > { - typedef Functor<R, Seq<P01,P02,P03,P04,P05,P06> > FBase; + typedef Functor<R, Seq<P01, P02, P03, P04, P05, P06> > FBase; - template<class R2, class Q01,class Q02, class Q03,class Q04,class Q05, - class Q06> - Function(Function<R2(Q01,Q02,Q03,Q04,Q05,Q06)> func) + template < class R2, class Q01, class Q02, class Q03, class Q04, class Q05, + class Q06 > + Function(Function<R2(Q01, Q02, Q03, Q04, Q05, Q06)> func) LOKI_FUNCTION_R2_CTOR_BODY LOKI_FUNCTION_BODY }; -template<class R, class P01,class P02, class P03,class P04,class P05, - class P06,class P07> -struct Function<R(P01,P02,P03,P04,P05,P06,P07)> -: public Functor<R, Seq<P01,P02,P03,P04,P05,P06,P07> > +template < class R, class P01, class P02, class P03, class P04, class P05, + class P06, class P07 > +struct Function<R(P01, P02, P03, P04, P05, P06, P07)> +: public Functor<R, Seq<P01, P02, P03, P04, P05, P06, P07> > { - typedef Functor<R, Seq<P01,P02,P03,P04,P05,P06,P07> > FBase; + typedef Functor<R, Seq<P01, P02, P03, P04, P05, P06, P07> > FBase; - template<class R2, class Q01,class Q02, class Q03,class Q04,class Q05, - class Q06,class Q07> - Function(Function<R2(Q01,Q02,Q03,Q04,Q05,Q06,Q07)> func) + template < class R2, class Q01, class Q02, class Q03, class Q04, class Q05, + class Q06, class Q07 > + Function(Function<R2(Q01, Q02, Q03, Q04, Q05, Q06, Q07)> func) LOKI_FUNCTION_R2_CTOR_BODY LOKI_FUNCTION_BODY }; -template<class R, class P01,class P02, class P03,class P04,class P05, - class P06,class P07, class P08> -struct Function<R(P01,P02,P03,P04,P05,P06,P07,P08)> -: public Functor<R, Seq<P01,P02,P03,P04,P05,P06,P07,P08> > +template < class R, class P01, class P02, class P03, class P04, class P05, + class P06, class P07, class P08 > +struct Function<R(P01, P02, P03, P04, P05, P06, P07, P08)> +: public Functor<R, Seq<P01, P02, P03, P04, P05, P06, P07, P08> > { - typedef Functor<R, Seq<P01,P02,P03,P04,P05,P06,P07,P08> > FBase; + typedef Functor<R, Seq<P01, P02, P03, P04, P05, P06, P07, P08> > FBase; - template<class R2, class Q01,class Q02, class Q03,class Q04,class Q05, - class Q06,class Q07, class Q08> - Function(Function<R2(Q01,Q02,Q03,Q04,Q05,Q06,Q07,Q08)> func) + template < class R2, class Q01, class Q02, class Q03, class Q04, class Q05, + class Q06, class Q07, class Q08 > + Function(Function<R2(Q01, Q02, Q03, Q04, Q05, Q06, Q07, Q08)> func) LOKI_FUNCTION_R2_CTOR_BODY LOKI_FUNCTION_BODY }; -template<class R, class P01,class P02, class P03,class P04,class P05, - class P06,class P07, class P08,class P09> -struct Function<R(P01,P02,P03,P04,P05,P06,P07,P08,P09)> -: public Functor<R, Seq<P01,P02,P03,P04,P05,P06,P07,P08,P09> > +template < class R, class P01, class P02, class P03, class P04, class P05, + class P06, class P07, class P08, class P09 > +struct Function<R(P01, P02, P03, P04, P05, P06, P07, P08, P09)> +: public Functor<R, Seq<P01, P02, P03, P04, P05, P06, P07, P08, P09> > { - typedef Functor<R, Seq<P01,P02,P03,P04,P05,P06,P07,P08,P09 > > FBase; + typedef Functor<R, Seq<P01, P02, P03, P04, P05, P06, P07, P08, P09 > > FBase; - template<class R2, class Q01,class Q02, class Q03,class Q04,class Q05, - class Q06,class Q07, class Q08,class Q09> - Function(Function<R2(Q01,Q02,Q03,Q04,Q05,Q06,Q07,Q08,Q09)> func) + template < class R2, class Q01, class Q02, class Q03, class Q04, class Q05, + class Q06, class Q07, class Q08, class Q09 > + Function(Function<R2(Q01, Q02, Q03, Q04, Q05, Q06, Q07, Q08, Q09)> func) LOKI_FUNCTION_R2_CTOR_BODY LOKI_FUNCTION_BODY }; -template<class R, class P01,class P02, class P03,class P04,class P05, - class P06,class P07, class P08,class P09,class P10> -struct Function<R(P01,P02,P03,P04,P05,P06,P07,P08,P09,P10)> -: public Functor<R, Seq<P01,P02,P03,P04,P05,P06,P07,P08,P09,P10> > +template < class R, class P01, class P02, class P03, class P04, class P05, + class P06, class P07, class P08, class P09, class P10 > +struct Function<R(P01, P02, P03, P04, P05, P06, P07, P08, P09, P10)> +: public Functor<R, Seq<P01, P02, P03, P04, P05, P06, P07, P08, P09, P10> > { - typedef Functor<R, Seq<P01,P02,P03,P04,P05,P06,P07,P08,P09,P10> > FBase; + typedef Functor<R, Seq<P01, P02, P03, P04, P05, P06, P07, P08, P09, P10> > FBase; - template<class R2, class Q01,class Q02, class Q03,class Q04,class Q05, - class Q06,class Q07, class Q08,class Q09,class Q10> - Function(Function<R2(Q01,Q02,Q03,Q04,Q05,Q06,Q07,Q08,Q09,Q10)> func) + template < class R2, class Q01, class Q02, class Q03, class Q04, class Q05, + class Q06, class Q07, class Q08, class Q09, class Q10 > + Function(Function<R2(Q01, Q02, Q03, Q04, Q05, Q06, Q07, Q08, Q09, Q10)> func) LOKI_FUNCTION_R2_CTOR_BODY LOKI_FUNCTION_BODY }; -template<class R, class P01,class P02, class P03,class P04,class P05, - class P06,class P07, class P08,class P09,class P10, - class P11> -struct Function<R(P01,P02,P03,P04,P05,P06,P07,P08,P09,P10,P11)> -: public Functor<R, Seq<P01,P02,P03,P04,P05,P06,P07,P08,P09,P10,P11> > +template < class R, class P01, class P02, class P03, class P04, class P05, + class P06, class P07, class P08, class P09, class P10, + class P11 > +struct Function<R(P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11)> +: public Functor<R, Seq<P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11> > { - typedef Functor<R, Seq<P01,P02,P03,P04,P05,P06,P07,P08,P09,P10,P11> >FBase; + typedef Functor<R, Seq<P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11> >FBase; - template<class R2, class Q01,class Q02, class Q03,class Q04,class Q05, - class Q06,class Q07, class Q08,class Q09,class Q10, - class Q11> - Function(Function<R2(Q01,Q02,Q03,Q04,Q05,Q06,Q07,Q08,Q09,Q10,Q11)> func) + template < class R2, class Q01, class Q02, class Q03, class Q04, class Q05, + class Q06, class Q07, class Q08, class Q09, class Q10, + class Q11 > + Function(Function<R2(Q01, Q02, Q03, Q04, Q05, Q06, Q07, Q08, Q09, Q10, Q11)> func) LOKI_FUNCTION_R2_CTOR_BODY LOKI_FUNCTION_BODY }; -template<class R, class P01,class P02, class P03,class P04,class P05, - class P06,class P07, class P08,class P09,class P10, - class P11,class P12> -struct Function<R(P01,P02,P03,P04,P05,P06,P07,P08,P09,P10,P11,P12)> -: public Functor<R, Seq<P01,P02,P03,P04,P05,P06,P07,P08,P09,P10,P11,P12> > +template < class R, class P01, class P02, class P03, class P04, class P05, + class P06, class P07, class P08, class P09, class P10, + class P11, class P12 > +struct Function<R(P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12)> +: public Functor<R, Seq<P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12> > { - typedef Functor<R, Seq<P01,P02,P03,P04,P05,P06,P07,P08,P09,P10,P11,P12> > FBase; + typedef Functor<R, Seq<P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12> > FBase; - template<class R2, class Q01,class Q02, class Q03,class Q04,class Q05, - class Q06,class Q07, class Q08,class Q09,class Q10, - class Q11,class Q12> - Function(Function<R2(Q01,Q02,Q03,Q04,Q05,Q06,Q07,Q08,Q09,Q10,Q11,Q12)> func) + template < class R2, class Q01, class Q02, class Q03, class Q04, class Q05, + class Q06, class Q07, class Q08, class Q09, class Q10, + class Q11, class Q12 > + Function(Function<R2(Q01, Q02, Q03, Q04, Q05, Q06, Q07, Q08, Q09, Q10, Q11, Q12)> func) LOKI_FUNCTION_R2_CTOR_BODY LOKI_FUNCTION_BODY }; -template<class R, class P01,class P02, class P03,class P04,class P05, - class P06,class P07, class P08,class P09,class P10, - class P11,class P12, class P13> -struct Function<R(P01,P02,P03,P04,P05,P06,P07,P08,P09,P10,P11,P12,P13)> -: public Functor<R, Seq<P01,P02,P03,P04,P05,P06,P07,P08,P09,P10,P11,P12,P13> > +template < class R, class P01, class P02, class P03, class P04, class P05, + class P06, class P07, class P08, class P09, class P10, + class P11, class P12, class P13 > +struct Function<R(P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13)> +: public Functor<R, Seq<P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13> > { - typedef Functor<R, Seq<P01,P02,P03,P04,P05,P06,P07,P08,P09,P10,P11,P12,P13> > FBase; + typedef Functor<R, Seq<P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13> > FBase; - template<class R2, class Q01,class Q02, class Q03,class Q04,class Q05, - class Q06,class Q07, class Q08,class Q09,class Q10, - class Q11,class Q12, class Q13> - Function(Function<R2(Q01,Q02,Q03,Q04,Q05,Q06,Q07,Q08,Q09,Q10,Q11,Q12,Q13)> func) + template < class R2, class Q01, class Q02, class Q03, class Q04, class Q05, + class Q06, class Q07, class Q08, class Q09, class Q10, + class Q11, class Q12, class Q13 > + Function(Function<R2(Q01, Q02, Q03, Q04, Q05, Q06, Q07, Q08, Q09, Q10, Q11, Q12, Q13)> func) LOKI_FUNCTION_R2_CTOR_BODY LOKI_FUNCTION_BODY }; -template<class R, class P01,class P02, class P03,class P04,class P05, - class P06,class P07, class P08,class P09,class P10, - class P11,class P12, class P13,class P14> -struct Function<R(P01,P02,P03,P04,P05,P06,P07,P08,P09,P10,P11,P12,P13,P14)> -: public Functor<R, Seq<P01,P02,P03,P04,P05,P06,P07,P08,P09,P10,P11,P12,P13,P14> > +template < class R, class P01, class P02, class P03, class P04, class P05, + class P06, class P07, class P08, class P09, class P10, + class P11, class P12, class P13, class P14 > +struct Function<R(P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14)> +: public Functor<R, Seq<P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14> > { - typedef Functor<R, Seq<P01,P02,P03,P04,P05,P06,P07,P08,P09,P10,P11,P12,P13,P14> > FBase; - template<class R2, class Q01,class Q02, class Q03,class Q04,class Q05, - class Q06,class Q07, class Q08,class Q09,class Q10, - class Q11,class Q12, class Q13,class Q14> - Function(Function<R2(Q01,Q02,Q03,Q04,Q05,Q06,Q07,Q08,Q09,Q10,Q11,Q12,Q13,Q14)> func) + typedef Functor<R, Seq<P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14> > FBase; + template < class R2, class Q01, class Q02, class Q03, class Q04, class Q05, + class Q06, class Q07, class Q08, class Q09, class Q10, + class Q11, class Q12, class Q13, class Q14 > + Function(Function<R2(Q01, Q02, Q03, Q04, Q05, Q06, Q07, Q08, Q09, Q10, Q11, Q12, Q13, Q14)> func) LOKI_FUNCTION_R2_CTOR_BODY LOKI_FUNCTION_BODY }; -template<class R, class P01,class P02, class P03,class P04,class P05, - class P06,class P07, class P08,class P09,class P10, - class P11,class P12, class P13,class P14,class P15> -struct Function<R(P01,P02,P03,P04,P05,P06,P07,P08,P09,P10,P11,P12,P13,P14,P15)> -: public Functor<R, Seq<P01,P02,P03,P04,P05,P06,P07,P08,P09,P10,P11,P12,P13,P14,P15> > +template < class R, class P01, class P02, class P03, class P04, class P05, + class P06, class P07, class P08, class P09, class P10, + class P11, class P12, class P13, class P14, class P15 > +struct Function<R(P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15)> +: public Functor<R, Seq<P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15> > { - typedef Functor<R, Seq<P01,P02,P03,P04,P05,P06,P07,P08,P09,P10,P11,P12,P13,P14,P15> > FBase; + typedef Functor<R, Seq<P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15> > FBase; - template<class R2, class Q01,class Q02, class Q03,class Q04,class Q05, - class Q06,class Q07, class Q08,class Q09,class Q10, - class Q11,class Q12, class Q13,class Q14,class Q15> - Function(Function<R2(Q01,Q02,Q03,Q04,Q05,Q06,Q07,Q08,Q09,Q10,Q11,Q12,Q13,Q14,Q15)> func) + template < class R2, class Q01, class Q02, class Q03, class Q04, class Q05, + class Q06, class Q07, class Q08, class Q09, class Q10, + class Q11, class Q12, class Q13, class Q14, class Q15 > + Function(Function<R2(Q01, Q02, Q03, Q04, Q05, Q06, Q07, Q08, Q09, Q10, Q11, Q12, Q13, Q14, Q15)> func) LOKI_FUNCTION_R2_CTOR_BODY LOKI_FUNCTION_BODY diff --git a/shared/loki/Functor.h b/shared/loki/Functor.h index a03f87c8..664af077 100644 --- a/shared/loki/Functor.h +++ b/shared/loki/Functor.h @@ -122,8 +122,8 @@ struct FunctorImplBase // Specializations of FunctorImpl for up to 15 parameters follow //////////////////////////////////////////////////////////////////////////////// -template <typename R, class TList, - template <class, class> class ThreadingModel = LOKI_DEFAULT_THREADING_NO_OBJ_LEVEL> +template < typename R, class TList, + template <class, class> class ThreadingModel = LOKI_DEFAULT_THREADING_NO_OBJ_LEVEL > class FunctorImpl; //////////////////////////////////////////////////////////////////////////////// @@ -160,8 +160,8 @@ public: // Specialization for 2 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, - template <class, class> class ThreadingModel> +template < typename R, typename P1, typename P2, + template <class, class> class ThreadingModel > class FunctorImpl<R, Seq<P1, P2>, ThreadingModel> : public Private::FunctorImplBase<R, ThreadingModel> { @@ -177,8 +177,8 @@ public: // Specialization for 3 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, - template <class, class> class ThreadingModel> +template < typename R, typename P1, typename P2, typename P3, + template <class, class> class ThreadingModel > class FunctorImpl<R, Seq<P1, P2, P3>, ThreadingModel> : public Private::FunctorImplBase<R, ThreadingModel> { @@ -195,8 +195,8 @@ public: // Specialization for 4 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, - template <class, class> class ThreadingModel> +template < typename R, typename P1, typename P2, typename P3, typename P4, + template <class, class> class ThreadingModel > class FunctorImpl<R, Seq<P1, P2, P3, P4>, ThreadingModel> : public Private::FunctorImplBase<R, ThreadingModel> { @@ -214,9 +214,9 @@ public: // Specialization for 5 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, - template <class, class> class ThreadingModel> + template <class, class> class ThreadingModel > class FunctorImpl<R, Seq<P1, P2, P3, P4, P5>, ThreadingModel> : public Private::FunctorImplBase<R, ThreadingModel> { @@ -235,9 +235,9 @@ public: // Specialization for 6 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, - template <class, class> class ThreadingModel> + template <class, class> class ThreadingModel > class FunctorImpl<R, Seq<P1, P2, P3, P4, P5, P6>, ThreadingModel> : public Private::FunctorImplBase<R, ThreadingModel> { @@ -257,9 +257,9 @@ public: // Specialization for 7 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, - template <class, class> class ThreadingModel> + template <class, class> class ThreadingModel > class FunctorImpl<R, Seq<P1, P2, P3, P4, P5, P6, P7>, ThreadingModel> : public Private::FunctorImplBase<R, ThreadingModel> { @@ -281,11 +281,11 @@ public: // Specialization for 8 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, - template <class, class> class ThreadingModel> -class FunctorImpl<R, Seq<P1, P2, P3, P4, P5, P6, P7, P8>, - ThreadingModel> + template <class, class> class ThreadingModel > +class FunctorImpl < R, Seq<P1, P2, P3, P4, P5, P6, P7, P8>, + ThreadingModel > : public Private::FunctorImplBase<R, ThreadingModel> { public: @@ -307,11 +307,11 @@ public: // Specialization for 9 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, - template <class, class> class ThreadingModel> -class FunctorImpl<R, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9>, - ThreadingModel> + template <class, class> class ThreadingModel > +class FunctorImpl < R, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9>, + ThreadingModel > : public Private::FunctorImplBase<R, ThreadingModel> { public: @@ -334,12 +334,12 @@ public: // Specialization for 10 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, typename P10, - template <class, class> class ThreadingModel> -class FunctorImpl<R, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10>, - ThreadingModel> + template <class, class> class ThreadingModel > +class FunctorImpl < R, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10>, + ThreadingModel > : public Private::FunctorImplBase<R, ThreadingModel> { public: @@ -363,13 +363,13 @@ public: // Specialization for 11 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, typename P10, typename P11, - template <class, class> class ThreadingModel> -class FunctorImpl<R, + template <class, class> class ThreadingModel > +class FunctorImpl < R, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11>, - ThreadingModel> + ThreadingModel > : public Private::FunctorImplBase<R, ThreadingModel> { public: @@ -394,13 +394,13 @@ public: // Specialization for 12 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, typename P10, typename P11, typename P12, - template <class, class> class ThreadingModel> -class FunctorImpl<R, + template <class, class> class ThreadingModel > +class FunctorImpl < R, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12>, - ThreadingModel> + ThreadingModel > : public Private::FunctorImplBase<R, ThreadingModel> { public: @@ -426,13 +426,13 @@ public: // Specialization for 13 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, typename P10, typename P11, typename P12, typename P13, - template <class, class> class ThreadingModel> -class FunctorImpl<R, + template <class, class> class ThreadingModel > +class FunctorImpl < R, Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13>, - ThreadingModel> + ThreadingModel > : public Private::FunctorImplBase<R, ThreadingModel> { public: @@ -459,14 +459,14 @@ public: // Specialization for 14 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, typename P10, typename P11, typename P12, typename P13, typename P14, - template <class, class> class ThreadingModel> -class FunctorImpl<R, - Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, - P14>, - ThreadingModel> + template <class, class> class ThreadingModel > +class FunctorImpl < R, + Seq < P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, + P14 > , + ThreadingModel > : public Private::FunctorImplBase<R, ThreadingModel> { public: @@ -494,14 +494,14 @@ public: // Specialization for 15 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, typename P10, typename P11, typename P12, typename P13, typename P14, - typename P15, template <class, class> class ThreadingModel> -class FunctorImpl<R, - Seq<P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, - P14, P15>, - ThreadingModel> + typename P15, template <class, class> class ThreadingModel > +class FunctorImpl < R, + Seq < P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, + P14, P15 > , + ThreadingModel > : public Private::FunctorImplBase<R, ThreadingModel> { public: @@ -548,8 +548,8 @@ public: // Specialization for 2 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, - template <class, class> class ThreadingModel> +template < typename R, typename P1, typename P2, + template <class, class> class ThreadingModel > class FunctorImpl<R, LOKI_TYPELIST_2(P1, P2), ThreadingModel> : public Private::FunctorImplBase<R, ThreadingModel> { @@ -565,8 +565,8 @@ public: // Specialization for 3 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, - template <class, class> class ThreadingModel> +template < typename R, typename P1, typename P2, typename P3, + template <class, class> class ThreadingModel > class FunctorImpl<R, LOKI_TYPELIST_3(P1, P2, P3), ThreadingModel> : public Private::FunctorImplBase<R, ThreadingModel> { @@ -583,8 +583,8 @@ public: // Specialization for 4 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, - template <class, class> class ThreadingModel> +template < typename R, typename P1, typename P2, typename P3, typename P4, + template <class, class> class ThreadingModel > class FunctorImpl<R, LOKI_TYPELIST_4(P1, P2, P3, P4), ThreadingModel> : public Private::FunctorImplBase<R, ThreadingModel> { @@ -602,9 +602,9 @@ public: // Specialization for 5 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, - template <class, class> class ThreadingModel> + template <class, class> class ThreadingModel > class FunctorImpl<R, LOKI_TYPELIST_5(P1, P2, P3, P4, P5), ThreadingModel> : public Private::FunctorImplBase<R, ThreadingModel> { @@ -623,9 +623,9 @@ public: // Specialization for 6 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, - template <class, class> class ThreadingModel> + template <class, class> class ThreadingModel > class FunctorImpl<R, LOKI_TYPELIST_6(P1, P2, P3, P4, P5, P6), ThreadingModel> : public Private::FunctorImplBase<R, ThreadingModel> { @@ -645,9 +645,9 @@ public: // Specialization for 7 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, - template <class, class> class ThreadingModel> + template <class, class> class ThreadingModel > class FunctorImpl<R, LOKI_TYPELIST_7(P1, P2, P3, P4, P5, P6, P7), ThreadingModel> : public Private::FunctorImplBase<R, ThreadingModel> { @@ -669,11 +669,11 @@ public: // Specialization for 8 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, - template <class, class> class ThreadingModel> -class FunctorImpl<R, LOKI_TYPELIST_8(P1, P2, P3, P4, P5, P6, P7, P8), - ThreadingModel> + template <class, class> class ThreadingModel > +class FunctorImpl < R, LOKI_TYPELIST_8(P1, P2, P3, P4, P5, P6, P7, P8), + ThreadingModel > : public Private::FunctorImplBase<R, ThreadingModel> { public: @@ -695,11 +695,11 @@ public: // Specialization for 9 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, - template <class, class> class ThreadingModel> -class FunctorImpl<R, LOKI_TYPELIST_9(P1, P2, P3, P4, P5, P6, P7, P8, P9), - ThreadingModel> + template <class, class> class ThreadingModel > +class FunctorImpl < R, LOKI_TYPELIST_9(P1, P2, P3, P4, P5, P6, P7, P8, P9), + ThreadingModel > : public Private::FunctorImplBase<R, ThreadingModel> { public: @@ -722,12 +722,12 @@ public: // Specialization for 10 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, typename P10, - template <class, class> class ThreadingModel> -class FunctorImpl<R, LOKI_TYPELIST_10(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10), - ThreadingModel> + template <class, class> class ThreadingModel > +class FunctorImpl < R, LOKI_TYPELIST_10(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10), + ThreadingModel > : public Private::FunctorImplBase<R, ThreadingModel> { public: @@ -751,13 +751,13 @@ public: // Specialization for 11 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, typename P10, typename P11, - template <class, class> class ThreadingModel> -class FunctorImpl<R, + template <class, class> class ThreadingModel > +class FunctorImpl < R, LOKI_TYPELIST_11(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11), - ThreadingModel> + ThreadingModel > : public Private::FunctorImplBase<R, ThreadingModel> { public: @@ -782,13 +782,13 @@ public: // Specialization for 12 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, typename P10, typename P11, typename P12, - template <class, class> class ThreadingModel> -class FunctorImpl<R, + template <class, class> class ThreadingModel > +class FunctorImpl < R, LOKI_TYPELIST_12(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12), - ThreadingModel> + ThreadingModel > : public Private::FunctorImplBase<R, ThreadingModel> { public: @@ -814,13 +814,13 @@ public: // Specialization for 13 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, typename P10, typename P11, typename P12, typename P13, - template <class, class> class ThreadingModel> -class FunctorImpl<R, + template <class, class> class ThreadingModel > +class FunctorImpl < R, LOKI_TYPELIST_13(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13), - ThreadingModel> + ThreadingModel > : public Private::FunctorImplBase<R, ThreadingModel> { public: @@ -847,14 +847,14 @@ public: // Specialization for 14 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, typename P10, typename P11, typename P12, typename P13, typename P14, - template <class, class> class ThreadingModel> -class FunctorImpl<R, + template <class, class> class ThreadingModel > +class FunctorImpl < R, LOKI_TYPELIST_14(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14), - ThreadingModel> + ThreadingModel > : public Private::FunctorImplBase<R, ThreadingModel> { public: @@ -882,14 +882,14 @@ public: // Specialization for 15 parameters //////////////////////////////////////////////////////////////////////////////// -template <typename R, typename P1, typename P2, typename P3, typename P4, +template < typename R, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename P9, typename P10, typename P11, typename P12, typename P13, typename P14, - typename P15, template <class, class> class ThreadingModel> -class FunctorImpl<R, + typename P15, template <class, class> class ThreadingModel > +class FunctorImpl < R, LOKI_TYPELIST_15(P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15), - ThreadingModel> + ThreadingModel > : public Private::FunctorImplBase<R, ThreadingModel> { public: @@ -957,13 +957,13 @@ public: { // there is no static information if Functor holds a member function // or a free function; this is the main difference to tr1::function - if(typeid(*this) != typeid(rhs)) + if (typeid(*this) != typeid(rhs)) return false; // cannot be equal const FunctorHandler& fh = static_cast<const FunctorHandler&>(rhs); // if this line gives a compiler error, you are using a function object. // you need to implement bool MyFnObj::operator == (const MyFnObj&) const; - return f_==fh.f_; + return f_ == fh.f_; } #endif // operator() implementations for up to 15 arguments @@ -1045,8 +1045,8 @@ private: // Wraps pointers to member functions //////////////////////////////////////////////////////////////////////////////// -template <class ParentFunctor, typename PointerToObj, - typename PointerToMemFn> +template < class ParentFunctor, typename PointerToObj, + typename PointerToMemFn > class MemFunHandler : public ParentFunctor::Impl { typedef typename ParentFunctor::Impl Base; @@ -1080,13 +1080,13 @@ public: bool operator==(const typename Base::FunctorImplBaseType& rhs) const { - if(typeid(*this) != typeid(rhs)) + if (typeid(*this) != typeid(rhs)) return false; // cannot be equal const MemFunHandler& mfh = static_cast<const MemFunHandler&>(rhs); // if this line gives a compiler error, you are using a function object. // you need to implement bool MyFnObj::operator == (const MyFnObj&) const; - return pObj_==mfh.pObj_ && pMemFn_==mfh.pMemFn_; + return pObj_ == mfh.pObj_ && pMemFn_ == mfh.pMemFn_; } #endif @@ -1215,8 +1215,8 @@ public: /// objects which have no operator== implemented, keep in mind when you enable /// operator==. //////////////////////////////////////////////////////////////////////////////// -template <typename R = void, class TList = NullType, - template<class, class> class ThreadingModel = LOKI_DEFAULT_THREADING_NO_OBJ_LEVEL> +template < typename R = void, class TList = NullType, + template<class, class> class ThreadingModel = LOKI_DEFAULT_THREADING_NO_OBJ_LEVEL > class Functor { public: @@ -1295,9 +1295,9 @@ public: bool operator==(const Functor& rhs) const { - if(spImpl_.get()==0 && rhs.spImpl_.get()==0) + if (spImpl_.get() == 0 && rhs.spImpl_.get() == 0) return true; - if(spImpl_.get()!=0 && rhs.spImpl_.get()!=0) + if (spImpl_.get() != 0 && rhs.spImpl_.get() != 0) return *spImpl_.get() == *rhs.spImpl_.get(); else return false; @@ -1305,7 +1305,7 @@ public: bool operator!=(const Functor& rhs) const { - return !(*this==rhs); + return !(*this == rhs); } #endif @@ -1445,7 +1445,7 @@ struct BinderFirstTraits< Functor<R, TList, ThreadingModel> > { typedef Functor<R, TList, ThreadingModel> OriginalFunctor; - typedef typename TL::Erase<TList,typename TL::TypeAt<TList, 0>::Result> + typedef typename TL::Erase<TList, typename TL::TypeAt<TList, 0>::Result> ::Result ParmList; @@ -1493,9 +1493,9 @@ class BinderFirst typedef typename OriginalFunctor::Parm1 BoundType; - typedef typename Private::BinderFirstBoundTypeStorage< + typedef typename Private::BinderFirstBoundTypeStorage < typename Private::BinderFirstTraits<OriginalFunctor> - ::OriginalParm1> + ::OriginalParm1 > ::RefOrValue BoundTypeStorage; @@ -1527,7 +1527,7 @@ public: bool operator==(const typename Base::FunctorImplBaseType& rhs) const { - if(typeid(*this) != typeid(rhs)) + if (typeid(*this) != typeid(rhs)) return false; // cannot be equal // if this line gives a compiler error, you are using a function object. // you need to implement bool MyFnObj::operator == (const MyFnObj&) const; @@ -1659,7 +1659,7 @@ public: bool operator==(const typename Base::Impl::FunctorImplBaseType& rhs) const { - if(typeid(*this) != typeid(rhs)) + if (typeid(*this) != typeid(rhs)) return false; // cannot be equal // if this line gives a compiler error, you are using a function object. // you need to implement bool MyFnObj::operator == (const MyFnObj&) const; diff --git a/shared/loki/HierarchyGenerators.h b/shared/loki/HierarchyGenerators.h index 83ec194c..126e0f3e 100644 --- a/shared/loki/HierarchyGenerators.h +++ b/shared/loki/HierarchyGenerators.h @@ -164,14 +164,14 @@ struct FieldHelper<H, 0> typedef const typename H::LeftBase ConstLeftBase; - typedef typename Select<isConst, ConstLeftBase, - typename H::LeftBase>::Result LeftBase; + typedef typename Select < isConst, ConstLeftBase, + typename H::LeftBase >::Result LeftBase; - typedef typename Select<isTuple, ElementType, - UnitType>::Result UnqualifiedResultType; + typedef typename Select < isTuple, ElementType, + UnitType >::Result UnqualifiedResultType; - typedef typename Select<isConst, const UnqualifiedResultType, - UnqualifiedResultType>::Result ResultType; + typedef typename Select < isConst, const UnqualifiedResultType, + UnqualifiedResultType >::Result ResultType; static ResultType& Do(H& obj) { @@ -194,19 +194,19 @@ struct FieldHelper typedef const typename H::RightBase ConstRightBase; - typedef typename Select<isConst, ConstRightBase, - typename H::RightBase>::Result RightBase; + typedef typename Select < isConst, ConstRightBase, + typename H::RightBase >::Result RightBase; - typedef typename Select<isTuple, ElementType, - UnitType>::Result UnqualifiedResultType; + typedef typename Select < isTuple, ElementType, + UnitType >::Result UnqualifiedResultType; - typedef typename Select<isConst, const UnqualifiedResultType, - UnqualifiedResultType>::Result ResultType; + typedef typename Select < isConst, const UnqualifiedResultType, + UnqualifiedResultType >::Result ResultType; static ResultType& Do(H& obj) { RightBase& rightBase = obj; - return FieldHelper<RightBase, i - 1>::Do(rightBase); + return FieldHelper < RightBase, i - 1 >::Do(rightBase); } }; diff --git a/shared/loki/Key.h b/shared/loki/Key.h index c80d6f4e..a416d6a9 100644 --- a/shared/loki/Key.h +++ b/shared/loki/Key.h @@ -28,7 +28,7 @@ namespace Loki { -template< +template < class Factory, typename IdentifierType > @@ -44,7 +44,7 @@ bool operator<(const Key<F, I> &k1, const Key<F, I> &k2); /** * A Key class */ -template< +template < class Factory, typename IdentifierType > @@ -200,7 +200,7 @@ public: Key(const IdentifierType& id, Parm1& p1, Parm2& p2, Parm3& p3, Parm4& p4, Parm5& p5, - Parm6& p6, Parm7& p7, Parm8& p8, Parm9& p9,Parm10& p10) : count(10) + Parm6& p6, Parm7& p7, Parm8& p8, Parm9& p9, Parm10& p10) : count(10) { this->id = id; this->p1 = p1; @@ -331,209 +331,209 @@ public: template<class F, typename I> bool operator==(const Key<F, I> &k1, const Key<F, I> &k2) { - if( k1.count != k2.count ) + if ( k1.count != k2.count ) return false; - switch(k1.count) + switch (k1.count) { case -1: return true; case 0: - if( k1.id == k2.id ) + if ( k1.id == k2.id ) return true; else return false; case 1: - if( (k1.id == k2.id) && - (k1.p1 == k2.p1) ) + if ( (k1.id == k2.id) && + (k1.p1 == k2.p1) ) return true; else return false; case 2: - if( (k1.id == k2.id) && - (k1.p1 == k2.p1) && - (k1.p2 == k2.p2) ) + if ( (k1.id == k2.id) && + (k1.p1 == k2.p1) && + (k1.p2 == k2.p2) ) return true; else return false; case 3: - if( (k1.id == k2.id) && - (k1.p1 == k2.p1) && - (k1.p2 == k2.p2) && - (k1.p3 == k2.p3) ) + if ( (k1.id == k2.id) && + (k1.p1 == k2.p1) && + (k1.p2 == k2.p2) && + (k1.p3 == k2.p3) ) return true; else return false; case 4: - if( (k1.id == k2.id) && - (k1.p1 == k2.p1) && - (k1.p2 == k2.p2) && - (k1.p3 == k2.p3) && - (k1.p4 == k2.p4) ) + if ( (k1.id == k2.id) && + (k1.p1 == k2.p1) && + (k1.p2 == k2.p2) && + (k1.p3 == k2.p3) && + (k1.p4 == k2.p4) ) return true; else return false; case 5: - if( (k1.id == k2.id) && - (k1.p1 == k2.p1) && - (k1.p2 == k2.p2) && - (k1.p3 == k2.p3) && - (k1.p4 == k2.p4) && - (k1.p5 == k2.p5) ) + if ( (k1.id == k2.id) && + (k1.p1 == k2.p1) && + (k1.p2 == k2.p2) && + (k1.p3 == k2.p3) && + (k1.p4 == k2.p4) && + (k1.p5 == k2.p5) ) return true; else return false; case 6: - if( (k1.id == k2.id) && - (k1.p1 == k2.p1) && - (k1.p2 == k2.p2) && - (k1.p3 == k2.p3) && - (k1.p4 == k2.p4) && - (k1.p5 == k2.p5) && - (k1.p6 == k2.p6) ) + if ( (k1.id == k2.id) && + (k1.p1 == k2.p1) && + (k1.p2 == k2.p2) && + (k1.p3 == k2.p3) && + (k1.p4 == k2.p4) && + (k1.p5 == k2.p5) && + (k1.p6 == k2.p6) ) return true; else return false; case 7: - if( (k1.id == k2.id) && - (k1.p1 == k2.p1) && - (k1.p2 == k2.p2) && - (k1.p3 == k2.p3) && - (k1.p4 == k2.p4) && - (k1.p5 == k2.p5) && - (k1.p6 == k2.p6) && - (k1.p7 == k2.p7) ) + if ( (k1.id == k2.id) && + (k1.p1 == k2.p1) && + (k1.p2 == k2.p2) && + (k1.p3 == k2.p3) && + (k1.p4 == k2.p4) && + (k1.p5 == k2.p5) && + (k1.p6 == k2.p6) && + (k1.p7 == k2.p7) ) return true; else return false; case 8: - if( (k1.id == k2.id) && - (k1.p1 == k2.p1) && - (k1.p2 == k2.p2) && - (k1.p3 == k2.p3) && - (k1.p4 == k2.p4) && - (k1.p5 == k2.p5) && - (k1.p6 == k2.p6) && - (k1.p7 == k2.p7) && - (k1.p8 == k2.p8) ) + if ( (k1.id == k2.id) && + (k1.p1 == k2.p1) && + (k1.p2 == k2.p2) && + (k1.p3 == k2.p3) && + (k1.p4 == k2.p4) && + (k1.p5 == k2.p5) && + (k1.p6 == k2.p6) && + (k1.p7 == k2.p7) && + (k1.p8 == k2.p8) ) return true; else return false; case 9: - if( (k1.id == k2.id) && - (k1.p1 == k2.p1) && - (k1.p2 == k2.p2) && - (k1.p3 == k2.p3) && - (k1.p4 == k2.p4) && - (k1.p5 == k2.p5) && - (k1.p6 == k2.p6) && - (k1.p7 == k2.p7) && - (k1.p8 == k2.p8) && - (k1.p9 == k2.p9) ) + if ( (k1.id == k2.id) && + (k1.p1 == k2.p1) && + (k1.p2 == k2.p2) && + (k1.p3 == k2.p3) && + (k1.p4 == k2.p4) && + (k1.p5 == k2.p5) && + (k1.p6 == k2.p6) && + (k1.p7 == k2.p7) && + (k1.p8 == k2.p8) && + (k1.p9 == k2.p9) ) return true; else return false; case 10: - if( (k1.id == k2.id) && - (k1.p1 == k2.p1) && - (k1.p2 == k2.p2) && - (k1.p3 == k2.p3) && - (k1.p4 == k2.p4) && - (k1.p5 == k2.p5) && - (k1.p6 == k2.p6) && - (k1.p7 == k2.p7) && - (k1.p8 == k2.p8) && - (k1.p9 == k2.p9) && - (k1.p10 == k2.p10) ) + if ( (k1.id == k2.id) && + (k1.p1 == k2.p1) && + (k1.p2 == k2.p2) && + (k1.p3 == k2.p3) && + (k1.p4 == k2.p4) && + (k1.p5 == k2.p5) && + (k1.p6 == k2.p6) && + (k1.p7 == k2.p7) && + (k1.p8 == k2.p8) && + (k1.p9 == k2.p9) && + (k1.p10 == k2.p10) ) return true; else return false; case 11: - if( (k1.id == k2.id) && - (k1.p1 == k2.p1) && - (k1.p2 == k2.p2) && - (k1.p3 == k2.p3) && - (k1.p4 == k2.p4) && - (k1.p5 == k2.p5) && - (k1.p6 == k2.p6) && - (k1.p7 == k2.p7) && - (k1.p8 == k2.p8) && - (k1.p9 == k2.p9) && - (k1.p10 == k2.p10) && - (k1.p11 == k2.p11) ) + if ( (k1.id == k2.id) && + (k1.p1 == k2.p1) && + (k1.p2 == k2.p2) && + (k1.p3 == k2.p3) && + (k1.p4 == k2.p4) && + (k1.p5 == k2.p5) && + (k1.p6 == k2.p6) && + (k1.p7 == k2.p7) && + (k1.p8 == k2.p8) && + (k1.p9 == k2.p9) && + (k1.p10 == k2.p10) && + (k1.p11 == k2.p11) ) return true; else return false; case 12: - if( (k1.id == k2.id) && - (k1.p1 == k2.p1) && - (k1.p2 == k2.p2) && - (k1.p3 == k2.p3) && - (k1.p4 == k2.p4) && - (k1.p5 == k2.p5) && - (k1.p6 == k2.p6) && - (k1.p7 == k2.p7) && - (k1.p8 == k2.p8) && - (k1.p9 == k2.p9) && - (k1.p10 == k2.p10) && - (k1.p11 == k2.p11) && - (k1.p12 == k2.p12) ) + if ( (k1.id == k2.id) && + (k1.p1 == k2.p1) && + (k1.p2 == k2.p2) && + (k1.p3 == k2.p3) && + (k1.p4 == k2.p4) && + (k1.p5 == k2.p5) && + (k1.p6 == k2.p6) && + (k1.p7 == k2.p7) && + (k1.p8 == k2.p8) && + (k1.p9 == k2.p9) && + (k1.p10 == k2.p10) && + (k1.p11 == k2.p11) && + (k1.p12 == k2.p12) ) return true; else return false; case 13: - if( (k1.id == k2.id) && - (k1.p1 == k2.p1) && - (k1.p2 == k2.p2) && - (k1.p3 == k2.p3) && - (k1.p4 == k2.p4) && - (k1.p5 == k2.p5) && - (k1.p6 == k2.p6) && - (k1.p7 == k2.p7) && - (k1.p8 == k2.p8) && - (k1.p9 == k2.p9) && - (k1.p10 == k2.p10) && - (k1.p11 == k2.p11) && - (k1.p12 == k2.p12) && - (k1.p13 == k2.p13) ) + if ( (k1.id == k2.id) && + (k1.p1 == k2.p1) && + (k1.p2 == k2.p2) && + (k1.p3 == k2.p3) && + (k1.p4 == k2.p4) && + (k1.p5 == k2.p5) && + (k1.p6 == k2.p6) && + (k1.p7 == k2.p7) && + (k1.p8 == k2.p8) && + (k1.p9 == k2.p9) && + (k1.p10 == k2.p10) && + (k1.p11 == k2.p11) && + (k1.p12 == k2.p12) && + (k1.p13 == k2.p13) ) return true; else return false; case 14: - if( (k1.id == k2.id) && - (k1.p1 == k2.p1) && - (k1.p2 == k2.p2) && - (k1.p3 == k2.p3) && - (k1.p4 == k2.p4) && - (k1.p5 == k2.p5) && - (k1.p6 == k2.p6) && - (k1.p7 == k2.p7) && - (k1.p8 == k2.p8) && - (k1.p9 == k2.p9) && - (k1.p10 == k2.p10) && - (k1.p11 == k2.p11) && - (k1.p12 == k2.p12) && - (k1.p13 == k2.p13) && - (k1.p14 == k2.p14) ) + if ( (k1.id == k2.id) && + (k1.p1 == k2.p1) && + (k1.p2 == k2.p2) && + (k1.p3 == k2.p3) && + (k1.p4 == k2.p4) && + (k1.p5 == k2.p5) && + (k1.p6 == k2.p6) && + (k1.p7 == k2.p7) && + (k1.p8 == k2.p8) && + (k1.p9 == k2.p9) && + (k1.p10 == k2.p10) && + (k1.p11 == k2.p11) && + (k1.p12 == k2.p12) && + (k1.p13 == k2.p13) && + (k1.p14 == k2.p14) ) return true; else return false; case 15: - if( (k1.id == k2.id) && - (k1.p1 == k2.p1) && - (k1.p2 == k2.p2) && - (k1.p3 == k2.p3) && - (k1.p4 == k2.p4) && - (k1.p5 == k2.p5) && - (k1.p6 == k2.p6) && - (k1.p7 == k2.p7) && - (k1.p8 == k2.p8) && - (k1.p9 == k2.p9) && - (k1.p10 == k2.p10) && - (k1.p11 == k2.p11) && - (k1.p12 == k2.p12) && - (k1.p13 == k2.p13) && - (k1.p14 == k2.p14) && - (k1.p15 == k2.p15) ) + if ( (k1.id == k2.id) && + (k1.p1 == k2.p1) && + (k1.p2 == k2.p2) && + (k1.p3 == k2.p3) && + (k1.p4 == k2.p4) && + (k1.p5 == k2.p5) && + (k1.p6 == k2.p6) && + (k1.p7 == k2.p7) && + (k1.p8 == k2.p8) && + (k1.p9 == k2.p9) && + (k1.p10 == k2.p10) && + (k1.p11 == k2.p11) && + (k1.p12 == k2.p12) && + (k1.p13 == k2.p13) && + (k1.p14 == k2.p14) && + (k1.p15 == k2.p15) ) return true; else return false; @@ -547,209 +547,209 @@ bool operator==(const Key<F, I> &k1, const Key<F, I> &k2) template<class F, typename I> bool operator<(const Key<F, I> &k1, const Key<F, I> &k2) { - if( k1.count < k2.count ) + if ( k1.count < k2.count ) return true; - switch(k1.count) + switch (k1.count) { case -1: return false; case 0: - if( k1.id < k2.id ) + if ( k1.id < k2.id ) return true; else return false; case 1: - if( (k1.id < k2.id) || - (k1.p1 < k2.p1) ) + if ( (k1.id < k2.id) || + (k1.p1 < k2.p1) ) return true; else return false; case 2: - if( (k1.id < k2.id) || - (k1.p1 < k2.p1) || - (k1.p2 < k2.p2) ) + if ( (k1.id < k2.id) || + (k1.p1 < k2.p1) || + (k1.p2 < k2.p2) ) return true; else return false; case 3: - if( (k1.id < k2.id) || - (k1.p1 < k2.p1) || - (k1.p2 < k2.p2) || - (k1.p3 < k2.p3) ) + if ( (k1.id < k2.id) || + (k1.p1 < k2.p1) || + (k1.p2 < k2.p2) || + (k1.p3 < k2.p3) ) return true; else return false; case 4: - if( (k1.id < k2.id) || - (k1.p1 < k2.p1) || - (k1.p2 < k2.p2) || - (k1.p3 < k2.p3) || - (k1.p4 < k2.p4) ) + if ( (k1.id < k2.id) || + (k1.p1 < k2.p1) || + (k1.p2 < k2.p2) || + (k1.p3 < k2.p3) || + (k1.p4 < k2.p4) ) return true; else return false; case 5: - if( (k1.id < k2.id) || - (k1.p1 < k2.p1) || - (k1.p2 < k2.p2) || - (k1.p3 < k2.p3) || - (k1.p4 < k2.p4) || - (k1.p5 < k2.p5) ) + if ( (k1.id < k2.id) || + (k1.p1 < k2.p1) || + (k1.p2 < k2.p2) || + (k1.p3 < k2.p3) || + (k1.p4 < k2.p4) || + (k1.p5 < k2.p5) ) return true; else return false; case 6: - if( (k1.id < k2.id) || - (k1.p1 < k2.p1) || - (k1.p2 < k2.p2) || - (k1.p3 < k2.p3) || - (k1.p4 < k2.p4) || - (k1.p5 < k2.p5) || - (k1.p6 < k2.p6) ) + if ( (k1.id < k2.id) || + (k1.p1 < k2.p1) || + (k1.p2 < k2.p2) || + (k1.p3 < k2.p3) || + (k1.p4 < k2.p4) || + (k1.p5 < k2.p5) || + (k1.p6 < k2.p6) ) return true; else return false; case 7: - if( (k1.id < k2.id) || - (k1.p1 < k2.p1) || - (k1.p2 < k2.p2) || - (k1.p3 < k2.p3) || - (k1.p4 < k2.p4) || - (k1.p5 < k2.p5) || - (k1.p6 < k2.p6) || - (k1.p7 < k2.p7) ) + if ( (k1.id < k2.id) || + (k1.p1 < k2.p1) || + (k1.p2 < k2.p2) || + (k1.p3 < k2.p3) || + (k1.p4 < k2.p4) || + (k1.p5 < k2.p5) || + (k1.p6 < k2.p6) || + (k1.p7 < k2.p7) ) return true; else return false; case 8: - if( (k1.id < k2.id) || - (k1.p1 < k2.p1) || - (k1.p2 < k2.p2) || - (k1.p3 < k2.p3) || - (k1.p4 < k2.p4) || - (k1.p5 < k2.p5) || - (k1.p6 < k2.p6) || - (k1.p7 < k2.p7) || - (k1.p8 < k2.p8) ) + if ( (k1.id < k2.id) || + (k1.p1 < k2.p1) || + (k1.p2 < k2.p2) || + (k1.p3 < k2.p3) || + (k1.p4 < k2.p4) || + (k1.p5 < k2.p5) || + (k1.p6 < k2.p6) || + (k1.p7 < k2.p7) || + (k1.p8 < k2.p8) ) return true; else return false; case 9: - if( (k1.id < k2.id) || - (k1.p1 < k2.p1) || - (k1.p2 < k2.p2) || - (k1.p3 < k2.p3) || - (k1.p4 < k2.p4) || - (k1.p5 < k2.p5) || - (k1.p6 < k2.p6) || - (k1.p7 < k2.p7) || - (k1.p8 < k2.p8) || - (k1.p9 < k2.p9) ) + if ( (k1.id < k2.id) || + (k1.p1 < k2.p1) || + (k1.p2 < k2.p2) || + (k1.p3 < k2.p3) || + (k1.p4 < k2.p4) || + (k1.p5 < k2.p5) || + (k1.p6 < k2.p6) || + (k1.p7 < k2.p7) || + (k1.p8 < k2.p8) || + (k1.p9 < k2.p9) ) return true; else return false; case 10: - if( (k1.id < k2.id) || - (k1.p1 < k2.p1) || - (k1.p2 < k2.p2) || - (k1.p3 < k2.p3) || - (k1.p4 < k2.p4) || - (k1.p5 < k2.p5) || - (k1.p6 < k2.p6) || - (k1.p7 < k2.p7) || - (k1.p8 < k2.p8) || - (k1.p9 < k2.p9) || - (k1.p10 < k2.p10) ) + if ( (k1.id < k2.id) || + (k1.p1 < k2.p1) || + (k1.p2 < k2.p2) || + (k1.p3 < k2.p3) || + (k1.p4 < k2.p4) || + (k1.p5 < k2.p5) || + (k1.p6 < k2.p6) || + (k1.p7 < k2.p7) || + (k1.p8 < k2.p8) || + (k1.p9 < k2.p9) || + (k1.p10 < k2.p10) ) return true; else return false; case 11: - if( (k1.id < k2.id) || - (k1.p1 < k2.p1) || - (k1.p2 < k2.p2) || - (k1.p3 < k2.p3) || - (k1.p4 < k2.p4) || - (k1.p5 < k2.p5) || - (k1.p6 < k2.p6) || - (k1.p7 < k2.p7) || - (k1.p8 < k2.p8) || - (k1.p9 < k2.p9) || - (k1.p10 < k2.p10) || - (k1.p11 < k2.p11) ) + if ( (k1.id < k2.id) || + (k1.p1 < k2.p1) || + (k1.p2 < k2.p2) || + (k1.p3 < k2.p3) || + (k1.p4 < k2.p4) || + (k1.p5 < k2.p5) || + (k1.p6 < k2.p6) || + (k1.p7 < k2.p7) || + (k1.p8 < k2.p8) || + (k1.p9 < k2.p9) || + (k1.p10 < k2.p10) || + (k1.p11 < k2.p11) ) return true; else return false; case 12: - if( (k1.id < k2.id) || - (k1.p1 < k2.p1) || - (k1.p2 < k2.p2) || - (k1.p3 < k2.p3) || - (k1.p4 < k2.p4) || - (k1.p5 < k2.p5) || - (k1.p6 < k2.p6) || - (k1.p7 < k2.p7) || - (k1.p8 < k2.p8) || - (k1.p9 < k2.p9) || - (k1.p10 < k2.p10) || - (k1.p11 < k2.p11) || - (k1.p12 < k2.p12) ) + if ( (k1.id < k2.id) || + (k1.p1 < k2.p1) || + (k1.p2 < k2.p2) || + (k1.p3 < k2.p3) || + (k1.p4 < k2.p4) || + (k1.p5 < k2.p5) || + (k1.p6 < k2.p6) || + (k1.p7 < k2.p7) || + (k1.p8 < k2.p8) || + (k1.p9 < k2.p9) || + (k1.p10 < k2.p10) || + (k1.p11 < k2.p11) || + (k1.p12 < k2.p12) ) return true; else return false; case 13: - if( (k1.id < k2.id) || - (k1.p1 < k2.p1) || - (k1.p2 < k2.p2) || - (k1.p3 < k2.p3) || - (k1.p4 < k2.p4) || - (k1.p5 < k2.p5) || - (k1.p6 < k2.p6) || - (k1.p7 < k2.p7) || - (k1.p8 < k2.p8) || - (k1.p9 < k2.p9) || - (k1.p10 < k2.p10) || - (k1.p11 < k2.p11) || - (k1.p12 < k2.p12) || - (k1.p13 < k2.p13) ) + if ( (k1.id < k2.id) || + (k1.p1 < k2.p1) || + (k1.p2 < k2.p2) || + (k1.p3 < k2.p3) || + (k1.p4 < k2.p4) || + (k1.p5 < k2.p5) || + (k1.p6 < k2.p6) || + (k1.p7 < k2.p7) || + (k1.p8 < k2.p8) || + (k1.p9 < k2.p9) || + (k1.p10 < k2.p10) || + (k1.p11 < k2.p11) || + (k1.p12 < k2.p12) || + (k1.p13 < k2.p13) ) return true; else return false; case 14: - if( (k1.id < k2.id) || - (k1.p1 < k2.p1) || - (k1.p2 < k2.p2) || - (k1.p3 < k2.p3) || - (k1.p4 < k2.p4) || - (k1.p5 < k2.p5) || - (k1.p6 < k2.p6) || - (k1.p7 < k2.p7) || - (k1.p8 < k2.p8) || - (k1.p9 < k2.p9) || - (k1.p10 < k2.p10) || - (k1.p11 < k2.p11) || - (k1.p12 < k2.p12) || - (k1.p13 < k2.p13) || - (k1.p14 < k2.p14) ) + if ( (k1.id < k2.id) || + (k1.p1 < k2.p1) || + (k1.p2 < k2.p2) || + (k1.p3 < k2.p3) || + (k1.p4 < k2.p4) || + (k1.p5 < k2.p5) || + (k1.p6 < k2.p6) || + (k1.p7 < k2.p7) || + (k1.p8 < k2.p8) || + (k1.p9 < k2.p9) || + (k1.p10 < k2.p10) || + (k1.p11 < k2.p11) || + (k1.p12 < k2.p12) || + (k1.p13 < k2.p13) || + (k1.p14 < k2.p14) ) return true; else return false; case 15: - if( (k1.id < k2.id) || - (k1.p1 < k2.p1) || - (k1.p2 < k2.p2) || - (k1.p3 < k2.p3) || - (k1.p4 < k2.p4) || - (k1.p5 < k2.p5) || - (k1.p6 < k2.p6) || - (k1.p7 < k2.p7) || - (k1.p8 < k2.p8) || - (k1.p9 < k2.p9) || - (k1.p10 < k2.p10) || - (k1.p11 < k2.p11) || - (k1.p12 < k2.p12) || - (k1.p13 < k2.p13) || - (k1.p14 < k2.p14) || - (k1.p15 < k2.p15) ) + if ( (k1.id < k2.id) || + (k1.p1 < k2.p1) || + (k1.p2 < k2.p2) || + (k1.p3 < k2.p3) || + (k1.p4 < k2.p4) || + (k1.p5 < k2.p5) || + (k1.p6 < k2.p6) || + (k1.p7 < k2.p7) || + (k1.p8 < k2.p8) || + (k1.p9 < k2.p9) || + (k1.p10 < k2.p10) || + (k1.p11 < k2.p11) || + (k1.p12 < k2.p12) || + (k1.p13 < k2.p13) || + (k1.p14 < k2.p14) || + (k1.p15 < k2.p15) ) return true; else return false; diff --git a/shared/loki/MultiMethods.h b/shared/loki/MultiMethods.h index ece4fb17..ec5b7788 100644 --- a/shared/loki/MultiMethods.h +++ b/shared/loki/MultiMethods.h @@ -38,8 +38,8 @@ namespace Loki namespace Private { -template <class SomeLhs, class SomeRhs, - class Executor, typename ResultType> +template < class SomeLhs, class SomeRhs, + class Executor, typename ResultType > struct InvocationTraits { static ResultType @@ -85,12 +85,12 @@ class StaticDispatcher { if (Head* p2 = dynamic_cast<Head*>(&rhs)) { - Int2Type<(symmetric && - int(TL::IndexOf<TypesRhs, Head>::value) < - int(TL::IndexOf<TypesLhs, SomeLhs>::value))> i2t; + Int2Type < (symmetric && + int(TL::IndexOf<TypesRhs, Head>::value) < + int(TL::IndexOf<TypesLhs, SomeLhs>::value)) > i2t; - typedef Private::InvocationTraits< - SomeLhs, Head, Executor, ResultType> CallTraits; + typedef Private::InvocationTraits < + SomeLhs, Head, Executor, ResultType > CallTraits; return CallTraits::DoDispatch(lhs, *p2, exec, i2t); } @@ -133,7 +133,7 @@ class BaseLhs, > class BasicDispatcher { - typedef std::pair<TypeInfo,TypeInfo> KeyType; + typedef std::pair<TypeInfo, TypeInfo> KeyType; typedef CallbackType MappedType; typedef AssocVector<KeyType, MappedType> MapType; MapType callbackMap_; @@ -158,28 +158,28 @@ public: }; // Non-inline to reduce compile time overhead... -template <class BaseLhs, class BaseRhs, - typename ResultType, typename CallbackType> -void BasicDispatcher<BaseLhs,BaseRhs,ResultType,CallbackType> +template < class BaseLhs, class BaseRhs, + typename ResultType, typename CallbackType > +void BasicDispatcher<BaseLhs, BaseRhs, ResultType, CallbackType> ::DoAdd(TypeInfo lhs, TypeInfo rhs, CallbackType fun) { callbackMap_[KeyType(lhs, rhs)] = fun; } -template <class BaseLhs, class BaseRhs, - typename ResultType, typename CallbackType> -bool BasicDispatcher<BaseLhs,BaseRhs,ResultType,CallbackType> +template < class BaseLhs, class BaseRhs, + typename ResultType, typename CallbackType > +bool BasicDispatcher<BaseLhs, BaseRhs, ResultType, CallbackType> ::DoRemove(TypeInfo lhs, TypeInfo rhs) { return callbackMap_.erase(KeyType(lhs, rhs)) == 1; } -template <class BaseLhs, class BaseRhs, - typename ResultType, typename CallbackType> -ResultType BasicDispatcher<BaseLhs,BaseRhs,ResultType,CallbackType> +template < class BaseLhs, class BaseRhs, + typename ResultType, typename CallbackType > +ResultType BasicDispatcher<BaseLhs, BaseRhs, ResultType, CallbackType> ::Go(BaseLhs& lhs, BaseRhs& rhs) { - typename MapType::key_type k(typeid(lhs),typeid(rhs)); + typename MapType::key_type k(typeid(lhs), typeid(rhs)); typename MapType::iterator i = callbackMap_.find(k); if (i == callbackMap_.end()) { @@ -223,11 +223,11 @@ struct DynamicCaster namespace Private { -template <class BaseLhs, class BaseRhs, +template < class BaseLhs, class BaseRhs, class SomeLhs, class SomeRhs, typename ResultType, class CastLhs, class CastRhs, - ResultType (*Callback)(SomeLhs&, SomeRhs&)> + ResultType (*Callback)(SomeLhs&, SomeRhs&) > struct FnDispatcherHelper { static ResultType Trampoline(BaseLhs& lhs, BaseRhs& rhs) @@ -247,15 +247,15 @@ struct FnDispatcherHelper // Features automated conversions //////////////////////////////////////////////////////////////////////////////// -template <class BaseLhs, class BaseRhs = BaseLhs, +template < class BaseLhs, class BaseRhs = BaseLhs, typename ResultType = void, template <class, class> class CastingPolicy = DynamicCaster, template <class, class, class, class> - class DispatcherBackend = BasicDispatcher> + class DispatcherBackend = BasicDispatcher > class FnDispatcher { - DispatcherBackend<BaseLhs, BaseRhs, ResultType, - ResultType (*)(BaseLhs&, BaseRhs&)> backEnd_; + DispatcherBackend < BaseLhs, BaseRhs, ResultType, + ResultType (*)(BaseLhs&, BaseRhs&) > backEnd_; public: template <class SomeLhs, class SomeRhs> @@ -264,33 +264,33 @@ public: return backEnd_.template Add<SomeLhs, SomeRhs>(pFun); } - template <class SomeLhs, class SomeRhs, - ResultType (*callback)(SomeLhs&, SomeRhs&)> + template < class SomeLhs, class SomeRhs, + ResultType (*callback)(SomeLhs&, SomeRhs&) > void Add() { - typedef Private::FnDispatcherHelper< + typedef Private::FnDispatcherHelper < BaseLhs, BaseRhs, SomeLhs, SomeRhs, ResultType, - CastingPolicy<SomeLhs,BaseLhs>, - CastingPolicy<SomeRhs,BaseRhs>, - callback> Local; + CastingPolicy<SomeLhs, BaseLhs>, + CastingPolicy<SomeRhs, BaseRhs>, + callback > Local; Add<SomeLhs, SomeRhs>(&Local::Trampoline); } - template <class SomeLhs, class SomeRhs, + template < class SomeLhs, class SomeRhs, ResultType (*callback)(SomeLhs&, SomeRhs&), - bool symmetric> + bool symmetric > void Add(bool = true) // [gcc] dummy bool { - typedef Private::FnDispatcherHelper< + typedef Private::FnDispatcherHelper < BaseLhs, BaseRhs, SomeLhs, SomeRhs, ResultType, - CastingPolicy<SomeLhs,BaseLhs>, - CastingPolicy<SomeRhs,BaseRhs>, - callback> Local; + CastingPolicy<SomeLhs, BaseLhs>, + CastingPolicy<SomeRhs, BaseRhs>, + callback > Local; Add<SomeLhs, SomeRhs>(&Local::Trampoline); if (symmetric) @@ -318,19 +318,19 @@ public: namespace Private { -template <class BaseLhs, class BaseRhs, +template < class BaseLhs, class BaseRhs, class SomeLhs, class SomeRhs, typename ResultType, class CastLhs, class CastRhs, - class Fun, bool SwapArgs> + class Fun, bool SwapArgs > class FunctorDispatcherHelper { Fun fun_; - ResultType Fire(BaseLhs& lhs, BaseRhs& rhs,Int2Type<false>) + ResultType Fire(BaseLhs& lhs, BaseRhs& rhs, Int2Type<false>) { return fun_(CastLhs::Cast(lhs), CastRhs::Cast(rhs)); } - ResultType Fire(BaseLhs& rhs, BaseRhs& lhs,Int2Type<true>) + ResultType Fire(BaseLhs& rhs, BaseRhs& lhs, Int2Type<true>) { return fun_(CastLhs::Cast(lhs), CastRhs::Cast(rhs)); } @@ -339,7 +339,7 @@ public: ResultType operator()(BaseLhs& lhs, BaseRhs& rhs) { - return Fire(lhs,rhs,Int2Type<SwapArgs>()); + return Fire(lhs, rhs, Int2Type<SwapArgs>()); } }; } @@ -350,11 +350,11 @@ public: // Features automated casting //////////////////////////////////////////////////////////////////////////////// -template <class BaseLhs, class BaseRhs = BaseLhs, +template < class BaseLhs, class BaseRhs = BaseLhs, typename ResultType = void, template <class, class> class CastingPolicy = DynamicCaster, template <class, class, class, class> - class DispatcherBackend = BasicDispatcher> + class DispatcherBackend = BasicDispatcher > class FunctorDispatcher { typedef LOKI_TYPELIST_2(BaseLhs&, BaseRhs&) ArgsList; @@ -366,31 +366,31 @@ public: template <class SomeLhs, class SomeRhs, class Fun> void Add(const Fun& fun) { - typedef Private::FunctorDispatcherHelper< + typedef Private::FunctorDispatcherHelper < BaseLhs, BaseRhs, SomeLhs, SomeRhs, ResultType, CastingPolicy<SomeLhs, BaseLhs>, CastingPolicy<SomeRhs, BaseRhs>, - Fun, false> Adapter; + Fun, false > Adapter; backEnd_.template Add<SomeLhs, SomeRhs>(FunctorType(Adapter(fun))); } template <class SomeLhs, class SomeRhs, bool symmetric, class Fun> void Add(const Fun& fun) { - Add<SomeLhs,SomeRhs>(fun); + Add<SomeLhs, SomeRhs>(fun); if (symmetric) { // Note: symmetry only makes sense where BaseLhs==BaseRhs - typedef Private::FunctorDispatcherHelper< + typedef Private::FunctorDispatcherHelper < BaseLhs, BaseLhs, SomeLhs, SomeRhs, ResultType, CastingPolicy<SomeLhs, BaseLhs>, CastingPolicy<SomeRhs, BaseLhs>, - Fun, true> AdapterR; + Fun, true > AdapterR; backEnd_.template Add<SomeRhs, SomeLhs>(FunctorType(AdapterR(fun))); } diff --git a/shared/loki/OrderedStatic.h b/shared/loki/OrderedStatic.h index 0f26b6e0..f0ff73c3 100644 --- a/shared/loki/OrderedStatic.h +++ b/shared/loki/OrderedStatic.h @@ -76,8 +76,8 @@ protected: void SetLongevity(T* ptr) { - val_=ptr; - Loki::SetLongevity(val_,longevity_); + val_ = ptr; + Loki::SetLongevity(val_, longevity_); } private: @@ -102,7 +102,7 @@ public: typedef void (OrderedStaticCreatorFunc::*Creator)(); void createObjects(); - void registerObject(unsigned int longevity,OrderedStaticCreatorFunc*,Creator); + void registerObject(unsigned int longevity, OrderedStaticCreatorFunc*, Creator); private: OrderedStaticManagerClass(const OrderedStaticManagerClass&); @@ -110,7 +110,7 @@ private: struct Data { - Data(unsigned int,OrderedStaticCreatorFunc*, Creator); + Data(unsigned int, OrderedStaticCreatorFunc*, Creator); unsigned int longevity; OrderedStaticCreatorFunc* object; Creator creator; @@ -158,7 +158,7 @@ public: OrderedStatic() : Private::OrderedStaticBase<T>(L) { OrderedStaticManager::Instance().registerObject - (L,this,&Private::OrderedStaticCreatorFunc::createObject); + (L, this, &Private::OrderedStaticCreatorFunc::createObject); } void createObject() @@ -178,7 +178,7 @@ public: OrderedStatic(P1 p) : Private::OrderedStaticBase<T>(L), para_(p) { OrderedStaticManager::Instance().registerObject - (L,this,&Private::OrderedStaticCreatorFunc::createObject); + (L, this, &Private::OrderedStaticCreatorFunc::createObject); } void createObject() @@ -203,7 +203,7 @@ public: OrderedStatic(Func p) : Private::OrderedStaticBase<T>(L), para_(p) { OrderedStaticManager::Instance().registerObject - (L,this,&Private::OrderedStaticCreatorFunc::createObject); + (L, this, &Private::OrderedStaticCreatorFunc::createObject); } void createObject() diff --git a/shared/loki/Pimpl.h b/shared/loki/Pimpl.h index 788f76d8..8254e3e2 100644 --- a/shared/loki/Pimpl.h +++ b/shared/loki/Pimpl.h @@ -101,7 +101,7 @@ public: T& operator*() { - return ptr_.operator*(); + return ptr_.operator * (); } const T* operator->() const @@ -111,7 +111,7 @@ public: const T& operator*() const { - return ptr_.operator*(); + return ptr_.operator * (); } Pointer& wrapped() @@ -136,7 +136,7 @@ private: template<class T, typename Pointer = ConstPropPtr<T> > struct PimplOwner { - Pimpl<T,Pointer> LOKI_INHERITED_PIMPL_NAME; + Pimpl<T, Pointer> LOKI_INHERITED_PIMPL_NAME; }; diff --git a/shared/loki/Register.h b/shared/loki/Register.h index 32409f4b..2b549381 100644 --- a/shared/loki/Register.h +++ b/shared/loki/Register.h @@ -113,18 +113,18 @@ struct UnRegisterOnDeleteSet #define LOKI_CONCAT(a,b,c,d) LOKI_CONCATE(a,b,c,d) #define LOKI_CHECK_CLASS_IN_LIST( CLASS , LIST ) \ - \ + \ struct LOKI_CONCAT(check_,CLASS,_isInList_,LIST) \ { \ typedef int LOKI_CONCAT(ERROR_class_,CLASS,_isNotInList_,LIST); \ }; \ typedef Loki::Select<Loki::TL::IndexOf<LIST, CLASS>::value == -1, \ - CLASS, \ - LOKI_CONCAT(check_,CLASS,_isInList_,LIST)> \ - ::Result LOKI_CONCAT(CLASS,isInList,LIST,result); \ + CLASS, \ + LOKI_CONCAT(check_,CLASS,_isInList_,LIST)> \ + ::Result LOKI_CONCAT(CLASS,isInList,LIST,result); \ typedef LOKI_CONCAT(CLASS,isInList,LIST,result):: \ - LOKI_CONCAT(ERROR_class_,CLASS,_isNotInList_,LIST) \ - LOKI_CONCAT(ERROR_class_,CLASS,_isNotInList__,LIST); + LOKI_CONCAT(ERROR_class_,CLASS,_isNotInList_,LIST) \ + LOKI_CONCAT(ERROR_class_,CLASS,_isNotInList__,LIST); } // namespace Loki diff --git a/shared/loki/SPCachedFactory.h b/shared/loki/SPCachedFactory.h index aab37127..e1b8ec8c 100644 --- a/shared/loki/SPCachedFactory.h +++ b/shared/loki/SPCachedFactory.h @@ -165,7 +165,7 @@ class AbstractProduct, class SmartPointer { private: - typedef SmartPtr< AbstractProduct,OwnershipPolicy, + typedef SmartPtr < AbstractProduct, OwnershipPolicy, ConversionPolicy, CheckingPolicy, FunctionStorage, ConstnessPolicy > CallBackSP; protected: @@ -195,7 +195,7 @@ private: CallBackSP& SP(*reinterpret_cast<CallBackSP*>(pSP)); ReleaseObject(SP); } - virtual void ReleaseObject(ProductReturn& object)=0; + virtual void ReleaseObject(ProductReturn& object) = 0; const typename CallBackSP::FunctorType fun; }; diff --git a/shared/loki/SafeBits.h b/shared/loki/SafeBits.h index 4105f375..9e160c50 100644 --- a/shared/loki/SafeBits.h +++ b/shared/loki/SafeBits.h @@ -482,10 +482,10 @@ inline SafeBitField< unique_index, word_t > operator != ( bool, SafeBitField< un #ifdef LOKI_SAFE_BIT_FIELD #ifndef LOKI_BIT_FIELD_NONTEMPLATE_INIT #define LOKI_BIT_CONST( field_t, label, bit_index ) \ - static const field_t::const_t label = field_t::const_t::make_bit_const<bit_index>() + static const field_t::const_t label = field_t::const_t::make_bit_const<bit_index>() #else #define LOKI_BIT_CONST( field_t, label, bit_index ) \ - static const field_t::const_t label = field_t::const_t::make_bit_const( bit_index ) + static const field_t::const_t label = field_t::const_t::make_bit_const( bit_index ) #endif // LOKI_BIT_FIELD_NONTEMPLATE_INIT #else inline size_t make_bit_const( size_t i ) { return ( i > 0 ) ? ( size_t(1) << ( ( i > 0 ) ? ( i - 1 ) : 0 ) ) : 0; } diff --git a/shared/loki/SafeFormat.h b/shared/loki/SafeFormat.h index 2734e972..bd2837f9 100644 --- a/shared/loki/SafeFormat.h +++ b/shared/loki/SafeFormat.h @@ -73,7 +73,7 @@ template <class Char> void write(std::pair<Char*, std::size_t>& s, const Char* from, const Char* to) { assert(from <= to); - if(from + s.second < to) + if (from + s.second < to) throw std::overflow_error(""); // s.first: position one past the final copied element s.first = std::copy(from, to, s.first); @@ -106,9 +106,9 @@ struct PrintfState } #define LOKI_PRINTF_STATE_FORWARD(type) \ - PrintfState& operator()(type par) {\ - return (*this)(static_cast< LOKI_SAFEFORMAT_UNSIGNED_LONG >(par)); \ - } + PrintfState& operator()(type par) {\ + return (*this)(static_cast< LOKI_SAFEFORMAT_UNSIGNED_LONG >(par)); \ + } LOKI_PRINTF_STATE_FORWARD(bool) LOKI_PRINTF_STATE_FORWARD(char) @@ -171,21 +171,21 @@ struct PrintfState PrintfState& operator()(void* n) { if (result_ == -1) return *this; // don't even bother - PrintUsing_snprintf(n,"p"); + PrintUsing_snprintf(n, "p"); return *this; } PrintfState& operator()(double n) { if (result_ == -1) return *this; // don't even bother - PrintUsing_snprintf(n,"eEfgG"); + PrintUsing_snprintf(n, "eEfgG"); return *this; } PrintfState& operator()(long double n) { if (result_ == -1) return *this; // don't even bother - PrintUsing_snprintf(n,"eEfgG"); + PrintUsing_snprintf(n, "eEfgG"); return *this; } diff --git a/shared/loki/ScopeGuard.h b/shared/loki/ScopeGuard.h index 46e4d892..99ce569d 100644 --- a/shared/loki/ScopeGuard.h +++ b/shared/loki/ScopeGuard.h @@ -65,7 +65,7 @@ protected: { j.Execute(); } - catch(...) + catch (...) {} } @@ -440,15 +440,15 @@ inline ObjScopeGuardImpl0<Obj, MemFun> MakeObjGuard(Obj& obj, MemFun memFun) } template <typename Ret, class Obj1, class Obj2> -inline ObjScopeGuardImpl0<Obj1,Ret(Obj2::*)()> MakeGuard(Ret(Obj2::*memFun)(), Obj1& obj) +inline ObjScopeGuardImpl0<Obj1, Ret(Obj2::*)()> MakeGuard(Ret(Obj2::*memFun)(), Obj1& obj) { - return ObjScopeGuardImpl0<Obj1,Ret(Obj2::*)()>::MakeObjGuard(obj,memFun); + return ObjScopeGuardImpl0<Obj1, Ret(Obj2::*)()>::MakeObjGuard(obj, memFun); } template <typename Ret, class Obj1, class Obj2> -inline ObjScopeGuardImpl0<Obj1,Ret(Obj2::*)()> MakeGuard(Ret(Obj2::*memFun)(), Obj1* obj) +inline ObjScopeGuardImpl0<Obj1, Ret(Obj2::*)()> MakeGuard(Ret(Obj2::*memFun)(), Obj1* obj) { - return ObjScopeGuardImpl0<Obj1,Ret(Obj2::*)()>::MakeObjGuard(*obj,memFun); + return ObjScopeGuardImpl0<Obj1, Ret(Obj2::*)()>::MakeObjGuard(*obj, memFun); } //////////////////////////////////////////////////////////////// @@ -503,15 +503,15 @@ inline ObjScopeGuardImpl1<Obj, MemFun, P1> MakeObjGuard(Obj& obj, MemFun memFun, } template <typename Ret, class Obj1, class Obj2, typename P1a, typename P1b> -inline ObjScopeGuardImpl1<Obj1,Ret(Obj2::*)(P1a),P1b> MakeGuard(Ret(Obj2::*memFun)(P1a), Obj1& obj, P1b p1) +inline ObjScopeGuardImpl1<Obj1, Ret(Obj2::*)(P1a), P1b> MakeGuard(Ret(Obj2::*memFun)(P1a), Obj1& obj, P1b p1) { - return ObjScopeGuardImpl1<Obj1,Ret(Obj2::*)(P1a),P1b>::MakeObjGuard(obj,memFun,p1); + return ObjScopeGuardImpl1<Obj1, Ret(Obj2::*)(P1a), P1b>::MakeObjGuard(obj, memFun, p1); } template <typename Ret, class Obj1, class Obj2, typename P1a, typename P1b> -inline ObjScopeGuardImpl1<Obj1,Ret(Obj2::*)(P1a),P1b> MakeGuard(Ret(Obj2::*memFun)(P1a), Obj1* obj, P1b p1) +inline ObjScopeGuardImpl1<Obj1, Ret(Obj2::*)(P1a), P1b> MakeGuard(Ret(Obj2::*memFun)(P1a), Obj1* obj, P1b p1) { - return ObjScopeGuardImpl1<Obj1,Ret(Obj2::*)(P1a),P1b>::MakeObjGuard(*obj,memFun,p1); + return ObjScopeGuardImpl1<Obj1, Ret(Obj2::*)(P1a), P1b>::MakeObjGuard(*obj, memFun, p1); } //////////////////////////////////////////////////////////////// @@ -567,15 +567,15 @@ inline ObjScopeGuardImpl2<Obj, MemFun, P1, P2> MakeObjGuard(Obj& obj, MemFun mem } template <typename Ret, class Obj1, class Obj2, typename P1a, typename P1b, typename P2a, typename P2b> -inline ObjScopeGuardImpl2<Obj1,Ret(Obj2::*)(P1a,P2a),P1b,P2b> MakeGuard(Ret(Obj2::*memFun)(P1a,P2a), Obj1& obj, P1b p1, P2b p2) +inline ObjScopeGuardImpl2<Obj1, Ret(Obj2::*)(P1a, P2a), P1b, P2b> MakeGuard(Ret(Obj2::*memFun)(P1a, P2a), Obj1& obj, P1b p1, P2b p2) { - return ObjScopeGuardImpl2<Obj1,Ret(Obj2::*)(P1a,P2a),P1b,P2b>::MakeObjGuard(obj,memFun,p1,p2); + return ObjScopeGuardImpl2<Obj1, Ret(Obj2::*)(P1a, P2a), P1b, P2b>::MakeObjGuard(obj, memFun, p1, p2); } template <typename Ret, class Obj1, class Obj2, typename P1a, typename P1b, typename P2a, typename P2b> -inline ObjScopeGuardImpl2<Obj1,Ret(Obj2::*)(P1a,P2a),P1b,P2b> MakeGuard(Ret(Obj2::*memFun)(P1a,P2a), Obj1* obj, P1b p1, P2b p2) +inline ObjScopeGuardImpl2<Obj1, Ret(Obj2::*)(P1a, P2a), P1b, P2b> MakeGuard(Ret(Obj2::*memFun)(P1a, P2a), Obj1* obj, P1b p1, P2b p2) { - return ObjScopeGuardImpl2<Obj1,Ret(Obj2::*)(P1a,P2a),P1b,P2b>::MakeObjGuard(*obj,memFun,p1,p2); + return ObjScopeGuardImpl2<Obj1, Ret(Obj2::*)(P1a, P2a), P1b, P2b>::MakeObjGuard(*obj, memFun, p1, p2); } //////////////////////////////////////////////////////////////// @@ -662,5 +662,8 @@ MakeGuard( Ret( Obj2::*memFun )( P1a, P2a, P3a ), Obj1* obj, P1b p1, P2b p2, P3b #define LOKI_ON_BLOCK_EXIT ::Loki::ScopeGuard LOKI_ANONYMOUS_VARIABLE(scopeGuard) = ::Loki::MakeGuard #define LOKI_ON_BLOCK_EXIT_OBJ ::Loki::ScopeGuard LOKI_ANONYMOUS_VARIABLE(scopeGuard) = ::Loki::MakeObjGuard +//by ZenJu +#define LOKI_ON_BLOCK_EXIT2(X) ::Loki::ScopeGuard LOKI_ANONYMOUS_VARIABLE(scopeGuard) = ::Loki::MakeGuard([&](){X;}); (void)LOKI_ANONYMOUS_VARIABLE(scopeGuard); + #endif // end file guardian diff --git a/shared/loki/Sequence.h b/shared/loki/Sequence.h index e8c8bd35..04a64174 100644 --- a/shared/loki/Sequence.h +++ b/shared/loki/Sequence.h @@ -22,16 +22,16 @@ namespace Loki template < -class T01=NullType,class T02=NullType,class T03=NullType,class T04=NullType,class T05=NullType, - class T06=NullType,class T07=NullType,class T08=NullType,class T09=NullType,class T10=NullType, - class T11=NullType,class T12=NullType,class T13=NullType,class T14=NullType,class T15=NullType, - class T16=NullType,class T17=NullType,class T18=NullType,class T19=NullType,class T20=NullType +class T01 = NullType, class T02 = NullType, class T03 = NullType, class T04 = NullType, class T05 = NullType, + class T06 = NullType, class T07 = NullType, class T08 = NullType, class T09 = NullType, class T10 = NullType, + class T11 = NullType, class T12 = NullType, class T13 = NullType, class T14 = NullType, class T15 = NullType, + class T16 = NullType, class T17 = NullType, class T18 = NullType, class T19 = NullType, class T20 = NullType > struct Seq { private: - typedef typename Seq< T02, T03, T04, T05, T06, T07, T08, T09, T10, - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20>::Type + typedef typename Seq < T02, T03, T04, T05, T06, T07, T08, T09, T10, + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20 >::Type TailResult; public: typedef Typelist<T01, TailResult> Type; diff --git a/shared/loki/Singleton.h b/shared/loki/Singleton.h index c5f1f567..1e479032 100644 --- a/shared/loki/Singleton.h +++ b/shared/loki/Singleton.h @@ -119,7 +119,7 @@ template <typename T, typename Destroyer> class ConcreteLifetimeTracker : public LifetimeTracker { public: - ConcreteLifetimeTracker(T* p,unsigned int longevity, Destroyer d) + ConcreteLifetimeTracker(T* p, unsigned int longevity, Destroyer d) : LifetimeTracker(longevity) , pTracked_(p) , destroyer_(d) @@ -151,7 +151,7 @@ void SetLongevity(T* pDynObject, unsigned int longevity, using namespace Private; // manage lifetime of stack manually - if(pTrackerArray==0) + if (pTrackerArray == 0) pTrackerArray = new TrackerArray; // automatically delete the ConcreteLifetimeTracker object when a exception is thrown @@ -261,7 +261,7 @@ struct CreateUsing { //allocator.destroy(p); p->~T(); - allocator.deallocate(p,1); + allocator.deallocate(p, 1); } }; }; @@ -566,21 +566,21 @@ public: /// \ingroup LongevityLifetimeGroup /// \brief Longest possible SingletonWithLongevity lifetime: 0xFFFFFFFF template <class T> -struct DieLast : SingletonFixedLongevity<0xFFFFFFFF ,T> +struct DieLast : SingletonFixedLongevity<0xFFFFFFFF , T> {}; /// \struct DieDirectlyBeforeLast /// \ingroup LongevityLifetimeGroup /// \brief Lifetime is a one less than DieLast: 0xFFFFFFFF-1 template <class T> -struct DieDirectlyBeforeLast : SingletonFixedLongevity<0xFFFFFFFF-1 ,T> +struct DieDirectlyBeforeLast : SingletonFixedLongevity < 0xFFFFFFFF - 1 , T > {}; /// \struct DieFirst /// \ingroup LongevityLifetimeGroup /// \brief Shortest possible SingletonWithLongevity lifetime: 0 template <class T> -struct DieFirst : SingletonFixedLongevity<0,T> +struct DieFirst : SingletonFixedLongevity<0, T> {}; }//namespace LongevityLifetime @@ -616,7 +616,7 @@ class FollowIntoDeath static void Init() { static bool done = false; - if(!done) + if (!done) { followers_ = new Container; done = true; @@ -632,7 +632,7 @@ class FollowIntoDeath static void DestroyFollowers() { Init(); - for(iterator it = followers_->begin(); it != followers_->end(); ++it) + for (iterator it = followers_->begin(); it != followers_->end(); ++it) (*it)(); delete followers_; } @@ -660,7 +660,7 @@ public: // template instantiation, this adds a additional atexit entry // does not work with SetLonlevity, but there you can control // the lifetime with the GetLongevity function. - Lifetime<Followers<Master> >::ScheduleDestruction(0,Followers<Master>::DestroyFollowers); + Lifetime<Followers<Master> >::ScheduleDestruction(0, Followers<Master>::DestroyFollowers); } static void OnDeadReference() @@ -741,7 +741,7 @@ private: SingletonHolder(); // Data - typedef typename ThreadingModel<T*,MutexPolicy>::VolatileType PtrInstanceType; + typedef typename ThreadingModel<T*, MutexPolicy>::VolatileType PtrInstanceType; static PtrInstanceType pInstance_; static bool destroyed_; }; @@ -783,8 +783,8 @@ class T, template <class, class> class ThreadingModel, class MutexPolicy > -inline T& SingletonHolder<T, CreationPolicy, - LifetimePolicy, ThreadingModel, MutexPolicy>::Instance() +inline T& SingletonHolder < T, CreationPolicy, + LifetimePolicy, ThreadingModel, MutexPolicy >::Instance() { if (!pInstance_) { @@ -805,10 +805,10 @@ template <class> class LifetimePolicy, template <class, class> class ThreadingModel, class MutexPolicy > -void SingletonHolder<T, CreationPolicy, - LifetimePolicy, ThreadingModel, MutexPolicy>::MakeInstance() +void SingletonHolder < T, CreationPolicy, + LifetimePolicy, ThreadingModel, MutexPolicy >::MakeInstance() { - typename ThreadingModel<SingletonHolder,MutexPolicy>::Lock guard; + typename ThreadingModel<SingletonHolder, MutexPolicy>::Lock guard; (void)guard; if (!pInstance_) @@ -875,14 +875,14 @@ public: /// Put this macro called with a SingletonHolder typedef into your cpp file. #define LOKI_SINGLETON_INSTANCE_DEFINITION(SHOLDER) \ -namespace Loki \ -{ \ + namespace Loki \ + { \ template<> \ SHOLDER::ObjectType& Singleton<SHOLDER::ObjectType>::Instance() \ { \ return SHOLDER::Instance(); \ } \ -} + } #endif // end file guardian diff --git a/shared/loki/SmallObj.cpp b/shared/loki/SmallObj.cpp index 0d82c1bb..1c42374f 100644 --- a/shared/loki/SmallObj.cpp +++ b/shared/loki/SmallObj.cpp @@ -1012,7 +1012,7 @@ void FixedAllocator::DoDeallocate(void* p) /// Calculates index into array where a FixedAllocator of numBytes is located. inline std::size_t GetOffset( std::size_t numBytes, std::size_t alignment ) { - const std::size_t alignExtra = alignment-1; + const std::size_t alignExtra = alignment - 1; return ( numBytes + alignExtra ) / alignment; } @@ -1070,7 +1070,7 @@ SmallObjAllocator::SmallObjAllocator( std::size_t pageSize, const std::size_t allocCount = GetOffset( maxObjectSize, objectAlignSize ); pool_ = new FixedAllocator[ allocCount ]; for ( std::size_t i = 0; i < allocCount; ++i ) - pool_[ i ].Initialize( ( i+1 ) * objectAlignSize, pageSize ); + pool_[ i ].Initialize( ( i + 1 ) * objectAlignSize, pageSize ); } // SmallObjAllocator::~SmallObjAllocator -------------------------------------- diff --git a/shared/loki/SmallObj.h b/shared/loki/SmallObj.h index 8725b911..10624cc2 100644 --- a/shared/loki/SmallObj.h +++ b/shared/loki/SmallObj.h @@ -224,14 +224,14 @@ class AllocatorSingleton : public SmallObjAllocator public: /// Defines type of allocator. - typedef AllocatorSingleton< ThreadingModel, chunkSize, + typedef AllocatorSingleton < ThreadingModel, chunkSize, maxSmallObjectSize, objectAlignSize, LifetimePolicy > MyAllocator; /// Defines type for thread-safety locking mechanism. typedef ThreadingModel< MyAllocator, MutexPolicy > MyThreadingModel; /// Defines singleton made from allocator. - typedef Loki::SingletonHolder< MyAllocator, Loki::CreateStatic, + typedef Loki::SingletonHolder < MyAllocator, Loki::CreateStatic, LifetimePolicy, ThreadingModel > MyAllocatorSingleton; /// Returns reference to the singleton. @@ -441,7 +441,7 @@ class SmallObjectBase public: /// Defines type of allocator singleton, must be public /// to handle singleton lifetime dependencies. - typedef AllocatorSingleton< ThreadingModel, chunkSize, + typedef AllocatorSingleton < ThreadingModel, chunkSize, maxSmallObjectSize, objectAlignSize, LifetimePolicy > ObjAllocatorSingleton; private: @@ -591,7 +591,7 @@ template <class, class> class ThreadingModel = LOKI_DEFAULT_THREADING_NO_OBJ_LEV template <class> class LifetimePolicy = LOKI_DEFAULT_SMALLOBJ_LIFETIME, class MutexPolicy = LOKI_DEFAULT_MUTEX > -class SmallObject : public SmallObjectBase< ThreadingModel, chunkSize, +class SmallObject : public SmallObjectBase < ThreadingModel, chunkSize, maxSmallObjectSize, objectAlignSize, LifetimePolicy, MutexPolicy > { @@ -627,7 +627,7 @@ template <class, class> class ThreadingModel = LOKI_DEFAULT_THREADING_NO_OBJ_LEV template <class> class LifetimePolicy = LOKI_DEFAULT_SMALLOBJ_LIFETIME, class MutexPolicy = LOKI_DEFAULT_MUTEX > -class SmallValueObject : public SmallObjectBase< ThreadingModel, chunkSize, +class SmallValueObject : public SmallObjectBase < ThreadingModel, chunkSize, maxSmallObjectSize, objectAlignSize, LifetimePolicy, MutexPolicy > { protected: diff --git a/shared/loki/SmartPtr.h b/shared/loki/SmartPtr.h index fb14258e..6f6f9996 100644 --- a/shared/loki/SmartPtr.h +++ b/shared/loki/SmartPtr.h @@ -440,7 +440,7 @@ public: : pCount_(static_cast<uintptr_t*>( SmallObject<>::operator new(sizeof(uintptr_t)))) { - assert(pCount_!=0); + assert(pCount_ != 0); *pCount_ = 1; } @@ -500,7 +500,7 @@ private: /// fixed at a higher design level, and no change to this class could fix it. //////////////////////////////////////////////////////////////////////////////// -template <template <class, class> class ThreadingModel, +template < template <class, class> class ThreadingModel, class MX = LOKI_DEFAULT_MUTEX > struct RefCountedMTAdj { @@ -584,14 +584,14 @@ public: static P Clone(const P& val) { - if(val!=0) + if (val != 0) val->AddRef(); return val; } static bool Release(const P& val) { - if(val!=0) + if (val != 0) val->Release(); return false; } @@ -1138,7 +1138,7 @@ public: typedef typename SP::StoredType StoredType; typedef typename SP::ReferenceType ReferenceType; - typedef typename Select<OP::destructiveCopy,SmartPtr, const SmartPtr>::Result + typedef typename Select<OP::destructiveCopy, SmartPtr, const SmartPtr>::Result CopyArg; private: @@ -1146,7 +1146,7 @@ private: #ifdef LOKI_SMARTPTR_CONVERSION_CONSTRUCTOR_POLICY typedef typename Select< CP::allow, const StoredType&, NeverMatched>::Result ImplicitArg; - typedef typename Select<!CP::allow, const StoredType&, NeverMatched>::Result ExplicitArg; + typedef typename Select < !CP::allow, const StoredType&, NeverMatched >::Result ExplicitArg; #else typedef const StoredType& ImplicitArg; typedef typename Select<false, const StoredType&, NeverMatched>::Result ExplicitArg; @@ -1765,8 +1765,8 @@ typename T, template <class> class CNP > struct less< Loki::SmartPtr<T, OP, CP, KP, SP, CNP > > - : public binary_function<Loki::SmartPtr<T, OP, CP, KP, SP, CNP >, - Loki::SmartPtr<T, OP, CP, KP, SP, CNP >, bool> + : public binary_function < Loki::SmartPtr<T, OP, CP, KP, SP, CNP >, + Loki::SmartPtr<T, OP, CP, KP, SP, CNP >, bool > { bool operator()(const Loki::SmartPtr<T, OP, CP, KP, SP, CNP >& lhs, const Loki::SmartPtr<T, OP, CP, KP, SP, CNP >& rhs) const diff --git a/shared/loki/StrongPtr.h b/shared/loki/StrongPtr.h index 23d70415..868eb48f 100644 --- a/shared/loki/StrongPtr.h +++ b/shared/loki/StrongPtr.h @@ -887,7 +887,7 @@ private: #ifdef LOKI_SMARTPTR_CONVERSION_CONSTRUCTOR_POLICY typedef typename Select< CP::allow, const StoredType&, NeverMatched>::Result ImplicitArg; - typedef typename Select<!CP::allow, const StoredType&, NeverMatched>::Result ExplicitArg; + typedef typename Select < !CP::allow, const StoredType&, NeverMatched >::Result ExplicitArg; #else typedef const StoredType& ImplicitArg; typedef typename Select<false, const StoredType&, NeverMatched>::Result ExplicitArg; @@ -1678,7 +1678,7 @@ typename T, template < class > class CNP > struct less< Loki::StrongPtr< T, S, OP, CP, KP, RP, DP, CNP > > - : public binary_function< + : public binary_function < Loki::StrongPtr< T, S, OP, CP, KP, RP, DP, CNP >, Loki::StrongPtr< T, S, OP, CP, KP, RP, DP, CNP >, bool > { diff --git a/shared/loki/Threads.h b/shared/loki/Threads.h index 8fb5d362..690ca50f 100644 --- a/shared/loki/Threads.h +++ b/shared/loki/Threads.h @@ -92,97 +92,97 @@ #define LOKI_THREADS_MUTEX_CTOR(x) #define LOKI_THREADS_ATOMIC_FUNCTIONS \ - static IntType AtomicMultiply(volatile IntType& lval, const IntType val) \ - { \ - ::EnterCriticalSection( &atomic_mutex_ ); \ - lval *= val; \ - ::LeaveCriticalSection( &atomic_mutex_ ); \ - return lval; \ - } \ - \ - static IntType AtomicDivide(volatile IntType& lval, const IntType val) \ - { \ - ::EnterCriticalSection( &atomic_mutex_ ); \ - lval /= val; \ - ::LeaveCriticalSection( &atomic_mutex_ ); \ - return lval; \ - } \ - \ - static IntType AtomicIncrement(volatile IntType& lval) \ - { \ - ::EnterCriticalSection( &atomic_mutex_ ); \ - ++lval; \ - ::LeaveCriticalSection( &atomic_mutex_ ); \ - return lval; \ - } \ - \ - static IntType AtomicDecrement(volatile IntType& lval) \ - { \ - ::EnterCriticalSection( &atomic_mutex_ ); \ - --lval; \ - ::LeaveCriticalSection( &atomic_mutex_ ); \ - return lval; \ - } \ - \ - static void AtomicAssign(volatile IntType& lval, const IntType val) \ - { InterlockedExchange(&const_cast<IntType&>(lval), val); } \ - \ - static void AtomicAssign(IntType& lval, volatile const IntType& val) \ - { InterlockedExchange(&lval, val); } \ - \ - static IntType AtomicIncrement(volatile IntType& lval, const IntType compare, bool & matches ) \ - { \ - ::EnterCriticalSection( &atomic_mutex_ ); \ - ++lval; \ - matches = ( lval == compare ); \ - ::LeaveCriticalSection( &atomic_mutex_ ); \ - return lval; \ - } \ - \ - static IntType AtomicDecrement(volatile IntType& lval, const IntType compare, bool & matches ) \ - { \ - ::EnterCriticalSection( &atomic_mutex_ ); \ - --lval; \ - matches = ( lval == compare ); \ - ::LeaveCriticalSection( &atomic_mutex_ ); \ - return lval; \ - } \ - \ - static IntType AtomicAdd(volatile IntType& lval, const IntType val, const IntType compare, bool & matches ) \ - { \ - ::EnterCriticalSection( &atomic_mutex_ ); \ - lval += val; \ - matches = ( lval == compare ); \ - ::LeaveCriticalSection( &atomic_mutex_ ); \ - return lval; \ - } \ - \ - static IntType AtomicSubtract(volatile IntType& lval, const IntType val, const IntType compare, bool & matches ) \ - { \ - ::EnterCriticalSection( &atomic_mutex_ ); \ - lval -= val; \ - matches = ( lval == compare ); \ - ::LeaveCriticalSection( &atomic_mutex_ ); \ - return lval; \ - } \ - \ - static IntType AtomicMultiply(volatile IntType& lval, const IntType val, const IntType compare, bool & matches ) \ - { \ - ::EnterCriticalSection( &atomic_mutex_ ); \ - lval *= val; \ - matches = ( lval == compare ); \ - ::LeaveCriticalSection( &atomic_mutex_ ); \ - return lval; \ - } \ - \ - static IntType AtomicDivide(volatile IntType& lval, const IntType val, const IntType compare, bool & matches ) \ - { \ - ::EnterCriticalSection( &atomic_mutex_ ); \ - lval /= val; \ - matches = ( lval == compare ); \ - ::LeaveCriticalSection( &atomic_mutex_ ); \ - return lval; \ - } + static IntType AtomicMultiply(volatile IntType& lval, const IntType val) \ + { \ + ::EnterCriticalSection( &atomic_mutex_ ); \ + lval *= val; \ + ::LeaveCriticalSection( &atomic_mutex_ ); \ + return lval; \ + } \ + \ + static IntType AtomicDivide(volatile IntType& lval, const IntType val) \ + { \ + ::EnterCriticalSection( &atomic_mutex_ ); \ + lval /= val; \ + ::LeaveCriticalSection( &atomic_mutex_ ); \ + return lval; \ + } \ + \ + static IntType AtomicIncrement(volatile IntType& lval) \ + { \ + ::EnterCriticalSection( &atomic_mutex_ ); \ + ++lval; \ + ::LeaveCriticalSection( &atomic_mutex_ ); \ + return lval; \ + } \ + \ + static IntType AtomicDecrement(volatile IntType& lval) \ + { \ + ::EnterCriticalSection( &atomic_mutex_ ); \ + --lval; \ + ::LeaveCriticalSection( &atomic_mutex_ ); \ + return lval; \ + } \ + \ + static void AtomicAssign(volatile IntType& lval, const IntType val) \ + { InterlockedExchange(&const_cast<IntType&>(lval), val); } \ + \ + static void AtomicAssign(IntType& lval, volatile const IntType& val) \ + { InterlockedExchange(&lval, val); } \ + \ + static IntType AtomicIncrement(volatile IntType& lval, const IntType compare, bool & matches ) \ + { \ + ::EnterCriticalSection( &atomic_mutex_ ); \ + ++lval; \ + matches = ( lval == compare ); \ + ::LeaveCriticalSection( &atomic_mutex_ ); \ + return lval; \ + } \ + \ + static IntType AtomicDecrement(volatile IntType& lval, const IntType compare, bool & matches ) \ + { \ + ::EnterCriticalSection( &atomic_mutex_ ); \ + --lval; \ + matches = ( lval == compare ); \ + ::LeaveCriticalSection( &atomic_mutex_ ); \ + return lval; \ + } \ + \ + static IntType AtomicAdd(volatile IntType& lval, const IntType val, const IntType compare, bool & matches ) \ + { \ + ::EnterCriticalSection( &atomic_mutex_ ); \ + lval += val; \ + matches = ( lval == compare ); \ + ::LeaveCriticalSection( &atomic_mutex_ ); \ + return lval; \ + } \ + \ + static IntType AtomicSubtract(volatile IntType& lval, const IntType val, const IntType compare, bool & matches ) \ + { \ + ::EnterCriticalSection( &atomic_mutex_ ); \ + lval -= val; \ + matches = ( lval == compare ); \ + ::LeaveCriticalSection( &atomic_mutex_ ); \ + return lval; \ + } \ + \ + static IntType AtomicMultiply(volatile IntType& lval, const IntType val, const IntType compare, bool & matches ) \ + { \ + ::EnterCriticalSection( &atomic_mutex_ ); \ + lval *= val; \ + matches = ( lval == compare ); \ + ::LeaveCriticalSection( &atomic_mutex_ ); \ + return lval; \ + } \ + \ + static IntType AtomicDivide(volatile IntType& lval, const IntType val, const IntType compare, bool & matches ) \ + { \ + ::EnterCriticalSection( &atomic_mutex_ ); \ + lval /= val; \ + matches = ( lval == compare ); \ + ::LeaveCriticalSection( &atomic_mutex_ ); \ + return lval; \ + } #elif defined(LOKI_PTHREAD_H) @@ -206,96 +206,96 @@ #define LOKI_THREADS_LONG long #define LOKI_THREADS_ATOMIC(x) \ - pthread_mutex_lock(&atomic_mutex_); \ - x; \ - pthread_mutex_unlock(&atomic_mutex_) + pthread_mutex_lock(&atomic_mutex_); \ + x; \ + pthread_mutex_unlock(&atomic_mutex_) #define LOKI_THREADS_ATOMIC_FUNCTIONS \ private: \ - static pthread_mutex_t atomic_mutex_; \ + static pthread_mutex_t atomic_mutex_; \ public: \ - static IntType AtomicMultiply(volatile IntType& lval, const IntType val) \ - { \ - ::pthread_mutex_lock( &atomic_mutex_ ); \ - lval *= val; \ - ::pthread_mutex_unlock( &atomic_mutex_ ); \ - return lval; \ - } \ - \ - static IntType AtomicDivide(volatile IntType& lval, const IntType val) \ - { \ - ::pthread_mutex_lock( &atomic_mutex_ ); \ - lval /= val; \ - ::pthread_mutex_unlock( &atomic_mutex_ ); \ - return lval; \ - } \ - \ - static IntType AtomicIncrement(volatile IntType& lval) \ - { \ - ::pthread_mutex_lock( &atomic_mutex_ ); \ - ++lval; \ - ::pthread_mutex_unlock( &atomic_mutex_ ); \ - return lval; \ - } \ - \ - static IntType AtomicDecrement(volatile IntType& lval) \ - { \ - ::pthread_mutex_lock( &atomic_mutex_ ); \ - --lval; \ - ::pthread_mutex_unlock( &atomic_mutex_ ); \ - return lval; \ - } \ - \ - static void AtomicAssign(volatile IntType& lval, const IntType val) \ - { \ - ::pthread_mutex_lock( &atomic_mutex_ ); \ - lval = val; \ - ::pthread_mutex_unlock( &atomic_mutex_ ); \ - return lval; \ - } \ - \ - static void AtomicAssign(IntType& lval, volatile const IntType& val) \ - { \ - ::pthread_mutex_lock( &atomic_mutex_ ); \ - lval = val; \ - ::pthread_mutex_unlock( &atomic_mutex_ ); \ - return lval; \ - } \ - \ - static IntType AtomicIncrement(volatile IntType& lval, const IntType compare, bool & matches ) \ - { \ - ::pthread_mutex_lock( &atomic_mutex_ ); \ - ++lval; \ - matches = ( compare == lval ); \ - ::pthread_mutex_unlock( &atomic_mutex_ ); \ - return lval; \ - } \ - \ - static IntType AtomicDecrement(volatile IntType& lval, const IntType compare, bool & matches ) \ - { \ - ::pthread_mutex_lock( &atomic_mutex_ ); \ - --lval; \ - matches = ( compare == lval ); \ - ::pthread_mutex_unlock( &atomic_mutex_ ); \ - return lval; \ - } \ - static IntType AtomicMultiply(volatile IntType& lval, const IntType val, const IntType compare, bool & matches ) \ - { \ - ::pthread_mutex_lock( &atomic_mutex_ ); \ - lval *= val; \ - matches = ( lval == compare ); \ - ::pthread_mutex_unlock( &atomic_mutex_ ); \ - return lval; \ - } \ - \ - static IntType AtomicDivide(volatile IntType& lval, const IntType val, const IntType compare, bool & matches ) \ - { \ - ::pthread_mutex_lock( &atomic_mutex_ ); \ - lval /= val; \ - matches = ( lval == compare ); \ - ::pthread_mutex_unlock( &atomic_mutex_ ); \ - return lval; \ - } + static IntType AtomicMultiply(volatile IntType& lval, const IntType val) \ + { \ + ::pthread_mutex_lock( &atomic_mutex_ ); \ + lval *= val; \ + ::pthread_mutex_unlock( &atomic_mutex_ ); \ + return lval; \ + } \ + \ + static IntType AtomicDivide(volatile IntType& lval, const IntType val) \ + { \ + ::pthread_mutex_lock( &atomic_mutex_ ); \ + lval /= val; \ + ::pthread_mutex_unlock( &atomic_mutex_ ); \ + return lval; \ + } \ + \ + static IntType AtomicIncrement(volatile IntType& lval) \ + { \ + ::pthread_mutex_lock( &atomic_mutex_ ); \ + ++lval; \ + ::pthread_mutex_unlock( &atomic_mutex_ ); \ + return lval; \ + } \ + \ + static IntType AtomicDecrement(volatile IntType& lval) \ + { \ + ::pthread_mutex_lock( &atomic_mutex_ ); \ + --lval; \ + ::pthread_mutex_unlock( &atomic_mutex_ ); \ + return lval; \ + } \ + \ + static void AtomicAssign(volatile IntType& lval, const IntType val) \ + { \ + ::pthread_mutex_lock( &atomic_mutex_ ); \ + lval = val; \ + ::pthread_mutex_unlock( &atomic_mutex_ ); \ + return lval; \ + } \ + \ + static void AtomicAssign(IntType& lval, volatile const IntType& val) \ + { \ + ::pthread_mutex_lock( &atomic_mutex_ ); \ + lval = val; \ + ::pthread_mutex_unlock( &atomic_mutex_ ); \ + return lval; \ + } \ + \ + static IntType AtomicIncrement(volatile IntType& lval, const IntType compare, bool & matches ) \ + { \ + ::pthread_mutex_lock( &atomic_mutex_ ); \ + ++lval; \ + matches = ( compare == lval ); \ + ::pthread_mutex_unlock( &atomic_mutex_ ); \ + return lval; \ + } \ + \ + static IntType AtomicDecrement(volatile IntType& lval, const IntType compare, bool & matches ) \ + { \ + ::pthread_mutex_lock( &atomic_mutex_ ); \ + --lval; \ + matches = ( compare == lval ); \ + ::pthread_mutex_unlock( &atomic_mutex_ ); \ + return lval; \ + } \ + static IntType AtomicMultiply(volatile IntType& lval, const IntType val, const IntType compare, bool & matches ) \ + { \ + ::pthread_mutex_lock( &atomic_mutex_ ); \ + lval *= val; \ + matches = ( lval == compare ); \ + ::pthread_mutex_unlock( &atomic_mutex_ ); \ + return lval; \ + } \ + \ + static IntType AtomicDivide(volatile IntType& lval, const IntType val, const IntType compare, bool & matches ) \ + { \ + ::pthread_mutex_lock( &atomic_mutex_ ); \ + lval /= val; \ + matches = ( lval == compare ); \ + ::pthread_mutex_unlock( &atomic_mutex_ ); \ + return lval; \ + } #else // single threaded diff --git a/shared/loki/TypeManip.h b/shared/loki/TypeManip.h index 6b7f4ab8..7933e340 100644 --- a/shared/loki/TypeManip.h +++ b/shared/loki/TypeManip.h @@ -83,7 +83,7 @@ struct IsSameType }; template <typename T> -struct IsSameType<T,T> +struct IsSameType<T, T> { enum { value = true }; }; @@ -215,7 +215,7 @@ struct SuperSubclass<T, void> // Caveat: might not work if T and U are in a private inheritance hierarchy. //////////////////////////////////////////////////////////////////////////////// -template<class T,class U> +template<class T, class U> struct SuperSubclassStrict { enum { value = (::Loki::Conversion<const volatile U*, const volatile T*>::exists && diff --git a/shared/loki/TypeTraits.h b/shared/loki/TypeTraits.h index 2d5af757..28d0f0c1 100644 --- a/shared/loki/TypeTraits.h +++ b/shared/loki/TypeTraits.h @@ -93,18 +93,18 @@ struct IsCustomFloat namespace Private { #ifndef LOKI_DISABLE_TYPELIST_MACROS -typedef LOKI_TYPELIST_4(unsigned char, unsigned short int,unsigned int, unsigned long int) +typedef LOKI_TYPELIST_4(unsigned char, unsigned short int, unsigned int, unsigned long int) StdUnsignedInts; -typedef LOKI_TYPELIST_4(signed char, short int,int, long int) +typedef LOKI_TYPELIST_4(signed char, short int, int, long int) StdSignedInts; typedef LOKI_TYPELIST_3(bool, char, wchar_t) StdOtherInts; typedef LOKI_TYPELIST_3(float, double, long double) StdFloats; #else -typedef Loki::Seq<unsigned char, unsigned short int,unsigned int, unsigned long int>::Type +typedef Loki::Seq<unsigned char, unsigned short int, unsigned int, unsigned long int>::Type StdUnsignedInts; -typedef Loki::Seq<signed char, short int,int, long int>::Type +typedef Loki::Seq<signed char, short int, int, long int>::Type StdSignedInts; typedef Loki::Seq<bool, char, wchar_t>::Type StdOtherInts; @@ -160,372 +160,372 @@ template <typename T> struct IsFunctionPointerRaw<T(*)()> {enum {result = 1};}; -template <typename T, - typename P01> +template < typename T, + typename P01 > struct IsFunctionPointerRaw<T(*)(P01)> {enum {result = 1};}; -template <typename T, - typename P01, typename P02> -struct IsFunctionPointerRaw<T(*)( - P01, P02)> +template < typename T, + typename P01, typename P02 > +struct IsFunctionPointerRaw < T(*)( + P01, P02) > {enum {result = 1};}; -template <typename T, - typename P01, typename P02, typename P03> -struct IsFunctionPointerRaw<T(*)( - P01, P02, P03)> +template < typename T, + typename P01, typename P02, typename P03 > +struct IsFunctionPointerRaw < T(*)( + P01, P02, P03) > {enum {result = 1};}; -template <typename T, - typename P01, typename P02, typename P03, typename P04> -struct IsFunctionPointerRaw<T(*)( - P01, P02, P03, P04)> +template < typename T, + typename P01, typename P02, typename P03, typename P04 > +struct IsFunctionPointerRaw < T(*)( + P01, P02, P03, P04) > {enum {result = 1};}; -template <typename T, - typename P01, typename P02, typename P03, typename P04, typename P05> -struct IsFunctionPointerRaw<T(*)( - P01, P02, P03, P04, P05)> +template < typename T, + typename P01, typename P02, typename P03, typename P04, typename P05 > +struct IsFunctionPointerRaw < T(*)( + P01, P02, P03, P04, P05) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06> -struct IsFunctionPointerRaw<T(*)( + typename P06 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, - P06)> + P06) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07> -struct IsFunctionPointerRaw<T(*)( + typename P06, typename P07 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, - P06, P07)> + P06, P07) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08> -struct IsFunctionPointerRaw<T(*)( + typename P06, typename P07, typename P08 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, - P06, P07, P08)> + P06, P07, P08) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09> -struct IsFunctionPointerRaw<T(*)( + typename P06, typename P07, typename P08, typename P09 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, - P06, P07, P08, P09)> + P06, P07, P08, P09) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09, typename P10> -struct IsFunctionPointerRaw<T(*)( + typename P06, typename P07, typename P08, typename P09, typename P10 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, - P06, P07, P08, P09, P10)> + P06, P07, P08, P09, P10) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11> -struct IsFunctionPointerRaw<T(*)( + typename P11 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11)> + P11) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12> -struct IsFunctionPointerRaw<T(*)( + typename P11, typename P12 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12)> + P11, P12) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13> -struct IsFunctionPointerRaw<T(*)( + typename P11, typename P12, typename P13 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13)> + P11, P12, P13) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14> -struct IsFunctionPointerRaw<T(*)( + typename P11, typename P12, typename P13, typename P14 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, P14)> + P11, P12, P13, P14) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14, typename P15> -struct IsFunctionPointerRaw<T(*)( + typename P11, typename P12, typename P13, typename P14, typename P15 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, P14, P15)> + P11, P12, P13, P14, P15) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16> -struct IsFunctionPointerRaw<T(*)( + typename P16 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16)> + P16) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17> -struct IsFunctionPointerRaw<T(*)( + typename P16, typename P17 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17)> + P16, P17) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18> -struct IsFunctionPointerRaw<T(*)( + typename P16, typename P17, typename P18 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18)> + P16, P17, P18) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19> -struct IsFunctionPointerRaw<T(*)( + typename P16, typename P17, typename P18, typename P19 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, P19)> + P16, P17, P18, P19) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19, typename P20> -struct IsFunctionPointerRaw<T(*)( + typename P16, typename P17, typename P18, typename P19, typename P20 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, P19, P20)> + P16, P17, P18, P19, P20) > {enum {result = 1};}; template <typename T> -struct IsFunctionPointerRaw<T(*)( - ...)> +struct IsFunctionPointerRaw < T(*)( + ...) > {enum {result = 1};}; -template <typename T, - typename P01> -struct IsFunctionPointerRaw<T(*)( - P01, ...)> +template < typename T, + typename P01 > +struct IsFunctionPointerRaw < T(*)( + P01, ...) > {enum {result = 1};}; -template <typename T, - typename P01, typename P02> -struct IsFunctionPointerRaw<T(*)( - P01, P02, ...)> +template < typename T, + typename P01, typename P02 > +struct IsFunctionPointerRaw < T(*)( + P01, P02, ...) > {enum {result = 1};}; -template <typename T, - typename P01, typename P02, typename P03> -struct IsFunctionPointerRaw<T(*)( - P01, P02, P03, ...)> +template < typename T, + typename P01, typename P02, typename P03 > +struct IsFunctionPointerRaw < T(*)( + P01, P02, P03, ...) > {enum {result = 1};}; -template <typename T, - typename P01, typename P02, typename P03, typename P04> -struct IsFunctionPointerRaw<T(*)( - P01, P02, P03, P04, ...)> +template < typename T, + typename P01, typename P02, typename P03, typename P04 > +struct IsFunctionPointerRaw < T(*)( + P01, P02, P03, P04, ...) > {enum {result = 1};}; -template <typename T, - typename P01, typename P02, typename P03, typename P04, typename P05> -struct IsFunctionPointerRaw<T(*)( +template < typename T, + typename P01, typename P02, typename P03, typename P04, typename P05 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, - ...)> + ...) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06> -struct IsFunctionPointerRaw<T(*)( + typename P06 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, - P06, ...)> + P06, ...) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07> -struct IsFunctionPointerRaw<T(*)( + typename P06, typename P07 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, - P06, P07, ...)> + P06, P07, ...) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08> -struct IsFunctionPointerRaw<T(*)( + typename P06, typename P07, typename P08 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, - P06, P07, P08, ...)> + P06, P07, P08, ...) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09> -struct IsFunctionPointerRaw<T(*)( + typename P06, typename P07, typename P08, typename P09 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, - P06, P07, P08, P09, ...)> + P06, P07, P08, P09, ...) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09, typename P10> -struct IsFunctionPointerRaw<T(*)( + typename P06, typename P07, typename P08, typename P09, typename P10 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - ...)> + ...) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11> -struct IsFunctionPointerRaw<T(*)( + typename P11 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, ...)> + P11, ...) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12> -struct IsFunctionPointerRaw<T(*)( + typename P11, typename P12 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, ...)> + P11, P12, ...) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13> -struct IsFunctionPointerRaw<T(*)( + typename P11, typename P12, typename P13 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, ...)> + P11, P12, P13, ...) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14> -struct IsFunctionPointerRaw<T(*)( + typename P11, typename P12, typename P13, typename P14 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, P14, ...)> + P11, P12, P13, P14, ...) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14, typename P15> -struct IsFunctionPointerRaw<T(*)( + typename P11, typename P12, typename P13, typename P14, typename P15 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - ...)> + ...) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16> -struct IsFunctionPointerRaw<T(*)( + typename P16 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, ...)> + P16, ...) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17> -struct IsFunctionPointerRaw<T(*)( + typename P16, typename P17 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, ...)> + P16, P17, ...) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18> -struct IsFunctionPointerRaw<T(*)( + typename P16, typename P17, typename P18 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, ...)> + P16, P17, P18, ...) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19> -struct IsFunctionPointerRaw<T(*)( + typename P16, typename P17, typename P18, typename P19 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, P19, ...)> + P16, P17, P18, P19, ...) > {enum {result = 1};}; -template <typename T, +template < typename T, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19, typename P20> -struct IsFunctionPointerRaw<T(*)( + typename P16, typename P17, typename P18, typename P19, typename P20 > +struct IsFunctionPointerRaw < T(*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, P20, - ...)> + ...) > {enum {result = 1};}; @@ -537,372 +537,372 @@ template <typename T, typename S> struct IsMemberFunctionPointerRaw<T (S::*)()> {enum {result = 1};}; -template <typename T, typename S, - typename P01> +template < typename T, typename S, + typename P01 > struct IsMemberFunctionPointerRaw<T (S::*)(P01)> {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02)> +template < typename T, typename S, + typename P01, typename P02 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02) > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03)> +template < typename T, typename S, + typename P01, typename P02, typename P03 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03) > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03, typename P04> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03, P04)> +template < typename T, typename S, + typename P01, typename P02, typename P03, typename P04 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03, P04) > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03, typename P04, typename P05> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03, P04, P05)> +template < typename T, typename S, + typename P01, typename P02, typename P03, typename P04, typename P05 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03, P04, P05) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06)> + P06) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07)> + P06, P07) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08)> + P06, P07, P08) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08, typename P09 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08, P09)> + P06, P07, P08, P09) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09, typename P10> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08, typename P09, typename P10 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08, P09, P10)> + P06, P07, P08, P09, P10) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11)> + P11) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12)> + P11, P12) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13)> + P11, P12, P13) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13, typename P14 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, P14)> + P11, P12, P13, P14) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14, typename P15> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13, typename P14, typename P15 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, P14, P15)> + P11, P12, P13, P14, P15) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16)> + P16) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17)> + P16, P17) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18)> + P16, P17, P18) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18, typename P19 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, P19)> + P16, P17, P18, P19) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19, typename P20> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18, typename P19, typename P20 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, P19, P20)> + P16, P17, P18, P19, P20) > {enum {result = 1};}; template <typename T, typename S> -struct IsMemberFunctionPointerRaw<T (S::*)( - ...)> +struct IsMemberFunctionPointerRaw < T (S::*)( + ...) > {enum {result = 1};}; -template <typename T, typename S, - typename P01> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, ...)> +template < typename T, typename S, + typename P01 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, ...) > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, ...)> +template < typename T, typename S, + typename P01, typename P02 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, ...) > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03, ...)> +template < typename T, typename S, + typename P01, typename P02, typename P03 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03, ...) > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03, typename P04> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03, P04, ...)> +template < typename T, typename S, + typename P01, typename P02, typename P03, typename P04 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03, P04, ...) > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03, typename P04, typename P05> -struct IsMemberFunctionPointerRaw<T (S::*)( +template < typename T, typename S, + typename P01, typename P02, typename P03, typename P04, typename P05 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - ...)> + ...) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, ...)> + P06, ...) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, ...)> + P06, P07, ...) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08, ...)> + P06, P07, P08, ...) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08, typename P09 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08, P09, ...)> + P06, P07, P08, P09, ...) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09, typename P10> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08, typename P09, typename P10 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - ...)> + ...) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, ...)> + P11, ...) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, ...)> + P11, P12, ...) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, ...)> + P11, P12, P13, ...) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13, typename P14 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, P14, ...)> + P11, P12, P13, P14, ...) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14, typename P15> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13, typename P14, typename P15 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - ...)> + ...) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, ...)> + P16, ...) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, ...)> + P16, P17, ...) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, ...)> + P16, P17, P18, ...) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18, typename P19 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, P19, ...)> + P16, P17, P18, P19, ...) > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19, typename P20> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18, typename P19, typename P20 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, P20, - ...)> + ...) > {enum {result = 1};}; // Const versions @@ -911,372 +911,372 @@ template <typename T, typename S> struct IsMemberFunctionPointerRaw<T (S::*)() const> {enum {result = 1};}; -template <typename T, typename S, - typename P01> +template < typename T, typename S, + typename P01 > struct IsMemberFunctionPointerRaw<T (S::*)(P01) const> {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02) const> +template < typename T, typename S, + typename P01, typename P02 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02) const > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03) const> +template < typename T, typename S, + typename P01, typename P02, typename P03 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03) const > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03, typename P04> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03, P04) const> +template < typename T, typename S, + typename P01, typename P02, typename P03, typename P04 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03, P04) const > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03, typename P04, typename P05> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03, P04, P05) const> +template < typename T, typename S, + typename P01, typename P02, typename P03, typename P04, typename P05 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03, P04, P05) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06) const> + P06) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07) const> + P06, P07) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08) const> + P06, P07, P08) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08, typename P09 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08, P09) const> + P06, P07, P08, P09) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09, typename P10> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08, typename P09, typename P10 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08, P09, P10) const> + P06, P07, P08, P09, P10) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11) const> + P11) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12) const> + P11, P12) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13) const> + P11, P12, P13) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13, typename P14 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, P14) const> + P11, P12, P13, P14) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14, typename P15> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13, typename P14, typename P15 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, P14, P15) const> + P11, P12, P13, P14, P15) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16) const> + P16) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17) const> + P16, P17) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18) const> + P16, P17, P18) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18, typename P19 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, P19) const> + P16, P17, P18, P19) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19, typename P20> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18, typename P19, typename P20 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, P19, P20) const> + P16, P17, P18, P19, P20) const > {enum {result = 1};}; template <typename T, typename S> -struct IsMemberFunctionPointerRaw<T (S::*)( - ...) const> +struct IsMemberFunctionPointerRaw < T (S::*)( + ...) const > {enum {result = 1};}; -template <typename T, typename S, - typename P01> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, ...) const> +template < typename T, typename S, + typename P01 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, ...) const > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, ...) const> +template < typename T, typename S, + typename P01, typename P02 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, ...) const > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03, ...) const> +template < typename T, typename S, + typename P01, typename P02, typename P03 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03, ...) const > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03, typename P04> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03, P04, ...) const> +template < typename T, typename S, + typename P01, typename P02, typename P03, typename P04 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03, P04, ...) const > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03, typename P04, typename P05> -struct IsMemberFunctionPointerRaw<T (S::*)( +template < typename T, typename S, + typename P01, typename P02, typename P03, typename P04, typename P05 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - ...) const> + ...) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, ...) const> + P06, ...) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, ...) const> + P06, P07, ...) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08, ...) const> + P06, P07, P08, ...) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08, typename P09 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08, P09, ...) const> + P06, P07, P08, P09, ...) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09, typename P10> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08, typename P09, typename P10 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - ...) const> + ...) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, ...) const> + P11, ...) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, ...) const> + P11, P12, ...) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, ...) const> + P11, P12, P13, ...) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13, typename P14 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, P14, ...) const> + P11, P12, P13, P14, ...) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14, typename P15> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13, typename P14, typename P15 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - ...) const> + ...) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, ...) const> + P16, ...) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, ...) const> + P16, P17, ...) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, ...) const> + P16, P17, P18, ...) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18, typename P19 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, P19, ...) const> + P16, P17, P18, P19, ...) const > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19, typename P20> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18, typename P19, typename P20 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, P20, - ...) const> + ...) const > {enum {result = 1};}; // Volatile versions @@ -1285,372 +1285,372 @@ template <typename T, typename S> struct IsMemberFunctionPointerRaw<T (S::*)() volatile> {enum {result = 1};}; -template <typename T, typename S, - typename P01> +template < typename T, typename S, + typename P01 > struct IsMemberFunctionPointerRaw<T (S::*)(P01) volatile> {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02) volatile> +template < typename T, typename S, + typename P01, typename P02 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02) volatile > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03) volatile> +template < typename T, typename S, + typename P01, typename P02, typename P03 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03) volatile > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03, typename P04> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03, P04) volatile> +template < typename T, typename S, + typename P01, typename P02, typename P03, typename P04 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03, P04) volatile > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03, typename P04, typename P05> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03, P04, P05) volatile> +template < typename T, typename S, + typename P01, typename P02, typename P03, typename P04, typename P05 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03, P04, P05) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06) volatile> + P06) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07) volatile> + P06, P07) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08) volatile> + P06, P07, P08) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08, typename P09 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08, P09) volatile> + P06, P07, P08, P09) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09, typename P10> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08, typename P09, typename P10 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08, P09, P10) volatile> + P06, P07, P08, P09, P10) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11) volatile> + P11) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12) volatile> + P11, P12) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13) volatile> + P11, P12, P13) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13, typename P14 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, P14) volatile> + P11, P12, P13, P14) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14, typename P15> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13, typename P14, typename P15 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, P14, P15) volatile> + P11, P12, P13, P14, P15) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16) volatile> + P16) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17) volatile> + P16, P17) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18) volatile> + P16, P17, P18) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18, typename P19 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, P19) volatile> + P16, P17, P18, P19) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19, typename P20> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18, typename P19, typename P20 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, P19, P20) volatile> + P16, P17, P18, P19, P20) volatile > {enum {result = 1};}; template <typename T, typename S> -struct IsMemberFunctionPointerRaw<T (S::*)( - ...) volatile> +struct IsMemberFunctionPointerRaw < T (S::*)( + ...) volatile > {enum {result = 1};}; -template <typename T, typename S, - typename P01> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, ...) volatile> +template < typename T, typename S, + typename P01 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, ...) volatile > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, ...) volatile> +template < typename T, typename S, + typename P01, typename P02 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, ...) volatile > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03, ...) volatile> +template < typename T, typename S, + typename P01, typename P02, typename P03 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03, ...) volatile > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03, typename P04> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03, P04, ...) volatile> +template < typename T, typename S, + typename P01, typename P02, typename P03, typename P04 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03, P04, ...) volatile > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03, typename P04, typename P05> -struct IsMemberFunctionPointerRaw<T (S::*)( +template < typename T, typename S, + typename P01, typename P02, typename P03, typename P04, typename P05 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - ...) volatile> + ...) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, ...) volatile> + P06, ...) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, ...) volatile> + P06, P07, ...) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08, ...) volatile> + P06, P07, P08, ...) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08, typename P09 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08, P09, ...) volatile> + P06, P07, P08, P09, ...) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09, typename P10> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08, typename P09, typename P10 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - ...) volatile> + ...) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, ...) volatile> + P11, ...) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, ...) volatile> + P11, P12, ...) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, ...) volatile> + P11, P12, P13, ...) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13, typename P14 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, P14, ...) volatile> + P11, P12, P13, P14, ...) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14, typename P15> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13, typename P14, typename P15 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - ...) volatile> + ...) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, ...) volatile> + P16, ...) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, ...) volatile> + P16, P17, ...) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, ...) volatile> + P16, P17, P18, ...) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18, typename P19 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, P19, ...) volatile> + P16, P17, P18, P19, ...) volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19, typename P20> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18, typename P19, typename P20 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, P20, - ...) volatile> + ...) volatile > {enum {result = 1};}; // Const volatile versions @@ -1659,372 +1659,372 @@ template <typename T, typename S> struct IsMemberFunctionPointerRaw<T (S::*)() const volatile> {enum {result = 1};}; -template <typename T, typename S, - typename P01> +template < typename T, typename S, + typename P01 > struct IsMemberFunctionPointerRaw<T (S::*)(P01) const volatile> {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02) const volatile> +template < typename T, typename S, + typename P01, typename P02 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02) const volatile > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03) const volatile> +template < typename T, typename S, + typename P01, typename P02, typename P03 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03) const volatile > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03, typename P04> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03, P04) const volatile> +template < typename T, typename S, + typename P01, typename P02, typename P03, typename P04 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03, P04) const volatile > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03, typename P04, typename P05> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03, P04, P05) const volatile> +template < typename T, typename S, + typename P01, typename P02, typename P03, typename P04, typename P05 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03, P04, P05) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06) const volatile> + P06) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07) const volatile> + P06, P07) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08) const volatile> + P06, P07, P08) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08, typename P09 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08, P09) const volatile> + P06, P07, P08, P09) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09, typename P10> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08, typename P09, typename P10 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08, P09, P10) const volatile> + P06, P07, P08, P09, P10) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11) const volatile> + P11) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12) const volatile> + P11, P12) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13) const volatile> + P11, P12, P13) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13, typename P14 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, P14) const volatile> + P11, P12, P13, P14) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14, typename P15> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13, typename P14, typename P15 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, P14, P15) const volatile> + P11, P12, P13, P14, P15) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16) const volatile> + P16) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17) const volatile> + P16, P17) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18) const volatile> + P16, P17, P18) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18, typename P19 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, P19) const volatile> + P16, P17, P18, P19) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19, typename P20> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18, typename P19, typename P20 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, P19, P20) const volatile> + P16, P17, P18, P19, P20) const volatile > {enum {result = 1};}; template <typename T, typename S> -struct IsMemberFunctionPointerRaw<T (S::*)( - ...) const volatile> +struct IsMemberFunctionPointerRaw < T (S::*)( + ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, - typename P01> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, ...) const volatile> +template < typename T, typename S, + typename P01 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, ...) const volatile> +template < typename T, typename S, + typename P01, typename P02 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03, ...) const volatile> +template < typename T, typename S, + typename P01, typename P02, typename P03 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03, ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03, typename P04> -struct IsMemberFunctionPointerRaw<T (S::*)( - P01, P02, P03, P04, ...) const volatile> +template < typename T, typename S, + typename P01, typename P02, typename P03, typename P04 > +struct IsMemberFunctionPointerRaw < T (S::*)( + P01, P02, P03, P04, ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, - typename P01, typename P02, typename P03, typename P04, typename P05> -struct IsMemberFunctionPointerRaw<T (S::*)( +template < typename T, typename S, + typename P01, typename P02, typename P03, typename P04, typename P05 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - ...) const volatile> + ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, ...) const volatile> + P06, ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, ...) const volatile> + P06, P07, ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08, ...) const volatile> + P06, P07, P08, ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08, typename P09 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, - P06, P07, P08, P09, ...) const volatile> + P06, P07, P08, P09, ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, - typename P06, typename P07, typename P08, typename P09, typename P10> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P06, typename P07, typename P08, typename P09, typename P10 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - ...) const volatile> + ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, ...) const volatile> + P11, ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, ...) const volatile> + P11, P12, ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, ...) const volatile> + P11, P12, P13, ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13, typename P14 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, - P11, P12, P13, P14, ...) const volatile> + P11, P12, P13, P14, ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, - typename P11, typename P12, typename P13, typename P14, typename P15> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P11, typename P12, typename P13, typename P14, typename P15 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - ...) const volatile> + ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, ...) const volatile> + P16, ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, ...) const volatile> + P16, P17, ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, ...) const volatile> + P16, P17, P18, ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18, typename P19 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, - P16, P17, P18, P19, ...) const volatile> + P16, P17, P18, P19, ...) const volatile > {enum {result = 1};}; -template <typename T, typename S, +template < typename T, typename S, typename P01, typename P02, typename P03, typename P04, typename P05, typename P06, typename P07, typename P08, typename P09, typename P10, typename P11, typename P12, typename P13, typename P14, typename P15, - typename P16, typename P17, typename P18, typename P19, typename P20> -struct IsMemberFunctionPointerRaw<T (S::*)( + typename P16, typename P17, typename P18, typename P19, typename P20 > +struct IsMemberFunctionPointerRaw < T (S::*)( P01, P02, P03, P04, P05, P06, P07, P08, P09, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, P20, - ...) const volatile> + ...) const volatile > {enum {result = 1};}; }// namespace Private @@ -2179,37 +2179,37 @@ public: enum { isVolatile = UnVolatile<T>::isVolatile }; enum { isReference = ReferenceTraits<UnqualifiedType>::result }; enum { isFunction = FunctionPointerTraits<typename Private::AddPointer<T>::Result >::result }; - enum { isFunctionPointer= FunctionPointerTraits< - typename ReferenceTraits<UnqualifiedType>::ReferredType >::result + enum { isFunctionPointer = FunctionPointerTraits < + typename ReferenceTraits<UnqualifiedType>::ReferredType >::result }; - enum { isMemberFunctionPointer= PToMFunctionTraits< - typename ReferenceTraits<UnqualifiedType>::ReferredType >::result + enum { isMemberFunctionPointer = PToMFunctionTraits < + typename ReferenceTraits<UnqualifiedType>::ReferredType >::result }; - enum { isMemberPointer = PToMTraits< + enum { isMemberPointer = PToMTraits < typename ReferenceTraits<UnqualifiedType>::ReferredType >::result || isMemberFunctionPointer }; - enum { isPointer = PointerTraits< + enum { isPointer = PointerTraits < typename ReferenceTraits<UnqualifiedType>::ReferredType >::result || isFunctionPointer }; enum { isStdUnsignedInt = TL::IndexOf<Private::StdUnsignedInts, UnqualifiedType>::value >= 0 || - TL::IndexOf<Private::StdUnsignedInts, - typename ReferenceTraits<UnqualifiedType>::ReferredType>::value >= 0 + TL::IndexOf < Private::StdUnsignedInts, + typename ReferenceTraits<UnqualifiedType>::ReferredType >::value >= 0 }; enum { isStdSignedInt = TL::IndexOf<Private::StdSignedInts, UnqualifiedType>::value >= 0 || - TL::IndexOf<Private::StdSignedInts, - typename ReferenceTraits<UnqualifiedType>::ReferredType>::value >= 0 + TL::IndexOf < Private::StdSignedInts, + typename ReferenceTraits<UnqualifiedType>::ReferredType >::value >= 0 }; enum { isStdIntegral = isStdUnsignedInt || isStdSignedInt || TL::IndexOf<Private::StdOtherInts, UnqualifiedType>::value >= 0 || - TL::IndexOf<Private::StdOtherInts, - typename ReferenceTraits<UnqualifiedType>::ReferredType>::value >= 0 + TL::IndexOf < Private::StdOtherInts, + typename ReferenceTraits<UnqualifiedType>::ReferredType >::value >= 0 }; enum { isStdFloat = TL::IndexOf<Private::StdFloats, UnqualifiedType>::value >= 0 || - TL::IndexOf<Private::StdFloats, - typename ReferenceTraits<UnqualifiedType>::ReferredType>::value >= 0 + TL::IndexOf < Private::StdFloats, + typename ReferenceTraits<UnqualifiedType>::ReferredType >::value >= 0 }; enum { isStdArith = isStdIntegral || isStdFloat }; enum { isStdFundamental = isStdArith || isStdFloat || Conversion<T, void>::sameType }; @@ -2221,8 +2221,8 @@ public: enum { isArith = isIntegral || isFloat }; enum { isFundamental = isStdFundamental || isArith }; - typedef typename Select<isStdArith || isPointer || isMemberPointer, T, - typename Private::AddParameterType<T>::Result>::Result + typedef typename Select < isStdArith || isPointer || isMemberPointer, T, + typename Private::AddParameterType<T>::Result >::Result ParameterType; }; } diff --git a/shared/loki/Typelist.h b/shared/loki/Typelist.h index ba18032f..e512ac83 100644 --- a/shared/loki/Typelist.h +++ b/shared/loki/Typelist.h @@ -129,7 +129,7 @@ struct TypeAt<Typelist<Head, Tail>, 0> template <class Head, class Tail, unsigned int i> struct TypeAt<Typelist<Head, Tail>, i> { - typedef typename TypeAt<Tail, i - 1>::Result Result; + typedef typename TypeAt < Tail, i - 1 >::Result Result; }; //////////////////////////////////////////////////////////////////////////////// @@ -144,8 +144,8 @@ struct TypeAt<Typelist<Head, Tail>, i> // returns the type in position 'index' in TList, or D if index is out-of-bounds //////////////////////////////////////////////////////////////////////////////// -template <class TList, unsigned int index, - typename DefaultType = NullType> +template < class TList, unsigned int index, + typename DefaultType = NullType > struct TypeAtNonStrict { typedef DefaultType Result; @@ -161,7 +161,7 @@ template <class Head, class Tail, unsigned int i, typename DefaultType> struct TypeAtNonStrict<Typelist<Head, Tail>, i, DefaultType> { typedef typename - TypeAtNonStrict<Tail, i - 1, DefaultType>::Result Result; + TypeAtNonStrict < Tail, i - 1, DefaultType >::Result Result; }; //////////////////////////////////////////////////////////////////////////////// @@ -212,7 +212,7 @@ template <> struct Append<NullType, NullType> template <class T> struct Append<NullType, T> { - typedef Typelist<T,NullType> Result; + typedef Typelist<T, NullType> Result; }; template <class Head, class Tail> @@ -224,8 +224,8 @@ struct Append<NullType, Typelist<Head, Tail> > template <class Head, class Tail, class T> struct Append<Typelist<Head, Tail>, T> { - typedef Typelist<Head, - typename Append<Tail, T>::Result> + typedef Typelist < Head, + typename Append<Tail, T>::Result > Result; }; @@ -254,8 +254,8 @@ struct Erase<Typelist<T, Tail>, T> template <class Head, class Tail, class T> // Specialization 3 struct Erase<Typelist<Head, Tail>, T> { - typedef Typelist<Head, - typename Erase<Tail, T>::Result> + typedef Typelist < Head, + typename Erase<Tail, T>::Result > Result; }; @@ -283,8 +283,8 @@ template <class Head, class Tail, class T> struct EraseAll<Typelist<Head, Tail>, T> { // Go all the way down the list removing the type - typedef Typelist<Head, - typename EraseAll<Tail, T>::Result> + typedef Typelist < Head, + typename EraseAll<Tail, T>::Result > Result; }; @@ -337,8 +337,8 @@ struct Replace<Typelist<T, Tail>, T, U> template <class Head, class Tail, class T, class U> struct Replace<Typelist<Head, Tail>, T, U> { - typedef Typelist<Head, - typename Replace<Tail, T, U>::Result> + typedef Typelist < Head, + typename Replace<Tail, T, U>::Result > Result; }; @@ -367,8 +367,8 @@ struct ReplaceAll<Typelist<T, Tail>, T, U> template <class Head, class Tail, class T, class U> struct ReplaceAll<Typelist<Head, Tail>, T, U> { - typedef Typelist<Head, - typename ReplaceAll<Tail, T, U>::Result> + typedef Typelist < Head, + typename ReplaceAll<Tail, T, U>::Result > Result; }; @@ -391,8 +391,8 @@ struct Reverse<NullType> template <class Head, class Tail> struct Reverse< Typelist<Head, Tail> > { - typedef typename Append< - typename Reverse<Tail>::Result, Head>::Result Result; + typedef typename Append < + typename Reverse<Tail>::Result, Head >::Result Result; }; //////////////////////////////////////////////////////////////////////////////// @@ -417,9 +417,9 @@ struct MostDerived<Typelist<Head, Tail>, T> private: typedef typename MostDerived<Tail, T>::Result Candidate; public: - typedef typename Select< - SuperSubclass<Candidate,Head>::value, - Head, Candidate>::Result Result; + typedef typename Select < + SuperSubclass<Candidate, Head>::value, + Head, Candidate >::Result Result; }; //////////////////////////////////////////////////////////////////////////////// @@ -444,8 +444,8 @@ struct DerivedToFront< Typelist<Head, Tail> > private: typedef typename MostDerived<Tail, Head>::Result TheMostDerived; - typedef typename Replace<Tail, - TheMostDerived, Head>::Result Temp; + typedef typename Replace < Tail, + TheMostDerived, Head >::Result Temp; typedef typename DerivedToFront<Temp>::Result L; public: typedef Typelist<TheMostDerived, L> Result; diff --git a/shared/loki/TypelistMacros.h b/shared/loki/TypelistMacros.h index 1c3c3e63..4bd34cb7 100644 --- a/shared/loki/TypelistMacros.h +++ b/shared/loki/TypelistMacros.h @@ -61,291 +61,291 @@ #define LOKI_TYPELIST_12(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) \ ::Loki::Typelist<T1, LOKI_TYPELIST_11(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12) > + T11, T12) > #define LOKI_TYPELIST_13(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) \ ::Loki::Typelist<T1, LOKI_TYPELIST_12(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13) > + T11, T12, T13) > #define LOKI_TYPELIST_14(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_13(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14) > + T11, T12, T13, T14) \ +::Loki::Typelist<T1, LOKI_TYPELIST_13(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14) > #define LOKI_TYPELIST_15(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_14(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15) > + T11, T12, T13, T14, T15) \ +::Loki::Typelist<T1, LOKI_TYPELIST_14(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15) > #define LOKI_TYPELIST_16(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_15(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16) > + T11, T12, T13, T14, T15, T16) \ +::Loki::Typelist<T1, LOKI_TYPELIST_15(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16) > #define LOKI_TYPELIST_17(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_16(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17) > + T11, T12, T13, T14, T15, T16, T17) \ +::Loki::Typelist<T1, LOKI_TYPELIST_16(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17) > #define LOKI_TYPELIST_18(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_17(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18) > + T11, T12, T13, T14, T15, T16, T17, T18) \ +::Loki::Typelist<T1, LOKI_TYPELIST_17(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18) > #define LOKI_TYPELIST_19(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_18(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19) > + T11, T12, T13, T14, T15, T16, T17, T18, T19) \ +::Loki::Typelist<T1, LOKI_TYPELIST_18(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19) > #define LOKI_TYPELIST_20(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_19(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) \ +::Loki::Typelist<T1, LOKI_TYPELIST_19(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) > #define LOKI_TYPELIST_21(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_20(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21) \ +::Loki::Typelist<T1, LOKI_TYPELIST_20(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21) > #define LOKI_TYPELIST_22(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_21(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22) \ +::Loki::Typelist<T1, LOKI_TYPELIST_21(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22) > #define LOKI_TYPELIST_23(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_22(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23) \ +::Loki::Typelist<T1, LOKI_TYPELIST_22(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23) > #define LOKI_TYPELIST_24(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_23(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24) \ +::Loki::Typelist<T1, LOKI_TYPELIST_23(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24) > #define LOKI_TYPELIST_25(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_24(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25) \ +::Loki::Typelist<T1, LOKI_TYPELIST_24(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25) > #define LOKI_TYPELIST_26(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_25(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26) \ +::Loki::Typelist<T1, LOKI_TYPELIST_25(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26) > #define LOKI_TYPELIST_27(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_26(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27) \ +::Loki::Typelist<T1, LOKI_TYPELIST_26(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27) > #define LOKI_TYPELIST_28(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_27(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28) \ +::Loki::Typelist<T1, LOKI_TYPELIST_27(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28) > #define LOKI_TYPELIST_29(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_28(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29) \ +::Loki::Typelist<T1, LOKI_TYPELIST_28(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29) > #define LOKI_TYPELIST_30(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_29(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30) \ +::Loki::Typelist<T1, LOKI_TYPELIST_29(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30) > #define LOKI_TYPELIST_31(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_30(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31) \ +::Loki::Typelist<T1, LOKI_TYPELIST_30(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31) > #define LOKI_TYPELIST_32(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_31(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32) \ +::Loki::Typelist<T1, LOKI_TYPELIST_31(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32) > #define LOKI_TYPELIST_33(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_32(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33) \ +::Loki::Typelist<T1, LOKI_TYPELIST_32(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33) > #define LOKI_TYPELIST_34(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_33(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34) \ +::Loki::Typelist<T1, LOKI_TYPELIST_33(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31, T32, T33, T34) > #define LOKI_TYPELIST_35(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_34(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35) \ +::Loki::Typelist<T1, LOKI_TYPELIST_34(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35) > #define LOKI_TYPELIST_36(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_35(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36) \ +::Loki::Typelist<T1, LOKI_TYPELIST_35(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36) > #define LOKI_TYPELIST_37(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_36(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37) \ +::Loki::Typelist<T1, LOKI_TYPELIST_36(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37) > #define LOKI_TYPELIST_38(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_37(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38) \ +::Loki::Typelist<T1, LOKI_TYPELIST_37(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38) > #define LOKI_TYPELIST_39(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_38(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39) \ +::Loki::Typelist<T1, LOKI_TYPELIST_38(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39) > #define LOKI_TYPELIST_40(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_39(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40) \ +::Loki::Typelist<T1, LOKI_TYPELIST_39(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40) > #define LOKI_TYPELIST_41(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_40(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41) \ +::Loki::Typelist<T1, LOKI_TYPELIST_40(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41) > #define LOKI_TYPELIST_42(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_41(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42) \ +::Loki::Typelist<T1, LOKI_TYPELIST_41(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42) > #define LOKI_TYPELIST_43(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_42(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43) \ +::Loki::Typelist<T1, LOKI_TYPELIST_42(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43) > #define LOKI_TYPELIST_44(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_43(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44) \ +::Loki::Typelist<T1, LOKI_TYPELIST_43(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44) > #define LOKI_TYPELIST_45(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ - T41, T42, T43, T44, T45) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_44(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ - T41, T42, T43, T44, T45) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ + T41, T42, T43, T44, T45) \ +::Loki::Typelist<T1, LOKI_TYPELIST_44(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ + T41, T42, T43, T44, T45) > #define LOKI_TYPELIST_46(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ - T41, T42, T43, T44, T45, T46) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_45(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ - T41, T42, T43, T44, T45, T46) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ + T41, T42, T43, T44, T45, T46) \ +::Loki::Typelist<T1, LOKI_TYPELIST_45(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ + T41, T42, T43, T44, T45, T46) > #define LOKI_TYPELIST_47(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ - T41, T42, T43, T44, T45, T46, T47) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_46(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ - T41, T42, T43, T44, T45, T46, T47) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ + T41, T42, T43, T44, T45, T46, T47) \ +::Loki::Typelist<T1, LOKI_TYPELIST_46(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ + T41, T42, T43, T44, T45, T46, T47) > #define LOKI_TYPELIST_48(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ - T41, T42, T43, T44, T45, T46, T47, T48) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_47(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ - T41, T42, T43, T44, T45, T46, T47, T48) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ + T41, T42, T43, T44, T45, T46, T47, T48) \ +::Loki::Typelist<T1, LOKI_TYPELIST_47(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ + T41, T42, T43, T44, T45, T46, T47, T48) > #define LOKI_TYPELIST_49(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ - T41, T42, T43, T44, T45, T46, T47, T48, T49) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_48(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ - T41, T42, T43, T44, T45, T46, T47, T48, T49) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ + T41, T42, T43, T44, T45, T46, T47, T48, T49) \ +::Loki::Typelist<T1, LOKI_TYPELIST_48(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ + T41, T42, T43, T44, T45, T46, T47, T48, T49) > #define LOKI_TYPELIST_50(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ - T41, T42, T43, T44, T45, T46, T47, T48, T49, T50) \ - ::Loki::Typelist<T1, LOKI_TYPELIST_49(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ - T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ - T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ - T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ - T41, T42, T43, T44, T45, T46, T47, T48, T49, T50) > + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ + T41, T42, T43, T44, T45, T46, T47, T48, T49, T50) \ +::Loki::Typelist<T1, LOKI_TYPELIST_49(T2, T3, T4, T5, T6, T7, T8, T9, T10, \ + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, \ + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, \ + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, \ + T41, T42, T43, T44, T45, T46, T47, T48, T49, T50) > #endif //LOKI_DISABLE_TYPELIST_MACROS diff --git a/shared/loki/Visitor.h b/shared/loki/Visitor.h index f6b0ad81..85b8acd2 100644 --- a/shared/loki/Visitor.h +++ b/shared/loki/Visitor.h @@ -249,7 +249,7 @@ typename R = void, > class BaseVisitable; -template<typename R,template <typename, class> class CatchAll> +template<typename R, template <typename, class> class CatchAll> class BaseVisitable<R, CatchAll, false> { public: @@ -262,7 +262,7 @@ protected: // give access only to the hierarchy static ReturnType AcceptImpl(T& visited, BaseVisitor& guest) { // Apply the Acyclic Visitor - if (Visitor<T,R>* p = dynamic_cast<Visitor<T,R>*>(&guest)) + if (Visitor<T, R>* p = dynamic_cast<Visitor<T, R>*>(&guest)) { return p->Visit(visited); } @@ -270,7 +270,7 @@ protected: // give access only to the hierarchy } }; -template<typename R,template <typename, class> class CatchAll> +template<typename R, template <typename, class> class CatchAll> class BaseVisitable<R, CatchAll, true> { public: @@ -283,7 +283,7 @@ protected: // give access only to the hierarchy static ReturnType AcceptImpl(const T& visited, BaseVisitor& guest) { // Apply the Acyclic Visitor - if (Visitor<T,R,true>* p = dynamic_cast<Visitor<T,R,true>*>(&guest)) + if (Visitor<T, R, true>* p = dynamic_cast<Visitor<T, R, true>*>(&guest)) { return p->Visit(visited); } diff --git a/shared/long_path_prefix.h b/shared/long_path_prefix.h index 45fde0fa..ca6961a9 100644 --- a/shared/long_path_prefix.h +++ b/shared/long_path_prefix.h @@ -83,7 +83,7 @@ inline Zstring zen::applyLongPathPrefixCreateDir(const Zstring& path) //throw() { //special rule for ::CreateDirectoryEx(): MAX_PATH - 12(=^ 8.3 filename) is threshold - return applyLongPathPrefixImpl<MAX_PATH - 12>(path); + return applyLongPathPrefixImpl < MAX_PATH - 12 > (path); } diff --git a/shared/parse_lng.h b/shared/parse_lng.h index b943d222..034deb68 100644 --- a/shared/parse_lng.h +++ b/shared/parse_lng.h @@ -309,7 +309,7 @@ private: { std::string tmp; for (std::string::const_iterator i = text.begin(); i != text.end(); ++i) - if(*i == '\r') + if (*i == '\r') { std::string::const_iterator next = i + 1; if (next != text.end() && *next == '\n') @@ -451,7 +451,7 @@ private: } - if (!pluralList.empty()&& static_cast<int>(pluralList.size()) != formCount) //invalid number of plural forms + if (!pluralList.empty() && static_cast<int>(pluralList.size()) != formCount) //invalid number of plural forms throw ParsingError(scn.position().first, scn.position().second); consumeToken(Token::TK_TRG_END); @@ -572,7 +572,7 @@ void generateLng(const TranslationList& in, const TransHeader& header, std::stri fileStream += KnownTokens::text(Token::TK_TRG_BEGIN); fileStream += translation; - fileStream += KnownTokens::text(Token::TK_TRG_END) + LB; + fileStream += KnownTokens::text(Token::TK_TRG_END) + LB + LB; } else if (plural) @@ -590,7 +590,7 @@ void generateLng(const TranslationList& in, const TransHeader& header, std::stri fileStream += KnownTokens::text(Token::TK_PLURAL_END) + LB; fileStream += KnownTokens::text(Token::TK_PLURAL_BEGIN); fileStream += engPlural; - fileStream += KnownTokens::text(Token::TK_PLURAL_END)+ LB; + fileStream += KnownTokens::text(Token::TK_PLURAL_END) + LB; fileStream += KnownTokens::text(Token::TK_SRC_END) + LB; fileStream += KnownTokens::text(Token::TK_TRG_BEGIN); @@ -605,7 +605,7 @@ void generateLng(const TranslationList& in, const TransHeader& header, std::stri fileStream += plForm; fileStream += KnownTokens::text(Token::TK_PLURAL_END) + LB; } - fileStream += KnownTokens::text(Token::TK_TRG_END) + LB; + fileStream += KnownTokens::text(Token::TK_TRG_END) + LB + LB; } else { diff --git a/shared/parse_plural.h b/shared/parse_plural.h index 1139ffb6..1d2bcd95 100644 --- a/shared/parse_plural.h +++ b/shared/parse_plural.h @@ -240,7 +240,7 @@ private: const Expression& e = parse(); expr = &dynamic_cast<const Expr<int>&>(e); } - catch(std::bad_cast&) { throw ParsingError(); } + catch (std::bad_cast&) { throw ParsingError(); } consumeToken(Token::TK_END); } @@ -327,7 +327,7 @@ private: Token::Type t = token().type; if (t == Token::TK_LESS || //associativity: n/a - t == Token::TK_LESS_EQUAL|| + t == Token::TK_LESS_EQUAL || t == Token::TK_GREATER || t == Token::TK_GREATER_EQUAL) { diff --git a/shared/parse_txt.h b/shared/parse_txt.h index ca155dec..479f950e 100644 --- a/shared/parse_txt.h +++ b/shared/parse_txt.h @@ -16,8 +16,8 @@ namespace zen class ExtractLines { public: - ExtractLines(const Zstring& filename, const std::string& lineBreak = std::string()); //throw (FileError) - bool getLine(std::string& output); //throw (FileError) + ExtractLines(const Zstring& filename, const std::string& lineBreak = std::string()); //throw FileError + bool getLine(std::string& output); //throw FileError private: zen::FileInput inputStream; diff --git a/shared/privilege.cpp b/shared/privilege.cpp index eaeac866..6c7d951b 100644 --- a/shared/privilege.cpp +++ b/shared/privilege.cpp @@ -13,17 +13,14 @@ Privileges& Privileges::getInstance() } -bool Privileges::privilegeIsActive(LPCTSTR privilege) //throw (FileError) +bool Privileges::privilegeIsActive(LPCTSTR privilege) //throw FileError { HANDLE hToken = NULL; if (!::OpenProcessToken(::GetCurrentProcess(), //__in HANDLE ProcessHandle, TOKEN_QUERY, //__in DWORD DesiredAccess, &hToken)) //__out PHANDLE TokenHandle throw FileError(_("Error setting privilege:") + " \"" + privilege + "\"" + "\n\n" + getLastErrorFormatted()); - - Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hToken); - (void)dummy; //silence warning "unused variable" - + LOKI_ON_BLOCK_EXIT2(::CloseHandle(hToken)); LUID luid = {}; if (!::LookupPrivilegeValue( @@ -49,16 +46,14 @@ bool Privileges::privilegeIsActive(LPCTSTR privilege) //throw (FileError) } -void Privileges::setPrivilege(LPCTSTR privilege, bool enable) //throw (FileError) +void Privileges::setPrivilege(LPCTSTR privilege, bool enable) //throw FileError { HANDLE hToken = NULL; if (!::OpenProcessToken(::GetCurrentProcess(), //__in HANDLE ProcessHandle, TOKEN_ADJUST_PRIVILEGES, //__in DWORD DesiredAccess, &hToken)) //__out PHANDLE TokenHandle throw FileError(_("Error setting privilege:") + " \"" + privilege + "\"" + "\n\n" + getLastErrorFormatted()); - - Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hToken); - (void)dummy; //silence warning "unused variable" + LOKI_ON_BLOCK_EXIT2(::CloseHandle(hToken)); LUID luid = {}; if (!::LookupPrivilegeValue( diff --git a/shared/privilege.h b/shared/privilege.h index 6ac99e6f..09fe0d08 100644 --- a/shared/privilege.h +++ b/shared/privilege.h @@ -15,7 +15,7 @@ class Privileges public: static Privileges& getInstance(); - void ensureActive(LPCTSTR privilege) //throw (FileError) + void ensureActive(LPCTSTR privilege) //throw FileError { if (activePrivileges.find(privilege) != activePrivileges.end()) return; //privilege already active @@ -42,7 +42,7 @@ private: if (i->second) Privileges::setPrivilege(i->first.c_str(), false); } - catch(...) {} + catch (...) {} } static bool privilegeIsActive(LPCTSTR privilege); //throw FileError diff --git a/shared/recycler.cpp b/shared/recycler.cpp index 92b7b222..8c4a9da1 100644 --- a/shared/recycler.cpp +++ b/shared/recycler.cpp @@ -14,7 +14,6 @@ #include <boost/thread/once.hpp> #include "dll_loader.h" #include <wx/msw/wrapwin.h> //includes "windows.h" -#include "build_info.h" #include "assert_static.h" #include <algorithm> #include <functional> @@ -33,17 +32,6 @@ using namespace zen; namespace { #ifdef FFS_WIN -inline -std::wstring getRecyclerDllName() -{ - assert_static(util::is32BitBuild || util::is64BitBuild); - - return util::is64BitBuild ? - L"FileOperation_x64.dll": - L"FileOperation_Win32.dll"; -} - - bool vistaOrLater() { OSVERSIONINFO osvi = {}; @@ -71,7 +59,7 @@ IFileOperation - multiple files 2,1s Nevertheless, let's use IFileOperation for better error reporting! */ -void moveToWindowsRecycler(const std::vector<Zstring>& filesToDelete) //throw (FileError) +void moveToWindowsRecycler(const std::vector<Zstring>& filesToDelete) //throw FileError { if (filesToDelete.empty()) return; @@ -87,12 +75,12 @@ void moveToWindowsRecycler(const std::vector<Zstring>& filesToDelete) //throw ( std::back_inserter(fileNames), std::mem_fun_ref(&Zstring::c_str)); using namespace fileop; - MoveToRecycleBinFct moveToRecycler = util::getDllFun<MoveToRecycleBinFct>(getRecyclerDllName(), moveToRecycleBinFctName); - GetLastErrorFct getLastError = util::getDllFun<GetLastErrorFct> (getRecyclerDllName(), getLastErrorFctName); + const util::DllFun<MoveToRecycleBinFct> moveToRecycler(getDllName(), moveToRecycleBinFctName); + const util::DllFun<GetLastErrorFct> getLastError (getDllName(), getLastErrorFctName); - if (moveToRecycler == NULL || getLastError == NULL) + if (!moveToRecycler || !getLastError) throw FileError(_("Error moving to Recycle Bin:") + "\n\"" + fileNames[0] + "\"" + //report first file only... better than nothing - "\n\n" + _("Could not load a required DLL:") + " \"" + getRecyclerDllName() + "\""); + "\n\n" + _("Could not load a required DLL:") + " \"" + getDllName() + "\""); //#warning moving long file paths to recycler does not work! clarify! // std::vector<Zstring> temp; @@ -140,7 +128,7 @@ void moveToWindowsRecycler(const std::vector<Zstring>& filesToDelete) //throw ( } -bool zen::moveToRecycleBin(const Zstring& filename) //throw (FileError) +bool zen::moveToRecycleBin(const Zstring& filename) //throw FileError { if (!somethingExists(filename)) return false; //neither file nor any other object with that name existing: no error situation, manual deletion relies on it! @@ -151,7 +139,7 @@ bool zen::moveToRecycleBin(const Zstring& filename) //throw (FileError) std::vector<Zstring> fileNames; fileNames.push_back(filename); - ::moveToWindowsRecycler(fileNames); //throw (FileError) + ::moveToWindowsRecycler(fileNames); //throw FileError #elif defined FFS_LINUX Glib::RefPtr<Gio::File> fileObj = Gio::File::create_for_path(filename.c_str()); //never fails diff --git a/shared/resolve_path.cpp b/shared/resolve_path.cpp index 2a9cb7e6..f22b4505 100644 --- a/shared/resolve_path.cpp +++ b/shared/resolve_path.cpp @@ -3,9 +3,11 @@ #include <wx/datetime.h> #include "string_conv.h" #include "loki/ScopeGuard.h" +#include <map> #ifdef FFS_WIN #include "dll_loader.h" +#include <Shlobj.h> #include <wx/msw/wrapwin.h> //includes "windows.h" #include "long_path_prefix.h" #ifdef _MSC_VER @@ -26,6 +28,17 @@ namespace #ifdef FFS_WIN Zstring resolveBrokenNetworkMap(const Zstring& dirname) //circumvent issue with disconnected network maps that could be activated by a simple explorer double click { + /* + ATTENTION: it is not safe to call ::WNetGetConnection() for every network share: + + network type |::WNetGetConnection rv | lpRemoteName | existing UNC path + -----------------------------|-------------------------|---------------------------------|---------------- + inactive local network share | ERROR_CONNECTION_UNAVAIL| \\192.168.1.27\new2 | YES + WebDrive | NO_ERROR | \\Webdrive-ZenJu\GNU | NO + Box.net (WebDav) | NO_ERROR | \\www.box.net\DavWWWRoot\dav | YES + NetDrive | ERROR_NOT_CONNECTED | <empty> | NO + */ + if (dirname.size() >= 2 && iswalpha(dirname[0]) && dirname[1] == L':') { Zstring driveLetter(dirname.c_str(), 2); //e.g.: "Q:" @@ -37,13 +50,12 @@ Zstring resolveBrokenNetworkMap(const Zstring& dirname) //circumvent issue with DWORD rv = ::WNetGetConnection(driveLetter.c_str(), //__in LPCTSTR lpLocalName in the form "<driveletter>:" &remoteNameBuffer[0], //__out LPTSTR lpRemoteName, &bufferSize); //__inout LPDWORD lpnLength - if (rv == NO_ERROR || - rv == ERROR_CONNECTION_UNAVAIL) //remoteNameBuffer will be filled nevertheless! - { - Zstring networkShare = &remoteNameBuffer[0]; - if (!networkShare.empty()) - return networkShare + (dirname.c_str() + 2); //replace "Q:\subdir" by "\\server\share\subdir" - } + if (rv == ERROR_CONNECTION_UNAVAIL) //remoteNameBuffer will be filled nevertheless! + { + Zstring networkShare = &remoteNameBuffer[0]; + if (!networkShare.empty()) + return networkShare + (dirname.c_str() + 2); //replace "Q:\subdir" by "\\server\share\subdir" + } } } return dirname; @@ -80,6 +92,96 @@ Zstring resolveRelativePath(const Zstring& relativeName) //additional: resolves #endif +#ifdef FFS_WIN +class CsidlConstants +{ +public: + typedef std::map<Zstring, Zstring, LessFilename> CsidlToDirMap; //case-insensitive comparison + + static const CsidlToDirMap& get() + { + static CsidlConstants inst; + return inst.csidlToDir; + } + +private: + CsidlConstants() + { + auto addCsidl = [&](int csidl, const Zstring& paramName) + { + wchar_t buffer[MAX_PATH]; + if (SUCCEEDED(::SHGetFolderPath(NULL, //__in HWND hwndOwner, + csidl | CSIDL_FLAG_DONT_VERIFY, //__in int nFolder, + NULL, //__in HANDLE hToken, + 0 /* == SHGFP_TYPE_CURRENT*/, //__in DWORD dwFlags, + buffer))) //__out LPTSTR pszPath + { + Zstring dirname = buffer; + if (!dirname.empty()) + csidlToDir.insert(std::make_pair(paramName, dirname)); + } + }; + + addCsidl(CSIDL_DESKTOPDIRECTORY, L"csidl_Desktop"); // C:\Users\username\Desktop + addCsidl(CSIDL_COMMON_DESKTOPDIRECTORY, L"csidl_PublicDesktop"); // C:\Users\All Users\Desktop + + addCsidl(CSIDL_MYMUSIC, L"csidl_MyMusic"); // C:\Users\username\My Documents\My Music + addCsidl(CSIDL_COMMON_MUSIC, L"csidl_PublicMusic"); // C:\Users\All Users\Documents\My Music + + addCsidl(CSIDL_MYPICTURES, L"csidl_MyPictures"); // C:\Users\username\My Documents\My Pictures + addCsidl(CSIDL_COMMON_PICTURES, L"csidl_PublicPictures"); // C:\Users\All Users\Documents\My Pictures + + addCsidl(CSIDL_MYVIDEO, L"csidl_MyVideo"); // C:\Users\username\My Documents\My Videos + addCsidl(CSIDL_COMMON_VIDEO, L"csidl_PublicVideo"); // C:\Users\All Users\Documents\My Videos + + addCsidl(CSIDL_PERSONAL, L"csidl_MyDocuments"); // C:\Users\username\My Documents + addCsidl(CSIDL_COMMON_DOCUMENTS, L"csidl_PublicDocuments"); // C:\Users\All Users\Documents + + addCsidl(CSIDL_STARTMENU, L"csidl_StartMenu"); // C:\Users\username\Start Menu + addCsidl(CSIDL_COMMON_STARTMENU, L"csidl_PublicStartMenu"); // C:\Users\All Users\Start Menu + + addCsidl(CSIDL_FAVORITES, L"csidl_Favorites"); // C:\Users\username\Favorites + addCsidl(CSIDL_COMMON_FAVORITES, L"csidl_PublicFavorites"); // C:\Users\All Users\Favoriten + + addCsidl(CSIDL_TEMPLATES, L"csidl_Templates"); // C:\Users\username\Templates + addCsidl(CSIDL_COMMON_TEMPLATES, L"csidl_PublicTemplates"); // C:\Users\All Users\Templates + + addCsidl(CSIDL_RESOURCES, L"csidl_Resources"); // C:\Windows\Resources + + //CSIDL_APPDATA covered by %AppData% + //CSIDL_LOCAL_APPDATA covered by %LocalAppData% + //CSIDL_COMMON_APPDATA covered by %ProgramData% + + //CSIDL_PROFILE covered by %UserProfile% + } + + CsidlConstants(const CsidlConstants&); + CsidlConstants& operator=(const CsidlConstants&); + + CsidlToDirMap csidlToDir; +}; +#endif + + +wxString getEnvValue(const wxString& envName) //return empty on error +{ + //try to apply environment variables + wxString envValue; + if (wxGetEnv(envName, &envValue)) + { + //some postprocessing: + trim(envValue); //remove leading, trailing blanks + + //remove leading, trailing double-quotes + if (startsWith(envValue, L"\"") && + endsWith(envValue, L"\"") && + envValue.length() >= 2) + envValue = wxString(envValue.c_str() + 1, envValue.length() - 2); + } + return envValue; +} + + bool replaceMacro(wxString& macro) //macro without %-characters, return true if replaced successfully { if (macro.IsEmpty()) @@ -117,22 +219,27 @@ bool replaceMacro(wxString& macro) //macro without %-characters, return true if if (processPhrase(L"sec" , L"%S")) return true; //try to apply environment variables - wxString envValue; - if (wxGetEnv(macro, &envValue)) { - macro = envValue; - - //some postprocessing: - macro.Trim(true); //remove leading, trailing blanks - macro.Trim(false); // + wxString envValue = getEnvValue(macro); + if (!envValue.empty()) + { + macro = envValue; + return true; + } + } - //remove leading, trailing double-quotes - if (macro.StartsWith(wxT("\"")) && - macro.EndsWith(wxT("\"")) && - macro.length() >= 2) - macro = wxString(macro.c_str() + 1, macro.length() - 2); - return true; +#ifdef FFS_WIN + //try to resolve CSIDL values + { + auto csidlMap = CsidlConstants::get(); + auto iter = csidlMap.find(toZ(macro)); + if (iter != csidlMap.end()) + { + macro = toWx(iter->second); + return true; + } } +#endif return false; } @@ -190,7 +297,7 @@ private: #endif -Zstring getVolumePath(const Zstring& volumeName) //empty string on error +Zstring volumenNameToPath(const Zstring& volumeName) //return empty string on error { #ifdef FFS_WIN std::vector<wchar_t> volGuid(10000); @@ -198,8 +305,7 @@ Zstring getVolumePath(const Zstring& volumeName) //empty string on error HANDLE hVol = ::FindFirstVolume(&volGuid[0], static_cast<DWORD>(volGuid.size())); if (hVol != INVALID_HANDLE_VALUE) { - Loki::ScopeGuard dummy = Loki::MakeGuard(::FindVolumeClose, hVol); - (void)dummy; + LOKI_ON_BLOCK_EXIT2(::FindVolumeClose(hVol)); do { @@ -222,10 +328,8 @@ Zstring getVolumePath(const Zstring& volumeName) //empty string on error DWORD cchBufferLength, PDWORD lpcchReturnLength); - static const GetVolumePathNamesForVolumeNameWFunc getVolumePathNamesForVolumeName = - util::getDllFun<GetVolumePathNamesForVolumeNameWFunc>(L"kernel32.dll", "GetVolumePathNamesForVolumeNameW"); - - if (getVolumePathNamesForVolumeName != NULL) + const util::DllFun<GetVolumePathNamesForVolumeNameWFunc> getVolumePathNamesForVolumeName(L"kernel32.dll", "GetVolumePathNamesForVolumeNameW"); + if (getVolumePathNamesForVolumeName) { std::vector<wchar_t> volPath(10000); @@ -261,6 +365,28 @@ Zstring getVolumePath(const Zstring& volumeName) //empty string on error } +#ifdef FFS_WIN +Zstring volumePathToName(const Zstring& volumePath) //return empty string on error +{ + const DWORD bufferSize = MAX_PATH + 1; + std::vector<wchar_t> volName(bufferSize); + + if (::GetVolumeInformation(volumePath.c_str(), //__in_opt LPCTSTR lpRootPathName, + &volName[0], //__out LPTSTR lpVolumeNameBuffer, + bufferSize, //__in DWORD nVolumeNameSize, + NULL, //__out_opt LPDWORD lpVolumeSerialNumber, + NULL, //__out_opt LPDWORD lpMaximumComponentLength, + NULL, //__out_opt LPDWORD lpFileSystemFlags, + NULL, //__out LPTSTR lpFileSystemNameBuffer, + 0)) //__in DWORD nFileSystemNameSize + { + return &volName[0]; + } + return Zstring(); +} +#endif + + void expandVolumeName(Zstring& text) // [volname]:\folder [volname]\folder [volname]folder -> C:\folder { Zstring before; @@ -287,7 +413,7 @@ void expandVolumeName(Zstring& text) // [volname]:\folder [volname]\folde if (volname.empty()) return; - Zstring volPath = getVolumePath(volname); //return empty string on error + Zstring volPath = volumenNameToPath(volname); //return empty string on error if (volPath.empty()) return; @@ -299,6 +425,86 @@ void expandVolumeName(Zstring& text) // [volname]:\folder [volname]\folde } +#ifdef FFS_WIN +std::vector<Zstring> zen::getDirectoryAliases(Zstring dirname) +{ + trim(dirname, true, false); + + std::vector<Zstring> output; + + if (dirname.empty()) + return output; + + //1. replace volume path by volume name: c:\dirname -> [SYSTEM]\dirname + if (dirname.size() >= 3 && + std::iswalpha(dirname[0]) && + dirname[1] == L':' && + dirname[2] == L'\\') + { + Zstring volname = volumePathToName(Zstring(dirname.c_str(), 3)); + if (!volname.empty()) + output.push_back(L"[" + volname + L"]" + Zstring(dirname.c_str() + 2)); + } + + //2. replace volume name by volume path: [SYSTEM]\dirname -> c:\dirname + { + Zstring testVolname = dirname; + expandVolumeName(testVolname); + if (testVolname != dirname) + output.push_back(testVolname); + } + + //3. environment variables: C:\Users\username -> %USERPROFILE% + { + std::map<Zstring, Zstring> envToDir; + + //get list of useful variables + auto addEnvVar = [&](const wxString& envName) + { + wxString envVal = getEnvValue(envName); //return empty on error + if (!envVal.empty()) + envToDir.insert(std::make_pair(toZ(envName), toZ(envVal))); + }; + addEnvVar(L"AllUsersProfile"); // C:\ProgramData + addEnvVar(L"AppData"); // C:\Users\username\AppData\Roaming + addEnvVar(L"LocalAppData"); // C:\Users\username\AppData\Local + addEnvVar(L"ProgramData"); // C:\ProgramData + addEnvVar(L"ProgramFiles"); // C:\Program Files + addEnvVar(L"ProgramFiles(x86)");// C:\Program Files (x86) + addEnvVar(L"Public"); // C:\Users\Public + addEnvVar(L"UserProfile"); // C:\Users\username + addEnvVar(L"WinDir"); // C:\Windows + addEnvVar(L"Temp"); // C:\Windows\Temp + + //add CSIDL values: http://msdn.microsoft.com/en-us/library/bb762494(v=vs.85).aspx + auto csidlMap = CsidlConstants::get(); + envToDir.insert(csidlMap.begin(), csidlMap.end()); + + Zstring tmp = dirname; + ::makeUpper(tmp); + std::for_each(envToDir.begin(), envToDir.end(), + [&](const std::pair<Zstring, Zstring>& entry) + { + Zstring tmp2 = entry.second; //case-insensitive "startsWith()" + ::makeUpper(tmp2); // + if (startsWith(tmp, tmp2)) + output.push_back(L"%" + entry.first + L"%" + (dirname.c_str() + tmp2.size())); + }); + } + + //5. replace (all) macros: //%USERPROFILE% -> C:\Users\username + { + wxString testMacros = toWx(dirname); + expandMacros(testMacros); + if (toZ(testMacros) != dirname) + output.push_back(toZ(testMacros)); + } + + return output; +} +#endif + + Zstring zen::getFormattedDirectoryName(const Zstring& dirname) { //Formatting is needed since functions expect the directory to end with '\' to be able to split the relative names. diff --git a/shared/resolve_path.h b/shared/resolve_path.h index f6ae58cb..3be1d78e 100644 --- a/shared/resolve_path.h +++ b/shared/resolve_path.h @@ -13,6 +13,11 @@ namespace zen { Zstring getFormattedDirectoryName(const Zstring& dirname); + + +#ifdef FFS_WIN +std::vector<Zstring> getDirectoryAliases(Zstring dirname); +#endif } diff --git a/shared/serialize.cpp b/shared/serialize.cpp index 26102820..06d409df 100644 --- a/shared/serialize.cpp +++ b/shared/serialize.cpp @@ -10,7 +10,7 @@ using namespace zen; -void ReadInputStream::throwReadError() const //throw (FileError) +void ReadInputStream::throwReadError() const //throw FileError { throw zen::FileError(_("Error reading from synchronization database:") + " \n" + "\"" + errorObjName_.c_str() + "\""); } @@ -32,7 +32,7 @@ ReadInputStream::CharArray ReadInputStream::readArrayC() const //-------------------------------------------------------------------------------------------------------- -void WriteOutputStream::throwWriteError() const //throw (FileError) +void WriteOutputStream::throwWriteError() const //throw FileError { throw zen::FileError(_("Error writing to synchronization database:") + " \n" + "\"" + errorObjName_.c_str() + "\""); } diff --git a/shared/serialize.h b/shared/serialize.h index c8a94ad1..6930bcb9 100644 --- a/shared/serialize.h +++ b/shared/serialize.h @@ -30,13 +30,13 @@ template <class S> void writeString(wxOutputStream& stream, const S& str); class FileInputStream : public wxInputStream { public: - FileInputStream(const Zstring& filename) : //throw (FileError) + FileInputStream(const Zstring& filename) : //throw FileError fileObj(filename) {} private: virtual size_t OnSysRead(void* buffer, size_t bufsize) { - return fileObj.read(buffer, bufsize); //throw (FileError) + return fileObj.read(buffer, bufsize); //throw FileError } zen::FileInput fileObj; @@ -46,13 +46,13 @@ private: class FileOutputStream : public wxOutputStream { public: - FileOutputStream(const Zstring& filename) : //throw (FileError) + FileOutputStream(const Zstring& filename) : //throw FileError fileObj(filename, zen::FileOutput::ACC_OVERWRITE) {} private: virtual size_t OnSysWrite(const void* buffer, size_t bufsize) { - fileObj.write(buffer, bufsize); //throw (FileError) + fileObj.write(buffer, bufsize); //throw FileError return bufsize; } @@ -61,19 +61,19 @@ private: -class ReadInputStream //throw (FileError) +class ReadInputStream //throw FileError { protected: ReadInputStream(wxInputStream& stream, const wxString& errorObjName) : stream_(stream), errorObjName_(errorObjName) {} template <class T> - T readNumberC() const; //throw (FileError), checked read operation + T readNumberC() const; //throw FileError, checked read operation template <class S> - S readStringC() const; //throw (FileError), checked read operation + S readStringC() const; //throw FileError, checked read operation typedef std::shared_ptr<std::vector<char> > CharArray; //there's no guarantee std::string has a ref-counted implementation... so use this "thing" - CharArray readArrayC() const; //throw (FileError) + CharArray readArrayC() const; //throw FileError void check() const; @@ -84,23 +84,23 @@ protected: private: wxInputStream& stream_; - void throwReadError() const; //throw (FileError) + void throwReadError() const; //throw FileError const wxString& errorObjName_; //used for error text only }; -class WriteOutputStream //throw (FileError) +class WriteOutputStream //throw FileError { protected: WriteOutputStream(const wxString& errorObjName, wxOutputStream& stream) : stream_(stream), errorObjName_(errorObjName) {} template <class T> - void writeNumberC(T number) const; //throw (FileError), checked write operation + void writeNumberC(T number) const; //throw FileError, checked write operation template <class S> - void writeStringC(const S& str) const; //throw (FileError), checked write operation + void writeStringC(const S& str) const; //throw FileError, checked write operation - void writeArrayC(const std::vector<char>& buffer) const; //throw (FileError) + void writeArrayC(const std::vector<char>& buffer) const; //throw FileError void check() const; @@ -111,7 +111,7 @@ protected: private: wxOutputStream& stream_; - void throwWriteError() const; //throw (FileError) + void throwWriteError() const; //throw FileError const wxString& errorObjName_; //used for error text only! }; @@ -168,7 +168,7 @@ S readString(wxInputStream& stream) { typedef typename S::value_type CharType; - const boost::uint32_t strLength = readPOD<boost::uint32_t>(stream); + const auto strLength = readPOD<boost::uint32_t>(stream); if (strLength <= 1000) { CharType buffer[1000]; @@ -177,7 +177,7 @@ S readString(wxInputStream& stream) } else { - std::vector<CharType> buffer(strLength); //throw (std::bad_alloc) + std::vector<CharType> buffer(strLength); //throw std::bad_alloc stream.Read(&buffer[0], sizeof(CharType) * strLength); return S(&buffer[0], strLength); } diff --git a/shared/shadow.cpp b/shared/shadow.cpp index f000a69b..7f25076e 100644 --- a/shared/shadow.cpp +++ b/shared/shadow.cpp @@ -20,31 +20,12 @@ using namespace shadow; namespace { -bool newerThanXP() -{ - OSVERSIONINFO osvi = {}; - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - - if (::GetVersionEx(&osvi)) - return osvi.dwMajorVersion > 5 || - (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion > 1) ; - //XP has majorVersion == 5, minorVersion == 1 - //Server 2003 has majorVersion == 5, minorVersion == 2 - //version overview: http://msdn.microsoft.com/en-us/library/ms724834(VS.85).aspx - return false; -} - - bool runningWOW64() //test if process is running under WOW64 (reference http://msdn.microsoft.com/en-us/library/ms684139(VS.85).aspx) { //dynamically load windows API function - typedef BOOL (WINAPI *IsWow64ProcessFun)( - HANDLE hProcess, - PBOOL Wow64Process); - - const IsWow64ProcessFun isWow64Process = - util::getDllFun<IsWow64ProcessFun>(L"kernel32.dll", "IsWow64Process"); + typedef BOOL (WINAPI *IsWow64ProcessFun)(HANDLE hProcess, PBOOL Wow64Process); + const util::DllFun<IsWow64ProcessFun> isWow64Process(L"kernel32.dll", "IsWow64Process"); if (isWow64Process) { BOOL isWow64 = FALSE; @@ -54,27 +35,6 @@ bool runningWOW64() //test if process is running under WOW64 (reference http://m return false; } - - -inline -std::wstring getShadowDllName() -{ - /* - distinguish a bunch of VSS builds: we use XP and Server 2003 implementations... - VSS version and compatibility overview: http://msdn.microsoft.com/en-us/library/aa384627(VS.85).aspx - */ - - assert_static(util::is32BitBuild || util::is64BitBuild); - - return newerThanXP() ? - (util::is64BitBuild ? - L"Shadow_Server2003_x64.dll" : - L"Shadow_Server2003_Win32.dll") : - - (util::is64BitBuild ? - L"Shadow_XP_x64.dll" : - L"Shadow_XP_Win32.dll"); -} } //############################################################################################################# @@ -84,21 +44,19 @@ class ShadowCopy::ShadowVolume { public: ShadowVolume(const Zstring& volumeNameFormatted) : //throw(FileError) + createShadowCopy(getDllName(), createShadowCopyFctName), + releaseShadowCopy(getDllName(), releaseShadowCopyFctName), backupHandle(0) { - createShadowCopy = util::getDllFun<CreateShadowCopyFct>(getShadowDllName(), createShadowCopyFctName); - releaseShadowCopy = util::getDllFun<ReleaseShadowCopyFct>(getShadowDllName(), releaseShadowCopyFctName); - //check if shadow copy dll was loaded correctly - if (createShadowCopy == NULL || - releaseShadowCopy == NULL) - throw FileError(_("Error starting Volume Shadow Copy Service!") + "\n" + - _("Could not load a required DLL:") + " \"" + getShadowDllName() + "\""); + if (!createShadowCopy || !releaseShadowCopy) + throw FileError(_("Error accessing Volume Shadow Copy Service!") + "\n" + + _("Could not load a required DLL:") + " \"" + getDllName() + "\""); //VSS does not support running under WOW64 except for Windows XP and Windows Server 2003 //(Reference: http://msdn.microsoft.com/en-us/library/aa384627(VS.85).aspx) if (runningWOW64()) - throw FileError(_("Error starting Volume Shadow Copy Service!") + "\n" + + throw FileError(_("Error accessing Volume Shadow Copy Service!") + "\n" + _("Making shadow copies on WOW64 is not supported. Please use FreeFileSync 64-bit version.")); //--------------------------------------------------------------------------------------------------------- @@ -106,14 +64,13 @@ public: wchar_t shadowVolName[1000]; wchar_t errorMessage[1000]; - if (!createShadowCopy( - volumeNameFormatted.c_str(), - shadowVolName, - 1000, - &backupHandle, - errorMessage, - 1000)) - throw FileError(_("Error starting Volume Shadow Copy Service!") + "\n" + + if (!createShadowCopy(volumeNameFormatted.c_str(), + shadowVolName, + 1000, + &backupHandle, + errorMessage, + 1000)) + throw FileError(_("Error accessing Volume Shadow Copy Service!") + "\n" + "(" + errorMessage + " Volume: \"" + volumeNameFormatted + "\")"); shadowVol = Zstring(shadowVolName) + FILE_NAME_SEPARATOR; //shadowVolName NEVER has a trailing backslash @@ -133,8 +90,8 @@ private: ShadowVolume(const ShadowVolume&); ShadowVolume& operator=(const ShadowVolume&); - shadow::CreateShadowCopyFct createShadowCopy; - shadow::ReleaseShadowCopyFct releaseShadowCopy; + const util::DllFun<CreateShadowCopyFct> createShadowCopy; + const util::DllFun<ReleaseShadowCopyFct> releaseShadowCopy; Zstring shadowVol; diff --git a/shared/shell_execute.h b/shared/shell_execute.h index 64797eff..a127ee06 100644 --- a/shared/shell_execute.h +++ b/shared/shell_execute.h @@ -69,7 +69,7 @@ void shellExecute(const wxString& command, ExecutionType type = EXEC_TYPE_ASYNC) if (!::ShellExecuteEx(&execInfo)) //__inout LPSHELLEXECUTEINFO lpExecInfo { - wxString errorMsg = _("Invalid commandline: %x"); + wxString errorMsg = _("Invalid command line: %x"); wxString cmdFmt = wxString(L"\nFile: ") + filename + L"\nArg: " + arguments; errorMsg.Replace(L"%x", cmdFmt); @@ -92,7 +92,7 @@ void shellExecute(const wxString& command, ExecutionType type = EXEC_TYPE_ASYNC) int rv = ::system(utf8CvrtTo<std::string>(command).c_str()); //do NOT use std::system as its documentation says nothing about "WEXITSTATUS(rv)", ect... if (rv == -1 || WEXITSTATUS(rv) == 127) //http://linux.die.net/man/3/system "In case /bin/sh could not be executed, the exit status will be that of a command that does exit(127)" { - wxString errorMsg = _("Invalid commandline: %x"); + wxString errorMsg = _("Invalid command line: %x"); replace(errorMsg, L"%x", L"\n" + command); wxMessageBox(errorMsg); return; @@ -100,7 +100,7 @@ void shellExecute(const wxString& command, ExecutionType type = EXEC_TYPE_ASYNC) } else { - // ! unfortunately it seems there is no way on Linux to get a failure notification for calling an invalid commandline asynchronously ! + // ! unfortunately it seems there is no way on Linux to get a failure notification for calling an invalid command line asynchronously ! //by default wxExecute uses a zero sized dummy window as a hack to keep focus which leaves a useless empty icon in ALT-TAB list //=> use wxEXEC_NODISABLE and roll our own window disabler! (see comment in app.cpp: void *wxGUIAppTraits::BeforeChildWaitLoop()) diff --git a/shared/stl_tools.h b/shared/stl_tools.h new file mode 100644 index 00000000..6cfe35f8 --- /dev/null +++ b/shared/stl_tools.h @@ -0,0 +1,49 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** + +#ifndef STL_TOOLS_HEADER_84567184321434 +#define STL_TOOLS_HEADER_84567184321434 + +//no need to drag in any STL includes :) + +namespace zen +{ +template <class V, class Predicate> inline +void vector_remove_if(V& vec, Predicate p) +{ + vec.erase(std::remove_if(vec.begin(), vec.end(), p), vec.end()); +} + + +template <class S, class Predicate> inline +void set_remove_if(S& set, Predicate p) +{ + for (auto iter = set.begin(); iter != set.end();) + if (p(*iter)) + set.erase(iter++); + else + ++iter; +} + + +template <class M, class Predicate> inline +void map_remove_if(M& map, Predicate p) { set_remove_if(map, p); } + + +// binary search returning an iterator +template <class ForwardIterator, class T, typename Compare> inline +ForwardIterator custom_binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp) +{ + first = std::lower_bound(first, last, value, comp); + if (first != last && !comp(value, *first)) + return first; + else + return last; +} +} + + +#endif //STL_TOOLS_HEADER_84567184321434
\ No newline at end of file diff --git a/shared/string_tools.h b/shared/string_tools.h index d2e2c597..8951d942 100644 --- a/shared/string_tools.h +++ b/shared/string_tools.h @@ -311,8 +311,7 @@ bool endsWith(const S& str, const T& postfix) } -// get all characters after the last occurence of ch -// (returns the whole string if ch not found) +//returns the whole string if ch not found template <class S, class T> inline S afterLast(const S& str, const T& ch) { @@ -329,8 +328,7 @@ S afterLast(const S& str, const T& ch) } -// get all characters before the last occurence of ch -// (returns empty string if ch not found) +//returns empty string if ch not found template <class S, class T> inline S beforeLast(const S& str, const T& ch) { @@ -515,7 +513,7 @@ private: { wchar_t buffer[50]; #ifdef __MINGW32__ - int charsWritten = ::swprintf(buffer, L"%f", static_cast<double>(number)); //MinGW does not comply to the C standard! + int charsWritten = ::swprintf(buffer, L"%f", static_cast<double>(number)); //MinGW does not comply to the C standard here #else int charsWritten = std::swprintf(buffer, 50, L"%f", static_cast<double>(number)); #endif @@ -662,12 +660,12 @@ inline S toString(const Num& number) //convert number to string the C++ way { using namespace implementation; - return CvrtNumberToString<S, Num, + return CvrtNumberToString < S, Num, Loki::TypeTraits<Num>::isSignedInt ? NUM_TYPE_SIGNED_INT : Loki::TypeTraits<Num>::isUnsignedInt ? NUM_TYPE_UNSIGNED_INT : Loki::TypeTraits<Num>::isFloat ? NUM_TYPE_FLOATING_POINT : NUM_TYPE_OTHER - >().convert(number); + > ().convert(number); } @@ -676,12 +674,12 @@ inline Num toNumber(const S& str) //convert string to number the C++ way { using namespace implementation; - return CvrtStringToNumber<S, Num, + return CvrtStringToNumber < S, Num, Loki::TypeTraits<Num>::isSignedInt ? NUM_TYPE_SIGNED_INT : Loki::TypeTraits<Num>::isUnsignedInt ? NUM_TYPE_UNSIGNED_INT : Loki::TypeTraits<Num>::isFloat ? NUM_TYPE_FLOATING_POINT : NUM_TYPE_OTHER - >().convert(str); + > ().convert(str); } } diff --git a/shared/string_utf8.h b/shared/string_utf8.h index 26f4c3f2..8c920752 100644 --- a/shared/string_utf8.h +++ b/shared/string_utf8.h @@ -134,21 +134,21 @@ OutputIterator codePointToUtf8(CodePoint cp, OutputIterator result) //http://en. *result++ = static_cast<Char8>(cp); else if (cp < 0x800) { - *result++ = static_cast<Char8>((cp >> 6 )| 0xc0); - *result++ = static_cast<Char8>((cp & 0x3f )| 0x80); + *result++ = static_cast<Char8>((cp >> 6 ) | 0xc0); + *result++ = static_cast<Char8>((cp & 0x3f ) | 0x80); } else if (cp < 0x10000) { - *result++ = static_cast<Char8>((cp >> 12 )| 0xe0); - *result++ = static_cast<Char8>(((cp >> 6) & 0x3f )| 0x80); - *result++ = static_cast<Char8>((cp & 0x3f )| 0x80); + *result++ = static_cast<Char8>((cp >> 12 ) | 0xe0); + *result++ = static_cast<Char8>(((cp >> 6) & 0x3f ) | 0x80); + *result++ = static_cast<Char8>((cp & 0x3f ) | 0x80); } else { - *result++ = static_cast<Char8>((cp >> 18 )| 0xf0); - *result++ = static_cast<Char8>(((cp >> 12) & 0x3f )| 0x80); - *result++ = static_cast<Char8>(((cp >> 6) & 0x3f )| 0x80); - *result++ = static_cast<Char8>((cp & 0x3f )| 0x80); + *result++ = static_cast<Char8>((cp >> 18 ) | 0xf0); + *result++ = static_cast<Char8>(((cp >> 12) & 0x3f ) | 0x80); + *result++ = static_cast<Char8>(((cp >> 6) & 0x3f ) | 0x80); + *result++ = static_cast<Char8>((cp & 0x3f ) | 0x80); } return result; } @@ -179,7 +179,7 @@ Function utf8ToCodePoint(CharIterator first, CharIterator last, Function f) //f for ( ; first != last; ++first) { - auto getChar = [&](Char8& ch ) -> bool + auto getChar = [&](Char8 & ch) -> bool { if (++first == last) { diff --git a/shared/symlink_target.h b/shared/symlink_target.h index ef7b2275..9ab0ea3f 100644 --- a/shared/symlink_target.h +++ b/shared/symlink_target.h @@ -24,6 +24,8 @@ #ifdef _MSC_VER //I don't have Windows Driver Kit at hands right now, so unfortunately we need to redefine this structures and cross fingers... + +//from ntifs.h typedef struct _REPARSE_DATA_BUFFER { ULONG ReparseTag; @@ -60,7 +62,7 @@ typedef struct _REPARSE_DATA_BUFFER namespace { //retrieve raw target data of symlink or junction -Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw (FileError) +Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw FileError { using namespace zen; #ifdef FFS_WIN @@ -69,25 +71,24 @@ Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw (FileError) try //reading certain symlinks requires admin rights! This shall not cause an error in user mode! { //allow access to certain symbolic links/junctions - Privileges::getInstance().ensureActive(SE_BACKUP_NAME); //throw (FileError) + Privileges::getInstance().ensureActive(SE_BACKUP_NAME); //throw FileError } catch (...) {} const HANDLE hLink = ::CreateFile(applyLongPathPrefix(linkPath).c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - NULL, + 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL); if (hLink == INVALID_HANDLE_VALUE) throw FileError(_("Error resolving symbolic link:") + "\n\"" + linkPath + "\"" + "\n\n" + getLastErrorFormatted()); - - Loki::ScopeGuard dummy = Loki::MakeGuard(::CloseHandle, hLink); - (void)dummy; //silence warning "unused variable" + LOKI_ON_BLOCK_EXIT2(::CloseHandle(hLink)); //respect alignment issues... - std::vector<char> buffer(REPARSE_DATA_BUFFER_HEADER_SIZE + MAXIMUM_REPARSE_DATA_BUFFER_SIZE); + const DWORD bufferSize = REPARSE_DATA_BUFFER_HEADER_SIZE + MAXIMUM_REPARSE_DATA_BUFFER_SIZE; + std::vector<char> buffer(bufferSize); DWORD bytesReturned; //dummy value required by FSCTL_GET_REPARSE_POINT! if (!::DeviceIoControl(hLink, //__in HANDLE hDevice, @@ -95,7 +96,7 @@ Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw (FileError) NULL, //__in_opt LPVOID lpInBuffer, 0, //__in DWORD nInBufferSize, &buffer[0], //__out_opt LPVOID lpOutBuffer, - static_cast<DWORD>(buffer.size()), //__in DWORD nOutBufferSize, + bufferSize, //__in DWORD nOutBufferSize, &bytesReturned, //__out_opt LPDWORD lpBytesReturned, NULL)) //__inout_opt LPOVERLAPPED lpOverlapped throw FileError(_("Error resolving symbolic link:") + "\n\"" + linkPath + "\"" + "\n\n" + getLastErrorFormatted()); @@ -124,9 +125,9 @@ Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw (FileError) #elif defined FFS_LINUX const int BUFFER_SIZE = 10000; - char buffer[BUFFER_SIZE]; + std::vector<char> buffer(BUFFER_SIZE); - const int bytesWritten = ::readlink(linkPath.c_str(), buffer, BUFFER_SIZE); + const int bytesWritten = ::readlink(linkPath.c_str(), &buffer[0], BUFFER_SIZE); if (bytesWritten < 0 || bytesWritten >= BUFFER_SIZE) { std::wstring errorMessage = _("Error resolving symbolic link:") + "\n\"" + linkPath + "\""; @@ -136,7 +137,7 @@ Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw (FileError) } buffer[bytesWritten] = 0; //set null-terminating char - return buffer; + return Zstring(&buffer[0], bytesWritten); #endif } } diff --git a/shared/taskbar.cpp b/shared/taskbar.cpp index 005df705..9edc7288 100644 --- a/shared/taskbar.cpp +++ b/shared/taskbar.cpp @@ -39,16 +39,6 @@ bool windows7TaskbarAvailable() //version overview: http://msdn.microsoft.com/en-us/library/ms724834(VS.85).aspx return false; } - - -std::wstring getTaskBarDllName() -{ - assert_static(util::is32BitBuild || util::is64BitBuild); - - return util::is64BitBuild ? - L"Taskbar7_x64.dll" : - L"Taskbar7_Win32.dll"; -} } //######################################################################################################## @@ -58,8 +48,8 @@ class Taskbar::Pimpl //throw (TaskbarNotAvailable) public: Pimpl(const wxTopLevelWindow& window) : assocWindow(window.GetHWND()), - setStatus_(util::getDllFun<SetStatusFct>( getTaskBarDllName(), setStatusFctName)), - setProgress_(util::getDllFun<SetProgressFct>(getTaskBarDllName(), setProgressFctName)) + setStatus_ (getDllName(), setStatusFctName), + setProgress_(getDllName(), setProgressFctName) { if (!assocWindow || !setProgress_ || !setStatus_) throw TaskbarNotAvailable(); @@ -95,15 +85,15 @@ public: setStatus_(assocWindow, tbSevenStatus); } - void setProgress(size_t current, size_t total) + void setProgress(double fraction) { - setProgress_(assocWindow, current, total); + setProgress_(assocWindow, fraction * 100000, 100000); } private: void* assocWindow; //HWND - const SetStatusFct setStatus_; - const SetProgressFct setProgress_; + const util::DllFun<SetStatusFct> setStatus_; + const util::DllFun<SetProgressFct> setProgress_; }; #elif defined HAVE_UBUNTU_UNITY //Ubuntu unity @@ -150,9 +140,9 @@ public: } } - void setProgress(size_t current, size_t total) + void setProgress(double fraction) { - unity_launcher_entry_set_progress(tbEntry, total == 0 ? 0 : double(current) / total); + unity_launcher_entry_set_progress(tbEntry, fraction); } private: @@ -177,4 +167,4 @@ Taskbar::Taskbar(const wxTopLevelWindow& window) : pimpl_(new Pimpl(window)) {} Taskbar::~Taskbar() {} //std::unique_ptr ... void Taskbar::setStatus(Status status) { pimpl_->setStatus(status); } -void Taskbar::setProgress(size_t current, size_t total) { pimpl_->setProgress(current, total); } +void Taskbar::setProgress(double fraction) { pimpl_->setProgress(fraction); } diff --git a/shared/taskbar.h b/shared/taskbar.h index 54e0a431..b78b4494 100644 --- a/shared/taskbar.h +++ b/shared/taskbar.h @@ -40,7 +40,7 @@ public: }; void setStatus(Status status); - void setProgress(size_t current, size_t total); + void setProgress(double fraction); //between [0, 1] private: class Pimpl; diff --git a/shared/util.cpp b/shared/util.cpp index d780d683..292d87c1 100644 --- a/shared/util.cpp +++ b/shared/util.cpp @@ -70,11 +70,10 @@ wxString zen::formatFilesizeToShortString(UInt64 size) } -wxString zen::formatPercentage(zen::Int64 dividend, zen::Int64 divisor) +wxString zen::formatPercentage(double fraction) { - const double ratio = divisor != 0 ? to<double>(dividend) * 100.0 / to<double>(divisor) : 0; wxString output = _("%x%"); - output.Replace(wxT("%x"), wxString::Format(wxT("%3.2f"), ratio), false); + output.Replace(wxT("%x"), wxString::Format(wxT("%3.2f"), fraction * 100.0), false); return output; } @@ -130,14 +129,7 @@ bool isVistaOrLater() wxString zen::utcTimeToLocalString(zen::Int64 utcTime) { #ifdef FFS_WIN - //convert ansi C time to FILETIME - zen::UInt64 fileTimeLong = to<zen::UInt64>(utcTime + //may be < 0 - zen::Int64(3054539008UL, 2)); //timeshift between ansi C time and FILETIME in seconds == 11644473600s - fileTimeLong *= 10000000U; - - FILETIME lastWriteTimeUtc = {}; - lastWriteTimeUtc.dwLowDateTime = fileTimeLong.getLo(); - lastWriteTimeUtc.dwHighDateTime = fileTimeLong.getHi(); + FILETIME lastWriteTimeUtc = tofiletime(utcTime); //convert ansi C time to FILETIME SYSTEMTIME systemTimeLocal = {}; diff --git a/shared/util.h b/shared/util.h index 0e08280e..e45262ab 100644 --- a/shared/util.h +++ b/shared/util.h @@ -17,7 +17,7 @@ namespace zen wxString extractJobName(const wxString& configFilename); wxString formatFilesizeToShortString(UInt64 filesize); -wxString formatPercentage(Int64 dividend, Int64 divisor); +wxString formatPercentage(double fraction); //between [0, 1] template <class NumberType> wxString toStringSep(NumberType number); //convert number to wxString including thousands separator diff --git a/shared/warn_static.h b/shared/warn_static.h index bb4f4a6f..66513871 100644 --- a/shared/warn_static.h +++ b/shared/warn_static.h @@ -20,15 +20,15 @@ Usage: #define MAKE_STRING(NUM) MAKE_STRING_SUB(NUM) #define warn_static(TXT) \ -__pragma(message (__FILE__ "(" MAKE_STRING(__LINE__) "): Warning: " ## TXT)) + __pragma(message (__FILE__ "(" MAKE_STRING(__LINE__) "): Warning: " ## TXT)) #elif defined __GNUC__ #define LOKI_CONCAT( X, Y ) LOKI_CONCAT_SUB( X, Y ) #define LOKI_CONCAT_SUB( X, Y ) X##Y #define warn_static(TXT) \ -typedef int STATIC_WARNING __attribute__ ((deprecated)); \ -enum { LOKI_CONCAT(warn_static_dummy_value, __LINE__) = sizeof(STATIC_WARNING) }; + typedef int STATIC_WARNING __attribute__ ((deprecated)); \ + enum { LOKI_CONCAT(warn_static_dummy_value, __LINE__) = sizeof(STATIC_WARNING) }; #endif diff --git a/shared/wx_choice_enum.h b/shared/wx_choice_enum.h index e8fbeead..b8833725 100644 --- a/shared/wx_choice_enum.h +++ b/shared/wx_choice_enum.h @@ -20,7 +20,7 @@ Member variable: Constructor code: enumDescrMap. - add(ON_ERROR_POPUP , _("Show popup") , _("Show popup on errors or warnings")). + add(ON_ERROR_POPUP , _("Show pop-up") , _("Show pop-up on errors or warnings")). add(ON_ERROR_IGNORE, _("Ignore errors") , _("Hide all error and warning messages")). add(ON_ERROR_EXIT , _("Exit instantly"), _("Abort synchronization immediately")); diff --git a/shared/wx_timespan.h b/shared/wx_timespan.h index 2e566927..d11b328e 100644 --- a/shared/wx_timespan.h +++ b/shared/wx_timespan.h @@ -43,10 +43,10 @@ public: wxBoxSizer* bSizer27 = new wxBoxSizer( wxHORIZONTAL ); m_textCtrl = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_CENTRE ); - bSizer27->Add(m_textCtrl, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + bSizer27->Add(m_textCtrl, 1, wxALIGN_CENTER_VERTICAL | wxEXPAND, 5 ); - m_spinBtn = new wxSpinButton(this, wxID_ANY, wxDefaultPosition, wxSize( 20,-1 ), wxSP_ARROW_KEYS ); - bSizer27->Add(m_spinBtn, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + m_spinBtn = new wxSpinButton(this, wxID_ANY, wxDefaultPosition, wxSize( 20, -1 ), wxSP_ARROW_KEYS ); + bSizer27->Add(m_spinBtn, 0, wxALIGN_CENTER_VERTICAL | wxEXPAND, 5 ); SetSizer(bSizer27); Layout(); diff --git a/shared/xml_base.cpp b/shared/xml_base.cpp index c7c92401..e0b497f9 100644 --- a/shared/xml_base.cpp +++ b/shared/xml_base.cpp @@ -16,28 +16,31 @@ using namespace zen; //loadXmlDocument vs loadStream: //1. better error reporting //2. quick exit if (potentially large) input file is not an XML -void xmlAccess::loadXmlDocument(const wxString& filename, XmlDoc& doc) //throw FfsXmlError() +void xmlAccess::loadXmlDocument(const wxString& filename, XmlDoc& doc) //throw FfsXmlError { std::string stream; try { { //quick test whether input is an XML: avoid loading large binary files up front! - //doesn't correctly handle BOM! (but no issue yet...) const std::string xmlBegin = "<?xml version="; - std::vector<char> buffer(xmlBegin.size()); + std::vector<char> buffer(xmlBegin.size() + sizeof(zen::BYTE_ORDER_MARK_UTF8)); - FileInput inputFile(toZ(filename)); //throw (FileError); - const size_t bytesRead = inputFile.read(&buffer[0], buffer.size()); //throw (FileError) - if (bytesRead < xmlBegin.size() || !std::equal(buffer.begin(), buffer.end(), xmlBegin.begin())) + FileInput inputFile(toZ(filename)); //throw FileError; + const size_t bytesRead = inputFile.read(&buffer[0], buffer.size()); //throw FileError + + const std::string fileBegin(&buffer[0], bytesRead); + + if (!startsWith(fileBegin, xmlBegin) && + !startsWith(fileBegin, zen::BYTE_ORDER_MARK_UTF8 + xmlBegin)) //respect BOM! throw FfsXmlError(wxString(_("Error parsing configuration file:")) + wxT("\n\"") + filename + wxT("\"")); } - const zen::UInt64 fs = zen::getFilesize(toZ(filename)); //throw (FileError) + const zen::UInt64 fs = zen::getFilesize(toZ(filename)); //throw FileError stream.resize(to<size_t>(fs)); - FileInput inputFile(toZ(filename)); //throw (FileError); - const size_t bytesRead = inputFile.read(&stream[0], stream.size()); //throw (FileError) + FileInput inputFile(toZ(filename)); //throw FileError + const size_t bytesRead = inputFile.read(&stream[0], stream.size()); //throw FileError if (bytesRead < to<size_t>(fs)) { wxString errorMessage = wxString(_("Error reading file:")) + wxT("\n\"") + filename + wxT("\""); @@ -85,14 +88,14 @@ void xmlAccess::saveXmlDocument(const zen::XmlDoc& doc, const wxString& filename if (zen::loadStream(filename) == stream) //throw XmlFileError saveNecessary = false; } - catch(const zen::XmlFileError&) {} + catch (const zen::XmlFileError&) {} } catch (FileError&) {} if (saveNecessary) try { - FileOutput outputFile(toZ(filename), FileOutput::ACC_OVERWRITE); //throw (FileError) + FileOutput outputFile(toZ(filename), FileOutput::ACC_OVERWRITE); //throw FileError outputFile.write(stream.c_str(), stream.length()); // } catch (const FileError& error) //more detailed error messages than with wxWidgets diff --git a/shared/zbase.h b/shared/zbase.h index 55bc0d96..5f404887 100644 --- a/shared/zbase.h +++ b/shared/zbase.h @@ -54,8 +54,8 @@ template <typename T, //Character Type void setLength(T* ptr, size_t newLength) */ -template <typename T, //Character Type - class AP> //Allocator Policy +template < typename T, //Character Type + class AP > //Allocator Policy class StorageDeepCopy : public AP { protected: @@ -107,8 +107,8 @@ private: }; -template <typename T, //Character Type - class AP> //Allocator Policy +template < typename T, //Character Type + class AP > //Allocator Policy class StorageRefCountThreadSafe : public AP { protected: @@ -181,9 +181,9 @@ private: //perf note: interstingly StorageDeepCopy and StorageRefCountThreadSafe show same performance in FFS comparison -template <class T, //Character Type +template < class T, //Character Type template <class, class> class SP = StorageRefCountThreadSafe, //Storage Policy - class AP = AllocatorOptimalSpeed> //Allocator Policy + class AP = AllocatorOptimalSpeed > //Allocator Policy class Zbase : public SP<T, AP> { public: @@ -191,7 +191,7 @@ public: Zbase(const T* source); //implicit conversion from a C-string Zbase(const T* source, size_t length); Zbase(const Zbase& source); - Zbase(Zbase&& tmp); + Zbase(Zbase && tmp); explicit Zbase(T source); //dangerous if implicit: T buffer[]; Zbase name = buffer; ups... //allow explicit construction from different string type, prevent ambiguity via SFINAE template <class S> explicit Zbase(const S& other, typename S::value_type = 0); @@ -253,7 +253,7 @@ public: void push_back(T val); //STL access Zbase& operator=(const Zbase& source); - Zbase& operator=(Zbase&& tmp); + Zbase& operator=(Zbase && tmp); Zbase& operator=(const T* source); Zbase& operator=(T source); Zbase& operator+=(const Zbase& other); @@ -374,7 +374,7 @@ Zbase<T, SP, AP>::Zbase(const Zbase<T, SP, AP>& source) template <class T, template <class, class> class SP, class AP> inline -Zbase<T, SP, AP>::Zbase(Zbase<T, SP, AP>&& tmp) +Zbase<T, SP, AP>::Zbase(Zbase<T, SP, AP> && tmp) { rawStr = this->clone(tmp.rawStr); //for a ref-counting string there probably isn't a faster way, even with r-value references } @@ -828,7 +828,7 @@ Zbase<T, SP, AP>& Zbase<T, SP, AP>::operator=(const Zbase<T, SP, AP>& source) template <class T, template <class, class> class SP, class AP> inline -Zbase<T, SP, AP>& Zbase<T, SP, AP>::operator=(Zbase<T, SP, AP>&& tmp) +Zbase<T, SP, AP>& Zbase<T, SP, AP>::operator=(Zbase<T, SP, AP> && tmp) { swap(tmp); return *this; diff --git a/shared/zstring.cpp b/shared/zstring.cpp index e1df17ee..45762000 100644 --- a/shared/zstring.cpp +++ b/shared/zstring.cpp @@ -107,25 +107,25 @@ bool hasInvariantLocale() const LCID ZSTRING_INVARIANT_LOCALE = hasInvariantLocale() ? LOCALE_INVARIANT : MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); //see: http://msdn.microsoft.com/en-us/goglobal/bb688122.aspx + + +//try to call "CompareStringOrdinal" for low-level string comparison: unfortunately available not before Windows Vista! +//by a factor ~3 faster than old string comparison using "LCMapString" +typedef int (WINAPI* CompareStringOrdinalFunc)(LPCWSTR lpString1, + int cchCount1, + LPCWSTR lpString2, + int cchCount2, + BOOL bIgnoreCase); +util::DllFun<CompareStringOrdinalFunc> ordinalCompare; //caveat: function scope static initialization is not thread-safe in VS 2010! +boost::once_flag initCmpStrOrdOnce = BOOST_ONCE_INIT; } int z_impl::compareFilenamesWin(const wchar_t* a, const wchar_t* b, size_t sizeA, size_t sizeB) { - //try to call "CompareStringOrdinal" for low-level string comparison: unfortunately available not before Windows Vista! - //by a factor ~3 faster than old string comparison using "LCMapString" - typedef int (WINAPI *CompareStringOrdinalFunc)( - LPCWSTR lpString1, - int cchCount1, - LPCWSTR lpString2, - int cchCount2, - BOOL bIgnoreCase); - static CompareStringOrdinalFunc ordinalCompare = NULL; //caveat: function scope static initialization is not thread-safe in VS 2010! - static boost::once_flag once = BOOST_ONCE_INIT; - boost::call_once(once, []() { ordinalCompare = util::getDllFun<CompareStringOrdinalFunc>(L"kernel32.dll", "CompareStringOrdinal"); }); - - - if (ordinalCompare != NULL) //this additional test has no noticeable performance impact + boost::call_once(initCmpStrOrdOnce, []() { ordinalCompare = util::DllFun<CompareStringOrdinalFunc>(L"kernel32.dll", "CompareStringOrdinal"); }); + + if (ordinalCompare) //this additional test has no noticeable performance impact { const int rv = ordinalCompare(a, //pointer to first string static_cast<int>(sizeA), //size, in bytes or characters, of first string diff --git a/shared/zstring.h b/shared/zstring.h index 3b4837db..8c30007b 100644 --- a/shared/zstring.h +++ b/shared/zstring.h @@ -102,7 +102,7 @@ struct EqualFilename //case-insensitive on Windows, case-sensitive on Linux #ifdef FFS_WIN template <template <class, class> class SP, class AP> -void MakeUpper(Zbase<wchar_t, SP, AP>& str); +void makeUpper(Zbase<wchar_t, SP, AP>& str); #endif #ifdef FFS_WIN //Windows stores filenames in wide character format @@ -196,7 +196,7 @@ bool EqualFilename::operator()(const Zbase<T, SP, AP>& lhs, const Zbase<T, SP, A #ifdef FFS_WIN template <template <class, class> class SP, class AP> inline -void MakeUpper(Zbase<wchar_t, SP, AP>& str) +void makeUpper(Zbase<wchar_t, SP, AP>& str) { z_impl::makeUpperCaseWin(str.begin(), str.length()); } diff --git a/structures.cpp b/structures.cpp index 0d16f735..98255700 100644 --- a/structures.cpp +++ b/structures.cpp @@ -8,6 +8,7 @@ #include "shared/i18n.h" #include <iterator> #include <stdexcept> +#include <ctime> using namespace zen; @@ -19,7 +20,7 @@ wxString zen::getVariantName(CompareVariant var) case CMP_BY_CONTENT: return _("File content"); case CMP_BY_TIME_SIZE: - return _("File size and date"); + return _("File time and size"); } assert(false); @@ -27,32 +28,32 @@ wxString zen::getVariantName(CompareVariant var) } -wxString zen::getVariantName(SyncConfig::Variant var) +wxString zen::getVariantName(DirectionConfig::Variant var) { switch (var) { - case SyncConfig::AUTOMATIC: + case DirectionConfig::AUTOMATIC: return _("<Automatic>"); - case SyncConfig::MIRROR: + case DirectionConfig::MIRROR: return _("Mirror ->>"); - case SyncConfig::UPDATE: + case DirectionConfig::UPDATE: return _("Update ->"); - case SyncConfig::CUSTOM: + case DirectionConfig::CUSTOM: return _("Custom"); } return _("Error"); } -DirectionSet zen::extractDirections(const SyncConfig& cfg) +DirectionSet zen::extractDirections(const DirectionConfig& cfg) { DirectionSet output; switch (cfg.var) { - case SyncConfig::AUTOMATIC: + case DirectionConfig::AUTOMATIC: throw std::logic_error("there are no predefined directions for automatic mode!"); - case SyncConfig::MIRROR: + case DirectionConfig::MIRROR: output.exLeftSideOnly = SYNC_DIR_RIGHT; output.exRightSideOnly = SYNC_DIR_RIGHT; output.leftNewer = SYNC_DIR_RIGHT; @@ -61,7 +62,7 @@ DirectionSet zen::extractDirections(const SyncConfig& cfg) output.conflict = SYNC_DIR_RIGHT; break; - case SyncConfig::UPDATE: + case DirectionConfig::UPDATE: output.exLeftSideOnly = SYNC_DIR_RIGHT; output.exRightSideOnly = SYNC_DIR_NONE; output.leftNewer = SYNC_DIR_RIGHT; @@ -70,7 +71,7 @@ DirectionSet zen::extractDirections(const SyncConfig& cfg) output.conflict = SYNC_DIR_NONE; break; - case SyncConfig::CUSTOM: + case DirectionConfig::CUSTOM: output = cfg.custom; break; } @@ -91,19 +92,39 @@ DirectionSet zen::getTwoWaySet() } -wxString MainConfiguration::getSyncVariantName() +wxString MainConfiguration::getCompVariantName() const { - const SyncConfig::Variant firstVariant = firstPair.altSyncConfig.get() ? - firstPair.altSyncConfig->syncConfiguration.var : - syncConfiguration.var; //fallback to main sync cfg + const CompareVariant firstVariant = firstPair.altCmpConfig.get() ? + firstPair.altCmpConfig->compareVar : + cmpConfig.compareVar; //fallback to main sync cfg //test if there's a deviating variant within the additional folder pairs - for (std::vector<FolderPairEnh>::const_iterator i = additionalPairs.begin(); i != additionalPairs.end(); ++i) + for (auto fp = additionalPairs.begin(); fp != additionalPairs.end(); ++fp) { - const SyncConfig::Variant thisVariant = i->altSyncConfig.get() ? - i->altSyncConfig->syncConfiguration.var : - syncConfiguration.var; + const CompareVariant thisVariant = fp->altCmpConfig.get() ? + fp->altCmpConfig->compareVar : + cmpConfig.compareVar; //fallback to main sync cfg + if (thisVariant != firstVariant) + return _("Multiple..."); + } + + //seems to be all in sync... + return getVariantName(firstVariant); +} + +wxString MainConfiguration::getSyncVariantName() const +{ + const DirectionConfig::Variant firstVariant = firstPair.altSyncConfig.get() ? + firstPair.altSyncConfig->directionCfg.var : + syncCfg.directionCfg.var; //fallback to main sync cfg + + //test if there's a deviating variant within the additional folder pairs + for (auto fp = additionalPairs.begin(); fp != additionalPairs.end(); ++fp) + { + const DirectionConfig::Variant thisVariant = fp->altSyncConfig.get() ? + fp->altSyncConfig->directionCfg.var : + syncCfg.directionCfg.var; if (thisVariant != firstVariant) return _("Multiple..."); } @@ -235,28 +256,75 @@ namespace assert_static(std::numeric_limits<zen:: Int64>::is_specialized); assert_static(std::numeric_limits<zen::UInt64>::is_specialized); + +int daysSinceBeginOfWeek(int dayOfWeek) //0-6, 0=Monday, 6=Sunday +{ + assert(0 <= dayOfWeek && dayOfWeek <= 6); +#ifdef FFS_WIN + DWORD firstDayOfWeek = 0; + if (::GetLocaleInfo(LOCALE_USER_DEFAULT, //__in LCID Locale, + LOCALE_IFIRSTDAYOFWEEK | // first day of week specifier, 0-6, 0=Monday, 6=Sunday + LOCALE_RETURN_NUMBER, //__in LCTYPE LCType, + reinterpret_cast<LPTSTR>(&firstDayOfWeek), //__out LPTSTR lpLCData, + sizeof(firstDayOfWeek) / sizeof(TCHAR)) != 0) //__in int cchData + { + assert(firstDayOfWeek <= 6); + return (dayOfWeek + (7 - firstDayOfWeek)) % 7; + } + else //default +#endif + return dayOfWeek; //let all weeks begin with monday +} + zen::Int64 resolve(size_t value, UnitTime unit, zen::Int64 defaultVal) { - double out = value; + const time_t utcTimeNow = ::time(NULL); + struct tm* localTimeFmt = ::localtime (&utcTimeNow); //utc to local + switch (unit) { case UTIME_NONE: return defaultVal; - case UTIME_SEC: - return zen::Int64(value); - case UTIME_MIN: - out *= 60; - break; - case UTIME_HOUR: - out *= 3600; - break; - case UTIME_DAY: - out *= 24 * 3600; - break; + + // case UTIME_LAST_X_HOURS: + // return Int64(utcTimeNow) - Int64(value) * 3600; + + case UTIME_TODAY: + localTimeFmt->tm_sec = 0; //0-61 + localTimeFmt->tm_min = 0; //0-59 + localTimeFmt->tm_hour = 0; //0-23 + return Int64(::mktime(localTimeFmt)); //convert local time back to UTC + + case UTIME_THIS_WEEK: + { + localTimeFmt->tm_sec = 0; //0-61 + localTimeFmt->tm_min = 0; //0-59 + localTimeFmt->tm_hour = 0; //0-23 + size_t timeFrom = ::mktime(localTimeFmt); + + int dayOfWeek = (localTimeFmt->tm_wday + 6) % 7; //tm_wday := days since Sunday 0-6 + // +6 == -1 in Z_7 + + return Int64(timeFrom) - daysSinceBeginOfWeek(dayOfWeek) * 24 * 3600; + } + case UTIME_THIS_MONTH: + localTimeFmt->tm_sec = 0; //0-61 + localTimeFmt->tm_min = 0; //0-59 + localTimeFmt->tm_hour = 0; //0-23 + localTimeFmt->tm_mday = 1; //1-31 + return Int64(::mktime(localTimeFmt)); //convert local time back to UTC + + case UTIME_THIS_YEAR: + localTimeFmt->tm_sec = 0; //0-61 + localTimeFmt->tm_min = 0; //0-59 + localTimeFmt->tm_hour = 0; //0-23 + localTimeFmt->tm_mday = 1; //1-31 + localTimeFmt->tm_mon = 0; //0-11 + return Int64(::mktime(localTimeFmt)); //convert local time back to UTC } - return out >= to<double>(std::numeric_limits<zen::Int64>::max()) ? //prevent overflow!!! - std::numeric_limits<zen::Int64>::max() : - zen::Int64(out); + + assert(false); + return utcTimeNow; } zen::UInt64 resolve(size_t value, UnitSize unit, zen::UInt64 defaultVal) @@ -284,13 +352,13 @@ zen::UInt64 resolve(size_t value, UnitSize unit, zen::UInt64 defaultVal) void zen::resolveUnits(size_t timeSpan, UnitTime unitTimeSpan, size_t sizeMin, UnitSize unitSizeMin, size_t sizeMax, UnitSize unitSizeMax, - zen::Int64& timeSpanSec, //unit: seconds - zen::UInt64& sizeMinBy, //unit: bytes - zen::UInt64& sizeMaxBy) //unit: bytes + zen::Int64& timeFrom, //unit: UTC time, seconds + zen::UInt64& sizeMinBy, //unit: bytes + zen::UInt64& sizeMaxBy) //unit: bytes { - timeSpanSec = resolve(timeSpan, unitTimeSpan, std::numeric_limits<zen::Int64>::max()); - sizeMinBy = resolve(sizeMin, unitSizeMin, 0U); - sizeMaxBy = resolve(sizeMax, unitSizeMax, std::numeric_limits<zen::UInt64>::max()); + timeFrom = resolve(timeSpan, unitTimeSpan, std::numeric_limits<Int64>::min()); + sizeMinBy = resolve(sizeMin, unitSizeMin, 0U); + sizeMaxBy = resolve(sizeMax, unitSizeMax, std::numeric_limits<UInt64>::max()); } @@ -309,12 +377,6 @@ bool sameFilter(const std::vector<FolderPairEnh>& folderPairs) } -bool isEmpty(const FolderPairEnh& fp) -{ - return fp == FolderPairEnh(); -} - - FilterConfig mergeFilterConfig(const FilterConfig& global, const FilterConfig& local) { FilterConfig out = local; @@ -330,28 +392,28 @@ FilterConfig mergeFilterConfig(const FilterConfig& global, const FilterConfig& l out.excludeFilter.Trim(true, false); //soft filter - zen::Int64 locTimeSpanSec; - zen::UInt64 locSizeMinBy; - zen::UInt64 locSizeMaxBy; - zen::resolveUnits(out.timeSpan, out.unitTimeSpan, - out.sizeMin, out.unitSizeMin, - out.sizeMax, out.unitSizeMax, - locTimeSpanSec, //unit: seconds - locSizeMinBy, //unit: bytes - locSizeMaxBy); //unit: bytes + Int64 loctimeFrom; + UInt64 locSizeMinBy; + UInt64 locSizeMaxBy; + resolveUnits(out.timeSpan, out.unitTimeSpan, + out.sizeMin, out.unitSizeMin, + out.sizeMax, out.unitSizeMax, + loctimeFrom, //unit: UTC time, seconds + locSizeMinBy, //unit: bytes + locSizeMaxBy); //unit: bytes //soft filter - zen::Int64 gloTimeSpanSec; - zen::UInt64 gloSizeMinBy; - zen::UInt64 gloSizeMaxBy; - zen::resolveUnits(global.timeSpan, global.unitTimeSpan, - global.sizeMin, global.unitSizeMin, - global.sizeMax, global.unitSizeMax, - gloTimeSpanSec, //unit: seconds - gloSizeMinBy, //unit: bytes - gloSizeMaxBy); //unit: bytes - - if (gloTimeSpanSec < locTimeSpanSec) + Int64 glotimeFrom; + UInt64 gloSizeMinBy; + UInt64 gloSizeMaxBy; + resolveUnits(global.timeSpan, global.unitTimeSpan, + global.sizeMin, global.unitSizeMin, + global.sizeMax, global.unitSizeMax, + glotimeFrom, + gloSizeMinBy, + gloSizeMaxBy); + + if (glotimeFrom > loctimeFrom) { out.timeSpan = global.timeSpan; out.unitTimeSpan = global.unitTimeSpan; @@ -368,60 +430,110 @@ FilterConfig mergeFilterConfig(const FilterConfig& global, const FilterConfig& l } return out; } + + +inline +bool isEmpty(const FolderPairEnh& fp) +{ + return fp == FolderPairEnh(); +} } -zen::MainConfiguration zen::merge(const std::vector<MainConfiguration>& mainCfgs) +MainConfiguration zen::merge(const std::vector<MainConfiguration>& mainCfgs) { assert(!mainCfgs.empty()); if (mainCfgs.empty()) - return zen::MainConfiguration(); + return MainConfiguration(); if (mainCfgs.size() == 1) //mergeConfigFilesImpl relies on this! return mainCfgs[0]; // //merge folder pair config std::vector<FolderPairEnh> fpMerged; - for (std::vector<MainConfiguration>::const_iterator i = mainCfgs.begin(); i != mainCfgs.end(); ++i) + for (std::vector<MainConfiguration>::const_iterator iterMain = mainCfgs.begin(); iterMain != mainCfgs.end(); ++iterMain) { std::vector<FolderPairEnh> fpTmp; //list non-empty local configurations - if (!isEmpty(i->firstPair)) fpTmp.push_back(i->firstPair); - std::remove_copy_if(i->additionalPairs.begin(), i->additionalPairs.end(), std::back_inserter(fpTmp), &isEmpty); + if (!isEmpty(iterMain->firstPair)) + fpTmp.push_back(iterMain->firstPair); + std::copy_if(iterMain->additionalPairs.begin(), iterMain->additionalPairs.end(), std::back_inserter(fpTmp), + [](const FolderPairEnh& fp) { return !isEmpty(fp); }); //move all configuration down to item level for (std::vector<FolderPairEnh>::iterator fp = fpTmp.begin(); fp != fpTmp.end(); ++fp) { + if (!fp->altCmpConfig.get()) + fp->altCmpConfig = std::make_shared<CompConfig>(iterMain->cmpConfig); + if (!fp->altSyncConfig.get()) - fp->altSyncConfig.reset( - new AlternateSyncConfig(i->syncConfiguration, - i->handleDeletion, - i->customDeletionDirectory)); + fp->altSyncConfig = std::make_shared<SyncConfig>(iterMain->syncCfg); - fp->localFilter = mergeFilterConfig(i->globalFilter, fp->localFilter); + fp->localFilter = mergeFilterConfig(iterMain->globalFilter, fp->localFilter); } fpMerged.insert(fpMerged.end(), fpTmp.begin(), fpTmp.end()); } if (fpMerged.empty()) - return zen::MainConfiguration(); + return MainConfiguration(); //optimization: remove redundant configuration - FilterConfig newGlobalFilter; + //######################################################################################################################## + //find out which comparison and synchronization setting are used most often and use them as new "header" + std::vector<std::pair<CompConfig, int>> cmpCfgStat; + std::vector<std::pair<SyncConfig, int>> syncCfgStat; + for (auto fp = fpMerged.begin(); fp != fpMerged.end(); ++fp) //rather inefficient algorithm, but it does not require a less-than operator! + { + { + const CompConfig& cmpCfg = *fp->altCmpConfig; + + auto iter = std::find_if(cmpCfgStat.begin(), cmpCfgStat.end(), + [&](const std::pair<CompConfig, int>& entry) { return entry.first == cmpCfg; }); + if (iter == cmpCfgStat.end()) + cmpCfgStat.push_back(std::make_pair(cmpCfg, 1)); + else + ++(iter->second); + } + { + const SyncConfig& syncCfg = *fp->altSyncConfig; + + auto iter = std::find_if(syncCfgStat.begin(), syncCfgStat.end(), + [&](const std::pair<SyncConfig, int>& entry) { return entry.first == syncCfg; }); + if (iter == syncCfgStat.end()) + syncCfgStat.push_back(std::make_pair(syncCfg, 1)); + else + ++(iter->second); + } + } + + //set most-used comparison and synchronization settions as new header options + const CompConfig cmpCfgHead = cmpCfgStat.empty() ? CompConfig() : + std::max_element(cmpCfgStat.begin(), cmpCfgStat.end(), + [](const std::pair<CompConfig, int>& lhs, const std::pair<CompConfig, int>& rhs) { return lhs.second < rhs.second; })->first; + + const SyncConfig syncCfgHead = syncCfgStat.empty() ? SyncConfig() : + std::max_element(syncCfgStat.begin(), syncCfgStat.end(), + [](const std::pair<SyncConfig, int>& lhs, const std::pair<SyncConfig, int>& rhs) { return lhs.second < rhs.second; })->first; + //######################################################################################################################## + + FilterConfig globalFilter; const bool equalFilters = sameFilter(fpMerged); if (equalFilters) - newGlobalFilter = fpMerged[0].localFilter; + globalFilter = fpMerged[0].localFilter; + //strip redundancy... for (std::vector<FolderPairEnh>::iterator fp = fpMerged.begin(); fp != fpMerged.end(); ++fp) { //if local config matches output global config we don't need local one + if (fp->altCmpConfig && + *fp->altCmpConfig == cmpCfgHead) + fp->altCmpConfig.reset(); + if (fp->altSyncConfig && - *fp->altSyncConfig == AlternateSyncConfig(mainCfgs[0].syncConfiguration, - mainCfgs[0].handleDeletion, - mainCfgs[0].customDeletionDirectory)) + *fp->altSyncConfig == syncCfgHead) fp->altSyncConfig.reset(); if (equalFilters) //use global filter in this case @@ -429,9 +541,11 @@ zen::MainConfiguration zen::merge(const std::vector<MainConfiguration>& mainCfgs } //final assembly - zen::MainConfiguration cfgOut = mainCfgs[0]; - cfgOut.globalFilter = newGlobalFilter; - cfgOut.firstPair = fpMerged[0]; + zen::MainConfiguration cfgOut; + cfgOut.cmpConfig = cmpCfgHead; + cfgOut.syncCfg = syncCfgHead; + cfgOut.globalFilter = globalFilter; + cfgOut.firstPair = fpMerged[0]; cfgOut.additionalPairs.assign(fpMerged.begin() + 1, fpMerged.end()); return cfgOut; diff --git a/structures.h b/structures.h index 6039066d..6b13cbf4 100644 --- a/structures.h +++ b/structures.h @@ -26,12 +26,19 @@ enum CompareVariant wxString getVariantName(CompareVariant var); +enum SymLinkHandling +{ + SYMLINK_IGNORE, + SYMLINK_USE_DIRECTLY, + SYMLINK_FOLLOW_LINK +}; + enum SyncDirection { SYNC_DIR_LEFT = 0, SYNC_DIR_RIGHT, - SYNC_DIR_NONE //NOTE: align with SyncDirectionIntern before adding anything here! + SYNC_DIR_NONE }; @@ -136,17 +143,17 @@ bool operator==(const DirectionSet& lhs, const DirectionSet& rhs) lhs.conflict == rhs.conflict; } -struct SyncConfig //technical representation of sync-config +struct DirectionConfig //technical representation of sync-config { enum Variant { AUTOMATIC, //use sync-database to determine directions - MIRROR, //predefined - UPDATE, // - CUSTOM //use custom directions + MIRROR, //predefined + UPDATE, // + CUSTOM //use custom directions }; - SyncConfig() : var(AUTOMATIC) {} + DirectionConfig() : var(AUTOMATIC) {} Variant var; @@ -155,18 +162,41 @@ struct SyncConfig //technical representation of sync-config }; inline -bool operator==(const SyncConfig& lhs, const SyncConfig& rhs) +bool operator==(const DirectionConfig& lhs, const DirectionConfig& rhs) { return lhs.var == rhs.var && - (lhs.var != SyncConfig::CUSTOM || lhs.custom == rhs.custom); //directions are only relevant if variant "custom" is active + (lhs.var != DirectionConfig::CUSTOM || lhs.custom == rhs.custom); //directions are only relevant if variant "custom" is active } //get sync directions: DON'T call for variant AUTOMATIC! -DirectionSet extractDirections(const SyncConfig& cfg); +DirectionSet extractDirections(const DirectionConfig& cfg); + +wxString getVariantName(DirectionConfig::Variant var); -wxString getVariantName(SyncConfig::Variant var); +struct CompConfig +{ + CompConfig(CompareVariant cmpVar, + SymLinkHandling handleSyml) : + compareVar(cmpVar), + handleSymlinks(handleSyml) {} + + CompConfig() : + compareVar(CMP_BY_TIME_SIZE), + handleSymlinks(SYMLINK_IGNORE) {} + + CompareVariant compareVar; + SymLinkHandling handleSymlinks; +}; + +inline +bool operator==(const CompConfig& lhs, const CompConfig& rhs) +{ + return lhs.compareVar == rhs.compareVar && + lhs.handleSymlinks == rhs.handleSymlinks; +} + enum DeletionPolicy { @@ -176,20 +206,20 @@ enum DeletionPolicy }; -struct AlternateSyncConfig +struct SyncConfig { - AlternateSyncConfig(const SyncConfig& syncCfg, - const DeletionPolicy handleDel, - const wxString& customDelDir) : - syncConfiguration(syncCfg), + SyncConfig(const DirectionConfig& directCfg, + const DeletionPolicy handleDel, + const wxString& customDelDir) : + directionCfg(directCfg), handleDeletion(handleDel), - customDeletionDirectory(customDelDir) {}; + customDeletionDirectory(customDelDir) {} - AlternateSyncConfig() : //construct with default values + SyncConfig() : //construct with default values handleDeletion(MOVE_TO_RECYCLE_BIN) {} - //Synchronisation settings - SyncConfig syncConfiguration; + //sync direction settings + DirectionConfig directionCfg; //misc options DeletionPolicy handleDeletion; //use Recycle, delete permanently or move to user-defined location @@ -197,11 +227,12 @@ struct AlternateSyncConfig }; inline -bool operator==(const AlternateSyncConfig& lhs, const AlternateSyncConfig& rhs) +bool operator==(const SyncConfig& lhs, const SyncConfig& rhs) { - return lhs.syncConfiguration == rhs.syncConfiguration && - lhs.handleDeletion == rhs.handleDeletion && - lhs.customDeletionDirectory == rhs.customDeletionDirectory; + return lhs.directionCfg == rhs.directionCfg && + lhs.handleDeletion == rhs.handleDeletion && + (lhs.handleDeletion != MOVE_TO_CUSTOM_DIRECTORY || //only cmp custom deletion directory if required! + lhs.customDeletionDirectory == rhs.customDeletionDirectory); } @@ -216,10 +247,11 @@ enum UnitSize enum UnitTime { UTIME_NONE, - UTIME_SEC, - UTIME_MIN, - UTIME_HOUR, - UTIME_DAY + //UTIME_LAST_X_HOURS, + UTIME_TODAY, + UTIME_THIS_WEEK, + UTIME_THIS_MONTH, + UTIME_THIS_YEAR }; struct FilterConfig @@ -281,7 +313,7 @@ bool operator==(const FilterConfig& lhs, const FilterConfig& rhs) void resolveUnits(size_t timeSpan, UnitTime unitTimeSpan, size_t sizeMin, UnitSize unitSizeMin, size_t sizeMax, UnitSize unitSizeMax, - zen::Int64& timeSpanSec, //unit: seconds + zen::Int64& timeFrom, //unit: UTC time, seconds zen::UInt64& sizeMinBy, //unit: bytes zen::UInt64& sizeMaxBy); //unit: bytes @@ -292,17 +324,20 @@ struct FolderPairEnh //enhanced folder pairs with (optional) alternate configura FolderPairEnh(const Zstring& leftDir, const Zstring& rightDir, - const std::shared_ptr<const AlternateSyncConfig>& syncConfig, + const std::shared_ptr<const CompConfig>& cmpConfig, + const std::shared_ptr<const SyncConfig>& syncConfig, const FilterConfig& filter) : leftDirectory(leftDir), rightDirectory(rightDir) , + altCmpConfig(cmpConfig), altSyncConfig(syncConfig), localFilter(filter) {} Zstring leftDirectory; Zstring rightDirectory; - std::shared_ptr<const AlternateSyncConfig> altSyncConfig; //optional + std::shared_ptr<const CompConfig> altCmpConfig; //optional + std::shared_ptr<const SyncConfig> altSyncConfig; // FilterConfig localFilter; }; @@ -313,6 +348,10 @@ bool operator==(const FolderPairEnh& lhs, const FolderPairEnh& rhs) return lhs.leftDirectory == rhs.leftDirectory && lhs.rightDirectory == rhs.rightDirectory && + (lhs.altCmpConfig.get() && rhs.altCmpConfig.get() ? + *lhs.altCmpConfig == *rhs.altCmpConfig : + lhs.altCmpConfig.get() == rhs.altCmpConfig.get()) && + (lhs.altSyncConfig.get() && rhs.altSyncConfig.get() ? *lhs.altSyncConfig == *rhs.altSyncConfig : lhs.altSyncConfig.get() == rhs.altSyncConfig.get()) && @@ -320,64 +359,43 @@ bool operator==(const FolderPairEnh& lhs, const FolderPairEnh& rhs) lhs.localFilter == rhs.localFilter; } -enum SymLinkHandling -{ - SYMLINK_IGNORE, - SYMLINK_USE_DIRECTLY, - SYMLINK_FOLLOW_LINK -}; - struct MainConfiguration { MainConfiguration() : - compareVar(CMP_BY_TIME_SIZE), - handleSymlinks(SYMLINK_IGNORE), #ifdef FFS_WIN globalFilter(Zstr("*"), Zstr("\ \\System Volume Information\\\n\ \\RECYCLED\\\n\ \\RECYCLER\\\n\ -\\$Recycle.Bin\\")), +\\$Recycle.Bin\\")) {} #elif defined FFS_LINUX globalFilter(Zstr("*"), Zstr("/.Trash-*/\n\ - /.recycle/")), + /.recycle/")) {} #endif - handleDeletion(MOVE_TO_RECYCLE_BIN) {} + + CompConfig cmpConfig; //global compare settings: may be overwritten by folder pair settings + SyncConfig syncCfg; //global synchronisation settings: may be overwritten by folder pair settings + FilterConfig globalFilter; //global filter settings: combined with folder pair settings FolderPairEnh firstPair; //there needs to be at least one pair! std::vector<FolderPairEnh> additionalPairs; - //Compare setting - CompareVariant compareVar; - - SymLinkHandling handleSymlinks; - - //GLOBAL filter settings - FilterConfig globalFilter; - - //Synchronisation settings - SyncConfig syncConfiguration; - DeletionPolicy handleDeletion; //use Recycle, delete permanently or move to user-defined location - wxString customDeletionDirectory; - - wxString getSyncVariantName(); + wxString getCompVariantName() const; + wxString getSyncVariantName() const; }; inline bool operator==(const MainConfiguration& lhs, const MainConfiguration& rhs) { - return lhs.firstPair == rhs.firstPair && - lhs.additionalPairs == rhs.additionalPairs && - lhs.compareVar == rhs.compareVar && - lhs.handleSymlinks == rhs.handleSymlinks && - lhs.syncConfiguration == rhs.syncConfiguration && - lhs.globalFilter == rhs.globalFilter && - lhs.handleDeletion == rhs.handleDeletion && - lhs.customDeletionDirectory == rhs.customDeletionDirectory; + return lhs.cmpConfig == rhs.cmpConfig && + lhs.globalFilter == rhs.globalFilter && + lhs.syncCfg == rhs.syncCfg && + lhs.firstPair == rhs.firstPair && + lhs.additionalPairs == rhs.additionalPairs; } //facilitate drag & drop config merge: diff --git a/synchronization.cpp b/synchronization.cpp index 297dcf51..bf96c2cb 100644 --- a/synchronization.cpp +++ b/synchronization.cpp @@ -5,9 +5,13 @@ // ************************************************************************** #include "synchronization.h" +#include <memory> +#include <deque> #include <stdexcept> #include <wx/msgdlg.h> #include <wx/log.h> +#include <wx/file.h> +#include <boost/bind.hpp> #include "shared/string_conv.h" #include "shared/util.h" #include "shared/loki/ScopeGuard.h" @@ -16,16 +20,12 @@ #include "shared/resolve_path.h" #include "shared/recycler.h" #include "shared/i18n.h" -#include <wx/file.h> -#include <boost/bind.hpp> #include "shared/global_func.h" #include "shared/disable_standby.h" -#include <memory> #include "library/db_file.h" #include "library/dir_exist_async.h" #include "library/cmp_filetime.h" #include "shared/file_io.h" -#include <deque> #ifdef FFS_WIN #include "shared/long_path_prefix.h" @@ -53,7 +53,7 @@ void SyncStatistics::init() SyncStatistics::SyncStatistics(const FolderComparison& folderCmp) { init(); - std::for_each(folderCmp.begin(), folderCmp.end(), boost::bind(&SyncStatistics::getNumbersRecursively, this, _1)); + std::for_each(begin(folderCmp), end(folderCmp), [&](const BaseDirMapping& baseMap) { getNumbersRecursively(baseMap); }); } @@ -67,17 +67,14 @@ SyncStatistics::SyncStatistics(const HierarchyObject& hierObj) inline void SyncStatistics::getNumbersRecursively(const HierarchyObject& hierObj) { - //process directories std::for_each(hierObj.refSubDirs().begin(), hierObj.refSubDirs().end(), - boost::bind(&SyncStatistics::getDirNumbers, this, _1)); + [&](const DirMapping& dirObj) { getDirNumbers(dirObj); }); - //process files std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), - boost::bind(&SyncStatistics::getFileNumbers, this, _1)); + [&](const FileMapping& fileObj) { getFileNumbers(fileObj); }); - //process symlinks std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), - boost::bind(&SyncStatistics::getLinkNumbers, this, _1)); + [&](const SymLinkMapping& linkObj) { getLinkNumbers(linkObj); }); rowsTotal += hierObj.refSubDirs(). size(); rowsTotal += hierObj.refSubFiles().size(); @@ -245,17 +242,16 @@ std::vector<zen::FolderPairSyncCfg> zen::extractSyncCfg(const MainConfiguration& std::vector<FolderPairSyncCfg> output; //process all pairs - for (std::vector<FolderPairEnh>::const_iterator i = allPairs.begin(); i != allPairs.end(); ++i) - output.push_back( - i->altSyncConfig.get() ? + for (auto i = allPairs.begin(); i != allPairs.end(); ++i) + { + SyncConfig syncCfg = i->altSyncConfig.get() ? *i->altSyncConfig : mainCfg.syncCfg; - FolderPairSyncCfg(i->altSyncConfig->syncConfiguration.var == SyncConfig::AUTOMATIC, - i->altSyncConfig->handleDeletion, - toZ(i->altSyncConfig->customDeletionDirectory)) : + output.push_back( + FolderPairSyncCfg(syncCfg.directionCfg.var == DirectionConfig::AUTOMATIC, + syncCfg.handleDeletion, + toZ(syncCfg.customDeletionDirectory))); + } - FolderPairSyncCfg(mainCfg.syncConfiguration.var == SyncConfig::AUTOMATIC, - mainCfg.handleDeletion, - toZ(mainCfg.customDeletionDirectory))); return output; } //------------------------------------------------------------------------------------------------------------ @@ -329,6 +325,18 @@ bool tryReportingError(ProcessCallback& handler, Function cmd) //return "true" o } +namespace +{ +template <class S, class T, class U> inline +S replaceCpy(const S& str, const T& old, const U& replacement, bool replaceAll = true) +{ + S tmp = str; + zen::replace(tmp, old, replacement, replaceAll); + return tmp; +} +} + + /* add some postfix to alternate deletion directory: deletionDirectory\<prefix>2010-06-30 12-59-12\ */ @@ -341,8 +349,7 @@ Zstring getSessionDeletionDir(const Zstring& deletionDirectory, const Zstring& p if (!formattedDir.EndsWith(FILE_NAME_SEPARATOR)) formattedDir += FILE_NAME_SEPARATOR; - wxString timeNow = wxDateTime::Now().FormatISOTime(); - replace(timeNow, L":", L""); + const wxString timeNow = replaceCpy(wxDateTime::Now().FormatISOTime(), L":", L""); const wxString sessionName = wxDateTime::Now().FormatISODate() + wxChar(' ') + timeNow; formattedDir += prefix + toZ(sessionName); @@ -374,6 +381,10 @@ SyncProcess::SyncProcess(xmlAccess::OptionalDialogs& warnings, procCallback(handler) {} //-------------------------------------------------------------------------------------------------------------- +namespace +{ +struct CallbackRemoveDirImpl; +} class DeletionHandling //e.g. generate name of alternate deletion directory (unique for session AND folder pair) { @@ -387,17 +398,18 @@ public: //clean-up temporary directory (recycler bin optimization) void tryCleanup(); //throw FileError -> call this in non-exceptional coding, i.e. after Sync somewhere! - void removeFile (const Zstring& relativeName) const; //throw (FileError) - void removeFolder(const Zstring& relativeName) const; //throw (FileError) + void removeFile (const Zstring& relativeName) const; //throw FileError + void removeFolder(const Zstring& relativeName) const; //throw FileError - const Zstring& getTxtRemovingFile () const { return txtRemovingFile; } // - const Zstring& getTxtRemovingSymLink() const { return txtRemovingSymlink; } //status text templates - const Zstring& getTxtRemovingDir () const { return txtRemovingDirectory; }; // + const wxString& getTxtRemovingFile () const { return txtRemovingFile; } // + const wxString& getTxtRemovingSymLink() const { return txtRemovingSymlink; } //status text templates + const wxString& getTxtRemovingDir () const { return txtRemovingDirectory; } // //evaluate whether a deletion will actually free space within a volume bool deletionFreesSpace() const; private: + friend struct ::CallbackRemoveDirImpl; DeletionPolicy deletionType; ProcessCallback* procCallback_; //always bound! need assignment operator => not a reference @@ -406,9 +418,9 @@ private: Zstring baseDir_; //with separator postfix //preloaded status texts: - Zstring txtRemovingFile; - Zstring txtRemovingSymlink; - Zstring txtRemovingDirectory; + wxString txtRemovingFile; + wxString txtRemovingSymlink; + wxString txtRemovingDirectory; bool cleanedUp; }; @@ -424,32 +436,33 @@ DeletionHandling::DeletionHandling(DeletionPolicy handleDel, cleanedUp(false) { #ifdef FFS_WIN - if (deletionType == MOVE_TO_RECYCLE_BIN && recycleBinStatus(baseDir) != STATUS_REC_EXISTS) + if (baseDir.empty() || + (deletionType == MOVE_TO_RECYCLE_BIN && recycleBinStatus(baseDir) != STATUS_REC_EXISTS)) deletionType = DELETE_PERMANENTLY; //Windows' ::SHFileOperation() will do this anyway, but we have a better and faster deletion routine (e.g. on networks) #endif switch (deletionType) { case DELETE_PERMANENTLY: - txtRemovingFile = toZ(_("Deleting file %x")).Replace(Zstr("%x"), Zstr("\n\"%x\""), false); - txtRemovingSymlink = toZ(_("Deleting Symbolic Link %x")).Replace(Zstr("%x"), Zstr("\n\"%x\""), false); - txtRemovingDirectory = toZ(_("Deleting folder %x")).Replace( Zstr("%x"), Zstr("\n\"%x\""), false); + txtRemovingFile = replaceCpy(_("Deleting file %x" ), L"%x", L"\n\"%x\"", false); + txtRemovingDirectory = replaceCpy(_("Deleting folder %x" ), L"%x", L"\n\"%x\"", false); + txtRemovingSymlink = replaceCpy(_("Deleting symbolic link %x"), L"%x", L"\n\"%x\"", false); break; case MOVE_TO_RECYCLE_BIN: sessionDelDir = getSessionDeletionDir(baseDir_, Zstr("FFS ")); - txtRemovingFile = - txtRemovingSymlink = - txtRemovingDirectory = toZ(_("Moving %x to Recycle Bin")).Replace(Zstr("%x"), Zstr("\"%x\""), false); + txtRemovingFile = replaceCpy(_("Moving file %x to recycle bin" ), L"%x", L"\n\"%x\"", false); + txtRemovingDirectory = replaceCpy(_("Moving folder %x to recycle bin" ), L"%x", L"\n\"%x\"", false); + txtRemovingSymlink = replaceCpy(_("Moving symbolic link %x to recycle bin"), L"%x", L"\n\"%x\"", false); break; case MOVE_TO_CUSTOM_DIRECTORY: sessionDelDir = getSessionDeletionDir(custDelFolder); - txtRemovingFile = toZ(_("Moving file %x to user-defined directory %y")). Replace(Zstr("%x"), Zstr("\"%x\"\n"), false).Replace(Zstr("%y"), Zstring(Zstr("\"")) + custDelFolder + Zstr("\""), false); - txtRemovingDirectory = toZ(_("Moving folder %x to user-defined directory %y")). Replace(Zstr("%x"), Zstr("\"%x\"\n"), false).Replace(Zstr("%y"), Zstring(Zstr("\"")) + custDelFolder + Zstr("\""), false); - txtRemovingSymlink = toZ(_("Moving Symbolic Link %x to user-defined directory %y")).Replace(Zstr("%x"), Zstr("\"%x\"\n"), false).Replace(Zstr("%y"), Zstring(Zstr("\"")) + custDelFolder + Zstr("\""), false); + txtRemovingFile = replaceCpy(replaceCpy(_("Moving file %x to %y" ), L"%x", L"\n\"%x\"", false), L"%y", L"\"" + utf8CvrtTo<wxString>(custDelFolder) + L"\"", false); + txtRemovingDirectory = replaceCpy(replaceCpy(_("Moving folder %x to %y" ), L"%x", L"\n\"%x\"", false), L"%y", L"\"" + utf8CvrtTo<wxString>(custDelFolder) + L"\"", false); + txtRemovingSymlink = replaceCpy(replaceCpy(_("Moving symbolic link %x to %y"), L"%x", L"\n\"%x\"", false), L"%y", L"\"" + utf8CvrtTo<wxString>(custDelFolder) + L"\"", false); break; } } @@ -494,15 +507,20 @@ private: struct CallbackRemoveDirImpl : public CallbackRemoveDir { - CallbackRemoveDirImpl(ProcessCallback& handler) : statusHandler_(handler) {} + CallbackRemoveDirImpl(const DeletionHandling& delHandling) : delHandling_(delHandling) {} - virtual void notifyDeletion(const Zstring& currentObject) + virtual void notifyFileDeletion(const Zstring& filename) { - statusHandler_.requestUiRefresh(); //exceptions may be thrown here! + delHandling_.procCallback_->reportStatus(replaceCpy(delHandling_.getTxtRemovingFile(), L"%x", utf8CvrtTo<wxString>(filename))); + } + + virtual void notifyDirDeletion(const Zstring& dirname) + { + delHandling_.procCallback_->reportStatus(replaceCpy(delHandling_.getTxtRemovingDir(), L"%x", utf8CvrtTo<wxString>(dirname))); } private: - ProcessCallback& statusHandler_; + const DeletionHandling& delHandling_; }; } @@ -525,17 +543,16 @@ void DeletionHandling::removeFile(const Zstring& relativeName) const try //rename file: no copying!!! { - if (!dirExistsUpdating(targetDir, *procCallback_)) + if (!dirExists(targetDir)) //no reason to update gui or overwrite status text! createDirectory(targetDir); //throw FileError -> may legitimately fail on Linux if permissions are missing //performance optimization!! Instead of moving each object into recycle bin separately, we rename them ony by one into a //temporary directory and delete this directory only ONCE! - renameFile(fullName, targetFile); //throw (FileError); + renameFile(fullName, targetFile); //throw FileError } - catch (...) + catch (FileError&) //if anything went wrong, move to recycle bin the standard way (single file processing: slow) { - //if anything went wrong, move to recycle bin the standard way (single file processing: slow) - moveToRecycleBin(fullName); //throw (FileError) + moveToRecycleBin(fullName); //throw FileError } } break; @@ -546,8 +563,8 @@ void DeletionHandling::removeFile(const Zstring& relativeName) const const Zstring targetFile = sessionDelDir + relativeName; //altDeletionDir ends with path separator const Zstring targetDir = targetFile.BeforeLast(FILE_NAME_SEPARATOR); - if (!dirExistsUpdating(targetDir, *procCallback_)) - createDirectory(targetDir); //throw (FileError) + if (!dirExists(targetDir)) + createDirectory(targetDir); //throw FileError CallbackMoveFileImpl callBack(*procCallback_); //if file needs to be copied we need callback functionality to update screen and offer abort moveFile(fullName, targetFile, true, &callBack); @@ -565,43 +582,41 @@ void DeletionHandling::removeFolder(const Zstring& relativeName) const { case DELETE_PERMANENTLY: { - CallbackRemoveDirImpl remDirCallback(*procCallback_); + CallbackRemoveDirImpl remDirCallback(*this); removeDirectory(fullName, &remDirCallback); } break; case MOVE_TO_RECYCLE_BIN: - if (dirExistsUpdating(fullName, *procCallback_)) + if (dirExists(fullName)) { const Zstring targetDir = sessionDelDir + relativeName; const Zstring targetSuperDir = targetDir.BeforeLast(FILE_NAME_SEPARATOR); try //rename directory: no copying!!! { - if (!dirExistsUpdating(targetSuperDir, *procCallback_)) + if (!dirExists(targetSuperDir)) createDirectory(targetSuperDir); //throw FileError -> may legitimately fail on Linux if permissions are missing - //performance optimization!! Instead of moving each object into recycle bin separately, we rename them ony by one into a + //performance optimization!! Instead of moving each object into recycle bin separately, we rename them one by one into a //temporary directory and delete this directory only ONCE! - renameFile(fullName, targetDir); //throw (FileError); + renameFile(fullName, targetDir); //throw FileError } - catch (...) + catch (FileError&) //if anything went wrong, move to recycle bin the standard way (single file processing: slow) { - //if anything went wrong, move to recycle bin the standard way (single file processing: slow) - moveToRecycleBin(fullName); //throw (FileError) - + moveToRecycleBin(fullName); //throw FileError } } break; case MOVE_TO_CUSTOM_DIRECTORY: - if (dirExistsUpdating(fullName, *procCallback_)) + if (dirExists(fullName)) { const Zstring targetDir = sessionDelDir + relativeName; const Zstring targetSuperDir = targetDir.BeforeLast(FILE_NAME_SEPARATOR); - if (!dirExistsUpdating(targetSuperDir, *procCallback_)) - createDirectory(targetSuperDir); //throw (FileError) + if (!dirExists(targetSuperDir)) + createDirectory(targetSuperDir); //throw FileError CallbackMoveFileImpl callBack(*procCallback_); //if files need to be copied, we need callback functionality to update screen and offer abort moveDirectory(fullName, targetDir, true, &callBack); @@ -659,7 +674,7 @@ private: //don't process directories //process files - for (HierarchyObject::SubFileMapping::const_iterator i = hierObj.refSubFiles().begin(); i != hierObj.refSubFiles().end(); ++i) + for (auto i = hierObj.refSubFiles().begin(); i != hierObj.refSubFiles().end(); ++i) switch (i->getSyncOperation()) //evaluate comparison result and sync direction { case SO_CREATE_NEW_LEFT: @@ -792,14 +807,13 @@ public: verifyCopiedFiles(syncProc.verifyCopiedFiles_), copyFilePermissions(syncProc.copyFilePermissions_), transactionalFileCopy(syncProc.transactionalFileCopy_), - txtCopyingFile (toZ(_("Copying new file %x to %y")). Replace(Zstr("%x"), Zstr("\"%x\""), false).Replace(Zstr("%y"), Zstr("\n\"%y\""), false)), - txtCopyingLink (toZ(_("Copying new Symbolic Link %x to %y")).Replace(Zstr("%x"), Zstr("\"%x\""), false).Replace(Zstr("%y"), Zstr("\n\"%y\""), false)), - txtOverwritingFile(toZ(_("Overwriting file %x in %y")). Replace(Zstr("%x"), Zstr("\"%x\""), false).Replace(Zstr("%y"), Zstr("\n\"%y\""), false)), - txtOverwritingLink(toZ(_("Overwriting Symbolic Link %x in %y")).Replace(Zstr("%x"), Zstr("\"%x\""), false).Replace(Zstr("%y"), Zstr("\n\"%y\""), false)), - txtCreatingFolder (toZ(_("Creating folder %x")).Replace(Zstr("%x"), Zstr("\n\"%x\""), false)), - txtVerifying (toZ(_("Verifying file %x")). Replace(Zstr("%x"), Zstr("\n\"%x\""), false)), - txtWritingAttributes(toZ(_("Updating attributes of %x")).Replace(Zstr("%x"), Zstr("\n\"%x\""), false)) {} - + txtCreatingFile (replaceCpy(_("Creating file %x" ), L"%x", L"\n\"%x\"", false)), + txtCreatingLink (replaceCpy(_("Creating symbolic link %x" ), L"%x", L"\n\"%x\"", false)), + txtCreatingFolder (replaceCpy(_("Creating folder %x" ), L"%x", L"\n\"%x\"", false)), + txtOverwritingFile (replaceCpy(_("Overwriting file %x" ), L"%x", L"\n\"%x\"", false)), + txtOverwritingLink (replaceCpy(_("Overwriting symbolic link %x"), L"%x", L"\n\"%x\"", false)), + txtVerifying (replaceCpy(_("Verifying file %x" ), L"%x", L"\n\"%x\"", false)), + txtWritingAttributes(replaceCpy(_("Updating attributes of %x" ), L"%x", L"\n\"%x\"", false)) {} void startSync(BaseDirMapping& baseMap) { @@ -825,9 +839,8 @@ private: //more low level helper template <zen::SelectedSide side> void deleteSymlink(const SymLinkMapping& linkObj) const; - void copySymlink(const Zstring& source, const Zstring& target, LinkDescriptor::LinkType type, bool inRecursion = false) const; - template <class DelTargetCommand> - void copyFileUpdating(const Zstring& source, const Zstring& target, const DelTargetCommand& cmd, zen::UInt64 sourceFileSize, int recursionLvl = 0) const; + template <SelectedSide side, class DelTargetCommand> + void copyFileUpdatingTo(const FileMapping& fileObj, const DelTargetCommand& cmd, FileDescriptor& sourceAttr) const; void verifyFileCopy(const Zstring& source, const Zstring& target) const; ProcessCallback& procCallback_; @@ -842,13 +855,13 @@ private: const bool transactionalFileCopy; //preload status texts - const Zstring txtCopyingFile; - const Zstring txtCopyingLink; - const Zstring txtOverwritingFile; - const Zstring txtOverwritingLink; - const Zstring txtCreatingFolder; - const Zstring txtVerifying; - const Zstring txtWritingAttributes; + const wxString txtCreatingFile; + const wxString txtCreatingLink; + const wxString txtCreatingFolder; + const wxString txtOverwritingFile; + const wxString txtOverwritingLink; + const wxString txtVerifying; + const wxString txtWritingAttributes; }; @@ -885,7 +898,7 @@ void SynchronizeFolderPair::execute(HierarchyObject& hierObj) void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const { - Zstring statusText; + wxString logText; Zstring target; switch (fileObj.getSyncOperation()) //evaluate comparison result and sync direction @@ -893,103 +906,146 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const case SO_CREATE_NEW_LEFT: target = fileObj.getBaseDirPf<LEFT_SIDE>() + fileObj.getRelativeName<RIGHT_SIDE>(); //can't use "getFullName" as target is not yet existing - statusText = txtCopyingFile; - statusText.Replace(Zstr("%x"), fileObj.getShortName<RIGHT_SIDE>(), false); - statusText.Replace(Zstr("%y"), target.BeforeLast(FILE_NAME_SEPARATOR), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = txtCreatingFile; + replace(logText, L"%x", utf8CvrtTo<wxString>(target)); + procCallback_.reportInfo(logText); - copyFileUpdating(fileObj.getFullName<RIGHT_SIDE>(), target, - []() {}, //no target to delete - fileObj.getFileSize<RIGHT_SIDE>()); + try + { + FileDescriptor sourceAttr; + copyFileUpdatingTo<LEFT_SIDE>(fileObj, + []() {}, //no target to delete + sourceAttr); + + fileObj.copyTo<LEFT_SIDE>(&sourceAttr); //update FileMapping + } + catch (FileError&) + { + if (fileExists(fileObj.getFullName<RIGHT_SIDE>())) + throw; + //source deleted meanwhile... + procCallback_.updateProcessedData(0, to<zen::Int64>(fileObj.getFileSize<RIGHT_SIDE>())); + fileObj.removeObject<RIGHT_SIDE>(); + } break; case SO_CREATE_NEW_RIGHT: target = fileObj.getBaseDirPf<RIGHT_SIDE>() + fileObj.getRelativeName<LEFT_SIDE>(); - statusText = txtCopyingFile; - statusText.Replace(Zstr("%x"), fileObj.getShortName<LEFT_SIDE>(), false); - statusText.Replace(Zstr("%y"), target.BeforeLast(FILE_NAME_SEPARATOR), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = txtCreatingFile; + replace(logText, L"%x", utf8CvrtTo<wxString>(target)); + procCallback_.reportInfo(logText); + + try + { + FileDescriptor sourceAttr; + copyFileUpdatingTo<RIGHT_SIDE>(fileObj, + []() {}, //no target to delete + sourceAttr); - copyFileUpdating(fileObj.getFullName<LEFT_SIDE>(), target, - []() {}, //no target to delete - fileObj.getFileSize<LEFT_SIDE>()); + fileObj.copyTo<RIGHT_SIDE>(&sourceAttr); //update FileMapping + } + catch (FileError&) + { + if (fileExists(fileObj.getFullName<LEFT_SIDE>())) + throw; + //source deleted meanwhile... + procCallback_.updateProcessedData(0, to<zen::Int64>(fileObj.getFileSize<LEFT_SIDE>())); + fileObj.removeObject<LEFT_SIDE>(); + } break; case SO_DELETE_LEFT: - statusText = delHandlingLeft_.getTxtRemovingFile(); - statusText.Replace(Zstr("%x"), fileObj.getFullName<LEFT_SIDE>(), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = replaceCpy(delHandlingLeft_.getTxtRemovingFile(), L"%x", utf8CvrtTo<wxString>(fileObj.getFullName<LEFT_SIDE>())); + procCallback_.reportInfo(logText); - delHandlingLeft_.removeFile(fileObj.getObjRelativeName()); //throw (FileError) + delHandlingLeft_.removeFile(fileObj.getObjRelativeName()); //throw FileError + fileObj.removeObject<LEFT_SIDE>(); //update FileMapping break; case SO_DELETE_RIGHT: - statusText = delHandlingRight_.getTxtRemovingFile(); - statusText.Replace(Zstr("%x"), fileObj.getFullName<RIGHT_SIDE>(), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = replaceCpy(delHandlingRight_.getTxtRemovingFile(), L"%x", utf8CvrtTo<wxString>(fileObj.getFullName<RIGHT_SIDE>())); + procCallback_.reportInfo(logText); - delHandlingRight_.removeFile(fileObj.getObjRelativeName()); //throw (FileError) + delHandlingRight_.removeFile(fileObj.getObjRelativeName()); //throw FileError + fileObj.removeObject<RIGHT_SIDE>(); //update FileMapping break; case SO_OVERWRITE_LEFT: + { target = fileObj.getBaseDirPf<LEFT_SIDE>() + fileObj.getRelativeName<RIGHT_SIDE>(); //respect differences in case of source object - statusText = txtOverwritingFile; - statusText.Replace(Zstr("%x"), fileObj.getShortName<RIGHT_SIDE>(), false); - statusText.Replace(Zstr("%y"), fileObj.getFullName<LEFT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = txtOverwritingFile; + replace(logText, L"%x", utf8CvrtTo<wxString>(target)); + procCallback_.reportInfo(logText); - copyFileUpdating(fileObj.getFullName<RIGHT_SIDE>(), target, - [&]() //delete target at appropriate time + FileDescriptor sourceAttr; + copyFileUpdatingTo<LEFT_SIDE>(fileObj, + [&]() //delete target at appropriate time { - delHandlingLeft_.removeFile(fileObj.getObjRelativeName()); //throw (FileError) + procCallback_.reportStatus(replaceCpy(delHandlingLeft_.getTxtRemovingFile(), L"%x", utf8CvrtTo<wxString>(fileObj.getFullName<LEFT_SIDE>()))); + + delHandlingLeft_.removeFile(fileObj.getObjRelativeName()); //throw FileError fileObj.removeObject<LEFT_SIDE>(); //remove file from FileMapping, to keep in sync (if subsequent copying fails!!) - }, - fileObj.getFileSize<RIGHT_SIDE>()); - break; + + procCallback_.reportStatus(logText); //restore status text copy file + }, sourceAttr); + + fileObj.copyTo<LEFT_SIDE>(&sourceAttr); //update FileMapping + } + break; case SO_OVERWRITE_RIGHT: + { target = fileObj.getBaseDirPf<RIGHT_SIDE>() + fileObj.getRelativeName<LEFT_SIDE>(); //respect differences in case of source object - statusText = txtOverwritingFile; - statusText.Replace(Zstr("%x"), fileObj.getShortName<LEFT_SIDE>(), false); - statusText.Replace(Zstr("%y"), fileObj.getFullName<RIGHT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = txtOverwritingFile; + replace(logText, L"%x", utf8CvrtTo<wxString>(target)); + procCallback_.reportInfo(logText); - copyFileUpdating(fileObj.getFullName<LEFT_SIDE>(), target, - [&]() //delete target at appropriate time + FileDescriptor sourceAttr; + copyFileUpdatingTo<RIGHT_SIDE>(fileObj, + [&]() //delete target at appropriate time { - delHandlingRight_.removeFile(fileObj.getObjRelativeName()); //throw (FileError) + procCallback_.reportStatus(replaceCpy(delHandlingRight_.getTxtRemovingFile(), L"%x", utf8CvrtTo<wxString>(fileObj.getFullName<RIGHT_SIDE>()))); + + delHandlingRight_.removeFile(fileObj.getObjRelativeName()); //throw FileError fileObj.removeObject<RIGHT_SIDE>(); //remove file from FileMapping, to keep in sync (if subsequent copying fails!!) - }, - fileObj.getFileSize<LEFT_SIDE>()); - break; + + procCallback_.reportStatus(logText); //restore status text copy file + }, sourceAttr); + + fileObj.copyTo<RIGHT_SIDE>(&sourceAttr); //update FileMapping + } + break; case SO_COPY_METADATA_TO_LEFT: - statusText = txtWritingAttributes; - statusText.Replace(Zstr("%x"), fileObj.getFullName<LEFT_SIDE>(), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = replaceCpy(txtWritingAttributes, L"%x", utf8CvrtTo<wxString>(fileObj.getFullName<LEFT_SIDE>())); + procCallback_.reportInfo(logText); if (fileObj.getShortName<LEFT_SIDE>() != fileObj.getShortName<RIGHT_SIDE>()) //adapt difference in case (windows only) renameFile(fileObj.getFullName<LEFT_SIDE>(), - fileObj.getFullName<LEFT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR + fileObj.getShortName<RIGHT_SIDE>()); //throw (FileError); + fileObj.getFullName<LEFT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR + fileObj.getShortName<RIGHT_SIDE>()); //throw FileError; - if (!sameFileTime(fileObj.getLastWriteTime<LEFT_SIDE>(), fileObj.getLastWriteTime<RIGHT_SIDE>(), 2)) ////respect 2 second FAT/FAT32 precision - copyFileTimes(fileObj.getFullName<RIGHT_SIDE>(), fileObj.getFullName<LEFT_SIDE>(), true); //deref symlinks; throw (FileError) + if (!sameFileTime(fileObj.getLastWriteTime<LEFT_SIDE>(), fileObj.getLastWriteTime<RIGHT_SIDE>(), 2)) //respect 2 second FAT/FAT32 precision + setFileTime(fileObj.getFullName<LEFT_SIDE>(), fileObj.getLastWriteTime<RIGHT_SIDE>(), SYMLINK_FOLLOW); //throw FileError + //do NOT read *current* source file time, but use buffered value which corresponds to time of comparison! + + fileObj.copyTo<LEFT_SIDE>(NULL); //-> both sides *should* be completely equal now... break; case SO_COPY_METADATA_TO_RIGHT: - statusText = txtWritingAttributes; - statusText.Replace(Zstr("%x"), fileObj.getFullName<RIGHT_SIDE>(), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = replaceCpy(txtWritingAttributes, L"%x", utf8CvrtTo<wxString>(fileObj.getFullName<RIGHT_SIDE>())); + procCallback_.reportInfo(logText); if (fileObj.getShortName<LEFT_SIDE>() != fileObj.getShortName<RIGHT_SIDE>()) //adapt difference in case (windows only) renameFile(fileObj.getFullName<RIGHT_SIDE>(), - fileObj.getFullName<RIGHT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR + fileObj.getShortName<LEFT_SIDE>()); //throw (FileError); + fileObj.getFullName<RIGHT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR + fileObj.getShortName<LEFT_SIDE>()); //throw FileError; + + if (!sameFileTime(fileObj.getLastWriteTime<LEFT_SIDE>(), fileObj.getLastWriteTime<RIGHT_SIDE>(), 2)) //respect 2 second FAT/FAT32 precision + setFileTime(fileObj.getFullName<RIGHT_SIDE>(), fileObj.getLastWriteTime<LEFT_SIDE>(), SYMLINK_FOLLOW); //throw FileError - if (!sameFileTime(fileObj.getLastWriteTime<LEFT_SIDE>(), fileObj.getLastWriteTime<RIGHT_SIDE>(), 2)) ////respect 2 second FAT/FAT32 precision - copyFileTimes(fileObj.getFullName<LEFT_SIDE>(), fileObj.getFullName<RIGHT_SIDE>(), true); //deref symlinks; throw (FileError) + fileObj.copyTo<RIGHT_SIDE>(NULL); //-> both sides *should* be completely equal now... break; case SO_DO_NOTHING: @@ -998,9 +1054,6 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const return; //no update on processed data! } - //update FileMapping - fileObj.synchronizeSides(); - //progress indicator update //indicator is updated only if file is sync'ed correctly (and if some sync was done)! procCallback_.updateProcessedData(1, 0); //processed data is communicated in subfunctions! @@ -1010,7 +1063,7 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const { - Zstring statusText; + wxString logText; Zstring target; switch (linkObj.getSyncOperation()) //evaluate comparison result and sync direction @@ -1018,93 +1071,125 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const case SO_CREATE_NEW_LEFT: target = linkObj.getBaseDirPf<LEFT_SIDE>() + linkObj.getRelativeName<RIGHT_SIDE>(); - statusText = txtCopyingLink; - statusText.Replace(Zstr("%x"), linkObj.getShortName<RIGHT_SIDE>(), false); - statusText.Replace(Zstr("%y"), target.BeforeLast(FILE_NAME_SEPARATOR), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = txtCreatingLink; + replace(logText, L"%x", utf8CvrtTo<wxString>(target)); + procCallback_.reportInfo(logText); + + try + { + zen::copySymlink(linkObj.getFullName<RIGHT_SIDE>(), target, copyFilePermissions); //throw FileError - copySymlink(linkObj.getFullName<RIGHT_SIDE>(), target, linkObj.getLinkType<RIGHT_SIDE>()); + linkObj.copyTo<LEFT_SIDE>(); //update SymLinkMapping + } + catch (FileError&) + { + if (fileExists(linkObj.getFullName<RIGHT_SIDE>())) + throw; + //source deleted meanwhile... + linkObj.removeObject<RIGHT_SIDE>(); + } break; case SO_CREATE_NEW_RIGHT: target = linkObj.getBaseDirPf<RIGHT_SIDE>() + linkObj.getRelativeName<LEFT_SIDE>(); - statusText = txtCopyingLink; - statusText.Replace(Zstr("%x"), linkObj.getShortName<LEFT_SIDE>(), false); - statusText.Replace(Zstr("%y"), target.BeforeLast(FILE_NAME_SEPARATOR), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = txtCreatingLink; + replace(logText, L"%x", utf8CvrtTo<wxString>(target)); + procCallback_.reportInfo(logText); + + try + { + zen::copySymlink(linkObj.getFullName<LEFT_SIDE>(), target, copyFilePermissions); //throw FileError - copySymlink(linkObj.getFullName<LEFT_SIDE>(), target, linkObj.getLinkType<LEFT_SIDE>()); + linkObj.copyTo<RIGHT_SIDE>(); //update SymLinkMapping + } + catch (FileError&) + { + if (fileExists(linkObj.getFullName<LEFT_SIDE>())) + throw; + //source deleted meanwhile... + linkObj.removeObject<LEFT_SIDE>(); + } break; case SO_DELETE_LEFT: - statusText = delHandlingLeft_.getTxtRemovingSymLink(); - statusText.Replace(Zstr("%x"), linkObj.getFullName<LEFT_SIDE>(), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = replaceCpy(delHandlingLeft_.getTxtRemovingSymLink(), L"%x", utf8CvrtTo<wxString>(linkObj.getFullName<LEFT_SIDE>())); + procCallback_.reportInfo(logText); + + deleteSymlink<LEFT_SIDE>(linkObj); //throw FileError - deleteSymlink<LEFT_SIDE>(linkObj); //throw (FileError) + linkObj.removeObject<LEFT_SIDE>(); //update SymLinkMapping break; case SO_DELETE_RIGHT: - statusText = delHandlingRight_.getTxtRemovingSymLink(); - statusText.Replace(Zstr("%x"), linkObj.getFullName<RIGHT_SIDE>(), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = replaceCpy(delHandlingRight_.getTxtRemovingSymLink(), L"%x", utf8CvrtTo<wxString>(linkObj.getFullName<RIGHT_SIDE>())); + procCallback_.reportInfo(logText); - deleteSymlink<RIGHT_SIDE>(linkObj); //throw (FileError) + deleteSymlink<RIGHT_SIDE>(linkObj); //throw FileError + + linkObj.removeObject<RIGHT_SIDE>(); //update SymLinkMapping break; case SO_OVERWRITE_LEFT: target = linkObj.getBaseDirPf<LEFT_SIDE>() + linkObj.getRelativeName<RIGHT_SIDE>(); //respect differences in case of source object - statusText = txtOverwritingLink; - statusText.Replace(Zstr("%x"), linkObj.getShortName<RIGHT_SIDE>(), false); - statusText.Replace(Zstr("%y"), linkObj.getFullName<LEFT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = txtOverwritingLink; + replace(logText, L"%x", utf8CvrtTo<wxString>(target)); + procCallback_.reportInfo(logText); - deleteSymlink<LEFT_SIDE>(linkObj); //throw (FileError) + procCallback_.reportStatus(replaceCpy(delHandlingLeft_.getTxtRemovingSymLink(), L"%x", utf8CvrtTo<wxString>(linkObj.getFullName<LEFT_SIDE>()))); + deleteSymlink<LEFT_SIDE>(linkObj); //throw FileError linkObj.removeObject<LEFT_SIDE>(); //remove file from FileMapping, to keep in sync (if subsequent copying fails!!) - copySymlink(linkObj.getFullName<RIGHT_SIDE>(), target, linkObj.getLinkType<RIGHT_SIDE>()); + procCallback_.reportStatus(logText); //restore status text + zen::copySymlink(linkObj.getFullName<RIGHT_SIDE>(), target, copyFilePermissions); //throw FileError + + linkObj.copyTo<LEFT_SIDE>(); //update SymLinkMapping break; case SO_OVERWRITE_RIGHT: target = linkObj.getBaseDirPf<RIGHT_SIDE>() + linkObj.getRelativeName<LEFT_SIDE>(); //respect differences in case of source object - statusText = txtOverwritingLink; - statusText.Replace(Zstr("%x"), linkObj.getShortName<LEFT_SIDE>(), false); - statusText.Replace(Zstr("%y"), linkObj.getFullName<RIGHT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = txtOverwritingLink; + replace(logText, L"%x", utf8CvrtTo<wxString>(target)); + procCallback_.reportInfo(logText); - deleteSymlink<RIGHT_SIDE>(linkObj); //throw (FileError) + procCallback_.reportStatus(replaceCpy(delHandlingRight_.getTxtRemovingSymLink(), L"%x", utf8CvrtTo<wxString>(linkObj.getFullName<RIGHT_SIDE>()))); + deleteSymlink<RIGHT_SIDE>(linkObj); //throw FileError linkObj.removeObject<RIGHT_SIDE>(); //remove file from FileMapping, to keep in sync (if subsequent copying fails!!) - copySymlink(linkObj.getFullName<LEFT_SIDE>(), target, linkObj.getLinkType<LEFT_SIDE>()); + procCallback_.reportStatus(logText); //restore status text + zen::copySymlink(linkObj.getFullName<LEFT_SIDE>(), target, copyFilePermissions); //throw FileError + + linkObj.copyTo<RIGHT_SIDE>(); //update SymLinkMapping break; case SO_COPY_METADATA_TO_LEFT: - statusText = txtWritingAttributes; - statusText.Replace(Zstr("%x"), linkObj.getFullName<LEFT_SIDE>(), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = replaceCpy(txtWritingAttributes, L"%x", utf8CvrtTo<wxString>(linkObj.getFullName<LEFT_SIDE>())); + procCallback_.reportInfo(logText); if (linkObj.getShortName<LEFT_SIDE>() != linkObj.getShortName<RIGHT_SIDE>()) //adapt difference in case (windows only) renameFile(linkObj.getFullName<LEFT_SIDE>(), - linkObj.getFullName<LEFT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR + linkObj.getShortName<RIGHT_SIDE>()); //throw (FileError); + linkObj.getFullName<LEFT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR + linkObj.getShortName<RIGHT_SIDE>()); //throw FileError; + + if (!sameFileTime(linkObj.getLastWriteTime<LEFT_SIDE>(), linkObj.getLastWriteTime<RIGHT_SIDE>(), 2)) //respect 2 second FAT/FAT32 precision + setFileTime(linkObj.getFullName<LEFT_SIDE>(), linkObj.getLastWriteTime<RIGHT_SIDE>(), SYMLINK_DIRECT); //throw FileError - if (!sameFileTime(linkObj.getLastWriteTime<LEFT_SIDE>(), linkObj.getLastWriteTime<RIGHT_SIDE>(), 2)) ////respect 2 second FAT/FAT32 precision - copyFileTimes(linkObj.getFullName<RIGHT_SIDE>(), linkObj.getFullName<LEFT_SIDE>(), false); //don't deref symlinks; throw (FileError) + linkObj.copyTo<LEFT_SIDE>(); //-> both sides *should* be completely equal now... break; case SO_COPY_METADATA_TO_RIGHT: - statusText = txtWritingAttributes; - statusText.Replace(Zstr("%x"), linkObj.getFullName<RIGHT_SIDE>(), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = replaceCpy(txtWritingAttributes, L"%x", utf8CvrtTo<wxString>(linkObj.getFullName<RIGHT_SIDE>())); + procCallback_.reportInfo(logText); if (linkObj.getShortName<LEFT_SIDE>() != linkObj.getShortName<RIGHT_SIDE>()) //adapt difference in case (windows only) renameFile(linkObj.getFullName<RIGHT_SIDE>(), - linkObj.getFullName<RIGHT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR + linkObj.getShortName<LEFT_SIDE>()); //throw (FileError); + linkObj.getFullName<RIGHT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR + linkObj.getShortName<LEFT_SIDE>()); //throw FileError; - if (!sameFileTime(linkObj.getLastWriteTime<LEFT_SIDE>(), linkObj.getLastWriteTime<RIGHT_SIDE>(), 2)) ////respect 2 second FAT/FAT32 precision - copyFileTimes(linkObj.getFullName<LEFT_SIDE>(), linkObj.getFullName<RIGHT_SIDE>(), false); //don't deref symlinks; throw (FileError) + if (!sameFileTime(linkObj.getLastWriteTime<LEFT_SIDE>(), linkObj.getLastWriteTime<RIGHT_SIDE>(), 2)) //respect 2 second FAT/FAT32 precision + setFileTime(linkObj.getFullName<RIGHT_SIDE>(), linkObj.getLastWriteTime<LEFT_SIDE>(), SYMLINK_DIRECT); //throw FileError + + linkObj.copyTo<RIGHT_SIDE>(); //-> both sides *should* be completely equal now... break; case SO_DO_NOTHING: @@ -1113,9 +1198,6 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const return; //no update on processed data! } - //update FileMapping - linkObj.synchronizeSides(); - //progress indicator update //indicator is updated only if file is sync'ed correctly (and if some sync was done)! procCallback_.updateProcessedData(1, 0); //processed data is communicated in subfunctions! @@ -1125,67 +1207,92 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const { - Zstring statusText; + wxString logText; Zstring target; //synchronize folders: switch (dirObj.getSyncOperation()) //evaluate comparison result and sync direction { case SO_CREATE_NEW_LEFT: - target = dirObj.getBaseDirPf<LEFT_SIDE>() + dirObj.getRelativeName<RIGHT_SIDE>(); + //some check to catch the error that directory on source has been deleted externally after "compare"... + if (!dirExists(dirObj.getFullName<RIGHT_SIDE>())) + { + // throw FileError(_ ("Source directory does not exist anymore:") + "\n\"" + dirObj.getFullName<RIGHT_SIDE>() + "\""); + const SyncStatistics subObjects(dirObj); //DON'T forget to notify about implicitly deleted objects! + procCallback_.updateProcessedData(subObjects.getCreate() + subObjects.getOverwrite() + subObjects.getDelete(), to<zen::Int64>(subObjects.getDataToProcess())); + + dirObj.refSubFiles().clear(); //...then remove sub-objects + dirObj.refSubLinks().clear(); // + dirObj.refSubDirs ().clear(); // + dirObj.removeObject<RIGHT_SIDE>(); + } + else + { + target = dirObj.getBaseDirPf<LEFT_SIDE>() + dirObj.getRelativeName<RIGHT_SIDE>(); - statusText = txtCreatingFolder; - statusText.Replace(Zstr("%x"), target, false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = replaceCpy(txtCreatingFolder, L"%x", utf8CvrtTo<wxString>(target)); + procCallback_.reportInfo(logText); - //some check to catch the error that directory on source has been deleted externally after "compare"... - if (!dirExistsUpdating(dirObj.getFullName<RIGHT_SIDE>(), procCallback_)) - throw FileError(_("Source directory does not exist anymore:") + "\n\"" + dirObj.getFullName<RIGHT_SIDE>() + "\""); - createDirectory(target, dirObj.getFullName<RIGHT_SIDE>(), copyFilePermissions); //no symlink copying! + createDirectory(target, dirObj.getFullName<RIGHT_SIDE>(), copyFilePermissions); //no symlink copying! + dirObj.copyTo<LEFT_SIDE>(); //update DirMapping + } break; case SO_CREATE_NEW_RIGHT: - target = dirObj.getBaseDirPf<RIGHT_SIDE>() + dirObj.getRelativeName<LEFT_SIDE>(); + //some check to catch the error that directory on source has been deleted externally after "compare"... + if (!dirExists(dirObj.getFullName<LEFT_SIDE>())) + { + //throw FileError(_ ("Source directory does not exist anymore:") + "\n\"" + dirObj.getFullName<LEFT_SIDE>() + "\""); + const SyncStatistics subObjects(dirObj); //DON'T forget to notify about implicitly deleted objects! + procCallback_.updateProcessedData(subObjects.getCreate() + subObjects.getOverwrite() + subObjects.getDelete(), to<zen::Int64>(subObjects.getDataToProcess())); - statusText = txtCreatingFolder; - statusText.Replace(Zstr("%x"), target, false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + dirObj.refSubFiles().clear(); //...then remove sub-objects + dirObj.refSubLinks().clear(); // + dirObj.refSubDirs ().clear(); // + dirObj.removeObject<LEFT_SIDE>(); + } + else + { + target = dirObj.getBaseDirPf<RIGHT_SIDE>() + dirObj.getRelativeName<LEFT_SIDE>(); - //some check to catch the error that directory on source has been deleted externally after "compare"... - if (!dirExistsUpdating(dirObj.getFullName<LEFT_SIDE>(), procCallback_)) - throw FileError(_("Source directory does not exist anymore:") + "\n\"" + dirObj.getFullName<LEFT_SIDE>() + "\""); - createDirectory(target, dirObj.getFullName<LEFT_SIDE>(), copyFilePermissions); //no symlink copying! + logText = replaceCpy(txtCreatingFolder, L"%x", utf8CvrtTo<wxString>(target)); + procCallback_.reportInfo(logText); + + createDirectory(target, dirObj.getFullName<LEFT_SIDE>(), copyFilePermissions); //no symlink copying! + dirObj.copyTo<RIGHT_SIDE>(); //update DirMapping + } break; case SO_COPY_METADATA_TO_LEFT: - statusText = txtWritingAttributes; - statusText.Replace(Zstr("%x"), dirObj.getFullName<LEFT_SIDE>(), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = replaceCpy(txtWritingAttributes, L"%x", utf8CvrtTo<wxString>(dirObj.getFullName<LEFT_SIDE>())); + procCallback_.reportInfo(logText); if (dirObj.getShortName<LEFT_SIDE>() != dirObj.getShortName<RIGHT_SIDE>()) //adapt difference in case (windows only) renameFile(dirObj.getFullName<LEFT_SIDE>(), - dirObj.getFullName<LEFT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR + dirObj.getShortName<RIGHT_SIDE>()); //throw (FileError); - //copyFileTimes(dirObj.getFullName<RIGHT_SIDE>(), dirObj.getFullName<LEFT_SIDE>(), true); //throw (FileError) -> is executed after sub-objects have finished synchronization + dirObj.getFullName<LEFT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR + dirObj.getShortName<RIGHT_SIDE>()); //throw FileError; + //copyFileTimes(dirObj.getFullName<RIGHT_SIDE>(), dirObj.getFullName<LEFT_SIDE>(), true); //throw FileError -> is executed after sub-objects have finished synchronization + + dirObj.copyTo<LEFT_SIDE>(); //-> both sides *should* be completely equal now... break; case SO_COPY_METADATA_TO_RIGHT: - statusText = txtWritingAttributes; - statusText.Replace(Zstr("%x"), dirObj.getFullName<RIGHT_SIDE>(), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = replaceCpy(txtWritingAttributes, L"%x", utf8CvrtTo<wxString>(dirObj.getFullName<RIGHT_SIDE>())); + procCallback_.reportInfo(logText); if (dirObj.getShortName<LEFT_SIDE>() != dirObj.getShortName<RIGHT_SIDE>()) //adapt difference in case (windows only) renameFile(dirObj.getFullName<RIGHT_SIDE>(), - dirObj.getFullName<RIGHT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR + dirObj.getShortName<LEFT_SIDE>()); //throw (FileError); - //copyFileTimes(dirObj.getFullName<LEFT_SIDE>(), dirObj.getFullName<RIGHT_SIDE>(), true); //throw (FileError) -> is executed after sub-objects have finished synchronization + dirObj.getFullName<RIGHT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR + dirObj.getShortName<LEFT_SIDE>()); //throw FileError; + //copyFileTimes(dirObj.getFullName<LEFT_SIDE>(), dirObj.getFullName<RIGHT_SIDE>(), true); //throw FileError -> is executed after sub-objects have finished synchronization + + dirObj.copyTo<RIGHT_SIDE>(); //-> both sides *should* be completely equal now... break; case SO_DELETE_LEFT: //status information - statusText = delHandlingLeft_.getTxtRemovingDir(); - statusText.Replace(Zstr("%x"), dirObj.getFullName<LEFT_SIDE>(), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = replaceCpy(delHandlingLeft_.getTxtRemovingDir(), L"%x", utf8CvrtTo<wxString>(dirObj.getFullName<LEFT_SIDE>())); + procCallback_.reportInfo(logText); - delHandlingLeft_.removeFolder(dirObj.getObjRelativeName()); //throw (FileError) + delHandlingLeft_.removeFolder(dirObj.getObjRelativeName()); //throw FileError { //progress indicator update: DON'T forget to notify about implicitly deleted objects! const SyncStatistics subObjects(dirObj); @@ -1195,15 +1302,15 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const dirObj.refSubDirs ().clear(); procCallback_.updateProcessedData(subObjects.getCreate() + subObjects.getOverwrite() + subObjects.getDelete(), to<zen::Int64>(subObjects.getDataToProcess())); } + dirObj.removeObject<LEFT_SIDE>(); //update DirMapping break; case SO_DELETE_RIGHT: //status information - statusText = delHandlingRight_.getTxtRemovingDir(); - statusText.Replace(Zstr("%x"), dirObj.getFullName<RIGHT_SIDE>(), false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + logText = replaceCpy(delHandlingRight_.getTxtRemovingDir(), L"%x", utf8CvrtTo<wxString>(dirObj.getFullName<RIGHT_SIDE>())); + procCallback_.reportInfo(logText); - delHandlingRight_.removeFolder(dirObj.getObjRelativeName()); //throw (FileError) + delHandlingRight_.removeFolder(dirObj.getObjRelativeName()); //throw FileError { //progress indicator update: DON'T forget to notify about implicitly deleted objects! const SyncStatistics subObjects(dirObj); @@ -1213,6 +1320,7 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const dirObj.refSubDirs ().clear(); procCallback_.updateProcessedData(subObjects.getCreate() + subObjects.getOverwrite() + subObjects.getDelete(), to<zen::Int64>(subObjects.getDataToProcess())); } + dirObj.removeObject<RIGHT_SIDE>(); //update DirMapping break; case SO_OVERWRITE_RIGHT: @@ -1224,9 +1332,6 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const return; //no update on processed data! } - //update DirMapping - dirObj.synchronizeSides(); - //progress indicator update //indicator is updated only if directory is sync'ed correctly (and if some work was done)! procCallback_.updateProcessedData(1, 0); //each call represents one processed file @@ -1234,15 +1339,6 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const } -//avoid data loss when source directory doesn't (temporarily?) exist anymore AND user chose to ignore errors (else we wouldn't arrive here) -bool dataLossPossible(const Zstring& dirName, const SyncStatistics& folderPairStat, ProcessCallback& procCallback) -{ - return folderPairStat.getCreate() + folderPairStat.getOverwrite() + folderPairStat.getConflict() == 0 && - folderPairStat.getDelete() > 0 && //deletions only... (respect filtered items!) - !dirName.empty() && !dirExistsUpdating(dirName, procCallback); -} - - namespace { void makeSameLength(std::wstring& first, std::wstring& second) @@ -1323,28 +1419,25 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf to<zen::Int64>(statisticsTotal.getDataToProcess()), ProcessCallback::PROCESS_SYNCHRONIZING); - if (!synchronizationNeeded(statisticsTotal)) - procCallback.reportInfo(_("Nothing to synchronize according to configuration!")); //inform about this special case - std::deque<bool> skipFolderPair(folderCmp.size()); //folder pairs may be skipped after fatal errors were found //initialize deletion handling: already required when checking for warnings std::vector<std::pair<DeletionHandling, DeletionHandling>> delHandler; - for (FolderComparison::iterator j = folderCmp.begin(); j != folderCmp.end(); ++j) + for (auto j = begin(folderCmp); j != end(folderCmp); ++j) { const size_t folderIndex = j - folderCmp.begin(); const FolderPairSyncCfg& folderPairCfg = syncConfig[folderIndex]; delHandler.push_back(std::make_pair(DeletionHandling(folderPairCfg.handleDeletion, folderPairCfg.custDelFolder, - j->getBaseDir<LEFT_SIDE>(), + j->getBaseDirPf<LEFT_SIDE>(), procCallback), DeletionHandling(folderPairCfg.handleDeletion, folderPairCfg.custDelFolder, - j->getBaseDir<RIGHT_SIDE>(), + j->getBaseDirPf<RIGHT_SIDE>(), procCallback))); } @@ -1367,27 +1460,27 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf DirRecyclerMissing recyclMissing; //start checking folder pairs - for (FolderComparison::const_iterator j = folderCmp.begin(); j != folderCmp.end(); ++j) + for (auto j = begin(folderCmp); j != end(folderCmp); ++j) { - const size_t folderIndex = j - folderCmp.begin(); + const size_t folderIndex = j - begin(folderCmp); //exclude some pathological case (leftdir, rightdir are empty) - if (EqualFilename()(j->getBaseDir<LEFT_SIDE>(), j->getBaseDir<RIGHT_SIDE>())) + if (EqualFilename()(j->getBaseDirPf<LEFT_SIDE>(), j->getBaseDirPf<RIGHT_SIDE>())) continue; const FolderPairSyncCfg& folderPairCfg = syncConfig[folderIndex]; const std::pair<DeletionHandling, DeletionHandling>& delHandlerFp = delHandler[folderIndex]; - const SyncStatistics statisticsFolderPair(*j); + const SyncStatistics folderPairStat(*j); //aggregate basic information - const bool writeLeft = statisticsFolderPair.getCreate <LEFT_SIDE>() + - statisticsFolderPair.getOverwrite<LEFT_SIDE>() + - statisticsFolderPair.getDelete <LEFT_SIDE>() > 0; + const bool writeLeft = folderPairStat.getCreate <LEFT_SIDE>() + + folderPairStat.getOverwrite<LEFT_SIDE>() + + folderPairStat.getDelete <LEFT_SIDE>() > 0; - const bool writeRight = statisticsFolderPair.getCreate <RIGHT_SIDE>() + - statisticsFolderPair.getOverwrite<RIGHT_SIDE>() + - statisticsFolderPair.getDelete <RIGHT_SIDE>() > 0; + const bool writeRight = folderPairStat.getCreate <RIGHT_SIDE>() + + folderPairStat.getOverwrite<RIGHT_SIDE>() + + folderPairStat.getDelete <RIGHT_SIDE>() > 0; //skip folder pair if there is nothing to do (except for automatic mode, where data base needs to be written even in this case) if (!writeLeft && !writeRight && @@ -1399,8 +1492,8 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf //check empty input fields: basically this only makes sense if empty field is not target (and not automatic mode: because of db file creation) - if ((j->getBaseDir<LEFT_SIDE>(). empty() && (writeLeft || folderPairCfg.inAutomaticMode)) || - (j->getBaseDir<RIGHT_SIDE>().empty() && (writeRight || folderPairCfg.inAutomaticMode))) + if ((j->getBaseDirPf<LEFT_SIDE>(). empty() && (writeLeft || folderPairCfg.inAutomaticMode)) || + (j->getBaseDirPf<RIGHT_SIDE>().empty() && (writeRight || folderPairCfg.inAutomaticMode))) { procCallback.reportFatalError(_("Target directory name must not be empty!")); skipFolderPair[folderIndex] = true; @@ -1408,30 +1501,30 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf } //aggregate information of folders used by multiple pairs in read/write access - if (!EqualDependentDirectory()(j->getBaseDir<LEFT_SIDE>(), j->getBaseDir<RIGHT_SIDE>())) //true in general + if (!EqualDependentDirectory()(j->getBaseDirPf<LEFT_SIDE>(), j->getBaseDirPf<RIGHT_SIDE>())) //true in general { if (writeLeft) { - ++dirWriteCount[j->getBaseDir<LEFT_SIDE>()]; + ++dirWriteCount[j->getBaseDirPf<LEFT_SIDE>()]; if (writeRight) - ++dirWriteCount[j->getBaseDir<RIGHT_SIDE>()]; + ++dirWriteCount[j->getBaseDirPf<RIGHT_SIDE>()]; else - dirReadCount.insert(j->getBaseDir<RIGHT_SIDE>()); + dirReadCount.insert(j->getBaseDirPf<RIGHT_SIDE>()); } else if (writeRight) { - dirReadCount.insert(j->getBaseDir<LEFT_SIDE>()); - ++dirWriteCount[j->getBaseDir<RIGHT_SIDE>()]; + dirReadCount.insert(j->getBaseDirPf<LEFT_SIDE>()); + ++dirWriteCount[j->getBaseDirPf<RIGHT_SIDE>()]; } } else //if folder pair contains two dependent folders, a warning was already issued after comparison; in this context treat as one write access at most { if (writeLeft || writeRight) - ++dirWriteCount[j->getBaseDir<LEFT_SIDE>()]; + ++dirWriteCount[j->getBaseDirPf<LEFT_SIDE>()]; } - if (statisticsFolderPair.getOverwrite() + statisticsFolderPair.getDelete() > 0) + if (folderPairStat.getOverwrite() + folderPairStat.getDelete() > 0) { if (folderPairCfg.handleDeletion == zen::MOVE_TO_CUSTOM_DIRECTORY) { @@ -1445,61 +1538,64 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf } } - //avoid data loss when source directory doesn't (temporarily?) exist anymore AND user chose to ignore errors(else we wouldn't arrive here) - if (dataLossPossible(j->getBaseDir<LEFT_SIDE>(), statisticsFolderPair, procCallback)) - { - procCallback.reportFatalError(_("Source directory does not exist anymore:") + "\n\"" + j->getBaseDir<LEFT_SIDE>() + "\""); - skipFolderPair[folderIndex] = true; - continue; - } - if (dataLossPossible(j->getBaseDir<RIGHT_SIDE>(), statisticsFolderPair, procCallback)) + //avoid data loss when source directory doesn't (temporarily?) exist anymore AND user chose to ignore errors (else we wouldn't arrive here) + if (folderPairStat.getCreate() + folderPairStat.getOverwrite() + folderPairStat.getConflict() == 0 && + folderPairStat.getDelete() > 0) //deletions only... (respect filtered items!) { - procCallback.reportFatalError(_("Source directory does not exist anymore:") + "\n\"" + j->getBaseDir<RIGHT_SIDE>() + "\""); - skipFolderPair[folderIndex] = true; - continue; + Zstring missingSrcDir; + if (!j->getBaseDirPf<LEFT_SIDE>().empty() && !j->wasExisting<LEFT_SIDE>()) //important: we need to evaluate existence status from time of comparison! + missingSrcDir = j->getBaseDirPf<LEFT_SIDE>(); + if (!j->getBaseDirPf<RIGHT_SIDE>().empty() && !j->wasExisting<RIGHT_SIDE>()) + missingSrcDir = j->getBaseDirPf<RIGHT_SIDE>(); + + if (!missingSrcDir.empty()) + { + procCallback.reportFatalError(_("Source directory does not exist anymore:") + "\n\"" + missingSrcDir + "\""); + skipFolderPair[folderIndex] = true; + continue; + } } //check if more than 50% of total number of files/dirs are to be created/overwritten/deleted - if (significantDifferenceDetected(statisticsFolderPair)) - significantDiff.push_back(std::make_pair(j->getBaseDir<LEFT_SIDE>(), j->getBaseDir<RIGHT_SIDE>())); + if (significantDifferenceDetected(folderPairStat)) + significantDiff.push_back(std::make_pair(j->getBaseDirPf<LEFT_SIDE>(), j->getBaseDirPf<RIGHT_SIDE>())); //check for sufficient free diskspace in left directory const std::pair<zen::Int64, zen::Int64> spaceNeeded = DiskSpaceNeeded(*j, delHandlerFp.first.deletionFreesSpace(), delHandlerFp.second.deletionFreesSpace()).getSpaceTotal(); - wxLongLong freeDiskSpaceLeft; - if (wxGetDiskSpace(toWx(j->getBaseDir<LEFT_SIDE>()), NULL, &freeDiskSpaceLeft)) + if (wxGetDiskSpace(toWx(j->getBaseDirPf<LEFT_SIDE>()), NULL, &freeDiskSpaceLeft)) { if (0 < freeDiskSpaceLeft && //zero disk space is either an error or not: in both cases this warning message is obsolete (WebDav seems to report 0) freeDiskSpaceLeft.ToDouble() < to<double>(spaceNeeded.first)) - diskSpaceMissing.push_back(std::make_pair(j->getBaseDir<LEFT_SIDE>(), std::make_pair(spaceNeeded.first, freeDiskSpaceLeft.ToDouble()))); + diskSpaceMissing.push_back(std::make_pair(j->getBaseDirPf<LEFT_SIDE>(), std::make_pair(spaceNeeded.first, freeDiskSpaceLeft.ToDouble()))); } //check for sufficient free diskspace in right directory wxLongLong freeDiskSpaceRight; - if (wxGetDiskSpace(toWx(j->getBaseDir<RIGHT_SIDE>()), NULL, &freeDiskSpaceRight)) + if (wxGetDiskSpace(toWx(j->getBaseDirPf<RIGHT_SIDE>()), NULL, &freeDiskSpaceRight)) { if (0 < freeDiskSpaceRight && //zero disk space is either an error or not: in both cases this warning message is obsolete (WebDav seems to report 0) freeDiskSpaceRight.ToDouble() < to<double>(spaceNeeded.second)) - diskSpaceMissing.push_back(std::make_pair(j->getBaseDir<RIGHT_SIDE>(), std::make_pair(spaceNeeded.second, freeDiskSpaceRight.ToDouble()))); + diskSpaceMissing.push_back(std::make_pair(j->getBaseDirPf<RIGHT_SIDE>(), std::make_pair(spaceNeeded.second, freeDiskSpaceRight.ToDouble()))); } //windows: check if recycle bin really exists; if not, Windows will silently delete, which is wrong #ifdef FFS_WIN if (folderPairCfg.handleDeletion == MOVE_TO_RECYCLE_BIN) { - if (statisticsFolderPair.getOverwrite<LEFT_SIDE>() + - statisticsFolderPair.getDelete <LEFT_SIDE>() > 0 && + if (folderPairStat.getOverwrite<LEFT_SIDE>() + + folderPairStat.getDelete <LEFT_SIDE>() > 0 && - recycleBinStatus(j->getBaseDir<LEFT_SIDE>()) != STATUS_REC_EXISTS) - recyclMissing.insert(j->getBaseDir<LEFT_SIDE>()); + recycleBinStatus(j->getBaseDirPf<LEFT_SIDE>()) != STATUS_REC_EXISTS) + recyclMissing.insert(j->getBaseDirPf<LEFT_SIDE>()); - if (statisticsFolderPair.getOverwrite<RIGHT_SIDE>() + - statisticsFolderPair.getDelete <RIGHT_SIDE>() > 0 && + if (folderPairStat.getOverwrite<RIGHT_SIDE>() + + folderPairStat.getDelete <RIGHT_SIDE>() > 0 && - recycleBinStatus(j->getBaseDir<RIGHT_SIDE>()) != STATUS_REC_EXISTS) - recyclMissing.insert(j->getBaseDir<RIGHT_SIDE>()); + recycleBinStatus(j->getBaseDirPf<RIGHT_SIDE>()) != STATUS_REC_EXISTS) + recyclMissing.insert(j->getBaseDirPf<RIGHT_SIDE>()); } #endif } @@ -1517,7 +1613,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf wxString conflictDescription = i->second; //conflictDescription.Replace(wxT("\n"), wxT(" ")); //remove line-breaks - warningMessage += wxString(wxT("\"")) + i->first + "\": " + conflictDescription + "\n\n"; + warningMessage += wxString(L"\"") + i->first + L"\": " + conflictDescription + "\n\n"; } if (statisticsTotal.getConflict() > static_cast<int>(firstConflicts.size())) @@ -1538,7 +1634,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf warningMessage += wxString(wxT("\n\n")) + i->first + " <-> " + "\n" + i->second; - warningMessage += wxString(wxT("\n\n")) +_("More than 50% of the total number of files will be copied or deleted!"); + warningMessage += wxString(wxT("\n\n")) + _("More than 50% of the total number of files will be copied or deleted!"); procCallback.reportWarning(warningMessage, m_warnings.warningSignificantDifference); } @@ -1603,9 +1699,9 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf (void)dummy; //loop through all directory pairs - for (FolderComparison::iterator j = folderCmp.begin(); j != folderCmp.end(); ++j) + for (auto j = begin(folderCmp); j != end(folderCmp); ++j) { - const size_t folderIndex = j - folderCmp.begin(); + const size_t folderIndex = j - begin(folderCmp); const FolderPairSyncCfg& folderPairCfg = syncConfig[folderIndex]; std::pair<DeletionHandling, DeletionHandling>& delHandlerFp = delHandler[folderIndex]; @@ -1614,7 +1710,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf continue; //exclude some pathological case (leftdir, rightdir are empty) - if (EqualFilename()(j->getBaseDir<LEFT_SIDE>(), j->getBaseDir<RIGHT_SIDE>())) + if (EqualFilename()(j->getBaseDirPf<LEFT_SIDE>(), j->getBaseDirPf<RIGHT_SIDE>())) continue; //------------------------------------------------------------------------------------------ @@ -1624,20 +1720,20 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf makeSameLength(left, right); const std::wstring statusTxt = _("Processing folder pair:") + " \n" + - "\t" + left + "\"" + j->getBaseDir<LEFT_SIDE>() + "\"" + " \n" + - "\t" + right + "\"" + j->getBaseDir<RIGHT_SIDE>() + "\""; + "\t" + left + "\"" + j->getBaseDirPf<LEFT_SIDE>() + "\"" + " \n" + + "\t" + right + "\"" + j->getBaseDirPf<RIGHT_SIDE>() + "\""; procCallback.reportInfo(statusTxt); //------------------------------------------------------------------------------------------ //create base directories first (if not yet existing) -> no symlink or attribute copying! -> single error message instead of one per file (e.g. unplugged network drive) - const Zstring dirnameLeft = j->getBaseDir<LEFT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR); + const Zstring dirnameLeft = j->getBaseDirPf<LEFT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR); if (!dirnameLeft.empty() && !dirExistsUpdating(dirnameLeft, procCallback)) { if (!tryReportingError(procCallback, [&]() { createDirectory(dirnameLeft); })) //may throw in error-callback! continue; //skip this folder pair } - const Zstring dirnameRight = j->getBaseDir<RIGHT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR); + const Zstring dirnameRight = j->getBaseDirPf<RIGHT_SIDE>().BeforeLast(FILE_NAME_SEPARATOR); if (!dirnameRight.empty() && !dirExistsUpdating(dirnameRight, procCallback)) { if (!tryReportingError(procCallback, [&]() { createDirectory(dirnameRight); })) //may throw in error-callback! @@ -1652,8 +1748,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf guardUpdateDb.reset(new EnforceUpdateDatabase(*j)); //guarantee removal of invalid entries (where element on both sides is empty) - Loki::ScopeGuard guardInvalid = Loki::MakeGuard([&]() { BaseDirMapping::removeEmpty(*j); }); - (void) guardInvalid; + LOKI_ON_BLOCK_EXIT2(BaseDirMapping::removeEmpty(*j);); SynchronizeFolderPair syncFP(*this, #ifdef FFS_WIN @@ -1670,11 +1765,14 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf //(try to gracefully) write database file (will be done in ~EnforceUpdateDatabase anyway...) if (guardUpdateDb.get()) { - procCallback.reportInfo(_("Generating database...")); + procCallback.reportStatus(_("Generating database...")); procCallback.forceUiRefresh(); tryReportingError(procCallback, [&]() { guardUpdateDb->tryWriteDB(); }); } } + + if (!synchronizationNeeded(statisticsTotal)) + procCallback.reportInfo(_("Nothing to synchronize according to configuration!")); //inform about this special case } catch (const std::exception& e) { @@ -1716,127 +1814,78 @@ private: //copy file while refreshing UI -template <class DelTargetCommand> -void SynchronizeFolderPair::copyFileUpdating(const Zstring& source, const Zstring& target, const DelTargetCommand& cmd, UInt64 totalBytesToCpy, int recursionLvl) const +template <SelectedSide side, class DelTargetCommand> +void SynchronizeFolderPair::copyFileUpdatingTo(const FileMapping& fileObj, const DelTargetCommand& cmd, FileDescriptor& sourceAttr) const { - const int exceptionPaths = 2; - - //start of (possibly) long-running copy process: ensure status updates are performed regularly - UInt64 bytesReported; - - //in error situation: undo communication of processed amount of data - Loki::ScopeGuard guardStatistics = Loki::MakeGuard([&]() { procCallback_.updateProcessedData(0, -1 * to<Int64>(bytesReported)); }); + const UInt64 totalBytesToCpy = fileObj.getFileSize<OtherSide<side>::result>(); + Zstring source = fileObj.getFullName<OtherSide<side>::result>(); + const Zstring& target = fileObj.getBaseDirPf<side>() + fileObj.getRelativeName<OtherSide<side>::result>(); - try + auto copyOperation = [&]() { + //start of (possibly) long-running copy process: ensure status updates are performed regularly + UInt64 bytesReported; + //in error situation: undo communication of processed amount of data + Loki::ScopeGuard guardStatistics = Loki::MakeGuard([&]() { procCallback_.updateProcessedData(0, -1 * to<Int64>(bytesReported)); }); + WhileCopying<DelTargetCommand> callback(bytesReported, procCallback_, cmd); + FileAttrib fileAttr; + + zen::copyFile(source, //type File implicitly means symlinks need to be dereferenced! + target, + copyFilePermissions, + transactionalFileCopy, + &callback, + &fileAttr); //throw FileError, ErrorFileLocked - copyFile(source, //type File implicitly means symlinks need to be dereferenced! - target, - copyFilePermissions, - transactionalFileCopy, - &callback); //throw (FileError, ErrorFileLocked); + sourceAttr = FileDescriptor(fileAttr.modificationTime, fileAttr.fileSize); //inform about the (remaining) processed amount of data procCallback_.updateProcessedData(0, to<Int64>(totalBytesToCpy) - to<Int64>(bytesReported)); bytesReported = totalBytesToCpy; - } + + guardStatistics.Dismiss(); + }; + #ifdef FFS_WIN + try + { + copyOperation(); + } catch (ErrorFileLocked&) { - if (recursionLvl >= exceptionPaths) throw; - //if file is locked (try to) use Windows Volume Shadow Copy Service - if (shadowCopyHandler_ == NULL) throw; - - Zstring shadowFilename; + if (shadowCopyHandler_ == NULL) + throw; try { //contains prefix: E.g. "\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Program Files\FFS\sample.dat" - shadowFilename = shadowCopyHandler_->makeShadowCopy(source); //throw (FileError) + source = shadowCopyHandler_->makeShadowCopy(source); //throw FileError } catch (const FileError& e) { - std::wstring errorMsg = _("Error copying locked file %x!"); - replace(errorMsg, L"%x", std::wstring(L"\"") + source + "\""); + const std::wstring errorMsg = replaceCpy(_("Error copying locked file %x!"), L"%x", std::wstring(L"\"") + source + "\""); throw FileError(errorMsg + "\n\n" + e.msg()); } //now try again - return copyFileUpdating(shadowFilename, target, cmd, totalBytesToCpy, recursionLvl + 1); + copyOperation(); } +#else + copyOperation(); #endif - catch (ErrorTargetPathMissing&) - { - if (recursionLvl >= exceptionPaths) throw; - //create folders "first" (see http://sourceforge.net/tracker/index.php?func=detail&aid=2628943&group_id=234430&atid=1093080) - //using optimistic strategy: assume everything goes well, but cover up on error -> minimize file accesses - const Zstring targetDir = target.BeforeLast(FILE_NAME_SEPARATOR); - const Zstring templateDir = source.BeforeLast(FILE_NAME_SEPARATOR); - if (!targetDir.empty()) - { - createDirectory(targetDir, templateDir, copyFilePermissions); //throw (FileError) - /*symbolic link handling: - if "not traversing symlinks": fullName == c:\syncdir<symlinks>\some\dirs\leaf<symlink> - => setting irrelevant - if "traversing symlinks": fullName == c:\syncdir<symlinks>\some\dirs<symlinks>\leaf<symlink> - => setting NEEDS to be false: We want to move leaf, therefore symlinks in "some\dirs" must not interfere */ - - //now try again - return copyFileUpdating(source, target, cmd, totalBytesToCpy, recursionLvl + 1); - } - throw; - } - - //todo: transactional behavior: delete target if verification fails? - - if (verifyCopiedFiles) //verify if data was copied correctly - verifyFileCopy(source, target); //throw (FileError) - - guardStatistics.Dismiss(); -} - - -void SynchronizeFolderPair::copySymlink(const Zstring& source, const Zstring& target, LinkDescriptor::LinkType type, bool inRecursion) const -{ - try + //#################### Verification ############################# + if (verifyCopiedFiles) { - switch (type) - { - case LinkDescriptor::TYPE_DIR: - zen::copySymlink(source, target, SYMLINK_TYPE_DIR, copyFilePermissions); //throw (FileError) - break; + Loki::ScopeGuard guardTarget = Loki::MakeGuard(&removeFile, target); //delete target if verification fails + Loki::ScopeGuard guardStatistics = Loki::MakeGuard([&]() { procCallback_.updateProcessedData(0, -1 * to<Int64>(totalBytesToCpy)); }); - case LinkDescriptor::TYPE_FILE: //Windows: true file symlink; Linux: file-link or broken link - zen::copySymlink(source, target, SYMLINK_TYPE_FILE, copyFilePermissions); //throw (FileError) - break; - } - } - catch (FileError&) - { - if (inRecursion) throw; - - //create folders "first" (see http://sourceforge.net/tracker/index.php?func=detail&aid=2628943&group_id=234430&atid=1093080) - //using optimistic strategy: assume everything goes well, but cover up on error -> minimize file accesses - const Zstring targetDir = target.BeforeLast(FILE_NAME_SEPARATOR); - const Zstring templateDir = source.BeforeLast(FILE_NAME_SEPARATOR); - - if (!targetDir.empty() && !dirExistsUpdating(targetDir, procCallback_)) - { - createDirectory(targetDir, templateDir, copyFilePermissions); //throw (FileError) - /*symbolic link handling: - if "not traversing symlinks": fullName == c:\syncdir<symlinks>\some\dirs\leaf<symlink> - => setting irrelevant - if "traversing symlinks": fullName == c:\syncdir<symlinks>\some\dirs<symlinks>\leaf<symlink> - => setting NEEDS to be false: We want to move leaf, therefore symlinks in "some\dirs" must not interfere */ - - //now try again - return copySymlink(source, target, type, true); - } + verifyFileCopy(source, target); //throw FileError - throw; + guardTarget.Dismiss(); + guardStatistics.Dismiss(); } } @@ -1849,11 +1898,11 @@ void SynchronizeFolderPair::deleteSymlink(const SymLinkMapping& linkObj) const switch (linkObj.getLinkType<side>()) { case LinkDescriptor::TYPE_DIR: - delHandling.removeFolder(linkObj.getObjRelativeName()); //throw (FileError) + delHandling.removeFolder(linkObj.getObjRelativeName()); //throw FileError break; case LinkDescriptor::TYPE_FILE: //Windows: true file symlink; Linux: file-link or broken link - delHandling.removeFile(linkObj.getObjRelativeName()); //throw (FileError) + delHandling.removeFile(linkObj.getObjRelativeName()); //throw FileError break; } } @@ -1926,9 +1975,8 @@ private: void SynchronizeFolderPair::verifyFileCopy(const Zstring& source, const Zstring& target) const { - Zstring statusText = txtVerifying; - statusText.Replace(Zstr("%x"), target, false); - procCallback_.reportInfo(utf8CvrtTo<wxString>(statusText)); + wxString logText = replaceCpy(txtVerifying, L"%x", utf8CvrtTo<wxString>(target)); + procCallback_.reportInfo(logText); VerifyStatusUpdater callback(procCallback_); diff --git a/synchronization.h b/synchronization.h index 9ee0667a..7cf93b45 100644 --- a/synchronization.h +++ b/synchronization.h @@ -83,10 +83,13 @@ public: bool transactionalFileCopy, ProcessCallback& handler); - //CONTRACT: syncConfig must have SAME SIZE folderCmp and correspond per row! + //CONTRACT: syncConfig must have SAME SIZE folderCmp and correspond row-wise! void startSynchronizationProcess(const std::vector<FolderPairSyncCfg>& syncConfig, FolderComparison& folderCmp); private: + SyncProcess(const SyncProcess&); + SyncProcess& operator=(const SyncProcess&); + friend class SynchronizeFolderPair; const bool verifyCopiedFiles_; diff --git a/ui/batch_config.cpp b/ui/batch_config.cpp index 043281e9..6e784179 100644 --- a/ui/batch_config.cpp +++ b/ui/batch_config.cpp @@ -32,13 +32,13 @@ class BatchDialog: public BatchDlgGenerated friend class FolderPairCallback; public: - BatchDialog(wxWindow* window, const xmlAccess::XmlBatchConfig& batchCfg); - BatchDialog(wxWindow* window, const wxString& filename); - ~BatchDialog(); + BatchDialog(wxWindow* window, + const wxString& referenceFile, + const xmlAccess::XmlBatchConfig& batchCfg, + const std::shared_ptr<FolderHistory>& folderHistLeft, + const std::shared_ptr<FolderHistory>& folderHistRight); private: - void init(); - virtual void OnCmpSettings( wxCommandEvent& event); virtual void OnSyncSettings( wxCommandEvent& event); virtual void OnConfigureFilter( wxCommandEvent& event); @@ -90,9 +90,12 @@ private: std::unique_ptr<wxMenu> contextMenu; - std::unique_ptr<zen::DirectoryName> logfileDir; + std::unique_ptr<DirectoryName<wxTextCtrl>> logfileDir; zen::EnumDescrList<xmlAccess::OnError> enumDescrMap; + + std::shared_ptr<FolderHistory> folderHistLeft_; + std::shared_ptr<FolderHistory> folderHistRight_; }; //################################################################################################################################### @@ -131,11 +134,23 @@ private: return batchDlg.getConfig().mainCfg; } + virtual void OnAltCompCfgChange() + { + batchDlg.updateGui(); + } + virtual void OnAltSyncCfgChange() { batchDlg.updateGui(); } + virtual void OnAltCompCfgRemoveConfirm(wxCommandEvent& event) + { + FolderPairPanelBasic<GuiPanel>::OnAltCompCfgRemoveConfirm(event); + batchDlg.updateGui(); + } + + virtual void OnAltSyncCfgRemoveConfirm(wxCommandEvent& event) { FolderPairPanelBasic<GuiPanel>::OnAltSyncCfgRemoveConfirm(event); @@ -160,9 +175,13 @@ public: dirNameLeft (*m_panelLeft, *m_dirPickerLeft, *m_directoryLeft), dirNameRight(*m_panelRight, *m_dirPickerRight, *m_directoryRight) {} - void setValues(const wxString& leftDir, const wxString& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter) + void setValues(const wxString& leftDir, + const wxString& rightDir, + AltCompCfgPtr cmpCfg, + AltSyncCfgPtr syncCfg, + const FilterConfig& filter) { - setConfig(syncCfg, filter); + setConfig(cmpCfg, syncCfg, filter); dirNameLeft.setName(leftDir); dirNameRight.setName(rightDir); } @@ -171,8 +190,8 @@ public: private: //support for drag and drop - DirectoryName dirNameLeft; - DirectoryName dirNameRight; + DirectoryName<FolderHistoryBox> dirNameLeft; + DirectoryName<FolderHistoryBox> dirNameRight; }; @@ -190,9 +209,13 @@ public: *batchDialog.m_dirPickerRight, *batchDialog.m_directoryRight) {} - void setValues(const wxString& leftDir, const wxString& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter) + void setValues(const wxString& leftDir, + const wxString& rightDir, + AltCompCfgPtr cmpCfg, + AltSyncCfgPtr syncCfg, + const FilterConfig& filter) { - setConfig(syncCfg, filter); + setConfig(cmpCfg, syncCfg, filter); dirNameLeft.setName(leftDir); dirNameRight.setName(rightDir); } @@ -201,33 +224,24 @@ public: private: //support for drag and drop - DirectoryName dirNameLeft; - DirectoryName dirNameRight; + DirectoryName<FolderHistoryBox> dirNameLeft; + DirectoryName<FolderHistoryBox> dirNameRight; }; - - //################################################################################################################################### -BatchDialog::BatchDialog(wxWindow* window, const xmlAccess::XmlBatchConfig& batchCfg) : - BatchDlgGenerated(window) -{ - init(); - setConfig(batchCfg); -} -BatchDialog::BatchDialog(wxWindow* window, const wxString& filename) : - BatchDlgGenerated(window) +BatchDialog::BatchDialog(wxWindow* window, + const wxString& referenceFile, + const xmlAccess::XmlBatchConfig& batchCfg, + const std::shared_ptr<FolderHistory>& folderHistLeft, + const std::shared_ptr<FolderHistory>& folderHistRight) : + BatchDlgGenerated(window), + folderHistLeft_(folderHistLeft), + folderHistRight_(folderHistRight) { - init(); - loadBatchFile(filename); -} - - -BatchDialog::~BatchDialog() {} //non-inline destructor for std::auto_ptr to work with forward declaration - + m_directoryLeft ->init(folderHistLeft_); + m_directoryRight->init(folderHistRight_); -void BatchDialog::init() -{ #ifdef FFS_WIN new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif @@ -235,15 +249,15 @@ void BatchDialog::init() wxWindowUpdateLocker dummy(this); //avoid display distortion enumDescrMap. - add(xmlAccess::ON_ERROR_POPUP , _("Show popup") , _("Show popup on errors or warnings")). + add(xmlAccess::ON_ERROR_POPUP , _("Show pop-up") , _("Show pop-up on errors or warnings")). add(xmlAccess::ON_ERROR_IGNORE, _("Ignore errors") , _("Hide all error and warning messages")). add(xmlAccess::ON_ERROR_EXIT , _("Exit instantly"), _("Abort synchronization immediately")); - m_bpButtonCmpConfig->SetBitmapLabel(GlobalResources::instance().getImage(wxT("cmpConfig"))); - m_bpButtonSyncConfig->SetBitmapLabel(GlobalResources::instance().getImage(wxT("syncConfig"))); + m_bpButtonCmpConfig->SetBitmapLabel(GlobalResources::getImage(wxT("cmpConfig"))); + m_bpButtonSyncConfig->SetBitmapLabel(GlobalResources::getImage(wxT("syncConfig"))); - m_bpButtonHelp->SetBitmapLabel(GlobalResources::instance().getImage(wxT("help"))); + m_bpButtonHelp->SetBitmapLabel(GlobalResources::getImage(wxT("help"))); //init handling of first folder pair firstFolderPair.reset(new DirectoryPairBatchFirst(*this)); @@ -254,13 +268,21 @@ void BatchDialog::init() setupFileDrop(*this); Connect(FFS_DROP_FILE_EVENT, FFSFileDropEventHandler(BatchDialog::OnFilesDropped), NULL, this); - logfileDir.reset(new DirectoryName(*m_panelBatchSettings, *m_dirPickerLogfileDir, *m_textCtrlLogfileDir)); + logfileDir.reset(new DirectoryName<wxTextCtrl>(*m_panelBatchSettings, *m_dirPickerLogfileDir, *m_textCtrlLogfileDir)); //set icons for this dialog - m_bpButtonAddPair->SetBitmapLabel(GlobalResources::instance().getImage(wxT("addFolderPair"))); - m_bitmap27->SetBitmap(GlobalResources::instance().getImage(wxT("batch"))); + m_bpButtonAddPair->SetBitmapLabel(GlobalResources::getImage(wxT("addFolderPair"))); + m_bitmap27->SetBitmap(GlobalResources::getImage(wxT("batch"))); m_buttonSave->SetFocus(); + + if (!referenceFile.empty()) + { + SetTitle(referenceFile); + proposedBatchFileName = referenceFile; //may be used on next save + } + + setConfig(batchCfg); } //------------------- error handling -------------------------- @@ -290,8 +312,7 @@ void BatchDialog::OnCmpSettings(wxCommandEvent& event) //wxPoint windowPos = m_bpButtonCmpConfig->GetScreenPosition(); //windowPos.x += m_bpButtonCmpConfig->GetSize().GetWidth() + 5; - if (zen::showCompareCfgDialog(localBatchCfg.mainCfg.compareVar, - localBatchCfg.mainCfg.handleSymlinks) == ReturnSmallDlg::BUTTON_OKAY) + if (zen::showCompareCfgDialog(localBatchCfg.mainCfg.cmpConfig) == ReturnSmallDlg::BUTTON_OKAY) { updateGui(); } @@ -300,10 +321,8 @@ void BatchDialog::OnCmpSettings(wxCommandEvent& event) void BatchDialog::OnSyncSettings(wxCommandEvent& event) { - if (showSyncConfigDlg(localBatchCfg.mainCfg.compareVar, - localBatchCfg.mainCfg.syncConfiguration, - localBatchCfg.mainCfg.handleDeletion, - localBatchCfg.mainCfg.customDeletionDirectory, + if (showSyncConfigDlg(localBatchCfg.mainCfg.cmpConfig.compareVar, + localBatchCfg.mainCfg.syncCfg, NULL) == ReturnSyncConfig::BUTTON_OKAY) //optional input parameter { updateGui(); @@ -330,7 +349,7 @@ void BatchDialog::updateGui() //re-evaluate gui after config changes m_panelLogfile->Enable(cfg.logFileCountMax > 0); //update compare variant name - m_staticTextCmpVariant->SetLabel(wxString(wxT("(")) + getVariantName(cfg.mainCfg.compareVar) + wxT(")")); + m_staticTextCmpVariant->SetLabel(wxString(wxT("(")) + cfg.mainCfg.getCompVariantName() + wxT(")")); //update sync variant name m_staticTextSyncVariant->SetLabel(wxString(wxT("(")) + cfg.mainCfg.getSyncVariantName() + wxT(")")); @@ -338,16 +357,17 @@ void BatchDialog::updateGui() //re-evaluate gui after config changes //set filter icon if (isNullFilter(cfg.mainCfg.globalFilter)) { - setBitmapLabel(*m_bpButtonFilter, GlobalResources::instance().getImage(wxT("filterOff"))); + setBitmapLabel(*m_bpButtonFilter, GlobalResources::getImage(wxT("filterOff"))); m_bpButtonFilter->SetToolTip(_("No filter selected")); } else { - setBitmapLabel(*m_bpButtonFilter, GlobalResources::instance().getImage(wxT("filterOn"))); + setBitmapLabel(*m_bpButtonFilter, GlobalResources::getImage(wxT("filterOn"))); m_bpButtonFilter->SetToolTip(_("Filter is active")); } m_panelOverview->Layout(); //adjust stuff inside scrolled window + m_panelOverview->Refresh(); //refresh filter button (if nothing else) } @@ -413,9 +433,9 @@ void BatchDialog::OnFilesDropped(FFSFileDropEvent& event) void BatchDialog::OnHelp(wxCommandEvent& event) { #ifdef FFS_WIN - zen::displayHelpEntry(wxT("html\\advanced\\ScheduleBatch.html")); + zen::displayHelpEntry(wxT("html\\ScheduleBatch.html")); #elif defined FFS_LINUX - zen::displayHelpEntry(wxT("html/advanced/ScheduleBatch.html")); + zen::displayHelpEntry(wxT("html/ScheduleBatch.html")); #endif } @@ -470,7 +490,6 @@ void BatchDialog::OnSaveBatchJob(wxCommandEvent& event) if (defaultFileName.EndsWith(wxT(".ffs_gui"))) defaultFileName.Replace(wxT(".ffs_gui"), wxT(".ffs_batch"), false); - wxFileDialog filePicker(this, wxEmptyString, wxEmptyString, @@ -513,6 +532,7 @@ FolderPairEnh getEnhancedPair(const DirectoryPairBatch* panel) { return FolderPairEnh(toZ(panel->getLeftDir()), toZ(panel->getRightDir()), + panel->getAltCompConfig(), panel->getAltSyncConfig(), panel->getAltFilterConfig()); } @@ -604,6 +624,7 @@ void BatchDialog::setConfig(const xmlAccess::XmlBatchConfig& batchCfg) //set first folder pair firstFolderPair->setValues(toWx(batchCfg.mainCfg.firstPair.leftDirectory), toWx(batchCfg.mainCfg.firstPair.rightDirectory), + batchCfg.mainCfg.firstPair.altCmpConfig, batchCfg.mainCfg.firstPair.altSyncConfig, batchCfg.mainCfg.firstPair.localFilter); @@ -630,6 +651,7 @@ xmlAccess::XmlBatchConfig BatchDialog::getConfig() const //first folder pair batchCfg.mainCfg.firstPair = FolderPairEnh(toZ(firstFolderPair->getLeftDir()), toZ(firstFolderPair->getRightDir()), + firstFolderPair->getAltCompConfig(), firstFolderPair->getAltSyncConfig(), firstFolderPair->getAltFilterConfig()); @@ -656,14 +678,16 @@ void BatchDialog::OnAddFolderPair(wxCommandEvent& event) std::vector<FolderPairEnh> newPairs; newPairs.push_back(getConfig().mainCfg.firstPair); - addFolderPair(newPairs, true); //add pair in front of additonal pairs - //clear first pair const FolderPairEnh cfgEmpty; firstFolderPair->setValues(toWx(cfgEmpty.leftDirectory), toWx(cfgEmpty.rightDirectory), + cfgEmpty.altCmpConfig, cfgEmpty.altSyncConfig, cfgEmpty.localFilter); + + //keep sequence to update GUI as last step + addFolderPair(newPairs, true); //add pair in front of additonal pairs } @@ -692,6 +716,7 @@ void BatchDialog::OnRemoveTopFolderPair(wxCommandEvent& event) //reset first pair firstFolderPair->setValues(toWx(cfgSecond.leftDirectory), toWx(cfgSecond.rightDirectory), + cfgSecond.altCmpConfig, cfgSecond.altSyncConfig, cfgSecond.localFilter); @@ -710,16 +735,19 @@ void BatchDialog::updateGuiForFolderPair() //adapt local filter and sync cfg for first folder pair if (additionalFolderPairs.size() == 0 && + firstFolderPair->getAltCompConfig().get() == NULL && firstFolderPair->getAltSyncConfig().get() == NULL && isNullFilter(firstFolderPair->getAltFilterConfig())) { + m_bpButtonAltCompCfg ->Hide(); m_bpButtonLocalFilter->Hide(); - m_bpButtonAltSyncCfg->Hide(); + m_bpButtonAltSyncCfg ->Hide(); } else { + m_bpButtonAltCompCfg ->Show(); m_bpButtonLocalFilter->Show(); - m_bpButtonAltSyncCfg->Show(); + m_bpButtonAltSyncCfg ->Show(); } //update controls @@ -757,6 +785,10 @@ void BatchDialog::addFolderPair(const std::vector<zen::FolderPairEnh>& newPairs, { DirectoryPairBatch* newPair = new DirectoryPairBatch(m_scrolledWindow6, *this); + //init dropdown history + newPair->m_directoryLeft ->init(folderHistLeft_); + newPair->m_directoryRight->init(folderHistRight_); + if (addFront) { bSizerAddFolderPairs->Insert(0, newPair, 0, wxEXPAND, 5); @@ -774,6 +806,7 @@ void BatchDialog::addFolderPair(const std::vector<zen::FolderPairEnh>& newPairs, //set alternate configuration newPair->setValues(toWx(i->leftDirectory), toWx(i->rightDirectory), + i->altCmpConfig, i->altSyncConfig, i->localFilter); } @@ -783,6 +816,8 @@ void BatchDialog::addFolderPair(const std::vector<zen::FolderPairEnh>& newPairs, } updateGuiForFolderPair(); + + updateGui(); //mainly to update sync dir description text } @@ -804,6 +839,8 @@ void BatchDialog::removeAddFolderPair(const int pos) } updateGuiForFolderPair(); + + updateGui(); //mainly to update sync dir description text } @@ -888,16 +925,11 @@ bool BatchDialog::createBatchFile(const wxString& filename) */ - -ReturnBatchConfig::ButtonPressed zen::showSyncBatchDlg(const wxString& filename) -{ - BatchDialog batchDlg(NULL, filename); - return static_cast<ReturnBatchConfig::ButtonPressed>(batchDlg.ShowModal()); -} - - -ReturnBatchConfig::ButtonPressed zen::showSyncBatchDlg(const xmlAccess::XmlBatchConfig& batchCfg) +ReturnBatchConfig::ButtonPressed zen::showSyncBatchDlg(const wxString& referenceFile, + const xmlAccess::XmlBatchConfig& batchCfg, + const std::shared_ptr<FolderHistory>& folderHistLeft, + const std::shared_ptr<FolderHistory>& folderHistRight) { - BatchDialog batchDlg(NULL, batchCfg); + BatchDialog batchDlg(NULL, referenceFile, batchCfg, folderHistLeft, folderHistRight); return static_cast<ReturnBatchConfig::ButtonPressed>(batchDlg.ShowModal()); } diff --git a/ui/batch_config.h b/ui/batch_config.h index 9a272261..02f9b5f8 100644 --- a/ui/batch_config.h +++ b/ui/batch_config.h @@ -8,7 +8,7 @@ #define BATCHCONFIG_H_INCLUDED #include "../library/process_xml.h" - +#include "../shared/folder_history_box.h" namespace zen { @@ -21,8 +21,10 @@ struct ReturnBatchConfig }; }; -ReturnBatchConfig::ButtonPressed showSyncBatchDlg(const wxString& filename); -ReturnBatchConfig::ButtonPressed showSyncBatchDlg(const xmlAccess::XmlBatchConfig& batchCfg); +ReturnBatchConfig::ButtonPressed showSyncBatchDlg(const wxString& referenceFile, + const xmlAccess::XmlBatchConfig& batchCfg, + const std::shared_ptr<FolderHistory>& folderHistLeft, + const std::shared_ptr<FolderHistory>& folderHistRight); } diff --git a/ui/batch_status_handler.cpp b/ui/batch_status_handler.cpp index 772feaf4..84168014 100644 --- a/ui/batch_status_handler.cpp +++ b/ui/batch_status_handler.cpp @@ -54,7 +54,7 @@ void removeFileNoThrow(const Zstring& filename) { zen::removeFile(filename); } - catch(...) {} + catch (...) {} } } @@ -62,7 +62,7 @@ void removeFileNoThrow(const Zstring& filename) class LogFile { public: - LogFile(const wxString& logfileDirectory, const wxString& jobName) : jobName_(jobName) //throw (FileError&) + LogFile(const wxString& logfileDirectory, const wxString& jobName) : jobName_(jobName) //throw FileError { logfileName = findUniqueLogname(logfileDirectory, jobName); @@ -298,10 +298,16 @@ void BatchStatusHandler::updateProcessedData(int objectsProcessed, zen::Int64 da } +void BatchStatusHandler::reportStatus(const wxString& text) +{ + syncStatusFrame.setStatusText_NoUpdate(text); + requestUiRefresh(); //throw AbortThisProcess +} + + void BatchStatusHandler::reportInfo(const wxString& text) { - if (currentProcess == StatusHandler::PROCESS_SYNCHRONIZING) //write file transfer information to log - errorLog.logMsg(text, TYPE_INFO); //avoid spamming with file copy info: visually identifying warning messages has priority! however when saving to a log file wee need this info + errorLog.logMsg(text, TYPE_INFO); syncStatusFrame.setStatusText_NoUpdate(text); requestUiRefresh(); //throw AbortThisProcess diff --git a/ui/batch_status_handler.h b/ui/batch_status_handler.h index 61e0f46e..43fa5549 100644 --- a/ui/batch_status_handler.h +++ b/ui/batch_status_handler.h @@ -34,6 +34,7 @@ public: virtual void initNewProcess(int objectsTotal, zen::Int64 dataTotal, Process processID); virtual void updateProcessedData(int objectsProcessed, zen::Int64 dataProcessed); + virtual void reportStatus(const wxString& text); virtual void reportInfo(const wxString& text); virtual void forceUiRefresh(); diff --git a/ui/check_version.cpp b/ui/check_version.cpp index 491cf3c2..16eb7719 100644 --- a/ui/check_version.cpp +++ b/ui/check_version.cpp @@ -5,6 +5,7 @@ // ************************************************************************** #include "check_version.h" +#include <memory> #include <wx/msgdlg.h> #include <wx/protocol/http.h> #include <wx/sstream.h> @@ -14,36 +15,15 @@ #include <string_tools.h> #include "msg_popup.h" #include "../shared/standard_paths.h" +#include "loki/ScopeGuard.h" #include <wx/tokenzr.h> #include "../shared/i18n.h" -class CloseConnectionOnExit -{ -public: - CloseConnectionOnExit(wxInputStream* httpStream, wxHTTP& webAccess) : - m_httpStream(httpStream), - m_webAccess(webAccess) {} - - ~CloseConnectionOnExit() - { - delete m_httpStream; //must be deleted BEFORE webAccess is closed - m_webAccess.Close(); - } - -private: - wxInputStream* m_httpStream; - wxHTTP& m_webAccess; -}; - - bool getOnlineVersion(wxString& version) { - wxHTTP webAccess; - wxInputStream* httpStream = NULL; - wxWindowDisabler dummy; - CloseConnectionOnExit dummy2(httpStream, webAccess); + wxHTTP webAccess; webAccess.SetHeader(wxT("Content-type"), wxT("text/html; charset=utf-8")); webAccess.SetTimeout(5); //5 seconds of timeout instead of 10 minutes... @@ -51,7 +31,8 @@ bool getOnlineVersion(wxString& version) { //wxApp::IsMainLoopRunning(); // should return true - httpStream = webAccess.GetInputStream(wxT("/viewvc/freefilesync/version/version.txt")); + std::unique_ptr<wxInputStream> httpStream(webAccess.GetInputStream(wxT("/viewvc/freefilesync/version/version.txt"))); + //must be deleted BEFORE webAccess is closed if (httpStream && webAccess.GetError() == wxPROTO_NOERR) { diff --git a/ui/folder_pair.h b/ui/folder_pair.h index 5ca8d92f..6c535664 100644 --- a/ui/folder_pair.h +++ b/ui/folder_pair.h @@ -27,49 +27,56 @@ template <class GuiPanel> class FolderPairPanelBasic : private wxEvtHandler { public: - typedef std::shared_ptr<const zen::AlternateSyncConfig> AltSyncCfgPtr; + typedef std::shared_ptr<const CompConfig> AltCompCfgPtr; + typedef std::shared_ptr<const SyncConfig> AltSyncCfgPtr; - AltSyncCfgPtr getAltSyncConfig() const - { - return altSyncConfig; - } - - FilterConfig getAltFilterConfig() const - { - return localFilter; - } + AltCompCfgPtr getAltCompConfig() const { return altCompConfig; } + AltSyncCfgPtr getAltSyncConfig() const { return altSyncConfig; } + FilterConfig getAltFilterConfig() const { return localFilter; } - void setConfig(AltSyncCfgPtr syncCfg, const FilterConfig& filter) + void setConfig(AltCompCfgPtr compConfig, AltSyncCfgPtr syncCfg, const FilterConfig& filter) { + altCompConfig = compConfig; altSyncConfig = syncCfg; localFilter = filter; refreshButtons(); } - void refreshButtons() { + if (altCompConfig.get()) + { + setBitmapLabel(*basicPanel_.m_bpButtonAltCompCfg, GlobalResources::getImage(wxT("cmpConfigSmall"))); + basicPanel_.m_bpButtonAltCompCfg->SetToolTip(wxString(_("Select alternate comparison settings")) + wxT(" \n") + + wxT("(") + getVariantName(altCompConfig->compareVar) + wxT(")")); + } + else + { + setBitmapLabel(*basicPanel_.m_bpButtonAltCompCfg, GlobalResources::getImage(wxT("cmpConfigSmallGrey"))); + basicPanel_.m_bpButtonAltCompCfg->SetToolTip(_("Select alternate comparison settings")); + } + if (altSyncConfig.get()) { - setBitmapLabel(*basicPanel_.m_bpButtonAltSyncCfg, GlobalResources::instance().getImage(wxT("syncConfigSmall"))); + setBitmapLabel(*basicPanel_.m_bpButtonAltSyncCfg, GlobalResources::getImage(wxT("syncConfigSmall"))); basicPanel_.m_bpButtonAltSyncCfg->SetToolTip(wxString(_("Select alternate synchronization settings")) + wxT(" \n") + - wxT("(") + getVariantName(altSyncConfig->syncConfiguration.var) + wxT(")")); + wxT("(") + getVariantName(altSyncConfig->directionCfg.var) + wxT(")")); } else { - setBitmapLabel(*basicPanel_.m_bpButtonAltSyncCfg, GlobalResources::instance().getImage(wxT("syncConfigSmallGrey"))); + setBitmapLabel(*basicPanel_.m_bpButtonAltSyncCfg, GlobalResources::getImage(wxT("syncConfigSmallGrey"))); basicPanel_.m_bpButtonAltSyncCfg->SetToolTip(_("Select alternate synchronization settings")); } //test for Null-filter if (isNullFilter(localFilter)) { - setBitmapLabel(*basicPanel_.m_bpButtonLocalFilter, GlobalResources::instance().getImage(wxT("filterSmallGrey"))); + setBitmapLabel(*basicPanel_.m_bpButtonLocalFilter, GlobalResources::getImage(wxT("filterSmallGrey"))); basicPanel_.m_bpButtonLocalFilter->SetToolTip(_("No filter selected")); } else { - setBitmapLabel(*basicPanel_.m_bpButtonLocalFilter, GlobalResources::instance().getImage(wxT("filterSmall"))); + setBitmapLabel(*basicPanel_.m_bpButtonLocalFilter, GlobalResources::getImage(wxT("filterSmall"))); basicPanel_.m_bpButtonLocalFilter->SetToolTip(_("Filter is active")); } } @@ -79,18 +86,20 @@ protected: basicPanel_(basicPanel) { //register events for removal of alternate configuration - basicPanel_.m_bpButtonAltSyncCfg->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(FolderPairPanelBasic::OnAltSyncCfgRemove), NULL, this); + basicPanel_.m_bpButtonAltCompCfg ->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(FolderPairPanelBasic::OnAltCompCfgRemove ), NULL, this); + basicPanel_.m_bpButtonAltSyncCfg ->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(FolderPairPanelBasic::OnAltSyncCfgRemove ), NULL, this); basicPanel_.m_bpButtonLocalFilter->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(FolderPairPanelBasic::OnLocalFilterCfgRemove), NULL, this); - basicPanel_.m_bpButtonAltSyncCfg-> Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FolderPairPanelBasic::OnAltSyncCfg), NULL, this); + basicPanel_.m_bpButtonAltCompCfg-> Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FolderPairPanelBasic::OnAltCompCfg ), NULL, this); + basicPanel_.m_bpButtonAltSyncCfg-> Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FolderPairPanelBasic::OnAltSyncCfg ), NULL, this); basicPanel_.m_bpButtonLocalFilter->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FolderPairPanelBasic::OnLocalFilterCfg), NULL, this); - basicPanel_.m_bpButtonRemovePair->SetBitmapLabel(GlobalResources::instance().getImage(wxT("removeFolderPair"))); + basicPanel_.m_bpButtonRemovePair->SetBitmapLabel(GlobalResources::getImage(wxT("removeFolderPair"))); } - virtual void OnLocalFilterCfgRemoveConfirm(wxCommandEvent& event) + virtual void OnAltCompCfgRemoveConfirm(wxCommandEvent& event) { - localFilter = FilterConfig(); + altCompConfig.reset(); refreshButtons(); } @@ -100,18 +109,23 @@ protected: refreshButtons(); } + virtual void OnLocalFilterCfgRemoveConfirm(wxCommandEvent& event) + { + localFilter = FilterConfig(); + refreshButtons(); + } private: - void OnLocalFilterCfgRemove(wxCommandEvent& event) + void OnAltCompCfgRemove(wxCommandEvent& event) { contextMenu.reset(new wxMenu); //re-create context menu - wxMenuItem* itemClear = new wxMenuItem(contextMenu.get(), wxID_ANY, _("Clear filter settings")); - contextMenu->Append(itemClear); - contextMenu->Connect(itemClear->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(FolderPairPanelBasic::OnLocalFilterCfgRemoveConfirm), NULL, this); + wxMenuItem* itemRemove = new wxMenuItem(contextMenu.get(), wxID_ANY, _("Remove alternate settings")); + contextMenu->Append(itemRemove); + contextMenu->Connect(itemRemove->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(FolderPairPanelBasic::OnAltCompCfgRemoveConfirm), NULL, this); - if (isNullFilter(localFilter)) - contextMenu->Enable(itemClear->GetId(), false); //disable menu item, if clicking wouldn't make sense anyway + if (!altCompConfig.get()) + contextMenu->Enable(itemRemove->GetId(), false); //disable menu item, if clicking wouldn't make sense anyway basicPanel_.PopupMenu(contextMenu.get()); //show context menu } @@ -130,36 +144,61 @@ private: basicPanel_.PopupMenu(contextMenu.get()); //show context menu } + void OnLocalFilterCfgRemove(wxCommandEvent& event) + { + contextMenu.reset(new wxMenu); //re-create context menu + + wxMenuItem* itemClear = new wxMenuItem(contextMenu.get(), wxID_ANY, _("Clear filter settings")); + contextMenu->Append(itemClear); + contextMenu->Connect(itemClear->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(FolderPairPanelBasic::OnLocalFilterCfgRemoveConfirm), NULL, this); + + if (isNullFilter(localFilter)) + contextMenu->Enable(itemClear->GetId(), false); //disable menu item, if clicking wouldn't make sense anyway + + basicPanel_.PopupMenu(contextMenu.get()); //show context menu + } + + virtual MainConfiguration getMainConfig() const = 0; virtual wxWindow* getParentWindow() = 0; - virtual void OnAltSyncCfgChange() {}; + virtual void OnAltCompCfgChange() = 0; + virtual void OnAltSyncCfgChange() = 0; + virtual void OnLocalFilterCfgChange() {}; - void OnAltSyncCfg(wxCommandEvent& event) + void OnAltCompCfg(wxCommandEvent& event) { const MainConfiguration mainCfg = getMainConfig(); - const AlternateSyncConfig syncConfigMain(mainCfg.syncConfiguration, - mainCfg.handleDeletion, - mainCfg.customDeletionDirectory); - AlternateSyncConfig altSyncCfg = altSyncConfig.get() ? *altSyncConfig : syncConfigMain; + CompConfig cmpCfg = altCompConfig.get() ? *altCompConfig : mainCfg.cmpConfig; + + if (showCompareCfgDialog(cmpCfg) == ReturnSmallDlg::BUTTON_OKAY) + { + altCompConfig = std::make_shared<CompConfig>(cmpCfg); + refreshButtons(); + + OnAltCompCfgChange(); + } + } + + void OnAltSyncCfg(wxCommandEvent& event) + { + const MainConfiguration mainCfg = getMainConfig(); + CompConfig cmpCfg = altCompConfig.get() ? *altCompConfig : mainCfg.cmpConfig; + SyncConfig syncCfg = altSyncConfig.get() ? *altSyncConfig : mainCfg.syncCfg; - if (showSyncConfigDlg(mainCfg.compareVar, - altSyncCfg.syncConfiguration, - altSyncCfg.handleDeletion, - altSyncCfg.customDeletionDirectory, + if (showSyncConfigDlg(cmpCfg.compareVar, + syncCfg, NULL) == ReturnSyncConfig::BUTTON_OKAY) //optional input parameter { - altSyncConfig.reset(new AlternateSyncConfig(altSyncCfg)); + altSyncConfig = std::make_shared<SyncConfig>(syncCfg); refreshButtons(); OnAltSyncCfgChange(); } } - virtual void OnLocalFilterCfgChange() {}; - void OnLocalFilterCfg(wxCommandEvent& event) { FilterConfig localFiltTmp = localFilter; @@ -177,7 +216,8 @@ private: GuiPanel& basicPanel_; //panel to be enhanced by this template //alternate configuration attached to it - AltSyncCfgPtr altSyncConfig; //optional: present if non-NULL + AltCompCfgPtr altCompConfig; //optional: present if non-NULL + AltSyncCfgPtr altSyncConfig; // FilterConfig localFilter; std::unique_ptr<wxMenu> contextMenu; diff --git a/ui/grid_view.cpp b/ui/grid_view.cpp index 0614b3e5..17fb3ff4 100644 --- a/ui/grid_view.cpp +++ b/ui/grid_view.cpp @@ -8,6 +8,7 @@ #include "sorting.h" #include "../synchronization.h" #include <boost/bind.hpp> +#include "../shared/stl_tools.h" using namespace zen; @@ -258,8 +259,7 @@ void GridView::removeInvalidRows() viewRef.clear(); //remove rows that have been deleted meanwhile - sortedRef.erase(std::remove_if(sortedRef.begin(), sortedRef.end(), - boost::bind(&GridView::isInvalidRow, this, _1)), sortedRef.end()); + vector_remove_if(sortedRef, [&](const RefIndex& refIdx) { return this->isInvalidRow(refIdx); }); } @@ -278,29 +278,24 @@ public: index_(index), sortedRef_(sortedRef) {} - void execute(const HierarchyObject& hierObj) + void execute(HierarchyObject& hierObj) { - //add file references std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), *this); - - //add symlink references std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), *this); - - //add dir references - std::for_each(hierObj.refSubDirs().begin(), hierObj.refSubDirs().end(), *this); + std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), *this); } - void operator()(const FileMapping& fileObj) + void operator()(FileMapping& fileObj) { sortedRef_.push_back(RefIndex(index_, fileObj.getId())); } - void operator()(const SymLinkMapping& linkObj) + void operator()(SymLinkMapping& linkObj) { sortedRef_.push_back(RefIndex(index_, linkObj.getId())); } - void operator()(const DirMapping& dirObj) + void operator()(DirMapping& dirObj) { sortedRef_.push_back(RefIndex(index_, dirObj.getId())); execute(dirObj); //add recursion here to list sub-objects directly below parent! @@ -319,7 +314,7 @@ void GridView::setData(FolderComparison& newData) folderCmp.swap(newData); //fill sortedRef - for (FolderComparison::const_iterator j = folderCmp.begin(); j != folderCmp.end(); ++j) + for (auto j = begin(folderCmp); j != end(folderCmp); ++j) SerializeHierarchy(sortedRef, j - folderCmp.begin()).execute(*j); } @@ -338,7 +333,7 @@ public: }; -template <bool ascending, zen::SelectedSide side> +template <bool ascending> class GridView::LessRelativeName : public std::binary_function<RefIndex, RefIndex, bool> { public: @@ -359,7 +354,7 @@ public: else if (fsObjB == NULL) return true; - return lessRelativeName<ascending, side>(*fsObjA, *fsObjB); + return lessRelativeName<ascending>(*fsObjA, *fsObjB); } private: const GridView& m_view; @@ -526,10 +521,8 @@ void GridView::sortView(SortType type, bool onLeft, bool ascending) switch (type) { case SORT_BY_REL_NAME: - if ( ascending && onLeft) std::sort(sortedRef.begin(), sortedRef.end(), LessRelativeName<true, LEFT_SIDE>(*this)); - else if ( ascending && !onLeft) std::sort(sortedRef.begin(), sortedRef.end(), LessRelativeName<true, RIGHT_SIDE>(*this)); - else if (!ascending && onLeft) std::sort(sortedRef.begin(), sortedRef.end(), LessRelativeName<false, LEFT_SIDE >(*this)); - else if (!ascending && !onLeft) std::sort(sortedRef.begin(), sortedRef.end(), LessRelativeName<false, RIGHT_SIDE>(*this)); + if ( ascending) std::sort(sortedRef.begin(), sortedRef.end(), LessRelativeName<true>(*this)); + else if (!ascending) std::sort(sortedRef.begin(), sortedRef.end(), LessRelativeName<false>(*this)); break; case SORT_BY_FILENAME: if ( ascending && onLeft) std::sort(sortedRef.begin(), sortedRef.end(), LessShortFileName<true, LEFT_SIDE >(*this)); diff --git a/ui/grid_view.h b/ui/grid_view.h index 87d5c38d..5bf2f8b2 100644 --- a/ui/grid_view.h +++ b/ui/grid_view.h @@ -120,15 +120,15 @@ private: struct RefIndex { - RefIndex(size_t folderInd, HierarchyObject::ObjectID id) : + RefIndex(size_t folderInd, FileSystemObject::ObjectID id) : folderIndex(folderInd), objId(id) {} size_t folderIndex; - HierarchyObject::ObjectID objId; + FileSystemObject::ObjectID objId; }; - FileSystemObject* getReferencedRow(const RefIndex ref); //returns NULL if not found - const FileSystemObject* getReferencedRow(const RefIndex ref) const; //returns NULL if not found + FileSystemObject* getReferencedRow(const RefIndex& ref); //returns NULL if not found + const FileSystemObject* getReferencedRow(const RefIndex& ref) const; //returns NULL if not found bool isInvalidRow(const RefIndex& ref) const; @@ -147,7 +147,7 @@ private: template <bool ascending> class LessDirectoryPair; - template <bool ascending, SelectedSide side> + template <bool ascending> class LessRelativeName; template <bool ascending, SelectedSide side> @@ -219,17 +219,16 @@ size_t GridView::rowsTotal() const //total number of rows available inline -const zen::FileSystemObject* GridView::getReferencedRow(const RefIndex ref) const +const zen::FileSystemObject* GridView::getReferencedRow(const RefIndex& ref) const { - return folderCmp[ref.folderIndex].retrieveById(ref.objId); + return FileSystemObject::retrieve(ref.objId); } inline -zen::FileSystemObject* GridView::getReferencedRow(const RefIndex ref) +zen::FileSystemObject* GridView::getReferencedRow(const RefIndex& ref) { - //code re-use of const method: see Meyers Effective C++ - return const_cast<FileSystemObject*>(static_cast<const GridView&>(*this).getReferencedRow(ref)); + return FileSystemObject::retrieve(ref.objId); } } diff --git a/ui/gui_generated.cpp b/ui/gui_generated.cpp index 3270145a..b0fb1b6d 100644 --- a/ui/gui_generated.cpp +++ b/ui/gui_generated.cpp @@ -7,8 +7,8 @@ #include "../library/custom_grid.h" #include "../shared/custom_button.h" -#include "../shared/custom_combo_box.h" #include "../shared/dir_picker_i18n.h" +#include "../shared/folder_history_box.h" #include "../shared/toggle_button.h" #include "gui_generated.h" @@ -17,1525 +17,1539 @@ 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_menubar1 = new wxMenuBar( 0 ); - m_menuFile = new wxMenu(); - m_menuItem10 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("1. &Compare") ) + wxT('\t') + wxT("F5"), wxEmptyString, wxITEM_NORMAL ); - m_menuFile->Append( m_menuItem10 ); - - m_menuItem11 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("2. &Synchronize...") ) + wxT('\t') + wxT("F6"), wxEmptyString, wxITEM_NORMAL ); - m_menuFile->Append( m_menuItem11 ); - - wxMenuItem* m_separator1; - m_separator1 = m_menuFile->AppendSeparator(); - - m_menuItemSwitchView = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("S&witch view") ) + wxT('\t') + wxT("F8"), wxEmptyString, wxITEM_NORMAL ); - m_menuFile->Append( m_menuItemSwitchView ); - - wxMenuItem* m_separator2; - m_separator2 = m_menuFile->AppendSeparator(); - - m_menuItemNew = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("&New") ) + wxT('\t') + wxT("Ctrl-N"), wxEmptyString, wxITEM_NORMAL ); - m_menuFile->Append( m_menuItemNew ); - - m_menuItemSave = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("S&ave configuration...") ) + wxT('\t') + wxT("Ctrl-S"), wxEmptyString, wxITEM_NORMAL ); - m_menuFile->Append( m_menuItemSave ); - - m_menuItemLoad = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("&Load configuration...") ) + wxT('\t') + wxT("Ctrl-O"), wxEmptyString, wxITEM_NORMAL ); - m_menuFile->Append( m_menuItemLoad ); - - wxMenuItem* m_separator3; - m_separator3 = m_menuFile->AppendSeparator(); - - wxMenuItem* m_menuItem4; - m_menuItem4 = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("&Quit") ) + wxT('\t') + wxT("Ctrl-Q"), wxEmptyString, wxITEM_NORMAL ); - m_menuFile->Append( m_menuItem4 ); - - m_menubar1->Append( m_menuFile, _("&Program") ); - - m_menuAdvanced = new wxMenu(); - m_menuLanguages = new wxMenu(); - m_menuAdvanced->Append( -1, _("&Language"), m_menuLanguages ); - - wxMenuItem* m_separator4; - m_separator4 = m_menuAdvanced->AppendSeparator(); - - m_menuItemGlobSett = new wxMenuItem( m_menuAdvanced, wxID_ANY, wxString( _("&Global settings...") ) , wxEmptyString, wxITEM_NORMAL ); - m_menuAdvanced->Append( m_menuItemGlobSett ); - - m_menuItem7 = new wxMenuItem( m_menuAdvanced, wxID_ANY, wxString( _("&Create batch job...") ) , wxEmptyString, wxITEM_NORMAL ); - m_menuAdvanced->Append( m_menuItem7 ); - - wxMenuItem* m_menuItem5; - m_menuItem5 = new wxMenuItem( m_menuAdvanced, wxID_ANY, wxString( _("&Export file list...") ) , wxEmptyString, wxITEM_NORMAL ); - m_menuAdvanced->Append( m_menuItem5 ); - - m_menubar1->Append( m_menuAdvanced, _("&Advanced") ); - - m_menuHelp = new wxMenu(); - wxMenuItem* m_menuItemReadme; - m_menuItemReadme = new wxMenuItem( m_menuHelp, wxID_ANY, wxString( _("&Content") ) + wxT('\t') + wxT("F1"), wxEmptyString, wxITEM_NORMAL ); - m_menuHelp->Append( m_menuItemReadme ); - - m_menuItemCheckVer = new wxMenuItem( m_menuHelp, wxID_ANY, wxString( _("&Check for new version") ) , wxEmptyString, wxITEM_NORMAL ); - m_menuHelp->Append( m_menuItemCheckVer ); - - wxMenuItem* m_separator5; - m_separator5 = 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_menubar1->Append( m_menuHelp, _("&Help") ); - - this->SetMenuBar( m_menubar1 ); - - bSizerPanelHolder = new wxBoxSizer( wxVERTICAL ); - - m_panelTopButtons = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER|wxTAB_TRAVERSAL ); - bSizerTopButtons = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer155; - bSizer155 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer155->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxFlexGridSizer* fgSizer121; - fgSizer121 = new wxFlexGridSizer( 2, 2, 0, 0 ); - fgSizer121->SetFlexibleDirection( wxBOTH ); - fgSizer121->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_staticTextCmpVariant = new wxStaticText( m_panelTopButtons, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextCmpVariant->Wrap( -1 ); - m_staticTextCmpVariant->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); - m_staticTextCmpVariant->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - - fgSizer121->Add( m_staticTextCmpVariant, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxTOP, 1 ); - - - fgSizer121->Add( 0, 0, 1, 0, 5 ); - - wxBoxSizer* bSizer30; - bSizer30 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonCompare = new wxButtonWithImage( m_panelTopButtons, wxID_OK, _("Compare"), wxDefaultPosition, wxSize( 180,42 ), 0 ); - m_buttonCompare->SetDefault(); - m_buttonCompare->SetFont( wxFont( 14, 74, 90, 92, false, wxEmptyString ) ); - m_buttonCompare->SetToolTip( _("Compare both sides") ); - - bSizer30->Add( m_buttonCompare, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonAbort = new wxButton( m_panelTopButtons, wxID_CANCEL, _("&Abort"), wxDefaultPosition, wxSize( 180,42 ), 0 ); - m_buttonAbort->SetFont( wxFont( 14, 74, 90, 92, false, wxEmptyString ) ); - m_buttonAbort->Enable( false ); - m_buttonAbort->Hide(); - - bSizer30->Add( m_buttonAbort, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - fgSizer121->Add( bSizer30, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonCmpConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,42 ), wxBU_AUTODRAW ); - m_bpButtonCmpConfig->SetToolTip( _("Comparison settings") ); - - fgSizer121->Add( m_bpButtonCmpConfig, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 3 ); - - bSizer155->Add( fgSizer121, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); - - bSizerTopButtons->Add( bSizer155, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerTopButtons->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer1551; - bSizer1551 = new wxBoxSizer( wxHORIZONTAL ); - - wxFlexGridSizer* fgSizer12; - fgSizer12 = new wxFlexGridSizer( 2, 2, 0, 0 ); - fgSizer12->SetFlexibleDirection( wxBOTH ); - fgSizer12->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - - fgSizer12->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_staticTextSyncVariant = new wxStaticText( m_panelTopButtons, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextSyncVariant->Wrap( -1 ); - m_staticTextSyncVariant->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); - m_staticTextSyncVariant->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - - fgSizer12->Add( m_staticTextSyncVariant, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP, 1 ); - - m_bpButtonSyncConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,42 ), wxBU_AUTODRAW ); - m_bpButtonSyncConfig->SetToolTip( _("Synchronization settings") ); - - fgSizer12->Add( m_bpButtonSyncConfig, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 3 ); - - m_buttonStartSync = new wxButtonWithImage( m_panelTopButtons, wxID_ANY, _("Synchronize..."), wxDefaultPosition, wxSize( 180,42 ), 0 ); - m_buttonStartSync->SetFont( wxFont( 14, 74, 90, 92, false, wxEmptyString ) ); - m_buttonStartSync->SetToolTip( _("Start synchronization") ); - - fgSizer12->Add( m_buttonStartSync, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer1551->Add( fgSizer12, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); - - - bSizer1551->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizerTopButtons->Add( bSizer1551, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelTopButtons->SetSizer( bSizerTopButtons ); - m_panelTopButtons->Layout(); - bSizerTopButtons->Fit( m_panelTopButtons ); - bSizerPanelHolder->Add( m_panelTopButtons, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_panelDirectoryPairs = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 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 ) ); - - sbSizerDirLeft = new wxStaticBoxSizer( new wxStaticBox( m_panelTopLeft, wxID_ANY, _("Drag && drop") ), wxHORIZONTAL ); - - m_directoryLeft = new CustomComboBox( m_panelTopLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - sbSizerDirLeft->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_dirPickerLeft = new FfsDirPickerCtrl( m_panelTopLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPickerLeft->SetToolTip( _("Select a folder") ); - - sbSizerDirLeft->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelTopLeft->SetSizer( sbSizerDirLeft ); - m_panelTopLeft->Layout(); - sbSizerDirLeft->Fit( m_panelTopLeft ); - bSizer91->Add( m_panelTopLeft, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelTopMiddle = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer93; - bSizer93 = new wxBoxSizer( wxVERTICAL ); - - - bSizer93->Add( 0, 3, 0, 0, 5 ); - - m_bpButtonSwapSides = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW ); - m_bpButtonSwapSides->SetToolTip( _("Swap sides") ); - - bSizer93->Add( m_bpButtonSwapSides, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - wxBoxSizer* bSizer160; - bSizer160 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer160->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonLocalFilter = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); - bSizer160->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer160->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonAltSyncCfg = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); - bSizer160->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer160->Add( 0, 0, 1, wxEXPAND, 5 ); - - bSizer93->Add( bSizer160, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_panelTopMiddle->SetSizer( bSizer93 ); - m_panelTopMiddle->Layout(); - bSizer93->Fit( m_panelTopMiddle ); - bSizer91->Add( m_panelTopMiddle, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_panelTopRight = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelTopRight->SetMinSize( wxSize( 1,1 ) ); - - sbSizerDirRight = new wxStaticBoxSizer( new wxStaticBox( m_panelTopRight, wxID_ANY, _("Drag && drop") ), wxHORIZONTAL ); - - m_bpButtonAddPair = new wxBitmapButton( m_panelTopRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); - m_bpButtonAddPair->SetToolTip( _("Add folder pair") ); - - sbSizerDirRight->Add( m_bpButtonAddPair, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 3 ); - - m_bpButtonRemovePair = new wxBitmapButton( m_panelTopRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); - m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); - - sbSizerDirRight->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_directoryRight = new CustomComboBox( m_panelTopRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - sbSizerDirRight->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_dirPickerRight = new FfsDirPickerCtrl( m_panelTopRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPickerRight->SetToolTip( _("Select a folder") ); - - sbSizerDirRight->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelTopRight->SetSizer( sbSizerDirRight ); - m_panelTopRight->Layout(); - sbSizerDirRight->Fit( m_panelTopRight ); - bSizer91->Add( m_panelTopRight, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - bSizer1601->Add( bSizer91, 0, wxEXPAND, 5 ); - - m_scrolledWindowFolderPairs = new wxScrolledWindow( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxHSCROLL|wxVSCROLL ); - m_scrolledWindowFolderPairs->SetScrollRate( 5, 5 ); - m_scrolledWindowFolderPairs->SetMinSize( wxSize( -1,0 ) ); - - bSizerAddFolderPairs = new wxBoxSizer( wxVERTICAL ); - - m_scrolledWindowFolderPairs->SetSizer( bSizerAddFolderPairs ); - m_scrolledWindowFolderPairs->Layout(); - bSizerAddFolderPairs->Fit( m_scrolledWindowFolderPairs ); - bSizer1601->Add( m_scrolledWindowFolderPairs, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_panelDirectoryPairs->SetSizer( bSizer1601 ); - m_panelDirectoryPairs->Layout(); - bSizer1601->Fit( m_panelDirectoryPairs ); - bSizerPanelHolder->Add( m_panelDirectoryPairs, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_panelGrids = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelGrids->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_APPWORKSPACE ) ); - - bSizerGridHolder = new wxBoxSizer( wxHORIZONTAL ); - - m_panelLeft = new wxPanel( m_panelGrids, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer7; - bSizer7 = new wxBoxSizer( wxVERTICAL ); - - m_gridLeft = new CustomGridLeft( m_panelLeft, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - - // Grid - m_gridLeft->CreateGrid( 15, 4 ); - m_gridLeft->EnableEditing( false ); - m_gridLeft->EnableGridLines( true ); - m_gridLeft->EnableDragGridSize( true ); - m_gridLeft->SetMargins( 0, 0 ); - - // Columns - m_gridLeft->EnableDragColMove( false ); - m_gridLeft->EnableDragColSize( true ); - m_gridLeft->SetColLabelSize( 20 ); - m_gridLeft->SetColLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); - - // Rows - m_gridLeft->EnableDragRowSize( false ); - m_gridLeft->SetRowLabelSize( 38 ); - m_gridLeft->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); - - // Label Appearance - - // Cell Defaults - m_gridLeft->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); - m_gridLeft->SetMinSize( wxSize( 1,1 ) ); - - bSizer7->Add( m_gridLeft, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_panelLeft->SetSizer( bSizer7 ); - m_panelLeft->Layout(); - bSizer7->Fit( m_panelLeft ); - bSizerGridHolder->Add( m_panelLeft, 1, wxEXPAND, 5 ); - - m_panelMiddle = new wxPanel( m_panelGrids, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer18; - bSizer18 = new wxBoxSizer( wxVERTICAL ); - - m_gridMiddle = new CustomGridMiddle( m_panelMiddle, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - - // Grid - m_gridMiddle->CreateGrid( 15, 1 ); - m_gridMiddle->EnableEditing( false ); - m_gridMiddle->EnableGridLines( true ); - m_gridMiddle->EnableDragGridSize( false ); - m_gridMiddle->SetMargins( 0, 0 ); - - // Columns - m_gridMiddle->SetColSize( 0, 60 ); - m_gridMiddle->EnableDragColMove( false ); - m_gridMiddle->EnableDragColSize( false ); - m_gridMiddle->SetColLabelSize( 20 ); - m_gridMiddle->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); - - // Rows - m_gridMiddle->EnableDragRowSize( false ); - m_gridMiddle->SetRowLabelSize( 0 ); - m_gridMiddle->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); - - // Label Appearance - - // Cell Defaults - m_gridMiddle->SetDefaultCellFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxT("Arial") ) ); - m_gridMiddle->SetDefaultCellAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); - bSizer18->Add( m_gridMiddle, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); - - m_panelMiddle->SetSizer( bSizer18 ); - m_panelMiddle->Layout(); - bSizer18->Fit( m_panelMiddle ); - bSizerGridHolder->Add( m_panelMiddle, 0, wxEXPAND, 5 ); - - m_panelRight = new wxPanel( m_panelGrids, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer10; - bSizer10 = new wxBoxSizer( wxVERTICAL ); - - m_gridRight = new CustomGridRight( m_panelRight, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - - // Grid - m_gridRight->CreateGrid( 15, 4 ); - m_gridRight->EnableEditing( false ); - m_gridRight->EnableGridLines( true ); - m_gridRight->EnableDragGridSize( true ); - m_gridRight->SetMargins( 0, 0 ); - - // Columns - m_gridRight->EnableDragColMove( false ); - m_gridRight->EnableDragColSize( true ); - m_gridRight->SetColLabelSize( 20 ); - m_gridRight->SetColLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); - - // Rows - m_gridRight->EnableDragRowSize( false ); - m_gridRight->SetRowLabelSize( 38 ); - m_gridRight->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); - - // Label Appearance - - // Cell Defaults - m_gridRight->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); - m_gridRight->SetMinSize( wxSize( 1,1 ) ); - - bSizer10->Add( m_gridRight, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_panelRight->SetSizer( bSizer10 ); - m_panelRight->Layout(); - bSizer10->Fit( m_panelRight ); - bSizerGridHolder->Add( m_panelRight, 1, wxEXPAND, 5 ); - - m_panelGrids->SetSizer( bSizerGridHolder ); - m_panelGrids->Layout(); - bSizerGridHolder->Fit( m_panelGrids ); - bSizerPanelHolder->Add( m_panelGrids, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_panelConfig = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - bSizerConfig = new wxBoxSizer( wxHORIZONTAL ); - - - bSizerConfig->Add( 10, 0, 0, 0, 5 ); - - wxBoxSizer* bSizer151; - bSizer151 = new wxBoxSizer( wxHORIZONTAL ); - - m_bpButtonSave = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - m_bpButtonSave->SetToolTip( _("Save current configuration to file") ); - - bSizer151->Add( m_bpButtonSave, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonLoad = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - m_bpButtonLoad->SetToolTip( _("Load configuration from file") ); - - bSizer151->Add( m_bpButtonLoad, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizerConfig->Add( bSizer151, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_listBoxHistory = new wxListBox( m_panelConfig, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_EXTENDED|wxLB_NEEDED_SB|wxLB_SORT ); - m_listBoxHistory->SetToolTip( _("Last used configurations (press DEL to remove from list)") ); - m_listBoxHistory->SetMinSize( wxSize( -1,40 ) ); - - bSizerConfig->Add( m_listBoxHistory, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelConfig->SetSizer( bSizerConfig ); - m_panelConfig->Layout(); - bSizerConfig->Fit( m_panelConfig ); - bSizerPanelHolder->Add( m_panelConfig, 0, 0, 5 ); - - m_panelFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer140; - bSizer140 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer140->Add( 10, 0, 0, 0, 5 ); - - m_bpButtonFilter = new wxBitmapButton( m_panelFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); - bSizer140->Add( m_bpButtonFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - wxBoxSizer* bSizer23; - bSizer23 = new wxBoxSizer( wxVERTICAL ); - - m_checkBoxHideFilt = new wxCheckBox( m_panelFilter, wxID_ANY, _("Hide excluded items"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxHideFilt->SetToolTip( _("Hide filtered or temporarily excluded files") ); - - bSizer23->Add( m_checkBoxHideFilt, 0, wxEXPAND, 5 ); - - bSizer140->Add( bSizer23, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelFilter->SetSizer( bSizer140 ); - m_panelFilter->Layout(); - bSizer140->Fit( m_panelFilter ); - bSizerPanelHolder->Add( m_panelFilter, 0, 0, 5 ); - - m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - bSizerStatistics = new wxBoxSizer( wxHORIZONTAL ); - - - bSizerStatistics->Add( 0, 0, 1, wxEXPAND, 5 ); - - wxFlexGridSizer* fgSizer5; - fgSizer5 = new wxFlexGridSizer( 2, 2, 0, 5 ); - fgSizer5->SetFlexibleDirection( wxHORIZONTAL ); - fgSizer5->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_bitmapCreate = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapCreate->SetToolTip( _("Number of files and directories that will be created") ); - - fgSizer5->Add( m_bitmapCreate, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_textCtrlCreate = new wxTextCtrl( m_panelStatistics, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); - m_textCtrlCreate->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); - m_textCtrlCreate->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - m_textCtrlCreate->SetToolTip( _("Number of files and directories that will be created") ); - - fgSizer5->Add( m_textCtrlCreate, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmapUpdate = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapUpdate->SetToolTip( _("Number of files that will be overwritten") ); - - fgSizer5->Add( m_bitmapUpdate, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_textCtrlUpdate = new wxTextCtrl( m_panelStatistics, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); - m_textCtrlUpdate->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); - m_textCtrlUpdate->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - m_textCtrlUpdate->SetToolTip( _("Number of files that will be overwritten") ); - - fgSizer5->Add( m_textCtrlUpdate, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizerStatistics->Add( fgSizer5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); - - wxFlexGridSizer* fgSizer6; - fgSizer6 = new wxFlexGridSizer( 2, 2, 0, 5 ); - fgSizer6->SetFlexibleDirection( wxHORIZONTAL ); - fgSizer6->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_bitmapDelete = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapDelete->SetToolTip( _("Number of files and directories that will be deleted") ); - - fgSizer6->Add( m_bitmapDelete, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlDelete = new wxTextCtrl( m_panelStatistics, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); - m_textCtrlDelete->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); - m_textCtrlDelete->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - m_textCtrlDelete->SetToolTip( _("Number of files and directories that will be deleted") ); - - fgSizer6->Add( m_textCtrlDelete, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapData->SetToolTip( _("Total amount of data that will be transferred") ); - - fgSizer6->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_textCtrlData = new wxTextCtrl( m_panelStatistics, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); - m_textCtrlData->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); - m_textCtrlData->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - m_textCtrlData->SetToolTip( _("Total amount of data that will be transferred") ); - - fgSizer6->Add( m_textCtrlData, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizerStatistics->Add( fgSizer6, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); - - - bSizerStatistics->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_panelStatistics->SetSizer( bSizerStatistics ); - m_panelStatistics->Layout(); - bSizerStatistics->Fit( m_panelStatistics ); - bSizerPanelHolder->Add( m_panelStatistics, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelViewFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - bSizerViewFilter = new wxBoxSizer( wxHORIZONTAL ); - - - bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_bpButtonSyncCreateLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonSyncCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonSyncDirOverwLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonSyncDirOverwLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonSyncDeleteLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonSyncDeleteLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonLeftOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonLeftNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonEqual = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonEqual, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonDifferent = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonSyncDirNone = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonSyncDirNone, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonRightNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonRightOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonSyncDeleteRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonSyncDeleteRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonSyncDirOverwRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonSyncDirOverwRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonSyncCreateRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonSyncCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonConflict = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonConflict, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_panelViewFilter->SetSizer( bSizerViewFilter ); - m_panelViewFilter->Layout(); - bSizerViewFilter->Fit( m_panelViewFilter ); - bSizerPanelHolder->Add( m_panelViewFilter, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelStatusBar = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer451; - bSizer451 = new wxBoxSizer( wxHORIZONTAL ); - - bSizer451->SetMinSize( wxSize( -1,22 ) ); - wxBoxSizer* bSizer53; - bSizer53 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextStatusLeft = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusLeft->Wrap( -1 ); - m_staticTextStatusLeft->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); - - bSizer53->Add( m_staticTextStatusLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer451->Add( bSizer53, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticline9 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer451->Add( m_staticline9, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxEXPAND, 2 ); - - - bSizer451->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextStatusMiddle = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusMiddle->Wrap( -1 ); - m_staticTextStatusMiddle->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); - - bSizer451->Add( m_staticTextStatusMiddle, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer451->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticline10 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer451->Add( m_staticline10, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP, 2 ); - - wxBoxSizer* bSizer52; - bSizer52 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextStatusRight = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusRight->Wrap( -1 ); - m_staticTextStatusRight->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); - - bSizer52->Add( m_staticTextStatusRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer50; - bSizer50 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer50->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap15 = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 10,10 ), 0 ); - bSizer50->Add( m_bitmap15, 0, wxALIGN_BOTTOM, 2 ); - - bSizer52->Add( bSizer50, 1, wxALIGN_BOTTOM|wxEXPAND, 5 ); - - bSizer451->Add( bSizer52, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelStatusBar->SetSizer( bSizer451 ); - m_panelStatusBar->Layout(); - bSizer451->Fit( m_panelStatusBar ); - bSizerPanelHolder->Add( m_panelStatusBar, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - this->SetSizer( bSizerPanelHolder ); - this->Layout(); - bSizerPanelHolder->Fit( this ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) ); - this->Connect( m_menuItem10->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) ); - this->Connect( m_menuItem11->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ) ); - this->Connect( m_menuItemSwitchView->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSwitchView ) ); - this->Connect( m_menuItemNew->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnNewConfig ) ); - this->Connect( m_menuItemSave->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ) ); - this->Connect( m_menuItemLoad->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ) ); - this->Connect( m_menuItem4->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) ); - this->Connect( m_menuItemGlobSett->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) ); - this->Connect( m_menuItem7->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuBatchJob ) ); - this->Connect( m_menuItem5->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) ); - this->Connect( m_menuItemReadme->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnShowHelp ) ); - this->Connect( m_menuItemCheckVer->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersion ) ); - 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_bpButtonSyncConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettings ), NULL, this ); - m_buttonStartSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ), NULL, this ); - m_dirPickerLeft->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); - m_bpButtonSwapSides->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapSides ), NULL, this ); - m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this ); - m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRemoveTopFolderPair ), NULL, this ); - m_dirPickerRight->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); - m_gridLeft->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnLeftGridDoubleClick ), NULL, this ); - m_gridLeft->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextRim ), NULL, this ); - m_gridLeft->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortLeftGrid ), NULL, this ); - m_gridLeft->Connect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextRimLabelLeft ), NULL, this ); - m_gridMiddle->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMiddle ), NULL, this ); - m_gridMiddle->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortMiddleGrid ), NULL, this ); - m_gridMiddle->Connect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMiddleLabel ), NULL, this ); - m_gridRight->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnRightGridDoubleClick ), NULL, this ); - m_gridRight->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextRim ), NULL, this ); - m_gridRight->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortRightGrid ), NULL, this ); - m_gridRight->Connect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextRimLabelRight ), NULL, this ); - m_bpButtonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ), NULL, this ); - m_bpButtonLoad->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ), NULL, this ); - m_listBoxHistory->Connect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnCfgHistoryKeyEvent ), NULL, this ); - m_listBoxHistory->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this ); - m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this ); - m_checkBoxHideFilt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideFilteredButton ), NULL, this ); - m_bpButtonSyncCreateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncCreateLeft ), NULL, this ); - m_bpButtonSyncDirOverwLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDirLeft ), NULL, this ); - m_bpButtonSyncDeleteLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDeleteLeft ), NULL, this ); - m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftOnlyFiles ), NULL, this ); - m_bpButtonLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftNewerFiles ), NULL, this ); - m_bpButtonEqual->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnEqualFiles ), NULL, this ); - m_bpButtonDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnDifferentFiles ), NULL, this ); - m_bpButtonSyncDirNone->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDirNone ), NULL, this ); - m_bpButtonRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightNewerFiles ), NULL, this ); - m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightOnlyFiles ), NULL, this ); - m_bpButtonSyncDeleteRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDeleteRight ), NULL, this ); - m_bpButtonSyncDirOverwRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDirRight ), NULL, this ); - m_bpButtonSyncCreateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncCreateRight ), NULL, this ); - m_bpButtonConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConflictFiles ), NULL, this ); + this->SetSizeHints( wxSize( 640,400 ), wxDefaultSize ); + + m_menubar1 = new wxMenuBar( 0 ); + m_menuFile = new wxMenu(); + m_menuItem10 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("1. &Compare") ) + wxT('\t') + wxT("F5"), wxEmptyString, wxITEM_NORMAL ); + m_menuFile->Append( m_menuItem10 ); + + m_menuItem11 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("2. &Synchronize...") ) + wxT('\t') + wxT("F6"), wxEmptyString, wxITEM_NORMAL ); + m_menuFile->Append( m_menuItem11 ); + + wxMenuItem* m_separator1; + m_separator1 = m_menuFile->AppendSeparator(); + + m_menuItemSwitchView = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("S&witch view") ) + wxT('\t') + wxT("F8"), wxEmptyString, wxITEM_NORMAL ); + m_menuFile->Append( m_menuItemSwitchView ); + + wxMenuItem* m_separator2; + m_separator2 = m_menuFile->AppendSeparator(); + + m_menuItemNew = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("&New") ) + wxT('\t') + wxT("Ctrl-N"), wxEmptyString, wxITEM_NORMAL ); + m_menuFile->Append( m_menuItemNew ); + + m_menuItemSave = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("S&ave configuration...") ) + wxT('\t') + wxT("Ctrl-S"), wxEmptyString, wxITEM_NORMAL ); + m_menuFile->Append( m_menuItemSave ); + + m_menuItemLoad = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("&Load configuration...") ) + wxT('\t') + wxT("Ctrl-O"), wxEmptyString, wxITEM_NORMAL ); + m_menuFile->Append( m_menuItemLoad ); + + wxMenuItem* m_separator3; + m_separator3 = m_menuFile->AppendSeparator(); + + wxMenuItem* m_menuItem4; + m_menuItem4 = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("&Quit") ) + wxT('\t') + wxT("Ctrl-Q"), wxEmptyString, wxITEM_NORMAL ); + m_menuFile->Append( m_menuItem4 ); + + m_menubar1->Append( m_menuFile, _("&Program") ); + + m_menuAdvanced = new wxMenu(); + m_menuLanguages = new wxMenu(); + m_menuAdvanced->Append( -1, _("&Language"), m_menuLanguages ); + + wxMenuItem* m_separator4; + m_separator4 = m_menuAdvanced->AppendSeparator(); + + m_menuItemGlobSett = new wxMenuItem( m_menuAdvanced, wxID_ANY, wxString( _("&Global settings...") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuAdvanced->Append( m_menuItemGlobSett ); + + m_menuItem7 = new wxMenuItem( m_menuAdvanced, wxID_ANY, wxString( _("&Create batch job...") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuAdvanced->Append( m_menuItem7 ); + + wxMenuItem* m_menuItem5; + m_menuItem5 = new wxMenuItem( m_menuAdvanced, wxID_ANY, wxString( _("&Export file list...") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuAdvanced->Append( m_menuItem5 ); + + m_menubar1->Append( m_menuAdvanced, _("&Advanced") ); + + m_menuHelp = new wxMenu(); + wxMenuItem* m_menuItemReadme; + m_menuItemReadme = new wxMenuItem( m_menuHelp, wxID_ANY, wxString( _("&Content") ) + wxT('\t') + wxT("F1"), wxEmptyString, wxITEM_NORMAL ); + m_menuHelp->Append( m_menuItemReadme ); + + m_menuItemCheckVer = new wxMenuItem( m_menuHelp, wxID_ANY, wxString( _("&Check for new version") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuHelp->Append( m_menuItemCheckVer ); + + wxMenuItem* m_separator5; + m_separator5 = 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_menubar1->Append( m_menuHelp, _("&Help") ); + + this->SetMenuBar( m_menubar1 ); + + bSizerPanelHolder = new wxBoxSizer( wxVERTICAL ); + + m_panelTopButtons = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER|wxTAB_TRAVERSAL ); + bSizerTopButtons = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer155; + bSizer155 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer155->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxFlexGridSizer* fgSizer121; + fgSizer121 = new wxFlexGridSizer( 2, 2, 0, 0 ); + fgSizer121->SetFlexibleDirection( wxBOTH ); + fgSizer121->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_staticTextCmpVariant = new wxStaticText( m_panelTopButtons, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextCmpVariant->Wrap( -1 ); + m_staticTextCmpVariant->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); + m_staticTextCmpVariant->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + + fgSizer121->Add( m_staticTextCmpVariant, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxTOP, 1 ); + + + fgSizer121->Add( 0, 0, 1, 0, 5 ); + + wxBoxSizer* bSizer30; + bSizer30 = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonCompare = new wxButtonWithImage( m_panelTopButtons, wxID_OK, _("Compare"), wxDefaultPosition, wxSize( 180,42 ), 0 ); + m_buttonCompare->SetDefault(); + m_buttonCompare->SetFont( wxFont( 14, 74, 90, 92, false, wxEmptyString ) ); + m_buttonCompare->SetToolTip( _("Compare both sides") ); + + bSizer30->Add( m_buttonCompare, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonAbort = new wxButton( m_panelTopButtons, wxID_CANCEL, _("&Abort"), wxDefaultPosition, wxSize( 180,42 ), 0 ); + m_buttonAbort->SetFont( wxFont( 14, 74, 90, 92, false, wxEmptyString ) ); + m_buttonAbort->Enable( false ); + m_buttonAbort->Hide(); + + bSizer30->Add( m_buttonAbort, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + fgSizer121->Add( bSizer30, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonCmpConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,42 ), wxBU_AUTODRAW ); + m_bpButtonCmpConfig->SetToolTip( _("Comparison settings") ); + + fgSizer121->Add( m_bpButtonCmpConfig, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 3 ); + + bSizer155->Add( fgSizer121, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); + + bSizerTopButtons->Add( bSizer155, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerTopButtons->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer1551; + bSizer1551 = new wxBoxSizer( wxHORIZONTAL ); + + wxFlexGridSizer* fgSizer12; + fgSizer12 = new wxFlexGridSizer( 2, 2, 0, 0 ); + fgSizer12->SetFlexibleDirection( wxBOTH ); + fgSizer12->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + + fgSizer12->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_staticTextSyncVariant = new wxStaticText( m_panelTopButtons, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextSyncVariant->Wrap( -1 ); + m_staticTextSyncVariant->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); + m_staticTextSyncVariant->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + + fgSizer12->Add( m_staticTextSyncVariant, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP, 1 ); + + m_bpButtonSyncConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,42 ), wxBU_AUTODRAW ); + m_bpButtonSyncConfig->SetToolTip( _("Synchronization settings") ); + + fgSizer12->Add( m_bpButtonSyncConfig, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 3 ); + + m_buttonStartSync = new wxButtonWithImage( m_panelTopButtons, wxID_ANY, _("Synchronize..."), wxDefaultPosition, wxSize( 180,42 ), 0 ); + m_buttonStartSync->SetFont( wxFont( 14, 74, 90, 92, false, wxEmptyString ) ); + m_buttonStartSync->SetToolTip( _("Start synchronization") ); + + fgSizer12->Add( m_buttonStartSync, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer1551->Add( fgSizer12, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); + + + bSizer1551->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizerTopButtons->Add( bSizer1551, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panelTopButtons->SetSizer( bSizerTopButtons ); + m_panelTopButtons->Layout(); + bSizerTopButtons->Fit( m_panelTopButtons ); + bSizerPanelHolder->Add( m_panelTopButtons, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_panelDirectoryPairs = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 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 ) ); + + sbSizerDirLeft = new wxStaticBoxSizer( new wxStaticBox( m_panelTopLeft, wxID_ANY, _("Drag && drop") ), wxHORIZONTAL ); + + m_bpButtonAddPair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); + m_bpButtonAddPair->SetToolTip( _("Add folder pair") ); + + sbSizerDirLeft->Add( m_bpButtonAddPair, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 3 ); + + m_bpButtonRemovePair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); + m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); + + sbSizerDirLeft->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_directoryLeft = new FolderHistoryBox( m_panelTopLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + sbSizerDirLeft->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_dirPickerLeft = new FfsDirPickerCtrl( m_panelTopLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); + m_dirPickerLeft->SetToolTip( _("Select a folder") ); + + sbSizerDirLeft->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panelTopLeft->SetSizer( sbSizerDirLeft ); + m_panelTopLeft->Layout(); + sbSizerDirLeft->Fit( m_panelTopLeft ); + bSizer91->Add( m_panelTopLeft, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + m_panelTopMiddle = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer93; + bSizer93 = new wxBoxSizer( wxVERTICAL ); + + + bSizer93->Add( 0, 3, 0, 0, 5 ); + + m_bpButtonSwapSides = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW ); + m_bpButtonSwapSides->SetToolTip( _("Swap sides") ); + + bSizer93->Add( m_bpButtonSwapSides, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer160; + bSizer160 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer160->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonAltCompCfg = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); + bSizer160->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonLocalFilter = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); + bSizer160->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 3 ); + + m_bpButtonAltSyncCfg = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); + bSizer160->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer160->Add( 0, 0, 1, wxEXPAND, 5 ); + + bSizer93->Add( bSizer160, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_panelTopMiddle->SetSizer( bSizer93 ); + m_panelTopMiddle->Layout(); + bSizer93->Fit( m_panelTopMiddle ); + bSizer91->Add( m_panelTopMiddle, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_panelTopRight = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelTopRight->SetMinSize( wxSize( 1,1 ) ); + + sbSizerDirRight = new wxStaticBoxSizer( new wxStaticBox( m_panelTopRight, wxID_ANY, _("Drag && drop") ), wxHORIZONTAL ); + + m_directoryRight = new FolderHistoryBox( m_panelTopRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + sbSizerDirRight->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_dirPickerRight = new FfsDirPickerCtrl( m_panelTopRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); + m_dirPickerRight->SetToolTip( _("Select a folder") ); + + sbSizerDirRight->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panelTopRight->SetSizer( sbSizerDirRight ); + m_panelTopRight->Layout(); + sbSizerDirRight->Fit( m_panelTopRight ); + bSizer91->Add( m_panelTopRight, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + bSizer1601->Add( bSizer91, 0, wxEXPAND, 5 ); + + m_scrolledWindowFolderPairs = new wxScrolledWindow( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxHSCROLL|wxVSCROLL ); + m_scrolledWindowFolderPairs->SetScrollRate( 5, 5 ); + m_scrolledWindowFolderPairs->SetMinSize( wxSize( -1,0 ) ); + + bSizerAddFolderPairs = new wxBoxSizer( wxVERTICAL ); + + m_scrolledWindowFolderPairs->SetSizer( bSizerAddFolderPairs ); + m_scrolledWindowFolderPairs->Layout(); + bSizerAddFolderPairs->Fit( m_scrolledWindowFolderPairs ); + bSizer1601->Add( m_scrolledWindowFolderPairs, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_panelDirectoryPairs->SetSizer( bSizer1601 ); + m_panelDirectoryPairs->Layout(); + bSizer1601->Fit( m_panelDirectoryPairs ); + bSizerPanelHolder->Add( m_panelDirectoryPairs, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_panelGrids = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelGrids->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_APPWORKSPACE ) ); + + bSizerGridHolder = new wxBoxSizer( wxHORIZONTAL ); + + m_panelLeft = new wxPanel( m_panelGrids, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer7; + bSizer7 = new wxBoxSizer( wxVERTICAL ); + + m_gridLeft = new CustomGridLeft( m_panelLeft, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + + // Grid + m_gridLeft->CreateGrid( 15, 4 ); + m_gridLeft->EnableEditing( false ); + m_gridLeft->EnableGridLines( true ); + m_gridLeft->EnableDragGridSize( true ); + m_gridLeft->SetMargins( 0, 0 ); + + // Columns + m_gridLeft->EnableDragColMove( false ); + m_gridLeft->EnableDragColSize( true ); + m_gridLeft->SetColLabelSize( 20 ); + m_gridLeft->SetColLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); + + // Rows + m_gridLeft->EnableDragRowSize( false ); + m_gridLeft->SetRowLabelSize( 38 ); + m_gridLeft->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Label Appearance + + // Cell Defaults + m_gridLeft->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); + m_gridLeft->SetMinSize( wxSize( 1,1 ) ); + + bSizer7->Add( m_gridLeft, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_panelLeft->SetSizer( bSizer7 ); + m_panelLeft->Layout(); + bSizer7->Fit( m_panelLeft ); + bSizerGridHolder->Add( m_panelLeft, 1, wxEXPAND, 5 ); + + m_panelMiddle = new wxPanel( m_panelGrids, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer18; + bSizer18 = new wxBoxSizer( wxVERTICAL ); + + m_gridMiddle = new CustomGridMiddle( m_panelMiddle, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + + // Grid + m_gridMiddle->CreateGrid( 15, 1 ); + m_gridMiddle->EnableEditing( false ); + m_gridMiddle->EnableGridLines( true ); + m_gridMiddle->EnableDragGridSize( false ); + m_gridMiddle->SetMargins( 0, 0 ); + + // Columns + m_gridMiddle->SetColSize( 0, 60 ); + m_gridMiddle->EnableDragColMove( false ); + m_gridMiddle->EnableDragColSize( false ); + m_gridMiddle->SetColLabelSize( 20 ); + m_gridMiddle->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Rows + m_gridMiddle->EnableDragRowSize( false ); + m_gridMiddle->SetRowLabelSize( 0 ); + m_gridMiddle->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Label Appearance + + // Cell Defaults + m_gridMiddle->SetDefaultCellFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxT("Arial") ) ); + m_gridMiddle->SetDefaultCellAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + bSizer18->Add( m_gridMiddle, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); + + m_panelMiddle->SetSizer( bSizer18 ); + m_panelMiddle->Layout(); + bSizer18->Fit( m_panelMiddle ); + bSizerGridHolder->Add( m_panelMiddle, 0, wxEXPAND, 5 ); + + m_panelRight = new wxPanel( m_panelGrids, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer10; + bSizer10 = new wxBoxSizer( wxVERTICAL ); + + m_gridRight = new CustomGridRight( m_panelRight, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + + // Grid + m_gridRight->CreateGrid( 15, 4 ); + m_gridRight->EnableEditing( false ); + m_gridRight->EnableGridLines( true ); + m_gridRight->EnableDragGridSize( true ); + m_gridRight->SetMargins( 0, 0 ); + + // Columns + m_gridRight->EnableDragColMove( false ); + m_gridRight->EnableDragColSize( true ); + m_gridRight->SetColLabelSize( 20 ); + m_gridRight->SetColLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); + + // Rows + m_gridRight->EnableDragRowSize( false ); + m_gridRight->SetRowLabelSize( 38 ); + m_gridRight->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Label Appearance + + // Cell Defaults + m_gridRight->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); + m_gridRight->SetMinSize( wxSize( 1,1 ) ); + + bSizer10->Add( m_gridRight, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_panelRight->SetSizer( bSizer10 ); + m_panelRight->Layout(); + bSizer10->Fit( m_panelRight ); + bSizerGridHolder->Add( m_panelRight, 1, wxEXPAND, 5 ); + + m_panelGrids->SetSizer( bSizerGridHolder ); + m_panelGrids->Layout(); + bSizerGridHolder->Fit( m_panelGrids ); + bSizerPanelHolder->Add( m_panelGrids, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_panelConfig = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + bSizerConfig = new wxBoxSizer( wxHORIZONTAL ); + + + bSizerConfig->Add( 10, 0, 0, 0, 5 ); + + wxBoxSizer* bSizer151; + bSizer151 = new wxBoxSizer( wxHORIZONTAL ); + + m_bpButtonSave = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButtonSave->SetToolTip( _("Save current configuration to file") ); + + bSizer151->Add( m_bpButtonSave, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonLoad = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButtonLoad->SetToolTip( _("Load configuration from file") ); + + bSizer151->Add( m_bpButtonLoad, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizerConfig->Add( bSizer151, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_listBoxHistory = new wxListBox( m_panelConfig, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_EXTENDED|wxLB_NEEDED_SB|wxLB_SORT ); + m_listBoxHistory->SetToolTip( _("Last used configurations (press DEL to remove from list)") ); + m_listBoxHistory->SetMinSize( wxSize( -1,40 ) ); + + bSizerConfig->Add( m_listBoxHistory, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + m_panelConfig->SetSizer( bSizerConfig ); + m_panelConfig->Layout(); + bSizerConfig->Fit( m_panelConfig ); + bSizerPanelHolder->Add( m_panelConfig, 0, 0, 5 ); + + m_panelFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer140; + bSizer140 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer140->Add( 10, 0, 0, 0, 5 ); + + m_bpButtonFilter = new wxBitmapButton( m_panelFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); + bSizer140->Add( m_bpButtonFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + wxBoxSizer* bSizer23; + bSizer23 = new wxBoxSizer( wxVERTICAL ); + + m_checkBoxHideFilt = new wxCheckBox( m_panelFilter, wxID_ANY, _("Hide excluded items"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxHideFilt->SetToolTip( _("Hide filtered or temporarily excluded files") ); + + bSizer23->Add( m_checkBoxHideFilt, 0, wxEXPAND, 5 ); + + bSizer140->Add( bSizer23, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panelFilter->SetSizer( bSizer140 ); + m_panelFilter->Layout(); + bSizer140->Fit( m_panelFilter ); + bSizerPanelHolder->Add( m_panelFilter, 0, 0, 5 ); + + m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + bSizerStatistics = new wxBoxSizer( wxHORIZONTAL ); + + + bSizerStatistics->Add( 0, 0, 1, wxEXPAND, 5 ); + + wxFlexGridSizer* fgSizer5; + fgSizer5 = new wxFlexGridSizer( 2, 2, 0, 5 ); + fgSizer5->SetFlexibleDirection( wxHORIZONTAL ); + fgSizer5->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_bitmapCreate = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapCreate->SetToolTip( _("Number of files and directories that will be created") ); + + fgSizer5->Add( m_bitmapCreate, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_textCtrlCreate = new wxTextCtrl( m_panelStatistics, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); + m_textCtrlCreate->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); + m_textCtrlCreate->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + m_textCtrlCreate->SetToolTip( _("Number of files and directories that will be created") ); + + fgSizer5->Add( m_textCtrlCreate, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmapUpdate = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapUpdate->SetToolTip( _("Number of files that will be overwritten") ); + + fgSizer5->Add( m_bitmapUpdate, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_textCtrlUpdate = new wxTextCtrl( m_panelStatistics, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); + m_textCtrlUpdate->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); + m_textCtrlUpdate->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + m_textCtrlUpdate->SetToolTip( _("Number of files that will be overwritten") ); + + fgSizer5->Add( m_textCtrlUpdate, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizerStatistics->Add( fgSizer5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + wxFlexGridSizer* fgSizer6; + fgSizer6 = new wxFlexGridSizer( 2, 2, 0, 5 ); + fgSizer6->SetFlexibleDirection( wxHORIZONTAL ); + fgSizer6->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_bitmapDelete = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapDelete->SetToolTip( _("Number of files and directories that will be deleted") ); + + fgSizer6->Add( m_bitmapDelete, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlDelete = new wxTextCtrl( m_panelStatistics, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); + m_textCtrlDelete->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); + m_textCtrlDelete->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + m_textCtrlDelete->SetToolTip( _("Number of files and directories that will be deleted") ); + + fgSizer6->Add( m_textCtrlDelete, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapData->SetToolTip( _("Total amount of data that will be transferred") ); + + fgSizer6->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_textCtrlData = new wxTextCtrl( m_panelStatistics, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); + m_textCtrlData->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); + m_textCtrlData->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + m_textCtrlData->SetToolTip( _("Total amount of data that will be transferred") ); + + fgSizer6->Add( m_textCtrlData, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizerStatistics->Add( fgSizer6, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + + bSizerStatistics->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_panelStatistics->SetSizer( bSizerStatistics ); + m_panelStatistics->Layout(); + bSizerStatistics->Fit( m_panelStatistics ); + bSizerPanelHolder->Add( m_panelStatistics, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panelViewFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + bSizerViewFilter = new wxBoxSizer( wxHORIZONTAL ); + + + bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_bpButtonSyncCreateLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonSyncCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonSyncDirOverwLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonSyncDirOverwLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonSyncDeleteLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonSyncDeleteLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonLeftOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonLeftNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonEqual = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonEqual, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonDifferent = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonSyncDirNone = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonSyncDirNone, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonRightNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonRightOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonSyncDeleteRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonSyncDeleteRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonSyncDirOverwRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonSyncDirOverwRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonSyncCreateRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonSyncCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonConflict = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonConflict, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_panelViewFilter->SetSizer( bSizerViewFilter ); + m_panelViewFilter->Layout(); + bSizerViewFilter->Fit( m_panelViewFilter ); + bSizerPanelHolder->Add( m_panelViewFilter, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panelStatusBar = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer451; + bSizer451 = new wxBoxSizer( wxHORIZONTAL ); + + bSizer451->SetMinSize( wxSize( -1,22 ) ); + wxBoxSizer* bSizer53; + bSizer53 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextStatusLeft = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusLeft->Wrap( -1 ); + m_staticTextStatusLeft->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); + + bSizer53->Add( m_staticTextStatusLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer451->Add( bSizer53, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticline9 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer451->Add( m_staticline9, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxEXPAND, 2 ); + + + bSizer451->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextStatusMiddle = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusMiddle->Wrap( -1 ); + m_staticTextStatusMiddle->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); + + bSizer451->Add( m_staticTextStatusMiddle, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer451->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticline10 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer451->Add( m_staticline10, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP, 2 ); + + wxBoxSizer* bSizer52; + bSizer52 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextStatusRight = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusRight->Wrap( -1 ); + m_staticTextStatusRight->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); + + bSizer52->Add( m_staticTextStatusRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer50; + bSizer50 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer50->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap15 = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 10,10 ), 0 ); + bSizer50->Add( m_bitmap15, 0, wxALIGN_BOTTOM, 2 ); + + bSizer52->Add( bSizer50, 1, wxALIGN_BOTTOM|wxEXPAND, 5 ); + + bSizer451->Add( bSizer52, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + m_panelStatusBar->SetSizer( bSizer451 ); + m_panelStatusBar->Layout(); + bSizer451->Fit( m_panelStatusBar ); + bSizerPanelHolder->Add( m_panelStatusBar, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + this->SetSizer( bSizerPanelHolder ); + this->Layout(); + bSizerPanelHolder->Fit( this ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) ); + this->Connect( m_menuItem10->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) ); + this->Connect( m_menuItem11->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ) ); + this->Connect( m_menuItemSwitchView->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSwitchView ) ); + this->Connect( m_menuItemNew->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnNewConfig ) ); + this->Connect( m_menuItemSave->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ) ); + this->Connect( m_menuItemLoad->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ) ); + this->Connect( m_menuItem4->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) ); + this->Connect( m_menuItemGlobSett->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) ); + this->Connect( m_menuItem7->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuBatchJob ) ); + this->Connect( m_menuItem5->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) ); + this->Connect( m_menuItemReadme->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnShowHelp ) ); + this->Connect( m_menuItemCheckVer->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersion ) ); + 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_bpButtonSyncConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettings ), NULL, this ); + m_buttonStartSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ), NULL, this ); + m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this ); + m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRemoveTopFolderPair ), NULL, this ); + m_dirPickerLeft->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); + m_bpButtonSwapSides->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapSides ), NULL, this ); + m_dirPickerRight->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); + m_gridLeft->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnLeftGridDoubleClick ), NULL, this ); + m_gridLeft->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextRim ), NULL, this ); + m_gridLeft->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortLeftGrid ), NULL, this ); + m_gridLeft->Connect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextRimLabelLeft ), NULL, this ); + m_gridMiddle->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMiddle ), NULL, this ); + m_gridMiddle->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortMiddleGrid ), NULL, this ); + m_gridMiddle->Connect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMiddleLabel ), NULL, this ); + m_gridRight->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnRightGridDoubleClick ), NULL, this ); + m_gridRight->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextRim ), NULL, this ); + m_gridRight->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortRightGrid ), NULL, this ); + m_gridRight->Connect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextRimLabelRight ), NULL, this ); + m_bpButtonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ), NULL, this ); + m_bpButtonLoad->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ), NULL, this ); + m_listBoxHistory->Connect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnCfgHistoryKeyEvent ), NULL, this ); + m_listBoxHistory->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this ); + m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this ); + m_checkBoxHideFilt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideFilteredButton ), NULL, this ); + m_bpButtonSyncCreateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncCreateLeft ), NULL, this ); + m_bpButtonSyncDirOverwLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDirLeft ), NULL, this ); + m_bpButtonSyncDeleteLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDeleteLeft ), NULL, this ); + m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftOnlyFiles ), NULL, this ); + m_bpButtonLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftNewerFiles ), NULL, this ); + m_bpButtonEqual->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnEqualFiles ), NULL, this ); + m_bpButtonDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnDifferentFiles ), NULL, this ); + m_bpButtonSyncDirNone->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDirNone ), NULL, this ); + m_bpButtonRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightNewerFiles ), NULL, this ); + m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightOnlyFiles ), NULL, this ); + m_bpButtonSyncDeleteRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDeleteRight ), NULL, this ); + m_bpButtonSyncDirOverwRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDirRight ), NULL, this ); + m_bpButtonSyncCreateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncCreateRight ), NULL, this ); + m_bpButtonConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConflictFiles ), NULL, this ); } MainDialogGenerated::~MainDialogGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSwitchView ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnNewConfig ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ) ); - this->Disconnect( wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuBatchJob ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnShowHelp ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersion ) ); - this->Disconnect( wxID_ABOUT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) ); - m_buttonCompare->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompare ), NULL, this ); - m_bpButtonCmpConfig->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCmpSettings ), NULL, this ); - m_bpButtonSyncConfig->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettings ), NULL, this ); - m_buttonStartSync->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ), NULL, this ); - m_dirPickerLeft->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); - m_bpButtonSwapSides->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapSides ), NULL, this ); - m_bpButtonAddPair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this ); - m_bpButtonRemovePair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRemoveTopFolderPair ), NULL, this ); - m_dirPickerRight->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); - m_gridLeft->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnLeftGridDoubleClick ), NULL, this ); - m_gridLeft->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextRim ), NULL, this ); - m_gridLeft->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortLeftGrid ), NULL, this ); - m_gridLeft->Disconnect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextRimLabelLeft ), NULL, this ); - m_gridMiddle->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMiddle ), NULL, this ); - m_gridMiddle->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortMiddleGrid ), NULL, this ); - m_gridMiddle->Disconnect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMiddleLabel ), NULL, this ); - m_gridRight->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnRightGridDoubleClick ), NULL, this ); - m_gridRight->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextRim ), NULL, this ); - m_gridRight->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortRightGrid ), NULL, this ); - m_gridRight->Disconnect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextRimLabelRight ), NULL, this ); - m_bpButtonSave->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ), NULL, this ); - m_bpButtonLoad->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ), NULL, this ); - m_listBoxHistory->Disconnect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnCfgHistoryKeyEvent ), NULL, this ); - m_listBoxHistory->Disconnect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this ); - m_bpButtonFilter->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this ); - m_checkBoxHideFilt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideFilteredButton ), NULL, this ); - m_bpButtonSyncCreateLeft->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncCreateLeft ), NULL, this ); - m_bpButtonSyncDirOverwLeft->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDirLeft ), NULL, this ); - m_bpButtonSyncDeleteLeft->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDeleteLeft ), NULL, this ); - m_bpButtonLeftOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftOnlyFiles ), NULL, this ); - m_bpButtonLeftNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftNewerFiles ), NULL, this ); - m_bpButtonEqual->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnEqualFiles ), NULL, this ); - m_bpButtonDifferent->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnDifferentFiles ), NULL, this ); - m_bpButtonSyncDirNone->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDirNone ), NULL, this ); - m_bpButtonRightNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightNewerFiles ), NULL, this ); - m_bpButtonRightOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightOnlyFiles ), NULL, this ); - m_bpButtonSyncDeleteRight->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDeleteRight ), NULL, this ); - m_bpButtonSyncDirOverwRight->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDirRight ), NULL, this ); - m_bpButtonSyncCreateRight->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncCreateRight ), NULL, this ); - m_bpButtonConflict->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConflictFiles ), NULL, this ); - + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSwitchView ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnNewConfig ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ) ); + this->Disconnect( wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuBatchJob ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnShowHelp ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersion ) ); + this->Disconnect( wxID_ABOUT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) ); + m_buttonCompare->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompare ), NULL, this ); + m_bpButtonCmpConfig->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCmpSettings ), NULL, this ); + m_bpButtonSyncConfig->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettings ), NULL, this ); + m_buttonStartSync->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ), NULL, this ); + m_bpButtonAddPair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this ); + m_bpButtonRemovePair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRemoveTopFolderPair ), NULL, this ); + m_dirPickerLeft->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); + m_bpButtonSwapSides->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapSides ), NULL, this ); + m_dirPickerRight->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); + m_gridLeft->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnLeftGridDoubleClick ), NULL, this ); + m_gridLeft->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextRim ), NULL, this ); + m_gridLeft->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortLeftGrid ), NULL, this ); + m_gridLeft->Disconnect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextRimLabelLeft ), NULL, this ); + m_gridMiddle->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMiddle ), NULL, this ); + m_gridMiddle->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortMiddleGrid ), NULL, this ); + m_gridMiddle->Disconnect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMiddleLabel ), NULL, this ); + m_gridRight->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnRightGridDoubleClick ), NULL, this ); + m_gridRight->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextRim ), NULL, this ); + m_gridRight->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortRightGrid ), NULL, this ); + m_gridRight->Disconnect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextRimLabelRight ), NULL, this ); + m_bpButtonSave->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ), NULL, this ); + m_bpButtonLoad->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ), NULL, this ); + m_listBoxHistory->Disconnect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnCfgHistoryKeyEvent ), NULL, this ); + m_listBoxHistory->Disconnect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this ); + m_bpButtonFilter->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this ); + m_checkBoxHideFilt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideFilteredButton ), NULL, this ); + m_bpButtonSyncCreateLeft->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncCreateLeft ), NULL, this ); + m_bpButtonSyncDirOverwLeft->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDirLeft ), NULL, this ); + m_bpButtonSyncDeleteLeft->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDeleteLeft ), NULL, this ); + m_bpButtonLeftOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftOnlyFiles ), NULL, this ); + m_bpButtonLeftNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftNewerFiles ), NULL, this ); + m_bpButtonEqual->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnEqualFiles ), NULL, this ); + m_bpButtonDifferent->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnDifferentFiles ), NULL, this ); + m_bpButtonSyncDirNone->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDirNone ), NULL, this ); + m_bpButtonRightNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightNewerFiles ), NULL, this ); + m_bpButtonRightOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightOnlyFiles ), NULL, this ); + m_bpButtonSyncDeleteRight->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDeleteRight ), NULL, this ); + m_bpButtonSyncDirOverwRight->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDirRight ), NULL, this ); + m_bpButtonSyncCreateRight->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncCreateRight ), NULL, this ); + m_bpButtonConflict->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConflictFiles ), NULL, this ); + } FolderPairGenerated::FolderPairGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) { - wxBoxSizer* bSizer74; - bSizer74 = new wxBoxSizer( wxHORIZONTAL ); - - m_panelLeft = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer134; - bSizer134 = new wxBoxSizer( wxHORIZONTAL ); - - m_directoryLeft = new wxTextCtrl( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer134->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - m_dirPickerLeft = new FfsDirPickerCtrl( m_panelLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPickerLeft->SetToolTip( _("Select a folder") ); - - bSizer134->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_panelLeft->SetSizer( bSizer134 ); - m_panelLeft->Layout(); - bSizer134->Fit( m_panelLeft ); - bSizer74->Add( m_panelLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panel20 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer95; - bSizer95 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer95->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_bpButtonLocalFilter = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); - bSizer95->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer95->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonAltSyncCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); - bSizer95->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer95->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_panel20->SetSizer( bSizer95 ); - m_panel20->Layout(); - bSizer95->Fit( m_panel20 ); - bSizer74->Add( m_panel20, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - - m_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer135; - bSizer135 = new wxBoxSizer( wxHORIZONTAL ); - - m_bpButtonRemovePair = new wxBitmapButton( m_panelRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); - m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); - - bSizer135->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - m_directoryRight = new wxTextCtrl( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer135->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_dirPickerRight = new FfsDirPickerCtrl( m_panelRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPickerRight->SetToolTip( _("Select a folder") ); - - bSizer135->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_panelRight->SetSizer( bSizer135 ); - m_panelRight->Layout(); - bSizer135->Fit( m_panelRight ); - bSizer74->Add( m_panelRight, 1, wxALIGN_CENTER_VERTICAL, 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 ); + wxBoxSizer* bSizer134; + bSizer134 = new wxBoxSizer( wxHORIZONTAL ); + + m_bpButtonRemovePair = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); + m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); + + bSizer134->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + m_directoryLeft = new FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer134->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_dirPickerLeft = new FfsDirPickerCtrl( m_panelLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); + m_dirPickerLeft->SetToolTip( _("Select a folder") ); + + bSizer134->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_panelLeft->SetSizer( bSizer134 ); + m_panelLeft->Layout(); + bSizer134->Fit( m_panelLeft ); + bSizer74->Add( m_panelLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panel20 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer95; + bSizer95 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer95->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_bpButtonAltCompCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); + bSizer95->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonLocalFilter = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); + bSizer95->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 3 ); + + m_bpButtonAltSyncCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); + bSizer95->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer95->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_panel20->SetSizer( bSizer95 ); + m_panel20->Layout(); + bSizer95->Fit( m_panel20 ); + bSizer74->Add( m_panel20, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer135; + bSizer135 = new wxBoxSizer( wxHORIZONTAL ); + + m_directoryRight = new FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer135->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + m_dirPickerRight = new FfsDirPickerCtrl( m_panelRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); + m_dirPickerRight->SetToolTip( _("Select a folder") ); + + bSizer135->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_panelRight->SetSizer( bSizer135 ); + m_panelRight->Layout(); + bSizer135->Fit( m_panelRight ); + bSizer74->Add( m_panelRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + this->SetSizer( bSizer74 ); + this->Layout(); + bSizer74->Fit( this ); } FolderPairGenerated::~FolderPairGenerated() { } -BatchFolderPairGenerated::BatchFolderPairGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) +BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - wxBoxSizer* bSizer142; - bSizer142 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer140; - bSizer140 = new wxBoxSizer( wxHORIZONTAL ); - - m_panel32 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDOUBLE_BORDER ); - wxBoxSizer* bSizer147; - bSizer147 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer136; - bSizer136 = new wxBoxSizer( wxVERTICAL ); - - m_bpButtonRemovePair = new wxBitmapButton( m_panel32, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); - m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); - - bSizer136->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer147->Add( bSizer136, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer143; - bSizer143 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer145; - bSizer145 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText53 = new wxStaticText( m_panel32, wxID_ANY, _("Left"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText53->Wrap( -1 ); - m_staticText53->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); - - bSizer145->Add( m_staticText53, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer143->Add( bSizer145, 1, 0, 5 ); - - wxBoxSizer* bSizer146; - bSizer146 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText541 = new wxStaticText( m_panel32, wxID_ANY, _("Right"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText541->Wrap( -1 ); - m_staticText541->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); - - bSizer146->Add( m_staticText541, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer143->Add( bSizer146, 1, 0, 5 ); - - bSizer147->Add( bSizer143, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); - - m_panel32->SetSizer( bSizer147 ); - m_panel32->Layout(); - bSizer147->Fit( m_panel32 ); - bSizer140->Add( m_panel32, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - wxBoxSizer* bSizer144; - bSizer144 = new wxBoxSizer( wxVERTICAL ); - - m_panelLeft = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer114; - bSizer114 = new wxBoxSizer( wxHORIZONTAL ); - - m_directoryLeft = new wxTextCtrl( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer114->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_dirPickerLeft = new FfsDirPickerCtrl( m_panelLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPickerLeft->SetToolTip( _("Select a folder") ); - - bSizer114->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonLocalFilter = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); - bSizer114->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelLeft->SetSizer( bSizer114 ); - m_panelLeft->Layout(); - bSizer114->Fit( m_panelLeft ); - bSizer144->Add( m_panelLeft, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer115; - bSizer115 = new wxBoxSizer( wxHORIZONTAL ); - - m_directoryRight = new wxTextCtrl( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer115->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_dirPickerRight = new FfsDirPickerCtrl( m_panelRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPickerRight->SetToolTip( _("Select a folder") ); - - bSizer115->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonAltSyncCfg = new wxBitmapButton( m_panelRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); - bSizer115->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelRight->SetSizer( bSizer115 ); - m_panelRight->Layout(); - bSizer115->Fit( m_panelRight ); - bSizer144->Add( m_panelRight, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer140->Add( bSizer144, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer142->Add( bSizer140, 0, wxEXPAND, 5 ); - - - bSizer142->Add( 0, 5, 0, 0, 5 ); - - this->SetSizer( bSizer142 ); - this->Layout(); - bSizer142->Fit( this ); + this->SetSizeHints( wxSize( 560,320 ), wxDefaultSize ); + + wxBoxSizer* bSizer54; + bSizer54 = new wxBoxSizer( wxVERTICAL ); + + bSizer69 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer87; + bSizer87 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap27 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); + bSizer87->Add( m_bitmap27, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); + m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); + + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxVERTICAL ); + + m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Batch job"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText56->Wrap( -1 ); + m_staticText56->SetFont( wxFont( 16, 70, 90, 92, false, wxEmptyString ) ); + + bSizer72->Add( m_staticText56, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_panel8->SetSizer( bSizer72 ); + m_panel8->Layout(); + bSizer72->Fit( m_panel8 ); + bSizer87->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer87->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer70; + bSizer70 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText44 = new wxStaticText( this, wxID_ANY, _("Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <ffs_batch file>. This can also be scheduled in your operating system's task planner."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText44->Wrap( 460 ); + bSizer70->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_bpButtonHelp = new wxBitmapButton( this, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButtonHelp->SetToolTip( _("Help") ); + + bSizer70->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + bSizer87->Add( bSizer70, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer69->Add( bSizer87, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_notebookSettings = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_panelOverview = new wxPanel( m_notebookSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer67; + bSizer67 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer120; + bSizer120 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer175; + bSizer175 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBoxSizer* sbSizer241; + sbSizer241 = new wxStaticBoxSizer( new wxStaticBox( m_panelOverview, wxID_ANY, _("Compare") ), wxHORIZONTAL ); + + m_bpButtonCmpConfig = new wxBitmapButton( m_panelOverview, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,42 ), wxBU_AUTODRAW ); + m_bpButtonCmpConfig->SetToolTip( _("Comparison settings") ); + + sbSizer241->Add( m_bpButtonCmpConfig, 0, wxALIGN_CENTER_VERTICAL, 3 ); + + + sbSizer241->Add( 10, 0, 0, 0, 5 ); + + m_staticTextCmpVariant = new wxStaticText( m_panelOverview, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextCmpVariant->Wrap( -1 ); + m_staticTextCmpVariant->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); + m_staticTextCmpVariant->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + + sbSizer241->Add( m_staticTextCmpVariant, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer175->Add( sbSizer241, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer175->Add( 0, 0, 1, wxEXPAND, 5 ); + + wxStaticBoxSizer* sbSizer26; + sbSizer26 = new wxStaticBoxSizer( new wxStaticBox( m_panelOverview, wxID_ANY, _("Filter files") ), wxVERTICAL ); + + m_bpButtonFilter = new wxBitmapButton( m_panelOverview, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); + sbSizer26->Add( m_bpButtonFilter, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 15 ); + + bSizer175->Add( sbSizer26, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer175->Add( 0, 0, 1, wxEXPAND, 5 ); + + wxStaticBoxSizer* sbSizer252; + sbSizer252 = new wxStaticBoxSizer( new wxStaticBox( m_panelOverview, wxID_ANY, _("Synchronize...") ), wxHORIZONTAL ); + + m_staticTextSyncVariant = new wxStaticText( m_panelOverview, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextSyncVariant->Wrap( -1 ); + m_staticTextSyncVariant->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); + m_staticTextSyncVariant->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + + sbSizer252->Add( m_staticTextSyncVariant, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + sbSizer252->Add( 10, 0, 0, 0, 5 ); + + m_bpButtonSyncConfig = new wxBitmapButton( m_panelOverview, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,42 ), wxBU_AUTODRAW ); + m_bpButtonSyncConfig->SetToolTip( _("Synchronization settings") ); + + sbSizer252->Add( m_bpButtonSyncConfig, 0, wxALIGN_CENTER_VERTICAL, 3 ); + + bSizer175->Add( sbSizer252, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer175->Add( 15, 0, 0, 0, 5 ); + + wxStaticBoxSizer* sbSizer25; + sbSizer25 = new wxStaticBoxSizer( new wxStaticBox( m_panelOverview, wxID_ANY, _("Error handling") ), wxHORIZONTAL ); + + wxArrayString m_choiceHandleErrorChoices; + m_choiceHandleError = new wxChoice( m_panelOverview, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleErrorChoices, 0 ); + m_choiceHandleError->SetSelection( 0 ); + sbSizer25->Add( m_choiceHandleError, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer175->Add( sbSizer25, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + bSizer120->Add( bSizer175, 0, wxEXPAND, 5 ); + + + bSizer120->Add( 0, 5, 0, 0, 5 ); + + m_scrolledWindow6 = new wxScrolledWindow( m_panelOverview, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_scrolledWindow6->SetScrollRate( 5, 5 ); + wxBoxSizer* bSizer141; + bSizer141 = new wxBoxSizer( wxVERTICAL ); + + sbSizerMainPair = new wxBoxSizer( wxHORIZONTAL ); + + m_panelMainPair = new wxPanel( m_scrolledWindow6, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDOUBLE_BORDER ); + wxBoxSizer* bSizer147; + bSizer147 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer1361; + bSizer1361 = new wxBoxSizer( wxHORIZONTAL ); + + m_bpButtonAddPair = new wxBitmapButton( m_panelMainPair, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); + m_bpButtonAddPair->SetToolTip( _("Add folder pair") ); + + bSizer1361->Add( m_bpButtonAddPair, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 3 ); + + m_bpButtonRemovePair = new wxBitmapButton( m_panelMainPair, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); + m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); + + bSizer1361->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer147->Add( bSizer1361, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer143; + bSizer143 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer145; + bSizer145 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText532 = new wxStaticText( m_panelMainPair, wxID_ANY, _("Left"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText532->Wrap( -1 ); + m_staticText532->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); + + bSizer145->Add( m_staticText532, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer143->Add( bSizer145, 1, 0, 5 ); + + wxBoxSizer* bSizer146; + bSizer146 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText5411 = new wxStaticText( m_panelMainPair, wxID_ANY, _("Right"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText5411->Wrap( -1 ); + m_staticText5411->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); + + bSizer146->Add( m_staticText5411, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer143->Add( bSizer146, 1, 0, 5 ); + + bSizer147->Add( bSizer143, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_panelMainPair->SetSizer( bSizer147 ); + m_panelMainPair->Layout(); + bSizer147->Fit( m_panelMainPair ); + sbSizerMainPair->Add( m_panelMainPair, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM, 5 ); + + wxBoxSizer* bSizer158; + bSizer158 = new wxBoxSizer( wxVERTICAL ); + + m_panelLeft = new wxPanel( m_scrolledWindow6, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer1141; + bSizer1141 = new wxBoxSizer( wxHORIZONTAL ); + + m_directoryLeft = new FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer1141->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_dirPickerLeft = new FfsDirPickerCtrl( m_panelLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); + m_dirPickerLeft->SetToolTip( _("Select a folder") ); + + bSizer1141->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panelLeft->SetSizer( bSizer1141 ); + m_panelLeft->Layout(); + bSizer1141->Fit( m_panelLeft ); + bSizer158->Add( m_panelLeft, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_panelRight = new wxPanel( m_scrolledWindow6, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer115; + bSizer115 = new wxBoxSizer( wxHORIZONTAL ); + + m_directoryRight = new FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer115->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_dirPickerRight = new FfsDirPickerCtrl( m_panelRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); + m_dirPickerRight->SetToolTip( _("Select a folder") ); + + bSizer115->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panelRight->SetSizer( bSizer115 ); + m_panelRight->Layout(); + bSizer115->Fit( m_panelRight ); + bSizer158->Add( m_panelRight, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizerMainPair->Add( bSizer158, 1, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); + + wxBoxSizer* bSizer177; + bSizer177 = new wxBoxSizer( wxHORIZONTAL ); + + m_bpButtonAltCompCfg = new wxBitmapButton( m_scrolledWindow6, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); + bSizer177->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonLocalFilter = new wxBitmapButton( m_scrolledWindow6, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); + bSizer177->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 3 ); + + m_bpButtonAltSyncCfg = new wxBitmapButton( m_scrolledWindow6, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); + bSizer177->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizerMainPair->Add( bSizer177, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + bSizer141->Add( sbSizerMainPair, 0, wxEXPAND, 5 ); + + bSizerAddFolderPairs = new wxBoxSizer( wxVERTICAL ); + + bSizer141->Add( bSizerAddFolderPairs, 1, wxEXPAND, 5 ); + + m_scrolledWindow6->SetSizer( bSizer141 ); + m_scrolledWindow6->Layout(); + bSizer141->Fit( m_scrolledWindow6 ); + bSizer120->Add( m_scrolledWindow6, 1, wxEXPAND, 5 ); + + + bSizer120->Add( 0, 5, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer67->Add( bSizer120, 1, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 10 ); + + m_panelOverview->SetSizer( bSizer67 ); + m_panelOverview->Layout(); + bSizer67->Fit( m_panelOverview ); + m_notebookSettings->AddPage( m_panelOverview, _("Overview"), true ); + m_panelBatchSettings = new wxPanel( m_notebookSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer117; + bSizer117 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer172; + bSizer172 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* sbSizer24; + sbSizer24 = new wxStaticBoxSizer( new wxStaticBox( m_panelBatchSettings, wxID_ANY, _("Status feedback") ), wxVERTICAL ); + + m_checkBoxSilent = new wxCheckBox( m_panelBatchSettings, wxID_ANY, _("Run minimized"), wxDefaultPosition, wxDefaultSize, 0 ); + sbSizer24->Add( m_checkBoxSilent, 0, wxALL|wxEXPAND, 5 ); + + bSizer172->Add( sbSizer24, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizer172->Add( 0, 5, 0, 0, 5 ); + + sbSizerLogfileDir = new wxStaticBoxSizer( new wxStaticBox( m_panelBatchSettings, wxID_ANY, _("Logging") ), wxVERTICAL ); + + wxBoxSizer* bSizer152; + bSizer152 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText96 = new wxStaticText( m_panelBatchSettings, wxID_ANY, _("Maximum number of logfiles:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText96->Wrap( -1 ); + bSizer152->Add( m_staticText96, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + + bSizer152->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_spinCtrlLogCountMax = new wxSpinCtrl( m_panelBatchSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); + bSizer152->Add( m_spinCtrlLogCountMax, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizerLogfileDir->Add( bSizer152, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_panelLogfile = new wxPanel( m_panelBatchSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer1721; + bSizer1721 = new wxBoxSizer( wxVERTICAL ); + + m_staticText94 = new wxStaticText( m_panelLogfile, wxID_ANY, _("Select logfile directory:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText94->Wrap( -1 ); + bSizer1721->Add( m_staticText94, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + wxBoxSizer* bSizer170; + bSizer170 = new wxBoxSizer( wxHORIZONTAL ); + + m_textCtrlLogfileDir = new wxTextCtrl( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer170->Add( m_textCtrlLogfileDir, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_dirPickerLogfileDir = new FfsDirPickerCtrl( m_panelLogfile, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); + m_dirPickerLogfileDir->SetToolTip( _("Select a folder") ); + + bSizer170->Add( m_dirPickerLogfileDir, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer1721->Add( bSizer170, 0, wxEXPAND, 5 ); + + m_panelLogfile->SetSizer( bSizer1721 ); + m_panelLogfile->Layout(); + bSizer1721->Fit( m_panelLogfile ); + sbSizerLogfileDir->Add( m_panelLogfile, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + bSizer172->Add( sbSizerLogfileDir, 0, wxEXPAND, 5 ); + + bSizer117->Add( bSizer172, 1, wxEXPAND|wxALL, 10 ); + + m_panelBatchSettings->SetSizer( bSizer117 ); + m_panelBatchSettings->Layout(); + bSizer117->Fit( m_panelBatchSettings ); + m_notebookSettings->AddPage( m_panelBatchSettings, _("Batch settings"), false ); + + bSizer69->Add( m_notebookSettings, 1, wxEXPAND, 5 ); + + wxBoxSizer* bSizer68; + bSizer68 = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonSave = new wxButton( this, wxID_SAVE, _("&Save"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonSave->SetDefault(); + m_buttonSave->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); + + bSizer68->Add( m_buttonSave, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_buttonLoad = new wxButton( this, wxID_OPEN, _("&Load"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonLoad->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer68->Add( m_buttonLoad, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_button6 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button6->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer68->Add( m_button6, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer69->Add( bSizer68, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer54->Add( bSizer69, 1, wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND, 5 ); + + this->SetSizer( bSizer54 ); + this->Layout(); + bSizer54->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); + m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnHelp ), NULL, this ); + m_bpButtonCmpConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCmpSettings ), NULL, this ); + m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnConfigureFilter ), NULL, this ); + m_bpButtonSyncConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSyncSettings ), NULL, this ); + m_choiceHandleError->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeErrorHandling ), NULL, this ); + m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnAddFolderPair ), NULL, this ); + m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnRemoveTopFolderPair ), NULL, this ); + m_spinCtrlLogCountMax->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchDlgGenerated::OnChangeMaxLogCountTxt ), NULL, this ); + m_buttonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this ); + m_buttonLoad->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLoadBatchJob ), NULL, this ); + m_button6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); } -BatchFolderPairGenerated::~BatchFolderPairGenerated() +BatchDlgGenerated::~BatchDlgGenerated() { + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); + m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnHelp ), NULL, this ); + m_bpButtonCmpConfig->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCmpSettings ), NULL, this ); + m_bpButtonFilter->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnConfigureFilter ), NULL, this ); + m_bpButtonSyncConfig->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSyncSettings ), NULL, this ); + m_choiceHandleError->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeErrorHandling ), NULL, this ); + m_bpButtonAddPair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnAddFolderPair ), NULL, this ); + m_bpButtonRemovePair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnRemoveTopFolderPair ), NULL, this ); + m_spinCtrlLogCountMax->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchDlgGenerated::OnChangeMaxLogCountTxt ), NULL, this ); + m_buttonSave->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this ); + m_buttonLoad->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLoadBatchJob ), NULL, this ); + m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); + } -BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +BatchFolderPairGenerated::BatchFolderPairGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) { - this->SetSizeHints( wxSize( 560,320 ), wxDefaultSize ); - - wxBoxSizer* bSizer54; - bSizer54 = new wxBoxSizer( wxVERTICAL ); - - bSizer69 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer87; - bSizer87 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap27 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); - bSizer87->Add( m_bitmap27, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); - m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxVERTICAL ); - - m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Batch job"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText56->Wrap( -1 ); - m_staticText56->SetFont( wxFont( 16, 70, 90, 92, false, wxEmptyString ) ); - - bSizer72->Add( m_staticText56, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_panel8->SetSizer( bSizer72 ); - m_panel8->Layout(); - bSizer72->Fit( m_panel8 ); - bSizer87->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer87->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer70; - bSizer70 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText44 = new wxStaticText( this, wxID_ANY, _("Create a batch file for automated synchronization. To start in batch mode simply double-click the file or execute via command line: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText44->Wrap( 460 ); - bSizer70->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_bpButtonHelp = new wxBitmapButton( this, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - m_bpButtonHelp->SetToolTip( _("Help") ); - - bSizer70->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - bSizer87->Add( bSizer70, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer69->Add( bSizer87, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_notebookSettings = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelOverview = new wxPanel( m_notebookSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer67; - bSizer67 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer120; - bSizer120 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer175; - bSizer175 = new wxBoxSizer( wxHORIZONTAL ); - - wxStaticBoxSizer* sbSizer241; - sbSizer241 = new wxStaticBoxSizer( new wxStaticBox( m_panelOverview, wxID_ANY, _("Compare") ), wxHORIZONTAL ); - - m_bpButtonCmpConfig = new wxBitmapButton( m_panelOverview, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,42 ), wxBU_AUTODRAW ); - m_bpButtonCmpConfig->SetToolTip( _("Comparison settings") ); - - sbSizer241->Add( m_bpButtonCmpConfig, 0, wxALIGN_CENTER_VERTICAL, 3 ); - - - sbSizer241->Add( 10, 0, 0, 0, 5 ); - - m_staticTextCmpVariant = new wxStaticText( m_panelOverview, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextCmpVariant->Wrap( -1 ); - m_staticTextCmpVariant->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); - m_staticTextCmpVariant->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - - sbSizer241->Add( m_staticTextCmpVariant, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer175->Add( sbSizer241, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer175->Add( 0, 0, 1, wxEXPAND, 5 ); - - wxStaticBoxSizer* sbSizer26; - sbSizer26 = new wxStaticBoxSizer( new wxStaticBox( m_panelOverview, wxID_ANY, _("Filter files") ), wxVERTICAL ); - - m_bpButtonFilter = new wxBitmapButton( m_panelOverview, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); - sbSizer26->Add( m_bpButtonFilter, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 15 ); - - bSizer175->Add( sbSizer26, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer175->Add( 0, 0, 1, wxEXPAND, 5 ); - - wxStaticBoxSizer* sbSizer252; - sbSizer252 = new wxStaticBoxSizer( new wxStaticBox( m_panelOverview, wxID_ANY, _("Synchronize...") ), wxHORIZONTAL ); - - m_staticTextSyncVariant = new wxStaticText( m_panelOverview, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextSyncVariant->Wrap( -1 ); - m_staticTextSyncVariant->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); - m_staticTextSyncVariant->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - - sbSizer252->Add( m_staticTextSyncVariant, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - sbSizer252->Add( 10, 0, 0, 0, 5 ); - - m_bpButtonSyncConfig = new wxBitmapButton( m_panelOverview, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,42 ), wxBU_AUTODRAW ); - m_bpButtonSyncConfig->SetToolTip( _("Synchronization settings") ); - - sbSizer252->Add( m_bpButtonSyncConfig, 0, wxALIGN_CENTER_VERTICAL, 3 ); - - bSizer175->Add( sbSizer252, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer120->Add( bSizer175, 0, wxEXPAND, 5 ); - - - bSizer120->Add( 0, 5, 0, 0, 5 ); - - m_scrolledWindow6 = new wxScrolledWindow( m_panelOverview, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); - m_scrolledWindow6->SetScrollRate( 5, 5 ); - wxBoxSizer* bSizer141; - bSizer141 = new wxBoxSizer( wxVERTICAL ); - - sbSizerMainPair = new wxBoxSizer( wxHORIZONTAL ); - - m_panelMainPair = new wxPanel( m_scrolledWindow6, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDOUBLE_BORDER ); - wxBoxSizer* bSizer147; - bSizer147 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer1361; - bSizer1361 = new wxBoxSizer( wxHORIZONTAL ); - - m_bpButtonAddPair = new wxBitmapButton( m_panelMainPair, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); - m_bpButtonAddPair->SetToolTip( _("Add folder pair") ); - - bSizer1361->Add( m_bpButtonAddPair, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 3 ); - - m_bpButtonRemovePair = new wxBitmapButton( m_panelMainPair, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); - m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); - - bSizer1361->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer147->Add( bSizer1361, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer143; - bSizer143 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer145; - bSizer145 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText532 = new wxStaticText( m_panelMainPair, wxID_ANY, _("Left"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText532->Wrap( -1 ); - m_staticText532->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); - - bSizer145->Add( m_staticText532, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer143->Add( bSizer145, 1, 0, 5 ); - - wxBoxSizer* bSizer146; - bSizer146 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText5411 = new wxStaticText( m_panelMainPair, wxID_ANY, _("Right"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText5411->Wrap( -1 ); - m_staticText5411->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); - - bSizer146->Add( m_staticText5411, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer143->Add( bSizer146, 1, 0, 5 ); - - bSizer147->Add( bSizer143, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - - m_panelMainPair->SetSizer( bSizer147 ); - m_panelMainPair->Layout(); - bSizer147->Fit( m_panelMainPair ); - sbSizerMainPair->Add( m_panelMainPair, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM, 5 ); - - wxBoxSizer* bSizer158; - bSizer158 = new wxBoxSizer( wxVERTICAL ); - - m_panelLeft = new wxPanel( m_scrolledWindow6, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer1141; - bSizer1141 = new wxBoxSizer( wxHORIZONTAL ); - - m_directoryLeft = new wxTextCtrl( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer1141->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_dirPickerLeft = new FfsDirPickerCtrl( m_panelLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPickerLeft->SetToolTip( _("Select a folder") ); - - bSizer1141->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonLocalFilter = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); - bSizer1141->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelLeft->SetSizer( bSizer1141 ); - m_panelLeft->Layout(); - bSizer1141->Fit( m_panelLeft ); - bSizer158->Add( m_panelLeft, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_panelRight = new wxPanel( m_scrolledWindow6, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer115; - bSizer115 = new wxBoxSizer( wxHORIZONTAL ); - - m_directoryRight = new wxTextCtrl( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer115->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_dirPickerRight = new FfsDirPickerCtrl( m_panelRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPickerRight->SetToolTip( _("Select a folder") ); - - bSizer115->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonAltSyncCfg = new wxBitmapButton( m_panelRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); - bSizer115->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelRight->SetSizer( bSizer115 ); - m_panelRight->Layout(); - bSizer115->Fit( m_panelRight ); - bSizer158->Add( m_panelRight, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizerMainPair->Add( bSizer158, 1, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); - - bSizer141->Add( sbSizerMainPair, 0, wxEXPAND, 5 ); - - bSizerAddFolderPairs = new wxBoxSizer( wxVERTICAL ); - - bSizer141->Add( bSizerAddFolderPairs, 1, wxEXPAND, 5 ); - - m_scrolledWindow6->SetSizer( bSizer141 ); - m_scrolledWindow6->Layout(); - bSizer141->Fit( m_scrolledWindow6 ); - bSizer120->Add( m_scrolledWindow6, 1, wxEXPAND, 5 ); - - - bSizer120->Add( 0, 5, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer67->Add( bSizer120, 1, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 10 ); - - wxBoxSizer* bSizer171; - bSizer171 = new wxBoxSizer( wxVERTICAL ); - - wxStaticBoxSizer* sbSizer25; - sbSizer25 = new wxStaticBoxSizer( new wxStaticBox( m_panelOverview, wxID_ANY, _("Error handling") ), wxHORIZONTAL ); - - wxArrayString m_choiceHandleErrorChoices; - m_choiceHandleError = new wxChoice( m_panelOverview, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleErrorChoices, 0 ); - m_choiceHandleError->SetSelection( 0 ); - sbSizer25->Add( m_choiceHandleError, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer171->Add( sbSizer25, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - bSizer67->Add( bSizer171, 0, wxTOP|wxBOTTOM|wxRIGHT, 10 ); - - m_panelOverview->SetSizer( bSizer67 ); - m_panelOverview->Layout(); - bSizer67->Fit( m_panelOverview ); - m_notebookSettings->AddPage( m_panelOverview, _("Overview"), true ); - m_panelBatchSettings = new wxPanel( m_notebookSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer117; - bSizer117 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer172; - bSizer172 = new wxBoxSizer( wxVERTICAL ); - - wxStaticBoxSizer* sbSizer24; - sbSizer24 = new wxStaticBoxSizer( new wxStaticBox( m_panelBatchSettings, wxID_ANY, _("Status feedback") ), wxVERTICAL ); - - m_checkBoxSilent = new wxCheckBox( m_panelBatchSettings, wxID_ANY, _("Run minimized"), wxDefaultPosition, wxDefaultSize, 0 ); - sbSizer24->Add( m_checkBoxSilent, 0, wxALL|wxEXPAND, 5 ); - - bSizer172->Add( sbSizer24, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer172->Add( 0, 5, 0, 0, 5 ); - - sbSizerLogfileDir = new wxStaticBoxSizer( new wxStaticBox( m_panelBatchSettings, wxID_ANY, _("Logging") ), wxVERTICAL ); - - wxBoxSizer* bSizer152; - bSizer152 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText96 = new wxStaticText( m_panelBatchSettings, wxID_ANY, _("Maximum number of logfiles:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText96->Wrap( -1 ); - bSizer152->Add( m_staticText96, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - - bSizer152->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_spinCtrlLogCountMax = new wxSpinCtrl( m_panelBatchSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); - bSizer152->Add( m_spinCtrlLogCountMax, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizerLogfileDir->Add( bSizer152, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_panelLogfile = new wxPanel( m_panelBatchSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer1721; - bSizer1721 = new wxBoxSizer( wxVERTICAL ); - - m_staticText94 = new wxStaticText( m_panelLogfile, wxID_ANY, _("Select logfile directory:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText94->Wrap( -1 ); - bSizer1721->Add( m_staticText94, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - wxBoxSizer* bSizer170; - bSizer170 = new wxBoxSizer( wxHORIZONTAL ); - - m_textCtrlLogfileDir = new wxTextCtrl( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer170->Add( m_textCtrlLogfileDir, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_dirPickerLogfileDir = new FfsDirPickerCtrl( m_panelLogfile, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - m_dirPickerLogfileDir->SetToolTip( _("Select a folder") ); - - bSizer170->Add( m_dirPickerLogfileDir, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer1721->Add( bSizer170, 0, wxEXPAND, 5 ); - - m_panelLogfile->SetSizer( bSizer1721 ); - m_panelLogfile->Layout(); - bSizer1721->Fit( m_panelLogfile ); - sbSizerLogfileDir->Add( m_panelLogfile, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - bSizer172->Add( sbSizerLogfileDir, 0, wxEXPAND, 5 ); - - bSizer117->Add( bSizer172, 1, wxEXPAND|wxALL, 10 ); - - m_panelBatchSettings->SetSizer( bSizer117 ); - m_panelBatchSettings->Layout(); - bSizer117->Fit( m_panelBatchSettings ); - m_notebookSettings->AddPage( m_panelBatchSettings, _("Batch settings"), false ); - - bSizer69->Add( m_notebookSettings, 1, wxEXPAND, 5 ); - - wxBoxSizer* bSizer68; - bSizer68 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonSave = new wxButton( this, wxID_SAVE, _("&Save"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonSave->SetDefault(); - m_buttonSave->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); - - bSizer68->Add( m_buttonSave, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonLoad = new wxButton( this, wxID_OPEN, _("&Load"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonLoad->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer68->Add( m_buttonLoad, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_button6 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button6->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer68->Add( m_button6, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer69->Add( bSizer68, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer54->Add( bSizer69, 1, wxALIGN_CENTER_HORIZONTAL|wxALL|wxEXPAND, 5 ); - - this->SetSizer( bSizer54 ); - this->Layout(); - bSizer54->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); - m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnHelp ), NULL, this ); - m_bpButtonCmpConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCmpSettings ), NULL, this ); - m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnConfigureFilter ), NULL, this ); - m_bpButtonSyncConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSyncSettings ), NULL, this ); - m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnAddFolderPair ), NULL, this ); - m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnRemoveTopFolderPair ), NULL, this ); - m_choiceHandleError->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeErrorHandling ), NULL, this ); - m_spinCtrlLogCountMax->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchDlgGenerated::OnChangeMaxLogCountTxt ), NULL, this ); - m_buttonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this ); - m_buttonLoad->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLoadBatchJob ), NULL, this ); - m_button6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); + wxBoxSizer* bSizer142; + bSizer142 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer140; + bSizer140 = new wxBoxSizer( wxHORIZONTAL ); + + m_panel32 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDOUBLE_BORDER ); + wxBoxSizer* bSizer147; + bSizer147 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer136; + bSizer136 = new wxBoxSizer( wxVERTICAL ); + + m_bpButtonRemovePair = new wxBitmapButton( m_panel32, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); + m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); + + bSizer136->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer147->Add( bSizer136, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer143; + bSizer143 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer145; + bSizer145 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText53 = new wxStaticText( m_panel32, wxID_ANY, _("Left"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText53->Wrap( -1 ); + m_staticText53->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); + + bSizer145->Add( m_staticText53, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer143->Add( bSizer145, 1, 0, 5 ); + + wxBoxSizer* bSizer146; + bSizer146 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText541 = new wxStaticText( m_panel32, wxID_ANY, _("Right"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText541->Wrap( -1 ); + m_staticText541->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); + + bSizer146->Add( m_staticText541, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer143->Add( bSizer146, 1, 0, 5 ); + + bSizer147->Add( bSizer143, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); + + m_panel32->SetSizer( bSizer147 ); + m_panel32->Layout(); + bSizer147->Fit( m_panel32 ); + bSizer140->Add( m_panel32, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer144; + bSizer144 = new wxBoxSizer( wxVERTICAL ); + + m_panelLeft = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer114; + bSizer114 = new wxBoxSizer( wxHORIZONTAL ); + + m_directoryLeft = new FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer114->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_dirPickerLeft = new FfsDirPickerCtrl( m_panelLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); + m_dirPickerLeft->SetToolTip( _("Select a folder") ); + + bSizer114->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panelLeft->SetSizer( bSizer114 ); + m_panelLeft->Layout(); + bSizer114->Fit( m_panelLeft ); + bSizer144->Add( m_panelLeft, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer115; + bSizer115 = new wxBoxSizer( wxHORIZONTAL ); + + m_directoryRight = new FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer115->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_dirPickerRight = new FfsDirPickerCtrl( m_panelRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); + m_dirPickerRight->SetToolTip( _("Select a folder") ); + + bSizer115->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panelRight->SetSizer( bSizer115 ); + m_panelRight->Layout(); + bSizer115->Fit( m_panelRight ); + bSizer144->Add( m_panelRight, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer140->Add( bSizer144, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer176; + bSizer176 = new wxBoxSizer( wxHORIZONTAL ); + + m_bpButtonAltCompCfg = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); + bSizer176->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonLocalFilter = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); + bSizer176->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 3 ); + + m_bpButtonAltSyncCfg = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 20,20 ), wxBU_AUTODRAW ); + bSizer176->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer140->Add( bSizer176, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + bSizer142->Add( bSizer140, 0, wxEXPAND, 5 ); + + + bSizer142->Add( 0, 5, 0, 0, 5 ); + + this->SetSizer( bSizer142 ); + this->Layout(); + bSizer142->Fit( this ); } -BatchDlgGenerated::~BatchDlgGenerated() +BatchFolderPairGenerated::~BatchFolderPairGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); - m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnHelp ), NULL, this ); - m_bpButtonCmpConfig->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCmpSettings ), NULL, this ); - m_bpButtonFilter->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnConfigureFilter ), NULL, this ); - m_bpButtonSyncConfig->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSyncSettings ), NULL, this ); - m_bpButtonAddPair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnAddFolderPair ), NULL, this ); - m_bpButtonRemovePair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnRemoveTopFolderPair ), NULL, this ); - m_choiceHandleError->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeErrorHandling ), NULL, this ); - m_spinCtrlLogCountMax->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchDlgGenerated::OnChangeMaxLogCountTxt ), NULL, this ); - m_buttonSave->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this ); - m_buttonLoad->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLoadBatchJob ), NULL, this ); - m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); - } CompareStatusGenerated::CompareStatusGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) { - wxBoxSizer* bSizer40; - bSizer40 = new wxBoxSizer( wxVERTICAL ); - - - bSizer40->Add( 0, 0, 1, wxEXPAND, 5 ); - - bSizer42 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer157; - bSizer157 = new wxBoxSizer( wxVERTICAL ); - - bSizerFilesFound = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText321 = new wxStaticText( this, wxID_ANY, _("Elements found:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText321->Wrap( -1 ); - m_staticText321->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizerFilesFound->Add( m_staticText321, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextScanned = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextScanned->Wrap( -1 ); - m_staticTextScanned->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); - - bSizerFilesFound->Add( m_staticTextScanned, 0, wxALIGN_BOTTOM|wxLEFT, 5 ); - - bSizer157->Add( bSizerFilesFound, 0, 0, 5 ); - - bSizerFilesRemaining = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText46 = new wxStaticText( this, wxID_ANY, _("Elements remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText46->Wrap( -1 ); - m_staticText46->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizerFilesRemaining->Add( m_staticText46, 0, wxALIGN_BOTTOM, 5 ); - - wxBoxSizer* bSizer154; - bSizer154 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticTextFilesRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextFilesRemaining->Wrap( -1 ); - m_staticTextFilesRemaining->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); - - bSizer154->Add( m_staticTextFilesRemaining, 0, wxALIGN_BOTTOM, 5 ); - - m_staticText117 = new wxStaticText( this, wxID_ANY, _("("), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText117->Wrap( -1 ); - m_staticText117->SetFont( wxFont( 9, 74, 90, 90, false, wxT("Arial") ) ); - - bSizer154->Add( m_staticText117, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); - - m_staticTextDataRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDataRemaining->Wrap( -1 ); - m_staticTextDataRemaining->SetFont( wxFont( 9, 74, 90, 90, false, wxT("Arial") ) ); - - bSizer154->Add( m_staticTextDataRemaining, 0, wxALIGN_BOTTOM, 5 ); - - m_staticText118 = new wxStaticText( this, wxID_ANY, _(")"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText118->Wrap( -1 ); - m_staticText118->SetFont( wxFont( 9, 74, 90, 90, false, wxT("Arial") ) ); - - bSizer154->Add( m_staticText118, 0, wxALIGN_BOTTOM, 5 ); - - bSizerFilesRemaining->Add( bSizer154, 0, wxALIGN_BOTTOM|wxLEFT, 5 ); - - bSizer157->Add( bSizerFilesRemaining, 0, 0, 5 ); - - bSizer42->Add( bSizer157, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); - - sSizerSpeed = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText104 = new wxStaticText( this, wxID_ANY, _("Speed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText104->Wrap( -1 ); - m_staticText104->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - sSizerSpeed->Add( m_staticText104, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextSpeed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextSpeed->Wrap( -1 ); - m_staticTextSpeed->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); - - sSizerSpeed->Add( m_staticTextSpeed, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); - - bSizer42->Add( sSizerSpeed, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer42->Add( 10, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - sSizerTimeRemaining = new wxBoxSizer( wxHORIZONTAL ); - - m_staticTextTimeRemFixed = new wxStaticText( this, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeRemFixed->Wrap( -1 ); - m_staticTextTimeRemFixed->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - sSizerTimeRemaining->Add( m_staticTextTimeRemFixed, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextTimeRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeRemaining->Wrap( -1 ); - m_staticTextTimeRemaining->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); - - sSizerTimeRemaining->Add( m_staticTextTimeRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); - - bSizer42->Add( sSizerTimeRemaining, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); - - sSizerTimeElapsed = new wxBoxSizer( wxHORIZONTAL ); - - wxStaticText* m_staticText37; - m_staticText37 = new wxStaticText( this, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText37->Wrap( -1 ); - m_staticText37->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - sSizerTimeElapsed->Add( m_staticText37, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextTimeElapsed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeElapsed->Wrap( -1 ); - m_staticTextTimeElapsed->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); - - sSizerTimeElapsed->Add( m_staticTextTimeElapsed, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); - - bSizer42->Add( sSizerTimeElapsed, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer40->Add( bSizer42, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - wxBoxSizer* bSizer48; - bSizer48 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText30 = new wxStaticText( this, wxID_ANY, _("Operation:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText30->Wrap( -1 ); - m_staticText30->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); - - bSizer48->Add( m_staticText30, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlStatus = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); - m_textCtrlStatus->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizer48->Add( m_textCtrlStatus, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer40->Add( bSizer48, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - m_gauge2 = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,14 ), wxGA_HORIZONTAL|wxGA_SMOOTH ); - bSizer40->Add( m_gauge2, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); - - - bSizer40->Add( 0, 0, 1, wxEXPAND, 5 ); - - this->SetSizer( bSizer40 ); - this->Layout(); - bSizer40->Fit( this ); + wxBoxSizer* bSizer40; + bSizer40 = new wxBoxSizer( wxVERTICAL ); + + + bSizer40->Add( 0, 0, 1, wxEXPAND, 5 ); + + bSizer42 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer157; + bSizer157 = new wxBoxSizer( wxVERTICAL ); + + bSizerFilesFound = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText321 = new wxStaticText( this, wxID_ANY, _("Elements found:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText321->Wrap( -1 ); + m_staticText321->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizerFilesFound->Add( m_staticText321, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextScanned = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextScanned->Wrap( -1 ); + m_staticTextScanned->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); + + bSizerFilesFound->Add( m_staticTextScanned, 0, wxALIGN_BOTTOM|wxLEFT, 5 ); + + bSizer157->Add( bSizerFilesFound, 0, 0, 5 ); + + bSizerFilesRemaining = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText46 = new wxStaticText( this, wxID_ANY, _("Elements remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText46->Wrap( -1 ); + m_staticText46->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizerFilesRemaining->Add( m_staticText46, 0, wxALIGN_BOTTOM, 5 ); + + wxBoxSizer* bSizer154; + bSizer154 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticTextFilesRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextFilesRemaining->Wrap( -1 ); + m_staticTextFilesRemaining->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); + + bSizer154->Add( m_staticTextFilesRemaining, 0, wxALIGN_BOTTOM, 5 ); + + m_staticText117 = new wxStaticText( this, wxID_ANY, _("("), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText117->Wrap( -1 ); + m_staticText117->SetFont( wxFont( 9, 74, 90, 90, false, wxT("Arial") ) ); + + bSizer154->Add( m_staticText117, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + + m_staticTextDataRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDataRemaining->Wrap( -1 ); + m_staticTextDataRemaining->SetFont( wxFont( 9, 74, 90, 90, false, wxT("Arial") ) ); + + bSizer154->Add( m_staticTextDataRemaining, 0, wxALIGN_BOTTOM, 5 ); + + m_staticText118 = new wxStaticText( this, wxID_ANY, _(")"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText118->Wrap( -1 ); + m_staticText118->SetFont( wxFont( 9, 74, 90, 90, false, wxT("Arial") ) ); + + bSizer154->Add( m_staticText118, 0, wxALIGN_BOTTOM, 5 ); + + bSizerFilesRemaining->Add( bSizer154, 0, wxALIGN_BOTTOM|wxLEFT, 5 ); + + bSizer157->Add( bSizerFilesRemaining, 0, 0, 5 ); + + bSizer42->Add( bSizer157, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); + + sSizerSpeed = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText104 = new wxStaticText( this, wxID_ANY, _("Speed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText104->Wrap( -1 ); + m_staticText104->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + sSizerSpeed->Add( m_staticText104, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextSpeed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextSpeed->Wrap( -1 ); + m_staticTextSpeed->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); + + sSizerSpeed->Add( m_staticTextSpeed, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + + bSizer42->Add( sSizerSpeed, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer42->Add( 10, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + sSizerTimeRemaining = new wxBoxSizer( wxHORIZONTAL ); + + m_staticTextTimeRemFixed = new wxStaticText( this, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeRemFixed->Wrap( -1 ); + m_staticTextTimeRemFixed->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + sSizerTimeRemaining->Add( m_staticTextTimeRemFixed, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextTimeRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeRemaining->Wrap( -1 ); + m_staticTextTimeRemaining->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); + + sSizerTimeRemaining->Add( m_staticTextTimeRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + + bSizer42->Add( sSizerTimeRemaining, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); + + sSizerTimeElapsed = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText* m_staticText37; + m_staticText37 = new wxStaticText( this, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText37->Wrap( -1 ); + m_staticText37->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + sSizerTimeElapsed->Add( m_staticText37, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextTimeElapsed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeElapsed->Wrap( -1 ); + m_staticTextTimeElapsed->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); + + sSizerTimeElapsed->Add( m_staticTextTimeElapsed, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + + bSizer42->Add( sSizerTimeElapsed, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer40->Add( bSizer42, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + wxBoxSizer* bSizer48; + bSizer48 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText30 = new wxStaticText( this, wxID_ANY, _("Operation:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText30->Wrap( -1 ); + m_staticText30->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); + + bSizer48->Add( m_staticText30, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlStatus = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); + m_textCtrlStatus->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer48->Add( m_textCtrlStatus, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer40->Add( bSizer48, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_gauge2 = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,14 ), wxGA_HORIZONTAL|wxGA_SMOOTH ); + bSizer40->Add( m_gauge2, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); + + + bSizer40->Add( 0, 0, 1, wxEXPAND, 5 ); + + this->SetSizer( bSizer40 ); + this->Layout(); + bSizer40->Fit( this ); } CompareStatusGenerated::~CompareStatusGenerated() @@ -1544,2307 +1558,2138 @@ CompareStatusGenerated::~CompareStatusGenerated() SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer7; - bSizer7 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer181; - bSizer181 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer29; - bSizer29 = new wxBoxSizer( wxVERTICAL ); - - wxStaticBoxSizer* sbSizer7; - sbSizer7 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); - - m_staticText1 = new wxStaticText( this, wxID_ANY, _("Select variant:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText1->Wrap( -1 ); - m_staticText1->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); - - sbSizer7->Add( m_staticText1, 0, wxALL, 5 ); - - wxFlexGridSizer* fgSizer1; - fgSizer1 = new wxFlexGridSizer( 4, 3, 8, 5 ); - fgSizer1->SetFlexibleDirection( wxHORIZONTAL ); - fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_radioBtnAutomatic = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnAutomatic->SetValue( true ); - m_radioBtnAutomatic->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_radioBtnAutomatic, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonAutomatic = new wxButton( this, wxID_ANY, _("<Automatic>"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonAutomatic->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_buttonAutomatic, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticText81 = new wxStaticText( this, wxID_ANY, _("Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText81->Wrap( 400 ); - fgSizer1->Add( m_staticText81, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - m_radioBtnMirror = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnMirror->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_radioBtnMirror, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonOneWay = new wxButton( this, wxID_ANY, _("Mirror ->>"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonOneWay->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_buttonOneWay, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticText8 = new wxStaticText( this, wxID_ANY, _("Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText8->Wrap( 400 ); - fgSizer1->Add( m_staticText8, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_radioBtnUpdate = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnUpdate->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_radioBtnUpdate, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonUpdate = new wxButton( this, wxID_ANY, _("Update ->"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonUpdate->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_buttonUpdate, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticText101 = new wxStaticText( this, wxID_ANY, _("Copy new or updated files to right folder."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText101->Wrap( 400 ); - fgSizer1->Add( m_staticText101, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - m_radioBtnCustom = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnCustom->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_radioBtnCustom, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonUpdate1 = new wxButton( this, wxID_ANY, _("Custom"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonUpdate1->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_buttonUpdate1, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticText9 = new wxStaticText( this, wxID_ANY, _("Configure your own synchronization rules."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText9->Wrap( 400 ); - fgSizer1->Add( m_staticText9, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - sbSizer7->Add( fgSizer1, 0, 0, 5 ); - - bSizer29->Add( sbSizer7, 0, wxEXPAND, 5 ); - - - bSizer29->Add( 0, 5, 1, 0, 5 ); - - bSizer201 = new wxBoxSizer( wxHORIZONTAL ); - - sbSizerErrorHandling = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Error handling") ), wxHORIZONTAL ); - - wxArrayString m_choiceHandleErrorChoices; - m_choiceHandleError = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleErrorChoices, 0 ); - m_choiceHandleError->SetSelection( 0 ); - sbSizerErrorHandling->Add( m_choiceHandleError, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer201->Add( sbSizerErrorHandling, 0, wxEXPAND|wxRIGHT, 10 ); - - sbSizerCustDelDir = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Deletion handling") ), wxVERTICAL ); - - wxArrayString m_choiceHandleDeletionChoices; - m_choiceHandleDeletion = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleDeletionChoices, 0 ); - m_choiceHandleDeletion->SetSelection( 0 ); - sbSizerCustDelDir->Add( m_choiceHandleDeletion, 0, wxBOTTOM, 5 ); - - m_panelCustomDeletionDir = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer1151; - bSizer1151 = new wxBoxSizer( wxHORIZONTAL ); - - m_textCtrlCustomDelFolder = new wxTextCtrl( m_panelCustomDeletionDir, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_textCtrlCustomDelFolder->SetMinSize( wxSize( 200,-1 ) ); - - bSizer1151->Add( m_textCtrlCustomDelFolder, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_dirPickerCustomDelFolder = new FfsDirPickerCtrl( m_panelCustomDeletionDir, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer1151->Add( m_dirPickerCustomDelFolder, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelCustomDeletionDir->SetSizer( bSizer1151 ); - m_panelCustomDeletionDir->Layout(); - bSizer1151->Fit( m_panelCustomDeletionDir ); - sbSizerCustDelDir->Add( m_panelCustomDeletionDir, 0, 0, 5 ); - - bSizer201->Add( sbSizerCustDelDir, 0, wxEXPAND, 5 ); - - bSizer29->Add( bSizer201, 0, wxTOP|wxBOTTOM, 5 ); - - wxBoxSizer* bSizer291; - bSizer291 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonOK = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonOK->SetDefault(); - m_buttonOK->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); - - bSizer291->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_button16 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button16->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer291->Add( m_button16, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer291->Add( 20, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer29->Add( bSizer291, 0, wxEXPAND, 5 ); - - bSizer181->Add( bSizer29, 0, wxEXPAND, 5 ); - - - bSizer181->Add( 10, 0, 0, 0, 5 ); - - wxStaticBoxSizer* sbSizer2453245; - sbSizer2453245 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Configuration") ), wxVERTICAL ); - - - sbSizer2453245->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_bitmapDatabase = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 70,70 ), 0 ); - sbSizer2453245->Add( m_bitmapDatabase, 1, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 10 ); - - sbSizerSyncDirections = new wxBoxSizer( wxVERTICAL ); - - wxGridSizer* gSizer3; - gSizer3 = new wxGridSizer( 1, 2, 0, 5 ); - - m_staticText21 = new wxStaticText( this, wxID_ANY, _("Category"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText21->Wrap( -1 ); - m_staticText21->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); - - gSizer3->Add( m_staticText21, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText31 = new wxStaticText( this, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText31->Wrap( -1 ); - m_staticText31->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); - - gSizer3->Add( m_staticText31, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizerSyncDirections->Add( gSizer3, 0, wxEXPAND, 5 ); - - m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - sbSizerSyncDirections->Add( m_staticline3, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxBOTTOM, 5 ); - - wxBoxSizer* bSizer121; - bSizer121 = new wxBoxSizer( wxVERTICAL ); - - bSizerLeftOnly = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapLeftOnly = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); - m_bitmapLeftOnly->SetToolTip( _("File/folder exists on left side only") ); - - bSizerLeftOnly->Add( m_bitmapLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerLeftOnly->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonLeftOnly = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerLeftOnly->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer121->Add( bSizerLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizerRightOnly = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapRightOnly = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); - m_bitmapRightOnly->SetToolTip( _("File/folder exists on right side only") ); - - bSizerRightOnly->Add( m_bitmapRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerRightOnly->Add( 5, 0, 0, 0, 5 ); - - m_bpButtonRightOnly = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerRightOnly->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer121->Add( bSizerRightOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizerLeftNewer = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapLeftNewer = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); - m_bitmapLeftNewer->SetToolTip( _("Left file is newer") ); - - bSizerLeftNewer->Add( m_bitmapLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerLeftNewer->Add( 5, 0, 0, 0, 5 ); - - m_bpButtonLeftNewer = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerLeftNewer->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer121->Add( bSizerLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizerRightNewer = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapRightNewer = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); - m_bitmapRightNewer->SetToolTip( _("Right file is newer") ); - - bSizerRightNewer->Add( m_bitmapRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerRightNewer->Add( 5, 0, 0, 0, 5 ); - - m_bpButtonRightNewer = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerRightNewer->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer121->Add( bSizerRightNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizerDifferent = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapDifferent = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); - m_bitmapDifferent->SetToolTip( _("Files have different content") ); - - bSizerDifferent->Add( m_bitmapDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerDifferent->Add( 5, 0, 0, 0, 5 ); - - m_bpButtonDifferent = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerDifferent->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer121->Add( bSizerDifferent, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizerConflict = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapConflict = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); - m_bitmapConflict->SetToolTip( _("Conflict/file cannot be categorized") ); - - bSizerConflict->Add( m_bitmapConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerConflict->Add( 5, 0, 0, 0, 5 ); - - m_bpButtonConflict = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerConflict->Add( m_bpButtonConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer121->Add( bSizerConflict, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - sbSizerSyncDirections->Add( bSizer121, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - sbSizer2453245->Add( sbSizerSyncDirections, 0, wxEXPAND, 5 ); - - - sbSizer2453245->Add( 0, 0, 1, wxEXPAND, 5 ); - - bSizer181->Add( sbSizer2453245, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer7->Add( bSizer181, 0, wxALL, 5 ); - - this->SetSizer( bSizer7 ); - this->Layout(); - bSizer7->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncCfgDlgGenerated::OnClose ) ); - m_radioBtnAutomatic->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); - m_buttonAutomatic->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); - m_buttonAutomatic->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncAutomaticDouble ), NULL, this ); - m_radioBtnMirror->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); - m_buttonOneWay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); - m_buttonOneWay->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncMirrorDouble ), NULL, this ); - m_radioBtnUpdate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); - m_buttonUpdate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); - m_buttonUpdate->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncUpdateDouble ), NULL, this ); - m_radioBtnCustom->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); - m_buttonUpdate1->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); - m_buttonUpdate1->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncCustomDouble ), NULL, this ); - m_choiceHandleError->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); - m_choiceHandleDeletion->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeDeletionHandling ), NULL, this ); - m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnApply ), NULL, this ); - m_button16->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnCancel ), NULL, this ); - m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExLeftSideOnly ), NULL, this ); - m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExRightSideOnly ), NULL, this ); - m_bpButtonLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnLeftNewer ), NULL, this ); - m_bpButtonRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnRightNewer ), NULL, this ); - m_bpButtonDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDifferent ), NULL, this ); - m_bpButtonConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnConflict ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer7; + bSizer7 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer181; + bSizer181 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer29; + bSizer29 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* sbSizer7; + sbSizer7 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); + + m_staticText1 = new wxStaticText( this, wxID_ANY, _("Select variant:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText1->Wrap( -1 ); + m_staticText1->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); + + sbSizer7->Add( m_staticText1, 0, wxALL, 5 ); + + wxFlexGridSizer* fgSizer1; + fgSizer1 = new wxFlexGridSizer( 4, 3, 8, 5 ); + fgSizer1->SetFlexibleDirection( wxHORIZONTAL ); + fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_radioBtnAutomatic = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtnAutomatic->SetValue( true ); + m_radioBtnAutomatic->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); + + fgSizer1->Add( m_radioBtnAutomatic, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonAutomatic = new wxButton( this, wxID_ANY, _("<Automatic>"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonAutomatic->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); + + fgSizer1->Add( m_buttonAutomatic, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticText81 = new wxStaticText( this, wxID_ANY, _("Identify and propagate changes on both sides using a database. Deletions and conflicts are detected automatically."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText81->Wrap( 400 ); + fgSizer1->Add( m_staticText81, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + m_radioBtnMirror = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtnMirror->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); + + fgSizer1->Add( m_radioBtnMirror, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonOneWay = new wxButton( this, wxID_ANY, _("Mirror ->>"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonOneWay->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); + + fgSizer1->Add( m_buttonOneWay, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticText8 = new wxStaticText( this, wxID_ANY, _("Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText8->Wrap( 400 ); + fgSizer1->Add( m_staticText8, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_radioBtnUpdate = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtnUpdate->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); + + fgSizer1->Add( m_radioBtnUpdate, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonUpdate = new wxButton( this, wxID_ANY, _("Update ->"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonUpdate->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); + + fgSizer1->Add( m_buttonUpdate, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticText101 = new wxStaticText( this, wxID_ANY, _("Copy new or updated files to right folder."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText101->Wrap( 400 ); + fgSizer1->Add( m_staticText101, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + m_radioBtnCustom = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtnCustom->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); + + fgSizer1->Add( m_radioBtnCustom, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonUpdate1 = new wxButton( this, wxID_ANY, _("Custom"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonUpdate1->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); + + fgSizer1->Add( m_buttonUpdate1, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticText9 = new wxStaticText( this, wxID_ANY, _("Configure your own synchronization rules."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText9->Wrap( 400 ); + fgSizer1->Add( m_staticText9, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + sbSizer7->Add( fgSizer1, 0, 0, 5 ); + + bSizer29->Add( sbSizer7, 0, wxEXPAND, 5 ); + + + bSizer29->Add( 0, 5, 1, 0, 5 ); + + bSizer201 = new wxBoxSizer( wxHORIZONTAL ); + + sbSizerErrorHandling = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Error handling") ), wxHORIZONTAL ); + + wxArrayString m_choiceHandleErrorChoices; + m_choiceHandleError = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleErrorChoices, 0 ); + m_choiceHandleError->SetSelection( 0 ); + sbSizerErrorHandling->Add( m_choiceHandleError, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer201->Add( sbSizerErrorHandling, 0, wxEXPAND|wxRIGHT, 10 ); + + sbSizerCustDelDir = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Deletion handling") ), wxVERTICAL ); + + wxArrayString m_choiceHandleDeletionChoices; + m_choiceHandleDeletion = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleDeletionChoices, 0 ); + m_choiceHandleDeletion->SetSelection( 0 ); + sbSizerCustDelDir->Add( m_choiceHandleDeletion, 0, wxBOTTOM, 5 ); + + m_panelCustomDeletionDir = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer1151; + bSizer1151 = new wxBoxSizer( wxHORIZONTAL ); + + m_customDelFolder = new FolderHistoryBox( m_panelCustomDeletionDir, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer1151->Add( m_customDelFolder, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_dirPickerCustomDelFolder = new FfsDirPickerCtrl( m_panelCustomDeletionDir, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer1151->Add( m_dirPickerCustomDelFolder, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panelCustomDeletionDir->SetSizer( bSizer1151 ); + m_panelCustomDeletionDir->Layout(); + bSizer1151->Fit( m_panelCustomDeletionDir ); + sbSizerCustDelDir->Add( m_panelCustomDeletionDir, 0, wxEXPAND, 5 ); + + bSizer201->Add( sbSizerCustDelDir, 1, wxEXPAND, 5 ); + + bSizer29->Add( bSizer201, 0, wxTOP|wxBOTTOM|wxEXPAND, 5 ); + + wxBoxSizer* bSizer291; + bSizer291 = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonOK = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonOK->SetDefault(); + m_buttonOK->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); + + bSizer291->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_button16 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button16->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer291->Add( m_button16, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer291->Add( 20, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer29->Add( bSizer291, 0, wxEXPAND, 5 ); + + bSizer181->Add( bSizer29, 0, wxEXPAND, 5 ); + + + bSizer181->Add( 10, 0, 0, 0, 5 ); + + wxStaticBoxSizer* sbSizer2453245; + sbSizer2453245 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Configuration") ), wxVERTICAL ); + + + sbSizer2453245->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_bitmapDatabase = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 70,70 ), 0 ); + sbSizer2453245->Add( m_bitmapDatabase, 1, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 10 ); + + sbSizerSyncDirections = new wxBoxSizer( wxVERTICAL ); + + wxGridSizer* gSizer3; + gSizer3 = new wxGridSizer( 1, 2, 0, 5 ); + + m_staticText21 = new wxStaticText( this, wxID_ANY, _("Category"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText21->Wrap( -1 ); + m_staticText21->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); + + gSizer3->Add( m_staticText21, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText31 = new wxStaticText( this, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText31->Wrap( -1 ); + m_staticText31->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); + + gSizer3->Add( m_staticText31, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizerSyncDirections->Add( gSizer3, 0, wxEXPAND, 5 ); + + m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + sbSizerSyncDirections->Add( m_staticline3, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxBOTTOM, 5 ); + + wxBoxSizer* bSizer121; + bSizer121 = new wxBoxSizer( wxVERTICAL ); + + bSizerLeftOnly = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapLeftOnly = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); + m_bitmapLeftOnly->SetToolTip( _("File/folder exists on left side only") ); + + bSizerLeftOnly->Add( m_bitmapLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerLeftOnly->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonLeftOnly = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerLeftOnly->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer121->Add( bSizerLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizerRightOnly = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapRightOnly = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); + m_bitmapRightOnly->SetToolTip( _("File/folder exists on right side only") ); + + bSizerRightOnly->Add( m_bitmapRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerRightOnly->Add( 5, 0, 0, 0, 5 ); + + m_bpButtonRightOnly = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerRightOnly->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer121->Add( bSizerRightOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizerLeftNewer = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapLeftNewer = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); + m_bitmapLeftNewer->SetToolTip( _("Left file is newer") ); + + bSizerLeftNewer->Add( m_bitmapLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerLeftNewer->Add( 5, 0, 0, 0, 5 ); + + m_bpButtonLeftNewer = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerLeftNewer->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer121->Add( bSizerLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizerRightNewer = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapRightNewer = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); + m_bitmapRightNewer->SetToolTip( _("Right file is newer") ); + + bSizerRightNewer->Add( m_bitmapRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerRightNewer->Add( 5, 0, 0, 0, 5 ); + + m_bpButtonRightNewer = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerRightNewer->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer121->Add( bSizerRightNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizerDifferent = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapDifferent = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); + m_bitmapDifferent->SetToolTip( _("Files have different content") ); + + bSizerDifferent->Add( m_bitmapDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerDifferent->Add( 5, 0, 0, 0, 5 ); + + m_bpButtonDifferent = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerDifferent->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer121->Add( bSizerDifferent, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizerConflict = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapConflict = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); + m_bitmapConflict->SetToolTip( _("Conflict/file cannot be categorized") ); + + bSizerConflict->Add( m_bitmapConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerConflict->Add( 5, 0, 0, 0, 5 ); + + m_bpButtonConflict = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerConflict->Add( m_bpButtonConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer121->Add( bSizerConflict, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + sbSizerSyncDirections->Add( bSizer121, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + sbSizer2453245->Add( sbSizerSyncDirections, 0, wxEXPAND, 5 ); + + + sbSizer2453245->Add( 0, 0, 1, wxEXPAND, 5 ); + + bSizer181->Add( sbSizer2453245, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer7->Add( bSizer181, 0, wxALL, 5 ); + + this->SetSizer( bSizer7 ); + this->Layout(); + bSizer7->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncCfgDlgGenerated::OnClose ) ); + m_radioBtnAutomatic->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); + m_buttonAutomatic->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); + m_buttonAutomatic->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncAutomaticDouble ), NULL, this ); + m_radioBtnMirror->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); + m_buttonOneWay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); + m_buttonOneWay->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncMirrorDouble ), NULL, this ); + m_radioBtnUpdate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); + m_buttonUpdate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); + m_buttonUpdate->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncUpdateDouble ), NULL, this ); + m_radioBtnCustom->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); + m_buttonUpdate1->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); + m_buttonUpdate1->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncCustomDouble ), NULL, this ); + m_choiceHandleError->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); + m_choiceHandleDeletion->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeDeletionHandling ), NULL, this ); + m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnApply ), NULL, this ); + m_button16->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnCancel ), NULL, this ); + m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExLeftSideOnly ), NULL, this ); + m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExRightSideOnly ), NULL, this ); + m_bpButtonLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnLeftNewer ), NULL, this ); + m_bpButtonRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnRightNewer ), NULL, this ); + m_bpButtonDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDifferent ), NULL, this ); + m_bpButtonConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnConflict ), NULL, this ); } SyncCfgDlgGenerated::~SyncCfgDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncCfgDlgGenerated::OnClose ) ); - m_radioBtnAutomatic->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); - m_buttonAutomatic->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); - m_buttonAutomatic->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncAutomaticDouble ), NULL, this ); - m_radioBtnMirror->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); - m_buttonOneWay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); - m_buttonOneWay->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncMirrorDouble ), NULL, this ); - m_radioBtnUpdate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); - m_buttonUpdate->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); - m_buttonUpdate->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncUpdateDouble ), NULL, this ); - m_radioBtnCustom->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); - m_buttonUpdate1->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); - m_buttonUpdate1->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncCustomDouble ), NULL, this ); - m_choiceHandleError->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); - m_choiceHandleDeletion->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeDeletionHandling ), NULL, this ); - m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnApply ), NULL, this ); - m_button16->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnCancel ), NULL, this ); - m_bpButtonLeftOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExLeftSideOnly ), NULL, this ); - m_bpButtonRightOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExRightSideOnly ), NULL, this ); - m_bpButtonLeftNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnLeftNewer ), NULL, this ); - m_bpButtonRightNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnRightNewer ), NULL, this ); - m_bpButtonDifferent->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDifferent ), NULL, this ); - m_bpButtonConflict->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnConflict ), NULL, this ); - + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncCfgDlgGenerated::OnClose ) ); + m_radioBtnAutomatic->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); + m_buttonAutomatic->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); + m_buttonAutomatic->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncAutomaticDouble ), NULL, this ); + m_radioBtnMirror->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); + m_buttonOneWay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); + m_buttonOneWay->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncMirrorDouble ), NULL, this ); + m_radioBtnUpdate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); + m_buttonUpdate->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); + m_buttonUpdate->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncUpdateDouble ), NULL, this ); + m_radioBtnCustom->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); + m_buttonUpdate1->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); + m_buttonUpdate1->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncCustomDouble ), NULL, this ); + m_choiceHandleError->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); + m_choiceHandleDeletion->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeDeletionHandling ), NULL, this ); + m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnApply ), NULL, this ); + m_button16->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnCancel ), NULL, this ); + m_bpButtonLeftOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExLeftSideOnly ), NULL, this ); + m_bpButtonRightOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExRightSideOnly ), NULL, this ); + m_bpButtonLeftNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnLeftNewer ), NULL, this ); + m_bpButtonRightNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnRightNewer ), NULL, this ); + m_bpButtonDifferent->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDifferent ), NULL, this ); + m_bpButtonConflict->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnConflict ), NULL, this ); + } CmpCfgDlgGenerated::CmpCfgDlgGenerated( 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* bSizer136; - bSizer136 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer55; - bSizer55 = new wxBoxSizer( wxVERTICAL ); - - wxStaticBoxSizer* sbSizer6; - sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Compare by...") ), wxHORIZONTAL ); - - wxFlexGridSizer* fgSizer16; - fgSizer16 = new wxFlexGridSizer( 2, 3, 0, 0 ); - fgSizer16->SetFlexibleDirection( wxBOTH ); - fgSizer16->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_radioBtnSizeDate = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); - m_radioBtnSizeDate->SetValue( true ); - m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - file size\n - last write time and date\nare the same") ); - - fgSizer16->Add( m_radioBtnSizeDate, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmapByTime = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapByTime->SetToolTip( _("Files are found equal if\n - file size\n - last write time and date\nare the same") ); - - fgSizer16->Add( m_bitmapByTime, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_buttonTimeSize = new wxButton( this, wxID_ANY, _("File size and date"), wxDefaultPosition, wxSize( -1,42 ), 0 ); - m_buttonTimeSize->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - m_buttonTimeSize->SetToolTip( _("Files are found equal if\n - file size\n - last write time and date\nare the same") ); - - fgSizer16->Add( m_buttonTimeSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 ); - - m_radioBtnContent = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") ); - - fgSizer16->Add( m_radioBtnContent, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmapByContent = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapByContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") ); - - fgSizer16->Add( m_bitmapByContent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_buttonContent = new wxButton( this, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1,42 ), 0 ); - m_buttonContent->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - m_buttonContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") ); - - fgSizer16->Add( m_buttonContent, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - sbSizer6->Add( fgSizer16, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticline14 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - sbSizer6->Add( m_staticline14, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); - - m_bpButtonHelp = new wxBitmapButton( this, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - m_bpButtonHelp->SetToolTip( _("Help") ); - - sbSizer6->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer55->Add( sbSizer6, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 2 ); - - - bSizer55->Add( 0, 4, 0, 0, 5 ); - - wxStaticBoxSizer* sbSizer25; - sbSizer25 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Symbolic Link handling") ), wxVERTICAL ); - - wxArrayString m_choiceHandleSymlinksChoices; - m_choiceHandleSymlinks = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleSymlinksChoices, 0 ); - m_choiceHandleSymlinks->SetSelection( 0 ); - sbSizer25->Add( m_choiceHandleSymlinks, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer55->Add( sbSizer25, 0, wxEXPAND|wxTOP, 5 ); - - wxBoxSizer* bSizer22; - bSizer22 = new wxBoxSizer( wxHORIZONTAL ); - - m_button10 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button10->SetDefault(); - m_button10->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); - - bSizer22->Add( m_button10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_button6 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button6->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer22->Add( m_button6, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer55->Add( bSizer22, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer136->Add( bSizer55, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - this->SetSizer( bSizer136 ); - this->Layout(); - bSizer136->Fit( this ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CmpCfgDlgGenerated::OnClose ) ); - m_radioBtnSizeDate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this ); - m_buttonTimeSize->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this ); - m_buttonTimeSize->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnTimeSizeDouble ), NULL, this ); - m_radioBtnContent->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this ); - m_buttonContent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this ); - m_buttonContent->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnContentDouble ), NULL, this ); - m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnShowHelp ), NULL, this ); - m_choiceHandleSymlinks->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); - m_button10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnOkay ), NULL, this ); - m_button6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnCancel ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer136; + bSizer136 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer55; + bSizer55 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* sbSizer6; + sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Compare by...") ), wxHORIZONTAL ); + + wxFlexGridSizer* fgSizer16; + fgSizer16 = new wxFlexGridSizer( 2, 3, 0, 0 ); + fgSizer16->SetFlexibleDirection( wxBOTH ); + fgSizer16->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_radioBtnSizeDate = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); + m_radioBtnSizeDate->SetValue( true ); + m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - last write time and date\n - file size\nare the same") ); + + fgSizer16->Add( m_radioBtnSizeDate, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmapByTime = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapByTime->SetToolTip( _("Files are found equal if\n - last write time and date\n - file size\nare the same") ); + + fgSizer16->Add( m_bitmapByTime, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_buttonTimeSize = new wxButton( this, wxID_ANY, _("File time and size"), wxDefaultPosition, wxSize( -1,42 ), 0 ); + m_buttonTimeSize->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); + m_buttonTimeSize->SetToolTip( _("Files are found equal if\n - last write time and date\n - file size\nare the same") ); + + fgSizer16->Add( m_buttonTimeSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 ); + + m_radioBtnContent = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtnContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") ); + + fgSizer16->Add( m_radioBtnContent, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmapByContent = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapByContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") ); + + fgSizer16->Add( m_bitmapByContent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_buttonContent = new wxButton( this, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1,42 ), 0 ); + m_buttonContent->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); + m_buttonContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") ); + + fgSizer16->Add( m_buttonContent, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + sbSizer6->Add( fgSizer16, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + bSizer55->Add( sbSizer6, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 2 ); + + + bSizer55->Add( 0, 4, 0, 0, 5 ); + + wxBoxSizer* bSizer177; + bSizer177 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBoxSizer* sbSizer25; + sbSizer25 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Symbolic Link handling") ), wxVERTICAL ); + + wxArrayString m_choiceHandleSymlinksChoices; + m_choiceHandleSymlinks = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleSymlinksChoices, 0 ); + m_choiceHandleSymlinks->SetSelection( -1 ); + sbSizer25->Add( m_choiceHandleSymlinks, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer177->Add( sbSizer25, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonHelp = new wxBitmapButton( this, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButtonHelp->SetToolTip( _("Help") ); + + bSizer177->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + bSizer55->Add( bSizer177, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer22; + bSizer22 = new wxBoxSizer( wxHORIZONTAL ); + + m_button10 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button10->SetDefault(); + m_button10->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); + + bSizer22->Add( m_button10, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_button6 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button6->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer22->Add( m_button6, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer55->Add( bSizer22, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer136->Add( bSizer55, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + this->SetSizer( bSizer136 ); + this->Layout(); + bSizer136->Fit( this ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CmpCfgDlgGenerated::OnClose ) ); + m_radioBtnSizeDate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this ); + m_buttonTimeSize->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this ); + m_buttonTimeSize->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnTimeSizeDouble ), NULL, this ); + m_radioBtnContent->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this ); + m_buttonContent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this ); + m_buttonContent->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnContentDouble ), NULL, this ); + m_choiceHandleSymlinks->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); + m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnShowHelp ), NULL, this ); + m_button10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnOkay ), NULL, this ); + m_button6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnCancel ), NULL, this ); } CmpCfgDlgGenerated::~CmpCfgDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CmpCfgDlgGenerated::OnClose ) ); - m_radioBtnSizeDate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this ); - m_buttonTimeSize->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this ); - m_buttonTimeSize->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnTimeSizeDouble ), NULL, this ); - m_radioBtnContent->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this ); - m_buttonContent->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this ); - m_buttonContent->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnContentDouble ), NULL, this ); - m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnShowHelp ), NULL, this ); - m_choiceHandleSymlinks->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); - m_button10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnOkay ), NULL, this ); - m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnCancel ), NULL, this ); - + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CmpCfgDlgGenerated::OnClose ) ); + m_radioBtnSizeDate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this ); + m_buttonTimeSize->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this ); + m_buttonTimeSize->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnTimeSizeDouble ), NULL, this ); + m_radioBtnContent->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this ); + m_buttonContent->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this ); + m_buttonContent->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnContentDouble ), NULL, this ); + m_choiceHandleSymlinks->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); + m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnShowHelp ), NULL, this ); + m_button10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnOkay ), NULL, this ); + m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnCancel ), NULL, this ); + } SyncStatusDlgGenerated::SyncStatusDlgGenerated( 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( 470,300 ), wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - wxBoxSizer* bSizer27; - bSizer27 = new wxBoxSizer( wxVERTICAL ); - - - bSizer27->Add( 0, 15, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer37; - bSizer37 = new wxBoxSizer( wxHORIZONTAL ); - - bSizer27->Add( bSizer37, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - wxBoxSizer* bSizer42; - bSizer42 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_bitmapStatus = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 28,28 ), 0 ); - bSizer42->Add( m_bitmapStatus, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatus->Wrap( -1 ); - m_staticTextStatus->SetFont( wxFont( 14, 70, 90, 92, false, wxEmptyString ) ); - - bSizer42->Add( m_staticTextStatus, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - m_animationControl1 = new wxAnimationCtrl( this, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxDefaultSize, wxAC_DEFAULT_STYLE ); - m_animationControl1->SetMinSize( wxSize( 45,45 ) ); - - bSizer42->Add( m_animationControl1, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - - bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); - - bSizer27->Add( bSizer42, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer31 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer111; - bSizer111 = new wxBoxSizer( wxVERTICAL ); - - bSizerObjectsRemaining = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText25 = new wxStaticText( this, wxID_ANY, _("Elements remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText25->Wrap( -1 ); - m_staticText25->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizerObjectsRemaining->Add( m_staticText25, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextRemainingObj = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_staticTextRemainingObj->Wrap( -1 ); - m_staticTextRemainingObj->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); - - bSizerObjectsRemaining->Add( m_staticTextRemainingObj, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); - - m_staticText96 = new wxStaticText( this, wxID_ANY, _("("), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText96->Wrap( -1 ); - m_staticText96->SetFont( wxFont( 9, 74, 90, 90, false, wxT("Arial") ) ); - - bSizerObjectsRemaining->Add( m_staticText96, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); - - m_staticTextDataRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDataRemaining->Wrap( -1 ); - m_staticTextDataRemaining->SetFont( wxFont( 9, 74, 90, 90, false, wxT("Arial") ) ); - - bSizerObjectsRemaining->Add( m_staticTextDataRemaining, 0, wxALIGN_BOTTOM, 5 ); - - m_staticText97 = new wxStaticText( this, wxID_ANY, _(")"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText97->Wrap( -1 ); - m_staticText97->SetFont( wxFont( 9, 74, 90, 90, false, wxT("Arial") ) ); - - bSizerObjectsRemaining->Add( m_staticText97, 0, wxALIGN_BOTTOM, 5 ); - - bSizer111->Add( bSizerObjectsRemaining, 0, 0, 5 ); - - bSizerObjectsProcessed = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText251 = new wxStaticText( this, wxID_ANY, _("Elements processed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText251->Wrap( -1 ); - m_staticText251->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizerObjectsProcessed->Add( m_staticText251, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextProcessedObj = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_staticTextProcessedObj->Wrap( -1 ); - m_staticTextProcessedObj->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); - - bSizerObjectsProcessed->Add( m_staticTextProcessedObj, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); - - m_staticText98 = new wxStaticText( this, wxID_ANY, _("("), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText98->Wrap( -1 ); - m_staticText98->SetFont( wxFont( 9, 74, 90, 90, false, wxT("Arial") ) ); - - bSizerObjectsProcessed->Add( m_staticText98, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); - - m_staticTextDataProcessed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDataProcessed->Wrap( -1 ); - m_staticTextDataProcessed->SetFont( wxFont( 9, 74, 90, 90, false, wxT("Arial") ) ); - - bSizerObjectsProcessed->Add( m_staticTextDataProcessed, 0, wxALIGN_BOTTOM, 5 ); - - m_staticText99 = new wxStaticText( this, wxID_ANY, _(")"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText99->Wrap( -1 ); - m_staticText99->SetFont( wxFont( 9, 74, 90, 90, false, wxT("Arial") ) ); - - bSizerObjectsProcessed->Add( m_staticText99, 0, wxALIGN_BOTTOM, 5 ); - - bSizer111->Add( bSizerObjectsProcessed, 0, 0, 5 ); - - bSizer31->Add( bSizer111, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer31->Add( 0, 0, 1, wxEXPAND, 5 ); - - wxBoxSizer* bSizer114; - bSizer114 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText55 = new wxStaticText( this, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText55->Wrap( -1 ); - m_staticText55->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer114->Add( m_staticText55, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextTimeElapsed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeElapsed->Wrap( -1 ); - m_staticTextTimeElapsed->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); - - bSizer114->Add( m_staticTextTimeElapsed, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); - - bSizer31->Add( bSizer114, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer27->Add( bSizer31, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - bSizerProgressText = new wxBoxSizer( wxVERTICAL ); - - m_textCtrlInfo = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY ); - m_textCtrlInfo->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizerProgressText->Add( m_textCtrlInfo, 3, wxEXPAND|wxALL, 5 ); - - bSizer27->Add( bSizerProgressText, 1, wxEXPAND, 5 ); - - m_gauge1 = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,20 ), wxGA_HORIZONTAL ); - bSizer27->Add( m_gauge1, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - bSizer28 = new wxBoxSizer( wxHORIZONTAL ); - - bSizerSpeed = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText108 = new wxStaticText( this, wxID_ANY, _("Speed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText108->Wrap( -1 ); - m_staticText108->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizerSpeed->Add( m_staticText108, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextSpeed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextSpeed->Wrap( -1 ); - m_staticTextSpeed->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); - - bSizerSpeed->Add( m_staticTextSpeed, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); - - - bSizerSpeed->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer28->Add( bSizerSpeed, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer28->Add( 0, 0, 1, 0, 5 ); - - m_buttonOK = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( 100,32 ), 0 ); - m_buttonOK->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - m_buttonOK->Enable( false ); - m_buttonOK->Hide(); - - bSizer28->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - m_buttonPause = new wxButton( this, wxID_ANY, _("&Pause"), wxDefaultPosition, wxSize( 100,32 ), 0 ); - m_buttonPause->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer28->Add( m_buttonPause, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - m_buttonAbort = new wxButton( this, wxID_CANCEL, _("&Abort"), wxDefaultPosition, wxSize( 100,32 ), 0 ); - m_buttonAbort->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer28->Add( m_buttonAbort, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - - bSizer28->Add( 0, 0, 1, 0, 5 ); - - bSizerRemTime = new wxBoxSizer( wxHORIZONTAL ); - - - bSizerRemTime->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText21 = new wxStaticText( this, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText21->Wrap( -1 ); - m_staticText21->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizerRemTime->Add( m_staticText21, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextTimeRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeRemaining->Wrap( -1 ); - m_staticTextTimeRemaining->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); - - bSizerRemTime->Add( m_staticTextTimeRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); - - bSizer28->Add( bSizerRemTime, 1, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer27->Add( bSizer28, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL, 5 ); - - - bSizer27->Add( 0, 5, 0, wxEXPAND, 5 ); - - this->SetSizer( bSizer27 ); - this->Layout(); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncStatusDlgGenerated::OnClose ) ); - this->Connect( wxEVT_ICONIZE, wxIconizeEventHandler( SyncStatusDlgGenerated::OnIconize ) ); - m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnOkay ), NULL, this ); - m_buttonPause->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnPause ), NULL, this ); - m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnAbort ), NULL, this ); + this->SetSizeHints( wxSize( 470,300 ), wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + + wxBoxSizer* bSizer27; + bSizer27 = new wxBoxSizer( wxVERTICAL ); + + + bSizer27->Add( 0, 15, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer37; + bSizer37 = new wxBoxSizer( wxHORIZONTAL ); + + bSizer27->Add( bSizer37, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxBoxSizer* bSizer42; + bSizer42 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_bitmapStatus = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 28,28 ), 0 ); + bSizer42->Add( m_bitmapStatus, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatus->Wrap( -1 ); + m_staticTextStatus->SetFont( wxFont( 14, 70, 90, 92, false, wxEmptyString ) ); + + bSizer42->Add( m_staticTextStatus, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + m_animationControl1 = new wxAnimationCtrl( this, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxDefaultSize, wxAC_DEFAULT_STYLE ); + m_animationControl1->SetMinSize( wxSize( 45,45 ) ); + + bSizer42->Add( m_animationControl1, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + + bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); + + bSizer27->Add( bSizer42, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer31 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer111; + bSizer111 = new wxBoxSizer( wxVERTICAL ); + + bSizerObjectsRemaining = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText25 = new wxStaticText( this, wxID_ANY, _("Elements remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText25->Wrap( -1 ); + m_staticText25->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizerObjectsRemaining->Add( m_staticText25, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextRemainingObj = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_staticTextRemainingObj->Wrap( -1 ); + m_staticTextRemainingObj->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); + + bSizerObjectsRemaining->Add( m_staticTextRemainingObj, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + + m_staticText96 = new wxStaticText( this, wxID_ANY, _("("), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText96->Wrap( -1 ); + m_staticText96->SetFont( wxFont( 9, 74, 90, 90, false, wxT("Arial") ) ); + + bSizerObjectsRemaining->Add( m_staticText96, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + + m_staticTextDataRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDataRemaining->Wrap( -1 ); + m_staticTextDataRemaining->SetFont( wxFont( 9, 74, 90, 90, false, wxT("Arial") ) ); + + bSizerObjectsRemaining->Add( m_staticTextDataRemaining, 0, wxALIGN_BOTTOM, 5 ); + + m_staticText97 = new wxStaticText( this, wxID_ANY, _(")"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText97->Wrap( -1 ); + m_staticText97->SetFont( wxFont( 9, 74, 90, 90, false, wxT("Arial") ) ); + + bSizerObjectsRemaining->Add( m_staticText97, 0, wxALIGN_BOTTOM, 5 ); + + bSizer111->Add( bSizerObjectsRemaining, 0, 0, 5 ); + + bSizerObjectsProcessed = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText251 = new wxStaticText( this, wxID_ANY, _("Elements processed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText251->Wrap( -1 ); + m_staticText251->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizerObjectsProcessed->Add( m_staticText251, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextProcessedObj = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_staticTextProcessedObj->Wrap( -1 ); + m_staticTextProcessedObj->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); + + bSizerObjectsProcessed->Add( m_staticTextProcessedObj, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + + m_staticText98 = new wxStaticText( this, wxID_ANY, _("("), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText98->Wrap( -1 ); + m_staticText98->SetFont( wxFont( 9, 74, 90, 90, false, wxT("Arial") ) ); + + bSizerObjectsProcessed->Add( m_staticText98, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + + m_staticTextDataProcessed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDataProcessed->Wrap( -1 ); + m_staticTextDataProcessed->SetFont( wxFont( 9, 74, 90, 90, false, wxT("Arial") ) ); + + bSizerObjectsProcessed->Add( m_staticTextDataProcessed, 0, wxALIGN_BOTTOM, 5 ); + + m_staticText99 = new wxStaticText( this, wxID_ANY, _(")"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText99->Wrap( -1 ); + m_staticText99->SetFont( wxFont( 9, 74, 90, 90, false, wxT("Arial") ) ); + + bSizerObjectsProcessed->Add( m_staticText99, 0, wxALIGN_BOTTOM, 5 ); + + bSizer111->Add( bSizerObjectsProcessed, 0, 0, 5 ); + + bSizer31->Add( bSizer111, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer31->Add( 0, 0, 1, wxEXPAND, 5 ); + + wxBoxSizer* bSizer114; + bSizer114 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText55 = new wxStaticText( this, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText55->Wrap( -1 ); + m_staticText55->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer114->Add( m_staticText55, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextTimeElapsed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeElapsed->Wrap( -1 ); + m_staticTextTimeElapsed->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); + + bSizer114->Add( m_staticTextTimeElapsed, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + + bSizer31->Add( bSizer114, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer27->Add( bSizer31, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + bSizerProgressText = new wxBoxSizer( wxVERTICAL ); + + m_textCtrlInfo = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY ); + m_textCtrlInfo->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizerProgressText->Add( m_textCtrlInfo, 3, wxEXPAND|wxALL, 5 ); + + bSizer27->Add( bSizerProgressText, 1, wxEXPAND, 5 ); + + m_gauge1 = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,14 ), wxGA_HORIZONTAL ); + bSizer27->Add( m_gauge1, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + bSizer28 = new wxBoxSizer( wxHORIZONTAL ); + + bSizerSpeed = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText108 = new wxStaticText( this, wxID_ANY, _("Speed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText108->Wrap( -1 ); + m_staticText108->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizerSpeed->Add( m_staticText108, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextSpeed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextSpeed->Wrap( -1 ); + m_staticTextSpeed->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); + + bSizerSpeed->Add( m_staticTextSpeed, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + + + bSizerSpeed->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer28->Add( bSizerSpeed, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer28->Add( 0, 0, 1, 0, 5 ); + + m_buttonOK = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( 100,32 ), 0 ); + m_buttonOK->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + m_buttonOK->Enable( false ); + m_buttonOK->Hide(); + + bSizer28->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + m_buttonPause = new wxButton( this, wxID_ANY, _("&Pause"), wxDefaultPosition, wxSize( 100,32 ), 0 ); + m_buttonPause->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer28->Add( m_buttonPause, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + m_buttonAbort = new wxButton( this, wxID_CANCEL, _("&Abort"), wxDefaultPosition, wxSize( 100,32 ), 0 ); + m_buttonAbort->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer28->Add( m_buttonAbort, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + + bSizer28->Add( 0, 0, 1, 0, 5 ); + + bSizerRemTime = new wxBoxSizer( wxHORIZONTAL ); + + + bSizerRemTime->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText21 = new wxStaticText( this, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText21->Wrap( -1 ); + m_staticText21->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizerRemTime->Add( m_staticText21, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextTimeRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeRemaining->Wrap( -1 ); + m_staticTextTimeRemaining->SetFont( wxFont( 9, 74, 90, 92, false, wxT("Arial") ) ); + + bSizerRemTime->Add( m_staticTextTimeRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + + bSizer28->Add( bSizerRemTime, 1, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer27->Add( bSizer28, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL, 5 ); + + + bSizer27->Add( 0, 5, 0, wxEXPAND, 5 ); + + this->SetSizer( bSizer27 ); + this->Layout(); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncStatusDlgGenerated::OnClose ) ); + this->Connect( wxEVT_ICONIZE, wxIconizeEventHandler( SyncStatusDlgGenerated::OnIconize ) ); + m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnOkay ), NULL, this ); + m_buttonPause->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnPause ), NULL, this ); + m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnAbort ), NULL, this ); } SyncStatusDlgGenerated::~SyncStatusDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncStatusDlgGenerated::OnClose ) ); - this->Disconnect( wxEVT_ICONIZE, wxIconizeEventHandler( SyncStatusDlgGenerated::OnIconize ) ); - m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnOkay ), NULL, this ); - m_buttonPause->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnPause ), NULL, this ); - m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnAbort ), NULL, this ); - + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncStatusDlgGenerated::OnClose ) ); + this->Disconnect( wxEVT_ICONIZE, wxIconizeEventHandler( SyncStatusDlgGenerated::OnIconize ) ); + m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnOkay ), NULL, this ); + m_buttonPause->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnPause ), NULL, this ); + m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnAbort ), NULL, this ); + } LogControlGenerated::LogControlGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) { - wxBoxSizer* bSizer153; - bSizer153 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer154; - bSizer154 = new wxBoxSizer( wxVERTICAL ); - - m_bpButtonErrors = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), wxBU_AUTODRAW ); - bSizer154->Add( m_bpButtonErrors, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonWarnings = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), wxBU_AUTODRAW ); - bSizer154->Add( m_bpButtonWarnings, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonInfo = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), wxBU_AUTODRAW ); - bSizer154->Add( m_bpButtonInfo, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer153->Add( bSizer154, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlInfo = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY ); - m_textCtrlInfo->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizer153->Add( m_textCtrlInfo, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - this->SetSizer( bSizer153 ); - this->Layout(); - bSizer153->Fit( this ); - - // Connect Events - m_bpButtonErrors->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogControlGenerated::OnErrors ), NULL, this ); - m_bpButtonWarnings->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogControlGenerated::OnWarnings ), NULL, this ); - m_bpButtonInfo->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogControlGenerated::OnInfo ), NULL, this ); -} + wxBoxSizer* bSizer153; + bSizer153 = new wxBoxSizer( wxHORIZONTAL ); -LogControlGenerated::~LogControlGenerated() -{ - // Disconnect Events - m_bpButtonErrors->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogControlGenerated::OnErrors ), NULL, this ); - m_bpButtonWarnings->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogControlGenerated::OnWarnings ), NULL, this ); - m_bpButtonInfo->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogControlGenerated::OnInfo ), NULL, this ); - -} + wxBoxSizer* bSizer154; + bSizer154 = new wxBoxSizer( wxVERTICAL ); -HelpDlgGenerated::HelpDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer20; - bSizer20 = new wxBoxSizer( wxVERTICAL ); - - - bSizer20->Add( 0, 10, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer85; - bSizer85 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap25 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); - bSizer85->Add( m_bitmap25, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); - m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer72->Add( 20, 0, 0, 0, 5 ); - - m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Help"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText56->Wrap( -1 ); - m_staticText56->SetFont( wxFont( 16, 70, 90, 92, false, wxEmptyString ) ); - - bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer72->Add( 20, 0, 0, 0, 5 ); - - m_panel8->SetSizer( bSizer72 ); - m_panel8->Layout(); - bSizer72->Fit( m_panel8 ); - bSizer85->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer85->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer20->Add( bSizer85, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_notebook1 = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_scrolledWindow1 = new wxScrolledWindow( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxSIMPLE_BORDER|wxVSCROLL ); - m_scrolledWindow1->SetScrollRate( 5, 5 ); - m_scrolledWindow1->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_INACTIVEBORDER ) ); - - wxBoxSizer* bSizer70; - bSizer70 = new wxBoxSizer( wxVERTICAL ); - - m_staticText59 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("Compare by \"File size and date\""), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText59->Wrap( 500 ); - m_staticText59->SetFont( wxFont( 10, 70, 90, 92, true, wxEmptyString ) ); - - bSizer70->Add( m_staticText59, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_staticText60 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText60->Wrap( 500 ); - bSizer70->Add( m_staticText60, 0, wxALL, 5 ); - - m_staticText61 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("When the comparison is started with this option set the following decision tree is processed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText61->Wrap( 500 ); - bSizer70->Add( m_staticText61, 0, wxALL, 5 ); - - m_treeCtrl1 = new wxTreeCtrl( m_scrolledWindow1, wxID_ANY, wxDefaultPosition, wxSize( -1,220 ), wxTR_DEFAULT_STYLE ); - m_treeCtrl1->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizer70->Add( m_treeCtrl1, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_staticText63 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("As a result the files are separated into the following categories:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText63->Wrap( 500 ); - bSizer70->Add( m_staticText63, 0, wxALL, 5 ); - - m_staticText75 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- equal"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText75->Wrap( -1 ); - bSizer70->Add( m_staticText75, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText76 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- left newer"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText76->Wrap( -1 ); - bSizer70->Add( m_staticText76, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText77 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- right newer"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText77->Wrap( -1 ); - bSizer70->Add( m_staticText77, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText79 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- exists left only"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText79->Wrap( -1 ); - bSizer70->Add( m_staticText79, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText80 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- exists right only"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText80->Wrap( -1 ); - bSizer70->Add( m_staticText80, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText78 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- conflict (same date, different size)"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText78->Wrap( -1 ); - bSizer70->Add( m_staticText78, 0, wxRIGHT|wxLEFT, 5 ); - - m_scrolledWindow1->SetSizer( bSizer70 ); - m_scrolledWindow1->Layout(); - bSizer70->Fit( m_scrolledWindow1 ); - m_notebook1->AddPage( m_scrolledWindow1, _("File size and date"), true ); - m_scrolledWindow5 = new wxScrolledWindow( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxSIMPLE_BORDER|wxVSCROLL ); - m_scrolledWindow5->SetScrollRate( 5, 5 ); - m_scrolledWindow5->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_INACTIVEBORDER ) ); - - wxBoxSizer* bSizer74; - bSizer74 = new wxBoxSizer( wxVERTICAL ); - - m_staticText65 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("Compare by \"File content\""), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText65->Wrap( 500 ); - m_staticText65->SetFont( wxFont( 10, 70, 90, 92, true, wxEmptyString ) ); - - bSizer74->Add( m_staticText65, 0, wxALL, 5 ); - - m_staticText66 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText66->Wrap( 500 ); - bSizer74->Add( m_staticText66, 0, wxALL, 5 ); - - m_treeCtrl2 = new wxTreeCtrl( m_scrolledWindow5, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE ); - m_treeCtrl2->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - m_treeCtrl2->SetMinSize( wxSize( -1,130 ) ); - - bSizer74->Add( m_treeCtrl2, 0, wxALL|wxEXPAND, 5 ); - - m_staticText69 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("As a result the files are separated into the following categories:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText69->Wrap( 500 ); - bSizer74->Add( m_staticText69, 0, wxALL, 5 ); - - m_staticText81 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- equal"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText81->Wrap( -1 ); - bSizer74->Add( m_staticText81, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText82 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- different"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText82->Wrap( -1 ); - bSizer74->Add( m_staticText82, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText83 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- exists left only"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText83->Wrap( -1 ); - bSizer74->Add( m_staticText83, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText84 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- exists right only"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText84->Wrap( -1 ); - bSizer74->Add( m_staticText84, 0, wxRIGHT|wxLEFT, 5 ); - - m_scrolledWindow5->SetSizer( bSizer74 ); - m_scrolledWindow5->Layout(); - bSizer74->Fit( m_scrolledWindow5 ); - m_notebook1->AddPage( m_scrolledWindow5, _("File content"), false ); - - bSizer20->Add( m_notebook1, 1, wxEXPAND | wxALL, 5 ); - - m_button8 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( 100,32 ), 0 ); - m_button8->SetDefault(); - m_button8->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer20->Add( m_button8, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - this->SetSizer( bSizer20 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( HelpDlgGenerated::OnClose ) ); - m_button8->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( HelpDlgGenerated::OnOK ), NULL, this ); + m_bpButtonErrors = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), wxBU_AUTODRAW ); + bSizer154->Add( m_bpButtonErrors, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonWarnings = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), wxBU_AUTODRAW ); + bSizer154->Add( m_bpButtonWarnings, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonInfo = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), wxBU_AUTODRAW ); + bSizer154->Add( m_bpButtonInfo, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer153->Add( bSizer154, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlInfo = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY ); + m_textCtrlInfo->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer153->Add( m_textCtrlInfo, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + this->SetSizer( bSizer153 ); + this->Layout(); + bSizer153->Fit( this ); + + // Connect Events + m_bpButtonErrors->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogControlGenerated::OnErrors ), NULL, this ); + m_bpButtonWarnings->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogControlGenerated::OnWarnings ), NULL, this ); + m_bpButtonInfo->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogControlGenerated::OnInfo ), NULL, this ); } -HelpDlgGenerated::~HelpDlgGenerated() +LogControlGenerated::~LogControlGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( HelpDlgGenerated::OnClose ) ); - m_button8->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( HelpDlgGenerated::OnOK ), NULL, this ); - + // Disconnect Events + m_bpButtonErrors->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogControlGenerated::OnErrors ), NULL, this ); + m_bpButtonWarnings->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogControlGenerated::OnWarnings ), NULL, this ); + m_bpButtonInfo->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogControlGenerated::OnInfo ), NULL, this ); + } AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer31; - bSizer31 = new wxBoxSizer( wxVERTICAL ); - - - bSizer31->Add( 0, 5, 0, 0, 5 ); - - m_panel5 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer36; - bSizer36 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap11 = new wxStaticBitmap( m_panel5, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 404,55 ), 0 ); - bSizer36->Add( m_bitmap11, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panel5->SetSizer( bSizer36 ); - m_panel5->Layout(); - bSizer36->Fit( m_panel5 ); - bSizer31->Add( m_panel5, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_build = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_build->Wrap( -1 ); - m_build->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); - - bSizer31->Add( m_build, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer31->Add( 0, 10, 0, 0, 5 ); - - wxBoxSizer* bSizer53; - bSizer53 = new wxBoxSizer( wxVERTICAL ); - - m_panel33 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDOUBLE_BORDER|wxTAB_TRAVERSAL ); - m_panel33->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizerCodeInfo = new wxBoxSizer( wxVERTICAL ); - - m_staticText72 = new wxStaticText( m_panel33, wxID_ANY, _("Source code written in C++ utilizing:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText72->Wrap( -1 ); - m_staticText72->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizerCodeInfo->Add( m_staticText72, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - wxBoxSizer* bSizer167; - bSizer167 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer171; - bSizer171 = new wxBoxSizer( wxHORIZONTAL ); - - m_hyperlink9 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("MinGW"), wxT("http://www.mingw.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink9->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizer171->Add( m_hyperlink9, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_hyperlink10 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Code::Blocks"), wxT("http://www.codeblocks.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink10->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizer171->Add( m_hyperlink10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_hyperlink13 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Boost"), wxT("http://www.boost.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink13->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizer171->Add( m_hyperlink13, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_hyperlink7 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("wxWidgets"), wxT("http://www.wxwidgets.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink7->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizer171->Add( m_hyperlink7, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_hyperlink11 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("MS Visual C++"), wxT("http://msdn.microsoft.com/library/60k1461a.aspx"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink11->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizer171->Add( m_hyperlink11, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_hyperlink16 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Artistic Style"), wxT("http://astyle.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink16->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizer171->Add( m_hyperlink16, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - bSizer167->Add( bSizer171, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM, 5 ); - - wxBoxSizer* bSizer172; - bSizer172 = new wxBoxSizer( wxHORIZONTAL ); - - m_hyperlink8 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Loki"), wxT("http://sourceforge.net/projects/loki-lib"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink8->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizer172->Add( m_hyperlink8, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_hyperlink15 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("zenXML"), wxT("http://sourceforge.net/projects/zenxml/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink15->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizer172->Add( m_hyperlink15, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_hyperlink12 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Google Test"), wxT("http://code.google.com/p/googletest"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink12->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizer172->Add( m_hyperlink12, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_hyperlink18 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Unicode NSIS"), wxT("http://www.scratchpaper.com"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink18->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizer172->Add( m_hyperlink18, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_hyperlink14 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("wxFormBuilder"), wxT("http://wxformbuilder.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink14->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizer172->Add( m_hyperlink14, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - bSizer167->Add( bSizer172, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizerCodeInfo->Add( bSizer167, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_hyperlink21 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("- ZenJu -"), wxT("mailto:zhnmju123@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink21->SetFont( wxFont( 10, 74, 93, 92, false, wxT("Segoe Print") ) ); - m_hyperlink21->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - m_hyperlink21->SetToolTip( _("zhnmju123@gmx.de") ); - - bSizerCodeInfo->Add( m_hyperlink21, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_panel33->SetSizer( bSizerCodeInfo ); - m_panel33->Layout(); - bSizerCodeInfo->Fit( m_panel33 ); - bSizer53->Add( m_panel33, 0, wxBOTTOM|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_scrolledWindowTranslators = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxDOUBLE_BORDER|wxHSCROLL|wxVSCROLL ); - m_scrolledWindowTranslators->SetScrollRate( 5, 5 ); - m_scrolledWindowTranslators->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - m_scrolledWindowTranslators->SetMinSize( wxSize( -1,180 ) ); - - bSizerTranslators = new wxBoxSizer( wxVERTICAL ); - - m_staticText54 = new wxStaticText( m_scrolledWindowTranslators, wxID_ANY, _("Big thanks for localizing FreeFileSync goes out to:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText54->Wrap( -1 ); - m_staticText54->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); - - bSizerTranslators->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 5 ); - - - bSizerTranslators->Add( 0, 5, 0, 0, 5 ); - - fgSizerTranslators = new wxFlexGridSizer( 50, 3, 5, 20 ); - fgSizerTranslators->SetFlexibleDirection( wxBOTH ); - fgSizerTranslators->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - bSizerTranslators->Add( fgSizerTranslators, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_scrolledWindowTranslators->SetSizer( bSizerTranslators ); - m_scrolledWindowTranslators->Layout(); - bSizerTranslators->Fit( m_scrolledWindowTranslators ); - bSizer53->Add( m_scrolledWindowTranslators, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM, 5 ); - - bSizer31->Add( bSizer53, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 25 ); - - m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer31->Add( m_staticline3, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); - - m_staticText131 = new wxStaticText( this, wxID_ANY, _("Feedback and suggestions are welcome at:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText131->Wrap( -1 ); - m_staticText131->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); - - bSizer31->Add( m_staticText131, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer31->Add( m_staticline12, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); - - wxBoxSizer* bSizer156; - bSizer156 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap9 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap9->SetToolTip( _("FreeFileSync at Sourceforge") ); - - bSizer156->Add( m_bitmap9, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - m_hyperlink1 = new wxHyperlinkCtrl( this, wxID_ANY, _("Homepage"), wxT("http://sourceforge.net/projects/freefilesync/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink1->SetFont( wxFont( 10, 70, 90, 92, true, wxEmptyString ) ); - m_hyperlink1->SetToolTip( _("http://sourceforge.net/projects/freefilesync/") ); - - bSizer156->Add( m_hyperlink1, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer156->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_hyperlink3 = new wxHyperlinkCtrl( this, wxID_ANY, _("If you like FFS"), wxT("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zhnmju123%40gmx%2ede&no_shipping=0&no_note=1&tax=0¤cy_code=EUR&lc=EN&bn=PP%2dDonationsBF&charset=UTF%2d8"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink3->SetFont( wxFont( 10, 70, 90, 92, true, wxEmptyString ) ); - m_hyperlink3->SetToolTip( _("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zhnmju123%40gmx%2ede&no_shipping=0&no_note=1&tax=0¤cy_code=EUR&lc=EN&bn=PP%2dDonationsBF&charset=UTF%2d8") ); - - bSizer156->Add( m_hyperlink3, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_animationControl1 = new wxAnimationCtrl( this, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxSize( -1,-1 ), wxAC_DEFAULT_STYLE ); - m_animationControl1->SetToolTip( _("Donate with PayPal") ); - m_animationControl1->SetMinSize( wxSize( 48,48 ) ); - - bSizer156->Add( m_animationControl1, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - bSizer31->Add( bSizer156, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 10 ); - - wxBoxSizer* bSizer158; - bSizer158 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap10->SetToolTip( _("Email") ); - - bSizer158->Add( m_bitmap10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - m_hyperlink2 = new wxHyperlinkCtrl( this, wxID_ANY, _("Email"), wxT("mailto:zhnmju123@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink2->SetFont( wxFont( 10, 70, 90, 92, true, wxEmptyString ) ); - m_hyperlink2->SetToolTip( _("zhnmju123@gmx.de") ); - - bSizer158->Add( m_hyperlink2, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer158->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_hyperlink6 = new wxHyperlinkCtrl( this, wxID_ANY, _("Report translation error"), wxT("http://sourceforge.net/projects/freefilesync/forums/forum/976976"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink6->SetFont( wxFont( 10, 70, 90, 92, true, wxEmptyString ) ); - m_hyperlink6->SetToolTip( _("http://sourceforge.net/projects/freefilesync/forums/forum/976976") ); - - bSizer158->Add( m_hyperlink6, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmapTransl = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmapTransl->SetToolTip( _("Report translation error") ); - - bSizer158->Add( m_bitmapTransl, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - bSizer31->Add( bSizer158, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 10 ); - - m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer31->Add( m_staticline2, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); - - wxStaticBoxSizer* sbSizer14; - sbSizer14 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Published under the GNU General Public License:") ), wxHORIZONTAL ); - - - sbSizer14->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap13 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 88,31 ), 0 ); - sbSizer14->Add( m_bitmap13, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_hyperlink5 = new wxHyperlinkCtrl( this, wxID_ANY, _("http://www.gnu.org/licenses/gpl.html"), wxT("http://www.gnu.org/licenses/gpl.html"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - sbSizer14->Add( m_hyperlink5, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - sbSizer14->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer31->Add( sbSizer14, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); - - m_buttonOkay = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( 100,32 ), 0 ); - m_buttonOkay->SetDefault(); - m_buttonOkay->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer31->Add( m_buttonOkay, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - - this->SetSizer( bSizer31 ); - this->Layout(); - bSizer31->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) ); - m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer31; + bSizer31 = new wxBoxSizer( wxVERTICAL ); + + + bSizer31->Add( 0, 5, 0, 0, 5 ); + + m_panel5 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); + m_panel5->SetBackgroundColour( wxColour( 255, 255, 255 ) ); + + wxBoxSizer* bSizer36; + bSizer36 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap11 = new wxStaticBitmap( m_panel5, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 404,55 ), 0 ); + bSizer36->Add( m_bitmap11, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panel5->SetSizer( bSizer36 ); + m_panel5->Layout(); + bSizer36->Fit( m_panel5 ); + bSizer31->Add( m_panel5, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_build = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_build->Wrap( -1 ); + m_build->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); + + bSizer31->Add( m_build, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer31->Add( 0, 10, 0, 0, 5 ); + + wxBoxSizer* bSizer53; + bSizer53 = new wxBoxSizer( wxVERTICAL ); + + m_panel33 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDOUBLE_BORDER|wxTAB_TRAVERSAL ); + m_panel33->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizerCodeInfo = new wxBoxSizer( wxVERTICAL ); + + m_staticText72 = new wxStaticText( m_panel33, wxID_ANY, _("Source code written in C++ utilizing:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText72->Wrap( -1 ); + m_staticText72->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizerCodeInfo->Add( m_staticText72, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + wxBoxSizer* bSizer167; + bSizer167 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer171; + bSizer171 = new wxBoxSizer( wxHORIZONTAL ); + + m_hyperlink9 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("MinGW"), wxT("http://www.mingw.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink9->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer171->Add( m_hyperlink9, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink11 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("MS Visual C++"), wxT("http://msdn.microsoft.com/library/60k1461a.aspx"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink11->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer171->Add( m_hyperlink11, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink10 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Code::Blocks"), wxT("http://www.codeblocks.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink10->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer171->Add( m_hyperlink10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink13 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Boost"), wxT("http://www.boost.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink13->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer171->Add( m_hyperlink13, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink7 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("wxWidgets"), wxT("http://www.wxwidgets.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink7->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer171->Add( m_hyperlink7, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink16 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Artistic Style"), wxT("http://astyle.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink16->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer171->Add( m_hyperlink16, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + bSizer167->Add( bSizer171, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM, 5 ); + + wxBoxSizer* bSizer172; + bSizer172 = new wxBoxSizer( wxHORIZONTAL ); + + m_hyperlink8 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Loki"), wxT("http://sourceforge.net/projects/loki-lib"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink8->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer172->Add( m_hyperlink8, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink15 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("zenXML"), wxT("http://sourceforge.net/projects/zenxml/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink15->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer172->Add( m_hyperlink15, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink12 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Google Test"), wxT("http://code.google.com/p/googletest"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink12->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer172->Add( m_hyperlink12, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink18 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Unicode NSIS"), wxT("http://www.scratchpaper.com"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink18->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer172->Add( m_hyperlink18, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink14 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("wxFormBuilder"), wxT("http://wxformbuilder.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink14->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer172->Add( m_hyperlink14, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + bSizer167->Add( bSizer172, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizerCodeInfo->Add( bSizer167, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_hyperlink21 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("- ZenJu -"), wxT("mailto:zhnmju123@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink21->SetFont( wxFont( 10, 74, 93, 92, false, wxT("Segoe Print") ) ); + m_hyperlink21->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + m_hyperlink21->SetToolTip( _("zhnmju123@gmx.de") ); + + bSizerCodeInfo->Add( m_hyperlink21, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_panel33->SetSizer( bSizerCodeInfo ); + m_panel33->Layout(); + bSizerCodeInfo->Fit( m_panel33 ); + bSizer53->Add( m_panel33, 0, wxBOTTOM|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_scrolledWindowTranslators = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxDOUBLE_BORDER|wxHSCROLL|wxVSCROLL ); + m_scrolledWindowTranslators->SetScrollRate( 5, 5 ); + m_scrolledWindowTranslators->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + m_scrolledWindowTranslators->SetMinSize( wxSize( -1,180 ) ); + + bSizerTranslators = new wxBoxSizer( wxVERTICAL ); + + m_staticText54 = new wxStaticText( m_scrolledWindowTranslators, wxID_ANY, _("Big thanks for localizing FreeFileSync goes out to:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText54->Wrap( -1 ); + m_staticText54->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) ); + + bSizerTranslators->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 5 ); + + + bSizerTranslators->Add( 0, 5, 0, 0, 5 ); + + fgSizerTranslators = new wxFlexGridSizer( 50, 3, 5, 20 ); + fgSizerTranslators->SetFlexibleDirection( wxBOTH ); + fgSizerTranslators->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + bSizerTranslators->Add( fgSizerTranslators, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_scrolledWindowTranslators->SetSizer( bSizerTranslators ); + m_scrolledWindowTranslators->Layout(); + bSizerTranslators->Fit( m_scrolledWindowTranslators ); + bSizer53->Add( m_scrolledWindowTranslators, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM, 5 ); + + bSizer31->Add( bSizer53, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 25 ); + + m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer31->Add( m_staticline3, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); + + m_staticText131 = new wxStaticText( this, wxID_ANY, _("Feedback and suggestions are welcome at:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText131->Wrap( -1 ); + m_staticText131->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) ); + + bSizer31->Add( m_staticText131, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer31->Add( m_staticline12, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); + + wxBoxSizer* bSizer156; + bSizer156 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap9 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap9->SetToolTip( _("FreeFileSync at Sourceforge") ); + + bSizer156->Add( m_bitmap9, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + m_hyperlink1 = new wxHyperlinkCtrl( this, wxID_ANY, _("Homepage"), wxT("http://sourceforge.net/projects/freefilesync/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink1->SetFont( wxFont( 10, 70, 90, 92, true, wxEmptyString ) ); + m_hyperlink1->SetToolTip( _("http://sourceforge.net/projects/freefilesync/") ); + + bSizer156->Add( m_hyperlink1, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer156->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_hyperlink3 = new wxHyperlinkCtrl( this, wxID_ANY, _("If you like FFS"), wxT("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zhnmju123@gmx.de&lc=US¤cy_code=EUR"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink3->SetFont( wxFont( 10, 70, 90, 92, true, wxEmptyString ) ); + m_hyperlink3->SetToolTip( _("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zhnmju123@gmx.de&lc=US¤cy_code=EUR") ); + + bSizer156->Add( m_hyperlink3, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_animationControl1 = new wxAnimationCtrl( this, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxSize( -1,-1 ), wxAC_DEFAULT_STYLE ); + m_animationControl1->SetToolTip( _("Donate with PayPal") ); + m_animationControl1->SetMinSize( wxSize( 48,48 ) ); + + bSizer156->Add( m_animationControl1, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + bSizer31->Add( bSizer156, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 10 ); + + wxBoxSizer* bSizer158; + bSizer158 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap10->SetToolTip( _("Email") ); + + bSizer158->Add( m_bitmap10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + m_hyperlink2 = new wxHyperlinkCtrl( this, wxID_ANY, _("Email"), wxT("mailto:zhnmju123@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink2->SetFont( wxFont( 10, 70, 90, 92, true, wxEmptyString ) ); + m_hyperlink2->SetToolTip( _("zhnmju123@gmx.de") ); + + bSizer158->Add( m_hyperlink2, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer158->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_hyperlink6 = new wxHyperlinkCtrl( this, wxID_ANY, _("Report translation error"), wxT("http://sourceforge.net/projects/freefilesync/forums/forum/976976"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink6->SetFont( wxFont( 10, 70, 90, 92, true, wxEmptyString ) ); + m_hyperlink6->SetToolTip( _("http://sourceforge.net/projects/freefilesync/forums/forum/976976") ); + + bSizer158->Add( m_hyperlink6, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmapTransl = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmapTransl->SetToolTip( _("Report translation error") ); + + bSizer158->Add( m_bitmapTransl, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + bSizer31->Add( bSizer158, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 10 ); + + m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer31->Add( m_staticline2, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); + + wxStaticBoxSizer* sbSizer14; + sbSizer14 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Published under the GNU General Public License:") ), wxHORIZONTAL ); + + + sbSizer14->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap13 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 88,31 ), 0 ); + sbSizer14->Add( m_bitmap13, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_hyperlink5 = new wxHyperlinkCtrl( this, wxID_ANY, _("http://www.gnu.org/licenses/gpl.html"), wxT("http://www.gnu.org/licenses/gpl.html"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + sbSizer14->Add( m_hyperlink5, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + sbSizer14->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer31->Add( sbSizer14, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); + + m_buttonOkay = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( 100,32 ), 0 ); + m_buttonOkay->SetDefault(); + m_buttonOkay->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer31->Add( m_buttonOkay, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + this->SetSizer( bSizer31 ); + this->Layout(); + bSizer31->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) ); + m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this ); } AboutDlgGenerated::~AboutDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) ); - m_buttonOkay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this ); - + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) ); + m_buttonOkay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this ); + } ErrorDlgGenerated::ErrorDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer24; - bSizer24 = new wxBoxSizer( wxVERTICAL ); - - - bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer26; - bSizer26 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - bSizer26->Add( m_bitmap10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY ); - m_textCtrl8->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizer26->Add( m_textCtrl8, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); - - bSizer24->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_checkBoxIgnoreErrors = new wxCheckBox( this, wxID_ANY, _("Ignore subsequent errors"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxIgnoreErrors->SetToolTip( _("Hide further error messages during the current process") ); - - bSizer24->Add( m_checkBoxIgnoreErrors, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 10 ); - - - bSizer24->Add( 0, 5, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer25; - bSizer25 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonIgnore = new wxButton( this, wxID_OK, _("&Ignore"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonIgnore->SetDefault(); - m_buttonIgnore->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer25->Add( m_buttonIgnore, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_buttonRetry = new wxButton( this, wxID_RETRY, _("&Retry"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonRetry->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer25->Add( m_buttonRetry, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_buttonAbort = new wxButton( this, wxID_CANCEL, _("&Abort"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonAbort->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer25->Add( m_buttonAbort, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - - bSizer25->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - this->SetSizer( bSizer24 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ErrorDlgGenerated::OnClose ) ); - m_buttonIgnore->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnIgnore ), NULL, this ); - m_buttonRetry->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnRetry ), NULL, this ); - m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnAbort ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer24; + bSizer24 = new wxBoxSizer( wxVERTICAL ); + + + bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer26; + bSizer26 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + bSizer26->Add( m_bitmap10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY ); + m_textCtrl8->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer26->Add( m_textCtrl8, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); + + bSizer24->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_checkBoxIgnoreErrors = new wxCheckBox( this, wxID_ANY, _("Ignore subsequent errors"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxIgnoreErrors->SetToolTip( _("Hide further error messages during the current process") ); + + bSizer24->Add( m_checkBoxIgnoreErrors, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 10 ); + + + bSizer24->Add( 0, 5, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer25; + bSizer25 = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonIgnore = new wxButton( this, wxID_OK, _("&Ignore"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonIgnore->SetDefault(); + m_buttonIgnore->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer25->Add( m_buttonIgnore, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_buttonRetry = new wxButton( this, wxID_RETRY, _("&Retry"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonRetry->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer25->Add( m_buttonRetry, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_buttonAbort = new wxButton( this, wxID_CANCEL, _("&Abort"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonAbort->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer25->Add( m_buttonAbort, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + + bSizer25->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + this->SetSizer( bSizer24 ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ErrorDlgGenerated::OnClose ) ); + m_buttonIgnore->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnIgnore ), NULL, this ); + m_buttonRetry->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnRetry ), NULL, this ); + m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnAbort ), NULL, this ); } ErrorDlgGenerated::~ErrorDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ErrorDlgGenerated::OnClose ) ); - m_buttonIgnore->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnIgnore ), NULL, this ); - m_buttonRetry->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnRetry ), NULL, this ); - m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnAbort ), NULL, this ); - + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ErrorDlgGenerated::OnClose ) ); + m_buttonIgnore->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnIgnore ), NULL, this ); + m_buttonRetry->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnRetry ), NULL, this ); + m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnAbort ), NULL, this ); + } WarningDlgGenerated::WarningDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer24; - bSizer24 = new wxBoxSizer( wxVERTICAL ); - - - bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer26; - bSizer26 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - bSizer26->Add( m_bitmap10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY ); - m_textCtrl8->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizer26->Add( m_textCtrl8, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); - - bSizer24->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("Do not show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer24->Add( m_checkBoxDontShowAgain, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 10 ); - - - bSizer24->Add( 0, 5, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer25; - bSizer25 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonIgnore = new wxButton( this, wxID_IGNORE, _("&Ignore"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonIgnore->SetDefault(); - m_buttonIgnore->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer25->Add( m_buttonIgnore, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_buttonSwitch = new wxButton( this, wxID_MORE, _("&Switch"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonSwitch->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer25->Add( m_buttonSwitch, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_buttonAbort = new wxButton( this, wxID_CANCEL, _("&Abort"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonAbort->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer25->Add( m_buttonAbort, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - - bSizer25->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - this->SetSizer( bSizer24 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( WarningDlgGenerated::OnClose ) ); - m_buttonIgnore->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnIgnore ), NULL, this ); - m_buttonSwitch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnSwitch ), NULL, this ); - m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnAbort ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer24; + bSizer24 = new wxBoxSizer( wxVERTICAL ); + + + bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer26; + bSizer26 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + bSizer26->Add( m_bitmap10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY ); + m_textCtrl8->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer26->Add( m_textCtrl8, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); + + bSizer24->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("Do not show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer24->Add( m_checkBoxDontShowAgain, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 10 ); + + + bSizer24->Add( 0, 5, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer25; + bSizer25 = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonIgnore = new wxButton( this, wxID_IGNORE, _("&Ignore"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonIgnore->SetDefault(); + m_buttonIgnore->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer25->Add( m_buttonIgnore, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_buttonSwitch = new wxButton( this, wxID_MORE, _("&Switch"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonSwitch->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer25->Add( m_buttonSwitch, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_buttonAbort = new wxButton( this, wxID_CANCEL, _("&Abort"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonAbort->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer25->Add( m_buttonAbort, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + + bSizer25->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + this->SetSizer( bSizer24 ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( WarningDlgGenerated::OnClose ) ); + m_buttonIgnore->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnIgnore ), NULL, this ); + m_buttonSwitch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnSwitch ), NULL, this ); + m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnAbort ), NULL, this ); } WarningDlgGenerated::~WarningDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( WarningDlgGenerated::OnClose ) ); - m_buttonIgnore->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnIgnore ), NULL, this ); - m_buttonSwitch->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnSwitch ), NULL, this ); - m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnAbort ), NULL, this ); - + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( WarningDlgGenerated::OnClose ) ); + m_buttonIgnore->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnIgnore ), NULL, this ); + m_buttonSwitch->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnSwitch ), NULL, this ); + m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnAbort ), NULL, this ); + } QuestionDlgGenerated::QuestionDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer24; - bSizer24 = new wxBoxSizer( wxVERTICAL ); - - - bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer26; - bSizer26 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - bSizer26->Add( m_bitmap10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY ); - m_textCtrl8->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizer26->Add( m_textCtrl8, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); - - bSizer24->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_checkBoxDontAskAgain = new wxCheckBox( this, wxID_ANY, _("Do not show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer24->Add( m_checkBoxDontAskAgain, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 10 ); - - - bSizer24->Add( 0, 5, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer25; - bSizer25 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonYes = new wxButton( this, wxID_YES, _("&Yes"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonYes->SetDefault(); - m_buttonYes->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer25->Add( m_buttonYes, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_buttonNo = new wxButton( this, wxID_NO, _("&No"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonNo->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer25->Add( m_buttonNo, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonCancel->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer25->Add( m_buttonCancel, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - - bSizer25->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - this->SetSizer( bSizer24 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( QuestionDlgGenerated::OnClose ) ); - m_buttonYes->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( QuestionDlgGenerated::OnYes ), NULL, this ); - m_buttonNo->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( QuestionDlgGenerated::OnNo ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( QuestionDlgGenerated::OnCancel ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer24; + bSizer24 = new wxBoxSizer( wxVERTICAL ); + + + bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer26; + bSizer26 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + bSizer26->Add( m_bitmap10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY ); + m_textCtrl8->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer26->Add( m_textCtrl8, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); + + bSizer24->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_checkBoxDontAskAgain = new wxCheckBox( this, wxID_ANY, _("Do not show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer24->Add( m_checkBoxDontAskAgain, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 10 ); + + + bSizer24->Add( 0, 5, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer25; + bSizer25 = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonYes = new wxButton( this, wxID_YES, _("&Yes"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonYes->SetDefault(); + m_buttonYes->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer25->Add( m_buttonYes, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_buttonNo = new wxButton( this, wxID_NO, _("&No"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonNo->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer25->Add( m_buttonNo, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonCancel->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer25->Add( m_buttonCancel, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + + bSizer25->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + this->SetSizer( bSizer24 ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( QuestionDlgGenerated::OnClose ) ); + m_checkBoxDontAskAgain->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( QuestionDlgGenerated::OnCheckBoxDontShowAgain ), NULL, this ); + m_buttonYes->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( QuestionDlgGenerated::OnYes ), NULL, this ); + m_buttonNo->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( QuestionDlgGenerated::OnNo ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( QuestionDlgGenerated::OnCancel ), NULL, this ); } QuestionDlgGenerated::~QuestionDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( QuestionDlgGenerated::OnClose ) ); - m_buttonYes->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( QuestionDlgGenerated::OnYes ), NULL, this ); - m_buttonNo->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( QuestionDlgGenerated::OnNo ), NULL, this ); - m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( QuestionDlgGenerated::OnCancel ), NULL, this ); - + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( QuestionDlgGenerated::OnClose ) ); + m_checkBoxDontAskAgain->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( QuestionDlgGenerated::OnCheckBoxDontShowAgain ), NULL, this ); + m_buttonYes->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( QuestionDlgGenerated::OnYes ), NULL, this ); + m_buttonNo->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( QuestionDlgGenerated::OnNo ), NULL, this ); + m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( QuestionDlgGenerated::OnCancel ), NULL, this ); + } DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer24; - bSizer24 = new wxBoxSizer( wxVERTICAL ); - - - bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer41; - bSizer41 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer41->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_bitmap12 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); - bSizer41->Add( m_bitmap12, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextHeader->Wrap( -1 ); - m_staticTextHeader->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer41->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer41->Add( 0, 0, 1, wxEXPAND, 5 ); - - bSizer24->Add( bSizer41, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer99; - bSizer99 = new wxBoxSizer( wxHORIZONTAL ); - - m_checkBoxDeleteBothSides = new wxCheckBox( this, wxID_ANY, _("Delete on both sides"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxDeleteBothSides->SetToolTip( _("Delete on both sides even if the file is selected on one side only") ); - - bSizer99->Add( m_checkBoxDeleteBothSides, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer99->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("Use Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxUseRecycler->SetValue(true); - bSizer99->Add( m_checkBoxUseRecycler, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer24->Add( bSizer99, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 10 ); - - m_textCtrlMessage = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY ); - m_textCtrlMessage->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - - bSizer24->Add( m_textCtrlMessage, 1, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - wxBoxSizer* bSizer25; - bSizer25 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonOK = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonOK->SetDefault(); - m_buttonOK->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); - - bSizer25->Add( m_buttonOK, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonCancel->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer25->Add( m_buttonCancel, 0, wxALL, 5 ); - - bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - this->SetSizer( bSizer24 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) ); - m_checkBoxDeleteBothSides->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnDelOnBothSides ), NULL, this ); - m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnUseRecycler ), NULL, this ); - m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer24; + bSizer24 = new wxBoxSizer( wxVERTICAL ); + + + bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer41; + bSizer41 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer41->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_bitmap12 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); + bSizer41->Add( m_bitmap12, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHeader->Wrap( -1 ); + m_staticTextHeader->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer41->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer41->Add( 0, 0, 1, wxEXPAND, 5 ); + + bSizer24->Add( bSizer41, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer99; + bSizer99 = new wxBoxSizer( wxHORIZONTAL ); + + m_checkBoxDeleteBothSides = new wxCheckBox( this, wxID_ANY, _("Delete on both sides"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxDeleteBothSides->SetToolTip( _("Delete on both sides even if the file is selected on one side only") ); + + bSizer99->Add( m_checkBoxDeleteBothSides, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer99->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("Use Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxUseRecycler->SetValue(true); + bSizer99->Add( m_checkBoxUseRecycler, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer24->Add( bSizer99, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 10 ); + + m_textCtrlMessage = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY ); + m_textCtrlMessage->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + + bSizer24->Add( m_textCtrlMessage, 1, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer25; + bSizer25 = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonOK = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonOK->SetDefault(); + m_buttonOK->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); + + bSizer25->Add( m_buttonOK, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonCancel->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer25->Add( m_buttonCancel, 0, wxALL, 5 ); + + bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + this->SetSizer( bSizer24 ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) ); + m_checkBoxDeleteBothSides->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnDelOnBothSides ), NULL, this ); + m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnUseRecycler ), NULL, this ); + m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this ); } DeleteDlgGenerated::~DeleteDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) ); - m_checkBoxDeleteBothSides->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnDelOnBothSides ), NULL, this ); - m_checkBoxUseRecycler->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnUseRecycler ), NULL, this ); - m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this ); - m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this ); - + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) ); + m_checkBoxDeleteBothSides->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnDelOnBothSides ), NULL, this ); + m_checkBoxUseRecycler->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnUseRecycler ), NULL, this ); + m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this ); + m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this ); + } FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxSize( 370,380 ), wxDefaultSize ); - - wxBoxSizer* bSizer21; - bSizer21 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer86; - bSizer86 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap26 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); - bSizer86->Add( m_bitmap26, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); - m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxVERTICAL ); - - m_staticTexHeader = new wxStaticText( m_panel8, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTexHeader->Wrap( -1 ); - m_staticTexHeader->SetFont( wxFont( 16, 70, 90, 92, false, wxEmptyString ) ); - - bSizer72->Add( m_staticTexHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - - m_panel8->SetSizer( bSizer72 ); - m_panel8->Layout(); - bSizer72->Fit( m_panel8 ); - bSizer86->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer86->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer21->Add( bSizer86, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM, 5 ); - - wxBoxSizer* bSizer70; - bSizer70 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText44 = new wxStaticText( this, wxID_ANY, _("Only files/directories that match all filter settings will be selected for synchronization.\nNote: The name filter must be specified relative(!) to main synchronization directories."), wxDefaultPosition, wxSize( 550,-1 ), wxALIGN_CENTRE ); - m_staticText44->Wrap( 550 ); - bSizer70->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonHelp = new wxBitmapButton( this, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - m_bpButtonHelp->SetToolTip( _("Help") ); - - bSizer70->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - bSizer21->Add( bSizer70, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 10 ); - - - bSizer21->Add( 0, 5, 0, 0, 5 ); - - m_panel13 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer69; - bSizer69 = new wxBoxSizer( wxVERTICAL ); - - m_staticline10 = new wxStaticLine( m_panel13, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer69->Add( m_staticline10, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); - - wxBoxSizer* bSizer52; - bSizer52 = new wxBoxSizer( wxVERTICAL ); - - m_staticText45 = new wxStaticText( m_panel13, wxID_ANY, _("Hints:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText45->Wrap( -1 ); - m_staticText45->SetFont( wxFont( 10, 70, 90, 92, true, wxEmptyString ) ); - - bSizer52->Add( m_staticText45, 0, wxBOTTOM, 5 ); - - m_staticText83 = new wxStaticText( m_panel13, wxID_ANY, _("1. Enter relative file or directory names separated by ';' or a new line."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText83->Wrap( -1 ); - bSizer52->Add( m_staticText83, 0, 0, 5 ); - - m_staticText84 = new wxStaticText( m_panel13, wxID_ANY, _("2. Use wildcard characters '*' and '?'."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText84->Wrap( -1 ); - bSizer52->Add( m_staticText84, 0, 0, 5 ); - - m_staticText85 = new wxStaticText( m_panel13, wxID_ANY, _("3. Exclude files directly on main grid via context menu."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText85->Wrap( -1 ); - bSizer52->Add( m_staticText85, 0, 0, 5 ); - - bSizer69->Add( bSizer52, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 10 ); - - wxStaticBoxSizer* sbSizer21; - sbSizer21 = new wxStaticBoxSizer( new wxStaticBox( m_panel13, wxID_ANY, _("Example") ), wxVERTICAL ); - - wxBoxSizer* bSizer66; - bSizer66 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText181 = new wxStaticText( m_panel13, wxID_ANY, _("Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText181->Wrap( -1 ); - bSizer66->Add( m_staticText181, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText1811 = new wxStaticText( m_panel13, wxID_ANY, _("Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\"."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText1811->Wrap( 250 ); - m_staticText1811->SetFont( wxFont( 8, 70, 93, 90, false, wxEmptyString ) ); - - bSizer66->Add( m_staticText1811, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - sbSizer21->Add( bSizer66, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 ); - - bSizer69->Add( sbSizer21, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_panel13->SetSizer( bSizer69 ); - m_panel13->Layout(); - bSizer69->Fit( m_panel13 ); - bSizer21->Add( m_panel13, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxEXPAND, 5 ); - - - bSizer21->Add( 0, 0, 0, 0, 5 ); - - wxBoxSizer* bSizer159; - bSizer159 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer166; - bSizer166 = new wxBoxSizer( wxVERTICAL ); - - wxStaticBoxSizer* sbSizer8; - sbSizer8 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Include") ), wxHORIZONTAL ); - - m_bitmapInclude = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); - sbSizer8->Add( m_bitmapInclude, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); - - m_textCtrlInclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE ); - sbSizer8->Add( m_textCtrlInclude, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - bSizer166->Add( sbSizer8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - wxStaticBoxSizer* sbSizer26; - sbSizer26 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Exclude") ), wxHORIZONTAL ); - - m_bitmapExclude = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); - sbSizer26->Add( m_bitmapExclude, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_textCtrlExclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE ); - sbSizer26->Add( m_textCtrlExclude, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer166->Add( sbSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - bSizer159->Add( bSizer166, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer159->Add( 5, 0, 0, 0, 5 ); - - wxBoxSizer* bSizer160; - bSizer160 = new wxBoxSizer( wxVERTICAL ); - - wxStaticBoxSizer* sbSizer25; - sbSizer25 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Date") ), wxHORIZONTAL ); - - wxBoxSizer* bSizer169; - bSizer169 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapFilterDate = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 34,34 ), 0 ); - bSizer169->Add( m_bitmapFilterDate, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - wxBoxSizer* bSizer165; - bSizer165 = new wxBoxSizer( wxVERTICAL ); - - m_staticText103 = new wxStaticText( this, wxID_ANY, _("Select time span:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText103->Wrap( -1 ); - bSizer165->Add( m_staticText103, 0, 0, 5 ); - - wxBoxSizer* bSizer164; - bSizer164 = new wxBoxSizer( wxVERTICAL ); - - m_spinCtrlTimespan = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); - bSizer164->Add( m_spinCtrlTimespan, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxArrayString m_choiceUnitTimespanChoices; - m_choiceUnitTimespan = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitTimespanChoices, 0 ); - m_choiceUnitTimespan->SetSelection( 0 ); - bSizer164->Add( m_choiceUnitTimespan, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer165->Add( bSizer164, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP, 5 ); - - bSizer169->Add( bSizer165, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer25->Add( bSizer169, 0, 0, 5 ); - - bSizer160->Add( sbSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - wxStaticBoxSizer* sbSizer81; - sbSizer81 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Size") ), wxHORIZONTAL ); - - wxBoxSizer* bSizer170; - bSizer170 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapFilterSize = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), 0 ); - bSizer170->Add( m_bitmapFilterSize, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); - - wxBoxSizer* bSizer158; - bSizer158 = new wxBoxSizer( wxVERTICAL ); - - m_staticText101 = new wxStaticText( this, wxID_ANY, _("Minimum file size:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText101->Wrap( -1 ); - bSizer158->Add( m_staticText101, 0, 0, 5 ); - - wxBoxSizer* bSizer162; - bSizer162 = new wxBoxSizer( wxVERTICAL ); - - m_spinCtrlMinSize = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); - bSizer162->Add( m_spinCtrlMinSize, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxArrayString m_choiceUnitMinSizeChoices; - m_choiceUnitMinSize = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMinSizeChoices, 0 ); - m_choiceUnitMinSize->SetSelection( 0 ); - bSizer162->Add( m_choiceUnitMinSize, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer158->Add( bSizer162, 0, wxBOTTOM, 5 ); - - m_staticText102 = new wxStaticText( this, wxID_ANY, _("Maximum file size:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText102->Wrap( -1 ); - bSizer158->Add( m_staticText102, 0, 0, 5 ); - - wxBoxSizer* bSizer163; - bSizer163 = new wxBoxSizer( wxVERTICAL ); - - m_spinCtrlMaxSize = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); - bSizer163->Add( m_spinCtrlMaxSize, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxArrayString m_choiceUnitMaxSizeChoices; - m_choiceUnitMaxSize = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMaxSizeChoices, 0 ); - m_choiceUnitMaxSize->SetSelection( 0 ); - bSizer163->Add( m_choiceUnitMaxSize, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer158->Add( bSizer163, 0, wxTOP, 5 ); - - bSizer170->Add( bSizer158, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer81->Add( bSizer170, 0, 0, 5 ); - - bSizer160->Add( sbSizer81, 1, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer159->Add( bSizer160, 0, wxEXPAND, 5 ); - - bSizer21->Add( bSizer159, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); - - wxBoxSizer* bSizer22; - bSizer22 = new wxBoxSizer( wxHORIZONTAL ); - - m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button9->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer22->Add( m_button9, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer22->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_button10 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button10->SetDefault(); - m_button10->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); - - bSizer22->Add( m_button10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_button17 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button17->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer22->Add( m_button17, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - bSizer21->Add( bSizer22, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM|wxEXPAND, 5 ); - - this->SetSizer( bSizer21 ); - this->Layout(); - bSizer21->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) ); - m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this ); - m_textCtrlInclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); - m_textCtrlExclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); - m_choiceUnitTimespan->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); - m_choiceUnitMinSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); - m_choiceUnitMaxSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); - m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnDefault ), NULL, this ); - m_button10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnApply ), NULL, this ); - m_button17->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this ); + this->SetSizeHints( wxSize( 370,380 ), wxDefaultSize ); + + wxBoxSizer* bSizer21; + bSizer21 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer86; + bSizer86 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap26 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); + bSizer86->Add( m_bitmap26, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); + m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); + + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxVERTICAL ); + + m_staticTexHeader = new wxStaticText( m_panel8, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTexHeader->Wrap( -1 ); + m_staticTexHeader->SetFont( wxFont( 16, 70, 90, 92, false, wxEmptyString ) ); + + bSizer72->Add( m_staticTexHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + m_panel8->SetSizer( bSizer72 ); + m_panel8->Layout(); + bSizer72->Fit( m_panel8 ); + bSizer86->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer86->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer21->Add( bSizer86, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM, 5 ); + + wxBoxSizer* bSizer70; + bSizer70 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText44 = new wxStaticText( this, wxID_ANY, _("Only files/directories that match all filter settings will be selected for synchronization.\nNote: The name filter must be specified relative(!) to main synchronization directories."), wxDefaultPosition, wxSize( 550,-1 ), wxALIGN_CENTRE ); + m_staticText44->Wrap( 550 ); + bSizer70->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonHelp = new wxBitmapButton( this, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButtonHelp->SetToolTip( _("Help") ); + + bSizer70->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + bSizer21->Add( bSizer70, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 10 ); + + + bSizer21->Add( 0, 5, 0, 0, 5 ); + + m_panel13 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer69; + bSizer69 = new wxBoxSizer( wxVERTICAL ); + + m_staticline10 = new wxStaticLine( m_panel13, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer69->Add( m_staticline10, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); + + wxBoxSizer* bSizer52; + bSizer52 = new wxBoxSizer( wxVERTICAL ); + + m_staticText45 = new wxStaticText( m_panel13, wxID_ANY, _("Hints:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText45->Wrap( -1 ); + m_staticText45->SetFont( wxFont( 10, 70, 90, 92, true, wxEmptyString ) ); + + bSizer52->Add( m_staticText45, 0, wxBOTTOM, 5 ); + + m_staticText83 = new wxStaticText( m_panel13, wxID_ANY, _("1. Enter relative file or directory names separated by ';' or a new line."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText83->Wrap( -1 ); + bSizer52->Add( m_staticText83, 0, 0, 5 ); + + m_staticText84 = new wxStaticText( m_panel13, wxID_ANY, _("2. Use wildcard characters '*' and '?'."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText84->Wrap( -1 ); + bSizer52->Add( m_staticText84, 0, 0, 5 ); + + m_staticText85 = new wxStaticText( m_panel13, wxID_ANY, _("3. Exclude files directly on main grid via context menu."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText85->Wrap( -1 ); + bSizer52->Add( m_staticText85, 0, 0, 5 ); + + bSizer69->Add( bSizer52, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 10 ); + + wxStaticBoxSizer* sbSizer21; + sbSizer21 = new wxStaticBoxSizer( new wxStaticBox( m_panel13, wxID_ANY, _("Example") ), wxVERTICAL ); + + wxBoxSizer* bSizer66; + bSizer66 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText181 = new wxStaticText( m_panel13, wxID_ANY, _("Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText181->Wrap( -1 ); + bSizer66->Add( m_staticText181, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText1811 = new wxStaticText( m_panel13, wxID_ANY, _("Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\"."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText1811->Wrap( 250 ); + m_staticText1811->SetFont( wxFont( 8, 70, 93, 90, false, wxEmptyString ) ); + + bSizer66->Add( m_staticText1811, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + sbSizer21->Add( bSizer66, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 ); + + bSizer69->Add( sbSizer21, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_panel13->SetSizer( bSizer69 ); + m_panel13->Layout(); + bSizer69->Fit( m_panel13 ); + bSizer21->Add( m_panel13, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxEXPAND, 5 ); + + + bSizer21->Add( 0, 0, 0, 0, 5 ); + + wxBoxSizer* bSizer159; + bSizer159 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer166; + bSizer166 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* sbSizer8; + sbSizer8 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Include") ), wxHORIZONTAL ); + + m_bitmapInclude = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); + sbSizer8->Add( m_bitmapInclude, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); + + m_textCtrlInclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE ); + sbSizer8->Add( m_textCtrlInclude, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + bSizer166->Add( sbSizer8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + wxStaticBoxSizer* sbSizer26; + sbSizer26 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Exclude") ), wxHORIZONTAL ); + + m_bitmapExclude = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); + sbSizer26->Add( m_bitmapExclude, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_textCtrlExclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE ); + sbSizer26->Add( m_textCtrlExclude, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer166->Add( sbSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + bSizer159->Add( bSizer166, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizer159->Add( 5, 0, 0, 0, 5 ); + + wxBoxSizer* bSizer160; + bSizer160 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* sbSizer25; + sbSizer25 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Date") ), wxHORIZONTAL ); + + wxBoxSizer* bSizer169; + bSizer169 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapFilterDate = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 34,34 ), 0 ); + bSizer169->Add( m_bitmapFilterDate, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + wxBoxSizer* bSizer165; + bSizer165 = new wxBoxSizer( wxVERTICAL ); + + m_staticText103 = new wxStaticText( this, wxID_ANY, _("Select time span"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText103->Wrap( -1 ); + bSizer165->Add( m_staticText103, 0, 0, 5 ); + + wxBoxSizer* bSizer164; + bSizer164 = new wxBoxSizer( wxVERTICAL ); + + wxArrayString m_choiceUnitTimespanChoices; + m_choiceUnitTimespan = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitTimespanChoices, 0 ); + m_choiceUnitTimespan->SetSelection( 0 ); + bSizer164->Add( m_choiceUnitTimespan, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_spinCtrlTimespan = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); + m_spinCtrlTimespan->Hide(); + + bSizer164->Add( m_spinCtrlTimespan, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer165->Add( bSizer164, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer169->Add( bSizer165, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer25->Add( bSizer169, 0, 0, 5 ); + + bSizer160->Add( sbSizer25, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + wxStaticBoxSizer* sbSizer81; + sbSizer81 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Size") ), wxHORIZONTAL ); + + wxBoxSizer* bSizer170; + bSizer170 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapFilterSize = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), 0 ); + bSizer170->Add( m_bitmapFilterSize, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); + + wxBoxSizer* bSizer158; + bSizer158 = new wxBoxSizer( wxVERTICAL ); + + m_staticText101 = new wxStaticText( this, wxID_ANY, _("Minimum file size"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText101->Wrap( -1 ); + bSizer158->Add( m_staticText101, 0, 0, 5 ); + + wxBoxSizer* bSizer162; + bSizer162 = new wxBoxSizer( wxVERTICAL ); + + m_spinCtrlMinSize = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); + bSizer162->Add( m_spinCtrlMinSize, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxArrayString m_choiceUnitMinSizeChoices; + m_choiceUnitMinSize = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMinSizeChoices, 0 ); + m_choiceUnitMinSize->SetSelection( 0 ); + bSizer162->Add( m_choiceUnitMinSize, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer158->Add( bSizer162, 0, wxBOTTOM, 5 ); + + m_staticText102 = new wxStaticText( this, wxID_ANY, _("Maximum file size"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText102->Wrap( -1 ); + bSizer158->Add( m_staticText102, 0, 0, 5 ); + + wxBoxSizer* bSizer163; + bSizer163 = new wxBoxSizer( wxVERTICAL ); + + m_spinCtrlMaxSize = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); + bSizer163->Add( m_spinCtrlMaxSize, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxArrayString m_choiceUnitMaxSizeChoices; + m_choiceUnitMaxSize = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMaxSizeChoices, 0 ); + m_choiceUnitMaxSize->SetSelection( 0 ); + bSizer163->Add( m_choiceUnitMaxSize, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer158->Add( bSizer163, 0, wxTOP, 5 ); + + bSizer170->Add( bSizer158, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer81->Add( bSizer170, 0, 0, 5 ); + + bSizer160->Add( sbSizer81, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + bSizer159->Add( bSizer160, 0, wxEXPAND, 5 ); + + bSizer21->Add( bSizer159, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); + + wxBoxSizer* bSizer22; + bSizer22 = new wxBoxSizer( wxHORIZONTAL ); + + m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button9->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer22->Add( m_button9, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer22->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_button10 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button10->SetDefault(); + m_button10->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); + + bSizer22->Add( m_button10, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_button17 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button17->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer22->Add( m_button17, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + bSizer21->Add( bSizer22, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM|wxEXPAND, 5 ); + + this->SetSizer( bSizer21 ); + this->Layout(); + bSizer21->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) ); + m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this ); + m_textCtrlInclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); + m_textCtrlExclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); + m_choiceUnitTimespan->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); + m_choiceUnitMinSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); + m_choiceUnitMaxSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); + m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnDefault ), NULL, this ); + m_button10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnApply ), NULL, this ); + m_button17->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this ); } FilterDlgGenerated::~FilterDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) ); - m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this ); - m_textCtrlInclude->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); - m_textCtrlExclude->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); - m_choiceUnitTimespan->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); - m_choiceUnitMinSize->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); - m_choiceUnitMaxSize->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); - m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnDefault ), NULL, this ); - m_button10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnApply ), NULL, this ); - m_button17->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this ); - + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) ); + m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this ); + m_textCtrlInclude->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); + m_textCtrlExclude->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); + m_choiceUnitTimespan->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); + m_choiceUnitMinSize->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); + m_choiceUnitMaxSize->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); + m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnDefault ), NULL, this ); + m_button10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnApply ), NULL, this ); + m_button17->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this ); + } CustomizeColsDlgGenerated::CustomizeColsDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer96; - bSizer96 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer99; - bSizer99 = new wxBoxSizer( wxHORIZONTAL ); - - wxArrayString m_checkListColumnsChoices; - m_checkListColumns = new wxCheckListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_checkListColumnsChoices, 0 ); - bSizer99->Add( m_checkListColumns, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer98; - bSizer98 = new wxBoxSizer( wxVERTICAL ); - - m_bpButton29 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - m_bpButton29->SetToolTip( _("Move column up") ); - - bSizer98->Add( m_bpButton29, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_bpButton30 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - m_bpButton30->SetToolTip( _("Move column down") ); - - bSizer98->Add( m_bpButton30, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - bSizer99->Add( bSizer98, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer96->Add( bSizer99, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - wxBoxSizer* bSizer97; - bSizer97 = new wxBoxSizer( wxHORIZONTAL ); - - m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button9->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer97->Add( m_button9, 0, wxALL, 5 ); - - - bSizer97->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_button28 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button28->SetDefault(); - m_button28->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); - - bSizer97->Add( m_button28, 0, wxALL, 5 ); - - m_button29 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button29->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer97->Add( m_button29, 0, wxALL, 5 ); - - bSizer96->Add( bSizer97, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - - this->SetSizer( bSizer96 ); - this->Layout(); - bSizer96->Fit( this ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CustomizeColsDlgGenerated::OnClose ) ); - m_bpButton29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveUp ), NULL, this ); - m_bpButton30->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveDown ), NULL, this ); - m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnDefault ), NULL, this ); - m_button28->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnOkay ), NULL, this ); - m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnCancel ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer96; + bSizer96 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer99; + bSizer99 = new wxBoxSizer( wxHORIZONTAL ); + + wxArrayString m_checkListColumnsChoices; + m_checkListColumns = new wxCheckListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_checkListColumnsChoices, 0 ); + bSizer99->Add( m_checkListColumns, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer98; + bSizer98 = new wxBoxSizer( wxVERTICAL ); + + m_bpButton29 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButton29->SetToolTip( _("Move column up") ); + + bSizer98->Add( m_bpButton29, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_bpButton30 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButton30->SetToolTip( _("Move column down") ); + + bSizer98->Add( m_bpButton30, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + bSizer99->Add( bSizer98, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer96->Add( bSizer99, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxBoxSizer* bSizer97; + bSizer97 = new wxBoxSizer( wxHORIZONTAL ); + + m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button9->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer97->Add( m_button9, 0, wxALL, 5 ); + + + bSizer97->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_button28 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button28->SetDefault(); + m_button28->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); + + bSizer97->Add( m_button28, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_button29 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button29->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer97->Add( m_button29, 0, wxALL, 5 ); + + bSizer96->Add( bSizer97, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + this->SetSizer( bSizer96 ); + this->Layout(); + bSizer96->Fit( this ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CustomizeColsDlgGenerated::OnClose ) ); + m_bpButton29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveUp ), NULL, this ); + m_bpButton30->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveDown ), NULL, this ); + m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnDefault ), NULL, this ); + m_button28->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnOkay ), NULL, this ); + m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnCancel ), NULL, this ); } CustomizeColsDlgGenerated::~CustomizeColsDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CustomizeColsDlgGenerated::OnClose ) ); - m_bpButton29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveUp ), NULL, this ); - m_bpButton30->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveDown ), NULL, this ); - m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnDefault ), NULL, this ); - m_button28->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnOkay ), NULL, this ); - m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnCancel ), NULL, this ); - + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CustomizeColsDlgGenerated::OnClose ) ); + m_bpButton29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveUp ), NULL, this ); + m_bpButton30->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveDown ), NULL, this ); + m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnDefault ), NULL, this ); + m_button28->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnOkay ), NULL, this ); + m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnCancel ), NULL, this ); + } GlobalSettingsDlgGenerated::GlobalSettingsDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxSize( 280,230 ), wxDefaultSize ); - - wxBoxSizer* bSizer95; - bSizer95 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer86; - bSizer86 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapSettings = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); - bSizer86->Add( m_bitmapSettings, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - - bSizer86->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); - m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxVERTICAL ); - - m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Global settings"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText56->Wrap( -1 ); - m_staticText56->SetFont( wxFont( 16, 70, 90, 92, false, wxEmptyString ) ); - - bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - - m_panel8->SetSizer( bSizer72 ); - m_panel8->Layout(); - bSizer72->Fit( m_panel8 ); - bSizer86->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - bSizer95->Add( bSizer86, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer95->Add( 0, 10, 0, 0, 5 ); - - wxStaticBoxSizer* sbSizer23; - sbSizer23 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); - - m_checkBoxTransCopy = new wxCheckBox( this, wxID_ANY, _("Transactional File Copy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxTransCopy->SetToolTip( _("Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.") ); - - sbSizer23->Add( m_checkBoxTransCopy, 0, wxALL|wxEXPAND, 5 ); - - m_checkBoxCopyLocked = new wxCheckBox( this, wxID_ANY, _("Copy locked files"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxCopyLocked->SetToolTip( _("Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)") ); - - sbSizer23->Add( m_checkBoxCopyLocked, 0, wxALL|wxEXPAND, 5 ); - - m_checkBoxCopyPermissions = new wxCheckBox( this, wxID_ANY, _("Copy filesystem permissions"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxCopyPermissions->SetToolTip( _("Transfer file and directory permissions\n(Requires Administrator rights)") ); - - sbSizer23->Add( m_checkBoxCopyPermissions, 0, wxALL|wxEXPAND, 5 ); - - m_staticline10 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - sbSizer23->Add( m_staticline10, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 5 ); - - wxBoxSizer* bSizer101; - bSizer101 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText100 = new wxStaticText( this, wxID_ANY, _("Hidden dialogs:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText100->Wrap( -1 ); - bSizer101->Add( m_staticText100, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer101->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_buttonResetDialogs = new wxButtonWithImage( this, wxID_ANY, _("Reset"), wxDefaultPosition, wxSize( 80,-1 ), 0 ); - m_buttonResetDialogs->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - m_buttonResetDialogs->SetToolTip( _("Show hidden dialogs") ); - - bSizer101->Add( m_buttonResetDialogs, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer23->Add( bSizer101, 0, wxEXPAND, 5 ); - - bSizer95->Add( sbSizer23, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - - - bSizer95->Add( 0, 10, 0, 0, 5 ); - - wxStaticBoxSizer* sbSizer26; - sbSizer26 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("External applications") ), wxHORIZONTAL ); - - - sbSizer26->Add( 5, 0, 0, 0, 5 ); - - m_gridCustomCommand = new wxGrid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - - // Grid - m_gridCustomCommand->CreateGrid( 5, 2 ); - m_gridCustomCommand->EnableEditing( true ); - m_gridCustomCommand->EnableGridLines( true ); - m_gridCustomCommand->EnableDragGridSize( false ); - m_gridCustomCommand->SetMargins( 0, 0 ); - - // Columns - m_gridCustomCommand->SetColSize( 0, 129 ); - m_gridCustomCommand->SetColSize( 1, 179 ); - m_gridCustomCommand->EnableDragColMove( false ); - m_gridCustomCommand->EnableDragColSize( true ); - m_gridCustomCommand->SetColLabelSize( 20 ); - 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( 0 ); - m_gridCustomCommand->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); - - // Label Appearance - - // Cell Defaults - m_gridCustomCommand->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP ); - sbSizer26->Add( m_gridCustomCommand, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - wxBoxSizer* bSizer157; - bSizer157 = new wxBoxSizer( wxVERTICAL ); - - m_bpButtonAddRow = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); - bSizer157->Add( m_bpButtonAddRow, 0, 0, 5 ); - - m_bpButtonRemoveRow = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); - bSizer157->Add( m_bpButtonRemoveRow, 0, 0, 5 ); - - sbSizer26->Add( bSizer157, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - - sbSizer26->Add( 5, 0, 0, 0, 5 ); - - bSizer95->Add( sbSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - - wxBoxSizer* bSizer97; - bSizer97 = new wxBoxSizer( wxHORIZONTAL ); - - m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button9->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer97->Add( m_button9, 0, wxALL, 5 ); - - - bSizer97->Add( 0, 0, 1, 0, 5 ); - - m_buttonOkay = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonOkay->SetDefault(); - m_buttonOkay->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); - - bSizer97->Add( m_buttonOkay, 0, wxALL, 5 ); - - m_button29 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button29->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer97->Add( m_button29, 0, wxALL, 5 ); - - bSizer95->Add( bSizer97, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - this->SetSizer( bSizer95 ); - this->Layout(); - bSizer95->Fit( this ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GlobalSettingsDlgGenerated::OnClose ) ); - m_buttonResetDialogs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnResetDialogs ), NULL, this ); - m_bpButtonAddRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnAddRow ), NULL, this ); - m_bpButtonRemoveRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnRemoveRow ), NULL, this ); - m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this ); - m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); - m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this ); + this->SetSizeHints( wxSize( 280,230 ), wxDefaultSize ); + + wxBoxSizer* bSizer95; + bSizer95 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer86; + bSizer86 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapSettings = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); + bSizer86->Add( m_bitmapSettings, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + + bSizer86->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); + m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); + + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxVERTICAL ); + + m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Global settings"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText56->Wrap( -1 ); + m_staticText56->SetFont( wxFont( 16, 70, 90, 92, false, wxEmptyString ) ); + + bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + m_panel8->SetSizer( bSizer72 ); + m_panel8->Layout(); + bSizer72->Fit( m_panel8 ); + bSizer86->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + bSizer95->Add( bSizer86, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer95->Add( 0, 10, 0, 0, 5 ); + + wxStaticBoxSizer* sbSizer23; + sbSizer23 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); + + m_checkBoxTransCopy = new wxCheckBox( this, wxID_ANY, _("Transactional file copy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxTransCopy->SetToolTip( _("Write files to a temporary (*.ffs_tmp) first and rename them. This guarantees a consistent state even in situations of fatal error.") ); + + sbSizer23->Add( m_checkBoxTransCopy, 0, wxALL|wxEXPAND, 5 ); + + m_checkBoxCopyLocked = new wxCheckBox( this, wxID_ANY, _("Copy locked files"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxCopyLocked->SetToolTip( _("Copy shared or locked files using Volume Shadow Copy Service\n(Requires Administrator rights)") ); + + sbSizer23->Add( m_checkBoxCopyLocked, 0, wxALL|wxEXPAND, 5 ); + + m_checkBoxCopyPermissions = new wxCheckBox( this, wxID_ANY, _("Copy file access permissions"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxCopyPermissions->SetToolTip( _("Transfer file and directory permissions\n(Requires Administrator rights)") ); + + sbSizer23->Add( m_checkBoxCopyPermissions, 0, wxALL|wxEXPAND, 5 ); + + m_staticline10 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + sbSizer23->Add( m_staticline10, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 5 ); + + wxBoxSizer* bSizer101; + bSizer101 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText100 = new wxStaticText( this, wxID_ANY, _("Hidden dialogs:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText100->Wrap( -1 ); + bSizer101->Add( m_staticText100, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer101->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_buttonResetDialogs = new wxButtonWithImage( this, wxID_ANY, _("Reset"), wxDefaultPosition, wxSize( 80,-1 ), 0 ); + m_buttonResetDialogs->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + m_buttonResetDialogs->SetToolTip( _("Show hidden dialogs") ); + + bSizer101->Add( m_buttonResetDialogs, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer23->Add( bSizer101, 0, wxEXPAND, 5 ); + + bSizer95->Add( sbSizer23, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizer95->Add( 0, 10, 0, 0, 5 ); + + wxStaticBoxSizer* sbSizer26; + sbSizer26 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("External applications") ), wxHORIZONTAL ); + + + sbSizer26->Add( 5, 0, 0, 0, 5 ); + + m_gridCustomCommand = new wxGrid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + + // Grid + m_gridCustomCommand->CreateGrid( 5, 2 ); + m_gridCustomCommand->EnableEditing( true ); + m_gridCustomCommand->EnableGridLines( true ); + m_gridCustomCommand->EnableDragGridSize( false ); + m_gridCustomCommand->SetMargins( 0, 0 ); + + // Columns + m_gridCustomCommand->SetColSize( 0, 129 ); + m_gridCustomCommand->SetColSize( 1, 179 ); + m_gridCustomCommand->EnableDragColMove( false ); + m_gridCustomCommand->EnableDragColSize( true ); + m_gridCustomCommand->SetColLabelSize( 20 ); + 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( 0 ); + m_gridCustomCommand->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Label Appearance + + // Cell Defaults + m_gridCustomCommand->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP ); + sbSizer26->Add( m_gridCustomCommand, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer157; + bSizer157 = new wxBoxSizer( wxVERTICAL ); + + m_bpButtonAddRow = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); + bSizer157->Add( m_bpButtonAddRow, 0, 0, 5 ); + + m_bpButtonRemoveRow = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); + bSizer157->Add( m_bpButtonRemoveRow, 0, 0, 5 ); + + sbSizer26->Add( bSizer157, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + + sbSizer26->Add( 5, 0, 0, 0, 5 ); + + bSizer95->Add( sbSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + wxBoxSizer* bSizer97; + bSizer97 = new wxBoxSizer( wxHORIZONTAL ); + + m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button9->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer97->Add( m_button9, 0, wxALL, 5 ); + + + bSizer97->Add( 0, 0, 1, 0, 5 ); + + m_buttonOkay = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonOkay->SetDefault(); + m_buttonOkay->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); + + bSizer97->Add( m_buttonOkay, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_button29 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button29->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer97->Add( m_button29, 0, wxALL, 5 ); + + bSizer95->Add( bSizer97, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + this->SetSizer( bSizer95 ); + this->Layout(); + bSizer95->Fit( this ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GlobalSettingsDlgGenerated::OnClose ) ); + m_buttonResetDialogs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnResetDialogs ), NULL, this ); + m_bpButtonAddRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnAddRow ), NULL, this ); + m_bpButtonRemoveRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnRemoveRow ), NULL, this ); + m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this ); + m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); + m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this ); } GlobalSettingsDlgGenerated::~GlobalSettingsDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GlobalSettingsDlgGenerated::OnClose ) ); - m_buttonResetDialogs->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnResetDialogs ), NULL, this ); - m_bpButtonAddRow->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnAddRow ), NULL, this ); - m_bpButtonRemoveRow->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnRemoveRow ), NULL, this ); - m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this ); - m_buttonOkay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); - m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this ); - + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GlobalSettingsDlgGenerated::OnClose ) ); + m_buttonResetDialogs->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnResetDialogs ), NULL, this ); + m_bpButtonAddRow->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnAddRow ), NULL, this ); + m_bpButtonRemoveRow->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnRemoveRow ), NULL, this ); + m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this ); + m_buttonOkay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); + m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this ); + } SyncPreviewDlgGenerated::SyncPreviewDlgGenerated( 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* bSizer134; - bSizer134 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer158; - bSizer158 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonStartSync = new wxButtonWithImage( this, wxID_ANY, _("Start"), wxDefaultPosition, wxSize( -1,40 ), 0 ); - m_buttonStartSync->SetDefault(); - m_buttonStartSync->SetFont( wxFont( 14, 70, 90, 92, false, wxT("Arial Black") ) ); - m_buttonStartSync->SetToolTip( _("Start synchronization") ); - - bSizer158->Add( m_buttonStartSync, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticline16 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer158->Add( m_staticline16, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); - - wxStaticBoxSizer* sbSizer28; - sbSizer28 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Variant") ), wxVERTICAL ); - - m_staticTextVariant = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextVariant->Wrap( -1 ); - m_staticTextVariant->SetFont( wxFont( 10, 70, 90, 92, false, wxT("Arial Black") ) ); - - sbSizer28->Add( m_staticTextVariant, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer158->Add( sbSizer28, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - bSizer134->Add( bSizer158, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_staticline14 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer134->Add( m_staticline14, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer141; - bSizer141 = new wxBoxSizer( wxHORIZONTAL ); - - wxStaticBoxSizer* sbSizer161; - sbSizer161 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Statistics") ), wxVERTICAL ); - - wxBoxSizer* bSizer157; - bSizer157 = new wxBoxSizer( wxHORIZONTAL ); - - wxFlexGridSizer* fgSizer5; - fgSizer5 = new wxFlexGridSizer( 4, 2, 0, 5 ); - fgSizer5->SetFlexibleDirection( wxHORIZONTAL ); - fgSizer5->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - - fgSizer5->Add( 0, 0, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_staticText94 = new wxStaticText( this, wxID_ANY, _("Left"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText94->Wrap( -1 ); - m_staticText94->SetFont( wxFont( 9, 70, 90, 92, false, wxEmptyString ) ); - - fgSizer5->Add( m_staticText94, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmapCreate = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapCreate->SetToolTip( _("Number of files and directories that will be created") ); - - fgSizer5->Add( m_bitmapCreate, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_textCtrlCreateL = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); - m_textCtrlCreateL->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); - m_textCtrlCreateL->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - m_textCtrlCreateL->SetToolTip( _("Number of files and directories that will be created") ); - - fgSizer5->Add( m_textCtrlCreateL, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmapUpdate = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapUpdate->SetToolTip( _("Number of files that will be overwritten") ); - - fgSizer5->Add( m_bitmapUpdate, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_textCtrlUpdateL = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); - m_textCtrlUpdateL->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); - m_textCtrlUpdateL->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - m_textCtrlUpdateL->SetToolTip( _("Number of files that will be overwritten") ); - - fgSizer5->Add( m_textCtrlUpdateL, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmapDelete = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapDelete->SetToolTip( _("Number of files and directories that will be deleted") ); - - fgSizer5->Add( m_bitmapDelete, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlDeleteL = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); - m_textCtrlDeleteL->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); - m_textCtrlDeleteL->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - m_textCtrlDeleteL->SetToolTip( _("Number of files and directories that will be deleted") ); - - fgSizer5->Add( m_textCtrlDeleteL, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer157->Add( fgSizer5, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - wxFlexGridSizer* fgSizer51; - fgSizer51 = new wxFlexGridSizer( 3, 1, 0, 5 ); - fgSizer51->SetFlexibleDirection( wxHORIZONTAL ); - fgSizer51->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_staticText95 = new wxStaticText( this, wxID_ANY, _("Right"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText95->Wrap( -1 ); - m_staticText95->SetFont( wxFont( 9, 70, 90, 92, false, wxEmptyString ) ); - - fgSizer51->Add( m_staticText95, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlCreateR = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); - m_textCtrlCreateR->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); - m_textCtrlCreateR->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - m_textCtrlCreateR->SetToolTip( _("Number of files and directories that will be created") ); - - fgSizer51->Add( m_textCtrlCreateR, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlUpdateR = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); - m_textCtrlUpdateR->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); - m_textCtrlUpdateR->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - m_textCtrlUpdateR->SetToolTip( _("Number of files that will be overwritten") ); - - fgSizer51->Add( m_textCtrlUpdateR, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlDeleteR = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); - m_textCtrlDeleteR->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); - m_textCtrlDeleteR->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - m_textCtrlDeleteR->SetToolTip( _("Number of files and directories that will be deleted") ); - - fgSizer51->Add( m_textCtrlDeleteR, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer157->Add( fgSizer51, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer161->Add( bSizer157, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - sbSizer161->Add( 0, 10, 0, 0, 5 ); - - wxBoxSizer* bSizer156; - bSizer156 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapData = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapData->SetToolTip( _("Total amount of data that will be transferred") ); - - bSizer156->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); - - - bSizer156->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_textCtrlData = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_CENTRE|wxTE_READONLY ); - m_textCtrlData->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); - m_textCtrlData->SetBackgroundColour( wxColour( 208, 208, 208 ) ); - m_textCtrlData->SetToolTip( _("Total amount of data that will be transferred") ); - - bSizer156->Add( m_textCtrlData, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer156->Add( 0, 0, 1, wxEXPAND, 5 ); - - sbSizer161->Add( bSizer156, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - - bSizer141->Add( sbSizer161, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - - bSizer134->Add( bSizer141, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer134->Add( m_staticline12, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); - - wxBoxSizer* bSizer142; - bSizer142 = new wxBoxSizer( wxHORIZONTAL ); - - m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("Do not show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer142->Add( m_checkBoxDontShowAgain, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer142->Add( 10, 0, 1, 0, 5 ); - - m_button16 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button16->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer142->Add( m_button16, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer134->Add( bSizer142, 0, wxEXPAND, 5 ); - - this->SetSizer( bSizer134 ); - this->Layout(); - bSizer134->Fit( this ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncPreviewDlgGenerated::OnClose ) ); - m_buttonStartSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncPreviewDlgGenerated::OnStartSync ), NULL, this ); - m_button16->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncPreviewDlgGenerated::OnCancel ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer134; + bSizer134 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer158; + bSizer158 = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonStartSync = new wxButtonWithImage( this, wxID_ANY, _("Start"), wxDefaultPosition, wxSize( -1,40 ), 0 ); + m_buttonStartSync->SetDefault(); + m_buttonStartSync->SetFont( wxFont( 14, 70, 90, 92, false, wxT("Arial Black") ) ); + m_buttonStartSync->SetToolTip( _("Start synchronization") ); + + bSizer158->Add( m_buttonStartSync, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticline16 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer158->Add( m_staticline16, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); + + wxStaticBoxSizer* sbSizer28; + sbSizer28 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Variant") ), wxVERTICAL ); + + m_staticTextVariant = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextVariant->Wrap( -1 ); + m_staticTextVariant->SetFont( wxFont( 10, 70, 90, 92, false, wxT("Arial Black") ) ); + + sbSizer28->Add( m_staticTextVariant, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer158->Add( sbSizer28, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + bSizer134->Add( bSizer158, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_staticline14 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer134->Add( m_staticline14, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer141; + bSizer141 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBoxSizer* sbSizer161; + sbSizer161 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Statistics") ), wxVERTICAL ); + + wxBoxSizer* bSizer157; + bSizer157 = new wxBoxSizer( wxHORIZONTAL ); + + wxFlexGridSizer* fgSizer5; + fgSizer5 = new wxFlexGridSizer( 4, 2, 0, 5 ); + fgSizer5->SetFlexibleDirection( wxHORIZONTAL ); + fgSizer5->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + + fgSizer5->Add( 0, 0, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_staticText94 = new wxStaticText( this, wxID_ANY, _("Left"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText94->Wrap( -1 ); + m_staticText94->SetFont( wxFont( 9, 70, 90, 92, false, wxEmptyString ) ); + + fgSizer5->Add( m_staticText94, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmapCreate = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapCreate->SetToolTip( _("Number of files and directories that will be created") ); + + fgSizer5->Add( m_bitmapCreate, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_textCtrlCreateL = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); + m_textCtrlCreateL->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); + m_textCtrlCreateL->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + m_textCtrlCreateL->SetToolTip( _("Number of files and directories that will be created") ); + + fgSizer5->Add( m_textCtrlCreateL, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmapUpdate = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapUpdate->SetToolTip( _("Number of files that will be overwritten") ); + + fgSizer5->Add( m_bitmapUpdate, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_textCtrlUpdateL = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); + m_textCtrlUpdateL->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); + m_textCtrlUpdateL->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + m_textCtrlUpdateL->SetToolTip( _("Number of files that will be overwritten") ); + + fgSizer5->Add( m_textCtrlUpdateL, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmapDelete = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapDelete->SetToolTip( _("Number of files and directories that will be deleted") ); + + fgSizer5->Add( m_bitmapDelete, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlDeleteL = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); + m_textCtrlDeleteL->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); + m_textCtrlDeleteL->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + m_textCtrlDeleteL->SetToolTip( _("Number of files and directories that will be deleted") ); + + fgSizer5->Add( m_textCtrlDeleteL, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer157->Add( fgSizer5, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + wxFlexGridSizer* fgSizer51; + fgSizer51 = new wxFlexGridSizer( 3, 1, 0, 5 ); + fgSizer51->SetFlexibleDirection( wxHORIZONTAL ); + fgSizer51->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_staticText95 = new wxStaticText( this, wxID_ANY, _("Right"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText95->Wrap( -1 ); + m_staticText95->SetFont( wxFont( 9, 70, 90, 92, false, wxEmptyString ) ); + + fgSizer51->Add( m_staticText95, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlCreateR = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); + m_textCtrlCreateR->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); + m_textCtrlCreateR->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + m_textCtrlCreateR->SetToolTip( _("Number of files and directories that will be created") ); + + fgSizer51->Add( m_textCtrlCreateR, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlUpdateR = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); + m_textCtrlUpdateR->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); + m_textCtrlUpdateR->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + m_textCtrlUpdateR->SetToolTip( _("Number of files that will be overwritten") ); + + fgSizer51->Add( m_textCtrlUpdateR, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlDeleteR = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT ); + m_textCtrlDeleteR->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); + m_textCtrlDeleteR->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + m_textCtrlDeleteR->SetToolTip( _("Number of files and directories that will be deleted") ); + + fgSizer51->Add( m_textCtrlDeleteR, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer157->Add( fgSizer51, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer161->Add( bSizer157, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + sbSizer161->Add( 0, 10, 0, 0, 5 ); + + wxBoxSizer* bSizer156; + bSizer156 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapData = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapData->SetToolTip( _("Total amount of data that will be transferred") ); + + bSizer156->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); + + + bSizer156->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_textCtrlData = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_CENTRE|wxTE_READONLY ); + m_textCtrlData->SetFont( wxFont( 8, 70, 90, 90, false, wxEmptyString ) ); + m_textCtrlData->SetBackgroundColour( wxColour( 208, 208, 208 ) ); + m_textCtrlData->SetToolTip( _("Total amount of data that will be transferred") ); + + bSizer156->Add( m_textCtrlData, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer156->Add( 0, 0, 1, wxEXPAND, 5 ); + + sbSizer161->Add( bSizer156, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + bSizer141->Add( sbSizer161, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + bSizer134->Add( bSizer141, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer134->Add( m_staticline12, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); + + wxBoxSizer* bSizer142; + bSizer142 = new wxBoxSizer( wxHORIZONTAL ); + + m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("Do not show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer142->Add( m_checkBoxDontShowAgain, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer142->Add( 10, 0, 1, 0, 5 ); + + m_button16 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button16->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer142->Add( m_button16, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer134->Add( bSizer142, 0, wxEXPAND, 5 ); + + this->SetSizer( bSizer134 ); + this->Layout(); + bSizer134->Fit( this ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncPreviewDlgGenerated::OnClose ) ); + m_buttonStartSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncPreviewDlgGenerated::OnStartSync ), NULL, this ); + m_button16->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncPreviewDlgGenerated::OnCancel ), NULL, this ); } SyncPreviewDlgGenerated::~SyncPreviewDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncPreviewDlgGenerated::OnClose ) ); - m_buttonStartSync->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncPreviewDlgGenerated::OnStartSync ), NULL, this ); - m_button16->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncPreviewDlgGenerated::OnCancel ), NULL, this ); - + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncPreviewDlgGenerated::OnClose ) ); + m_buttonStartSync->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncPreviewDlgGenerated::OnStartSync ), NULL, this ); + m_button16->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncPreviewDlgGenerated::OnCancel ), NULL, this ); + } PopupFrameGenerated1::PopupFrameGenerated1( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - 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 ); } PopupFrameGenerated1::~PopupFrameGenerated1() @@ -3853,67 +3698,130 @@ PopupFrameGenerated1::~PopupFrameGenerated1() SearchDialogGenerated::SearchDialogGenerated( 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* bSizer161; - bSizer161 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer166; - bSizer166 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer162; - bSizer162 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText101 = new wxStaticText( this, wxID_ANY, _("Find what:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText101->Wrap( -1 ); - bSizer162->Add( m_staticText101, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlSearchTxt = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 220,-1 ), 0 ); - bSizer162->Add( m_textCtrlSearchTxt, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer166->Add( bSizer162, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer166->Add( 0, 10, 0, 0, 5 ); - - m_checkBoxMatchCase = new wxCheckBox( this, wxID_ANY, _("Match case"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer166->Add( m_checkBoxMatchCase, 0, wxALL, 5 ); - - bSizer161->Add( bSizer166, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer97; - bSizer97 = new wxBoxSizer( wxVERTICAL ); - - m_buttonFindNext = new wxButton( this, wxID_OK, _("&Find next"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonFindNext->SetDefault(); - m_buttonFindNext->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); - - bSizer97->Add( m_buttonFindNext, 0, wxALL|wxEXPAND, 5 ); - - m_button29 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button29->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); - - bSizer97->Add( m_button29, 0, wxALL|wxEXPAND, 5 ); - - bSizer161->Add( bSizer97, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - this->SetSizer( bSizer161 ); - this->Layout(); - bSizer161->Fit( this ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SearchDialogGenerated::OnClose ) ); - m_textCtrlSearchTxt->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( SearchDialogGenerated::OnText ), NULL, this ); - m_buttonFindNext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnFindNext ), NULL, this ); - m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnCancel ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer161; + bSizer161 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer166; + bSizer166 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer162; + bSizer162 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText101 = new wxStaticText( this, wxID_ANY, _("Find what:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText101->Wrap( -1 ); + bSizer162->Add( m_staticText101, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlSearchTxt = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 220,-1 ), 0 ); + bSizer162->Add( m_textCtrlSearchTxt, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer166->Add( bSizer162, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizer166->Add( 0, 5, 0, 0, 5 ); + + m_checkBoxMatchCase = new wxCheckBox( this, wxID_ANY, _("Match case"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer166->Add( m_checkBoxMatchCase, 0, wxALL, 5 ); + + bSizer161->Add( bSizer166, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer97; + bSizer97 = new wxBoxSizer( wxVERTICAL ); + + m_buttonFindNext = new wxButton( this, wxID_OK, _("&Find next"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonFindNext->SetDefault(); + m_buttonFindNext->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); + + bSizer97->Add( m_buttonFindNext, 0, wxEXPAND|wxTOP|wxRIGHT, 5 ); + + m_button29 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button29->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer97->Add( m_button29, 0, wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + bSizer161->Add( bSizer97, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + this->SetSizer( bSizer161 ); + this->Layout(); + bSizer161->Fit( this ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SearchDialogGenerated::OnClose ) ); + m_textCtrlSearchTxt->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( SearchDialogGenerated::OnText ), NULL, this ); + m_buttonFindNext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnFindNext ), NULL, this ); + m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnCancel ), NULL, this ); } SearchDialogGenerated::~SearchDialogGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SearchDialogGenerated::OnClose ) ); - m_textCtrlSearchTxt->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( SearchDialogGenerated::OnText ), NULL, this ); - m_buttonFindNext->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnFindNext ), NULL, this ); - m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnCancel ), NULL, this ); - + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SearchDialogGenerated::OnClose ) ); + m_textCtrlSearchTxt->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( SearchDialogGenerated::OnText ), NULL, this ); + m_buttonFindNext->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnFindNext ), NULL, this ); + m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnCancel ), NULL, this ); + +} + +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 ); + + wxBoxSizer* bSizer96; + bSizer96 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer98; + bSizer98 = new wxBoxSizer( wxHORIZONTAL ); + + m_calendarFrom = new wxCalendarCtrl( this, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS ); + bSizer98->Add( m_calendarFrom, 0, wxALL, 5 ); + + m_calendarTo = new wxCalendarCtrl( this, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS ); + bSizer98->Add( m_calendarTo, 0, wxALL, 5 ); + + bSizer96->Add( bSizer98, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer97; + bSizer97 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer97->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_buttonOkay = new wxButton( this, wxID_ANY, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonOkay->SetDefault(); + m_buttonOkay->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) ); + + bSizer97->Add( m_buttonOkay, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_button29 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button29->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) ); + + bSizer97->Add( m_button29, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer97->Add( 0, 0, 1, wxEXPAND, 5 ); + + bSizer96->Add( bSizer97, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + this->SetSizer( bSizer96 ); + this->Layout(); + bSizer96->Fit( this ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SelectTimespanDlgGenerated::OnClose ) ); + m_calendarFrom->Connect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionFrom ), NULL, this ); + m_calendarTo->Connect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionTo ), NULL, this ); + m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnOkay ), NULL, this ); + m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnCancel ), NULL, this ); +} + +SelectTimespanDlgGenerated::~SelectTimespanDlgGenerated() +{ + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SelectTimespanDlgGenerated::OnClose ) ); + m_calendarFrom->Disconnect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionFrom ), NULL, this ); + m_calendarTo->Disconnect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionTo ), NULL, this ); + m_buttonOkay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnOkay ), NULL, this ); + m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnCancel ), NULL, this ); + } diff --git a/ui/gui_generated.h b/ui/gui_generated.h index a8e51cc9..6a755d59 100644 --- a/ui/gui_generated.h +++ b/ui/gui_generated.h @@ -11,11 +11,11 @@ #include <wx/artprov.h> #include <wx/xrc/xmlres.h> #include <wx/intl.h> -class CustomComboBox; class CustomGridLeft; class CustomGridMiddle; class CustomGridRight; class FfsDirPickerCtrl; +class FolderHistoryBox; class ToggleButton; class wxButtonWithImage; @@ -51,9 +51,9 @@ class wxButtonWithImage; #include <wx/gauge.h> #include <wx/radiobut.h> #include <wx/animate.h> -#include <wx/treectrl.h> #include <wx/hyperlink.h> #include <wx/checklst.h> +#include <wx/calctrl.h> #include "../shared/i18n.h" @@ -63,970 +63,955 @@ class wxButtonWithImage; /////////////////////////////////////////////////////////////////////////////// /// Class MainDialogGenerated /////////////////////////////////////////////////////////////////////////////// -class MainDialogGenerated : public wxFrame +class MainDialogGenerated : public wxFrame { - private: - - protected: - wxMenuBar* m_menubar1; - wxMenu* m_menuFile; - wxMenuItem* m_menuItem10; - wxMenuItem* m_menuItem11; - wxMenuItem* m_menuItemSwitchView; - wxMenuItem* m_menuItemNew; - wxMenuItem* m_menuItemSave; - wxMenuItem* m_menuItemLoad; - wxMenu* m_menuAdvanced; - wxMenu* m_menuLanguages; - wxMenuItem* m_menuItemGlobSett; - wxMenuItem* m_menuItem7; - wxMenu* m_menuHelp; - wxMenuItem* m_menuItemCheckVer; - wxMenuItem* m_menuItemAbout; - wxBoxSizer* bSizerPanelHolder; - wxPanel* m_panelTopButtons; - wxBoxSizer* bSizerTopButtons; - wxStaticText* m_staticTextCmpVariant; - wxButtonWithImage* m_buttonCompare; - wxButton* m_buttonAbort; - wxBitmapButton* m_bpButtonCmpConfig; - wxStaticText* m_staticTextSyncVariant; - wxBitmapButton* m_bpButtonSyncConfig; - wxButtonWithImage* m_buttonStartSync; - wxPanel* m_panelDirectoryPairs; - wxStaticBoxSizer* sbSizerDirLeft; - wxPanel* m_panelTopMiddle; - wxBitmapButton* m_bpButtonSwapSides; - wxStaticBoxSizer* sbSizerDirRight; - wxBitmapButton* m_bpButtonAddPair; - wxScrolledWindow* m_scrolledWindowFolderPairs; - wxBoxSizer* bSizerAddFolderPairs; - wxPanel* m_panelGrids; - wxBoxSizer* bSizerGridHolder; - CustomGridLeft* m_gridLeft; - wxPanel* m_panelMiddle; - CustomGridMiddle* m_gridMiddle; - CustomGridRight* m_gridRight; - wxPanel* m_panelConfig; - wxBoxSizer* bSizerConfig; - wxBitmapButton* m_bpButtonSave; - wxBitmapButton* m_bpButtonLoad; - wxListBox* m_listBoxHistory; - wxPanel* m_panelFilter; - wxBitmapButton* m_bpButtonFilter; - wxCheckBox* m_checkBoxHideFilt; - wxPanel* m_panelStatistics; - wxBoxSizer* bSizerStatistics; - wxStaticBitmap* m_bitmapCreate; - wxTextCtrl* m_textCtrlCreate; - wxStaticBitmap* m_bitmapUpdate; - wxTextCtrl* m_textCtrlUpdate; - wxStaticBitmap* m_bitmapDelete; - wxTextCtrl* m_textCtrlDelete; - wxStaticBitmap* m_bitmapData; - wxTextCtrl* m_textCtrlData; - wxPanel* m_panelViewFilter; - wxBoxSizer* bSizerViewFilter; - ToggleButton* m_bpButtonSyncCreateLeft; - ToggleButton* m_bpButtonSyncDirOverwLeft; - ToggleButton* m_bpButtonSyncDeleteLeft; - ToggleButton* m_bpButtonLeftOnly; - ToggleButton* m_bpButtonLeftNewer; - ToggleButton* m_bpButtonEqual; - ToggleButton* m_bpButtonDifferent; - ToggleButton* m_bpButtonSyncDirNone; - ToggleButton* m_bpButtonRightNewer; - ToggleButton* m_bpButtonRightOnly; - ToggleButton* m_bpButtonSyncDeleteRight; - ToggleButton* m_bpButtonSyncDirOverwRight; - ToggleButton* m_bpButtonSyncCreateRight; - ToggleButton* m_bpButtonConflict; - wxPanel* m_panelStatusBar; - wxStaticText* m_staticTextStatusLeft; - wxStaticLine* m_staticline9; - wxStaticText* m_staticTextStatusMiddle; - wxStaticLine* m_staticline10; - wxStaticText* m_staticTextStatusRight; - wxStaticBitmap* m_bitmap15; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnCompare( wxCommandEvent& event ) { event.Skip(); } - virtual void OnStartSync( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSwitchView( wxCommandEvent& event ) { event.Skip(); } - virtual void OnNewConfig( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSaveConfig( wxCommandEvent& event ) { event.Skip(); } - virtual void OnLoadConfig( wxCommandEvent& event ) { event.Skip(); } - virtual void OnMenuQuit( wxCommandEvent& event ) { event.Skip(); } - virtual void OnMenuGlobalSettings( wxCommandEvent& event ) { event.Skip(); } - virtual void OnMenuBatchJob( wxCommandEvent& event ) { event.Skip(); } - virtual void OnMenuExportFileList( wxCommandEvent& event ) { event.Skip(); } - virtual void OnShowHelp( wxCommandEvent& event ) { event.Skip(); } - virtual void OnMenuCheckVersion( wxCommandEvent& event ) { event.Skip(); } - virtual void OnMenuAbout( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCmpSettings( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSyncSettings( wxCommandEvent& event ) { event.Skip(); } - virtual void OnDirSelected( wxFileDirPickerEvent& event ) { event.Skip(); } - virtual void OnSwapSides( wxCommandEvent& event ) { event.Skip(); } - virtual void OnAddFolderPair( wxCommandEvent& event ) { event.Skip(); } - virtual void OnRemoveTopFolderPair( wxCommandEvent& event ) { event.Skip(); } - virtual void OnLeftGridDoubleClick( wxGridEvent& event ) { event.Skip(); } - virtual void OnContextRim( wxGridEvent& event ) { event.Skip(); } - virtual void OnSortLeftGrid( wxGridEvent& event ) { event.Skip(); } - virtual void OnContextRimLabelLeft( wxGridEvent& event ) { event.Skip(); } - virtual void OnContextMiddle( wxGridEvent& event ) { event.Skip(); } - virtual void OnSortMiddleGrid( wxGridEvent& event ) { event.Skip(); } - virtual void OnContextMiddleLabel( wxGridEvent& event ) { event.Skip(); } - virtual void OnRightGridDoubleClick( wxGridEvent& event ) { event.Skip(); } - virtual void OnSortRightGrid( wxGridEvent& event ) { event.Skip(); } - virtual void OnContextRimLabelRight( wxGridEvent& event ) { event.Skip(); } - virtual void OnCfgHistoryKeyEvent( wxKeyEvent& event ) { event.Skip(); } - virtual void OnLoadFromHistory( wxCommandEvent& event ) { event.Skip(); } - virtual void OnConfigureFilter( wxCommandEvent& event ) { event.Skip(); } - virtual void OnHideFilteredButton( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSyncCreateLeft( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSyncDirLeft( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSyncDeleteLeft( wxCommandEvent& event ) { event.Skip(); } - virtual void OnLeftOnlyFiles( wxCommandEvent& event ) { event.Skip(); } - virtual void OnLeftNewerFiles( wxCommandEvent& event ) { event.Skip(); } - virtual void OnEqualFiles( wxCommandEvent& event ) { event.Skip(); } - virtual void OnDifferentFiles( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSyncDirNone( wxCommandEvent& event ) { event.Skip(); } - virtual void OnRightNewerFiles( wxCommandEvent& event ) { event.Skip(); } - virtual void OnRightOnlyFiles( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSyncDeleteRight( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSyncDirRight( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSyncCreateRight( wxCommandEvent& event ) { event.Skip(); } - virtual void OnConflictFiles( wxCommandEvent& event ) { event.Skip(); } - - - public: - wxPanel* m_panelTopLeft; - CustomComboBox* m_directoryLeft; - FfsDirPickerCtrl* m_dirPickerLeft; - wxBitmapButton* m_bpButtonLocalFilter; - wxBitmapButton* m_bpButtonAltSyncCfg; - wxPanel* m_panelTopRight; - wxBitmapButton* m_bpButtonRemovePair; - CustomComboBox* m_directoryRight; - FfsDirPickerCtrl* m_dirPickerRight; - wxPanel* m_panelLeft; - wxPanel* m_panelRight; - - MainDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); - - ~MainDialogGenerated(); - +private: + +protected: + wxMenuBar* m_menubar1; + wxMenu* m_menuFile; + wxMenuItem* m_menuItem10; + wxMenuItem* m_menuItem11; + wxMenuItem* m_menuItemSwitchView; + wxMenuItem* m_menuItemNew; + wxMenuItem* m_menuItemSave; + wxMenuItem* m_menuItemLoad; + wxMenu* m_menuAdvanced; + wxMenu* m_menuLanguages; + wxMenuItem* m_menuItemGlobSett; + wxMenuItem* m_menuItem7; + wxMenu* m_menuHelp; + wxMenuItem* m_menuItemCheckVer; + wxMenuItem* m_menuItemAbout; + wxBoxSizer* bSizerPanelHolder; + wxPanel* m_panelTopButtons; + wxBoxSizer* bSizerTopButtons; + wxStaticText* m_staticTextCmpVariant; + wxButtonWithImage* m_buttonCompare; + wxButton* m_buttonAbort; + wxBitmapButton* m_bpButtonCmpConfig; + wxStaticText* m_staticTextSyncVariant; + wxBitmapButton* m_bpButtonSyncConfig; + wxButtonWithImage* m_buttonStartSync; + wxPanel* m_panelDirectoryPairs; + wxStaticBoxSizer* sbSizerDirLeft; + wxBitmapButton* m_bpButtonAddPair; + wxPanel* m_panelTopMiddle; + wxBitmapButton* m_bpButtonSwapSides; + wxStaticBoxSizer* sbSizerDirRight; + wxScrolledWindow* m_scrolledWindowFolderPairs; + wxBoxSizer* bSizerAddFolderPairs; + wxPanel* m_panelGrids; + wxBoxSizer* bSizerGridHolder; + CustomGridLeft* m_gridLeft; + wxPanel* m_panelMiddle; + CustomGridMiddle* m_gridMiddle; + CustomGridRight* m_gridRight; + wxPanel* m_panelConfig; + wxBoxSizer* bSizerConfig; + wxBitmapButton* m_bpButtonSave; + wxBitmapButton* m_bpButtonLoad; + wxListBox* m_listBoxHistory; + wxPanel* m_panelFilter; + wxBitmapButton* m_bpButtonFilter; + wxCheckBox* m_checkBoxHideFilt; + wxPanel* m_panelStatistics; + wxBoxSizer* bSizerStatistics; + wxStaticBitmap* m_bitmapCreate; + wxTextCtrl* m_textCtrlCreate; + wxStaticBitmap* m_bitmapUpdate; + wxTextCtrl* m_textCtrlUpdate; + wxStaticBitmap* m_bitmapDelete; + wxTextCtrl* m_textCtrlDelete; + wxStaticBitmap* m_bitmapData; + wxTextCtrl* m_textCtrlData; + wxPanel* m_panelViewFilter; + wxBoxSizer* bSizerViewFilter; + ToggleButton* m_bpButtonSyncCreateLeft; + ToggleButton* m_bpButtonSyncDirOverwLeft; + ToggleButton* m_bpButtonSyncDeleteLeft; + ToggleButton* m_bpButtonLeftOnly; + ToggleButton* m_bpButtonLeftNewer; + ToggleButton* m_bpButtonEqual; + ToggleButton* m_bpButtonDifferent; + ToggleButton* m_bpButtonSyncDirNone; + ToggleButton* m_bpButtonRightNewer; + ToggleButton* m_bpButtonRightOnly; + ToggleButton* m_bpButtonSyncDeleteRight; + ToggleButton* m_bpButtonSyncDirOverwRight; + ToggleButton* m_bpButtonSyncCreateRight; + ToggleButton* m_bpButtonConflict; + wxPanel* m_panelStatusBar; + wxStaticText* m_staticTextStatusLeft; + wxStaticLine* m_staticline9; + wxStaticText* m_staticTextStatusMiddle; + wxStaticLine* m_staticline10; + wxStaticText* m_staticTextStatusRight; + wxStaticBitmap* m_bitmap15; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnCompare( wxCommandEvent& event ) { event.Skip(); } + virtual void OnStartSync( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSwitchView( wxCommandEvent& event ) { event.Skip(); } + virtual void OnNewConfig( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSaveConfig( wxCommandEvent& event ) { event.Skip(); } + virtual void OnLoadConfig( wxCommandEvent& event ) { event.Skip(); } + virtual void OnMenuQuit( wxCommandEvent& event ) { event.Skip(); } + virtual void OnMenuGlobalSettings( wxCommandEvent& event ) { event.Skip(); } + virtual void OnMenuBatchJob( wxCommandEvent& event ) { event.Skip(); } + virtual void OnMenuExportFileList( wxCommandEvent& event ) { event.Skip(); } + virtual void OnShowHelp( wxCommandEvent& event ) { event.Skip(); } + virtual void OnMenuCheckVersion( wxCommandEvent& event ) { event.Skip(); } + virtual void OnMenuAbout( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCmpSettings( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncSettings( wxCommandEvent& event ) { event.Skip(); } + virtual void OnAddFolderPair( wxCommandEvent& event ) { event.Skip(); } + virtual void OnRemoveTopFolderPair( wxCommandEvent& event ) { event.Skip(); } + virtual void OnDirSelected( wxFileDirPickerEvent& event ) { event.Skip(); } + virtual void OnSwapSides( wxCommandEvent& event ) { event.Skip(); } + virtual void OnLeftGridDoubleClick( wxGridEvent& event ) { event.Skip(); } + virtual void OnContextRim( wxGridEvent& event ) { event.Skip(); } + virtual void OnSortLeftGrid( wxGridEvent& event ) { event.Skip(); } + virtual void OnContextRimLabelLeft( wxGridEvent& event ) { event.Skip(); } + virtual void OnContextMiddle( wxGridEvent& event ) { event.Skip(); } + virtual void OnSortMiddleGrid( wxGridEvent& event ) { event.Skip(); } + virtual void OnContextMiddleLabel( wxGridEvent& event ) { event.Skip(); } + virtual void OnRightGridDoubleClick( wxGridEvent& event ) { event.Skip(); } + virtual void OnSortRightGrid( wxGridEvent& event ) { event.Skip(); } + virtual void OnContextRimLabelRight( wxGridEvent& event ) { event.Skip(); } + virtual void OnCfgHistoryKeyEvent( wxKeyEvent& event ) { event.Skip(); } + virtual void OnLoadFromHistory( wxCommandEvent& event ) { event.Skip(); } + virtual void OnConfigureFilter( wxCommandEvent& event ) { event.Skip(); } + virtual void OnHideFilteredButton( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncCreateLeft( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncDirLeft( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncDeleteLeft( wxCommandEvent& event ) { event.Skip(); } + virtual void OnLeftOnlyFiles( wxCommandEvent& event ) { event.Skip(); } + virtual void OnLeftNewerFiles( wxCommandEvent& event ) { event.Skip(); } + virtual void OnEqualFiles( wxCommandEvent& event ) { event.Skip(); } + virtual void OnDifferentFiles( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncDirNone( wxCommandEvent& event ) { event.Skip(); } + virtual void OnRightNewerFiles( wxCommandEvent& event ) { event.Skip(); } + virtual void OnRightOnlyFiles( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncDeleteRight( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncDirRight( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncCreateRight( wxCommandEvent& event ) { event.Skip(); } + virtual void OnConflictFiles( wxCommandEvent& event ) { event.Skip(); } + + +public: + wxPanel* m_panelTopLeft; + wxBitmapButton* m_bpButtonRemovePair; + FolderHistoryBox* m_directoryLeft; + FfsDirPickerCtrl* m_dirPickerLeft; + wxBitmapButton* m_bpButtonAltCompCfg; + wxBitmapButton* m_bpButtonLocalFilter; + wxBitmapButton* m_bpButtonAltSyncCfg; + wxPanel* m_panelTopRight; + FolderHistoryBox* m_directoryRight; + FfsDirPickerCtrl* m_dirPickerRight; + wxPanel* m_panelLeft; + wxPanel* m_panelRight; + + MainDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); + + ~MainDialogGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class FolderPairGenerated /////////////////////////////////////////////////////////////////////////////// -class FolderPairGenerated : public wxPanel +class FolderPairGenerated : public wxPanel { - private: - - protected: - - public: - wxPanel* m_panelLeft; - wxTextCtrl* m_directoryLeft; - FfsDirPickerCtrl* m_dirPickerLeft; - wxPanel* m_panel20; - wxBitmapButton* m_bpButtonLocalFilter; - wxBitmapButton* m_bpButtonAltSyncCfg; - wxPanel* m_panelRight; - wxBitmapButton* m_bpButtonRemovePair; - wxTextCtrl* m_directoryRight; - FfsDirPickerCtrl* m_dirPickerRight; - - FolderPairGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); - ~FolderPairGenerated(); - +private: + +protected: + +public: + wxPanel* m_panelLeft; + wxBitmapButton* m_bpButtonRemovePair; + FolderHistoryBox* m_directoryLeft; + FfsDirPickerCtrl* m_dirPickerLeft; + wxPanel* m_panel20; + wxBitmapButton* m_bpButtonAltCompCfg; + wxBitmapButton* m_bpButtonLocalFilter; + wxBitmapButton* m_bpButtonAltSyncCfg; + wxPanel* m_panelRight; + FolderHistoryBox* m_directoryRight; + FfsDirPickerCtrl* m_dirPickerRight; + + FolderPairGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); + ~FolderPairGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// -/// Class BatchFolderPairGenerated +/// Class BatchDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class BatchFolderPairGenerated : public wxPanel +class BatchDlgGenerated : public wxDialog { - private: - - protected: - wxPanel* m_panel32; - wxStaticText* m_staticText53; - wxStaticText* m_staticText541; - wxPanel* m_panelLeft; - wxPanel* m_panelRight; - - public: - wxBitmapButton* m_bpButtonRemovePair; - wxTextCtrl* m_directoryLeft; - FfsDirPickerCtrl* m_dirPickerLeft; - wxBitmapButton* m_bpButtonLocalFilter; - wxTextCtrl* m_directoryRight; - FfsDirPickerCtrl* m_dirPickerRight; - wxBitmapButton* m_bpButtonAltSyncCfg; - - BatchFolderPairGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); - ~BatchFolderPairGenerated(); - +private: + +protected: + wxBoxSizer* bSizer69; + wxStaticBitmap* m_bitmap27; + wxPanel* m_panel8; + wxStaticText* m_staticText56; + wxStaticText* m_staticText44; + wxBitmapButton* m_bpButtonHelp; + wxNotebook* m_notebookSettings; + wxPanel* m_panelOverview; + wxBitmapButton* m_bpButtonCmpConfig; + wxStaticText* m_staticTextCmpVariant; + wxBitmapButton* m_bpButtonFilter; + wxStaticText* m_staticTextSyncVariant; + wxBitmapButton* m_bpButtonSyncConfig; + wxChoice* m_choiceHandleError; + wxBoxSizer* sbSizerMainPair; + wxPanel* m_panelMainPair; + wxStaticText* m_staticText532; + wxStaticText* m_staticText5411; + wxBoxSizer* bSizerAddFolderPairs; + wxPanel* m_panelBatchSettings; + wxCheckBox* m_checkBoxSilent; + wxStaticBoxSizer* sbSizerLogfileDir; + wxStaticText* m_staticText96; + wxSpinCtrl* m_spinCtrlLogCountMax; + wxPanel* m_panelLogfile; + wxStaticText* m_staticText94; + wxTextCtrl* m_textCtrlLogfileDir; + FfsDirPickerCtrl* m_dirPickerLogfileDir; + wxButton* m_buttonSave; + wxButton* m_buttonLoad; + wxButton* m_button6; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnHelp( 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 OnChangeErrorHandling( wxCommandEvent& event ) { event.Skip(); } + virtual void OnAddFolderPair( wxCommandEvent& event ) { event.Skip(); } + virtual void OnRemoveTopFolderPair( wxCommandEvent& event ) { event.Skip(); } + virtual void OnChangeMaxLogCountTxt( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSaveBatchJob( wxCommandEvent& event ) { event.Skip(); } + virtual void OnLoadBatchJob( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + +public: + wxScrolledWindow* m_scrolledWindow6; + wxBitmapButton* m_bpButtonAddPair; + wxBitmapButton* m_bpButtonRemovePair; + wxPanel* m_panelLeft; + FolderHistoryBox* m_directoryLeft; + FfsDirPickerCtrl* m_dirPickerLeft; + wxPanel* m_panelRight; + FolderHistoryBox* m_directoryRight; + FfsDirPickerCtrl* m_dirPickerRight; + wxBitmapButton* m_bpButtonAltCompCfg; + wxBitmapButton* m_bpButtonLocalFilter; + wxBitmapButton* m_bpButtonAltSyncCfg; + + BatchDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Create a batch job"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~BatchDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// -/// Class BatchDlgGenerated +/// Class BatchFolderPairGenerated /////////////////////////////////////////////////////////////////////////////// -class BatchDlgGenerated : public wxDialog +class BatchFolderPairGenerated : public wxPanel { - private: - - protected: - wxBoxSizer* bSizer69; - wxStaticBitmap* m_bitmap27; - wxPanel* m_panel8; - wxStaticText* m_staticText56; - wxStaticText* m_staticText44; - wxBitmapButton* m_bpButtonHelp; - wxNotebook* m_notebookSettings; - wxPanel* m_panelOverview; - wxBitmapButton* m_bpButtonCmpConfig; - wxStaticText* m_staticTextCmpVariant; - wxBitmapButton* m_bpButtonFilter; - wxStaticText* m_staticTextSyncVariant; - wxBitmapButton* m_bpButtonSyncConfig; - wxBoxSizer* sbSizerMainPair; - wxPanel* m_panelMainPair; - wxStaticText* m_staticText532; - wxStaticText* m_staticText5411; - wxBoxSizer* bSizerAddFolderPairs; - wxChoice* m_choiceHandleError; - wxPanel* m_panelBatchSettings; - wxCheckBox* m_checkBoxSilent; - wxStaticBoxSizer* sbSizerLogfileDir; - wxStaticText* m_staticText96; - wxSpinCtrl* m_spinCtrlLogCountMax; - wxPanel* m_panelLogfile; - wxStaticText* m_staticText94; - wxTextCtrl* m_textCtrlLogfileDir; - FfsDirPickerCtrl* m_dirPickerLogfileDir; - wxButton* m_buttonSave; - wxButton* m_buttonLoad; - wxButton* m_button6; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnHelp( 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 OnAddFolderPair( wxCommandEvent& event ) { event.Skip(); } - virtual void OnRemoveTopFolderPair( wxCommandEvent& event ) { event.Skip(); } - virtual void OnChangeErrorHandling( wxCommandEvent& event ) { event.Skip(); } - virtual void OnChangeMaxLogCountTxt( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSaveBatchJob( wxCommandEvent& event ) { event.Skip(); } - virtual void OnLoadBatchJob( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - - - public: - wxScrolledWindow* m_scrolledWindow6; - wxBitmapButton* m_bpButtonAddPair; - wxBitmapButton* m_bpButtonRemovePair; - wxPanel* m_panelLeft; - wxTextCtrl* m_directoryLeft; - FfsDirPickerCtrl* m_dirPickerLeft; - wxBitmapButton* m_bpButtonLocalFilter; - wxPanel* m_panelRight; - wxTextCtrl* m_directoryRight; - FfsDirPickerCtrl* m_dirPickerRight; - wxBitmapButton* m_bpButtonAltSyncCfg; - - BatchDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Create a batch job"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~BatchDlgGenerated(); - +private: + +protected: + wxPanel* m_panel32; + wxStaticText* m_staticText53; + wxStaticText* m_staticText541; + wxPanel* m_panelLeft; + wxPanel* m_panelRight; + +public: + wxBitmapButton* m_bpButtonRemovePair; + FolderHistoryBox* m_directoryLeft; + FfsDirPickerCtrl* m_dirPickerLeft; + FolderHistoryBox* m_directoryRight; + FfsDirPickerCtrl* m_dirPickerRight; + wxBitmapButton* m_bpButtonAltCompCfg; + wxBitmapButton* m_bpButtonLocalFilter; + wxBitmapButton* m_bpButtonAltSyncCfg; + + BatchFolderPairGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); + ~BatchFolderPairGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class CompareStatusGenerated /////////////////////////////////////////////////////////////////////////////// -class CompareStatusGenerated : public wxPanel +class CompareStatusGenerated : public wxPanel { - private: - - protected: - wxBoxSizer* bSizer42; - wxBoxSizer* bSizerFilesFound; - wxStaticText* m_staticText321; - wxStaticText* m_staticTextScanned; - wxBoxSizer* bSizerFilesRemaining; - wxStaticText* m_staticText46; - wxStaticText* m_staticTextFilesRemaining; - wxStaticText* m_staticText117; - wxStaticText* m_staticTextDataRemaining; - wxStaticText* m_staticText118; - wxBoxSizer* sSizerSpeed; - wxStaticText* m_staticText104; - wxStaticText* m_staticTextSpeed; - wxBoxSizer* sSizerTimeRemaining; - wxStaticText* m_staticTextTimeRemFixed; - wxStaticText* m_staticTextTimeRemaining; - wxBoxSizer* sSizerTimeElapsed; - wxStaticText* m_staticTextTimeElapsed; - wxStaticText* m_staticText30; - wxTextCtrl* m_textCtrlStatus; - wxGauge* m_gauge2; - - public: - - CompareStatusGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxRAISED_BORDER|wxTAB_TRAVERSAL ); - ~CompareStatusGenerated(); - +private: + +protected: + wxBoxSizer* bSizer42; + wxBoxSizer* bSizerFilesFound; + wxStaticText* m_staticText321; + wxStaticText* m_staticTextScanned; + wxBoxSizer* bSizerFilesRemaining; + wxStaticText* m_staticText46; + wxStaticText* m_staticTextFilesRemaining; + wxStaticText* m_staticText117; + wxStaticText* m_staticTextDataRemaining; + wxStaticText* m_staticText118; + wxBoxSizer* sSizerSpeed; + wxStaticText* m_staticText104; + wxStaticText* m_staticTextSpeed; + wxBoxSizer* sSizerTimeRemaining; + wxStaticText* m_staticTextTimeRemFixed; + wxStaticText* m_staticTextTimeRemaining; + wxBoxSizer* sSizerTimeElapsed; + wxStaticText* m_staticTextTimeElapsed; + wxStaticText* m_staticText30; + wxTextCtrl* m_textCtrlStatus; + wxGauge* m_gauge2; + +public: + + CompareStatusGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxRAISED_BORDER|wxTAB_TRAVERSAL ); + ~CompareStatusGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class SyncCfgDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class SyncCfgDlgGenerated : public wxDialog +class SyncCfgDlgGenerated : public wxDialog { - private: - - protected: - wxStaticText* m_staticText1; - wxRadioButton* m_radioBtnAutomatic; - wxButton* m_buttonAutomatic; - wxStaticText* m_staticText81; - wxRadioButton* m_radioBtnMirror; - wxButton* m_buttonOneWay; - wxStaticText* m_staticText8; - wxRadioButton* m_radioBtnUpdate; - wxButton* m_buttonUpdate; - wxStaticText* m_staticText101; - wxRadioButton* m_radioBtnCustom; - wxButton* m_buttonUpdate1; - wxStaticText* m_staticText9; - wxBoxSizer* bSizer201; - wxStaticBoxSizer* sbSizerErrorHandling; - wxChoice* m_choiceHandleError; - wxStaticBoxSizer* sbSizerCustDelDir; - wxChoice* m_choiceHandleDeletion; - wxPanel* m_panelCustomDeletionDir; - wxTextCtrl* m_textCtrlCustomDelFolder; - FfsDirPickerCtrl* m_dirPickerCustomDelFolder; - wxButton* m_buttonOK; - wxButton* m_button16; - wxStaticBitmap* m_bitmapDatabase; - wxBoxSizer* sbSizerSyncDirections; - wxStaticText* m_staticText21; - wxStaticText* m_staticText31; - wxStaticLine* m_staticline3; - wxBoxSizer* bSizerLeftOnly; - wxStaticBitmap* m_bitmapLeftOnly; - wxBitmapButton* m_bpButtonLeftOnly; - wxBoxSizer* bSizerRightOnly; - wxStaticBitmap* m_bitmapRightOnly; - wxBitmapButton* m_bpButtonRightOnly; - wxBoxSizer* bSizerLeftNewer; - wxStaticBitmap* m_bitmapLeftNewer; - wxBitmapButton* m_bpButtonLeftNewer; - wxBoxSizer* bSizerRightNewer; - wxStaticBitmap* m_bitmapRightNewer; - wxBitmapButton* m_bpButtonRightNewer; - wxBoxSizer* bSizerDifferent; - wxStaticBitmap* m_bitmapDifferent; - wxBitmapButton* m_bpButtonDifferent; - wxBoxSizer* bSizerConflict; - wxStaticBitmap* m_bitmapConflict; - wxBitmapButton* m_bpButtonConflict; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnSyncAutomatic( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSyncAutomaticDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void OnSyncMirror( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSyncMirrorDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void OnSyncUpdate( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSyncUpdateDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void OnSyncCustom( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSyncCustomDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void OnChangeErrorHandling( wxCommandEvent& event ) { event.Skip(); } - virtual void OnChangeDeletionHandling( wxCommandEvent& event ) { event.Skip(); } - virtual void OnApply( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - virtual void OnExLeftSideOnly( wxCommandEvent& event ) { event.Skip(); } - virtual void OnExRightSideOnly( wxCommandEvent& event ) { event.Skip(); } - virtual void OnLeftNewer( wxCommandEvent& event ) { event.Skip(); } - virtual void OnRightNewer( wxCommandEvent& event ) { event.Skip(); } - virtual void OnDifferent( wxCommandEvent& event ) { event.Skip(); } - virtual void OnConflict( wxCommandEvent& event ) { event.Skip(); } - - - public: - - SyncCfgDlgGenerated( 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 ); - ~SyncCfgDlgGenerated(); - +private: + +protected: + wxStaticText* m_staticText1; + wxRadioButton* m_radioBtnAutomatic; + wxButton* m_buttonAutomatic; + wxStaticText* m_staticText81; + wxRadioButton* m_radioBtnMirror; + wxButton* m_buttonOneWay; + wxStaticText* m_staticText8; + wxRadioButton* m_radioBtnUpdate; + wxButton* m_buttonUpdate; + wxStaticText* m_staticText101; + wxRadioButton* m_radioBtnCustom; + wxButton* m_buttonUpdate1; + wxStaticText* m_staticText9; + wxBoxSizer* bSizer201; + wxStaticBoxSizer* sbSizerErrorHandling; + wxChoice* m_choiceHandleError; + wxStaticBoxSizer* sbSizerCustDelDir; + wxChoice* m_choiceHandleDeletion; + wxPanel* m_panelCustomDeletionDir; + FolderHistoryBox* m_customDelFolder; + FfsDirPickerCtrl* m_dirPickerCustomDelFolder; + wxButton* m_buttonOK; + wxButton* m_button16; + wxStaticBitmap* m_bitmapDatabase; + wxBoxSizer* sbSizerSyncDirections; + wxStaticText* m_staticText21; + wxStaticText* m_staticText31; + wxStaticLine* m_staticline3; + wxBoxSizer* bSizerLeftOnly; + wxStaticBitmap* m_bitmapLeftOnly; + wxBitmapButton* m_bpButtonLeftOnly; + wxBoxSizer* bSizerRightOnly; + wxStaticBitmap* m_bitmapRightOnly; + wxBitmapButton* m_bpButtonRightOnly; + wxBoxSizer* bSizerLeftNewer; + wxStaticBitmap* m_bitmapLeftNewer; + wxBitmapButton* m_bpButtonLeftNewer; + wxBoxSizer* bSizerRightNewer; + wxStaticBitmap* m_bitmapRightNewer; + wxBitmapButton* m_bpButtonRightNewer; + wxBoxSizer* bSizerDifferent; + wxStaticBitmap* m_bitmapDifferent; + wxBitmapButton* m_bpButtonDifferent; + wxBoxSizer* bSizerConflict; + wxStaticBitmap* m_bitmapConflict; + wxBitmapButton* m_bpButtonConflict; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnSyncAutomatic( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncAutomaticDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void OnSyncMirror( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncMirrorDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void OnSyncUpdate( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncUpdateDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void OnSyncCustom( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncCustomDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void OnChangeErrorHandling( wxCommandEvent& event ) { event.Skip(); } + virtual void OnChangeDeletionHandling( wxCommandEvent& event ) { event.Skip(); } + virtual void OnApply( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + virtual void OnExLeftSideOnly( wxCommandEvent& event ) { event.Skip(); } + virtual void OnExRightSideOnly( wxCommandEvent& event ) { event.Skip(); } + virtual void OnLeftNewer( wxCommandEvent& event ) { event.Skip(); } + virtual void OnRightNewer( wxCommandEvent& event ) { event.Skip(); } + virtual void OnDifferent( wxCommandEvent& event ) { event.Skip(); } + virtual void OnConflict( wxCommandEvent& event ) { event.Skip(); } + + +public: + + SyncCfgDlgGenerated( 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 ); + ~SyncCfgDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class CmpCfgDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class CmpCfgDlgGenerated : public wxDialog +class CmpCfgDlgGenerated : public wxDialog { - private: - - protected: - wxRadioButton* m_radioBtnSizeDate; - wxStaticBitmap* m_bitmapByTime; - wxButton* m_buttonTimeSize; - wxRadioButton* m_radioBtnContent; - wxStaticBitmap* m_bitmapByContent; - wxButton* m_buttonContent; - wxStaticLine* m_staticline14; - wxBitmapButton* m_bpButtonHelp; - wxChoice* m_choiceHandleSymlinks; - wxButton* m_button10; - wxButton* m_button6; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnTimeSize( wxCommandEvent& event ) { event.Skip(); } - virtual void OnTimeSizeDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void OnContent( wxCommandEvent& event ) { event.Skip(); } - virtual void OnContentDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void OnShowHelp( wxCommandEvent& event ) { event.Skip(); } - virtual void OnChangeErrorHandling( wxCommandEvent& event ) { event.Skip(); } - virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - - - public: - - CmpCfgDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Comparison settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - ~CmpCfgDlgGenerated(); - +private: + +protected: + wxRadioButton* m_radioBtnSizeDate; + wxStaticBitmap* m_bitmapByTime; + wxButton* m_buttonTimeSize; + wxRadioButton* m_radioBtnContent; + wxStaticBitmap* m_bitmapByContent; + wxButton* m_buttonContent; + wxChoice* m_choiceHandleSymlinks; + wxBitmapButton* m_bpButtonHelp; + wxButton* m_button10; + wxButton* m_button6; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnTimeSize( wxCommandEvent& event ) { event.Skip(); } + virtual void OnTimeSizeDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void OnContent( wxCommandEvent& event ) { event.Skip(); } + virtual void OnContentDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void OnChangeErrorHandling( wxCommandEvent& event ) { event.Skip(); } + virtual void OnShowHelp( wxCommandEvent& event ) { event.Skip(); } + virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + +public: + + CmpCfgDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Comparison settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + ~CmpCfgDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class SyncStatusDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class SyncStatusDlgGenerated : public wxFrame +class SyncStatusDlgGenerated : public wxFrame { - private: - - protected: - wxStaticBitmap* m_bitmapStatus; - wxStaticText* m_staticTextStatus; - wxAnimationCtrl* m_animationControl1; - wxBoxSizer* bSizer31; - wxBoxSizer* bSizerObjectsRemaining; - wxStaticText* m_staticText25; - wxStaticText* m_staticTextRemainingObj; - wxStaticText* m_staticText96; - wxStaticText* m_staticTextDataRemaining; - wxStaticText* m_staticText97; - wxBoxSizer* bSizerObjectsProcessed; - wxStaticText* m_staticText251; - wxStaticText* m_staticTextProcessedObj; - wxStaticText* m_staticText98; - wxStaticText* m_staticTextDataProcessed; - wxStaticText* m_staticText99; - wxStaticText* m_staticText55; - wxStaticText* m_staticTextTimeElapsed; - wxBoxSizer* bSizerProgressText; - wxTextCtrl* m_textCtrlInfo; - wxBoxSizer* bSizer28; - wxBoxSizer* bSizerSpeed; - wxStaticText* m_staticText108; - wxStaticText* m_staticTextSpeed; - wxButton* m_buttonOK; - wxButton* m_buttonPause; - wxButton* m_buttonAbort; - wxBoxSizer* bSizerRemTime; - wxStaticText* m_staticText21; - wxStaticText* m_staticTextTimeRemaining; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnIconize( wxIconizeEvent& event ) { event.Skip(); } - virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } - virtual void OnPause( wxCommandEvent& event ) { event.Skip(); } - virtual void OnAbort( wxCommandEvent& event ) { event.Skip(); } - - - public: - wxGauge* m_gauge1; - - SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 638,350 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); - - ~SyncStatusDlgGenerated(); - +private: + +protected: + wxStaticBitmap* m_bitmapStatus; + wxStaticText* m_staticTextStatus; + wxAnimationCtrl* m_animationControl1; + wxBoxSizer* bSizer31; + wxBoxSizer* bSizerObjectsRemaining; + wxStaticText* m_staticText25; + wxStaticText* m_staticTextRemainingObj; + wxStaticText* m_staticText96; + wxStaticText* m_staticTextDataRemaining; + wxStaticText* m_staticText97; + wxBoxSizer* bSizerObjectsProcessed; + wxStaticText* m_staticText251; + wxStaticText* m_staticTextProcessedObj; + wxStaticText* m_staticText98; + wxStaticText* m_staticTextDataProcessed; + wxStaticText* m_staticText99; + wxStaticText* m_staticText55; + wxStaticText* m_staticTextTimeElapsed; + wxBoxSizer* bSizerProgressText; + wxTextCtrl* m_textCtrlInfo; + wxBoxSizer* bSizer28; + wxBoxSizer* bSizerSpeed; + wxStaticText* m_staticText108; + wxStaticText* m_staticTextSpeed; + wxButton* m_buttonOK; + wxButton* m_buttonPause; + wxButton* m_buttonAbort; + wxBoxSizer* bSizerRemTime; + wxStaticText* m_staticText21; + wxStaticText* m_staticTextTimeRemaining; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnIconize( wxIconizeEvent& event ) { event.Skip(); } + virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } + virtual void OnPause( wxCommandEvent& event ) { event.Skip(); } + virtual void OnAbort( wxCommandEvent& event ) { event.Skip(); } + + +public: + wxGauge* m_gauge1; + + SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 638,350 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); + + ~SyncStatusDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class LogControlGenerated /////////////////////////////////////////////////////////////////////////////// -class LogControlGenerated : public wxPanel +class LogControlGenerated : public wxPanel { - private: - - protected: - ToggleButton* m_bpButtonErrors; - ToggleButton* m_bpButtonWarnings; - ToggleButton* m_bpButtonInfo; - wxTextCtrl* m_textCtrlInfo; - - // 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: - - LogControlGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); - ~LogControlGenerated(); - -}; +private: + +protected: + ToggleButton* m_bpButtonErrors; + ToggleButton* m_bpButtonWarnings; + ToggleButton* m_bpButtonInfo; + wxTextCtrl* m_textCtrlInfo; + + // 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: + + LogControlGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); + ~LogControlGenerated(); -/////////////////////////////////////////////////////////////////////////////// -/// Class HelpDlgGenerated -/////////////////////////////////////////////////////////////////////////////// -class HelpDlgGenerated : public wxDialog -{ - private: - - protected: - wxStaticBitmap* m_bitmap25; - wxPanel* m_panel8; - wxStaticText* m_staticText56; - wxNotebook* m_notebook1; - wxScrolledWindow* m_scrolledWindow1; - wxStaticText* m_staticText59; - wxStaticText* m_staticText60; - wxStaticText* m_staticText61; - wxTreeCtrl* m_treeCtrl1; - wxStaticText* m_staticText63; - wxStaticText* m_staticText75; - wxStaticText* m_staticText76; - wxStaticText* m_staticText77; - wxStaticText* m_staticText79; - wxStaticText* m_staticText80; - wxStaticText* m_staticText78; - wxScrolledWindow* m_scrolledWindow5; - wxStaticText* m_staticText65; - wxStaticText* m_staticText66; - wxTreeCtrl* m_treeCtrl2; - wxStaticText* m_staticText69; - wxStaticText* m_staticText81; - wxStaticText* m_staticText82; - wxStaticText* m_staticText83; - wxStaticText* m_staticText84; - wxButton* m_button8; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnOK( wxCommandEvent& event ) { event.Skip(); } - - - public: - - HelpDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 579,543 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~HelpDlgGenerated(); - }; /////////////////////////////////////////////////////////////////////////////// /// Class AboutDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class AboutDlgGenerated : public wxDialog +class AboutDlgGenerated : public wxDialog { - private: - - protected: - wxPanel* m_panel5; - wxStaticBitmap* m_bitmap11; - wxStaticText* m_build; - wxPanel* m_panel33; - wxBoxSizer* bSizerCodeInfo; - wxStaticText* m_staticText72; - wxHyperlinkCtrl* m_hyperlink9; - wxHyperlinkCtrl* m_hyperlink10; - wxHyperlinkCtrl* m_hyperlink13; - wxHyperlinkCtrl* m_hyperlink7; - wxHyperlinkCtrl* m_hyperlink11; - wxHyperlinkCtrl* m_hyperlink16; - wxHyperlinkCtrl* m_hyperlink8; - wxHyperlinkCtrl* m_hyperlink15; - wxHyperlinkCtrl* m_hyperlink12; - wxHyperlinkCtrl* m_hyperlink18; - wxHyperlinkCtrl* m_hyperlink14; - wxHyperlinkCtrl* m_hyperlink21; - wxScrolledWindow* m_scrolledWindowTranslators; - wxBoxSizer* bSizerTranslators; - wxStaticText* m_staticText54; - wxFlexGridSizer* fgSizerTranslators; - wxStaticLine* m_staticline3; - wxStaticText* m_staticText131; - wxStaticLine* m_staticline12; - wxStaticBitmap* m_bitmap9; - wxHyperlinkCtrl* m_hyperlink1; - wxHyperlinkCtrl* m_hyperlink3; - wxAnimationCtrl* m_animationControl1; - wxStaticBitmap* m_bitmap10; - wxHyperlinkCtrl* m_hyperlink2; - wxHyperlinkCtrl* m_hyperlink6; - wxStaticBitmap* m_bitmapTransl; - wxStaticLine* m_staticline2; - wxStaticBitmap* m_bitmap13; - wxHyperlinkCtrl* m_hyperlink5; - wxButton* m_buttonOkay; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnOK( wxCommandEvent& event ) { event.Skip(); } - - - public: - - AboutDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); - ~AboutDlgGenerated(); - +private: + +protected: + wxPanel* m_panel5; + wxStaticBitmap* m_bitmap11; + wxStaticText* m_build; + wxPanel* m_panel33; + wxBoxSizer* bSizerCodeInfo; + wxStaticText* m_staticText72; + wxHyperlinkCtrl* m_hyperlink9; + wxHyperlinkCtrl* m_hyperlink11; + wxHyperlinkCtrl* m_hyperlink10; + wxHyperlinkCtrl* m_hyperlink13; + wxHyperlinkCtrl* m_hyperlink7; + wxHyperlinkCtrl* m_hyperlink16; + wxHyperlinkCtrl* m_hyperlink8; + wxHyperlinkCtrl* m_hyperlink15; + wxHyperlinkCtrl* m_hyperlink12; + wxHyperlinkCtrl* m_hyperlink18; + wxHyperlinkCtrl* m_hyperlink14; + wxHyperlinkCtrl* m_hyperlink21; + wxScrolledWindow* m_scrolledWindowTranslators; + wxBoxSizer* bSizerTranslators; + wxStaticText* m_staticText54; + wxFlexGridSizer* fgSizerTranslators; + wxStaticLine* m_staticline3; + wxStaticText* m_staticText131; + wxStaticLine* m_staticline12; + wxStaticBitmap* m_bitmap9; + wxHyperlinkCtrl* m_hyperlink1; + wxHyperlinkCtrl* m_hyperlink3; + wxAnimationCtrl* m_animationControl1; + wxStaticBitmap* m_bitmap10; + wxHyperlinkCtrl* m_hyperlink2; + wxHyperlinkCtrl* m_hyperlink6; + wxStaticBitmap* m_bitmapTransl; + wxStaticLine* m_staticline2; + wxStaticBitmap* m_bitmap13; + wxHyperlinkCtrl* m_hyperlink5; + wxButton* m_buttonOkay; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnOK( wxCommandEvent& event ) { event.Skip(); } + + +public: + + AboutDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); + ~AboutDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class ErrorDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class ErrorDlgGenerated : public wxDialog +class ErrorDlgGenerated : public wxDialog { - private: - - protected: - wxStaticBitmap* m_bitmap10; - wxTextCtrl* m_textCtrl8; - wxCheckBox* m_checkBoxIgnoreErrors; - wxButton* m_buttonIgnore; - wxButton* m_buttonRetry; - wxButton* m_buttonAbort; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnIgnore( wxCommandEvent& event ) { event.Skip(); } - virtual void OnRetry( wxCommandEvent& event ) { event.Skip(); } - virtual void OnAbort( wxCommandEvent& event ) { event.Skip(); } - - - public: - - ErrorDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Error"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 460,250 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER ); - ~ErrorDlgGenerated(); - +private: + +protected: + wxStaticBitmap* m_bitmap10; + wxTextCtrl* m_textCtrl8; + wxCheckBox* m_checkBoxIgnoreErrors; + wxButton* m_buttonIgnore; + wxButton* m_buttonRetry; + wxButton* m_buttonAbort; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnIgnore( wxCommandEvent& event ) { event.Skip(); } + virtual void OnRetry( wxCommandEvent& event ) { event.Skip(); } + virtual void OnAbort( wxCommandEvent& event ) { event.Skip(); } + + +public: + + ErrorDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Error"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 460,250 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER ); + ~ErrorDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class WarningDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class WarningDlgGenerated : public wxDialog +class WarningDlgGenerated : public wxDialog { - private: - - protected: - wxTextCtrl* m_textCtrl8; - wxCheckBox* m_checkBoxDontShowAgain; - wxButton* m_buttonIgnore; - wxButton* m_buttonSwitch; - wxButton* m_buttonAbort; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnIgnore( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSwitch( wxCommandEvent& event ) { event.Skip(); } - virtual void OnAbort( wxCommandEvent& event ) { event.Skip(); } - - - public: - wxStaticBitmap* m_bitmap10; - - WarningDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Warning"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 460,250 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER ); - ~WarningDlgGenerated(); - +private: + +protected: + wxTextCtrl* m_textCtrl8; + wxCheckBox* m_checkBoxDontShowAgain; + wxButton* m_buttonIgnore; + wxButton* m_buttonSwitch; + wxButton* m_buttonAbort; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnIgnore( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSwitch( wxCommandEvent& event ) { event.Skip(); } + virtual void OnAbort( wxCommandEvent& event ) { event.Skip(); } + + +public: + wxStaticBitmap* m_bitmap10; + + WarningDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Warning"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 460,250 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER ); + ~WarningDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class QuestionDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class QuestionDlgGenerated : public wxDialog +class QuestionDlgGenerated : public wxDialog { - private: - - protected: - wxStaticBitmap* m_bitmap10; - wxTextCtrl* m_textCtrl8; - wxCheckBox* m_checkBoxDontAskAgain; - wxButton* m_buttonYes; - wxButton* m_buttonNo; - wxButton* m_buttonCancel; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnYes( wxCommandEvent& event ) { event.Skip(); } - virtual void OnNo( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - - - public: - - QuestionDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Question"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 420,198 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER ); - ~QuestionDlgGenerated(); - +private: + +protected: + wxStaticBitmap* m_bitmap10; + wxTextCtrl* m_textCtrl8; + wxCheckBox* m_checkBoxDontAskAgain; + wxButton* m_buttonYes; + wxButton* m_buttonNo; + wxButton* m_buttonCancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnCheckBoxDontShowAgain( wxCommandEvent& event ) { event.Skip(); } + virtual void OnYes( wxCommandEvent& event ) { event.Skip(); } + virtual void OnNo( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + +public: + + QuestionDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Question"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 420,198 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER ); + ~QuestionDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class DeleteDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class DeleteDlgGenerated : public wxDialog +class DeleteDlgGenerated : public wxDialog { - private: - - protected: - wxStaticBitmap* m_bitmap12; - wxStaticText* m_staticTextHeader; - wxCheckBox* m_checkBoxDeleteBothSides; - wxCheckBox* m_checkBoxUseRecycler; - wxTextCtrl* m_textCtrlMessage; - wxButton* m_buttonOK; - wxButton* m_buttonCancel; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnDelOnBothSides( wxCommandEvent& event ) { event.Skip(); } - virtual void OnUseRecycler( wxCommandEvent& event ) { event.Skip(); } - virtual void OnOK( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - - - public: - - DeleteDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Confirm"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 553,336 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER ); - ~DeleteDlgGenerated(); - +private: + +protected: + wxStaticBitmap* m_bitmap12; + wxStaticText* m_staticTextHeader; + wxCheckBox* m_checkBoxDeleteBothSides; + wxCheckBox* m_checkBoxUseRecycler; + wxTextCtrl* m_textCtrlMessage; + wxButton* m_buttonOK; + wxButton* m_buttonCancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnDelOnBothSides( wxCommandEvent& event ) { event.Skip(); } + virtual void OnUseRecycler( wxCommandEvent& event ) { event.Skip(); } + virtual void OnOK( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + +public: + + DeleteDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Confirm"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 553,336 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER ); + ~DeleteDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class FilterDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class FilterDlgGenerated : public wxDialog +class FilterDlgGenerated : public wxDialog { - private: - - protected: - wxStaticBitmap* m_bitmap26; - wxPanel* m_panel8; - wxStaticText* m_staticTexHeader; - wxStaticText* m_staticText44; - wxBitmapButton* m_bpButtonHelp; - wxPanel* m_panel13; - wxStaticLine* m_staticline10; - wxStaticText* m_staticText45; - wxStaticText* m_staticText83; - wxStaticText* m_staticText84; - wxStaticText* m_staticText85; - wxStaticText* m_staticText181; - wxStaticText* m_staticText1811; - wxStaticBitmap* m_bitmapInclude; - wxTextCtrl* m_textCtrlInclude; - wxStaticBitmap* m_bitmapExclude; - wxTextCtrl* m_textCtrlExclude; - wxStaticBitmap* m_bitmapFilterDate; - wxStaticText* m_staticText103; - wxSpinCtrl* m_spinCtrlTimespan; - wxChoice* m_choiceUnitTimespan; - wxStaticBitmap* m_bitmapFilterSize; - wxStaticText* m_staticText101; - wxSpinCtrl* m_spinCtrlMinSize; - wxChoice* m_choiceUnitMinSize; - wxStaticText* m_staticText102; - wxSpinCtrl* m_spinCtrlMaxSize; - wxChoice* m_choiceUnitMaxSize; - wxButton* m_button9; - wxButton* m_button10; - wxButton* m_button17; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnHelp( wxCommandEvent& event ) { event.Skip(); } - virtual void OnUpdateNameFilter( wxCommandEvent& event ) { event.Skip(); } - virtual void OnUpdateChoice( wxCommandEvent& event ) { event.Skip(); } - virtual void OnDefault( wxCommandEvent& event ) { event.Skip(); } - virtual void OnApply( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - - - public: - - FilterDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Configure filter"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~FilterDlgGenerated(); - +private: + +protected: + wxStaticBitmap* m_bitmap26; + wxPanel* m_panel8; + wxStaticText* m_staticTexHeader; + wxStaticText* m_staticText44; + wxBitmapButton* m_bpButtonHelp; + wxPanel* m_panel13; + wxStaticLine* m_staticline10; + wxStaticText* m_staticText45; + wxStaticText* m_staticText83; + wxStaticText* m_staticText84; + wxStaticText* m_staticText85; + wxStaticText* m_staticText181; + wxStaticText* m_staticText1811; + wxStaticBitmap* m_bitmapInclude; + wxTextCtrl* m_textCtrlInclude; + wxStaticBitmap* m_bitmapExclude; + wxTextCtrl* m_textCtrlExclude; + wxStaticBitmap* m_bitmapFilterDate; + wxStaticText* m_staticText103; + wxChoice* m_choiceUnitTimespan; + wxSpinCtrl* m_spinCtrlTimespan; + wxStaticBitmap* m_bitmapFilterSize; + wxStaticText* m_staticText101; + wxSpinCtrl* m_spinCtrlMinSize; + wxChoice* m_choiceUnitMinSize; + wxStaticText* m_staticText102; + wxSpinCtrl* m_spinCtrlMaxSize; + wxChoice* m_choiceUnitMaxSize; + wxButton* m_button9; + wxButton* m_button10; + wxButton* m_button17; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnHelp( wxCommandEvent& event ) { event.Skip(); } + virtual void OnUpdateNameFilter( wxCommandEvent& event ) { event.Skip(); } + virtual void OnUpdateChoice( wxCommandEvent& event ) { event.Skip(); } + virtual void OnDefault( wxCommandEvent& event ) { event.Skip(); } + virtual void OnApply( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + +public: + + FilterDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Configure filter"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~FilterDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class CustomizeColsDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class CustomizeColsDlgGenerated : public wxDialog +class CustomizeColsDlgGenerated : public wxDialog { - private: - - protected: - wxCheckListBox* m_checkListColumns; - wxBitmapButton* m_bpButton29; - wxBitmapButton* m_bpButton30; - wxButton* m_button9; - wxButton* m_button28; - wxButton* m_button29; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnMoveUp( wxCommandEvent& event ) { event.Skip(); } - virtual void OnMoveDown( wxCommandEvent& event ) { event.Skip(); } - virtual void OnDefault( wxCommandEvent& event ) { event.Skip(); } - virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - - - public: - - CustomizeColsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Customize columns"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - ~CustomizeColsDlgGenerated(); - +private: + +protected: + wxCheckListBox* m_checkListColumns; + wxBitmapButton* m_bpButton29; + wxBitmapButton* m_bpButton30; + wxButton* m_button9; + wxButton* m_button28; + wxButton* m_button29; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnMoveUp( wxCommandEvent& event ) { event.Skip(); } + virtual void OnMoveDown( wxCommandEvent& event ) { event.Skip(); } + virtual void OnDefault( wxCommandEvent& event ) { event.Skip(); } + virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + +public: + + CustomizeColsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Customize columns"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + ~CustomizeColsDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class GlobalSettingsDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class GlobalSettingsDlgGenerated : public wxDialog +class GlobalSettingsDlgGenerated : public wxDialog { - private: - - protected: - wxStaticBitmap* m_bitmapSettings; - wxPanel* m_panel8; - wxStaticText* m_staticText56; - wxCheckBox* m_checkBoxTransCopy; - wxCheckBox* m_checkBoxCopyLocked; - wxCheckBox* m_checkBoxCopyPermissions; - wxStaticLine* m_staticline10; - wxStaticText* m_staticText100; - wxButtonWithImage* m_buttonResetDialogs; - wxGrid* m_gridCustomCommand; - wxBitmapButton* m_bpButtonAddRow; - wxBitmapButton* m_bpButtonRemoveRow; - wxButton* m_button9; - wxButton* m_buttonOkay; - wxButton* m_button29; - - // 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 OnAddRow( wxCommandEvent& event ) { event.Skip(); } - virtual void OnRemoveRow( wxCommandEvent& event ) { event.Skip(); } - virtual void OnDefault( wxCommandEvent& event ) { event.Skip(); } - virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - - - public: - - GlobalSettingsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Global settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~GlobalSettingsDlgGenerated(); - +private: + +protected: + wxStaticBitmap* m_bitmapSettings; + wxPanel* m_panel8; + wxStaticText* m_staticText56; + wxCheckBox* m_checkBoxTransCopy; + wxCheckBox* m_checkBoxCopyLocked; + wxCheckBox* m_checkBoxCopyPermissions; + wxStaticLine* m_staticline10; + wxStaticText* m_staticText100; + wxButtonWithImage* m_buttonResetDialogs; + wxGrid* m_gridCustomCommand; + wxBitmapButton* m_bpButtonAddRow; + wxBitmapButton* m_bpButtonRemoveRow; + wxButton* m_button9; + wxButton* m_buttonOkay; + wxButton* m_button29; + + // 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 OnAddRow( wxCommandEvent& event ) { event.Skip(); } + virtual void OnRemoveRow( wxCommandEvent& event ) { event.Skip(); } + virtual void OnDefault( wxCommandEvent& event ) { event.Skip(); } + virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + +public: + + GlobalSettingsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Global settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~GlobalSettingsDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class SyncPreviewDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class SyncPreviewDlgGenerated : public wxDialog +class SyncPreviewDlgGenerated : public wxDialog { - private: - - protected: - wxButtonWithImage* m_buttonStartSync; - wxStaticLine* m_staticline16; - wxStaticText* m_staticTextVariant; - wxStaticLine* m_staticline14; - wxStaticText* m_staticText94; - wxStaticBitmap* m_bitmapCreate; - wxTextCtrl* m_textCtrlCreateL; - wxStaticBitmap* m_bitmapUpdate; - wxTextCtrl* m_textCtrlUpdateL; - wxStaticBitmap* m_bitmapDelete; - wxTextCtrl* m_textCtrlDeleteL; - wxStaticText* m_staticText95; - wxTextCtrl* m_textCtrlCreateR; - wxTextCtrl* m_textCtrlUpdateR; - wxTextCtrl* m_textCtrlDeleteR; - wxStaticBitmap* m_bitmapData; - wxTextCtrl* m_textCtrlData; - wxStaticLine* m_staticline12; - wxCheckBox* m_checkBoxDontShowAgain; - wxButton* m_button16; - - // 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: - - SyncPreviewDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Synchronization Preview"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - ~SyncPreviewDlgGenerated(); - +private: + +protected: + wxButtonWithImage* m_buttonStartSync; + wxStaticLine* m_staticline16; + wxStaticText* m_staticTextVariant; + wxStaticLine* m_staticline14; + wxStaticText* m_staticText94; + wxStaticBitmap* m_bitmapCreate; + wxTextCtrl* m_textCtrlCreateL; + wxStaticBitmap* m_bitmapUpdate; + wxTextCtrl* m_textCtrlUpdateL; + wxStaticBitmap* m_bitmapDelete; + wxTextCtrl* m_textCtrlDeleteL; + wxStaticText* m_staticText95; + wxTextCtrl* m_textCtrlCreateR; + wxTextCtrl* m_textCtrlUpdateR; + wxTextCtrl* m_textCtrlDeleteR; + wxStaticBitmap* m_bitmapData; + wxTextCtrl* m_textCtrlData; + wxStaticLine* m_staticline12; + wxCheckBox* m_checkBoxDontShowAgain; + wxButton* m_button16; + + // 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: + + SyncPreviewDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Synchronization Preview"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + ~SyncPreviewDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class PopupFrameGenerated1 /////////////////////////////////////////////////////////////////////////////// -class PopupFrameGenerated1 : public wxFrame +class PopupFrameGenerated1 : public wxFrame { - private: - - protected: - - public: - wxStaticBitmap* m_bitmapLeft; - wxStaticText* m_staticTextMain; - - PopupFrameGenerated1( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxFRAME_NO_TASKBAR|wxSTAY_ON_TOP|wxSTATIC_BORDER ); - - ~PopupFrameGenerated1(); - +private: + +protected: + +public: + wxStaticBitmap* m_bitmapLeft; + wxStaticText* m_staticTextMain; + + PopupFrameGenerated1( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxFRAME_NO_TASKBAR|wxSTAY_ON_TOP|wxSTATIC_BORDER ); + + ~PopupFrameGenerated1(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class SearchDialogGenerated /////////////////////////////////////////////////////////////////////////////// -class SearchDialogGenerated : public wxDialog +class SearchDialogGenerated : public wxDialog { - private: - - protected: - wxStaticText* m_staticText101; - wxTextCtrl* m_textCtrlSearchTxt; - wxCheckBox* m_checkBoxMatchCase; - wxButton* m_buttonFindNext; - wxButton* m_button29; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnText( wxCommandEvent& event ) { event.Skip(); } - virtual void OnFindNext( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - - - public: - - SearchDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Find"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); - ~SearchDialogGenerated(); - +private: + +protected: + wxStaticText* m_staticText101; + wxTextCtrl* m_textCtrlSearchTxt; + wxCheckBox* m_checkBoxMatchCase; + wxButton* m_buttonFindNext; + wxButton* m_button29; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnText( wxCommandEvent& event ) { event.Skip(); } + virtual void OnFindNext( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + +public: + + SearchDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Find"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); + ~SearchDialogGenerated(); + +}; + +/////////////////////////////////////////////////////////////////////////////// +/// Class SelectTimespanDlgGenerated +/////////////////////////////////////////////////////////////////////////////// +class SelectTimespanDlgGenerated : public wxDialog +{ +private: + +protected: + wxCalendarCtrl* m_calendarFrom; + wxCalendarCtrl* m_calendarTo; + wxButton* m_buttonOkay; + wxButton* m_button29; + + // 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(); + }; #endif //__GUI_GENERATED_H__ diff --git a/ui/gui_status_handler.cpp b/ui/gui_status_handler.cpp index c940c76e..252fc80c 100644 --- a/ui/gui_status_handler.cpp +++ b/ui/gui_status_handler.cpp @@ -116,6 +116,13 @@ void CompareStatusHandler::updateProcessedData(int objectsProcessed, zen::Int64 } +void CompareStatusHandler::reportStatus(const wxString& text) +{ + mainDlg.compareStatus->setStatusText_NoUpdate(text); + requestUiRefresh(); //throw AbortThisProcess +} + + void CompareStatusHandler::reportInfo(const wxString& text) { mainDlg.compareStatus->setStatusText_NoUpdate(text); @@ -154,12 +161,9 @@ void CompareStatusHandler::reportFatalError(const wxString& errorMessage) { forceUiRefresh(); - //show message and abort: currently there are no fatal errors during comparison that can be ignored bool dummy = false; showErrorDlg(ReturnErrorDlg::BUTTON_ABORT, errorMessage, dummy); - - abortThisProcess(); } @@ -170,7 +174,7 @@ void CompareStatusHandler::reportWarning(const wxString& warningMessage, bool& w forceUiRefresh(); - //show popup and ask user how to handle warning + //show pop-up and ask user how to handle warning bool dontWarnAgain = false; switch (showWarningDlg(ReturnWarningDlg::BUTTON_IGNORE | ReturnWarningDlg::BUTTON_ABORT, warningMessage, @@ -223,9 +227,9 @@ SyncStatusHandler::~SyncStatusHandler() //finalize error log if (abortIsRequested()) - errorLog.logMsg(_("Synchronization aborted!") + " \n" + _("You may try to synchronize remaining items again (WITHOUT having to re-compare)!"), TYPE_ERROR); + errorLog.logMsg(_("Synchronization aborted!"), TYPE_ERROR); else if (totalErrors > 0) - errorLog.logMsg(_("Synchronization completed with errors!") + " \n" + _("You may try to synchronize remaining items again (WITHOUT having to re-compare)!"), TYPE_WARNING); + errorLog.logMsg(_("Synchronization completed with errors!"), TYPE_WARNING); else errorLog.logMsg(_("Synchronization completed successfully!"), TYPE_INFO); @@ -264,13 +268,18 @@ void SyncStatusHandler::updateProcessedData(int objectsProcessed, zen::Int64 dat } +void SyncStatusHandler::reportStatus(const wxString& text) +{ + syncStatusFrame.setStatusText_NoUpdate(text); //throw () + requestUiRefresh(); //throw AbortThisProccess +} + + void SyncStatusHandler::reportInfo(const wxString& text) { - //if (currentProcess == StatusHandler::PROCESS_SYNCHRONIZING) errorLog.logMsg(text, TYPE_INFO); syncStatusFrame.setStatusText_NoUpdate(text); //throw () - requestUiRefresh(); //throw AbortThisProccess } diff --git a/ui/gui_status_handler.h b/ui/gui_status_handler.h index b7fbd9be..1e86c0cc 100644 --- a/ui/gui_status_handler.h +++ b/ui/gui_status_handler.h @@ -29,6 +29,7 @@ public: virtual void initNewProcess(int objectsTotal, zen::Int64 dataTotal, Process processID); virtual void updateProcessedData(int objectsProcessed, zen::Int64 dataProcessed); + virtual void reportStatus(const wxString& text); virtual void reportInfo(const wxString& text); virtual void forceUiRefresh(); @@ -55,6 +56,7 @@ public: virtual void initNewProcess(int objectsTotal, zen::Int64 dataTotal, Process processID); virtual void updateProcessedData(int objectsProcessed, zen::Int64 dataProcessed); + virtual void reportStatus(const wxString& text); virtual void reportInfo(const wxString& text); virtual void forceUiRefresh(); diff --git a/ui/main_dlg.cpp b/ui/main_dlg.cpp index 3e973d7e..f03fd1f7 100644 --- a/ui/main_dlg.cpp +++ b/ui/main_dlg.cpp @@ -16,10 +16,11 @@ #include <wx/sound.h> #include <wx/display.h> #include <wx/app.h> +#include <wx/dcmemory.h> #include <boost/bind.hpp> +#include "../shared/folder_history_box.h" #include "../library/custom_grid.h" #include "../shared/custom_button.h" -#include "../shared/custom_combo_box.h" #include "../shared/dir_picker_i18n.h" #include "../comparison.h" #include "../synchronization.h" @@ -53,8 +54,10 @@ #include "../library/lock_holder.h" #include "../shared/shell_execute.h" #include "../shared/localization.h" +#include "../shared/image_tools.h" using namespace zen; +using namespace std::rel_ops; namespace @@ -68,19 +71,19 @@ struct wxClientDataString : public wxClientData //we need a wxClientData derived } -class DirectoryNameMainImpl : public DirectoryNameMainDlg +class DirectoryNameMainImpl : public DirectoryName<FolderHistoryBox> { public: DirectoryNameMainImpl(MainDialog& mainDlg, wxWindow& dropWindow1, wxWindow& dropWindow2, wxDirPickerCtrl& dirPicker, - wxComboBox& dirName, + FolderHistoryBox& dirName, wxStaticBoxSizer& staticBox) : - DirectoryNameMainDlg(dropWindow1, dropWindow2, dirPicker, dirName, staticBox), + DirectoryName(dropWindow1, dirPicker, dirName, &staticBox, &dropWindow2), mainDlg_(mainDlg) {} - virtual bool AcceptDrop(const std::vector<wxString>& droppedFiles) + virtual bool acceptDrop(const std::vector<wxString>& droppedFiles) { if (droppedFiles.empty()) return true; @@ -88,14 +91,6 @@ public: switch (xmlAccess::getMergeType(droppedFiles)) //throw () { case xmlAccess::MERGE_BATCH: - if (droppedFiles.size() == 1) - { - if (showSyncBatchDlg(droppedFiles[0]) == ReturnBatchConfig::BATCH_FILE_SAVED) - mainDlg_.pushStatusInformation(_("Batch file created successfully!")); - return false; - } - //fall-through for multiple *.ffs_batch files! - case xmlAccess::MERGE_GUI: case xmlAccess::MERGE_GUI_BATCH: mainDlg_.loadConfiguration(droppedFiles); @@ -106,14 +101,12 @@ public: break; } - //disable the sync button mainDlg_.syncPreview->enableSynchronization(false); //clear grids mainDlg_.gridDataView->clearAllRows(); mainDlg_.updateGuiGrid(); - return true; } @@ -158,12 +151,24 @@ private: return mainDlg.getConfig().mainCfg; } + virtual void OnAltCompCfgChange() + { + mainDlg.applyCompareConfig(false); //false: not global level + } + virtual void OnAltSyncCfgChange() { mainDlg.applySyncConfig(); } + virtual void OnAltCompCfgRemoveConfirm(wxCommandEvent& event) + { + FolderPairPanelBasic<GuiPanel>::OnAltCompCfgRemoveConfirm(event); + mainDlg.applyCompareConfig(false); //false: not global level + } + virtual void OnAltSyncCfgRemoveConfirm(wxCommandEvent& event) + { FolderPairPanelBasic<GuiPanel>::OnAltSyncCfgRemoveConfirm(event); mainDlg.applySyncConfig(); @@ -195,9 +200,13 @@ public: dirNameLeft (*m_panelLeft, *m_dirPickerLeft, *m_directoryLeft), dirNameRight(*m_panelRight, *m_dirPickerRight, *m_directoryRight) {} - void setValues(const wxString& leftDir, const wxString& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter) + void setValues(const wxString& leftDir, + const wxString& rightDir, + AltCompCfgPtr cmpCfg, + AltSyncCfgPtr syncCfg, + const FilterConfig& filter) { - setConfig(syncCfg, filter); + setConfig(cmpCfg, syncCfg, filter); dirNameLeft.setName(leftDir); dirNameRight.setName(rightDir); } @@ -206,8 +215,8 @@ public: private: //support for drag and drop - DirectoryName dirNameLeft; - DirectoryName dirNameRight; + DirectoryName<FolderHistoryBox> dirNameLeft; + DirectoryName<FolderHistoryBox> dirNameRight; }; @@ -231,9 +240,13 @@ public: *mainDialog.m_directoryRight, *mainDialog.sbSizerDirRight) {} - void setValues(const wxString& leftDir, const wxString& rightDir, AltSyncCfgPtr syncCfg, const FilterConfig& filter) + void setValues(const wxString& leftDir, + const wxString& rightDir, + AltCompCfgPtr cmpCfg, + AltSyncCfgPtr syncCfg, + const FilterConfig& filter) { - setConfig(syncCfg, filter); + setConfig(cmpCfg, syncCfg, filter); dirNameLeft.setName(leftDir); dirNameRight.setName(rightDir); } @@ -394,8 +407,6 @@ MainDialog::MainDialog(const xmlAccess::XmlGuiConfig& guiCfg, MainDialog::~MainDialog() { - //keep non-inline destructor for std::auto_ptr to work with forward declaration - cleanUp(true); //do NOT include any other code here! cleanUp() is re-used when switching languages auiMgr.UnInit(); @@ -406,6 +417,12 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig guiCfg, xmlAccess::XmlGlobalSettings& settings, bool startComparison) { + folderHistoryLeft = std::make_shared<FolderHistory>(); //make sure it is always bound + folderHistoryRight = std::make_shared<FolderHistory>(); // + + m_directoryLeft ->init(folderHistoryLeft); + m_directoryRight->init(folderHistoryRight); + wxWindowUpdateLocker dummy(this); //avoid display distortion //--------- avoid mirroring this dialog in RTL languages like Hebrew or Arabic -------------------- @@ -508,35 +525,35 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig guiCfg, setConfig(guiCfg); //set icons for this dialog - m_buttonCompare->setBitmapFront(GlobalResources::instance().getImage(wxT("compare"))); - m_bpButtonSyncConfig->SetBitmapLabel(GlobalResources::instance().getImage(wxT("syncConfig"))); - m_bpButtonCmpConfig->SetBitmapLabel(GlobalResources::instance().getImage(wxT("cmpConfig"))); - m_bpButtonSave->SetBitmapLabel(GlobalResources::instance().getImage(wxT("save"))); - m_bpButtonLoad->SetBitmapLabel(GlobalResources::instance().getImage(wxT("load"))); - m_bpButtonAddPair->SetBitmapLabel(GlobalResources::instance().getImage(wxT("addFolderPair"))); - m_bitmap15->SetBitmap(GlobalResources::instance().getImage(wxT("statusEdge"))); - - m_bitmapCreate->SetBitmap(GlobalResources::instance().getImage(wxT("create"))); - m_bitmapUpdate->SetBitmap(GlobalResources::instance().getImage(wxT("update"))); - m_bitmapDelete->SetBitmap(GlobalResources::instance().getImage(wxT("delete"))); - m_bitmapData ->SetBitmap(GlobalResources::instance().getImage(wxT("data"))); + m_buttonCompare->setBitmapFront(GlobalResources::getImage(wxT("compare"))); + m_bpButtonSyncConfig->SetBitmapLabel(GlobalResources::getImage(wxT("syncConfig"))); + m_bpButtonCmpConfig->SetBitmapLabel(GlobalResources::getImage(wxT("cmpConfig"))); + m_bpButtonSave->SetBitmapLabel(GlobalResources::getImage(wxT("save"))); + m_bpButtonLoad->SetBitmapLabel(GlobalResources::getImage(wxT("load"))); + m_bpButtonAddPair->SetBitmapLabel(GlobalResources::getImage(wxT("addFolderPair"))); + m_bitmap15->SetBitmap(GlobalResources::getImage(wxT("statusEdge"))); + + m_bitmapCreate->SetBitmap(GlobalResources::getImage(wxT("create"))); + m_bitmapUpdate->SetBitmap(GlobalResources::getImage(wxT("update"))); + m_bitmapDelete->SetBitmap(GlobalResources::getImage(wxT("delete"))); + m_bitmapData ->SetBitmap(GlobalResources::getImage(wxT("data"))); m_panelTopButtons->Layout(); //wxButtonWithImage size might have changed //menu icons: workaround for wxWidgets: small hack to update menu items: actually this is a wxWidgets bug (affects Windows- and Linux-build) MenuItemUpdater updateMenuFile(m_menuFile); - updateMenuFile.addForUpdate(m_menuItem10, GlobalResources::instance().getImage(wxT("compareSmall"))); - updateMenuFile.addForUpdate(m_menuItem11, GlobalResources::instance().getImage(wxT("syncSmall"))); - updateMenuFile.addForUpdate(m_menuItemNew, GlobalResources::instance().getImage(wxT("newSmall"))); - updateMenuFile.addForUpdate(m_menuItemSave, GlobalResources::instance().getImage(wxT("saveSmall"))); - updateMenuFile.addForUpdate(m_menuItemLoad, GlobalResources::instance().getImage(wxT("loadSmall"))); + updateMenuFile.addForUpdate(m_menuItem10, GlobalResources::getImage(wxT("compareSmall"))); + updateMenuFile.addForUpdate(m_menuItem11, GlobalResources::getImage(wxT("syncSmall"))); + updateMenuFile.addForUpdate(m_menuItemNew, GlobalResources::getImage(wxT("newSmall"))); + updateMenuFile.addForUpdate(m_menuItemSave, GlobalResources::getImage(wxT("saveSmall"))); + updateMenuFile.addForUpdate(m_menuItemLoad, GlobalResources::getImage(wxT("loadSmall"))); MenuItemUpdater updateMenuAdv(m_menuAdvanced); - updateMenuAdv.addForUpdate(m_menuItemGlobSett, GlobalResources::instance().getImage(wxT("settingsSmall"))); - updateMenuAdv.addForUpdate(m_menuItem7, GlobalResources::instance().getImage(wxT("batchSmall"))); + updateMenuAdv.addForUpdate(m_menuItemGlobSett, GlobalResources::getImage(wxT("settingsSmall"))); + updateMenuAdv.addForUpdate(m_menuItem7, GlobalResources::getImage(wxT("batchSmall"))); MenuItemUpdater updateMenuHelp(m_menuHelp); - updateMenuHelp.addForUpdate(m_menuItemAbout, GlobalResources::instance().getImage(wxT("aboutSmall"))); + updateMenuHelp.addForUpdate(m_menuItemAbout, GlobalResources::getImage(wxT("aboutSmall"))); #ifdef FFS_LINUX if (!zen::isPortableVersion()) //disable update check for Linux installer-based version -> handled by .deb @@ -548,7 +565,7 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig guiCfg, [&](const zen::ExistingTranslations::Entry& entry) { wxMenuItem* newItem = new wxMenuItem(m_menuLanguages, wxID_ANY, entry.languageName, wxEmptyString, wxITEM_NORMAL ); - newItem->SetBitmap(GlobalResources::instance().getImage(entry.languageFlag)); + newItem->SetBitmap(GlobalResources::getImage(entry.languageFlag)); //map menu item IDs with language IDs: evaluated when processing event handler languageMenuItemMap.insert(std::map<MenuItemID, LanguageID>::value_type(newItem->GetId(), entry.languageID)); @@ -609,6 +626,8 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig guiCfg, //asynchronous call to wxWindow::Layout(): fix superfluous frame on right and bottom when FFS is started in fullscreen mode Connect(wxEVT_IDLE, wxIdleEventHandler(MainDialog::OnLayoutWindowAsync), NULL, this); + wxCommandEvent evtDummy; //call once before OnLayoutWindowAsync() + OnResizeFolderPairs(evtDummy); // //---------------------------------------------------------------------------------------------------------------------------------------------------------------- //some convenience: if FFS is started with a *.ffs_gui file as commandline parameter AND all directories contained exist, comparison shall be started right off @@ -680,7 +699,7 @@ void MainDialog::readGlobalSettings() //set column attributes - m_gridLeft->setColumnAttributes(globalSettings->gui.columnAttribLeft); + m_gridLeft ->setColumnAttributes(globalSettings->gui.columnAttribLeft); m_gridRight->setColumnAttributes(globalSettings->gui.columnAttribRight); //load list of last used configuration files @@ -689,17 +708,28 @@ void MainDialog::readGlobalSettings() addFileToCfgHistory(cfgFileNames); //load list of last used folders - std::for_each(globalSettings->gui.folderHistoryLeft.rbegin(), - globalSettings->gui.folderHistoryLeft.rend(), - boost::bind(&MainDialog::addLeftFolderToHistory, this, _1)); - - std::for_each(globalSettings->gui.folderHistoryRight.rbegin(), - globalSettings->gui.folderHistoryRight.rend(), - boost::bind(&MainDialog::addRightFolderToHistory, this, _1)); + *folderHistoryLeft = FolderHistory(globalSettings->gui.folderHistoryLeft, globalSettings->gui.folderHistMax); + *folderHistoryRight = FolderHistory(globalSettings->gui.folderHistoryRight, globalSettings->gui.folderHistMax); //show/hide file icons - m_gridLeft->enableFileIcons(globalSettings->gui.showFileIconsLeft); - m_gridRight->enableFileIcons(globalSettings->gui.showFileIconsRight); + const IconBuffer::IconSize sz = [&]() -> IconBuffer::IconSize + { + switch (globalSettings->gui.iconSize) + { + case xmlAccess::ICON_SIZE_SMALL: + return IconBuffer::SIZE_SMALL; + case xmlAccess::ICON_SIZE_MEDIUM: + return IconBuffer::SIZE_MEDIUM; + case xmlAccess::ICON_SIZE_LARGE: + return IconBuffer::SIZE_LARGE; + } + return IconBuffer::SIZE_SMALL; + }(); + + std::shared_ptr<IconBuffer> iconBuffer = std::make_shared<IconBuffer>(sz); + m_gridLeft ->setIconManager(iconBuffer); + m_gridMiddle->setIconManager(iconBuffer); + m_gridRight ->setIconManager(iconBuffer); //------------------------------------------------------------------------------------------------ //wxAuiManager erroneously loads panel captions, we don't want that @@ -737,15 +767,8 @@ void MainDialog::writeGlobalSettings() globalSettings->gui.lastUsedConfigFiles = activeConfigFiles; //write list of last used folders - globalSettings->gui.folderHistoryLeft.clear(); - const wxArrayString leftFolderHistory = m_directoryLeft->GetStrings(); - for (unsigned i = 0; i < leftFolderHistory.GetCount(); ++i) - globalSettings->gui.folderHistoryLeft.push_back(leftFolderHistory[i]); - - globalSettings->gui.folderHistoryRight.clear(); - const wxArrayString rightFolderHistory = m_directoryRight->GetStrings(); - for (unsigned i = 0; i < rightFolderHistory.GetCount(); ++i) - globalSettings->gui.folderHistoryRight.push_back(rightFolderHistory[i]); + globalSettings->gui.folderHistoryLeft = folderHistoryLeft ->getList(); + globalSettings->gui.folderHistoryRight = folderHistoryRight->getList(); globalSettings->gui.guiPerspectiveLast = auiMgr.SavePerspective(); } @@ -1007,9 +1030,10 @@ void MainDialog::deleteSelectedFiles(const std::set<size_t>& viewSelectionLeft, //handle errors when deleting files/folders ManualDeletionHandler statusHandler(this); - zen::deleteFromGridAndHD(gridDataView->getDataTentative(), - compRefLeft, + zen::deleteFromGridAndHD(compRefLeft, compRefRight, + gridDataView->getDataTentative(), + extractDirectionCfg(getConfig().mainCfg), globalSettings->gui.deleteOnBothSides, globalSettings->gui.useRecyclerForManualDeletion, statusHandler); @@ -1176,7 +1200,7 @@ void MainDialog::disableAllElements(bool enableAbort) //show abort button m_buttonAbort->Enable(); m_buttonAbort->Show(); - m_buttonAbort->SetFocus(); + if (m_buttonAbort->IsShownOnScreen()) m_buttonAbort->SetFocus(); m_buttonCompare->Disable(); m_buttonCompare->Hide(); m_bpButtonCmpConfig ->Disable(); @@ -1293,8 +1317,12 @@ void MainDialog::OnResizeFolderPairs(wxEvent& event) { //adapt left-shift display distortion caused by scrollbars for multiple folder pairs const int width = m_panelTopLeft->GetSize().GetWidth(); - for (std::vector<DirectoryPair*>::iterator i = additionalFolderPairs.begin(); i != additionalFolderPairs.end(); ++i) - (*i)->m_panelLeft->SetMinSize(wxSize(width, -1)); + std::for_each(additionalFolderPairs.begin(), additionalFolderPairs.end(), + [&](DirectoryPair* dirPair) + { + dirPair->m_panelLeft->SetMinSize(wxSize(width, -1)); + + }); event.Skip(); } @@ -1635,6 +1663,14 @@ struct SelectedExtension : public wxObject Zstring extension; }; + +struct CtxtSelectionIconSize : public wxObject +{ + CtxtSelectionIconSize(xmlAccess::FileIconSize sz) : iconSize(sz) {} + xmlAccess::FileIconSize iconSize; +}; + + typedef std::vector<std::pair<Zstring, bool> > FilterObjList; //relative name |-> "is directory flag" struct FilterObjContainer : public wxObject @@ -1694,21 +1730,21 @@ void MainDialog::OnContextRim(wxGridEvent& event) //CONTEXT_SYNC_DIR_LEFT wxMenuItem* menuItemSyncDirLeft = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Set direction:")) + wxT(" <-") + wxT("\tAlt - Left")); //Linux needs a direction, "<-", because it has no context menu icons! - menuItemSyncDirLeft->SetBitmap(getSyncOpImage(fsObj->testSyncOperation(true, SYNC_DIR_LEFT))); + menuItemSyncDirLeft->SetBitmap(getSyncOpImage(fsObj->testSyncOperation(SYNC_DIR_LEFT))); contextMenu->Append(menuItemSyncDirLeft); contextMenu->Connect(menuItemSyncDirLeft->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextSyncDirLeft), NULL, this); //CONTEXT_SYNC_DIR_NONE wxMenuItem* menuItemSyncDirNone = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Set direction:")) + wxT(" -") + wxT("\tAlt - Up")); - menuItemSyncDirNone->SetBitmap(getSyncOpImage(fsObj->testSyncOperation(true, SYNC_DIR_NONE))); + menuItemSyncDirNone->SetBitmap(getSyncOpImage(fsObj->testSyncOperation(SYNC_DIR_NONE))); contextMenu->Append(menuItemSyncDirNone); contextMenu->Connect(menuItemSyncDirNone->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextSyncDirNone), NULL, this); //CONTEXT_SYNC_DIR_RIGHT wxMenuItem* menuItemSyncDirRight = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Set direction:")) + wxT(" ->") + wxT("\tAlt - Right")); - menuItemSyncDirRight->SetBitmap(getSyncOpImage(fsObj->testSyncOperation(true, SYNC_DIR_RIGHT))); + menuItemSyncDirRight->SetBitmap(getSyncOpImage(fsObj->testSyncOperation(SYNC_DIR_RIGHT))); contextMenu->Append(menuItemSyncDirRight); contextMenu->Connect(menuItemSyncDirRight->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextSyncDirRight), NULL, this); @@ -1723,12 +1759,12 @@ void MainDialog::OnContextRim(wxGridEvent& event) if (fsObj->isActive()) { menuItemInExcl = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Exclude temporarily")) + wxT("\tSpace")); - menuItemInExcl->SetBitmap(GlobalResources::instance().getImage(wxT("checkboxFalse"))); + menuItemInExcl->SetBitmap(GlobalResources::getImage(wxT("checkboxFalse"))); } else { menuItemInExcl = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Include temporarily")) + wxT("\tSpace")); - menuItemInExcl->SetBitmap(GlobalResources::instance().getImage(wxT("checkboxTrue"))); + menuItemInExcl->SetBitmap(GlobalResources::getImage(wxT("checkboxTrue"))); } contextMenu->Append(menuItemInExcl); @@ -1787,7 +1823,7 @@ void MainDialog::OnContextRim(wxGridEvent& event) //add context menu item wxMenuItem* menuItemExclExt = new wxMenuItem(contextMenu.get(), wxID_ANY, wxString(_("Exclude via filter:")) + " " + "*." + extension); - menuItemExclExt->SetBitmap(GlobalResources::instance().getImage(wxT("filterSmall"))); + menuItemExclExt->SetBitmap(GlobalResources::getImage(wxT("filterSmall"))); contextMenu->Append(menuItemExclExt); //connect event @@ -1809,7 +1845,7 @@ void MainDialog::OnContextRim(wxGridEvent& event) if (menuItemExclObj != NULL) { - menuItemExclObj->SetBitmap(GlobalResources::instance().getImage(wxT("filterSmall"))); + menuItemExclObj->SetBitmap(GlobalResources::getImage(wxT("filterSmall"))); contextMenu->Append(menuItemExclObj); //connect event @@ -1891,7 +1927,7 @@ void MainDialog::OnContextExcludeExtension(wxCommandEvent& event) updateFilterButtons(); //do not fully apply filter, just exclude new items - std::for_each(gridDataView->getDataTentative().begin(), gridDataView->getDataTentative().end(), + std::for_each(begin(gridDataView->getDataTentative()), end(gridDataView->getDataTentative()), [&](BaseDirMapping& baseMap) { addHardFiltering(baseMap, newExclude); }); //applyFiltering(getConfig().mainCfg, gridDataView->getDataTentative()); @@ -1899,8 +1935,8 @@ void MainDialog::OnContextExcludeExtension(wxCommandEvent& event) if (currentCfg.hideFilteredElements) { - m_gridLeft-> ClearSelection(); - m_gridRight-> ClearSelection(); + m_gridLeft ->ClearSelection(); + m_gridRight ->ClearSelection(); m_gridMiddle->ClearSelection(); } } @@ -1934,7 +1970,7 @@ void MainDialog::OnContextExcludeObject(wxCommandEvent& event) updateFilterButtons(); //do not fully apply filter, just exclude new items - std::for_each(gridDataView->getDataTentative().begin(), gridDataView->getDataTentative().end(), + std::for_each(begin(gridDataView->getDataTentative()), end(gridDataView->getDataTentative()), [&](BaseDirMapping& baseMap) { addHardFiltering(baseMap, newExclude); }); //applyFiltering(getConfig().mainCfg, gridDataView->getDataTentative()); @@ -1942,8 +1978,8 @@ void MainDialog::OnContextExcludeObject(wxCommandEvent& event) if (currentCfg.hideFilteredElements) { - m_gridLeft->ClearSelection(); - m_gridRight->ClearSelection(); + m_gridLeft ->ClearSelection(); + m_gridRight ->ClearSelection(); m_gridMiddle->ClearSelection(); } } @@ -2001,6 +2037,13 @@ void MainDialog::OnContextRimLabelLeft(wxGridEvent& event) contextMenu->Append(menuItemCustomize); contextMenu->Connect(menuItemCustomize->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextCustColumnLeft), NULL, this); + if (m_gridLeft->getTypeAtPos(event.GetCol()) == xmlAccess::DATE) + { + wxMenuItem* menuItemSelectTs = new wxMenuItem(contextMenu.get(), wxID_ANY, _("Select time span...")); + contextMenu->Append(menuItemSelectTs); + contextMenu->Connect(menuItemSelectTs->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextSelectTimeSpan), NULL, this); + } + contextMenu->AppendSeparator(); wxMenuItem* itemAutoAdjust = new wxMenuItem(contextMenu.get(), wxID_ANY, _("Auto-adjust columns"), wxEmptyString, wxITEM_CHECK); @@ -2008,6 +2051,28 @@ void MainDialog::OnContextRimLabelLeft(wxGridEvent& event) itemAutoAdjust->Check(globalSettings->gui.autoAdjustColumnsLeft); contextMenu->Connect(itemAutoAdjust->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextAutoAdjustLeft), NULL, this); + //if (m_gridLeft->getTypeAtPos(event.GetCol()) == xmlAccess::FILENAME) + { + contextMenu->AppendSeparator(); + + wxMenuItem* header = contextMenu->Append(wxID_ANY, _("Icon size:")); + header->Enable(false); + + auto addSizeEntry = [&](const wxString& label, xmlAccess::FileIconSize sz) + { + wxMenuItem* newItem = contextMenu->Append(wxID_ANY, label, wxEmptyString, wxITEM_RADIO); + contextMenu->Connect(newItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextSetIconSize), + new CtxtSelectionIconSize(sz), //ownership passed! + this); + + if (globalSettings->gui.iconSize == sz) + newItem->Check(); + }; + addSizeEntry(_("Small" ), xmlAccess::ICON_SIZE_SMALL); + addSizeEntry(_("Medium"), xmlAccess::ICON_SIZE_MEDIUM); + addSizeEntry(_("Large" ), xmlAccess::ICON_SIZE_LARGE); + } + PopupMenu(contextMenu.get()); //show context menu } @@ -2020,6 +2085,13 @@ void MainDialog::OnContextRimLabelRight(wxGridEvent& event) contextMenu->Append(menuItemCustomize); contextMenu->Connect(menuItemCustomize->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextCustColumnRight), NULL, this); + if (m_gridRight->getTypeAtPos(event.GetCol()) == xmlAccess::DATE) + { + wxMenuItem* menuItemSelectTs = new wxMenuItem(contextMenu.get(), wxID_ANY, _("Select time span...")); + contextMenu->Append(menuItemSelectTs); + contextMenu->Connect(menuItemSelectTs->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextSelectTimeSpan), NULL, this); + } + contextMenu->AppendSeparator(); wxMenuItem* itemAutoAdjust = new wxMenuItem(contextMenu.get(), wxID_ANY, _("Auto-adjust columns"), wxEmptyString, wxITEM_CHECK); @@ -2027,6 +2099,27 @@ void MainDialog::OnContextRimLabelRight(wxGridEvent& event) itemAutoAdjust->Check(globalSettings->gui.autoAdjustColumnsRight); contextMenu->Connect(itemAutoAdjust->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextAutoAdjustRight), NULL, this); + //if (m_gridRight->getTypeAtPos(event.GetCol()) == xmlAccess::FILENAME) + { + contextMenu->AppendSeparator(); + + wxMenuItem* header = contextMenu->Append(wxID_ANY, _("Icon size:")); + header->Enable(false); + + auto addSizeEntry = [&](const wxString& label, xmlAccess::FileIconSize sz) + { + wxMenuItem* newItem = contextMenu->Append(wxID_ANY, label, wxEmptyString, wxITEM_RADIO); + contextMenu->Connect(newItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextSetIconSize), + new CtxtSelectionIconSize(sz), //ownership passed! + this); + if (globalSettings->gui.iconSize == sz) + newItem->Check(); + }; + addSizeEntry(_("Small" ), xmlAccess::ICON_SIZE_SMALL); + addSizeEntry(_("Medium"), xmlAccess::ICON_SIZE_MEDIUM); + addSizeEntry(_("Large" ), xmlAccess::ICON_SIZE_LARGE); + } + PopupMenu(contextMenu.get()); //show context menu } @@ -2061,6 +2154,16 @@ void MainDialog::OnContextCustColumnRight(wxCommandEvent& event) } +void MainDialog::OnContextSelectTimeSpan(wxCommandEvent& event) +{ + if (showSelectTimespanDlg(manualTimeSpanFrom, manualTimeSpanTo) == ReturnSmallDlg::BUTTON_OKAY) + { + applyTimeSpanFilter(gridDataView->getDataTentative(), manualTimeSpanFrom, manualTimeSpanTo); //overwrite current active/inactive settings + refreshGridAfterFilterChange(400); + } +} + + void MainDialog::OnContextAutoAdjustLeft(wxCommandEvent& event) { globalSettings->gui.autoAdjustColumnsLeft = !globalSettings->gui.autoAdjustColumnsLeft; @@ -2075,6 +2178,36 @@ void MainDialog::OnContextAutoAdjustRight(wxCommandEvent& event) } +void MainDialog::OnContextSetIconSize(wxCommandEvent& event) +{ + CtxtSelectionIconSize* sizeObj = dynamic_cast<CtxtSelectionIconSize*>(event.m_callbackUserData); + if (sizeObj) + { + globalSettings->gui.iconSize = sizeObj->iconSize; + + const IconBuffer::IconSize sz = [&]() -> IconBuffer::IconSize + { + switch (globalSettings->gui.iconSize) + { + case xmlAccess::ICON_SIZE_SMALL: + return IconBuffer::SIZE_SMALL; + case xmlAccess::ICON_SIZE_MEDIUM: + return IconBuffer::SIZE_MEDIUM; + case xmlAccess::ICON_SIZE_LARGE: + return IconBuffer::SIZE_LARGE; + } + return IconBuffer::SIZE_SMALL; + }(); + + std::shared_ptr<IconBuffer> iconBuffer = std::make_shared<IconBuffer>(sz); + + m_gridLeft ->setIconManager(iconBuffer); + m_gridMiddle->setIconManager(iconBuffer); + m_gridRight ->setIconManager(iconBuffer); + } +} + + void MainDialog::OnContextMiddle(wxGridEvent& event) { contextMenu.reset(new wxMenu); //re-create context menu @@ -2106,9 +2239,9 @@ void MainDialog::OnContextMiddleLabel(wxGridEvent& event) contextMenu->Connect(itemCmpResult->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnContextComparisonView), NULL, this); if (syncPreview->previewIsEnabled()) - itemSyncPreview->SetBitmap(GlobalResources::instance().getImage(wxT("syncViewSmall"))); + itemSyncPreview->SetBitmap(GlobalResources::getImage(wxT("syncViewSmall"))); else - itemCmpResult->SetBitmap(GlobalResources::instance().getImage(wxT("cmpViewSmall"))); + itemCmpResult->SetBitmap(GlobalResources::getImage(wxT("cmpViewSmall"))); contextMenu->Append(itemCmpResult); contextMenu->Append(itemSyncPreview); @@ -2208,7 +2341,7 @@ void MainDialog::OnContextSelectCompVariant(wxMouseEvent& event) { contextMenu.reset(new wxMenu); //re-create context menu - wxMenuItem* itemSizeDate = new wxMenuItem(contextMenu.get(), wxID_ANY, _("File size and date"), L"", wxITEM_RADIO); + wxMenuItem* itemSizeDate = new wxMenuItem(contextMenu.get(), wxID_ANY, _("File time and size"), L"", wxITEM_RADIO); contextMenu->Append(itemSizeDate); contextMenu->Connect(itemSizeDate->GetId(), wxEVT_COMMAND_MENU_SELECTED, @@ -2227,7 +2360,7 @@ void MainDialog::OnContextSelectCompVariant(wxMouseEvent& event) //--------------------------------------------------------------- xmlAccess::XmlGuiConfig cfg = getConfig(); - switch (cfg.mainCfg.compareVar) + switch (cfg.mainCfg.cmpConfig.compareVar) { case CMP_BY_TIME_SIZE: itemSizeDate->Check(); @@ -2243,8 +2376,8 @@ void MainDialog::OnContextSelectCompVariant(wxMouseEvent& event) struct CtxtSelectionSyncVar : public wxObject { - CtxtSelectionSyncVar(SyncConfig::Variant var) : syncVar(var) {} - SyncConfig::Variant syncVar; + CtxtSelectionSyncVar(DirectionConfig::Variant var) : syncVar(var) {} + DirectionConfig::Variant syncVar; }; @@ -2257,7 +2390,7 @@ void MainDialog::OnContextSelectSyncVariant(wxMouseEvent& event) contextMenu->Connect(itemAuto->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnSetSyncVariant), - new CtxtSelectionSyncVar(SyncConfig::AUTOMATIC), //ownership passed! + new CtxtSelectionSyncVar(DirectionConfig::AUTOMATIC), //ownership passed! this); wxMenuItem* itemMirror = new wxMenuItem(contextMenu.get(), wxID_ANY, _("Mirror ->>"), L"", wxITEM_RADIO); @@ -2265,7 +2398,7 @@ void MainDialog::OnContextSelectSyncVariant(wxMouseEvent& event) contextMenu->Connect(itemMirror->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnSetSyncVariant), - new CtxtSelectionSyncVar(SyncConfig::MIRROR), //ownership passed! + new CtxtSelectionSyncVar(DirectionConfig::MIRROR), //ownership passed! this); wxMenuItem* itemUpdate = new wxMenuItem(contextMenu.get(), wxID_ANY, _("Update ->"), L"", wxITEM_RADIO); @@ -2273,7 +2406,7 @@ void MainDialog::OnContextSelectSyncVariant(wxMouseEvent& event) contextMenu->Connect(itemUpdate->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnSetSyncVariant), - new CtxtSelectionSyncVar(SyncConfig::UPDATE), //ownership passed! + new CtxtSelectionSyncVar(DirectionConfig::UPDATE), //ownership passed! this); wxMenuItem* itemCustom = new wxMenuItem(contextMenu.get(), wxID_ANY, _("Custom"), L"", wxITEM_RADIO); @@ -2281,24 +2414,24 @@ void MainDialog::OnContextSelectSyncVariant(wxMouseEvent& event) contextMenu->Connect(itemCustom->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MainDialog::OnSetSyncVariant), - new CtxtSelectionSyncVar(SyncConfig::CUSTOM), //ownership passed! + new CtxtSelectionSyncVar(DirectionConfig::CUSTOM), //ownership passed! this); //--------------------------------------------------------------- xmlAccess::XmlGuiConfig cfg = getConfig(); - switch (cfg.mainCfg.syncConfiguration.var) + switch (cfg.mainCfg.syncCfg.directionCfg.var) { - case SyncConfig::AUTOMATIC: + case DirectionConfig::AUTOMATIC: itemAuto->Check(); break; - case SyncConfig::MIRROR: + case DirectionConfig::MIRROR: itemMirror->Check(); break; - case SyncConfig::UPDATE: + case DirectionConfig::UPDATE: itemUpdate->Check(); break; - case SyncConfig::CUSTOM: + case DirectionConfig::CUSTOM: itemCustom->Check(); break; } @@ -2312,7 +2445,7 @@ void MainDialog::OnSetCompVariant(wxCommandEvent& event) CtxtSelectionCmpVar* selection = dynamic_cast<CtxtSelectionCmpVar*>(event.m_callbackUserData); if (selection) { - currentCfg.mainCfg.compareVar = selection->compareVar; + currentCfg.mainCfg.cmpConfig.compareVar = selection->compareVar; applyCompareConfig(); } } @@ -2323,7 +2456,7 @@ void MainDialog::OnSetSyncVariant(wxCommandEvent& event) CtxtSelectionSyncVar* selection = dynamic_cast<CtxtSelectionSyncVar*>(event.m_callbackUserData); if (selection) { - currentCfg.mainCfg.syncConfiguration.var = selection->syncVar; + currentCfg.mainCfg.syncCfg.directionCfg.var = selection->syncVar; applySyncConfig(); } } @@ -2412,18 +2545,6 @@ void MainDialog::addFileToCfgHistory(const std::vector<wxString>& filenames) } -void MainDialog::addLeftFolderToHistory(const wxString& leftFolder) -{ - m_directoryLeft->addPairToFolderHistory(leftFolder, globalSettings->gui.folderHistMax); -} - - -void MainDialog::addRightFolderToHistory(const wxString& rightFolder) -{ - m_directoryRight->addPairToFolderHistory(rightFolder, globalSettings->gui.folderHistMax); -} - - void MainDialog::OnSaveConfig(wxCommandEvent& event) { trySaveConfig(); @@ -2525,12 +2646,14 @@ void MainDialog::OnLoadFromHistory(wxCommandEvent& event) bool MainDialog::saveOldConfig() //return false on user abort { - //notify user about changed settings - if (globalSettings->optDialogs.popupOnConfigChange && - //only if check is active and non-default config file loaded - (activeConfigFiles.size() != 1 || activeConfigFiles[0] != lastRunConfigName())) + if (lastConfigurationSaved != getConfig()) { - if (lastConfigurationSaved != getConfig()) + //notify user about changed settings + if (!globalSettings->optDialogs.popupOnConfigChange) + //discard current config selection, this ensures next app start will load <last session> instead of the original non-modified config selection + setLastUsedConfig(std::vector<wxString>(), getConfig()); + else if (!activeConfigFiles.empty() && //only if check is active and non-default config file loaded + (activeConfigFiles.size() != 1 || activeConfigFiles[0] != lastRunConfigName())) { bool dontShowAgain = !globalSettings->optDialogs.popupOnConfigChange; @@ -2670,18 +2793,15 @@ void MainDialog::OnClose(wxCloseEvent& event) void MainDialog::OnCheckRows(FFSCheckRowsEvent& event) { - const int lowerBound = std::min(event.rowFrom, event.rowTo); - const int upperBound = std::max(event.rowFrom, event.rowTo); + const int lowerBound = std::max(std::min(event.rowFrom, event.rowTo), 0); + const int upperBound = std::min(std::max(event.rowFrom, event.rowTo), static_cast<int>(gridDataView->rowsOnView()) - 1); - if (0 <= lowerBound) - { - std::set<size_t> selectedRowsOnView; - - for (int i = lowerBound; i <= std::min(upperBound, int(gridDataView->rowsOnView()) - 1); ++i) - selectedRowsOnView.insert(i); + std::set<size_t> selectedRowsOnView; + for (int i = lowerBound; i <= upperBound; ++i) + selectedRowsOnView.insert(i); + if (!selectedRowsOnView.empty()) filterRangeManually(selectedRowsOnView, event.rowFrom); - } } @@ -2751,11 +2871,12 @@ void MainDialog::setConfig(const xmlAccess::XmlGuiConfig& newGuiCfg) //set first folder pair firstFolderPair->setValues(toWx(currentCfg.mainCfg.firstPair.leftDirectory), toWx(currentCfg.mainCfg.firstPair.rightDirectory), + currentCfg.mainCfg.firstPair.altCmpConfig, currentCfg.mainCfg.firstPair.altSyncConfig, currentCfg.mainCfg.firstPair.localFilter); - addLeftFolderToHistory( toWx(currentCfg.mainCfg.firstPair.leftDirectory)); //another hack: wxCombobox::Insert() asynchronously sends message - addRightFolderToHistory(toWx(currentCfg.mainCfg.firstPair.rightDirectory)); //overwriting a later wxCombobox::SetValue()!!! :( + folderHistoryLeft->addItem(currentCfg.mainCfg.firstPair.leftDirectory); + folderHistoryRight->addItem(currentCfg.mainCfg.firstPair.rightDirectory); //clear existing additional folder pairs clearAddFolderPairs(); @@ -2771,7 +2892,7 @@ void MainDialog::setConfig(const xmlAccess::XmlGuiConfig& newGuiCfg) //########################################################### //update compare variant name - m_staticTextCmpVariant->SetLabel(wxString(wxT("(")) + getVariantName(currentCfg.mainCfg.compareVar) + wxT(")")); + m_staticTextCmpVariant->SetLabel(wxString(wxT("(")) + currentCfg.mainCfg.getCompVariantName() + wxT(")")); //update sync variant name m_staticTextSyncVariant->SetLabel(wxString(wxT("(")) + currentCfg.mainCfg.getSyncVariantName() + wxT(")")); @@ -2784,6 +2905,7 @@ FolderPairEnh getEnhancedPair(const DirectoryPair* panel) { return FolderPairEnh(toZ(panel->getLeftDir()), toZ(panel->getRightDir()), + panel->getAltCompConfig(), panel->getAltSyncConfig(), panel->getAltFilterConfig()); } @@ -2798,6 +2920,7 @@ xmlAccess::XmlGuiConfig MainDialog::getConfig() const //first folder pair guiCfg.mainCfg.firstPair = FolderPairEnh(toZ(firstFolderPair->getLeftDir()), toZ(firstFolderPair->getRightDir()), + firstFolderPair->getAltCompConfig(), firstFolderPair->getAltSyncConfig(), firstFolderPair->getAltFilterConfig()); @@ -2826,9 +2949,10 @@ void MainDialog::refreshGridAfterFilterChange(int delay) m_gridLeft ->ForceRefresh(); m_gridMiddle->ForceRefresh(); m_gridRight ->ForceRefresh(); - //m_gridLeft ->Update(); // - //m_gridMiddle->Update(); //show changes resulting from ForceRefresh() - //m_gridRight ->Update(); // + + m_gridLeft ->Update(); // + m_gridMiddle->Update(); //show changes resulting from ForceRefresh() - required for last, possibly half-visible, row only + m_gridRight ->Update(); // if (currentCfg.hideFilteredElements) { @@ -2993,78 +3117,97 @@ void MainDialog::OnSyncDirNone(wxCommandEvent& event) } +inline +wxBitmap buttonPressed(const std::string& name) +{ + wxBitmap background = GlobalResources::getImage(wxT("buttonPressed")); + return layOver(GlobalResources::getImage(utf8CvrtTo<wxString>(name)), background); +} + + +inline +wxBitmap buttonReleased(const std::string& name) +{ + wxImage output = GlobalResources::getImage(utf8CvrtTo<wxString>(name)).ConvertToImage().ConvertToGreyscale(1.0/3, 1.0/3, 1.0/3); //treat all channels equally! + zen::move(output, 0, -1); //move image right one pixel + + brighten(output, 80); + return output; +} + + void MainDialog::initViewFilterButtons() { //compare result buttons - m_bpButtonLeftOnly->init(GlobalResources::instance().getImage(wxT("leftOnlyAct")), + m_bpButtonLeftOnly->init(buttonPressed("leftOnly"), _("Hide files that exist on left side only"), - GlobalResources::instance().getImage(wxT("leftOnlyDeact")), + buttonReleased("leftOnly"), _("Show files that exist on left side only")); - m_bpButtonRightOnly->init(GlobalResources::instance().getImage(wxT("rightOnlyAct")), + m_bpButtonRightOnly->init(buttonPressed("rightOnly"), _("Hide files that exist on right side only"), - GlobalResources::instance().getImage(wxT("rightOnlyDeact")), + buttonReleased("rightOnly"), _("Show files that exist on right side only")); - m_bpButtonLeftNewer->init(GlobalResources::instance().getImage(wxT("leftNewerAct")), + m_bpButtonLeftNewer->init(buttonPressed("leftNewer"), _("Hide files that are newer on left"), - GlobalResources::instance().getImage(wxT("leftNewerDeact")), + buttonReleased("leftNewer"), _("Show files that are newer on left")); - m_bpButtonRightNewer->init(GlobalResources::instance().getImage(wxT("rightNewerAct")), + m_bpButtonRightNewer->init(buttonPressed("rightNewer"), _("Hide files that are newer on right"), - GlobalResources::instance().getImage(wxT("rightNewerDeact")), + buttonReleased("rightNewer"), _("Show files that are newer on right")); - m_bpButtonEqual->init(GlobalResources::instance().getImage(wxT("equalAct")), + m_bpButtonEqual->init(buttonPressed("equal"), _("Hide files that are equal"), - GlobalResources::instance().getImage(wxT("equalDeact")), + buttonReleased("equal"), _("Show files that are equal")); - m_bpButtonDifferent->init(GlobalResources::instance().getImage(wxT("differentAct")), + m_bpButtonDifferent->init(buttonPressed("different"), _("Hide files that are different"), - GlobalResources::instance().getImage(wxT("differentDeact")), + buttonReleased("different"), _("Show files that are different")); - m_bpButtonConflict->init(GlobalResources::instance().getImage(wxT("conflictAct")), + m_bpButtonConflict->init(buttonPressed("conflict"), _("Hide conflicts"), - GlobalResources::instance().getImage(wxT("conflictDeact")), + buttonReleased("conflict"), _("Show conflicts")); //sync preview buttons - m_bpButtonSyncCreateLeft->init(GlobalResources::instance().getImage(wxT("syncCreateLeftAct")), + m_bpButtonSyncCreateLeft->init(buttonPressed("createLeft"), _("Hide files that will be created on the left side"), - GlobalResources::instance().getImage(wxT("syncCreateLeftDeact")), + buttonReleased("createLeft"), _("Show files that will be created on the left side")); - m_bpButtonSyncCreateRight->init(GlobalResources::instance().getImage(wxT("syncCreateRightAct")), + m_bpButtonSyncCreateRight->init(buttonPressed("createRight"), _("Hide files that will be created on the right side"), - GlobalResources::instance().getImage(wxT("syncCreateRightDeact")), + buttonReleased("createRight"), _("Show files that will be created on the right side")); - m_bpButtonSyncDeleteLeft->init(GlobalResources::instance().getImage(wxT("syncDeleteLeftAct")), + m_bpButtonSyncDeleteLeft->init(buttonPressed("deleteLeft"), _("Hide files that will be deleted on the left side"), - GlobalResources::instance().getImage(wxT("syncDeleteLeftDeact")), + buttonReleased("deleteLeft"), _("Show files that will be deleted on the left side")); - m_bpButtonSyncDeleteRight->init(GlobalResources::instance().getImage(wxT("syncDeleteRightAct")), + m_bpButtonSyncDeleteRight->init(buttonPressed("deleteRight"), _("Hide files that will be deleted on the right side"), - GlobalResources::instance().getImage(wxT("syncDeleteRightDeact")), + buttonReleased("deleteRight"), _("Show files that will be deleted on the right side")); - m_bpButtonSyncDirOverwLeft->init(GlobalResources::instance().getImage(wxT("syncDirLeftAct")), + m_bpButtonSyncDirOverwLeft->init(buttonPressed("updateLeft"), _("Hide files that will be overwritten on left side"), - GlobalResources::instance().getImage(wxT("syncDirLeftDeact")), + buttonReleased("updateLeft"), _("Show files that will be overwritten on left side")); - m_bpButtonSyncDirOverwRight->init(GlobalResources::instance().getImage(wxT("syncDirRightAct")), + m_bpButtonSyncDirOverwRight->init(buttonPressed("updateRight"), _("Hide files that will be overwritten on right side"), - GlobalResources::instance().getImage(wxT("syncDirRightDeact")), + buttonReleased("updateRight"), _("Show files that will be overwritten on right side")); - m_bpButtonSyncDirNone->init(GlobalResources::instance().getImage(wxT("syncDirNoneAct")), + m_bpButtonSyncDirNone->init(buttonPressed("none"), _("Hide files that won't be copied"), - GlobalResources::instance().getImage(wxT("syncDirNoneDeact")), + buttonReleased("none"), _("Show files that won't be copied")); //compare result buttons @@ -3092,12 +3235,12 @@ void MainDialog::updateFilterButtons() //global filter: test for Null-filter if (isNullFilter(currentCfg.mainCfg.globalFilter)) { - setBitmapLabel(*m_bpButtonFilter, GlobalResources::instance().getImage(wxT("filterOff"))); + setBitmapLabel(*m_bpButtonFilter, GlobalResources::getImage(wxT("filterOff"))); m_bpButtonFilter->SetToolTip(_("No filter selected")); } else { - setBitmapLabel(*m_bpButtonFilter, GlobalResources::instance().getImage(wxT("filterOn"))); + setBitmapLabel(*m_bpButtonFilter, GlobalResources::getImage(wxT("filterOn"))); m_bpButtonFilter->SetToolTip(_("Filter is active")); } @@ -3140,15 +3283,13 @@ void MainDialog::OnCompare(wxCommandEvent& event) } //begin comparison - zen::CompareProcess comparison(globalSettings->fileTimeTolerance, - globalSettings->optDialogs, - statusHandler); + zen::CompareProcess compProc(globalSettings->fileTimeTolerance, + globalSettings->optDialogs, + statusHandler); //technical representation of comparison data zen::FolderComparison newCompareData; - comparison.startCompareProcess(cmpConfig, //call getCurrentCfg() to get current values for directory pairs! - currentCfg.mainCfg.compareVar, - newCompareData); + compProc.startCompareProcess(cmpConfig, newCompareData); gridDataView->setData(newCompareData); //newCompareData is invalidated after this call @@ -3161,14 +3302,14 @@ void MainDialog::OnCompare(wxCommandEvent& event) { //disable the sync button syncPreview->enableSynchronization(false); - m_buttonCompare->SetFocus(); + if (m_buttonCompare->IsShownOnScreen()) m_buttonCompare->SetFocus(); updateGuiGrid(); //refresh grid in ANY case! (also on abort) return; } //once compare is finished enable the sync button syncPreview->enableSynchronization(true); - m_buttonStartSync->SetFocus(); + if (m_buttonStartSync->IsShownOnScreen()) m_buttonStartSync->SetFocus(); //hide sort direction indicator on GUI grids m_gridLeft ->setSortMarker(CustomGrid::SortMarker(-1, CustomGrid::ASCENDING)); @@ -3184,8 +3325,8 @@ void MainDialog::OnCompare(wxCommandEvent& event) m_gridRight-> ClearSelection(); //add to folder history after successful comparison only - addLeftFolderToHistory( m_directoryLeft->GetValue()); - addRightFolderToHistory(m_directoryRight->GetValue()); + folderHistoryLeft ->addItem(toZ(m_directoryLeft->GetValue())); + folderHistoryRight->addItem(toZ(m_directoryRight->GetValue())); //refresh grid in ANY case! (also on abort) updateGuiGrid(); @@ -3249,10 +3390,8 @@ void MainDialog::OnSwitchView(wxCommandEvent& event) void MainDialog::OnSyncSettings(wxCommandEvent& event) { - if (showSyncConfigDlg(currentCfg.mainCfg.compareVar, - currentCfg.mainCfg.syncConfiguration, - currentCfg.mainCfg.handleDeletion, - currentCfg.mainCfg.customDeletionDirectory, + if (showSyncConfigDlg(currentCfg.mainCfg.cmpConfig.compareVar, + currentCfg.mainCfg.syncCfg, ¤tCfg.handleError) == ReturnSyncConfig::BUTTON_OKAY) //optional input parameter { applySyncConfig(); @@ -3260,31 +3399,34 @@ void MainDialog::OnSyncSettings(wxCommandEvent& event) } -void MainDialog::applyCompareConfig() +void MainDialog::applyCompareConfig(bool globalLevel) { //update compare variant name - m_staticTextCmpVariant->SetLabel(wxString(wxT("(")) + getVariantName(currentCfg.mainCfg.compareVar) + wxT(")")); + m_staticTextCmpVariant->SetLabel(wxString(wxT("(")) + getConfig().mainCfg.getCompVariantName() + wxT(")")); m_panelTopButtons->Layout(); //adapt layout for variant text - //disable the sync button - syncPreview->enableSynchronization(false); + if (globalLevel) + { + //disable the sync button + syncPreview->enableSynchronization(false); - //clear grids - gridDataView->clearAllRows(); - updateGuiGrid(); + //clear grids + gridDataView->clearAllRows(); + updateGuiGrid(); - //convenience: change sync view - switch (currentCfg.mainCfg.compareVar) - { - case CMP_BY_TIME_SIZE: - syncPreview->enablePreview(true); - break; - case CMP_BY_CONTENT: - syncPreview->enablePreview(false); - break; - } + //convenience: change sync view + switch (currentCfg.mainCfg.cmpConfig.compareVar) + { + case CMP_BY_TIME_SIZE: + syncPreview->enablePreview(true); + break; + case CMP_BY_CONTENT: + syncPreview->enablePreview(false); + break; + } - m_buttonCompare->SetFocus(); + if (m_buttonCompare->IsShownOnScreen()) m_buttonCompare->SetFocus(); + } } @@ -3294,17 +3436,13 @@ void MainDialog::OnCmpSettings(wxCommandEvent& event) //wxPoint windowPos = m_bpButtonCmpConfig->GetScreenPosition(); //windowPos.x += m_bpButtonCmpConfig->GetSize().GetWidth() + 5; - CompareVariant compareVarNew = currentCfg.mainCfg.compareVar; - SymLinkHandling handleSymlinkNew = currentCfg.mainCfg.handleSymlinks; + CompConfig cmpConfigNew = currentCfg.mainCfg.cmpConfig; - if (zen::showCompareCfgDialog(compareVarNew, - handleSymlinkNew) == ReturnSmallDlg::BUTTON_OKAY && + if (zen::showCompareCfgDialog(cmpConfigNew) == ReturnSmallDlg::BUTTON_OKAY && //check if settings were changed at all - (compareVarNew != currentCfg.mainCfg.compareVar || - handleSymlinkNew != currentCfg.mainCfg.handleSymlinks)) + cmpConfigNew != currentCfg.mainCfg.cmpConfig) { - currentCfg.mainCfg.compareVar = compareVarNew; - currentCfg.mainCfg.handleSymlinks = handleSymlinkNew; + currentCfg.mainCfg.cmpConfig = cmpConfigNew; applyCompareConfig(); } @@ -3355,20 +3493,20 @@ void MainDialog::OnStartSync(wxCommandEvent& event) //GUI mode: place directory locks on directories isolated(!) during both comparison and synchronization LockHolder dummy2; - for (FolderComparison::const_iterator i = dataToSync.begin(); i != dataToSync.end(); ++i) + + for (auto i = begin(dataToSync); i != end(dataToSync); ++i) { - dummy2.addDir(i->getBaseDir<LEFT_SIDE >(), statusHandler); - dummy2.addDir(i->getBaseDir<RIGHT_SIDE>(), statusHandler); + dummy2.addDir(i->getBaseDirPf<LEFT_SIDE >(), statusHandler); + dummy2.addDir(i->getBaseDirPf<RIGHT_SIDE>(), statusHandler); } //start synchronization and mark all elements processed - zen::SyncProcess synchronization( - globalSettings->optDialogs, - globalSettings->verifyFileCopy, - globalSettings->copyLockedFiles, - globalSettings->copyFilePermissions, - globalSettings->transactionalFileCopy, - statusHandler); + zen::SyncProcess syncProc(globalSettings->optDialogs, + globalSettings->verifyFileCopy, + globalSettings->copyLockedFiles, + globalSettings->copyFilePermissions, + globalSettings->transactionalFileCopy, + statusHandler); const std::vector<zen::FolderPairSyncCfg> syncProcessCfg = zen::extractSyncCfg(getConfig().mainCfg); @@ -3376,7 +3514,7 @@ void MainDialog::OnStartSync(wxCommandEvent& event) if (syncProcessCfg.size() != dataToSync.size()) throw std::logic_error("Programming Error: Contract violation!"); //should never happen: sync button is deactivated if they are not in sync - synchronization.startSynchronizationProcess(syncProcessCfg, dataToSync); + syncProc.startSynchronizationProcess(syncProcessCfg, dataToSync); //play (optional) sound notification after sync has completed (GUI and batch mode) const wxString soundFile = zen::getResourceDir() + wxT("Sync_Complete.wav"); @@ -3567,6 +3705,7 @@ void MainDialog::OnSwapSides(wxCommandEvent& event) //swap directory names: first pair firstFolderPair->setValues(firstFolderPair->getRightDir(), // swap directories firstFolderPair->getLeftDir(), // + firstFolderPair->getAltCompConfig(), firstFolderPair->getAltSyncConfig(), firstFolderPair->getAltFilterConfig()); @@ -3576,6 +3715,7 @@ void MainDialog::OnSwapSides(wxCommandEvent& event) DirectoryPair* dirPair = *i; dirPair->setValues(dirPair->getRightDir(), // swap directories dirPair->getLeftDir(), // + dirPair->getAltCompConfig(), dirPair->getAltSyncConfig(), dirPair->getAltFilterConfig()); } @@ -3797,31 +3937,6 @@ void MainDialog::updateGridViewData() } -void MainDialog::OnAddFolderPair(wxCommandEvent& event) -{ - wxWindowUpdateLocker dummy(this); //avoid display distortion - - std::vector<FolderPairEnh> newPairs; - newPairs.push_back(getConfig().mainCfg.firstPair); - - addFolderPair(newPairs, true); //add pair in front of additonal pairs - - //clear first pair - const FolderPairEnh cfgEmpty; - firstFolderPair->setValues(toWx(cfgEmpty.leftDirectory), - toWx(cfgEmpty.rightDirectory), - cfgEmpty.altSyncConfig, - cfgEmpty.localFilter); - - //disable the sync button - syncPreview->enableSynchronization(false); - - //clear grids - gridDataView->clearAllRows(); - applySyncConfig(); //mainly to update sync dir description text -} - - void MainDialog::updateFilterConfig() { applyFiltering(gridDataView->getDataTentative(), getConfig().mainCfg); @@ -3864,6 +3979,26 @@ void MainDialog::applySyncConfig() } +void MainDialog::OnAddFolderPair(wxCommandEvent& event) +{ + wxWindowUpdateLocker dummy(this); //avoid display distortion + + std::vector<FolderPairEnh> newPairs; + newPairs.push_back(getConfig().mainCfg.firstPair); + + //clear first pair + const FolderPairEnh cfgEmpty; + firstFolderPair->setValues(toWx(cfgEmpty.leftDirectory), + toWx(cfgEmpty.rightDirectory), + cfgEmpty.altCmpConfig, + cfgEmpty.altSyncConfig, + cfgEmpty.localFilter); + + //keep sequence to update GUI as last step + addFolderPair(newPairs, true); //add pair in front of additonal pairs +} + + void MainDialog::OnRemoveTopFolderPair(wxCommandEvent& event) { if (additionalFolderPairs.size() > 0) @@ -3876,18 +4011,11 @@ void MainDialog::OnRemoveTopFolderPair(wxCommandEvent& event) //reset first pair firstFolderPair->setValues(toWx(cfgSecond.leftDirectory), toWx(cfgSecond.rightDirectory), + cfgSecond.altCmpConfig, cfgSecond.altSyncConfig, cfgSecond.localFilter); removeAddFolderPair(0); //remove second folder pair (first of additional folder pairs) - - //------------------------------------------------------------------ - //disable the sync button - syncPreview->enableSynchronization(false); - - //clear grids - gridDataView->clearAllRows(); - applySyncConfig(); //mainly to update sync dir description text } } @@ -3901,14 +4029,6 @@ void MainDialog::OnRemoveFolderPair(wxCommandEvent& event) if (eventObj == (*i)->m_bpButtonRemovePair) { removeAddFolderPair(i - additionalFolderPairs.begin()); - - //------------------------------------------------------------------ - //disable the sync button - syncPreview->enableSynchronization(false); - - //clear grids - gridDataView->clearAllRows(); - applySyncConfig(); //mainly to update sync dir description text return; } } @@ -3921,24 +4041,27 @@ void MainDialog::updateGuiForFolderPair() m_bpButtonRemovePair->Hide(); else m_bpButtonRemovePair->Show(); - m_panelTopRight->Layout(); + m_panelTopLeft->Layout(); //adapt local filter and sync cfg for first folder pair if (additionalFolderPairs.size() == 0 && + firstFolderPair->getAltCompConfig().get() == NULL && firstFolderPair->getAltSyncConfig().get() == NULL && isNullFilter(firstFolderPair->getAltFilterConfig())) { + m_bpButtonAltCompCfg ->Hide(); + m_bpButtonAltSyncCfg ->Hide(); m_bpButtonLocalFilter->Hide(); - m_bpButtonAltSyncCfg->Hide(); - setBitmapLabel(*m_bpButtonSwapSides, GlobalResources::instance().getImage(wxT("swap"))); + setBitmapLabel(*m_bpButtonSwapSides, GlobalResources::getImage(wxT("swap"))); } else { + m_bpButtonAltCompCfg ->Show(); + m_bpButtonAltSyncCfg ->Show(); m_bpButtonLocalFilter->Show(); - m_bpButtonAltSyncCfg->Show(); - setBitmapLabel(*m_bpButtonSwapSides, GlobalResources::instance().getImage(wxT("swapSlim"))); + setBitmapLabel(*m_bpButtonSwapSides, GlobalResources::getImage(wxT("swapSlim"))); } m_panelTopMiddle->Layout(); @@ -3988,6 +4111,10 @@ void MainDialog::addFolderPair(const std::vector<FolderPairEnh>& newPairs, bool //add new folder pair DirectoryPair* newPair = new DirectoryPair(m_scrolledWindowFolderPairs, *this); + //init dropdown history + newPair->m_directoryLeft ->init(folderHistoryLeft); + newPair->m_directoryRight->init(folderHistoryRight); + //set width of left folder panel const int width = m_panelTopLeft->GetSize().GetWidth(); newPair->m_panelLeft->SetMinSize(wxSize(width, -1)); @@ -4010,6 +4137,7 @@ void MainDialog::addFolderPair(const std::vector<FolderPairEnh>& newPairs, bool //set alternate configuration newPair->setValues(toWx(i->leftDirectory), toWx(i->rightDirectory), + i->altCmpConfig, i->altSyncConfig, i->localFilter); } @@ -4024,6 +4152,14 @@ void MainDialog::addFolderPair(const std::vector<FolderPairEnh>& newPairs, bool } updateGuiForFolderPair(); + + //disable the sync button + syncPreview->enableSynchronization(false); + + //clear grids + gridDataView->clearAllRows(); + applySyncConfig(); //mainly to update sync dir description text + applyCompareConfig(false); //false: not global level } @@ -4039,7 +4175,7 @@ void MainDialog::removeAddFolderPair(size_t pos) //const int pairHeight = pairToDelete->GetSize().GetHeight(); bSizerAddFolderPairs->Detach(pairToDelete); //Remove() does not work on Window*, so do it manually - pairToDelete->Destroy(); // + pairToDelete->Destroy(); // additionalFolderPairs.erase(additionalFolderPairs.begin() + pos); //remove element from vector //set size of scrolled window @@ -4054,6 +4190,15 @@ void MainDialog::removeAddFolderPair(size_t pos) } updateGuiForFolderPair(); + + //------------------------------------------------------------------ + //disable the sync button + syncPreview->enableSynchronization(false); + + //clear grids + gridDataView->clearAllRows(); + applySyncConfig(); //mainly to update sync dir description text + applyCompareConfig(false); //false: not global level } @@ -4210,9 +4355,11 @@ void MainDialog::OnMenuBatchJob(wxCommandEvent& event) //fill batch config structure const xmlAccess::XmlGuiConfig currCfg = getConfig(); //get UP TO DATE config, with updated values for main and additional folders! - const xmlAccess::XmlBatchConfig batchCfg = convertGuiToBatch(currCfg); + const wxString referenceFile = activeConfigFiles.size() == 1 && activeConfigFiles[0] != lastRunConfigName() ? activeConfigFiles[0] : wxString(); + + const xmlAccess::XmlBatchConfig batchCfg = convertGuiToBatch(currCfg, referenceFile); - if (showSyncBatchDlg(batchCfg) == ReturnBatchConfig::BATCH_FILE_SAVED) + if (showSyncBatchDlg(referenceFile, batchCfg, folderHistoryLeft, folderHistoryRight) == ReturnBatchConfig::BATCH_FILE_SAVED) pushStatusInformation(_("Batch file created successfully!")); } @@ -4240,8 +4387,8 @@ void MainDialog::OnLayoutWindowAsync(wxIdleEvent& event) wxWindowUpdateLocker dummy(this); //avoid display distortion //adjust folder pair distortion on startup - for (std::vector<DirectoryPair*>::iterator i = additionalFolderPairs.begin(); i != additionalFolderPairs.end(); ++i) - (*i)->Layout(); + std::for_each(additionalFolderPairs.begin(), additionalFolderPairs.end(), + [](DirectoryPair* dirPair) { dirPair->Layout(); }); m_panelTopButtons->Layout(); Layout(); //strangely this layout call works if called in next idle event only @@ -4327,12 +4474,12 @@ void MainDialog::SyncPreview::enableSynchronization(bool value) if (value) { mainDlg_->m_buttonStartSync->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNTEXT)); - mainDlg_->m_buttonStartSync->setBitmapFront(GlobalResources::instance().getImage(wxT("sync"))); + mainDlg_->m_buttonStartSync->setBitmapFront(GlobalResources::getImage(wxT("sync"))); } else { mainDlg_->m_buttonStartSync->SetForegroundColour(wxColor(128, 128, 128)); //Some colors seem to have problems with 16Bit color depth, well this one hasn't! - mainDlg_->m_buttonStartSync->setBitmapFront(GlobalResources::instance().getImage(wxT("syncDisabled"))); + mainDlg_->m_buttonStartSync->setBitmapFront(GlobalResources::getImage(wxT("syncDisabled"))); } } diff --git a/ui/main_dlg.h b/ui/main_dlg.h index 44d7ef62..2179cdf5 100644 --- a/ui/main_dlg.h +++ b/ui/main_dlg.h @@ -16,6 +16,7 @@ #include <wx/aui/aui.h> #include "../shared/int64.h" +class FolderHistory; class CustomGrid; class FFSCheckRowsEvent; class FFSSyncDirectionEvent; @@ -94,9 +95,6 @@ private: void addFileToCfgHistory(const std::vector<wxString>& filenames); - void addLeftFolderToHistory(const wxString& leftFolder); - void addRightFolderToHistory(const wxString& rightFolder); - void addFolderPair(const std::vector<zen::FolderPairEnh>& newPairs, bool addFront = false); void removeAddFolderPair(size_t pos); void clearAddFolderPairs(); @@ -129,7 +127,6 @@ private: void onGridLeftButtonEvent( wxKeyEvent& event); void onGridRightButtonEvent( wxKeyEvent& event); void onGridMiddleButtonEvent( wxKeyEvent& event); - void OnContextRim( wxGridEvent& event); void OnContextRimLabelLeft( wxGridEvent& event); void OnContextRimLabelRight( wxGridEvent& event); void OnContextMiddle( wxGridEvent& event); @@ -140,7 +137,7 @@ private: void OnContextSelectCompVariant( wxMouseEvent& event); void OnContextSelectSyncVariant( wxMouseEvent& event); - void applyCompareConfig(); + void applyCompareConfig(bool globalLevel = true); void OnSetCompVariant(wxCommandEvent& event); void OnSetSyncVariant(wxCommandEvent& event); @@ -156,8 +153,10 @@ private: void OnContextSyncDirRight (wxCommandEvent& event); void OnContextCustColumnLeft (wxCommandEvent& event); void OnContextCustColumnRight (wxCommandEvent& event); + void OnContextSelectTimeSpan (wxCommandEvent& event); void OnContextAutoAdjustLeft (wxCommandEvent& event); void OnContextAutoAdjustRight (wxCommandEvent& event); + void OnContextSetIconSize (wxCommandEvent& event); void OnContextIncludeAll (wxCommandEvent& event); void OnContextExcludeAll (wxCommandEvent& event); void OnContextComparisonView (wxCommandEvent& event); @@ -165,6 +164,7 @@ private: void OnContextSetLayoutReset (wxCommandEvent& event); void OnContextSetLayoutShowPanel(wxCommandEvent& event); + void OnContextRim(wxGridEvent& event); void OnDirSelected(wxFileDirPickerEvent& event); void OnCheckRows(FFSCheckRowsEvent& event); @@ -309,6 +309,11 @@ private: wxAuiManager auiMgr; //implement dockable GUI design wxString defaultPerspective; + + zen::Int64 manualTimeSpanFrom, manualTimeSpanTo; //buffer manual time span selection at session level + + std::shared_ptr<FolderHistory> folderHistoryLeft; //shared by all wxComboBox dropdown controls + std::shared_ptr<FolderHistory> folderHistoryRight; //always bound! }; #endif // MAINDIALOG_H diff --git a/ui/msg_popup.cpp b/ui/msg_popup.cpp index 900ab683..9e0e0111 100644 --- a/ui/msg_popup.cpp +++ b/ui/msg_popup.cpp @@ -36,7 +36,7 @@ ErrorDlg::ErrorDlg(wxWindow* parentWindow, const int activeButtons, const wxStri new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif - m_bitmap10->SetBitmap(GlobalResources::instance().getImage(wxT("error"))); + m_bitmap10->SetBitmap(GlobalResources::getImage(wxT("error"))); m_textCtrl8->SetValue(messageText); m_checkBoxIgnoreErrors->SetValue(ignoreNextErrors); @@ -120,7 +120,7 @@ WarningDlg::WarningDlg(wxWindow* parentWindow, int activeButtons, const wxStrin new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif - m_bitmap10->SetBitmap(GlobalResources::instance().getImage(wxT("warning"))); + m_bitmap10->SetBitmap(GlobalResources::getImage(wxT("warning"))); m_textCtrl8->SetValue(messageText); m_checkBoxDontShowAgain->SetValue(dontShowAgain); @@ -190,6 +190,7 @@ private: void OnCancel(wxCommandEvent& event); void OnYes(wxCommandEvent& event); void OnNo(wxCommandEvent& event); + void OnCheckBoxDontShowAgain(wxCommandEvent& event); bool* dontShowAgain; //optional }; @@ -203,7 +204,7 @@ QuestionDlg::QuestionDlg(wxWindow* parentWindow, int activeButtons, const wxStri new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif - m_bitmap10->SetBitmap(GlobalResources::instance().getImage(wxT("question"))); + m_bitmap10->SetBitmap(GlobalResources::getImage(wxT("question"))); m_textCtrl8->SetValue(messageText); if (dontShowAgain) m_checkBoxDontAskAgain->SetValue(*dontShowAgain); @@ -258,6 +259,12 @@ void QuestionDlg::OnNo(wxCommandEvent& event) EndModal(ReturnQuestionDlg::BUTTON_NO); } +void QuestionDlg::OnCheckBoxDontShowAgain(wxCommandEvent& event) +{ + event.Skip(); +} + + ReturnQuestionDlg::ButtonPressed zen::showQuestionDlg(int activeButtons, const wxString& messageText, bool* dontShowAgain) { diff --git a/ui/progress_indicator.cpp b/ui/progress_indicator.cpp index 3cf78fbb..7da143a1 100644 --- a/ui/progress_indicator.cpp +++ b/ui/progress_indicator.cpp @@ -20,6 +20,7 @@ #include "../library/error_log.h" #include "../shared/toggle_button.h" #include "../shared/taskbar.h" +#include "../shared/image_tools.h" using namespace zen; @@ -78,13 +79,12 @@ private: wxStopWatch timeElapsed; //gauge variables - int totalObjects; + int totalObjects; zen::Int64 totalData; //each data element represents one byte for proper progress indicator scaling - int currentObjects; //each object represents a file or directory processed + int currentObjects; //each object represents a file or directory processed zen::Int64 currentData; - double scalingFactor; //nr of elements has to be normalized to smaller nr. because of range of int limitation - void showProgressExternally(const wxString& progressText, float percent = 0); + void showProgressExternally(const wxString& progressText, double fraction = 0); //between [0, 1] enum CurrentStatus { @@ -97,7 +97,7 @@ private: std::unique_ptr<util::Taskbar> taskbar_; //remaining time - std::auto_ptr<Statistics> statistics; + std::unique_ptr<Statistics> statistics; long lastStatCallSpeed; //used for calculating intervals between statistics update long lastStatCallRemTime; // }; @@ -161,7 +161,6 @@ CompareStatus::CompareStatusImpl::CompareStatusImpl(wxTopLevelWindow& parentWind totalData(0), currentObjects(0), currentData(0), - scalingFactor(0), status(SCANNING), lastStatCallSpeed(-1000000), //some big number lastStatCallRemTime(-1000000) @@ -202,7 +201,6 @@ void CompareStatus::CompareStatusImpl::init() totalData = 0; currentObjects = 0; currentData = 0; - scalingFactor = 0; statistics.reset(); @@ -231,11 +229,6 @@ void CompareStatus::CompareStatusImpl::switchToCompareBytewise(int totalObjectsT currentObjects = 0; totalObjects = totalObjectsToProcess; - if (totalData != 0) - scalingFactor = GAUGE_FULL_RANGE / to<double>(totalData); //let's normalize to 50000 - else - scalingFactor = 0; - //set new statistics handler: 10 seconds "window" for remaining time, 5 seconds for speed statistics.reset(new Statistics(totalObjectsToProcess, to<double>(totalDataToProcess), windowSizeRemainingTime, windowSizeBytesPerSec)); lastStatCallSpeed = -1000000; //some big number @@ -272,7 +265,7 @@ void CompareStatus::CompareStatusImpl::setStatusText_NoUpdate(const wxString& te } -void CompareStatus::CompareStatusImpl::showProgressExternally(const wxString& progressText, float percent) +void CompareStatus::CompareStatusImpl::showProgressExternally(const wxString& progressText, double fraction) { if (parentWindow_.GetTitle() != progressText) parentWindow_.SetTitle(progressText); @@ -281,20 +274,16 @@ void CompareStatus::CompareStatusImpl::showProgressExternally(const wxString& pr using namespace util; if (taskbar_.get()) - { - const size_t current = 100000 * percent / 100; - const size_t total = 100000; switch (status) { case SCANNING: taskbar_->setStatus(Taskbar::STATUS_INDETERMINATE); break; case COMPARING_CONTENT: + taskbar_->setProgress(fraction); taskbar_->setStatus(Taskbar::STATUS_NORMAL); - taskbar_->setProgress(current, total); break; } - } } @@ -305,7 +294,8 @@ void CompareStatus::CompareStatusImpl::updateStatusPanelNow() { //wxWindowUpdateLocker dummy(this) -> not needed - const float percent = totalData == 0 ? 0 : to<double>(currentData) * 100.0 / to<double>(totalData); + //add both data + obj-count, to handle "deletion-only" cases + const double fraction = totalData + totalObjects == 0 ? 0 : to<double>(currentData + currentObjects) / to<double>(totalData + totalObjects); //write status information to taskbar, parent title ect. switch (status) @@ -314,11 +304,10 @@ void CompareStatus::CompareStatusImpl::updateStatusPanelNow() showProgressExternally(toStringSep(scannedObjects) + wxT(" - ") + _("Scanning...")); break; case COMPARING_CONTENT: - showProgressExternally(formatPercentage(currentData, totalData) + wxT(" - ") + _("Comparing content..."), percent); + showProgressExternally(formatPercentage(fraction) + wxT(" - ") + _("Comparing content..."), fraction); break; } - bool updateLayout = false; //avoid screen flicker by calling layout() only if necessary //remove linebreaks from currentStatusText @@ -333,7 +322,7 @@ void CompareStatus::CompareStatusImpl::updateStatusPanelNow() setNewText(toStringSep(scannedObjects), *m_staticTextScanned, updateLayout); //progress indicator for "compare file content" - m_gauge2->SetValue(to<double>(currentData) * scalingFactor); + m_gauge2->SetValue(common::round(fraction * GAUGE_FULL_RANGE)); //remaining files left for file comparison const wxString filesToCompareTmp = toStringSep(totalObjects - currentObjects); @@ -376,6 +365,29 @@ void CompareStatus::CompareStatusImpl::updateStatusPanelNow() //######################################################################################## +namespace +{ +inline +wxBitmap buttonPressed(const std::string& name) +{ + wxBitmap background = GlobalResources::getImage(wxT("log button pressed")); + return layOver(GlobalResources::getImage(utf8CvrtTo<wxString>(name)), background); +} + + +inline +wxBitmap buttonReleased(const std::string& name) +{ + wxImage output = greyScale(GlobalResources::getImage(utf8CvrtTo<wxString>(name))).ConvertToImage(); + //GlobalResources::getImage(utf8CvrtTo<wxString>(name)).ConvertToImage().ConvertToGreyscale(1.0/3, 1.0/3, 1.0/3); //treat all channels equally! + //brighten(output, 30); + + zen::move(output, 0, -1); //move image right one pixel + return output; +} +} + + class LogControl : public LogControlGenerated { public: @@ -385,14 +397,14 @@ public: const int warningCount = log_.typeCount(TYPE_WARNING); const int infoCount = log_.typeCount(TYPE_INFO); - m_bpButtonErrors->init(GlobalResources::instance().getImage(wxT("log error")), _("Error") + wxString::Format(wxT(" (%d)"), errorCount), - GlobalResources::instance().getImage(wxT("log error inactive")), _("Error") + wxString::Format(wxT(" (%d)"), errorCount)); + m_bpButtonErrors->init(buttonPressed ("error"), _("Error") + wxString::Format(wxT(" (%d)"), errorCount), + buttonReleased("error"), _("Error") + wxString::Format(wxT(" (%d)"), errorCount)); - m_bpButtonWarnings->init(GlobalResources::instance().getImage(wxT("log warning")), _("Warning") + wxString::Format(wxT(" (%d)"), warningCount), - GlobalResources::instance().getImage(wxT("log warning inactive")), _("Warning") + wxString::Format(wxT(" (%d)"), warningCount)); + m_bpButtonWarnings->init(buttonPressed ("warning"), _("Warning") + wxString::Format(wxT(" (%d)"), warningCount), + buttonReleased("warning"), _("Warning") + wxString::Format(wxT(" (%d)"), warningCount)); - m_bpButtonInfo->init(GlobalResources::instance().getImage(wxT("log info")), _("Info") + wxString::Format(wxT(" (%d)"), infoCount), - GlobalResources::instance().getImage(wxT("log info inactive")), _("Info") + wxString::Format(wxT(" (%d)"), infoCount)); + m_bpButtonInfo->init(buttonPressed ("info"), _("Info") + wxString::Format(wxT(" (%d)"), infoCount), + buttonReleased("info"), _("Info") + wxString::Format(wxT(" (%d)"), infoCount)); m_bpButtonErrors ->setActive(true); m_bpButtonWarnings->setActive(true); @@ -496,7 +508,7 @@ private: void OnResumeFromTray(wxCommandEvent& event); bool currentProcessIsRunning(); - void showProgressExternally(const wxString& progressText, float percent = 0); //percent may already be included in progressText + void showProgressExternally(const wxString& progressText, double fraction = 0); //between [0, 1] const wxString jobName_; wxStopWatch timeElapsed; @@ -509,7 +521,6 @@ private: zen::Int64 totalData; int currentObjects; //each object represents a file or directory processed zen::Int64 currentData; //each data element represents one byte for proper progress indicator scaling - double scalingFactor; //nr of elements has to be normalized to smaller nr. because of range of int limitation //status variables size_t scannedObjects; @@ -618,7 +629,6 @@ SyncStatus::SyncStatusImpl::SyncStatusImpl(AbortCallback& abortCb, totalData(0), currentObjects(0), currentData(0), - scalingFactor(0), scannedObjects(0), processPaused(false), currentStatus(SyncStatus::ABORTED), @@ -719,11 +729,6 @@ void SyncStatus::SyncStatusImpl::resetGauge(int totalObjectsToProcess, zen::Int6 currentObjects = 0; totalObjects = totalObjectsToProcess; - if (totalData != 0) - scalingFactor = GAUGE_FULL_RANGE / to<double>(totalData); //let's normalize to 50000 - else - scalingFactor = 0; - //set new statistics handler: 10 seconds "window" for remaining time, 5 seconds for speed statistics.reset(new Statistics(totalObjectsToProcess, to<double>(totalDataToProcess), windowSizeRemainingTime, windowSizeBytesPerSec)); @@ -757,11 +762,11 @@ void SyncStatus::SyncStatusImpl::setStatusText_NoUpdate(const wxString& text) } -void SyncStatus::SyncStatusImpl::showProgressExternally(const wxString& progressText, float percent) +void SyncStatus::SyncStatusImpl::showProgressExternally(const wxString& progressText, double fraction) { //write status information to systray, if window is minimized if (trayIcon.get()) - trayIcon->setToolTip(progressText, percent); + trayIcon->setToolTip2(progressText, fraction); wxString progressTextFmt = progressText; progressTextFmt.Replace(wxT("\n"), wxT(" - ")); @@ -777,15 +782,11 @@ void SyncStatus::SyncStatusImpl::showProgressExternally(const wxString& progress this->SetTitle(progressTextFmt); } - using namespace util; //show progress on Windows 7 taskbar if (taskbar_.get()) { - const size_t current = 100000 * percent / 100; - const size_t total = 100000; - switch (currentStatus) { case SyncStatus::SCANNING: @@ -794,29 +795,58 @@ void SyncStatus::SyncStatusImpl::showProgressExternally(const wxString& progress case SyncStatus::FINISHED_WITH_SUCCESS: case SyncStatus::COMPARING_CONTENT: case SyncStatus::SYNCHRONIZING: + taskbar_->setProgress(fraction); taskbar_->setStatus(Taskbar::STATUS_NORMAL); - taskbar_->setProgress(current, total); break; case SyncStatus::PAUSE: + taskbar_->setProgress(fraction); taskbar_->setStatus(Taskbar::STATUS_PAUSED); - taskbar_->setProgress(current, total); break; case SyncStatus::ABORTED: case SyncStatus::FINISHED_WITH_ERROR: + taskbar_->setProgress(fraction); taskbar_->setStatus(Taskbar::STATUS_ERROR); - taskbar_->setProgress(current, total); break; } } } +#ifdef FFS_WIN +namespace +{ +enum Zorder +{ + ZORDER_CORRECT, + ZORDER_WRONG, + ZORDER_INDEFIINTE, +}; + +Zorder validateZorder(const wxWindow& top, const wxWindow& bottom) +{ + HWND hTop = static_cast<HWND>(top.GetHWND()); + HWND hBottom = static_cast<HWND>(bottom.GetHWND()); + assert(hTop && hBottom); + + for (HWND hAbove = hBottom; hAbove; hAbove = ::GetNextWindow(hAbove, GW_HWNDPREV)) //GW_HWNDPREV means "to foreground" + if (hAbove == hTop) + return ZORDER_CORRECT; + + for (HWND hAbove = ::GetNextWindow(hTop, GW_HWNDPREV); hAbove; hAbove = ::GetNextWindow(hAbove, GW_HWNDPREV)) + if (hAbove == hBottom) + return ZORDER_WRONG; + + return ZORDER_INDEFIINTE; +} +} +#endif void SyncStatus::SyncStatusImpl::updateStatusDialogNow(bool allowYield) { //static RetrieveStatistics statistic; //statistic.writeEntry(currentData.ToDouble(), currentObjects); - const float percent = totalData == 0 ? 100.0 : to<double>(currentData) * 100.0 / to<double>(totalData); + //add both data + obj-count, to handle "deletion-only" cases + const double fraction = totalData + totalObjects == 0 ? 1 : to<double>(currentData + currentObjects) / to<double>(totalData + totalObjects); //write status information to systray, taskbar, parent title ect. @@ -827,20 +857,20 @@ void SyncStatus::SyncStatusImpl::updateStatusDialogNow(bool allowYield) showProgressExternally(toStringSep(scannedObjects) + wxT(" - ") + _("Scanning...") + postFix); break; case SyncStatus::COMPARING_CONTENT: - showProgressExternally(formatPercentage(currentData, totalData) + wxT(" - ") + _("Comparing content...") + postFix, percent); + showProgressExternally(formatPercentage(fraction) + wxT(" - ") + _("Comparing content...") + postFix, fraction); break; case SyncStatus::SYNCHRONIZING: - showProgressExternally(formatPercentage(currentData, totalData) + wxT(" - ") + _("Synchronizing...") + postFix, percent); + showProgressExternally(formatPercentage(fraction) + wxT(" - ") + _("Synchronizing...") + postFix, fraction); break; case SyncStatus::PAUSE: - showProgressExternally((totalData != 0 ? formatPercentage(currentData, totalData) + wxT(" - ") : wxString()) + _("Paused") + postFix, percent); + showProgressExternally(formatPercentage(fraction) + wxT(" - ") + _("Paused") + postFix, fraction); break; case SyncStatus::ABORTED: - showProgressExternally(_("Aborted") + postFix, percent); + showProgressExternally(_("Aborted") + postFix, fraction); break; case SyncStatus::FINISHED_WITH_SUCCESS: case SyncStatus::FINISHED_WITH_ERROR: - showProgressExternally(_("Completed") + postFix, percent); + showProgressExternally(_("Completed") + postFix, fraction); break; } @@ -861,8 +891,7 @@ void SyncStatus::SyncStatusImpl::updateStatusDialogNow(bool allowYield) case SyncStatus::FINISHED_WITH_SUCCESS: case SyncStatus::FINISHED_WITH_ERROR: case SyncStatus::ABORTED: - m_gauge1->SetValue(totalData == 0 ? GAUGE_FULL_RANGE : - common::round(to<double>(currentData) * scalingFactor)); + m_gauge1->SetValue(common::round(fraction * GAUGE_FULL_RANGE)); break; case SyncStatus::PAUSE: //no change to gauge: don't switch between indeterminate/determinate modus break; @@ -912,10 +941,25 @@ void SyncStatus::SyncStatusImpl::updateStatusDialogNow(bool allowYield) } } +#ifdef FFS_WIN + //workaround Windows 7 bug messing up z-order after temporary application hangs: https://sourceforge.net/tracker/index.php?func=detail&aid=3376523&group_id=234430&atid=1093080 + if (mainDialog) + if (validateZorder(*this, *mainDialog) == ZORDER_WRONG) + { + HWND hProgress = static_cast<HWND>(GetHWND()); + + if (::IsWindowVisible(hProgress)) + { + ::ShowWindow(hProgress, SW_HIDE); //make Windows recalculate z-order + ::ShowWindow(hProgress, SW_SHOW); // + } + } +#endif + if (allowYield) { //support for pause button - if(processPaused) + if (processPaused) { if (statistics.get()) statistics->pauseTimer(); @@ -949,37 +993,37 @@ void SyncStatus::SyncStatusImpl::setCurrentStatus(SyncStatus::SyncStatusID id) switch (id) { case SyncStatus::ABORTED: - m_bitmapStatus->SetBitmap(GlobalResources::instance().getImage(wxT("statusError"))); + m_bitmapStatus->SetBitmap(GlobalResources::getImage(wxT("statusError"))); m_staticTextStatus->SetLabel(_("Aborted")); break; case SyncStatus::FINISHED_WITH_SUCCESS: - m_bitmapStatus->SetBitmap(GlobalResources::instance().getImage(wxT("statusSuccess"))); + m_bitmapStatus->SetBitmap(GlobalResources::getImage(wxT("statusSuccess"))); m_staticTextStatus->SetLabel(_("Completed")); break; case SyncStatus::FINISHED_WITH_ERROR: - m_bitmapStatus->SetBitmap(GlobalResources::instance().getImage(wxT("statusWarning"))); + m_bitmapStatus->SetBitmap(GlobalResources::getImage(wxT("statusWarning"))); m_staticTextStatus->SetLabel(_("Completed")); break; case SyncStatus::PAUSE: - m_bitmapStatus->SetBitmap(GlobalResources::instance().getImage(wxT("statusPause"))); + m_bitmapStatus->SetBitmap(GlobalResources::getImage(wxT("statusPause"))); m_staticTextStatus->SetLabel(_("Paused")); break; case SyncStatus::SCANNING: - m_bitmapStatus->SetBitmap(GlobalResources::instance().getImage(wxT("statusScanning"))); + m_bitmapStatus->SetBitmap(GlobalResources::getImage(wxT("statusScanning"))); m_staticTextStatus->SetLabel(_("Scanning...")); break; case SyncStatus::COMPARING_CONTENT: - m_bitmapStatus->SetBitmap(GlobalResources::instance().getImage(wxT("statusBinaryCompare"))); + m_bitmapStatus->SetBitmap(GlobalResources::getImage(wxT("statusBinaryCompare"))); m_staticTextStatus->SetLabel(_("Comparing content...")); break; case SyncStatus::SYNCHRONIZING: - m_bitmapStatus->SetBitmap(GlobalResources::instance().getImage(wxT("statusSyncing"))); + m_bitmapStatus->SetBitmap(GlobalResources::getImage(wxT("statusSyncing"))); m_staticTextStatus->SetLabel(_("Synchronizing...")); break; } diff --git a/ui/small_dlgs.cpp b/ui/small_dlgs.cpp index 137b4028..f57f8324 100644 --- a/ui/small_dlgs.cpp +++ b/ui/small_dlgs.cpp @@ -21,6 +21,9 @@ #include <wx/wupdlock.h> #include <wx/msgdlg.h> #include "../shared/mouse_move_dlg.h" +#include "../shared/help_provider.h" +#include "../shared/image_tools.h" +#include "../shared/stl_tools.h" using namespace zen; @@ -38,18 +41,18 @@ private: AboutDlg::AboutDlg(wxWindow* parent) : AboutDlgGenerated(parent) { - m_bitmap9->SetBitmap(GlobalResources::instance().getImage(wxT("website"))); - m_bitmap10->SetBitmap(GlobalResources::instance().getImage(wxT("email"))); - m_bitmap11->SetBitmap(GlobalResources::instance().getImage(wxT("logo"))); - m_bitmap13->SetBitmap(GlobalResources::instance().getImage(wxT("gpl"))); - m_bitmapTransl->SetBitmap(GlobalResources::instance().getImage(wxT("translation"))); + m_bitmap9->SetBitmap(GlobalResources::getImage(wxT("website"))); + m_bitmap10->SetBitmap(GlobalResources::getImage(wxT("email"))); + m_bitmap11->SetBitmap(GlobalResources::getImage(wxT("logo"))); + m_bitmap13->SetBitmap(GlobalResources::getImage(wxT("gpl"))); + m_bitmapTransl->SetBitmap(GlobalResources::getImage(wxT("translation"))); //create language credits for (std::vector<ExistingTranslations::Entry>::const_iterator i = ExistingTranslations::get().begin(); i != ExistingTranslations::get().end(); ++i) { //flag - wxStaticBitmap* staticBitmapFlag = new wxStaticBitmap(m_scrolledWindowTranslators, wxID_ANY, GlobalResources::instance().getImage(i->languageFlag), wxDefaultPosition, wxSize(-1,11), 0 ); - fgSizerTranslators->Add(staticBitmapFlag, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + wxStaticBitmap* staticBitmapFlag = new wxStaticBitmap(m_scrolledWindowTranslators, wxID_ANY, GlobalResources::getImage(i->languageFlag), wxDefaultPosition, wxSize(-1, 11), 0 ); + fgSizerTranslators->Add(staticBitmapFlag, 0, wxALIGN_CENTER_VERTICAL | wxALIGN_CENTER_HORIZONTAL, 5 ); //language name wxStaticText* staticTextLanguage = new wxStaticText(m_scrolledWindowTranslators, wxID_ANY, i->languageName, wxDefaultPosition, wxDefaultSize, 0 ); @@ -117,81 +120,6 @@ void zen::showAboutDialog() //######################################################################################## -class HelpDlg : public HelpDlgGenerated -{ -public: - HelpDlg(wxWindow* parent); - -private: - void OnClose(wxCloseEvent& event); - void OnOK(wxCommandEvent& event); -}; - - -HelpDlg::HelpDlg(wxWindow* parent) : HelpDlgGenerated(parent) -{ -#ifdef FFS_WIN - new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" -#endif - - m_notebook1->SetFocus(); - - m_bitmap25->SetBitmap(GlobalResources::instance().getImage(wxT("help"))); - - //populate decision trees: "compare by date" - wxTreeItemId treeRoot = m_treeCtrl1->AddRoot(_("DECISION TREE")); - wxTreeItemId treeBothSides = m_treeCtrl1->AppendItem(treeRoot, _("file exists on both sides")); - wxTreeItemId treeOneSide = m_treeCtrl1->AppendItem(treeRoot, _("on one side only")); - - m_treeCtrl1->AppendItem(treeOneSide, _("- exists left only")); - m_treeCtrl1->AppendItem(treeOneSide, _("- exists right only")); - - wxTreeItemId treeSameDate = m_treeCtrl1->AppendItem(treeBothSides, _("same date")); - m_treeCtrl1->AppendItem(treeSameDate, _("- equal")); - m_treeCtrl1->AppendItem(treeSameDate, _("- conflict (same date, different size)")); - - - wxTreeItemId treeDifferentDate = m_treeCtrl1->AppendItem(treeBothSides, _("different date")); - m_treeCtrl1->AppendItem(treeDifferentDate, _("- left newer")); - m_treeCtrl1->AppendItem(treeDifferentDate, _("- right newer")); - - m_treeCtrl1->ExpandAll(); - - //populate decision trees: "compare by content" - wxTreeItemId tree2Root = m_treeCtrl2->AddRoot(_("DECISION TREE")); - wxTreeItemId tree2BothSides = m_treeCtrl2->AppendItem(tree2Root, _("file exists on both sides")); - wxTreeItemId tree2OneSide = m_treeCtrl2->AppendItem(tree2Root, _("on one side only")); - - m_treeCtrl2->AppendItem(tree2OneSide, _("- exists left only")); - m_treeCtrl2->AppendItem(tree2OneSide, _("- exists right only")); - - m_treeCtrl2->AppendItem(tree2BothSides, _("- equal")); - m_treeCtrl2->AppendItem(tree2BothSides, _("- different")); - - m_treeCtrl2->ExpandAll(); -} - - -void HelpDlg::OnClose(wxCloseEvent& event) -{ - Destroy(); -} - - -void HelpDlg::OnOK(wxCommandEvent& event) -{ - Destroy(); -} - - -void zen::showHelpDialog() -{ - HelpDlg helpDlg(NULL); - helpDlg.ShowModal(); -} -//######################################################################################## - - class FilterDlg : public FilterDlgGenerated { public: @@ -234,10 +162,11 @@ FilterDlg::FilterDlg(wxWindow* parent, enumTimeDescr. add(UTIME_NONE, _("Inactive")). - add(UTIME_SEC, _("Second")). - add(UTIME_MIN, _("Minute")). - add(UTIME_HOUR, _("Hour")). - add(UTIME_DAY, _("Day")); + //add(UTIME_LAST_X_HOURS, _("Last x hours")). //better: "Last %x hour" ? + add(UTIME_TODAY, _("Today")). + add(UTIME_THIS_WEEK, _("This week")). + add(UTIME_THIS_MONTH, _("This month")). + add(UTIME_THIS_YEAR, _("This year")); enumSizeDescr. add(USIZE_NONE, _("Inactive")). @@ -245,8 +174,8 @@ FilterDlg::FilterDlg(wxWindow* parent, add(USIZE_KB, _("KB")). add(USIZE_MB, _("MB")); - m_bitmap26->SetBitmap(GlobalResources::instance().getImage(wxT("filterOn"))); - m_bpButtonHelp->SetBitmapLabel(GlobalResources::instance().getImage(wxT("help"))); + m_bitmap26->SetBitmap(GlobalResources::getImage(wxT("filterOn"))); + m_bpButtonHelp->SetBitmapLabel(GlobalResources::getImage(wxT("help"))); setFilter(filter); @@ -267,30 +196,30 @@ void FilterDlg::updateGui() { FilterConfig activeCfg = getFilter(); - if (!NameFilter(activeCfg.includeFilter, FilterConfig().excludeFilter).isNull()) - m_bitmapInclude->SetBitmap(GlobalResources::instance().getImage(wxT("include"))); - else - m_bitmapInclude->SetBitmap(GlobalResources::instance().getImage(wxT("include_grey"))); - - if (!NameFilter(FilterConfig().includeFilter, activeCfg.excludeFilter).isNull()) - m_bitmapExclude->SetBitmap(GlobalResources::instance().getImage(wxT("exclude"))); - else - m_bitmapExclude->SetBitmap(GlobalResources::instance().getImage(wxT("exclude_grey"))); - - if (activeCfg.unitTimeSpan != UTIME_NONE) - m_bitmapFilterDate->SetBitmap(GlobalResources::instance().getImage(wxT("clock"))); - else - m_bitmapFilterDate->SetBitmap(GlobalResources::instance().getImage(wxT("clock_grey"))); - - if (activeCfg.unitSizeMin != USIZE_NONE || - activeCfg.unitSizeMax != USIZE_NONE) - m_bitmapFilterSize->SetBitmap(GlobalResources::instance().getImage(wxT("size"))); - else - m_bitmapFilterSize->SetBitmap(GlobalResources::instance().getImage(wxT("size_grey"))); - - m_spinCtrlTimespan->Enable(activeCfg.unitTimeSpan != UTIME_NONE); - m_spinCtrlMinSize ->Enable(activeCfg.unitSizeMin != USIZE_NONE); - m_spinCtrlMaxSize ->Enable(activeCfg.unitSizeMax != USIZE_NONE); + m_bitmapInclude->SetBitmap( + !NameFilter(activeCfg.includeFilter, FilterConfig().excludeFilter).isNull() ? + GlobalResources::getImage(wxT("include")) : + greyScale(GlobalResources::getImage(wxT("include")))); + + m_bitmapExclude->SetBitmap( + !NameFilter(FilterConfig().includeFilter, activeCfg.excludeFilter).isNull() ? + GlobalResources::getImage(wxT("exclude")) : + greyScale(GlobalResources::getImage(wxT("exclude")))); + + m_bitmapFilterDate->SetBitmap( + activeCfg.unitTimeSpan != UTIME_NONE ? + GlobalResources::getImage(wxT("clock")) : + greyScale(GlobalResources::getImage(wxT("clock")))); + + m_bitmapFilterSize->SetBitmap( + activeCfg.unitSizeMin != USIZE_NONE || + activeCfg.unitSizeMax != USIZE_NONE ? + GlobalResources::getImage(wxT("size")) : + greyScale(GlobalResources::getImage(wxT("size")))); + + //m_spinCtrlTimespan->Enable(activeCfg.unitTimeSpan == UTIME_LAST_X_HOURS); + m_spinCtrlMinSize ->Enable(activeCfg.unitSizeMin != USIZE_NONE); + m_spinCtrlMaxSize ->Enable(activeCfg.unitSizeMax != USIZE_NONE); } @@ -447,13 +376,13 @@ void DeleteDialog::updateGui() { header = _P("Do you really want to move the following object to the Recycle Bin?", "Do you really want to move the following %x objects to the Recycle Bin?", delInfo.second); - m_bitmap12->SetBitmap(GlobalResources::instance().getImage(wxT("recycler"))); + m_bitmap12->SetBitmap(GlobalResources::getImage(wxT("recycler"))); } else { header = _P("Do you really want to delete the following object?", "Do you really want to delete the following %x objects?", delInfo.second); - m_bitmap12->SetBitmap(GlobalResources::instance().getImage(wxT("deleteFile"))); + m_bitmap12->SetBitmap(GlobalResources::getImage(wxT("deleteFile"))); } header.Replace(wxT("%x"), toStringSep(delInfo.second)); m_staticTextHeader->SetLabel(header); @@ -536,8 +465,8 @@ CustomizeColsDlg::CustomizeColsDlg(wxWindow* parent, xmlAccess::ColumnAttributes new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif - m_bpButton29->SetBitmapLabel(GlobalResources::instance().getImage(wxT("moveUp"))); - m_bpButton30->SetBitmapLabel(GlobalResources::instance().getImage(wxT("moveDown"))); + m_bpButton29->SetBitmapLabel(GlobalResources::getImage(wxT("moveUp"))); + m_bpButton30->SetBitmapLabel(GlobalResources::getImage(wxT("moveDown"))); xmlAccess::ColumnAttributes columnSettings = attr; @@ -671,11 +600,11 @@ SyncPreviewDlg::SyncPreviewDlg(wxWindow* parent, using zen::toStringSep; - m_buttonStartSync->setBitmapFront(GlobalResources::instance().getImage(wxT("startSync"))); - m_bitmapCreate->SetBitmap(GlobalResources::instance().getImage(wxT("create"))); - m_bitmapUpdate->SetBitmap(GlobalResources::instance().getImage(wxT("update"))); - m_bitmapDelete->SetBitmap(GlobalResources::instance().getImage(wxT("delete"))); - m_bitmapData->SetBitmap(GlobalResources::instance().getImage(wxT("data"))); + m_buttonStartSync->setBitmapFront(GlobalResources::getImage(wxT("startSync"))); + m_bitmapCreate->SetBitmap(GlobalResources::getImage(wxT("create"))); + m_bitmapUpdate->SetBitmap(GlobalResources::getImage(wxT("update"))); + m_bitmapDelete->SetBitmap(GlobalResources::getImage(wxT("delete"))); + m_bitmapData->SetBitmap(GlobalResources::getImage(wxT("data"))); m_staticTextVariant->SetLabel(variantName); m_textCtrlData->SetValue(zen::formatFilesizeToShortString(statistics.getDataToProcess())); @@ -733,34 +662,34 @@ class CompareCfgDialog : public CmpCfgDlgGenerated { public: CompareCfgDialog(wxWindow* parent, - zen::CompareVariant& cmpVar, - SymLinkHandling& handleSymlinks); + CompConfig& cmpConfig); private: void OnOkay(wxCommandEvent& event); void OnClose(wxCloseEvent& event) { EndModal(0); } void OnCancel(wxCommandEvent& event) { EndModal(0); } - void OnTimeSize(wxCommandEvent& event); + void OnShowHelp(wxCommandEvent& event); + + void OnTimeSize(wxCommandEvent& event) { m_radioBtnSizeDate->SetValue(true); } + //void OnFilesize(wxCommandEvent& event) { m_radioBtnSize ->SetValue(true); } + void OnContent (wxCommandEvent& event) { m_radioBtnContent ->SetValue(true); } + void OnTimeSizeDouble(wxMouseEvent& event); - void OnContent(wxCommandEvent& event); + void OnFilesizeDouble(wxMouseEvent& event); void OnContentDouble(wxMouseEvent& event); - void OnShowHelp(wxCommandEvent& event); void updateView(); - zen::CompareVariant& cmpVarOut; - SymLinkHandling& handleSymlinksOut; + CompConfig& cmpConfigOut; zen::EnumDescrList<SymLinkHandling> enumDescrHandleSyml; }; CompareCfgDialog::CompareCfgDialog(wxWindow* parent, - CompareVariant& cmpVar, - SymLinkHandling& handleSymlinks) : + CompConfig& cmpConfig) : CmpCfgDlgGenerated(parent), - cmpVarOut(cmpVar), - handleSymlinksOut(handleSymlinks) + cmpConfigOut(cmpConfig) { #ifdef FFS_WIN new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" @@ -774,11 +703,12 @@ CompareCfgDialog::CompareCfgDialog(wxWindow* parent, //move dialog up so that compare-config button and first config-variant are on same level // Move(wxPoint(position.x, std::max(0, position.y - (m_buttonTimeSize->GetScreenPosition() - GetScreenPosition()).y))); - m_bpButtonHelp ->SetBitmapLabel(GlobalResources::instance().getImage(wxT("help"))); - m_bitmapByTime ->SetBitmap (GlobalResources::instance().getImage(wxT("clock"))); - m_bitmapByContent->SetBitmap (GlobalResources::instance().getImage(wxT("cmpByContent"))); + m_bpButtonHelp ->SetBitmapLabel(GlobalResources::getImage(wxT("help"))); + m_bitmapByTime ->SetBitmap (GlobalResources::getImage(wxT("clock"))); + //m_bitmapBySize ->SetBitmap (GlobalResources::getImage(wxT("size"))); + m_bitmapByContent->SetBitmap (GlobalResources::getImage(wxT("cmpByContent"))); - switch (cmpVar) + switch (cmpConfig.compareVar) { case CMP_BY_TIME_SIZE: m_radioBtnSizeDate->SetValue(true); @@ -790,7 +720,7 @@ CompareCfgDialog::CompareCfgDialog(wxWindow* parent, break; } - setEnumVal(enumDescrHandleSyml, *m_choiceHandleSymlinks, handleSymlinks); + setEnumVal(enumDescrHandleSyml, *m_choiceHandleSymlinks, cmpConfig.handleSymlinks); updateView(); } @@ -803,28 +733,16 @@ void CompareCfgDialog::updateView() void CompareCfgDialog::OnOkay(wxCommandEvent& event) { if (m_radioBtnContent->GetValue()) - cmpVarOut = CMP_BY_CONTENT; + cmpConfigOut.compareVar = CMP_BY_CONTENT; else - cmpVarOut = CMP_BY_TIME_SIZE; + cmpConfigOut.compareVar = CMP_BY_TIME_SIZE; - handleSymlinksOut = getEnumVal(enumDescrHandleSyml, *m_choiceHandleSymlinks); + cmpConfigOut.handleSymlinks = getEnumVal(enumDescrHandleSyml, *m_choiceHandleSymlinks); EndModal(ReturnSmallDlg::BUTTON_OKAY); } -void CompareCfgDialog::OnTimeSize(wxCommandEvent& event) -{ - m_radioBtnSizeDate->SetValue(true); -} - - -void CompareCfgDialog::OnContent(wxCommandEvent& event) -{ - m_radioBtnContent->SetValue(true); -} - - void CompareCfgDialog::OnTimeSizeDouble(wxMouseEvent& event) { wxCommandEvent dummy; @@ -843,15 +761,17 @@ void CompareCfgDialog::OnContentDouble(wxMouseEvent& event) void CompareCfgDialog::OnShowHelp(wxCommandEvent& event) { - HelpDlg helpDlg(this); - helpDlg.ShowModal(); +#ifdef FFS_WIN + zen::displayHelpEntry(wxT("html\\ComparisonSettings.html")); +#elif defined FFS_LINUX + zen::displayHelpEntry(wxT("html/ComparisonSettings.html")); +#endif } -ReturnSmallDlg::ButtonPressed zen::showCompareCfgDialog(CompareVariant& cmpVar, - SymLinkHandling& handleSymlinks) +ReturnSmallDlg::ButtonPressed zen::showCompareCfgDialog(CompConfig& cmpConfig) { - CompareCfgDialog syncDlg(NULL, cmpVar, handleSymlinks); + CompareCfgDialog syncDlg(NULL, cmpConfig); return static_cast<ReturnSmallDlg::ButtonPressed>(syncDlg.ShowModal()); } @@ -887,16 +807,18 @@ GlobalSettingsDlg::GlobalSettingsDlg(wxWindow* parent, xmlAccess::XmlGlobalSetti new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif - m_bitmapSettings->SetBitmap(GlobalResources::instance().getImage(wxT("settings"))); - m_buttonResetDialogs->setBitmapFront(GlobalResources::instance().getImage(wxT("warningSmall")), 5); - m_bpButtonAddRow->SetBitmapLabel(GlobalResources::instance().getImage(wxT("addFolderPair"))); - m_bpButtonRemoveRow->SetBitmapLabel(GlobalResources::instance().getImage(wxT("removeFolderPair"))); + m_bitmapSettings->SetBitmap(GlobalResources::getImage(wxT("settings"))); + m_buttonResetDialogs->setBitmapFront(GlobalResources::getImage(wxT("warningSmall")), 5); + m_bpButtonAddRow->SetBitmapLabel(GlobalResources::getImage(wxT("addFolderPair"))); + m_bpButtonRemoveRow->SetBitmapLabel(GlobalResources::getImage(wxT("removeFolderPair"))); m_checkBoxCopyLocked ->SetValue(globalSettings.copyLockedFiles); - m_checkBoxTransCopy ->SetValue(globalSettings.transactionalFileCopy); + m_checkBoxTransCopy ->SetValue(globalSettings.transactionalFileCopy); m_checkBoxCopyPermissions->SetValue(globalSettings.copyFilePermissions); -#ifndef FFS_WIN +#ifdef FFS_WIN + m_checkBoxCopyPermissions->SetLabel(_("Copy NTFS permissions")); +#else m_checkBoxCopyLocked->Hide(); #endif @@ -921,7 +843,7 @@ void GlobalSettingsDlg::OnOkay(wxCommandEvent& event) { //write global settings only when okay-button is pressed! settings.copyLockedFiles = m_checkBoxCopyLocked->GetValue(); - settings.transactionalFileCopy = m_checkBoxTransCopy->GetValue(); + settings.transactionalFileCopy = m_checkBoxTransCopy->GetValue(); settings.copyFilePermissions = m_checkBoxCopyPermissions->GetValue(); settings.gui.externelApplications = getExtApp(); @@ -943,7 +865,7 @@ void GlobalSettingsDlg::OnDefault(wxCommandEvent& event) m_checkBoxCopyLocked ->SetValue(defaultCfg.copyLockedFiles); m_checkBoxTransCopy ->SetValue(defaultCfg.transactionalFileCopy); - m_checkBoxCopyPermissions->SetValue(defaultCfg.copyFilePermissions); + m_checkBoxCopyPermissions->SetValue(defaultCfg.copyFilePermissions); set(defaultCfg.gui.externelApplications); } @@ -962,16 +884,21 @@ void GlobalSettingsDlg::OnClose(wxCloseEvent& event) void GlobalSettingsDlg::set(const xmlAccess::ExternalApps& extApp) { + auto extAppTmp = extApp; + vector_remove_if(extAppTmp, [](decltype(extAppTmp[0])& entry) { return entry.first.empty() && entry.second.empty(); }); + + extAppTmp.resize(extAppTmp.size() + 1); //append empty row to facilitate insertions + const int rowCount = m_gridCustomCommand->GetNumberRows(); if (rowCount > 0) m_gridCustomCommand->DeleteRows(0, rowCount); - m_gridCustomCommand->AppendRows(static_cast<int>(extApp.size())); - for (xmlAccess::ExternalApps::const_iterator i = extApp.begin(); i != extApp.end(); ++i) + m_gridCustomCommand->AppendRows(static_cast<int>(extAppTmp.size())); + for (auto iter = extAppTmp.begin(); iter != extAppTmp.end(); ++iter) { - const int row = i - extApp.begin(); - m_gridCustomCommand->SetCellValue(row, 0, i->first); //description - m_gridCustomCommand->SetCellValue(row, 1, i->second); //commandline + const int row = iter - extAppTmp.begin(); + m_gridCustomCommand->SetCellValue(row, 0, iter->first); //description + m_gridCustomCommand->SetCellValue(row, 1, iter->second); //commandline } Fit(); } @@ -981,9 +908,12 @@ xmlAccess::ExternalApps GlobalSettingsDlg::getExtApp() { xmlAccess::ExternalApps output; for (int i = 0; i < m_gridCustomCommand->GetNumberRows(); ++i) - output.push_back( - std::make_pair(m_gridCustomCommand->GetCellValue(i, 0), //description - m_gridCustomCommand->GetCellValue(i, 1))); //commandline + { + auto entry = std::make_pair(m_gridCustomCommand->GetCellValue(i, 0), //description + m_gridCustomCommand->GetCellValue(i, 1)); //commandline + if (!entry.first.empty() || !entry.second.empty()) + output.push_back(entry); + } return output; } @@ -1024,3 +954,121 @@ ReturnSmallDlg::ButtonPressed zen::showGlobalSettingsDlg(xmlAccess::XmlGlobalSet GlobalSettingsDlg settingsDlg(NULL, globalSettings); return static_cast<ReturnSmallDlg::ButtonPressed>(settingsDlg.ShowModal()); } +//######################################################################################## + + +class SelectTimespanDlg : public SelectTimespanDlgGenerated +{ +public: + SelectTimespanDlg(wxWindow* parent, Int64& timeFrom, Int64& timeTo); + +private: + void OnOkay(wxCommandEvent& event); + void OnCancel(wxCommandEvent& event) { EndModal(0); } + void OnClose(wxCloseEvent& event) { EndModal(0); } + + virtual void OnChangeSelectionFrom(wxCalendarEvent& event) + { + if (m_calendarFrom->GetDate() > m_calendarTo->GetDate()) + m_calendarTo->SetDate(m_calendarFrom->GetDate()); + } + virtual void OnChangeSelectionTo(wxCalendarEvent& event) + { + if (m_calendarFrom->GetDate() > m_calendarTo->GetDate()) + m_calendarFrom->SetDate(m_calendarTo->GetDate()); + } + + Int64& timeFrom_; + Int64& timeTo_; +}; + + +wxDateTime utcToLocalDateTime(time_t utcTime) +{ + //wxDateTime models local(!) time (in contrast to what documentation says), but this constructor takes time_t UTC + return wxDateTime(utcTime); +} + +time_t localDateTimeToUtc(const wxDateTime& localTime) +{ + return localTime.GetTicks(); +} + + +SelectTimespanDlg::SelectTimespanDlg(wxWindow* parent, Int64& timeFrom, Int64& timeTo) : + SelectTimespanDlgGenerated(parent), + timeFrom_(timeFrom), + timeTo_(timeTo) +{ +#ifdef FFS_WIN + new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" +#endif + + long style = wxCAL_SHOW_HOLIDAYS; + +#ifdef FFS_WIN + DWORD firstDayOfWeek = 0; + if (::GetLocaleInfo(LOCALE_USER_DEFAULT, //__in LCID Locale, + LOCALE_IFIRSTDAYOFWEEK | // first day of week specifier, 0-6, 0=Monday, 6=Sunday + LOCALE_RETURN_NUMBER, //__in LCTYPE LCType, + reinterpret_cast<LPTSTR>(&firstDayOfWeek), //__out LPTSTR lpLCData, + sizeof(firstDayOfWeek) / sizeof(TCHAR)) != 0 && //__in int cchData + firstDayOfWeek == 6) + style |= wxCAL_SUNDAY_FIRST; + else //default +#endif + style |= wxCAL_MONDAY_FIRST; + + m_calendarFrom->SetWindowStyleFlag(style); + m_calendarTo ->SetWindowStyleFlag(style); + + //set default values + if (timeTo_ == 0) + timeTo_ = wxGetUTCTime(); // + if (timeFrom_ == 0) + timeFrom_ = timeTo_ - 7 * 24 * 3600; //default time span: one week from "now" + + m_calendarFrom->SetDate(utcToLocalDateTime(to<time_t>(timeFrom_))); + m_calendarTo ->SetDate(utcToLocalDateTime(to<time_t>(timeTo_))); + + m_buttonOkay->SetFocus(); + Fit(); +} + + +void SelectTimespanDlg::OnOkay(wxCommandEvent& event) +{ + wxDateTime from = m_calendarFrom->GetDate(); + wxDateTime to = m_calendarTo ->GetDate(); + + //align to full days + from.ResetTime(); + to += wxTimeSpan::Day(); + to.ResetTime(); //reset local(!) time + to -= wxTimeSpan::Second(); //go back to end of previous day + + timeFrom_ = localDateTimeToUtc(from); + timeTo_ = localDateTimeToUtc(to); + + /* + { + time_t current = zen::to<time_t>(timeFrom_); + struct tm* tdfewst = ::localtime(¤t); + int budfk = 3; + } + { + time_t current = zen::to<time_t>(timeTo_); + struct tm* tdfewst = ::localtime(¤t); + int budfk = 3; + } + */ + + EndModal(ReturnSmallDlg::BUTTON_OKAY); +} + + +ReturnSmallDlg::ButtonPressed zen::showSelectTimespanDlg(Int64& timeFrom, Int64& timeTo) +{ + SelectTimespanDlg timeSpanDlg(NULL, timeFrom, timeTo); + return static_cast<ReturnSmallDlg::ButtonPressed>(timeSpanDlg.ShowModal()); +} diff --git a/ui/small_dlgs.h b/ui/small_dlgs.h index 93c90445..ca497bfb 100644 --- a/ui/small_dlgs.h +++ b/ui/small_dlgs.h @@ -25,8 +25,6 @@ struct ReturnSmallDlg void showAboutDialog(); -void showHelpDialog(); - ReturnSmallDlg::ButtonPressed showFilterDialog(bool isGlobalFilter, FilterConfig& filter); ReturnSmallDlg::ButtonPressed showDeleteDialog( @@ -42,11 +40,11 @@ ReturnSmallDlg::ButtonPressed showSyncPreviewDlg( const SyncStatistics& statistics, bool& dontShowAgain); -ReturnSmallDlg::ButtonPressed showCompareCfgDialog( - CompareVariant& cmpVar, - SymLinkHandling& handleSymlinks); +ReturnSmallDlg::ButtonPressed showCompareCfgDialog(CompConfig& cmpConfig); ReturnSmallDlg::ButtonPressed showGlobalSettingsDlg(xmlAccess::XmlGlobalSettings& globalSettings); + +ReturnSmallDlg::ButtonPressed showSelectTimespanDlg(Int64& timeFrom, Int64& timeTo); } #endif // SMALLDIALOGS_H_INCLUDED diff --git a/ui/sorting.h b/ui/sorting.h index fa4e9973..719934d8 100644 --- a/ui/sorting.h +++ b/ui/sorting.h @@ -53,8 +53,7 @@ struct Compare<false> }; -template <bool ascending, SelectedSide side> -inline +template <bool ascending, SelectedSide side> inline bool lessShortFileName(const FileSystemObject& a, const FileSystemObject& b) { //presort types: first files, then directories then empty rows @@ -82,24 +81,18 @@ bool lessShortFileName(const FileSystemObject& a, const FileSystemObject& b) } -template <bool ascending, SelectedSide side> +template <bool ascending> //side currently unused! bool lessRelativeName(const FileSystemObject& a, const FileSystemObject& b) { - if (a.isEmpty<side>()) - return false; //empty rows always last - else if (b.isEmpty<side>()) - return true; //empty rows always last - const bool isDirectoryA = isDirectoryMapping(a); const Zstring& relDirNameA = isDirectoryA ? - a.getRelativeName<side>() : //directory - a.getParentRelativeName(); //file or symlink + a.getObjRelativeName() : //directory + a.getObjRelativeName().BeforeLast(FILE_NAME_SEPARATOR); //returns empty string if ch not found const bool isDirectoryB = isDirectoryMapping(b); const Zstring& relDirNameB = isDirectoryB ? - b.getRelativeName<side>() : //directory - b.getParentRelativeName(); //file or symlink - + b.getObjRelativeName() : //directory + b.getObjRelativeName().BeforeLast(FILE_NAME_SEPARATOR); //returns empty string if ch not found //compare relative names without filenames first const int rv = cmpFileName(relDirNameA, relDirNameB); @@ -112,13 +105,12 @@ bool lessRelativeName(const FileSystemObject& a, const FileSystemObject& b) else if (isDirectoryA) return true; - return LessFilename()(a.getShortName<side>(), b.getShortName<side>()); + return LessFilename()(a.getObjShortName(), b.getObjShortName()); } } -template <bool ascending, SelectedSide side> -inline +template <bool ascending, SelectedSide side> inline bool lessFilesize(const FileSystemObject& a, const FileSystemObject& b) { //empty rows always last @@ -150,8 +142,7 @@ bool lessFilesize(const FileSystemObject& a, const FileSystemObject& b) } -template <bool ascending, SelectedSide side> -inline +template <bool ascending, SelectedSide side> inline bool lessFiletime(const FileSystemObject& a, const FileSystemObject& b) { if (a.isEmpty<side>()) @@ -179,8 +170,7 @@ bool lessFiletime(const FileSystemObject& a, const FileSystemObject& b) } -template <bool ascending, SelectedSide side> -inline +template <bool ascending, SelectedSide side> inline bool lessExtension(const FileSystemObject& a, const FileSystemObject& b) { if (a.isEmpty<side>()) @@ -201,8 +191,7 @@ bool lessExtension(const FileSystemObject& a, const FileSystemObject& b) } -template <bool ascending> -inline +template <bool ascending> inline bool lessCmpResult(const FileSystemObject& a, const FileSystemObject& b) { //presort result: equal shall appear at end of list @@ -215,8 +204,7 @@ bool lessCmpResult(const FileSystemObject& a, const FileSystemObject& b) } -template <bool ascending> -inline +template <bool ascending> inline bool lessSyncDirection(const FileSystemObject& a, const FileSystemObject& b) { return Compare<ascending>().isSmallerThan(a.getSyncOperation(), b.getSyncOperation()); diff --git a/ui/switch_to_gui.cpp b/ui/switch_to_gui.cpp index 7bd28c59..76e5b282 100644 --- a/ui/switch_to_gui.cpp +++ b/ui/switch_to_gui.cpp @@ -20,8 +20,8 @@ void SwitchToGui::execute() const //throw() { try { - MainDialog* frame = new MainDialog(guiCfg, globalSettings_, true); + MainDialog* frame = new MainDialog(guiCfg, globalSettings_, true); //toplevel window frame->Show(); } - catch(...) {} + catch (...) {} } diff --git a/ui/sync_cfg.cpp b/ui/sync_cfg.cpp index 5e78e97a..d85e2bcf 100644 --- a/ui/sync_cfg.cpp +++ b/ui/sync_cfg.cpp @@ -15,6 +15,7 @@ #include <memory> #include "../shared/wx_choice_enum.h" #include "../shared/dir_name.h" +#include "../shared/image_tools.h" using namespace zen; using namespace xmlAccess; @@ -26,14 +27,10 @@ class SyncCfgDialog : public SyncCfgDlgGenerated { public: SyncCfgDialog(wxWindow* window, - zen::CompareVariant compareVar, - zen::SyncConfig& syncConfiguration, - zen::DeletionPolicy& handleDeletion, - wxString& customDeletionDirectory, + CompareVariant compareVar, + SyncConfig& syncCfg, xmlAccess::OnGuiError* handleError); //optional input parameter - ~SyncCfgDialog(); - private: virtual void OnSyncAutomatic( wxCommandEvent& event); virtual void OnSyncMirror( wxCommandEvent& event); @@ -63,24 +60,22 @@ private: const zen::CompareVariant cmpVariant; - //temporal copy of maindialog.cfg.syncConfiguration -> ownership NOT within GUI controls! - zen::SyncConfig currentSyncConfig; + //temporal copy of maindialog.cfg.directionCfg -> ownership NOT within GUI controls! + DirectionConfig currentDirectionCfg; //changing data - zen::SyncConfig& refSyncConfiguration; - zen::DeletionPolicy& refHandleDeletion; - wxString& refCustomDeletionDirectory; - xmlAccess::OnGuiError* refHandleError; + SyncConfig& syncCfgOut; + xmlAccess::OnGuiError* refHandleError; - zen::DirectoryName customDelFolder; + DirectoryName<FolderHistoryBox> customDelFolder; - zen::EnumDescrList<zen::DeletionPolicy> enumDelhandDescr; - zen::EnumDescrList<xmlAccess::OnGuiError> enumErrhandDescr; + EnumDescrList<zen::DeletionPolicy> enumDelhandDescr; + EnumDescrList<xmlAccess::OnGuiError> enumErrhandDescr; }; -void updateConfigIcons(const SyncConfig& syncConfig, +void updateConfigIcons(const DirectionConfig& directionCfg, wxBitmapButton* buttonLeftOnly, wxBitmapButton* buttonRightOnly, wxBitmapButton* buttonLeftNewer, @@ -94,22 +89,22 @@ void updateConfigIcons(const SyncConfig& syncConfig, wxStaticBitmap* bitmapDifferent, wxStaticBitmap* bitmapConflict) //sizer containing all sync-directions { - if (syncConfig.var != SyncConfig::AUTOMATIC) //automatic mode needs no sync-directions + if (directionCfg.var != DirectionConfig::AUTOMATIC) //automatic mode needs no sync-directions { - const DirectionSet dirCfg = extractDirections(syncConfig); + const DirectionSet dirCfg = extractDirections(directionCfg); switch (dirCfg.exLeftSideOnly) { case SYNC_DIR_RIGHT: - buttonLeftOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRightCr"))); + buttonLeftOnly->SetBitmapLabel(GlobalResources::getImage(wxT("createRight"))); buttonLeftOnly->SetToolTip(getDescription(SO_CREATE_NEW_RIGHT)); break; case SYNC_DIR_LEFT: - buttonLeftOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("deleteLeft"))); + buttonLeftOnly->SetBitmapLabel(GlobalResources::getImage(wxT("deleteLeft"))); buttonLeftOnly->SetToolTip(getDescription(SO_DELETE_LEFT)); break; case SYNC_DIR_NONE: - buttonLeftOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone"))); + buttonLeftOnly->SetBitmapLabel(GlobalResources::getImage(wxT("none"))); buttonLeftOnly->SetToolTip(getDescription(SO_DO_NOTHING)); break; } @@ -117,15 +112,15 @@ void updateConfigIcons(const SyncConfig& syncConfig, switch (dirCfg.exRightSideOnly) { case SYNC_DIR_RIGHT: - buttonRightOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("deleteRight"))); + buttonRightOnly->SetBitmapLabel(GlobalResources::getImage(wxT("deleteRight"))); buttonRightOnly->SetToolTip(getDescription(SO_DELETE_RIGHT)); break; case SYNC_DIR_LEFT: - buttonRightOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeftCr"))); + buttonRightOnly->SetBitmapLabel(GlobalResources::getImage(wxT("createLeft"))); buttonRightOnly->SetToolTip(getDescription(SO_CREATE_NEW_LEFT)); break; case SYNC_DIR_NONE: - buttonRightOnly->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone"))); + buttonRightOnly->SetBitmapLabel(GlobalResources::getImage(wxT("none"))); buttonRightOnly->SetToolTip(getDescription(SO_DO_NOTHING)); break; } @@ -133,15 +128,15 @@ void updateConfigIcons(const SyncConfig& syncConfig, switch (dirCfg.leftNewer) { case SYNC_DIR_RIGHT: - buttonLeftNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight"))); + buttonLeftNewer->SetBitmapLabel(GlobalResources::getImage(wxT("updateRight"))); buttonLeftNewer->SetToolTip(getDescription(SO_OVERWRITE_RIGHT)); break; case SYNC_DIR_LEFT: - buttonLeftNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft"))); + buttonLeftNewer->SetBitmapLabel(GlobalResources::getImage(wxT("updateLeft"))); buttonLeftNewer->SetToolTip(getDescription(SO_OVERWRITE_LEFT)); break; case SYNC_DIR_NONE: - buttonLeftNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone"))); + buttonLeftNewer->SetBitmapLabel(GlobalResources::getImage(wxT("none"))); buttonLeftNewer->SetToolTip(getDescription(SO_DO_NOTHING)); break; } @@ -149,15 +144,15 @@ void updateConfigIcons(const SyncConfig& syncConfig, switch (dirCfg.rightNewer) { case SYNC_DIR_RIGHT: - buttonRightNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight"))); + buttonRightNewer->SetBitmapLabel(GlobalResources::getImage(wxT("updateRight"))); buttonRightNewer->SetToolTip(getDescription(SO_OVERWRITE_RIGHT)); break; case SYNC_DIR_LEFT: - buttonRightNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft"))); + buttonRightNewer->SetBitmapLabel(GlobalResources::getImage(wxT("updateLeft"))); buttonRightNewer->SetToolTip(getDescription(SO_OVERWRITE_LEFT)); break; case SYNC_DIR_NONE: - buttonRightNewer->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone"))); + buttonRightNewer->SetBitmapLabel(GlobalResources::getImage(wxT("none"))); buttonRightNewer->SetToolTip(getDescription(SO_DO_NOTHING)); break; } @@ -165,15 +160,15 @@ void updateConfigIcons(const SyncConfig& syncConfig, switch (dirCfg.different) { case SYNC_DIR_RIGHT: - buttonDifferent->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight"))); + buttonDifferent->SetBitmapLabel(GlobalResources::getImage(wxT("updateRight"))); buttonDifferent->SetToolTip(getDescription(SO_OVERWRITE_RIGHT)); break; case SYNC_DIR_LEFT: - buttonDifferent->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft"))); + buttonDifferent->SetBitmapLabel(GlobalResources::getImage(wxT("updateLeft"))); buttonDifferent->SetToolTip(getDescription(SO_OVERWRITE_LEFT)); break; case SYNC_DIR_NONE: - buttonDifferent->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowNone"))); + buttonDifferent->SetBitmapLabel(GlobalResources::getImage(wxT("none"))); buttonDifferent->SetToolTip(getDescription(SO_DO_NOTHING)); break; } @@ -181,15 +176,15 @@ void updateConfigIcons(const SyncConfig& syncConfig, switch (dirCfg.conflict) { case SYNC_DIR_RIGHT: - buttonConflict->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowRight"))); + buttonConflict->SetBitmapLabel(GlobalResources::getImage(wxT("updateRight"))); buttonConflict->SetToolTip(getDescription(SO_OVERWRITE_RIGHT)); break; case SYNC_DIR_LEFT: - buttonConflict->SetBitmapLabel(GlobalResources::instance().getImage(wxT("arrowLeft"))); + buttonConflict->SetBitmapLabel(GlobalResources::getImage(wxT("updateLeft"))); buttonConflict->SetToolTip(getDescription(SO_OVERWRITE_LEFT)); break; case SYNC_DIR_NONE: - buttonConflict->SetBitmapLabel(GlobalResources::instance().getImage(wxT("conflict"))); + buttonConflict->SetBitmapLabel(GlobalResources::getImage(wxT("conflict"))); buttonConflict->SetToolTip(_("Leave as unresolved conflict")); break; } @@ -198,19 +193,15 @@ void updateConfigIcons(const SyncConfig& syncConfig, SyncCfgDialog::SyncCfgDialog(wxWindow* window, - CompareVariant compareVar, - SyncConfig& syncConfiguration, - DeletionPolicy& handleDeletion, - wxString& customDeletionDirectory, - OnGuiError* handleError) : + CompareVariant compareVar, + SyncConfig& syncCfg, + xmlAccess::OnGuiError* handleError) : //optional input parameter SyncCfgDlgGenerated(window), cmpVariant(compareVar), - currentSyncConfig(syncConfiguration), //make working copy of syncConfiguration - refSyncConfiguration(syncConfiguration), - refHandleDeletion(handleDeletion), - refCustomDeletionDirectory(customDeletionDirectory), + currentDirectionCfg(syncCfg.directionCfg), //make working copy + syncCfgOut(syncCfg), refHandleError(handleError), - customDelFolder(*m_panelCustomDeletionDir, *m_dirPickerCustomDelFolder, *m_textCtrlCustomDelFolder) + customDelFolder(*m_panelCustomDeletionDir, *m_dirPickerCustomDelFolder, *m_customDelFolder) { #ifdef FFS_WIN new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" @@ -222,13 +213,13 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* window, add(MOVE_TO_CUSTOM_DIRECTORY, _("Versioning"), _("Move files into a time-stamped subdirectory")); enumErrhandDescr. - add(ON_GUIERROR_POPUP, _("Show popup"), _("Show popup on errors or warnings")). + add(ON_GUIERROR_POPUP, _("Show pop-up"), _("Show pop-up on errors or warnings")). add(ON_GUIERROR_IGNORE, _("Ignore errors"), _("Hide all error and warning messages")); //a proper set-method may be in order some time... - setEnumVal(enumDelhandDescr, *m_choiceHandleDeletion, handleDeletion); - customDelFolder.setName(customDeletionDirectory); + setEnumVal(enumDelhandDescr, *m_choiceHandleDeletion, syncCfg.handleDeletion); + customDelFolder.setName(syncCfg.customDeletionDirectory); updateGui(); //error handling @@ -244,13 +235,13 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* window, updateGui(); //set icons for this dialog - m_bitmapLeftOnly ->SetBitmap(GlobalResources::instance().getImage(wxT("leftOnly"))); - m_bitmapRightOnly ->SetBitmap(GlobalResources::instance().getImage(wxT("rightOnly"))); - m_bitmapLeftNewer ->SetBitmap(GlobalResources::instance().getImage(wxT("leftNewer"))); - m_bitmapRightNewer->SetBitmap(GlobalResources::instance().getImage(wxT("rightNewer"))); - m_bitmapDifferent ->SetBitmap(GlobalResources::instance().getImage(wxT("different"))); - m_bitmapConflict ->SetBitmap(GlobalResources::instance().getImage(wxT("conflictGrey"))); - m_bitmapDatabase ->SetBitmap(GlobalResources::instance().getImage(wxT("database"))); + m_bitmapLeftOnly ->SetBitmap(greyScale(GlobalResources::getImage(L"leftOnly"))); + m_bitmapRightOnly ->SetBitmap(greyScale(GlobalResources::getImage(L"rightOnly"))); + m_bitmapLeftNewer ->SetBitmap(greyScale(GlobalResources::getImage(L"leftNewer"))); + m_bitmapRightNewer->SetBitmap(greyScale(GlobalResources::getImage(L"rightNewer"))); + m_bitmapDifferent ->SetBitmap(greyScale(GlobalResources::getImage(L"different"))); + m_bitmapConflict ->SetBitmap(greyScale(GlobalResources::getImage(L"conflict"))); + m_bitmapDatabase ->SetBitmap(GlobalResources::getImage(wxT("database"))); bSizer201->Layout(); //wxButtonWithImage size might have changed @@ -258,11 +249,8 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* window, Fit(); } - //################################################################################################################# -SyncCfgDialog::~SyncCfgDialog() {} //non-inline destructor for std::auto_ptr to work with forward declaration - void SyncCfgDialog::updateGui() { @@ -275,7 +263,7 @@ void SyncCfgDialog::updateGui() wxWindowUpdateLocker dummy7(m_bpButtonDifferent); wxWindowUpdateLocker dummy8(m_bpButtonConflict); - updateConfigIcons(currentSyncConfig, + updateConfigIcons(currentDirectionCfg, m_bpButtonLeftOnly, m_bpButtonRightOnly, m_bpButtonLeftNewer, @@ -293,7 +281,7 @@ void SyncCfgDialog::updateGui() m_bitmapDatabase->Show(true); sbSizerSyncDirections->Show(true); - if (currentSyncConfig.var == SyncConfig::AUTOMATIC) + if (currentDirectionCfg.var == DirectionConfig::AUTOMATIC) { sbSizerSyncDirections->Show(false); } @@ -314,18 +302,18 @@ void SyncCfgDialog::updateGui() } //set radiobuttons -> have no parameter-ownership at all! - switch (currentSyncConfig.var) + switch (currentDirectionCfg.var) { - case SyncConfig::AUTOMATIC: + case DirectionConfig::AUTOMATIC: m_radioBtnAutomatic->SetValue(true); //automatic mode break; - case SyncConfig::MIRROR: + case DirectionConfig::MIRROR: m_radioBtnMirror->SetValue(true); //one way -> break; - case SyncConfig::UPDATE: + case DirectionConfig::UPDATE: m_radioBtnUpdate->SetValue(true); //Update -> break; - case SyncConfig::CUSTOM: + case DirectionConfig::CUSTOM: m_radioBtnCustom->SetValue(true); //custom break; } @@ -340,10 +328,10 @@ void SyncCfgDialog::updateGui() void SyncCfgDialog::OnApply(wxCommandEvent& event) { //write configuration to main dialog - refSyncConfiguration = currentSyncConfig; - refHandleDeletion = getEnumVal(enumDelhandDescr, *m_choiceHandleDeletion); + syncCfgOut.directionCfg = currentDirectionCfg; + syncCfgOut.handleDeletion = getEnumVal(enumDelhandDescr, *m_choiceHandleDeletion); + syncCfgOut.customDeletionDirectory = customDelFolder.getName(); - refCustomDeletionDirectory = customDelFolder.getName(); if (refHandleError) *refHandleError = getEnumVal(enumErrhandDescr, *m_choiceHandleError); @@ -366,28 +354,28 @@ void SyncCfgDialog::OnChangeDeletionHandling(wxCommandEvent& event) void SyncCfgDialog::OnSyncAutomatic(wxCommandEvent& event) { - currentSyncConfig.var = SyncConfig::AUTOMATIC; + currentDirectionCfg.var = DirectionConfig::AUTOMATIC; updateGui(); } void SyncCfgDialog::OnSyncMirror(wxCommandEvent& event) { - currentSyncConfig.var = SyncConfig::MIRROR; + currentDirectionCfg.var = DirectionConfig::MIRROR; updateGui(); } void SyncCfgDialog::OnSyncUpdate(wxCommandEvent& event) { - currentSyncConfig.var = SyncConfig::UPDATE; + currentDirectionCfg.var = DirectionConfig::UPDATE; updateGui(); } void SyncCfgDialog::OnSyncCustom(wxCommandEvent& event) { - currentSyncConfig.var = SyncConfig::CUSTOM; + currentDirectionCfg.var = DirectionConfig::CUSTOM; updateGui(); } @@ -438,41 +426,41 @@ void toggleSyncDirection(SyncDirection& current) } -void pressCustomDir(SyncConfig& syncCfg, SyncDirection& syncdir) +void pressCustomDir(DirectionConfig& directionCfg, SyncDirection& syncdir) { - switch (syncCfg.var) + switch (directionCfg.var) { - case SyncConfig::AUTOMATIC: + case DirectionConfig::AUTOMATIC: assert(false); break; - case SyncConfig::MIRROR: - case SyncConfig::UPDATE: - syncCfg.custom = extractDirections(syncCfg); - syncCfg.var = SyncConfig::CUSTOM; + case DirectionConfig::MIRROR: + case DirectionConfig::UPDATE: + directionCfg.custom = extractDirections(directionCfg); + directionCfg.var = DirectionConfig::CUSTOM; toggleSyncDirection(syncdir); break; - case SyncConfig::CUSTOM: + case DirectionConfig::CUSTOM: toggleSyncDirection(syncdir); //some config optimization: if custom settings happen to match "mirror" or "update", just switch variant - DirectionSet currentSet = extractDirections(syncCfg); + DirectionSet currentSet = extractDirections(directionCfg); DirectionSet setMirror; DirectionSet setUpdate; { - SyncConfig mirrorCfg; - mirrorCfg.var = SyncConfig::MIRROR; + DirectionConfig mirrorCfg; + mirrorCfg.var = DirectionConfig::MIRROR; setMirror = extractDirections(mirrorCfg); } { - SyncConfig updateCfg; - updateCfg.var = SyncConfig::UPDATE; + DirectionConfig updateCfg; + updateCfg.var = DirectionConfig::UPDATE; setUpdate = extractDirections(updateCfg); } if (currentSet == setMirror) - syncCfg.var = SyncConfig::MIRROR; + directionCfg.var = DirectionConfig::MIRROR; else if (currentSet == setUpdate) - syncCfg.var = SyncConfig::UPDATE; + directionCfg.var = DirectionConfig::UPDATE; break; } } @@ -480,60 +468,54 @@ void pressCustomDir(SyncConfig& syncCfg, SyncDirection& syncdir) void SyncCfgDialog::OnExLeftSideOnly(wxCommandEvent& event ) { - pressCustomDir(currentSyncConfig, currentSyncConfig.custom.exLeftSideOnly); + pressCustomDir(currentDirectionCfg, currentDirectionCfg.custom.exLeftSideOnly); updateGui(); } void SyncCfgDialog::OnExRightSideOnly(wxCommandEvent& event ) { - pressCustomDir(currentSyncConfig, currentSyncConfig.custom.exRightSideOnly); + pressCustomDir(currentDirectionCfg, currentDirectionCfg.custom.exRightSideOnly); updateGui(); } void SyncCfgDialog::OnLeftNewer(wxCommandEvent& event ) { - pressCustomDir(currentSyncConfig, currentSyncConfig.custom.leftNewer); + pressCustomDir(currentDirectionCfg, currentDirectionCfg.custom.leftNewer); updateGui(); } void SyncCfgDialog::OnRightNewer(wxCommandEvent& event ) { - pressCustomDir(currentSyncConfig, currentSyncConfig.custom.rightNewer); + pressCustomDir(currentDirectionCfg, currentDirectionCfg.custom.rightNewer); updateGui(); } void SyncCfgDialog::OnDifferent(wxCommandEvent& event ) { - pressCustomDir(currentSyncConfig, currentSyncConfig.custom.different); + pressCustomDir(currentDirectionCfg, currentDirectionCfg.custom.different); updateGui(); } void SyncCfgDialog::OnConflict(wxCommandEvent& event) { - pressCustomDir(currentSyncConfig, currentSyncConfig.custom.conflict); + pressCustomDir(currentDirectionCfg, currentDirectionCfg.custom.conflict); updateGui(); } - - -ReturnSyncConfig::ButtonPressed zen::showSyncConfigDlg(zen::CompareVariant compareVar, - zen::SyncConfig& syncConfiguration, - zen::DeletionPolicy& handleDeletion, - wxString& customDeletionDirectory, +ReturnSyncConfig::ButtonPressed zen::showSyncConfigDlg(CompareVariant compareVar, + SyncConfig& syncCfg, xmlAccess::OnGuiError* handleError) //optional input parameter { SyncCfgDialog syncDlg(NULL, compareVar, - syncConfiguration, - handleDeletion, - customDeletionDirectory, + syncCfg, handleError); return static_cast<ReturnSyncConfig::ButtonPressed>(syncDlg.ShowModal()); diff --git a/ui/sync_cfg.h b/ui/sync_cfg.h index 7612d29b..1b95f53b 100644 --- a/ui/sync_cfg.h +++ b/ui/sync_cfg.h @@ -20,10 +20,8 @@ struct ReturnSyncConfig }; }; -ReturnSyncConfig::ButtonPressed showSyncConfigDlg(zen::CompareVariant compareVar, - zen::SyncConfig& syncConfiguration, - zen::DeletionPolicy& handleDeletion, - wxString& customDeletionDirectory, +ReturnSyncConfig::ButtonPressed showSyncConfigDlg(CompareVariant compareVar, + SyncConfig& syncCfg, xmlAccess::OnGuiError* handleError); //optional input parameter } diff --git a/ui/tray_icon.cpp b/ui/tray_icon.cpp index 90893c9f..96ae47e6 100644 --- a/ui/tray_icon.cpp +++ b/ui/tray_icon.cpp @@ -13,6 +13,7 @@ #include <wx/image.h> #include <wx/menu.h> #include <wx/icon.h> //req. by Linux +#include "../shared/image_tools.h" const wxEventType FFS_REQUEST_RESUME_TRAY_EVENT = wxNewEventType(); @@ -47,16 +48,16 @@ void fillRange(wxImage& img, int pixelFirst, int pixelLast, const wxColor& col) } } -wxIcon generateIcon(double percent) //generate icon with progress indicator +wxIcon generateIcon(double fraction) //generate icon with progress indicator { #ifdef FFS_WIN - static const wxBitmap trayIcon = GlobalResources::instance().getImage(wxT("FFS_tray_win.png")); + static const wxBitmap trayIcon = GlobalResources::getImage(wxT("FFS_tray_win.png")); #elif defined FFS_LINUX - static const wxBitmap trayIcon = GlobalResources::instance().getImage(wxT("FFS_tray_linux.png")); + static const wxBitmap trayIcon = GlobalResources::getImage(wxT("FFS_tray_linux.png")); #endif const int pixelCount = trayIcon.GetWidth() * trayIcon.GetHeight(); - const int startFillPixel = std::min(roundNum(percent / 100.0 * pixelCount), pixelCount); + const int startFillPixel = std::min(roundNum(fraction * pixelCount), pixelCount); //minor optimization static std::pair<int, wxIcon> buffer = std::make_pair(-1, wxNullIcon); @@ -65,74 +66,81 @@ wxIcon generateIcon(double percent) //generate icon with progress indicator wxIcon genIcon; - wxImage genImage(trayIcon.ConvertToImage()); - if (genImage.GetWidth() > 0 && - genImage.GetHeight() > 0) { - //fill black border row - if (startFillPixel <= pixelCount - genImage.GetWidth()) - { - /* - -------- - ---bbbbb - bbbbSyyy S : start yellow remainder - yyyyyyyy - */ - int bStart = startFillPixel - genImage.GetWidth(); - if (bStart % genImage.GetWidth() != 0) //add one more black pixel, see ascii-art - --bStart; - fillRange(genImage, std::max(bStart, 0), startFillPixel, *wxBLACK); - } - else if (startFillPixel != pixelCount) - { - //special handling for last row - /* - -------- - -------- - ---bbbbb - ---bSyyy S : start yellow remainder - */ - int bStart = startFillPixel - genImage.GetWidth() - 1; - int bEnd = (bStart / genImage.GetWidth() + 1) * (genImage.GetWidth()); + wxImage genImage(trayIcon.ConvertToImage()); - fillRange(genImage, std::max(bStart, 0), bEnd, *wxBLACK); - fillRange(genImage, startFillPixel - 1, startFillPixel, *wxBLACK); - } + //gradually make FFS icon brighter while nearing completion + zen::brighten(genImage, -200 * (1 - fraction)); - //fill yellow remainder - fillRange(genImage, startFillPixel, pixelCount, wxColour(240, 200, 0)); + //progress bar + if (genImage.GetWidth() > 0 && + genImage.GetHeight() > 0) + { + //fill black border row + if (startFillPixel <= pixelCount - genImage.GetWidth()) + { + /* + -------- + ---bbbbb + bbbbSyyy S : start yellow remainder + yyyyyyyy + */ + int bStart = startFillPixel - genImage.GetWidth(); + if (bStart % genImage.GetWidth() != 0) //add one more black pixel, see ascii-art + --bStart; + fillRange(genImage, std::max(bStart, 0), startFillPixel, *wxBLACK); + } + else if (startFillPixel != pixelCount) + { + //special handling for last row + /* + -------- + -------- + ---bbbbb + ---bSyyy S : start yellow remainder + */ + int bStart = startFillPixel - genImage.GetWidth() - 1; + int bEnd = (bStart / genImage.GetWidth() + 1) * (genImage.GetWidth()); + + fillRange(genImage, std::max(bStart, 0), bEnd, *wxBLACK); + fillRange(genImage, startFillPixel - 1, startFillPixel, *wxBLACK); + } + + //fill yellow remainder + fillRange(genImage, startFillPixel, pixelCount, wxColour(240, 200, 0)); - /* - const int indicatorWidth = genImage.GetWidth() * .4; - const int indicatorXBegin = std::ceil((genImage.GetWidth() - indicatorWidth) / 2.0); - const int indicatorYBegin = genImage.GetHeight() - indicatorHeight; + /* + const int indicatorWidth = genImage.GetWidth() * .4; + const int indicatorXBegin = std::ceil((genImage.GetWidth() - indicatorWidth) / 2.0); + const int indicatorYBegin = genImage.GetHeight() - indicatorHeight; - //draw progress indicator: do NOT use wxDC::DrawRectangle! Doesn't respect alpha in Windows, but does in Linux! - //We need a simple, working solution: + //draw progress indicator: do NOT use wxDC::DrawRectangle! Doesn't respect alpha in Windows, but does in Linux! + //We need a simple, working solution: - for (int row = indicatorYBegin; row < genImage.GetHeight(); ++row) - { - for (int col = indicatorXBegin; col < indicatorXBegin + indicatorWidth; ++col) + for (int row = indicatorYBegin; row < genImage.GetHeight(); ++row) { - unsigned char* const pixelBegin = data + (row * genImage.GetWidth() + col) * 3; - pixelBegin[0] = 240; //red - pixelBegin[1] = 200; //green - pixelBegin[2] = 0; //blue + for (int col = indicatorXBegin; col < indicatorXBegin + indicatorWidth; ++col) + { + unsigned char* const pixelBegin = data + (row * genImage.GetWidth() + col) * 3; + pixelBegin[0] = 240; //red + pixelBegin[1] = 200; //green + pixelBegin[2] = 0; //blue + } } - } - if (genImage.HasAlpha()) - { - unsigned char* const alpha = genImage.GetAlpha(); - //make progress indicator fully opaque: - for (int row = indicatorYBegin; row < genImage.GetHeight(); ++row) - ::memset(alpha + row * genImage.GetWidth() + indicatorXBegin, wxIMAGE_ALPHA_OPAQUE, indicatorWidth); - } - */ - genIcon.CopyFromBitmap(wxBitmap(genImage)); + if (genImage.HasAlpha()) + { + unsigned char* const alpha = genImage.GetAlpha(); + //make progress indicator fully opaque: + for (int row = indicatorYBegin; row < genImage.GetHeight(); ++row) + ::memset(alpha + row * genImage.GetWidth() + indicatorXBegin, wxIMAGE_ALPHA_OPAQUE, indicatorWidth); + } + */ + genIcon.CopyFromBitmap(wxBitmap(genImage)); + } + else //fallback + genIcon.CopyFromBitmap(trayIcon); } - else //fallback - genIcon.CopyFromBitmap(trayIcon); //fill buffer buffer.first = startFillPixel; @@ -197,9 +205,9 @@ FfsTrayIcon::~FfsTrayIcon() } -void FfsTrayIcon::setToolTip(const wxString& toolTipText, double percent) +void FfsTrayIcon::setToolTip2(const wxString& toolTipText, double fraction) { - trayIcon->SetIcon(generateIcon(percent), toolTipText); + trayIcon->SetIcon(generateIcon(fraction), toolTipText); } diff --git a/ui/tray_icon.h b/ui/tray_icon.h index a615c091..30405465 100644 --- a/ui/tray_icon.h +++ b/ui/tray_icon.h @@ -19,7 +19,7 @@ public: FfsTrayIcon(); ~FfsTrayIcon(); - void setToolTip(const wxString& toolTipText, double percent = 0); //percent (optional), number between [0, 100], for small progress indicator + void setToolTip2(const wxString& toolTipText, double fraction = 0); //number between [0, 1], for small progress indicator private: FfsTrayIcon(const FfsTrayIcon&); diff --git a/version/version.h b/version/version.h index 9178830f..9496b80a 100644 --- a/version/version.h +++ b/version/version.h @@ -2,5 +2,5 @@ namespace zen { - const wxString currentVersion = wxT("3.21"); //internal linkage! +const wxString currentVersion = wxT("4.0"); //internal linkage! } diff --git a/version/version.rc b/version/version.rc index 8257ce3b..1f431185 100644 --- a/version/version.rc +++ b/version/version.rc @@ -1,2 +1,2 @@ -#define VER_FREEFILESYNC 3,21,0,0 -#define VER_FREEFILESYNC_STR "3.21\0" +#define VER_FREEFILESYNC 4,0,0,0 +#define VER_FREEFILESYNC_STR "4.0\0" |