diff options
-rw-r--r-- | Application.cpp | 19 | ||||
-rw-r--r-- | Application.h | 4 | ||||
-rw-r--r-- | Changelog.txt | 13 | ||||
-rw-r--r-- | FreeFileSync - ANSI.cbp (renamed from FreeFileSync.cbp) | 0 | ||||
-rw-r--r-- | FreeFileSync - Unicode.cbp | 124 | ||||
-rw-r--r-- | FreeFileSync.cpp | 26 | ||||
-rw-r--r-- | Makefile_Win_ANSI.cmd (renamed from Makefile_Win.cmd) | 25 | ||||
-rw-r--r-- | Makefile_Win_Unicode.cmd | 21 | ||||
-rw-r--r-- | Readme.txt | 31 | ||||
-rw-r--r-- | Resources.dat | bin | 113488 -> 113685 bytes | |||
-rw-r--r-- | french.lng | 536 | ||||
-rw-r--r-- | german.lng | 194 | ||||
-rw-r--r-- | lang.dat | bin | 0 -> 4 bytes | |||
-rw-r--r-- | library/globalFunctions.cpp | 32 | ||||
-rw-r--r-- | library/globalFunctions.h | 8 | ||||
-rw-r--r-- | library/misc.cpp | 17 | ||||
-rw-r--r-- | library/multithreading.cpp | 2 | ||||
-rw-r--r-- | library/multithreading.h | 2 | ||||
-rw-r--r-- | ui/MainDialog.cpp | 359 | ||||
-rw-r--r-- | ui/MainDialog.h | 5 | ||||
-rw-r--r-- | ui/SmallDialogs.cpp | 37 | ||||
-rw-r--r-- | ui/SmallDialogs.h | 7 | ||||
-rw-r--r-- | ui/SyncDialog.cpp | 104 | ||||
-rw-r--r-- | ui/SyncDialog.h | 3 | ||||
-rw-r--r-- | ui/guiGenerated.cpp | 77 | ||||
-rw-r--r-- | ui/guiGenerated.h | 12 |
26 files changed, 1243 insertions, 415 deletions
diff --git a/Application.cpp b/Application.cpp index 775fac65..7a4f2831 100644 --- a/Application.cpp +++ b/Application.cpp @@ -45,7 +45,9 @@ void Application::initialize() throw RuntimeException(_("Could not set working directory to directory containing executable file!")); //set program language + SetExitOnFrameDelete(false); //prevent messagebox from becoming top-level window programLanguage.loadLanguageFromCfg(); + SetExitOnFrameDelete(true); //activate support for .png files wxImage::AddHandler(new wxPNGHandler); @@ -127,18 +129,20 @@ void Application::logInit() { wxString tmp = wxDateTime::Now().FormatISOTime(); tmp.Replace(wxT(":"), wxEmptyString); - wxString logfileName = wxString(wxT("FFS_")) + wxDateTime::Now().FormatISODate() + '_' + tmp + wxT(".log"); + wxString logfileName = wxString(wxT("FFS_")) + wxDateTime::Now().FormatISODate() + wxChar('_') + tmp + wxT(".log"); - logFile.Open(logfileName.c_str(), wxT("wb")); + logFile.Open(logfileName.c_str(), wxT("w")); if (!logFile.IsOpened()) throw RuntimeException(_("Unable to create logfile!")); logFile.Write(wxString(_("FreeFileSync (Date: ")) + wxDateTime::Now().FormatDate() + _(" Time: ") + wxDateTime::Now().FormatTime() + wxT(")") + wxChar('\n')); - logFile.Write(wxString(_("-------------------------------------------------")) + '\n'); + logFile.Write(wxString(_("-------------------------------------------------")) + wxChar('\n')); logFile.Write(wxChar('\n')); logFile.Write(_("Log-messages:\n-------------")); logFile.Write(wxChar('\n')); logWrite(_("Start")); logFile.Write(wxChar('\n')); + +totalTime.Start(); //measure total time } @@ -156,7 +160,10 @@ void Application::logWrite(const wxString& logText, const wxString& problemType) void Application::logClose(const wxString& finalText) { logFile.Write(wxChar('\n')); - logWrite(finalText, _("Stop")); + + long time = totalTime.Time(); //retrieve total time + logWrite(finalText + wxT(" (") + _("Total time: ") + (wxTimeSpan::Milliseconds(time)).Format() + wxT(")"), _("Stop")); + //logFile.close(); <- not needed } @@ -617,9 +624,9 @@ int CommandLineStatusUpdater::reportError(const wxString& text) inline -void CommandLineStatusUpdater::triggerUI_Refresh() +void CommandLineStatusUpdater::triggerUI_Refresh(bool asyncProcessActive) { - if (abortionRequested) + if (abortionRequested && !asyncProcessActive) throw AbortThisProcess(); //may be triggered by the SyncStatusDialog if (!silentMode) diff --git a/Application.h b/Application.h index 4e6a4ef2..c3f02efe 100644 --- a/Application.h +++ b/Application.h @@ -16,6 +16,7 @@ #include "FreeFileSync.h" #include "ui/smallDialogs.h" #include "library/misc.h" +#include <wx/stopwatch.h> class Application : public wxApp { @@ -37,6 +38,7 @@ private: bool applicationRunsOnCommandLineWithoutWindows; wxFFile logFile; + wxStopWatch totalTime; CustomLocale programLanguage; int returnValue; @@ -53,7 +55,7 @@ public: void initNewProcess(int objectsTotal, double dataTotal, int processID); void updateProcessedData(int objectsProcessed, double dataProcessed); int reportError(const wxString& text); - void triggerUI_Refresh(); + void triggerUI_Refresh(bool asyncProcessActive); void noSynchronizationNeeded(); diff --git a/Changelog.txt b/Changelog.txt index 9a1e967a..967a1dd4 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,17 @@ FreeFileSync ------------ +Changelog v1.8 +-------------- +Enhanced statusbar information +Enhanced logfile information +Enhanced progress information +Added Unicode support +Program now waits until work is completed when abort is triggered during synchronization +Added French translation +Updated German translation + + Changelog v1.7 -------------- Display only those view filter buttons that are actually needed @@ -55,7 +66,7 @@ Changelog v1.3 Maintain and load different configurations by drag&drop, load-button or commandline New function to delete files (or move them to recycle bin) manually on the UI (without having to re-compare): Deleting folders results in deletion of all dependent files, subfolders on UI grid (also no re-compare needed) - while catching arrow situations and allowing to resolve them + while catching error situations and allowing to resolve them Improved manual filtering of rows: If folders are marked all dependent subfolders and files are marked as well (keeping sort sequence when "hide filtered elements" is marked) Comprehensive performance optimization of the two features above (manual filtering, deletion) for large grids (> 200.000 rows) diff --git a/FreeFileSync.cbp b/FreeFileSync - ANSI.cbp index 78ca07bc..78ca07bc 100644 --- a/FreeFileSync.cbp +++ b/FreeFileSync - ANSI.cbp diff --git a/FreeFileSync - Unicode.cbp b/FreeFileSync - Unicode.cbp new file mode 100644 index 00000000..bc01b6bb --- /dev/null +++ b/FreeFileSync - Unicode.cbp @@ -0,0 +1,124 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> +<CodeBlocks_project_file> + <FileVersion major="1" minor="6" /> + <Project> + <Option title="FreeFileSync" /> + <Option pch_mode="2" /> + <Option compiler="gcc" /> + <Build> + <Target title="Debug"> + <Option output="FreeFileSync" prefix_auto="1" extension_auto="1" /> + <Option object_output="obj\Debug\" /> + <Option type="0" /> + <Option compiler="gcc" /> + <Option projectLinkerOptionsRelation="2" /> + <Compiler> + <Add option="-g" /> + <Add option="-D__WXDEBUG__" /> + <Add directory="C:\Programme\CodeBlocks\wxWidgets\lib\gcc_lib\mswd" /> + </Compiler> + <ResourceCompiler> + <Add directory="C:\Programme\CodeBlocks\wxWidgets\lib\gcc_lib\mswd" /> + </ResourceCompiler> + <Linker> + <Add library="libwxmsw28ud_adv.a" /> + <Add library="libwxmsw28ud_core.a" /> + <Add library="libwxbase28ud.a" /> + <Add library="libwxpngd.a" /> + <Add library="libwxzlibd.a" /> + <Add directory="C:\Programme\CodeBlocks\wxWidgets\lib\gcc_lib" /> + </Linker> + </Target> + <Target title="Release"> + <Option output="FreeFileSync" prefix_auto="1" extension_auto="1" /> + <Option object_output="obj\Release\" /> + <Option type="0" /> + <Option compiler="gcc" /> + <Option projectLinkerOptionsRelation="2" /> + <Compiler> + <Add option="-O2" /> + <Add option="-DNDEBUG" /> + <Add directory="C:\Programme\CodeBlocks\wxWidgets\lib\gcc_lib\mswu" /> + </Compiler> + <ResourceCompiler> + <Add directory="C:\Programme\CodeBlocks\wxWidgets\lib\gcc_lib\mswu" /> + </ResourceCompiler> + <Linker> + <Add option="-s" /> + <Add library="libwxmsw28u_adv.a" /> + <Add library="libwxmsw28u_core.a" /> + <Add library="libwxbase28u.a" /> + <Add library="libwxpng.a" /> + <Add library="libwxzlib.a" /> + <Add directory="C:\Programme\CodeBlocks\wxWidgets\lib\gcc_lib" /> + </Linker> + </Target> + </Build> + <Compiler> + <Add option="-Wall" /> + <Add option="-pipe" /> + <Add option="-mthreads" /> + <Add option='[[if (PLATFORM == PLATFORM_MSW && (GetCompilerFactory().GetCompilerVersionString(_T("gcc")) >= _T("4.0.0"))) print(_T("-Wno-attributes"));]]' /> + <Add option="-D__GNUWIN32__" /> + <Add option="-D__WXMSW__" /> + <Add option="-DFFS_WIN" /> + <Add option="-DwxUSE_UNICODE" /> + <Add directory="C:\Programme\CodeBlocks\wxWidgets\include" /> + <Add directory="C:\Programme\CodeBlocks\wxWidgets\contrib\include" /> + </Compiler> + <ResourceCompiler> + <Add directory="C:\Programme\CodeBlocks\wxWidgets\include" /> + </ResourceCompiler> + <Linker> + <Add option="-mthreads" /> + <Add library="libkernel32.a" /> + <Add library="libuser32.a" /> + <Add library="libgdi32.a" /> + <Add library="libwinspool.a" /> + <Add library="libcomdlg32.a" /> + <Add library="libadvapi32.a" /> + <Add library="libshell32.a" /> + <Add library="libole32.a" /> + <Add library="liboleaut32.a" /> + <Add library="libuuid.a" /> + <Add library="libcomctl32.a" /> + <Add library="libwsock32.a" /> + <Add library="libodbc32.a" /> + </Linker> + <Unit filename="FreeFileSync.cpp" /> + <Unit filename="FreeFileSync.h" /> + <Unit filename="WxWizFrame.fbp" /> + <Unit filename="application.cpp" /> + <Unit filename="application.h" /> + <Unit filename="library\customGrid.cpp" /> + <Unit filename="library\customGrid.h" /> + <Unit filename="library\globalFunctions.cpp" /> + <Unit filename="library\globalFunctions.h" /> + <Unit filename="library\misc.cpp" /> + <Unit filename="library\misc.h" /> + <Unit filename="library\multithreading.cpp" /> + <Unit filename="library\multithreading.h" /> + <Unit filename="library\resources.cpp" /> + <Unit filename="library\resources.h" /> + <Unit filename="library\wxWidgets.h" /> + <Unit filename="resource.rc"> + <Option compilerVar="WINDRES" /> + </Unit> + <Unit filename="ui\guiGenerated.cpp" /> + <Unit filename="ui\guiGenerated.h" /> + <Unit filename="ui\mainDialog.cpp" /> + <Unit filename="ui\mainDialog.h" /> + <Unit filename="ui\smallDialogs.cpp" /> + <Unit filename="ui\smallDialogs.h" /> + <Unit filename="ui\syncDialog.cpp" /> + <Unit filename="ui\syncDialog.h" /> + <Extensions> + <code_completion /> + <envvars /> + <debugger /> + <wxsmith version="1"> + <gui name="wxWidgets" src="" main="" init_handlers="necessary" language="CPP" /> + </wxsmith> + </Extensions> + </Project> +</CodeBlocks_project_file> diff --git a/FreeFileSync.cpp b/FreeFileSync.cpp index a994aab8..6ab38e68 100644 --- a/FreeFileSync.cpp +++ b/FreeFileSync.cpp @@ -90,7 +90,7 @@ void FreeFileSync::getFileInformation(FileInfo& output, const wxString& filename #else struct stat fileInfo; if (stat(filename.c_str(), &fileInfo) != 0) - throw FileError(wxString(_("Could not retrieve file info for: ")) + "\"" + filename + "\""); + throw FileError(wxString(_("Could not retrieve file info for: ")) + wxT("\"") + filename + wxT("\"")); tm* timeinfo; timeinfo = localtime(&fileInfo.st_mtime); @@ -534,9 +534,11 @@ wxDirTraverseResult GetAllFilesFull::OnFile(const wxString& filename) wxDirTraverseResult GetAllFilesFull::OnDir(const wxString& dirname) { +#ifdef FFS_WIN if (dirname.EndsWith(wxT("\\RECYCLER")) || dirname.EndsWith(wxT("\\System Volume Information"))) return wxDIR_IGNORE; +#endif // FFS_WIN fileDescr.filename = dirname; fileDescr.directory = directory; @@ -579,7 +581,7 @@ wxDirTraverseResult GetAllFilesFull::OnDir(const wxString& dirname) wxDirTraverseResult GetAllFilesFull::OnOpenError(const wxString& openerrorname) { - wxMessageBox(openerrorname, _("Error opening file")); + wxMessageBox(openerrorname, _("Error")); return wxDIR_IGNORE; } @@ -609,7 +611,7 @@ public: wxDirTraverseResult OnOpenError(const wxString& openerrorname) { - wxMessageBox(openerrorname, _("Error opening file")); + wxMessageBox(openerrorname, _("Error")); return wxDIR_IGNORE; } @@ -1205,27 +1207,27 @@ wxString FreeFileSync::formatFilesizeToShortString(const double filesize) { double nrOfBytes = filesize; - wxString unit = wxT(" Byte"); + wxString unit = _(" Byte"); if (nrOfBytes > 999) { nrOfBytes/= 1024; - unit = wxT(" kB"); + unit = _(" kB"); if (nrOfBytes > 999) { nrOfBytes/= 1024; - unit = wxT(" MB"); + unit = _(" MB"); if (nrOfBytes > 999) { nrOfBytes/= 1024; - unit = wxT(" GB"); + unit = _(" GB"); if (nrOfBytes > 999) { nrOfBytes/= 1024; - unit = wxT(" TB"); + unit = _(" TB"); if (nrOfBytes > 999) { nrOfBytes/= 1024; - unit = wxT(" PB"); + unit = _(" PB"); } } } @@ -1233,7 +1235,7 @@ wxString FreeFileSync::formatFilesizeToShortString(const double filesize) } wxString temp; - if (unit == wxT(" Byte")) //no decimal places in case of bytes + if (unit == _(" Byte")) //no decimal places in case of bytes { double integer = 0; modf(nrOfBytes, &integer); //get integer part of nrOfBytes @@ -1252,7 +1254,7 @@ wxString FreeFileSync::formatFilesizeToShortString(const double filesize) switch (length) { case 0: - temp = wxT("Error"); + temp = _("Error"); break; case 1: temp = wxString(wxT("0")) + GlobalResources::decimalPoint + wxT("0") + temp; @@ -1271,7 +1273,7 @@ wxString FreeFileSync::formatFilesizeToShortString(const double filesize) temp = temp.substr(0, 3); break; //111 default: - return wxT("Error"); + return _("Error"); } } return (temp + unit); diff --git a/Makefile_Win.cmd b/Makefile_Win_ANSI.cmd index 08eb0053..cbe1aebe 100644 --- a/Makefile_Win.cmd +++ b/Makefile_Win_ANSI.cmd @@ -1,19 +1,20 @@ set widgets=C:\Programme\CodeBlocks\wxWidgets +set widgetslib=C:\Programme\CodeBlocks\wxWidgets\lib\gcc_lib\msw set sources=C:\Programme\CodeBlocks\Projects\FreeFileSync md obj -mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgets%\lib\gcc_lib\msw -c %sources%\application.cpp -o obj\Application.o -mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgets%\lib\gcc_lib\msw -c %sources%\FreeFileSync.cpp -o obj\FreeFileSync.o -mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgets%\lib\gcc_lib\msw -c %sources%\library\globalFunctions.cpp -o obj\globalFunctions.o -mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgets%\lib\gcc_lib\msw -c %sources%\library\multithreading.cpp -o obj\multithreading.o -mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgets%\lib\gcc_lib\msw -c %sources%\ui\guiGenerated.cpp -o obj\GUI_Generated.o -mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgets%\lib\gcc_lib\msw -c %sources%\ui\mainDialog.cpp -o obj\MainDialog.o -mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgets%\lib\gcc_lib\msw -c %sources%\ui\syncDialog.cpp -o obj\SyncDialog.o -mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgets%\lib\gcc_lib\msw -c %sources%\library\customGrid.cpp -o obj\CustomGrid.o -mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgets%\lib\gcc_lib\msw -c %sources%\library\resources.cpp -o obj\Resources.o -mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgets%\lib\gcc_lib\msw -c %sources%\library\misc.cpp -o obj\misc.o -mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgets%\lib\gcc_lib\msw -c %sources%\ui\smallDialogs.cpp -o obj\SmallDialogs.o -windres.exe -i %sources%\resource.rc -J rc -o obj\resource.res -O coff -I%widgets%\include -I%widgets%\lib\gcc_lib\msw +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\application.cpp -o obj\Application.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\FreeFileSync.cpp -o obj\FreeFileSync.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\globalFunctions.cpp -o obj\globalFunctions.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\multithreading.cpp -o obj\multithreading.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\ui\guiGenerated.cpp -o obj\GUI_Generated.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\ui\mainDialog.cpp -o obj\MainDialog.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\ui\syncDialog.cpp -o obj\SyncDialog.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\customGrid.cpp -o obj\CustomGrid.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\resources.cpp -o obj\Resources.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\misc.cpp -o obj\misc.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\ui\smallDialogs.cpp -o obj\SmallDialogs.o +windres.exe -i %sources%\resource.rc -J rc -o obj\resource.res -O coff -I%widgets%\include -I%widgetslib% mingw32-g++.exe -L%widgets%\lib\gcc_lib -o FreeFileSync.exe obj\Application.o obj\FreeFileSync.o obj\globalFunctions.o obj\multithreading.o obj\misc.o obj\GUI_Generated.o obj\MainDialog.o obj\SyncDialog.o obj\CustomGrid.o obj\Resources.o obj\SmallDialogs.o obj\resource.res -s -mthreads -lwxmsw28_adv -lwxmsw28_core -lwxbase28 -lwxpng -lwxzlib -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lcomctl32 -lwsock32 -lodbc32 -mwindows pause
\ No newline at end of file diff --git a/Makefile_Win_Unicode.cmd b/Makefile_Win_Unicode.cmd new file mode 100644 index 00000000..ab4541bb --- /dev/null +++ b/Makefile_Win_Unicode.cmd @@ -0,0 +1,21 @@ +set widgets=C:\Programme\CodeBlocks\wxWidgets +set widgetslib=C:\Programme\CodeBlocks\wxWidgets\lib\gcc_lib\mswu +set sources=C:\Programme\CodeBlocks\Projects\FreeFileSync + +md obj + +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -DwxUSE_UNICODE -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\application.cpp -o obj\Application.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -DwxUSE_UNICODE -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\FreeFileSync.cpp -o obj\FreeFileSync.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -DwxUSE_UNICODE -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\globalFunctions.cpp -o obj\globalFunctions.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -DwxUSE_UNICODE -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\multithreading.cpp -o obj\multithreading.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -DwxUSE_UNICODE -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\ui\guiGenerated.cpp -o obj\GUI_Generated.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -DwxUSE_UNICODE -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\ui\mainDialog.cpp -o obj\MainDialog.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -DwxUSE_UNICODE -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\ui\syncDialog.cpp -o obj\SyncDialog.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -DwxUSE_UNICODE -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\customGrid.cpp -o obj\CustomGrid.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -DwxUSE_UNICODE -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\resources.cpp -o obj\Resources.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -DwxUSE_UNICODE -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\misc.cpp -o obj\misc.o +mingw32-g++.exe -Wall -pipe -mthreads -D__GNUWIN32__ -DwxUSE_UNICODE -D__WXMSW__ -DFFS_WIN -O2 -DNDEBUG -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\ui\smallDialogs.cpp -o obj\SmallDialogs.o +windres.exe -i %sources%\resource.rc -J rc -o obj\resource.res -O coff -I%widgets%\include -I%widgetslib% +mingw32-g++.exe -L%widgets%\lib\gcc_lib -o FreeFileSync.exe obj\Application.o obj\FreeFileSync.o obj\globalFunctions.o obj\multithreading.o obj\misc.o obj\GUI_Generated.o obj\MainDialog.o obj\SyncDialog.o obj\CustomGrid.o obj\Resources.o obj\SmallDialogs.o obj\resource.res -s -mthreads -lwxmsw28u_adv -lwxmsw28u_core -lwxbase28u -lwxpng -lwxzlib -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lcomctl32 -lwsock32 -lodbc32 -mwindows + +pause
\ No newline at end of file @@ -1,4 +1,4 @@ -FreeFileSync v1.7 +FreeFileSync v1.8 ----------------- Usage @@ -12,10 +12,11 @@ Features 1. Compare files (bytewise or by date) and synchronize them. 2. No limitations: An arbitrary number of files can be synchronized. 3. Subfolders are also synchronized, including empty folders. -4. Network support. -5. Lean & easy accessible UI: Highly optimized for speed and huge sets of data. -6. Algorithms coded in C++ completely. -7. Focus on usability: +4. Unicode support. +5. Network support. +6. Lean & easy accessible UI: Highly optimized for speed and huge sets of data. +7. Algorithms coded in C++ completely. +8. Focus on usability: - Only necessary functionality on UI: no overloaded menus or icon jungle. - Select folders via drag & drop. - Last configuration and screen settings are saved automatically. @@ -27,16 +28,16 @@ Features - Progress indicators, status information and error reporting. - Sort file-lists by name, size or date. - Display statistical data: total filesizes, amount of bytes that will be transfered with the current settings. -8. Easy configurable commandline mode for automated synchronization. -9. Support for filesizes > 4 GB. -10. Option to move files to Recycle Bin instead of deleting/overwriting them. -11. Automatically ignore directories "\RECYCLER" and "System Volume Information" when comparing and syncing. -12. Localized German version available. -13. Delete before copy: Avoid disc space shortages with large sync-operations. -14. Based on wxWidgets framework => Portable to many operating systems. -15. Filter functionality to include/exclude files from synchronization (without re-compare!). -16. Include/exclude specific files from synchronization manually. -17. Create sync jobs via GUI to synchronize automatically (can be scheduled or executed directly). +9. Easy configurable commandline mode for automated synchronization. +10. Support for filesizes > 4 GB. +11. Option to move files to Recycle Bin instead of deleting/overwriting them. +12. Automatically ignore directories "\RECYCLER" and "\System Volume Information" when comparing and syncing. (Windows only) +13. Localized German version available. +14. Delete before copy: Avoid disc space shortages with large sync-operations. +15. Based on wxWidgets framework => Portable to many operating systems. +16. Filter functionality to include/exclude files from synchronization (without re-compare!). +17. Include/exclude specific files from synchronization manually. +18. Create sync jobs via GUI to synchronize automatically (can be scheduled or executed directly). Links diff --git a/Resources.dat b/Resources.dat Binary files differindex 73acee33..7d27b27e 100644 --- a/Resources.dat +++ b/Resources.dat diff --git a/french.lng b/french.lng new file mode 100644 index 00000000..5fc49de5 --- /dev/null +++ b/french.lng @@ -0,0 +1,536 @@ + Time: + Heure: + Byte + Octet + GB + Go + MB + Mo + PB + Po + TB + To + You may try to synchronize remaining items again (WITHOUT having to re-compare)! + Vous pouvez essayer de synchroniser à nouveau les éléments restants (SANS avoir à les re-comparer) ! + already exists. Overwrite? + existe déjà. Voulez-vous le remplacer ? + directories + répertoires + directory + répertoire + does not exist. + n'existe pas. + file, + fichier, + files, + fichiers, + item(s):\n\n + Elément(s):\n\n + kB + ko + of + sur + overwriting + remplacement + row in view + ligne sur la vue + rows in view + lignes sur la vue + to + vers + to recycle bin! + à la corbeille ! +!= files are different\n +!= les fichiers sont différents\n +&Abort +&Abandon +&About... +&A propos de... +&Advanced +&Avancé +&Back +&Retour +&Cancel +&Annuler +&Compare +&Comparer +&Continue +&Continuer +&Create +&Créer +&Create batch job +&Créer un fichier de commandes +&Default +&Défaut +&Export file list +&Exportation de la liste des fichiers +&File +&Fichier +&Help +&Aide +&Language +&Langue +&OK +&OK +&Pause +&Pause +&Quit +&Quitter +&Retry +&Réessayer +&Start +&Démarrage +&Synchronize +&Synchronisation +(-) filtered out from sync-process\n +(-) non synchronisés\n +, +. +------------------------------------------------- +----------------------------------------------------- +---------\n +-----------\n +--.-- +--.-- +-Open-Source file synchronization- +-Synchronisation de fichiers Open-Source- +. +, +.\n\nExamples:\n\n1.) FreeFileSync -cmp SIZEDATE -cfg RRRRR C:\\Source C:\\Target\n2.) FreeFileSync -cmp sizedate -cfg rlrln c:\\dir1 c:\\dir2 -incl *.doc\n\n1: Creates a mirror backup of the left directory\n2: Synchronizes all *.doc files from both directories simultaneously\n\n +.\n\nExemples :\n\n1.) FreeFileSync -cmp SIZEDATE -cfg RRRRR C:\\Source C:\\Target\n2.) FreeFileSync -cmp sizedate -cfg rlrln c:\\dir1 c:\\dir2 -incl *.doc\n\n1: Crée une sauvegarde miroir du répertoire de gauche\n2: Synchronise tous les fichiers *.doc sur les deux répertoires\n\n +1. Enter full file or directory names separated by ';'.\n2. Wildcard characters '*' and '?' are supported.\n3. Case sensitive expressions!\n\nExample: *.tmp;*\\filename.dat;*\\directory\\* +1. Entrer les noms complets des fichiers ou répertoires séparés par des ';'.\n2. Les caractères génériques '*' et '?' sont supportés.\n3. La distinction est faite entre majuscules et minuscules!\n\nExemple: *.tmp;*\\fichier.dat;*\\repert\\* +: check file content\n +: Contrôle le contenu du fichier\n +: check filesize and date\n\t\t +: Contrôle la taille et la date\n\t\t +<< left file is newer\n +<< le fichier de gauche est plus récent\n +<Directory> +<Répertoire> +<left directory> +<répertoire de gauche> +<right directory> +<répertoire de droite> +<| file on left side only\n +<| Le fichier existe seulement à gauche\n +== files are equal\n\n +== Les fichiers sont identiques\n\n +>> right file is newer\n +>> le fichier de droite est plus récent\n +Abort +Abandon +Abort requested: Waiting for current operation to finish... +Abandon demandé: En attente de la fin de l'opération en cours... +Aborted +Abandonné +About +A propos de +Action +Action +All items have been synchronized! +Tous les éléments ont été synchronisés! +An error occured +Une erreur s'est produite +An exception occured! +Une violation s'est produite! +Assemble a batch file with the following settings. To start synchronization in batch mode simply execute this file or schedule it in your operating system's task planner. +Créer un fichier de commandes avec les paramètres suivants. Pour lancer la synchronisation en mode batch, exécutez ce fichier ou paramétrez-le dans le planificateur de tâches. +Batch file created successfully! +Fichier de commandes créé avec succès! +Build: +Créé: +Choose to hide filtered files/directories from list +Masquer les fichiers/répertoires filtrés +Comma separated list +Liste d'éléments séparés par une virgule +Command file +Fichier de commandes +Compare both sides +Comparer les deux listes +Compare by \"File size and date\"\n----------------------------------------\nThis variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. Notice that the file time is allowed to deviate by up to 2 seconds. This ensures synchronization with the lower-precision file system FAT32 works correctly.\n\nWhen \"Compare\" is triggered with this option set the following decision tree is processed:\n\n -----------------\n |Decision tree|\n -----------------\n ________|___________\n | |\n file exists on both sides on one side only\n _____|______ __|___\n | | | |\nequal different left right\n _________|__________\n | | |\n left newer right newer same date\n\nAs a result 6 different status can be returned to categorize all files:\n\n- exists left only\n- exists right only\n- left newer\n- right newer\n- different filesize (but same date)\n- equal\n\n\nCompare by \"File content\"\n----------------------------------------\nAs the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:\n\n -----------------\n |Decision tree|\n -----------------\n ________|___________\n | |\n file exists on both sides on one side only\n _____|______ __|___\n | | | |\nequal different left right\n\nAs a result the files are separated into the following categories:\n\n- exists left only\n- exists right only\n- different\n- equal +Comparaison par \"taille et date\"\n---------------------------------------------------\nCette variante identifie deux fichiers identiques lorsqu'ils ont la même taille ET la même date de création. (Note : l'heure est calculée à plus ou moins 2 secondes.)\n\nLorsque \"Compare\" est lancé avec cette option, l'arbre de décision est évalué comme suit :\n\n -------------------------\n | Arbre de décision |\n -------------------------\n _______________________|___________________\n | |\n le fichier existe des 2 cotés Sur un seul côté\n __________|_____________ ____|___\n | | | |\n identique différent gauche droite\n __________________|__________________\n | | |\n plus récent à gauche plus récent à droite différents (mais même date)\n\nRésultat : 6 états permettent de différencier tous les fichiers:\n\n- existe seulement à gauche\n- existe seulement à droite\n- plus récent à gauche\n- plus récent à droite\n- différents (mais même date)\n- identiques\n\n\nComparaison du \"contenu\"\n------------------------------------\nComme indiqué, deux fichiers de même nom sont considérés comme identiques si, et seulement si, leur contenu est identique. Cette option sert plus aux contrôles de cohérence qu'aux opérations de sauvegarde. Pour cette raison, la date de la dernière modification des fichiers n'est pas pris en compte.\n\nAvec cette option, l'arbre de décision est plus simple:\n\n -------------------------\n | Arbre de décision |\n -------------------------\n __________|_____________\n | |\n le fichier existe des deux côtés seulement d'un côté\n ______|______ __|___\n | | | |\n identiques différents à gauche à droite\n\nRésultat : une répartition dans les catégories suivantes:\n\n- existe à gauche seulement\n- existe à droite seulement\n- différents\n- identiques +Compare by... +Comparaison par... +Comparing content of files +Comparaison du contenu des fichiers en cours +Comparing... +Comparaison en cours... +Completed +Terminé +Configuration +Configuration +Configuration loaded! +Configuration chargée! +Configuration overview: +Contrôle des paramètres: +Configuration saved! +Configuration enregistrée! +Configure filter +Configuration des filtres +Configure filter... +Configuration des filtres... +Configure your own synchronization rules. +Paramétrage de vos règles de synchronisation. +Confirm +Confirmation +Continue +Continuer +Continue on error +Continuer en cas d'erreur +Continue on next errors +Continuer sur les erreurs suivantes +Copy from left to right +Copie de gauche à droite +Copy from left to right overwriting +Copie de gauche à droite avec remplacement +Copy from right to left +Copie de droite à gauche +Copy from right to left overwriting +Copie de droite à gauche avec remplacement +Copy to clipboard\tCTRL+C +Copier dans le presse-papiers\tCTRL+C +Copying file +Copie du fichier en cours +Could not open file: +Erreur lors de l'ouverture de : +Could not read configuration file +Impossible de lire le fichier de configuration +Could not read language file +Impossible de lire le fichier de langue +Could not retrieve file info for: +Erreur lors de la lecture des attributs de fichier de : +Could not set working directory to directory containing executable file! +Impossible de définir le répertoire de travail à partir du répertoire contenant le fichier exécutable! +Could not write to +Erreur en écriture sur +Create a batch job +Création du fichier de commandes +Create: +Créations: +Creating folder +Création d'un répertoire +Current operation: +Opération en cours: +Custom +Personnaliser +Data remaining: +Données restantes: +Data to compare: +Données à comparer: +Data: +Données: +Date +Date +Delete files/folders existing on left side only +Suppression des fichiers/répertoires n'existant que sur le côté gauche +Delete files/folders existing on right side only +Suppression des fichiers/répertoires n'existant que sur le côté droit +Delete files\tDEL +Suppression des fichiers\tDEL +Delete: +Suppressions: +Deleting file +Suppression du fichier +Deleting folder +Suppression du répertoire +Deutsch +Deutsch +Directory +Répertoire +Directory on the left does not exist. Please select a new one! +Le répertoire de gauche n'existe pas. Veuillez en choisir un autre! +Directory on the right does not exist. Please select a new one! +Le répertoire de droite n'existe pas. Veuillez en choisir un autre +Displays help on the command line parameters\n +Aide sur les paramètres de la ligne de commandes\n +Do not show graphical status and error messages but write to a logfile instead +Ne pas afficher l'état graphique ni les messages mais les écrire sur un fichier log +Do nothing +Ne rien faire +Do you really want to delete the following objects(s)? +Voulez-vous vraiment supprimer les objets suivants ? +Do you really want to move the following objects(s) to the recycle bin? +Voulez-vous vraiment envoyer les objets suivants dans la corbeille ? +Donate with Paypal +Don avec Paypal +Drag && drop +Glisser && Déposer +Email: +Email: +English +English +Error +Erreur +Error adapting modification time of file +Erreur lors de la modification de la date du fichier +Error converting FILETIME to SYSTEMTIME +Erreur lors de la conversion de FILETIME en SYSTEMTIME +Error converting FILETIME to local FILETIME +Erreur lors de la conversion de FILETIME en FILETIME local +Error copying file +Erreur lors de la copie du fichier +Error creating directory +Erreur lors de la création du répertoire +Error deleting directory +Erreur lors de la suppression du répertoire +Error deleting file +Erreur lors de la suppression du fichier +Error moving file +Erreur lors du déplacement du fichier +Error reading file: +Erreur lors de la lecture du fichier: +Error traversing directory +Erreur lors du parcours du répertoire +Error when converting int to wxString +Erreur de conversion (int en wxString) +Error when converting wxString to double +Erreur de conversion (wxString en double) +Error when converting wxString to long +Erreur de conversion (wxString en long) +Error: Source directory does not exist anymore: +Erreur: le répertoire source n'existe plus: +Exclude +Exclure +Feedback and suggestions are welcome at: +Commentaires et suggestions sont les bienvenus à: +File content +Contenu du fichier +File list exported! +Liste des fichiers exportée! +File size and date +Taille et date du fichier +Filename +Nom du fichier +Files are found equal if\n - file content\nis the same. +Les fichiers sont considérés comme identiques, si\n - leur contenu est identique. +Files are found equal if\n - filesize\n - last write time (UTC) and date\nare the same. +Les fichiers sont considérés comme identiques, si\n - leur taille\n - leur date et heure(UTC) sont identiques. +Files that exist on both sides and have different content +Les fichiers existent des deux côtés et ont des contenus différents +Files that exist on both sides, have same date but different filesizes +Les fichiers existent des deux côtés, ont la même date mais des tailles différentes +Files that exist on both sides, left one is newer +Fichiers existants des deux côtés, celui de gauche est plus récent +Files that exist on both sides, right one is newer +Fichiers existants des deux côtés, celui de droite est plus récent +Files to compare: +Fichiers à comparer: +Files/folders scanned: +Fichiers/dossiers analysés +Files/folders remaining: +Fichiers/dossiers restants: +Files/folders that exist on left side only +Fichiers/répertoires existants seulement à gauche +Files/folders that exist on right side only +Fichiers/répertoires existants seulement à droite +Filter +Filtrage +Filter active: Press again to deactivate +Filtrage actif: Cliquez de nouveau pour le désactiver +Filter files +Filtrage des fichiers +Filter manually +Filtrage manuel +Filter view +Filtrage de la vue +Français +Français +FreeFileSync (Date: +FreeFileSync (Date: +FreeFileSync - Folder Comparison and Synchronization +FreeFileSync - Comparaison et synchronisation de répertoires +FreeFileSync at Sourceforge +FreeFileSync par Sourceforge +FreeFileSync configuration +FreeFileSync configuration +Help +Aide +Hide filtered items +Masquer les éléments filtrés +Hide further error messages during the current process and continue +Masquer les messages d'erreur suivants de l'opération en cours et continuer +Hides error messages during synchronization:\nThey are collected and shown as a list at the end of the process +Masquer les messages d'erreur pendant la synchronisation:\nIls sont collationnés et listés à la fin de l'opération +Hints: +Conseils: +Homepage: +Page d'accueil: +If errors occur during folder comparison or synchronization they are ignored and the process continues\n +Si des erreurs se produisent pendant la comparaison ou la synchronisation des répertoires, elles seront ignorées et l'opération se poursuivra\n +If you like FFS: +Si vous aimez FFS: +Include +Inclure +Info +Info +Information +Information +Initialization of Recycle Bin failed! It cannot be used! +Erreur lors de l'initialisation de la corbeille ! La corbeille ne peut être utilisée! +It was not possible to gain access to Recycle Bin!\n\nIt's likely that you are not using Windows XP. (Probably Vista)\nIf you want this feature included, please contact the author. :) +Impossible d'accéder à la corbeille!\n\nIl est probable que vous n'utilisez pas Windows XP. (Peut-être Vista?)\nSi vous désirez utilisee cette fonctionnalité, veuillez contacter l'auteur. :) +Left directory does not exist. Please select a new one! +Le répertoire de gauche n'existe pas. Veuillez en choisir un autre! +Left folder: +Répertoire de gauche: +Legend\n +Legende\n +Load configuration from file:\n - use this choice box\n - drag & drop config file to this window\n - specify config file as first commandline parameter +Chargement de la configuration à partir du fichier:\n - utiliser cette liste de choix\n - Déplacer et déposer le fichier de configuration dans cette fenêtre\n - Définir le nom du fichier de commandes comme premier paramètre de la ligne de commande +Load configuration... +Charger la configuration... +Log-messages:\n------------- +Messages log:\n--------------- +Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. +Sauvegarde miroir du répertoire de gauche : Le répertoire de droite sera écrasé et exactement identique au répertoire de gauche après la synchronisation. +Move files to Recycle Bin instead of deleting or overwriting them directly.\n +Déplacer les fichiers dans la corbeille au lieu de les supprimer ou de remplacer.\n +Not all items were synchronized! Have a look at the list. +Tous les éléments n'ont pas été synchronisés! Veuillez vérifier la liste. +Nothing to synchronize. Both directories adhere to the sync-configuration! +Rien à synchroniser. Les deux répertoires sont conformes aux paramètres de synchronisation! +Number of files and directories that will be created +Nombre de fichiers et de répertoires qui seront créés +Number of files and directories that will be deleted +Nombre de fichiers et de répertoires qui seront supprimés +Number of files that will be overwritten +Nombre de fichiers qui seront remplacés +One way -> +Vers la droite -> +Only files/directories that pass filtering will be selected for synchronization. +Seuls les fichiers/répertoires correspondant au filtrage sont retenus pour la synchronisation. +Open synchronization dialog +Ouvrir la boîte de dialogue de la synchronisation +Open with Explorer\tD-Click +Ouvrir dans l'explorateur\tD-Click +Operation aborted! +Opération abandonnée! +Operation: +Opération: +Pause +Pause +Please select both left and right directories! +Veuillez, s'il vous plaît, choisir les répertoires de droite et de gauche! +Please select directories for both sides! +Veuillez, s'il vous plaît, choisir les répertoires de droite et de gauche! +Press button to activate filter +Cliquez pour activer le filtrage +Preview +Prévoir +Published under the GNU General Public License: +Publié sous la licence GNU General Public: +Quit +Quitter +Relative path +Chemin +Remaining time: +Temps restant: +Result +Résultat +Right directory does not exist. Please select a new one! +Le répertoire de droite n'existe pas. Veuillez en choisir un autre! +Right folder: +Répertoire de droite: +Save current configuration to file +Enregistrer la configuration courante +Saved aborted! +Enregistrement annulé! +Scanning +Lecture en cours +Scanning... +Lecture en cours... +Select a folder +Choisissez un répertoire +Select variant: +Choisissez une variante: +Set filter for synchronization +Définir le filtrage +Shell script +Shell Script +Show files that are different +Afficher les fichiers différents +Show files that are equal +Afficher les fichiers identiques +Show files that are newer on left +Afficher les fichiers de gauche plus récents que ceux de droite +Show files that are newer on right +Afficher les fichiers de droite plus récents que ceux de gauche +Show files that exist on left side only +Afficher les fichiers existants seulement à gauche +Show files that exist on right side only +Afficher les fichiers existants seulement à droite +Silent mode +Mode silence +Size +Taille +Source code written completely in C++ utilizing:\n\n MinGW \t\t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE\n\n by ZenJu +Code source entièrement écrit en C++ utilisant:\n\n MinGW \t\t- Windows-Port de GNU Compiler Collection\n wxWidgets \t- Open-Source GUI-Framework\n wxFormBuilder\t- wxWidgets GUI-Builder\n CodeBlocks \t- Open-Source IDE\n\n ZenJu +Specify algorithm to test if files are equal:\n\n\t\t +Spécification de l'algorithme de contrôle de l'identité de deux fichiers:\n\n\t\t +Specify names to be excluded separated by ';'. Wildcards '*' and '?' are supported. Default: \"\"\n +Noms à exclure, séparés par des ';'. Les caractères génériques '*' et '?' sont supportés. Par défaut: \"\"\n +Specify names to be included separated by ';'. Wildcards '*' and '?' are supported. Default: \"*\"\n +Noms à inclure, séparés par des ';'.Les caractères génériques '*' et '?' sont supportés. Par défaut: \"*\"\n +Specify the sync-direction used for each type of file by a string of five chars:\n\n\t\tChar 1: Folders/files that exist on left side only\n\t\tChar 2: Folders/files that exist on right side only\n\t\tChar 3: Files that exist on both sides, left one is newer\n\t\tChar 4: Files that exist on both sides, right one is newer\n\t\tChar 5: Files that exist on both sides and are different\n\n\t\tSync-direction: L: left, R: right, N: none\n +Paramétrage de la synchronisation avec une chaîne de 5 caractères:\n\n\t\tCar 1: Dossiers/fichiers n'existant que dans le répertoire de gauche\n\t\tCar 2: Dossiers/fichiers n'existant que dans le répertoire de droite\n\t\tCar 3: Fichiers de gauche plus récents\n\t\tCar 4: Fichiers de droite plus récents\n\t\tCar 5: Fichiers existants des deux côtés et différents\n\n\t\tDirection de la synchronisation: L: vers la gauche, R: vers la droite, N: ne rien faire\n +Start +Démarrer +Start synchronization +Démarrer la synchronisation +Stop +Stop +Swap sides +Permuter les côtés +Synchronization aborted! +Synchronisation abandonnée! +Synchronization completed successfully. +Synchronisation terminée avec succès. +Synchronization completed with errors! +Synchronisation terminée avec des erreurs! +Synchronization settings +Paramétrage de la synchronisation +Synchronization status +Etat de la synchronisation +Synchronize both sides simultaneously: Copy new or updated files in both directions. +Synchronisation simultanée des deux côtés. Copie des fichiers nouveaux ou mis à jour. +Synchronizing... +Synchronisation en cours... +Thanks to Jean-François Hartmann for doing the French translation! +Merci à Jean-François Hartmann pour la traduction en Français! +The selected file does not contain a valid configuration! +Le fichier sélectionné ne contient pas de configuration valide! +The selected file does not exist anymore! +Le fichier sélectionné n'existe plus! +Time elapsed: +Temps écoulé: +Total amount of data that will be transferred +Volume de données à transférer +Total time: +Temps total: +Two way <-> +Des 2 côtés <-> +Unable to create logfile! +Impossible de créer un fichier log! +Unable to initialize Recycle Bin! +Impossible d'initialiser la corbeille! +Unable to load Resources.dat! +Impossible de charger Resources.dat! +Update: +Mises à jour: +Use Recycle Bin +Utilisation de la corbeille +Use Recycle Bin when deleting or overwriting files during synchronization +Utilisation de la corbeille lors de la suppression ou du remplacement des fichiers pendant la synchronisation +Warning +Attention +Warning: Synchronization failed for +Attention : la synchronisation a échoué à cause de +\n\nContinue with next object, retry or abort comparison? +\n\nVoulez-vous continuer avec l'objet suivant, réessayer ou annuler la comparaison? +\n\nContinue with next object, retry or abort synchronization? +\n\nVoulez-vous continuer avec l'objet suivant, réessayer ou annuler la synchronisation? +\n\nInformation: If you skip the error and continue or abort a re-compare will be necessary! +\n\nInformation: Si vous sautez cette erreur et continuer ou si vous annulez, il sera nécessaire d'effectuer une re-comparaison! +|> file on right side only\n +|> Le fichier existe seulement à droite\n @@ -1,23 +1,33 @@ Time: Uhrzeit: + Byte + Byte + GB + GB + MB + MB + PB + PB + TB + TB You may try to synchronize remaining items again (WITHOUT having to re-compare)! Verbliebene Elemente können nochmals synchronisiert werden (OHNE dass ein erneuter Vergleich notwendig ist)! already exists. Overwrite? existiert bereits. Überschreiben? + directories + Verzeichnisse + directory + Verzeichnis does not exist. existiert nicht. - does not exist. Aborting! - existiert nicht. Abbruch! - does not exist. \n\nSynchronization aborted! - existiert nicht. \n\nSynchronisation abgebrochen! - item(s) remaining - Element(e) übrig + file, + Datei, + files, + Dateien, item(s):\n\n Element(e):\n\n - items on left, - Elemente links, - items on right, - Elemente rechts, + kB + kB of von overwriting @@ -30,8 +40,6 @@ nach to recycle bin! in den Papierkorb! - total) - gesamt) != files are different\n != Dateien sind verschieden\n &Abort @@ -58,8 +66,6 @@ &Exportiere Dateiliste &File &Datei -&Filter -&Filter &Help &Hilfe &Language @@ -78,12 +84,8 @@ &Synchronisieren (-) filtered out from sync-process\n (-) nicht synchronisieren\n -(Build: -(Build: , . ---,- MB ---,- MB ------------------------------------------------- ----------------------------------------------------- ---------\n @@ -96,14 +98,6 @@ , .\n\nExamples:\n\n1.) FreeFileSync -cmp SIZEDATE -cfg RRRRR C:\\Source C:\\Target\n2.) FreeFileSync -cmp sizedate -cfg rlrln c:\\dir1 c:\\dir2 -incl *.doc\n\n1: Creates a mirror backup of the left directory\n2: Synchronizes all *.doc files from both directories simultaneously\n\n .\n\nBeispiele:\n\n1.) FreeFileSync -cmp SIZEDATE -cfg RRRRR C:\\Source C:\\Target\n2.) FreeFileSync -cmp sizedate -cfg rlrln c:\\dir1 c:\\dir2 -incl *.doc\n\n1: Erzeugt ein Spiegel-Backup des linken Verzeichnisses\n2: Synchronisiert alle *.doc Dateien aus beiden Verzeichnissen\n\n -/ -/ -1 item on left, -1 Element links, -1 item on right, -1 Element rechts, -1 row in view ( -1 Zeile zur Ansicht ( 1. Enter full file or directory names separated by ';'.\n2. Wildcard characters '*' and '?' are supported.\n3. Case sensitive expressions!\n\nExample: *.tmp;*\\filename.dat;*\\directory\\* 1. Komplette Datei- oder Verzeichnisnamen getrennt durch ';' eingeben.\n2. Die Platzhalter '*' und '?' werden unterstützt.\n3. Groß-/Kleinschreibung wird unterschieden!\n\nBeispiel: *.tmp;*\\filename.dat;*\\directory\\* : check file content\n @@ -126,10 +120,10 @@ >> rechte Datei ist neuer\n Abort Abbruch +Abort requested: Waiting for current operation to finish... +Abbruch initiiert: Warte, bis aktuelle Operation beendet ist... Aborted Abgebrochen -Aborted! -Abbruch! About Über Action @@ -138,22 +132,14 @@ All items have been synchronized! Alle Elemente wurden synchronisiert! An error occured Fehler -An exception occured -Eine Exception wurde geworfen An exception occured! Eine Exception wurde geworfen! Assemble a batch file with the following settings. To start synchronization in batch mode simply execute this file or schedule it in your operating system's task planner. Erzeuge eine Batch-Datei mit den folgenden Parametern. Um im Batch-Modus zu synchronisieren, kann diese einfach gestartet oder in den Task-Planer des Betriebssystems eingetragen werden. -Back -Zurück Batch file created successfully! Batch-Datei wurde erfolgreich erstellt! -Begin Synchronization -Starte Synchronisation -Benchmark: -Benchmark: -Cancel -Abbruch +Build: +Build: Choose to hide filtered files/directories from list Gefilterte Dateien ein-/ausblenden Comma separated list @@ -162,8 +148,8 @@ Command file Command Datei Compare both sides Beide Seiten vergleichen -Compare by \"File size and date\"\n----------------------------------------\nThis variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. (Notice that the file time may deviate up to 2 seconds.)\n\nWhen \"Compare\" is triggered with this option set the following decision tree is processed:\n\n -----------------\n |Decision tree|\n -----------------\n ________|___________\n | |\n file exists on both sides on one side only\n _____|______ __|___\n | | | |\nequal different left right\n _________|_____________\n | | |\n left newer right newer different (but same date)\n\nAs a result 6 different status can be returned to categorize all files:\n\n- exists left only\n- exists right only\n- left newer\n- right newer\n- different (but same date)\n- equal\n\n\nCompare by \"File content\"\n----------------------------------------\nAs the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:\n\n -----------------\n |Decision tree|\n -----------------\n ________|___________\n | |\n file exists on both sides on one side only\n _____|______ __|___\n | | | |\nequal different left right\n\nAs a result the files are separated into the following categories:\n\n- exists left only\n- exists right only\n- different\n- equal -Vergleichen nach \"Dateigröße und -datum\"\n---------------------------------------------------\nDiese Variante identifiziert zwei gleichnamige Dateien als gleich, wenn sie die gleiche Dateigröße haben UND der Zeitpunkt der letzten Änderung derselbe ist. (Dabei wird eine Abweichung von bis zu zwei Sekunden toleriert.)\n\nNachdem \"Compare\" mit dieser Einstellung gestartet wurde, wird der folgende Entscheidungsbaum abgearbeitet:\n\n -------------------------\n |Entscheidungsbaum|\n -------------------------\n __________|___________\n | |\n Datei ex. auf beiden Seiten nur auf einer Seite\n ________|____ __|___\n | | | |\n gleich verschieden links rechts\n __________|___________\n | | |\n links neuer rechts neuer verschieden (bei gleichem Datum)\n\nAls Ergebnis werden 6 verschiedene Status zurückgegeben, um Dateien zu kategorisieren:\n\n- existiert nur links\n- existiert nur rechts\n- links neuer\n- rechts neuer\n- verschieden (bei gleichem Datum)\n- gleich\n\n\nVergleichen nach \"Dateiinhalt\"\n------------------------------------\nWie der Name bereits sagt, werden zwei Dateien mit gleichem Namen genau dann als gleich angesehen, wenn sie den gleichen Dateiinhalt haben. Diese Einstellung ist eher für Konsistenzprüfungen geeignet als für Backup-Operationen. Aus diesem Grund wird der Zeitpunkt der letzten Änderung der Dateien nicht berücksichtigt.\n\nDer Entscheidungsbaum ist in diesem Fall kleiner:\n\n -------------------------\n |Entscheidungsbaum|\n -------------------------\n __________|___________\n | |\n Datei ex. auf beiden Seiten nur auf einer Seite\n ________|____ __|___\n | | | |\n gleich verschieden links rechts\n\nDas Ergebnis ist eine Aufteilung in folgende Kategorien:\n\n- existiert nur links\n- existiert nur rechts\n- verschieden\n- gleich +Compare by \"File size and date\"\n----------------------------------------\nThis variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. Notice that the file time is allowed to deviate by up to 2 seconds. This ensures synchronization with the lower-precision file system FAT32 works correctly.\n\nWhen \"Compare\" is triggered with this option set the following decision tree is processed:\n\n -----------------\n |Decision tree|\n -----------------\n ________|___________\n | |\n file exists on both sides on one side only\n _____|______ __|___\n | | | |\nequal different left right\n _________|__________\n | | |\n left newer right newer same date\n\nAs a result 6 different status can be returned to categorize all files:\n\n- exists left only\n- exists right only\n- left newer\n- right newer\n- different filesize (but same date)\n- equal\n\n\nCompare by \"File content\"\n----------------------------------------\nAs the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:\n\n -----------------\n |Decision tree|\n -----------------\n ________|___________\n | |\n file exists on both sides on one side only\n _____|______ __|___\n | | | |\nequal different left right\n\nAs a result the files are separated into the following categories:\n\n- exists left only\n- exists right only\n- different\n- equal +Vergleichen nach \"Dateigröße und -datum\"\n---------------------------------------------------\nDiese Variante identifiziert zwei gleichnamige Dateien als gleich, wenn sie die gleiche Dateigröße haben UND der Zeitpunkt der letzten Änderung derselbe ist. Dabei wird eine Abweichung von bis zu zwei Sekunden toleriert. So ist sichergestellt, dass eine Synchronisation gegen ein FAT32 Dateisystem korrekt funktioniert.\n\nNachdem \"Compare\" mit dieser Einstellung gestartet wurde, wird der folgende Entscheidungsbaum abgearbeitet:\n\n -------------------------\n |Entscheidungsbaum|\n -------------------------\n __________|___________\n | |\n Datei ex. auf beiden Seiten nur auf einer Seite\n ________|____ __|___\n | | | |\n gleich verschieden links rechts\n __________|___________\n | | |\n links neuer rechts neuer gleiches Datum\n\nAls Ergebnis werden 6 verschiedene Status zurückgegeben, um Dateien zu kategorisieren:\n\n- existiert nur links\n- existiert nur rechts\n- links neuer\n- rechts neuer\n- verschiedene Dateigrößen (bei gleichem Datum)\n- gleich\n\n\nVergleichen nach \"Dateiinhalt\"\n------------------------------------\nWie der Name bereits sagt, werden zwei Dateien mit gleichem Namen genau dann als gleich angesehen, wenn sie den gleichen Dateiinhalt haben. Diese Einstellung ist eher für Konsistenzprüfungen geeignet als für Backup-Operationen. Aus diesem Grund wird der Zeitpunkt der letzten Änderung der Dateien nicht berücksichtigt.\n\nDer Entscheidungsbaum ist in diesem Fall kleiner:\n\n -------------------------\n |Entscheidungsbaum|\n -------------------------\n __________|___________\n | |\n Datei ex. auf beiden Seiten nur auf einer Seite\n ________|____ __|___\n | | | |\n gleich verschieden links rechts\n\nDas Ergebnis ist eine Aufteilung in folgende Kategorien:\n\n- existiert nur links\n- existiert nur rechts\n- verschieden\n- gleich Compare by... Vergleichen nach... Comparing content of files @@ -180,12 +166,8 @@ Configuration overview: Übersicht der Parameter: Configuration saved! Konfiguration gespeichert! -Configure Filter... -Konfiguriere Filter... Configure filter Konfiguriere Filter -Configure filter settings -Konfiguriere Filter Configure filter... Konfiguriere Filter... Configure your own synchronization rules. @@ -210,12 +192,6 @@ Copy to clipboard\tCTRL+C Kopiere in Zwischenablage\tCTRL+C Copying file Kopiere Datei -Could not change attributes of -Attribute der Datei konnten nicht geändert werden: -Could not open -Fehler beim Öffnen von -Could not open ""config.dat"" for write access! -Fehler beim Schreiben von ""config.dat""! Could not open file: Fehler beim Öffnen der Datei: Could not read configuration file @@ -230,8 +206,6 @@ Could not write to Fehler beim Schreiben von Create a batch job Erstelle Batch-Job -Create a batch job for automated synchronization -Erzeuge Batch-Job für die automatische Synchronisation Create: Erstellen: Creating folder @@ -240,26 +214,14 @@ Current operation: Aktuelle Operation: Custom Eigene -Data copied: -Kopierte Daten: Data remaining: Verbliebene Daten: -Data to be transferred: -Zu übertragende Daten: Data to compare: Zu vergleichende Daten: -Data to transfer: -Zu übertragende Daten: Data: Daten: Date Datum -Default -Standard -Delete files existing on left side only -Lösche Dateien, die nur links existieren -Delete files existing on right side only -Lösche Dateien, die nur rechts existieren Delete files/folders existing on left side only Lösche Dateien/Ordner, die nur links existieren Delete files/folders existing on right side only @@ -282,8 +244,6 @@ Directory on the right does not exist. Please select a new one! Verzeichnis auf der rechten Seite existiert nicht. Bitte ein anderes auswählen! Displays help on the command line parameters\n Hilfe zu den Kommandozeilenparametern\n -Do not show UI messages but write to a logfile instead\n\nExamples:\n\n1.) FreeFileSync -cmp SIZEDATE -cfg RRRRR C:\\Source C:\\Target\n2.) FreeFileSync -cmp sizedate -cfg rlrln c:\\dir1 c:\\dir2 -incl *.doc\n\n1: Creates a mirror backup of the left directory\n2: Synchronizes all *.doc files from both directories simultaneously\n\n -Keine UI-Meldungen anzeigen, sondern eine Logdatei schreiben\n\nBeispiele:\n\n1.) FreeFileSync -cmp SIZEDATE -cfg RRRRR C:\\Source C:\\Target\n2.) FreeFileSync -cmp sizedate -cfg rlrln c:\\dir1 c:\\dir2 -incl *.doc\n\n1: Erzeugt ein Backup des linken Verzeichnisses\n2: Synchronisiert alle *.doc Dateien aus beiden Verzeichnissen\n\n Do not show graphical status and error messages but write to a logfile instead Keine graphischen Status- und Fehlermeldungen anzeigen, sondern eine Logdatei erstellen Do nothing @@ -296,14 +256,10 @@ Donate with Paypal Spenden mit Paypal Drag && drop Drag && Drop -Dummy text -Dummy text Email: Email: English English -Equality condition -Vergleich nach: Error Fehler Error adapting modification time of file @@ -322,10 +278,6 @@ Error deleting file Fehler beim Löschen der Datei Error moving file Fehler beim Verschieben der Datei -Error opening file -Fehler beim Öffnen der Datei -Error overwriting file -Fehler beim Überschreiben der Datei Error reading file: Fehler beim Lesen der Datei: Error traversing directory @@ -336,8 +288,6 @@ Error when converting wxString to double Fehler bei Konvertierung (wxString nach double) Error when converting wxString to long Fehler bei Konvertierung (wxString nach long) -Error when modifying GUI grid -Fehler beim Modifizieren des UI Grids Error: Source directory does not exist anymore: Fehler: Quellverzeichnis existiert nicht mehr: Exclude @@ -356,30 +306,20 @@ Files are found equal if\n - file content\nis the same. Dateien gelten als gleich, wenn\n - der Inhalt\ngleich ist. Files are found equal if\n - filesize\n - last write time (UTC) and date\nare the same. Dateien gelten als gleich, wenn\n - die Größe\n - Datum und Uhrzeit(UTC) der letzten Änderung\ngleich sind. -Files remaining: -Verbliebene Dateien: -Files scanned: -Eingelesene Dateien: -Files that are different -Unterschiedliche Dateien -Files that are equal -Gleiche Dateien -Files that are newer on left -Dateien, die auf beiden Seiten existieren; linke Datei ist neuer -Files that are newer on right -Dateien, die auf beiden Seiten existieren; rechte Datei ist neuer -Files that exist on both sides and are different -Dateien, die auf beiden Seiten existieren und verschieden sind +Files that exist on both sides and have different content +Dateien, die auf beiden Seiten existieren und unterschiedlichen Inhalt haben +Files that exist on both sides, have same date but different filesizes +Dateien, die auf beiden Seiten existieren; gleiches Datum aber unterschiedliche Dateigrößen Files that exist on both sides, left one is newer Dateien, die auf beiden Seiten existieren; linke Datei ist neuer Files that exist on both sides, right one is newer Dateien, die auf beiden Seiten existieren; rechte Datei ist neuer -Files that exist on left view only -Dateien, die nur links existieren -Files that exist on right view only -Dateien, die nur rechts existieren Files to compare: Zu vergleichende Dateien: +Files/folders remaining: +Verbliebene Dateien/Ordner: +Files/folders scanned: +Eingelesene Dateien/Ordner: Files/folders that exist on left side only Dateien/Ordner, die nur links existieren Files/folders that exist on right side only @@ -394,12 +334,8 @@ Filter manually Manuell filtern Filter view Ansicht filtern -Final status -Finaler status -Folders/files that exist on left side only -Ordner/Dateien, die nur links existieren -Folders/files that exist on right side only -Ordner/Dateien, die nur rechts existieren +Français +Français FreeFileSync (Date: FreeFileSync (Datum: FreeFileSync - Folder Comparison and Synchronization @@ -410,16 +346,10 @@ FreeFileSync configuration FreeFileSync Konfiguration Help Hilfe -Hide error messages -Unterdrücke Fehlermeldungen Hide filtered items Gefilterte Elemente ausblenden -Hide further error messages -Weitere Fehlermeldungen unterdrücken Hide further error messages during the current process and continue Unterdrücke alle nachfolgenden Fehlermeldungen für den aktuellen Prozess und fahre fort -Hide further messages during current process -Weitere Meldungen während dieser Operation ausblenden Hides error messages during synchronization:\nThey are collected and shown as a list at the end of the process Verhindert das Anzeigen von Fehlermeldungen während der Synchronisation:\nSie werden jedoch gesammelt und nach dem Vorgang als Liste angezeigt Hints: @@ -440,8 +370,6 @@ Initialization of Recycle Bin failed! It cannot be used! Die Initialisierung des Papierkorbs ist fehlgeschlagen! Er kann nicht verwendet werden! It was not possible to gain access to Recycle Bin!\n\nIt's likely that you are not using Windows XP. (Probably Vista)\nIf you want this feature included, please contact the author. :) Die Papierkorbfunktion steht nicht zur Verfügung!\n\nWahrscheinlich ist das aktuelle Betriebssystem nicht Windows XP. (Möglicherweise Vista)\nWenn Sie diese Funktion wirklich benötigen kontaktieren Sie bitte den Autor. :) -Items completed: -Elemente komplett: Left directory does not exist. Please select a new one! Verzeichnis auf der linken Seite existiert nicht. Bitte ein anderes auswählen! Left folder: @@ -452,40 +380,24 @@ Load configuration from file:\n - use this choice box\n - drag & drop co Konfiguration aus Datei laden:\n - diese Auswahlliste verwenden\n - Config-Datei per Drag & Drop auf dieses Fenster ziehen\n - Config-Datei als ersten Kommandozeilenparameter mitgeben Load configuration... Konfiguration laden... -Log-messages: -Lognachrichten: Log-messages:\n------------- Lognachrichten:\n--------------- Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. Spiegel-Backup des linken Ordners erstellen: Der rechte Ordner wird dabei überschrieben und nach der Synchronisation dem linken exakt gleichen. Move files to Recycle Bin instead of deleting or overwriting them directly.\n Verschiebe die Dateien in den Papierkorb anstatt sie zu löschen oder zu überschreiben.\n -Not all items have been synchronized! You may try to synchronize the remaining items again (WITHOUT having to re-compare)! -Nicht alle Objekte wurden synchronisiert! Die Synchronisation kann erneut gestartet werden (OHNE dass ein erneuter Vergleich notwendig ist)! Not all items were synchronized! Have a look at the list. Nicht alle Objekte wurden synchronisiert! Siehe die verbliebenen Elemente im Hauptfenster. Nothing to synchronize. Both directories adhere to the sync-configuration! Nichts zu synchronisieren. Beide Verzeichnisse entsprechen den Synchronisationseinstellungen! -Nothing to synchronize. Both directories seem to contain the same data! -Nichts zu synchronisieren. Beide Verzeichnisse scheinen dieselben Daten zu enthalten! Number of files and directories that will be created Anzahl der Dateien und Verzeichnisse, die erstellt werden Number of files and directories that will be deleted Anzahl der Dateien und Verzeichnisse, die gelöscht werden -Number of files or directories that will be created -Anzahl der Dateien oder Verzeichnisse, die erstellt werden -Number of files or directories that will be deleted -Anzahl der Dateien oder Verzeichnisse, die gelöscht werden Number of files that will be overwritten Anzahl der Dateien, die überschrieben werden -OK -OK -Objects to process: -Zu übertragende Elemente: One way -> Nach rechts -> -Only files/directories that pass filtering will be relevant for synchronization.\n\n1. Enter full file or directory names separated by ';'.\n2. Wildcard characters '*' and '?' are supported.\n3. Case sensitive expressions!\n\nExample: *.tmp;C:\\data\\dummy.log;*filename*;*directory* -Bei der Synchronisation werden nur die Dateien/Ordner berücksichtigt, die zu den\nFiltereinstellungen passen.\n\n1. Komplette Datei- oder Verzeichnisnamen getrennt durch ';' eingeben.\n2. Die Platzhalter '*' und '?' werden unterstützt.\n3. Groß-/Kleinschreibung wird unterschieden!\n\nBeispiel: *.tmp;C:\\data\\dummy.log;*filename*;*directory* Only files/directories that pass filtering will be selected for synchronization. Bei der Synchronisation werden nur die Dateien/Ordner berücksichtigt, die zu\nden Filtereinstellungen passen. Open synchronization dialog @@ -510,34 +422,24 @@ Published under the GNU General Public License: Veröffentlicht unter der GNU General Public License: Quit Beenden -Reading content of -Lese Inhalt von Relative path Relativer Pfad Remaining time: Verbliebene Zeit: Result Ergebnis -Retry -Wiederholen Right directory does not exist. Please select a new one! Verzeichnis auf der rechten Seite existiert nicht. Bitte ein anderes auswählen! Right folder: Rechter Ordner: -Running... -Aktiv... Save current configuration to file Aktuelle Konfiguration in Datei sichern Saved aborted! Speichern abgebrochen! Scanning Lese Datei -Scanning files/folders: -Scanne Dateien/Ordner: Scanning... Suche Dateien... -Scanning... -Scanne... Select a folder Verzeichnis wählen Select variant: @@ -566,8 +468,6 @@ Source code written completely in C++ utilizing:\n\n MinGW \t\t- Windows port o Sourcecode komplett in C++ geschrieben unter Verwendung von:\n\n MinGW \t\t- Windows-Port der GNU Compiler Collection\n wxWidgets \t- Open-Source GUI-Framework\n wxFormBuilder\t- wxWidgets GUI-Builder\n CodeBlocks \t- Open-Source IDE\n\n ZenJu Specify algorithm to test if files are equal:\n\n\t\t Algorithmus wählen, um gleiche Dateien zu erkennen:\n\n\t\t -Specify algorithm to test if files are equal:\n\n\t\tSIZEDATE: check filesize and date\n\t\tCONTENT: check file content\n -Methode angeben, um gleiche Dateien zu erkennen:\n\n\t\tSIZEDATE: Prüfung auf Dateigröße und -datum\n\t\tCONTENT: Prüfung auf Dateiinhalt\n Specify names to be excluded separated by ';'. Wildcards '*' and '?' are supported. Default: \"\"\n Auszuschließende Namen, getrennt durch ';' angeben. Platzhalter '*' und '?' werden unterstützt. Standard: \"\"\n Specify names to be included separated by ';'. Wildcards '*' and '?' are supported. Default: \"*\"\n @@ -578,40 +478,36 @@ Start Start Start synchronization Starte die Synchronisation -Start synchronizing files -Beginne Synchronisation der Daten Stop Stop Swap sides Vertausche Seiten Synchronization aborted! Synchronisation abgebrochen! -Synchronization aborted: You may try to synchronize remaining items again (WITHOUT having to re-compare)! -Synchronisation abgebrochen: Die Synchronisation kann erneut gestartet werden (OHNE dass ein erneuter Vergleich notwendig ist)! Synchronization completed successfully. Synchronisation erfolgreich abgeschlossen. Synchronization completed with errors! Synchronisation abgeschlossen. Es sind Fehler aufgetreten. -Synchronization completed. -Synchronisation abgeschlossen. Synchronization settings Synchronisationseinstellungen -Synchronization started. -Synchronisation gestartet. Synchronization status Synchronisation: Status Synchronize both sides simultaneously: Copy new or updated files in both directions. Beide Seiten gleichzeitig synchronisieren: Neue oder aktualisierte Dateien werden auf die jeweils andere Seite kopiert. Synchronizing... Synchronisiere... +Thanks to Jean-François Hartmann for doing the French translation! +Vielen Dank an Jean-François Hartmann für die französische Übersetzung! The selected file does not contain a valid configuration! Die ausgewählte Datei enthält keine gültige Konfiguration! The selected file does not exist anymore! Die gewählte Datei existiert nicht mehr! -Total amount of data that will be copied -Menge der Daten, die kopiert werden +Time elapsed: +Vergangene Zeit: Total amount of data that will be transferred Gesamtmenge der Daten, die übertragen werden +Total time: +Gesamtzeit: Two way <-> Beidseitig <-> Unable to create logfile! @@ -636,11 +532,5 @@ Warnung: Synchronisation fehlgeschlagen für \n\nMit nächstem Objekt fortsetzen, wiederholen oder abbrechen? \n\nInformation: If you skip the error and continue or abort a re-compare will be necessary! \n\nInformation: Wenn der Fehler nicht behoben wird, muss der Vergleich erneut gestartet werden! -\n\nSkip this directory and continue synchronization? -\n\nDieses Verzeichnis überspringen und mit Synchronisation fortfahren? -\n\nSkip this file and continue synchronization? -\n\nDiese Datei überspringen und mit Synchronisation fortfahren? -dummy -dummy |> file on right side only\n |> Datei existiert nur rechts\n diff --git a/lang.dat b/lang.dat Binary files differnew file mode 100644 index 00000000..4e13590f --- /dev/null +++ b/lang.dat diff --git a/library/globalFunctions.cpp b/library/globalFunctions.cpp index 5afb1650..d4579312 100644 --- a/library/globalFunctions.cpp +++ b/library/globalFunctions.cpp @@ -92,3 +92,35 @@ wxString& globalFunctions::includeNumberSeparator(wxString& number) number.insert(i, GlobalResources::thousandsSeparator); return number; } + + +int globalFunctions::readInt(ifstream& stream) +{ + int result = 0; + char* buffer = reinterpret_cast<char*>(&result); + stream.read(buffer, sizeof(int)); + return result; +} + + +void globalFunctions::writeInt(ofstream& stream, const int number) +{ + const char* buffer = reinterpret_cast<const char*>(&number); + stream.write(buffer, sizeof(int)); +} + + +int globalFunctions::readInt(wxInputStream& stream) +{ + int result = 0; + char* buffer = reinterpret_cast<char*>(&result); + stream.Read(buffer, sizeof(int)); + return result; +} + + +void globalFunctions::writeInt(wxOutputStream& stream, const int number) +{ + const char* buffer = reinterpret_cast<const char*>(&number); + stream.Write(buffer, sizeof(int)); +} diff --git a/library/globalFunctions.h b/library/globalFunctions.h index 55e37c61..7f50f90a 100644 --- a/library/globalFunctions.h +++ b/library/globalFunctions.h @@ -4,6 +4,8 @@ #include <string> #include <algorithm> #include <wx/string.h> +#include <fstream> +#include <wx/stream.h> using namespace std; @@ -32,6 +34,12 @@ namespace globalFunctions double wxStringToDouble(const wxString& number); //Convert wxString to number wxString& includeNumberSeparator(wxString& number); + + int readInt(ifstream& stream); //read int from file stream + void writeInt(ofstream& stream, const int number); //write int to filestream + + int readInt(wxInputStream& stream); //read int from file stream + void writeInt(wxOutputStream& stream, const int number); //write int to filestream } diff --git a/library/misc.cpp b/library/misc.cpp index 44dcaf0e..7d798ec0 100644 --- a/library/misc.cpp +++ b/library/misc.cpp @@ -2,6 +2,7 @@ #include <fstream> #include <wx/msgdlg.h> #include "resources.h" +#include "globalFunctions.h" void exchangeEscapeChars(wxString& data) { @@ -25,7 +26,7 @@ CustomLocale::~CustomLocale() ofstream output("lang.dat"); if (output) { - output<<currentLanguage<<char(0); + globalFunctions::writeInt(output, currentLanguage); output.close(); } else @@ -41,9 +42,7 @@ void CustomLocale::loadLanguageFromCfg() //retrieve language from config file: ifstream input("lang.dat"); if (input) { - char buffer[20]; - input.getline(buffer, 20, char(0)); - language = atoi(buffer); + language = globalFunctions::readInt(input); input.close(); } else @@ -65,7 +64,9 @@ void CustomLocale::loadLanguageFile(int language) case wxLANGUAGE_GERMAN: languageFile = "german.lng"; break; - + case wxLANGUAGE_FRENCH: + languageFile = "french.lng"; + break; default: languageFile = string(); currentLanguage = wxLANGUAGE_ENGLISH; @@ -87,13 +88,13 @@ void CustomLocale::loadLanguageFile(int language) //---------- //Linux: 0xa //Mac: 0xd - //Win: 0xd 0xa + //Win: 0xd 0xa <- language files are in Windows format while (langFile.getline(temp, bufferSize, 0xd)) //specify delimiter explicitely { langFile.get(); //discard the 0xa character - //wxString formattedString(temp, *wxConvUTF8, bufferSize); //convert UTF8 input to Unicode - wxString formattedString(temp); + //wxString formattedString = wxString::FromUTF8(temp); + wxString formattedString = wxString::From8BitData(temp); exchangeEscapeChars(formattedString); diff --git a/library/multithreading.cpp b/library/multithreading.cpp index bb598194..c8826b11 100644 --- a/library/multithreading.cpp +++ b/library/multithreading.cpp @@ -145,6 +145,6 @@ void UpdateWhileExecuting::execute(StatusUpdater* statusUpdater) theWorkerThread->readyToBeginProcessing.Unlock(); while (receivingResult.WaitTimeout(UI_UPDATE_INTERVAL) == wxCOND_TIMEOUT) - statusUpdater->triggerUI_Refresh(); //ATTENTION: Exception "AbortThisProcess" may be thrown here!!! + statusUpdater->triggerUI_Refresh(true); //ATTENTION: Exception "AbortThisProcess" may be thrown here!!! } diff --git a/library/multithreading.h b/library/multithreading.h index 56cff890..f2b5211c 100644 --- a/library/multithreading.h +++ b/library/multithreading.h @@ -20,7 +20,7 @@ public: virtual int reportError(const wxString& text) = 0; //this method is triggered repeatedly and can be used to refresh the ui by dispatching pending events - virtual void triggerUI_Refresh() = 0; + virtual void triggerUI_Refresh(bool asyncProcessActive = false) = 0; void requestAbortion() //opportunity to abort must be implemented in a frequently executed method like triggerUI_Refresh() { //currently used by the UI status information screen, when button "Abort is pressed" diff --git a/ui/MainDialog.cpp b/ui/MainDialog.cpp index e1681d13..7b7a5c37 100644 --- a/ui/MainDialog.cpp +++ b/ui/MainDialog.cpp @@ -10,7 +10,7 @@ #include "mainDialog.h" #include <wx/filename.h> #include "../library/globalFunctions.h" -#include <fstream> +#include <wx/wfstream.h> #include <wx/clipbrd.h> #include <wx/file.h> #include "../library/customGrid.h" @@ -182,7 +182,9 @@ MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale case wxLANGUAGE_GERMAN: m_menuItemGerman->Check(); break; - + case wxLANGUAGE_FRENCH: + m_menuItemFrench->Check(); + break; default: m_menuItemEnglish->Check(); } @@ -260,7 +262,7 @@ MainDialog::~MainDialog() writeConfigurationToHD(FreeFileSync::FfsLastConfigFile); //don't trow exceptions in destructors - if (restartOnExit) + if (restartOnExit) //needed so that restart is scheduled AFTER configuration was written! { //create new dialog MainDialog* frame = new MainDialog(0L, FreeFileSync::FfsLastConfigFile, programLanguage); frame->SetIcon(*GlobalResources::programIcon); //set application icon @@ -635,7 +637,7 @@ public: void updateStatusText(const wxString& text) {} void initNewProcess(int objectsTotal, double dataTotal, int processID) {} void updateProcessedData(int objectsProcessed, double dataProcessed) {} - void triggerUI_Refresh() {} + void triggerUI_Refresh(bool asyncProcessActive) {} private: bool continueOnError; @@ -1236,119 +1238,116 @@ void MainDialog::readConfigurationFromHD(const wxString& filename, bool programS { char bigBuffer[10000]; - ifstream config(filename.c_str()); - if (!config) - { - if (programStartup) - loadDefaultConfiguration(); - else - wxMessageBox(wxString(_("Could not read configuration file ")) + wxT("\"") + filename + wxT("\""), _("An exception occured!"), wxOK | wxICON_ERROR); - - return; - } - - //read FFS identifier - config.get(bigBuffer, FreeFileSync::FfsConfigFileID.size() + 1); - - if (string(bigBuffer) != FreeFileSync::FfsConfigFileID) + if (wxFileExists(filename)) { - wxMessageBox(_("The selected file does not contain a valid configuration!"), _("Warning"), wxOK); - config.close(); - return; - } - - - //put filename on list of last used config files - addCfgFileToHistory(filename); - + wxFFileInputStream config(filename); + if (config.IsOk()) + { - //read sync configuration - cfg.syncConfiguration.exLeftSideOnly = SyncDirection(config.get()); - cfg.syncConfiguration.exRightSideOnly = SyncDirection(config.get()); - cfg.syncConfiguration.leftNewer = SyncDirection(config.get()); - cfg.syncConfiguration.rightNewer = SyncDirection(config.get()); - cfg.syncConfiguration.different = SyncDirection(config.get()); + //read FFS identifier + config.Read(bigBuffer, FreeFileSync::FfsConfigFileID.size()); + bigBuffer[FreeFileSync::FfsConfigFileID.size()] = 0; - //read compare algorithm - cfg.compareVar = CompareVariant(config.get()); - updateCompareButtons(); + if (string(bigBuffer) != FreeFileSync::FfsConfigFileID) + { + wxMessageBox(_("The selected file does not contain a valid configuration!"), _("Warning"), wxOK); + return; + } - //read column sizes - for (int i = 0; i < m_grid1->GetNumberCols(); ++i) - { - config.getline(bigBuffer, 100, char(0)); - m_grid1->SetColSize(i, atoi(bigBuffer)); - } - for (int i = 0; i < m_grid2->GetNumberCols(); ++i) - { - config.getline(bigBuffer, 100, char(0)); - m_grid2->SetColSize(i, atoi(bigBuffer)); - } + //put filename on list of last used config files + addCfgFileToHistory(filename); - //read application window size and position - bool startWindowMaximized = bool(config.get()); + //read sync configuration + cfg.syncConfiguration.exLeftSideOnly = SyncDirection(config.GetC()); + cfg.syncConfiguration.exRightSideOnly = SyncDirection(config.GetC()); + cfg.syncConfiguration.leftNewer = SyncDirection(config.GetC()); + cfg.syncConfiguration.rightNewer = SyncDirection(config.GetC()); + cfg.syncConfiguration.different = SyncDirection(config.GetC()); - config.getline(bigBuffer, 100, char(0)); - int widthTmp = atoi(bigBuffer); - config.getline(bigBuffer, 100, char(0)); - int heighthTmp = atoi(bigBuffer); + //read compare algorithm + cfg.compareVar = CompareVariant(config.GetC()); + updateCompareButtons(); - config.getline(bigBuffer, 100, char(0)); - int posX_Tmp = atoi(bigBuffer); - config.getline(bigBuffer, 100, char(0)); - int posY_Tmp = atoi(bigBuffer); + //read column sizes + for (int i = 0; i < m_grid1->GetNumberCols(); ++i) + m_grid1->SetColSize(i, globalFunctions::readInt(config)); - //apply window size and position at program startup ONLY - if (programStartup) - { - widthNotMaximized = widthTmp; - heightNotMaximized = heighthTmp; - posXNotMaximized = posX_Tmp; - posYNotMaximized = posY_Tmp; + for (int i = 0; i < m_grid2->GetNumberCols(); ++i) + m_grid2->SetColSize(i, globalFunctions::readInt(config)); - //apply window size and position - SetSize(posXNotMaximized, posYNotMaximized, widthNotMaximized, heightNotMaximized); - Maximize(startWindowMaximized); - } + //read application window size and position + bool startWindowMaximized = bool(config.GetC()); - //read last directory selection - config.getline(bigBuffer, 10000, char(0)); - m_directoryPanel1->SetValue(bigBuffer); - if (wxDirExists(bigBuffer)) - m_dirPicker1->SetPath(bigBuffer); + int widthTmp = globalFunctions::readInt(config); + int heighthTmp = globalFunctions::readInt(config); + int posX_Tmp = globalFunctions::readInt(config); + int posY_Tmp = globalFunctions::readInt(config); - config.getline(bigBuffer, 10000, char(0)); - m_directoryPanel2->SetValue(bigBuffer); - if (wxDirExists(bigBuffer)) - m_dirPicker2->SetPath(bigBuffer); + //apply window size and position at program startup ONLY + if (programStartup) + { + widthNotMaximized = widthTmp; + heightNotMaximized = heighthTmp; + posXNotMaximized = posX_Tmp; + posYNotMaximized = posY_Tmp; + + //apply window size and position + SetSize(posXNotMaximized, posYNotMaximized, widthNotMaximized, heightNotMaximized); + Maximize(startWindowMaximized); + } - //read filter settings: - cfg.hideFiltered = bool(config.get()); - m_checkBoxHideFilt->SetValue(cfg.hideFiltered); + //read last directory selection + int byteCount = globalFunctions::readInt(config); + config.Read(bigBuffer, byteCount); + wxString leftDir = wxString::FromUTF8(bigBuffer, byteCount); + m_directoryPanel1->SetValue(leftDir); + if (wxDirExists(leftDir)) + m_dirPicker1->SetPath(leftDir); + + byteCount = globalFunctions::readInt(config); + config.Read(bigBuffer, byteCount); + wxString rightDir = wxString::FromUTF8(bigBuffer, byteCount); + m_directoryPanel2->SetValue(rightDir); + if (wxDirExists(rightDir)) + m_dirPicker2->SetPath(rightDir); + + //read filter settings: + cfg.hideFiltered = bool(config.GetC()); + m_checkBoxHideFilt->SetValue(cfg.hideFiltered); + + cfg.filterIsActive = bool(config.GetC()); + updateFilterButton(m_bpButtonFilter, cfg.filterIsActive); - cfg.filterIsActive = bool(config.get()); - updateFilterButton(m_bpButtonFilter, cfg.filterIsActive); + //include + byteCount = globalFunctions::readInt(config); + config.Read(bigBuffer, byteCount); + cfg.includeFilter = wxString::FromUTF8(bigBuffer, byteCount); - //include - config.getline(bigBuffer, 10000, char(0)); - cfg.includeFilter = bigBuffer; + //exclude + byteCount = globalFunctions::readInt(config); + config.Read(bigBuffer, byteCount); + cfg.excludeFilter = wxString::FromUTF8(bigBuffer, byteCount); - //exclude - config.getline(bigBuffer, 10000, char(0)); - cfg.excludeFilter = bigBuffer; + cfg.useRecycleBin = bool(config.GetC()); - cfg.useRecycleBin = bool(config.get()); + cfg.continueOnError = bool(config.GetC()); - cfg.continueOnError = bool(config.get()); + return; + } + } - config.close(); + //handle error situation: + if (programStartup) + loadDefaultConfiguration(); + else + wxMessageBox(wxString(_("Could not read configuration file ")) + wxT("\"") + filename + wxT("\""), _("An exception occured!"), wxOK | wxICON_ERROR); } void MainDialog::writeConfigurationToHD(const wxString& filename) { - ofstream config(filename.c_str()); - if (!config) + wxFFileOutputStream config(filename); + if (!config.IsOk()) { wxMessageBox(wxString(_("Could not write to ")) + wxT("\"") + filename + wxT("\""), _("An exception occured!"), wxOK | wxICON_ERROR); return; @@ -1358,51 +1357,64 @@ void MainDialog::writeConfigurationToHD(const wxString& filename) addCfgFileToHistory(filename); //write FFS identifier - config<<FreeFileSync::FfsConfigFileID.c_str(); + config.Write(FreeFileSync::FfsConfigFileID.c_str(), FreeFileSync::FfsConfigFileID.size()); //write sync configuration - config<<char(cfg.syncConfiguration.exLeftSideOnly) - <<char(cfg.syncConfiguration.exRightSideOnly) - <<char(cfg.syncConfiguration.leftNewer) - <<char(cfg.syncConfiguration.rightNewer) - <<char(cfg.syncConfiguration.different); + config.PutC(char(cfg.syncConfiguration.exLeftSideOnly)); + config.PutC(char(cfg.syncConfiguration.exRightSideOnly)); + config.PutC(char(cfg.syncConfiguration.leftNewer)); + config.PutC(char(cfg.syncConfiguration.rightNewer)); + config.PutC(char(cfg.syncConfiguration.different)); //write compare algorithm - config<<char(cfg.compareVar); + config.PutC(char(cfg.compareVar)); //write column sizes for (int i = 0; i < m_grid1->GetNumberCols(); ++i) - config<<m_grid1->GetColSize(i)<<char(0); + globalFunctions::writeInt(config, m_grid1->GetColSize(i)); + for (int i = 0; i < m_grid2->GetNumberCols(); ++i) - config<<m_grid2->GetColSize(i)<<char(0); + globalFunctions::writeInt(config, m_grid2->GetColSize(i)); //write application window size and position - config<<char(IsMaximized()); + config.PutC(char(IsMaximized())); //window size - config<<widthNotMaximized<<char(0); - config<<heightNotMaximized<<char(0); + globalFunctions::writeInt(config, widthNotMaximized); + globalFunctions::writeInt(config, heightNotMaximized); //window position - config<<posXNotMaximized<<char(0); - config<<posYNotMaximized<<char(0); + globalFunctions::writeInt(config, posXNotMaximized); + globalFunctions::writeInt(config, posYNotMaximized); //write last directory selection - config<<m_directoryPanel1->GetValue().c_str()<<char(0) - <<m_directoryPanel2->GetValue().c_str()<<char(0); + wxCharBuffer buffer = (m_directoryPanel1->GetValue()).ToUTF8(); + int byteCount = strlen(buffer); + globalFunctions::writeInt(config, byteCount); + config.Write(buffer, byteCount); + + buffer = (m_directoryPanel2->GetValue()).ToUTF8(); + byteCount = strlen(buffer); + globalFunctions::writeInt(config, byteCount); + config.Write(buffer, byteCount); //write filter settings - config<<char(cfg.hideFiltered); - config<<char(cfg.filterIsActive); + config.PutC(char(cfg.hideFiltered)); + config.PutC(char(cfg.filterIsActive)); - config<<cfg.includeFilter.c_str()<<char(0) - <<cfg.excludeFilter.c_str()<<char(0); + buffer = (cfg.includeFilter).ToUTF8(); + byteCount = strlen(buffer); + globalFunctions::writeInt(config, byteCount); + config.Write(buffer, byteCount); - config<<char(cfg.useRecycleBin); + buffer = (cfg.excludeFilter).ToUTF8(); + byteCount = strlen(buffer); + globalFunctions::writeInt(config, byteCount); + config.Write(buffer, byteCount); - config<<char(cfg.continueOnError); + config.PutC(char(cfg.useRecycleBin)); - config.close(); + config.PutC(char(cfg.continueOnError)); } @@ -2009,8 +2021,10 @@ void MainDialog::updateStatusInformation(const GridView& visibleGrid) while (stackObjects.size() > 0) stackObjects.pop(); - unsigned int objectsOnLeftView = 0; - unsigned int objectsOnRightView = 0; + unsigned int filesOnLeftView = 0; + unsigned int foldersOnLeftView = 0; + unsigned int filesOnRightView = 0; + unsigned int foldersOnRightView = 0; wxULongLong filesizeLeftView; wxULongLong filesizeRightView; @@ -2022,27 +2036,55 @@ void MainDialog::updateStatusInformation(const GridView& visibleGrid) { const FileCompareLine& refLine = currentGridData[*i]; - //calculate total number of bytes for each sied - if (refLine.fileDescrLeft.objType != TYPE_NOTHING) + //calculate total number of bytes for each side + if (refLine.fileDescrLeft.objType == TYPE_FILE) { filesizeLeftView+= refLine.fileDescrLeft.fileSize; - ++objectsOnLeftView; + ++filesOnLeftView; } + else if (refLine.fileDescrLeft.objType == TYPE_DIRECTORY) + ++foldersOnLeftView; - if (refLine.fileDescrRight.objType != TYPE_NOTHING) + if (refLine.fileDescrRight.objType == TYPE_FILE) { filesizeRightView+= refLine.fileDescrRight.fileSize; - ++objectsOnRightView; + ++filesOnRightView; } + else if (refLine.fileDescrRight.objType == TYPE_DIRECTORY) + ++foldersOnRightView; } +//################################################# +// format numbers to text - //show status information on "root" level. This cannot be accomplished in writeGrid since filesizes are already formatted for display there - wxString objectsViewLeft = numberToWxString(objectsOnLeftView); - globalFunctions::includeNumberSeparator(objectsViewLeft); - if (objectsOnLeftView == 1) - statusLeftNew = wxString(_("1 item on left, ")) + FreeFileSync::formatFilesizeToShortString(filesizeLeftView); - else - statusLeftNew = objectsViewLeft + _(" items on left, ") + FreeFileSync::formatFilesizeToShortString(filesizeLeftView); +//show status information on "root" level. This cannot be accomplished in writeGrid since filesizes are already formatted for display there + if (foldersOnLeftView) + { + wxString folderCount = numberToWxString(foldersOnLeftView); + globalFunctions::includeNumberSeparator(folderCount); + + statusLeftNew+= folderCount; + if (foldersOnLeftView == 1) + statusLeftNew+= _(" directory"); + else + statusLeftNew+= _(" directories"); + + if (filesOnLeftView) + statusLeftNew+= wxT(", "); + } + + if (filesOnLeftView) + { + wxString fileCount = numberToWxString(filesOnLeftView); + globalFunctions::includeNumberSeparator(fileCount); + + statusLeftNew+= fileCount; + if (filesOnLeftView == 1) + statusLeftNew+= _(" file, "); + else + statusLeftNew+= _(" files, "); + + statusLeftNew+= FreeFileSync::formatFilesizeToShortString(filesizeLeftView); + } wxString objectsTotal = numberToWxString(currentGridData.size()); globalFunctions::includeNumberSeparator(objectsTotal); @@ -2054,12 +2096,35 @@ void MainDialog::updateStatusInformation(const GridView& visibleGrid) statusMiddleNew = objectsView + _(" of ") + objectsTotal + _(" rows in view"); - wxString objectsViewRight = numberToWxString(objectsOnRightView); - globalFunctions::includeNumberSeparator(objectsViewRight); - if (objectsOnRightView == 1) - statusRightNew = wxString(_("1 item on right, ")) + FreeFileSync::formatFilesizeToShortString(filesizeRightView); - else - statusRightNew = objectsViewRight + _(" items on right, ") + FreeFileSync::formatFilesizeToShortString(filesizeRightView); + if (foldersOnRightView) + { + wxString folderCount = numberToWxString(foldersOnRightView); + globalFunctions::includeNumberSeparator(folderCount); + + statusRightNew+= folderCount; + if (foldersOnRightView == 1) + statusRightNew+= _(" directory"); + else + statusRightNew+= _(" directories"); + + if (filesOnRightView) + statusRightNew+= wxT(", "); + } + + if (filesOnRightView) + { + wxString fileCount = numberToWxString(filesOnRightView); + globalFunctions::includeNumberSeparator(fileCount); + + statusRightNew+= fileCount; + if (filesOnRightView == 1) + statusRightNew+= _(" file, "); + else + statusRightNew+= _(" files, "); + + statusRightNew+= FreeFileSync::formatFilesizeToShortString(filesizeRightView); + } + //avoid screen flicker if (m_staticTextStatusLeft->GetLabel() != statusLeftNew) @@ -2288,7 +2353,7 @@ inline void CompareStatusUpdater::updateProcessedData(int objectsProcessed, double dataProcessed) { if (currentProcess == FreeFileSync::scanningFilesProcess) - statusPanel->incScannedFiles_NoUpdate(objectsProcessed); + statusPanel->incScannedObjects_NoUpdate(objectsProcessed); else if (currentProcess == FreeFileSync::compareFileContentProcess) statusPanel->incProcessedCmpData_NoUpdate(objectsProcessed, dataProcessed); else assert(false); @@ -2329,9 +2394,10 @@ int CompareStatusUpdater::reportError(const wxString& text) inline -void CompareStatusUpdater::triggerUI_Refresh() +void CompareStatusUpdater::triggerUI_Refresh(bool asyncProcessActive) { - if (abortionRequested) throw AbortThisProcess(); //abort can be triggered by syncStatusFrame + if (abortionRequested && !asyncProcessActive) + throw AbortThisProcess(); //abort can be triggered by syncStatusFrame if (updateUI_IsAllowed()) //test if specific time span between ui updates is over statusPanel->updateStatusPanelNow(); @@ -2441,9 +2507,9 @@ int SyncStatusUpdater::reportError(const wxString& text) } -void SyncStatusUpdater::triggerUI_Refresh() +void SyncStatusUpdater::triggerUI_Refresh(bool asyncProcessActive) { - if (abortionRequested) + if (abortionRequested && !asyncProcessActive) throw AbortThisProcess(); //abort can be triggered by syncStatusFrame if (updateUI_IsAllowed()) //test if specific time span between ui updates is over @@ -2560,3 +2626,12 @@ void MainDialog::OnMenuLangGerman(wxCommandEvent& event) event.Skip(); } + +void MainDialog::OnMenuLangFrench(wxCommandEvent& event) +{ + programLanguage->loadLanguageFile(wxLANGUAGE_FRENCH); //language is a global attribute + restartOnExit = true; + Destroy(); + event.Skip(); +} + diff --git a/ui/MainDialog.h b/ui/MainDialog.h index 3bc4c590..3ef7dbf5 100644 --- a/ui/MainDialog.h +++ b/ui/MainDialog.h @@ -136,6 +136,7 @@ private: void OnMenuQuit( wxCommandEvent& event); void OnMenuLangEnglish( wxCommandEvent& event); void OnMenuLangGerman( wxCommandEvent& event); + void OnMenuLangFrench( wxCommandEvent& event); void enableSynchronization(bool value); @@ -227,7 +228,7 @@ public: void updateProcessedData(int objectsProcessed, double dataProcessed); int reportError(const wxString& text); - void triggerUI_Refresh(); + void triggerUI_Refresh(bool asyncProcessActive); private: MainDialog* mainDialog; @@ -248,7 +249,7 @@ public: void updateProcessedData(int objectsProcessed, double dataProcessed); int reportError(const wxString& text); - void triggerUI_Refresh(); + void triggerUI_Refresh(bool asyncProcessActive); private: SyncStatus* syncStatusFrame; diff --git a/ui/SmallDialogs.cpp b/ui/SmallDialogs.cpp index 3961e28a..7965a5c9 100644 --- a/ui/SmallDialogs.cpp +++ b/ui/SmallDialogs.cpp @@ -14,7 +14,7 @@ AboutDlg::AboutDlg(wxWindow* window) : AboutDlgGenerated(window) m_bitmap13->SetBitmap(*GlobalResources::bitmapGPL); //build information - wxString build = wxString(_("(Build: ")) + __TDATE__; + wxString build = wxString(wxT("(")) + _("Build: ") + __TDATE__; #if wxUSE_UNICODE build+= wxT(" - Unicode"); #else @@ -109,8 +109,8 @@ void FilterDlg::OnCancel(wxCommandEvent& event) void FilterDlg::OnDefault(wxCommandEvent& event) { - m_textCtrlInclude->SetValue("*"); - m_textCtrlExclude->SetValue(""); + m_textCtrlInclude->SetValue(wxT("*")); + m_textCtrlExclude->SetValue(wxEmptyString); //changes to mainDialog are only committed when the OK button is pressed event.Skip(); @@ -304,6 +304,8 @@ SyncStatus::SyncStatus(StatusUpdater* updater, wxWindow* parentWindow) : if (windowToDis) //disable (main) window while this status dialog is shown windowToDis->Disable(); + + timeElapsed.Start(); //measure total time } @@ -362,8 +364,12 @@ void SyncStatus::updateStatusDialogNow() const wxString remainingBytes = FreeFileSync::formatFilesizeToShortString(totalData - currentData); m_staticTextDataRemaining->SetLabel(remainingBytes); + //time elapsed + m_staticTextTimeElapsed->SetLabel((wxTimeSpan::Milliseconds(timeElapsed.Time())).Format()); + //do the ui update bSizer28->Layout(); + bSizer31->Layout(); updateUI_Now(); //support for pause button @@ -431,7 +437,6 @@ void SyncStatus::processHasFinished(SyncStatusID id) //essential to call this in m_buttonOK->SetFocus(); m_animationControl1->Stop(); - //m_animationControl1->SetInactiveBitmap(*GlobalResources::bitmapFinished); m_animationControl1->Hide(); @@ -453,13 +458,14 @@ void SyncStatus::OnPause(wxCommandEvent& event) processPaused = false; m_buttonPause->SetLabel(_("Pause")); m_animationControl1->Play(); - + timeElapsed.Resume(); } else { processPaused = true; m_buttonPause->SetLabel(_("Continue")); m_animationControl1->Stop(); + timeElapsed.Pause(); } } @@ -467,7 +473,18 @@ void SyncStatus::OnPause(wxCommandEvent& event) void SyncStatus::OnAbort(wxCommandEvent& event) { processPaused = false; - if (currentProcessIsRunning) currentStatusUpdater->requestAbortion(); + if (currentProcessIsRunning) + { + m_buttonAbort->Disable(); + m_buttonAbort->Hide(); + m_buttonPause->Disable(); + m_buttonPause->Hide(); + + setStatusText_NoUpdate(_("Abort requested: Waiting for current operation to finish...")); + //no Layout() or UI-update here to avoid cascaded Yield()-call + + currentStatusUpdater->requestAbortion(); + } } @@ -483,7 +500,7 @@ void SyncStatus::OnClose(wxCloseEvent& event) CompareStatus::CompareStatus(wxWindow* parentWindow) : CompareStatusGenerated(parentWindow), - scannedFiles(0), + scannedObjects(0), totalCmpData(0), processedCmpData(0), scalingFactorCmp(0), @@ -526,9 +543,9 @@ void CompareStatus::resetCmpGauge(int totalCmpObjectsToProcess, double totalCmpD } -void CompareStatus::incScannedFiles_NoUpdate(int number) +void CompareStatus::incScannedObjects_NoUpdate(int number) { - scannedFiles+= number; + scannedObjects+= number; } @@ -553,7 +570,7 @@ void CompareStatus::updateStatusPanelNow() //status texts m_textCtrlFilename->SetValue(currentStatusText); - m_staticTextScanned->SetLabel(numberToWxString(scannedFiles)); + m_staticTextScanned->SetLabel(numberToWxString(scannedObjects)); //progress indicator for "compare file content" m_gauge2->SetValue(int(processedCmpData * scalingFactorCmp)); diff --git a/ui/SmallDialogs.h b/ui/SmallDialogs.h index 127947f6..e97362d5 100644 --- a/ui/SmallDialogs.h +++ b/ui/SmallDialogs.h @@ -3,6 +3,7 @@ #include "../FreeFileSync.h" #include "guiGenerated.h" +#include <wx/stopwatch.h> class AboutDlg : public AboutDlgGenerated { @@ -114,6 +115,8 @@ private: void OnAbort(wxCommandEvent& event); void OnClose(wxCloseEvent& event); + wxStopWatch timeElapsed; + StatusUpdater* currentStatusUpdater; wxWindow* windowToDis; bool currentProcessIsRunning; @@ -162,14 +165,14 @@ public: ~CompareStatus(); void resetCmpGauge(int totalCmpObjectsToProcess, double totalCmpDataToProcess); - void incScannedFiles_NoUpdate(int number); + void incScannedObjects_NoUpdate(int number); void incProcessedCmpData_NoUpdate(int objectsProcessed, double dataProcessed); void setStatusText_NoUpdate(const wxString& text); void updateStatusPanelNow(); private: //status variables - unsigned int scannedFiles; + unsigned int scannedObjects; wxString currentStatusText; //gauge variables diff --git a/ui/SyncDialog.cpp b/ui/SyncDialog.cpp index efe85553..3fa8619c 100644 --- a/ui/SyncDialog.cpp +++ b/ui/SyncDialog.cpp @@ -3,7 +3,7 @@ #include "../library/resources.h" #include <wx/msgdlg.h> #include <wx/stdpaths.h> -#include <fstream> +#include <wx/ffile.h> using namespace std; @@ -61,6 +61,9 @@ SyncDialog::SyncDialog(wxWindow* window, m_radioBtn3->SetValue(true); //other m_bpButton18->SetLabel(_("&Start")); + + //set tooltip for ambivalent category "different" + adjustToolTips(m_bitmap17, config.compareVar); } //################################################################################################################# @@ -157,6 +160,22 @@ void SyncDialog::updateConfigIcons(wxBitmapButton* button1, } +void SyncDialog::adjustToolTips(wxStaticBitmap* bitmap, const CompareVariant var) +{ + //set tooltip for ambivalent category "different" + if (var == CMP_BY_TIME_SIZE) + { + bitmap->SetToolTip(_("Files that exist on both sides, have same date but different filesizes")); + } + else if (var == CMP_BY_CONTENT) + { + bitmap->SetToolTip(_("Files that exist on both sides and have different content")); + } + else + assert(false); +} + + void SyncDialog::calculatePreview() { //update preview of bytes to be transferred: @@ -349,6 +368,8 @@ BatchDialog::BatchDialog(wxWindow* window, default: assert (false); } + //adjust toolTip + SyncDialog::adjustToolTips(m_bitmap17, config.compareVar); filterIsActive = config.filterIsActive; updateFilterButton(); @@ -447,6 +468,24 @@ void BatchDialog::OnSelectRecycleBin(wxCommandEvent& event) } +void BatchDialog::OnChangeCompareVar(wxCommandEvent& event) +{ + CompareVariant var; + if (m_radioBtnSizeDate->GetValue()) + var = CMP_BY_TIME_SIZE; + else if (m_radioBtnContent->GetValue()) + var = CMP_BY_CONTENT; + else + { + assert(false); + var = CMP_BY_TIME_SIZE; + } + + //set tooltip for ambivalent category "different" + SyncDialog::adjustToolTips(m_bitmap17, var); +} + + void BatchDialog::OnClose(wxCloseEvent& event) { EndModal(0); @@ -479,7 +518,6 @@ void BatchDialog::OnCreateJob(wxCommandEvent& event) return; } - //get a filename #ifdef FFS_WIN wxString fileName = wxT("SyncJob.cmd"); //proposal @@ -499,43 +537,49 @@ void BatchDialog::OnCreateJob(wxCommandEvent& event) wxMessageDialog* messageDlg = new wxMessageDialog(this, wxString(wxT("\"")) + fileName + wxT("\"") + _(" already exists. Overwrite?"), _("Warning") , wxOK | wxCANCEL); if (messageDlg->ShowModal() != wxID_OK) - { - event.Skip(); return; - } } //assemble command line parameters - wxString outputString = parseConfiguration(); + wxString outputString; + try + { + outputString+= parseConfiguration(); + } + catch (const FileError& error) + { + wxMessageBox(error.show(), _("Error"), wxOK | wxICON_ERROR); + return; + } //write export file - ofstream output(fileName.c_str()); - if (output) + wxFFile output(fileName, wxT("w")); + if (output.IsOpened()) { - output<<outputString.c_str(); - EndModal(batchFileCreated); - } - else - wxMessageBox(wxString(_("Could not write to ")) + wxT("\"") + fileName + wxT("\""), _("An exception occured!"), wxOK | wxICON_ERROR); - } + output.Write(outputString); #ifdef FFS_LINUX - //for linux the batch file needs the executable flag - wxExecute(wxString(wxT("chmod +x ")) + fileName); + //for linux the batch file needs the executable flag + output.Close(); + wxExecute(wxString(wxT("chmod +x ")) + fileName); #endif // FFS_LINUX - event.Skip(); + EndModal(batchFileCreated); + } + else + wxMessageBox(wxString(_("Could not write to ")) + wxT("\"") + fileName + wxT("\""), _("Error"), wxOK | wxICON_ERROR); + } } wxString getFormattedSyncDirection(const SyncDirection direction) { if (direction == SYNC_DIR_RIGHT) - return 'R'; + return wxChar('R'); else if (direction == SYNC_DIR_LEFT) - return 'L'; + return wxChar('L'); else if (direction == SYNC_DIR_NONE) - return 'N'; + return wxChar('N'); else { assert (false); @@ -587,8 +631,28 @@ wxString BatchDialog::parseConfiguration() if (m_checkBoxSilent->GetValue()) output+= wxString(wxT(" -")) + GlobalResources::paramSilent; +#ifdef FFS_WIN + //retrieve 8.3 directory names to handle unicode names in batch file correctly + wxChar buffer[MAX_PATH]; + if (GetShortPathName( + (m_directoryPanel1->GetValue()).c_str(), // points to a null-terminated path string + buffer, // points to a buffer to receive the null-terminated short form of the path + MAX_PATH // specifies the size of the buffer pointed to by lpszShortPath + ) == 0) + throw FileError(wxString(_("Could not retrieve the 8.3 directory name of ")) + wxT("\"") + m_directoryPanel1->GetValue() + wxT("\"")); + output+= wxString(wxT(" ")) + buffer; + + if (GetShortPathName( + (m_directoryPanel2->GetValue()).c_str(), // points to a null-terminated path string + buffer, // points to a buffer to receive the null-terminated short form of the path + MAX_PATH // specifies the size of the buffer pointed to by lpszShortPath + ) == 0) + throw FileError(wxString(_("Could not retrieve the 8.3 directory name of ")) + wxT("\"") + m_directoryPanel2->GetValue() + wxT("\"")); + output+= wxString(wxT(" ")) + buffer; +#else output+= wxString(wxT(" ")) + wxT("\"") + wxDir(m_directoryPanel1->GetValue()).GetName() + wxT("\""); //directory WITHOUT trailing path separator output+= wxString(wxT(" ")) + wxT("\"") + wxDir(m_directoryPanel2->GetValue()).GetName() + wxT("\""); //needed since e.g. "C:\" isn't parsed correctly by commandline +#endif // FFS_WIN output+= wxT("\n"); diff --git a/ui/SyncDialog.h b/ui/SyncDialog.h index 9e79c7d2..3eee6400 100644 --- a/ui/SyncDialog.h +++ b/ui/SyncDialog.h @@ -23,6 +23,8 @@ public: wxBitmapButton* button5, const SyncConfiguration& syncConfig); + static void adjustToolTips(wxStaticBitmap* bitmap, const CompareVariant var); + private: void calculatePreview(); @@ -70,6 +72,7 @@ private: void OnFilterButton( wxCommandEvent& event); void OnSelectRecycleBin(wxCommandEvent& event); + void OnChangeCompareVar(wxCommandEvent& event); void OnClose( wxCloseEvent& event); void OnCancel( wxCommandEvent& event); diff --git a/ui/guiGenerated.cpp b/ui/guiGenerated.cpp index be1db069..b851d4b4 100644 --- a/ui/guiGenerated.cpp +++ b/ui/guiGenerated.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Apr 16 2008) +// C++ code generated with wxFormBuilder (version Oct 18 2008) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! @@ -45,6 +45,9 @@ GuiGenerated::GuiGenerated( wxWindow* parent, wxWindowID id, const wxString& tit m_menuItemGerman = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Deutsch") ) , wxEmptyString, wxITEM_RADIO ); m_menu31->Append( m_menuItemGerman ); + m_menuItemFrench = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Français") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemFrench ); + m_menu3->Append( -1, _("&Language"), m_menu31 ); m_menu3->AppendSeparator(); @@ -459,7 +462,7 @@ GuiGenerated::GuiGenerated( wxWindow* parent, wxWindowID id, const wxString& tit bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextStatusLeft = new wxStaticText( m_panel7, wxID_ANY, _("Dummy text"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusLeft = new wxStaticText( m_panel7, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextStatusLeft->Wrap( -1 ); bSizer53->Add( m_staticTextStatusLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); @@ -474,7 +477,7 @@ GuiGenerated::GuiGenerated( wxWindow* parent, wxWindowID id, const wxString& tit bSizer451->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextStatusMiddle = new wxStaticText( m_panel7, wxID_ANY, _("Dummy text"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusMiddle = new wxStaticText( m_panel7, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextStatusMiddle->Wrap( -1 ); bSizer451->Add( m_staticTextStatusMiddle, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); @@ -490,7 +493,7 @@ GuiGenerated::GuiGenerated( wxWindow* parent, wxWindowID id, const wxString& tit bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextStatusRight = new wxStaticText( m_panel7, wxID_ANY, _("Dummy text"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusRight = new wxStaticText( m_panel7, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextStatusRight->Wrap( -1 ); bSizer52->Add( m_staticTextStatusRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); @@ -521,6 +524,7 @@ GuiGenerated::GuiGenerated( wxWindow* parent, wxWindowID id, const wxString& tit this->Connect( m_menuItem5->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuExportFileList ) ); this->Connect( m_menuItemEnglish->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangEnglish ) ); this->Connect( m_menuItemGerman->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangGerman ) ); + this->Connect( m_menuItemFrench->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangFrench ) ); this->Connect( m_menuItem7->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuBatchJob ) ); this->Connect( m_menuItem3->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuAbout ) ); m_bpButtonCompare->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnCompare ), NULL, this ); @@ -564,6 +568,7 @@ GuiGenerated::~GuiGenerated() this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuExportFileList ) ); this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangEnglish ) ); this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangGerman ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangFrench ) ); this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuBatchJob ) ); this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuAbout ) ); m_bpButtonCompare->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnCompare ), NULL, this ); @@ -609,13 +614,13 @@ CompareStatusGenerated::CompareStatusGenerated( wxWindow* parent, wxWindowID id, wxStaticBoxSizer* sbSizer10; sbSizer10 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxHORIZONTAL ); - m_staticText321 = new wxStaticText( this, wxID_ANY, _("Files scanned:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText321 = new wxStaticText( this, wxID_ANY, _("Files/folders scanned:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText321->Wrap( -1 ); m_staticText321->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); sbSizer10->Add( m_staticText321, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); - m_staticTextScanned = new wxStaticText( this, wxID_ANY, _("123456"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextScanned = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextScanned->Wrap( -1 ); m_staticTextScanned->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); @@ -634,7 +639,7 @@ CompareStatusGenerated::CompareStatusGenerated( wxWindow* parent, wxWindowID id, sbSizer13->Add( m_staticText46, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - m_staticTextFilesToCompare = new wxStaticText( this, wxID_ANY, _("123456"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextFilesToCompare = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextFilesToCompare->Wrap( -1 ); m_staticTextFilesToCompare->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); @@ -653,7 +658,7 @@ CompareStatusGenerated::CompareStatusGenerated( wxWindow* parent, wxWindowID id, sbSizer11->Add( m_staticText32, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); - m_staticTextDataToCompare = new wxStaticText( this, wxID_ANY, _("123456"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDataToCompare = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextDataToCompare->Wrap( -1 ); m_staticTextDataToCompare->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); @@ -852,7 +857,7 @@ SyncDlgGenerated::SyncDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr m_staticText37 = new wxStaticText( this, wxID_ANY, _("Create:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText37->Wrap( -1 ); m_staticText37->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); - m_staticText37->SetToolTip( _("Number of files or directories that will be created") ); + m_staticText37->SetToolTip( _("Number of files and directories that will be created") ); fgSizer5->Add( m_staticText37, 0, wxALIGN_CENTER_VERTICAL, 5 ); @@ -866,7 +871,7 @@ SyncDlgGenerated::SyncDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr m_staticText14 = new wxStaticText( this, wxID_ANY, _("Delete:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText14->Wrap( -1 ); m_staticText14->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); - m_staticText14->SetToolTip( _("Number of files or directories that will be deleted") ); + m_staticText14->SetToolTip( _("Number of files and directories that will be deleted") ); fgSizer5->Add( m_staticText14, 0, wxALIGN_CENTER_VERTICAL, 5 ); @@ -982,7 +987,7 @@ SyncDlgGenerated::SyncDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr gSizer1->Add( m_bpButton8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); m_bitmap17 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap17->SetToolTip( _("Files that exist on both sides and are different") ); + m_bitmap17->SetToolTip( _("dummy") ); gSizer1->Add( m_bitmap17, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); @@ -1094,7 +1099,6 @@ SyncStatusDlgGenerated::SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id, bSizer27->Add( bSizer42, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - wxBoxSizer* bSizer31; bSizer31 = new wxBoxSizer( wxHORIZONTAL ); m_staticText21 = new wxStaticText( this, wxID_ANY, _("Current operation:"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -1106,6 +1110,18 @@ SyncStatusDlgGenerated::SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id, bSizer31->Add( 0, 0, 1, wxEXPAND, 5 ); + m_staticText55 = new wxStaticText( this, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText55->Wrap( -1 ); + m_staticText55->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); + + bSizer31->Add( m_staticText55, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); + + m_staticTextTimeElapsed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeElapsed->Wrap( -1 ); + m_staticTextTimeElapsed->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer31->Add( m_staticTextTimeElapsed, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer27->Add( bSizer31, 0, wxEXPAND, 5 ); m_textCtrlInfo = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY ); @@ -1127,7 +1143,7 @@ SyncStatusDlgGenerated::SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id, bSizer32->Add( m_staticText26, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - m_staticTextDataRemaining = new wxStaticText( this, wxID_ANY, _("--,- MB"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDataRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextDataRemaining->Wrap( -1 ); m_staticTextDataRemaining->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); @@ -1161,13 +1177,13 @@ SyncStatusDlgGenerated::SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id, wxBoxSizer* bSizer33; bSizer33 = new wxBoxSizer( wxHORIZONTAL ); - m_staticText25 = new wxStaticText( this, wxID_ANY, _("Files remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText25 = new wxStaticText( this, wxID_ANY, _("Files/folders remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText25->Wrap( -1 ); m_staticText25->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); - bSizer33->Add( m_staticText25, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer33->Add( m_staticText25, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - m_staticTextRemainingObj = new wxStaticText( this, wxID_ANY, _("0000000"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_staticTextRemainingObj = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); m_staticTextRemainingObj->Wrap( -1 ); m_staticTextRemainingObj->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); @@ -1235,7 +1251,7 @@ HelpDlgGenerated::HelpDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr bSizer20->Add( 0, 5, 0, wxEXPAND, 5 ); - m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, _("Compare by \"File size and date\"\n----------------------------------------\nThis variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. (Notice that the file time may deviate up to 2 seconds.)\n\nWhen \"Compare\" is triggered with this option set the following decision tree is processed:\n\n -----------------\n |Decision tree|\n -----------------\n ________|___________\n | |\n file exists on both sides on one side only\n _____|______ __|___\n | | | |\nequal different left right\n _________|_____________\n | | |\n left newer right newer different (but same date)\n\nAs a result 6 different status can be returned to categorize all files:\n\n- exists left only\n- exists right only\n- left newer\n- right newer\n- different (but same date)\n- equal\n\n\nCompare by \"File content\"\n----------------------------------------\nAs the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:\n\n -----------------\n |Decision tree|\n -----------------\n ________|___________\n | |\n file exists on both sides on one side only\n _____|______ __|___\n | | | |\nequal different left right\n\nAs a result the files are separated into the following categories:\n\n- exists left only\n- exists right only\n- different\n- equal"), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY ); + m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, _("Compare by \"File size and date\"\n----------------------------------------\nThis variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. Notice that the file time is allowed to deviate by up to 2 seconds. This ensures synchronization with the lower-precision file system FAT32 works correctly.\n\nWhen \"Compare\" is triggered with this option set the following decision tree is processed:\n\n -----------------\n |Decision tree|\n -----------------\n ________|___________\n | |\n file exists on both sides on one side only\n _____|______ __|___\n | | | |\nequal different left right\n _________|__________\n | | |\n left newer right newer same date\n\nAs a result 6 different status can be returned to categorize all files:\n\n- exists left only\n- exists right only\n- left newer\n- right newer\n- different filesize (but same date)\n- equal\n\n\nCompare by \"File content\"\n----------------------------------------\nAs the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:\n\n -----------------\n |Decision tree|\n -----------------\n ________|___________\n | |\n file exists on both sides on one side only\n _____|______ __|___\n | | | |\nequal different left right\n\nAs a result the files are separated into the following categories:\n\n- exists left only\n- exists right only\n- different\n- equal"), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY ); m_textCtrl8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); bSizer20->Add( m_textCtrl8, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); @@ -1291,7 +1307,7 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS bSizer31->Add( m_staticText15, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - m_build = new wxStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_build = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); m_build->Wrap( -1 ); m_build->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); @@ -1307,12 +1323,18 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS m_textCtrl3 = new wxTextCtrl( this, wxID_ANY, _("Source code written completely in C++ utilizing:\n\n MinGW \t\t- Windows port of GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE\n\n by ZenJu"), wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY|wxDOUBLE_BORDER ); m_textCtrl3->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); - bSizer53->Add( m_textCtrl3, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + bSizer53->Add( m_textCtrl3, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM, 5 ); - bSizer31->Add( bSizer53, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 30 ); + m_staticText54 = new wxStaticText( this, wxID_ANY, _("Thanks to Jean-François Hartmann for doing the French translation!"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText54->Wrap( -1 ); + m_staticText54->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); + bSizer53->Add( m_staticText54, 0, wxTOP|wxBOTTOM|wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizer31->Add( 0, 7, 0, 0, 5 ); + bSizer31->Add( bSizer53, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 30 ); + + m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer31->Add( m_staticline3, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); wxStaticBoxSizer* sbSizer7; sbSizer7 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); @@ -1323,10 +1345,7 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS sbSizer7->Add( m_staticText131, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - bSizer31->Add( sbSizer7, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 5 ); - - m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer31->Add( m_staticline3, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); + bSizer31->Add( sbSizer7, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM, 5 ); wxFlexGridSizer* fgSizer2; fgSizer2 = new wxFlexGridSizer( 3, 3, 0, 0 ); @@ -1513,7 +1532,7 @@ DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const w 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 text"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextHeader->Wrap( -1 ); m_staticTextHeader->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); @@ -1966,7 +1985,7 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS gSizer1->Add( m_bpButton8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); m_bitmap17 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap17->SetToolTip( _("Files that exist on both sides and are different") ); + m_bitmap17->SetToolTip( _("dummy") ); gSizer1->Add( m_bitmap17, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); @@ -2010,6 +2029,8 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); m_directoryPanel1->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchDlgGenerated::OnEnterLeftDir ), NULL, this ); m_directoryPanel2->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchDlgGenerated::OnEnterRightDir ), NULL, this ); + m_radioBtnSizeDate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeCompareVar ), NULL, this ); + m_radioBtnContent->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeCompareVar ), NULL, this ); m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSelectRecycleBin ), NULL, this ); m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnFilterButton ), NULL, this ); m_bpButton5->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnExLeftSideOnly ), NULL, this ); @@ -2027,6 +2048,8 @@ BatchDlgGenerated::~BatchDlgGenerated() this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); m_directoryPanel1->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchDlgGenerated::OnEnterLeftDir ), NULL, this ); m_directoryPanel2->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchDlgGenerated::OnEnterRightDir ), NULL, this ); + m_radioBtnSizeDate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeCompareVar ), NULL, this ); + m_radioBtnContent->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeCompareVar ), NULL, this ); m_checkBoxUseRecycler->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSelectRecycleBin ), NULL, this ); m_bpButtonFilter->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnFilterButton ), NULL, this ); m_bpButton5->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnExLeftSideOnly ), NULL, this ); diff --git a/ui/guiGenerated.h b/ui/guiGenerated.h index d46d2959..c2665539 100644 --- a/ui/guiGenerated.h +++ b/ui/guiGenerated.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Apr 16 2008) +// C++ code generated with wxFormBuilder (version Oct 18 2008) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! @@ -58,6 +58,7 @@ class GuiGenerated : public wxFrame wxMenu* m_menu31; wxMenuItem* m_menuItemEnglish; wxMenuItem* m_menuItemGerman; + wxMenuItem* m_menuItemFrench; wxMenu* m_menu2; wxBoxSizer* bSizer1; wxPanel* m_panel71; @@ -122,6 +123,7 @@ class GuiGenerated : public wxFrame virtual void OnMenuExportFileList( wxCommandEvent& event ){ event.Skip(); } virtual void OnMenuLangEnglish( wxCommandEvent& event ){ event.Skip(); } virtual void OnMenuLangGerman( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLangFrench( wxCommandEvent& event ){ event.Skip(); } virtual void OnMenuBatchJob( wxCommandEvent& event ){ event.Skip(); } virtual void OnMenuAbout( wxCommandEvent& event ){ event.Skip(); } virtual void OnCompare( wxCommandEvent& event ){ event.Skip(); } @@ -281,8 +283,11 @@ class SyncStatusDlgGenerated : public wxDialog wxStaticBitmap* m_bitmapStatus; wxStaticText* m_staticTextStatus; + wxBoxSizer* bSizer31; wxStaticText* m_staticText21; + wxStaticText* m_staticText55; + wxStaticText* m_staticTextTimeElapsed; wxTextCtrl* m_textCtrlInfo; wxBoxSizer* bSizer28; wxStaticText* m_staticText26; @@ -352,9 +357,9 @@ class AboutDlgGenerated : public wxDialog wxStaticText* m_staticText15; wxStaticText* m_build; - - wxStaticText* m_staticText131; + wxStaticText* m_staticText54; wxStaticLine* m_staticline3; + wxStaticText* m_staticText131; wxStaticBitmap* m_bitmap9; wxStaticText* m_staticText11; wxHyperlinkCtrl* m_hyperlink1; @@ -540,6 +545,7 @@ class BatchDlgGenerated : public wxDialog virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } virtual void OnEnterLeftDir( wxCommandEvent& event ){ event.Skip(); } virtual void OnEnterRightDir( wxCommandEvent& event ){ event.Skip(); } + virtual void OnChangeCompareVar( wxCommandEvent& event ){ event.Skip(); } virtual void OnSelectRecycleBin( wxCommandEvent& event ){ event.Skip(); } virtual void OnFilterButton( wxCommandEvent& event ){ event.Skip(); } virtual void OnExLeftSideOnly( wxCommandEvent& event ){ event.Skip(); } |