diff options
53 files changed, 8213 insertions, 5069 deletions
diff --git a/Application.cpp b/Application.cpp index 87086d8a..dcd887a2 100644 --- a/Application.cpp +++ b/Application.cpp @@ -1,8 +1,7 @@ -/*******#include <wx/msgdlg.h>******************************************************** +/*************************************************************** * Purpose: Code for Application Class * Author: ZenJu (zhnmju123@gmx.de) * Created: 2008-07-16 - * Copyright: ZenJu () **************************************************************/ #include "application.h" @@ -19,35 +18,63 @@ #include "algorithm.h" #include <wx/taskbar.h> #include "ui/smallDialogs.h" +#include <memory> IMPLEMENT_APP(Application); -bool Application::ProcessIdle() + +bool Application::OnInit() { - static bool initialized = false; - if (!initialized) - { - initialized = true; - initialize(); //here the program initialization takes place - } - return wxApp::ProcessIdle(); -} + returnValue = 0; + //do not call wxApp::OnInit() to avoid using default commandline parser //Note: initialization is done in the FIRST idle event instead of OnInit. Reason: Commandline mode requires the wxApp eventhandler to be established //for UI update events. This is not the case at the time of OnInit(). + Connect(wxEVT_IDLE, wxIdleEventHandler(Application::OnStartApplication), NULL, this); -bool Application::OnInit() + return true; +} + + +void Application::OnStartApplication(wxIdleEvent& event) { - returnValue = 0; - //do not call wxApp::OnInit() to avoid using default commandline parser + Disconnect(wxEVT_IDLE, wxIdleEventHandler(Application::OnStartApplication), NULL, this); - //set working directory to current executable directory + //test if FFS is to be started on UI with config file passed as commandline parameter + //this needs to happen BEFORE the working directory is set! + wxString cfgFilename; + if (argc > 1) + { + //resolve relative names to avoid problems after working directory is changed + wxFileName filename(argv[1]); + if (!filename.Normalize()) + { + wxMessageBox(wxString(_("Error retrieving full path:")) + wxT("\n\"") + argv[1] + wxT("\"")); + return; + } + const wxString fullFilename = filename.GetFullPath(); + + if (wxFileExists(fullFilename)) //load file specified by %1 parameter: + cfgFilename = fullFilename; + else if (wxFileExists(fullFilename + wxT(".ffs_batch"))) + cfgFilename = fullFilename + wxT(".ffs_batch"); + else if (wxFileExists(fullFilename + wxT(".ffs_gui"))) + cfgFilename = fullFilename + wxT(".ffs_gui"); + else + { + wxMessageBox(wxString(_("File does not exist:")) + wxT(" \"") + fullFilename + wxT("\""), _("Error"), wxOK | wxICON_ERROR); + return; + } + } + + +//set working directory to current executable directory const wxString workingDir = wxFileName(wxStandardPaths::Get().GetExecutablePath()).GetPath(); if (!wxSetWorkingDirectory(workingDir)) { //show messagebox and quit program immediately wxMessageBox(wxString(_("Could not set working directory:")) + wxT(" ") + workingDir, _("An exception occured!"), wxOK | wxICON_ERROR); - return false; + return; } try //load global settings from XML: must be called AFTER working dir was set @@ -59,52 +86,33 @@ bool Application::OnInit() if (wxFileExists(FreeFileSync::GLOBAL_CONFIG_FILE)) { //show messagebox and quit program immediately wxMessageBox(error.show().c_str(), _("Error"), wxOK | wxICON_ERROR); - return false; + return; } //else: globalSettings already has default values } - //set program language: needs to happen after working directory has been set! +//set program language: needs to happen after working directory has been set! SetExitOnFrameDelete(false); //prevent error messagebox from becoming top-level window programLanguage.setLanguage(globalSettings.shared.programLanguage); SetExitOnFrameDelete(true); - //load image resources from file: must be called after working directory has been set +//load image resources from file: must be called after working directory has been set globalResource.load(); - return true; -} - -void Application::initialize() -{ - //test if FFS is to be started on UI with config file passed as commandline parameter - if (argc > 1) + if (!cfgFilename.empty()) { //load file specified by %1 parameter: - wxString filename; - if (wxFileExists(argv[1])) - filename = argv[1]; - else if (wxFileExists(wxString(argv[1]) + wxT(".ffs_batch"))) - filename = wxString(argv[1]) + wxT(".ffs_batch"); - else if (wxFileExists(wxString(argv[1]) + wxT(".ffs_gui"))) - filename = wxString(argv[1]) + wxT(".ffs_gui"); - else - { - wxMessageBox(wxString(_("The file does not exist:")) + wxT(" \"") + argv[1] + wxT("\""), _("Error"), wxOK | wxICON_ERROR); - return; - } - - xmlAccess::XmlType xmlConfigType = xmlAccess::getXmlType(filename); + xmlAccess::XmlType xmlConfigType = xmlAccess::getXmlType(cfgFilename); if (xmlConfigType == xmlAccess::XML_GUI_CONFIG) //start in GUI mode (configuration file specified) { - MainDialog* frame = new MainDialog(NULL, filename, &programLanguage, globalSettings); + MainDialog* frame = new MainDialog(NULL, cfgFilename, &programLanguage, globalSettings); frame->SetIcon(*globalResource.programIcon); //set application icon frame->Show(); } else if (xmlConfigType == xmlAccess::XML_BATCH_CONFIG) //start in commandline mode { - runBatchMode(filename, globalSettings); + runBatchMode(cfgFilename, globalSettings); if (wxApp::GetTopWindow() == NULL) //if no windows are shown program won't exit automatically ExitMainLoop(); @@ -112,7 +120,7 @@ void Application::initialize() } else { - wxMessageBox(wxString(_("The file does not contain a valid configuration:")) + wxT(" \"") + filename + wxT("\""), _("Error"), wxOK | wxICON_ERROR); + wxMessageBox(wxString(_("The file does not contain a valid configuration:")) + wxT(" \"") + cfgFilename + wxT("\""), _("Error"), wxOK | wxICON_ERROR); return; } } @@ -173,15 +181,38 @@ int Application::OnExit() class LogFile { public: - LogFile() + LogFile(const wxString& logfileDirectory) { - wxString tmp = wxDateTime::Now().FormatISOTime(); - tmp.Replace(wxT(":"), wxEmptyString); + wxString timeNow = wxDateTime::Now().FormatISOTime(); + timeNow.Replace(wxT(":"), wxEmptyString); + + wxString logfileName; + if (logfileDirectory.empty()) + { //create subfolder "log" to hold logfiles + if (!wxDirExists(wxT("Logs"))) + wxMkdir(wxT("Logs")); + logfileName = wxString(wxT("Logs")) + GlobalResources::FILE_NAME_SEPARATOR + wxT("FFS_") + wxDateTime::Now().FormatISODate() + wxChar('_') + timeNow + wxT(".log"); + } + else + { //use alternate logfile directory + if (!wxDirExists(logfileDirectory)) + try + { + FreeFileSync::createDirectory(logfileDirectory.c_str(), Zstring(), false); + } + catch (FileError&) + { + readyToWrite = false; + return; + } + + logfileName = logfileDirectory; + if (!endsWithPathSeparator(logfileName.c_str())) + logfileName += GlobalResources::FILE_NAME_SEPARATOR; + + logfileName += wxT("FFS_") + wxDateTime::Now().FormatISODate() + wxChar('_') + timeNow + wxT(".log"); + } - //create subfolder "log" to hold logfiles - if (!wxDirExists(wxT("Logs"))) - wxMkdir(wxT("Logs")); - wxString logfileName = wxString(wxT("Logs")) + GlobalResources::FILE_NAME_SEPARATOR + wxT("FFS_") + wxDateTime::Now().FormatISODate() + wxChar('_') + tmp + wxT(".log"); logFile.Open(logfileName.c_str(), wxT("w")); readyToWrite = logFile.IsOpened(); @@ -271,23 +302,17 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet //class handling status updates and error messages std::auto_ptr<BatchStatusHandler> statusHandler; //delete object automatically if (batchCfg.silent) - statusHandler = std::auto_ptr<BatchStatusHandler>(new BatchStatusHandlerSilent(batchCfg.handleError, returnValue)); + statusHandler = std::auto_ptr<BatchStatusHandler>(new BatchStatusHandlerSilent(batchCfg.handleError, batchCfg.logFileDirectory, returnValue)); else statusHandler = std::auto_ptr<BatchStatusHandler>(new BatchStatusHandlerGui(batchCfg.handleError, returnValue)); //COMPARE DIRECTORIES FileCompareResult currentGridData; -#ifdef FFS_WIN - FreeFileSync::CompareProcess comparison(globalSettings.shared.traverseSymbolicLinks, - globalSettings.shared.handleDstOnFat32, + FreeFileSync::CompareProcess comparison(globalSettings.shared.traverseDirectorySymlinks, + globalSettings.shared.fileTimeTolerance, globalSettings.shared.warningDependentFolders, statusHandler.get()); -#elif defined FFS_LINUX - FreeFileSync::CompareProcess comparison(globalSettings.shared.traverseSymbolicLinks, - false, - globalSettings.shared.warningDependentFolders, - statusHandler.get()); -#endif + comparison.startCompareProcess(batchCfg.directoryPairs, batchCfg.mainCfg.compareVar, currentGridData); @@ -303,6 +328,8 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet //START SYNCHRONIZATION FreeFileSync::SyncProcess synchronization( batchCfg.mainCfg.useRecycleBin, + globalSettings.shared.copyFileSymlinks, + globalSettings.shared.traverseDirectorySymlinks, globalSettings.shared.warningSignificantDifference, statusHandler.get()); @@ -401,12 +428,12 @@ private: }; -BatchStatusHandlerSilent::BatchStatusHandlerSilent(const xmlAccess::OnError handleError, int& returnVal) : +BatchStatusHandlerSilent::BatchStatusHandlerSilent(const xmlAccess::OnError handleError, const wxString& logfileDirectory, int& returnVal) : m_handleError(handleError), currentProcess(StatusHandler::PROCESS_NONE), returnValue(returnVal), trayIcon(new FfsTrayIcon(this)), - m_log(new LogFile) + m_log(new LogFile(logfileDirectory)) { //test if log was instantiated successfully if (!m_log->isOkay()) diff --git a/Application.h b/Application.h index 60b8fbe7..2cf69d9a 100644 --- a/Application.h +++ b/Application.h @@ -14,6 +14,7 @@ #include "ui/smallDialogs.h" #include "library/misc.h" #include "library/processXml.h" +#include <memory> class Application : public wxApp { @@ -22,10 +23,7 @@ public: int OnRun(); int OnExit(); bool OnExceptionInMainLoop(); - - void initialize(); - - bool ProcessIdle(); //virtual impl. + void OnStartApplication(wxIdleEvent& event); private: void runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSettings& globalSettings); @@ -59,7 +57,7 @@ class FfsTrayIcon; class BatchStatusHandlerSilent : public BatchStatusHandler { public: - BatchStatusHandlerSilent(const xmlAccess::OnError handleError, int& returnVal); + BatchStatusHandlerSilent(const xmlAccess::OnError handleError, const wxString& logfileDirectory, int& returnVal); ~BatchStatusHandlerSilent(); diff --git a/Changelog.txt b/Changelog.txt index 32f6d074..1df1f927 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,6 +1,37 @@ FreeFileSync ------------ +Changelog v1.17 +--------------- +Full support for Windows/Linux symbolic links: + - traverse, copy, delete symbolic links + - handle broken symbolic links + - new options in GlobalSettings.xml: TraverseDirectorySymlinks, CopyFileSymlinks +New menu option: "Check for new version" +Copy folder attributes and security settings when implicitly creating folders +Maximum file time difference now fully configurable +New history of last selected folders +Fixed "Year-2038-Problem" for time_t +Upgraded to wxWidgets 2.8.10 +Individual folder pairs can be selected for removal +Performance: Reduced CPU time by 9%, memory consumption by 36% +Support for cancellation when copying and comparing large files +Smooth progress indicators when copying and comparing large files +Support for Shift-PageUp/PageDown +Support for Home/End and Shift-Home/End +Alternative logfile directory configurable via *.ffs_batch Xml +Show explorer file icons in grid (windows only) +Fixed compilation issues for Linux build +Fixed grid alignment issue in Linux build +Enhanced error messages for Linux build +Optimized traversing algorithm for Linux build +Fixed graphical misalignment with multiple folder pairs +Added Slovenian translation +Added Hungarian translation +Added Spanish translation +Updated translation files + + Changelog v1.16 --------------- Support for \\?\ path prefix for unrestricted path length (directory names > 255 characters) (windows only) diff --git a/FreeFileSync.cbp b/FreeFileSync.cbp index 0374bbd6..eb3e4d40 100644 --- a/FreeFileSync.cbp +++ b/FreeFileSync.cbp @@ -26,6 +26,7 @@ <Add library="libwxbase28ud.a" /> <Add library="libwxpngd.a" /> <Add library="libwxzlibd.a" /> + <Add library="libwxbase28ud_net.a" /> </Linker> </Target> <Target title="Release"> @@ -49,6 +50,7 @@ <Add library="libwxbase28u.a" /> <Add library="libwxpng.a" /> <Add library="libwxzlib.a" /> + <Add library="libwxbase28u_net.a" /> </Linker> </Target> <Target title="Unit Test"> @@ -100,6 +102,7 @@ <Add library="liboleaut32.a" /> <Add library="libgdi32.a" /> <Add library="libcomdlg32.a" /> + <Add library="libws2_32.a" /> <Add directory="C:\Programme\C++\wxWidgets\lib\gcc_lib" /> </Linker> <Unit filename="FreeFileSync.h"> @@ -255,6 +258,14 @@ <Option target="Debug" /> <Option target="Release" /> </Unit> + <Unit filename="ui\checkVersion.cpp"> + <Option target="Debug" /> + <Option target="Release" /> + </Unit> + <Unit filename="ui\checkVersion.h"> + <Option target="Debug" /> + <Option target="Release" /> + </Unit> <Extensions> <code_completion /> <envvars /> diff --git a/FreeFileSync.h b/FreeFileSync.h index 4d140769..a15be076 100644 --- a/FreeFileSync.h +++ b/FreeFileSync.h @@ -78,17 +78,18 @@ namespace FreeFileSync Zstring fullName; // == directory + relativeName Zstring directory; //directory to be synced + separator - Zstring relativeName; //fullName without directory that is being synchronized + Zsubstr relativeName; //fullName without directory that is being synchronized //Note on performance: Keep redundant information "directory" and "relativeName"! //Extracting info from "fullName" instead would result in noticeable performance loss, with only limited memory reduction (note ref. counting strings)! - time_t lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC + wxLongLong lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC, same semantics like time_t (== signed long) wxULongLong fileSize; ObjectType objType; //is it a file or directory or initial? //the following operators are needed by template class "set" //DO NOT CHANGE THESE RELATIONS!!! bool operator < (const FileDescrLine& b) const - { //quick check based on string length: we are not interested in a lexicographical order! + { + //quick check based on string length: we are not interested in a lexicographical order! const size_t aLength = relativeName.length(); const size_t bLength = b.relativeName.length(); if (aLength != bLength) @@ -96,7 +97,7 @@ namespace FreeFileSync #ifdef FFS_WIN //Windows does NOT distinguish between upper/lower-case return FreeFileSync::compareStringsWin32(relativeName.c_str(), b.relativeName.c_str()) < 0; //implementing a (reverse) comparison manually is a lot slower! #elif defined FFS_LINUX //Linux DOES distinguish between upper/lower-case - return relativeName.Cmp(b.relativeName) < 0; + return defaultCompare(relativeName.c_str(), b.relativeName.c_str()) < 0; #endif } }; @@ -147,7 +148,6 @@ namespace FreeFileSync ~AbortThisProcess() {} }; - const time_t FILE_TIME_PRECISION = 2; //file times have precision of 2 seconds due to FAT/FAT32 file systems const wxString LAST_CONFIG_FILE = wxT("LastRun.ffs_gui"); const wxString GLOBAL_CONFIG_FILE = wxT("GlobalSettings.xml"); } diff --git a/Languages/chinese_simple.lng b/Languages/chinese_simple.lng index 2f10d89e..f35875e0 100644 --- a/Languages/chinese_simple.lng +++ b/Languages/chinese_simple.lng @@ -364,8 +364,8 @@ Hints: 提示: Homepage: 网站主页: -If you like FFS: -个人捐助: +If you like FFS +个人捐助 Ignore errors 忽略错误 Ignore next errors diff --git a/Languages/dutch.lng b/Languages/dutch.lng index 227f6cad..b85ea511 100644 --- a/Languages/dutch.lng +++ b/Languages/dutch.lng @@ -134,8 +134,6 @@ About Informatie Action Actie -Active for FAT/FAT32 drives only: When comparing filetimes treat files that differ by less or equal than 1 hour as equal. This ensures daylight saving time switches are handled properly. -Aleen van toepassing voor FAT/FAT32-schijven: wanneer bestandstijden worden vergeleken, de bestanden die verschillen met 1 of minder dan 1 uur als gelijk behandelen. Dit zorgt ervoor dat zomertijd veranderingen juist worden afgehandeld. Add folder pair Voeg 1 paar gekoppelde mappen toe All items have been synchronized! @@ -218,8 +216,6 @@ Copying file %x overwriting %y Bestand %y wordt overschreven door een kopie van %x Copying file %x to %y Bestand %x wordt gekopieerd naar %y -Could not retrieve file info for: -Fout bij het verkrijgen van bestandsinformatie van: Could not set working directory: Kan het pad in gebruik niet instellen: Create a batch job @@ -292,20 +288,26 @@ Error deleting file: Er is een fout opgetreden bij het verwijderen van bestand: Error handling Fout afhandeling +Error loading library function: +Er is een fout opgetreden bij het laden van de 'library function': Error moving to Recycle Bin: Er is een fout opgetreden bij het verplaatsen naar de prullenbak: +Error opening file: +Er is een fout opgetreden bij het openen van het bestand: Error parsing configuration file: Er is een fout opgetreden bij het aanmaken van configuratiebestand: +Error reading file attributes: +Er is een fout opgetreden bij het lezen van de bestands-eigenschappen Error reading file: Er is een fout opgetreden bij het lezen van het bestand: -Error reading folder attributes: -Er is een fout opgetreden bij het lezen van de map-eigenschappen: +Error resolving symbolic link: +Er is een fout opgetreden bij het ophalen van een symbolische koppeling: Error traversing directory: Er is een fout opgetreden bij het doorzoeken van map: +Error writing file attributes: +Er is een fout opgetreden bij het schrijven van de bestands-eigenschappen: Error writing file: Er is een fout opgetreden bij het schrijven naar bestand: -Error writing folder attributes: -Er is een fout opgetreden bij het schrijven van de map-eigenschappen: Error: Source directory does not exist anymore: Er is een fout opgetreden. De oorspronkelijke map bestaat niet meer: Example @@ -320,12 +322,12 @@ Exit immediately and set returncode < 0 Onmiddelijk afsluiten en zet de returncode < 0 Exit with RC < 0 Afsluiten met RC < 0 -FAT32: Handle Daylight Saving Time -FAT32: Gebruik zomertijd Feedback and suggestions are welcome at: Tips en suggesties zijn welkom op: File Manager integration: Integratie bestandsbeheer: +File Time Tolerance: +Bestandstijd-tolerantie File already exists. Overwrite? Het bestand bestaat al. Overschrijven? File content @@ -334,6 +336,8 @@ File list exported! Bestandslijst geëxporteerd! File size and date Bestandsgrootte en -datum +File times that differ by up to the specified number of seconds are still handled as having same time. +Bestandstijden die verschillen met maximaal de gespecificeerde tijd worden nog steeds behandeld alsof ze dezelfde tijd hebben. Filename Bestandsnaam Files are found equal if\n - file content\nis the same. @@ -410,8 +414,8 @@ Hints: Tips: Homepage: Homepage: -If you like FFS: -Als het programma u bevalt: +If you like FFS +Als het programma u bevalt Ignore errors Negeer foutmeldingen Ignore subsequent errors @@ -568,16 +572,18 @@ Synchronizing... Aan het synchroniseren... System out of memory! Systeem heeft te weinig geheugen +Target file already existing! +Doelbestand bestaat al! The file does not contain a valid configuration: Het bestand bevat geen geldige configuratie: -The file does not exist: +File does not exist: Het bestand bestaat niet: This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file. Deze opdrachtregel wordt bij elke dubbelklik op een bestandsnaam uitgevoerd. %name doet dienst als plaatshouder voor het betreffende bestand. This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file. Deze opdrachtregel zal elke keer dat u dubbelklikt op een bestandsnaam, worden uitgevoerd. %x doet dienst als opslagplaats voor het geselecteerde bestand. -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. 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. -Deze variant ziet twee gelijknamige bestanden als gelijk wanneer ze dezelfde bestandsgrootte EN tijdstempel hebben. Merk op dat tijdstempel 2 seconden mag verschillen. Dit zorgt ervoor dat het minder nauwkeurige FAT-32 ook kan worden gesynchroniseerd. +This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. +Deze variant ziet twee gelijknamige bestanden als gelijk wanneer ze dezelfde bestandsgrootte EN tijdstempel hebben. Time Tijd Time elapsed: @@ -606,8 +612,10 @@ Warning Attentie Warning: Synchronization failed for %x item(s): Let op: %x item(s) konden niet worden gesynchroniseerd: -When \"Compare\" is triggered with this option set the following decision tree is processed: -Wanneer \"Compare\" met deze instelling aan wordt gebruikt zal de volgende beslissingsboom gebruikt worden: +Warnings: +Waarschuwingen: +When the comparison is started with this option set the following decision tree is processed: +Wanneer met deze optie aan de vergelijking wordt gestart zal de volgende vergelijkingsboom worden gebruikt: You may try to synchronize remaining items again (WITHOUT having to re-compare)! U kunt proberen om de resterende bestanden opnieuw te synchroniseren (ZONDER opnieuw te hoeven vergelijken)! different diff --git a/Languages/french.lng b/Languages/french.lng index 600257ca..fbfa0095 100644 --- a/Languages/french.lng +++ b/Languages/french.lng @@ -134,8 +134,6 @@ About A propos de Action Action -Active for FAT/FAT32 drives only: When comparing filetimes treat files that differ by less or equal than 1 hour as equal. This ensures daylight saving time switches are handled properly. -Valable seulement pour les disques FAT/FAT32: Les fichiers de même nom et dont l'heure de création diffèrent de moins d'une heure sont considérés comme identiques. Cela garantit que l'heure d'été est traitée correctement. Add folder pair Ajout d'un couple de dossiers All items have been synchronized! @@ -218,8 +216,6 @@ Copying file %x overwriting %y Copie fichier %x écrasant %y Copying file %x to %y Copie fichier %x vers %y -Could not retrieve file info for: -Erreur lors de la lecture des attributs de fichier de : Could not set working directory: Impossible de définir le répertoire de travail: Create a batch job @@ -292,20 +288,26 @@ Error deleting file: Erreur lors de la suppression d'un fichier: Error handling Erreur de gestion de fichiers +Error loading library function: +Erreur lors du chargement de la bibliothèque de fonctions Error moving to Recycle Bin: Erreur lors du déplacement dans la corbeille +Error opening file: +Erreur lors de l'ouverture du fichier: Error parsing configuration file: Erreur lors de l'analyse du fichier de configuration: +Error reading file attributes: +Erreur lors de la lecture des attributs du fichier: Error reading file: Erreur lors de la lecture du fichier: -Error reading folder attributes: -Erreur lors de la lecture des attributs du dossier +Error resolving symbolic link: +Erreur lors de la résolution du lien symbolique: Error traversing directory: Erreur lors du parcours du répertoire: +Error writing file attributes: +Erreur lors de l'écriture des attributs du fichier: Error writing file: Erreur lors de l'écriture du fichier: -Error writing folder attributes: -Erreur lors de l'écriture des attributs du dossier Error: Source directory does not exist anymore: Erreur: le répertoire source n'existe plus: Example @@ -320,12 +322,12 @@ Exit immediately and set returncode < 0 Sortie immédiate avec le returncode < 0 Exit with RC < 0 Sortie avec RC < 0 -FAT32: Handle Daylight Saving Time -FAT32: Traitement de l'heure d'été Feedback and suggestions are welcome at: Commentaires et suggestions sont les bienvenus à: File Manager integration: Choix du Gestionnaire de Fichiers: +File Time Tolerance: +Tolérance horaire: File already exists. Overwrite? Le fichier existe déjà. Voulez-vous le remplacer? File content @@ -334,6 +336,8 @@ File list exported! Liste des fichiers exportée! File size and date Taille et date du fichier +File times that differ by up to the specified number of seconds are still handled as having same time. +Les fichiers ayant des heures qui diffèrent d'un nombre de secondes inférieur à celui spécifié sont considérés comme ayant la même heure. Filename Nom du fichier Files are found equal if\n - file content\nis the same. @@ -410,8 +414,8 @@ Hints: Conseils: Homepage: Page d'accueil: -If you like FFS: -Si vous aimez FFS: +If you like FFS +Si vous aimez FFS Ignore errors Ignorer les erreurs Ignore subsequent errors @@ -568,16 +572,18 @@ Synchronizing... Synchronisation en cours... System out of memory! Erreur mémoire système! +Target file already existing! +Le fichier de destination existe déjà! The file does not contain a valid configuration: Le fichier ne contient pas de configuration valide -The file does not exist: +File does not exist: Le fichier n'existe pas: This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file. Cette ligne de commandes sera exécutée chaque fois que vous double-cliquerez sur un fichier. %name sert d'emplacement pour le fichier sélectionné. This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file. Cette commande sera exécutée à chaque fois que vous double-cliquez sur un nom de fichier. %x est un espace réservé pour le fichier sélectionné. -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. 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. -Cette variante définit comme identiques deux fichiers de même nom lorsqu'ils ont la même taille et le même date et heure de modification. Attention : la précision de l'heure est mesurée à 2 secondes près. Cela permet d'assurer la synchronisation avec la précision du systéme de fichiers FAT32. +This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. +Cette variante définit comme identiques deux fichiers de même nom lorsqu'ils ont la même taille et le même date et heure de modification. Time Heure Time elapsed: @@ -606,8 +612,10 @@ Warning Attention Warning: Synchronization failed for %x item(s): Attention: La synchronisation a échouée pour %x élément(s): -When \"Compare\" is triggered with this option set the following decision tree is processed: -Quand \"Compare\" est lancé avec cette option, l'arbre de décision suivant est éxécuté: +Warnings: +Avertissements: +When the comparison is started with this option set the following decision tree is processed: +Lorsque la comparaison démarre avec cette option, l'arbre de décision suivant est exécuté: 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) ! different diff --git a/Languages/german.lng b/Languages/german.lng index ab1b336c..2dea1857 100644 --- a/Languages/german.lng +++ b/Languages/german.lng @@ -1,5 +1,5 @@ MinGW \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 - MinGW \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 + MinGW \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 Byte Byte GB @@ -32,6 +32,8 @@ &Übernehmen &Cancel &Abbrechen +&Check for new version +&Auf neuere Version prüfen &Compare &Vergleichen &Create batch job @@ -124,6 +126,8 @@ Konfiguration &laden == Dateien sind gleich\n\n >> right file is newer\n >> Rechte Datei ist neuer\n +A newer version is available: +Eine neuere Version steht zum Download bereit: Abort Abbrechen Abort requested: Waiting for current operation to finish... @@ -134,8 +138,6 @@ About Über Action Aktion -Active for FAT/FAT32 drives only: When comparing filetimes treat files that differ by less or equal than 1 hour as equal. This ensures daylight saving time switches are handled properly. -Nur für FAT/FAT32-Laufwerke aktiv: Dateien mit einem Zeitunterschied von kleiner oder gleich einer Stunde werden als gleich angesehen. Dadurch ist sichergestellt, dass die Sommer-/Winterzeitumstellung korrekt behandelt wird. Add folder pair Verzeichnispaar hinzufügen All items have been synchronized! @@ -218,8 +220,6 @@ Copying file %x overwriting %y Kopiere Datei %x und überschreibe %y Copying file %x to %y Kopiere Datei %x nach %y -Could not retrieve file info for: -Dateiattribute konnten nicht gelesen werden: Could not set working directory: Das Arbeitsverzeichnis konnte nicht gesetzt werden: Create a batch job @@ -274,10 +274,12 @@ Do you really want to move the following objects(s) to the Recycle Bin? Sollen folgende Elemente wirklich in den Papierkorb verschoben werden? Donate with PayPal Mit PayPal spenden +Download now? +Jetzt herunterladen? Drag && drop Drag && Drop -Email: -Email: +Email +Email Error Fehler Error changing modification time: @@ -292,20 +294,28 @@ Error deleting file: Fehler beim Löschen der Datei: Error handling Fehlerbehandlung +Error loading library function: +Fehler beim Laden der Bibliotheksfunktion: Error moving to Recycle Bin: Fehler beim Verschieben in den Papierkorb: +Error opening file: +Fehler beim Öffnen der Datei: Error parsing configuration file: Fehler beim Lesen der Konfigurationsdatei: +Error reading file attributes: +Fehler beim Lesen der Dateiattribute: Error reading file: Fehler beim Lesen der Datei: -Error reading folder attributes: -Fehler beim Lesen der Verzeichnisattribute: +Error resolving symbolic link: +Fehler beim Auflösen des Symbolischen Links: +Error retrieving full path: +Fehler beim Ermitteln des kompletten Pfades: Error traversing directory: Fehler beim Durchsuchen des Verzeichnisses: +Error writing file attributes: +Fehler beim Schreiben der Dateiattribute: Error writing file: Fehler beim Schreiben der Datei: -Error writing folder attributes: -Fehler beim Schreiben der Verzeichnisattribute: Error: Source directory does not exist anymore: Fehler: Quellverzeichnis existiert nicht mehr: Example @@ -320,20 +330,24 @@ Exit immediately and set returncode < 0 Sofort beenden und Returncode < 0 setzen Exit with RC < 0 Beenden mit RC < 0 -FAT32: Handle Daylight Saving Time -FAT32: Sommer-/Winterzeitumstellung berücksichtigen Feedback and suggestions are welcome at: Feedback und Vorschläge sind willkommen unter: File Manager integration: Einbinden des Dateimanagers: +File Time Tolerance: +Abweichung der Dateizeit: File already exists. Overwrite? Die Datei existiert bereits. Überschreiben? File content Dateiinhalt +File does not exist: +Die Datei existiert nicht: File list exported! Dateiliste exportiert! File size and date Dateigröße und -datum +File times that differ by up to the specified number of seconds are still handled as having same time. +Dateiänderungszeiten, die um bis zu der angegebenen Anzahl an Sekunden abweichen, werden trotzdem als gleich angesehen. Filename Dateiname Files are found equal if\n - file content\nis the same. @@ -378,6 +392,8 @@ FreeFileSync batch file FreeFileSync Batchdatei FreeFileSync configuration FreeFileSync Konfiguration +FreeFileSync is up to date! +FreeFileSync ist auf dem neuesten Stand! Full name Absoluter Name Generating file list... @@ -408,10 +424,10 @@ Hides error messages during synchronization:\nThey are collected and shown as a Verhindert das Anzeigen von Fehlermeldungen während der Synchronisation:\nSie werden jedoch gesammelt und am Ende als Liste angezeigt Hints: Tipps: -Homepage: -Homepage: -If you like FFS: -FFS unterstützen: +Homepage +Homepage +If you like FFS +FFS unterstützen Ignore errors Fehler ignorieren Ignore subsequent errors @@ -507,9 +523,9 @@ Speicherung abgebrochen! Save current configuration to file Aktuelle Konfiguration in Datei speichern Scanning... -Suchvorgang... +Suche Dateien... Scanning: -Suchvorgang: +Suche Dateien: Select a folder Verzeichnis auswählen Select variant: @@ -568,16 +584,14 @@ Synchronizing... Synchronisiere... System out of memory! Zu wenig freier Arbeitsspeicher! +Target file already existing! +Die Zieldatei existiert bereits! The file does not contain a valid configuration: Die Datei enthält keine gültige Konfiguration: -The file does not exist: -Die Datei existiert nicht: This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file. Diese Kommandozeile wird bei jedem Doppelklick auf einen Dateinamen ausgeführt. %name dient dabei als Platzhalter für die ausgewählte Datei. -This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file. -Diese Befehlszeile wird ausgeführt, wenn ein Doppelklick auf einen Dateinamen erfolgt. %x ist hierbei der Platzhalter für die ausgewählte Datei. -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. 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. -Diese 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. +This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. +Diese Variante identifiziert zwei gleichnamige Dateien als gleich, wenn sie die gleiche Dateigröße haben UND der Zeitpunkt der letzten Änderung derselbe ist. Time Uhrzeit Time elapsed: @@ -588,6 +602,8 @@ Total time: Gesamtzeit: Two way <-> Beidseitig <-> +Unable to connect to sourceforge.net! +Es konnte keine Verbindung zu sourceforge.net aufgebaut werden! Unable to create logfile! Die Protokolldatei konnte nicht erstellt werden! Unable to initialize Recycle Bin! @@ -606,8 +622,10 @@ Warning Warnung Warning: Synchronization failed for %x item(s): Warnung: Synchronisation fehlgeschlagen für %x Element(e): -When \"Compare\" is triggered with this option set the following decision tree is processed: -Wenn \"Compare\" mit dieser Option eingestellt wurde, wird folgender Entscheidungsbaum abgearbeitet: +Warnings: +Warnungen: +When the comparison is started with this option set the following decision tree is processed: +Wenn der Vergleich mit dieser Option gestarted wurde, wird folgender Entscheidungsbaum abgearbeitet: 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)! different diff --git a/Languages/hungarian.lng b/Languages/hungarian.lng new file mode 100644 index 00000000..7c43b257 --- /dev/null +++ b/Languages/hungarian.lng @@ -0,0 +1,628 @@ + MinGW \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 + MinGW \t- A GNU fordítócsomag Windows portja\n wxWidgets \t- Nyílt forráskódú GUI keretrendszer\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Nyílt forráskódú IDE + Byte + Bájt + GB + GB + MB + MB + PB + PB + TB + TB + kB + kB +!= files are different\n +!= a fájlok különböznek\n +%x directories +%x könyvtár +%x files, +%x fájl, +%x of %y rows in view +%x sor látható a(z) %y sorból +%x of 1 row in view +%x sor látható az 1 sorból +&Abort +&Megszakítás +&About... +&A programról... +&Advanced +&Haladó +&Apply +&Alkalmaz +&Cancel +&Mégsem +&Compare +&Összehasonlít +&Create batch job +&Kötegelt feladat létrehozása +&Default +&Alapértelmezett +&Export file list +&Fájllista exportálása +&File +&Fájl +&Global settings +&Globális beállítások +&Help +&Súgó +&Ignore +&Kihagy +&Language +&Nyelv +&Load +&Betöltés +&Load configuration +&Beállítások betöltése +&OK +&OK +&Pause +&Szünet +&Quit +&Kilépés +&Retry +&Ismét +&Save +&Mestés +&Start +&Indítás +&Synchronize... +&Szinkronizálás +, +. +- different +- különböző +- different (same date, different size) +- különböző (ugyanaz a dátum, eltérő méret) +- equal +- egyforma +- exists left only +- csak a bal oldalon létezik +- exists right only +- csak a jobb oldalon létezik +- left +- bal oldali +- left newer +- a bal oldali újabb +- right +- jobb oldali +- right newer +- a jobb oldali újabb +- same date (different size) +- ugyanaz a dátum (eltérő méret) +-Open-Source file synchronization- +-Nyílt forráskódú fájlszinkronizálás- +. +, +1 directory +1 könyvtár +1 file, +1 fájl, +1. &Compare +1. &Összehasonlítás +1. Enter full file or directory names separated by ';' or a new line. +1. Teljes fájl- vagy könyvtárnév megadása pontosvesszővel vagy új sorral elválasztva. +2. &Synchronize... +2. &Szinkronizálás +2. Use wildcard characters '*' and '?'. +2. A csillag ('*') és a kérdőjel ('?') helyettesítő karakterek megengedettek. +3. Exclude files directly on main grid via context menu. +3. Fájlok közvetlen kizárása a fő listából helyi menü segítségével. +4. Keep the number of entries small for best performance. +4. A bejegyzések számának minimalizálása a jobb teljesítmény érdekében. +<< left file is newer\n +<< a bal oldali fájl újabb\n +<Directory> +<Könyvtár> +<Last session> +<Utolsó munkamenet> +<multiple selection> +<többszörös kijelölés> +<| file on left side only\n +<| csak a bal oldalon lévő fájl\n +== files are equal\n\n +== a fájlok egyformák\n\n +>> right file is newer\n +>> a jobb oldali fájl újabb\n +Abort +Megszakítás +Abort requested: Waiting for current operation to finish... +Megszakítási kérelem: Várakozás a folyamatban lévő művelet befejezésére... +Aborted +Megszakítva +About +A programról +Action +Művelet +Add folder pair +Könyvtár pár megadása +All items have been synchronized! +Minden elem szinkronizálva lett! +An exception occured! +Kivétel keletkezett! +As a result the files are separated into the following categories: +Eredményképpen a fájlok a következő kategóriákra bomlanak: +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: +Ahogy a neve is mutatja, két fájl, melyeknek ugyanaz a nevük, akkor és csakis akkor lesz egyezőként jelölve, ha a tartalmuk megegyezik. Ez az opció leginkább a konzisztencia-viszgálatokhoz jó, mintsem a biztonsági mentésekhez. Így a fájlok dátuma nem számít semmit.\n\nEnnek az opciónak az engedélyezésével a döntési fa kisebb lesz: +Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. +Egy kötegelt feladat fájl létrehozása az automatizált szinkronizációhoz. Kötegelt feladat módban való indításhoz egyszerűen meg kell adni a fájl nevét a FreeFileSync.exe-nek: FreeFileSync.exe <kötegelt feladat fájl>. Ezt ütemezni is lehet az operációs rendszer feladatkezelőjével. +Batch execution +Kötegelt végrehajtás +Batch file created successfully! +A kötegelt feladat fájl létrehozása sikerült! +Batch job +Kötegelt feladat +Big thanks for localizing FreeFileSync goes out to: +Nagy köszönet a FreeFileSync lokalizációjáért\na következő személyeknek: +Build: +Build: +Cancel +Mégsem +Check all +Mindent kijelöl +Choose to hide filtered files/directories from list +Szűrt fájlok/könyvtárak elrejése a listában +Comma separated list +Comma separated values +Compare both sides +Mindkét oldal összehasonlítása +Compare by \"File content\" +Összehasonlítás \"fájltartalom\" alapján +Compare by \"File size and date\" +Összehasonlítás \"fájlméret és dátum alapján\" +Compare by... +Összehasonlítás +Comparing content +Tartalom összehasonlítása +Comparing content of files %x +%x fájlok tartalmának összehasonlítása +Comparing... +Összehasonlítás... +Completed +Befejezve +Configuration +Beállítás +Configuration loaded! +Beállítások betöltve! +Configuration overview: +Beállítások áttekintése: +Configuration saved! +Beállítások elmentve! +Configure filter +Szűrő beállítása +Configure filter... +Szűrő beállítása +Configure your own synchronization rules. +Saját szinkronizálási szabályok beállítása. +Confirm +Megerősítés +Continue +Folytatás +Conversion error: +Konverziós hiba: +Copy from left to right +Másolás a bal oldalról a jobb oldalra +Copy from left to right overwriting +Másolás a bal oldalról a jobb oldalra felülírással +Copy from right to left +Másolás a jobb oldalról a bal oldalra +Copy from right to left overwriting +Másolás a jobb oldalról a bal oldalra felülírással +Copy new or updated files to right folder. +Új vagy frissített fájlok másolása a jobb oldali könyvtárba. +Copy to clipboard\tCTRL+C +Másolás a vágólapra\tCTRL+C +Copying file %x overwriting %y +%x fájl másolása felülírva a(z) %y fájlt +Copying file %x to %y +%x fájl másolása a(z) %y fájlba +Could not set working directory: +Munkakönyvtár beállítása sikertelen: +Create a batch job +Kötegelt feladat létrehozása +Create: +Létrehozás: +Creating folder %x +Könyvtár létrehozása %x +Current operation: +Aktuális művelet: +Custom +Egyedi +Customize columns +Oszlopok testreszabása +DECISION TREE +DÖNTÉSI FA +Data remaining: +Hátralévő adat: +Data: +Adat: +Date +Dátum +Delete files/folders existing on left side only +Csak a bal oldalon létező fájlok/könyvtárak törlése +Delete files/folders existing on right side only +Csak a jobb oldalon létező fájlok/könyvtárak törlése +Delete files\tDEL +Fájlok törlése\tDEL +Delete on both sides +Törlés mindkét oldalon +Delete on both sides even if the file is selected on one side only +Törlés mindkét oldalon, még akkor is, ha csak egyik oldalon lett kijelölve +Delete: +Törlés: +Deleting file %x +Fájl törlése %x +Deleting folder %x +Könyvtár törlése %x +Directories are dependent! Be careful when setting up synchronization rules: +A könyvtárak függenek egymástól! Legyen óvatos, amikor megadja a szinkronizálási szabályokat: +Directory does not exist: +A könyvtár nem létezik: +Do not show graphical status and error messages but write to a logfile instead +Grafikusan ne jelenítse meg az állapotot és hibaüzeneteket, helyette írja a naplófájlba +Do not show this warning again +Ennek a figyelmeztetésnek az elrejtése legközelebb +Do nothing +Nincs mit csinálni +Do you really want to delete the following objects(s)? +Valóban törölni akarja a az alábbi objektumo(ka)t? +Do you really want to move the following objects(s) to the Recycle Bin? +Valóban a Lomtárba (Recycle Bin) akarja mozgatni az alábbi objektumo(ka)t? +Donate with PayPal +Támogasd a PayPal segítségével +Drag && drop +Húzd && Ejtsd +Email: +E-mail: +Error +Hiba +Error changing modification time: +Az utolsó változtatás dátumának módosítása sikertelen: +Error copying file: +A fájl másolása sikertelen: +Error creating directory: +A könyvtár létrehozása sikertelen: +Error deleting directory: +A könyvtár törlése sikertelen: +Error deleting file: +A fájl törlése sikertelen: +Error handling +Hibakezelés +Error loading library function: +A könyvtári funkció betöltése sikertelen: +Error moving to Recycle Bin: +A Lomtárba (Recycle Bin) mozgatás sikertelen: +Error opening file: +A fájl megnyitása sikertelen: +Error parsing configuration file: +A beállításokat tartalmazó fájl feldolgozása sikertelen: +Error reading file attributes: +A fájl attribútumainak olvasása sikertelen: +Error reading file: +A fájl olvasása sikertelen: +Error resolving symbolic link: +A szimbolikus link feloldása sikertelen: +Error traversing directory: +Könyvtár átnézése sikertelen: +Error writing file attributes: +A fájl attribútumainak írása sikertelen: +Error writing file: +A fájl írása sikertelen: +Error: Source directory does not exist anymore: +Hiba: A forráskönyvtár többé nem létezik: +Example +Példa +Exclude +Kizárás +Exclude temporarily +Ideiglenes kizárás +Exclude via filter: +Kizárás szűrő segítségével: +Exit immediately and set returncode < 0 +Azonnali kilépés és a visszatérési érték < 0 +Exit with RC < 0 +Kilépés (visszatérési érték < 0) +Feedback and suggestions are welcome at: +A visszajelzéseket és javaslatokat ide várjuk: +File Manager integration: +Beépülés a Fájlkezelőbe: +File Time Tolerance: +Fájl dátumának toleranciája: +File already exists. Overwrite? +A fájl már létezik. Felülírjuk? +File content +fájl tartalma alapján +File list exported! +A fájllista exportálása befejeződött! +File size and date +fájlméret és dátum alapján +File times that differ by up to the specified number of seconds are still handled as having same time. +Két fájl, melyeknek dátuma legfeljebb az itt megadott másodperccel tér el egymástól, úgy lesz kezelve, mintha egyforma lenne a dátumuk. +Filename +Fájlnév +Files are found equal if\n - file content\nis the same. +A fájlok megegyeznek ha\n - a fájlok tartalma\nmegegyezik. +Files are found equal if\n - filesize\n - last write time and date\nare the same. +A fájlok megegyeznek ha\n - a fájlméret\n - az utolsó módosítás dátuma\nmegegyezik. +Files remaining: +Hátralévő fájlok: +Files that exist on both sides and have different content +Mindkét oldalon létező fájlok különböző tartalommal +Files that exist on both sides, have same date but different filesizes +Mindkét oldalon létező fájlok ugyanazzal a dátummal, de különböző mérettel +Files that exist on both sides, left one is newer +Mindkét oldalon létező fájlok, de a bal oldali újabb +Files that exist on both sides, right one is newer +Mindkét oldalon létező fájlok, de a jobb oldali újabb +Files/folders remaining: +Hátralévő fájlok/könyvtárak: +Files/folders scanned: +Vizsgált fájlok/könyvtárak: +Files/folders that exist on left side only +Csak a bal oldalon létező fájlok/könyvtárak +Files/folders that exist on right side only +Csak a jobb oldalon létező fájlok/könyvtárak +Filter active: Press again to deactivate +Szűrő aktív: Nyomja meg újra a deaktiváláshoz +Filter files +Fájlok szűrése +Filter view +Szűrő nézet +Folder Comparison and Synchronization +Könyvtár összehasonlítás és szinkronizáció +Folder pair +Könyvtár pár +FreeFileSync - Folder Comparison and Synchronization +FreeFileSync - Könyvtár összehasonlítás és szinkronizáció +FreeFileSync Batch Job +FreeFileSync kötegelt feladat +FreeFileSync at Sourceforge +FreeFileSync a Sourceforge-on +FreeFileSync batch file +FreeFileSync kötegelt fájl +FreeFileSync configuration +FreeFileSync beállítások +Full name +Teljes név +Generating file list... +Fájllista generálása... +Global settings +Globális beállítások +Help +Súgó +Hide all error and warning messages +Összes hibaüzenet és figyelmeztetés elrejtése +Hide files that are different +A nem egyező fájlok elrejtése +Hide files that are equal +Az egyező fájlok elrejtése +Hide files that are newer on left +A bal oldalon lévő újabb fájlok elrejtése +Hide files that are newer on right +A jobb oldalon lévő újabb fájlok elrejtése +Hide files that exist on left side only +Csak a bal oldalon létező fájlok elrejtése +Hide files that exist on right side only +Csak a jobb oldalon létező fájlok elrejtése +Hide filtered items +A szűrt elemek elrejtése +Hide further error messages during the current process +A további hibaüzenetek elrejtése az aktuális folyamat során +Hides error messages during synchronization:\nThey are collected and shown as a list at the end of the process +Hibaüzenetek elrejtése szinkronizálás közben:\nÖssze lesznek gyűjtve és a folyamat végén meg lesznek jelenítve egy listában +Hints: +Tippek: +Homepage: +Honlap: +If you like FFS +Ha szereted az FFS-t +Ignore errors +Hibák figyelmen kívül hagyása +Ignore subsequent errors +Későbbi hibák figyelmen kívül hagyása +Ignore this error, retry or abort synchronization? +Figyelmen kívül hagyja ezt a hibát, újra megpróbálja vagy megszakítja a szinkronizálást? +Ignore this error, retry or abort? +Figyelmen kívül hagyja ezt a hibát, újra megpróbálja vagy megszakítja? +Include +Tartalmaz +Include temporarily +Ideiglenesen tartalmaz +Include: *.doc;*.zip;*.exe\nExclude: *\\temp\\* +Tartalmaz: *.doc;*.zip;*.exe\nKizárás: *\\temp\\* +Info +Információ +Information +Információ +Initialization of Recycle Bin failed! +A Lomtár (Recycle Bin) inicializálása sikertelen! +It was not possible to initialize the Recycle Bin!\n\nIt's likely that you are not using Windows.\nIf you want this feature included, please contact the author. :) +Lehetetlen a Lomtár (Recycle Bin) inicializálása!\n\nValószínűleg azért, mert nem Windost használ.\nHa szeretné ezt a funkciót használni, kérjük, lépjen kapcsolatba a szerzővel. :) +Left folder: +Bal oldali könyvtár: +Legend +Előzmény +Load configuration from file +Beállítások betöltése fájlból +Load configuration history (press DEL to delete items) +Beállítások előzményeinek a betöltése (Nyomja meg a DEL gombot a törléshez) +Log-messages: +Naplóbejegyzések: +Mirror ->> +Tükrözés ->> +Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. +A bal oldali könyvtár tükrözött másolata: A jobb oldali könyvtár felülíródik és pontosan megegyezik majd a bal oldalival a szinkronizálás után. +Move column down +Oszlop mozgatása lefelé +Move column up +Oszlop mozgatása felfelé +Not all items were synchronized! Have a look at the list. +Nem minden elemet sikerült szinkronizálni. Vessen egy pillantást a listára. +Nothing to synchronize according to configuration! +A beállításoknak megfelelően nincs mit szinkronizálni! +Number of files and directories that will be created +A létrehozandó fájlok és könyvtárak száma +Number of files and directories that will be deleted +A törlendő fájlok és könyvtárak száma +Number of files that will be overwritten +A felülírandó fájlok száma +OK +OK +Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the full name including path prefix. +Csak a szűrőnek megfelelő fájlok/könyvtárak lesznek kijelölve szinkronizáláshoz.\nA szűrő a teljes névre érvényes, amelybe beletartozik az útvonal is. +Open synchronization dialog +Szinkronizációs ablak megnyitása +Open with File Manager\tD-Click +Megnyitás a Fájlkezelőben\tD-Click +Operation aborted! +Művelet megszakítva! +Operation: +Művelet: +Pause +Szünet +Please fill all empty directory fields. +Kérjük, töltse ki az összes üres könyvtár mezőt. +Press button to activate filter +Nyomja meg a gombot a szűrő aktiválásához +Preview +Előnézet +Published under the GNU General Public License: +Kiadva a GNU General Public License alatt: +Quit +Kilépés +Relative path +Relatív útvonal +Remove folder pair +Könyvtár párok eltávolítása +Reset +Helyreállítás +Reset all warning messages? +Helyreállítja az összes figyelmeztető üzenetet? +Resets all warning messages +Az összes figyelmeztető üzenet helyreállítása +Result +Eredmény +Right folder: +Jobb oldali könyvtár: +S&ave configuration +Beállítások mentés&e +Save aborted! +Mentés megszakítva! +Save current configuration to file +Aktuális beállítások mentése fájlba +Scanning... +Vizsgálat folyamatban... +Scanning: +Vizsgálat: +Select a folder +Könyvtár kiválasztása +Select variant: +Változat kiválasztása: +Show files that are different +Eltérő fájlok mutatása +Show files that are equal +Egyező fájlok mutatása +Show files that are newer on left +A bal oldali újabb fájlok mutatása +Show files that are newer on right +A jobb oldali újabb fájlok mutatása +Show files that exist on left side only +Csak a bal oldalon létező fájlok mutatása +Show files that exist on right side only +Csak a jobb oldalon létező fájlok mutatása +Show popup +Felbukkanó ablak mutatása +Show popup on errors or warnings +Értesítés felbukkanó ablakban a hibákról és figyelmeztetésekről +Significant difference detected: More than 50% of files will be overwritten/deleted! +Nagymennyiségű változások felismerve: Több mint 50%-a a fájloknak felülírva/törölve! +Silent mode +Csendes mód +Size +Méret +Sorting file list... +Fájllista rendezése... +Source code written completely in C++ utilizing: +A forráskód teljes egészében C++-ban íródott\na következők felhasználásával: +Start +Indítás +Start synchronization +Szinkronizáció indítása +Stop +Megállítás +Swap sides +Oldalak felcserélése +Synchronization aborted! +A szinkronizáció megszakítva! +Synchronization completed successfully! +A szinkronizáció sikeresen befejeződött! +Synchronization completed with errors! +A szinkronizáció befejeződött, de akadtak hibák! +Synchronization filter +Szinkronizáció szűrője +Synchronization settings +Szinkronizáció beállításai +Synchronization status +Szinkronizáció állapota +Synchronize all .doc, .zip and .exe files except everything from folder \"temp\". +Minden .doc, .zip és .exe fájl szinkronizálása a \"temp\" könyvtárban levők kivételével. +Synchronize both sides simultaneously: Copy new or updated files in both directions. +Mindkét oldal szinkronizálása egyszerre: Új és frissített fájlok másolása mindkét irányban. +Synchronizing... +Szinkronizálás folyamatban... +System out of memory! +Nincs elég rendszermemória! +Target file already existing! +A célként megadott fájl már létezik! +The file does not contain a valid configuration: +A következő fájl nem tartalmaz érvényes beállításokat: +File does not exist: +A következő fájl nem létezik: +This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file. +Ez a parancssor lesz végrehajtva minden fájlnéven történő dupla kattintás esetében. %name helyettesíti a kiválasztott fájlt. +This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file. +Ez a parancssor lesz végrehajtva minden fájlnéven történő dupla kattintás esetében. %x helyettesíti a kiválasztott fájlt. +This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. +Ez a változat akkor tekint egyformának két azonos nevű fájlt, ha azok mérete ÉS az utolsó módosításuk ideje azonos. +Time +Idő +Time elapsed: +Eltelt idő: +Total amount of data that will be transferred +A mozgatandó adatok összmérete +Total time: +Becsült idő: +Two way <-> +Kétirányú <-> +Unable to create logfile! +Nem lehet létrehozni a naplófájlt! +Unable to initialize Recycle Bin! +Nem lehet inicializálni a Lomtárat (Recycle Bin)! +Uncheck all +Összes kijelölést megszűntet +Update -> +Frissítés -> +Update: +Frissítés: +Use Recycle Bin +Lomtár (Recycle Bin) használata +Use Recycle Bin when deleting or overwriting files during synchronization +A Lomtár (Recycle Bin) használata fájlok szinkronizálása közbeni törlésnél vagy felülírásnál +Warning +Figyelem +Warning: Synchronization failed for %x item(s): +Figyelem: A következő %x elem szinkronizálása sikertelen: +Warnings: +Figyelem: +When the comparison is started with this option set the following decision tree is processed: +Ha az összehasonlítás ezekkel a beállításokkal lesz elindítva, akkor a következő döntési fa érvényesül: +You may try to synchronize remaining items again (WITHOUT having to re-compare)! +Meg lehet próbálni újra a megmaradt elemek szinkronizálását (az összehasonlítás újbóli elvégzése NÉLKÜL)! +different +különböző +file exists on both sides +mindkét oldalon létező fájlok +on one side only +csak az egy oldalon létező fájlok +|> file on right side only\n +|> csak a jobb oldali fájl\n diff --git a/Languages/italian.lng b/Languages/italian.lng index 7d685ee9..c0535e6e 100644 --- a/Languages/italian.lng +++ b/Languages/italian.lng @@ -15,7 +15,7 @@ != files are different\n != i file sono diversi\n %x directories -%x directories +%x cartelle %x files, %x files, %x of %y rows in view @@ -134,8 +134,6 @@ About A proposito di Action Azioni -Active for FAT/FAT32 drives only: When comparing filetimes treat files that differ by less or equal than 1 hour as equal. This ensures daylight saving time switches are handled properly. -Attivo solo per drive FAT/FAT32: File con lo stesso nome e con ora di modifica differente per 1 ora o meno sono considerati identici. Cio' garantisce la corretta gestione dell'ora di modifica. Add folder pair Aggiungi una coppia di cartelle All items have been synchronized! @@ -218,8 +216,6 @@ Copying file %x overwriting %y Copia di %x file sovrascrivendone %y Copying file %x to %y Copia di file da %x a %y -Could not retrieve file info for: -Errore durante la lettura degli attributi file per: Could not set working directory: Impossibile definire la directory di lavoro: Create a batch job @@ -292,20 +288,26 @@ Error deleting file: Errore durante l'eliminazione del file: Error handling Errore nella gestione +Error loading library function: +Errore nel caricamento della funzione libreria: Error moving to Recycle Bin: Errore durante lo spostamento nel Cestino: +Error opening file: +Errore in apertura file: Error parsing configuration file: -Errore durante l'analisi del file di configurazione: +Errore nell'analisi del file di configurazione: +Error reading file attributes: +Errore di lettura degli attributi file: Error reading file: Errore durante la lettura del file: -Error reading folder attributes: -Errore durante la lettura attributi della cartella: +Error resolving symbolic link: +Errore nella risoluzione di collegamento simbolico: Error traversing directory: Errore nel percorso della directory: +Error writing file attributes: +Errore nella scrittura degli attributi file: Error writing file: Errore durante la scrittura del file: -Error writing folder attributes: -Errore in scrittura attributi della cartella: Error: Source directory does not exist anymore: Errore: la directory sorgente non è più esistente: Example @@ -320,12 +322,12 @@ Exit immediately and set returncode < 0 Esci immediatamente ed imposta returncode < 0 Exit with RC < 0 Esci con RC < 0 -FAT32: Handle Daylight Saving Time -FAT32: Gestisci Ora di Modifica Feedback and suggestions are welcome at: Commenti e suggerimenti sono i benvenuti: File Manager integration: Integrazione File Manager: +File Time Tolerance: +Tolleranza di File Time: File already exists. Overwrite? Il file esiste già. Lo vuoi sovrascrivere? File content @@ -334,6 +336,8 @@ File list exported! Lista dei file esportata! File size and date Dimensione e data del file +File times that differ by up to the specified number of seconds are still handled as having same time. +File time che differiscono per meno dello specificato numero di secondi sono considerati come aventi lo stesso File time. Filename Nome del file Files are found equal if\n - file content\nis the same. @@ -410,8 +414,8 @@ Hints: Consigli: Homepage: Homepage: -If you like FFS: -Se ti piace FFS: +If you like FFS +Se ti piace FFS Ignore errors Ignora gli errori Ignore subsequent errors @@ -568,16 +572,18 @@ Synchronizing... Sincronizzazione in corso... System out of memory! Memoria di sistema esaurita! +Target file already existing! +File destinazione già esistente! The file does not contain a valid configuration: Il file non contiene una configurazione valida -The file does not exist: +File does not exist: Il file non esiste: This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file. Questa riga di comando verrà eseguita ad ogni doppio click sul nome di un file. %name é lo spazio riservato per il file selezionato. This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file. Questa riga di comando verrà eseguita ad ogni doppio click sul nome di un file. %x é lo spazio riservato per il file selezionato. -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. 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. -Questa variante definisce identici due file con lo stesso nome quando hanno la stessa dimensione E la stessa data e ora. Attenzione: la precisione dell'ora è di circa 2 secondi. Ciò assicura il corretto funzionamneto della sincronizzazione con la precisione del file system FAT32. +This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. +Questa variante definisce identici due file con lo stesso nome quando hanno la stessa dimensione E la stessa data e ora. Time Ora Time elapsed: @@ -606,15 +612,17 @@ Warning Attenzione Warning: Synchronization failed for %x item(s): Attenzione: Sincronizzazione fallita per %x elementi: -When \"Compare\" is triggered with this option set the following decision tree is processed: -Quando \"Compara\" è usato con questa opzione, viene eseguito il seguente albero delle decisioni: +Warnings: +Attenzione: +When the comparison is started with this option set the following decision tree is processed: +Quando questo set di opzioni viene selezionato per la comparazione viene processato il seguente albero di decisioni: You may try to synchronize remaining items again (WITHOUT having to re-compare)! Puoi provare a sincronizzare di nuovo gli elementi restanti (SENZA doverli ri-comparare) ! different file differenti file exists on both sides -il file esiste su entrambi i lati +file esistente su entrambi i lati on one side only -il file esiste su un solo lato +file esistente su un solo lato |> file on right side only\n |> Il file esiste solo sul lato destro\n diff --git a/Languages/japanese.lng b/Languages/japanese.lng index 4e2bcb88..6dba0ba1 100644 --- a/Languages/japanese.lng +++ b/Languages/japanese.lng @@ -134,8 +134,6 @@ About 情報 Action 操作 -Active for FAT/FAT32 drives only: When comparing filetimes treat files that differ by less or equal than 1 hour as equal. This ensures daylight saving time switches are handled properly. -FAT/FAT32 ドライブのみ有効: ファイルの時間を比較するとき、差異が 1 時間未満より少ないか同等かで判断します。これにより、夏時間の切り替えが適切に行われるようになります。 Add folder pair フォルダのペアを追加 All items have been synchronized! @@ -218,8 +216,6 @@ Copying file %x overwriting %y ファイル %x をコピー、%y に上書き中 Copying file %x to %y ファイル %x を %y にコピー中 -Could not retrieve file info for: -ファイル情報を取得できません: Could not set working directory: 作業ディレクトリが設定できません: Create a batch job @@ -292,20 +288,26 @@ Error deleting file: ファイルの削除エラー: Error handling ハンドリングのエラー +Error loading library function: +ライブラリ読み込みエラー: Error moving to Recycle Bin: ゴミ箱への移動に失敗: +Error opening file: +ファイルのオープンに失敗: Error parsing configuration file: 構成ファイルの構文に誤りがあります: +Error reading file attributes: +ファイル属性の取得に失敗: Error reading file: ファイル読み込みエラー: -Error reading folder attributes: -フォルダ属性の読み取りエラー: +Error resolving symbolic link: +シンボリックリンクの解決に失敗: Error traversing directory: ディレクトリの移動エラー: +Error writing file attributes: +ファイル属性の書き込みエラー: Error writing file: ファイル書き込みエラー: -Error writing folder attributes: -フォルダ属性の書き込みエラー: Error: Source directory does not exist anymore: エラー: ソースディレクトリが存在しません: Example @@ -320,12 +322,12 @@ Exit immediately and set returncode < 0 すぐに終了する場合の戻り値設定 < 0 Exit with RC < 0 RC で終了 < 0 -FAT32: Handle Daylight Saving Time -FAT32: 夏時間の取り扱いを有効 Feedback and suggestions are welcome at: フィードバック、提案など: File Manager integration: ファイラとの統合: +File Time Tolerance: +ファイル時刻の許容範囲: File already exists. Overwrite? ファイルは存在します、上書きしますか? File content @@ -334,6 +336,8 @@ File list exported! ファイル一覧のエクスポートが完了! File size and date ファイルサイズと日付 +File times that differ by up to the specified number of seconds are still handled as having same time. +ファイル時刻の指定された秒以内の誤差は、同じものとして取り扱われます。 Filename ファイル名 Files are found equal if\n - file content\nis the same. @@ -410,8 +414,8 @@ Hints: ヒント: Homepage: ホームページ: -If you like FFS: -FFS が気に入った場合: +If you like FFS +FFS が気に入った場合 Ignore errors エラーを無視 Ignore subsequent errors @@ -568,16 +572,18 @@ Synchronizing... 同期処理中... System out of memory! メモリが不足しています! +Target file already existing! +対象ファイルは既に存在します! The file does not contain a valid configuration: このファイルには有効な構成が含まれていません: -The file does not exist: +File does not exist: ファイルが存在しません: This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file. ファイル名をダブルクリックする度に、このコマンドが実行されます。%name は選択ファイルのプレースフォルダとして機能します。 This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file. ファイル名をダブルクリックする度に、このコマンドが実行されます。%x は選択ファイルのプレースフォルダとして機能します。 -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. 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ファイル時間の差異が 2 秒以内の場合は検出されないということに注意してください。 (これは、FAT32システムで正確に同期を行うことができる最小値です) +This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. +この変数では、ふたつの同名ファイルが存在した場合、 それぞれのファイルサイズと最終更新日付/時間を比較します。 Time 時間 Time elapsed: @@ -606,8 +612,10 @@ Warning 警告 Warning: Synchronization failed for %x item(s): 警告: %x アイテムの同期に失敗しました: -When \"Compare\" is triggered with this option set the following decision tree is processed: -この設定で \"比較\" トリガが実行された場合は、以下のツリーに従って処理されていきます。 +Warnings: +警告: +When the comparison is started with this option set the following decision tree is processed: +このオプションで比較を開始した場合は、以下のツリーに従って処理が行われます: You may try to synchronize remaining items again (WITHOUT having to re-compare)! 残っているファイルは、再び同期することができます (再比較とは別の動作)! different diff --git a/Languages/polish.lng b/Languages/polish.lng index 93b1ef1f..a0abffb3 100644 --- a/Languages/polish.lng +++ b/Languages/polish.lng @@ -134,8 +134,6 @@ About O Programie Action Akcja -Active for FAT/FAT32 drives only: When comparing filetimes treat files that differ by less or equal than 1 hour as equal. This ensures daylight saving time switches are handled properly. -Aktywne dla dysków FAT/FAT32: pliki, których czasy modyfikacji różnią się nie więcej niż godzinę, zostaną potraktowane jako równe. Zapewnia to poprawną synchronizację po zmianie czasu letniego. Add folder pair Dodaj foldery do porównania All items have been synchronized! @@ -148,6 +146,8 @@ As the name suggests, two files which share the same name are marked as equal if Jak wskazuje nazwa, dwa pliki o tej samej nazwie są równe tylko i wyłącznie jeżeli ich zawartość jest jednakowa. Czas modyfikacji nie jest brany pod uwagę. Ta opcja jest raczej użyteczna do sprawdzania spójności plików niż zadań kopii zapasowej.\n\nDrzewko decyzyjne dla tej opcji jest mniejsze: Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. Twórz zadanie batch dla automatyzacji procesu. By rozpocząć prace w tym trybie zwyczajnie uruchom plik z zadaniem batch lub dodaj go do zadań zaplanowanych Twojego systemu. Plik batch może być również przekazywany jako parametr do programu w postaci: FreeFileSync.exe <batchfile>. +Batch execution +Zadanie Batch Batch file created successfully! Plik Batch utworzony pomyślnie! Batch job @@ -216,8 +216,6 @@ Copying file %x overwriting %y Kopiowanie pliku %x nadpisywanie %y Copying file %x to %y Kopiowanie pliku %x do %y -Could not retrieve file info for: -Nie można uzyskać informacji o pliku dla: Could not set working directory: Nie można ustawić poprawnego folderu: Create a batch job @@ -290,20 +288,26 @@ Error deleting file: Błąd podczas usuwania pliku: Error handling Obsługa błędów +Error loading library function: +Błąd wczytywania funkcji: Error moving to Recycle Bin: Błąd podczas przenoszenia do kosza: +Error opening file: +Błąd odczytu pliku: Error parsing configuration file: Błąd podczas parsowania pliku konfiguracyjnego: +Error reading file attributes: +Błąd odczytu atrybutów pliku: Error reading file: -Błąd podczas odczytu pliku: -Error reading folder attributes: -Błąd odczytu atrybutów folderu: +Błąd odczytu pliku: +Error resolving symbolic link: +Błąd odczytu dowiązania symbolicznego: Error traversing directory: Błąd podczas odczytywania katalogu: +Error writing file attributes: +Błąd zapisu atrybutów pliku: Error writing file: -Błąd podczas zapisu do pliku: -Error writing folder attributes: -Błąd zapisu atrybutów folderu: +Błąd zapisu pliku: Error: Source directory does not exist anymore: Błąd: Katalog źródłowy nie istnieje: Example @@ -318,12 +322,12 @@ Exit immediately and set returncode < 0 Zakończ natychmiastowo i zwróć wartość < 0 Exit with RC < 0 Zakończ z RC < 0 -FAT32: Handle Daylight Saving Time -FAT32: Uwzględnij przesunięcie czasu Feedback and suggestions are welcome at: Komentarze i sugestie mile widziane na: File Manager integration: Menadżer plików: +File Time Tolerance: +Tolerancja czasu: File already exists. Overwrite? Nadpisać istniejący już plik? File content @@ -332,6 +336,8 @@ File list exported! Lista plików wyeksportowana! File size and date Rozmiar i data pliku +File times that differ by up to the specified number of seconds are still handled as having same time. +Plik różniące się określoną liczbą sekund traktowane są jako równe. Filename Nazwa pliku Files are found equal if\n - file content\nis the same. @@ -408,8 +414,8 @@ Hints: Wskazówki: Homepage: Strona domowa: -If you like FFS: -Jeżeli Ci się podoba: +If you like FFS +Jeżeli Ci się podoba Ignore errors Ignoruj błędy Ignore subsequent errors @@ -566,16 +572,18 @@ Synchronizing... Synchronizuję... System out of memory! Brak pamięci! +Target file already existing! +Plik docelowy już istnieje! The file does not contain a valid configuration: Nieprawidłowy format pliku: -The file does not exist: +File does not exist: Plik nie istnieje: This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file. Ta komenda będzie wykonywana za każdym razem jak klikniesz dwa razy na dany plik. %name jest wskaźnikiem na katalog zaznaczonego pliku. This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file. Ta komenda będzie wykonywana za każdym razem jak klikniesz dwa razy na dany plik. %x jest wskaźnikiem na katalog zaznaczonego pliku. -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. 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. -Ten wariant traktuje dwa pliki jako równe w przypadku gdy mają jednakowy rozmiar oraz tą samą datę i czas ostatniej modyfikacji. Miej na uwadze, że czas pliku może odbiegać od rzeczywistego o 2 sekundy. Jest to konieczne podczas synchronizacji dla plików w systemie FAT32. +This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. +Ten wariant traktuje dwa pliki jako równe w przypadku gdy mają jednakowy rozmiar oraz tą samą datę i czas ostatniej modyfikacji. Time Czas Time elapsed: @@ -604,8 +612,10 @@ Warning Uwaga Warning: Synchronization failed for %x item(s): Uwaga: Błąd synchronizacji dla \"%x\" elementów: -When \"Compare\" is triggered with this option set the following decision tree is processed: -Gdy \"Porównywanie\" z zaznaczoną opcją jest w toku, podejmowane są następujące dezycje: +Warnings: +Ostrzeżenia: +When the comparison is started with this option set the following decision tree is processed: +Gdy porównywanie z zaznaczoną opcją jest w toku, podejmowane są następujące dezyje: You may try to synchronize remaining items again (WITHOUT having to re-compare)! Możesz spróbować synchronizować pozostałe elementy ponownie (bez konieczności ponownego porównywania)! different diff --git a/Languages/portuguese.lng b/Languages/portuguese.lng index a613c96d..4088dcec 100644 --- a/Languages/portuguese.lng +++ b/Languages/portuguese.lng @@ -1,4 +1,4 @@ - MinGW \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 + MinGW \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 MinGW \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 Byte Byte @@ -134,8 +134,6 @@ About Sobre Action Acção -Active for FAT/FAT32 drives only: When comparing filetimes treat files that differ by less or equal than 1 hour as equal. This ensures daylight saving time switches are handled properly. -Activo apenas para drives FAT/FAT32: ao comparar as datas de ficheiros, tratar como iguais ficheiros com diferença de 1 hora ou menos. Esta opção assegura que as mudanças de Hora de Verão são tratadas correctamente. Add folder pair Adicionar um par de pastas All items have been synchronized! @@ -218,8 +216,6 @@ Copying file %x overwriting %y Copiar ficheiro %x substituindo %y Copying file %x to %y Copiar ficheiro %x para %y -Could not retrieve file info for: -Não pode obter informação do ficheiro: Could not set working directory: Não pode definir pasta de trabalho: Create a batch job @@ -292,20 +288,26 @@ Error deleting file: Erro ao eliminar o ficheiro: Error handling Controlador de erros +Error loading library function: +Erro ao carregar a livraria: Error moving to Recycle Bin: Erro ao mover para Reciclagem: +Error opening file: +Erro ao abrir ficheiro: Error parsing configuration file: Erro de leitura do ficheiro de configuração: +Error reading file attributes: +Erro ao ler atributos do ficheiro: Error reading file: Erro de leitura de ficheiro: -Error reading folder attributes: -Erro de leitura de atributos de pasta: +Error resolving symbolic link: +Erro na resolução do link simbólico: Error traversing directory: Erro ao percorrer a pasta: +Error writing file attributes: +Erro na escrita dos atributos do ficheiro: Error writing file: Erro de escrita no ficheiro: -Error writing folder attributes: -Erro de escrita de atributos de pasta: Error: Source directory does not exist anymore: Erro: A pasta de origem já não existe: Example @@ -320,12 +322,12 @@ Exit immediately and set returncode < 0 Sair imediatamente e enviar o código < 0 Exit with RC < 0 Sair com RC < 0 -FAT32: Handle Daylight Saving Time -FAT32: Tratar Hora de Verão Feedback and suggestions are welcome at: Comentários e sugestões são benvindos em: File Manager integration: Integração c/ Gestor de Ficheiros: +File Time Tolerance: +Tolerância de tempo do ficheiro: File already exists. Overwrite? O ficheiro já existe. Deseja substituir? File content @@ -334,6 +336,8 @@ File list exported! Lista dos ficheiros exportada! File size and date Data e tamanho do ficheiro +File times that differ by up to the specified number of seconds are still handled as having same time. +Ficheiro com diferença de tempo até ao número especificado de segundos são tratados como tendo o mesmo tempo. Filename Nome do ficheiro Files are found equal if\n - file content\nis the same. @@ -410,8 +414,8 @@ Hints: Dicas: Homepage: Homepage: -If you like FFS: -SE gosta de FFS: +If you like FFS +SE gosta de FFS Ignore errors Ignorar erros Ignore subsequent errors @@ -568,16 +572,18 @@ Synchronizing... A sincronizar... System out of memory! Sistema sem memória! +Target file already existing! +Ficheiro destino já existe! The file does not contain a valid configuration: O ficheiro não contém uma configuração válida: -The file does not exist: +File does not exist: O ficheiro não existe: This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file. Esta linha de comandos será executada cada vez que fizer duplo click num ficheiro. %name serve para reservar o lugar do ficheiro seleccionado. This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file. Esta linha de comandos será executada cada vez que fizer duplo click num ficheiro. %x serve para reservar o lugar do ficheiro seleccionado. -This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. 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. -Esta variante avalia dois ficheiros de nome igual como iguais quando têm o mesmo tamanho e a mesma data e hora de modificação. Atenção: É permitido um desvio de 2 segundos na hora, de maneira a assegurar a sincronização com sistema de ficheiros de baixa precisão FAT32. +This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. +Esta variante avalia dois ficheiros de nome igual como iguais quando têm o mesmo tamanho e a mesma data e hora de modificação. Time Hora Time elapsed: @@ -606,8 +612,10 @@ Warning Atenção Warning: Synchronization failed for %x item(s): Atenção: A sincronização falhou para %x item(s): -When \"Compare\" is triggered with this option set the following decision tree is processed: -Quando \"Compare\" é iniciado com esta opção, é executada a seguinte árvore de decisão: +Warnings: +Avisos: +When the comparison is started with this option set the following decision tree is processed: +Usar a seguinte árvore de decisão quando inicia com estas opções de comparação: You may try to synchronize remaining items again (WITHOUT having to re-compare)! Pode tentar sincronizar os restantes elementos outra vez (SEM TER QUE comparar de novo) ! different diff --git a/Languages/slovenian.lng b/Languages/slovenian.lng new file mode 100644 index 00000000..4bb4984d --- /dev/null +++ b/Languages/slovenian.lng @@ -0,0 +1,628 @@ + MinGW \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 + MinGW \t- Windows port od GNU Compiler Collection\n wxWidgets \t- Open-Source GUI framework\n wxFormBuilder\t- wxWidgets GUI-builder\n CodeBlocks \t- Open-Source IDE + Byte + Byte + GB + GB + MB + MB + PB + PB + TB + TB + kB + kB +!= files are different\n +!= datoteke so različne\n +%x directories +%x imeniki +%x files, +%x datoteke, +%x of %y rows in view +%x od %y vrstic prikazanih +%x of 1 row in view +%x od 1 vrstice prikazane +&Abort +&Prekini +&About... +&O programu... +&Advanced +&Napredno +&Apply +&Uveljavi +&Cancel +&Prekliči +&Compare +&Primerjaj +&Create batch job +&Ustvari batch opravilo +&Default +&Privzeto +&Export file list +&Izvozi seznam datotek +&File +&Datoteka +&Global settings +&Globalne nastavitve +&Help +&Pomoč +&Ignore +&Ignoriraj +&Language +&Jezik +&Load +&Naloži +&Load configuration +Na&loži konfiguracijo +&OK +&V redu +&Pause +&Pavza +&Quit +&Zapusti +&Retry +&Ponovi +&Save +&Shrani +&Start +&Začni +&Synchronize... +&Sinhroniziraj... +, +, +- different +- različni +- different (same date, different size) +- različni (enak datum, različna velikost) +- equal +- enaki +- exists left only +- obstaja samo na levi +- exists right only +- obstaja samo na desni +- left +- levo +- left newer +- na levi novejša +- right +- desno +- right newer +- na desni novejša +- same date (different size) +- enak datum (različna velikost) +-Open-Source file synchronization- +-Odprto-kodna sinhronizacija datotek- +. +, +1 directory +1 imenik +1 file, +1 datoeka, +1. &Compare +1. &Primerjaj +1. Enter full file or directory names separated by ';' or a new line. +1. Vnesite polno ime datotek ali imenikov ločenih s ';' ali novo vrstico. +2. &Synchronize... +2. &Sinhroniziraj... +2. Use wildcard characters '*' and '?'. +2. Uporabite lahko tudi znake '*' in '?'. +3. Exclude files directly on main grid via context menu. +3. Izključite datoteke neposredno na glavni mreži s kontekstnim menujem. +4. Keep the number of entries small for best performance. +4. Za boljše delovanje vzdržujte majhno število vnosov. +<< left file is newer\n +<< leva datoteka je novejša\n +<Directory> +<Imenik> +<Last session> +<Zadnja seja> +<multiple selection> +<mnogokratna izbira> +<| file on left side only\n +<| datoteka obstaja samo na levi\n +== files are equal\n\n +== datoteke so enake\n\n +>> right file is newer\n +>> desna datoteka je novejša\n +Abort +Prekini +Abort requested: Waiting for current operation to finish... +Zahtevana je bila prekinitev: čakam, da se zaključi trenutna operacija... +Aborted +Prekinitev uspela +About +O programu(1) +Action +Ukrep +Add folder pair +Dodaj par imenikov +All items have been synchronized! +Vsi predmeti so bili sinhronizirani! +An exception occured! +Zgodila se je napaka! +As a result the files are separated into the following categories: +Kot rezultat so datoteke razdeljene v naslednje kategorije: +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: +Kot že samo ime pove, sta dve datoteki označeni kot enaki samo takrat, ko imata enako vsebino. Ta možnost je bolj uporabna za preverjanje doslednosti kot za operacije varnostnega shranjevanja. Zaradi tega se časi datotek ne upoštevajo.\n\nZ omogočeno to možnostjo je drevo odločanja manjše: +Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. +Sestavi batch datoteko za samodejno sinhronizacijo. Da začnete v batch načinu, preprosto podajte ime datoteke k FreeFileSync izvršilni datoteki: FreeFileSync.exe <imedatotekebatch>. To se lahko tudi nastavi v urniku opravil vašega operacijskega sistema. +Batch execution +Batch izvajanje +Batch file created successfully! +Datoteka batch je bila uspešno ustvarjena! +Batch job +Batch opravilo +Big thanks for localizing FreeFileSync goes out to: +Zahvale za prevod FreeFileSync gredo: +Build: +Izgradnja: +Cancel +Prekliči +Check all +Preveri vse +Choose to hide filtered files/directories from list +Skrij filtrirane datoteke/imenike iz seznama +Comma separated list +Seznam ločen z vejico +Compare both sides +Primerjaj obe strani +Compare by \"File content\" +Primerjaj po \"Vsebini datotek\" +Compare by \"File size and date\" +Primerjaj po \"Datumu in velikosti\" +Compare by... +Primerjaj po... +Comparing content +Primerjam vsebino +Comparing content of files %x +Primerjam vsebino datotek %x +Comparing... +Primerjam... +Completed +Zaključeno +Configuration +Konfiguracija +Configuration loaded! +Konfiguracija naložena! +Configuration overview: +Pregled konfiguracije: +Configuration saved! +Konfiguracija shranjena! +Configure filter +Konfiguriraj filter +Configure filter... +Konfiguriraj filter... +Configure your own synchronization rules. +Konfiguriraj vaša lastna sinhronizacijska pravila. +Confirm +Potrdite +Continue +Nadaljuj +Conversion error: +Napaka pri pretvorbi: +Copy from left to right +Kopiraj iz leve na desno +Copy from left to right overwriting +Kopiraj iz leve na desno s prepisovanjem +Copy from right to left +Kopiraj iz desne na levo +Copy from right to left overwriting +Kopiraj iz desne na levo s prepisovanjem +Copy new or updated files to right folder. +Kopiraj nove ali posodobljene datoteke v desno mapo. +Copy to clipboard\tCTRL+C +Kopiraj v odložišče\tCTRL+C +Copying file %x overwriting %y +Kopiram datoteko %x s prepisovanjem %y +Copying file %x to %y +Kopiram datoteko %x v %y +Could not set working directory: +Ne morem nastaviti delovnega imenika: +Create a batch job +Ustvarite batch opravilo +Create: +Ustvari: +Creating folder %x +Ustvarjam mapo %x +Current operation: +Trenutna operacija: +Custom +Po meri +Customize columns +Stolpce prikroji po meri +DECISION TREE +DREVO ODLOČITEV +Data remaining: +Preostanek podatkov: +Data: +Podatki: +Date +Datum +Delete files/folders existing on left side only +Izbriši datoteke/mape, ki obstajajo samo na levi strani +Delete files/folders existing on right side only +Izbriši datoteke/mape, ki obstajajo samo na desni strani +Delete files\tDEL +Izbriši datoteke\tDEL +Delete on both sides +Izbriši na obeh straneh +Delete on both sides even if the file is selected on one side only +Izbriši na obeh straneh, četudi je datoteka izbrana na samo eni strani +Delete: +Izbriši: +Deleting file %x +Brisanje datoteke %x +Deleting folder %x +Brisanje mape %x +Directories are dependent! Be careful when setting up synchronization rules: +Imeniki so v odvisnosti! Bodite pozorni, ko nastavljate sinhronizacijska pravila: +Directory does not exist: +Imenik ne obstaja: +Do not show graphical status and error messages but write to a logfile instead +Ne prikazuj grafičnega statusa in obvestil o napakah, ampak zabeleži samo v dnevniško datoteko +Do not show this warning again +Ne prikazuj več tega obvestila +Do nothing +Ne naredi ničesar +Do you really want to delete the following objects(s)? +Ali resnično želite izbrisati naslednje objekte? +Do you really want to move the following objects(s) to the Recycle Bin? +Ali resnično želite premakniti naslednje objekte v Koš? +Donate with PayPal +Doniraj s PayPal +Drag && drop +Povleci && spusti +Email: +Email: +Error +Napaka +Error changing modification time: +Napaka pri spreminjanju časa modifikacije: +Error copying file: +Napaka pri kopiranju datoteke: +Error creating directory: +Napaka pri ustvarjanju imenika: +Error deleting directory: +Napaka pri brisanju imenika: +Error deleting file: +Napaka pri brisanju datoteke: +Error handling +Napaka pri obravnavanju +Error loading library function: +Napaka pri nalaganju funkcije iz knjižnice: +Error moving to Recycle Bin: +Napaka pri premikanju v Koš: +Error opening file: +Napaka pri odpiranju datoteke: +Error parsing configuration file: +Napaka pri preverjanju konfiguracijske datoteke: +Error reading file attributes: +Napaka pri branju atributov datoteke: +Error reading file: +Napaka pri branju datoteke: +Error resolving symbolic link: +Napaka pri razreševanju simbolične povezave: +Error traversing directory: +Napaka pri prehajanju imenika: +Error writing file attributes: +Napaka pri pisanju atributov datoteke: +Error writing file: +Napaka pri pisanju datoteke: +Error: Source directory does not exist anymore: +Napaka: Izvorni imenik ne obstaja več: +Example +Primer +Exclude +Izključi +Exclude temporarily +Začasno izključi +Exclude via filter: +Izključi preko filtra: +Exit immediately and set returncode < 0 +Takoj zapusti in vrni povratno kodo < 0 +Exit with RC < 0 +Zapusti z RC < 0 +Feedback and suggestions are welcome at: +Povratne informacije in predlogi so dobrodošli na: +File Manager integration: +Integracija z urejevalnikom datotek: +File Time Tolerance: +Toleranca časa spremembe datoteke: +File already exists. Overwrite? +Datoteka že obstaja. Prepišem? +File content +Vsebini datoteke +File list exported! +Seznam datotek je bil izvožen! +File size and date +Velikosti in datumu datoteke +File times that differ by up to the specified number of seconds are still handled as having same time. +Časi sprememb datotek, ki se razlikujejo do navedenega števila sekund so smatrani kot da imajo isti čas spremembe. +Filename +Ime datoteke +Files are found equal if\n - file content\nis the same. +Datoteke so enake če\n - je vsebina datoteke\nenaka. +Files are found equal if\n - filesize\n - last write time and date\nare the same. +Datoteke so enake če\n - velikost datoteke\n - zadnji čas pisanja in datum\nso enaki. +Files remaining: +Preostale datoteke: +Files that exist on both sides and have different content +Datoteke, ki obstajajo na obeh straneh in imajo različno vesbino +Files that exist on both sides, have same date but different filesizes +Datoteke, ki obstajajo na obeh straneh, imajo isti datum, vendar so različnih velikosti +Files that exist on both sides, left one is newer +Datoteke, ki obstajajo na obeh straneh, leva je novejša +Files that exist on both sides, right one is newer +Datoteke, ki obstajajo na obeh straneh, desna je novejša +Files/folders remaining: +Preostale datoteke/mape: +Files/folders scanned: +Pregledane datoteke/mape: +Files/folders that exist on left side only +Datoteke/mape, ki obstajajo samo na levi strani +Files/folders that exist on right side only +Datoteke/mape, ki obstajajo samo na desni strani +Filter active: Press again to deactivate +Filter aktiven: Ponovno kliknite za deaktivacijo +Filter files +Filtriraj datoteke +Filter view +Filtriran pogled +Folder Comparison and Synchronization +Primerjava in sinhronizacija imenika +Folder pair +Par map +FreeFileSync - Folder Comparison and Synchronization +FreeFileSync - Primerjava in sinhronizacija map +FreeFileSync Batch Job +FreeFileSync Batch opravilo +FreeFileSync at Sourceforge +FreeFileSync na Sourceforge +FreeFileSync batch file +FreeFileSync batch datoteka +FreeFileSync configuration +FreeFileSync konfiguracija +Full name +Polno ime +Generating file list... +Ustvarjam seznam datotek... +Global settings +Globalne nastavitve +Help +Pomoč +Hide all error and warning messages +Skrij vsa obvestila o napakah in opozorilih +Hide files that are different +Skrij datoteke ki so različne +Hide files that are equal +Skrij enake datoteke +Hide files that are newer on left +Skrij najnovejše datoteke na levi +Hide files that are newer on right +Skrij najnovejše datoteke na desni +Hide files that exist on left side only +Skrij datoteke, ki obstajajo samo na levi strani +Hide files that exist on right side only +Skrij datoteke, ki obstajajo samo na desni strani +Hide filtered items +Skrij filtrirane predmete +Hide further error messages during the current process +Skrijte nadaljnja obvestila o napakah med trenutnim procesom +Hides error messages during synchronization:\nThey are collected and shown as a list at the end of the process +Skrij obvestila o napakah med sinhronizacijo:\nObvestila se zbirajo in se prikažejo kot seznam na koncu procesa +Hints: +Namigi: +Homepage: +Domača stran: +If you like FFS +Če vam je FFS všeč +Ignore errors +Ignoriraj napake +Ignore subsequent errors +Ignoriraj vse nadaljnje napake +Ignore this error, retry or abort synchronization? +Ignoriraj to napako, poskusi ponovno ali prekini sinhronizacijo? +Ignore this error, retry or abort? +Ignoriraj to napako, poskusi ponovno ali prekini? +Include +Vključi +Include temporarily +Trenutno vključi +Include: *.doc;*.zip;*.exe\nExclude: *\\temp\\* +Vključi: *.doc;*.zip;*.exe\nIzključi: *\\temp\\* +Info +Info +Information +Informacije +Initialization of Recycle Bin failed! +Inicializacija Koša ni uspela! +It was not possible to initialize the Recycle Bin!\n\nIt's likely that you are not using Windows.\nIf you want this feature included, please contact the author. :) +Ni bilo mogoče inicializirati Koša!\n\nZgleda, da ne uporabljate Windowsov.\nČe želite imeti vključeno to lastnost, prosimo kontaktirajte avtorja. :) +Left folder: +Leva mapa: +Legend +Legenda +Load configuration from file +Naloži konfiguracijo iz datoteke +Load configuration history (press DEL to delete items) +Naloži zgodovino konfiguracije (pritisnite DEL za brisanje predmetov) +Log-messages: +Sporočila beleženja: +Mirror ->> +Zrcalno ->> +Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. +Zrcalna kopija leve mape: Desna mapa bo prepisana in se bo natančno ujemala z levo mapo po sinhronizaciji. +Move column down +Premakni stolpec dol +Move column up +Premakni stolpec gor +Not all items were synchronized! Have a look at the list. +Vsi predmeti niso bili sinhronizirani! Poglejte seznam. +Nothing to synchronize according to configuration! +Nič ni za sinhronizirati po trenutni konfiguraciji! +Number of files and directories that will be created +Število datotek in imenikov, ki bodo ustvarjeni +Number of files and directories that will be deleted +Število datotek in imenikov, ki bodo izbrisani +Number of files that will be overwritten +Število datotek, ki bodo prepisane +OK +V redu +Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the full name including path prefix. +Samo datoteke/imeniki, ki preidejo filtriranje bodo izbrane za sinhronizacijo. Filter bo uveljavljen na polno ime vključujoč predpono. +Open synchronization dialog +Odpri sinhronizacijsko pogovorno okno +Open with File Manager\tD-Click +Odpri z urejevalnikom datotek\tD-Click +Operation aborted! +Operacija prekinjena! +Operation: +Operacija: +Pause +Pavza +Please fill all empty directory fields. +Prosim izpolnite vse imenike s praznimi polji. +Press button to activate filter +Kliknite za aktivacijo filtra +Preview +Predogled +Published under the GNU General Public License: +Objavljeno pod licenco GNU General Public: +Quit +Zapusti +Relative path +Relativna pot +Remove folder pair +Odstrani par imenikov +Reset +Ponastavi +Reset all warning messages? +Ponastavim vsa obvestila z opozorili? +Resets all warning messages +Ponastavi vsa obvestila z opozorili +Result +Rezultat +Right folder: +Desna mapa: +S&ave configuration +Shr&ani konfiguracijo +Save aborted! +Shranjevanje prekinjeno! +Save current configuration to file +Shrani trenutno konfiguracijo v datoteko +Scanning... +Pregledujem... +Scanning: +Pregledujem: +Select a folder +Izberite mapo +Select variant: +Izberite varianto: +Show files that are different +Prikaži datoteke, ki so različne +Show files that are equal +Prikaži datoteke, ki so enake +Show files that are newer on left +Prikaži datoteke, ki so novejše na levi +Show files that are newer on right +Prikaži datoteke, ki so novejše na desni +Show files that exist on left side only +Prikaži datoteke, ki obstajajo samo na levi +Show files that exist on right side only +Prikaži datoteke, ki obstajajo samo na desni +Show popup +Prikaži pojavno okno +Show popup on errors or warnings +Prikaži pojavno okno pri napakah in opozorilih +Significant difference detected: More than 50% of files will be overwritten/deleted! +Pomembna razlika zaznana: Več kot 50% datotek bo prepisanih/izbrisanih! +Silent mode +Tihi način +Size +Velikost +Sorting file list... +Sortiram seznam datotek... +Source code written completely in C++ utilizing: +Izvorna koda napisana celotno v C++ z uporabo: +Start +Začni +Start synchronization +Začni sinhronizacijo +Stop +Ustavi +Swap sides +Zamenjaj strani +Synchronization aborted! +Sinhronizacija prekinjena! +Synchronization completed successfully! +Sinhronizacija uspešno zaključena! +Synchronization completed with errors! +Sinhronizacija se je končala z napakami! +Synchronization filter +Filter sinhronizacije +Synchronization settings +nastavitve sinhronizacije +Synchronization status +Status sinhronizacije +Synchronize all .doc, .zip and .exe files except everything from folder \"temp\". +Sinhroniziraj vse .doc, .zip in .exe datoteke, razen kar je v mapi \"temp\". +Synchronize both sides simultaneously: Copy new or updated files in both directions. +Sinhroniziraj obe strani istočasno: Kopiraj nove ali posodobljene datoteke v obe smeri. +Synchronizing... +Sinhroniziram... +System out of memory! +Sistemu je zmanjkalo pomnilnika! +Target file already existing! +Tarčna datoteka že obstaja! +The file does not contain a valid configuration: +Datoteka ne vsebuje veljavne konfiguracije: +File does not exist: +Datoteka ne obstaja: +This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file. +Ta ukaz bo izveden vsakič, ko boste dvokliknili na ime datoteke. %name služi kot rezerviran prostor za izbrano datoteko. +This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file. +Ta ukaz bo izveden vsakič, ko boste dvokliknili na ime datoteke. %x služi kot rezerviran prostor za izbrano datoteko. +This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. +Ta varianta oceni dve datoteki z enakim imenom kot enaki, ko imata enako velikost IN enak datum ter čas zadnjega spreminjanja. +Time +Čas +Time elapsed: +Pretečen čas: +Total amount of data that will be transferred +Količina podatkov, ki bo prenešena +Total time: +Celoten čas: +Two way <-> +Obojesmerno <-> +Unable to create logfile! +Ne morem ustvariti datoteko za beleženje! +Unable to initialize Recycle Bin! +Ne morem inicializirati Koša! +Uncheck all +Odznači vse +Update -> +Posodobi -> +Update: +Posodobi: +Use Recycle Bin +Uporabi Koš +Use Recycle Bin when deleting or overwriting files during synchronization +Uporabi Koš ko se briše ali prepisuje datoteke med sinhronizacijo +Warning +Pozor +Warning: Synchronization failed for %x item(s): +Pozore: Sinhronizacija ni uspela za %x predmetov: +Warnings: +Opozorila: +When the comparison is started with this option set the following decision tree is processed: +Ko se primerjava zažene s tem setom možnosti, se obdela naslednje drevo odločitev: +You may try to synchronize remaining items again (WITHOUT having to re-compare)! +Naslednje predmete lahko ponovno poskusite sinhronizirati (BREZ ponovne primerjave) ! +different +različni +file exists on both sides +datoteka obstaja na obeh straneh +on one side only +datoteka obstaja samo na eni strani +|> file on right side only\n +|> datoteka obstaja samo na desni\n diff --git a/Languages/spanish.lng b/Languages/spanish.lng new file mode 100644 index 00000000..f00da89a --- /dev/null +++ b/Languages/spanish.lng @@ -0,0 +1,640 @@ + MinGW \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 + MinGW \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 + Byte + Byte + GB + GB + MB + MB + PB + PB + TB + TB + kB + kB +!= files are different\n +!= los ficheros son diferentes\n +%x directories +%x directorios +%x files, +%x ficheros, +%x of %y rows in view +%x de %y ficheros +%x of 1 row in view +%x de 1 línea +&Abort +&Abortar +&About... +&Sobre... +&Advanced +&Avanzado +&Apply +&Aplicar +&Cancel +&Cancelar +&Check for new version +&Buscar versión nueva +&Compare +&Comparar +&Create batch job +&Crear un fichero batch +&Default +&Config. por defecto +&Export file list +&Exportar lista de ficheros +&File +&Fichero +&Global settings +&Opciones globales +&Help +&Ayuda +&Ignore +&Ignorar +&Language +&Idioma +&Load +&Cargar +&Load configuration +&Cargar configuración +&OK +&OK +&Pause +&Pausa +&Quit +&Salir +&Retry +&Reintentar +&Save +&Guardar +&Start +&Inicio +&Synchronize... +&Sincronizar... +, +, +- different +- ficheros diferentes +- different (same date, different size) +- ficheros diferentes (misma fecha, tamaño diferente) +- equal +- ficheros iguales +- exists left only +- existe sólo en la izquierda +- exists right only +- existe sólo en la derecha +- left +- izquierda +- left newer +- el más nuevo en la izquierda +- right +- derecha +- right newer +- el más nuevo en la derecha +- same date (different size) +- misma fecha (tamaño diferente) +-Open-Source file synchronization- +-Sincronización de ficheros Open-Source- +. +, +1 directory +1 directorio +1 file, +1 fichero, +1. &Compare +1. &Comparar +1. Enter full file or directory names separated by ';' or a new line. +1. Introducir nombre completo de fichero o directorio separado por ';' o una línea nueva. +2. &Synchronize... +2. &Sincronizar... +2. Use wildcard characters '*' and '?'. +2. Usar '*' y '?' como caracteres comodín. +3. Exclude files directly on main grid via context menu. +3. Excluir directamente ficheros sobre la rejilla a través del menu de contexto. +4. Keep the number of entries small for best performance. +4. Mantener pequeño el número de entradas para conseguir un mejor funcionamiento. +<< left file is newer\n +<< el fichero de la izquierda es el más nuevo\n +<Directory> +<Directorio> +<Last session> +<Última sesión> +<multiple selection> +<Selección múltiple> +<| file on left side only\n +<| sólamente el fichero del lado izquierdo\n +== files are equal\n\n +== los ficheros son iguales\n\n +>> right file is newer\n +>> el fichero de la derecha es el más nuevo\n +A newer version is available: +Hay una nueva versión disponible: +Abort +Abortar +Abort requested: Waiting for current operation to finish... +Abortar pedido: Esperar a que la actual operación finalice... +Aborted +Abortado +About +Sobre +Action +Acción +Add folder pair +Añadir un par de carpetas +All items have been synchronized! +¡Todos los elementos han sido sincronizados! +An exception occured! +¡Ha ocurrido una excepción! +As a result the files are separated into the following categories: +Como resultado, los ficheros son separados en las siguientes categorías: +As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller: +Como el nombre sugiere, dos ficheros que comparten el mismo nombre son marcados como iguales sólo si tienen el mismo contenido. Esta opción es útil para los chequeos de consistencia más que en operaciones de "backup". Por tanto, las fechas de los ficheros no se tienen en cuenta de ningún modo.\n\nCon esta opción habilitada el árbol de decisiones es más pequeño: +Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner. +Crear un fichero "batch" para una sincronización automática. Para empezar en modo "batch" simplemente pasar el nombre del fichero al ejecutable FreeFileSyinc en la ventana de comandos (CMD): FreeFileSync.exe <nombre de fichero batch>. También puede ser planificada en el Administrador de Tareas programadas. +Batch execution +Ejecución del "batch" +Batch file created successfully! +¡El fichero "batch" ha sido creado correctamente! +Batch job +Tarea Batch +Big thanks for localizing FreeFileSync goes out to: +Agradecimientos por la traducción de FreeFileSync a: +Build: +Construído: +Cancel +Cancelar +Check all +Verificar todo +Choose to hide filtered files/directories from list +Ocultar en la lista ficheros/directorios filtrados +Comma separated list +Lista de "items" separados por coma +Compare both sides +Comparar ambos lados +Compare by \"File content\" +Comparar por \"Contenido de fichero\" +Compare by \"File size and date\" +Comparar por \"Tamaño y fecha de fichero\" +Compare by... +Comparar por... +Comparing content +Comparación de contenido +Comparing content of files %x +Comparación del contenido de %x ficheros +Comparing... +Comparando... +Completed +Terminado +Configuration +Configuración +Configuration loaded! +¡Configuración cargada! +Configuration overview: +Parámetros de configuración: +Configuration saved! +¡Configuración guardada! +Configure filter +Configurar filtro +Configure filter... +Configurar filtros... +Configure your own synchronization rules. +Configure sus propias reglas de sincronización. +Confirm +Confirmar +Continue +Continuar +Conversion error: +Erro de conversión: +Copy from left to right +Copiar de izquierda a derecha +Copy from left to right overwriting +Copiar de izquierda a derecha con sobreescritura +Copy from right to left +Copiar de derecha a izquierda +Copy from right to left overwriting +Copiar de derecha a izquierda con sobreescritura +Copy new or updated files to right folder. +Copiar ficheros nuevos o actualizados a la carpeta de la derecha. +Copy to clipboard\tCTRL+C +Copiar al Portapapeles\tCTRL+C +Copying file %x overwriting %y +Copiar fichero %x sustituyendo %y +Copying file %x to %y +Copiar fichero %x a %y +Could not set working directory: +No se pudo definir el directorio de trabajo: +Create a batch job +Crear una tarea "batch" +Create: +Crear: +Creating folder %x +Creando la carpeta %x +Current operation: +Operación actual: +Custom +Personalizado +Customize columns +Personalizar columnas +DECISION TREE +ÁRBOL DE DECISIÓN +Data remaining: +Datos que faltan: +Data: +Datos: +Date +Fecha +Delete files/folders existing on left side only +Eliminar sólo ficheros/carpetas existentes en el lado izquierdo +Delete files/folders existing on right side only +Eliminar sólo ficheros/carpetas existentes en el lado derecho +Delete files\tDEL +Eliminar ficheros\tDEL +Delete on both sides +Eliminar en ambos lados lados +Delete on both sides even if the file is selected on one side only +Eliminar en ambos lados incluso si el fichero es seleccionado en un solo lado +Delete: +Eliminar: +Deleting file %x +Borrar fichero %x +Deleting folder %x +Borrar carpeta %x +Directories are dependent! Be careful when setting up synchronization rules: +¡Los directorios son dependientes! Cuidado al establecer las reglas de sincronización: +Directory does not exist: +El directorio no existe: +Do not show graphical status and error messages but write to a logfile instead +No mostrar estado ni errores en formato gráfico sino escribir un fichero "log" en su lugar. +Do not show this warning again +No mostrar este aviso otra vez +Do nothing +No hacer nada +Do you really want to delete the following objects(s)? +¿Está seguro de querer borrar el/los siguiente(s) objeto(s)? +Do you really want to move the following objects(s) to the Recycle Bin? +¿Está seguro de querer mover el/los siguiente(s) objeto(s) a la Papelera? +Donate with PayPal +Donar usando PayPal +Download now? +¿Descargar ahora? +Drag && drop +Arrastrar +Email +Email +Error +Error +Error changing modification time: +Error al modificar hora: +Error copying file: +Erro al copiar fichero: +Error creating directory: +Error al crear directorio: +Error deleting directory: +Error al borrar directorio: +Error deleting file: +Error al eliminar fichero: +Error handling +Controlador de errores +Error loading library function: +Error al descargar función de biblioteca: +Error moving to Recycle Bin: +Error al mover a la Papelera: +Error opening file: +Error al abrir fichero: +Error parsing configuration file: +Error en el análisis sintáctico del fichero de configuración: +Error reading file attributes: +Error al leer atributos del fichero: +Error reading file: +Error al leer el fichero: +Error resolving symbolic link: +Error al resolver enlace simbólico: +Error retrieving full name: +Error al recuperar el nombre completo: +Error traversing directory: +Error al trasladar directorio: +Error writing file attributes: +Error al escribir atributos del fichero: +Error writing file: +Error al escribir fichero: +Error: Source directory does not exist anymore: +Error: El directorio origen no existe ya: +Example +Ejemplo +Exclude +Excluir +Exclude temporarily +Excluir temporalmente +Exclude via filter: +Excluir por filtro: +Exit immediately and set returncode < 0 +Salir inmediatamente y enviar el código < 0 +Exit with RC < 0 +Salir com RC < 0 +Feedback and suggestions are welcome at: +Los comentarios y sugerencias será bienvenidos en: +File Manager integration: +Integración con el Explorador: +File Time Tolerance: +Tolerancia de Hora del Fichero: +File already exists. Overwrite? +El fichero ya existe. ¿Sustituir? +File content +Contenido del fichero +File list exported! +Lista de ficheros exportada! +File size and date +Fecha y tamaño del fichero +File times that differ by up to the specified number of seconds are still handled as having same time. +Las horas de los ficheros que difieren hasta el número de segundos especificados, son consideradas iguales. +Filename +Nombre del fichero +Files are found equal if\n - file content\nis the same. +Los ficheros serán considerados iguales si\n - el contenido del fichero\nes el mismo. +Files are found equal if\n - filesize\n - last write time and date\nare the same. +Los ficheros serán considerados iguales si\n - la hora y fecha de la última escritura\nson iguales. +Files remaining: +Ficheros restantes: +Files that exist on both sides and have different content +Ficheros que existen en ambos lados y tienen contenidos diferentes +Files that exist on both sides, have same date but different filesizes +Ficheros que existen en ambos lados, tienen la misma fecha pero diferentes tamaños +Files that exist on both sides, left one is newer +Ficheros que existen en ambos lados, el de la izquierda es más reciente +Files that exist on both sides, right one is newer +Ficheros que existen en ambos lados, el de la derecha es más reciente +Files/folders remaining: +Ficheros/carpetas restantes: +Files/folders scanned: +Ficheros/carpetas analizados: +Files/folders that exist on left side only +Ficheros/carpetas que existen sólo en el lado izquierdo +Files/folders that exist on right side only +Ficheros/carpetas que existen sólo en el lado derecho +Filter active: Press again to deactivate +Filtro activo: Clique aquí para desactivar +Filter files +Filtrar ficheros +Filter view +Vista de filtros +Folder Comparison and Synchronization +Carpeta de Comparación y Sincronización +Folder pair +Par de carpetas +FreeFileSync - Folder Comparison and Synchronization +FreeFileSync - Comparación y Sincronización de carpetas +FreeFileSync Batch Job +FreeFileSync Tarea "Batch" +FreeFileSync at Sourceforge +FreeFileSync en Sourceforge +FreeFileSync batch file +FreeFileSync fichero batch +FreeFileSync configuration +FreeFileSync configuración +FreeFileSync is up to date! +FreeFileSync está actualizado +Full name +Nombre completo +Generating file list... +Generando lista de ficheros... +Global settings +Opciones globales +Help +Ayuda +Hide all error and warning messages +Ocultar todos los mensajes de error y aviso +Hide files that are different +Ocultar ficheros diferentes +Hide files that are equal +Ocultar ficheros iguales +Hide files that are newer on left +Ocultar ficheros más recientes en la izquierda +Hide files that are newer on right +Ocultar ficheros más recientes en la derecha +Hide files that exist on left side only +Ocultar los ficheros que existen sólo en el lado izquierdo +Hide files that exist on right side only +Ocultar los ficheros que existen sólo en el lado derecho +Hide filtered items +Ocultar items filtrados +Hide further error messages during the current process +Ocultar próximos mensajes de error durante este processo +Hides error messages during synchronization:\nThey are collected and shown as a list at the end of the process +Ocultar mensajes de error durante la sincronización:\nSerán recopilados y mostrados como una lista al final del proceso +Hints: +Consejos: +Homepage +Homepage +If you like FFS +Si te gusta FFS +Ignore errors +Ignorar errores +Ignore subsequent errors +Ignorar errores siguientes +Ignore this error, retry or abort synchronization? +¿Ignorar este error, reintentar o abortar sincronización? +Ignore this error, retry or abort? +¿Ignorar este error, reintentar o abortar? +Include +Incluir +Include temporarily +Incluir temporalmente +Include: *.doc;*.zip;*.exe\nExclude: *\\temp\\* +Incluir: *.doc;*.zip;*.exe\nExcluir: *\\temp\\* +Info +Info +Information +Información +Initialization of Recycle Bin failed! +¡El inicio de la Papelera falló! +It was not possible to initialize the Recycle Bin!\n\nIt's likely that you are not using Windows.\nIf you want this feature included, please contact the author. :) +¡No fue posible iniciar la Papelera!\n\nEs probable que no esté usando Windows.\nSi quiere que este hecho sea considerado, por favor, contactate con el autor :) +Left folder: +Carpeta de la izquierda: +Legend +Leyenda +Load configuration from file +Cargar configuración desde fichero +Load configuration history (press DEL to delete items) +Cargar histórico de configuración (presionar DEL para borrar elementos) +Log-messages: +Log de mensajes: +Mirror ->> +Espejo ->> +Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization. +Backup espejo de la carpeta de la izquierda: La carpeta de la derecha será sustituída y coincidirá exactamente con la carpeta de la izquierda después de la sincronización. +Move column down +Mover columna abajo +Move column up +Mover columna arriba +Not all items were synchronized! Have a look at the list. +¡No todos los elementos fueron sincronizados! Por favor, verifique la lista. +Nothing to synchronize according to configuration! +¡No hay nada que sincronizar de acuerdo con la configuración! +Number of files and directories that will be created +Número de elementos que serán creados +Number of files and directories that will be deleted +Número de elementos que serán borrados +Number of files that will be overwritten +Número de ficheros que serán sustituídos +OK +OK +Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the full name including path prefix. +Sólo los ficheros/directorios que pasen el filtro serán seleccionados para la sincronización. El filtro se aplicará al nombre completo, incluído el camino. +Open synchronization dialog +Abrir diálogo de sincronización +Open with File Manager\tD-Click +Abrir con el Explorador\tD-Click +Operation aborted! +Operación abortada! +Operation: +Operación: +Pause +Pausa +Please fill all empty directory fields. +Por favor, rellene todos los campos del directorio vacíos. +Press button to activate filter +Presione el botón para activar el filtro +Preview +Previsualizar +Published under the GNU General Public License: +Publicado bajo "GNU General Public License": +Quit +Salir +Relative path +Camino relativo +Remove folder pair +Eliminar par de carpetas +Reset +Reiniciar +Reset all warning messages? +¿Reiniciar todos los mensajes de aviso? +Resets all warning messages +Reinicia todos los mensajes de aviso +Result +Resultado +Right folder: +Carpeta de la derecha: +S&ave configuration +G&uardar configuración +Save aborted! +¡Guardar abortado! +Save current configuration to file +Guardar la configuración actual en un fichero +Scanning... +Analizando... +Scanning: +Analizar: +Select a folder +Seleccione una carpeta +Select variant: +Sleccione una variante: +Show files that are different +Mostrar los ficheros diferentes +Show files that are equal +Mostrar los ficheros iguales +Show files that are newer on left +Mostrar ficheros recientes a la izquierda +Show files that are newer on right +Mostrar ficheros recientes a la derecha +Show files that exist on left side only +Mostrar ficheros existentes en la izquierda sólamente +Show files that exist on right side only +Mostrar ficheros existentes en la derecha sólamente +Show popup +Mostrar "popups" +Show popup on errors or warnings +Mostrar "popup" de errores o avisos +Significant difference detected: More than 50% of files will be overwritten/deleted! +¡Detectada diferencia significativa!: Más del 50% de los ficheros serán sustituídos/borrados! +Silent mode +Modo silencioso +Size +Tamaño +Sorting file list... +Ordenar lista de ficheros... +Source code written completely in C++ utilizing: +Código fuente escrito en C++ utilizando: +Start +Iniciar +Start synchronization +Iniciar a sincronización +Stop +Parar +Swap sides +Intercambiar lados +Synchronization aborted! +Sincronización abortada! +Synchronization completed successfully! +¡Sincronización completada con éxito! +Synchronization completed with errors! +¡Sincronización completada con errores! +Synchronization filter +Filtro de sincronización +Synchronization settings +Parámetros de sincronización +Synchronization status +Estado de la sincronización +Synchronize all .doc, .zip and .exe files except everything from folder \"temp\". +Sincronizar todos los ficheros .doc, .zip and .exe excepto los de la carpeta \"temp\". +Synchronize both sides simultaneously: Copy new or updated files in both directions. +Sincronizar ambos lados simultáneamente: Copiar ficheros nuevos o actualizados en ambas direcciones. +Synchronizing... +Sincronizando... +System out of memory! +Sistema sin memoria! +Target file already existing! +¡El fichero objetivo existe ya! +The file does not contain a valid configuration: +El fichero no contiene una configuración válida: +File does not exist: +El fichero no existe: +This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file. +Esta línea de comandos será ejecutada cada vez que haga doble click sobre un nombre de fichero. %name es el espacio reservado del fichero seleccionado. +This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file. +Esta línea de comandos será ejecutada cada vez que haga doble click sobre un nombre de fichero. %x es el espacio reservado para el fichero seleccionado. +This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. +Esta variante evalúa dos ficheros con el mismo nombre como iguales cuando tienen el mismo tamaño Y la misma fecha de modificación. +Time +Hora +Time elapsed: +Tiempo transcurrido: +Total amount of data that will be transferred +Cantidad total de datos que serán transferidos +Total time: +Tiempo total: +Two way <-> +Doble sentido <-> +Unable to connect to sourceforge.net! +Permitir conectar con sourceforge.net +Unable to create logfile! +Permitir crear logfile +Unable to initialize Recycle Bin! +Permitir iniciar la Papelera +Uncheck all +Deseleccionar todos +Update -> +Actualizar -> +Update: +Actualizar: +Use Recycle Bin +Utilizar la Papelera +Use Recycle Bin when deleting or overwriting files during synchronization +Utilizar la papelera en el borrado o sustitución de ficheros durante la sincronización. +Warning +Atención +Warning: Synchronization failed for %x item(s): +Atención: La sincronización falló para %x item(s): +Warnings: +Avisos: +When the comparison is started with this option set the following decision tree is processed: +Cuando la comparación se inicia con este conjunto de opciones, se procesa el siguiente árbol de decisiones: +You may try to synchronize remaining items again (WITHOUT having to re-compare)! +Puede intentar sincronizar los elementos restantes otra vez (SIN tener que volver a comparar) +different +ficheros diferentes +file exists on both sides +el fichero existe en ambos lados +on one side only +fichero sólo en un lado +|> file on right side only\n +|> ficheiro en lado derecho sólo\n @@ -1,5 +1,5 @@ CPPFLAGS=-Wall -pipe -DNDEBUG `wx-config --cppflags` -DFFS_LINUX -DTIXML_USE_STL -O3 -pthread -c -ENDFLAGS=`wx-config --libs` -lwx_gtk2_aui-2.8 -O3 -pthread +ENDFLAGS=`wx-config --libs` -O3 -pthread all: FreeFileSync @@ -30,6 +30,9 @@ obj/mainDialog.o: ui/mainDialog.cpp obj/syncDialog.o: ui/syncDialog.cpp g++ $(CPPFLAGS) ui/syncDialog.cpp -o obj/syncDialog.o +obj/checkVersion.o: ui/checkVersion.cpp + g++ $(CPPFLAGS) ui/checkVersion.cpp -o obj/checkVersion.o + obj/customGrid.o: library/customGrid.cpp g++ $(CPPFLAGS) library/customGrid.cpp -o obj/customGrid.o @@ -72,8 +75,8 @@ obj/zstring.o: library/zstring.cpp obj/customButton.o: library/customButton.cpp g++ $(CPPFLAGS) library/customButton.cpp -o obj/customButton.o -FreeFileSync: init obj/application.o obj/algorithm.o obj/comparison.o obj/customButton.o obj/synchronization.o obj/globalFunctions.o obj/guiGenerated.o obj/mainDialog.o obj/syncDialog.o obj/customGrid.o obj/fileHandling.o obj/resources.o obj/smallDialogs.o obj/multithreading.o obj/statusHandler.o obj/misc.o obj/tinyxml.o obj/tinystr.o obj/tinyxmlerror.o obj/tinyxmlparser.o obj/processXml.o obj/zstring.o - g++ $(ENDFLAGS) -o FreeFileSync obj/application.o obj/algorithm.o obj/comparison.o obj/customButton.o obj/synchronization.o obj/globalFunctions.o obj/guiGenerated.o obj/mainDialog.o obj/syncDialog.o obj/customGrid.o obj/fileHandling.o obj/resources.o obj/smallDialogs.o obj/multithreading.o obj/statusHandler.o obj/misc.o obj/tinyxml.o obj/tinystr.o obj/tinyxmlerror.o obj/tinyxmlparser.o obj/processXml.o obj/zstring.o +FreeFileSync: init obj/application.o obj/algorithm.o obj/comparison.o obj/customButton.o obj/checkVersion.o obj/synchronization.o obj/globalFunctions.o obj/guiGenerated.o obj/mainDialog.o obj/syncDialog.o obj/customGrid.o obj/fileHandling.o obj/resources.o obj/smallDialogs.o obj/multithreading.o obj/statusHandler.o obj/misc.o obj/tinyxml.o obj/tinystr.o obj/tinyxmlerror.o obj/tinyxmlparser.o obj/processXml.o obj/zstring.o + g++ $(ENDFLAGS) -o FreeFileSync obj/application.o obj/algorithm.o obj/comparison.o obj/customButton.o obj/checkVersion.o obj/synchronization.o obj/globalFunctions.o obj/guiGenerated.o obj/mainDialog.o obj/syncDialog.o obj/customGrid.o obj/fileHandling.o obj/resources.o obj/smallDialogs.o obj/multithreading.o obj/statusHandler.o obj/misc.o obj/tinyxml.o obj/tinystr.o obj/tinyxmlerror.o obj/tinyxmlparser.o obj/processXml.o obj/zstring.o clean: find obj -type f -exec rm {} \; diff --git a/Makefile_Win.cmd b/Makefile_Win.cmd index 4eb4c97e..965143f4 100644 --- a/Makefile_Win.cmd +++ b/Makefile_Win.cmd @@ -7,29 +7,6 @@ set mingw=C:\Programme\C++\MinGW\bin set parameters=-Wall -pipe -mthreads -D__GNUWIN32__ -DwxUSE_UNICODE -D__WXMSW__ -DFFS_WIN -O3 -DNDEBUG -DTIXML_USE_STL path=%path%;%mingw% if not exist obj md obj -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\application.cpp -o obj\application.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\algorithm.cpp -o obj\algorithm.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\comparison.cpp -o obj\comparison.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\synchronization.cpp -o obj\synchronization.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\globalFunctions.cpp -o obj\globalFunctions.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\multithreading.cpp -o obj\multithreading.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\statusHandler.cpp -o obj\statusHandler.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\fileHandling.cpp -o obj\fileHandling.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\ui\guiGenerated.cpp -o obj\GUI_Generated.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\ui\mainDialog.cpp -o obj\MainDialog.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\ui\syncDialog.cpp -o obj\SyncDialog.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\customGrid.cpp -o obj\CustomGrid.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\resources.cpp -o obj\Resources.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\misc.cpp -o obj\misc.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\ui\smallDialogs.cpp -o obj\SmallDialogs.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\tinyxml\tinyxml.cpp -o obj\tinyxml.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\tinyxml\tinystr.cpp -o obj\tinystr.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\tinyxml\tinyxmlerror.cpp -o obj\tinyxmlerror.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\tinyxml\tinyxmlparser.cpp -o obj\tinyxmlparser.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\processXml.cpp -o obj\processXml.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\zstring.cpp -o obj\zstring.o -mingw32-g++.exe %parameters% -I%widgets%\include -I%widgets%\contrib\include -I%widgetslib% -c %sources%\library\customButton.cpp -o obj\customButton.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\algorithm.o obj\comparison.o obj\synchronization.o obj\globalFunctions.o obj\multithreading.o obj\statusHandler.o obj\fileHandling.o obj\customButton.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 obj\tinyxml.o obj\tinystr.o obj\tinyxmlerror.o obj\tinyxmlparser.o obj\processXml.o obj\zstring.o -s -mthreads -lwxmsw28u_adv -lwxmsw28u_core -lwxbase28u -lwxpng -lwxzlib -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lcomctl32 -lwsock32 -lodbc32 -mwindows +mingw32-g++.exe -L%widgets%\lib\gcc_lib -o FreeFileSync.exe obj\application.o obj\algorithm.o obj\comparison.o obj\synchronization.o obj\globalFunctions.o obj\checkVersion.o obj\multithreading.o obj\statusHandler.o obj\fileHandling.o obj\customButton.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 obj\tinyxml.o obj\tinystr.o obj\tinyxmlerror.o obj\tinyxmlparser.o obj\processXml.o obj\zstring.o -s -mthreads -lwxmsw28u_adv -lwxmsw28u_core -lwxbase28u_net -lwxbase28u -lwxpng -lwxzlib -lkernel32 -lws2_32 -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.16 +FreeFileSync v1.17 ------------------ Usage @@ -13,13 +13,14 @@ Key Features 2. No limitations: An arbitrary number of files can be synchronized. 3. Unicode support. 4. Network support. -5. Lean & easily accessible UI: Highly optimized for speed and huge sets of data. -6. Algorithms coded in C++ completely. -7. Progress indicators are updated only every 100ms for optimal performance! -8. Subfolders are also synchronized, including empty folders. -9. Support for multiple folder pairs -10. Create Batch Jobs for automated synchronization with or without GUI. -11. Focus on usability: +5. Full support for Windows/Linux symbolic links. +6. Lean & easily accessible UI: Highly optimized for speed and huge sets of data. +7. Algorithms coded in C++ completely. +8. Progress indicators are updated only every 100ms for optimal performance! +9. Subfolders are also synchronized, including empty folders. +10. Support for multiple folder pairs +11. Create Batch Jobs for automated synchronization with or without GUI. +12. 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. @@ -31,19 +32,20 @@ Key Features - 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. -12. Support for filesizes larger than 4 GB. -13. Option to move files to Recycle Bin instead of deleting/overwriting them. -14. Automatically ignore directories "\RECYCLER" and "\System Volume Information" when comparing and sync'ing. (Windows only) -15. Localized versions for many languages are available. -16. Delete before copy: Avoid disc space shortages with large sync-operations. -17. Based on wxWidgets framework => Portable to many operating systems. -18. Filter functionality to include/exclude files from synchronization (without re-compare!). -19. Include/exclude specific files from synchronization manually. -20. Create sync jobs via GUI to synchronize automatically (can be scheduled or executed directly). -21. Handle daylight saving time changes on FAT/FAT32 volumes correctly -22. Portable version (.zip) available -23. No Windows registry entries for portable version -24. Support for \\?\ path prefix for unrestricted path length (windows only) +13. Support for filesizes larger than 4 GB. +14. Option to move files to Recycle Bin instead of deleting/overwriting them. +15. Automatically ignore directories "\RECYCLER" and "\System Volume Information" when comparing and sync'ing. (Windows only) +16. Localized versions for many languages are available. +17. Delete before copy: Avoid disc space shortages with large sync-operations. +18. Based on wxWidgets framework => Portable to many operating systems. +19. Filter functionality to include/exclude files from synchronization (without re-compare!). +20. Include/exclude specific files from synchronization manually. +21. Create sync jobs via GUI to synchronize automatically (can be scheduled or executed directly). +22. Handle daylight saving time changes on FAT/FAT32 volumes correctly. +23. Portable version (.zip) available. +24. No Windows registry entries for portable version. +25. Support for \\?\ path prefix for unrestricted path length. (windows only) +26. Check for updates from within FreeFileSync. Advanced topics diff --git a/Resources.dat b/Resources.dat Binary files differindex 39fe68d3..cd5fa6e0 100644 --- a/Resources.dat +++ b/Resources.dat diff --git a/algorithm.cpp b/algorithm.cpp index c245e5ca..00357e9d 100644 --- a/algorithm.cpp +++ b/algorithm.cpp @@ -6,7 +6,11 @@ #ifdef FFS_WIN #include <wx/msw/wrapwin.h> //includes "windows.h" -#endif //FFS_WIN + +#elif defined FFS_LINUX +#include <string.h> +#include <errno.h> +#endif using namespace FreeFileSync; @@ -68,8 +72,7 @@ wxString FreeFileSync::formatFilesizeToShortString(const double filesize) switch (length) { case 0: - temp = _("Error"); - break; + return _("Error"); case 1: temp = wxString(wxT("0")) + GlobalResources::DECIMAL_POINT + wxT("0") + temp; break; //0,01 @@ -388,8 +391,6 @@ void FreeFileSync::excludeAllRowsOnGrid(FileCompareResult& currentGridData) template <bool searchLeftSide> void addSubElementsOneSide(const FileCompareResult& grid, const FileCompareLine& relevantRow, std::set<int>& subElements) { - Zstring relevantDirectory; - const FileDescrLine* fileDescr = NULL; //get descriptor for file to be deleted; evaluated at compile time if (searchLeftSide) fileDescr = &relevantRow.fileDescrLeft; @@ -397,21 +398,22 @@ void addSubElementsOneSide(const FileCompareResult& grid, const FileCompareLine& fileDescr = &relevantRow.fileDescrRight; if (fileDescr->objType == FileDescrLine::TYPE_DIRECTORY) - relevantDirectory = fileDescr->relativeName + GlobalResources::FILE_NAME_SEPARATOR; //FILE_NAME_SEPARATOR needed to exclude subfile/dirs only - else - return; - - for (FileCompareResult::const_iterator i = grid.begin(); i != grid.end(); ++i) { - if (searchLeftSide) //evaluated at compile time - { - if (i->fileDescrLeft.relativeName.StartsWith(relevantDirectory)) - subElements.insert(i - grid.begin()); - } - else + Zstring relevantDirectory(fileDescr->relativeName.c_str(), fileDescr->relativeName.length()); + relevantDirectory += GlobalResources::FILE_NAME_SEPARATOR; //FILE_NAME_SEPARATOR needed to exclude subfile/dirs only + + for (FileCompareResult::const_iterator i = grid.begin(); i != grid.end(); ++i) { - if (i->fileDescrRight.relativeName.StartsWith(relevantDirectory)) - subElements.insert(i - grid.begin()); + if (searchLeftSide) //evaluated at compile time + { + if (i->fileDescrLeft.relativeName.StartsWith(relevantDirectory)) + subElements.insert(i - grid.begin()); + } + else + { + if (i->fileDescrRight.relativeName.StartsWith(relevantDirectory)) + subElements.insert(i - grid.begin()); + } } } } @@ -702,18 +704,17 @@ void writeFourDigitNumber(unsigned int number, wxChar*& position) } -wxString FreeFileSync::utcTimeToLocalString(const time_t utcTime) +wxString FreeFileSync::utcTimeToLocalString(const wxLongLong& utcTime) { #ifdef FFS_WIN - //convert ansi C time to FILETIME - wxULongLong fileTimeLong(utcTime); - fileTimeLong += wxULongLong(2, 3054539008UL); //timeshift between ansi C time and FILETIME in seconds == 11644473600s + wxLongLong fileTimeLong(utcTime); + fileTimeLong += wxLongLong(2, 3054539008UL); //timeshift between ansi C time and FILETIME in seconds == 11644473600s fileTimeLong *= 10000000; FILETIME lastWriteTimeUtc; - lastWriteTimeUtc.dwLowDateTime = fileTimeLong.GetLo(); - lastWriteTimeUtc.dwHighDateTime = fileTimeLong.GetHi(); + lastWriteTimeUtc.dwLowDateTime = fileTimeLong.GetLo(); //GetLo() returns unsigned + lastWriteTimeUtc.dwHighDateTime = unsigned(fileTimeLong.GetHi()); //GetHi() returns signed FILETIME localFileTime; if (FileTimeToLocalFileTime( //convert to local time @@ -751,7 +752,8 @@ wxString FreeFileSync::utcTimeToLocalString(const time_t utcTime) #elif defined FFS_LINUX tm* timeinfo; - timeinfo = localtime(&utcTime); //convert to local time + const time_t fileTime = utcTime.ToLong(); + timeinfo = localtime(&fileTime); //convert to local time char buffer[50]; strftime(buffer, 50, "%Y-%m-%d %H:%M:%S", timeinfo); @@ -761,7 +763,7 @@ wxString FreeFileSync::utcTimeToLocalString(const time_t utcTime) #ifdef FFS_WIN -Zstring FreeFileSync::getLastErrorFormatted(const unsigned long lastError) //try to get additional windows error information +Zstring FreeFileSync::getLastErrorFormatted(const unsigned long lastError) //try to get additional Windows error information { unsigned long lastErrorCode = lastError; //determine error code if none was specified @@ -775,9 +777,20 @@ Zstring FreeFileSync::getLastErrorFormatted(const unsigned long lastError) //try output += Zstring(wxT(": ")) + buffer; return output; } -#endif +#elif defined FFS_LINUX +Zstring FreeFileSync::getLastErrorFormatted(const int lastError) //try to get additional Linux error information +{ + int lastErrorCode = lastError; + //determine error code if none was specified + if (lastErrorCode == 0) + lastErrorCode = errno; + Zstring output = Zstring(wxT("Linux Error Code ")) + wxString::Format(wxT("%i"), lastErrorCode).c_str(); + output += Zstring(wxT(": ")) + strerror(lastErrorCode); + return output; +} +#endif /*Statistical theory: detect daylight saving time (DST) switch by comparing files that exist on both sides (and have same filesizes). If there are "enough" that have a shift by +-1h then assert that DST switch occured. diff --git a/algorithm.h b/algorithm.h index ab4129db..e198906c 100644 --- a/algorithm.h +++ b/algorithm.h @@ -35,7 +35,7 @@ namespace FreeFileSync void includeAllRowsOnGrid(FileCompareResult& currentGridData); void excludeAllRowsOnGrid(FileCompareResult& currentGridData); - wxString utcTimeToLocalString(const time_t utcTime); + wxString utcTimeToLocalString(const wxLongLong& utcTime); //enhanced binary search template: returns an iterator template <class ForwardIterator, class T> @@ -49,15 +49,10 @@ namespace FreeFileSync } #ifdef FFS_WIN - Zstring getLastErrorFormatted(const unsigned long lastError = 0); //try to get additional windows error information - -//detect if FAT/FAT32 drive needs a +-1h time shift after daylight saving time (DST) switch due to known windows bug: -//http://www.codeproject.com/KB/datetime/dstbugs.aspx - -//NO performance issue: debug build: 50 ms for 200000 files processed in for-loop - void checkForDSTChange(const FileCompareResult& gridData, const std::vector<FolderPair>& directoryPairsFormatted, int& timeShift, wxString& driveName); -#endif //FFS_WIN - + Zstring getLastErrorFormatted(const unsigned long lastError = 0); //try to get additional Windows error information +#elif defined FFS_LINUX + Zstring getLastErrorFormatted(const int lastError = 0); //try to get additional Linux error information +#endif } diff --git a/comparison.cpp b/comparison.cpp index f90b47de..43191d38 100644 --- a/comparison.cpp +++ b/comparison.cpp @@ -8,6 +8,7 @@ #include "library/multithreading.h" #include "algorithm.h" #include <wx/thread.h> +#include <memory> #ifdef FFS_WIN #include <wx/msw/wrapwin.h> //includes "windows.h" @@ -37,12 +38,12 @@ public: } - wxDirTraverseResult GetAllFilesFull::OnFile(const Zstring& fullFileName, const FileInfo& details) //virtual impl. + wxDirTraverseResult OnFile(const Zstring& fullFileName, const FileInfo& details) //virtual impl. { FileDescrLine fileDescr; fileDescr.fullName = fullFileName; fileDescr.directory = directory; - fileDescr.relativeName = fullFileName.substr(prefixLength); + fileDescr.relativeName = fullFileName.zsubstr(prefixLength); fileDescr.lastWriteTimeRaw = details.lastWriteTimeRaw; fileDescr.fileSize = details.fileSize; fileDescr.objType = FileDescrLine::TYPE_FILE; @@ -72,7 +73,7 @@ public: } - wxDirTraverseResult GetAllFilesFull::OnDir(const Zstring& fullDirName) //virtual impl. + wxDirTraverseResult OnDir(const Zstring& fullDirName) //virtual impl. { #ifdef FFS_WIN if ( fullDirName.EndsWith(wxT("\\RECYCLER")) || @@ -83,7 +84,7 @@ public: FileDescrLine fileDescr; fileDescr.fullName = fullDirName; fileDescr.directory = directory; - fileDescr.relativeName = fullDirName.substr(prefixLength); + fileDescr.relativeName = fullDirName.zsubstr(prefixLength); fileDescr.lastWriteTimeRaw = 0; //irrelevant for directories fileDescr.fileSize = wxULongLong(0); //currently used by getBytesToTransfer fileDescr.objType = FileDescrLine::TYPE_DIRECTORY; @@ -113,7 +114,7 @@ public: } - wxDirTraverseResult GetAllFilesFull::OnError(const Zstring& errorText) //virtual impl. + wxDirTraverseResult OnError(const Zstring& errorText) //virtual impl. { while (true) { @@ -160,8 +161,8 @@ struct DescrBufferLine class FreeFileSync::DirectoryDescrBuffer //buffer multiple scans of the same directories { public: - DirectoryDescrBuffer(const bool traverseSymbolicLinks, StatusHandler* statusUpdater) : - m_traverseSymbolicLinks(traverseSymbolicLinks), + DirectoryDescrBuffer(const bool traverseDirectorySymlinks, StatusHandler* statusUpdater) : + m_traverseDirectorySymlinks(traverseDirectorySymlinks), m_statusUpdater(statusUpdater) {} ~DirectoryDescrBuffer() @@ -188,11 +189,9 @@ public: bufferEntry.directoryDesc = new DirectoryDescrType; buffer.insert(bufferEntry); //exception safety: insert into buffer right after creation! - bufferEntry.directoryDesc->reserve(400000); //reserve space for up to 400000 files to avoid too many vector reallocations - //get all files and folders from directoryFormatted (and subdirectories) GetAllFilesFull traverser(*bufferEntry.directoryDesc, directoryFormatted, m_statusUpdater); //exceptions may be thrown! - traverseInDetail(directoryFormatted, m_traverseSymbolicLinks, &traverser); + traverseInDetail(directoryFormatted, m_traverseDirectorySymlinks, &traverser); return bufferEntry.directoryDesc; } @@ -201,7 +200,7 @@ public: private: std::set<DescrBufferLine> buffer; - const bool m_traverseSymbolicLinks; + const bool m_traverseDirectorySymlinks; StatusHandler* m_statusUpdater; }; @@ -245,7 +244,7 @@ bool dependencyExists(const std::vector<Zstring>& folders, const Zstring& newFol for (std::vector<Zstring>::const_iterator i = folders.begin(); i != folders.end(); ++i) if (newFolder.StartsWith(*i) || i->StartsWith(newFolder)) { - warningMessage = wxString(_("Directories are dependent! Be careful when setting up synchronization rules:\n")) + + warningMessage = wxString(_("Directories are dependent! Be careful when setting up synchronization rules:")) + wxT("\n") + wxT("\"") + *i + wxT("\",\n") + wxT("\"") + newFolder + wxT("\""); return true; @@ -278,11 +277,11 @@ bool foldersHaveDependencies(const std::vector<FolderPair>& folderPairs, wxStrin CompareProcess::CompareProcess(const bool traverseSymLinks, - const bool handleDstOnFat32Drives, + const unsigned fileTimeTol, bool& warningDependentFolders, StatusHandler* handler) : - traverseSymbolicLinks(traverseSymLinks), - handleDstOnFat32(handleDstOnFat32Drives), + traverseDirectorySymlinks(traverseSymLinks), + fileTimeTolerance(fileTimeTol), m_warningDependentFolders(warningDependentFolders), statusUpdater(handler), txtComparingContentOfFiles(_("Comparing content of files %x")) @@ -312,13 +311,36 @@ struct MemoryAllocator delete [] buffer2; } - static const unsigned int bufferSize = 1024 * 512; //512 kb seems to be the perfect buffer size + static const unsigned int bufferSize = 512 * 1024; //512 kb seems to be the perfect buffer size unsigned char* buffer1; unsigned char* buffer2; }; -bool filesHaveSameContent(const Zstring& filename1, const Zstring& filename2) +//callback functionality +struct CallBackData +{ + StatusHandler* handler; + wxULongLong bytesComparedLast; +}; + +//callback function for status updates whily comparing +typedef void (*CompareCallback)(const wxULongLong&, void*); + + +void compareContentCallback(const wxULongLong& totalBytesTransferred, void* data) +{ //called every 512 kB + CallBackData* sharedData = static_cast<CallBackData*>(data); + + //inform about the (differential) processed amount of data + sharedData->handler->updateProcessedData(0, (totalBytesTransferred - sharedData->bytesComparedLast).ToDouble()); + sharedData->bytesComparedLast = totalBytesTransferred; + + sharedData->handler->requestUiRefresh(); //exceptions may be thrown here! +} + + +bool filesHaveSameContent(const Zstring& filename1, const Zstring& filename2, CompareCallback callback, void* data) { static MemoryAllocator memory; @@ -330,16 +352,22 @@ bool filesHaveSameContent(const Zstring& filename1, const Zstring& filename2) if (!file2.IsOpened()) //NO cleanup necessary for (wxFFile) file1 throw FileError(Zstring(_("Error reading file:")) + wxT(" \"") + filename2 + wxT("\"")); + wxULongLong bytesCompared; do { - size_t length1 = file1.Read(memory.buffer1, memory.bufferSize); + const size_t length1 = file1.Read(memory.buffer1, memory.bufferSize); if (file1.Error()) throw FileError(Zstring(_("Error reading file:")) + wxT(" \"") + filename1 + wxT("\"")); - size_t length2 = file2.Read(memory.buffer2, memory.bufferSize); + const size_t length2 = file2.Read(memory.buffer2, memory.bufferSize); if (file2.Error()) throw FileError(Zstring(_("Error reading file:")) + wxT(" \"") + filename2 + wxT("\"")); if (length1 != length2 || memcmp(memory.buffer1, memory.buffer2, length1) != 0) return false; + + bytesCompared += length1 * 2; + + //send progress updates + callback(bytesCompared, data); } while (!file1.Eof()); @@ -350,6 +378,34 @@ bool filesHaveSameContent(const Zstring& filename1, const Zstring& filename2) } +bool filesHaveSameContentUpdating(const Zstring& filename1, const Zstring& filename2, const wxULongLong& totalBytesToCmp, StatusHandler* handler) +{ + CallBackData sharedData; + sharedData.handler = handler; +//data.bytesTransferredLast = //amount of bytes that have been compared and communicated to status handler + + bool sameContent = true; + try + { + sameContent = filesHaveSameContent(filename1, filename2, compareContentCallback, &sharedData); + } + catch (...) + { + //error situation: undo communication of processed amount of data + handler->updateProcessedData(0, sharedData.bytesComparedLast.ToDouble() * -1 ); + + throw; + } + + //inform about the (remaining) processed amount of data + handler->updateProcessedData(0, (totalBytesToCmp - sharedData.bytesComparedLast).ToDouble()); + + return sameContent; +} + + +/* OLD IMPLEMENTATION USING A WORKER THREAD + //handle execution of a method while updating the UI class UpdateWhileComparing : public UpdateWhileExecuting { @@ -380,7 +436,7 @@ private: }; -bool filesHaveSameContentMultithreaded(const Zstring& filename1, const Zstring& filename2, StatusHandler* updateClass) +bool filesHaveSameContentUpdating(const Zstring& filename1, const Zstring& filename2, const wxULongLong& totalBytesToCmp, StatusHandler* updateClass) { static UpdateWhileComparing cmpAndUpdate; //single instantiation: thread enters wait phase after each execution @@ -396,11 +452,14 @@ bool filesHaveSameContentMultithreaded(const Zstring& filename1, const Zstring& if (!cmpAndUpdate.success) throw FileError(cmpAndUpdate.errorMessage); + //inform about the processed amount of data + updateClass->updateProcessedData(0, totalBytesToCmp.ToDouble()); + return cmpAndUpdate.sameContent; -} +}*/ -void calcTotalDataForCompare(int& objectsTotal, double& dataTotal, const FileCompareResult& grid, const std::set<int>& rowsToCompare) +void getBytesToCompare(int& objectsTotal, double& dataTotal, const FileCompareResult& grid, const std::set<int>& rowsToCompare) { dataTotal = 0; @@ -417,7 +476,7 @@ void calcTotalDataForCompare(int& objectsTotal, double& dataTotal, const FileCom inline -bool sameFileTime(const time_t a, const time_t b, const time_t tolerance) +bool sameFileTime(const wxLongLong& a, const wxLongLong& b, const unsigned tolerance) { if (a < b) return b - a <= tolerance; @@ -434,6 +493,8 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPair>& director wxLogNull noWxLogs; //hide wxWidgets log messages in release build #endif + //PERF_START; + //format directory pairs std::vector<FolderPair> directoryPairsFormatted; @@ -505,23 +566,13 @@ void CompareProcess::compareByTimeSize(const std::vector<FolderPair>& directoryP //do basis scan: only result lines of type FILE_UNDEFINED (files that exist on both sides) need to be determined after this call this->performBaseComparison(*pair, output); - //add some tolerance if one of the folders is FAT/FAT32 - time_t tolerance = 0; -#ifdef FFS_WIN - if (handleDstOnFat32 && (isFatDrive(pair->leftDirectory) || isFatDrive(pair->rightDirectory))) - tolerance = FILE_TIME_PRECISION + 3600; //tolerate filetime diff <= 1 h to handle daylight saving time issues - else - tolerance = FILE_TIME_PRECISION; -#elif defined FFS_LINUX - tolerance = FILE_TIME_PRECISION; -#endif //categorize files that exist on both sides for (FileCompareResult::iterator i = output.begin() + tableSizeOld; i != output.end(); ++i) { if (i->cmpResult == FILE_UNDEFINED) { //last write time may differ by up to 2 seconds (NTFS vs FAT32) - if (sameFileTime(i->fileDescrLeft.lastWriteTimeRaw, i->fileDescrRight.lastWriteTimeRaw, tolerance)) + if (sameFileTime(i->fileDescrLeft.lastWriteTimeRaw, i->fileDescrRight.lastWriteTimeRaw, fileTimeTolerance)) { if (i->fileDescrLeft.fileSize == i->fileDescrRight.fileSize) i->cmpResult = FILE_EQUAL; @@ -545,6 +596,8 @@ void CompareProcess::compareByTimeSize(const std::vector<FolderPair>& directoryP void CompareProcess::compareByContent(const std::vector<FolderPair>& directoryPairsFormatted, FileCompareResult& output) { + //PERF_START; + //inform about the total amount of data that will be processed from now on statusUpdater->initNewProcess(-1, 0, StatusHandler::PROCESS_SCANNING); //it's not known how many files will be scanned => -1 objects @@ -573,7 +626,7 @@ void CompareProcess::compareByContent(const std::vector<FolderPair>& directoryPa int objectsTotal = 0; double dataTotal = 0; - calcTotalDataForCompare(objectsTotal, dataTotal, output, rowsToCompareBytewise); + getBytesToCompare(objectsTotal, dataTotal, output, rowsToCompareBytewise); statusUpdater->initNewProcess(objectsTotal, dataTotal, StatusHandler::PROCESS_COMPARING_CONTENT); @@ -585,7 +638,7 @@ void CompareProcess::compareByContent(const std::vector<FolderPair>& directoryPa FileCompareLine& gridline = output[*i]; Zstring statusText = txtComparingContentOfFiles; - statusText.Replace(wxT("%x"), gridline.fileDescrLeft.relativeName, false); + statusText.Replace(wxT("%x"), gridline.fileDescrLeft.relativeName.c_str(), false); statusUpdater->updateStatusText(statusText); //check files that exist in left and right model but have different content @@ -596,12 +649,12 @@ void CompareProcess::compareByContent(const std::vector<FolderPair>& directoryPa try { - if (filesHaveSameContentMultithreaded(gridline.fileDescrLeft.fullName, gridline.fileDescrRight.fullName, statusUpdater)) + if (filesHaveSameContentUpdating(gridline.fileDescrLeft.fullName, gridline.fileDescrRight.fullName, gridline.fileDescrLeft.fileSize * 2, statusUpdater)) gridline.cmpResult = FILE_EQUAL; else gridline.cmpResult = FILE_DIFFERENT; - statusUpdater->updateProcessedData(2, (gridline.fileDescrLeft.fileSize * 2).ToDouble()); + statusUpdater->updateProcessedData(2, 0); //processed data is communicated in subfunctions! break; } catch (FileError& error) @@ -694,7 +747,7 @@ void CompareProcess::performBaseComparison(const FolderPair& pair, FileCompareRe } //PERF_STOP; - //reserve some space to avoid too many vector reallocations + //reserve some space to avoid too many vector reallocations: doesn't make much sense for multiple folder pairs, but doesn't hurt either output.reserve(output.size() + unsigned(std::max(directoryLeft->size(), directoryRight->size()) * 1.2)); //begin base comparison diff --git a/comparison.h b/comparison.h index 8e6bb9d3..204ff7ec 100644 --- a/comparison.h +++ b/comparison.h @@ -13,7 +13,7 @@ namespace FreeFileSync { public: CompareProcess(const bool traverseSymLinks, - const bool handleDstOnFat32Drives, + const unsigned fileTimeTol, bool& warningDependentFolders, StatusHandler* handler); @@ -34,8 +34,8 @@ namespace FreeFileSync //buffer accesses to the same directories; useful when multiple folder pairs are used DirectoryDescrBuffer* descriptionBuffer; - const bool traverseSymbolicLinks; - const bool handleDstOnFat32; + const bool traverseDirectorySymlinks; + const unsigned fileTimeTolerance; //max allowed file time deviation bool& m_warningDependentFolders; StatusHandler* statusUpdater; diff --git a/library/CustomGrid.cpp b/library/CustomGrid.cpp index cf9adc6e..b8737343 100644 --- a/library/CustomGrid.cpp +++ b/library/CustomGrid.cpp @@ -4,6 +4,12 @@ #include <wx/dc.h> #include "../algorithm.h" #include "resources.h" +#include <typeinfo> + +#ifdef FFS_WIN +#include <wx/icon.h> +#include <wx/msw/wrapwin.h> //includes "windows.h" +#endif // FFS_WIN const unsigned int MIN_ROW_COUNT = 15; @@ -93,35 +99,32 @@ public: //update dimensions of grid: no need for InsertRows, AppendRows, DeleteRows anymore!!! void updateGridSizes() { - if (gridRefUI) - { - const int currentNrRows = GetNumberRows(); + const int currentNrRows = GetNumberRows(); - if (lastNrRows < currentNrRows) + if (lastNrRows < currentNrRows) + { + if (GetView()) { - if (GetView()) - { - wxGridTableMessage msg(this, - wxGRIDTABLE_NOTIFY_ROWS_APPENDED, - currentNrRows - lastNrRows); + wxGridTableMessage msg(this, + wxGRIDTABLE_NOTIFY_ROWS_APPENDED, + currentNrRows - lastNrRows); - GetView()->ProcessTableMessage( msg ); - } + GetView()->ProcessTableMessage( msg ); } - else if (lastNrRows > currentNrRows) + } + else if (lastNrRows > currentNrRows) + { + if (GetView()) { - if (GetView()) - { - wxGridTableMessage msg(this, - wxGRIDTABLE_NOTIFY_ROWS_DELETED, - 0, - lastNrRows - currentNrRows); + wxGridTableMessage msg(this, + wxGRIDTABLE_NOTIFY_ROWS_DELETED, + 0, + lastNrRows - currentNrRows); - GetView()->ProcessTableMessage( msg ); - } + GetView()->ProcessTableMessage( msg ); } - lastNrRows = currentNrRows; } + lastNrRows = currentNrRows; const int currentNrCols = GetNumberCols(); @@ -203,6 +206,17 @@ public: } + const FileCompareLine* getRawData(const unsigned int row) + { + if (gridRefUI && row < gridRefUI->size()) + { + const FileCompareLine& cmpLine = (*gridData)[(*gridRefUI)[row]]; + return &cmpLine; + } + return NULL; + } + + protected: virtual const wxColour& getRowColor(int row) = 0; //rows that are filtered out are shown in different color @@ -277,9 +291,9 @@ public: case xmlAccess::FULL_NAME: return gridLine.fileDescrLeft.fullName.c_str(); case xmlAccess::FILENAME: //filename - return gridLine.fileDescrLeft.relativeName.AfterLast(GlobalResources::FILE_NAME_SEPARATOR).c_str(); + return wxString(gridLine.fileDescrLeft.relativeName.c_str()).AfterLast(GlobalResources::FILE_NAME_SEPARATOR); case xmlAccess::REL_PATH: //relative path - return gridLine.fileDescrLeft.relativeName.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR).c_str(); + return wxString(gridLine.fileDescrLeft.relativeName.c_str()).BeforeLast(GlobalResources::FILE_NAME_SEPARATOR); case xmlAccess::SIZE: //file size { wxString fileSize = gridLine.fileDescrLeft.fileSize.ToString(); //tmp string @@ -304,6 +318,7 @@ public: { lastNrCols = 1; //ensure CustomGridTable::updateGridSizes() is working correctly } + ~CustomGridTableMiddle() {} //virtual impl. @@ -313,21 +328,6 @@ public: } - int selectedForSynchronization(const unsigned int row) // 0 == false, 1 == true, -1 == not defined - { - if (gridRefUI && row < gridRefUI->size()) - { - const FileCompareLine cmpLine = (*gridData)[(*gridRefUI)[row]]; - - if (cmpLine.selectedForSynchronization) - return 1; - else - return 0; - } - return -1; - } - - virtual const wxColour& getRowColor(int row) //rows that are filtered out are shown in different color { if (gridRefUI && unsigned(row) < gridRefUI->size()) @@ -446,9 +446,9 @@ public: case xmlAccess::FULL_NAME: return gridLine.fileDescrRight.fullName.c_str(); case xmlAccess::FILENAME: //filename - return gridLine.fileDescrRight.relativeName.AfterLast(GlobalResources::FILE_NAME_SEPARATOR).c_str(); + return wxString(gridLine.fileDescrRight.relativeName.c_str()).AfterLast(GlobalResources::FILE_NAME_SEPARATOR); case xmlAccess::REL_PATH: //relative path - return gridLine.fileDescrRight.relativeName.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR).c_str(); + return wxString(gridLine.fileDescrRight.relativeName.c_str()).BeforeLast(GlobalResources::FILE_NAME_SEPARATOR); case xmlAccess::SIZE: //file size { wxString fileSize = gridLine.fileDescrRight.fileSize.ToString(); //tmp string @@ -478,7 +478,7 @@ CustomGrid::CustomGrid(wxWindow *parent, wxGrid(parent, id, pos, size, style, name), leadGrid(NULL), scrollbarsEnabled(true), - m_gridLeft(NULL), m_gridRight(NULL), m_gridMiddle(NULL), + m_gridLeft(NULL), m_gridMiddle(NULL), m_gridRight(NULL), gridDataTable(NULL), currentSortColumn(-1), sortMarker(NULL) @@ -487,10 +487,24 @@ CustomGrid::CustomGrid(wxWindow *parent, wxColour darkBlue(40, 35, 140); SetSelectionBackground(darkBlue); SetSelectionForeground(*wxWHITE); + + //enhance grid functionality; identify leading grid by keyboard input or scroll action + Connect(wxEVT_KEY_DOWN, wxEventHandler(CustomGrid::onGridAccess), NULL, this); + Connect(wxEVT_SCROLLWIN_TOP, wxEventHandler(CustomGrid::onGridAccess), NULL, this); + Connect(wxEVT_SCROLLWIN_BOTTOM, wxEventHandler(CustomGrid::onGridAccess), NULL, this); + Connect(wxEVT_SCROLLWIN_LINEUP, wxEventHandler(CustomGrid::onGridAccess), NULL, this); + Connect(wxEVT_SCROLLWIN_LINEDOWN, wxEventHandler(CustomGrid::onGridAccess), NULL, this); + Connect(wxEVT_SCROLLWIN_PAGEUP, wxEventHandler(CustomGrid::onGridAccess), NULL, this); + Connect(wxEVT_SCROLLWIN_PAGEDOWN, wxEventHandler(CustomGrid::onGridAccess), NULL, this); + Connect(wxEVT_SCROLLWIN_THUMBTRACK, wxEventHandler(CustomGrid::onGridAccess), NULL, this); + Connect(wxEVT_SCROLLWIN_THUMBRELEASE, wxEventHandler(CustomGrid::onGridAccess), NULL, this); + Connect(wxEVT_GRID_LABEL_LEFT_CLICK, wxEventHandler(CustomGrid::onGridAccess), NULL, this); + GetGridWindow()->Connect(wxEVT_LEFT_DOWN, wxEventHandler(CustomGrid::onGridAccess), NULL, this); } -void CustomGrid::initSettings(bool enableScrollbars, +void CustomGrid::initSettings(const bool enableScrollbars, + const bool showFileIcons, CustomGrid* gridLeft, CustomGrid* gridRight, CustomGrid* gridMiddle, @@ -508,6 +522,221 @@ void CustomGrid::initSettings(bool enableScrollbars, //set underlying grid data assert(gridDataTable); gridDataTable->setGridDataTable(gridRefUI, gridData); + + this->initGridRenderer(showFileIcons); + + GetGridWindow()->Connect(wxEVT_ENTER_WINDOW, wxEventHandler(CustomGrid::adjustGridHeights), NULL, this); +} + + +inline +bool gridsShouldBeCleared(const wxEvent& event) +{ + try + { + const wxMouseEvent& mouseEvent = dynamic_cast<const wxMouseEvent&> (event); + + if (mouseEvent.ControlDown() || mouseEvent.ShiftDown()) + return false; + + if (mouseEvent.ButtonDown(wxMOUSE_BTN_LEFT)) + return true; + + return false; + } + catch (std::bad_cast&) {} + + try + { + const wxKeyEvent& keyEvent = dynamic_cast<const wxKeyEvent&> (event); + + if (keyEvent.ControlDown() || keyEvent.ShiftDown()) + return false; + + switch (keyEvent.GetKeyCode()) + { + case WXK_SPACE: + case WXK_TAB: + case WXK_RETURN: + case WXK_ESCAPE: + case WXK_NUMPAD_ENTER: + case WXK_LEFT: + case WXK_UP: + case WXK_RIGHT: + case WXK_DOWN: + case WXK_PAGEUP: + case WXK_PAGEDOWN: + case WXK_NUMPAD_PAGEUP: + case WXK_NUMPAD_PAGEDOWN: + case WXK_HOME: + case WXK_END: + case WXK_NUMPAD_HOME: + case WXK_NUMPAD_END: + return true; + + default: + return false; + } + } + catch (std::bad_cast&) {} + + return false; +} + + +inline +void moveCursorWhileSelecting(const int anchor, const int oldPos, const int newPos, wxGrid* grid) +{ //note: all positions are valid in this context! + + grid->SetGridCursor(newPos, grid->GetGridCursorCol()); + grid->MakeCellVisible(newPos, grid->GetGridCursorCol()); + + if (oldPos < newPos) + { + for (int i = oldPos; i < std::min(anchor, newPos); ++i) + grid->DeselectRow(i); //remove selection + + for (int i = std::max(oldPos, anchor); i <= newPos; ++i) + grid->SelectRow(i, true); //add to selection + } + else + { + for (int i = std::max(newPos, anchor) + 1; i <= oldPos; ++i) + grid->DeselectRow(i); //remove selection + + for (int i = newPos; i <= std::min(oldPos, anchor); ++i) + grid->SelectRow(i, true); //add to selection + } +} + + +inline +void additionalGridCommands(wxEvent& event, wxGrid* grid) +{ + static int anchorRow = 0; + assert(grid->GetNumberRows() != 0); + + try + { + const wxKeyEvent& keyEvent = dynamic_cast<const wxKeyEvent&> (event); + + if (keyEvent.ShiftDown()) + { + //ensure cursorOldPos is always a valid row! + const int cursorOldPos = std::max(std::min(grid->GetGridCursorRow(), grid->GetNumberRows() - 1), 0); + + //support for shift + PageUp and shift + PageDown + switch (keyEvent.GetKeyCode()) + { + case WXK_UP: //move grid cursor also + { + const int cursorNewPos = std::max(cursorOldPos - 1, 0); + moveCursorWhileSelecting(anchorRow, cursorOldPos, cursorNewPos, grid); + } + return; //no event.Skip() + + case WXK_DOWN: //move grid cursor also + { + const int cursorNewPos = std::min(cursorOldPos + 1, grid->GetNumberRows() - 1); + moveCursorWhileSelecting(anchorRow, cursorOldPos, cursorNewPos, grid); + } + return; //no event.Skip() + + case WXK_PAGEUP: + case WXK_NUMPAD_PAGEUP: + { + const int rowsPerPage = grid->GetGridWindow()->GetSize().GetHeight() / grid->GetDefaultRowSize(); + const int cursorNewPos = std::max(cursorOldPos - rowsPerPage, 0); + moveCursorWhileSelecting(anchorRow, cursorOldPos, cursorNewPos, grid); + } + return; //no event.Skip() + + case WXK_PAGEDOWN: + case WXK_NUMPAD_PAGEDOWN: + { + const int rowsPerPage = grid->GetGridWindow()->GetSize().GetHeight() / grid->GetDefaultRowSize(); + const int cursorNewPos = std::min(cursorOldPos + rowsPerPage, grid->GetNumberRows() - 1); + moveCursorWhileSelecting(anchorRow, cursorOldPos, cursorNewPos, grid); + } + return; //no event.Skip() + + case WXK_HOME: + case WXK_NUMPAD_HOME: + { + const int cursorNewPos = 0; + moveCursorWhileSelecting(anchorRow, cursorOldPos, cursorNewPos, grid); + } + return; //no event.Skip() + + case WXK_END: + case WXK_NUMPAD_END: + { + const int cursorNewPos = grid->GetNumberRows() - 1; + moveCursorWhileSelecting(anchorRow, cursorOldPos, cursorNewPos, grid); + } + return; //no event.Skip() + + } + } + else //button without shift is pressed + { + switch (keyEvent.GetKeyCode()) + { + case WXK_HOME: + case WXK_NUMPAD_HOME: + grid->SetGridCursor(0, grid->GetGridCursorCol()); + grid->MakeCellVisible(0, grid->GetGridCursorCol()); + return; //no event.Skip() + + case WXK_END: + case WXK_NUMPAD_END: + grid->SetGridCursor(grid->GetNumberRows() - 1, grid->GetGridCursorCol()); + grid->MakeCellVisible(grid->GetNumberRows() - 1, grid->GetGridCursorCol()); + return; //no event.Skip() + } + } + } + catch (std::bad_cast&) {} + + anchorRow = grid->GetGridCursorRow(); + event.Skip(); +} + + +void CustomGrid::onGridAccess(wxEvent& event) +{ + if (leadGrid != this) + { + leadGrid = this; + + //notify grids of new user focus + m_gridLeft->leadGrid = this; + m_gridMiddle->leadGrid = this; + m_gridRight->leadGrid = this; + + wxGrid::SetFocus(); + } + + if (gridsShouldBeCleared(event)) + { + m_gridLeft->ClearSelection(); + m_gridRight->ClearSelection(); + } + + //support for additional short-cuts + additionalGridCommands(event, this); //event.Skip is handled here! +} + + +const wxGrid* CustomGrid::getLeadGrid() +{ + return leadGrid; +} + + +bool CustomGrid::isLeadGrid() +{ + return leadGrid == static_cast<const wxGrid*>(this); } @@ -522,7 +751,7 @@ void CustomGrid::SetScrollbar(int orientation, int position, int thumbSize, int //workaround: ensure that all grids are properly aligned: add some extra window space to grids that have no horizontal scrollbar -void CustomGrid::adjustGridHeights() //m_gridLeft, m_gridRight, m_gridMiddle are not NULL in this context +void CustomGrid::adjustGridHeights(wxEvent& event) //m_gridLeft, m_gridRight, m_gridMiddle are not NULL in this context { int y1 = 0; int y2 = 0; @@ -540,17 +769,17 @@ void CustomGrid::adjustGridHeights() //m_gridLeft, m_gridRight, m_gridMiddle are if (leadGrid == m_gridLeft) //do not handle case (y1 == yMax) here!!! Avoid back coupling! m_gridLeft->SetMargins(0, 0); else if (y1 < yMax) - m_gridLeft->SetMargins(0, 50); + m_gridLeft->SetMargins(0, 30); if (leadGrid == m_gridRight) m_gridRight->SetMargins(0, 0); else if (y2 < yMax) - m_gridRight->SetMargins(0, 50); + m_gridRight->SetMargins(0, 30); if (leadGrid == m_gridMiddle) m_gridMiddle->SetMargins(0, 0); else if (y3 < yMax) - m_gridMiddle->SetMargins(0, 50); + m_gridMiddle->SetMargins(0, 30); m_gridLeft->ForceRefresh(); m_gridRight->ForceRefresh(); @@ -559,12 +788,6 @@ void CustomGrid::adjustGridHeights() //m_gridLeft, m_gridRight, m_gridMiddle are } -void CustomGrid::setLeadGrid(const wxGrid* newLead) -{ - leadGrid = newLead; -} - - void CustomGrid::updateGridSizes() { assert(gridDataTable); @@ -755,12 +978,99 @@ CustomGridLeft::CustomGridLeft(wxWindow *parent, CustomGrid(parent, id, pos, size, style, name) {} +template <bool leftSide, bool showFileIcons> +class GridCellRenderer : public wxGridCellStringRenderer +{ +public: + GridCellRenderer(CustomGridTable* gridDataTable) : m_gridDataTable(gridDataTable) {}; + + + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected) + { +#ifdef FFS_WIN + //############## show windows explorer file icons ###################### + + if (showFileIcons) //evaluate at compile time + { + const int ICON_SIZE = 16; //size in pixel + + if ( m_gridDataTable->getTypeAtPos(col) == xmlAccess::FILENAME && + rect.GetWidth() >= ICON_SIZE) + { + //retrieve grid data + const FileCompareLine* rowData = m_gridDataTable->getRawData(row); + if (rowData) //valid row + { + const DefaultChar* filename; + if (leftSide) //evaluate at compile time + filename = rowData->fileDescrLeft.fullName.c_str(); + else + filename = rowData->fileDescrRight.fullName.c_str(); + + if (*filename != 0) //test if filename is empty + { + // Get the file icon. + SHFILEINFO fileInfo; + if (SHGetFileInfo(filename, + 0, + &fileInfo, + sizeof(fileInfo), + SHGFI_ICON | SHGFI_SMALLICON)) + { + wxIcon icon; + icon.SetHICON((WXHICON)fileInfo.hIcon); + icon.SetSize(ICON_SIZE, ICON_SIZE); + + //clear area where icon will be placed + wxRect rectShrinked(rect); + rectShrinked.SetWidth(ICON_SIZE + 2); //add 2 pixel border + + dc.SetPen(*wxWHITE_PEN); + dc.SetBrush(*wxWHITE_BRUSH); + dc.DrawRectangle(rectShrinked); + + //draw icon + dc.DrawIcon(icon, rectShrinked.GetX() + 2, rectShrinked.GetY()); + + rectShrinked.SetWidth(rect.GetWidth() - ICON_SIZE - 2); + rectShrinked.SetX(rect.GetX() + ICON_SIZE + 2); + wxGridCellStringRenderer::Draw(grid, attr, dc, rectShrinked, row, col, isSelected); + + if (!DestroyIcon(fileInfo.hIcon)) + throw RuntimeException(wxString(wxT("Error deallocating Icon handle!\n\n")) + FreeFileSync::getLastErrorFormatted()); + + return; + } + } + } + } + } + //default + wxGridCellStringRenderer::Draw(grid, attr, dc, rect, row, col, isSelected); + +#elif defined FFS_LINUX + wxGridCellStringRenderer::Draw(grid, attr, dc, rect, row, col, isSelected); +#endif + } + +private: + CustomGridTable* m_gridDataTable; +}; + + + bool CustomGridLeft::CreateGrid(int numRows, int numCols, wxGrid::wxGridSelectionModes selmode) { //use custom wxGridTableBase class for management of large sets of formatted data. //This is done in CreateGrid instead of SetTable method since source code is generated and wxFormbuilder invokes CreatedGrid by default. gridDataTable = new CustomGridTableLeft(); SetTable(gridDataTable, true, wxGrid::wxGridSelectRows); //give ownership to wxGrid: gridDataTable is deleted automatically in wxGrid destructor + return true; } @@ -776,11 +1086,19 @@ void CustomGridLeft::DoPrepareDC(wxDC& dc) GetViewStart(&x, &y); m_gridMiddle->Scroll(-1, y); //scroll in y-direction only m_gridRight->Scroll(x, y); - adjustGridHeights(); //keep here to ensure m_gridLeft, m_gridRight, m_gridMiddle != NULL } } +void CustomGridLeft::initGridRenderer(const bool showFileIcons) +{ + if (showFileIcons) + SetDefaultRenderer(new GridCellRenderer<true, true>(gridDataTable)); //SetDefaultRenderer takes ownership! + else + SetDefaultRenderer(new GridCellRenderer<true, false>(gridDataTable)); +} + + //---------------------------------------------------------------------------------------- CustomGridMiddle::CustomGridMiddle(wxWindow *parent, wxWindowID id, @@ -788,17 +1106,77 @@ CustomGridMiddle::CustomGridMiddle(wxWindow *parent, const wxSize& size, long style, const wxString& name) : - CustomGrid(parent, id, pos, size, style, name) {} + CustomGrid(parent, id, pos, size, style, name) +{ + const wxString header = _("Legend"); + wxString toolTip = header + wxT("\n") + + wxString().Pad(header.Len(), wxChar('-')) + wxT("\n") + + _("<| file on left side only\n") + + _("|> file on right side only\n") + + _("<< left file is newer\n") + + _(">> right file is newer\n") + + _("!= files are different\n") + + _("== files are equal\n\n"); + GetGridWindow()->SetToolTip(toolTip); +} + + +class GridCellRendererMiddle : public wxGridCellStringRenderer +{ +public: + GridCellRendererMiddle(CustomGridTable* gridDataTable) : m_gridDataTable(gridDataTable) {}; + + + virtual void Draw(wxGrid& grid, + wxGridCellAttr& attr, + wxDC& dc, + const wxRect& rect, + int row, int col, + bool isSelected) + { + //retrieve grid data + const FileCompareLine* rowData = m_gridDataTable->getRawData(row); + if (!rowData) //no valid row + { + wxGridCellStringRenderer::Draw(grid, attr, dc, rect, row, col, isSelected); + return; + } + + const int shift = std::min(11 + 3, rect.GetWidth()); //11 is width of checkbox image + + wxRect rectShrinked(rect); + + //clean first block of rect that will receive image of checkbox + rectShrinked.SetWidth(shift); + dc.SetPen(*wxWHITE_PEN); + dc.SetBrush(*wxWHITE_BRUSH); + dc.DrawRectangle(rectShrinked); + + //print image into first block + rectShrinked.SetX(1); + if (rowData->selectedForSynchronization) + dc.DrawLabel(wxEmptyString, *globalResource.bitmapCheckBoxTrue, rectShrinked, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); + else + dc.DrawLabel(wxEmptyString, *globalResource.bitmapCheckBoxFalse, rectShrinked, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); + + //print second block (default): display compare result + rectShrinked.SetWidth(rect.GetWidth() - shift); + rectShrinked.SetX(shift); + wxGridCellStringRenderer::Draw(grid, attr, dc, rectShrinked, row, col, isSelected); + } + +private: + CustomGridTable* m_gridDataTable; +}; bool CustomGridMiddle::CreateGrid(int numRows, int numCols, wxGrid::wxGridSelectionModes selmode) { - CustomGridTableMiddle* newTable = new CustomGridTableMiddle(); - gridDataTable = newTable; + gridDataTable = new CustomGridTableMiddle(); SetTable(gridDataTable, true, wxGrid::wxGridSelectRows); //give ownership to wxGrid: gridDataTable is deleted automatically in wxGrid destructor //display checkboxes (representing bool values) if row is enabled for synchronization - SetDefaultRenderer(new GridCellRendererAddCheckbox(newTable)); //SetDefaultRenderer takes ownership! + SetDefaultRenderer(new GridCellRendererMiddle(gridDataTable)); //SetDefaultRenderer takes ownership! return true; } @@ -815,46 +1193,7 @@ void CustomGridMiddle::DoPrepareDC(wxDC& dc) GetViewStart(&x, &y); m_gridLeft->Scroll(-1, y); m_gridRight->Scroll(-1, y); - adjustGridHeights(); //keep here to ensure m_gridLeft, m_gridRight, m_gridMiddle != NULL - } -} - - -void CustomGridMiddle::GridCellRendererAddCheckbox::Draw(wxGrid& grid, - wxGridCellAttr& attr, - wxDC& dc, - const wxRect& rect, - int row, int col, - bool isSelected) -{ - const int selected = m_gridDataTable->selectedForSynchronization(row); - if (selected < 0) //no valid row - { - wxGridCellStringRenderer::Draw(grid, attr, dc, rect, row, col, isSelected); - return; } - - const int shift = std::min(11 + 3, rect.GetWidth()); //11 is width of checkbox image - - wxRect rectShrinked(rect); - - //clean first block of rect that will receive image of checkbox - rectShrinked.SetWidth(shift); - dc.SetPen(*wxWHITE_PEN); - dc.SetBrush(*wxWHITE_BRUSH); - dc.DrawRectangle(rectShrinked); - - //print image into first block - rectShrinked.SetX(1); - if (selected > 0) - dc.DrawLabel(wxEmptyString, *globalResource.bitmapCheckBoxTrue, rectShrinked, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); - else //if (selected == 0) -> redundant - dc.DrawLabel(wxEmptyString, *globalResource.bitmapCheckBoxFalse, rectShrinked, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); - - //print second block (default): display compare result - rectShrinked.SetWidth(rect.GetWidth() - shift); - rectShrinked.SetX(shift); - wxGridCellStringRenderer::Draw(grid, attr, dc, rectShrinked, row, col, isSelected); } @@ -872,6 +1211,7 @@ bool CustomGridRight::CreateGrid(int numRows, int numCols, wxGrid::wxGridSelecti { gridDataTable = new CustomGridTableRight(); SetTable(gridDataTable, true, wxGrid::wxGridSelectRows); //give ownership to wxGrid: gridDataTable is deleted automatically in wxGrid destructor + return true; } @@ -887,6 +1227,14 @@ void CustomGridRight::DoPrepareDC(wxDC& dc) GetViewStart(&x, &y); m_gridLeft->Scroll(x, y); m_gridMiddle->Scroll(-1, y); - adjustGridHeights(); //keep here to ensure m_gridLeft, m_gridRight, m_gridMiddle != NULL } } + + +void CustomGridRight::initGridRenderer(const bool showFileIcons) +{ + if (showFileIcons) + SetDefaultRenderer(new GridCellRenderer<false, true>(gridDataTable)); //SetDefaultRenderer takes ownership! + else + SetDefaultRenderer(new GridCellRenderer<false, false>(gridDataTable)); +} diff --git a/library/CustomGrid.h b/library/CustomGrid.h index 8f392975..14d62255 100644 --- a/library/CustomGrid.h +++ b/library/CustomGrid.h @@ -10,7 +10,6 @@ using namespace FreeFileSync; class CustomGridTable; -class CustomGridTableMiddle; //################################################################################## class CustomGrid : public wxGrid @@ -30,13 +29,16 @@ public: virtual void DrawColLabel(wxDC& dc, int col); - void initSettings(bool enableScrollbars, + void initSettings(const bool enableScrollbars, + const bool showFileIcons, CustomGrid* gridLeft, CustomGrid* gridRight, CustomGrid* gridMiddle, GridView* gridRefUI, FileCompareResult* gridData); + virtual void initGridRenderer(const bool showFileIcons) = 0; + //notify wxGrid that underlying table size has changed void updateGridSizes(); @@ -52,19 +54,20 @@ public: static wxString getTypeName(xmlAccess::ColumnTypes colType); - void setLeadGrid(const wxGrid* newLead); + const wxGrid* getLeadGrid(); + bool isLeadGrid(); protected: - //set visibility, position and width of columns - xmlAccess::ColumnAttributes columnSettings; + void onGridAccess(wxEvent& event); + void adjustGridHeights(wxEvent& event); - void adjustGridHeights(); + xmlAccess::ColumnAttributes columnSettings; //set visibility, position and width of columns const wxGrid* leadGrid; //grid that has user focus bool scrollbarsEnabled; CustomGrid* m_gridLeft; - CustomGrid* m_gridRight; CustomGrid* m_gridMiddle; + CustomGrid* m_gridRight; CustomGridTable* gridDataTable; @@ -72,6 +75,7 @@ protected: const wxBitmap* sortMarker; }; +//############## SPECIALIZATIONS ################### class CustomGridLeft : public CustomGrid { @@ -89,6 +93,8 @@ public: virtual void DoPrepareDC(wxDC& dc); virtual bool CreateGrid(int numRows, int numCols, wxGrid::wxGridSelectionModes selmode = wxGrid::wxGridSelectCells); + + virtual void initGridRenderer(const bool showFileIcons); }; @@ -109,24 +115,7 @@ public: virtual bool CreateGrid(int numRows, int numCols, wxGrid::wxGridSelectionModes selmode = wxGrid::wxGridSelectCells); -private: - - class GridCellRendererAddCheckbox : public wxGridCellStringRenderer - { - public: - GridCellRendererAddCheckbox(CustomGridTableMiddle* gridDataTable) : m_gridDataTable(gridDataTable) {}; - - - virtual void Draw(wxGrid& grid, - wxGridCellAttr& attr, - wxDC& dc, - const wxRect& rect, - int row, int col, - bool isSelected); - - private: - CustomGridTableMiddle* m_gridDataTable; - }; + virtual void initGridRenderer(const bool showFileIcons) {} }; @@ -146,6 +135,8 @@ public: virtual void DoPrepareDC(wxDC& dc); virtual bool CreateGrid(int numRows, int numCols, wxGrid::wxGridSelectionModes selmode = wxGrid::wxGridSelectCells); + + virtual void initGridRenderer(const bool showFileIcons); }; #endif // CUSTOMGRID_H_INCLUDED diff --git a/library/fileHandling.cpp b/library/fileHandling.cpp index cda81ef5..0dccdec7 100644 --- a/library/fileHandling.cpp +++ b/library/fileHandling.cpp @@ -6,7 +6,16 @@ #ifdef FFS_WIN #include <wx/msw/wrapwin.h> //includes "windows.h" -#endif // FFS_WIN + +#elif defined FFS_LINUX +#include <sys/stat.h> +#include <time.h> +#include <utime.h> +#include <fstream> +#include <unistd.h> +#include <dirent.h> +#include <errno.h> +#endif class RecycleBin @@ -40,7 +49,7 @@ public: fileOp.wFunc = FO_DELETE; fileOp.pFrom = filenameDoubleNull.c_str(); fileOp.pTo = NULL; - fileOp.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_SILENT; + fileOp.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_SILENT | FOF_NOERRORUI; fileOp.fAnyOperationsAborted = false; fileOp.hNameMappings = NULL; fileOp.lpszProgressTitle = NULL; @@ -75,10 +84,35 @@ bool moveToRecycleBin(const Zstring& filename) throw(RuntimeException) } -inline +bool FreeFileSync::fileExists(const Zstring& filename) +{ //symbolic links (broken or not) are also treated as existing files! +#ifdef FFS_WIN + // we must use GetFileAttributes() instead of the ANSI C functions because + // it can cope with network (UNC) paths unlike them + const DWORD ret = ::GetFileAttributes(filename.c_str()); + + return (ret != INVALID_FILE_ATTRIBUTES) && !(ret & FILE_ATTRIBUTE_DIRECTORY); + +#elif defined FFS_LINUX + struct stat fileInfo; + return (lstat(filename.c_str(), &fileInfo) == 0 && + (S_ISLNK(fileInfo.st_mode) || S_ISREG(fileInfo.st_mode))); +#endif +} + + void FreeFileSync::removeFile(const Zstring& filename, const bool useRecycleBin) { - if (!wxFileExists(filename.c_str())) return; //this is NOT an error situation: the manual deletion relies on it! + //no error situation if file is not existing! manual deletion relies on it! +#ifdef FFS_WIN + if (GetFileAttributes(filename.c_str()) == INVALID_FILE_ATTRIBUTES) + return; //neither file nor any other object with that name existing + +#elif defined FFS_LINUX + struct stat fileInfo; + if (lstat(filename.c_str(), &fileInfo) != 0) + return; //neither file nor any other object (e.g. broken symlink) with that name existing +#endif if (useRecycleBin) { @@ -103,61 +137,218 @@ void FreeFileSync::removeFile(const Zstring& filename, const bool useRecycleBin) Zstring errorMessage = Zstring(_("Error deleting file:")) + wxT("\n\"") + filename + wxT("\""); throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); } -#else - if (!wxRemoveFile(filename.c_str())) - throw FileError(Zstring(_("Error deleting file:")) + wxT("\n\"") + filename + wxT("\"")); +#elif defined FFS_LINUX + if (unlink(filename.c_str()) != 0) + { + Zstring errorMessage = Zstring(_("Error deleting file:")) + wxT("\n\"") + filename + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } #endif } -void FreeFileSync::removeDirectory(const Zstring& directory, const bool useRecycleBin) +class FilesDirsOnlyTraverser : public FreeFileSync::FullDetailFileTraverser { - if (!wxDirExists(directory)) return; //this is NOT an error situation: the manual deletion relies on it! +public: + FilesDirsOnlyTraverser(std::vector<Zstring>& files, std::vector<Zstring>& dirs) : + m_files(files), + m_dirs(dirs) {} - if (useRecycleBin) + virtual wxDirTraverseResult OnFile(const Zstring& filename, const FreeFileSync::FileInfo& details) { - if (!moveToRecycleBin(directory)) - throw FileError(Zstring(_("Error moving to Recycle Bin:")) + wxT("\n\"") + directory + wxT("\"")); - return; + m_files.push_back(filename); + return wxDIR_CONTINUE; + } + virtual wxDirTraverseResult OnDir(const Zstring& dirname) + { + m_dirs.push_back(dirname); + return wxDIR_IGNORE; //DON'T traverse into subdirs, removeDirectory works recursively! + } + virtual wxDirTraverseResult OnError(const Zstring& errorText) + { + throw FileError(errorText); } - std::vector<Zstring> fileList; - std::vector<Zstring> dirList; +private: + std::vector<Zstring>& m_files; + std::vector<Zstring>& m_dirs; +}; - getAllFilesAndDirs(directory, fileList, dirList); - for (unsigned int j = 0; j < fileList.size(); ++j) - removeFile(fileList[j], false); +void FreeFileSync::removeDirectory(const Zstring& directory, const bool useRecycleBin) +{ + //no error situation if directory is not existing! manual deletion relies on it! +#ifdef FFS_WIN + const DWORD dirAttr = GetFileAttributes(directory.c_str()); //name of a file or directory + if (dirAttr == INVALID_FILE_ATTRIBUTES) + return; //neither directory nor any other object with that name existing - dirList.insert(dirList.begin(), directory); //parent directory will be deleted last +#elif defined FFS_LINUX + struct stat dirInfo; + if (lstat(directory.c_str(), &dirInfo) != 0) + return; //neither directory nor any other object (e.g. broken symlink) with that name existing +#endif - for (int j = int(dirList.size()) - 1; j >= 0 ; --j) + if (useRecycleBin) { + if (!moveToRecycleBin(directory)) + throw FileError(Zstring(_("Error moving to Recycle Bin:")) + wxT("\n\"") + directory + wxT("\"")); + return; + } + +//attention: check if directory is a symlink! Do NOT traverse into it deleting contained files!!! #ifdef FFS_WIN - //initialize file attributes - if (!SetFileAttributes( - dirList[j].c_str(), // address of directory name - FILE_ATTRIBUTE_NORMAL)) // attributes to set + if (dirAttr & FILE_ATTRIBUTE_REPARSE_POINT) + { //remove symlink directly, support for \\?\-prefix + if (RemoveDirectory(directory.c_str()) == 0) { - Zstring errorMessage = Zstring(_("Error deleting directory:")) + wxT("\n\"") + dirList[j] + wxT("\""); + Zstring errorMessage = Zstring(_("Error deleting directory:")) + wxT("\n\"") + directory + wxT("\""); throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); } + return; + } - //remove directory, support for \\?\-prefix - if (RemoveDirectory(dirList[j].c_str()) == 0) +#elif defined FFS_LINUX + if (S_ISLNK(dirInfo.st_mode)) + { + if (unlink(directory.c_str()) != 0) { - Zstring errorMessage = Zstring(_("Error deleting directory:")) + wxT("\n\"") + dirList[j] + wxT("\""); + Zstring errorMessage = Zstring(_("Error deleting directory:")) + wxT("\n\"") + directory + wxT("\""); throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); } + return; + } +#endif + + std::vector<Zstring> fileList; + std::vector<Zstring> dirList; + + //get all files and directories from current directory (WITHOUT subdirectories!) + FilesDirsOnlyTraverser traverser(fileList, dirList); + FreeFileSync::traverseInDetail(directory, false, &traverser); //don't traverse into symlinks to directories + + //delete files + for (std::vector<Zstring>::const_iterator j = fileList.begin(); j != fileList.end(); ++j) + FreeFileSync::removeFile(*j, false); + + //delete directories recursively + for (std::vector<Zstring>::const_iterator j = dirList.begin(); j != dirList.end(); ++j) + FreeFileSync::removeDirectory(*j, false); //call recursively to correctly handle symbolic links + + //parent directory is deleted last +#ifdef FFS_WIN + //initialize file attributes + if (!SetFileAttributes( + directory.c_str(), // address of directory name + FILE_ATTRIBUTE_NORMAL)) // attributes to set + { + Zstring errorMessage = Zstring(_("Error deleting directory:")) + wxT("\n\"") + directory + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } + + //remove directory, support for \\?\-prefix + if (!RemoveDirectory(directory.c_str())) + { + Zstring errorMessage = Zstring(_("Error deleting directory:")) + wxT("\n\"") + directory + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } #else - if (!wxRmdir(dirList[j].c_str())) - throw FileError(Zstring(_("Error deleting directory:")) + wxT("\n\"") + dirList[j] + wxT("\"")); + if (rmdir(directory.c_str()) != 0) + { + Zstring errorMessage = Zstring(_("Error deleting directory:")) + wxT("\n\"") + directory + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } #endif +} + + +#ifdef FFS_WIN +class CloseHandleOnExit +{ +public: + CloseHandleOnExit(HANDLE searchHandle) : m_searchHandle(searchHandle) {} + + ~CloseHandleOnExit() + { + FindClose(m_searchHandle); } + +private: + HANDLE m_searchHandle; +}; + + +typedef DWORD WINAPI (*GetFinalPath)( + HANDLE hFile, + LPTSTR lpszFilePath, + DWORD cchFilePath, + DWORD dwFlags); + + +class DllHandler //dynamically load windows API functions +{ +public: + DllHandler() : + getFinalPathNameByHandle(NULL), + hKernel(NULL) + { + //get a handle to the DLL module containing required functionality + hKernel = ::LoadLibrary(wxT("kernel32.dll")); + if (hKernel) + getFinalPathNameByHandle = (GetFinalPath)(::GetProcAddress(hKernel, "GetFinalPathNameByHandleW")); //load unicode version! + } + + ~DllHandler() + { + if (hKernel) ::FreeLibrary(hKernel); + } + + GetFinalPath getFinalPathNameByHandle; + +private: + HINSTANCE hKernel; +}; + +//global instance +DllHandler dynamicWinApi; + + +Zstring resolveDirectorySymlink(const Zstring& dirLinkName) //get full target path of symbolic link to a directory +{ + //open handle to target of symbolic link + HANDLE hDir = CreateFile(dirLinkName.c_str(), + 0, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, + NULL); + if (hDir == INVALID_HANDLE_VALUE) + return Zstring(); + + CloseHandleOnExit dummy(hDir); + + if (dynamicWinApi.getFinalPathNameByHandle == NULL ) + throw FileError(Zstring(_("Error loading library function:")) + wxT("\n\"") + wxT("GetFinalPathNameByHandleW") + wxT("\"")); + + const unsigned BUFFER_SIZE = 10000; + TCHAR targetPath[BUFFER_SIZE]; + + const DWORD rv = dynamicWinApi.getFinalPathNameByHandle( + hDir, + targetPath, + BUFFER_SIZE, + 0); + + if (rv >= BUFFER_SIZE || rv == 0) + return Zstring(); + + return targetPath; } +#endif -void FreeFileSync::createDirectory(const Zstring& directory, const int level) +void createDirectoryRecursively(const Zstring& directory, const Zstring& templateDir, const bool copyDirectorySymLinks, const int level) { if (wxDirExists(directory.c_str())) return; @@ -165,193 +356,355 @@ void FreeFileSync::createDirectory(const Zstring& directory, const int level) if (level == 50) //catch endless recursion return; - //try to create directory, support for \\?\-prefix -#ifdef FFS_WIN - if (CreateDirectory( - directory.c_str(), // pointer to a directory path string - NULL // pointer to a security descriptor - ) != 0) - return; -#else - if (wxMkdir(directory.c_str())) //wxMkDir has different signature under Linux! - return; -#endif - - //if not successfull try to create parent folders first - Zstring parentDir; - if (endsWithPathSeparator(directory)) //may be valid on first level of recursion at most! Usually never true! + //try to create parent folders first + const Zstring dirParent = directory.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR); + if (!dirParent.empty() && !wxDirExists(dirParent)) { - parentDir = directory.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR); - parentDir = parentDir.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR); + //call function recursively + const Zstring templateParent = templateDir.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR); + createDirectoryRecursively(dirParent, templateParent, false, level + 1); //don't create symbolic links in recursion! } - else - parentDir = directory.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR); - - if (parentDir.empty()) return; - - //call function recursively - createDirectory(parentDir, level + 1); //now creation should be possible #ifdef FFS_WIN - if (CreateDirectory( - directory.c_str(), // pointer to a directory path string - NULL // pointer to a security descriptor - ) == 0) + const DWORD templateAttr = ::GetFileAttributes(templateDir.c_str()); //replaces wxDirExists(): also returns successful for broken symlinks + if (templateAttr == INVALID_FILE_ATTRIBUTES) //fallback { - if (level == 0) + if (CreateDirectory( + directory.c_str(), // pointer to a directory path string + NULL) == 0 && level == 0) { - Zstring errorMessage = Zstring(_("Error creating directory:")) + wxT("\n\"") + directory + wxT("\""); + const Zstring errorMessage = Zstring(_("Error creating directory:")) + wxT("\n\"") + directory + wxT("\""); throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); } } -#else - if (!wxMkdir(directory.c_str())) //wxMkDir has different signature under Linux! + else { - if (level == 0) - throw FileError(Zstring(_("Error creating directory:")) + wxT("\n\"") + directory + wxT("\"")); + //symbolic link handling + if (!copyDirectorySymLinks && templateAttr & FILE_ATTRIBUTE_REPARSE_POINT) //create directory based on target of symbolic link + { + //get target directory of symbolic link + const Zstring targetPath = resolveDirectorySymlink(templateDir); + if (targetPath.empty()) + { + if (level == 0) + throw FileError(Zstring(_("Error resolving symbolic link:")) + wxT("\n\"") + templateDir + wxT("\"")); + } + else + { + if (CreateDirectoryEx( // this function automatically copies symbolic links if encountered + targetPath.c_str(), // pointer to path string of template directory + directory.c_str(), // pointer to a directory path string + NULL) == 0 && level == 0) + { + const Zstring errorMessage = Zstring(_("Error creating directory:")) + wxT("\n\"") + directory + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } + } + } + else //in all other cases + { + if (CreateDirectoryEx( // this function automatically copies symbolic links if encountered + templateDir.c_str(), // pointer to path string of template directory + directory.c_str(), // pointer to a directory path string + NULL) == 0 && level == 0) + { + const Zstring errorMessage = Zstring(_("Error creating directory:")) + wxT("\n\"") + directory + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } + } } -#endif -} - - -void FreeFileSync::copyFolderAttributes(const Zstring& source, const Zstring& target) -{ -#ifdef FFS_WIN - DWORD attr = GetFileAttributes(source.c_str()); // address of the name of a file or directory - if (attr == 0xFFFFFFFF) +#elif defined FFS_LINUX + //symbolic link handling + if (copyDirectorySymLinks) { - Zstring errorMessage = Zstring(_("Error reading folder attributes:")) + wxT("\n\"") + source + wxT("\""); - throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + //test if templateDir is a symbolic link + struct stat linkInfo; + if (lstat(templateDir.c_str(), &linkInfo) == 0 && S_ISLNK(linkInfo.st_mode)) + { + //copy symbolic link + const int BUFFER_SIZE = 10000; + char buffer[BUFFER_SIZE]; + const int bytesWritten = readlink(templateDir.c_str(), buffer, BUFFER_SIZE); + if (bytesWritten < 0 || bytesWritten == BUFFER_SIZE) + { + Zstring errorMessage = Zstring(_("Error resolving symbolic link:")) + wxT("\n\"") + templateDir + wxT("\""); + if (bytesWritten < 0) errorMessage += Zstring(wxT("\n\n")) + FreeFileSync::getLastErrorFormatted(); + throw FileError(errorMessage); + } + //set null-terminating char + buffer[bytesWritten] = 0; + + if (symlink(buffer, directory.c_str()) != 0) + { + Zstring errorMessage = Zstring(_("Error creating directory:")) + wxT("\n\"") + directory + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } + return; //symlink created successfully + } } - if (!SetFileAttributes( - target.c_str(), // address of filename - attr)) // address of attributes to set + //default directory creation + if (mkdir(directory.c_str(), 0755) != 0 && level == 0) { - Zstring errorMessage = Zstring(_("Error writing folder attributes:")) + wxT("\n\"") + target + wxT("\""); + Zstring errorMessage = Zstring(_("Error creating directory:")) + wxT("\n\"") + directory + wxT("\""); throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); } -#elif defined FFS_LINUX -//Linux doesn't use attributes for files or folders + +//copy directory permissions: not sure if this is a good idea: if a directory is read-only copying/sync'ing of files will fail... + /* + if (templateDirExists) + { + struct stat fileInfo; + if (stat(templateDir.c_str(), &fileInfo) != 0) //read permissions from template directory + throw FileError(Zstring(_("Error reading file attributes:")) + wxT("\n\"") + templateDir + wxT("\"")); + + // reset the umask as we want to create the directory with exactly the same permissions as the template + wxCHANGE_UMASK(0); + + if (mkdir(directory.c_str(), fileInfo.st_mode) != 0 && level == 0) + throw FileError(Zstring(_("Error creating directory:")) + wxT("\n\"") + directory + wxT("\"")); + } + else + { + if (mkdir(directory.c_str(), 0777) != 0 && level == 0) + throw FileError(Zstring(_("Error creating directory:")) + wxT("\n\"") + directory + wxT("\"")); + } + */ #endif } -class FilesDirsOnlyTraverser : public FreeFileSync::FullDetailFileTraverser +void FreeFileSync::createDirectory(const Zstring& directory, const Zstring& templateDir, const bool copyDirectorySymLinks) { -public: - FilesDirsOnlyTraverser(std::vector<Zstring>& files, std::vector<Zstring>& dirs) : - m_files(files), - m_dirs(dirs) {} + //remove trailing separator + Zstring dirFormatted; + if (FreeFileSync::endsWithPathSeparator(directory)) + dirFormatted = directory.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR); + else + dirFormatted = directory; - virtual wxDirTraverseResult OnFile(const Zstring& filename, const FreeFileSync::FileInfo& details) - { - m_files.push_back(filename); - return wxDIR_CONTINUE; - } - virtual wxDirTraverseResult OnDir(const Zstring& dirname) + Zstring templateFormatted; + if (FreeFileSync::endsWithPathSeparator(templateDir)) + templateFormatted = templateDir.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR); + else + templateFormatted = templateDir; + + createDirectoryRecursively(dirFormatted, templateFormatted, copyDirectorySymLinks, 0); +} + + +#ifdef FFS_LINUX +struct MemoryAllocator +{ + MemoryAllocator() { - m_dirs.push_back(dirname); - return wxDIR_CONTINUE; + buffer = new char[bufferSize]; } - virtual wxDirTraverseResult OnError(const Zstring& errorText) + + ~MemoryAllocator() { - throw FileError(errorText); + delete [] buffer; } -private: - std::vector<Zstring>& m_files; - std::vector<Zstring>& m_dirs; + static const unsigned int bufferSize = 512 * 1024; + char* buffer; }; -void FreeFileSync::getAllFilesAndDirs(const Zstring& sourceDir, std::vector<Zstring>& files, std::vector<Zstring>& directories) throw(FileError) +void FreeFileSync::copyFile(const Zstring& sourceFile, + const Zstring& targetFile, + const bool copyFileSymLinks, + CopyFileCallback callback, + void* data) { - files.clear(); - directories.clear(); + try + { + if (FreeFileSync::fileExists(targetFile.c_str())) + throw FileError(Zstring(_("Error copying file:")) + wxT("\n\"") + sourceFile + wxT("\" -> \"") + targetFile + wxT("\"\n") + + _("Target file already existing!")); - //get all files and directories from current directory (and subdirectories) - FilesDirsOnlyTraverser traverser(files, directories); - traverseInDetail(sourceDir, false, &traverser); -} + //symbolic link handling + if (copyFileSymLinks) + { + //test if sourceFile is a symbolic link + struct stat linkInfo; + if (lstat(sourceFile.c_str(), &linkInfo) != 0) + { + Zstring errorMessage = Zstring(_("Error reading file attributes:")) + wxT("\n\"") + sourceFile + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } + if (S_ISLNK(linkInfo.st_mode)) + { + //copy symbolic link + const unsigned BUFFER_SIZE = 10000; + char buffer[BUFFER_SIZE]; + const int bytesWritten = readlink(sourceFile.c_str(), buffer, BUFFER_SIZE - 1); + if (bytesWritten < 0) + { + Zstring errorMessage = Zstring(_("Error resolving symbolic link:")) + wxT("\n\"") + sourceFile + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } + //set null-terminating char + buffer[bytesWritten] = 0; -#ifdef FFS_WIN -class CloseOnExit -{ -public: - CloseOnExit(HANDLE searchHandle) : m_searchHandle(searchHandle) {} + if (symlink(buffer, targetFile.c_str()) != 0) + { + Zstring errorMessage = Zstring(_("Error writing file:")) + wxT("\n\"") + targetFile + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } - ~CloseOnExit() - { - FindClose(m_searchHandle); + return; //symlink created successfully + } + } + + //begin of regular file copy + struct stat fileInfo; + if (stat(sourceFile.c_str(), &fileInfo) != 0) //read file attributes from source file (resolve symlinks) + { + Zstring errorMessage = Zstring(_("Error reading file attributes:")) + wxT("\n\"") + sourceFile + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } + + //open sourceFile for reading + std::ifstream fileIn(sourceFile.c_str(), std::ios_base::binary); + if (fileIn.fail()) + throw FileError(Zstring(_("Error opening file:")) + wxT("\n\"") + sourceFile + wxT("\"")); + + //create targetFile and open it for writing + std::ofstream fileOut(targetFile.c_str(), std::ios_base::binary); + if (fileOut.fail()) + throw FileError(Zstring(_("Error opening file:")) + wxT("\n\"") + targetFile + wxT("\"")); + + //copy contents of sourceFile to targetFile + wxULongLong totalBytesTransferred; + static MemoryAllocator memory; + while (true) + { + fileIn.read(memory.buffer, memory.bufferSize); + if (fileIn.eof()) //end of file? fail bit is set in this case also! + { + fileOut.write(memory.buffer, fileIn.gcount()); + if (fileOut.bad()) + throw FileError(Zstring(_("Error writing file:")) + wxT("\n\"") + targetFile + wxT("\"")); + break; + } + else if (fileIn.fail()) + throw FileError(Zstring(_("Error reading file:")) + wxT("\n\"") + sourceFile + wxT("\"")); + + + fileOut.write(memory.buffer, memory.bufferSize); + if (fileOut.bad()) + throw FileError(Zstring(_("Error writing file:")) + wxT("\n\"") + targetFile + wxT("\"")); + + totalBytesTransferred += memory.bufferSize; + + //invoke callback method to update progress indicators + if (callback) + callback(totalBytesTransferred, data); + } + + //close streams before changing attributes + fileIn.close(); + fileOut.close(); + + //adapt file modification time: + struct utimbuf newTimes; + time(&newTimes.actime); //set file access time to current time + newTimes.modtime = fileInfo.st_mtime; + if (utime(targetFile.c_str(), &newTimes) != 0) + { + Zstring errorMessage = Zstring(_("Error changing modification time:")) + wxT("\n\"") + targetFile + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } + + //set file access rights + if (chmod(targetFile.c_str(), fileInfo.st_mode) != 0) + { + Zstring errorMessage = Zstring(_("Error writing file attributes:")) + wxT("\n\"") + targetFile + wxT("\""); + throw FileError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()); + } } + catch (...) + { //try to delete target file if error occured, or exception was thrown in callback function + if (FreeFileSync::fileExists(targetFile.c_str())) + wxRemoveFile(targetFile.c_str()); //don't handle error situations! -private: - HANDLE m_searchHandle; -}; + throw; + } +} +#endif +#ifdef FFS_WIN inline -void getWin32FileInformation(const WIN32_FIND_DATA& input, FreeFileSync::FileInfo& output) +void setWin32FileInformation(const FILETIME& lastWriteTime, const DWORD fileSizeHigh, const DWORD fileSizeLow, FreeFileSync::FileInfo& output) { //convert UTC FILETIME to ANSI C format (number of seconds since Jan. 1st 1970 UTC) - wxULongLong writeTimeLong(input.ftLastWriteTime.dwHighDateTime, input.ftLastWriteTime.dwLowDateTime); + wxLongLong writeTimeLong(lastWriteTime.dwHighDateTime, lastWriteTime.dwLowDateTime); writeTimeLong /= 10000000; //reduce precision to 1 second (FILETIME has unit 10^-7 s) - writeTimeLong -= wxULongLong(2, 3054539008UL); //timeshift between ansi C time and FILETIME in seconds == 11644473600s - assert(writeTimeLong.GetHi() == 0); //it should fit into a 32bit variable now - output.lastWriteTimeRaw = writeTimeLong.GetLo(); + writeTimeLong -= wxLongLong(2, 3054539008UL); //timeshift between ansi C time and FILETIME in seconds == 11644473600s + output.lastWriteTimeRaw = writeTimeLong; - output.fileSize = wxULongLong(input.nFileSizeHigh, input.nFileSizeLow); + output.fileSize = wxULongLong(fileSizeHigh, fileSizeLow); } -#elif defined FFS_LINUX -class EnhancedFileTraverser : public wxDirTraverser +inline +bool setWin32FileInformationFromSymlink(const Zstring linkName, FreeFileSync::FileInfo& output) { -public: - EnhancedFileTraverser(FreeFileSync::FullDetailFileTraverser* sink) : m_sink(sink) {} + //open handle to target of symbolic link + HANDLE hFile = CreateFile(linkName.c_str(), + 0, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, + NULL); + if (hFile == INVALID_HANDLE_VALUE) + return false; - wxDirTraverseResult OnFile(const wxString& filename) //virtual impl. - { - struct stat fileInfo; - if (stat(filename.c_str(), &fileInfo) != 0) - return m_sink->OnError(Zstring(_("Could not retrieve file info for:")) + wxT("\n\"") + filename.c_str() + wxT("\"")); + CloseHandleOnExit dummy(hFile); - FreeFileSync::FileInfo details; - details.lastWriteTimeRaw = fileInfo.st_mtime; //UTC time(ANSI C format); unit: 1 second - details.fileSize = fileInfo.st_size; + BY_HANDLE_FILE_INFORMATION fileInfoByHandle; - return m_sink->OnFile(filename.c_str(), details); - } + if (!GetFileInformationByHandle( + hFile, + &fileInfoByHandle)) + return false; - wxDirTraverseResult OnDir(const wxString& dirname) //virtual impl. - { - return m_sink->OnDir(dirname.c_str()); - } + //write output + setWin32FileInformation(fileInfoByHandle.ftLastWriteTime, fileInfoByHandle.nFileSizeHigh, fileInfoByHandle.nFileSizeLow, output); + + return true; +} + +#elif defined FFS_LINUX +class CloseDirOnExit +{ +public: + CloseDirOnExit(DIR* dir) : m_dir(dir) {} - wxDirTraverseResult OnOpenError(const wxString& errorText) //virtual impl. + ~CloseDirOnExit() { - return m_sink->OnError(errorText.c_str()); + closedir(m_dir); //no error handling here } private: - FreeFileSync::FullDetailFileTraverser* m_sink; + DIR* m_dir; }; #endif +template <bool traverseDirectorySymlinks> class TraverseRecursively { public: - TraverseRecursively(const bool traverseSymbolicLinks, FreeFileSync::FullDetailFileTraverser* sink) : - m_traverseSymbolicLinks(traverseSymbolicLinks), - m_sink(sink) {} + TraverseRecursively(FreeFileSync::FullDetailFileTraverser* sink) : m_sink(sink) {} bool traverse(const Zstring& directory, const int level) { -#ifdef FFS_WIN - if (level == 50) //catch endless recursion + if (level == 100) //catch endless recursion { if (m_sink->OnError(Zstring(_("Error traversing directory:")) + wxT("\n\"") + directory + wxT("\"")) == wxDIR_STOP) return false; @@ -359,6 +712,7 @@ public: return true; } +#ifdef FFS_WIN Zstring directoryFormatted = directory; if (!FreeFileSync::endsWithPathSeparator(directoryFormatted)) directoryFormatted += GlobalResources::FILE_NAME_SEPARATOR; @@ -376,13 +730,13 @@ public: return true; //else: we have a problem... report it: - Zstring errorMessage = Zstring(_("Error traversing directory:")) + wxT("\n\"") + directory + wxT("\" ") ; + Zstring errorMessage = Zstring(_("Error traversing directory:")) + wxT("\n\"") + directory + wxT("\"") ; if (m_sink->OnError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted(lastError)) == wxDIR_STOP) return false; else return true; } - CloseOnExit dummy(searchHandle); + CloseHandleOnExit dummy(searchHandle); do { //don't return "." and ".." @@ -394,7 +748,7 @@ public: const Zstring fullName = directoryFormatted + name; - if (fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //a directory... + if (fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //a directory... (for directory symlinks this flag is set too!) { switch (m_sink->OnDir(fullName)) { @@ -402,7 +756,7 @@ public: break; case wxDIR_CONTINUE: //traverse into symbolic links, junctions, etc. if requested only: - if (m_traverseSymbolicLinks || (~fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) + if (traverseDirectorySymlinks || (~fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) if (!this->traverse(fullName, level + 1)) return false; break; @@ -410,25 +764,25 @@ public: return false; default: assert(false); - break; } } else //a file... { FreeFileSync::FileInfo details; - getWin32FileInformation(fileMetaData, details); - switch (m_sink->OnFile(fullName, details)) + if (fileMetaData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) //dereference symlinks! { - case wxDIR_IGNORE: - case wxDIR_CONTINUE: - break; - case wxDIR_STOP: - return false; - default: - assert(false); - break; + if (!setWin32FileInformationFromSymlink(fullName, details)) //broken symlink + { + details.lastWriteTimeRaw = 0; //we are not interested in the modifiation time of the link + details.fileSize = 0; + } } + else + setWin32FileInformation(fileMetaData.ftLastWriteTime, fileMetaData.nFileSizeHigh, fileMetaData.nFileSizeLow, details); + + if (m_sink->OnFile(fullName, details) == wxDIR_STOP) + return false; } } while (FindNextFile(searchHandle, // handle to search @@ -439,42 +793,131 @@ public: return true; //everything okay //else: we have a problem... report it: - Zstring errorMessage = Zstring(_("Error traversing directory:")) + wxT("\n\"") + directory + wxT("\" ") ; + Zstring errorMessage = Zstring(_("Error traversing directory:")) + wxT("\n\"") + directory + wxT("\"") ; if (m_sink->OnError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted(lastError)) == wxDIR_STOP) return false; else return true; + #elif defined FFS_LINUX + Zstring directoryFormatted = directory; + if (FreeFileSync::endsWithPathSeparator(directoryFormatted)) + directoryFormatted = directoryFormatted.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR); - //use standard file traverser and enrich output with additional file information - //could be improved with custom traversing algorithm for optimized performance - EnhancedFileTraverser traverser(m_sink); + DIR* dirObj = opendir(directoryFormatted.c_str()); + if (dirObj == NULL) + { + Zstring errorMessage = Zstring(_("Error traversing directory:")) + wxT("\n\"") + directoryFormatted + wxT("\"") ; + if (m_sink->OnError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()) == wxDIR_STOP) + return false; + else + return true; + } + CloseDirOnExit dummy(dirObj); - wxDir dir(directory.c_str()); - if (dir.IsOpened()) - dir.Traverse(traverser); + struct dirent* dirEntry; + while (!(errno = 0) && (dirEntry = readdir(dirObj)) != NULL) //set errno to 0 as unfortunately this isn't done when readdir() returns NULL when it is finished + { + //don't return "." and ".." + const wxChar* name = dirEntry->d_name; + if ( name[0] == wxChar('.') && + ((name[1] == wxChar('.') && name[2] == wxChar('\0')) || + name[1] == wxChar('\0'))) + continue; - return true; -#else - adapt this + const Zstring fullName = directoryFormatted + GlobalResources::FILE_NAME_SEPARATOR + name; + + struct stat fileInfo; + if (lstat(fullName.c_str(), &fileInfo) != 0) //lstat() does not resolve symlinks + { + const Zstring errorMessage = Zstring(_("Error reading file attributes:")) + wxT("\n\"") + fullName + wxT("\""); + if (m_sink->OnError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()) == wxDIR_STOP) + return false; + continue; + } + + const bool isSymbolicLink = S_ISLNK(fileInfo.st_mode); + if (isSymbolicLink) //dereference symbolic links + { + if (stat(fullName.c_str(), &fileInfo) != 0) //stat() resolves symlinks + { + //a broken symbolic link + FreeFileSync::FileInfo details; + details.lastWriteTimeRaw = 0; //we are not interested in the modifiation time of the link + details.fileSize = 0; + + if (m_sink->OnFile(fullName, details) == wxDIR_STOP) + return false; + continue; + } + } + + + if (S_ISDIR(fileInfo.st_mode)) //a directory... (note: symbolic links need to be dereferenced to test if they point to a directory!) + { + switch (m_sink->OnDir(fullName)) + { + case wxDIR_IGNORE: + break; + case wxDIR_CONTINUE: + if (traverseDirectorySymlinks || !isSymbolicLink) //traverse into symbolic links if requested only + { + if (!this->traverse(fullName, level + 1)) + return false; + } + break; + case wxDIR_STOP: + return false; + default: + assert(false); + } + } + else //a file... + { + FreeFileSync::FileInfo details; + details.lastWriteTimeRaw = fileInfo.st_mtime; //UTC time(ANSI C format); unit: 1 second + details.fileSize = fileInfo.st_size; + + if (m_sink->OnFile(fullName, details) == wxDIR_STOP) + return false; + } + } + + if (errno == 0) + return true; //everything okay + + //else: we have a problem... report it: + const Zstring errorMessage = Zstring(_("Error traversing directory:")) + wxT("\n\"") + directoryFormatted + wxT("\"") ; + if (m_sink->OnError(errorMessage + wxT("\n\n") + FreeFileSync::getLastErrorFormatted()) == wxDIR_STOP) + return false; + else + return true; #endif } private: - const bool m_traverseSymbolicLinks; FreeFileSync::FullDetailFileTraverser* m_sink; }; void FreeFileSync::traverseInDetail(const Zstring& directory, - const bool traverseSymbolicLinks, + const bool traverseDirectorySymlinks, FullDetailFileTraverser* sink) { - TraverseRecursively filewalker(traverseSymbolicLinks, sink); - filewalker.traverse(directory, 0); + if (traverseDirectorySymlinks) + { + TraverseRecursively<true> filewalker(sink); + filewalker.traverse(directory, 0); + } + else + { + TraverseRecursively<false> filewalker(sink); + filewalker.traverse(directory, 0); + } } +/* #ifdef FFS_WIN inline Zstring getDriveName(const Zstring& directoryName) //GetVolume() doesn't work under Linux! @@ -500,3 +943,4 @@ bool FreeFileSync::isFatDrive(const Zstring& directoryName) return Zstring(fileSystem).StartsWith(wxT("FAT")); } #endif //FFS_WIN +*/ diff --git a/library/fileHandling.h b/library/fileHandling.h index 7a1b1842..6c9a0400 100644 --- a/library/fileHandling.h +++ b/library/fileHandling.h @@ -26,7 +26,7 @@ namespace FreeFileSync struct FileInfo { wxULongLong fileSize; //unit: bytes! - time_t lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC + wxLongLong lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC }; //traverser interface @@ -40,8 +40,9 @@ namespace FreeFileSync }; //custom traverser with detail information about files - void traverseInDetail(const Zstring& directory, const bool traverseSymbolicLinks, FullDetailFileTraverser* sink); - void getAllFilesAndDirs(const Zstring& sourceDir, std::vector<Zstring>& files, std::vector<Zstring>& directories) throw(FileError); + void traverseInDetail(const Zstring& directory, const bool traverseDirectorySymlinks, FullDetailFileTraverser* sink); + + bool fileExists(const Zstring& filename); //replaces wxFileExists()! //recycler bool recycleBinExists(); //test existence of Recycle Bin API on current system @@ -49,12 +50,17 @@ namespace FreeFileSync //file handling void removeDirectory(const Zstring& directory, const bool useRecycleBin); void removeFile(const Zstring& filename, const bool useRecycleBin); - void createDirectory(const Zstring& directory, const int level = 0); //level is used internally only - void copyFolderAttributes(const Zstring& source, const Zstring& target); + void createDirectory(const Zstring& directory, const Zstring& templateDir, const bool copyDirectorySymLinks); +#ifdef FFS_LINUX + //callback function for status updates whily copying + typedef void (*CopyFileCallback)(const wxULongLong& totalBytesTransferred, void* data); -#ifdef FFS_WIN - bool isFatDrive(const Zstring& directoryName); -#endif //FFS_WIN + void copyFile(const Zstring& sourceFile, + const Zstring& targetFile, + const bool copyFileSymLinks, + CopyFileCallback callback = NULL, + void* data = NULL); +#endif } diff --git a/library/globalFunctions.cpp b/library/globalFunctions.cpp index aeeeed45..4b387293 100644 --- a/library/globalFunctions.cpp +++ b/library/globalFunctions.cpp @@ -4,13 +4,6 @@ #include <wx/file.h> -inline -int globalFunctions::round(const double d) -{ - return static_cast<int>(d<0?d-.5:d+.5); -} - - std::string globalFunctions::numberToString(const unsigned int number) { char result[100]; @@ -88,11 +81,12 @@ double globalFunctions::wxStringToDouble(const wxString& number) } -wxString& globalFunctions::includeNumberSeparator(wxString& number) +wxString globalFunctions::includeNumberSeparator(const wxString& number) { - for (int i = number.size() - 3; i > 0; i-= 3) - number.insert(i, GlobalResources::THOUSANDS_SEPARATOR); - return number; + wxString output(number); + for (int i = output.size() - 3; i > 0; i -= 3) + output.insert(i, GlobalResources::THOUSANDS_SEPARATOR); + return output; } diff --git a/library/globalFunctions.h b/library/globalFunctions.h index b4ccba5c..98e8cd1c 100644 --- a/library/globalFunctions.h +++ b/library/globalFunctions.h @@ -13,12 +13,17 @@ namespace globalFunctions { - int round(double d); //little rounding function + inline + int round(double d) //little rounding function + { + return static_cast<int>(d < 0 ? d - .5 : d + .5); + } template <class T> - T abs(const T& d) //absolute value + inline + T abs(const T& d) //absolute value { - return(d<0?-d:d); + return(d < 0 ? -d : d); } std::string numberToString(const unsigned int number); //convert number to string @@ -35,7 +40,7 @@ namespace globalFunctions int wxStringToInt( const wxString& number); //convert wxString to number double wxStringToDouble(const wxString& number); //convert wxString to number - wxString& includeNumberSeparator(wxString& number); + wxString includeNumberSeparator(const wxString& number); int readInt(std::ifstream& stream); //read int from file stream void writeInt(std::ofstream& stream, const int number); //write int to filestream diff --git a/library/misc.cpp b/library/misc.cpp index 0b0bf60b..0d5761d6 100644 --- a/library/misc.cpp +++ b/library/misc.cpp @@ -74,6 +74,9 @@ void CustomLocale::setLanguage(const int language) case wxLANGUAGE_GERMAN: languageFile = "Languages/german.lng"; break; + case wxLANGUAGE_HUNGARIAN: + languageFile = "Languages/hungarian.lng"; + break; case wxLANGUAGE_ITALIAN: languageFile = "Languages/italian.lng"; break; @@ -86,6 +89,12 @@ void CustomLocale::setLanguage(const int language) case wxLANGUAGE_PORTUGUESE: languageFile = "Languages/portuguese.lng"; break; + case wxLANGUAGE_SLOVENIAN: + languageFile = "Languages/slovenian.lng"; + break; + case wxLANGUAGE_SPANISH: + languageFile = "Languages/spanish.lng"; + break; default: languageFile.clear(); currentLanguage = wxLANGUAGE_ENGLISH; @@ -153,7 +162,8 @@ const wxChar* CustomLocale::GetString(const wxChar* szOrigString, const wxChar* //look for translation in buffer table Translation::iterator i; if ((i = translationDB.find(currentLine)) != translationDB.end()) - return (i->translation.c_str()); + return i->translation.c_str(); + //fallback - return (szOrigString); + return szOrigString; } diff --git a/library/multithreading.cpp b/library/multithreading.cpp index f7f5ed04..106d1aa7 100644 --- a/library/multithreading.cpp +++ b/library/multithreading.cpp @@ -151,7 +151,7 @@ void UpdateWhileExecuting::execute(StatusHandler* statusUpdater) while (receivingResult.WaitTimeout(UI_UPDATE_INTERVAL) == wxCOND_TIMEOUT) { - statusUpdater->requestUiRefresh(true); //ATTENTION: Exception "AbortThisProcess" may be thrown here!!! + statusUpdater->requestUiRefresh(false); //don't allow throwing exception within this call if (workDone) //workaround for a bug in wxWidgets v2.8.9 class wxCondition: signals might get lost break; //no mutex for workDone needed here: it is changed only when mainthread is in WaitTimeout() diff --git a/library/processXml.cpp b/library/processXml.cpp index 84783452..00737633 100644 --- a/library/processXml.cpp +++ b/library/processXml.cpp @@ -4,6 +4,9 @@ #include <wx/intl.h> #include "globalFunctions.h" +#ifdef FFS_WIN +#include <wx/msw/wrapwin.h> //includes "windows.h" +#endif //small helper functions bool readXmlElementValue(std::string& output, const TiXmlElement* parent, const std::string& name); @@ -109,7 +112,7 @@ xmlAccess::XmlGuiConfig xmlAccess::readGuiConfig(const wxString& filename) { //load XML if (!wxFileExists(filename)) - throw FileError(Zstring(_("The file does not exist:")) + wxT(" \"") + filename.c_str() + wxT("\"")); + throw FileError(Zstring(_("File does not exist:")) + wxT(" \"") + filename.c_str() + wxT("\"")); XmlConfigInput inputFile(filename, XML_GUI_CONFIG); @@ -129,7 +132,7 @@ xmlAccess::XmlBatchConfig xmlAccess::readBatchConfig(const wxString& filename) { //load XML if (!wxFileExists(filename)) - throw FileError(Zstring(_("The file does not exist:")) + wxT(" \"") + filename.c_str() + wxT("\"")); + throw FileError(Zstring(_("File does not exist:")) + wxT(" \"") + filename.c_str() + wxT("\"")); XmlConfigInput inputFile(filename, XML_BATCH_CONFIG); @@ -149,7 +152,7 @@ xmlAccess::XmlGlobalSettings xmlAccess::readGlobalSettings() { //load XML if (!wxFileExists(FreeFileSync::GLOBAL_CONFIG_FILE)) - throw FileError(Zstring(_("The file does not exist:")) + wxT(" \"") + FreeFileSync::GLOBAL_CONFIG_FILE.c_str() + wxT("\"")); + throw FileError(Zstring(_("File does not exist:")) + wxT(" \"") + FreeFileSync::GLOBAL_CONFIG_FILE.c_str() + wxT("\"")); XmlConfigInput inputFile(FreeFileSync::GLOBAL_CONFIG_FILE, XML_GLOBAL_SETTINGS); @@ -334,6 +337,29 @@ bool readXmlElementValue(xmlAccess::OnError& output, const TiXmlElement* parent, } +void readXmlElementTable(std::vector<wxString>& output, const TiXmlElement* parent, const std::string& name) +{ + output.clear(); + + if (parent) + { + //load elements + const TiXmlElement* element = parent->FirstChildElement(name); + while (element) + { + const char* text = element->GetText(); + if (text) //may be NULL!! + output.push_back(wxString::FromUTF8(text)); + else + break; + element = element->NextSiblingElement(); + } + } +} + +//################################################################################################################ + + bool XmlConfigInput::readXmlMainConfig(MainConfiguration& mainCfg, std::vector<FolderPair>& directoryPairs) { TiXmlElement* root = doc.RootElement(); @@ -444,6 +470,11 @@ bool XmlConfigInput::readXmlBatchConfig(xmlAccess::XmlBatchConfig& outputCfg) if (batchConfig) { readXmlElementValue(outputCfg.silent, batchConfig, "Silent"); + + std::string tempString; + if (readXmlElementValue(tempString, batchConfig, "LogfileDirectory")) + outputCfg.logFileDirectory = wxString::FromUTF8(tempString.c_str()); + readXmlElementValue(outputCfg.handleError, batchConfig, "HandleError"); } @@ -465,13 +496,16 @@ bool XmlConfigInput::readXmlGlobalSettings(xmlAccess::XmlGlobalSettings& outputC //program language readXmlElementValue(outputCfg.shared.programLanguage, global, "Language"); + //max. allowed file time deviation + int dummy = 0; + if (readXmlElementValue(dummy, global, "FileTimeTolerance")) + outputCfg.shared.fileTimeTolerance = dummy; + //traverse into symbolic links (to folders) - readXmlElementValue(outputCfg.shared.traverseSymbolicLinks, global, "TraverseSymbolicLinks"); + readXmlElementValue(outputCfg.shared.traverseDirectorySymlinks, global, "TraverseDirectorySymlinks"); -#ifdef FFS_WIN - //daylight saving time check - readXmlElementValue(outputCfg.shared.handleDstOnFat32, global, "HandleDaylightSavingTimeOnFAT"); -#endif + //copy symbolic links to files + readXmlElementValue(outputCfg.shared.copyFileSymlinks, global, "CopyFileSymlinks"); } TiXmlElement* warnings = hRoot.FirstChild("Shared").FirstChild("Warnings").ToElement(); @@ -497,6 +531,7 @@ bool XmlConfigInput::readXmlGlobalSettings(xmlAccess::XmlGlobalSettings& outputC readXmlElementValue(outputCfg.gui.deleteOnBothSides, mainWindow, "ManualDeletionOnBothSides"); readXmlElementValue(outputCfg.gui.useRecyclerForManualDeletion, mainWindow, "ManualDeletionUseRecycler"); + readXmlElementValue(outputCfg.gui.showFileIcons, mainWindow, "ShowFileIcons"); //########################################################### //read column attributes @@ -547,19 +582,26 @@ bool XmlConfigInput::readXmlGlobalSettings(xmlAccess::XmlGlobalSettings& outputC rightColumn = rightColumn->NextSiblingElement(); ++colType; } + + //load folder history elements + const TiXmlElement* historyLeft = TiXmlHandle(mainWindow).FirstChild("FolderHistoryLeft").ToElement(); + const TiXmlElement* historyRight = TiXmlHandle(mainWindow).FirstChild("FolderHistoryRight").ToElement(); + + readXmlElementTable(outputCfg.gui.folderHistoryLeft, historyLeft, "Folder"); + readXmlElementTable(outputCfg.gui.folderHistoryRight, historyRight, "Folder"); } TiXmlElement* gui = hRoot.FirstChild("Gui").ToElement(); if (gui) { //commandline for file manager integration - std::string tempString; + std::string tempString; if (readXmlElementValue(tempString, gui, "FileManager")) outputCfg.gui.commandLineFileManager = wxString::FromUTF8(tempString.c_str()); } //load config file history - TiXmlElement* cfgHistory = hRoot.FirstChild("Gui").FirstChild("History").ToElement(); + TiXmlElement* cfgHistory = hRoot.FirstChild("Gui").FirstChild("ConfigHistory").ToElement(); if (cfgHistory) { //load max. history size @@ -567,17 +609,8 @@ bool XmlConfigInput::readXmlGlobalSettings(xmlAccess::XmlGlobalSettings& outputC if (histSizeMax) //may be NULL! outputCfg.gui.cfgHistoryMaxItems = globalFunctions::stringToInt(histSizeMax); - //load history elements - TiXmlElement* cfgFile = TiXmlHandle(cfgHistory).FirstChild("File").ToElement(); - while (cfgFile) - { - const char* fileName = cfgFile->GetText(); - if (fileName) //may be NULL!! - outputCfg.gui.cfgFileHistory.push_back(wxString::FromUTF8(fileName)); - else - break; - cfgFile = cfgFile->NextSiblingElement(); - } + //load config history elements + readXmlElementTable(outputCfg.gui.cfgFileHistory, cfgHistory, "File"); } @@ -616,7 +649,7 @@ XmlConfigOutput::XmlConfigOutput(const wxString& fileName, const xmlAccess::XmlT bool XmlConfigOutput::writeToFile() { //workaround to get a FILE* from a unicode filename - wxFFile dummyFile(m_fileName, wxT("wb")); + wxFFile dummyFile(m_fileName, wxT("wb")); //save in binary mode for Linux portability of config files if (!dummyFile.IsOpened()) return false; @@ -678,6 +711,13 @@ void addXmlElement(TiXmlElement* parent, const std::string& name, const xmlAcces } +void addXmlElementTable(TiXmlElement* parent, const std::string& name, const std::vector<wxString>& input) +{ + for (std::vector<wxString>::const_iterator i = input.begin(); i != input.end(); ++i) + addXmlElement(parent, name, std::string(i->ToUTF8())); +} + + bool XmlConfigOutput::writeXmlMainConfig(const MainConfiguration& mainCfg, const std::vector<FolderPair>& directoryPairs) { TiXmlElement* root = doc.RootElement(); @@ -741,10 +781,10 @@ bool XmlConfigOutput::writeXmlMainConfig(const MainConfiguration& mainCfg, const } -bool XmlConfigOutput::writeXmlGuiConfig(const xmlAccess::XmlGuiConfig& outputCfg) +bool XmlConfigOutput::writeXmlGuiConfig(const xmlAccess::XmlGuiConfig& inputCfg) { //write main config - if (!writeXmlMainConfig(outputCfg.mainCfg, outputCfg.directoryPairs)) + if (!writeXmlMainConfig(inputCfg.mainCfg, inputCfg.directoryPairs)) return false; //write GUI specific config @@ -760,18 +800,18 @@ bool XmlConfigOutput::writeXmlGuiConfig(const xmlAccess::XmlGuiConfig& outputCfg TiXmlElement* mainWindow = new TiXmlElement("Main"); windows->LinkEndChild(mainWindow); - addXmlElement(mainWindow, "HideFiltered", outputCfg.hideFilteredElements); + addXmlElement(mainWindow, "HideFiltered", inputCfg.hideFilteredElements); - addXmlElement(guiConfig, "IgnoreErrors", outputCfg.ignoreErrors); + addXmlElement(guiConfig, "IgnoreErrors", inputCfg.ignoreErrors); return true; } -bool XmlConfigOutput::writeXmlBatchConfig(const xmlAccess::XmlBatchConfig& outputCfg) +bool XmlConfigOutput::writeXmlBatchConfig(const xmlAccess::XmlBatchConfig& inputCfg) { //write main config - if (!writeXmlMainConfig(outputCfg.mainCfg, outputCfg.directoryPairs)) + if (!writeXmlMainConfig(inputCfg.mainCfg, inputCfg.directoryPairs)) return false; //write GUI specific config @@ -781,14 +821,15 @@ bool XmlConfigOutput::writeXmlBatchConfig(const xmlAccess::XmlBatchConfig& outpu TiXmlElement* batchConfig = new TiXmlElement("BatchConfig"); root->LinkEndChild(batchConfig); - addXmlElement(batchConfig, "Silent", outputCfg.silent); - addXmlElement(batchConfig, "HandleError", outputCfg.handleError); + addXmlElement(batchConfig, "Silent", inputCfg.silent); + addXmlElement(batchConfig, "LogfileDirectory", std::string(inputCfg.logFileDirectory.ToUTF8())); + addXmlElement(batchConfig, "HandleError", inputCfg.handleError); return true; } -bool XmlConfigOutput::writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& outputCfg) +bool XmlConfigOutput::writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& inputCfg) { TiXmlElement* root = doc.RootElement(); if (!root) return false; @@ -799,25 +840,26 @@ bool XmlConfigOutput::writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& root->LinkEndChild(global); //program language - addXmlElement(global, "Language", outputCfg.shared.programLanguage); + addXmlElement(global, "Language", inputCfg.shared.programLanguage); -#ifdef FFS_WIN - //daylight saving time check - addXmlElement(global, "HandleDaylightSavingTimeOnFAT", outputCfg.shared.handleDstOnFat32); -#endif + //max. allowed file time deviation + addXmlElement(global, "FileTimeTolerance", int(inputCfg.shared.fileTimeTolerance)); //traverse into symbolic links (to folders) - addXmlElement(global, "TraverseSymbolicLinks", outputCfg.shared.traverseSymbolicLinks); + addXmlElement(global, "TraverseDirectorySymlinks", inputCfg.shared.traverseDirectorySymlinks); + + //copy symbolic links to files + addXmlElement(global, "CopyFileSymlinks", inputCfg.shared.copyFileSymlinks); //warnings TiXmlElement* warnings = new TiXmlElement("Warnings"); global->LinkEndChild(warnings); //warning: dependent folders - addXmlElement(warnings, "CheckForDependentFolders", outputCfg.shared.warningDependentFolders); + addXmlElement(warnings, "CheckForDependentFolders", inputCfg.shared.warningDependentFolders); //significant difference check - addXmlElement(warnings, "CheckForSignificantDifference", outputCfg.shared.warningSignificantDifference); + addXmlElement(warnings, "CheckForSignificantDifference", inputCfg.shared.warningSignificantDifference); //################################################################### @@ -832,21 +874,22 @@ bool XmlConfigOutput::writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& windows->LinkEndChild(mainWindow); //window size - addXmlElement(mainWindow, "Width", outputCfg.gui.widthNotMaximized); - addXmlElement(mainWindow, "Height", outputCfg.gui.heightNotMaximized); + addXmlElement(mainWindow, "Width", inputCfg.gui.widthNotMaximized); + addXmlElement(mainWindow, "Height", inputCfg.gui.heightNotMaximized); //window position - addXmlElement(mainWindow, "PosX", outputCfg.gui.posXNotMaximized); - addXmlElement(mainWindow, "PosY", outputCfg.gui.posYNotMaximized); - addXmlElement(mainWindow, "Maximized", outputCfg.gui.isMaximized); + addXmlElement(mainWindow, "PosX", inputCfg.gui.posXNotMaximized); + addXmlElement(mainWindow, "PosY", inputCfg.gui.posYNotMaximized); + addXmlElement(mainWindow, "Maximized", inputCfg.gui.isMaximized); - addXmlElement(mainWindow, "ManualDeletionOnBothSides", outputCfg.gui.deleteOnBothSides); - addXmlElement(mainWindow, "ManualDeletionUseRecycler", outputCfg.gui.useRecyclerForManualDeletion); + addXmlElement(mainWindow, "ManualDeletionOnBothSides", inputCfg.gui.deleteOnBothSides); + addXmlElement(mainWindow, "ManualDeletionUseRecycler", inputCfg.gui.useRecyclerForManualDeletion); + addXmlElement(mainWindow, "ShowFileIcons", inputCfg.gui.showFileIcons); //write column attributes TiXmlElement* leftColumn = new TiXmlElement("LeftColumns"); mainWindow->LinkEndChild(leftColumn); - xmlAccess::ColumnAttributes columnAtrribLeftCopy = outputCfg.gui.columnAttribLeft; //can't change const vector + xmlAccess::ColumnAttributes columnAtrribLeftCopy = inputCfg.gui.columnAttribLeft; //can't change const vector sort(columnAtrribLeftCopy.begin(), columnAtrribLeftCopy.end(), xmlAccess::sortByType); for (unsigned int i = 0; i < columnAtrribLeftCopy.size(); ++i) { @@ -862,7 +905,7 @@ bool XmlConfigOutput::writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& TiXmlElement* rightColumn = new TiXmlElement("RightColumns"); mainWindow->LinkEndChild(rightColumn); - xmlAccess::ColumnAttributes columnAtrribRightCopy = outputCfg.gui.columnAttribRight; + xmlAccess::ColumnAttributes columnAtrribRightCopy = inputCfg.gui.columnAttribRight; sort(columnAtrribRightCopy.begin(), columnAtrribRightCopy.end(), xmlAccess::sortByType); for (unsigned int i = 0; i < columnAtrribRightCopy.size(); ++i) { @@ -876,17 +919,25 @@ bool XmlConfigOutput::writeXmlGlobalSettings(const xmlAccess::XmlGlobalSettings& subElement->SetAttribute("Width", colAttrib.width); } + //write folder history elements + TiXmlElement* historyLeft = new TiXmlElement("FolderHistoryLeft"); + mainWindow->LinkEndChild(historyLeft); + TiXmlElement* historyRight = new TiXmlElement("FolderHistoryRight"); + mainWindow->LinkEndChild(historyRight); + + addXmlElementTable(historyLeft, "Folder", inputCfg.gui.folderHistoryLeft); + addXmlElementTable(historyRight, "Folder", inputCfg.gui.folderHistoryRight); + + //commandline for file manager integration - addXmlElement(gui, "FileManager", std::string((outputCfg.gui.commandLineFileManager).ToUTF8())); + addXmlElement(gui, "FileManager", std::string((inputCfg.gui.commandLineFileManager).ToUTF8())); //write config file history - TiXmlElement* cfgHistory = new TiXmlElement("History"); + TiXmlElement* cfgHistory = new TiXmlElement("ConfigHistory"); gui->LinkEndChild(cfgHistory); - cfgHistory->SetAttribute("MaximumSize", globalFunctions::numberToString(outputCfg.gui.cfgHistoryMaxItems)); - - for (unsigned int i = 0; i < outputCfg.gui.cfgFileHistory.size(); ++i) - addXmlElement(cfgHistory, "File", std::string(outputCfg.gui.cfgFileHistory[i].ToUTF8())); + cfgHistory->SetAttribute("MaximumSize", globalFunctions::numberToString(inputCfg.gui.cfgHistoryMaxItems)); + addXmlElementTable(cfgHistory, "File", inputCfg.gui.cfgFileHistory); //################################################################### //write global batch settings @@ -941,8 +992,33 @@ int xmlAccess::retrieveSystemLanguage() case wxLANGUAGE_PORTUGUESE_BRAZILIAN: return wxLANGUAGE_PORTUGUESE; + //variants of wxLANGUAGE_SPANISH + case wxLANGUAGE_SPANISH_ARGENTINA: + case wxLANGUAGE_SPANISH_BOLIVIA: + case wxLANGUAGE_SPANISH_CHILE: + case wxLANGUAGE_SPANISH_COLOMBIA: + case wxLANGUAGE_SPANISH_COSTA_RICA: + case wxLANGUAGE_SPANISH_DOMINICAN_REPUBLIC: + case wxLANGUAGE_SPANISH_ECUADOR: + case wxLANGUAGE_SPANISH_EL_SALVADOR: + case wxLANGUAGE_SPANISH_GUATEMALA: + case wxLANGUAGE_SPANISH_HONDURAS: + case wxLANGUAGE_SPANISH_MEXICAN: + case wxLANGUAGE_SPANISH_MODERN: + case wxLANGUAGE_SPANISH_NICARAGUA: + case wxLANGUAGE_SPANISH_PANAMA: + case wxLANGUAGE_SPANISH_PARAGUAY: + case wxLANGUAGE_SPANISH_PERU: + case wxLANGUAGE_SPANISH_PUERTO_RICO: + case wxLANGUAGE_SPANISH_URUGUAY: + case wxLANGUAGE_SPANISH_US: + case wxLANGUAGE_SPANISH_VENEZUELA: + return wxLANGUAGE_SPANISH; + //case wxLANGUAGE_JAPANESE: //case wxLANGUAGE_POLISH: + //case wxLANGUAGE_SLOVENIAN: + //case wxLANGUAGE_HUNGARIAN: default: return lang; @@ -950,6 +1026,24 @@ int xmlAccess::retrieveSystemLanguage() } +bool xmlAccess::supportForSymbolicLinks() +{ +#ifdef FFS_WIN + OSVERSIONINFO osvi; + ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + + //symbolic links are supported starting with Vista + if (GetVersionEx(&osvi)) + return osvi.dwMajorVersion > 5; //XP has majorVersion == 5, minorVersion == 1, Vista majorVersion == 6 + + return false; +#elif defined FFS_LINUX + return true; +#endif +} + + void xmlAccess::XmlGlobalSettings::_Shared::resetWarnings() { warningDependentFolders = true; diff --git a/library/processXml.h b/library/processXml.h index 7b838958..c24ad0e7 100644 --- a/library/processXml.h +++ b/library/processXml.h @@ -66,10 +66,12 @@ namespace xmlAccess std::vector<FolderPair> directoryPairs; bool silent; - OnError handleError; //reaction on error situation during synchronization + OnError handleError; //reaction on error situation during synchronization + wxString logFileDirectory; // }; int retrieveSystemLanguage(); + bool supportForSymbolicLinks(); struct XmlGlobalSettings @@ -79,19 +81,17 @@ namespace xmlAccess { _Shared() : programLanguage(retrieveSystemLanguage()), -#ifdef FFS_WIN - handleDstOnFat32(true), -#endif - traverseSymbolicLinks(false) + fileTimeTolerance(2), //default 2s: FAT vs NTFS + traverseDirectorySymlinks(false), + copyFileSymlinks(supportForSymbolicLinks()) { resetWarnings(); } int programLanguage; -#ifdef FFS_WIN - bool handleDstOnFat32; -#endif - bool traverseSymbolicLinks; + unsigned fileTimeTolerance; //max. allowed file time deviation + bool traverseDirectorySymlinks; + bool copyFileSymlinks; //copy symbolic link instead of target file //warnings void resetWarnings(); @@ -116,8 +116,8 @@ namespace xmlAccess #endif cfgHistoryMaxItems(10), deleteOnBothSides(false), - useRecyclerForManualDeletion(FreeFileSync::recycleBinExists()) //enable if OS supports it; else user will have to activate first and then get an error message - {} + useRecyclerForManualDeletion(FreeFileSync::recycleBinExists()), //enable if OS supports it; else user will have to activate first and then get an error message + showFileIcons(true) {} int widthNotMaximized; int heightNotMaximized; @@ -130,8 +130,11 @@ namespace xmlAccess wxString commandLineFileManager; std::vector<wxString> cfgFileHistory; unsigned cfgHistoryMaxItems; + std::vector<wxString> folderHistoryLeft; + std::vector<wxString> folderHistoryRight; bool deleteOnBothSides; bool useRecyclerForManualDeletion; + bool showFileIcons; } gui; //--------------------------------------------------------------------- diff --git a/library/resources.cpp b/library/resources.cpp index 4a9d0369..f8624ed3 100644 --- a/library/resources.cpp +++ b/library/resources.cpp @@ -34,6 +34,7 @@ GlobalResources::GlobalResources() bitmapResource[wxT("right delete.png")] = (bitmapDeleteRight = new wxBitmap(wxNullBitmap)); bitmapResource[wxT("email.png")] = (bitmapEmail = new wxBitmap(wxNullBitmap)); bitmapResource[wxT("about.png")] = (bitmapAbout = new wxBitmap(wxNullBitmap)); + bitmapResource[wxT("about_small.png")] = (bitmapAboutSmall = new wxBitmap(wxNullBitmap)); bitmapResource[wxT("website.png")] = (bitmapWebsite = new wxBitmap(wxNullBitmap)); bitmapResource[wxT("exit.png")] = (bitmapExit = new wxBitmap(wxNullBitmap)); bitmapResource[wxT("sync.png")] = (bitmapSync = new wxBitmap(wxNullBitmap)); @@ -102,6 +103,8 @@ GlobalResources::GlobalResources() bitmapResource[wxT("checkbox false.png")] = (bitmapCheckBoxFalse = new wxBitmap(wxNullBitmap)); bitmapResource[wxT("settings.png")] = (bitmapSettings = new wxBitmap(wxNullBitmap)); bitmapResource[wxT("settings_small.png")] = (bitmapSettingsSmall = new wxBitmap(wxNullBitmap)); + bitmapResource[wxT("recycler.png")] = (bitmapRecycler = new wxBitmap(wxNullBitmap)); + bitmapResource[wxT("shift.png")] = (bitmapShift = new wxBitmap(wxNullBitmap)); //init all the other resource files animationMoney = new wxAnimation(wxNullAnimation); diff --git a/library/resources.h b/library/resources.h index 24e8d027..6bac0d86 100644 --- a/library/resources.h +++ b/library/resources.h @@ -33,6 +33,7 @@ public: wxBitmap* bitmapDeleteRight; wxBitmap* bitmapEmail; wxBitmap* bitmapAbout; + wxBitmap* bitmapAboutSmall; wxBitmap* bitmapWebsite; wxBitmap* bitmapExit; wxBitmap* bitmapSync; @@ -101,6 +102,8 @@ public: wxBitmap* bitmapCheckBoxFalse; wxBitmap* bitmapSettings; wxBitmap* bitmapSettingsSmall; + wxBitmap* bitmapRecycler; + wxBitmap* bitmapShift; wxAnimation* animationMoney; wxAnimation* animationSync; diff --git a/library/sorting.h b/library/sorting.h index 23c219b9..171cca6d 100644 --- a/library/sorting.h +++ b/library/sorting.h @@ -124,11 +124,11 @@ bool sortByFileName(const FileCompareLine& a, const FileCompareLine& b) const wxChar* stringA = descrLineA->relativeName.c_str(); const wxChar* stringB = descrLineB->relativeName.c_str(); - size_t pos = descrLineA->relativeName.Find(GlobalResources::FILE_NAME_SEPARATOR, true); //start search beginning from end + size_t pos = descrLineA->relativeName.findFromEnd(GlobalResources::FILE_NAME_SEPARATOR); //start search beginning from end if (pos != std::string::npos) stringA += pos + 1; - pos = descrLineB->relativeName.Find(GlobalResources::FILE_NAME_SEPARATOR, true); //start search beginning from end + pos = descrLineB->relativeName.findFromEnd(GlobalResources::FILE_NAME_SEPARATOR); //start search beginning from end if (pos != std::string::npos) stringB += pos + 1; @@ -155,7 +155,7 @@ bool sortByRelativeName(const FileCompareLine& a, const FileCompareLine& b) relLengthA = descrLineA->relativeName.length(); else if (descrLineA->objType == FileDescrLine::TYPE_FILE) { - relLengthA = descrLineA->relativeName.Find(GlobalResources::FILE_NAME_SEPARATOR, true); //start search beginning from end + relLengthA = descrLineA->relativeName.findFromEnd(GlobalResources::FILE_NAME_SEPARATOR); //start search beginning from end if (relLengthA == wxNOT_FOUND) { relLengthA = 0; @@ -180,7 +180,7 @@ bool sortByRelativeName(const FileCompareLine& a, const FileCompareLine& b) relLengthB = descrLineB->relativeName.length(); else if (descrLineB->objType == FileDescrLine::TYPE_FILE) { - relLengthB = descrLineB->relativeName.Find(GlobalResources::FILE_NAME_SEPARATOR, true); //start search beginning from end + relLengthB = descrLineB->relativeName.findFromEnd(GlobalResources::FILE_NAME_SEPARATOR); //start search beginning from end if (relLengthB == wxNOT_FOUND) { relLengthB = 0; diff --git a/library/statusHandler.h b/library/statusHandler.h index 208a2df8..11517efb 100644 --- a/library/statusHandler.h +++ b/library/statusHandler.h @@ -50,19 +50,11 @@ public: //this method is triggered repeatedly by requestUiRefresh() and can be used to refresh the ui by dispatching pending events virtual void forceUiRefresh() = 0; - void requestUiRefresh(bool asyncProcessActive = false) - { - if (updateUiIsAllowed()) //test if specific time span between ui updates is over - forceUiRefresh(); - if (abortRequested && !asyncProcessActive) - abortThisProcess(); //abort can be triggered by requestAbortion() - } + void requestUiRefresh(bool allowAbort = true); //opportunity to abort must be implemented in a frequently executed method like requestUiRefresh() + void requestAbortion(); //does NOT call abortThisProcess immediately, but when appropriate (e.g. async. processes finished) + bool abortIsRequested(); - void requestAbortion() //opportunity to abort must be implemented in a frequently executed method like requestUiRefresh() - { //currently used by the UI status information screen, when button "Abort is pressed" - abortRequested = true; - } //error handling: virtual ErrorHandler::Response reportError(const Zstring& errorMessage) = 0; //recoverable error situation @@ -76,4 +68,31 @@ protected: }; + +//############################################################################## +inline +void StatusHandler::requestUiRefresh(bool allowAbort) +{ + if (updateUiIsAllowed()) //test if specific time span between ui updates is over + forceUiRefresh(); + + if (abortRequested && allowAbort) + abortThisProcess(); //abort can be triggered by requestAbortion() +} + + +inline +void StatusHandler::requestAbortion() +{ + abortRequested = true; +} + + +inline +bool StatusHandler::abortIsRequested() +{ + return abortRequested; +} + + #endif // STATUSHANDLER_H_INCLUDED diff --git a/library/tinyxml/tinyxmlparser.cpp b/library/tinyxml/tinyxmlparser.cpp index 2f6c0bc1..539f72cf 100644 --- a/library/tinyxml/tinyxmlparser.cpp +++ b/library/tinyxml/tinyxmlparser.cpp @@ -368,7 +368,7 @@ const char* TiXmlBase::SkipWhiteSpace( const char* p, TiXmlEncoding encoding ) } else { - while ( *p && IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) + while ( (*p && IsWhiteSpace( *p )) || *p == '\n' || *p =='\r' ) ++p; } diff --git a/library/zstring.cpp b/library/zstring.cpp index 27633392..d704e741 100644 --- a/library/zstring.cpp +++ b/library/zstring.cpp @@ -104,7 +104,6 @@ bool matchesHelper(const DefaultChar* string, const DefaultChar* mask) ++string; } return false; - break; default: if (*string != ch) @@ -141,8 +140,11 @@ Zstring& Zstring::Trim(bool fromRight) { if (descr->refCount > 1) //allocate new string *this = Zstring(data, newLength); - else //overwrite this string - descr->length = newLength; + else //overwrite this strin + { + descr->length = newLength; + data[newLength] = DefaultChar(0); + } } } else @@ -180,8 +182,7 @@ Zstring& Zstring::MakeLower() { StringDescriptor* newDescr; DefaultChar* newData; - const size_t newCapacity = getCapacityToAllocate(thisLen); - allocate(1, thisLen, newCapacity, newDescr, newData); + allocate(thisLen, newDescr, newData); for (unsigned int i = 0; i < thisLen; ++i) newData[i] = defaultToLower(data[i]); @@ -244,47 +245,41 @@ Zstring& Zstring::replace(size_t pos1, size_t n1, const DefaultChar* str, size_t assert(str < c_str() || c_str() + length() < str); //str mustn't point to data in this string assert(n1 <= length() - pos1); - if (n2 != 0) + const size_t oldLen = length(); + if (oldLen == 0) { - const size_t oldLen = length(); - if (oldLen == 0) - { - assert(n1 == 0); - return *this = Zstring(str, n2); - } + assert(pos1 == 0 && n1 == 0); + return *this = Zstring(str, n2); + } - const size_t newLen = oldLen - n1 + n2; - if (n1 < n2 || descr->refCount > 1) - { //allocate a new string - const size_t newCapacity = getCapacityToAllocate(newLen); - - StringDescriptor* newDescr; - DefaultChar* newData; - allocate(1, newLen, newCapacity, newDescr, newData); - //StringDescriptor* newDescr = new StringDescriptor(1, newLen, newCapacity); - //DefaultChar* newData = new DefaultChar[newCapacity + 1]; - - //assemble new string with replacement - memcpy(newData, data, pos1 * sizeof(DefaultChar)); - memcpy(newData + pos1, str, n2 * sizeof(DefaultChar)); - memcpy(newData + pos1 + n2, data + pos1 + n1, (oldLen - pos1 - n1) * sizeof(DefaultChar)); - newData[newLen] = 0; - - decRef(); - data = newData; - descr = newDescr; - } - else - { //overwrite current string - memcpy(data + pos1, str, n2 * sizeof(DefaultChar)); - if (n1 > n2) - { - memmove(data + pos1 + n2, data + pos1 + n1, (oldLen - pos1 - n1) * sizeof(DefaultChar)); - data[newLen] = 0; - descr->length = newLen; - } + const size_t newLen = oldLen - n1 + n2; + if (n1 < n2 || descr->refCount > 1) + { //allocate a new string + StringDescriptor* newDescr; + DefaultChar* newData; + allocate(newLen, newDescr, newData); + + //assemble new string with replacement + memcpy(newData, data, pos1 * sizeof(DefaultChar)); + memcpy(newData + pos1, str, n2 * sizeof(DefaultChar)); + memcpy(newData + pos1 + n2, data + pos1 + n1, (oldLen - pos1 - n1) * sizeof(DefaultChar)); + newData[newLen] = 0; + + decRef(); + data = newData; + descr = newDescr; + } + else //overwrite current string: case "n2 == 0" is handled implicitly + { + memcpy(data + pos1, str, n2 * sizeof(DefaultChar)); + if (n1 > n2) + { + memmove(data + pos1 + n2, data + pos1 + n1, (oldLen - pos1 - n1) * sizeof(DefaultChar)); + data[newLen] = 0; + descr->length = newLen; } } + return *this; } @@ -358,16 +353,16 @@ void Zstring::copyBeforeWrite(const size_t capacityNeeded) if (descr->refCount > 1) { //allocate a new string - const size_t oldLength = length(); - const size_t newCapacity = getCapacityToAllocate(capacityNeeded); + const size_t oldLength = length(); + assert(oldLength <= getCapacityToAllocate(capacityNeeded)); StringDescriptor* newDescr; - DefaultChar* newData; - allocate(1, oldLength, newCapacity, newDescr, newData); + DefaultChar* newData; + allocate(capacityNeeded, newDescr, newData); + newDescr->length = oldLength; if (oldLength) { - assert(oldLength <= newCapacity); memcpy(newData, data, oldLength * sizeof(DefaultChar)); newData[oldLength] = 0; } diff --git a/library/zstring.h b/library/zstring.h index 60ba464c..2a10efa9 100644 --- a/library/zstring.h +++ b/library/zstring.h @@ -7,7 +7,11 @@ #ifndef ZSTRING_H_INCLUDED #define ZSTRING_H_INCLUDED -#include <string> +#include <cstring> +#include <cctype> +#include <assert.h> +#include <new> +#include <cstdlib> namespace FreeFileSync @@ -33,6 +37,7 @@ typedef char DefaultChar; typedef wchar_t DefaultChar; #endif +class Zsubstr; class Zstring { @@ -67,7 +72,8 @@ public: //std::string functions size_t length() const; const DefaultChar* c_str() const; - Zstring substr(size_t pos = 0, size_t len = npos) const; + Zstring substr(size_t pos = 0, size_t len = npos) const; //allocate new string + Zsubstr zsubstr(size_t pos = 0) const; //use ref-counting! bool empty() const; int compare(const DefaultChar* other) const; int compare(const Zstring& other) const; @@ -106,18 +112,35 @@ private: struct StringDescriptor { - StringDescriptor(const unsigned int refC, const size_t len, const size_t cap) : refCount(refC), length(len), capacity(cap) {} mutable unsigned int refCount; - size_t length; - size_t capacity; //allocated length without null-termination + size_t length; + size_t capacity; //allocated length without null-termination }; - static void allocate(const unsigned int newRefCount, const size_t newLength, const size_t newCapacity, Zstring::StringDescriptor*& newDescr, DefaultChar*& newData); + static void allocate(const size_t newLength, Zstring::StringDescriptor*& newDescr, DefaultChar*& newData); StringDescriptor* descr; DefaultChar* data; }; +class Zsubstr //ref-counted substring of a Zstring +{ +public: + Zsubstr(); + Zsubstr(const Zstring& ref, const size_t pos); + + const DefaultChar* c_str() const; + size_t length() const; + bool StartsWith(const Zstring& begin) const; + size_t findFromEnd(const DefaultChar ch) const; + +private: + Zstring m_ref; + const DefaultChar* m_data; + size_t m_length; +}; + + //####################################################################################### //begin of implementation @@ -218,28 +241,26 @@ void testZstringForMemoryLeak(); inline -void Zstring::allocate(const unsigned int newRefCount, - const size_t newLength, - const size_t newCapacity, +size_t getCapacityToAllocate(const size_t length) +{ + return (length + (19 - length % 16)); //allocate some additional length to speed up concatenation +} + + +inline +void Zstring::allocate(const size_t newLength, StringDescriptor*& newDescr, DefaultChar*& newData) { //allocate and set data for new string - if (newCapacity) - { - newDescr = (StringDescriptor*) malloc( sizeof(StringDescriptor) + (newCapacity + 1) * sizeof(DefaultChar)); - if (newDescr == NULL) - throw std::bad_alloc(); - newData = (DefaultChar*)(newDescr + 1); - } - else - { - newDescr = (StringDescriptor*) malloc( sizeof(StringDescriptor)); - if (newDescr == NULL) - throw std::bad_alloc(); - newData = NULL; - } + const size_t newCapacity = getCapacityToAllocate(newLength); + assert(newCapacity); + + newDescr = (StringDescriptor*) malloc( sizeof(StringDescriptor) + (newCapacity + 1) * sizeof(DefaultChar)); + if (newDescr == NULL) + throw std::bad_alloc(); + newData = (DefaultChar*)(newDescr + 1); - newDescr->refCount = newRefCount; + newDescr->refCount = 1; newDescr->length = newLength; newDescr->capacity = newCapacity; @@ -259,7 +280,16 @@ void Zstring::allocate(const unsigned int newRefCount, inline Zstring::Zstring() { - allocate(1, 0, 0, descr, data); + //static (dummy) empty Zstring +#ifdef ZSTRING_CHAR + static Zstring emptyString(""); +#elif defined ZSTRING_WIDE_CHAR + static Zstring emptyString(L""); +#endif + + emptyString.incRef(); //implicitly handle case "this == &source" and avoid this check + descr = emptyString.descr; + data = emptyString.data; } @@ -281,7 +311,7 @@ inline Zstring::Zstring(const Zstring& source) { descr = source.descr; - data = source.data; + data = source.data; incRef(); //reference counting! } @@ -294,17 +324,9 @@ Zstring::~Zstring() inline -size_t getCapacityToAllocate(const size_t length) -{ - return (length + (19 - length % 16)); //allocate some additional length to speed up concatenation -} - - -inline void Zstring::initAndCopy(const DefaultChar* source, size_t length) { - const size_t newCapacity = getCapacityToAllocate(length); - allocate(1, length, newCapacity, descr, data); + allocate(length, descr, data); memcpy(data, source, length * sizeof(DefaultChar)); data[length] = 0; } @@ -548,21 +570,14 @@ size_t Zstring::size() const inline const DefaultChar* Zstring::c_str() const { - if (length()) - return data; - else -#ifdef ZSTRING_CHAR - return ""; -#elif defined ZSTRING_WIDE_CHAR - return L""; -#endif + return data; } inline bool Zstring::empty() const { - return length() == 0; + return descr->length == 0; } @@ -594,5 +609,71 @@ Zstring Zstring::operator+(const DefaultChar ch) const return Zstring(*this)+=ch; } +//##################### Zsubstr ############################# +inline +Zsubstr Zstring::zsubstr(size_t pos) const +{ + assert(pos <= length()); + return Zsubstr(*this, pos); //return reference counted string +} + + +inline +Zsubstr::Zsubstr() +{ + m_data = m_ref.c_str(); + m_length = 0; +} + + +inline +Zsubstr::Zsubstr(const Zstring& ref, const size_t pos) : + m_ref(ref), + m_data(ref.c_str() + pos), + m_length(ref.length() - pos) {} + + +inline +const DefaultChar* Zsubstr::c_str() const +{ + return m_data; +} + + +inline +size_t Zsubstr::length() const +{ + return m_length; +} + + +inline +bool Zsubstr::StartsWith(const Zstring& begin) const +{ + const size_t beginLength = begin.length(); + if (length() < beginLength) + return false; + + return defaultCompare(m_data, begin.c_str(), beginLength) == 0; +} + + +inline +size_t Zsubstr::findFromEnd(const DefaultChar ch) const +{ + if (length() == 0) + return Zstring::npos; + + size_t pos = length() - 1; + do //pos points to last char of the string + { + if (m_data[pos] == ch) + return pos; + } + while (--pos != static_cast<size_t>(-1)); + return Zstring::npos; +} + + #endif // ZSTRING_H_INCLUDED diff --git a/synchronization.cpp b/synchronization.cpp index d54101fd..0fbaf930 100644 --- a/synchronization.cpp +++ b/synchronization.cpp @@ -8,9 +8,7 @@ #ifdef FFS_WIN #include <wx/msw/wrapwin.h> //includes "windows.h" -#elif defined FFS_LINUX -#include <utime.h> -#endif // FFS_LINUX +#endif using namespace FreeFileSync; @@ -197,8 +195,14 @@ bool significantDifferenceDetected(const FileCompareResult& fileCmpResult, const } -SyncProcess::SyncProcess(const bool useRecycler, bool& warningSignificantDifference, StatusHandler* handler) : - useRecycleBin(useRecycler), +SyncProcess::SyncProcess(const bool useRecycler, + const bool copyFileSymLinks, + const bool traverseDirSymLinks, + bool& warningSignificantDifference, + StatusHandler* handler) : + m_useRecycleBin(useRecycler), + m_copyFileSymLinks(copyFileSymLinks), + m_traverseDirSymLinks(traverseDirSymLinks), m_warningSignificantDifference(warningSignificantDifference), statusUpdater(handler), txtCopyingFile(_("Copying file %x to %y")), @@ -217,9 +221,6 @@ SyncProcess::SyncProcess(const bool useRecycler, bool& warningSignificantDiffere } -void copyfileMultithreaded(const Zstring& source, const Zstring& target, StatusHandler* updateClass); - - inline bool SyncProcess::synchronizeFile(const FileCompareLine& cmpLine, const SyncConfiguration& config) { //return false if nothing had to be done @@ -240,17 +241,17 @@ bool SyncProcess::synchronizeFile(const FileCompareLine& cmpLine, const SyncConf statusText.Replace(wxT("%x"), cmpLine.fileDescrLeft.fullName, false); statusUpdater->updateStatusText(statusText); - removeFile(cmpLine.fileDescrLeft.fullName, useRecycleBin); + removeFile(cmpLine.fileDescrLeft.fullName, m_useRecycleBin); break; case SyncConfiguration::SYNC_DIR_RIGHT: //copy files to right - target = cmpLine.fileDescrRight.directory + cmpLine.fileDescrLeft.relativeName; + target = cmpLine.fileDescrRight.directory + cmpLine.fileDescrLeft.relativeName.c_str(); statusText = txtCopyingFile; statusText.Replace(wxT("%x"), cmpLine.fileDescrLeft.fullName, false); statusText.Replace(wxT("%y"), target, false); statusUpdater->updateStatusText(statusText); - copyfileMultithreaded(cmpLine.fileDescrLeft.fullName, target, statusUpdater); + copyFileUpdating(cmpLine.fileDescrLeft.fullName, target, cmpLine.fileDescrLeft.fileSize); break; case SyncConfiguration::SYNC_DIR_NONE: return false; @@ -263,21 +264,21 @@ bool SyncProcess::synchronizeFile(const FileCompareLine& cmpLine, const SyncConf switch (config.exRightSideOnly) { case SyncConfiguration::SYNC_DIR_LEFT: //copy files to left - target = cmpLine.fileDescrLeft.directory + cmpLine.fileDescrRight.relativeName; + target = cmpLine.fileDescrLeft.directory + cmpLine.fileDescrRight.relativeName.c_str(); statusText = txtCopyingFile; statusText.Replace(wxT("%x"), cmpLine.fileDescrRight.fullName, false); statusText.Replace(wxT("%y"), target, false); statusUpdater->updateStatusText(statusText); - copyfileMultithreaded(cmpLine.fileDescrRight.fullName, target, statusUpdater); + copyFileUpdating(cmpLine.fileDescrRight.fullName, target, cmpLine.fileDescrRight.fileSize); break; case SyncConfiguration::SYNC_DIR_RIGHT: //delete files on right statusText = txtDeletingFile; statusText.Replace(wxT("%x"), cmpLine.fileDescrRight.fullName, false); statusUpdater->updateStatusText(statusText); - removeFile(cmpLine.fileDescrRight.fullName, useRecycleBin); + removeFile(cmpLine.fileDescrRight.fullName, m_useRecycleBin); break; case SyncConfiguration::SYNC_DIR_NONE: return false; @@ -297,8 +298,8 @@ bool SyncProcess::synchronizeFile(const FileCompareLine& cmpLine, const SyncConf statusText.Replace(wxT("%y"), cmpLine.fileDescrLeft.fullName, false); statusUpdater->updateStatusText(statusText); - removeFile(cmpLine.fileDescrLeft.fullName, useRecycleBin); //only used if switch activated by user, else file is simply deleted - copyfileMultithreaded(cmpLine.fileDescrRight.fullName, cmpLine.fileDescrLeft.fullName, statusUpdater); + removeFile(cmpLine.fileDescrLeft.fullName, m_useRecycleBin); //only used if switch activated by user, else file is simply deleted + copyFileUpdating(cmpLine.fileDescrRight.fullName, cmpLine.fileDescrLeft.fullName, cmpLine.fileDescrRight.fileSize); break; case SyncConfiguration::SYNC_DIR_RIGHT: //copy from left to right statusText = txtOverwritingFile; @@ -306,8 +307,8 @@ bool SyncProcess::synchronizeFile(const FileCompareLine& cmpLine, const SyncConf statusText.Replace(wxT("%y"), cmpLine.fileDescrRight.fullName, false); statusUpdater->updateStatusText(statusText); - removeFile(cmpLine.fileDescrRight.fullName, useRecycleBin); //only used if switch activated by user, else file is simply deleted - copyfileMultithreaded(cmpLine.fileDescrLeft.fullName, cmpLine.fileDescrRight.fullName, statusUpdater); + removeFile(cmpLine.fileDescrRight.fullName, m_useRecycleBin); //only used if switch activated by user, else file is simply deleted + copyFileUpdating(cmpLine.fileDescrLeft.fullName, cmpLine.fileDescrRight.fullName, cmpLine.fileDescrLeft.fileSize); break; case SyncConfiguration::SYNC_DIR_NONE: return false; @@ -347,10 +348,10 @@ bool SyncProcess::synchronizeFolder(const FileCompareLine& cmpLine, const SyncCo statusText.Replace(wxT("%x"), cmpLine.fileDescrLeft.fullName, false); statusUpdater->updateStatusText(statusText); - removeDirectory(cmpLine.fileDescrLeft.fullName, useRecycleBin); + removeDirectory(cmpLine.fileDescrLeft.fullName, m_useRecycleBin); break; case SyncConfiguration::SYNC_DIR_RIGHT: //create folders on right - target = cmpLine.fileDescrRight.directory + cmpLine.fileDescrLeft.relativeName; + target = cmpLine.fileDescrRight.directory + cmpLine.fileDescrLeft.relativeName.c_str(); statusText = txtCreatingFolder; statusText.Replace(wxT("%x"), target, false); @@ -359,8 +360,7 @@ bool SyncProcess::synchronizeFolder(const FileCompareLine& cmpLine, const SyncCo //some check to catch the error that directory on source has been deleted externally after "compare"... if (!wxDirExists(cmpLine.fileDescrLeft.fullName)) throw FileError(Zstring(_("Error: Source directory does not exist anymore:")) + wxT("\n\"") + cmpLine.fileDescrLeft.fullName + wxT("\"")); - createDirectory(target); - copyFolderAttributes(cmpLine.fileDescrLeft.fullName, target); + createDirectory(target, cmpLine.fileDescrLeft.fullName, !m_traverseDirSymLinks); //traverse symlinks <=> !copy symlinks break; case SyncConfiguration::SYNC_DIR_NONE: return false; @@ -373,7 +373,7 @@ bool SyncProcess::synchronizeFolder(const FileCompareLine& cmpLine, const SyncCo switch (config.exRightSideOnly) { case SyncConfiguration::SYNC_DIR_LEFT: //create folders on left - target = cmpLine.fileDescrLeft.directory + cmpLine.fileDescrRight.relativeName; + target = cmpLine.fileDescrLeft.directory + cmpLine.fileDescrRight.relativeName.c_str(); statusText = txtCreatingFolder; statusText.Replace(wxT("%x"), target, false); @@ -382,15 +382,14 @@ bool SyncProcess::synchronizeFolder(const FileCompareLine& cmpLine, const SyncCo //some check to catch the error that directory on source has been deleted externally after "compare"... if (!wxDirExists(cmpLine.fileDescrRight.fullName)) throw FileError(Zstring(_("Error: Source directory does not exist anymore:")) + wxT("\n\"") + cmpLine.fileDescrRight.fullName + wxT("\"")); - createDirectory(target); - copyFolderAttributes(cmpLine.fileDescrRight.fullName, target); + createDirectory(target, cmpLine.fileDescrRight.fullName, !m_traverseDirSymLinks); //traverse symlinks <=> !copy symlinks break; case SyncConfiguration::SYNC_DIR_RIGHT: //delete folders on right statusText = txtDeletingFolder; statusText.Replace(wxT("%x"), cmpLine.fileDescrRight.fullName, false); statusUpdater->updateStatusText(statusText); - removeDirectory(cmpLine.fileDescrRight.fullName, useRecycleBin); + removeDirectory(cmpLine.fileDescrRight.fullName, m_useRecycleBin); break; case SyncConfiguration::SYNC_DIR_NONE: return false; @@ -414,8 +413,8 @@ bool SyncProcess::synchronizeFolder(const FileCompareLine& cmpLine, const SyncCo inline bool deletionImminent(const FileCompareLine& line, const SyncConfiguration& config) { //test if current sync-line will result in deletion of files -> used to avoid disc space bottlenecks - if ( line.cmpResult == FILE_LEFT_SIDE_ONLY && config.exLeftSideOnly == SyncConfiguration::SYNC_DIR_LEFT || - line.cmpResult == FILE_RIGHT_SIDE_ONLY && config.exRightSideOnly == SyncConfiguration::SYNC_DIR_RIGHT) + if ( (line.cmpResult == FILE_LEFT_SIDE_ONLY && config.exLeftSideOnly == SyncConfiguration::SYNC_DIR_LEFT) || + (line.cmpResult == FILE_RIGHT_SIDE_ONLY && config.exRightSideOnly == SyncConfiguration::SYNC_DIR_RIGHT)) return true; else return false; @@ -447,15 +446,13 @@ private: //synchronizes while processing rows in grid and returns all rows that have not been synced void SyncProcess::startSynchronizationProcess(FileCompareResult& grid, const SyncConfiguration& config) throw(AbortThisProcess) { - assert (statusUpdater); - #ifndef __WXDEBUG__ wxLogNull noWxLogs; //prevent wxWidgets logging #endif //some basic checks: //test existence of Recycle Bin - if (useRecycleBin && !FreeFileSync::recycleBinExists()) + if (m_useRecycleBin && !FreeFileSync::recycleBinExists()) { statusUpdater->reportFatalError(_("Unable to initialize Recycle Bin!")); return; //should be obsolete! @@ -502,7 +499,6 @@ void SyncProcess::startSynchronizationProcess(FileCompareResult& grid, const Syn if ( i->fileDescrLeft.objType == FileDescrLine::TYPE_DIRECTORY || i->fileDescrRight.objType == FileDescrLine::TYPE_DIRECTORY) { - while (true) { //trigger display refresh statusUpdater->requestUiRefresh(); @@ -545,8 +541,8 @@ void SyncProcess::startSynchronizationProcess(FileCompareResult& grid, const Syn if ( i->fileDescrLeft.objType == FileDescrLine::TYPE_FILE || i->fileDescrRight.objType == FileDescrLine::TYPE_FILE) { - if ( deleteLoop && deletionImminent(*i, config) || - !deleteLoop && !deletionImminent(*i, config)) + if ( (deleteLoop && deletionImminent(*i, config)) || + (!deleteLoop && !deletionImminent(*i, config))) { while (true) { //trigger display refresh @@ -569,7 +565,7 @@ void SyncProcess::startSynchronizationProcess(FileCompareResult& grid, const Syn dataToProcess, *i, config)) //update status if some work was done (answer is always "yes" in this context) - statusUpdater->updateProcessedData(objectsToCreate + objectsToOverwrite + objectsToDelete, dataToProcess); + statusUpdater->updateProcessedData(objectsToCreate + objectsToOverwrite + objectsToDelete, 0); //processed data is communicated in subfunctions! } markForRemoval.removeRow(i - grid.begin()); @@ -601,8 +597,143 @@ void SyncProcess::startSynchronizationProcess(FileCompareResult& grid, const Syn //########################################################################################### +//callback functionality for smooth progress indicators + +struct CallBackData +{ + StatusHandler* handler; + wxULongLong bytesTransferredLast; +}; + +#ifdef FFS_WIN +const DWORD COPY_FILE_COPY_SYMLINK = 0x00000800; + +DWORD CALLBACK copyProcessCallback( + LARGE_INTEGER totalFileSize, + LARGE_INTEGER totalBytesTransferred, + LARGE_INTEGER streamSize, + LARGE_INTEGER streamBytesTransferred, + DWORD dwStreamNumber, + DWORD dwCallbackReason, + HANDLE hSourceFile, + HANDLE hDestinationFile, + LPVOID lpData) +{ + //small performance optimization: it seems this callback function is called for every 64 kB (depending on cluster size). + static unsigned callNr = 0; + if (++callNr % 50 == 0) //reduce by factor of 50 =^ 10-20 calls/sec + { + CallBackData* sharedData = static_cast<CallBackData*>(lpData); + + //inform about the (differential) processed amount of data + const wxULongLong currentBytesTransferred = wxULongLong(totalBytesTransferred.HighPart, totalBytesTransferred.LowPart); + sharedData->handler->updateProcessedData(0, (currentBytesTransferred - sharedData->bytesTransferredLast).ToDouble()); + sharedData->bytesTransferredLast = currentBytesTransferred; + + sharedData->handler->requestUiRefresh(false); //don't allow throwing exception within this call + + if (sharedData->handler->abortIsRequested()) + return PROGRESS_CANCEL; + else + return PROGRESS_CONTINUE; + } + else + return PROGRESS_CONTINUE; +} + +#elif defined FFS_LINUX +void copyProcessCallback(const wxULongLong& totalBytesTransferred, void* data) +{ //called every 512 kB + + CallBackData* sharedData = static_cast<CallBackData*>(data); + + //inform about the (differential) processed amount of data + sharedData->handler->updateProcessedData(0, (totalBytesTransferred - sharedData->bytesTransferredLast).ToDouble()); + sharedData->bytesTransferredLast = totalBytesTransferred; + + sharedData->handler->requestUiRefresh(); //exceptions may be thrown here! +} +#endif + + +//copy file while executing statusUpdater->requestUiRefresh() calls +void SyncProcess::copyFileUpdating(const Zstring& source, const Zstring& target, const wxULongLong& totalBytesToCpy) +{ + //create folders first (see http://sourceforge.net/tracker/index.php?func=detail&aid=2628943&group_id=234430&atid=1093080) + const Zstring targetDir = target.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR); + if (!wxDirExists(targetDir.c_str())) + { + const Zstring templateDir = source.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR); + FreeFileSync::createDirectory(targetDir, templateDir, !m_traverseDirSymLinks); //might throw FileError() exception + } + + //start of (possibly) long-running copy process: ensure status updates are performed regularly +#ifdef FFS_WIN //update via call-back function + + CallBackData sharedData; + sharedData.handler = statusUpdater; +//data.bytesTransferredLast = + + + DWORD copyFlags = COPY_FILE_FAIL_IF_EXISTS; + + if (m_copyFileSymLinks) //copy symbolic links instead of the files pointed at + copyFlags |= COPY_FILE_COPY_SYMLINK; + + if (!CopyFileEx( //same performance as CopyFile() + source.c_str(), + target.c_str(), + copyProcessCallback, + &sharedData, + NULL, + copyFlags)) + { + //error situation: undo communication of processed amount of data + statusUpdater->updateProcessedData(0, sharedData.bytesTransferredLast.ToDouble() * -1 ); + + statusUpdater->requestUiRefresh(); //abort if requested, don't show error message if cancelled by user! + + Zstring errorMessage = Zstring(_("Error copying file:")) + wxT("\n\"") + source + wxT("\" -> \"") + target + wxT("\""); + errorMessage += Zstring(wxT("\n\n")); + errorMessage += FreeFileSync::getLastErrorFormatted(); //some additional windows error information + throw FileError(errorMessage); + } + + //inform about the (remaining) processed amount of data + statusUpdater->updateProcessedData(0, (totalBytesToCpy - sharedData.bytesTransferredLast).ToDouble()); + +#elif defined FFS_LINUX //update via call-back function + CallBackData sharedData; + sharedData.handler = statusUpdater; +//data.bytesTransferredLast = + + try + { + FreeFileSync::copyFile(source, + target, + m_copyFileSymLinks, + copyProcessCallback, + &sharedData); + } + catch (...) + { + //error situation: undo communication of processed amount of data + statusUpdater->updateProcessedData(0, sharedData.bytesTransferredLast.ToDouble() * -1 ); + + throw; + } + + //inform about the (remaining) processed amount of data + statusUpdater->updateProcessedData(0, (totalBytesToCpy - sharedData.bytesTransferredLast).ToDouble()); +#endif +} + +/* +//##### OLD IMPLEMENTATION WITHOUT SMOOTH PROGRESS INDICATOR ################ + +#ifdef FFS_LINUX //handle execution of a method while updating the UI class UpdateWhileCopying : public UpdateWhileExecuting { @@ -618,76 +749,32 @@ public: private: virtual void longRunner() { - //create folders first (see http://sourceforge.net/tracker/index.php?func=detail&aid=2628943&group_id=234430&atid=1093080) try { - const Zstring targetDir = target.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR); - if (!wxDirExists(targetDir.c_str())) - { - FreeFileSync::createDirectory(targetDir); - } + FreeFileSync::copyFile(source, target); } - catch (FileError& e) + catch (const FileError& e) { success = false; errorMessage = e.show(); return; } - -#ifdef FFS_WIN -//const DWORD COPY_FILE_COPY_SYMLINK = 0x00000800; - - if (!CopyFileEx( //same performance as CopyFile() - source.c_str(), - target.c_str(), - NULL, - NULL, - NULL, - COPY_FILE_FAIL_IF_EXISTS)) - { - success = false; - errorMessage = Zstring(_("Error copying file:")) + wxT("\n\"") + source + wxT("\" -> \"") + target + wxT("\""); - errorMessage += Zstring(wxT("\n\n")); - errorMessage += FreeFileSync::getLastErrorFormatted(); //some additional windows error information - return; - } - -#elif defined FFS_LINUX //copying files with Linux does not preserve the modification time => adapt after copying - if (!wxCopyFile(source.c_str(), target.c_str(), false)) //abort if file exists - { - success = false; - errorMessage = Zstring(_("Error copying file:")) + wxT("\n\"") + source + wxT("\" -> \"") + target + wxT("\""); - return; - } - - struct stat fileInfo; - if (stat(source.c_str(), &fileInfo) != 0) //read modification time from source file - { - success = false; - errorMessage = Zstring(_("Could not retrieve file info for:")) + wxT("\n\"") + source + wxT("\""); - return; - } - - utimbuf newTimes; - newTimes.actime = fileInfo.st_mtime; - newTimes.modtime = fileInfo.st_mtime; - - if (utime(target.c_str(), &newTimes) != 0) - { - success = false; - errorMessage = Zstring(_("Error changing modification time:")) + wxT("\n\"") + target + wxT("\""); - return; - } -#endif // FFS_LINUX - success = true; } }; - -void copyfileMultithreaded(const Zstring& source, const Zstring& target, StatusHandler* updateClass) +void copyFileUpdating(const Zstring& source, const Zstring& target, const wxULongLong& totalBytesToCpy, StatusHandler* updateClass) { + //create folders first (see http://sourceforge.net/tracker/index.php?func=detail&aid=2628943&group_id=234430&atid=1093080) + const Zstring targetDir = target.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR); + if (!wxDirExists(targetDir.c_str())) + { + const Zstring templateDir = source.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR); + FreeFileSync::createDirectory(targetDir, templateDir); //might throw FileError() exception + } + +//update while copying via additional worker thread static UpdateWhileCopying copyAndUpdate; //single instantiation: thread enters wait phase after each execution copyAndUpdate.waitUntilReady(); @@ -701,4 +788,9 @@ void copyfileMultithreaded(const Zstring& source, const Zstring& target, StatusH //no mutex needed here since longRunner is finished if (!copyAndUpdate.success) throw FileError(copyAndUpdate.errorMessage); + + //inform about the processed amount of data + updateClass->updateProcessedData(0, totalBytesToCpy.ToDouble()); +#endif } +*/ diff --git a/synchronization.h b/synchronization.h index e7d6f474..82241f05 100644 --- a/synchronization.h +++ b/synchronization.h @@ -21,6 +21,8 @@ namespace FreeFileSync { public: SyncProcess(const bool useRecycler, + const bool copyFileSymLinks, + const bool traverseDirSymLinks, bool& warningSignificantDifference, StatusHandler* handler); @@ -30,7 +32,11 @@ namespace FreeFileSync bool synchronizeFile(const FileCompareLine& cmpLine, const SyncConfiguration& config); //false if nothing had to be done bool synchronizeFolder(const FileCompareLine& cmpLine, const SyncConfiguration& config); //false if nothing had to be done - const bool useRecycleBin; + void copyFileUpdating(const Zstring& source, const Zstring& target, const wxULongLong& sourceFileSize); + + const bool m_useRecycleBin; + const bool m_copyFileSymLinks; + const bool m_traverseDirSymLinks; bool& m_warningSignificantDifference; StatusHandler* statusUpdater; diff --git a/ui/MainDialog.cpp b/ui/MainDialog.cpp index aa630122..d25fe224 100644 --- a/ui/MainDialog.cpp +++ b/ui/MainDialog.cpp @@ -2,7 +2,6 @@ * Purpose: Code for main dialog * Author: ZenJu (zhnmju123@gmx.de) * Created: 2008-07-16 - * Copyright: ZenJu () **************************************************************/ #include "mainDialog.h" @@ -19,6 +18,7 @@ #include "../comparison.h" #include "../synchronization.h" #include "../algorithm.h" +#include "checkVersion.h" MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale* language, xmlAccess::XmlGlobalSettings& settings) : @@ -32,8 +32,7 @@ MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale cmpStatusHandlerTmp(0), cleanedUp(false), lastSortColumn(-1), - lastSortGrid(NULL), - leadGrid(NULL) + lastSortGrid(NULL) { //initialize and load configuration readGlobalSettings(); @@ -48,9 +47,8 @@ MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale m_bpButtonSave->SetBitmapLabel(*globalResource.bitmapSave); m_bpButtonLoad->SetBitmapLabel(*globalResource.bitmapLoad); m_bpButtonAddPair->SetBitmapLabel(*globalResource.bitmapAddFolderPair); - m_bpButtonRemovePair->SetBitmapLabel(*globalResource.bitmapRemoveFolderPair); - m_bpButtonRemovePair->SetBitmapDisabled(*globalResource.bitmapRemoveFolderPairD); m_bitmap15->SetBitmap(*globalResource.bitmapStatusEdge); + m_bitmapShift->SetBitmap(*globalResource.bitmapShift); bSizer6->Layout(); //wxButtonWithImage size might have changed @@ -59,16 +57,20 @@ MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale m_menuItem11->SetBitmap(*globalResource.bitmapSyncSmall); m_menuItem7->SetBitmap(*globalResource.bitmapBatchSmall); m_menuItemGlobSett->SetBitmap(*globalResource.bitmapSettingsSmall); + m_menuItemAbout->SetBitmap(*globalResource.bitmapAboutSmall); - //Workaround for wxWidgets: small hack to update menu items: actually this is a wxWidgets bug (affects Windows- and Linux-build) + //workaround for wxWidgets: small hack to update menu items: actually this is a wxWidgets bug (affects Windows- and Linux-build) m_menu1->Remove(m_menuItem10); m_menu1->Remove(m_menuItem11); m_menu1->Insert(0, m_menuItem10); m_menu1->Insert(1, m_menuItem11); - m_menu3->Remove(m_menuItem7); m_menu3->Remove(m_menuItemGlobSett); - m_menu3->Insert(2, m_menuItem7); - m_menu3->Insert(3, m_menuItemGlobSett); + m_menu3->Remove(m_menuItem7); + m_menu3->Insert(2, m_menuItemGlobSett); + m_menu3->Insert(3, m_menuItem7); + + m_menu33->Remove(m_menuItemAbout); + m_menu33->Insert(2, m_menuItemAbout); //prepare drag & drop m_panel1->SetDropTarget(new MainWindowDropTarget(this, m_panel1)); @@ -85,36 +87,6 @@ MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale m_gridRight->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MainDialog::onGridRightButtonEvent), NULL, this); m_gridMiddle->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MainDialog::onGridMiddleButtonEvent), NULL, this); - //identify leading grid by keyboard input or scroll action - m_gridLeft->Connect(wxEVT_KEY_DOWN, wxEventHandler(MainDialog::onGridLeftAccess), NULL, this); - m_gridLeft->Connect(wxEVT_SCROLLWIN_TOP, wxEventHandler(MainDialog::onGridLeftAccess), NULL, this); - m_gridLeft->Connect(wxEVT_SCROLLWIN_BOTTOM, wxEventHandler(MainDialog::onGridLeftAccess), NULL, this); - m_gridLeft->Connect(wxEVT_SCROLLWIN_LINEUP, wxEventHandler(MainDialog::onGridLeftAccess), NULL, this); - m_gridLeft->Connect(wxEVT_SCROLLWIN_LINEDOWN, wxEventHandler(MainDialog::onGridLeftAccess), NULL, this); - m_gridLeft->Connect(wxEVT_SCROLLWIN_PAGEUP, wxEventHandler(MainDialog::onGridLeftAccess), NULL, this); - m_gridLeft->Connect(wxEVT_SCROLLWIN_PAGEDOWN, wxEventHandler(MainDialog::onGridLeftAccess), NULL, this); - m_gridLeft->Connect(wxEVT_SCROLLWIN_THUMBTRACK, wxEventHandler(MainDialog::onGridLeftAccess), NULL, this); - m_gridLeft->Connect(wxEVT_SCROLLWIN_THUMBRELEASE, wxEventHandler(MainDialog::onGridLeftAccess), NULL, this); - m_gridLeft->Connect(wxEVT_GRID_LABEL_LEFT_CLICK, wxEventHandler(MainDialog::onGridLeftAccess), NULL, this); - m_gridLeft->GetGridWindow()->Connect(wxEVT_LEFT_DOWN, wxEventHandler(MainDialog::onGridLeftAccess), NULL, this); - - m_gridRight->Connect(wxEVT_KEY_DOWN, wxEventHandler(MainDialog::onGridRightAccess), NULL, this); - m_gridRight->Connect(wxEVT_SCROLLWIN_TOP, wxEventHandler(MainDialog::onGridRightAccess), NULL, this); - m_gridRight->Connect(wxEVT_SCROLLWIN_BOTTOM, wxEventHandler(MainDialog::onGridRightAccess), NULL, this); - m_gridRight->Connect(wxEVT_SCROLLWIN_LINEUP, wxEventHandler(MainDialog::onGridRightAccess), NULL, this); - m_gridRight->Connect(wxEVT_SCROLLWIN_LINEDOWN, wxEventHandler(MainDialog::onGridRightAccess), NULL, this); - m_gridRight->Connect(wxEVT_SCROLLWIN_PAGEUP, wxEventHandler(MainDialog::onGridRightAccess), NULL, this); - m_gridRight->Connect(wxEVT_SCROLLWIN_PAGEDOWN, wxEventHandler(MainDialog::onGridRightAccess), NULL, this); - m_gridRight->Connect(wxEVT_SCROLLWIN_THUMBTRACK, wxEventHandler(MainDialog::onGridRightAccess), NULL, this); - m_gridRight->Connect(wxEVT_SCROLLWIN_THUMBRELEASE, wxEventHandler(MainDialog::onGridRightAccess), NULL, this); - m_gridRight->Connect(wxEVT_GRID_LABEL_LEFT_CLICK, wxEventHandler(MainDialog::onGridRightAccess), NULL, this); - m_gridRight->GetGridWindow()->Connect(wxEVT_LEFT_DOWN, wxEventHandler(MainDialog::onGridRightAccess), NULL, this); - - m_gridMiddle->Connect(wxEVT_KEY_DOWN, wxEventHandler(MainDialog::onGridMiddleAccess), NULL, this); - m_gridMiddle->Connect(wxEVT_SCROLLWIN_LINEUP, wxEventHandler(MainDialog::onGridMiddleAccess), NULL, this); - m_gridMiddle->Connect(wxEVT_SCROLLWIN_LINEDOWN, wxEventHandler(MainDialog::onGridMiddleAccess), NULL, this); - m_gridMiddle->GetGridWindow()->Connect(wxEVT_LEFT_DOWN, wxEventHandler(MainDialog::onGridMiddleAccess), NULL, this); - Connect(wxEVT_IDLE, wxEventHandler(MainDialog::OnIdleEvent), NULL, this); m_gridMiddle->GetGridWindow()->Connect(wxEVT_LEFT_UP, wxEventHandler(MainDialog::OnGrid3LeftMouseUp), NULL, this); m_gridMiddle->GetGridWindow()->Connect(wxEVT_LEFT_DOWN, wxEventHandler(MainDialog::OnGrid3LeftMouseDown), NULL, this); @@ -122,21 +94,10 @@ MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale Connect(wxEVT_SIZE, wxEventHandler(MainDialog::onResizeMainWindow), NULL, this); Connect(wxEVT_MOVE, wxEventHandler(MainDialog::onResizeMainWindow), NULL, this); - const wxString header = _("Legend"); - wxString toolTip = header + wxT("\n") + - wxString().Pad(header.Len(), wxChar('-')) + wxT("\n") + - _("<| file on left side only\n") + - _("|> file on right side only\n") + - _("<< left file is newer\n") + - _(">> right file is newer\n") + - _("!= files are different\n") + - _("== files are equal\n\n"); - m_gridMiddle->GetGridWindow()->SetToolTip(toolTip); - //init grid settings - m_gridLeft->initSettings( true, m_gridLeft, m_gridRight, m_gridMiddle, &gridRefUI, ¤tGridData); - m_gridMiddle->initSettings(false, m_gridLeft, m_gridRight, m_gridMiddle, &gridRefUI, ¤tGridData); - m_gridRight->initSettings( true, m_gridLeft, m_gridRight, m_gridMiddle, &gridRefUI, ¤tGridData); + m_gridLeft->initSettings( true, globalSettings.gui.showFileIcons, m_gridLeft, m_gridRight, m_gridMiddle, &gridRefUI, ¤tGridData); + m_gridMiddle->initSettings(false, false, m_gridLeft, m_gridRight, m_gridMiddle, &gridRefUI, ¤tGridData); + m_gridRight->initSettings( true, globalSettings.gui.showFileIcons, m_gridLeft, m_gridRight, m_gridMiddle, &gridRefUI, ¤tGridData); //disable sync button as long as "compare" hasn't been triggered. enableSynchronization(false); @@ -161,6 +122,9 @@ MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale case wxLANGUAGE_GERMAN: m_menuItemGerman->Check(); break; + case wxLANGUAGE_HUNGARIAN: + m_menuItemHungarian->Check(); + break; case wxLANGUAGE_ITALIAN: m_menuItemItalian->Check(); break; @@ -173,6 +137,12 @@ MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale case wxLANGUAGE_PORTUGUESE: m_menuItemPortuguese->Check(); break; + case wxLANGUAGE_SLOVENIAN: + m_menuItemSlovenian->Check(); + break; + case wxLANGUAGE_SPANISH: + m_menuItemSpanish->Check(); + break; default: m_menuItemEnglish->Check(); } @@ -204,7 +174,7 @@ void MainDialog::cleanUp() { cleanedUp = true; - //no need for event disconnect here; done automatically + //no need for event Disconnect() here; done automatically //save configuration writeConfigurationToXml(FreeFileSync::LAST_CONFIG_FILE); //don't trow exceptions in destructors @@ -238,9 +208,17 @@ void MainDialog::readGlobalSettings() for (std::vector<wxString>::reverse_iterator i = globalSettings.gui.cfgFileHistory.rbegin(); i != globalSettings.gui.cfgFileHistory.rend(); ++i) - addCfgFileToHistory(*i); - m_choiceHistory->SetSelection(0); + addFileToCfgHistory(*i); + //load list of last used folders + for (std::vector<wxString>::reverse_iterator i = globalSettings.gui.folderHistoryLeft.rbegin(); + i != globalSettings.gui.folderHistoryLeft.rend(); + ++i) + addLeftFolderToHistory(*i); + for (std::vector<wxString>::reverse_iterator i = globalSettings.gui.folderHistoryRight.rbegin(); + i != globalSettings.gui.folderHistoryRight.rend(); + ++i) + addRightFolderToHistory(*i); } @@ -259,121 +237,17 @@ void MainDialog::writeGlobalSettings() //write list of last used configuration files globalSettings.gui.cfgFileHistory = cfgFileNames; -} - - -inline -bool gridShouldBeCleared(const wxEvent& event) -{ - try //test if CTRL was pressed during a mouse event - { - const wxMouseEvent& mouseEvent = dynamic_cast<const wxMouseEvent&> (event); - if (mouseEvent.ButtonDown(wxMOUSE_BTN_LEFT) && !mouseEvent.ControlDown() && !mouseEvent.ShiftDown()) - return true; - else - return false; - } - catch (std::bad_cast&) {} - - try //test if CTRL was pressed during a key event - { - const wxKeyEvent& keyEvent = dynamic_cast<const wxKeyEvent&> (event); - - if (keyEvent.ShiftDown()) - return false; - - switch (keyEvent.GetKeyCode()) - { - case WXK_SPACE: - case WXK_TAB: - case WXK_RETURN: - case WXK_ESCAPE: - case WXK_NUMPAD_ENTER: - case WXK_LEFT: - case WXK_UP: - case WXK_RIGHT: - case WXK_DOWN: - return true; - - default: - return false; - } - } - catch (std::bad_cast&) {} - return false; -} - - -void MainDialog::onGridLeftAccess(wxEvent& event) -{ - if (leadGrid != m_gridLeft) - { - leadGrid = m_gridLeft; - - //notify grids of new user focus - m_gridLeft->setLeadGrid(leadGrid); - m_gridMiddle->setLeadGrid(leadGrid); - m_gridRight->setLeadGrid(leadGrid); - - m_gridLeft->SetFocus(); - } - - if (gridShouldBeCleared(event)) - { - m_gridLeft->ClearSelection(); - m_gridRight->ClearSelection(); - } - - event.Skip(); -} - - -void MainDialog::onGridRightAccess(wxEvent& event) -{ - if (leadGrid != m_gridRight) - { - leadGrid = m_gridRight; + //write list of last used folders + globalSettings.gui.folderHistoryLeft.clear(); + const wxArrayString leftFolderHistory = m_comboBoxDirLeft->GetStrings(); + for (unsigned i = 0; i < leftFolderHistory.GetCount(); ++i) + globalSettings.gui.folderHistoryLeft.push_back(leftFolderHistory[i]); - //notify grids of new user focus - m_gridLeft->setLeadGrid(leadGrid); - m_gridMiddle->setLeadGrid(leadGrid); - m_gridRight->setLeadGrid(leadGrid); - - m_gridRight->SetFocus(); - } - - if (gridShouldBeCleared(event)) - { - m_gridLeft->ClearSelection(); - m_gridRight->ClearSelection(); - } - - event.Skip(); -} - - -void MainDialog::onGridMiddleAccess(wxEvent& event) -{ - if (leadGrid != m_gridMiddle) - { - leadGrid = m_gridMiddle; - - //notify grids of new user focus - m_gridLeft->setLeadGrid(leadGrid); - m_gridMiddle->setLeadGrid(leadGrid); - m_gridRight->setLeadGrid(leadGrid); - - m_gridMiddle->SetFocus(); - } - - if (gridShouldBeCleared(event)) - { - m_gridLeft->ClearSelection(); - m_gridRight->ClearSelection(); - } - - event.Skip(); + globalSettings.gui.folderHistoryRight.clear(); + const wxArrayString rightFolderHistory = m_comboBoxDirRight->GetStrings(); + for (unsigned i = 0; i < rightFolderHistory.GetCount(); ++i) + globalSettings.gui.folderHistoryRight.push_back(rightFolderHistory[i]); } @@ -608,7 +482,7 @@ std::set<int> MainDialog::getSelectedRows(const wxGrid* grid) } //some exception: also add current cursor row to selection if there are no others... hopefully improving usability - if (output.empty() && grid == leadGrid) + if (output.empty() && grid == m_gridLeft->getLeadGrid()) output.insert(const_cast<wxGrid*>(grid)->GetCursorRow()); //messy wxGrid implementation... removeInvalidRows(output, gridRefUI.size()); @@ -677,6 +551,12 @@ void MainDialog::deleteFilesOnGrid(const std::set<int>& selectedRowsLeft, const globalSettings.gui.useRecyclerForManualDeletion); if (confirmDeletion->ShowModal() == DeleteDialog::BUTTON_OKAY) { + if (globalSettings.gui.useRecyclerForManualDeletion && !FreeFileSync::recycleBinExists()) + { + wxMessageBox(_("Unable to initialize Recycle Bin!")); + return; + } + //Attention! Modifying the grid is highly critical! There MUST NOT BE any accesses to gridRefUI until this reference table is updated //by writeGrid()!! This is easily missed, e.g. when ClearSelection() or ShowModal() or possibly any other wxWidgets function is called //that might want to redraw the UI (which implicitly uses the information in gridRefUI and currentGridData (see CustomGrid) @@ -714,7 +594,7 @@ void MainDialog::openWithFileManager(int rowNumber, const wxGrid* grid) if (0 <= rowNumber && rowNumber < int(gridRefUI.size())) fileDescr = ¤tGridData[gridRefUI[rowNumber]].fileDescrLeft; #ifdef FFS_WIN - command = wxString(wxT("explorer ")) + FreeFileSync::getFormattedDirectoryName(m_directoryLeft->GetValue().c_str()).c_str(); //default + command = wxString(wxT("explorer ")) + FreeFileSync::getFormattedDirectoryName(m_comboBoxDirLeft->GetValue().c_str()).c_str(); //default #endif // FFS_WIN } else if (grid == m_gridRight) @@ -722,7 +602,7 @@ void MainDialog::openWithFileManager(int rowNumber, const wxGrid* grid) if (0 <= rowNumber && rowNumber < int(gridRefUI.size())) fileDescr = ¤tGridData[gridRefUI[rowNumber]].fileDescrRight; #ifdef FFS_WIN - command = wxString(wxT("explorer ")) + FreeFileSync::getFormattedDirectoryName(m_directoryRight->GetValue().c_str()).c_str(); //default + command = wxString(wxT("explorer ")) + FreeFileSync::getFormattedDirectoryName(m_comboBoxDirRight->GetValue().c_str()).c_str(); //default #endif // FFS_WIN } else @@ -737,13 +617,13 @@ void MainDialog::openWithFileManager(int rowNumber, const wxGrid* grid) { command = globalSettings.gui.commandLineFileManager; command.Replace(wxT("%name"), fileDescr->fullName.c_str()); - command.Replace(wxT("%path"), fileDescr->relativeName.BeforeLast(GlobalResources::FILE_NAME_SEPARATOR).c_str()); + command.Replace(wxT("%path"), wxString(fileDescr->fullName.c_str()).BeforeLast(GlobalResources::FILE_NAME_SEPARATOR)); } else if (fileDescr->objType == FileDescrLine::TYPE_DIRECTORY) { command = globalSettings.gui.commandLineFileManager; command.Replace(wxT("%name"), fileDescr->fullName.c_str()); - command.Replace(wxT("%path"), fileDescr->relativeName.c_str()); + command.Replace(wxT("%path"), fileDescr->fullName.c_str()); } } @@ -927,7 +807,8 @@ void MainDialog::OnContextMenu(wxGridEvent& event) //CONTEXT_CLIPBOARD contextMenu->Append(CONTEXT_CLIPBOARD, _("Copy to clipboard\tCTRL+C")); - if (leadGrid == m_gridLeft && selectionLeft.size() || leadGrid == m_gridRight && selectionRight.size()) + if ( (m_gridLeft->isLeadGrid() && selectionLeft.size()) || + (m_gridRight->isLeadGrid() && selectionRight.size())) contextMenu->Enable(CONTEXT_CLIPBOARD, true); else contextMenu->Enable(CONTEXT_CLIPBOARD, false); @@ -936,7 +817,8 @@ void MainDialog::OnContextMenu(wxGridEvent& event) //CONTEXT_EXPLORER contextMenu->Append(CONTEXT_EXPLORER, _("Open with File Manager\tD-Click")); - if (leadGrid == m_gridLeft && selectionLeft.size() <= 1 || leadGrid == m_gridRight && selectionRight.size() <= 1) + if ( (m_gridLeft->isLeadGrid() && selectionLeft.size() <= 1) || + (m_gridRight->isLeadGrid() && selectionRight.size() <= 1)) contextMenu->Enable(CONTEXT_EXPLORER, true); else contextMenu->Enable(CONTEXT_EXPLORER, false); @@ -1037,14 +919,18 @@ void MainDialog::OnContextMenuSelection(wxCommandEvent& event) else if (eventId == CONTEXT_CLIPBOARD) { - if (leadGrid == m_gridLeft || leadGrid == m_gridRight) - copySelectionToClipboard(leadGrid); + if (m_gridLeft->isLeadGrid()) + copySelectionToClipboard(m_gridLeft); + else if (m_gridRight->isLeadGrid()) + copySelectionToClipboard(m_gridRight); } else if (eventId == CONTEXT_EXPLORER) { - if (leadGrid == m_gridLeft || leadGrid == m_gridRight) + if (m_gridLeft->isLeadGrid() || m_gridRight->isLeadGrid()) { + const wxGrid* const leadGrid = m_gridLeft->getLeadGrid(); + std::set<int> selection = getSelectedRows(leadGrid); if (selection.size() == 1) @@ -1157,9 +1043,9 @@ void MainDialog::OnWriteDirManually(wxCommandEvent& event) wxObject* eventObj = event.GetEventObject(); //first check if event comes from main folder pair - if (eventObj == (wxObject*)m_directoryLeft) + if (eventObj == (wxObject*)m_comboBoxDirLeft) m_dirPickerLeft->SetPath(newDir); - else if (eventObj == (wxObject*)m_directoryRight) + else if (eventObj == (wxObject*)m_comboBoxDirRight) m_dirPickerRight->SetPath(newDir); else { @@ -1191,9 +1077,15 @@ void MainDialog::OnDirSelected(wxFileDirPickerEvent& event) //first check if event comes from main folder pair if (eventObj == (wxObject*)m_dirPickerLeft) - m_directoryLeft->SetValue(newPath); + { + m_comboBoxDirLeft->SetSelection(wxNOT_FOUND); + m_comboBoxDirLeft->SetValue(newPath); + } else if (eventObj == (wxObject*)m_dirPickerRight) - m_directoryRight->SetValue(newPath); + { + m_comboBoxDirRight->SetSelection(wxNOT_FOUND); + m_comboBoxDirRight->SetValue(newPath); + } else //check if event comes from additional pairs { for (std::vector<FolderPairGenerated*>::const_iterator i = additionalFolderPairs.begin(); i != additionalFolderPairs.end(); ++i) @@ -1245,7 +1137,11 @@ bool sameFileSpecified(const wxString& file1, const wxString& file2) if (wxFileName(file2).GetPath() == wxEmptyString) file2Full = wxFileName::GetCwd() + GlobalResources::FILE_NAME_SEPARATOR + file2; - return (file1Full == file2Full); +#ifdef FFS_WIN //don't respect case in windows build + return FreeFileSync::compareStringsWin32(file1Full.c_str(), file2Full.c_str()) == 0; +#elif defined FFS_LINUX + return file1Full == file2Full; +#endif } @@ -1264,7 +1160,7 @@ private: }; -void MainDialog::addCfgFileToHistory(const wxString& filename) +void MainDialog::addFileToCfgHistory(const wxString& filename) { //only (still) existing files should be included in the list if (!wxFileExists(filename)) @@ -1281,7 +1177,7 @@ void MainDialog::addCfgFileToHistory(const wxString& filename) //the default config file should receive another name on GUI if (sameFileSpecified(FreeFileSync::LAST_CONFIG_FILE, filename)) - m_choiceHistory->Insert(getFormattedHistoryElement(_("<Last session>")), 0); //insert at beginning of list + m_choiceHistory->Insert(_("<Last session>"), 0); //insert at beginning of list else m_choiceHistory->Insert(getFormattedHistoryElement(filename), 0); //insert at beginning of list @@ -1312,7 +1208,8 @@ bool MainWindowDropTarget::OnDropFiles(wxCoord x, wxCoord y, const wxArrayString } -void setDirectoryFromDrop(const wxString& elementName, wxTextCtrl* txtCtrl, wxDirPickerCtrl* dirPicker) +template <class Ctrl> +void setDirectoryFromDrop(const wxString& elementName, Ctrl* txtCtrl, wxDirPickerCtrl* dirPicker) { wxString fileName = elementName; @@ -1362,10 +1259,16 @@ void MainDialog::OnFilesDropped(FfsFileDropEvent& event) } //test if main folder pair is drop target else if (dropTarget == m_panel1) - setDirectoryFromDrop(droppedFileName, m_directoryLeft, m_dirPickerLeft); + { + m_comboBoxDirLeft->SetSelection(wxNOT_FOUND); + setDirectoryFromDrop<wxComboBox>(droppedFileName, m_comboBoxDirLeft, m_dirPickerLeft); + } else if (dropTarget == m_panel2) - setDirectoryFromDrop(droppedFileName, m_directoryRight, m_dirPickerRight); + { + m_comboBoxDirRight->SetSelection(wxNOT_FOUND); + setDirectoryFromDrop<wxComboBox>(droppedFileName, m_comboBoxDirRight, m_dirPickerRight); + } else //test if additional folder pairs are drop targets { @@ -1374,12 +1277,12 @@ void MainDialog::OnFilesDropped(FfsFileDropEvent& event) FolderPairGenerated* dirPair = *i; if (dropTarget == (dirPair->m_panelLeft)) { - setDirectoryFromDrop(droppedFileName, dirPair->m_directoryLeft, dirPair->m_dirPickerLeft); + setDirectoryFromDrop<wxTextCtrl>(droppedFileName, dirPair->m_directoryLeft, dirPair->m_dirPickerLeft); break; } else if (dropTarget == (dirPair->m_panelRight)) { - setDirectoryFromDrop(droppedFileName, dirPair->m_directoryRight, dirPair->m_dirPickerRight); + setDirectoryFromDrop<wxTextCtrl>(droppedFileName, dirPair->m_directoryRight, dirPair->m_dirPickerRight); break; } } @@ -1387,6 +1290,52 @@ void MainDialog::OnFilesDropped(FfsFileDropEvent& event) } +int findTextPos(const wxArrayString& array, const wxString& text) +{ + for (unsigned int i = 0; i < array.GetCount(); ++i) +#ifdef FFS_WIN //don't respect case in windows build + if (FreeFileSync::compareStringsWin32(array[i].c_str(), text.c_str()) == 0) +#elif defined FFS_LINUX + if (array[i] == text) +#endif + return i; + + return -1; +} + + +void addPairToFolderHistory(wxComboBox* comboBox, const wxString& newFolder) +{ + const wxString oldVal = comboBox->GetValue(); + + const int pos = findTextPos(comboBox->GetStrings(), newFolder); + if (pos >= 0) + comboBox->Delete(pos); + + comboBox->Insert(newFolder, 0); + + //keep maximal size of history list + const unsigned MAX_FOLDER_HIST_COUNT = 12; + if (comboBox->GetCount() > MAX_FOLDER_HIST_COUNT) + comboBox->Delete(MAX_FOLDER_HIST_COUNT); + + comboBox->SetSelection(wxNOT_FOUND); //don't select anything + comboBox->SetValue(oldVal); //but preserve main text! +} + + +void MainDialog::addLeftFolderToHistory(const wxString& leftFolder) +{ + addPairToFolderHistory(m_comboBoxDirLeft, leftFolder); +} + + +void MainDialog::addRightFolderToHistory(const wxString& rightFolder) +{ + addPairToFolderHistory(m_comboBoxDirRight, rightFolder); +} + + void MainDialog::OnSaveConfig(wxCommandEvent& event) { wxString defaultFileName = wxT("SyncSettings.ffs_gui"); @@ -1399,7 +1348,7 @@ void MainDialog::OnSaveConfig(wxCommandEvent& event) { wxString newFileName = filePicker->GetPath(); - if (wxFileExists(newFileName)) + if (FreeFileSync::fileExists(newFileName.c_str())) { wxMessageDialog* messageDlg = new wxMessageDialog(this, wxString(_("File already exists. Overwrite?")) + wxT(" \"") + newFileName + wxT("\""), _("Warning") , wxOK | wxCANCEL); @@ -1456,25 +1405,62 @@ void MainDialog::loadConfiguration(const wxString& filename) } -void MainDialog::OnChoiceKeyEvent(wxKeyEvent& event) +void MainDialog::OnCfgHistoryKeyEvent(wxKeyEvent& event) { const int keyCode = event.GetKeyCode(); if (keyCode == WXK_DELETE || keyCode == WXK_NUMPAD_DELETE) { //try to delete the currently selected config history item const int selectedItem = m_choiceHistory->GetCurrentSelection(); if ( 0 <= selectedItem && - unsigned(selectedItem) < m_choiceHistory->GetCount() && - unsigned(selectedItem) < cfgFileNames.size()) + selectedItem < int(m_choiceHistory->GetCount()) && + selectedItem < int(cfgFileNames.size())) { //delete selected row cfgFileNames.erase(cfgFileNames.begin() + selectedItem); m_choiceHistory->Delete(selectedItem); - m_choiceHistory->SetSelection(0); } } event.Skip(); } +void removeSelectedElement(wxComboBox* control, wxEvent& event) +{ + const int selectedItem = control->GetCurrentSelection(); + if (0 <= selectedItem && selectedItem < int(control->GetCount())) + { + const wxString oldVal = control->GetValue(); + control->Delete(selectedItem); + control->SetSelection(wxNOT_FOUND); + control->SetValue(oldVal); + } + else + event.Skip(); +} + + +void MainDialog::OnFolderHistoryKeyEvent(wxKeyEvent& event) +{ + + /* + const int keyCode = event.GetKeyCode(); + if (keyCode == WXK_DELETE || keyCode == WXK_NUMPAD_DELETE) + { + wxObject* eventObj = event.GetEventObject(); + if (eventObj == (wxObject*)m_comboBoxDirLeft) + { + removeSelectedElement(m_comboBoxDirLeft, event); + return; //no event.Skip() here! + } + else if (eventObj == (wxObject*)m_comboBoxDirRight) + { + removeSelectedElement(m_comboBoxDirRight, event); + return; + } + }*/ + event.Skip(); +} + + void MainDialog::OnCompareByTimeSize(wxCommandEvent& event) { cfg.compareVar = CMP_BY_TIME_SIZE; @@ -1543,37 +1529,37 @@ bool MainDialog::readConfigurationFromXml(const wxString& filename, bool program //read folder pairs: //clear existing pairs first - m_directoryLeft->SetValue(wxEmptyString); + m_comboBoxDirLeft->SetSelection(wxNOT_FOUND); + m_comboBoxDirLeft->SetValue(wxEmptyString); m_dirPickerLeft->SetPath(wxEmptyString); - m_directoryRight->SetValue(wxEmptyString); + m_comboBoxDirRight->SetSelection(wxNOT_FOUND); + m_comboBoxDirRight->SetValue(wxEmptyString); m_dirPickerRight->SetPath(wxEmptyString); - removeFolderPair(true); + clearFolderPairs(); - //set main folder pair - const unsigned int folderPairCount = guiCfg.directoryPairs.size(); - if (folderPairCount > 0) + if (guiCfg.directoryPairs.size() > 0) { - std::vector<FolderPair>::const_iterator i = guiCfg.directoryPairs.begin(); + //set main folder pair + std::vector<FolderPair>::const_iterator main = guiCfg.directoryPairs.begin(); - m_directoryLeft->SetValue(i->leftDirectory.c_str()); - wxString leftDirFormatted = FreeFileSync::getFormattedDirectoryName(i->leftDirectory).c_str(); + m_comboBoxDirLeft->SetValue(main->leftDirectory.c_str()); + const wxString leftDirFormatted = FreeFileSync::getFormattedDirectoryName(main->leftDirectory).c_str(); if (wxDirExists(leftDirFormatted)) m_dirPickerLeft->SetPath(leftDirFormatted); + addLeftFolderToHistory(main->leftDirectory.c_str()); //another hack: wxCombobox::Insert() asynchronously sends message overwriting a later wxCombobox::SetValue()!!! :( - m_directoryRight->SetValue(i->rightDirectory.c_str()); - wxString rightDirFormatted = FreeFileSync::getFormattedDirectoryName(i->rightDirectory).c_str(); + m_comboBoxDirRight->SetValue(main->rightDirectory.c_str()); + const wxString rightDirFormatted = FreeFileSync::getFormattedDirectoryName(main->rightDirectory).c_str(); if (wxDirExists(rightDirFormatted)) m_dirPickerRight->SetPath(rightDirFormatted); + addRightFolderToHistory(main->rightDirectory.c_str()); //another hack... //set additional pairs + std::vector<FolderPair> additionalPairs; //don't modify guiCfg.directoryPairs! for (std::vector<FolderPair>::const_iterator i = guiCfg.directoryPairs.begin() + 1; i != guiCfg.directoryPairs.end(); ++i) - addFolderPair(i->leftDirectory.c_str(), i->rightDirectory.c_str()); - - //adjust folder pair buttons - const int additionalFolderCount = folderPairCount - 1; - if (additionalFolderCount <= 0) - m_bpButtonRemovePair->Disable(); + additionalPairs.push_back(*i); + addFolderPair(additionalPairs); } //read GUI layout @@ -1583,7 +1569,7 @@ bool MainDialog::readConfigurationFromXml(const wxString& filename, bool program ignoreErrors = guiCfg.ignoreErrors; //########################################################### - addCfgFileToHistory(filename); //put filename on list of last used config files + addFileToCfgHistory(filename); //put filename on list of last used config files if (filename == FreeFileSync::LAST_CONFIG_FILE) //set title { @@ -1625,7 +1611,7 @@ bool MainDialog::writeConfigurationToXml(const wxString& filename) } //put filename on list of last used config files - addCfgFileToHistory(filename); + addFileToCfgHistory(filename); if (filename == FreeFileSync::LAST_CONFIG_FILE) //set title { @@ -1867,8 +1853,8 @@ std::vector<FolderPair> MainDialog::getFolderPairs() //add main pair FolderPair newPair; - newPair.leftDirectory = m_directoryLeft->GetValue().c_str(); - newPair.rightDirectory = m_directoryRight->GetValue().c_str(); + newPair.leftDirectory = m_comboBoxDirLeft->GetValue().c_str(); + newPair.rightDirectory = m_comboBoxDirRight->GetValue().c_str(); output.push_back(newPair); //add additional pairs @@ -1886,6 +1872,8 @@ std::vector<FolderPair> MainDialog::getFolderPairs() void MainDialog::OnCompare(wxCommandEvent &event) { + //PERF_START; + clearStatusBar(); wxBusyCursor dummy; //show hourglass cursor @@ -1900,17 +1888,11 @@ void MainDialog::OnCompare(wxCommandEvent &event) CompareStatusHandler statusHandler(this); cmpStatusHandlerTmp = &statusHandler; -#ifdef FFS_WIN - FreeFileSync::CompareProcess comparison(globalSettings.shared.traverseSymbolicLinks, - globalSettings.shared.handleDstOnFat32, + FreeFileSync::CompareProcess comparison(globalSettings.shared.traverseDirectorySymlinks, + globalSettings.shared.fileTimeTolerance, globalSettings.shared.warningDependentFolders, &statusHandler); -#elif defined FFS_LINUX - FreeFileSync::CompareProcess comparison(globalSettings.shared.traverseSymbolicLinks, - false, - globalSettings.shared.warningDependentFolders, - &statusHandler); -#endif + comparison.startCompareProcess(getFolderPairs(), cfg.compareVar, currentGridData); @@ -1952,6 +1934,10 @@ void MainDialog::OnCompare(wxCommandEvent &event) m_gridLeft->ClearSelection(); m_gridMiddle->ClearSelection(); m_gridRight->ClearSelection(); + + //add to folder history after successful comparison only + addLeftFolderToHistory(m_comboBoxDirLeft->GetValue()); + addRightFolderToHistory(m_comboBoxDirRight->GetValue()); } //refresh grid in ANY case! (also on abort) @@ -2020,6 +2006,8 @@ void MainDialog::OnSync(wxCommandEvent& event) //start synchronization and return elements that were not sync'ed in currentGridData FreeFileSync::SyncProcess synchronization( cfg.useRecycleBin, + globalSettings.shared.copyFileSymlinks, + globalSettings.shared.traverseDirectorySymlinks, globalSettings.shared.warningSignificantDifference, &statusHandler); @@ -2211,11 +2199,16 @@ void MainDialog::OnSortMiddleGrid(wxGridEvent& event) void MainDialog::OnSwapDirs( wxCommandEvent& event ) { //swap directory names : main pair - wxString tmp = m_directoryLeft->GetValue(); - m_directoryLeft->SetValue(m_directoryRight->GetValue()); - m_directoryRight->SetValue(tmp); + const wxString leftDir = m_comboBoxDirLeft->GetValue(); + const wxString rightDir = m_comboBoxDirRight->GetValue(); + m_comboBoxDirLeft->SetSelection(wxNOT_FOUND); + m_comboBoxDirRight->SetSelection(wxNOT_FOUND); + + m_comboBoxDirLeft->SetValue(rightDir); + m_comboBoxDirRight->SetValue(leftDir); //additional pairs + wxString tmp; for (std::vector<FolderPairGenerated*>::const_iterator i = additionalFolderPairs.begin(); i != additionalFolderPairs.end(); ++i) { FolderPairGenerated* dirPair = *i; @@ -2283,8 +2276,7 @@ void MainDialog::updateStatusInformation(const GridView& visibleGrid) statusLeftNew+= _("1 directory"); else { - wxString folderCount = globalFunctions::numberToWxString(foldersOnLeftView); - globalFunctions::includeNumberSeparator(folderCount); + wxString folderCount = globalFunctions::includeNumberSeparator(globalFunctions::numberToWxString(foldersOnLeftView)); wxString outputString = _("%x directories"); outputString.Replace(wxT("%x"), folderCount, false); @@ -2301,8 +2293,7 @@ void MainDialog::updateStatusInformation(const GridView& visibleGrid) statusLeftNew+= _("1 file,"); else { - wxString fileCount = globalFunctions::numberToWxString(filesOnLeftView); - globalFunctions::includeNumberSeparator(fileCount); + wxString fileCount = globalFunctions::includeNumberSeparator(globalFunctions::numberToWxString(filesOnLeftView)); wxString outputString = _("%x files,"); outputString.Replace(wxT("%x"), fileCount, false); @@ -2312,8 +2303,7 @@ void MainDialog::updateStatusInformation(const GridView& visibleGrid) statusLeftNew+= FreeFileSync::formatFilesizeToShortString(filesizeLeftView); } - wxString objectsView = globalFunctions::numberToWxString(visibleGrid.size()); - globalFunctions::includeNumberSeparator(objectsView); + wxString objectsView = globalFunctions::includeNumberSeparator(globalFunctions::numberToWxString(visibleGrid.size())); if (currentGridData.size() == 1) { wxString outputString = _("%x of 1 row in view"); @@ -2322,8 +2312,7 @@ void MainDialog::updateStatusInformation(const GridView& visibleGrid) } else { - wxString objectsTotal = globalFunctions::numberToWxString(currentGridData.size()); - globalFunctions::includeNumberSeparator(objectsTotal); + wxString objectsTotal = globalFunctions::includeNumberSeparator(globalFunctions::numberToWxString(currentGridData.size())); wxString outputString = _("%x of %y rows in view"); outputString.Replace(wxT("%x"), objectsView, false); @@ -2337,8 +2326,7 @@ void MainDialog::updateStatusInformation(const GridView& visibleGrid) statusRightNew+= _("1 directory"); else { - wxString folderCount = globalFunctions::numberToWxString(foldersOnRightView); - globalFunctions::includeNumberSeparator(folderCount); + wxString folderCount = globalFunctions::includeNumberSeparator(globalFunctions::numberToWxString(foldersOnRightView)); wxString outputString = _("%x directories"); outputString.Replace(wxT("%x"), folderCount, false); @@ -2355,8 +2343,7 @@ void MainDialog::updateStatusInformation(const GridView& visibleGrid) statusRightNew+= _("1 file,"); else { - wxString fileCount = globalFunctions::numberToWxString(filesOnRightView); - globalFunctions::includeNumberSeparator(fileCount); + wxString fileCount = globalFunctions::includeNumberSeparator(globalFunctions::numberToWxString(filesOnRightView)); wxString outputString = _("%x files,"); outputString.Replace(wxT("%x"), fileCount, false); @@ -2474,81 +2461,130 @@ void MainDialog::mapGridDataToUI(GridView& output, const FileCompareResult& file void MainDialog::OnAddFolderPair(wxCommandEvent& event) { addFolderPair(wxEmptyString, wxEmptyString); - event.Skip(); + + //disable the sync button + enableSynchronization(false); + + //clear grids + currentGridData.clear(); + writeGrid(currentGridData); } void MainDialog::OnRemoveFolderPair(wxCommandEvent& event) { - removeFolderPair(); - event.Skip(); + //find folder pair originating the event + const wxObject* const eventObj = event.GetEventObject(); + for (std::vector<FolderPairGenerated*>::const_iterator i = additionalFolderPairs.begin(); i != additionalFolderPairs.end(); ++i) + { + if (eventObj == static_cast<wxObject*>((*i)->m_bpButtonRemovePair)) + { + removeFolderPair(i - additionalFolderPairs.begin()); + + //disable the sync button + enableSynchronization(false); + + //clear grids + currentGridData.clear(); + writeGrid(currentGridData); + return; + } + } } -void MainDialog::addFolderPair(const wxString& leftDir, const wxString& rightDir) +void MainDialog::addFolderPair(const Zstring& leftDir, const Zstring& rightDir) { - //add new folder pair - FolderPairGenerated* newPair = new FolderPairGenerated(m_scrolledWindowFolderPairs); - newPair->m_bitmap23->SetBitmap(*globalResource.bitmapLink); + std::vector<FolderPair> newPairs; + FolderPair pair; + pair.leftDirectory = leftDir; + pair.rightDirectory = rightDir; + newPairs.push_back(pair); - bSizerFolderPairs->Add(newPair, 0, wxEXPAND, 5); - additionalFolderPairs.push_back(newPair); + MainDialog::addFolderPair(newPairs); +} - //set size of scrolled window - wxSize pairSize = newPair->GetSize(); - const int additionalRows = additionalFolderPairs.size(); - if (additionalRows <= 3) //up to 3 additional pairs shall be shown - m_scrolledWindowFolderPairs->SetMinSize(wxSize( -1, pairSize.GetHeight() * additionalRows)); - else //adjust scrollbars - m_scrolledWindowFolderPairs->Fit(); - //adjust remove button - if (additionalRows > 0) - m_bpButtonRemovePair->Enable(); +void MainDialog::addFolderPair(const std::vector<FolderPair>& newPairs) +{ + if (newPairs.size() == 0) + return; - m_scrolledWindowFolderPairs->Layout(); - bSizer1->Layout(); - m_bpButtonSwap->Refresh(); + for (std::vector<FolderPair>::const_iterator i = newPairs.begin(); i != newPairs.end(); ++i) + { + //add new folder pair + FolderPairGenerated* newPair = new FolderPairGenerated(m_scrolledWindowFolderPairs); + newPair->m_bitmap23->SetBitmap(*globalResource.bitmapLink); + newPair->m_bpButtonRemovePair->SetBitmapLabel(*globalResource.bitmapRemoveFolderPair); - //register events - newPair->m_dirPickerLeft->Connect(wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler(MainDialog::OnDirSelected), NULL, this); - newPair->m_dirPickerRight->Connect(wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler(MainDialog::OnDirSelected), NULL, this); + bSizerFolderPairs->Add(newPair, 0, wxEXPAND, 5); + additionalFolderPairs.push_back(newPair); - newPair->m_directoryLeft->Connect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(MainDialog::OnWriteDirManually), NULL, this ); - newPair->m_directoryRight->Connect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(MainDialog::OnWriteDirManually), NULL, this ); + //set size of scrolled window + wxSize pairSize = newPair->GetSize(); - //prepare drag & drop - newPair->m_panelLeft->SetDropTarget(new MainWindowDropTarget(this, newPair->m_panelLeft)); //ownership passed - newPair->m_panelRight->SetDropTarget(new MainWindowDropTarget(this, newPair->m_panelRight)); + const int additionalRows = additionalFolderPairs.size(); + if (additionalRows <= 3) //up to 3 additional pairs shall be shown + m_scrolledWindowFolderPairs->SetMinSize(wxSize( -1, pairSize.GetHeight() * additionalRows)); + else //adjust scrollbars + m_scrolledWindowFolderPairs->Fit(); + + //register events + newPair->m_dirPickerLeft->Connect(wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler(MainDialog::OnDirSelected), NULL, this); + newPair->m_dirPickerRight->Connect(wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler(MainDialog::OnDirSelected), NULL, this); + + newPair->m_directoryLeft->Connect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(MainDialog::OnWriteDirManually), NULL, this ); + newPair->m_directoryRight->Connect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(MainDialog::OnWriteDirManually), NULL, this ); + + newPair->m_bpButtonRemovePair->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnRemoveFolderPair), NULL, this ); - //insert directory names if provided - newPair->m_directoryLeft->SetValue(leftDir); - wxString leftDirFormatted = FreeFileSync::getFormattedDirectoryName(leftDir.c_str()).c_str(); - if (wxDirExists(leftDirFormatted)) - newPair->m_dirPickerLeft->SetPath(leftDirFormatted); + //prepare drag & drop + newPair->m_panelLeft->SetDropTarget(new MainWindowDropTarget(this, newPair->m_panelLeft)); //ownership passed + newPair->m_panelRight->SetDropTarget(new MainWindowDropTarget(this, newPair->m_panelRight)); - newPair->m_directoryRight->SetValue(rightDir); - wxString rightDirFormatted = FreeFileSync::getFormattedDirectoryName(rightDir.c_str()).c_str(); - if (wxDirExists(rightDirFormatted)) - newPair->m_dirPickerRight->SetPath(rightDirFormatted); + //insert directory names if provided + newPair->m_directoryLeft->SetValue(i->leftDirectory.c_str()); + const wxString leftDirFormatted = FreeFileSync::getFormattedDirectoryName(i->leftDirectory).c_str(); + if (wxDirExists(leftDirFormatted)) + newPair->m_dirPickerLeft->SetPath(leftDirFormatted); + + newPair->m_directoryRight->SetValue(i->rightDirectory.c_str()); + const wxString rightDirFormatted = FreeFileSync::getFormattedDirectoryName(i->rightDirectory).c_str(); + if (wxDirExists(rightDirFormatted)) + newPair->m_dirPickerRight->SetPath(rightDirFormatted); + } + + //adapt left-shift display distortion caused by scrollbars + if (additionalFolderPairs.size() > 3 && !m_bitmapShift->IsShown()) + { + //m_scrolledWindowFolderPairs and bSizerFolderPairs need to be up to date + m_scrolledWindowFolderPairs->Layout(); + bSizer1->Layout(); + + //calculate scrollbar width + const int shiftToRight = m_scrolledWindowFolderPairs->GetSize().GetWidth() - bSizerFolderPairs->GetSize().GetWidth(); + m_bitmapShift->SetMinSize(wxSize(shiftToRight, -1)); + m_bitmapShift->Show(); + } + + m_scrolledWindowFolderPairs->Layout(); + bSizer1->Layout(); + m_bpButtonSwap->Refresh(); } -void MainDialog::removeFolderPair(bool removeAll) +void MainDialog::removeFolderPair(const int pos, bool refreshLayout) { - if (additionalFolderPairs.size() > 0) + if (0 <= pos && pos < int(additionalFolderPairs.size())) { wxSize pairSize; - do - { //remove folder pairs from window - FolderPairGenerated* pairToDelete = additionalFolderPairs.back(); - pairSize = pairToDelete->GetSize(); - - bSizerFolderPairs->Detach(pairToDelete); //Remove() does not work on Window*, so do it manually - pairToDelete->Destroy(); // - additionalFolderPairs.pop_back(); //remove last element in vector - } - while (removeAll && additionalFolderPairs.size() > 0); + //remove folder pairs from window + FolderPairGenerated* pairToDelete = additionalFolderPairs[pos]; + pairSize = pairToDelete->GetSize(); + + bSizerFolderPairs->Detach(pairToDelete); //Remove() does not work on Window*, so do it manually + pairToDelete->Destroy(); // + additionalFolderPairs.erase(additionalFolderPairs.begin() + pos); //remove last element in vector //set size of scrolled window const int additionalRows = additionalFolderPairs.size(); @@ -2557,17 +2593,32 @@ void MainDialog::removeFolderPair(bool removeAll) //adjust scrollbars (do not put in else clause) m_scrolledWindowFolderPairs->Fit(); - //adjust remove button - if (additionalRows <= 0) - m_bpButtonRemovePair->Disable(); + if (refreshLayout) + { + //adapt left-shift display distortion caused by scrollbars + if (additionalFolderPairs.size() <= 3) + m_bitmapShift->Hide(); - m_scrolledWindowFolderPairs->Layout(); - bSizer1->Layout(); + m_scrolledWindowFolderPairs->Layout(); + bSizer1->Layout(); + } } } -//######################################################################################################## +void MainDialog::clearFolderPairs() +{ + if (additionalFolderPairs.size() > 0) + { + for (int i = int(additionalFolderPairs.size()) - 1; i > 0; --i) + MainDialog::removeFolderPair(i, false); + + //refresh layout just once for improved performance! + MainDialog::removeFolderPair(0, true); + } +} + +//######################################################################################################## CompareStatusHandler::CompareStatusHandler(MainDialog* dlg) : mainDialog(dlg), @@ -2607,10 +2658,6 @@ CompareStatusHandler::CompareStatusHandler(MainDialog* dlg) : mainDialog->m_menubar1->EnableTop(1, false); mainDialog->m_menubar1->EnableTop(2, false); - //display status panel during compare - mainDialog->compareStatus->init(); //clear old values - mainDialog->compareStatus->Show(); - //show abort button mainDialog->m_buttonAbort->Enable(); mainDialog->m_buttonAbort->Show(); @@ -2618,9 +2665,13 @@ CompareStatusHandler::CompareStatusHandler(MainDialog* dlg) : mainDialog->m_buttonCompare->Hide(); mainDialog->m_buttonAbort->SetFocus(); + //display status panel during compare + mainDialog->compareStatus->init(); //clear old values + mainDialog->compareStatus->Show(); + //updateUiNow(); - mainDialog->bSizer1->Layout(); //both sizers need to recalculate! - mainDialog->bSizer6->Layout(); + mainDialog->bSizer1->Layout(); //both sizers need to recalculate! + mainDialog->bSizer6->Layout(); //adapt layout for wxBitmapWithImage mainDialog->Refresh(); } @@ -2666,13 +2717,14 @@ CompareStatusHandler::~CompareStatusHandler() mainDialog->m_buttonAbort->Disable(); mainDialog->m_buttonAbort->Hide(); - mainDialog->m_buttonCompare->Enable(); //enable compare button mainDialog->m_buttonCompare->Show(); //hide status panel from main window mainDialog->compareStatus->Hide(); + mainDialog->bSizer6->Layout(); //adapt layout for wxBitmapWithImage + mainDialog->Layout(); mainDialog->Refresh(); } @@ -2973,7 +3025,7 @@ void MainDialog::OnMenuGlobalSettings(wxCommandEvent& event) wxDialog* settingsDlg = new GlobalSettingsDlg(this, globalSettings); settingsDlg->ShowModal(); - event.Skip(); + //event.Skip(); } @@ -2986,7 +3038,7 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event) if (filePicker->ShowModal() == wxID_OK) { fileName = filePicker->GetPath(); - if (wxFileExists(fileName)) + if (FreeFileSync::fileExists(fileName.c_str())) { wxMessageDialog* messageDlg = new wxMessageDialog(this, wxString(_("File already exists. Overwrite?")) + wxT(" \"") + fileName + wxT("\""), _("Warning") , wxOK | wxCANCEL); @@ -3056,18 +3108,22 @@ void MainDialog::OnMenuBatchJob(wxCommandEvent& event) } +void MainDialog::OnMenuCheckVersion(wxCommandEvent& event) +{ + FreeFileSync::checkForNewVersion(); +} + + void MainDialog::OnMenuAbout(wxCommandEvent& event) { AboutDlg* aboutDlg = new AboutDlg(this); aboutDlg->ShowModal(); - event.Skip(); } void MainDialog::OnMenuQuit(wxCommandEvent& event) { Destroy(); - event.Skip(); } @@ -3120,6 +3176,12 @@ void MainDialog::OnMenuLangGerman(wxCommandEvent& event) } +void MainDialog::OnMenuLangHungarian(wxCommandEvent& event) +{ + switchProgramLanguage(wxLANGUAGE_HUNGARIAN); +} + + void MainDialog::OnMenuLangItalian(wxCommandEvent& event) { switchProgramLanguage(wxLANGUAGE_ITALIAN); @@ -3143,3 +3205,15 @@ void MainDialog::OnMenuLangPortuguese(wxCommandEvent& event) switchProgramLanguage(wxLANGUAGE_PORTUGUESE); } + +void MainDialog::OnMenuLangSlovenian(wxCommandEvent& event) +{ + switchProgramLanguage(wxLANGUAGE_SLOVENIAN); +} + + +void MainDialog::OnMenuLangSpanish(wxCommandEvent& event) +{ + switchProgramLanguage(wxLANGUAGE_SPANISH); +} + diff --git a/ui/MainDialog.h b/ui/MainDialog.h index fe5471a1..6e60fab3 100644 --- a/ui/MainDialog.h +++ b/ui/MainDialog.h @@ -17,6 +17,7 @@ #include <stack> #include "../library/processXml.h" #include <wx/event.h> +#include <memory> //IDs for context menu items @@ -69,10 +70,14 @@ private: void updateFilterButton(wxBitmapButton* filterButton, bool isActive); void updateCompareButtons(); - void addCfgFileToHistory(const wxString& filename); + void addFileToCfgHistory(const wxString& filename); + void addLeftFolderToHistory(const wxString& leftFolder); + void addRightFolderToHistory(const wxString& rightFolder); - void addFolderPair(const wxString& leftDir, const wxString& rightDir); - void removeFolderPair(bool removeAll = false); + void addFolderPair(const Zstring& leftDir, const Zstring& rightDir); + void addFolderPair(const std::vector<FolderPair>& newPairs); + void removeFolderPair(const int pos, bool refreshLayout = true); //keep it an int, allow negative values! + void clearFolderPairs(); //main method for putting gridData on UI: maps data respecting current view settings void writeGrid(const FileCompareResult& gridData); @@ -94,10 +99,6 @@ private: void clearStatusBar(); //events - void onGridLeftAccess( wxEvent& event); - void onGridRightAccess( wxEvent& event); - void onGridMiddleAccess(wxEvent& event); - void onGridLeftButtonEvent(wxKeyEvent& event); void onGridRightButtonEvent(wxKeyEvent& event); void onGridMiddleButtonEvent(wxKeyEvent& event); @@ -134,7 +135,8 @@ private: void OnLoadConfig( wxCommandEvent& event); void OnLoadFromHistory( wxCommandEvent& event); void loadConfiguration(const wxString& filename); - void OnChoiceKeyEvent( wxKeyEvent& event ); + void OnCfgHistoryKeyEvent( wxKeyEvent& event); + void OnFolderHistoryKeyEvent(wxKeyEvent& event); void OnFilesDropped( FfsFileDropEvent& event); void onResizeMainWindow( wxEvent& event); @@ -160,6 +162,7 @@ private: void OnMenuGlobalSettings( wxCommandEvent& event); void OnMenuExportFileList( wxCommandEvent& event); void OnMenuBatchJob( wxCommandEvent& event); + void OnMenuCheckVersion( wxCommandEvent& event); void OnMenuAbout( wxCommandEvent& event); void OnMenuQuit( wxCommandEvent& event); void OnMenuLangChineseSimp( wxCommandEvent& event); @@ -167,10 +170,13 @@ private: void OnMenuLangEnglish( wxCommandEvent& event); void OnMenuLangFrench( wxCommandEvent& event); void OnMenuLangGerman( wxCommandEvent& event); + void OnMenuLangHungarian( wxCommandEvent& event); void OnMenuLangItalian( wxCommandEvent& event); void OnMenuLangJapanese( wxCommandEvent& event); void OnMenuLangPolish( wxCommandEvent& event); void OnMenuLangPortuguese( wxCommandEvent& event); + void OnMenuLangSlovenian( wxCommandEvent& event); + void OnMenuLangSpanish( wxCommandEvent& event); void switchProgramLanguage(const int langID); void enableSynchronization(bool value); @@ -255,8 +261,6 @@ private: //remember last sort executed (for determination of sort order) int lastSortColumn; const wxGrid* lastSortGrid; - - const wxGrid* leadGrid; //point to grid that is in focus }; //###################################################################################### @@ -309,17 +313,17 @@ public: CompareStatusHandler(MainDialog* dlg); ~CompareStatusHandler(); - void updateStatusText(const Zstring& text); - void initNewProcess(int objectsTotal, double dataTotal, Process processID); - void updateProcessedData(int objectsProcessed, double dataProcessed); - void forceUiRefresh(); + virtual void updateStatusText(const Zstring& text); + virtual void initNewProcess(int objectsTotal, double dataTotal, Process processID); + virtual void updateProcessedData(int objectsProcessed, double dataProcessed); + virtual void forceUiRefresh(); - ErrorHandler::Response reportError(const Zstring& text); - void reportFatalError(const Zstring& errorMessage); - void reportWarning(const Zstring& warningMessage, bool& dontShowAgain); + virtual ErrorHandler::Response reportError(const Zstring& text); + virtual void reportFatalError(const Zstring& errorMessage); + virtual void reportWarning(const Zstring& warningMessage, bool& dontShowAgain); private: - void abortThisProcess(); + virtual void abortThisProcess(); MainDialog* mainDialog; bool ignoreErrors; @@ -333,17 +337,17 @@ public: SyncStatusHandler(wxWindow* dlg, bool ignoreAllErrors); ~SyncStatusHandler(); - void updateStatusText(const Zstring& text); - void initNewProcess(int objectsTotal, double dataTotal, Process processID); - void updateProcessedData(int objectsProcessed, double dataProcessed); - void forceUiRefresh(); + virtual void updateStatusText(const Zstring& text); + virtual void initNewProcess(int objectsTotal, double dataTotal, Process processID); + virtual void updateProcessedData(int objectsProcessed, double dataProcessed); + virtual void forceUiRefresh(); - ErrorHandler::Response reportError(const Zstring& text); - void reportFatalError(const Zstring& errorMessage); - void reportWarning(const Zstring& warningMessage, bool& dontShowAgain); + virtual ErrorHandler::Response reportError(const Zstring& text); + virtual void reportFatalError(const Zstring& errorMessage); + virtual void reportWarning(const Zstring& warningMessage, bool& dontShowAgain); private: - void abortThisProcess(); + virtual void abortThisProcess(); SyncStatus* syncStatusFrame; bool ignoreErrors; diff --git a/ui/SmallDialogs.cpp b/ui/SmallDialogs.cpp index 69952f67..c32f8ce6 100644 --- a/ui/SmallDialogs.cpp +++ b/ui/SmallDialogs.cpp @@ -189,7 +189,6 @@ DeleteDialog::DeleteDialog(wxWindow* main, m_checkBoxUseRecycler->SetValue(useRecycleBin); updateTexts(); - m_bitmap12->SetBitmap(*globalResource.bitmapDeleteFile); m_buttonOK->SetFocus(); } @@ -198,9 +197,15 @@ void DeleteDialog::updateTexts() { wxString headerText; if (m_checkBoxUseRecycler->GetValue()) + { headerText = _("Do you really want to move the following objects(s) to the Recycle Bin?"); + m_bitmap12->SetBitmap(*globalResource.bitmapRecycler); + } else + { headerText = _("Do you really want to delete the following objects(s)?"); + m_bitmap12->SetBitmap(*globalResource.bitmapDeleteFile); + } m_staticTextHeader->SetLabel(headerText); wxString filesToDelete = FreeFileSync::deleteFromGridAndHDPreview(mainGrid, @@ -264,13 +269,19 @@ ErrorDlg::ErrorDlg(wxWindow* parentWindow, const int activeButtons, const wxStri m_checkBoxIgnoreErrors->Hide(); } - if (activeButtons & BUTTON_RETRY) - m_buttonRetry->SetFocus(); - else + if (~activeButtons & BUTTON_RETRY) m_buttonRetry->Hide(); if (~activeButtons & BUTTON_ABORT) m_buttonAbort->Hide(); + + //set button focus precedence + if (activeButtons & BUTTON_RETRY) + m_buttonRetry->SetFocus(); + else if (activeButtons & BUTTON_IGNORE) + m_buttonIgnore->SetFocus(); + else if (activeButtons & BUTTON_ABORT) + m_buttonAbort->SetFocus(); } ErrorDlg::~ErrorDlg() {} @@ -320,6 +331,12 @@ WarningDlg::WarningDlg(wxWindow* parentWindow, int activeButtons, const wxStrin if (~activeButtons & BUTTON_ABORT) m_buttonAbort->Hide(); + + //set button focus precedence + else if (activeButtons & BUTTON_IGNORE) + m_buttonIgnore->SetFocus(); + else if (activeButtons & BUTTON_ABORT) + m_buttonAbort->SetFocus(); } WarningDlg::~WarningDlg() {} @@ -454,11 +471,7 @@ GlobalSettingsDlg::GlobalSettingsDlg(wxWindow* window, xmlAccess::XmlGlobalSetti m_bitmapSettings->SetBitmap(*globalResource.bitmapSettings); m_buttonResetWarnings->setBitmapFront(*globalResource.bitmapWarningSmall, 5); -#ifdef FFS_WIN - m_checkBoxHandleDstFat->SetValue(globalSettings.shared.handleDstOnFat32); -#else - m_checkBoxHandleDstFat->Hide(); -#endif + m_spinCtrlFileTimeTolerance->SetValue(globalSettings.shared.fileTimeTolerance); m_textCtrlFileManager->SetValue(globalSettings.gui.commandLineFileManager); Fit(); @@ -468,9 +481,8 @@ GlobalSettingsDlg::GlobalSettingsDlg(wxWindow* window, xmlAccess::XmlGlobalSetti void GlobalSettingsDlg::OnOkay(wxCommandEvent& event) { //write global settings only when okay-button is pressed! -#ifdef FFS_WIN - settings.shared.handleDstOnFat32 = m_checkBoxHandleDstFat->GetValue(); -#endif + + settings.shared.fileTimeTolerance = m_spinCtrlFileTimeTolerance->GetValue(); settings.gui.commandLineFileManager = m_textCtrlFileManager->GetValue(); EndModal(BUTTON_OKAY); @@ -487,7 +499,7 @@ void GlobalSettingsDlg::OnResetWarnings(wxCommandEvent& event) void GlobalSettingsDlg::OnDefault(wxCommandEvent& event) { - m_checkBoxHandleDstFat->SetValue(true); + m_spinCtrlFileTimeTolerance->SetValue(2); #ifdef FFS_WIN m_textCtrlFileManager->SetValue(wxT("explorer /select, %name")); #elif defined FFS_LINUX @@ -612,7 +624,8 @@ SyncStatus::SyncStatus(StatusHandler* updater, wxWindow* parentWindow) : scalingFactor(0), currentObjects(0), totalObjects(0), - processPaused(false) + processPaused(false), + currentStatus(SyncStatus::ABORTED) { m_animationControl1->SetAnimation(*globalResource.animationSync); m_animationControl1->Play(); @@ -674,7 +687,7 @@ void SyncStatus::updateStatusDialogNow() bool screenChanged = false; //avoid screen flicker by calling layout() only if necessary //progress indicator - m_gauge1->SetValue(int(currentData * scalingFactor)); + m_gauge1->SetValue(globalFunctions::round(currentData * scalingFactor)); //status text if (m_textCtrlInfo->GetValue() != wxString(currentStatusText.c_str()) && (screenChanged = true)) //avoid screen flicker @@ -751,6 +764,9 @@ void SyncStatus::setCurrentStatus(SyncStatusID id) m_staticTextStatus->SetLabel(_("Synchronizing...")); break; } + + currentStatus = id; + Layout(); } @@ -784,8 +800,11 @@ void SyncStatus::OnOkay(wxCommandEvent& event) void SyncStatus::OnPause(wxCommandEvent& event) { + static SyncStatusID previousStatus = SyncStatus::ABORTED; + if (processPaused) { + setCurrentStatus(previousStatus); processPaused = false; m_buttonPause->SetLabel(_("Pause")); m_animationControl1->Play(); @@ -793,6 +812,9 @@ void SyncStatus::OnPause(wxCommandEvent& event) } else { + previousStatus = currentStatus; //save current status + + setCurrentStatus(SyncStatus::PAUSE); processPaused = true; m_buttonPause->SetLabel(_("Continue")); m_animationControl1->Stop(); @@ -919,9 +941,15 @@ void CompareStatus::updateStatusPanelNow() { bool screenChanged = false; //avoid screen flicker by calling layout() only if necessary + //remove linebreaks from currentStatusText + wxString formattedStatusText = currentStatusText.c_str(); + for (wxString::iterator i = formattedStatusText.begin(); i != formattedStatusText.end(); ++i) + if (*i == wxChar('\n')) + *i = wxChar(' '); + //status texts - if (m_textCtrlFilename->GetValue() != wxString(currentStatusText.c_str()) && (screenChanged = true)) //avoid screen flicker - m_textCtrlFilename->SetValue(currentStatusText.c_str()); + if (m_textCtrlFilename->GetValue() != formattedStatusText && (screenChanged = true)) //avoid screen flicker + m_textCtrlFilename->SetValue(formattedStatusText); //nr of scanned objects const wxString scannedObjTmp = globalFunctions::numberToWxString(scannedObjects); diff --git a/ui/SmallDialogs.h b/ui/SmallDialogs.h index 1425d822..0e310d94 100644 --- a/ui/SmallDialogs.h +++ b/ui/SmallDialogs.h @@ -227,6 +227,7 @@ private: Zstring currentStatusText; bool processPaused; + SyncStatusID currentStatus; }; /* diff --git a/ui/SyncDialog.cpp b/ui/SyncDialog.cpp index 99c7dfde..fe36d751 100644 --- a/ui/SyncDialog.cpp +++ b/ui/SyncDialog.cpp @@ -207,15 +207,11 @@ void SyncDialog::calculatePreview() objectsToDelete, dataToProcess); - wxString toCreate = globalFunctions::numberToWxString(objectsToCreate); - wxString toUpdate = globalFunctions::numberToWxString(objectsToOverwrite); - wxString toDelete = globalFunctions::numberToWxString(objectsToDelete); + wxString toCreate = globalFunctions::includeNumberSeparator(globalFunctions::numberToWxString(objectsToCreate)); + wxString toUpdate = globalFunctions::includeNumberSeparator(globalFunctions::numberToWxString(objectsToOverwrite)); + wxString toDelete = globalFunctions::includeNumberSeparator(globalFunctions::numberToWxString(objectsToDelete)); wxString data = FreeFileSync::formatFilesizeToShortString(dataToProcess); - globalFunctions::includeNumberSeparator(toCreate); - globalFunctions::includeNumberSeparator(toUpdate); - globalFunctions::includeNumberSeparator(toDelete); - m_textCtrlCreate->SetValue(toCreate); m_textCtrlUpdate->SetValue(toUpdate); m_textCtrlDelete->SetValue(toDelete); @@ -629,7 +625,7 @@ void BatchDialog::OnSaveBatchJob(wxCommandEvent& event) if (filePicker->ShowModal() == wxID_OK) { fileName = filePicker->GetPath(); - if (wxFileExists(fileName)) + if (FreeFileSync::fileExists(fileName.c_str())) { wxMessageDialog* messageDlg = new wxMessageDialog(this, wxString(_("File already exists. Overwrite?")) + wxT(" \"") + fileName + wxT("\""), _("Warning") , wxOK | wxCANCEL); diff --git a/ui/checkVersion.cpp b/ui/checkVersion.cpp new file mode 100644 index 00000000..5344b45e --- /dev/null +++ b/ui/checkVersion.cpp @@ -0,0 +1,70 @@ +#include "checkVersion.h" + +#include <wx/protocol/http.h> +#include <wx/sstream.h> +#include "../version/version.h" +#include <wx/msgdlg.h> +#include <wx/utils.h> + + +class CloseConnectionOnExit +{ +public: + CloseConnectionOnExit(wxInputStream* httpStream, wxHTTP& webAccess) : + m_httpStream(httpStream), + m_webAccess(webAccess) {} + + ~CloseConnectionOnExit() + { + delete m_httpStream; //must be deleted BEFORE webAccess is closed + m_webAccess.Close(); + } + +private: + wxInputStream* m_httpStream; + wxHTTP& m_webAccess; +}; + + +void FreeFileSync::checkForNewVersion() +{ + wxHTTP webAccess; + wxInputStream* httpStream = NULL; + + wxWindowDisabler dummy; + CloseConnectionOnExit dummy2(httpStream, webAccess); + + webAccess.SetHeader(wxT("Content-type"), wxT("text/html; charset=utf-8")); + webAccess.SetTimeout(10); //10 seconds of timeout instead of 10 minutes... + + if (webAccess.Connect(wxT("freefilesync.cvs.sourceforge.net"))) //only the server, no pages here yet... + { + //wxApp::IsMainLoopRunning(); // should return true + + httpStream = webAccess.GetInputStream(wxT("/viewvc/*checkout*/freefilesync/version/version.txt")); + + if (httpStream && webAccess.GetError() == wxPROTO_NOERR) + { + wxString newestVersion; + wxStringOutputStream out_stream(&newestVersion); + httpStream->Read(out_stream); + if (!newestVersion.empty()) + { + if (FreeFileSync::currentVersion == newestVersion) + { + wxMessageBox(_("FreeFileSync is up to date!"), _("Information"), wxICON_INFORMATION); + return; + } + else + { + const int rv = wxMessageBox(wxString(_("A newer version is available:")) + wxT(" v") + newestVersion + wxT(". ") + _("Download now?"), _("Information"), wxYES_NO | wxICON_QUESTION); + if (rv == wxYES) + wxLaunchDefaultBrowser(wxT("http://sourceforge.net/project/showfiles.php?group_id=234430")); + return; + } + } + } + } + + wxMessageBox(_("Unable to connect to sourceforge.net!"), _("Error"), wxOK | wxICON_ERROR); +} diff --git a/ui/checkVersion.h b/ui/checkVersion.h new file mode 100644 index 00000000..e6705774 --- /dev/null +++ b/ui/checkVersion.h @@ -0,0 +1,10 @@ +#ifndef UPDATEVERSION_H_INCLUDED +#define UPDATEVERSION_H_INCLUDED + + +namespace FreeFileSync +{ + void checkForNewVersion(); +} + +#endif // UPDATEVERSION_H_INCLUDED diff --git a/ui/guiGenerated.cpp b/ui/guiGenerated.cpp index 7be9b488..c7188b38 100644 --- a/ui/guiGenerated.cpp +++ b/ui/guiGenerated.cpp @@ -14,1264 +14,1308 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - m_menubar1 = new wxMenuBar( 0 ); - m_menu1 = new wxMenu(); - m_menuItem10 = new wxMenuItem( m_menu1, wxID_ANY, wxString( _("1. &Compare") ) + wxT('\t') + wxT("ALT-C"), wxEmptyString, wxITEM_NORMAL ); - m_menu1->Append( m_menuItem10 ); - - m_menuItem11 = new wxMenuItem( m_menu1, wxID_ANY, wxString( _("2. &Synchronize...") ) + wxT('\t') + wxT("ALT-S"), wxEmptyString, wxITEM_NORMAL ); - m_menu1->Append( m_menuItem11 ); - - m_menu1->AppendSeparator(); - - wxMenuItem* m_menuItem14; - m_menuItem14 = new wxMenuItem( m_menu1, wxID_ANY, wxString( _("S&ave configuration") ) + wxT('\t') + wxT("CTRL-S"), wxEmptyString, wxITEM_NORMAL ); - m_menu1->Append( m_menuItem14 ); - - wxMenuItem* m_menuItem13; - m_menuItem13 = new wxMenuItem( m_menu1, wxID_ANY, wxString( _("&Load configuration") ) + wxT('\t') + wxT("CTRL-L"), wxEmptyString, wxITEM_NORMAL ); - m_menu1->Append( m_menuItem13 ); - - m_menu1->AppendSeparator(); - - wxMenuItem* m_menuItem4; - m_menuItem4 = new wxMenuItem( m_menu1, wxID_EXIT, wxString( _("&Quit") ) + wxT('\t') + wxT("CTRL-Q"), wxEmptyString, wxITEM_NORMAL ); - m_menu1->Append( m_menuItem4 ); - - m_menubar1->Append( m_menu1, _("&File") ); - - m_menu3 = new wxMenu(); - m_menu31 = new wxMenu(); - m_menuItemGerman = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Deutsch") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemGerman ); - - m_menuItemEnglish = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("English") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemEnglish ); - - m_menuItemFrench = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Français") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemFrench ); - - m_menuItemItalian = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Italiano") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemItalian ); - - m_menuItemPolish = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Język Polski") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemPolish ); - - m_menuItemDutch = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Nederlands") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemDutch ); - - m_menuItemPortuguese = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Português") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemPortuguese ); - - m_menuItemJapanese = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("日本語") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemJapanese ); - - m_menuItemChineseSimple = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("简体中文") ) , wxEmptyString, wxITEM_RADIO ); - m_menu31->Append( m_menuItemChineseSimple ); - - m_menu3->Append( -1, _("&Language"), m_menu31 ); - - m_menu3->AppendSeparator(); - - m_menuItemGlobSett = new wxMenuItem( m_menu3, wxID_ANY, wxString( _("&Global settings") ) , wxEmptyString, wxITEM_NORMAL ); - m_menu3->Append( m_menuItemGlobSett ); - - m_menuItem7 = new wxMenuItem( m_menu3, wxID_ANY, wxString( _("&Create batch job") ) , wxEmptyString, wxITEM_NORMAL ); - m_menu3->Append( m_menuItem7 ); - - wxMenuItem* m_menuItem5; - m_menuItem5 = new wxMenuItem( m_menu3, wxID_ANY, wxString( _("&Export file list") ) , wxEmptyString, wxITEM_NORMAL ); - m_menu3->Append( m_menuItem5 ); - - m_menubar1->Append( m_menu3, _("&Advanced") ); - - m_menu2 = new wxMenu(); - wxMenuItem* m_menuItem3; - m_menuItem3 = new wxMenuItem( m_menu2, wxID_ABOUT, wxString( _("&About...") ) + wxT('\t') + wxT("F1"), wxEmptyString, wxITEM_NORMAL ); - m_menu2->Append( m_menuItem3 ); - - m_menubar1->Append( m_menu2, _("&Help") ); - - this->SetMenuBar( m_menubar1 ); - - bSizer1 = new wxBoxSizer( wxVERTICAL ); - - m_panel71 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER|wxTAB_TRAVERSAL ); - bSizer6 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer6->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer30; - bSizer30 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonCompare = new wxButtonWithImage( m_panel71, wxID_OK, _("&Compare"), wxDefaultPosition, wxSize( 180,37 ), 0 ); - m_buttonCompare->SetDefault(); - m_buttonCompare->SetFont( wxFont( 14, 74, 90, 92, false, wxT("Arial Black") ) ); - m_buttonCompare->SetToolTip( _("Compare both sides") ); - - bSizer30->Add( m_buttonCompare, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_buttonAbort = new wxButton( m_panel71, wxID_CANCEL, _("Abort"), wxDefaultPosition, wxSize( 180,37 ), 0 ); - m_buttonAbort->SetFont( wxFont( 14, 74, 90, 92, false, wxT("Tahoma") ) ); - m_buttonAbort->Enable( false ); - m_buttonAbort->Hide(); - - bSizer30->Add( m_buttonAbort, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); - - bSizer6->Add( bSizer30, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer55; - bSizer55 = new wxBoxSizer( wxVERTICAL ); - - wxStaticBoxSizer* sbSizer6; - sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( m_panel71, wxID_ANY, _("Compare by...") ), wxHORIZONTAL ); - - wxBoxSizer* bSizer45; - bSizer45 = new wxBoxSizer( wxVERTICAL ); - - m_radioBtnSizeDate = new wxRadioButton( m_panel71, wxID_ANY, _("File size and date"), wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnSizeDate->SetValue( true ); - m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same.") ); - - bSizer45->Add( m_radioBtnSizeDate, 0, 0, 5 ); - - m_radioBtnContent = new wxRadioButton( m_panel71, wxID_ANY, _("File content"), wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnContent->SetToolTip( _("Files are found equal if\n - file content\nis the same.") ); - - bSizer45->Add( m_radioBtnContent, 0, wxTOP, 5 ); - - sbSizer6->Add( bSizer45, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton14 = new wxBitmapButton( m_panel71, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - m_bpButton14->SetToolTip( _("Help") ); - - m_bpButton14->SetToolTip( _("Help") ); - - sbSizer6->Add( m_bpButton14, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - bSizer55->Add( sbSizer6, 0, wxALIGN_CENTER_VERTICAL, 2 ); - - - bSizer55->Add( 0, 4, 0, 0, 5 ); - - bSizer6->Add( bSizer55, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer6->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer56; - bSizer56 = new wxBoxSizer( wxVERTICAL ); - - wxStaticBoxSizer* sbSizer9; - sbSizer9 = new wxStaticBoxSizer( new wxStaticBox( m_panel71, wxID_ANY, _("Filter files") ), wxHORIZONTAL ); - - m_bpButtonFilter = new wxBitmapButton( m_panel71, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); - sbSizer9->Add( m_bpButtonFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - wxBoxSizer* bSizer23; - bSizer23 = new wxBoxSizer( wxVERTICAL ); - - m_hyperlinkCfgFilter = new wxHyperlinkCtrl( m_panel71, wxID_ANY, _("Configure filter..."), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - - m_hyperlinkCfgFilter->SetNormalColour( wxColour( 0, 0, 255 ) ); - m_hyperlinkCfgFilter->SetVisitedColour( wxColour( 0, 0, 255 ) ); - bSizer23->Add( m_hyperlinkCfgFilter, 0, wxALL, 5 ); - - m_checkBoxHideFilt = new wxCheckBox( m_panel71, wxID_ANY, _("Hide filtered items"), wxDefaultPosition, wxDefaultSize, 0 ); - - m_checkBoxHideFilt->SetToolTip( _("Choose to hide filtered files/directories from list") ); - - bSizer23->Add( m_checkBoxHideFilt, 0, 0, 5 ); - - sbSizer9->Add( bSizer23, 0, 0, 5 ); - - bSizer56->Add( sbSizer9, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer56->Add( 0, 4, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer6->Add( bSizer56, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonSync = new wxButtonWithImage( m_panel71, wxID_ANY, _("&Synchronize..."), wxDefaultPosition, wxSize( 180,37 ), 0 ); - m_buttonSync->SetFont( wxFont( 14, 74, 90, 92, false, wxT("Arial Black") ) ); - m_buttonSync->SetToolTip( _("Open synchronization dialog") ); - - bSizer6->Add( m_buttonSync, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - - bSizer6->Add( 15, 0, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - m_panel71->SetSizer( bSizer6 ); - m_panel71->Layout(); - bSizer6->Fit( m_panel71 ); - bSizer1->Add( m_panel71, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - - wxBoxSizer* bSizer91; - bSizer91 = new wxBoxSizer( wxHORIZONTAL ); - - m_panel11 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer92; - bSizer92 = new wxBoxSizer( wxVERTICAL ); - - sbSizer2 = new wxStaticBoxSizer( new wxStaticBox( m_panel11, wxID_ANY, _("Drag && drop") ), wxHORIZONTAL ); - - m_directoryLeft = new wxTextCtrl( m_panel11, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - sbSizer2->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_dirPickerLeft = new wxDirPickerCtrl( m_panel11, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DIR_MUST_EXIST ); - sbSizer2->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer92->Add( sbSizer2, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); - - m_panel11->SetSizer( bSizer92 ); - m_panel11->Layout(); - bSizer92->Fit( m_panel11 ); - bSizer91->Add( m_panel11, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panel13 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer93; - bSizer93 = new wxBoxSizer( wxVERTICAL ); - - - bSizer93->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizerMiddle = new wxBoxSizer( wxHORIZONTAL ); - - m_bpButtonSwap = new wxBitmapButton( m_panel13, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - m_bpButtonSwap->SetToolTip( _("Swap sides") ); - - m_bpButtonSwap->SetToolTip( _("Swap sides") ); - - bSizerMiddle->Add( m_bpButtonSwap, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer93->Add( bSizerMiddle, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - - bSizer93->Add( 0, 0, 0, 0, 5 ); - - m_panel13->SetSizer( bSizer93 ); - m_panel13->Layout(); - bSizer93->Fit( m_panel13 ); - bSizer91->Add( m_panel13, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_panel12 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer94; - bSizer94 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer77; - bSizer77 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer781; - bSizer781 = new wxBoxSizer( wxVERTICAL ); - - - bSizer781->Add( 0, 3, 0, 0, 5 ); - - m_bpButtonRemovePair = new wxBitmapButton( m_panel12, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 18,21 ), wxBU_AUTODRAW ); - m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); - - m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); - - bSizer781->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonAddPair = new wxBitmapButton( m_panel12, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 18,21 ), wxBU_AUTODRAW ); - m_bpButtonAddPair->SetToolTip( _("Add folder pair") ); - - m_bpButtonAddPair->SetToolTip( _("Add folder pair") ); - - bSizer781->Add( m_bpButtonAddPair, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer77->Add( bSizer781, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - wxStaticBoxSizer* sbSizer3; - sbSizer3 = new wxStaticBoxSizer( new wxStaticBox( m_panel12, wxID_ANY, _("Drag && drop") ), wxHORIZONTAL ); - - m_directoryRight = new wxTextCtrl( m_panel12, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - sbSizer3->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_dirPickerRight = new wxDirPickerCtrl( m_panel12, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DIR_MUST_EXIST ); - sbSizer3->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer77->Add( sbSizer3, 1, wxRIGHT|wxLEFT, 5 ); - - bSizer94->Add( bSizer77, 0, wxEXPAND, 5 ); - - m_panel12->SetSizer( bSizer94 ); - m_panel12->Layout(); - bSizer94->Fit( m_panel12 ); - bSizer91->Add( m_panel12, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer1->Add( bSizer91, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_scrolledWindowFolderPairs = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxHSCROLL|wxVSCROLL ); - m_scrolledWindowFolderPairs->SetScrollRate( 5, 5 ); - m_scrolledWindowFolderPairs->SetMinSize( wxSize( -1,0 ) ); - - bSizerFolderPairs = new wxBoxSizer( wxVERTICAL ); - - m_scrolledWindowFolderPairs->SetSizer( bSizerFolderPairs ); - m_scrolledWindowFolderPairs->Layout(); - bSizerFolderPairs->Fit( m_scrolledWindowFolderPairs ); - bSizer1->Add( m_scrolledWindowFolderPairs, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - wxBoxSizer* bSizer2; - bSizer2 = new wxBoxSizer( wxHORIZONTAL ); - - m_panel1 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer7; - bSizer7 = new wxBoxSizer( wxVERTICAL ); - - m_gridLeft = new CustomGridLeft( m_panel1, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - - // Grid - m_gridLeft->CreateGrid( 15, 4 ); - m_gridLeft->EnableEditing( false ); - m_gridLeft->EnableGridLines( true ); - m_gridLeft->EnableDragGridSize( true ); - m_gridLeft->SetMargins( 0, 0 ); - - // Columns - m_gridLeft->EnableDragColMove( false ); - m_gridLeft->EnableDragColSize( true ); - m_gridLeft->SetColLabelSize( 20 ); - m_gridLeft->SetColLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); - - // Rows - m_gridLeft->EnableDragRowSize( false ); - m_gridLeft->SetRowLabelSize( 38 ); - m_gridLeft->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); - - // Label Appearance - - // Cell Defaults - m_gridLeft->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); - bSizer7->Add( m_gridLeft, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 ); - - m_panel1->SetSizer( bSizer7 ); - m_panel1->Layout(); - bSizer7->Fit( m_panel1 ); - bSizer2->Add( m_panel1, 1, wxEXPAND, 5 ); - - m_panel3 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer18; - bSizer18 = new wxBoxSizer( wxVERTICAL ); - - m_gridMiddle = new CustomGridMiddle( m_panel3, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - - // Grid - m_gridMiddle->CreateGrid( 15, 1 ); - m_gridMiddle->EnableEditing( false ); - m_gridMiddle->EnableGridLines( true ); - m_gridMiddle->EnableDragGridSize( false ); - m_gridMiddle->SetMargins( 0, 0 ); - - // Columns - m_gridMiddle->SetColSize( 0, 45 ); - m_gridMiddle->EnableDragColMove( false ); - m_gridMiddle->EnableDragColSize( false ); - m_gridMiddle->SetColLabelSize( 20 ); - m_gridMiddle->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); - - // Rows - m_gridMiddle->EnableDragRowSize( false ); - m_gridMiddle->SetRowLabelSize( 0 ); - m_gridMiddle->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); - - // Label Appearance - - // Cell Defaults - m_gridMiddle->SetDefaultCellFont( wxFont( 12, 74, 90, 92, false, wxT("Arial") ) ); - m_gridMiddle->SetDefaultCellAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); - bSizer18->Add( m_gridMiddle, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxBOTTOM, 5 ); - - m_panel3->SetSizer( bSizer18 ); - m_panel3->Layout(); - bSizer18->Fit( m_panel3 ); - bSizer2->Add( m_panel3, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); - - m_panel2 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer10; - bSizer10 = new wxBoxSizer( wxVERTICAL ); - - m_gridRight = new CustomGridRight( m_panel2, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - - // Grid - m_gridRight->CreateGrid( 15, 4 ); - m_gridRight->EnableEditing( false ); - m_gridRight->EnableGridLines( true ); - m_gridRight->EnableDragGridSize( true ); - m_gridRight->SetMargins( 0, 0 ); - - // Columns - m_gridRight->EnableDragColMove( false ); - m_gridRight->EnableDragColSize( true ); - m_gridRight->SetColLabelSize( 20 ); - m_gridRight->SetColLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); - - // Rows - m_gridRight->EnableDragRowSize( false ); - m_gridRight->SetRowLabelSize( 38 ); - m_gridRight->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); - - // Label Appearance - - // Cell Defaults - m_gridRight->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); - bSizer10->Add( m_gridRight, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 ); - - m_panel2->SetSizer( bSizer10 ); - m_panel2->Layout(); - bSizer10->Fit( m_panel2 ); - bSizer2->Add( m_panel2, 1, wxEXPAND, 5 ); - - bSizer1->Add( bSizer2, 1, wxEXPAND, 5 ); - - wxPanel* m_panel4; - m_panel4 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - bSizer3 = new wxBoxSizer( wxHORIZONTAL ); - - bSizer58 = new wxBoxSizer( wxVERTICAL ); - - wxStaticBoxSizer* sbSizer16; - sbSizer16 = new wxStaticBoxSizer( new wxStaticBox( m_panel4, wxID_ANY, _("Configuration") ), wxHORIZONTAL ); - - m_bpButtonSave = new wxBitmapButton( m_panel4, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - m_bpButtonSave->SetToolTip( _("Save current configuration to file") ); - - m_bpButtonSave->SetToolTip( _("Save current configuration to file") ); - - sbSizer16->Add( m_bpButtonSave, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_bpButtonLoad = new wxBitmapButton( m_panel4, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - m_bpButtonLoad->SetToolTip( _("Load configuration from file") ); - - m_bpButtonLoad->SetToolTip( _("Load configuration from file") ); - - sbSizer16->Add( m_bpButtonLoad, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - wxArrayString m_choiceHistoryChoices; - m_choiceHistory = new wxChoice( m_panel4, wxID_ANY, wxDefaultPosition, wxSize( 150,-1 ), m_choiceHistoryChoices, 0 ); - m_choiceHistory->SetSelection( 0 ); - m_choiceHistory->SetToolTip( _("Load configuration history (press DEL to delete items)") ); - - sbSizer16->Add( m_choiceHistory, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer58->Add( sbSizer16, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - - bSizer58->Add( 0, 4, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer3->Add( bSizer58, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panel112 = new wxPanel( m_panel4, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer64; - bSizer64 = new wxBoxSizer( wxVERTICAL ); - - wxStaticBoxSizer* sbSizer31; - sbSizer31 = new wxStaticBoxSizer( new wxStaticBox( m_panel112, wxID_ANY, _("Filter view") ), wxHORIZONTAL ); - - sbSizer31->SetMinSize( wxSize( 100,-1 ) ); - - sbSizer31->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_bpButtonLeftOnly = new wxBitmapButton( m_panel112, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - sbSizer31->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonLeftNewer = new wxBitmapButton( m_panel112, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - sbSizer31->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonEqual = new wxBitmapButton( m_panel112, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - sbSizer31->Add( m_bpButtonEqual, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonDifferent = new wxBitmapButton( m_panel112, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - sbSizer31->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonRightNewer = new wxBitmapButton( m_panel112, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - sbSizer31->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonRightOnly = new wxBitmapButton( m_panel112, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - sbSizer31->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - sbSizer31->Add( 0, 0, 1, wxEXPAND, 5 ); - - bSizer64->Add( sbSizer31, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_panel112->SetSizer( bSizer64 ); - m_panel112->Layout(); - bSizer64->Fit( m_panel112 ); - bSizer3->Add( m_panel112, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 4 ); - - wxBoxSizer* bSizer66; - bSizer66 = new wxBoxSizer( wxVERTICAL ); - - m_bpButton10 = new wxBitmapButton( m_panel4, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 50,50 ), wxBU_AUTODRAW ); - m_bpButton10->SetToolTip( _("Quit") ); - - m_bpButton10->SetToolTip( _("Quit") ); - - bSizer66->Add( m_bpButton10, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); - - bSizer3->Add( bSizer66, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panel4->SetSizer( bSizer3 ); - m_panel4->Layout(); - bSizer3->Fit( m_panel4 ); - bSizer1->Add( m_panel4, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_panel7 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer451; - bSizer451 = new wxBoxSizer( wxHORIZONTAL ); - - bSizer451->SetMinSize( wxSize( -1,22 ) ); - wxBoxSizer* bSizer53; - bSizer53 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextStatusLeft = new wxStaticText( m_panel7, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusLeft->Wrap( -1 ); - m_staticTextStatusLeft->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer53->Add( m_staticTextStatusLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer451->Add( bSizer53, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticline9 = new wxStaticLine( m_panel7, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer451->Add( m_staticline9, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxEXPAND, 2 ); - - - bSizer451->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextStatusMiddle = new wxStaticText( m_panel7, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusMiddle->Wrap( -1 ); - m_staticTextStatusMiddle->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer451->Add( m_staticTextStatusMiddle, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer451->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticline10 = new wxStaticLine( m_panel7, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer451->Add( m_staticline10, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP, 2 ); - - wxBoxSizer* bSizer52; - bSizer52 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextStatusRight = new wxStaticText( m_panel7, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusRight->Wrap( -1 ); - m_staticTextStatusRight->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer52->Add( m_staticTextStatusRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer50; - bSizer50 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer50->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap15 = new wxStaticBitmap( m_panel7, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 10,10 ), 0 ); - bSizer50->Add( m_bitmap15, 0, wxALIGN_BOTTOM, 2 ); - - bSizer52->Add( bSizer50, 1, wxALIGN_BOTTOM|wxEXPAND, 5 ); - - bSizer451->Add( bSizer52, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - m_panel7->SetSizer( bSizer451 ); - m_panel7->Layout(); - bSizer451->Fit( m_panel7 ); - bSizer1->Add( m_panel7, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - this->SetSizer( bSizer1 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) ); - this->Connect( m_menuItem10->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) ); - this->Connect( m_menuItem11->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSync ) ); - this->Connect( m_menuItem14->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuSaveConfig ) ); - this->Connect( m_menuItem13->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLoadConfig ) ); - this->Connect( m_menuItem4->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) ); - this->Connect( m_menuItemGerman->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangGerman ) ); - this->Connect( m_menuItemEnglish->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangEnglish ) ); - this->Connect( m_menuItemFrench->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangFrench ) ); - this->Connect( m_menuItemItalian->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangItalian ) ); - this->Connect( m_menuItemPolish->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangPolish ) ); - this->Connect( m_menuItemDutch->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangDutch ) ); - this->Connect( m_menuItemPortuguese->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangPortuguese ) ); - this->Connect( m_menuItemJapanese->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangJapanese ) ); - this->Connect( m_menuItemChineseSimple->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangChineseSimp ) ); - this->Connect( m_menuItemGlobSett->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) ); - this->Connect( m_menuItem7->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuBatchJob ) ); - this->Connect( m_menuItem5->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) ); - this->Connect( m_menuItem3->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) ); - m_buttonCompare->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompare ), NULL, this ); - m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAbortCompare ), NULL, this ); - m_radioBtnSizeDate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompareByTimeSize ), NULL, this ); - m_radioBtnContent->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompareByContent ), NULL, this ); - m_bpButton14->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowHelpDialog ), NULL, this ); - m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnFilterButton ), NULL, this ); - m_hyperlinkCfgFilter->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this ); - m_checkBoxHideFilt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideFilteredButton ), NULL, this ); - m_buttonSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSync ), NULL, this ); - m_directoryLeft->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( MainDialogGenerated::OnWriteDirManually ), NULL, this ); - m_dirPickerLeft->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); - m_bpButtonSwap->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapDirs ), NULL, this ); - m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRemoveFolderPair ), NULL, this ); - m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this ); - m_directoryRight->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( MainDialogGenerated::OnWriteDirManually ), NULL, this ); - m_dirPickerRight->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); - m_gridLeft->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnLeftGridDoubleClick ), NULL, this ); - m_gridLeft->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMenu ), NULL, this ); - m_gridLeft->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortLeftGrid ), NULL, this ); - m_gridLeft->Connect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextColumnLeft ), NULL, this ); - m_gridMiddle->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMenuMiddle ), NULL, this ); - m_gridMiddle->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortMiddleGrid ), NULL, this ); - m_gridRight->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnRightGridDoubleClick ), NULL, this ); - m_gridRight->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMenu ), NULL, this ); - m_gridRight->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortRightGrid ), NULL, this ); - m_gridRight->Connect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextColumnRight ), NULL, this ); - m_bpButtonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ), NULL, this ); - m_bpButtonLoad->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ), NULL, this ); - m_choiceHistory->Connect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnChoiceKeyEvent ), NULL, this ); - m_choiceHistory->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this ); - m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftOnlyFiles ), NULL, this ); - m_bpButtonLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftNewerFiles ), NULL, this ); - m_bpButtonEqual->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnEqualFiles ), NULL, this ); - m_bpButtonDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnDifferentFiles ), NULL, this ); - m_bpButtonRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightNewerFiles ), NULL, this ); - m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightOnlyFiles ), NULL, this ); - m_bpButton10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnQuit ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + m_menubar1 = new wxMenuBar( 0 ); + m_menu1 = new wxMenu(); + m_menuItem10 = new wxMenuItem( m_menu1, wxID_ANY, wxString( _("1. &Compare") ) + wxT('\t') + wxT("ALT-C"), wxEmptyString, wxITEM_NORMAL ); + m_menu1->Append( m_menuItem10 ); + + m_menuItem11 = new wxMenuItem( m_menu1, wxID_ANY, wxString( _("2. &Synchronize...") ) + wxT('\t') + wxT("ALT-S"), wxEmptyString, wxITEM_NORMAL ); + m_menu1->Append( m_menuItem11 ); + + m_menu1->AppendSeparator(); + + wxMenuItem* m_menuItem14; + m_menuItem14 = new wxMenuItem( m_menu1, wxID_ANY, wxString( _("S&ave configuration") ) + wxT('\t') + wxT("CTRL-S"), wxEmptyString, wxITEM_NORMAL ); + m_menu1->Append( m_menuItem14 ); + + wxMenuItem* m_menuItem13; + m_menuItem13 = new wxMenuItem( m_menu1, wxID_ANY, wxString( _("&Load configuration") ) + wxT('\t') + wxT("CTRL-L"), wxEmptyString, wxITEM_NORMAL ); + m_menu1->Append( m_menuItem13 ); + + m_menu1->AppendSeparator(); + + wxMenuItem* m_menuItem4; + m_menuItem4 = new wxMenuItem( m_menu1, wxID_EXIT, wxString( _("&Quit") ) + wxT('\t') + wxT("CTRL-Q"), wxEmptyString, wxITEM_NORMAL ); + m_menu1->Append( m_menuItem4 ); + + m_menubar1->Append( m_menu1, _("&File") ); + + m_menu3 = new wxMenu(); + m_menu31 = new wxMenu(); + m_menuItemGerman = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Deutsch") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemGerman ); + + m_menuItemEnglish = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("English") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemEnglish ); + + m_menuItemSpanish = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Español") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemSpanish ); + + m_menuItemFrench = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Français") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemFrench ); + + m_menuItemHungarian = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Magyar Nyelv") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemHungarian ); + + m_menuItemItalian = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Italiano") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemItalian ); + + m_menuItemPolish = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Język Polski") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemPolish ); + + m_menuItemDutch = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Nederlands") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemDutch ); + + m_menuItemPortuguese = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Português") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemPortuguese ); + + m_menuItemSlovenian = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Slovenščina") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemSlovenian ); + + m_menuItemJapanese = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("日本語") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemJapanese ); + + m_menuItemChineseSimple = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("简体中文") ) , wxEmptyString, wxITEM_RADIO ); + m_menu31->Append( m_menuItemChineseSimple ); + + m_menu3->Append( -1, _("&Language"), m_menu31 ); + + m_menu3->AppendSeparator(); + + m_menuItemGlobSett = new wxMenuItem( m_menu3, wxID_ANY, wxString( _("&Global settings") ) , wxEmptyString, wxITEM_NORMAL ); + m_menu3->Append( m_menuItemGlobSett ); + + m_menuItem7 = new wxMenuItem( m_menu3, wxID_ANY, wxString( _("&Create batch job") ) , wxEmptyString, wxITEM_NORMAL ); + m_menu3->Append( m_menuItem7 ); + + wxMenuItem* m_menuItem5; + m_menuItem5 = new wxMenuItem( m_menu3, wxID_ANY, wxString( _("&Export file list") ) , wxEmptyString, wxITEM_NORMAL ); + m_menu3->Append( m_menuItem5 ); + + m_menubar1->Append( m_menu3, _("&Advanced") ); + + m_menu33 = new wxMenu(); + wxMenuItem* m_menuItemCheckVer; + m_menuItemCheckVer = new wxMenuItem( m_menu33, wxID_ANY, wxString( _("&Check for new version") ) , wxEmptyString, wxITEM_NORMAL ); + m_menu33->Append( m_menuItemCheckVer ); + + m_menu33->AppendSeparator(); + + m_menuItemAbout = new wxMenuItem( m_menu33, wxID_ABOUT, wxString( _("&About...") ) + wxT('\t') + wxT("F1"), wxEmptyString, wxITEM_NORMAL ); + m_menu33->Append( m_menuItemAbout ); + + m_menubar1->Append( m_menu33, _("&Help") ); + + this->SetMenuBar( m_menubar1 ); + + bSizer1 = new wxBoxSizer( wxVERTICAL ); + + m_panel71 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER|wxTAB_TRAVERSAL ); + bSizer6 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer6->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer30; + bSizer30 = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonCompare = new wxButtonWithImage( m_panel71, wxID_OK, _("&Compare"), wxDefaultPosition, wxSize( 180,37 ), 0 ); + m_buttonCompare->SetDefault(); + m_buttonCompare->SetFont( wxFont( 14, 74, 90, 92, false, wxT("Arial Black") ) ); + m_buttonCompare->SetToolTip( _("Compare both sides") ); + + bSizer30->Add( m_buttonCompare, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_buttonAbort = new wxButton( m_panel71, wxID_CANCEL, _("Abort"), wxDefaultPosition, wxSize( 180,37 ), 0 ); + m_buttonAbort->SetFont( wxFont( 14, 74, 90, 92, false, wxT("Tahoma") ) ); + m_buttonAbort->Enable( false ); + m_buttonAbort->Hide(); + + bSizer30->Add( m_buttonAbort, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 ); + + bSizer6->Add( bSizer30, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer55; + bSizer55 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* sbSizer6; + sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( m_panel71, wxID_ANY, _("Compare by...") ), wxHORIZONTAL ); + + wxBoxSizer* bSizer45; + bSizer45 = new wxBoxSizer( wxVERTICAL ); + + m_radioBtnSizeDate = new wxRadioButton( m_panel71, wxID_ANY, _("File size and date"), wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtnSizeDate->SetValue( true ); + m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same.") ); + + bSizer45->Add( m_radioBtnSizeDate, 0, 0, 5 ); + + m_radioBtnContent = new wxRadioButton( m_panel71, wxID_ANY, _("File content"), wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtnContent->SetToolTip( _("Files are found equal if\n - file content\nis the same.") ); + + bSizer45->Add( m_radioBtnContent, 0, wxTOP, 5 ); + + sbSizer6->Add( bSizer45, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton14 = new wxBitmapButton( m_panel71, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButton14->SetToolTip( _("Help") ); + + m_bpButton14->SetToolTip( _("Help") ); + + sbSizer6->Add( m_bpButton14, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + bSizer55->Add( sbSizer6, 0, wxALIGN_CENTER_VERTICAL, 2 ); + + + bSizer55->Add( 0, 4, 0, 0, 5 ); + + bSizer6->Add( bSizer55, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer6->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer56; + bSizer56 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* sbSizer9; + sbSizer9 = new wxStaticBoxSizer( new wxStaticBox( m_panel71, wxID_ANY, _("Filter files") ), wxHORIZONTAL ); + + m_bpButtonFilter = new wxBitmapButton( m_panel71, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); + sbSizer9->Add( m_bpButtonFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + wxBoxSizer* bSizer23; + bSizer23 = new wxBoxSizer( wxVERTICAL ); + + m_hyperlinkCfgFilter = new wxHyperlinkCtrl( m_panel71, wxID_ANY, _("Configure filter..."), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + + m_hyperlinkCfgFilter->SetNormalColour( wxColour( 0, 0, 255 ) ); + m_hyperlinkCfgFilter->SetVisitedColour( wxColour( 0, 0, 255 ) ); + bSizer23->Add( m_hyperlinkCfgFilter, 0, wxALL, 5 ); + + m_checkBoxHideFilt = new wxCheckBox( m_panel71, wxID_ANY, _("Hide filtered items"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_checkBoxHideFilt->SetToolTip( _("Choose to hide filtered files/directories from list") ); + + bSizer23->Add( m_checkBoxHideFilt, 0, 0, 5 ); + + sbSizer9->Add( bSizer23, 0, 0, 5 ); + + bSizer56->Add( sbSizer9, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer56->Add( 0, 4, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer6->Add( bSizer56, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonSync = new wxButtonWithImage( m_panel71, wxID_ANY, _("&Synchronize..."), wxDefaultPosition, wxSize( 180,37 ), 0 ); + m_buttonSync->SetFont( wxFont( 14, 74, 90, 92, false, wxT("Arial Black") ) ); + m_buttonSync->SetToolTip( _("Open synchronization dialog") ); + + bSizer6->Add( m_buttonSync, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + + bSizer6->Add( 15, 0, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + m_panel71->SetSizer( bSizer6 ); + m_panel71->Layout(); + bSizer6->Fit( m_panel71 ); + bSizer1->Add( m_panel71, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + wxBoxSizer* bSizer91; + bSizer91 = new wxBoxSizer( wxHORIZONTAL ); + + m_panel11 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer92; + bSizer92 = new wxBoxSizer( wxVERTICAL ); + + sbSizer2 = new wxStaticBoxSizer( new wxStaticBox( m_panel11, wxID_ANY, _("Drag && drop") ), wxHORIZONTAL ); + + m_comboBoxDirLeft = new wxComboBox( m_panel11, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + sbSizer2->Add( m_comboBoxDirLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_dirPickerLeft = new wxDirPickerCtrl( m_panel11, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DIR_MUST_EXIST ); + sbSizer2->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer92->Add( sbSizer2, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); + + m_panel11->SetSizer( bSizer92 ); + m_panel11->Layout(); + bSizer92->Fit( m_panel11 ); + bSizer91->Add( m_panel11, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panel13 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer93; + bSizer93 = new wxBoxSizer( wxVERTICAL ); + + + bSizer93->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizerMiddle = new wxBoxSizer( wxHORIZONTAL ); + + m_bpButtonSwap = new wxBitmapButton( m_panel13, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + m_bpButtonSwap->SetToolTip( _("Swap sides") ); + + m_bpButtonSwap->SetToolTip( _("Swap sides") ); + + bSizerMiddle->Add( m_bpButtonSwap, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer93->Add( bSizerMiddle, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + + bSizer93->Add( 0, 0, 0, 0, 5 ); + + m_panel13->SetSizer( bSizer93 ); + m_panel13->Layout(); + bSizer93->Fit( m_panel13 ); + bSizer91->Add( m_panel13, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_panel12 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer94; + bSizer94 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer77; + bSizer77 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer781; + bSizer781 = new wxBoxSizer( wxVERTICAL ); + + + bSizer781->Add( 0, 3, 0, 0, 5 ); + + m_bpButtonAddPair = new wxBitmapButton( m_panel12, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); + m_bpButtonAddPair->SetToolTip( _("Add folder pair") ); + + m_bpButtonAddPair->SetToolTip( _("Add folder pair") ); + + bSizer781->Add( m_bpButtonAddPair, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 ); + + bSizer77->Add( bSizer781, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + wxStaticBoxSizer* sbSizer3; + sbSizer3 = new wxStaticBoxSizer( new wxStaticBox( m_panel12, wxID_ANY, _("Drag && drop") ), wxHORIZONTAL ); + + m_comboBoxDirRight = new wxComboBox( m_panel12, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + sbSizer3->Add( m_comboBoxDirRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_dirPickerRight = new wxDirPickerCtrl( m_panel12, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DIR_MUST_EXIST ); + sbSizer3->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer77->Add( sbSizer3, 1, wxRIGHT|wxLEFT, 3 ); + + bSizer94->Add( bSizer77, 0, wxEXPAND, 5 ); + + m_panel12->SetSizer( bSizer94 ); + m_panel12->Layout(); + bSizer94->Fit( m_panel12 ); + bSizer91->Add( m_panel12, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer1->Add( bSizer91, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer106 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapShift = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_bitmapShift->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + m_bitmapShift->Hide(); + + bSizer106->Add( m_bitmapShift, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_scrolledWindowFolderPairs = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxHSCROLL|wxVSCROLL ); + m_scrolledWindowFolderPairs->SetScrollRate( 5, 5 ); + m_scrolledWindowFolderPairs->SetMinSize( wxSize( -1,0 ) ); + + bSizerFolderPairs = new wxBoxSizer( wxVERTICAL ); + + m_scrolledWindowFolderPairs->SetSizer( bSizerFolderPairs ); + m_scrolledWindowFolderPairs->Layout(); + bSizerFolderPairs->Fit( m_scrolledWindowFolderPairs ); + bSizer106->Add( m_scrolledWindowFolderPairs, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer1->Add( bSizer106, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer2; + bSizer2 = new wxBoxSizer( wxHORIZONTAL ); + + m_panel1 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer7; + bSizer7 = new wxBoxSizer( wxVERTICAL ); + + m_gridLeft = new CustomGridLeft( m_panel1, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + + // Grid + m_gridLeft->CreateGrid( 15, 4 ); + m_gridLeft->EnableEditing( false ); + m_gridLeft->EnableGridLines( true ); + m_gridLeft->EnableDragGridSize( true ); + m_gridLeft->SetMargins( 0, 0 ); + + // Columns + m_gridLeft->EnableDragColMove( false ); + m_gridLeft->EnableDragColSize( true ); + m_gridLeft->SetColLabelSize( 20 ); + m_gridLeft->SetColLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); + + // Rows + m_gridLeft->EnableDragRowSize( false ); + m_gridLeft->SetRowLabelSize( 38 ); + m_gridLeft->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Label Appearance + + // Cell Defaults + m_gridLeft->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); + bSizer7->Add( m_gridLeft, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 ); + + m_panel1->SetSizer( bSizer7 ); + m_panel1->Layout(); + bSizer7->Fit( m_panel1 ); + bSizer2->Add( m_panel1, 1, wxEXPAND, 5 ); + + m_panel3 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer18; + bSizer18 = new wxBoxSizer( wxVERTICAL ); + + m_gridMiddle = new CustomGridMiddle( m_panel3, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + + // Grid + m_gridMiddle->CreateGrid( 15, 1 ); + m_gridMiddle->EnableEditing( false ); + m_gridMiddle->EnableGridLines( true ); + m_gridMiddle->EnableDragGridSize( false ); + m_gridMiddle->SetMargins( 0, 0 ); + + // Columns + m_gridMiddle->SetColSize( 0, 45 ); + m_gridMiddle->EnableDragColMove( false ); + m_gridMiddle->EnableDragColSize( false ); + m_gridMiddle->SetColLabelSize( 20 ); + m_gridMiddle->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Rows + m_gridMiddle->EnableDragRowSize( false ); + m_gridMiddle->SetRowLabelSize( 0 ); + m_gridMiddle->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Label Appearance + + // Cell Defaults + m_gridMiddle->SetDefaultCellFont( wxFont( 12, 74, 90, 92, false, wxT("Arial") ) ); + m_gridMiddle->SetDefaultCellAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + bSizer18->Add( m_gridMiddle, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxBOTTOM, 5 ); + + m_panel3->SetSizer( bSizer18 ); + m_panel3->Layout(); + bSizer18->Fit( m_panel3 ); + bSizer2->Add( m_panel3, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_panel2 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer10; + bSizer10 = new wxBoxSizer( wxVERTICAL ); + + m_gridRight = new CustomGridRight( m_panel2, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + + // Grid + m_gridRight->CreateGrid( 15, 4 ); + m_gridRight->EnableEditing( false ); + m_gridRight->EnableGridLines( true ); + m_gridRight->EnableDragGridSize( true ); + m_gridRight->SetMargins( 0, 0 ); + + // Columns + m_gridRight->EnableDragColMove( false ); + m_gridRight->EnableDragColSize( true ); + m_gridRight->SetColLabelSize( 20 ); + m_gridRight->SetColLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); + + // Rows + m_gridRight->EnableDragRowSize( false ); + m_gridRight->SetRowLabelSize( 38 ); + m_gridRight->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Label Appearance + + // Cell Defaults + m_gridRight->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); + bSizer10->Add( m_gridRight, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 ); + + m_panel2->SetSizer( bSizer10 ); + m_panel2->Layout(); + bSizer10->Fit( m_panel2 ); + bSizer2->Add( m_panel2, 1, wxEXPAND, 5 ); + + bSizer1->Add( bSizer2, 1, wxEXPAND, 5 ); + + wxPanel* m_panel4; + m_panel4 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + bSizer3 = new wxBoxSizer( wxHORIZONTAL ); + + bSizer58 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* sbSizer16; + sbSizer16 = new wxStaticBoxSizer( new wxStaticBox( m_panel4, wxID_ANY, _("Configuration") ), wxHORIZONTAL ); + + m_bpButtonSave = new wxBitmapButton( m_panel4, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButtonSave->SetToolTip( _("Save current configuration to file") ); + + m_bpButtonSave->SetToolTip( _("Save current configuration to file") ); + + sbSizer16->Add( m_bpButtonSave, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_bpButtonLoad = new wxBitmapButton( m_panel4, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButtonLoad->SetToolTip( _("Load configuration from file") ); + + m_bpButtonLoad->SetToolTip( _("Load configuration from file") ); + + sbSizer16->Add( m_bpButtonLoad, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + wxArrayString m_choiceHistoryChoices; + m_choiceHistory = new wxChoice( m_panel4, wxID_ANY, wxDefaultPosition, wxSize( 150,-1 ), m_choiceHistoryChoices, 0 ); + m_choiceHistory->SetSelection( 0 ); + m_choiceHistory->SetToolTip( _("Load configuration history (press DEL to delete items)") ); + + sbSizer16->Add( m_choiceHistory, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer58->Add( sbSizer16, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + + bSizer58->Add( 0, 4, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer3->Add( bSizer58, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panel112 = new wxPanel( m_panel4, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer64; + bSizer64 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* sbSizer31; + sbSizer31 = new wxStaticBoxSizer( new wxStaticBox( m_panel112, wxID_ANY, _("Filter view") ), wxHORIZONTAL ); + + sbSizer31->SetMinSize( wxSize( 100,-1 ) ); + + sbSizer31->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_bpButtonLeftOnly = new wxBitmapButton( m_panel112, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + sbSizer31->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonLeftNewer = new wxBitmapButton( m_panel112, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + sbSizer31->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonEqual = new wxBitmapButton( m_panel112, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + sbSizer31->Add( m_bpButtonEqual, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonDifferent = new wxBitmapButton( m_panel112, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + sbSizer31->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonRightNewer = new wxBitmapButton( m_panel112, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + sbSizer31->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonRightOnly = new wxBitmapButton( m_panel112, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + sbSizer31->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + sbSizer31->Add( 0, 0, 1, wxEXPAND, 5 ); + + bSizer64->Add( sbSizer31, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_panel112->SetSizer( bSizer64 ); + m_panel112->Layout(); + bSizer64->Fit( m_panel112 ); + bSizer3->Add( m_panel112, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 4 ); + + wxBoxSizer* bSizer66; + bSizer66 = new wxBoxSizer( wxVERTICAL ); + + m_bpButton10 = new wxBitmapButton( m_panel4, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 50,50 ), wxBU_AUTODRAW ); + m_bpButton10->SetToolTip( _("Quit") ); + + m_bpButton10->SetToolTip( _("Quit") ); + + bSizer66->Add( m_bpButton10, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 ); + + bSizer3->Add( bSizer66, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panel4->SetSizer( bSizer3 ); + m_panel4->Layout(); + bSizer3->Fit( m_panel4 ); + bSizer1->Add( m_panel4, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_panel7 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer451; + bSizer451 = new wxBoxSizer( wxHORIZONTAL ); + + bSizer451->SetMinSize( wxSize( -1,22 ) ); + wxBoxSizer* bSizer53; + bSizer53 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextStatusLeft = new wxStaticText( m_panel7, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusLeft->Wrap( -1 ); + m_staticTextStatusLeft->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer53->Add( m_staticTextStatusLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer451->Add( bSizer53, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticline9 = new wxStaticLine( m_panel7, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer451->Add( m_staticline9, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxEXPAND, 2 ); + + + bSizer451->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextStatusMiddle = new wxStaticText( m_panel7, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusMiddle->Wrap( -1 ); + m_staticTextStatusMiddle->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer451->Add( m_staticTextStatusMiddle, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer451->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticline10 = new wxStaticLine( m_panel7, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer451->Add( m_staticline10, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP, 2 ); + + wxBoxSizer* bSizer52; + bSizer52 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextStatusRight = new wxStaticText( m_panel7, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusRight->Wrap( -1 ); + m_staticTextStatusRight->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer52->Add( m_staticTextStatusRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer50; + bSizer50 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer50->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap15 = new wxStaticBitmap( m_panel7, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 10,10 ), 0 ); + bSizer50->Add( m_bitmap15, 0, wxALIGN_BOTTOM, 2 ); + + bSizer52->Add( bSizer50, 1, wxALIGN_BOTTOM|wxEXPAND, 5 ); + + bSizer451->Add( bSizer52, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + m_panel7->SetSizer( bSizer451 ); + m_panel7->Layout(); + bSizer451->Fit( m_panel7 ); + bSizer1->Add( m_panel7, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + this->SetSizer( bSizer1 ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) ); + this->Connect( m_menuItem10->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) ); + this->Connect( m_menuItem11->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSync ) ); + this->Connect( m_menuItem14->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuSaveConfig ) ); + this->Connect( m_menuItem13->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLoadConfig ) ); + this->Connect( m_menuItem4->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) ); + this->Connect( m_menuItemGerman->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangGerman ) ); + this->Connect( m_menuItemEnglish->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangEnglish ) ); + this->Connect( m_menuItemSpanish->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangSpanish ) ); + this->Connect( m_menuItemFrench->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangFrench ) ); + this->Connect( m_menuItemHungarian->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangHungarian ) ); + this->Connect( m_menuItemItalian->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangItalian ) ); + this->Connect( m_menuItemPolish->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangPolish ) ); + this->Connect( m_menuItemDutch->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangDutch ) ); + this->Connect( m_menuItemPortuguese->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangPortuguese ) ); + this->Connect( m_menuItemSlovenian->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangSlovenian ) ); + this->Connect( m_menuItemJapanese->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangJapanese ) ); + this->Connect( m_menuItemChineseSimple->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangChineseSimp ) ); + this->Connect( m_menuItemGlobSett->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) ); + this->Connect( m_menuItem7->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuBatchJob ) ); + this->Connect( m_menuItem5->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) ); + this->Connect( m_menuItemCheckVer->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersion ) ); + this->Connect( m_menuItemAbout->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) ); + m_buttonCompare->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompare ), NULL, this ); + m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAbortCompare ), NULL, this ); + m_radioBtnSizeDate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompareByTimeSize ), NULL, this ); + m_radioBtnContent->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompareByContent ), NULL, this ); + m_bpButton14->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowHelpDialog ), NULL, this ); + m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnFilterButton ), NULL, this ); + m_hyperlinkCfgFilter->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this ); + m_checkBoxHideFilt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideFilteredButton ), NULL, this ); + m_buttonSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSync ), NULL, this ); + m_comboBoxDirLeft->Connect( wxEVT_KEY_DOWN, wxKeyEventHandler( MainDialogGenerated::OnFolderHistoryKeyEvent ), NULL, this ); + m_comboBoxDirLeft->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( MainDialogGenerated::OnWriteDirManually ), NULL, this ); + m_dirPickerLeft->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); + m_bpButtonSwap->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapDirs ), NULL, this ); + m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this ); + m_comboBoxDirRight->Connect( wxEVT_KEY_DOWN, wxKeyEventHandler( MainDialogGenerated::OnFolderHistoryKeyEvent ), NULL, this ); + m_comboBoxDirRight->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( MainDialogGenerated::OnWriteDirManually ), NULL, this ); + m_dirPickerRight->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); + m_gridLeft->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnLeftGridDoubleClick ), NULL, this ); + m_gridLeft->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMenu ), NULL, this ); + m_gridLeft->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortLeftGrid ), NULL, this ); + m_gridLeft->Connect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextColumnLeft ), NULL, this ); + m_gridMiddle->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMenuMiddle ), NULL, this ); + m_gridMiddle->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortMiddleGrid ), NULL, this ); + m_gridRight->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnRightGridDoubleClick ), NULL, this ); + m_gridRight->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMenu ), NULL, this ); + m_gridRight->Connect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortRightGrid ), NULL, this ); + m_gridRight->Connect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextColumnRight ), NULL, this ); + m_bpButtonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ), NULL, this ); + m_bpButtonLoad->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ), NULL, this ); + m_choiceHistory->Connect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnCfgHistoryKeyEvent ), NULL, this ); + m_choiceHistory->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this ); + m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftOnlyFiles ), NULL, this ); + m_bpButtonLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftNewerFiles ), NULL, this ); + m_bpButtonEqual->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnEqualFiles ), NULL, this ); + m_bpButtonDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnDifferentFiles ), NULL, this ); + m_bpButtonRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightNewerFiles ), NULL, this ); + m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightOnlyFiles ), NULL, this ); + m_bpButton10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnQuit ), NULL, this ); } MainDialogGenerated::~MainDialogGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSync ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuSaveConfig ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLoadConfig ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangGerman ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangEnglish ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangFrench ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangItalian ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangPolish ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangDutch ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangPortuguese ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangJapanese ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangChineseSimp ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuBatchJob ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) ); - m_buttonCompare->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompare ), NULL, this ); - m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAbortCompare ), NULL, this ); - m_radioBtnSizeDate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompareByTimeSize ), NULL, this ); - m_radioBtnContent->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompareByContent ), NULL, this ); - m_bpButton14->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowHelpDialog ), NULL, this ); - m_bpButtonFilter->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnFilterButton ), NULL, this ); - m_hyperlinkCfgFilter->Disconnect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this ); - m_checkBoxHideFilt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideFilteredButton ), NULL, this ); - m_buttonSync->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSync ), NULL, this ); - m_directoryLeft->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( MainDialogGenerated::OnWriteDirManually ), NULL, this ); - m_dirPickerLeft->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); - m_bpButtonSwap->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapDirs ), NULL, this ); - m_bpButtonRemovePair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRemoveFolderPair ), NULL, this ); - m_bpButtonAddPair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this ); - m_directoryRight->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( MainDialogGenerated::OnWriteDirManually ), NULL, this ); - m_dirPickerRight->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); - m_gridLeft->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnLeftGridDoubleClick ), NULL, this ); - m_gridLeft->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMenu ), NULL, this ); - m_gridLeft->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortLeftGrid ), NULL, this ); - m_gridLeft->Disconnect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextColumnLeft ), NULL, this ); - m_gridMiddle->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMenuMiddle ), NULL, this ); - m_gridMiddle->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortMiddleGrid ), NULL, this ); - m_gridRight->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnRightGridDoubleClick ), NULL, this ); - m_gridRight->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMenu ), NULL, this ); - m_gridRight->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortRightGrid ), NULL, this ); - m_gridRight->Disconnect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextColumnRight ), NULL, this ); - m_bpButtonSave->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ), NULL, this ); - m_bpButtonLoad->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ), NULL, this ); - m_choiceHistory->Disconnect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnChoiceKeyEvent ), NULL, this ); - m_choiceHistory->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this ); - m_bpButtonLeftOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftOnlyFiles ), NULL, this ); - m_bpButtonLeftNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftNewerFiles ), NULL, this ); - m_bpButtonEqual->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnEqualFiles ), NULL, this ); - m_bpButtonDifferent->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnDifferentFiles ), NULL, this ); - m_bpButtonRightNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightNewerFiles ), NULL, this ); - m_bpButtonRightOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightOnlyFiles ), NULL, this ); - m_bpButton10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnQuit ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSync ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuSaveConfig ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLoadConfig ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangGerman ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangEnglish ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangSpanish ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangFrench ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangHungarian ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangItalian ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangPolish ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangDutch ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangPortuguese ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangSlovenian ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangJapanese ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuLangChineseSimp ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuBatchJob ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersion ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) ); + m_buttonCompare->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompare ), NULL, this ); + m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAbortCompare ), NULL, this ); + m_radioBtnSizeDate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompareByTimeSize ), NULL, this ); + m_radioBtnContent->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompareByContent ), NULL, this ); + m_bpButton14->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowHelpDialog ), NULL, this ); + m_bpButtonFilter->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnFilterButton ), NULL, this ); + m_hyperlinkCfgFilter->Disconnect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this ); + m_checkBoxHideFilt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideFilteredButton ), NULL, this ); + m_buttonSync->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSync ), NULL, this ); + m_comboBoxDirLeft->Disconnect( wxEVT_KEY_DOWN, wxKeyEventHandler( MainDialogGenerated::OnFolderHistoryKeyEvent ), NULL, this ); + m_comboBoxDirLeft->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( MainDialogGenerated::OnWriteDirManually ), NULL, this ); + m_dirPickerLeft->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); + m_bpButtonSwap->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapDirs ), NULL, this ); + m_bpButtonAddPair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this ); + m_comboBoxDirRight->Disconnect( wxEVT_KEY_DOWN, wxKeyEventHandler( MainDialogGenerated::OnFolderHistoryKeyEvent ), NULL, this ); + m_comboBoxDirRight->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( MainDialogGenerated::OnWriteDirManually ), NULL, this ); + m_dirPickerRight->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this ); + m_gridLeft->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnLeftGridDoubleClick ), NULL, this ); + m_gridLeft->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMenu ), NULL, this ); + m_gridLeft->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortLeftGrid ), NULL, this ); + m_gridLeft->Disconnect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextColumnLeft ), NULL, this ); + m_gridMiddle->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMenuMiddle ), NULL, this ); + m_gridMiddle->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortMiddleGrid ), NULL, this ); + m_gridRight->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( MainDialogGenerated::OnRightGridDoubleClick ), NULL, this ); + m_gridRight->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextMenu ), NULL, this ); + m_gridRight->Disconnect( wxEVT_GRID_LABEL_LEFT_CLICK, wxGridEventHandler( MainDialogGenerated::OnSortRightGrid ), NULL, this ); + m_gridRight->Disconnect( wxEVT_GRID_LABEL_RIGHT_CLICK, wxGridEventHandler( MainDialogGenerated::OnContextColumnRight ), NULL, this ); + m_bpButtonSave->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ), NULL, this ); + m_bpButtonLoad->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ), NULL, this ); + m_choiceHistory->Disconnect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnCfgHistoryKeyEvent ), NULL, this ); + m_choiceHistory->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this ); + m_bpButtonLeftOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftOnlyFiles ), NULL, this ); + m_bpButtonLeftNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLeftNewerFiles ), NULL, this ); + m_bpButtonEqual->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnEqualFiles ), NULL, this ); + m_bpButtonDifferent->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnDifferentFiles ), NULL, this ); + m_bpButtonRightNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightNewerFiles ), NULL, this ); + m_bpButtonRightOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRightOnlyFiles ), NULL, this ); + m_bpButton10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnQuit ), NULL, this ); } FolderPairGenerated::FolderPairGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) { - wxBoxSizer* bSizer74; - bSizer74 = new wxBoxSizer( wxHORIZONTAL ); - - m_panelLeft = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxStaticBoxSizer* sbSizer21; - sbSizer21 = new wxStaticBoxSizer( new wxStaticBox( m_panelLeft, wxID_ANY, wxEmptyString ), wxHORIZONTAL ); - - m_directoryLeft = new wxTextCtrl( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - sbSizer21->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_dirPickerLeft = new wxDirPickerCtrl( m_panelLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DIR_MUST_EXIST ); - sbSizer21->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelLeft->SetSizer( sbSizer21 ); - m_panelLeft->Layout(); - sbSizer21->Fit( m_panelLeft ); - bSizer74->Add( m_panelLeft, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - m_panel20 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel20->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_APPWORKSPACE ) ); - - wxBoxSizer* bSizer95; - bSizer95 = new wxBoxSizer( wxHORIZONTAL ); - - m_panel21 = new wxPanel( m_panel20, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel21->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - wxBoxSizer* bSizer96; - bSizer96 = new wxBoxSizer( wxVERTICAL ); - - - bSizer96->Add( 0, 15, 0, 0, 5 ); - - m_bitmap23 = new wxStaticBitmap( m_panel21, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,17 ), 0 ); - m_bitmap23->SetToolTip( _("Folder pair") ); - - bSizer96->Add( m_bitmap23, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_panel21->SetSizer( bSizer96 ); - m_panel21->Layout(); - bSizer96->Fit( m_panel21 ); - bSizer95->Add( m_panel21, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_panel20->SetSizer( bSizer95 ); - m_panel20->Layout(); - bSizer95->Fit( m_panel20 ); - bSizer74->Add( m_panel20, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxStaticBoxSizer* sbSizer23; - sbSizer23 = new wxStaticBoxSizer( new wxStaticBox( m_panelRight, wxID_ANY, wxEmptyString ), wxHORIZONTAL ); - - m_directoryRight = new wxTextCtrl( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - sbSizer23->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_dirPickerRight = new wxDirPickerCtrl( m_panelRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DIR_MUST_EXIST ); - sbSizer23->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelRight->SetSizer( sbSizer23 ); - m_panelRight->Layout(); - sbSizer23->Fit( m_panelRight ); - bSizer74->Add( m_panelRight, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - this->SetSizer( bSizer74 ); - this->Layout(); - bSizer74->Fit( this ); + wxBoxSizer* bSizer74; + bSizer74 = new wxBoxSizer( wxHORIZONTAL ); + + m_panelLeft = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxStaticBoxSizer* sbSizer21; + sbSizer21 = new wxStaticBoxSizer( new wxStaticBox( m_panelLeft, wxID_ANY, wxEmptyString ), wxHORIZONTAL ); + + m_directoryLeft = new wxTextCtrl( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + sbSizer21->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_dirPickerLeft = new wxDirPickerCtrl( m_panelLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DIR_MUST_EXIST ); + sbSizer21->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panelLeft->SetSizer( sbSizer21 ); + m_panelLeft->Layout(); + sbSizer21->Fit( m_panelLeft ); + bSizer74->Add( m_panelLeft, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + m_panel20 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel20->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_APPWORKSPACE ) ); + + wxBoxSizer* bSizer95; + bSizer95 = new wxBoxSizer( wxHORIZONTAL ); + + m_panel21 = new wxPanel( m_panel20, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel21->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + + wxBoxSizer* bSizer96; + bSizer96 = new wxBoxSizer( wxVERTICAL ); + + + bSizer96->Add( 0, 15, 0, 0, 5 ); + + m_bitmap23 = new wxStaticBitmap( m_panel21, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,17 ), 0 ); + m_bitmap23->SetToolTip( _("Folder pair") ); + + bSizer96->Add( m_bitmap23, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_panel21->SetSizer( bSizer96 ); + m_panel21->Layout(); + bSizer96->Fit( m_panel21 ); + bSizer95->Add( m_panel21, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_panel20->SetSizer( bSizer95 ); + m_panel20->Layout(); + bSizer95->Fit( m_panel20 ); + bSizer74->Add( m_panel20, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer105; + bSizer105 = new wxBoxSizer( wxHORIZONTAL ); + + m_bpButtonRemovePair = new wxBitmapButton( m_panelRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 19,21 ), wxBU_AUTODRAW ); + m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); + + m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); + + bSizer105->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL|wxTOP, 5 ); + + wxStaticBoxSizer* sbSizer23; + sbSizer23 = new wxStaticBoxSizer( new wxStaticBox( m_panelRight, wxID_ANY, wxEmptyString ), wxHORIZONTAL ); + + m_directoryRight = new wxTextCtrl( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + sbSizer23->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_dirPickerRight = new wxDirPickerCtrl( m_panelRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DIR_MUST_EXIST ); + sbSizer23->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer105->Add( sbSizer23, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 3 ); + + m_panelRight->SetSizer( bSizer105 ); + m_panelRight->Layout(); + bSizer105->Fit( m_panelRight ); + bSizer74->Add( m_panelRight, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + this->SetSizer( bSizer74 ); + this->Layout(); + bSizer74->Fit( this ); + + // Connect Events + m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FolderPairGenerated::OnRemoveFolderPair ), NULL, this ); } FolderPairGenerated::~FolderPairGenerated() { + // Disconnect Events + m_bpButtonRemovePair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FolderPairGenerated::OnRemoveFolderPair ), NULL, this ); } BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer54; - bSizer54 = new wxBoxSizer( wxVERTICAL ); - - bSizer69 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer87; - bSizer87 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap27 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); - bSizer87->Add( m_bitmap27, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); - m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxVERTICAL ); - - m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Batch job"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText56->Wrap( -1 ); - m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer72->Add( m_staticText56, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_panel8->SetSizer( bSizer72 ); - m_panel8->Layout(); - bSizer72->Fit( m_panel8 ); - bSizer87->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer87->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer69->Add( bSizer87, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer69->Add( 0, 5, 0, 0, 5 ); - - m_staticText54 = new wxStaticText( this, wxID_ANY, _("Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText54->Wrap( 520 ); - m_staticText54->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxT("Tahoma") ) ); - - bSizer69->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - - - bSizer69->Add( 0, 5, 0, 0, 5 ); - - m_staticline10 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer69->Add( m_staticline10, 0, wxEXPAND|wxTOP, 5 ); - - m_staticText531 = new wxStaticText( this, wxID_ANY, _("Configuration overview:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText531->Wrap( -1 ); - m_staticText531->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Arial Black") ) ); - - bSizer69->Add( m_staticText531, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - wxBoxSizer* bSizer67; - bSizer67 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer100; - bSizer100 = new wxBoxSizer( wxVERTICAL ); - - m_scrolledWindow6 = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); - m_scrolledWindow6->SetScrollRate( 5, 5 ); - bSizerFolderPairs = new wxBoxSizer( wxVERTICAL ); - - m_scrolledWindow6->SetSizer( bSizerFolderPairs ); - m_scrolledWindow6->Layout(); - bSizerFolderPairs->Fit( m_scrolledWindow6 ); - bSizer100->Add( m_scrolledWindow6, 0, wxEXPAND, 5 ); - - - bSizer100->Add( 0, 10, 0, 0, 5 ); - - wxBoxSizer* bSizer57; - bSizer57 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer71; - bSizer71 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer721; - bSizer721 = new wxBoxSizer( wxVERTICAL ); - - wxStaticBoxSizer* sbSizer6; - sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Compare by...") ), wxVERTICAL ); - - m_radioBtnSizeDate = new wxRadioButton( this, wxID_ANY, _("File size and date"), wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnSizeDate->SetValue( true ); - m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same.") ); - - sbSizer6->Add( m_radioBtnSizeDate, 0, 0, 5 ); - - m_radioBtnContent = new wxRadioButton( this, wxID_ANY, _("File content"), wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnContent->SetToolTip( _("Files are found equal if\n - file content\nis the same.") ); - - sbSizer6->Add( m_radioBtnContent, 0, wxTOP, 5 ); - - bSizer721->Add( sbSizer6, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer721->Add( 0, 10, 0, 0, 5 ); - - wxStaticBoxSizer* sbSizer25; - sbSizer25 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Error handling") ), wxVERTICAL ); - - wxArrayString m_choiceHandleErrorChoices; - m_choiceHandleError = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleErrorChoices, 0 ); - m_choiceHandleError->SetSelection( 0 ); - sbSizer25->Add( m_choiceHandleError, 0, wxALL, 5 ); - - bSizer721->Add( sbSizer25, 1, wxEXPAND, 5 ); - - - bSizer721->Add( 0, 10, 0, 0, 5 ); - - wxStaticBoxSizer* sbSizer24; - sbSizer24 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); - - m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("Use Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); - - m_checkBoxUseRecycler->SetToolTip( _("Use Recycle Bin when deleting or overwriting files during synchronization") ); - - sbSizer24->Add( m_checkBoxUseRecycler, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_checkBoxSilent = new wxCheckBox( this, wxID_ANY, _("Silent mode"), wxDefaultPosition, wxDefaultSize, 0 ); - - m_checkBoxSilent->SetToolTip( _("Do not show graphical status and error messages but write to a logfile instead") ); - - sbSizer24->Add( m_checkBoxSilent, 0, wxALL, 5 ); - - bSizer721->Add( sbSizer24, 0, wxEXPAND, 5 ); - - bSizer71->Add( bSizer721, 0, 0, 5 ); - - bSizer57->Add( bSizer71, 0, wxEXPAND, 5 ); - - - bSizer57->Add( 10, 0, 1, wxEXPAND, 5 ); - - wxStaticBoxSizer* sbSizer8; - sbSizer8 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Filter files") ), wxHORIZONTAL ); - - m_bpButtonFilter = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); - sbSizer8->Add( m_bpButtonFilter, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer101; - bSizer101 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer671; - bSizer671 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap8 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); - m_bitmap8->SetToolTip( _("Include") ); - - bSizer671->Add( m_bitmap8, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_textCtrlInclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 250,-1 ), wxTE_MULTILINE ); - bSizer671->Add( m_textCtrlInclude, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer101->Add( bSizer671, 0, 0, 5 ); - - - bSizer101->Add( 0, 10, 0, 0, 5 ); - - wxBoxSizer* bSizer691; - bSizer691 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap9 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); - m_bitmap9->SetToolTip( _("Exclude") ); - - bSizer691->Add( m_bitmap9, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_textCtrlExclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 250,-1 ), wxTE_MULTILINE ); - bSizer691->Add( m_textCtrlExclude, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer101->Add( bSizer691, 0, 0, 5 ); - - sbSizer8->Add( bSizer101, 1, wxEXPAND, 5 ); - - bSizer57->Add( sbSizer8, 0, 0, 5 ); - - bSizer100->Add( bSizer57, 0, 0, 5 ); - - bSizer67->Add( bSizer100, 0, 0, 5 ); - - - bSizer67->Add( 10, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxStaticBoxSizer* sbSizer61; - sbSizer61 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Configuration") ), wxVERTICAL ); - - wxGridSizer* gSizer3; - gSizer3 = new wxGridSizer( 1, 2, 0, 5 ); - - m_staticText211 = new wxStaticText( this, wxID_ANY, _("Result"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText211->Wrap( -1 ); - m_staticText211->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - - gSizer3->Add( m_staticText211, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText311 = new wxStaticText( this, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText311->Wrap( -1 ); - m_staticText311->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - - gSizer3->Add( m_staticText311, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer61->Add( gSizer3, 0, wxEXPAND, 5 ); - - m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - sbSizer61->Add( m_staticline3, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxBOTTOM, 5 ); - - wxGridSizer* gSizer1; - gSizer1 = new wxGridSizer( 5, 2, 0, 5 ); - - m_bitmap13 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap13->SetToolTip( _("Files/folders that exist on left side only") ); - - gSizer1->Add( m_bitmap13, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton5 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - gSizer1->Add( m_bpButton5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap14 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap14->SetToolTip( _("Files/folders that exist on right side only") ); - - gSizer1->Add( m_bitmap14, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton6 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - gSizer1->Add( m_bpButton6, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap15 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap15->SetToolTip( _("Files that exist on both sides, left one is newer") ); - - gSizer1->Add( m_bitmap15, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton7 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - gSizer1->Add( m_bpButton7, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap16 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap16->SetToolTip( _("Files that exist on both sides, right one is newer") ); - - gSizer1->Add( m_bitmap16, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton8 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - 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( _("dummy") ); - - gSizer1->Add( m_bitmap17, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton9 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - gSizer1->Add( m_bpButton9, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer61->Add( gSizer1, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - bSizer67->Add( sbSizer61, 0, 0, 5 ); - - bSizer69->Add( bSizer67, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer69->Add( m_staticline9, 0, wxTOP|wxBOTTOM|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - wxBoxSizer* bSizer68; - bSizer68 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonSave = new wxButton( this, wxID_SAVE, _("&Save"), wxDefaultPosition, wxSize( 120,35 ), 0 ); - m_buttonSave->SetDefault(); - m_buttonSave->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer68->Add( m_buttonSave, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonLoad = new wxButton( this, wxID_OPEN, _("&Load"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonLoad->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer68->Add( m_buttonLoad, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_button6 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button6->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer68->Add( m_button6, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer69->Add( bSizer68, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer54->Add( bSizer69, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - - this->SetSizer( bSizer54 ); - this->Layout(); - bSizer54->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); - 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_choiceHandleError->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeErrorHandling ), 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 ); - m_bpButton6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnExRightSideOnly ), NULL, this ); - m_bpButton7->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLeftNewer ), NULL, this ); - m_bpButton8->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnRightNewer ), NULL, this ); - m_bpButton9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnDifferent ), NULL, this ); - m_buttonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this ); - m_buttonLoad->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLoadBatchJob ), NULL, this ); - m_button6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer54; + bSizer54 = new wxBoxSizer( wxVERTICAL ); + + bSizer69 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer87; + bSizer87 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap27 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); + bSizer87->Add( m_bitmap27, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); + m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); + + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxVERTICAL ); + + m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Batch job"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText56->Wrap( -1 ); + m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer72->Add( m_staticText56, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_panel8->SetSizer( bSizer72 ); + m_panel8->Layout(); + bSizer72->Fit( m_panel8 ); + bSizer87->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer87->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer69->Add( bSizer87, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer69->Add( 0, 5, 0, 0, 5 ); + + m_staticText54 = new wxStaticText( this, wxID_ANY, _("Assemble a batch file for automated synchronization. To start in batch mode simply pass the name of the file to the FreeFileSync executable: FreeFileSync.exe <batchfile>. This can also be scheduled in your operating system's task planner."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText54->Wrap( 520 ); + m_staticText54->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxT("Tahoma") ) ); + + bSizer69->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + + bSizer69->Add( 0, 5, 0, 0, 5 ); + + m_staticline10 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer69->Add( m_staticline10, 0, wxEXPAND|wxTOP, 5 ); + + m_staticText531 = new wxStaticText( this, wxID_ANY, _("Configuration overview:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText531->Wrap( -1 ); + m_staticText531->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Arial Black") ) ); + + bSizer69->Add( m_staticText531, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxBoxSizer* bSizer67; + bSizer67 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer100; + bSizer100 = new wxBoxSizer( wxVERTICAL ); + + m_scrolledWindow6 = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_scrolledWindow6->SetScrollRate( 5, 5 ); + bSizerFolderPairs = new wxBoxSizer( wxVERTICAL ); + + m_scrolledWindow6->SetSizer( bSizerFolderPairs ); + m_scrolledWindow6->Layout(); + bSizerFolderPairs->Fit( m_scrolledWindow6 ); + bSizer100->Add( m_scrolledWindow6, 0, wxEXPAND, 5 ); + + + bSizer100->Add( 0, 10, 0, 0, 5 ); + + wxBoxSizer* bSizer57; + bSizer57 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer71; + bSizer71 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer721; + bSizer721 = new wxBoxSizer( wxVERTICAL ); + + wxStaticBoxSizer* sbSizer6; + sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Compare by...") ), wxVERTICAL ); + + m_radioBtnSizeDate = new wxRadioButton( this, wxID_ANY, _("File size and date"), wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtnSizeDate->SetValue( true ); + m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - filesize\n - last write time and date\nare the same.") ); + + sbSizer6->Add( m_radioBtnSizeDate, 0, 0, 5 ); + + m_radioBtnContent = new wxRadioButton( this, wxID_ANY, _("File content"), wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtnContent->SetToolTip( _("Files are found equal if\n - file content\nis the same.") ); + + sbSizer6->Add( m_radioBtnContent, 0, wxTOP, 5 ); + + bSizer721->Add( sbSizer6, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizer721->Add( 0, 10, 0, 0, 5 ); + + wxStaticBoxSizer* sbSizer25; + sbSizer25 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Error handling") ), wxVERTICAL ); + + wxArrayString m_choiceHandleErrorChoices; + m_choiceHandleError = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleErrorChoices, 0 ); + m_choiceHandleError->SetSelection( 0 ); + sbSizer25->Add( m_choiceHandleError, 0, wxALL, 5 ); + + bSizer721->Add( sbSizer25, 1, wxEXPAND, 5 ); + + + bSizer721->Add( 0, 10, 0, 0, 5 ); + + wxStaticBoxSizer* sbSizer24; + sbSizer24 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); + + m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("Use Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_checkBoxUseRecycler->SetToolTip( _("Use Recycle Bin when deleting or overwriting files during synchronization") ); + + sbSizer24->Add( m_checkBoxUseRecycler, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_checkBoxSilent = new wxCheckBox( this, wxID_ANY, _("Silent mode"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_checkBoxSilent->SetToolTip( _("Do not show graphical status and error messages but write to a logfile instead") ); + + sbSizer24->Add( m_checkBoxSilent, 0, wxALL, 5 ); + + bSizer721->Add( sbSizer24, 0, wxEXPAND, 5 ); + + bSizer71->Add( bSizer721, 0, 0, 5 ); + + bSizer57->Add( bSizer71, 0, wxEXPAND, 5 ); + + + bSizer57->Add( 10, 0, 1, wxEXPAND, 5 ); + + wxStaticBoxSizer* sbSizer8; + sbSizer8 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Filter files") ), wxHORIZONTAL ); + + m_bpButtonFilter = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); + sbSizer8->Add( m_bpButtonFilter, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer101; + bSizer101 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer671; + bSizer671 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap8 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); + m_bitmap8->SetToolTip( _("Include") ); + + bSizer671->Add( m_bitmap8, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_textCtrlInclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 250,-1 ), wxTE_MULTILINE ); + bSizer671->Add( m_textCtrlInclude, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer101->Add( bSizer671, 0, 0, 5 ); + + + bSizer101->Add( 0, 10, 0, 0, 5 ); + + wxBoxSizer* bSizer691; + bSizer691 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap9 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); + m_bitmap9->SetToolTip( _("Exclude") ); + + bSizer691->Add( m_bitmap9, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_textCtrlExclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 250,-1 ), wxTE_MULTILINE ); + bSizer691->Add( m_textCtrlExclude, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer101->Add( bSizer691, 0, 0, 5 ); + + sbSizer8->Add( bSizer101, 1, wxEXPAND, 5 ); + + bSizer57->Add( sbSizer8, 0, 0, 5 ); + + bSizer100->Add( bSizer57, 0, 0, 5 ); + + bSizer67->Add( bSizer100, 0, 0, 5 ); + + + bSizer67->Add( 10, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBoxSizer* sbSizer61; + sbSizer61 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Configuration") ), wxVERTICAL ); + + wxGridSizer* gSizer3; + gSizer3 = new wxGridSizer( 1, 2, 0, 5 ); + + m_staticText211 = new wxStaticText( this, wxID_ANY, _("Result"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText211->Wrap( -1 ); + m_staticText211->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + gSizer3->Add( m_staticText211, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText311 = new wxStaticText( this, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText311->Wrap( -1 ); + m_staticText311->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + gSizer3->Add( m_staticText311, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer61->Add( gSizer3, 0, wxEXPAND, 5 ); + + m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + sbSizer61->Add( m_staticline3, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxBOTTOM, 5 ); + + wxGridSizer* gSizer1; + gSizer1 = new wxGridSizer( 5, 2, 0, 5 ); + + m_bitmap13 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap13->SetToolTip( _("Files/folders that exist on left side only") ); + + gSizer1->Add( m_bitmap13, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton5 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + gSizer1->Add( m_bpButton5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap14 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap14->SetToolTip( _("Files/folders that exist on right side only") ); + + gSizer1->Add( m_bitmap14, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton6 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + gSizer1->Add( m_bpButton6, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap15 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap15->SetToolTip( _("Files that exist on both sides, left one is newer") ); + + gSizer1->Add( m_bitmap15, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton7 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + gSizer1->Add( m_bpButton7, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap16 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap16->SetToolTip( _("Files that exist on both sides, right one is newer") ); + + gSizer1->Add( m_bitmap16, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton8 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + 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( _("dummy") ); + + gSizer1->Add( m_bitmap17, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton9 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + gSizer1->Add( m_bpButton9, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer61->Add( gSizer1, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + bSizer67->Add( sbSizer61, 0, 0, 5 ); + + bSizer69->Add( bSizer67, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer69->Add( m_staticline9, 0, wxTOP|wxBOTTOM|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer68; + bSizer68 = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonSave = new wxButton( this, wxID_SAVE, _("&Save"), wxDefaultPosition, wxSize( 120,35 ), 0 ); + m_buttonSave->SetDefault(); + m_buttonSave->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer68->Add( m_buttonSave, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonLoad = new wxButton( this, wxID_OPEN, _("&Load"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonLoad->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer68->Add( m_buttonLoad, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_button6 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button6->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer68->Add( m_button6, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer69->Add( bSizer68, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer54->Add( bSizer69, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + this->SetSizer( bSizer54 ); + this->Layout(); + bSizer54->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); + 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_choiceHandleError->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeErrorHandling ), 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 ); + m_bpButton6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnExRightSideOnly ), NULL, this ); + m_bpButton7->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLeftNewer ), NULL, this ); + m_bpButton8->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnRightNewer ), NULL, this ); + m_bpButton9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnDifferent ), NULL, this ); + m_buttonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this ); + m_buttonLoad->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLoadBatchJob ), NULL, this ); + m_button6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); } BatchDlgGenerated::~BatchDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); - 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_choiceHandleError->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeErrorHandling ), 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 ); - m_bpButton6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnExRightSideOnly ), NULL, this ); - m_bpButton7->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLeftNewer ), NULL, this ); - m_bpButton8->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnRightNewer ), NULL, this ); - m_bpButton9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnDifferent ), NULL, this ); - m_buttonSave->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this ); - m_buttonLoad->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLoadBatchJob ), NULL, this ); - m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); + 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_choiceHandleError->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeErrorHandling ), 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 ); + m_bpButton6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnExRightSideOnly ), NULL, this ); + m_bpButton7->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLeftNewer ), NULL, this ); + m_bpButton8->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnRightNewer ), NULL, this ); + m_bpButton9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnDifferent ), NULL, this ); + m_buttonSave->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this ); + m_buttonLoad->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLoadBatchJob ), NULL, this ); + m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); } BatchFolderPairGenerated::BatchFolderPairGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) { - wxStaticBoxSizer* sbSizer20; - sbSizer20 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); - - wxFlexGridSizer* fgSizer9; - fgSizer9 = new wxFlexGridSizer( 2, 2, 5, 5 ); - fgSizer9->AddGrowableCol( 1 ); - fgSizer9->SetFlexibleDirection( wxHORIZONTAL ); - fgSizer9->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_staticText53 = new wxStaticText( this, wxID_ANY, _("Left folder:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText53->Wrap( -1 ); - m_staticText53->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer9->Add( m_staticText53, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - m_directoryLeft = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - fgSizer9->Add( m_directoryLeft, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticText541 = new wxStaticText( this, wxID_ANY, _("Right folder:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText541->Wrap( -1 ); - m_staticText541->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer9->Add( m_staticText541, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - m_directoryRight = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - fgSizer9->Add( m_directoryRight, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - sbSizer20->Add( fgSizer9, 0, wxEXPAND, 5 ); - - this->SetSizer( sbSizer20 ); - this->Layout(); - sbSizer20->Fit( this ); - - // Connect Events - m_directoryLeft->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchFolderPairGenerated::OnEnterLeftDir ), NULL, this ); - m_directoryRight->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchFolderPairGenerated::OnEnterRightDir ), NULL, this ); + wxStaticBoxSizer* sbSizer20; + sbSizer20 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); + + wxFlexGridSizer* fgSizer9; + fgSizer9 = new wxFlexGridSizer( 2, 2, 5, 5 ); + fgSizer9->AddGrowableCol( 1 ); + fgSizer9->SetFlexibleDirection( wxHORIZONTAL ); + fgSizer9->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_staticText53 = new wxStaticText( this, wxID_ANY, _("Left folder:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText53->Wrap( -1 ); + m_staticText53->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer9->Add( m_staticText53, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + m_directoryLeft = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + fgSizer9->Add( m_directoryLeft, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticText541 = new wxStaticText( this, wxID_ANY, _("Right folder:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText541->Wrap( -1 ); + m_staticText541->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer9->Add( m_staticText541, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + m_directoryRight = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + fgSizer9->Add( m_directoryRight, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + sbSizer20->Add( fgSizer9, 0, wxEXPAND, 5 ); + + this->SetSizer( sbSizer20 ); + this->Layout(); + sbSizer20->Fit( this ); + + // Connect Events + m_directoryLeft->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchFolderPairGenerated::OnEnterLeftDir ), NULL, this ); + m_directoryRight->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchFolderPairGenerated::OnEnterRightDir ), NULL, this ); } BatchFolderPairGenerated::~BatchFolderPairGenerated() { - // Disconnect Events - m_directoryLeft->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchFolderPairGenerated::OnEnterLeftDir ), NULL, this ); - m_directoryRight->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchFolderPairGenerated::OnEnterRightDir ), NULL, this ); + // Disconnect Events + m_directoryLeft->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchFolderPairGenerated::OnEnterLeftDir ), NULL, this ); + m_directoryRight->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchFolderPairGenerated::OnEnterRightDir ), NULL, this ); } CompareStatusGenerated::CompareStatusGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) { - wxBoxSizer* bSizer40; - bSizer40 = new wxBoxSizer( wxVERTICAL ); - - bSizer42 = new wxBoxSizer( wxHORIZONTAL ); - - wxStaticBoxSizer* sbSizer10; - sbSizer10 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxHORIZONTAL ); - - 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, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextScanned->Wrap( -1 ); - m_staticTextScanned->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - sbSizer10->Add( m_staticTextScanned, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer42->Add( sbSizer10, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); - - sbSizer13 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Comparing content") ), wxVERTICAL ); - - wxFlexGridSizer* fgSizer8; - fgSizer8 = new wxFlexGridSizer( 2, 2, 3, 0 ); - fgSizer8->SetFlexibleDirection( wxBOTH ); - fgSizer8->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_staticText46 = new wxStaticText( this, wxID_ANY, _("Files remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText46->Wrap( -1 ); - m_staticText46->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - fgSizer8->Add( m_staticText46, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - 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") ) ); - - fgSizer8->Add( m_staticTextFilesToCompare, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText32 = new wxStaticText( this, wxID_ANY, _("Data remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText32->Wrap( -1 ); - m_staticText32->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - fgSizer8->Add( m_staticText32, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - 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") ) ); - - fgSizer8->Add( m_staticTextDataToCompare, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer13->Add( fgSizer8, 0, 0, 5 ); - - bSizer42->Add( sbSizer13, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); - - wxStaticBoxSizer* sbSizer131; - sbSizer131 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxHORIZONTAL ); - - m_staticText37 = new wxStaticText( this, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText37->Wrap( -1 ); - m_staticText37->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - sbSizer131->Add( m_staticText37, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 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") ) ); - - sbSizer131->Add( m_staticTextTimeElapsed, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer42->Add( sbSizer131, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - bSizer40->Add( bSizer42, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL, 5 ); - - wxBoxSizer* bSizer48; - bSizer48 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText30 = new wxStaticText( this, wxID_ANY, _("Operation:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText30->Wrap( -1 ); - m_staticText30->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer48->Add( m_staticText30, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlFilename = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); - m_textCtrlFilename->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); - - bSizer48->Add( m_textCtrlFilename, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer40->Add( bSizer48, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - m_gauge2 = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,20 ), wxGA_HORIZONTAL ); - bSizer40->Add( m_gauge2, 0, wxALL|wxEXPAND, 5 ); - - this->SetSizer( bSizer40 ); - this->Layout(); - bSizer40->Fit( this ); + wxBoxSizer* bSizer40; + bSizer40 = new wxBoxSizer( wxVERTICAL ); + + bSizer42 = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticBoxSizer* sbSizer10; + sbSizer10 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxHORIZONTAL ); + + 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, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextScanned->Wrap( -1 ); + m_staticTextScanned->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + sbSizer10->Add( m_staticTextScanned, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer42->Add( sbSizer10, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); + + sbSizer13 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Comparing content") ), wxVERTICAL ); + + wxFlexGridSizer* fgSizer8; + fgSizer8 = new wxFlexGridSizer( 2, 2, 3, 0 ); + fgSizer8->SetFlexibleDirection( wxBOTH ); + fgSizer8->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_staticText46 = new wxStaticText( this, wxID_ANY, _("Files remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText46->Wrap( -1 ); + m_staticText46->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + fgSizer8->Add( m_staticText46, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + 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") ) ); + + fgSizer8->Add( m_staticTextFilesToCompare, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText32 = new wxStaticText( this, wxID_ANY, _("Data remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText32->Wrap( -1 ); + m_staticText32->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + fgSizer8->Add( m_staticText32, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + 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") ) ); + + fgSizer8->Add( m_staticTextDataToCompare, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer13->Add( fgSizer8, 0, 0, 5 ); + + bSizer42->Add( sbSizer13, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); + + wxStaticBoxSizer* sbSizer131; + sbSizer131 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxHORIZONTAL ); + + m_staticText37 = new wxStaticText( this, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText37->Wrap( -1 ); + m_staticText37->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + sbSizer131->Add( m_staticText37, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 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") ) ); + + sbSizer131->Add( m_staticTextTimeElapsed, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer42->Add( sbSizer131, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + bSizer40->Add( bSizer42, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL, 5 ); + + wxBoxSizer* bSizer48; + bSizer48 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText30 = new wxStaticText( this, wxID_ANY, _("Operation:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText30->Wrap( -1 ); + m_staticText30->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer48->Add( m_staticText30, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlFilename = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); + m_textCtrlFilename->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); + + bSizer48->Add( m_textCtrlFilename, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer40->Add( bSizer48, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_gauge2 = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,20 ), wxGA_HORIZONTAL ); + bSizer40->Add( m_gauge2, 0, wxALL|wxEXPAND, 5 ); + + this->SetSizer( bSizer40 ); + this->Layout(); + bSizer40->Fit( this ); } CompareStatusGenerated::~CompareStatusGenerated() @@ -1280,1609 +1324,1671 @@ CompareStatusGenerated::~CompareStatusGenerated() SyncDlgGenerated::SyncDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer7; - bSizer7 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer181; - bSizer181 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer29; - bSizer29 = new wxBoxSizer( wxVERTICAL ); - - bSizer201 = new wxBoxSizer( wxHORIZONTAL ); - - m_button18 = new wxButtonWithImage( this, wxID_OK, _("&Start"), wxDefaultPosition, wxSize( 140,58 ), 0 ); - m_button18->SetDefault(); - m_button18->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Arial Black") ) ); - m_button18->SetToolTip( _("Start synchronization") ); - - bSizer201->Add( m_button18, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer201->Add( 18, 0, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer38; - bSizer38 = new wxBoxSizer( wxVERTICAL ); - - m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("Use Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); - - m_checkBoxUseRecycler->SetToolTip( _("Use Recycle Bin when deleting or overwriting files during synchronization") ); - - bSizer38->Add( m_checkBoxUseRecycler, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_checkBoxIgnoreErrors = new wxCheckBox( this, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 ); - - m_checkBoxIgnoreErrors->SetToolTip( _("Hides error messages during synchronization:\nThey are collected and shown as a list at the end of the process") ); - - bSizer38->Add( m_checkBoxIgnoreErrors, 0, wxALL, 5 ); - - bSizer201->Add( bSizer38, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer29->Add( bSizer201, 1, 0, 5 ); - - - bSizer29->Add( 0, 5, 0, 0, 5 ); - - wxStaticBoxSizer* sbSizer7; - sbSizer7 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); - - m_staticText1 = new wxStaticText( this, wxID_ANY, _("Select variant:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText1->Wrap( -1 ); - m_staticText1->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - sbSizer7->Add( m_staticText1, 0, wxALL, 5 ); - - wxFlexGridSizer* fgSizer1; - fgSizer1 = new wxFlexGridSizer( 4, 3, 8, 5 ); - fgSizer1->SetFlexibleDirection( wxHORIZONTAL ); - fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_radioBtn1 = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtn1->SetValue( true ); - m_radioBtn1->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer1->Add( m_radioBtn1, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonOneWay = new wxButton( this, wxID_ANY, _("Mirror ->>"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonOneWay->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer1->Add( m_buttonOneWay, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticText8 = new wxStaticText( this, wxID_ANY, _("Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText8->Wrap( 300 ); - fgSizer1->Add( m_staticText8, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_radioBtnUpdate = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtnUpdate->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer1->Add( m_radioBtnUpdate, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonUpdate = new wxButton( this, wxID_ANY, _("Update ->"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonUpdate->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer1->Add( m_buttonUpdate, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticText101 = new wxStaticText( this, wxID_ANY, _("Copy new or updated files to right folder."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText101->Wrap( 300 ); - fgSizer1->Add( m_staticText101, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - m_radioBtn2 = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtn2->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer1->Add( m_radioBtn2, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonTwoWay = new wxButton( this, wxID_ANY, _("Two way <->"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonTwoWay->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer1->Add( m_buttonTwoWay, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText10 = new wxStaticText( this, wxID_ANY, _("Synchronize both sides simultaneously: Copy new or updated files in both directions."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText10->Wrap( 300 ); - fgSizer1->Add( m_staticText10, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - m_radioBtn3 = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - m_radioBtn3->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer1->Add( m_radioBtn3, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer65; - bSizer65 = new wxBoxSizer( wxVERTICAL ); - - - bSizer65->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_staticText23 = new wxStaticText( this, wxID_ANY, _("Custom"), wxDefaultPosition, wxSize( -1,-1 ), wxALIGN_CENTRE|wxSTATIC_BORDER ); - m_staticText23->Wrap( -1 ); - m_staticText23->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer65->Add( m_staticText23, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer65->Add( 0, 0, 1, wxEXPAND, 5 ); - - fgSizer1->Add( bSizer65, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticText9 = new wxStaticText( this, wxID_ANY, _("Configure your own synchronization rules."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText9->Wrap( 300 ); - fgSizer1->Add( m_staticText9, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - sbSizer7->Add( fgSizer1, 0, 0, 5 ); - - bSizer29->Add( sbSizer7, 0, wxEXPAND, 5 ); - - - bSizer29->Add( 0, 5, 0, 0, 5 ); - - wxBoxSizer* bSizer291; - bSizer291 = new wxBoxSizer( wxHORIZONTAL ); - - m_button6 = new wxButton( this, wxID_APPLY, _("&Apply"), wxDefaultPosition, wxSize( 100,32 ), 0 ); - m_button6->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer291->Add( m_button6, 0, wxALIGN_BOTTOM, 5 ); - - m_button16 = new wxButton( this, wxID_CANCEL, _("dummy"), wxDefaultPosition, wxSize( 0,0 ), 0 ); - bSizer291->Add( m_button16, 0, wxALIGN_BOTTOM, 5 ); - - - bSizer291->Add( 20, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - wxStaticBoxSizer* sbSizer16; - sbSizer16 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Preview") ), wxHORIZONTAL ); - - wxFlexGridSizer* fgSizer5; - fgSizer5 = new wxFlexGridSizer( 2, 2, 0, 5 ); - fgSizer5->SetFlexibleDirection( wxHORIZONTAL ); - fgSizer5->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - 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 and directories that will be created") ); - - fgSizer5->Add( m_staticText37, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlCreate = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY ); - m_textCtrlCreate->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); - m_textCtrlCreate->SetBackgroundColour( wxColour( 222, 222, 236 ) ); - m_textCtrlCreate->SetToolTip( _("Number of files and directories that will be created") ); - - fgSizer5->Add( m_textCtrlCreate, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - 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 and directories that will be deleted") ); - - fgSizer5->Add( m_staticText14, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlDelete = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY ); - m_textCtrlDelete->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); - m_textCtrlDelete->SetBackgroundColour( wxColour( 222, 222, 236 ) ); - m_textCtrlDelete->SetToolTip( _("Number of files and directories that will be deleted") ); - - fgSizer5->Add( m_textCtrlDelete, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer16->Add( fgSizer5, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - wxFlexGridSizer* fgSizer6; - fgSizer6 = new wxFlexGridSizer( 2, 2, 0, 5 ); - fgSizer6->SetFlexibleDirection( wxHORIZONTAL ); - fgSizer6->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_staticText42 = new wxStaticText( this, wxID_ANY, _("Update:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText42->Wrap( -1 ); - m_staticText42->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); - m_staticText42->SetToolTip( _("Number of files that will be overwritten") ); - - fgSizer6->Add( m_staticText42, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlUpdate = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY ); - m_textCtrlUpdate->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); - m_textCtrlUpdate->SetBackgroundColour( wxColour( 222, 222, 236 ) ); - m_textCtrlUpdate->SetToolTip( _("Number of files that will be overwritten") ); - - fgSizer6->Add( m_textCtrlUpdate, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText43 = new wxStaticText( this, wxID_ANY, _("Data:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText43->Wrap( -1 ); - m_staticText43->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); - m_staticText43->SetToolTip( _("Total amount of data that will be transferred") ); - - fgSizer6->Add( m_staticText43, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlData = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY ); - m_textCtrlData->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); - m_textCtrlData->SetBackgroundColour( wxColour( 222, 222, 236 ) ); - m_textCtrlData->SetToolTip( _("Total amount of data that will be transferred") ); - - fgSizer6->Add( m_textCtrlData, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer16->Add( fgSizer6, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - bSizer291->Add( sbSizer16, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - bSizer29->Add( bSizer291, 0, wxEXPAND, 5 ); - - bSizer181->Add( bSizer29, 0, 0, 5 ); - - - bSizer181->Add( 10, 0, 0, 0, 5 ); - - wxStaticBoxSizer* sbSizer6; - sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Configuration") ), wxVERTICAL ); - - wxGridSizer* gSizer3; - gSizer3 = new wxGridSizer( 1, 2, 0, 5 ); - - m_staticText21 = new wxStaticText( this, wxID_ANY, _("Result"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText21->Wrap( -1 ); - m_staticText21->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - - gSizer3->Add( m_staticText21, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText31 = new wxStaticText( this, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText31->Wrap( -1 ); - m_staticText31->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - - gSizer3->Add( m_staticText31, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer6->Add( gSizer3, 0, wxEXPAND, 5 ); - - m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - sbSizer6->Add( m_staticline3, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxBOTTOM, 5 ); - - wxGridSizer* gSizer1; - gSizer1 = new wxGridSizer( 5, 2, 0, 5 ); - - m_bitmap13 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap13->SetToolTip( _("Files/folders that exist on left side only") ); - - gSizer1->Add( m_bitmap13, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton5 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - gSizer1->Add( m_bpButton5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap14 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap14->SetToolTip( _("Files/folders that exist on right side only") ); - - gSizer1->Add( m_bitmap14, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton6 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - gSizer1->Add( m_bpButton6, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap15 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap15->SetToolTip( _("Files that exist on both sides, left one is newer") ); - - gSizer1->Add( m_bitmap15, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton7 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - gSizer1->Add( m_bpButton7, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap16 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - m_bitmap16->SetToolTip( _("Files that exist on both sides, right one is newer") ); - - gSizer1->Add( m_bitmap16, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton8 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - 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( _("dummy") ); - - gSizer1->Add( m_bitmap17, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButton9 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - gSizer1->Add( m_bpButton9, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer6->Add( gSizer1, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - bSizer181->Add( sbSizer6, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_BOTTOM, 5 ); - - bSizer7->Add( bSizer181, 0, wxALL, 5 ); - - this->SetSizer( bSizer7 ); - this->Layout(); - bSizer7->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncDlgGenerated::OnClose ) ); - m_button18->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnStartSync ), NULL, this ); - m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSelectRecycleBin ), NULL, this ); - m_radioBtn1->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncLeftToRight ), NULL, this ); - m_buttonOneWay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncLeftToRight ), NULL, this ); - m_radioBtnUpdate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncUpdate ), NULL, this ); - m_buttonUpdate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncUpdate ), NULL, this ); - m_radioBtn2->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncBothSides ), NULL, this ); - m_buttonTwoWay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncBothSides ), NULL, this ); - m_radioBtn3->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncCostum ), NULL, this ); - m_button6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnBack ), NULL, this ); - m_button16->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnCancel ), NULL, this ); - m_bpButton5->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnExLeftSideOnly ), NULL, this ); - m_bpButton6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnExRightSideOnly ), NULL, this ); - m_bpButton7->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnLeftNewer ), NULL, this ); - m_bpButton8->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnRightNewer ), NULL, this ); - m_bpButton9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnDifferent ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer7; + bSizer7 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer181; + bSizer181 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer29; + bSizer29 = new wxBoxSizer( wxVERTICAL ); + + bSizer201 = new wxBoxSizer( wxHORIZONTAL ); + + m_button18 = new wxButtonWithImage( this, wxID_OK, _("&Start"), wxDefaultPosition, wxSize( 140,58 ), 0 ); + m_button18->SetDefault(); + m_button18->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Arial Black") ) ); + m_button18->SetToolTip( _("Start synchronization") ); + + bSizer201->Add( m_button18, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer201->Add( 18, 0, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer38; + bSizer38 = new wxBoxSizer( wxVERTICAL ); + + m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("Use Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_checkBoxUseRecycler->SetToolTip( _("Use Recycle Bin when deleting or overwriting files during synchronization") ); + + bSizer38->Add( m_checkBoxUseRecycler, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_checkBoxIgnoreErrors = new wxCheckBox( this, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_checkBoxIgnoreErrors->SetToolTip( _("Hides error messages during synchronization:\nThey are collected and shown as a list at the end of the process") ); + + bSizer38->Add( m_checkBoxIgnoreErrors, 0, wxALL, 5 ); + + bSizer201->Add( bSizer38, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer29->Add( bSizer201, 1, 0, 5 ); + + + bSizer29->Add( 0, 5, 0, 0, 5 ); + + wxStaticBoxSizer* sbSizer7; + sbSizer7 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); + + m_staticText1 = new wxStaticText( this, wxID_ANY, _("Select variant:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText1->Wrap( -1 ); + m_staticText1->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + sbSizer7->Add( m_staticText1, 0, wxALL, 5 ); + + wxFlexGridSizer* fgSizer1; + fgSizer1 = new wxFlexGridSizer( 4, 3, 8, 5 ); + fgSizer1->SetFlexibleDirection( wxHORIZONTAL ); + fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_radioBtn1 = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtn1->SetValue( true ); + m_radioBtn1->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer1->Add( m_radioBtn1, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonOneWay = new wxButton( this, wxID_ANY, _("Mirror ->>"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonOneWay->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer1->Add( m_buttonOneWay, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticText8 = new wxStaticText( this, wxID_ANY, _("Mirror backup of left folder: Right folder will be overwritten and exactly match left folder after synchronization."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText8->Wrap( 300 ); + fgSizer1->Add( m_staticText8, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_radioBtnUpdate = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtnUpdate->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer1->Add( m_radioBtnUpdate, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonUpdate = new wxButton( this, wxID_ANY, _("Update ->"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonUpdate->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer1->Add( m_buttonUpdate, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticText101 = new wxStaticText( this, wxID_ANY, _("Copy new or updated files to right folder."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText101->Wrap( 300 ); + fgSizer1->Add( m_staticText101, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + m_radioBtn2 = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtn2->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer1->Add( m_radioBtn2, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonTwoWay = new wxButton( this, wxID_ANY, _("Two way <->"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_buttonTwoWay->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer1->Add( m_buttonTwoWay, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText10 = new wxStaticText( this, wxID_ANY, _("Synchronize both sides simultaneously: Copy new or updated files in both directions."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText10->Wrap( 300 ); + fgSizer1->Add( m_staticText10, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + m_radioBtn3 = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_radioBtn3->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer1->Add( m_radioBtn3, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer65; + bSizer65 = new wxBoxSizer( wxVERTICAL ); + + + bSizer65->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_staticText23 = new wxStaticText( this, wxID_ANY, _("Custom"), wxDefaultPosition, wxSize( -1,-1 ), wxALIGN_CENTRE|wxSTATIC_BORDER ); + m_staticText23->Wrap( -1 ); + m_staticText23->SetFont( wxFont( 11, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer65->Add( m_staticText23, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizer65->Add( 0, 0, 1, wxEXPAND, 5 ); + + fgSizer1->Add( bSizer65, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticText9 = new wxStaticText( this, wxID_ANY, _("Configure your own synchronization rules."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText9->Wrap( 300 ); + fgSizer1->Add( m_staticText9, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + sbSizer7->Add( fgSizer1, 0, 0, 5 ); + + bSizer29->Add( sbSizer7, 0, wxEXPAND, 5 ); + + + bSizer29->Add( 0, 5, 0, 0, 5 ); + + wxBoxSizer* bSizer291; + bSizer291 = new wxBoxSizer( wxHORIZONTAL ); + + m_button6 = new wxButton( this, wxID_APPLY, _("&Apply"), wxDefaultPosition, wxSize( 100,32 ), 0 ); + m_button6->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer291->Add( m_button6, 0, wxALIGN_BOTTOM, 5 ); + + m_button16 = new wxButton( this, wxID_CANCEL, _("dummy"), wxDefaultPosition, wxSize( 0,0 ), 0 ); + bSizer291->Add( m_button16, 0, wxALIGN_BOTTOM, 5 ); + + + bSizer291->Add( 20, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + wxStaticBoxSizer* sbSizer16; + sbSizer16 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Preview") ), wxHORIZONTAL ); + + wxFlexGridSizer* fgSizer5; + fgSizer5 = new wxFlexGridSizer( 2, 2, 0, 5 ); + fgSizer5->SetFlexibleDirection( wxHORIZONTAL ); + fgSizer5->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + 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 and directories that will be created") ); + + fgSizer5->Add( m_staticText37, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlCreate = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY ); + m_textCtrlCreate->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); + m_textCtrlCreate->SetBackgroundColour( wxColour( 222, 222, 236 ) ); + m_textCtrlCreate->SetToolTip( _("Number of files and directories that will be created") ); + + fgSizer5->Add( m_textCtrlCreate, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + 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 and directories that will be deleted") ); + + fgSizer5->Add( m_staticText14, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlDelete = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY ); + m_textCtrlDelete->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); + m_textCtrlDelete->SetBackgroundColour( wxColour( 222, 222, 236 ) ); + m_textCtrlDelete->SetToolTip( _("Number of files and directories that will be deleted") ); + + fgSizer5->Add( m_textCtrlDelete, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer16->Add( fgSizer5, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + wxFlexGridSizer* fgSizer6; + fgSizer6 = new wxFlexGridSizer( 2, 2, 0, 5 ); + fgSizer6->SetFlexibleDirection( wxHORIZONTAL ); + fgSizer6->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_staticText42 = new wxStaticText( this, wxID_ANY, _("Update:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText42->Wrap( -1 ); + m_staticText42->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); + m_staticText42->SetToolTip( _("Number of files that will be overwritten") ); + + fgSizer6->Add( m_staticText42, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlUpdate = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY ); + m_textCtrlUpdate->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); + m_textCtrlUpdate->SetBackgroundColour( wxColour( 222, 222, 236 ) ); + m_textCtrlUpdate->SetToolTip( _("Number of files that will be overwritten") ); + + fgSizer6->Add( m_textCtrlUpdate, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText43 = new wxStaticText( this, wxID_ANY, _("Data:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText43->Wrap( -1 ); + m_staticText43->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); + m_staticText43->SetToolTip( _("Total amount of data that will be transferred") ); + + fgSizer6->Add( m_staticText43, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlData = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY ); + m_textCtrlData->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) ); + m_textCtrlData->SetBackgroundColour( wxColour( 222, 222, 236 ) ); + m_textCtrlData->SetToolTip( _("Total amount of data that will be transferred") ); + + fgSizer6->Add( m_textCtrlData, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer16->Add( fgSizer6, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + bSizer291->Add( sbSizer16, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + bSizer29->Add( bSizer291, 0, wxEXPAND, 5 ); + + bSizer181->Add( bSizer29, 0, 0, 5 ); + + + bSizer181->Add( 10, 0, 0, 0, 5 ); + + wxStaticBoxSizer* sbSizer6; + sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Configuration") ), wxVERTICAL ); + + wxGridSizer* gSizer3; + gSizer3 = new wxGridSizer( 1, 2, 0, 5 ); + + m_staticText21 = new wxStaticText( this, wxID_ANY, _("Result"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText21->Wrap( -1 ); + m_staticText21->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + gSizer3->Add( m_staticText21, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText31 = new wxStaticText( this, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText31->Wrap( -1 ); + m_staticText31->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + gSizer3->Add( m_staticText31, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer6->Add( gSizer3, 0, wxEXPAND, 5 ); + + m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + sbSizer6->Add( m_staticline3, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxBOTTOM, 5 ); + + wxGridSizer* gSizer1; + gSizer1 = new wxGridSizer( 5, 2, 0, 5 ); + + m_bitmap13 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap13->SetToolTip( _("Files/folders that exist on left side only") ); + + gSizer1->Add( m_bitmap13, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton5 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + gSizer1->Add( m_bpButton5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap14 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap14->SetToolTip( _("Files/folders that exist on right side only") ); + + gSizer1->Add( m_bitmap14, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton6 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + gSizer1->Add( m_bpButton6, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap15 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap15->SetToolTip( _("Files that exist on both sides, left one is newer") ); + + gSizer1->Add( m_bitmap15, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton7 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + gSizer1->Add( m_bpButton7, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap16 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap16->SetToolTip( _("Files that exist on both sides, right one is newer") ); + + gSizer1->Add( m_bitmap16, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton8 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + 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( _("dummy") ); + + gSizer1->Add( m_bitmap17, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButton9 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + gSizer1->Add( m_bpButton9, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer6->Add( gSizer1, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + bSizer181->Add( sbSizer6, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_BOTTOM, 5 ); + + bSizer7->Add( bSizer181, 0, wxALL, 5 ); + + this->SetSizer( bSizer7 ); + this->Layout(); + bSizer7->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncDlgGenerated::OnClose ) ); + m_button18->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnStartSync ), NULL, this ); + m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSelectRecycleBin ), NULL, this ); + m_radioBtn1->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncLeftToRight ), NULL, this ); + m_buttonOneWay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncLeftToRight ), NULL, this ); + m_radioBtnUpdate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncUpdate ), NULL, this ); + m_buttonUpdate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncUpdate ), NULL, this ); + m_radioBtn2->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncBothSides ), NULL, this ); + m_buttonTwoWay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncBothSides ), NULL, this ); + m_radioBtn3->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncCostum ), NULL, this ); + m_button6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnBack ), NULL, this ); + m_button16->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnCancel ), NULL, this ); + m_bpButton5->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnExLeftSideOnly ), NULL, this ); + m_bpButton6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnExRightSideOnly ), NULL, this ); + m_bpButton7->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnLeftNewer ), NULL, this ); + m_bpButton8->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnRightNewer ), NULL, this ); + m_bpButton9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnDifferent ), NULL, this ); } SyncDlgGenerated::~SyncDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncDlgGenerated::OnClose ) ); - m_button18->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnStartSync ), NULL, this ); - m_checkBoxUseRecycler->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSelectRecycleBin ), NULL, this ); - m_radioBtn1->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncLeftToRight ), NULL, this ); - m_buttonOneWay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncLeftToRight ), NULL, this ); - m_radioBtnUpdate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncUpdate ), NULL, this ); - m_buttonUpdate->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncUpdate ), NULL, this ); - m_radioBtn2->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncBothSides ), NULL, this ); - m_buttonTwoWay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncBothSides ), NULL, this ); - m_radioBtn3->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncCostum ), NULL, this ); - m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnBack ), NULL, this ); - m_button16->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnCancel ), NULL, this ); - m_bpButton5->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnExLeftSideOnly ), NULL, this ); - m_bpButton6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnExRightSideOnly ), NULL, this ); - m_bpButton7->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnLeftNewer ), NULL, this ); - m_bpButton8->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnRightNewer ), NULL, this ); - m_bpButton9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnDifferent ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncDlgGenerated::OnClose ) ); + m_button18->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnStartSync ), NULL, this ); + m_checkBoxUseRecycler->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSelectRecycleBin ), NULL, this ); + m_radioBtn1->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncLeftToRight ), NULL, this ); + m_buttonOneWay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncLeftToRight ), NULL, this ); + m_radioBtnUpdate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncUpdate ), NULL, this ); + m_buttonUpdate->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncUpdate ), NULL, this ); + m_radioBtn2->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncBothSides ), NULL, this ); + m_buttonTwoWay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnSyncBothSides ), NULL, this ); + m_radioBtn3->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncDlgGenerated::OnSyncCostum ), NULL, this ); + m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnBack ), NULL, this ); + m_button16->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnCancel ), NULL, this ); + m_bpButton5->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnExLeftSideOnly ), NULL, this ); + m_bpButton6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnExRightSideOnly ), NULL, this ); + m_bpButton7->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnLeftNewer ), NULL, this ); + m_bpButton8->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnRightNewer ), NULL, this ); + m_bpButton9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncDlgGenerated::OnDifferent ), NULL, this ); } SyncStatusDlgGenerated::SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer27; - bSizer27 = new wxBoxSizer( wxVERTICAL ); - - - bSizer27->Add( 0, 15, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer37; - bSizer37 = new wxBoxSizer( wxHORIZONTAL ); - - m_animationControl1 = new wxAnimationCtrl(this, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxSize( 45,45 )); - bSizer37->Add( m_animationControl1, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); - m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxVERTICAL ); - - m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Synchronization status"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText56->Wrap( -1 ); - m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - - m_panel8->SetSizer( bSizer72 ); - m_panel8->Layout(); - bSizer72->Fit( m_panel8 ); - bSizer37->Add( m_panel8, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer27->Add( bSizer37, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - wxBoxSizer* bSizer42; - bSizer42 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_bitmapStatus = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 28,28 ), 0 ); - bSizer42->Add( m_bitmapStatus, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatus->Wrap( -1 ); - m_staticTextStatus->SetFont( wxFont( 14, 74, 93, 90, false, wxT("Tahoma") ) ); - - bSizer42->Add( m_staticTextStatus, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - - bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); - - bSizer27->Add( bSizer42, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer31 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText21 = new wxStaticText( this, wxID_ANY, _("Current operation:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText21->Wrap( -1 ); - m_staticText21->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer31->Add( m_staticText21, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - - 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 ); - m_textCtrlInfo->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); - - bSizer27->Add( m_textCtrlInfo, 3, wxALL|wxEXPAND, 5 ); - - m_gauge1 = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,20 ), wxGA_HORIZONTAL ); - bSizer27->Add( m_gauge1, 0, wxALL|wxEXPAND, 5 ); - - bSizer28 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer33; - bSizer33 = new wxBoxSizer( wxHORIZONTAL ); - - 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, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - - 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") ) ); - - bSizer33->Add( m_staticTextRemainingObj, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer28->Add( bSizer33, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer28->Add( 0, 0, 1, 0, 5 ); - - m_buttonOK = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( 100,32 ), 0 ); - m_buttonOK->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - m_buttonOK->Hide(); - - bSizer28->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_buttonPause = new wxButton( this, wxID_ANY, _("&Pause"), wxDefaultPosition, wxSize( 100,32 ), 0 ); - m_buttonPause->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer28->Add( m_buttonPause, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_buttonAbort = new wxButton( this, wxID_CANCEL, _("&Abort"), wxDefaultPosition, wxSize( 100,32 ), 0 ); - m_buttonAbort->SetDefault(); - m_buttonAbort->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer28->Add( m_buttonAbort, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer28->Add( 0, 0, 1, 0, 5 ); - - wxBoxSizer* bSizer32; - bSizer32 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText26 = new wxStaticText( this, wxID_ANY, _("Data remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText26->Wrap( -1 ); - m_staticText26->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); - - bSizer32->Add( m_staticText26, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - - 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") ) ); - - bSizer32->Add( m_staticTextDataRemaining, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - bSizer28->Add( bSizer32, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer27->Add( bSizer28, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - - bSizer27->Add( 0, 5, 0, wxEXPAND, 5 ); - - this->SetSizer( bSizer27 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncStatusDlgGenerated::OnClose ) ); - m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnOkay ), NULL, this ); - m_buttonPause->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnPause ), NULL, this ); - m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnAbort ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer27; + bSizer27 = new wxBoxSizer( wxVERTICAL ); + + + bSizer27->Add( 0, 15, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer37; + bSizer37 = new wxBoxSizer( wxHORIZONTAL ); + + m_animationControl1 = new wxAnimationCtrl(this, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxSize( 45,45 )); + bSizer37->Add( m_animationControl1, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); + m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); + + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxVERTICAL ); + + m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Synchronization status"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText56->Wrap( -1 ); + m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + m_panel8->SetSizer( bSizer72 ); + m_panel8->Layout(); + bSizer72->Fit( m_panel8 ); + bSizer37->Add( m_panel8, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer27->Add( bSizer37, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxBoxSizer* bSizer42; + bSizer42 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_bitmapStatus = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 28,28 ), 0 ); + bSizer42->Add( m_bitmapStatus, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatus->Wrap( -1 ); + m_staticTextStatus->SetFont( wxFont( 14, 74, 93, 90, false, wxT("Tahoma") ) ); + + bSizer42->Add( m_staticTextStatus, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + + bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); + + bSizer27->Add( bSizer42, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizer31 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText21 = new wxStaticText( this, wxID_ANY, _("Current operation:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText21->Wrap( -1 ); + m_staticText21->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer31->Add( m_staticText21, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + + 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 ); + m_textCtrlInfo->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); + + bSizer27->Add( m_textCtrlInfo, 3, wxALL|wxEXPAND, 5 ); + + m_gauge1 = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,20 ), wxGA_HORIZONTAL ); + bSizer27->Add( m_gauge1, 0, wxALL|wxEXPAND, 5 ); + + bSizer28 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer33; + bSizer33 = new wxBoxSizer( wxHORIZONTAL ); + + 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, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + + 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") ) ); + + bSizer33->Add( m_staticTextRemainingObj, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer28->Add( bSizer33, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer28->Add( 0, 0, 1, 0, 5 ); + + m_buttonOK = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( 100,32 ), 0 ); + m_buttonOK->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + m_buttonOK->Hide(); + + bSizer28->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_buttonPause = new wxButton( this, wxID_ANY, _("&Pause"), wxDefaultPosition, wxSize( 100,32 ), 0 ); + m_buttonPause->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer28->Add( m_buttonPause, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_buttonAbort = new wxButton( this, wxID_CANCEL, _("&Abort"), wxDefaultPosition, wxSize( 100,32 ), 0 ); + m_buttonAbort->SetDefault(); + m_buttonAbort->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer28->Add( m_buttonAbort, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer28->Add( 0, 0, 1, 0, 5 ); + + wxBoxSizer* bSizer32; + bSizer32 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText26 = new wxStaticText( this, wxID_ANY, _("Data remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText26->Wrap( -1 ); + m_staticText26->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); + + bSizer32->Add( m_staticText26, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + + 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") ) ); + + bSizer32->Add( m_staticTextDataRemaining, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + bSizer28->Add( bSizer32, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer27->Add( bSizer28, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + + bSizer27->Add( 0, 5, 0, wxEXPAND, 5 ); + + this->SetSizer( bSizer27 ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncStatusDlgGenerated::OnClose ) ); + m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnOkay ), NULL, this ); + m_buttonPause->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnPause ), NULL, this ); + m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnAbort ), NULL, this ); } SyncStatusDlgGenerated::~SyncStatusDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncStatusDlgGenerated::OnClose ) ); - m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnOkay ), NULL, this ); - m_buttonPause->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnPause ), NULL, this ); - m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnAbort ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncStatusDlgGenerated::OnClose ) ); + m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnOkay ), NULL, this ); + m_buttonPause->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnPause ), NULL, this ); + m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncStatusDlgGenerated::OnAbort ), NULL, this ); } HelpDlgGenerated::HelpDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer20; - bSizer20 = new wxBoxSizer( wxVERTICAL ); - - - bSizer20->Add( 0, 10, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer85; - bSizer85 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap25 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); - bSizer85->Add( m_bitmap25, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); - m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer72->Add( 20, 0, 0, 0, 5 ); - - m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Help"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText56->Wrap( -1 ); - m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer72->Add( 20, 0, 0, 0, 5 ); - - m_panel8->SetSizer( bSizer72 ); - m_panel8->Layout(); - bSizer72->Fit( m_panel8 ); - bSizer85->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer85->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer20->Add( bSizer85, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_notebook1 = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_scrolledWindow1 = new wxScrolledWindow( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxSIMPLE_BORDER|wxVSCROLL ); - m_scrolledWindow1->SetScrollRate( 5, 5 ); - m_scrolledWindow1->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_INACTIVEBORDER ) ); - - wxBoxSizer* bSizer70; - bSizer70 = new wxBoxSizer( wxVERTICAL ); - - m_staticText59 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("Compare by \"File size and date\""), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText59->Wrap( 500 ); - m_staticText59->SetFont( wxFont( 10, 74, 90, 92, true, wxT("Tahoma") ) ); - - bSizer70->Add( m_staticText59, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_staticText60 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time. 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."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText60->Wrap( 500 ); - bSizer70->Add( m_staticText60, 0, wxALL, 5 ); - - m_staticText61 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("When \"Compare\" is triggered with this option set the following decision tree is processed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText61->Wrap( 500 ); - bSizer70->Add( m_staticText61, 0, wxALL, 5 ); - - m_treeCtrl1 = new wxTreeCtrl( m_scrolledWindow1, wxID_ANY, wxDefaultPosition, wxSize( -1,180 ), wxTR_DEFAULT_STYLE ); - m_treeCtrl1->SetBackgroundColour( wxColour( 237, 236, 235 ) ); - - bSizer70->Add( m_treeCtrl1, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_staticText63 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("As a result the files are separated into the following categories:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText63->Wrap( 500 ); - bSizer70->Add( m_staticText63, 0, wxALL, 5 ); - - m_staticText75 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- equal"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText75->Wrap( -1 ); - bSizer70->Add( m_staticText75, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText76 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- left newer"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText76->Wrap( -1 ); - bSizer70->Add( m_staticText76, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText77 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- right newer"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText77->Wrap( -1 ); - bSizer70->Add( m_staticText77, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText78 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- different (same date, different size)"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText78->Wrap( -1 ); - bSizer70->Add( m_staticText78, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText79 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- exists left only"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText79->Wrap( -1 ); - bSizer70->Add( m_staticText79, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText80 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- exists right only"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText80->Wrap( -1 ); - bSizer70->Add( m_staticText80, 0, wxRIGHT|wxLEFT, 5 ); - - m_scrolledWindow1->SetSizer( bSizer70 ); - m_scrolledWindow1->Layout(); - bSizer70->Fit( m_scrolledWindow1 ); - m_notebook1->AddPage( m_scrolledWindow1, _("File size and date"), true ); - m_scrolledWindow5 = new wxScrolledWindow( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); - m_scrolledWindow5->SetScrollRate( 5, 5 ); - m_scrolledWindow5->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_INACTIVEBORDER ) ); - - wxBoxSizer* bSizer74; - bSizer74 = new wxBoxSizer( wxVERTICAL ); - - m_staticText65 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("Compare by \"File content\""), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText65->Wrap( 500 ); - m_staticText65->SetFont( wxFont( 10, 74, 90, 92, true, wxT("Tahoma") ) ); - - bSizer74->Add( m_staticText65, 0, wxALL, 5 ); - - m_staticText66 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText66->Wrap( 500 ); - bSizer74->Add( m_staticText66, 0, wxALL, 5 ); - - m_treeCtrl2 = new wxTreeCtrl( m_scrolledWindow5, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE ); - m_treeCtrl2->SetBackgroundColour( wxColour( 237, 236, 235 ) ); - m_treeCtrl2->SetMinSize( wxSize( -1,130 ) ); - - bSizer74->Add( m_treeCtrl2, 0, wxALL|wxEXPAND, 5 ); - - m_staticText69 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("As a result the files are separated into the following categories:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText69->Wrap( 500 ); - bSizer74->Add( m_staticText69, 0, wxALL, 5 ); - - m_staticText81 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- equal"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText81->Wrap( -1 ); - bSizer74->Add( m_staticText81, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText82 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- different"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText82->Wrap( -1 ); - bSizer74->Add( m_staticText82, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText83 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- exists left only"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText83->Wrap( -1 ); - bSizer74->Add( m_staticText83, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticText84 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- exists right only"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText84->Wrap( -1 ); - bSizer74->Add( m_staticText84, 0, wxRIGHT|wxLEFT, 5 ); - - m_scrolledWindow5->SetSizer( bSizer74 ); - m_scrolledWindow5->Layout(); - bSizer74->Fit( m_scrolledWindow5 ); - m_notebook1->AddPage( m_scrolledWindow5, _("File content"), false ); - - bSizer20->Add( m_notebook1, 1, wxEXPAND | wxALL, 5 ); - - m_button8 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( 100,32 ), 0 ); - m_button8->SetDefault(); - m_button8->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer20->Add( m_button8, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - this->SetSizer( bSizer20 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( HelpDlgGenerated::OnClose ) ); - m_button8->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( HelpDlgGenerated::OnOK ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer20; + bSizer20 = new wxBoxSizer( wxVERTICAL ); + + + bSizer20->Add( 0, 10, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer85; + bSizer85 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap25 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); + bSizer85->Add( m_bitmap25, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); + m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); + + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer72->Add( 20, 0, 0, 0, 5 ); + + m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Help"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText56->Wrap( -1 ); + m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer72->Add( 20, 0, 0, 0, 5 ); + + m_panel8->SetSizer( bSizer72 ); + m_panel8->Layout(); + bSizer72->Fit( m_panel8 ); + bSizer85->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer85->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer20->Add( bSizer85, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_notebook1 = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_scrolledWindow1 = new wxScrolledWindow( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxSIMPLE_BORDER|wxVSCROLL ); + m_scrolledWindow1->SetScrollRate( 5, 5 ); + m_scrolledWindow1->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_INACTIVEBORDER ) ); + + wxBoxSizer* bSizer70; + bSizer70 = new wxBoxSizer( wxVERTICAL ); + + m_staticText59 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("Compare by \"File size and date\""), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText59->Wrap( 500 ); + m_staticText59->SetFont( wxFont( 10, 74, 90, 92, true, wxT("Tahoma") ) ); + + bSizer70->Add( m_staticText59, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_staticText60 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("This variant evaluates two equally named files as being equal when they have the same file size AND the same last write date and time."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText60->Wrap( 500 ); + bSizer70->Add( m_staticText60, 0, wxALL, 5 ); + + m_staticText61 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("When the comparison is started with this option set the following decision tree is processed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText61->Wrap( 500 ); + bSizer70->Add( m_staticText61, 0, wxALL, 5 ); + + m_treeCtrl1 = new wxTreeCtrl( m_scrolledWindow1, wxID_ANY, wxDefaultPosition, wxSize( -1,180 ), wxTR_DEFAULT_STYLE ); + m_treeCtrl1->SetBackgroundColour( wxColour( 237, 236, 235 ) ); + + bSizer70->Add( m_treeCtrl1, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_staticText63 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("As a result the files are separated into the following categories:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText63->Wrap( 500 ); + bSizer70->Add( m_staticText63, 0, wxALL, 5 ); + + m_staticText75 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- equal"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText75->Wrap( -1 ); + bSizer70->Add( m_staticText75, 0, wxRIGHT|wxLEFT, 5 ); + + m_staticText76 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- left newer"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText76->Wrap( -1 ); + bSizer70->Add( m_staticText76, 0, wxRIGHT|wxLEFT, 5 ); + + m_staticText77 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- right newer"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText77->Wrap( -1 ); + bSizer70->Add( m_staticText77, 0, wxRIGHT|wxLEFT, 5 ); + + m_staticText78 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- different (same date, different size)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText78->Wrap( -1 ); + bSizer70->Add( m_staticText78, 0, wxRIGHT|wxLEFT, 5 ); + + m_staticText79 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- exists left only"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText79->Wrap( -1 ); + bSizer70->Add( m_staticText79, 0, wxRIGHT|wxLEFT, 5 ); + + m_staticText80 = new wxStaticText( m_scrolledWindow1, wxID_ANY, _("- exists right only"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText80->Wrap( -1 ); + bSizer70->Add( m_staticText80, 0, wxRIGHT|wxLEFT, 5 ); + + m_scrolledWindow1->SetSizer( bSizer70 ); + m_scrolledWindow1->Layout(); + bSizer70->Fit( m_scrolledWindow1 ); + m_notebook1->AddPage( m_scrolledWindow1, _("File size and date"), true ); + m_scrolledWindow5 = new wxScrolledWindow( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_scrolledWindow5->SetScrollRate( 5, 5 ); + m_scrolledWindow5->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_INACTIVEBORDER ) ); + + wxBoxSizer* bSizer74; + bSizer74 = new wxBoxSizer( wxVERTICAL ); + + m_staticText65 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("Compare by \"File content\""), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText65->Wrap( 500 ); + m_staticText65->SetFont( wxFont( 10, 74, 90, 92, true, wxT("Tahoma") ) ); + + bSizer74->Add( m_staticText65, 0, wxALL, 5 ); + + m_staticText66 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("As the name suggests, two files which share the same name are marked as equal if and only if they have the same content. This option is useful for consistency checks rather than backup operations. Therefore the file times are not taken into account at all.\n\nWith this option enabled the decision tree is smaller:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText66->Wrap( 500 ); + bSizer74->Add( m_staticText66, 0, wxALL, 5 ); + + m_treeCtrl2 = new wxTreeCtrl( m_scrolledWindow5, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE ); + m_treeCtrl2->SetBackgroundColour( wxColour( 237, 236, 235 ) ); + m_treeCtrl2->SetMinSize( wxSize( -1,130 ) ); + + bSizer74->Add( m_treeCtrl2, 0, wxALL|wxEXPAND, 5 ); + + m_staticText69 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("As a result the files are separated into the following categories:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText69->Wrap( 500 ); + bSizer74->Add( m_staticText69, 0, wxALL, 5 ); + + m_staticText81 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- equal"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText81->Wrap( -1 ); + bSizer74->Add( m_staticText81, 0, wxRIGHT|wxLEFT, 5 ); + + m_staticText82 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- different"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText82->Wrap( -1 ); + bSizer74->Add( m_staticText82, 0, wxRIGHT|wxLEFT, 5 ); + + m_staticText83 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- exists left only"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText83->Wrap( -1 ); + bSizer74->Add( m_staticText83, 0, wxRIGHT|wxLEFT, 5 ); + + m_staticText84 = new wxStaticText( m_scrolledWindow5, wxID_ANY, _("- exists right only"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText84->Wrap( -1 ); + bSizer74->Add( m_staticText84, 0, wxRIGHT|wxLEFT, 5 ); + + m_scrolledWindow5->SetSizer( bSizer74 ); + m_scrolledWindow5->Layout(); + bSizer74->Fit( m_scrolledWindow5 ); + m_notebook1->AddPage( m_scrolledWindow5, _("File content"), false ); + + bSizer20->Add( m_notebook1, 1, wxEXPAND | wxALL, 5 ); + + m_button8 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( 100,32 ), 0 ); + m_button8->SetDefault(); + m_button8->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer20->Add( m_button8, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + this->SetSizer( bSizer20 ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( HelpDlgGenerated::OnClose ) ); + m_button8->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( HelpDlgGenerated::OnOK ), NULL, this ); } HelpDlgGenerated::~HelpDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( HelpDlgGenerated::OnClose ) ); - m_button8->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( HelpDlgGenerated::OnOK ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( HelpDlgGenerated::OnClose ) ); + m_button8->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( HelpDlgGenerated::OnOK ), NULL, this ); } AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer31; - bSizer31 = new wxBoxSizer( wxVERTICAL ); - - - bSizer31->Add( 0, 5, 0, 0, 5 ); - - m_panel5 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); - m_panel5->SetBackgroundColour( wxColour( 255, 255, 255 ) ); - - wxBoxSizer* bSizer36; - bSizer36 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap11 = new wxStaticBitmap( m_panel5, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 404,55 ), 0 ); - bSizer36->Add( m_bitmap11, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panel5->SetSizer( bSizer36 ); - m_panel5->Layout(); - bSizer36->Fit( m_panel5 ); - bSizer31->Add( m_panel5, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_staticText15 = new wxStaticText( this, wxID_ANY, _("-Open-Source file synchronization-"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText15->Wrap( -1 ); - m_staticText15->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer31->Add( m_staticText15, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - 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") ) ); - - bSizer31->Add( m_build, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer31->Add( 0, 10, 0, 0, 5 ); - - wxBoxSizer* bSizer53; - bSizer53 = new wxBoxSizer( wxVERTICAL ); - - m_scrolledWindow4 = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDOUBLE_BORDER|wxHSCROLL|wxVSCROLL ); - m_scrolledWindow4->SetScrollRate( 5, 5 ); - m_scrolledWindow4->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); - m_scrolledWindow4->SetMinSize( wxSize( -1,125 ) ); - - wxBoxSizer* bSizer73; - bSizer73 = new wxBoxSizer( wxVERTICAL ); - - m_staticText72 = new wxStaticText( m_scrolledWindow4, wxID_ANY, _("Source code written completely in C++ utilizing:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText72->Wrap( -1 ); - m_staticText72->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer73->Add( m_staticText72, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_staticText73 = new wxStaticText( m_scrolledWindow4, wxID_ANY, _(" MinGW \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"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText73->Wrap( -1 ); - bSizer73->Add( m_staticText73, 0, wxEXPAND|wxALL, 5 ); - - m_staticText74 = new wxStaticText( m_scrolledWindow4, wxID_ANY, _("- ZenJu -"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText74->Wrap( -1 ); - m_staticText74->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); - - bSizer73->Add( m_staticText74, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_scrolledWindow4->SetSizer( bSizer73 ); - m_scrolledWindow4->Layout(); - bSizer73->Fit( m_scrolledWindow4 ); - bSizer53->Add( m_scrolledWindow4, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM, 10 ); - - m_scrolledWindow3 = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxDOUBLE_BORDER|wxHSCROLL|wxVSCROLL ); - m_scrolledWindow3->SetScrollRate( 5, 5 ); - m_scrolledWindow3->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); - m_scrolledWindow3->SetMinSize( wxSize( -1,90 ) ); - m_scrolledWindow3->SetMaxSize( wxSize( -1,100 ) ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxVERTICAL ); - - m_staticText54 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Big thanks for localizing FreeFileSync goes out to:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText54->Wrap( -1 ); - m_staticText54->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer72->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 5 ); - - wxFlexGridSizer* fgSizer9; - fgSizer9 = new wxFlexGridSizer( 1, 2, 5, 20 ); - fgSizer9->SetFlexibleDirection( wxBOTH ); - fgSizer9->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_staticText68 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Jean-François Hartmann"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText68->Wrap( -1 ); - fgSizer9->Add( m_staticText68, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText69 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Français"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText69->Wrap( -1 ); - fgSizer9->Add( m_staticText69, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText70 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Tilt"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText70->Wrap( -1 ); - fgSizer9->Add( m_staticText70, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText71 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("日本語"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText71->Wrap( -1 ); - fgSizer9->Add( m_staticText71, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText711 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("M.D. Vrakking"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText711->Wrap( -1 ); - fgSizer9->Add( m_staticText711, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText712 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Nederlands"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText712->Wrap( -1 ); - fgSizer9->Add( m_staticText712, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText91 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Misty Wu"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText91->Wrap( -1 ); - fgSizer9->Add( m_staticText91, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText92 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("简体中文"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText92->Wrap( -1 ); - fgSizer9->Add( m_staticText92, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText911 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Wojtek Pietruszewski"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText911->Wrap( -1 ); - fgSizer9->Add( m_staticText911, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText921 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Język Polski"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText921->Wrap( -1 ); - fgSizer9->Add( m_staticText921, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText9211 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("QuestMark"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText9211->Wrap( -1 ); - fgSizer9->Add( m_staticText9211, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText9212 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Português"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText9212->Wrap( -1 ); - fgSizer9->Add( m_staticText9212, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText92121 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Emmo"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText92121->Wrap( -1 ); - fgSizer9->Add( m_staticText92121, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText92122 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Italiano"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText92122->Wrap( -1 ); - fgSizer9->Add( m_staticText92122, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer72->Add( fgSizer9, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_scrolledWindow3->SetSizer( bSizer72 ); - m_scrolledWindow3->Layout(); - bSizer72->Fit( m_scrolledWindow3 ); - bSizer53->Add( m_scrolledWindow3, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - bSizer31->Add( bSizer53, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 25 ); - - 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 ); - - m_staticText131 = new wxStaticText( this, wxID_ANY, _("Feedback and suggestions are welcome at:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText131->Wrap( -1 ); - m_staticText131->SetFont( wxFont( 11, 74, 93, 92, false, wxT("Tahoma") ) ); - - sbSizer7->Add( m_staticText131, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizer31->Add( sbSizer7, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - wxFlexGridSizer* fgSizer2; - fgSizer2 = new wxFlexGridSizer( 3, 3, 0, 0 ); - fgSizer2->SetFlexibleDirection( wxHORIZONTAL ); - fgSizer2->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_bitmap9 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - fgSizer2->Add( m_bitmap9, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_staticText11 = new wxStaticText( this, wxID_ANY, _("Homepage:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText11->Wrap( -1 ); - m_staticText11->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer2->Add( m_staticText11, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_hyperlink1 = new wxHyperlinkCtrl( this, wxID_ANY, _("FreeFileSync at Sourceforge"), wxT("http://sourceforge.net/projects/freefilesync/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink1->SetToolTip( _("http://sourceforge.net/projects/freefilesync/") ); - - fgSizer2->Add( m_hyperlink1, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - fgSizer2->Add( m_bitmap10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - m_staticText13 = new wxStaticText( this, wxID_ANY, _("Email:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText13->Wrap( -1 ); - m_staticText13->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer2->Add( m_staticText13, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_hyperlink2 = new wxHyperlinkCtrl( this, wxID_ANY, _("zhnmju123@gmx.de"), wxT("mailto:zhnmju123@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - fgSizer2->Add( m_hyperlink2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_animationControl1 = new wxAnimationCtrl(this, wxID_ANY, wxNullAnimation); - m_animationControl1->Hide(); - - fgSizer2->Add( m_animationControl1, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_staticText151 = new wxStaticText( this, wxID_ANY, _("If you like FFS:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText151->Wrap( -1 ); - m_staticText151->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer2->Add( m_staticText151, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_hyperlink3 = new wxHyperlinkCtrl( this, wxID_ANY, _("Donate with PayPal"), wxT("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zhnmju123%40gmx%2ede&no_shipping=0&no_note=1&tax=0¤cy_code=EUR&lc=EN&bn=PP%2dDonationsBF&charset=UTF%2d8"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - fgSizer2->Add( m_hyperlink3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer31->Add( fgSizer2, 0, wxLEFT|wxEXPAND, 10 ); - - m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer31->Add( m_staticline2, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); - - wxStaticBoxSizer* sbSizer14; - sbSizer14 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Published under the GNU General Public License:") ), wxHORIZONTAL ); - - - sbSizer14->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap13 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 88,31 ), 0 ); - sbSizer14->Add( m_bitmap13, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_hyperlink5 = new wxHyperlinkCtrl( this, wxID_ANY, _("http://www.gnu.org/licenses/gpl.html"), wxT("http://www.gnu.org/licenses/gpl.html"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - sbSizer14->Add( m_hyperlink5, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - sbSizer14->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer31->Add( sbSizer14, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); - - m_button8 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( 100,32 ), 0 ); - m_button8->SetDefault(); - m_button8->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer31->Add( m_button8, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - - this->SetSizer( bSizer31 ); - this->Layout(); - bSizer31->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) ); - m_button8->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer31; + bSizer31 = new wxBoxSizer( wxVERTICAL ); + + + bSizer31->Add( 0, 5, 0, 0, 5 ); + + m_panel5 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); + m_panel5->SetBackgroundColour( wxColour( 255, 255, 255 ) ); + + wxBoxSizer* bSizer36; + bSizer36 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap11 = new wxStaticBitmap( m_panel5, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 404,55 ), 0 ); + bSizer36->Add( m_bitmap11, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panel5->SetSizer( bSizer36 ); + m_panel5->Layout(); + bSizer36->Fit( m_panel5 ); + bSizer31->Add( m_panel5, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_staticText15 = new wxStaticText( this, wxID_ANY, _("-Open-Source file synchronization-"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText15->Wrap( -1 ); + m_staticText15->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer31->Add( m_staticText15, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + 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") ) ); + + bSizer31->Add( m_build, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer31->Add( 0, 10, 0, 0, 5 ); + + wxBoxSizer* bSizer53; + bSizer53 = new wxBoxSizer( wxVERTICAL ); + + m_scrolledWindow4 = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDOUBLE_BORDER|wxHSCROLL|wxVSCROLL ); + m_scrolledWindow4->SetScrollRate( 5, 5 ); + m_scrolledWindow4->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); + m_scrolledWindow4->SetMinSize( wxSize( -1,125 ) ); + + wxBoxSizer* bSizer73; + bSizer73 = new wxBoxSizer( wxVERTICAL ); + + m_staticText72 = new wxStaticText( m_scrolledWindow4, wxID_ANY, _("Source code written completely in C++ utilizing:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText72->Wrap( -1 ); + m_staticText72->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer73->Add( m_staticText72, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_staticText73 = new wxStaticText( m_scrolledWindow4, wxID_ANY, _(" MinGW \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"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText73->Wrap( -1 ); + bSizer73->Add( m_staticText73, 0, wxEXPAND|wxALL, 5 ); + + m_staticText74 = new wxStaticText( m_scrolledWindow4, wxID_ANY, _("- ZenJu -"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText74->Wrap( -1 ); + m_staticText74->SetFont( wxFont( 10, 74, 93, 90, false, wxT("Tahoma") ) ); + + bSizer73->Add( m_staticText74, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_scrolledWindow4->SetSizer( bSizer73 ); + m_scrolledWindow4->Layout(); + bSizer73->Fit( m_scrolledWindow4 ); + bSizer53->Add( m_scrolledWindow4, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM, 10 ); + + m_scrolledWindow3 = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxDOUBLE_BORDER|wxHSCROLL|wxVSCROLL ); + m_scrolledWindow3->SetScrollRate( 5, 5 ); + m_scrolledWindow3->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); + m_scrolledWindow3->SetMinSize( wxSize( -1,140 ) ); + m_scrolledWindow3->SetMaxSize( wxSize( -1,140 ) ); + + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxVERTICAL ); + + m_staticText54 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Big thanks for localizing FreeFileSync goes out to:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText54->Wrap( -1 ); + m_staticText54->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer72->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 5 ); + + + bSizer72->Add( 0, 5, 0, 0, 5 ); + + wxFlexGridSizer* fgSizer9; + fgSizer9 = new wxFlexGridSizer( 1, 2, 5, 20 ); + fgSizer9->SetFlexibleDirection( wxBOTH ); + fgSizer9->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_staticText68 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Jean-François Hartmann"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText68->Wrap( -1 ); + fgSizer9->Add( m_staticText68, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText69 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Français"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText69->Wrap( -1 ); + fgSizer9->Add( m_staticText69, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText70 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Tilt"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText70->Wrap( -1 ); + fgSizer9->Add( m_staticText70, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText71 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("日本語"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText71->Wrap( -1 ); + fgSizer9->Add( m_staticText71, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText711 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("M.D. Vrakking"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText711->Wrap( -1 ); + fgSizer9->Add( m_staticText711, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText712 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Nederlands"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText712->Wrap( -1 ); + fgSizer9->Add( m_staticText712, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText91 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Misty Wu"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText91->Wrap( -1 ); + fgSizer9->Add( m_staticText91, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText92 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("简体中文"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText92->Wrap( -1 ); + fgSizer9->Add( m_staticText92, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText911 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Wojtek Pietruszewski"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText911->Wrap( -1 ); + fgSizer9->Add( m_staticText911, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText921 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Język Polski"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText921->Wrap( -1 ); + fgSizer9->Add( m_staticText921, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText9211 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("QuestMark"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText9211->Wrap( -1 ); + fgSizer9->Add( m_staticText9211, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText9212 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Português"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText9212->Wrap( -1 ); + fgSizer9->Add( m_staticText9212, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText92121 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Emmo"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText92121->Wrap( -1 ); + fgSizer9->Add( m_staticText92121, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText92122 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Italiano"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText92122->Wrap( -1 ); + fgSizer9->Add( m_staticText92122, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText921221 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Matej Badalic"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText921221->Wrap( -1 ); + fgSizer9->Add( m_staticText921221, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText921222 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Slovenščina"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText921222->Wrap( -1 ); + fgSizer9->Add( m_staticText921222, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText682 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Demon"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText682->Wrap( -1 ); + fgSizer9->Add( m_staticText682, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText681 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Magyar Nyelv"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText681->Wrap( -1 ); + fgSizer9->Add( m_staticText681, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText683 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("David Rodríguez"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText683->Wrap( -1 ); + fgSizer9->Add( m_staticText683, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText691 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Español"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText691->Wrap( -1 ); + fgSizer9->Add( m_staticText691, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer72->Add( fgSizer9, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_scrolledWindow3->SetSizer( bSizer72 ); + m_scrolledWindow3->Layout(); + bSizer72->Fit( m_scrolledWindow3 ); + bSizer53->Add( m_scrolledWindow3, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + bSizer31->Add( bSizer53, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 25 ); + + m_staticline3 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer31->Add( m_staticline3, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); + + m_panel22 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER ); + wxBoxSizer* bSizer104; + bSizer104 = new wxBoxSizer( wxVERTICAL ); + + m_staticText131 = new wxStaticText( m_panel22, wxID_ANY, _("Feedback and suggestions are welcome at:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText131->Wrap( -1 ); + m_staticText131->SetFont( wxFont( 11, 74, 93, 92, false, wxT("Tahoma") ) ); + + bSizer104->Add( m_staticText131, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 ); + + m_staticline12 = new wxStaticLine( m_panel22, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer104->Add( m_staticline12, 0, wxEXPAND | wxALL, 5 ); + + wxBoxSizer* bSizer103; + bSizer103 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap9 = new wxStaticBitmap( m_panel22, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap9->SetToolTip( _("FreeFileSync at Sourceforge") ); + + bSizer103->Add( m_bitmap9, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_hyperlink1 = new wxHyperlinkCtrl( m_panel22, wxID_ANY, _("Homepage"), wxT("http://sourceforge.net/projects/freefilesync/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink1->SetFont( wxFont( 10, 74, 90, 92, true, wxT("Tahoma") ) ); + m_hyperlink1->SetToolTip( _("http://sourceforge.net/projects/freefilesync/") ); + + bSizer103->Add( m_hyperlink1, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer103->Add( 30, 0, 1, wxEXPAND, 5 ); + + m_bitmap10 = new wxStaticBitmap( m_panel22, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + m_bitmap10->SetToolTip( _("Email") ); + + bSizer103->Add( m_bitmap10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + m_hyperlink2 = new wxHyperlinkCtrl( m_panel22, wxID_ANY, _("Email"), wxT("mailto:zhnmju123@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink2->SetFont( wxFont( 10, 74, 90, 92, true, wxT("Tahoma") ) ); + m_hyperlink2->SetToolTip( _("zhnmju123@gmx.de") ); + + bSizer103->Add( m_hyperlink2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer104->Add( bSizer103, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_panel22->SetSizer( bSizer104 ); + m_panel22->Layout(); + bSizer104->Fit( m_panel22 ); + bSizer31->Add( m_panel22, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer108; + bSizer108 = new wxBoxSizer( wxHORIZONTAL ); + + m_animationControl1 = new wxAnimationCtrl(this, wxID_ANY, wxNullAnimation); + m_animationControl1->Hide(); + m_animationControl1->SetToolTip( _("Donate with PayPal") ); + + bSizer108->Add( m_animationControl1, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + m_hyperlink3 = new wxHyperlinkCtrl( this, wxID_ANY, _("If you like FFS"), wxT("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zhnmju123%40gmx%2ede&no_shipping=0&no_note=1&tax=0¤cy_code=EUR&lc=EN&bn=PP%2dDonationsBF&charset=UTF%2d8"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink3->SetFont( wxFont( 10, 74, 90, 92, true, wxT("Tahoma") ) ); + m_hyperlink3->SetToolTip( _("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zhnmju123%40gmx%2ede&no_shipping=0&no_note=1&tax=0¤cy_code=EUR&lc=EN&bn=PP%2dDonationsBF&charset=UTF%2d8") ); + + bSizer108->Add( m_hyperlink3, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + bSizer31->Add( bSizer108, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer31->Add( m_staticline2, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); + + wxStaticBoxSizer* sbSizer14; + sbSizer14 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Published under the GNU General Public License:") ), wxHORIZONTAL ); + + + sbSizer14->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap13 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 88,31 ), 0 ); + sbSizer14->Add( m_bitmap13, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_hyperlink5 = new wxHyperlinkCtrl( this, wxID_ANY, _("http://www.gnu.org/licenses/gpl.html"), wxT("http://www.gnu.org/licenses/gpl.html"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + sbSizer14->Add( m_hyperlink5, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + sbSizer14->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer31->Add( sbSizer14, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 5 ); + + m_button8 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( 100,32 ), 0 ); + m_button8->SetDefault(); + m_button8->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer31->Add( m_button8, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + this->SetSizer( bSizer31 ); + this->Layout(); + bSizer31->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) ); + m_button8->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this ); } AboutDlgGenerated::~AboutDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) ); - m_button8->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) ); + m_button8->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this ); } ErrorDlgGenerated::ErrorDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer24; - bSizer24 = new wxBoxSizer( wxVERTICAL ); - - - bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer26; - bSizer26 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - bSizer26->Add( m_bitmap10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY ); - m_textCtrl8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); - - bSizer26->Add( m_textCtrl8, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - bSizer24->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM, 5 ); - - m_checkBoxIgnoreErrors = new wxCheckBox( this, wxID_ANY, _("Ignore subsequent errors"), wxDefaultPosition, wxDefaultSize, 0 ); - - m_checkBoxIgnoreErrors->SetToolTip( _("Hide further error messages during the current process") ); - - bSizer24->Add( m_checkBoxIgnoreErrors, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer25; - bSizer25 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonIgnore = new wxButton( this, wxID_OK, _("&Ignore"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonIgnore->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer25->Add( m_buttonIgnore, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_buttonRetry = new wxButton( this, wxID_RETRY, _("&Retry"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonRetry->SetDefault(); - m_buttonRetry->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer25->Add( m_buttonRetry, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_buttonAbort = new wxButton( this, wxID_CANCEL, _("&Abort"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonAbort->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer25->Add( m_buttonAbort, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - - bSizer25->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - this->SetSizer( bSizer24 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ErrorDlgGenerated::OnClose ) ); - m_buttonIgnore->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnIgnore ), NULL, this ); - m_buttonRetry->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnRetry ), NULL, this ); - m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnAbort ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer24; + bSizer24 = new wxBoxSizer( wxVERTICAL ); + + + bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer26; + bSizer26 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + bSizer26->Add( m_bitmap10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY ); + m_textCtrl8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); + + bSizer26->Add( m_textCtrl8, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + bSizer24->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM, 5 ); + + m_checkBoxIgnoreErrors = new wxCheckBox( this, wxID_ANY, _("Ignore subsequent errors"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_checkBoxIgnoreErrors->SetToolTip( _("Hide further error messages during the current process") ); + + bSizer24->Add( m_checkBoxIgnoreErrors, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer25; + bSizer25 = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonIgnore = new wxButton( this, wxID_OK, _("&Ignore"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonIgnore->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer25->Add( m_buttonIgnore, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_buttonRetry = new wxButton( this, wxID_RETRY, _("&Retry"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonRetry->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer25->Add( m_buttonRetry, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_buttonAbort = new wxButton( this, wxID_CANCEL, _("&Abort"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonAbort->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer25->Add( m_buttonAbort, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + + bSizer25->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + this->SetSizer( bSizer24 ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ErrorDlgGenerated::OnClose ) ); + m_buttonIgnore->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnIgnore ), NULL, this ); + m_buttonRetry->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnRetry ), NULL, this ); + m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnAbort ), NULL, this ); } ErrorDlgGenerated::~ErrorDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ErrorDlgGenerated::OnClose ) ); - m_buttonIgnore->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnIgnore ), NULL, this ); - m_buttonRetry->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnRetry ), NULL, this ); - m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnAbort ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ErrorDlgGenerated::OnClose ) ); + m_buttonIgnore->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnIgnore ), NULL, this ); + m_buttonRetry->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnRetry ), NULL, this ); + m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnAbort ), NULL, this ); } WarningDlgGenerated::WarningDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer24; - bSizer24 = new wxBoxSizer( wxVERTICAL ); - - - bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer26; - bSizer26 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); - bSizer26->Add( m_bitmap10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY ); - m_textCtrl8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); - - bSizer26->Add( m_textCtrl8, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - bSizer24->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - - bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); - - m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("Do not show this warning again"), wxDefaultPosition, wxDefaultSize, 0 ); - - bSizer24->Add( m_checkBoxDontShowAgain, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer25; - bSizer25 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonIgnore = new wxButton( this, wxID_IGNORE, _("&Ignore"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonIgnore->SetDefault(); - m_buttonIgnore->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer25->Add( m_buttonIgnore, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_buttonAbort = new wxButton( this, wxID_CANCEL, _("&Abort"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonAbort->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer25->Add( m_buttonAbort, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - - bSizer25->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - this->SetSizer( bSizer24 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( WarningDlgGenerated::OnClose ) ); - m_buttonIgnore->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnIgnore ), NULL, this ); - m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnAbort ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer24; + bSizer24 = new wxBoxSizer( wxVERTICAL ); + + + bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer26; + bSizer26 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 ); + bSizer26->Add( m_bitmap10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY ); + m_textCtrl8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); + + bSizer26->Add( m_textCtrl8, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + bSizer24->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + + bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); + + m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("Do not show this warning again"), wxDefaultPosition, wxDefaultSize, 0 ); + + bSizer24->Add( m_checkBoxDontShowAgain, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer25; + bSizer25 = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonIgnore = new wxButton( this, wxID_IGNORE, _("&Ignore"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonIgnore->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer25->Add( m_buttonIgnore, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_buttonAbort = new wxButton( this, wxID_CANCEL, _("&Abort"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonAbort->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer25->Add( m_buttonAbort, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + + bSizer25->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + this->SetSizer( bSizer24 ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( WarningDlgGenerated::OnClose ) ); + m_buttonIgnore->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnIgnore ), NULL, this ); + m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnAbort ), NULL, this ); } WarningDlgGenerated::~WarningDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( WarningDlgGenerated::OnClose ) ); - m_buttonIgnore->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnIgnore ), NULL, this ); - m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnAbort ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( WarningDlgGenerated::OnClose ) ); + m_buttonIgnore->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnIgnore ), NULL, this ); + m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( WarningDlgGenerated::OnAbort ), NULL, this ); } DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer24; - bSizer24 = new wxBoxSizer( wxVERTICAL ); - - - bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer41; - bSizer41 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer41->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_bitmap12 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); - bSizer41->Add( m_bitmap12, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextHeader->Wrap( -1 ); - m_staticTextHeader->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer41->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer41->Add( 0, 0, 1, wxEXPAND, 5 ); - - bSizer24->Add( bSizer41, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer99; - bSizer99 = new wxBoxSizer( wxHORIZONTAL ); - - m_checkBoxDeleteBothSides = new wxCheckBox( this, wxID_ANY, _("Delete on both sides"), wxDefaultPosition, wxDefaultSize, 0 ); - - m_checkBoxDeleteBothSides->SetToolTip( _("Delete on both sides even if the file is selected on one side only") ); - - bSizer99->Add( m_checkBoxDeleteBothSides, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer99->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("Use Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxUseRecycler->SetValue(true); - - bSizer99->Add( m_checkBoxUseRecycler, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer24->Add( bSizer99, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 10 ); - - m_textCtrlMessage = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY ); - m_textCtrlMessage->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); - - bSizer24->Add( m_textCtrlMessage, 1, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - wxBoxSizer* bSizer25; - bSizer25 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonOK = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonOK->SetDefault(); - m_buttonOK->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer25->Add( m_buttonOK, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonCancel->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer25->Add( m_buttonCancel, 0, wxALL, 5 ); - - bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - this->SetSizer( bSizer24 ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) ); - m_checkBoxDeleteBothSides->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnDelOnBothSides ), NULL, this ); - m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnUseRecycler ), NULL, this ); - m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer24; + bSizer24 = new wxBoxSizer( wxVERTICAL ); + + + bSizer24->Add( 0, 10, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer41; + bSizer41 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer41->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_bitmap12 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); + bSizer41->Add( m_bitmap12, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHeader->Wrap( -1 ); + m_staticTextHeader->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer41->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer41->Add( 0, 0, 1, wxEXPAND, 5 ); + + bSizer24->Add( bSizer41, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer99; + bSizer99 = new wxBoxSizer( wxHORIZONTAL ); + + m_checkBoxDeleteBothSides = new wxCheckBox( this, wxID_ANY, _("Delete on both sides"), wxDefaultPosition, wxDefaultSize, 0 ); + + m_checkBoxDeleteBothSides->SetToolTip( _("Delete on both sides even if the file is selected on one side only") ); + + bSizer99->Add( m_checkBoxDeleteBothSides, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer99->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("Use Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxUseRecycler->SetValue(true); + + bSizer99->Add( m_checkBoxUseRecycler, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer24->Add( bSizer99, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 10 ); + + m_textCtrlMessage = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY ); + m_textCtrlMessage->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVEBORDER ) ); + + bSizer24->Add( m_textCtrlMessage, 1, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer25; + bSizer25 = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonOK = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonOK->SetDefault(); + m_buttonOK->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer25->Add( m_buttonOK, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonCancel->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer25->Add( m_buttonCancel, 0, wxALL, 5 ); + + bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + this->SetSizer( bSizer24 ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) ); + m_checkBoxDeleteBothSides->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnDelOnBothSides ), NULL, this ); + m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnUseRecycler ), NULL, this ); + m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this ); } DeleteDlgGenerated::~DeleteDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) ); - m_checkBoxDeleteBothSides->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnDelOnBothSides ), NULL, this ); - m_checkBoxUseRecycler->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnUseRecycler ), NULL, this ); - m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this ); - m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) ); + m_checkBoxDeleteBothSides->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnDelOnBothSides ), NULL, this ); + m_checkBoxUseRecycler->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnUseRecycler ), NULL, this ); + m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this ); + m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this ); } FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer21; - bSizer21 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer86; - bSizer86 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap26 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); - bSizer86->Add( m_bitmap26, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); - m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxVERTICAL ); - - m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Synchronization filter"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText56->Wrap( -1 ); - m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - - m_panel8->SetSizer( bSizer72 ); - m_panel8->Layout(); - bSizer72->Fit( m_panel8 ); - bSizer86->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer86->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer21->Add( bSizer86, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM, 5 ); - - - bSizer21->Add( 0, 0, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - wxBoxSizer* bSizer70; - bSizer70 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText44 = new wxStaticText( this, wxID_ANY, _("Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the full name including path prefix."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText44->Wrap( 400 ); - bSizer70->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonHelp = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - m_bpButtonHelp->SetToolTip( _("Help") ); - - m_bpButtonHelp->SetToolTip( _("Help") ); - - bSizer70->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - bSizer21->Add( bSizer70, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 ); - - - bSizer21->Add( 0, 5, 0, 0, 5 ); - - m_panel13 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer69; - bSizer69 = new wxBoxSizer( wxVERTICAL ); - - m_staticline10 = new wxStaticLine( m_panel13, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer69->Add( m_staticline10, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); - - wxBoxSizer* bSizer52; - bSizer52 = new wxBoxSizer( wxVERTICAL ); - - m_staticText45 = new wxStaticText( m_panel13, wxID_ANY, _("Hints:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText45->Wrap( -1 ); - m_staticText45->SetFont( wxFont( 10, 74, 90, 92, true, wxT("Tahoma") ) ); - - bSizer52->Add( m_staticText45, 0, wxBOTTOM, 5 ); - - m_staticText83 = new wxStaticText( m_panel13, wxID_ANY, _("1. Enter full file or directory names separated by ';' or a new line."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText83->Wrap( -1 ); - bSizer52->Add( m_staticText83, 0, 0, 5 ); - - m_staticText84 = new wxStaticText( m_panel13, wxID_ANY, _("2. Use wildcard characters '*' and '?'."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText84->Wrap( -1 ); - bSizer52->Add( m_staticText84, 0, 0, 5 ); - - m_staticText85 = new wxStaticText( m_panel13, wxID_ANY, _("3. Exclude files directly on main grid via context menu."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText85->Wrap( -1 ); - bSizer52->Add( m_staticText85, 0, 0, 5 ); - - m_staticText86 = new wxStaticText( m_panel13, wxID_ANY, _("4. Keep the number of entries small for best performance."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText86->Wrap( -1 ); - bSizer52->Add( m_staticText86, 0, wxBOTTOM, 5 ); - - bSizer69->Add( bSizer52, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - wxStaticBoxSizer* sbSizer21; - sbSizer21 = new wxStaticBoxSizer( new wxStaticBox( m_panel13, wxID_ANY, _("Example") ), wxVERTICAL ); - - wxBoxSizer* bSizer66; - bSizer66 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText181 = new wxStaticText( m_panel13, wxID_ANY, _("Include: *.doc;*.zip;*.exe\nExclude: *\\temp\\*"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText181->Wrap( -1 ); - bSizer66->Add( m_staticText181, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticText1811 = new wxStaticText( m_panel13, wxID_ANY, _("Synchronize all .doc, .zip and .exe files except everything from folder \"temp\"."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText1811->Wrap( 250 ); - m_staticText1811->SetFont( wxFont( 8, 74, 93, 90, false, wxT("Tahoma") ) ); - - bSizer66->Add( m_staticText1811, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - sbSizer21->Add( bSizer66, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 ); - - bSizer69->Add( sbSizer21, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_panel13->SetSizer( bSizer69 ); - m_panel13->Layout(); - bSizer69->Fit( m_panel13 ); - bSizer21->Add( m_panel13, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxEXPAND, 5 ); - - wxStaticBoxSizer* sbSizer8; - sbSizer8 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); - - wxFlexGridSizer* fgSizer3; - fgSizer3 = new wxFlexGridSizer( 2, 2, 0, 0 ); - fgSizer3->SetFlexibleDirection( wxBOTH ); - fgSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - - fgSizer3->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_staticText15 = new wxStaticText( this, wxID_ANY, _("Include"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText15->Wrap( -1 ); - m_staticText15->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer3->Add( m_staticText15, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_bitmap8 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); - fgSizer3->Add( m_bitmap8, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_textCtrlInclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 400,-1 ), wxTE_MULTILINE ); - fgSizer3->Add( m_textCtrlInclude, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer8->Add( fgSizer3, 0, 0, 5 ); - - wxFlexGridSizer* fgSizer4; - fgSizer4 = new wxFlexGridSizer( 2, 2, 0, 0 ); - fgSizer4->SetFlexibleDirection( wxBOTH ); - fgSizer4->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - - fgSizer4->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_staticText16 = new wxStaticText( this, wxID_ANY, _("Exclude"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText16->Wrap( -1 ); - m_staticText16->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - fgSizer4->Add( m_staticText16, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_bitmap9 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); - fgSizer4->Add( m_bitmap9, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_textCtrlExclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 400,-1 ), wxTE_MULTILINE ); - fgSizer4->Add( m_textCtrlExclude, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer8->Add( fgSizer4, 0, 0, 5 ); - - bSizer21->Add( sbSizer8, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - - - bSizer21->Add( 0, 0, 0, 0, 5 ); - - wxBoxSizer* bSizer22; - bSizer22 = new wxBoxSizer( wxHORIZONTAL ); - - m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button9->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer22->Add( m_button9, 0, wxALL, 5 ); - - - bSizer22->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_button10 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button10->SetDefault(); - m_button10->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer22->Add( m_button10, 0, wxALL, 5 ); - - m_button17 = new wxButton( this, wxID_CANCEL, _("dummy"), wxDefaultPosition, wxSize( 0,0 ), 0 ); - bSizer22->Add( m_button17, 0, wxALIGN_BOTTOM, 5 ); - - bSizer21->Add( bSizer22, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 5 ); - - this->SetSizer( bSizer21 ); - this->Layout(); - bSizer21->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) ); - m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this ); - m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnDefault ), NULL, this ); - m_button10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnOK ), NULL, this ); - m_button17->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer21; + bSizer21 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer86; + bSizer86 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap26 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); + bSizer86->Add( m_bitmap26, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); + m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); + + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxVERTICAL ); + + m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Synchronization filter"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText56->Wrap( -1 ); + m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + m_panel8->SetSizer( bSizer72 ); + m_panel8->Layout(); + bSizer72->Fit( m_panel8 ); + bSizer86->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer86->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer21->Add( bSizer86, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM, 5 ); + + + bSizer21->Add( 0, 0, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxBoxSizer* bSizer70; + bSizer70 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText44 = new wxStaticText( this, wxID_ANY, _("Only files/directories that pass filtering will be selected for synchronization. The filter will be applied to the full name including path prefix."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText44->Wrap( 400 ); + bSizer70->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonHelp = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButtonHelp->SetToolTip( _("Help") ); + + m_bpButtonHelp->SetToolTip( _("Help") ); + + bSizer70->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + bSizer21->Add( bSizer70, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 ); + + + bSizer21->Add( 0, 5, 0, 0, 5 ); + + m_panel13 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer69; + bSizer69 = new wxBoxSizer( wxVERTICAL ); + + m_staticline10 = new wxStaticLine( m_panel13, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer69->Add( m_staticline10, 0, wxEXPAND|wxTOP|wxBOTTOM, 5 ); + + wxBoxSizer* bSizer52; + bSizer52 = new wxBoxSizer( wxVERTICAL ); + + m_staticText45 = new wxStaticText( m_panel13, wxID_ANY, _("Hints:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText45->Wrap( -1 ); + m_staticText45->SetFont( wxFont( 10, 74, 90, 92, true, wxT("Tahoma") ) ); + + bSizer52->Add( m_staticText45, 0, wxBOTTOM, 5 ); + + m_staticText83 = new wxStaticText( m_panel13, wxID_ANY, _("1. Enter full file or directory names separated by ';' or a new line."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText83->Wrap( -1 ); + bSizer52->Add( m_staticText83, 0, 0, 5 ); + + m_staticText84 = new wxStaticText( m_panel13, wxID_ANY, _("2. Use wildcard characters '*' and '?'."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText84->Wrap( -1 ); + bSizer52->Add( m_staticText84, 0, 0, 5 ); + + m_staticText85 = new wxStaticText( m_panel13, wxID_ANY, _("3. Exclude files directly on main grid via context menu."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText85->Wrap( -1 ); + bSizer52->Add( m_staticText85, 0, 0, 5 ); + + m_staticText86 = new wxStaticText( m_panel13, wxID_ANY, _("4. Keep the number of entries small for best performance."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText86->Wrap( -1 ); + bSizer52->Add( m_staticText86, 0, wxBOTTOM, 5 ); + + bSizer69->Add( bSizer52, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxStaticBoxSizer* sbSizer21; + sbSizer21 = new wxStaticBoxSizer( new wxStaticBox( m_panel13, wxID_ANY, _("Example") ), wxVERTICAL ); + + wxBoxSizer* bSizer66; + bSizer66 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText181 = new wxStaticText( m_panel13, wxID_ANY, _("Include: *.doc;*.zip;*.exe\nExclude: *\\temp\\*"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText181->Wrap( -1 ); + bSizer66->Add( m_staticText181, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticText1811 = new wxStaticText( m_panel13, wxID_ANY, _("Synchronize all .doc, .zip and .exe files except everything from folder \"temp\"."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText1811->Wrap( 250 ); + m_staticText1811->SetFont( wxFont( 8, 74, 93, 90, false, wxT("Tahoma") ) ); + + bSizer66->Add( m_staticText1811, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + sbSizer21->Add( bSizer66, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 ); + + bSizer69->Add( sbSizer21, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_panel13->SetSizer( bSizer69 ); + m_panel13->Layout(); + bSizer69->Fit( m_panel13 ); + bSizer21->Add( m_panel13, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxEXPAND, 5 ); + + wxStaticBoxSizer* sbSizer8; + sbSizer8 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); + + wxFlexGridSizer* fgSizer3; + fgSizer3 = new wxFlexGridSizer( 2, 2, 0, 0 ); + fgSizer3->SetFlexibleDirection( wxBOTH ); + fgSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + + fgSizer3->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_staticText15 = new wxStaticText( this, wxID_ANY, _("Include"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText15->Wrap( -1 ); + m_staticText15->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer3->Add( m_staticText15, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_bitmap8 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); + fgSizer3->Add( m_bitmap8, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_textCtrlInclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 400,-1 ), wxTE_MULTILINE ); + fgSizer3->Add( m_textCtrlInclude, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer8->Add( fgSizer3, 0, 0, 5 ); + + wxFlexGridSizer* fgSizer4; + fgSizer4 = new wxFlexGridSizer( 2, 2, 0, 0 ); + fgSizer4->SetFlexibleDirection( wxBOTH ); + fgSizer4->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + + fgSizer4->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_staticText16 = new wxStaticText( this, wxID_ANY, _("Exclude"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText16->Wrap( -1 ); + m_staticText16->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + fgSizer4->Add( m_staticText16, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_bitmap9 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); + fgSizer4->Add( m_bitmap9, 0, wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_textCtrlExclude = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 400,-1 ), wxTE_MULTILINE ); + fgSizer4->Add( m_textCtrlExclude, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer8->Add( fgSizer4, 0, 0, 5 ); + + bSizer21->Add( sbSizer8, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + bSizer21->Add( 0, 0, 0, 0, 5 ); + + wxBoxSizer* bSizer22; + bSizer22 = new wxBoxSizer( wxHORIZONTAL ); + + m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button9->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer22->Add( m_button9, 0, wxALL, 5 ); + + + bSizer22->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_button10 = new wxButton( this, wxID_OK, _("&OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button10->SetDefault(); + m_button10->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer22->Add( m_button10, 0, wxALL, 5 ); + + m_button17 = new wxButton( this, wxID_CANCEL, _("dummy"), wxDefaultPosition, wxSize( 0,0 ), 0 ); + bSizer22->Add( m_button17, 0, wxALIGN_BOTTOM, 5 ); + + bSizer21->Add( bSizer22, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 5 ); + + this->SetSizer( bSizer21 ); + this->Layout(); + bSizer21->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) ); + m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this ); + m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnDefault ), NULL, this ); + m_button10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnOK ), NULL, this ); + m_button17->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this ); } FilterDlgGenerated::~FilterDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) ); - m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this ); - m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnDefault ), NULL, this ); - m_button10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnOK ), NULL, this ); - m_button17->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) ); + m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this ); + m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnDefault ), NULL, this ); + m_button10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnOK ), NULL, this ); + m_button17->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this ); } CustomizeColsDlgGenerated::CustomizeColsDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer96; - bSizer96 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer99; - bSizer99 = new wxBoxSizer( wxHORIZONTAL ); - - wxArrayString m_checkListColumnsChoices; - m_checkListColumns = new wxCheckListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_checkListColumnsChoices, 0 ); - bSizer99->Add( m_checkListColumns, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer98; - bSizer98 = new wxBoxSizer( wxVERTICAL ); - - m_bpButton29 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - m_bpButton29->SetToolTip( _("Move column up") ); - - m_bpButton29->SetToolTip( _("Move column up") ); - - bSizer98->Add( m_bpButton29, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_bpButton30 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); - m_bpButton30->SetToolTip( _("Move column down") ); - - m_bpButton30->SetToolTip( _("Move column down") ); - - bSizer98->Add( m_bpButton30, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - bSizer99->Add( bSizer98, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer96->Add( bSizer99, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - wxBoxSizer* bSizer97; - bSizer97 = new wxBoxSizer( wxHORIZONTAL ); - - m_button28 = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button28->SetDefault(); - m_button28->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer97->Add( m_button28, 0, wxALL, 5 ); - - m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button9->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer97->Add( m_button9, 0, wxALL, 5 ); - - m_button29 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button29->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer97->Add( m_button29, 0, wxALL, 5 ); - - bSizer96->Add( bSizer97, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - - bSizer96->Add( 0, 0, 0, wxALIGN_CENTER_HORIZONTAL, 20 ); - - this->SetSizer( bSizer96 ); - this->Layout(); - bSizer96->Fit( this ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CustomizeColsDlgGenerated::OnClose ) ); - m_bpButton29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveUp ), NULL, this ); - m_bpButton30->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveDown ), NULL, this ); - m_button28->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnOkay ), NULL, this ); - m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnDefault ), NULL, this ); - m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnCancel ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer96; + bSizer96 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer99; + bSizer99 = new wxBoxSizer( wxHORIZONTAL ); + + wxArrayString m_checkListColumnsChoices; + m_checkListColumns = new wxCheckListBox( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_checkListColumnsChoices, 0 ); + bSizer99->Add( m_checkListColumns, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer98; + bSizer98 = new wxBoxSizer( wxVERTICAL ); + + m_bpButton29 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButton29->SetToolTip( _("Move column up") ); + + m_bpButton29->SetToolTip( _("Move column up") ); + + bSizer98->Add( m_bpButton29, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_bpButton30 = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW ); + m_bpButton30->SetToolTip( _("Move column down") ); + + m_bpButton30->SetToolTip( _("Move column down") ); + + bSizer98->Add( m_bpButton30, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + bSizer99->Add( bSizer98, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer96->Add( bSizer99, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxBoxSizer* bSizer97; + bSizer97 = new wxBoxSizer( wxHORIZONTAL ); + + m_button28 = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button28->SetDefault(); + m_button28->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer97->Add( m_button28, 0, wxALL, 5 ); + + m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button9->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer97->Add( m_button9, 0, wxALL, 5 ); + + m_button29 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button29->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer97->Add( m_button29, 0, wxALL, 5 ); + + bSizer96->Add( bSizer97, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + bSizer96->Add( 0, 0, 0, wxALIGN_CENTER_HORIZONTAL, 20 ); + + this->SetSizer( bSizer96 ); + this->Layout(); + bSizer96->Fit( this ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CustomizeColsDlgGenerated::OnClose ) ); + m_bpButton29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveUp ), NULL, this ); + m_bpButton30->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveDown ), NULL, this ); + m_button28->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnOkay ), NULL, this ); + m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnDefault ), NULL, this ); + m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnCancel ), NULL, this ); } CustomizeColsDlgGenerated::~CustomizeColsDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CustomizeColsDlgGenerated::OnClose ) ); - m_bpButton29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveUp ), NULL, this ); - m_bpButton30->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveDown ), NULL, this ); - m_button28->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnOkay ), NULL, this ); - m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnDefault ), NULL, this ); - m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnCancel ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CustomizeColsDlgGenerated::OnClose ) ); + m_bpButton29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveUp ), NULL, this ); + m_bpButton30->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnMoveDown ), NULL, this ); + m_button28->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnOkay ), NULL, this ); + m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnDefault ), NULL, this ); + m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CustomizeColsDlgGenerated::OnCancel ), NULL, this ); } GlobalSettingsDlgGenerated::GlobalSettingsDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer95; - bSizer95 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer86; - bSizer86 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapSettings = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); - bSizer86->Add( m_bitmapSettings, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); - m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxVERTICAL ); - - m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Global settings"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText56->Wrap( -1 ); - m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - - m_panel8->SetSizer( bSizer72 ); - m_panel8->Layout(); - bSizer72->Fit( m_panel8 ); - bSizer86->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer86->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizer95->Add( bSizer86, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer95->Add( 0, 10, 0, 0, 5 ); - - wxStaticBoxSizer* sbSizer23; - sbSizer23 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); - - m_checkBoxHandleDstFat = new wxCheckBox( this, wxID_ANY, _("FAT32: Handle Daylight Saving Time"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxHandleDstFat->SetValue(true); - - m_checkBoxHandleDstFat->SetToolTip( _("Active for FAT/FAT32 drives only: When comparing filetimes treat files that differ by less or equal than 1 hour as equal. This ensures daylight saving time switches are handled properly.") ); - - sbSizer23->Add( m_checkBoxHandleDstFat, 0, wxALL, 5 ); - - wxBoxSizer* bSizer104; - bSizer104 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText97 = new wxStaticText( this, wxID_ANY, _("File Manager integration:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText97->Wrap( -1 ); - m_staticText97->SetToolTip( _("This commandline will be executed each time you doubleclick on a filename. %x serves as a placeholder for the selected file.") ); - - bSizer104->Add( m_staticText97, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlFileManager = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 150,-1 ), 0 ); - m_textCtrlFileManager->SetToolTip( _("This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file.") ); - - bSizer104->Add( m_textCtrlFileManager, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - sbSizer23->Add( bSizer104, 1, wxEXPAND, 5 ); - - m_buttonResetWarnings = new wxButtonWithImage( this, wxID_ANY, _("Reset"), wxDefaultPosition, wxSize( 80,-1 ), 0 ); - m_buttonResetWarnings->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); - m_buttonResetWarnings->SetToolTip( _("Resets all warning messages") ); - - sbSizer23->Add( m_buttonResetWarnings, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 ); - - bSizer95->Add( sbSizer23, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 ); - - - bSizer95->Add( 0, 10, 0, 0, 5 ); - - wxBoxSizer* bSizer97; - bSizer97 = new wxBoxSizer( wxHORIZONTAL ); - - m_button28 = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button28->SetDefault(); - m_button28->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); - - bSizer97->Add( m_button28, 0, wxALL, 5 ); - - m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button9->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer97->Add( m_button9, 0, wxALL, 5 ); - - m_button29 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_button29->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); - - bSizer97->Add( m_button29, 0, wxALL, 5 ); - - bSizer95->Add( bSizer97, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - this->SetSizer( bSizer95 ); - this->Layout(); - bSizer95->Fit( this ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GlobalSettingsDlgGenerated::OnClose ) ); - m_buttonResetWarnings->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnResetWarnings ), NULL, this ); - m_button28->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); - m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this ); - m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer95; + bSizer95 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer86; + bSizer86 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapSettings = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 ); + bSizer86->Add( m_bitmapSettings, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + m_panel8 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER|wxTAB_TRAVERSAL ); + m_panel8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_3DLIGHT ) ); + + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxVERTICAL ); + + m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Global settings"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText56->Wrap( -1 ); + m_staticText56->SetFont( wxFont( 16, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + m_panel8->SetSizer( bSizer72 ); + m_panel8->Layout(); + bSizer72->Fit( m_panel8 ); + bSizer86->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer86->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizer95->Add( bSizer86, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer95->Add( 0, 10, 0, 0, 5 ); + + wxStaticBoxSizer* sbSizer23; + sbSizer23 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL ); + + wxBoxSizer* bSizer100; + bSizer100 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText99 = new wxStaticText( this, wxID_ANY, _("File Time Tolerance:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText99->Wrap( -1 ); + m_staticText99->SetToolTip( _("File times that differ by up to the specified number of seconds are still handled as having same time.") ); + + bSizer100->Add( m_staticText99, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer100->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_spinCtrlFileTimeTolerance = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS|wxSP_WRAP, 0, 2000000000, 0 ); + m_spinCtrlFileTimeTolerance->SetToolTip( _("File times that differ by up to the specified number of seconds are still handled as having same time.") ); + + bSizer100->Add( m_spinCtrlFileTimeTolerance, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer23->Add( bSizer100, 1, wxEXPAND, 5 ); + + m_staticline10 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + sbSizer23->Add( m_staticline10, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 5 ); + + wxBoxSizer* bSizer104; + bSizer104 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText97 = new wxStaticText( this, wxID_ANY, _("File Manager integration:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText97->Wrap( -1 ); + m_staticText97->SetToolTip( _("This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file.") ); + + bSizer104->Add( m_staticText97, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlFileManager = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 150,-1 ), 0 ); + m_textCtrlFileManager->SetToolTip( _("This commandline will be executed each time you doubleclick on a filename. %name serves as a placeholder for the selected file.") ); + + bSizer104->Add( m_textCtrlFileManager, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer23->Add( bSizer104, 1, wxEXPAND, 5 ); + + m_staticline101 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + sbSizer23->Add( m_staticline101, 0, wxEXPAND | wxALL, 5 ); + + wxBoxSizer* bSizer101; + bSizer101 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText100 = new wxStaticText( this, wxID_ANY, _("Warnings:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText100->Wrap( -1 ); + bSizer101->Add( m_staticText100, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer101->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_buttonResetWarnings = new wxButtonWithImage( this, wxID_ANY, _("Reset"), wxDefaultPosition, wxSize( 80,-1 ), 0 ); + m_buttonResetWarnings->SetFont( wxFont( 8, 74, 90, 92, false, wxT("Tahoma") ) ); + m_buttonResetWarnings->SetToolTip( _("Resets all warning messages") ); + + bSizer101->Add( m_buttonResetWarnings, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + + sbSizer23->Add( bSizer101, 1, wxEXPAND, 5 ); + + bSizer95->Add( sbSizer23, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 ); + + + bSizer95->Add( 0, 10, 0, 0, 5 ); + + wxBoxSizer* bSizer97; + bSizer97 = new wxBoxSizer( wxHORIZONTAL ); + + m_button28 = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button28->SetDefault(); + m_button28->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) ); + + bSizer97->Add( m_button28, 0, wxALL, 5 ); + + m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button9->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer97->Add( m_button9, 0, wxALL, 5 ); + + m_button29 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_button29->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) ); + + bSizer97->Add( m_button29, 0, wxALL, 5 ); + + bSizer95->Add( bSizer97, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + this->SetSizer( bSizer95 ); + this->Layout(); + bSizer95->Fit( this ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GlobalSettingsDlgGenerated::OnClose ) ); + m_buttonResetWarnings->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnResetWarnings ), NULL, this ); + m_button28->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); + m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this ); + m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this ); } GlobalSettingsDlgGenerated::~GlobalSettingsDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GlobalSettingsDlgGenerated::OnClose ) ); - m_buttonResetWarnings->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnResetWarnings ), NULL, this ); - m_button28->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); - m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this ); - m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this ); + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GlobalSettingsDlgGenerated::OnClose ) ); + m_buttonResetWarnings->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnResetWarnings ), NULL, this ); + m_button28->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); + m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this ); + m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this ); } diff --git a/ui/guiGenerated.h b/ui/guiGenerated.h index fc40b404..394fa3e7 100644 --- a/ui/guiGenerated.h +++ b/ui/guiGenerated.h @@ -32,21 +32,23 @@ class wxButtonWithImage; #include <wx/hyperlink.h> #include <wx/checkbox.h> #include <wx/panel.h> -#include <wx/textctrl.h> +#include <wx/combobox.h> #include <wx/filepicker.h> +#include <wx/statbmp.h> #include <wx/scrolwin.h> #include <wx/grid.h> #include <wx/choice.h> #include <wx/stattext.h> #include <wx/statline.h> -#include <wx/statbmp.h> #include <wx/frame.h> +#include <wx/textctrl.h> #include <wx/dialog.h> #include <wx/gauge.h> #include <wx/animate.h> #include <wx/treectrl.h> #include <wx/notebook.h> #include <wx/checklst.h> +#include <wx/spinctrl.h> /////////////////////////////////////////////////////////////////////////// @@ -54,1115 +56,794 @@ class wxButtonWithImage; /////////////////////////////////////////////////////////////////////////////// /// Class MainDialogGenerated /////////////////////////////////////////////////////////////////////////////// -class MainDialogGenerated : public wxFrame +class MainDialogGenerated : public wxFrame { -private: - -protected: - wxMenuBar* m_menubar1; - wxMenu* m_menu1; - wxMenuItem* m_menuItem10; - wxMenuItem* m_menuItem11; - wxMenu* m_menu3; - wxMenu* m_menu31; - wxMenuItem* m_menuItemGerman; - wxMenuItem* m_menuItemEnglish; - wxMenuItem* m_menuItemFrench; - wxMenuItem* m_menuItemItalian; - wxMenuItem* m_menuItemPolish; - wxMenuItem* m_menuItemDutch; - wxMenuItem* m_menuItemPortuguese; - wxMenuItem* m_menuItemJapanese; - wxMenuItem* m_menuItemChineseSimple; - wxMenuItem* m_menuItemGlobSett; - wxMenuItem* m_menuItem7; - wxMenu* m_menu2; - wxBoxSizer* bSizer1; - wxPanel* m_panel71; - wxBoxSizer* bSizer6; - - wxButtonWithImage* m_buttonCompare; - wxButton* m_buttonAbort; - wxRadioButton* m_radioBtnSizeDate; - wxRadioButton* m_radioBtnContent; - wxBitmapButton* m_bpButton14; - - - wxBitmapButton* m_bpButtonFilter; - wxHyperlinkCtrl* m_hyperlinkCfgFilter; - wxCheckBox* m_checkBoxHideFilt; - - wxButtonWithImage* m_buttonSync; - - wxPanel* m_panel11; - wxStaticBoxSizer* sbSizer2; - wxTextCtrl* m_directoryLeft; - wxDirPickerCtrl* m_dirPickerLeft; - wxPanel* m_panel13; - - wxBoxSizer* bSizerMiddle; - wxBitmapButton* m_bpButtonSwap; - - wxPanel* m_panel12; - - wxBitmapButton* m_bpButtonRemovePair; - wxBitmapButton* m_bpButtonAddPair; - wxTextCtrl* m_directoryRight; - wxDirPickerCtrl* m_dirPickerRight; - wxScrolledWindow* m_scrolledWindowFolderPairs; - wxBoxSizer* bSizerFolderPairs; - wxPanel* m_panel1; - CustomGridLeft* m_gridLeft; - wxPanel* m_panel3; - CustomGridMiddle* m_gridMiddle; - wxPanel* m_panel2; - CustomGridRight* m_gridRight; - wxBoxSizer* bSizer3; - wxBoxSizer* bSizer58; - wxBitmapButton* m_bpButtonSave; - wxBitmapButton* m_bpButtonLoad; - wxChoice* m_choiceHistory; - - wxPanel* m_panel112; - - wxBitmapButton* m_bpButtonLeftOnly; - wxBitmapButton* m_bpButtonLeftNewer; - wxBitmapButton* m_bpButtonEqual; - wxBitmapButton* m_bpButtonDifferent; - wxBitmapButton* m_bpButtonRightNewer; - wxBitmapButton* m_bpButtonRightOnly; - - wxBitmapButton* m_bpButton10; - wxPanel* m_panel7; - - wxStaticText* m_staticTextStatusLeft; - - wxStaticLine* m_staticline9; - - wxStaticText* m_staticTextStatusMiddle; - - wxStaticLine* m_staticline10; - - wxStaticText* m_staticTextStatusRight; - - wxStaticBitmap* m_bitmap15; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnCompare( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnSync( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuSaveConfig( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuLoadConfig( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuQuit( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuLangGerman( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuLangEnglish( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuLangFrench( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuLangItalian( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuLangPolish( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuLangDutch( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuLangPortuguese( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuLangJapanese( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuLangChineseSimp( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuGlobalSettings( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuBatchJob( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuExportFileList( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMenuAbout( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnAbortCompare( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnCompareByTimeSize( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnCompareByContent( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnShowHelpDialog( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnFilterButton( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnConfigureFilter( wxHyperlinkEvent& event ) - { - event.Skip(); - } - virtual void OnHideFilteredButton( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnWriteDirManually( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnDirSelected( wxFileDirPickerEvent& event ) - { - event.Skip(); - } - virtual void OnSwapDirs( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnRemoveFolderPair( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnAddFolderPair( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnLeftGridDoubleClick( wxGridEvent& event ) - { - event.Skip(); - } - virtual void OnContextMenu( wxGridEvent& event ) - { - event.Skip(); - } - virtual void OnSortLeftGrid( wxGridEvent& event ) - { - event.Skip(); - } - virtual void OnContextColumnLeft( wxGridEvent& event ) - { - event.Skip(); - } - virtual void OnContextMenuMiddle( wxGridEvent& event ) - { - event.Skip(); - } - virtual void OnSortMiddleGrid( wxGridEvent& event ) - { - event.Skip(); - } - virtual void OnRightGridDoubleClick( wxGridEvent& event ) - { - event.Skip(); - } - virtual void OnSortRightGrid( wxGridEvent& event ) - { - event.Skip(); - } - virtual void OnContextColumnRight( wxGridEvent& event ) - { - event.Skip(); - } - virtual void OnSaveConfig( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnLoadConfig( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnChoiceKeyEvent( wxKeyEvent& event ) - { - event.Skip(); - } - virtual void OnLoadFromHistory( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnLeftOnlyFiles( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnLeftNewerFiles( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnEqualFiles( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnDifferentFiles( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnRightNewerFiles( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnRightOnlyFiles( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnQuit( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - MainDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("FreeFileSync - Folder Comparison and Synchronization"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 933,612 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); - ~MainDialogGenerated(); - + private: + + protected: + wxMenuBar* m_menubar1; + wxMenu* m_menu1; + wxMenuItem* m_menuItem10; + wxMenuItem* m_menuItem11; + wxMenu* m_menu3; + wxMenu* m_menu31; + wxMenuItem* m_menuItemGerman; + wxMenuItem* m_menuItemEnglish; + wxMenuItem* m_menuItemSpanish; + wxMenuItem* m_menuItemFrench; + wxMenuItem* m_menuItemHungarian; + wxMenuItem* m_menuItemItalian; + wxMenuItem* m_menuItemPolish; + wxMenuItem* m_menuItemDutch; + wxMenuItem* m_menuItemPortuguese; + wxMenuItem* m_menuItemSlovenian; + wxMenuItem* m_menuItemJapanese; + wxMenuItem* m_menuItemChineseSimple; + wxMenuItem* m_menuItemGlobSett; + wxMenuItem* m_menuItem7; + wxMenu* m_menu33; + wxMenuItem* m_menuItemAbout; + wxBoxSizer* bSizer1; + wxPanel* m_panel71; + wxBoxSizer* bSizer6; + + wxButtonWithImage* m_buttonCompare; + wxButton* m_buttonAbort; + wxRadioButton* m_radioBtnSizeDate; + wxRadioButton* m_radioBtnContent; + wxBitmapButton* m_bpButton14; + + + wxBitmapButton* m_bpButtonFilter; + wxHyperlinkCtrl* m_hyperlinkCfgFilter; + wxCheckBox* m_checkBoxHideFilt; + + wxButtonWithImage* m_buttonSync; + + wxPanel* m_panel11; + wxStaticBoxSizer* sbSizer2; + wxComboBox* m_comboBoxDirLeft; + wxDirPickerCtrl* m_dirPickerLeft; + wxPanel* m_panel13; + + wxBoxSizer* bSizerMiddle; + wxBitmapButton* m_bpButtonSwap; + + wxPanel* m_panel12; + + wxBitmapButton* m_bpButtonAddPair; + wxComboBox* m_comboBoxDirRight; + wxDirPickerCtrl* m_dirPickerRight; + wxBoxSizer* bSizer106; + wxStaticBitmap* m_bitmapShift; + wxScrolledWindow* m_scrolledWindowFolderPairs; + wxBoxSizer* bSizerFolderPairs; + wxPanel* m_panel1; + CustomGridLeft* m_gridLeft; + wxPanel* m_panel3; + CustomGridMiddle* m_gridMiddle; + wxPanel* m_panel2; + CustomGridRight* m_gridRight; + wxBoxSizer* bSizer3; + wxBoxSizer* bSizer58; + wxBitmapButton* m_bpButtonSave; + wxBitmapButton* m_bpButtonLoad; + wxChoice* m_choiceHistory; + + wxPanel* m_panel112; + + wxBitmapButton* m_bpButtonLeftOnly; + wxBitmapButton* m_bpButtonLeftNewer; + wxBitmapButton* m_bpButtonEqual; + wxBitmapButton* m_bpButtonDifferent; + wxBitmapButton* m_bpButtonRightNewer; + wxBitmapButton* m_bpButtonRightOnly; + + wxBitmapButton* m_bpButton10; + wxPanel* m_panel7; + + wxStaticText* m_staticTextStatusLeft; + + wxStaticLine* m_staticline9; + + wxStaticText* m_staticTextStatusMiddle; + + wxStaticLine* m_staticline10; + + wxStaticText* m_staticTextStatusRight; + + wxStaticBitmap* m_bitmap15; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnCompare( wxCommandEvent& event ){ event.Skip(); } + virtual void OnSync( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuSaveConfig( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLoadConfig( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuQuit( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLangGerman( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLangEnglish( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLangSpanish( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLangFrench( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLangHungarian( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLangItalian( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLangPolish( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLangDutch( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLangPortuguese( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLangSlovenian( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLangJapanese( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuLangChineseSimp( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuGlobalSettings( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuBatchJob( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuExportFileList( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuCheckVersion( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMenuAbout( wxCommandEvent& event ){ event.Skip(); } + virtual void OnAbortCompare( wxCommandEvent& event ){ event.Skip(); } + virtual void OnCompareByTimeSize( wxCommandEvent& event ){ event.Skip(); } + virtual void OnCompareByContent( wxCommandEvent& event ){ event.Skip(); } + virtual void OnShowHelpDialog( wxCommandEvent& event ){ event.Skip(); } + virtual void OnFilterButton( wxCommandEvent& event ){ event.Skip(); } + virtual void OnConfigureFilter( wxHyperlinkEvent& event ){ event.Skip(); } + virtual void OnHideFilteredButton( wxCommandEvent& event ){ event.Skip(); } + virtual void OnFolderHistoryKeyEvent( wxKeyEvent& event ){ event.Skip(); } + virtual void OnWriteDirManually( wxCommandEvent& event ){ event.Skip(); } + virtual void OnDirSelected( wxFileDirPickerEvent& event ){ event.Skip(); } + virtual void OnSwapDirs( wxCommandEvent& event ){ event.Skip(); } + virtual void OnAddFolderPair( wxCommandEvent& event ){ event.Skip(); } + virtual void OnLeftGridDoubleClick( wxGridEvent& event ){ event.Skip(); } + virtual void OnContextMenu( wxGridEvent& event ){ event.Skip(); } + virtual void OnSortLeftGrid( wxGridEvent& event ){ event.Skip(); } + virtual void OnContextColumnLeft( wxGridEvent& event ){ event.Skip(); } + virtual void OnContextMenuMiddle( wxGridEvent& event ){ event.Skip(); } + virtual void OnSortMiddleGrid( wxGridEvent& event ){ event.Skip(); } + virtual void OnRightGridDoubleClick( wxGridEvent& event ){ event.Skip(); } + virtual void OnSortRightGrid( wxGridEvent& event ){ event.Skip(); } + virtual void OnContextColumnRight( wxGridEvent& event ){ event.Skip(); } + virtual void OnSaveConfig( wxCommandEvent& event ){ event.Skip(); } + virtual void OnLoadConfig( wxCommandEvent& event ){ event.Skip(); } + virtual void OnCfgHistoryKeyEvent( wxKeyEvent& event ){ event.Skip(); } + virtual void OnLoadFromHistory( wxCommandEvent& event ){ event.Skip(); } + virtual void OnLeftOnlyFiles( wxCommandEvent& event ){ event.Skip(); } + virtual void OnLeftNewerFiles( wxCommandEvent& event ){ event.Skip(); } + virtual void OnEqualFiles( wxCommandEvent& event ){ event.Skip(); } + virtual void OnDifferentFiles( wxCommandEvent& event ){ event.Skip(); } + virtual void OnRightNewerFiles( wxCommandEvent& event ){ event.Skip(); } + virtual void OnRightOnlyFiles( wxCommandEvent& event ){ event.Skip(); } + virtual void OnQuit( wxCommandEvent& event ){ event.Skip(); } + + + public: + MainDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("FreeFileSync - Folder Comparison and Synchronization"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 933,612 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); + ~MainDialogGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class FolderPairGenerated /////////////////////////////////////////////////////////////////////////////// -class FolderPairGenerated : public wxPanel +class FolderPairGenerated : public wxPanel { -private: - -protected: - wxPanel* m_panel20; - wxPanel* m_panel21; - - -public: - wxPanel* m_panelLeft; - wxTextCtrl* m_directoryLeft; - wxDirPickerCtrl* m_dirPickerLeft; - wxStaticBitmap* m_bitmap23; - wxPanel* m_panelRight; - wxTextCtrl* m_directoryRight; - wxDirPickerCtrl* m_dirPickerRight; - FolderPairGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); - ~FolderPairGenerated(); - + private: + + protected: + wxPanel* m_panel20; + wxPanel* m_panel21; + + + // Virtual event handlers, overide them in your derived class + virtual void OnRemoveFolderPair( wxCommandEvent& event ){ event.Skip(); } + + + public: + wxPanel* m_panelLeft; + wxTextCtrl* m_directoryLeft; + wxDirPickerCtrl* m_dirPickerLeft; + wxStaticBitmap* m_bitmap23; + wxPanel* m_panelRight; + wxBitmapButton* m_bpButtonRemovePair; + wxTextCtrl* m_directoryRight; + wxDirPickerCtrl* m_dirPickerRight; + FolderPairGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); + ~FolderPairGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class BatchDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class BatchDlgGenerated : public wxDialog +class BatchDlgGenerated : public wxDialog { -private: - -protected: - wxBoxSizer* bSizer69; - wxStaticBitmap* m_bitmap27; - wxPanel* m_panel8; - wxStaticText* m_staticText56; - - - wxStaticText* m_staticText54; - - wxStaticLine* m_staticline10; - wxStaticText* m_staticText531; - wxScrolledWindow* m_scrolledWindow6; - wxBoxSizer* bSizerFolderPairs; - - wxRadioButton* m_radioBtnSizeDate; - wxRadioButton* m_radioBtnContent; - - wxChoice* m_choiceHandleError; - - wxCheckBox* m_checkBoxUseRecycler; - wxCheckBox* m_checkBoxSilent; - - wxBitmapButton* m_bpButtonFilter; - wxStaticBitmap* m_bitmap8; - wxTextCtrl* m_textCtrlInclude; - - wxStaticBitmap* m_bitmap9; - wxTextCtrl* m_textCtrlExclude; - - wxStaticText* m_staticText211; - wxStaticText* m_staticText311; - wxStaticLine* m_staticline3; - wxStaticBitmap* m_bitmap13; - wxBitmapButton* m_bpButton5; - wxStaticBitmap* m_bitmap14; - wxBitmapButton* m_bpButton6; - wxStaticBitmap* m_bitmap15; - wxBitmapButton* m_bpButton7; - wxStaticBitmap* m_bitmap16; - wxBitmapButton* m_bpButton8; - wxStaticBitmap* m_bitmap17; - wxBitmapButton* m_bpButton9; - wxStaticLine* m_staticline9; - wxButton* m_buttonSave; - wxButton* m_buttonLoad; - wxButton* m_button6; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnChangeCompareVar( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnChangeErrorHandling( 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(); - } - virtual void OnExRightSideOnly( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnLeftNewer( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnRightNewer( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnDifferent( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnSaveBatchJob( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnLoadBatchJob( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnCancel( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - BatchDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Create a batch job"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); - ~BatchDlgGenerated(); - + private: + + protected: + wxBoxSizer* bSizer69; + wxStaticBitmap* m_bitmap27; + wxPanel* m_panel8; + wxStaticText* m_staticText56; + + + wxStaticText* m_staticText54; + + wxStaticLine* m_staticline10; + wxStaticText* m_staticText531; + wxScrolledWindow* m_scrolledWindow6; + wxBoxSizer* bSizerFolderPairs; + + wxRadioButton* m_radioBtnSizeDate; + wxRadioButton* m_radioBtnContent; + + wxChoice* m_choiceHandleError; + + wxCheckBox* m_checkBoxUseRecycler; + wxCheckBox* m_checkBoxSilent; + + wxBitmapButton* m_bpButtonFilter; + wxStaticBitmap* m_bitmap8; + wxTextCtrl* m_textCtrlInclude; + + wxStaticBitmap* m_bitmap9; + wxTextCtrl* m_textCtrlExclude; + + wxStaticText* m_staticText211; + wxStaticText* m_staticText311; + wxStaticLine* m_staticline3; + wxStaticBitmap* m_bitmap13; + wxBitmapButton* m_bpButton5; + wxStaticBitmap* m_bitmap14; + wxBitmapButton* m_bpButton6; + wxStaticBitmap* m_bitmap15; + wxBitmapButton* m_bpButton7; + wxStaticBitmap* m_bitmap16; + wxBitmapButton* m_bpButton8; + wxStaticBitmap* m_bitmap17; + wxBitmapButton* m_bpButton9; + wxStaticLine* m_staticline9; + wxButton* m_buttonSave; + wxButton* m_buttonLoad; + wxButton* m_button6; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnChangeCompareVar( wxCommandEvent& event ){ event.Skip(); } + virtual void OnChangeErrorHandling( 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(); } + virtual void OnExRightSideOnly( wxCommandEvent& event ){ event.Skip(); } + virtual void OnLeftNewer( wxCommandEvent& event ){ event.Skip(); } + virtual void OnRightNewer( wxCommandEvent& event ){ event.Skip(); } + virtual void OnDifferent( wxCommandEvent& event ){ event.Skip(); } + virtual void OnSaveBatchJob( wxCommandEvent& event ){ event.Skip(); } + virtual void OnLoadBatchJob( wxCommandEvent& event ){ event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ){ event.Skip(); } + + + public: + BatchDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Create a batch job"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); + ~BatchDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class BatchFolderPairGenerated /////////////////////////////////////////////////////////////////////////////// -class BatchFolderPairGenerated : public wxPanel +class BatchFolderPairGenerated : public wxPanel { -private: - -protected: - wxStaticText* m_staticText53; - wxStaticText* m_staticText541; - - // Virtual event handlers, overide them in your derived class - virtual void OnEnterLeftDir( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnEnterRightDir( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - wxTextCtrl* m_directoryLeft; - wxTextCtrl* m_directoryRight; - BatchFolderPairGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); - ~BatchFolderPairGenerated(); - + private: + + protected: + wxStaticText* m_staticText53; + wxStaticText* m_staticText541; + + // Virtual event handlers, overide them in your derived class + virtual void OnEnterLeftDir( wxCommandEvent& event ){ event.Skip(); } + virtual void OnEnterRightDir( wxCommandEvent& event ){ event.Skip(); } + + + public: + wxTextCtrl* m_directoryLeft; + wxTextCtrl* m_directoryRight; + BatchFolderPairGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); + ~BatchFolderPairGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class CompareStatusGenerated /////////////////////////////////////////////////////////////////////////////// -class CompareStatusGenerated : public wxPanel +class CompareStatusGenerated : public wxPanel { -private: - -protected: - wxBoxSizer* bSizer42; - wxStaticText* m_staticText321; - wxStaticText* m_staticTextScanned; - - wxStaticBoxSizer* sbSizer13; - wxStaticText* m_staticText46; - wxStaticText* m_staticTextFilesToCompare; - wxStaticText* m_staticText32; - wxStaticText* m_staticTextDataToCompare; - - wxStaticText* m_staticText37; - wxStaticText* m_staticTextTimeElapsed; - wxStaticText* m_staticText30; - wxTextCtrl* m_textCtrlFilename; - wxGauge* m_gauge2; - -public: - CompareStatusGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); - ~CompareStatusGenerated(); - + private: + + protected: + wxBoxSizer* bSizer42; + wxStaticText* m_staticText321; + wxStaticText* m_staticTextScanned; + + wxStaticBoxSizer* sbSizer13; + wxStaticText* m_staticText46; + wxStaticText* m_staticTextFilesToCompare; + wxStaticText* m_staticText32; + wxStaticText* m_staticTextDataToCompare; + + wxStaticText* m_staticText37; + wxStaticText* m_staticTextTimeElapsed; + wxStaticText* m_staticText30; + wxTextCtrl* m_textCtrlFilename; + wxGauge* m_gauge2; + + public: + CompareStatusGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL ); + ~CompareStatusGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class SyncDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class SyncDlgGenerated : public wxDialog +class SyncDlgGenerated : public wxDialog { -private: - -protected: - wxBoxSizer* bSizer201; - wxButtonWithImage* m_button18; - - wxCheckBox* m_checkBoxUseRecycler; - wxCheckBox* m_checkBoxIgnoreErrors; - - wxStaticText* m_staticText1; - wxRadioButton* m_radioBtn1; - wxButton* m_buttonOneWay; - wxStaticText* m_staticText8; - wxRadioButton* m_radioBtnUpdate; - wxButton* m_buttonUpdate; - wxStaticText* m_staticText101; - wxRadioButton* m_radioBtn2; - wxButton* m_buttonTwoWay; - wxStaticText* m_staticText10; - wxRadioButton* m_radioBtn3; - - wxStaticText* m_staticText23; - - wxStaticText* m_staticText9; - - wxButton* m_button6; - wxButton* m_button16; - - wxStaticText* m_staticText37; - wxTextCtrl* m_textCtrlCreate; - wxStaticText* m_staticText14; - wxTextCtrl* m_textCtrlDelete; - wxStaticText* m_staticText42; - wxTextCtrl* m_textCtrlUpdate; - wxStaticText* m_staticText43; - wxTextCtrl* m_textCtrlData; - - wxStaticText* m_staticText21; - wxStaticText* m_staticText31; - wxStaticLine* m_staticline3; - wxStaticBitmap* m_bitmap13; - wxBitmapButton* m_bpButton5; - wxStaticBitmap* m_bitmap14; - wxBitmapButton* m_bpButton6; - wxStaticBitmap* m_bitmap15; - wxBitmapButton* m_bpButton7; - wxStaticBitmap* m_bitmap16; - wxBitmapButton* m_bpButton8; - wxStaticBitmap* m_bitmap17; - wxBitmapButton* m_bpButton9; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnStartSync( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnSelectRecycleBin( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnSyncLeftToRight( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnSyncUpdate( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnSyncBothSides( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnSyncCostum( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnBack( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnCancel( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnExLeftSideOnly( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnExRightSideOnly( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnLeftNewer( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnRightNewer( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnDifferent( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - SyncDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Synchronization settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); - ~SyncDlgGenerated(); - + private: + + protected: + wxBoxSizer* bSizer201; + wxButtonWithImage* m_button18; + + wxCheckBox* m_checkBoxUseRecycler; + wxCheckBox* m_checkBoxIgnoreErrors; + + wxStaticText* m_staticText1; + wxRadioButton* m_radioBtn1; + wxButton* m_buttonOneWay; + wxStaticText* m_staticText8; + wxRadioButton* m_radioBtnUpdate; + wxButton* m_buttonUpdate; + wxStaticText* m_staticText101; + wxRadioButton* m_radioBtn2; + wxButton* m_buttonTwoWay; + wxStaticText* m_staticText10; + wxRadioButton* m_radioBtn3; + + wxStaticText* m_staticText23; + + wxStaticText* m_staticText9; + + wxButton* m_button6; + wxButton* m_button16; + + wxStaticText* m_staticText37; + wxTextCtrl* m_textCtrlCreate; + wxStaticText* m_staticText14; + wxTextCtrl* m_textCtrlDelete; + wxStaticText* m_staticText42; + wxTextCtrl* m_textCtrlUpdate; + wxStaticText* m_staticText43; + wxTextCtrl* m_textCtrlData; + + wxStaticText* m_staticText21; + wxStaticText* m_staticText31; + wxStaticLine* m_staticline3; + wxStaticBitmap* m_bitmap13; + wxBitmapButton* m_bpButton5; + wxStaticBitmap* m_bitmap14; + wxBitmapButton* m_bpButton6; + wxStaticBitmap* m_bitmap15; + wxBitmapButton* m_bpButton7; + wxStaticBitmap* m_bitmap16; + wxBitmapButton* m_bpButton8; + wxStaticBitmap* m_bitmap17; + wxBitmapButton* m_bpButton9; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnStartSync( wxCommandEvent& event ){ event.Skip(); } + virtual void OnSelectRecycleBin( wxCommandEvent& event ){ event.Skip(); } + virtual void OnSyncLeftToRight( wxCommandEvent& event ){ event.Skip(); } + virtual void OnSyncUpdate( wxCommandEvent& event ){ event.Skip(); } + virtual void OnSyncBothSides( wxCommandEvent& event ){ event.Skip(); } + virtual void OnSyncCostum( wxCommandEvent& event ){ event.Skip(); } + virtual void OnBack( wxCommandEvent& event ){ event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ){ event.Skip(); } + virtual void OnExLeftSideOnly( wxCommandEvent& event ){ event.Skip(); } + virtual void OnExRightSideOnly( wxCommandEvent& event ){ event.Skip(); } + virtual void OnLeftNewer( wxCommandEvent& event ){ event.Skip(); } + virtual void OnRightNewer( wxCommandEvent& event ){ event.Skip(); } + virtual void OnDifferent( wxCommandEvent& event ){ event.Skip(); } + + + public: + SyncDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Synchronization settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); + ~SyncDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class SyncStatusDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class SyncStatusDlgGenerated : public wxDialog +class SyncStatusDlgGenerated : public wxDialog { -private: - -protected: - - wxAnimationCtrl* m_animationControl1; - wxPanel* m_panel8; - wxStaticText* m_staticText56; - - wxStaticBitmap* m_bitmapStatus; - wxStaticText* m_staticTextStatus; - - wxBoxSizer* bSizer31; - wxStaticText* m_staticText21; - - wxStaticText* m_staticText55; - wxStaticText* m_staticTextTimeElapsed; - wxTextCtrl* m_textCtrlInfo; - wxBoxSizer* bSizer28; - wxStaticText* m_staticText25; - wxStaticText* m_staticTextRemainingObj; - - wxButton* m_buttonOK; - wxButton* m_buttonPause; - wxButton* m_buttonAbort; - - wxStaticText* m_staticText26; - wxStaticText* m_staticTextDataRemaining; - - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnOkay( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnPause( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnAbort( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - wxGauge* m_gauge1; - SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 614,371 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~SyncStatusDlgGenerated(); - + private: + + protected: + + wxAnimationCtrl* m_animationControl1; + wxPanel* m_panel8; + wxStaticText* m_staticText56; + + wxStaticBitmap* m_bitmapStatus; + wxStaticText* m_staticTextStatus; + + wxBoxSizer* bSizer31; + wxStaticText* m_staticText21; + + wxStaticText* m_staticText55; + wxStaticText* m_staticTextTimeElapsed; + wxTextCtrl* m_textCtrlInfo; + wxBoxSizer* bSizer28; + wxStaticText* m_staticText25; + wxStaticText* m_staticTextRemainingObj; + + wxButton* m_buttonOK; + wxButton* m_buttonPause; + wxButton* m_buttonAbort; + + wxStaticText* m_staticText26; + wxStaticText* m_staticTextDataRemaining; + + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnOkay( wxCommandEvent& event ){ event.Skip(); } + virtual void OnPause( wxCommandEvent& event ){ event.Skip(); } + virtual void OnAbort( wxCommandEvent& event ){ event.Skip(); } + + + public: + wxGauge* m_gauge1; + SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 614,371 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~SyncStatusDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class HelpDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class HelpDlgGenerated : public wxDialog +class HelpDlgGenerated : public wxDialog { -private: - -protected: - - wxStaticBitmap* m_bitmap25; - wxPanel* m_panel8; - - wxStaticText* m_staticText56; - - - wxNotebook* m_notebook1; - wxScrolledWindow* m_scrolledWindow1; - wxStaticText* m_staticText59; - wxStaticText* m_staticText60; - wxStaticText* m_staticText61; - wxTreeCtrl* m_treeCtrl1; - wxStaticText* m_staticText63; - wxStaticText* m_staticText75; - wxStaticText* m_staticText76; - wxStaticText* m_staticText77; - wxStaticText* m_staticText78; - wxStaticText* m_staticText79; - wxStaticText* m_staticText80; - wxScrolledWindow* m_scrolledWindow5; - wxStaticText* m_staticText65; - wxStaticText* m_staticText66; - wxTreeCtrl* m_treeCtrl2; - wxStaticText* m_staticText69; - wxStaticText* m_staticText81; - wxStaticText* m_staticText82; - wxStaticText* m_staticText83; - wxStaticText* m_staticText84; - wxButton* m_button8; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnOK( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - HelpDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 565,501 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~HelpDlgGenerated(); - + private: + + protected: + + wxStaticBitmap* m_bitmap25; + wxPanel* m_panel8; + + wxStaticText* m_staticText56; + + + wxNotebook* m_notebook1; + wxScrolledWindow* m_scrolledWindow1; + wxStaticText* m_staticText59; + wxStaticText* m_staticText60; + wxStaticText* m_staticText61; + wxTreeCtrl* m_treeCtrl1; + wxStaticText* m_staticText63; + wxStaticText* m_staticText75; + wxStaticText* m_staticText76; + wxStaticText* m_staticText77; + wxStaticText* m_staticText78; + wxStaticText* m_staticText79; + wxStaticText* m_staticText80; + wxScrolledWindow* m_scrolledWindow5; + wxStaticText* m_staticText65; + wxStaticText* m_staticText66; + wxTreeCtrl* m_treeCtrl2; + wxStaticText* m_staticText69; + wxStaticText* m_staticText81; + wxStaticText* m_staticText82; + wxStaticText* m_staticText83; + wxStaticText* m_staticText84; + wxButton* m_button8; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnOK( wxCommandEvent& event ){ event.Skip(); } + + + public: + HelpDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 565,501 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~HelpDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class AboutDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class AboutDlgGenerated : public wxDialog +class AboutDlgGenerated : public wxDialog { -private: - -protected: - - wxPanel* m_panel5; - wxStaticBitmap* m_bitmap11; - wxStaticText* m_staticText15; - wxStaticText* m_build; - - wxScrolledWindow* m_scrolledWindow4; - wxStaticText* m_staticText72; - wxStaticText* m_staticText73; - wxStaticText* m_staticText74; - wxScrolledWindow* m_scrolledWindow3; - wxStaticText* m_staticText54; - wxStaticText* m_staticText68; - wxStaticText* m_staticText69; - wxStaticText* m_staticText70; - wxStaticText* m_staticText71; - wxStaticText* m_staticText711; - wxStaticText* m_staticText712; - wxStaticText* m_staticText91; - wxStaticText* m_staticText92; - wxStaticText* m_staticText911; - wxStaticText* m_staticText921; - wxStaticText* m_staticText9211; - wxStaticText* m_staticText9212; - wxStaticText* m_staticText92121; - wxStaticText* m_staticText92122; - wxStaticLine* m_staticline3; - wxStaticText* m_staticText131; - wxStaticBitmap* m_bitmap9; - wxStaticText* m_staticText11; - wxHyperlinkCtrl* m_hyperlink1; - wxStaticBitmap* m_bitmap10; - wxStaticText* m_staticText13; - wxHyperlinkCtrl* m_hyperlink2; - wxAnimationCtrl* m_animationControl1; - wxStaticText* m_staticText151; - wxHyperlinkCtrl* m_hyperlink3; - wxStaticLine* m_staticline2; - - wxStaticBitmap* m_bitmap13; - wxHyperlinkCtrl* m_hyperlink5; - - wxButton* m_button8; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnOK( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - AboutDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); - ~AboutDlgGenerated(); - + private: + + protected: + + wxPanel* m_panel5; + wxStaticBitmap* m_bitmap11; + wxStaticText* m_staticText15; + wxStaticText* m_build; + + wxScrolledWindow* m_scrolledWindow4; + wxStaticText* m_staticText72; + wxStaticText* m_staticText73; + wxStaticText* m_staticText74; + wxScrolledWindow* m_scrolledWindow3; + wxStaticText* m_staticText54; + + wxStaticText* m_staticText68; + wxStaticText* m_staticText69; + wxStaticText* m_staticText70; + wxStaticText* m_staticText71; + wxStaticText* m_staticText711; + wxStaticText* m_staticText712; + wxStaticText* m_staticText91; + wxStaticText* m_staticText92; + wxStaticText* m_staticText911; + wxStaticText* m_staticText921; + wxStaticText* m_staticText9211; + wxStaticText* m_staticText9212; + wxStaticText* m_staticText92121; + wxStaticText* m_staticText92122; + wxStaticText* m_staticText921221; + wxStaticText* m_staticText921222; + wxStaticText* m_staticText682; + wxStaticText* m_staticText681; + wxStaticText* m_staticText683; + wxStaticText* m_staticText691; + wxStaticLine* m_staticline3; + wxPanel* m_panel22; + wxStaticText* m_staticText131; + wxStaticLine* m_staticline12; + wxStaticBitmap* m_bitmap9; + wxHyperlinkCtrl* m_hyperlink1; + + wxStaticBitmap* m_bitmap10; + wxHyperlinkCtrl* m_hyperlink2; + wxAnimationCtrl* m_animationControl1; + wxHyperlinkCtrl* m_hyperlink3; + wxStaticLine* m_staticline2; + + wxStaticBitmap* m_bitmap13; + wxHyperlinkCtrl* m_hyperlink5; + + wxButton* m_button8; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnOK( wxCommandEvent& event ){ event.Skip(); } + + + public: + AboutDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); + ~AboutDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class ErrorDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class ErrorDlgGenerated : public wxDialog +class ErrorDlgGenerated : public wxDialog { -private: - -protected: - - wxStaticBitmap* m_bitmap10; - wxTextCtrl* m_textCtrl8; - wxCheckBox* m_checkBoxIgnoreErrors; - - wxButton* m_buttonIgnore; - wxButton* m_buttonRetry; - wxButton* m_buttonAbort; - - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnIgnore( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnRetry( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnAbort( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - ErrorDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Error"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 404,268 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~ErrorDlgGenerated(); - + private: + + protected: + + wxStaticBitmap* m_bitmap10; + wxTextCtrl* m_textCtrl8; + wxCheckBox* m_checkBoxIgnoreErrors; + + wxButton* m_buttonIgnore; + wxButton* m_buttonRetry; + wxButton* m_buttonAbort; + + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnIgnore( wxCommandEvent& event ){ event.Skip(); } + virtual void OnRetry( wxCommandEvent& event ){ event.Skip(); } + virtual void OnAbort( wxCommandEvent& event ){ event.Skip(); } + + + public: + ErrorDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Error"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 404,268 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~ErrorDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class WarningDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class WarningDlgGenerated : public wxDialog +class WarningDlgGenerated : public wxDialog { -private: - -protected: - - wxTextCtrl* m_textCtrl8; - - wxCheckBox* m_checkBoxDontShowAgain; - - wxButton* m_buttonIgnore; - wxButton* m_buttonAbort; - - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnIgnore( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnAbort( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - wxStaticBitmap* m_bitmap10; - WarningDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Warning"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 382,249 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~WarningDlgGenerated(); - + private: + + protected: + + wxTextCtrl* m_textCtrl8; + + wxCheckBox* m_checkBoxDontShowAgain; + + wxButton* m_buttonIgnore; + wxButton* m_buttonAbort; + + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnIgnore( wxCommandEvent& event ){ event.Skip(); } + virtual void OnAbort( wxCommandEvent& event ){ event.Skip(); } + + + public: + wxStaticBitmap* m_bitmap10; + WarningDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Warning"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 382,249 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~WarningDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class DeleteDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class DeleteDlgGenerated : public wxDialog +class DeleteDlgGenerated : public wxDialog { -private: - -protected: - - - wxStaticBitmap* m_bitmap12; - wxStaticText* m_staticTextHeader; - - wxCheckBox* m_checkBoxDeleteBothSides; - - wxCheckBox* m_checkBoxUseRecycler; - wxTextCtrl* m_textCtrlMessage; - wxButton* m_buttonOK; - wxButton* m_buttonCancel; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnDelOnBothSides( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnUseRecycler( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnOK( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnCancel( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - DeleteDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Confirm"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 553,336 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~DeleteDlgGenerated(); - + private: + + protected: + + + wxStaticBitmap* m_bitmap12; + wxStaticText* m_staticTextHeader; + + wxCheckBox* m_checkBoxDeleteBothSides; + + wxCheckBox* m_checkBoxUseRecycler; + wxTextCtrl* m_textCtrlMessage; + wxButton* m_buttonOK; + wxButton* m_buttonCancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnDelOnBothSides( wxCommandEvent& event ){ event.Skip(); } + virtual void OnUseRecycler( wxCommandEvent& event ){ event.Skip(); } + virtual void OnOK( wxCommandEvent& event ){ event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ){ event.Skip(); } + + + public: + DeleteDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Confirm"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 553,336 ), long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~DeleteDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class FilterDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class FilterDlgGenerated : public wxDialog +class FilterDlgGenerated : public wxDialog { -private: - -protected: - wxStaticBitmap* m_bitmap26; - wxPanel* m_panel8; - wxStaticText* m_staticText56; - - - wxStaticText* m_staticText44; - wxBitmapButton* m_bpButtonHelp; - - wxPanel* m_panel13; - wxStaticLine* m_staticline10; - wxStaticText* m_staticText45; - wxStaticText* m_staticText83; - wxStaticText* m_staticText84; - wxStaticText* m_staticText85; - wxStaticText* m_staticText86; - wxStaticText* m_staticText181; - wxStaticText* m_staticText1811; - - wxStaticText* m_staticText15; - wxStaticBitmap* m_bitmap8; - wxTextCtrl* m_textCtrlInclude; - - wxStaticText* m_staticText16; - wxStaticBitmap* m_bitmap9; - wxTextCtrl* m_textCtrlExclude; - - wxButton* m_button9; - - wxButton* m_button10; - wxButton* m_button17; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnHelp( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnDefault( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnOK( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnCancel( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - FilterDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Configure filter"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); - ~FilterDlgGenerated(); - + private: + + protected: + wxStaticBitmap* m_bitmap26; + wxPanel* m_panel8; + wxStaticText* m_staticText56; + + + wxStaticText* m_staticText44; + wxBitmapButton* m_bpButtonHelp; + + wxPanel* m_panel13; + wxStaticLine* m_staticline10; + wxStaticText* m_staticText45; + wxStaticText* m_staticText83; + wxStaticText* m_staticText84; + wxStaticText* m_staticText85; + wxStaticText* m_staticText86; + wxStaticText* m_staticText181; + wxStaticText* m_staticText1811; + + wxStaticText* m_staticText15; + wxStaticBitmap* m_bitmap8; + wxTextCtrl* m_textCtrlInclude; + + wxStaticText* m_staticText16; + wxStaticBitmap* m_bitmap9; + wxTextCtrl* m_textCtrlExclude; + + wxButton* m_button9; + + wxButton* m_button10; + wxButton* m_button17; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnHelp( wxCommandEvent& event ){ event.Skip(); } + virtual void OnDefault( wxCommandEvent& event ){ event.Skip(); } + virtual void OnOK( wxCommandEvent& event ){ event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ){ event.Skip(); } + + + public: + FilterDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Configure filter"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE ); + ~FilterDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class CustomizeColsDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class CustomizeColsDlgGenerated : public wxDialog +class CustomizeColsDlgGenerated : public wxDialog { -private: - -protected: - wxCheckListBox* m_checkListColumns; - wxBitmapButton* m_bpButton29; - wxBitmapButton* m_bpButton30; - wxButton* m_button28; - wxButton* m_button9; - wxButton* m_button29; - - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnMoveUp( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnMoveDown( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnOkay( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnDefault( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnCancel( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - CustomizeColsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Customize columns"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - ~CustomizeColsDlgGenerated(); - + private: + + protected: + wxCheckListBox* m_checkListColumns; + wxBitmapButton* m_bpButton29; + wxBitmapButton* m_bpButton30; + wxButton* m_button28; + wxButton* m_button9; + wxButton* m_button29; + + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnMoveUp( wxCommandEvent& event ){ event.Skip(); } + virtual void OnMoveDown( wxCommandEvent& event ){ event.Skip(); } + virtual void OnOkay( wxCommandEvent& event ){ event.Skip(); } + virtual void OnDefault( wxCommandEvent& event ){ event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ){ event.Skip(); } + + + public: + CustomizeColsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Customize columns"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + ~CustomizeColsDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class GlobalSettingsDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class GlobalSettingsDlgGenerated : public wxDialog +class GlobalSettingsDlgGenerated : public wxDialog { -private: - -protected: - wxStaticBitmap* m_bitmapSettings; - wxPanel* m_panel8; - wxStaticText* m_staticText56; - - - wxCheckBox* m_checkBoxHandleDstFat; - wxStaticText* m_staticText97; - wxTextCtrl* m_textCtrlFileManager; - wxButtonWithImage* m_buttonResetWarnings; - - wxButton* m_button28; - wxButton* m_button9; - wxButton* m_button29; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) - { - event.Skip(); - } - virtual void OnResetWarnings( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnOkay( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnDefault( wxCommandEvent& event ) - { - event.Skip(); - } - virtual void OnCancel( wxCommandEvent& event ) - { - event.Skip(); - } - - -public: - GlobalSettingsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Global settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - ~GlobalSettingsDlgGenerated(); - + private: + + protected: + wxStaticBitmap* m_bitmapSettings; + wxPanel* m_panel8; + wxStaticText* m_staticText56; + + + wxStaticText* m_staticText99; + + wxSpinCtrl* m_spinCtrlFileTimeTolerance; + wxStaticLine* m_staticline10; + wxStaticText* m_staticText97; + wxTextCtrl* m_textCtrlFileManager; + wxStaticLine* m_staticline101; + wxStaticText* m_staticText100; + + wxButtonWithImage* m_buttonResetWarnings; + + wxButton* m_button28; + wxButton* m_button9; + wxButton* m_button29; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ){ event.Skip(); } + virtual void OnResetWarnings( wxCommandEvent& event ){ event.Skip(); } + virtual void OnOkay( wxCommandEvent& event ){ event.Skip(); } + virtual void OnDefault( wxCommandEvent& event ){ event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ){ event.Skip(); } + + + public: + GlobalSettingsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Global settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + ~GlobalSettingsDlgGenerated(); + }; #endif //__guiGenerated__ diff --git a/version/version.h b/version/version.h new file mode 100644 index 00000000..a4eaf175 --- /dev/null +++ b/version/version.h @@ -0,0 +1,6 @@ +#include <wx/string.h> + +namespace FreeFileSync +{ + const wxString currentVersion = wxT("1.17"); +} |