summaryrefslogtreecommitdiff
path: root/ui
diff options
context:
space:
mode:
Diffstat (limited to 'ui')
-rw-r--r--ui/MainDialog.cpp882
-rw-r--r--ui/MainDialog.h42
-rw-r--r--ui/SmallDialogs.cpp200
-rw-r--r--ui/SmallDialogs.h41
-rw-r--r--ui/SyncDialog.cpp144
-rw-r--r--ui/guiGenerated.cpp231
-rw-r--r--ui/guiGenerated.h90
7 files changed, 925 insertions, 705 deletions
diff --git a/ui/MainDialog.cpp b/ui/MainDialog.cpp
index 47926383..3f845364 100644
--- a/ui/MainDialog.cpp
+++ b/ui/MainDialog.cpp
@@ -15,16 +15,18 @@
#include <wx/file.h>
#include "../library/customGrid.h"
#include <algorithm>
-#include "../library/processXml.h"
+#include "../library/sorting.h"
#include <wx/msgdlg.h>
using namespace globalFunctions;
using namespace xmlAccess;
+
int leadingPanel = 0;
-MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale* language) :
+MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale* language, xmlAccess::XmlGlobalSettings& settings) :
GuiGenerated(frame),
+ globalSettings(settings),
programLanguage(language),
filteringInitialized(false),
filteringPending(false),
@@ -49,6 +51,7 @@ MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale
//initialize and load configuration
readConfigurationFromXml(cfgFileName, true);
+ readGlobalSettings();
leftOnlyFilesActive = true;
leftNewerFilesActive = true;
@@ -186,6 +189,9 @@ MainDialog::MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale
case wxLANGUAGE_JAPANESE:
m_menuItemJapanese->Check();
break;
+ case wxLANGUAGE_DUTCH:
+ m_menuItemDutch->Check();
+ break;
default:
m_menuItemEnglish->Check();
}
@@ -238,16 +244,62 @@ MainDialog::~MainDialog()
//save configuration
writeConfigurationToXml(FreeFileSync::FfsLastConfigFile); //don't trow exceptions in destructors
+ writeGlobalSettings();
if (restartOnExit) //this is needed so that restart happens AFTER configuration was written!
{ //create new dialog
- MainDialog* frame = new MainDialog(NULL, FreeFileSync::FfsLastConfigFile, programLanguage);
+ MainDialog* frame = new MainDialog(NULL, FreeFileSync::FfsLastConfigFile, programLanguage, globalSettings);
frame->SetIcon(*globalResource.programIcon); //set application icon
frame->Show();
}
}
+void MainDialog::readGlobalSettings()
+{
+ //apply window size and position at program startup ONLY
+ widthNotMaximized = globalSettings.gui.widthNotMaximized;
+ heightNotMaximized = globalSettings.gui.heightNotMaximized;
+ posXNotMaximized = globalSettings.gui.posXNotMaximized;
+ posYNotMaximized = globalSettings.gui.posYNotMaximized;
+
+ //apply window size and position
+ if ( widthNotMaximized != wxDefaultCoord &&
+ heightNotMaximized != wxDefaultCoord &&
+ posXNotMaximized != wxDefaultCoord &&
+ posYNotMaximized != wxDefaultCoord)
+ SetSize(posXNotMaximized, posYNotMaximized, widthNotMaximized, heightNotMaximized);
+
+ Maximize(globalSettings.gui.isMaximized);
+
+ //read column widths
+ for (int i = 0; i < m_grid1->GetNumberCols() && i < int(globalSettings.gui.columnWidthLeft.size()); ++i)
+ m_grid1->SetColSize(i, globalSettings.gui.columnWidthLeft[i]);
+
+ for (int i = 0; i < m_grid2->GetNumberCols() && i < int(globalSettings.gui.columnWidthRight.size()); ++i)
+ m_grid2->SetColSize(i, globalSettings.gui.columnWidthRight[i]);
+}
+
+
+void MainDialog::writeGlobalSettings()
+{
+ //write global settings to (global) variable stored in application instance
+ globalSettings.gui.widthNotMaximized = widthNotMaximized;
+ globalSettings.gui.heightNotMaximized = heightNotMaximized;
+ globalSettings.gui.posXNotMaximized = posXNotMaximized;
+ globalSettings.gui.posYNotMaximized = posYNotMaximized;
+ globalSettings.gui.isMaximized = IsMaximized();
+
+ globalSettings.gui.columnWidthLeft.clear();
+ for (int i = 0; i < m_grid1->GetNumberCols(); ++i)
+ globalSettings.gui.columnWidthLeft.push_back(m_grid1->GetColSize(i));
+
+ globalSettings.gui.columnWidthRight.clear();
+ for (int i = 0; i < m_grid2->GetNumberCols(); ++i)
+ globalSettings.gui.columnWidthRight.push_back(m_grid2->GetColSize(i));
+}
+
+
void MainDialog::onGrid1access(wxEvent& event)
{
if (leadingPanel != 1)
@@ -307,7 +359,7 @@ void MainDialog::filterRangeTemp(const set<int>& rowsToFilterOnUI_View)
{
int gridSizeUI = gridRefUI.size();
- bool newSelection = false; //default: deselect range
+ bool newSelection = false; //default: deselect range
//leadingRow determines de-/selection of all other rows
int leadingRow = *rowsToFilterOnUI_View.begin();
@@ -315,7 +367,7 @@ void MainDialog::filterRangeTemp(const set<int>& rowsToFilterOnUI_View)
newSelection = !currentGridData[gridRefUI[leadingRow]].selectedForSynchronization;
if (hideFilteredElements)
- assert (!newSelection); //if hidefiltered is active, there should be no filtered elements on screen => current element was filtered out
+ assert(!newSelection); //if hidefiltered is active, there should be no filtered elements on screen => current element was filtered out
//get all lines that need to be filtered (e.g. if a folder is marked, then its subelements should be marked as well)
@@ -340,33 +392,12 @@ void MainDialog::filterRangeTemp(const set<int>& rowsToFilterOnUI_View)
m_grid1->ForceRefresh();
m_grid2->ForceRefresh();
m_grid3->ForceRefresh();
+ Update(); //show changes resulting from ForceRefresh()
if (hideFilteredElements)
{
- Update(); //show changes resulting from ForceRefresh()
-
- wxLongLong waitBegin = wxGetLocalTimeMillis();
-
- //determine rows that are currently filtered out on current UI view (and need to be removed)
- set<int> filteredOutRowsOnUI;
- for (GridView::iterator i = gridRefUI.begin(); i != gridRefUI.end(); ++i)
- {
- const FileCompareLine& gridLine = currentGridData[*i];
-
- if (!gridLine.selectedForSynchronization)
- filteredOutRowsOnUI.insert(i - gridRefUI.begin());
- }
-
- //some delay to show user the rows he has filtered out before they are removed
- unsigned long waitRemaining = max(400 - (wxGetLocalTimeMillis() - waitBegin).GetLo(), unsigned(0));
- wxMilliSleep(waitRemaining); //400 ms delay before rows are removed from UI
-
- //delete rows, that are filtered out:
- removeRowsFromVector(gridRefUI, filteredOutRowsOnUI);
-
- //redraw grid necessary to update new dimensions
- writeGrid(currentGridData, true); //use UI buffer, just a re-dimensioning of grids
- updateStatusInformation(gridRefUI); //status information has to be recalculated!
+ wxMilliSleep(400); //some delay to show user the rows he has filtered out before they are removed
+ writeGrid(currentGridData); //redraw grid to remove excluded elements (keeping sort sequence)
}
}
@@ -379,6 +410,7 @@ void MainDialog::filterRangeTemp(const set<int>& rowsToFilterOnUI_View)
m_grid3->ClearSelection();
}
+
/*grid event choreography:
1. UI-Mouse-Down => OnGridSelectCell
2. UI-Mouse-Up => SelectRangeEvent (if at least two rows are marked)
@@ -572,18 +604,18 @@ set<int> MainDialog::getSelectedRows()
}
-class DeleteStatusUpdater : public StatusUpdater
+class DeleteErrorHandler : public ErrorHandler
{
public:
- DeleteStatusUpdater(bool& unsolvedErrorOccured) : continueOnError(false), unsolvedErrors(unsolvedErrorOccured) {}
- ~DeleteStatusUpdater() {}
+ DeleteErrorHandler(bool& unsolvedErrorOccured) : continueOnError(false), unsolvedErrors(unsolvedErrorOccured) {}
+ ~DeleteErrorHandler() {}
- int reportError(const wxString& text)
+ Response reportError(const wxString& text)
{
if (continueOnError)
{
unsolvedErrors = true;
- return StatusUpdater::continueNext;
+ return ErrorHandler::CONTINUE_NEXT;
}
wxString errorMessage = text + _("\n\nInformation: If you skip the error and continue or abort a re-compare will be necessary!");
@@ -595,12 +627,12 @@ public:
switch (rv)
{
- case ErrorDlg::continueButtonPressed:
+ case ErrorDlg::BUTTON_CONTINUE:
unsolvedErrors = true;
- return StatusUpdater::continueNext;
- case ErrorDlg::retryButtonPressed:
- return StatusUpdater::retry;
- case ErrorDlg::abortButtonPressed:
+ return ErrorHandler::CONTINUE_NEXT;
+ case ErrorDlg::BUTTON_RETRY:
+ return ErrorHandler::RETRY;
+ case ErrorDlg::BUTTON_ABORT:
{
unsolvedErrors = true;
throw AbortThisProcess();
@@ -609,14 +641,9 @@ public:
assert (false);
}
- return StatusUpdater::continueNext; //dummy return value
+ return ErrorHandler::CONTINUE_NEXT; //dummy return value
}
- void updateStatusText(const wxString& text) {}
- void initNewProcess(int objectsTotal, double dataTotal, int processID) {}
- void updateProcessedData(int objectsProcessed, double dataProcessed) {}
- void forceUiRefresh() {}
private:
- void abortThisProcess() {}
bool continueOnError;
bool& unsolvedErrors;
@@ -644,11 +671,11 @@ void MainDialog::deleteFilesOnGrid(const set<int>& rowsToDeleteOnUI)
{
const FileCompareLine& currentCmpLine = currentGridData[*i];
- if (currentCmpLine.fileDescrLeft.objType != TYPE_NOTHING)
- filesToDelete+= currentCmpLine.fileDescrLeft.filename + wxT("\n");
+ if (currentCmpLine.fileDescrLeft.objType != FileDescrLine::TYPE_NOTHING)
+ filesToDelete+= currentCmpLine.fileDescrLeft.fullName + wxT("\n");
- if (currentCmpLine.fileDescrRight.objType != TYPE_NOTHING)
- filesToDelete+= currentCmpLine.fileDescrRight.filename + wxT("\n");
+ if (currentCmpLine.fileDescrRight.objType != FileDescrLine::TYPE_NOTHING)
+ filesToDelete+= currentCmpLine.fileDescrRight.fullName + wxT("\n");
filesToDelete+= wxT("\n");
}
@@ -657,38 +684,35 @@ void MainDialog::deleteFilesOnGrid(const set<int>& rowsToDeleteOnUI)
switch (confirmDeletion->ShowModal())
{
- case DeleteDialog::okayButtonPressed:
+ case DeleteDialog::BUTTON_OKAY:
{
bool unsolvedErrorOccured = false; //if an error is skipped a re-compare will be necessary!
try
- { //class errors when deleting files/folders
- DeleteStatusUpdater deleteStatusUpdater(unsolvedErrorOccured);
+ { //handle errors when deleting files/folders
+ DeleteErrorHandler errorHandler(unsolvedErrorOccured);
- FreeFileSync::deleteOnGridAndHD(currentGridData, rowsToDeleteOnGrid, &deleteStatusUpdater, cfg.useRecycleBin);
+ FreeFileSync::deleteOnGridAndHD(currentGridData, rowsToDeleteOnGrid, &errorHandler, cfg.useRecycleBin);
}
catch (AbortThisProcess& theException)
{}
-
//disable the sync button if errors occured during deletion
if (unsolvedErrorOccured)
enableSynchronization(false);
-
//redraw grid neccessary to update new dimensions and for UI-Backend data linkage
- writeGrid(currentGridData); //do NOT use UI buffer here
+ writeGrid(currentGridData);
- m_grid1->ClearSelection(); //clear selection on grid
- m_grid2->ClearSelection(); //clear selection on grid
- m_grid3->ClearSelection(); //clear selection on grid
+ m_grid1->ClearSelection();
+ m_grid2->ClearSelection();
+ m_grid3->ClearSelection();
}
break;
- case DeleteDialog::cancelButtonPressed:
+ case DeleteDialog::BUTTON_CANCEL:
default:
break;
-
}
}
}
@@ -703,10 +727,9 @@ void MainDialog::openWithFileBrowser(int rowNumber, int gridNr)
if (0 <= rowNumber && rowNumber < int(gridRefUI.size()))
{
- wxString filename = currentGridData[gridRefUI[rowNumber]].fileDescrLeft.filename;
-
- if (!filename.IsEmpty())
- command = wxString(wxT("explorer /select,")) + filename;
+ const FileDescrLine& fileDescr = currentGridData[gridRefUI[rowNumber]].fileDescrLeft;
+ if (fileDescr.objType != FileDescrLine::TYPE_NOTHING)
+ command = wxString(wxT("explorer /select,")) + fileDescr.fullName;
}
wxExecute(command);
}
@@ -716,10 +739,9 @@ void MainDialog::openWithFileBrowser(int rowNumber, int gridNr)
if (0 <= rowNumber && rowNumber < int(gridRefUI.size()))
{
- wxString filename = currentGridData[gridRefUI[rowNumber]].fileDescrRight.filename;
-
- if (!filename.IsEmpty())
- command = wxString(wxT("explorer /select,")) + filename;
+ const FileDescrLine& fileDescr = currentGridData[gridRefUI[rowNumber]].fileDescrRight;
+ if (fileDescr.objType != FileDescrLine::TYPE_NOTHING)
+ command = wxString(wxT("explorer /select,")) + fileDescr.fullName;
}
wxExecute(command);
}
@@ -816,57 +838,13 @@ void MainDialog::onGrid3ButtonEvent(wxKeyEvent& event)
}
-inline
-wxString getFilename(const FileDescrLine* fileDescr)
-{
- if (!fileDescr || fileDescr->objType != TYPE_FILE)
- return wxEmptyString;
- else
- return fileDescr->relFilename.AfterLast(GlobalResources::fileNameSeparator);
-}
-
-
-inline
-wxString getFileExtension(const FileDescrLine* fileDescr)
-{
- if (!fileDescr || fileDescr->objType != TYPE_FILE)
- return wxEmptyString;
- else
- {
- wxString filename = getFilename(fileDescr);
-
- if (filename.Find(wxChar('.')) != wxNOT_FOUND) //be careful: AfterLast will return the whole string if '.' is not found!
- return filename.AfterLast(wxChar('.'));
- else
- return wxEmptyString;
- }
-}
-
-
-inline
-wxString getDirname(const FileDescrLine* fileDescr)
-{
- if (!fileDescr || fileDescr->objType != TYPE_DIRECTORY)
- return wxEmptyString;
- else
- return fileDescr->filename.AfterLast(GlobalResources::fileNameSeparator);
-}
-
-
-inline
-wxString getRelativeName(const FileDescrLine* fileDescr)
-{
- if (!fileDescr || fileDescr->objType == TYPE_NOTHING)
- return wxEmptyString;
- else
- return fileDescr->relFilename;
-}
-
-
void MainDialog::OnOpenContextMenu(wxGridEvent& event)
{
set<int> selection = getSelectedRows();
+ exFilterCandidateExtension.Clear();
+ exFilterCandidateObj.clear();
+
//#######################################################
//re-create context menu
delete contextMenu;
@@ -875,31 +853,49 @@ void MainDialog::OnOpenContextMenu(wxGridEvent& event)
//dynamic filter determination
if (selection.size() > 0)
{
- const FileCompareLine& cmpLine = currentGridData[gridRefUI[*selection.begin()]];
+ const FileCompareLine& firstLine = currentGridData[gridRefUI[*selection.begin()]];
- if (cmpLine.selectedForSynchronization)
+ if (firstLine.selectedForSynchronization)
contextMenu->Append(CONTEXT_FILTER_TEMP, _("Exclude temporarily"));
else
contextMenu->Append(CONTEXT_FILTER_TEMP, _("Include temporarily"));
-
- const FileDescrLine* fileDescr = NULL;
+ //get list of relative file/dir-names into vectors
+ FilterObject newFilterEntry;
if (leadingPanel == 1)
- fileDescr = &cmpLine.fileDescrLeft;
+ for (set<int>::iterator i = selection.begin(); i != selection.end(); ++i)
+ {
+ const FileCompareLine& line = currentGridData[gridRefUI[*i]];
+ newFilterEntry.relativeName = line.fileDescrLeft.relativeName;
+ newFilterEntry.type = line.fileDescrLeft.objType;
+ if (!newFilterEntry.relativeName.IsEmpty())
+ exFilterCandidateObj.push_back(newFilterEntry);
+ }
else if (leadingPanel == 2)
- fileDescr = &cmpLine.fileDescrRight;
+ for (set<int>::iterator i = selection.begin(); i != selection.end(); ++i)
+ {
+ const FileCompareLine& line = currentGridData[gridRefUI[*i]];
+ newFilterEntry.relativeName = line.fileDescrRight.relativeName;
+ newFilterEntry.type = line.fileDescrRight.objType;
+ if (!newFilterEntry.relativeName.IsEmpty())
+ exFilterCandidateObj.push_back(newFilterEntry);
+ }
- exFilterCandidateExtension = getFileExtension(fileDescr); //avoid re-determination in onContextMenuSelection()
- if (!exFilterCandidateExtension.IsEmpty())
- contextMenu->Append(CONTEXT_EXCLUDE_EXT, wxString(_("Add to exclude filter: ")) + wxT("*.") + exFilterCandidateExtension);
- exFilterCandidateFilename = getFilename(fileDescr);
- if (!exFilterCandidateFilename.IsEmpty())
- contextMenu->Append(CONTEXT_EXCLUDE_FILE, wxString(_("Add to exclude filter: ")) + exFilterCandidateFilename);
+ if (exFilterCandidateObj.size() > 0 && exFilterCandidateObj[0].type == FileDescrLine::TYPE_FILE)
+ {
+ const wxString filename = exFilterCandidateObj[0].relativeName.AfterLast(GlobalResources::fileNameSeparator);
+ if (filename.Find(wxChar('.')) != wxNOT_FOUND) //be careful: AfterLast will return the whole string if '.' is not found!
+ {
+ exFilterCandidateExtension = filename.AfterLast(wxChar('.'));
+ contextMenu->Append(CONTEXT_EXCLUDE_EXT, wxString(_("Add to exclude filter: ")) + wxT("*.") + exFilterCandidateExtension);
+ }
+ }
- exFilterCandidateDirname = getDirname(fileDescr);
- if (!exFilterCandidateDirname.IsEmpty())
- contextMenu->Append(CONTEXT_EXCLUDE_DIR, wxString(_("Add to exclude filter: ")) + exFilterCandidateDirname);
+ if (exFilterCandidateObj.size() == 1)
+ contextMenu->Append(CONTEXT_EXCLUDE_OBJ, wxString(_("Add to exclude filter: ")) + exFilterCandidateObj[0].relativeName);
+ else if (exFilterCandidateObj.size() > 1)
+ contextMenu->Append(CONTEXT_EXCLUDE_OBJ, wxString(_("Add to exclude filter: ")) + _("<multiple selection>"));
}
else
contextMenu->Append(CONTEXT_FILTER_TEMP, _("Exclude temporarily")); //this element should always be visible
@@ -967,31 +963,26 @@ void MainDialog::onContextMenuSelection(wxCommandEvent& event)
writeGrid(currentGridData);
}
}
- else if (eventId == CONTEXT_EXCLUDE_FILE)
- {
- if (!exFilterCandidateFilename.IsEmpty())
- {
- if (!cfg.excludeFilter.IsEmpty() && !cfg.excludeFilter.EndsWith(wxT("\n")))
- cfg.excludeFilter+= wxT("\n");
-
- cfg.excludeFilter+= wxString(wxT("*")) + GlobalResources::fileNameSeparator + exFilterCandidateFilename;
-
- cfg.filterIsActive = true;
- updateFilterButton(m_bpButtonFilter, cfg.filterIsActive);
-
- FreeFileSync::filterCurrentGridData(currentGridData, cfg.includeFilter, cfg.excludeFilter);
- writeGrid(currentGridData);
- }
- }
- else if (eventId == CONTEXT_EXCLUDE_DIR)
+ else if (eventId == CONTEXT_EXCLUDE_OBJ)
{
- if (!exFilterCandidateDirname.IsEmpty())
+ if (exFilterCandidateObj.size() > 0) //check needed to determine if filtering is needed
{
- if (!cfg.excludeFilter.IsEmpty() && !cfg.excludeFilter.EndsWith(wxT("\n")))
- cfg.excludeFilter+= wxT("\n");
+ for (vector<FilterObject>::const_iterator i = exFilterCandidateObj.begin(); i != exFilterCandidateObj.end(); ++i)
+ {
+ if (!cfg.excludeFilter.IsEmpty() && !cfg.excludeFilter.EndsWith(wxT("\n")))
+ cfg.excludeFilter+= wxT("\n");
- cfg.excludeFilter+= wxString(wxT("*")) + GlobalResources::fileNameSeparator + exFilterCandidateDirname + wxT("\n");
- cfg.excludeFilter+= wxString(wxT("*")) + GlobalResources::fileNameSeparator + exFilterCandidateDirname + GlobalResources::fileNameSeparator + wxT("*");
+ if (i->type == FileDescrLine::TYPE_FILE)
+ {
+ cfg.excludeFilter+= wxString(wxT("*")) + GlobalResources::fileNameSeparator + i->relativeName;
+ }
+ else if (i->type == FileDescrLine::TYPE_DIRECTORY)
+ {
+ cfg.excludeFilter+= wxString(wxT("*")) + GlobalResources::fileNameSeparator + i->relativeName + wxT("\n");
+ cfg.excludeFilter+= wxString(wxT("*")) + GlobalResources::fileNameSeparator + i->relativeName + GlobalResources::fileNameSeparator + wxT("*");
+ }
+ else assert(false);
+ }
cfg.filterIsActive = true;
updateFilterButton(m_bpButtonFilter, cfg.filterIsActive);
@@ -1358,161 +1349,87 @@ void MainDialog::OnQuit(wxCommandEvent &event)
}
-void MainDialog::loadDefaultConfiguration()
-{
- //default values
- cfg.syncConfiguration.exLeftSideOnly = SYNC_DIR_RIGHT;
- cfg.syncConfiguration.exRightSideOnly = SYNC_DIR_RIGHT;
- cfg.syncConfiguration.leftNewer = SYNC_DIR_RIGHT;
- cfg.syncConfiguration.rightNewer = SYNC_DIR_RIGHT;
- cfg.syncConfiguration.different = SYNC_DIR_RIGHT;
-
- cfg.compareVar = CMP_BY_TIME_SIZE; //compare algorithm
- updateCompareButtons();
-
- cfg.includeFilter = wxT("*"); //include all files/folders
- cfg.excludeFilter = wxEmptyString; //exclude nothing
-
- //set status of filter button
- cfg.filterIsActive = false; //do not filter by default
- updateFilterButton(m_bpButtonFilter, cfg.filterIsActive);
-
- cfg.useRecycleBin = FreeFileSync::recycleBinExists(); //enable if OS supports it; else user will have to activate first and then get the error message
- cfg.continueOnError = false;
-
- //set status of "hide filtered items" checkbox
- hideFilteredElements = false; //show filtered items
- m_checkBoxHideFilt->SetValue(hideFilteredElements);
-
- widthNotMaximized = wxDefaultCoord;
- heightNotMaximized = wxDefaultCoord;
- posXNotMaximized = wxDefaultCoord;
- posYNotMaximized = wxDefaultCoord;
-}
-
-
bool MainDialog::readConfigurationFromXml(const wxString& filename, bool programStartup)
{
//load XML
- XmlInput inputFile(filename, XML_GUI_CONFIG);
-
- if (!inputFile.loadedSuccessfully())
- { //handle error: file load
- if (programStartup)
- loadDefaultConfiguration();
- else
- wxMessageBox(wxString(_("Could not open configuration file ")) + wxT("\"") + filename + wxT("\""), _("Error"), wxOK | wxICON_ERROR);
- return false;
+ XmlGuiConfig guiCfg; //structure to receive gui settings, already defaulted!!
+ try
+ {
+ guiCfg = xmlAccess::readGuiConfig(filename);
}
-
- XmlMainConfig mainCfg; //structure to receive main settings
- XmlGuiConfig guiCfg; //structure to receive gui settings
- if ( inputFile.readXmlMainConfig(mainCfg) && //read main configuration settings
- inputFile.readXmlGuiConfig(guiCfg)) //read GUI layout configuration
+ catch (const FileError& error)
{
- //load main configuration into instance
- cfg = mainCfg.cfg;
+ if (programStartup && filename == FreeFileSync::FfsLastConfigFile && !wxFileExists(filename)) //do not show error in this case
+ ;
+ else if (!programStartup)
+ {
+ wxMessageBox(error.show(), _("Error"), wxOK | wxICON_ERROR);
+ return false;
+ }
+ else //program startup: show error message and load defaults
+ wxMessageBox(error.show(), _("Error"), wxOK | wxICON_ERROR);
+ }
- //update visible config on main window
- updateCompareButtons();
- updateFilterButton(m_bpButtonFilter, cfg.filterIsActive);
+ //load main configuration into instance
+ cfg = guiCfg.mainCfg;
- //read folder pairs, but first: clear existing pairs:
- removeFolderPair(true);
+ //update visible config on main window
+ updateCompareButtons();
+ updateFilterButton(m_bpButtonFilter, cfg.filterIsActive);
- //set main folder pair
- if (mainCfg.directoryPairs.size() > 0)
- {
- vector<FolderPair>::const_iterator i = mainCfg.directoryPairs.begin();
+ //read folder pairs, but first: clear existing pairs:
+ removeFolderPair(true);
- m_directoryLeft->SetValue(i->leftDirectory);
- wxString leftDirFormatted = FreeFileSync::getFormattedDirectoryName(i->leftDirectory);
- if (wxDirExists(leftDirFormatted))
- m_dirPicker1->SetPath(leftDirFormatted);
+ //set main folder pair
+ if (guiCfg.directoryPairs.size() > 0)
+ {
+ vector<FolderPair>::const_iterator i = guiCfg.directoryPairs.begin();
- m_directoryRight->SetValue(i->rightDirectory);
- wxString rightDirFormatted = FreeFileSync::getFormattedDirectoryName(i->rightDirectory);
- if (wxDirExists(rightDirFormatted))
- m_dirPicker2->SetPath(rightDirFormatted);
+ m_directoryLeft->SetValue(i->leftDirectory);
+ wxString leftDirFormatted = FreeFileSync::getFormattedDirectoryName(i->leftDirectory);
+ if (wxDirExists(leftDirFormatted))
+ m_dirPicker1->SetPath(leftDirFormatted);
- //set additional pairs
- for (vector<FolderPair>::const_iterator i = mainCfg.directoryPairs.begin() + 1; i != mainCfg.directoryPairs.end(); ++i)
- addFolderPair(i->leftDirectory, i->rightDirectory);
- }
+ m_directoryRight->SetValue(i->rightDirectory);
+ wxString rightDirFormatted = FreeFileSync::getFormattedDirectoryName(i->rightDirectory);
+ if (wxDirExists(rightDirFormatted))
+ m_dirPicker2->SetPath(rightDirFormatted);
- //read GUI layout (optional!)
- hideFilteredElements = guiCfg.hideFilteredElements;
- m_checkBoxHideFilt->SetValue(hideFilteredElements);
+ //set additional pairs
+ for (vector<FolderPair>::const_iterator i = guiCfg.directoryPairs.begin() + 1; i != guiCfg.directoryPairs.end(); ++i)
+ addFolderPair(i->leftDirectory, i->rightDirectory);
+ }
- //apply window size and position at program startup ONLY
- if (programStartup)
- {
- if ( guiCfg.widthNotMaximized != -1 &&
- guiCfg.heightNotMaximized != -1 &&
- guiCfg.posXNotMaximized != -1 &&
- guiCfg.posYNotMaximized != -1)
- {
- widthNotMaximized = guiCfg.widthNotMaximized;
- heightNotMaximized = guiCfg.heightNotMaximized;
- posXNotMaximized = guiCfg.posXNotMaximized;
- posYNotMaximized = guiCfg.posYNotMaximized;
-
- //apply window size and position
- SetSize(posXNotMaximized, posYNotMaximized, widthNotMaximized, heightNotMaximized);
- Maximize(guiCfg.isMaximized);
- }
- //read column widths
- for (int i = 0; i < m_grid1->GetNumberCols() && i < int(guiCfg.columnWidthLeft.size()); ++i)
- m_grid1->SetColSize(i, guiCfg.columnWidthLeft[i]);
+ //read GUI layout (optional!)
+ hideFilteredElements = guiCfg.hideFilteredElements;
+ m_checkBoxHideFilt->SetValue(hideFilteredElements);
- for (int i = 0; i < m_grid2->GetNumberCols() && i < int(guiCfg.columnWidthRight.size()); ++i)
- m_grid2->SetColSize(i, guiCfg.columnWidthRight[i]);
- }
- //###########################################################
- addCfgFileToHistory(filename); //put filename on list of last used config files
- return true;
- }
- else
- { //handle error: parsing
- wxMessageBox(wxString(_("Error parsing configuration file ")) + wxT("\"") + filename + wxT("\""), _("Error"), wxOK | wxICON_ERROR);
- if (programStartup)
- loadDefaultConfiguration();
- return false;
- }
+ //###########################################################
+ addCfgFileToHistory(filename); //put filename on list of last used config files
+ return true;
}
bool MainDialog::writeConfigurationToXml(const wxString& filename)
{
- XmlOutput outputFile(filename, XML_GUI_CONFIG);
+ XmlGuiConfig guiCfg;
//load structure with basic settings "mainCfg"
- XmlMainConfig mainCfg;
- mainCfg.cfg = cfg;
- GetFolderPairs(mainCfg.directoryPairs);
+ guiCfg.mainCfg = cfg;
+ GetFolderPairs(guiCfg.directoryPairs);
- //load structure with gui settings "guiCfg"
- XmlGuiConfig guiCfg;
+ //load structure with gui settings
guiCfg.hideFilteredElements = hideFilteredElements;
- guiCfg.widthNotMaximized = widthNotMaximized;
- guiCfg.heightNotMaximized = heightNotMaximized;
- guiCfg.posXNotMaximized = posXNotMaximized;
- guiCfg.posYNotMaximized = posYNotMaximized;
- guiCfg.isMaximized = IsMaximized();
-
- for (int i = 0; i < m_grid1->GetNumberCols(); ++i)
- guiCfg.columnWidthLeft.push_back(m_grid1->GetColSize(i));
- for (int i = 0; i < m_grid2->GetNumberCols(); ++i)
- guiCfg.columnWidthRight.push_back(m_grid2->GetColSize(i));
-
- //populate and write XML tree
- if ( !outputFile.writeXmlMainConfig(mainCfg) || //add basic configuration settings
- !outputFile.writeXmlGuiConfig(guiCfg) || //add GUI layout configuration settings
- !outputFile.writeToFile()) //save XML
+ //write config to XML
+ try
+ {
+ xmlAccess::writeGuiConfig(filename, guiCfg);
+ }
+ catch (const FileError& error)
{
- wxMessageBox(wxString(_("Could not write configuration file ")) + wxT("\"") + filename + wxT("\""), _("Error"), wxOK | wxICON_ERROR);
+ wxMessageBox(error.show(), _("Error"), wxOK | wxICON_ERROR);
return false;
}
@@ -1563,7 +1480,7 @@ void MainDialog::OnConfigureFilter(wxHyperlinkEvent &event)
wxString beforeImage = cfg.includeFilter + wxChar(1) + cfg.excludeFilter;
FilterDlg* filterDlg = new FilterDlg(this, cfg.includeFilter, cfg.excludeFilter);
- if (filterDlg->ShowModal() == FilterDlg::okayButtonPressed)
+ if (filterDlg->ShowModal() == FilterDlg::BUTTON_OKAY)
{
wxString afterImage = cfg.includeFilter + wxChar(1) + cfg.excludeFilter;
@@ -1640,34 +1557,70 @@ void MainDialog::OnEqualFiles(wxCommandEvent& event)
void MainDialog::updateViewFilterButtons()
{
if (leftOnlyFilesActive)
- m_bpButtonLeftOnly->SetBitmapLabel(*globalResource.bitmapLeftOnly);
+ {
+ m_bpButtonLeftOnly->SetBitmapLabel(*globalResource.bitmapLeftOnlyAct);
+ m_bpButtonLeftOnly->SetToolTip(_("Hide files that exist on left side only"));
+ }
else
+ {
m_bpButtonLeftOnly->SetBitmapLabel(*globalResource.bitmapLeftOnlyDeact);
+ m_bpButtonLeftOnly->SetToolTip(_("Show files that exist on left side only"));
+ }
if (leftNewerFilesActive)
- m_bpButtonLeftNewer->SetBitmapLabel(*globalResource.bitmapLeftNewer);
+ {
+ m_bpButtonLeftNewer->SetBitmapLabel(*globalResource.bitmapLeftNewerAct);
+ m_bpButtonLeftNewer->SetToolTip(_("Hide files that are newer on left"));
+ }
else
+ {
m_bpButtonLeftNewer->SetBitmapLabel(*globalResource.bitmapLeftNewerDeact);
+ m_bpButtonLeftNewer->SetToolTip(_("Show files that are newer on left"));
+ }
if (equalFilesActive)
- m_bpButtonEqual->SetBitmapLabel(*globalResource.bitmapEqual);
+ {
+ m_bpButtonEqual->SetBitmapLabel(*globalResource.bitmapEqualAct);
+ m_bpButtonEqual->SetToolTip(_("Hide files that are equal"));
+ }
else
+ {
m_bpButtonEqual->SetBitmapLabel(*globalResource.bitmapEqualDeact);
+ m_bpButtonEqual->SetToolTip(_("Show files that are equal"));
+ }
if (differentFilesActive)
- m_bpButtonDifferent->SetBitmapLabel(*globalResource.bitmapDifferent);
+ {
+ m_bpButtonDifferent->SetBitmapLabel(*globalResource.bitmapDifferentAct);
+ m_bpButtonDifferent->SetToolTip(_("Hide files that are different"));
+ }
else
+ {
m_bpButtonDifferent->SetBitmapLabel(*globalResource.bitmapDifferentDeact);
+ m_bpButtonDifferent->SetToolTip(_("Show files that are different"));
+ }
if (rightNewerFilesActive)
- m_bpButtonRightNewer->SetBitmapLabel(*globalResource.bitmapRightNewer);
+ {
+ m_bpButtonRightNewer->SetBitmapLabel(*globalResource.bitmapRightNewerAct);
+ m_bpButtonRightNewer->SetToolTip(_("Hide files that are newer on right"));
+ }
else
+ {
m_bpButtonRightNewer->SetBitmapLabel(*globalResource.bitmapRightNewerDeact);
+ m_bpButtonRightNewer->SetToolTip(_("Show files that are newer on right"));
+ }
if (rightOnlyFilesActive)
- m_bpButtonRightOnly->SetBitmapLabel(*globalResource.bitmapRightOnly);
+ {
+ m_bpButtonRightOnly->SetBitmapLabel(*globalResource.bitmapRightOnlyAct);
+ m_bpButtonRightOnly->SetToolTip(_("Hide files that exist on right side only"));
+ }
else
+ {
m_bpButtonRightOnly->SetBitmapLabel(*globalResource.bitmapRightOnlyDeact);
+ m_bpButtonRightOnly->SetToolTip(_("Show files that exist on right side only"));
+ }
}
@@ -1772,13 +1725,10 @@ void MainDialog::OnCompare(wxCommandEvent &event)
CompareStatusUpdater statusUpdater(this);
cmpStatusUpdaterTmp = &statusUpdater;
- //unsigned int startTime3 = GetTickCount();
- FreeFileSync::startCompareProcess(currentGridData,
- directoryPairsFormatted,
+ FreeFileSync::startCompareProcess(directoryPairsFormatted,
cfg.compareVar,
+ currentGridData,
&statusUpdater);
- //wxMessageBox(numberToWxString(unsigned(GetTickCount()) - startTime3));
-
//filter currentGridData if option is set
if (cfg.filterIsActive)
@@ -1802,6 +1752,10 @@ void MainDialog::OnCompare(wxCommandEvent &event)
{ //once compare is finished enable the sync button
enableSynchronization(true);
m_bpButtonSync->SetFocus();
+
+ //hide sort direction indicator on GUI grids
+ m_grid1->setSortMarker(-1);
+ m_grid2->setSortMarker(-1);
}
wxEndBusyCursor();
@@ -1817,23 +1771,17 @@ void MainDialog::OnAbortCompare(wxCommandEvent& event)
}
-void MainDialog::writeGrid(const FileCompareResult& gridData, bool useUI_GridCache)
+void MainDialog::writeGrid(const FileCompareResult& gridData)
{
m_grid1->BeginBatch();
m_grid2->BeginBatch();
m_grid3->BeginBatch();
- if (!useUI_GridCache)
- {
- //unsigned int startTime = GetTickCount();
- mapGridDataToUI(gridRefUI, gridData); //update gridRefUI
- //wxMessageBox(wxString("Benchmark: ") + numberToWxString(unsigned(GetTickCount()) - startTime) + " ms");
-
- updateStatusInformation(gridRefUI); //write status information for gridRefUI
- }
+ mapGridDataToUI(gridRefUI, gridData); //update gridRefUI
+ updateStatusInformation(gridRefUI); //write status information for gridRefUI
- //all three grids retrieve their data directly from currentGridData!!!
- //the only thing left to do is notify the grids to update their sizes (nr of rows), since this has to be communicated via messages by the grids
+ //all three grids retrieve their data directly via gridRefUI!!!
+ //the only thing left to do is notify the grids to update their sizes (nr of rows), since this has to be communicated by the grids via messages
m_grid1->updateGridSizes();
m_grid2->updateGridSizes();
m_grid3->updateGridSizes();
@@ -1847,11 +1795,6 @@ void MainDialog::writeGrid(const FileCompareResult& gridData, bool useUI_GridCac
m_grid2->SetRowLabelSize(nrOfDigits * 8 + 4);
}
- //hide sort direction indicator on UI grids
- m_grid1->setSortMarker(-1);
- m_grid2->setSortMarker(-1);
-
-
m_grid1->EndBatch();
m_grid2->EndBatch();
m_grid3->EndBatch();
@@ -1884,17 +1827,13 @@ void MainDialog::OnSync(wxCommandEvent& event)
wxBeginBusyCursor();
clearStatusBar();
-
try
{
//class handling status updates and error messages
SyncStatusUpdater statusUpdater(this, cfg.continueOnError);
//start synchronization and return elements that were not sync'ed in currentGridData
-
- //unsigned int startTime3 = GetTickCount();
FreeFileSync::startSynchronizationProcess(currentGridData, cfg.syncConfiguration, &statusUpdater, cfg.useRecycleBin);
- //wxMessageBox(numberToWxString(unsigned(GetTickCount()) - startTime3));
}
catch (AbortThisProcess& theException)
{ //do NOT disable the sync button: user might want to try to sync the REMAINING rows
@@ -1912,7 +1851,6 @@ void MainDialog::OnSync(wxCommandEvent& event)
enableSynchronization(false);
}
-
wxEndBusyCursor();
}
event.Skip();
@@ -1933,170 +1871,37 @@ void MainDialog::OnRightGridDoubleClick(wxGridEvent& event)
}
-//these three global variables are ONLY used for the sorting in the following methods
-unsigned int currentSortColumn = 0;
-bool sortAscending = true;
-FileCompareResult* currentGridDataPtr = 0;
-
-inline
-bool cmpString(const wxString& a, const wxString& b)
-{
- if (a.IsEmpty())
- return false; // if a and b are empty: false, if a empty, b not empty: also false, since empty rows should appear at the end
- else if (b.IsEmpty())
- return true; // empty rows after filled rows: return true
-
- //if a and b not empty:
- if (sortAscending)
- return (a < b);
- else return (a > b);
-}
-
-
-inline
-bool cmpLargeInt(const wxULongLong& a, const wxULongLong& b)
-{
- if (sortAscending)
- return (a < b);
-
- return (a > b);
-}
-
-
-bool sortGridLeft(const GridViewLine a, const GridViewLine b)
-{
- const FileDescrLine& gridDataLineA = (*currentGridDataPtr)[a].fileDescrLeft;
- const FileDescrLine& gridDataLineB = (*currentGridDataPtr)[b].fileDescrLeft;
-
- wxString stringA;
- wxString stringB;
-
- switch (currentSortColumn)
- {
- case 0:
- //presort types: first files, then directories then empty rows
- if (gridDataLineA.objType == TYPE_NOTHING)
- return false; //empty rows always last
- else if (gridDataLineB.objType == TYPE_NOTHING)
- return true; //empty rows always last
- else if (gridDataLineA.objType == TYPE_DIRECTORY)
- return false;
- else if (gridDataLineB.objType == TYPE_DIRECTORY)
- return true;
- else
- return cmpString(gridDataLineA.relFilename.AfterLast(GlobalResources::fileNameSeparator),
- gridDataLineB.relFilename.AfterLast(GlobalResources::fileNameSeparator));
- case 1:
- if (gridDataLineA.objType == TYPE_DIRECTORY)
- stringA = gridDataLineA.relFilename;
- else
- stringA = gridDataLineA.relFilename.BeforeLast(GlobalResources::fileNameSeparator);
-
- if (gridDataLineB.objType == TYPE_DIRECTORY)
- stringB = gridDataLineB.relFilename;
- else
- stringB = gridDataLineB.relFilename.BeforeLast(GlobalResources::fileNameSeparator);
-
- return cmpString(stringA, stringB);
-
- case 2:
- //presort types: first files, then directories then empty rows
- if (gridDataLineA.objType == TYPE_NOTHING)
- return false; //empty rows always last
- else if (gridDataLineB.objType == TYPE_NOTHING)
- return true; //empty rows always last
- else if (gridDataLineA.objType == TYPE_DIRECTORY)
- return false;
- else if (gridDataLineB.objType == TYPE_DIRECTORY)
- return true;
- else //use unformatted filesizes and sort by size
- return cmpLargeInt(gridDataLineA.fileSize, gridDataLineB.fileSize);
-
- case 3:
- return cmpString(gridDataLineA.lastWriteTime, gridDataLineB.lastWriteTime);
-
- default:
- assert(false);
- return true; //dummy command
- }
-}
-
-
-bool sortGridRight(const GridViewLine a, const GridViewLine b)
-{
- const FileDescrLine& gridDataLineA = (*currentGridDataPtr)[a].fileDescrRight;
- const FileDescrLine& gridDataLineB = (*currentGridDataPtr)[b].fileDescrRight;
-
- wxString stringA;
- wxString stringB;
-
- switch (currentSortColumn)
- {
- case 0:
- //presort types: first files, then directories then empty rows
- if (gridDataLineA.objType == TYPE_NOTHING)
- return false; //empty rows always last
- else if (gridDataLineB.objType == TYPE_NOTHING)
- return true; //empty rows always last
- else if (gridDataLineA.objType == TYPE_DIRECTORY)
- return false;
- else if (gridDataLineB.objType == TYPE_DIRECTORY)
- return true;
- else
- return cmpString(gridDataLineA.relFilename.AfterLast(GlobalResources::fileNameSeparator),
- gridDataLineB.relFilename.AfterLast(GlobalResources::fileNameSeparator));
-
- case 1:
- if (gridDataLineA.objType == TYPE_DIRECTORY)
- stringA = gridDataLineA.relFilename;
- else
- stringA = gridDataLineA.relFilename.BeforeLast(GlobalResources::fileNameSeparator);
-
- if (gridDataLineB.objType == TYPE_DIRECTORY)
- stringB = gridDataLineB.relFilename;
- else
- stringB = gridDataLineB.relFilename.BeforeLast(GlobalResources::fileNameSeparator);
-
- return cmpString(stringA, stringB);
-
- case 2:
- //presort types: first files, then directories then empty rows
- if (gridDataLineA.objType == TYPE_NOTHING)
- return false; //empty rows always last
- else if (gridDataLineB.objType == TYPE_NOTHING)
- return true; //empty rows always last
- else if (gridDataLineA.objType == TYPE_DIRECTORY)
- return false;
- else if (gridDataLineB.objType == TYPE_DIRECTORY)
- return true;
- else //use unformatted filesizes and sort by size
- return cmpLargeInt(gridDataLineA.fileSize, gridDataLineB.fileSize);
-
- case 3:
- return cmpString(gridDataLineA.lastWriteTime, gridDataLineB.lastWriteTime);
-
- default:
- assert(false);
- return true; //dummy command
- }
-}
-
-
void MainDialog::OnSortLeftGrid(wxGridEvent& event)
{
static bool columnSortAscending[4] = {true, true, false, true};
- currentSortColumn = event.GetCol();
- currentGridDataPtr = &currentGridData;
+ int currentSortColumn = event.GetCol();
if (0 <= currentSortColumn && currentSortColumn <= 3)
{
- sortAscending = columnSortAscending[currentSortColumn];
- columnSortAscending[currentSortColumn] = !columnSortAscending[currentSortColumn];
- sort(gridRefUI.begin(), gridRefUI.end(), sortGridLeft);
+ bool& sortAscending = columnSortAscending[currentSortColumn];
- m_grid1->ForceRefresh();
- m_grid2->ForceRefresh();
- m_grid3->ForceRefresh();
+ if (currentSortColumn == 0)
+ {
+ if (sortAscending) sort(currentGridData.begin(), currentGridData.end(), sortByFileName<true, SORT_ON_LEFT>); //probably faster than qsort(), since gridRefUI is vector<int>
+ else sort(currentGridData.begin(), currentGridData.end(), sortByFileName<false, SORT_ON_LEFT>);
+ }
+ else if (currentSortColumn == 1)
+ {
+ if (sortAscending) sort(currentGridData.begin(), currentGridData.end(), sortByRelativeName<true, SORT_ON_LEFT>);
+ else sort(currentGridData.begin(), currentGridData.end(), sortByRelativeName<false, SORT_ON_LEFT>);
+ }
+ else if (currentSortColumn == 2)
+ {
+ if (sortAscending) sort(currentGridData.begin(), currentGridData.end(), sortByFileSize<true, SORT_ON_LEFT>);
+ else sort(currentGridData.begin(), currentGridData.end(), sortByFileSize<false, SORT_ON_LEFT>);
+ }
+ else if (currentSortColumn == 3)
+ {
+ if (sortAscending) sort(currentGridData.begin(), currentGridData.end(), sortByDate<true, SORT_ON_LEFT>);
+ else sort(currentGridData.begin(), currentGridData.end(), sortByDate<false, SORT_ON_LEFT>);
+ }
+
+ writeGrid(currentGridData); //needed to refresh gridRefUI references
//set sort direction indicator on UI
if (sortAscending)
@@ -2104,6 +1909,8 @@ void MainDialog::OnSortLeftGrid(wxGridEvent& event)
else
m_grid1->setSortMarker(currentSortColumn, globalResource.bitmapSmallDown);
m_grid2->setSortMarker(-1);
+
+ sortAscending = !sortAscending;
}
event.Skip();
}
@@ -2113,17 +1920,33 @@ void MainDialog::OnSortRightGrid(wxGridEvent& event)
{
static bool columnSortAscending[4] = {true, true, false, true};
- currentSortColumn = event.GetCol();
- currentGridDataPtr = &currentGridData;
+ int currentSortColumn = event.GetCol();
if (0 <= currentSortColumn && currentSortColumn <= 3)
{
- sortAscending = columnSortAscending[currentSortColumn];
- columnSortAscending[currentSortColumn] = !columnSortAscending[currentSortColumn];
- sort(gridRefUI.begin(), gridRefUI.end(), sortGridRight);
+ bool& sortAscending = columnSortAscending[currentSortColumn];
- m_grid1->ForceRefresh();
- m_grid2->ForceRefresh();
- m_grid3->ForceRefresh();
+ if (currentSortColumn == 0)
+ {
+ if (sortAscending) sort(currentGridData.begin(), currentGridData.end(), sortByFileName<true, SORT_ON_RIGHT>);
+ else sort(currentGridData.begin(), currentGridData.end(), sortByFileName<false, SORT_ON_RIGHT>);
+ }
+ else if (currentSortColumn == 1)
+ {
+ if (sortAscending) sort(currentGridData.begin(), currentGridData.end(), sortByRelativeName<true, SORT_ON_RIGHT>);
+ else sort(currentGridData.begin(), currentGridData.end(), sortByRelativeName<false, SORT_ON_RIGHT>);
+ }
+ else if (currentSortColumn == 2)
+ {
+ if (sortAscending) sort(currentGridData.begin(), currentGridData.end(), sortByFileSize<true, SORT_ON_RIGHT>);
+ else sort(currentGridData.begin(), currentGridData.end(), sortByFileSize<false, SORT_ON_RIGHT>);
+ }
+ else if (currentSortColumn == 3)
+ {
+ if (sortAscending) sort(currentGridData.begin(), currentGridData.end(), sortByDate<true, SORT_ON_RIGHT>);
+ else sort(currentGridData.begin(), currentGridData.end(), sortByDate<false, SORT_ON_RIGHT>);
+ }
+
+ writeGrid(currentGridData); //needed to refresh gridRefUI references
//set sort direction indicator on UI
m_grid1->setSortMarker(-1);
@@ -2131,6 +1954,8 @@ void MainDialog::OnSortRightGrid(wxGridEvent& event)
m_grid2->setSortMarker(currentSortColumn, globalResource.bitmapSmallUp);
else
m_grid2->setSortMarker(currentSortColumn, globalResource.bitmapSmallDown);
+
+ sortAscending = !sortAscending;
}
event.Skip();
}
@@ -2180,26 +2005,26 @@ void MainDialog::updateStatusInformation(const GridView& visibleGrid)
const FileCompareLine& refLine = currentGridData[*i];
//calculate total number of bytes for each side
- if (refLine.fileDescrLeft.objType == TYPE_FILE)
+ if (refLine.fileDescrLeft.objType == FileDescrLine::TYPE_FILE)
{
filesizeLeftView+= refLine.fileDescrLeft.fileSize;
++filesOnLeftView;
}
- else if (refLine.fileDescrLeft.objType == TYPE_DIRECTORY)
+ else if (refLine.fileDescrLeft.objType == FileDescrLine::TYPE_DIRECTORY)
++foldersOnLeftView;
- if (refLine.fileDescrRight.objType == TYPE_FILE)
+ if (refLine.fileDescrRight.objType == FileDescrLine::TYPE_FILE)
{
filesizeRightView+= refLine.fileDescrRight.fileSize;
++filesOnRightView;
}
- else if (refLine.fileDescrRight.objType == TYPE_DIRECTORY)
+ else if (refLine.fileDescrRight.objType == FileDescrLine::TYPE_DIRECTORY)
++foldersOnRightView;
}
//#################################################
-// format numbers to text
+//format numbers to text:
-//show status information on "root" level. This cannot be accomplished in writeGrid since filesizes are already formatted for display there
+//show status information on "root" level.
if (foldersOnLeftView)
{
wxString folderCount = numberToWxString(foldersOnLeftView);
@@ -2292,6 +2117,10 @@ void MainDialog::mapGridDataToUI(GridView& output, const FileCompareResult& file
unsigned int currentRow = 0;
for (FileCompareResult::const_iterator i = fileCmpResult.begin(); i != fileCmpResult.end(); ++i, ++currentRow)
{
+ //hide filtered row, if corresponding option is set
+ if (hideFilteredElements && !i->selectedForSynchronization)
+ continue;
+
//process UI filter settings
switch (i->cmpResult)
{
@@ -2322,11 +2151,6 @@ void MainDialog::mapGridDataToUI(GridView& output, const FileCompareResult& file
default:
assert (false);
}
-
- //hide filtered row, if corresponding option is set
- if (hideFilteredElements && !i->selectedForSynchronization)
- continue;
-
output.push_back(currentRow);
}
@@ -2476,7 +2300,7 @@ void MainDialog::removeFolderPair(bool removeAll)
CompareStatusUpdater::CompareStatusUpdater(MainDialog* dlg) :
mainDialog(dlg),
continueOnError(false),
- currentProcess(-1)
+ currentProcess(StatusHandler::PROCESS_NONE)
{
//prevent user input during "compare", do not disable maindialog since abort-button would also be disabled
//it's not nice, but works - even has the advantage that certain actions are still possible: exit, about..
@@ -2578,13 +2402,13 @@ void CompareStatusUpdater::updateStatusText(const wxString& text)
}
-void CompareStatusUpdater::initNewProcess(int objectsTotal, double dataTotal, int processID)
+void CompareStatusUpdater::initNewProcess(int objectsTotal, double dataTotal, Process processID)
{
currentProcess = processID;
- if (currentProcess == FreeFileSync::scanningFilesProcess)
+ if (currentProcess == StatusHandler::PROCESS_SCANNING)
;
- else if (currentProcess == FreeFileSync::compareFileContentProcess)
+ else if (currentProcess == StatusHandler::PROCESS_COMPARING_CONTENT)
{
mainDialog->compareStatus->switchToCompareBytewise(objectsTotal, dataTotal);
mainDialog->Layout();
@@ -2597,18 +2421,18 @@ void CompareStatusUpdater::initNewProcess(int objectsTotal, double dataTotal, in
inline
void CompareStatusUpdater::updateProcessedData(int objectsProcessed, double dataProcessed)
{
- if (currentProcess == FreeFileSync::scanningFilesProcess)
+ if (currentProcess == StatusHandler::PROCESS_SCANNING)
mainDialog->compareStatus->incScannedObjects_NoUpdate(objectsProcessed);
- else if (currentProcess == FreeFileSync::compareFileContentProcess)
+ else if (currentProcess == StatusHandler::PROCESS_COMPARING_CONTENT)
mainDialog->compareStatus->incProcessedCmpData_NoUpdate(objectsProcessed, dataProcessed);
else assert(false);
}
-int CompareStatusUpdater::reportError(const wxString& text)
+ErrorHandler::Response CompareStatusUpdater::reportError(const wxString& text)
{
if (continueOnError)
- return StatusUpdater::continueNext;
+ return ErrorHandler::CONTINUE_NEXT;
mainDialog->compareStatus->updateStatusPanelNow();
@@ -2621,11 +2445,11 @@ int CompareStatusUpdater::reportError(const wxString& text)
switch (rv)
{
- case ErrorDlg::continueButtonPressed:
- return StatusUpdater::continueNext;
- case ErrorDlg::retryButtonPressed:
- return StatusUpdater::retry;
- case ErrorDlg::abortButtonPressed:
+ case ErrorDlg::BUTTON_CONTINUE:
+ return ErrorHandler::CONTINUE_NEXT;
+ case ErrorDlg::BUTTON_RETRY:
+ return ErrorHandler::RETRY;
+ case ErrorDlg::BUTTON_ABORT:
{
abortionRequested = true;
throw AbortThisProcess();
@@ -2634,7 +2458,7 @@ int CompareStatusUpdater::reportError(const wxString& text)
assert (false);
}
- return StatusUpdater::continueNext; //dummy return value
+ return ErrorHandler::CONTINUE_NEXT; //dummy return value
}
@@ -2703,9 +2527,9 @@ void SyncStatusUpdater::updateStatusText(const wxString& text)
}
-void SyncStatusUpdater::initNewProcess(int objectsTotal, double dataTotal, int processID)
+void SyncStatusUpdater::initNewProcess(int objectsTotal, double dataTotal, Process processID)
{
- assert (processID == FreeFileSync::synchronizeFilesProcess);
+ assert (processID == StatusHandler::PROCESS_SYNCHRONIZING);
syncStatusFrame->resetGauge(objectsTotal, dataTotal);
syncStatusFrame->setCurrentStatus(SyncStatus::SYNCHRONIZING);
@@ -2719,12 +2543,12 @@ void SyncStatusUpdater::updateProcessedData(int objectsProcessed, double dataPro
}
-int SyncStatusUpdater::reportError(const wxString& text)
+ErrorHandler::Response SyncStatusUpdater::reportError(const wxString& text)
{
if (continueError)
{
unhandledErrors.Add(text);
- return StatusUpdater::continueNext;
+ return ErrorHandler::CONTINUE_NEXT;
}
wxString errorMessage = text + _("\n\nContinue with next object, retry or abort synchronization?");
@@ -2736,12 +2560,12 @@ int SyncStatusUpdater::reportError(const wxString& text)
switch (rv)
{
- case ErrorDlg::continueButtonPressed:
+ case ErrorDlg::BUTTON_CONTINUE:
unhandledErrors.Add(text);
- return StatusUpdater::continueNext;
- case ErrorDlg::retryButtonPressed:
- return StatusUpdater::retry;
- case ErrorDlg::abortButtonPressed:
+ return ErrorHandler::CONTINUE_NEXT;
+ case ErrorDlg::BUTTON_RETRY:
+ return ErrorHandler::RETRY;
+ case ErrorDlg::BUTTON_ABORT:
{
unhandledErrors.Add(text);
abortionRequested = true;
@@ -2749,7 +2573,7 @@ int SyncStatusUpdater::reportError(const wxString& text)
}
default:
assert (false);
- return StatusUpdater::continueNext;
+ return ErrorHandler::CONTINUE_NEXT;
}
}
@@ -2824,7 +2648,7 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event)
}
else
{
- wxMessageBox(wxString(_("Could not write to ")) + wxT("\"") + fileName + wxT("\""), _("An exception occured!"), wxOK | wxICON_ERROR);
+ wxMessageBox(wxString(_("Could not write to ")) + wxT("\"") + fileName + wxT("\""), _("Error"), wxOK | wxICON_ERROR);
}
}
@@ -2832,6 +2656,15 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event)
}
+void MainDialog::OnMenuAdjustFileTimes(wxCommandEvent& event)
+{
+ ModifyFilesDlg* modifyDlg = new ModifyFilesDlg(this, FreeFileSync::getFormattedDirectoryName(m_directoryLeft->GetValue()), 0);
+ modifyDlg->ShowModal();
+
+ event.Skip();
+}
+
+
void MainDialog::OnMenuBatchJob(wxCommandEvent& event)
{
vector<FolderPair> folderPairs;
@@ -2862,7 +2695,7 @@ void MainDialog::OnMenuQuit(wxCommandEvent& event)
void MainDialog::OnMenuLangEnglish(wxCommandEvent& event)
{
- programLanguage->loadLanguageFile(wxLANGUAGE_ENGLISH); //language is a global attribute
+ programLanguage->setLanguage(wxLANGUAGE_ENGLISH); //language is a global attribute
restartOnExit = true;
Destroy();
event.Skip();
@@ -2871,7 +2704,7 @@ void MainDialog::OnMenuLangEnglish(wxCommandEvent& event)
void MainDialog::OnMenuLangGerman(wxCommandEvent& event)
{
- programLanguage->loadLanguageFile(wxLANGUAGE_GERMAN); //language is a global attribute
+ programLanguage->setLanguage(wxLANGUAGE_GERMAN); //language is a global attribute
restartOnExit = true;
Destroy();
event.Skip();
@@ -2880,7 +2713,7 @@ void MainDialog::OnMenuLangGerman(wxCommandEvent& event)
void MainDialog::OnMenuLangFrench(wxCommandEvent& event)
{
- programLanguage->loadLanguageFile(wxLANGUAGE_FRENCH); //language is a global attribute
+ programLanguage->setLanguage(wxLANGUAGE_FRENCH); //language is a global attribute
restartOnExit = true;
Destroy();
event.Skip();
@@ -2889,7 +2722,16 @@ void MainDialog::OnMenuLangFrench(wxCommandEvent& event)
void MainDialog::OnMenuLangJapanese(wxCommandEvent& event)
{
- programLanguage->loadLanguageFile(wxLANGUAGE_JAPANESE); //language is a global attribute
+ programLanguage->setLanguage(wxLANGUAGE_JAPANESE); //language is a global attribute
+ restartOnExit = true;
+ Destroy();
+ event.Skip();
+}
+
+
+void MainDialog::OnMenuLangDutch(wxCommandEvent& event)
+{
+ programLanguage->setLanguage(wxLANGUAGE_DUTCH); //language is a global attribute
restartOnExit = true;
Destroy();
event.Skip();
diff --git a/ui/MainDialog.h b/ui/MainDialog.h
index 908434ea..e3f72e03 100644
--- a/ui/MainDialog.h
+++ b/ui/MainDialog.h
@@ -19,6 +19,7 @@
#include <wx/dnd.h>
#include <wx/config.h>
#include <stack>
+#include "../library/processXml.h"
using namespace std;
@@ -27,8 +28,7 @@ enum ContextItem
{
CONTEXT_FILTER_TEMP = 10,
CONTEXT_EXCLUDE_EXT,
- CONTEXT_EXCLUDE_FILE,
- CONTEXT_EXCLUDE_DIR,
+ CONTEXT_EXCLUDE_OBJ,
CONTEXT_CLIPBOARD,
CONTEXT_EXPLORER,
CONTEXT_DELETE_FILES
@@ -46,15 +46,17 @@ class MainDialog : public GuiGenerated
friend class FileDropEvent;
public:
- MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale* language);
+ MainDialog(wxFrame* frame, const wxString& cfgFileName, CustomLocale* language, xmlAccess::XmlGlobalSettings& settings);
~MainDialog();
private:
//configuration load/save
- void loadDefaultConfiguration();
bool readConfigurationFromXml(const wxString& filename, bool programStartup = false);
bool writeConfigurationToXml(const wxString& filename);
+ void readGlobalSettings();
+ void writeGlobalSettings();
+
void updateViewFilterButtons();
void updateFilterButton(wxBitmapButton* filterButton, bool isActive);
void updateCompareButtons();
@@ -65,7 +67,7 @@ private:
void removeFolderPair(bool removeAll = false);
//main method for putting gridData on UI: maps data respecting current view settings
- void writeGrid(const FileCompareResult& gridData, bool useUI_GridCache = false);
+ void writeGrid(const FileCompareResult& gridData);
void mapGridDataToUI(GridView& output, const FileCompareResult& fileCmpResult);
void updateStatusInformation(const GridView& output);
@@ -138,6 +140,7 @@ private:
//menu events
void OnMenuExportFileList( wxCommandEvent& event);
+ void OnMenuAdjustFileTimes( wxCommandEvent& event);
void OnMenuBatchJob( wxCommandEvent& event);
void OnMenuAbout( wxCommandEvent& event);
void OnMenuQuit( wxCommandEvent& event);
@@ -145,11 +148,15 @@ private:
void OnMenuLangGerman( wxCommandEvent& event);
void OnMenuLangFrench( wxCommandEvent& event);
void OnMenuLangJapanese( wxCommandEvent& event);
+ void OnMenuLangDutch( wxCommandEvent& event);
void enableSynchronization(bool value);
//***********************************************
- //global application variables are stored here:
+ //application variables are stored here:
+
+ //global settings used by GUI and batch mode
+ xmlAccess::XmlGlobalSettings& globalSettings;
//technical representation of grid-data
FileCompareResult currentGridData;
@@ -205,9 +212,14 @@ private:
bool filteringInitialized;
bool filteringPending;
+ //temporal variables used by exclude via context menu
wxString exFilterCandidateExtension;
- wxString exFilterCandidateFilename;
- wxString exFilterCandidateDirname;
+ struct FilterObject
+ {
+ wxString relativeName;
+ FileDescrLine::ObjectType type;
+ };
+ vector<FilterObject> exFilterCandidateObj;
bool synchronizationEnabled; //determines whether synchronization should be allowed
@@ -241,16 +253,16 @@ private:
//classes handling sync and compare error as well as status information
-class CompareStatusUpdater : public StatusUpdater
+class CompareStatusUpdater : public StatusHandler
{
public:
CompareStatusUpdater(MainDialog* dlg);
~CompareStatusUpdater();
void updateStatusText(const wxString& text);
- void initNewProcess(int objectsTotal, double dataTotal, int processID);
+ void initNewProcess(int objectsTotal, double dataTotal, Process processID);
void updateProcessedData(int objectsProcessed, double dataProcessed);
- int reportError(const wxString& text);
+ ErrorHandler::Response reportError(const wxString& text);
void forceUiRefresh();
@@ -259,20 +271,20 @@ private:
MainDialog* mainDialog;
bool continueOnError;
- int currentProcess;
+ Process currentProcess;
};
-class SyncStatusUpdater : public StatusUpdater
+class SyncStatusUpdater : public StatusHandler
{
public:
SyncStatusUpdater(wxWindow* dlg, bool continueOnError);
~SyncStatusUpdater();
void updateStatusText(const wxString& text);
- void initNewProcess(int objectsTotal, double dataTotal, int processID);
+ void initNewProcess(int objectsTotal, double dataTotal, Process processID);
void updateProcessedData(int objectsProcessed, double dataProcessed);
- int reportError(const wxString& text);
+ ErrorHandler::Response reportError(const wxString& text);
void forceUiRefresh();
diff --git a/ui/SmallDialogs.cpp b/ui/SmallDialogs.cpp
index fd09e17a..0886bb03 100644
--- a/ui/SmallDialogs.cpp
+++ b/ui/SmallDialogs.cpp
@@ -1,7 +1,7 @@
#include "smallDialogs.h"
#include "../library/globalFunctions.h"
-//#include <fstream>
#include "../library/resources.h"
+#include <wx/msgdlg.h>
using namespace globalFunctions;
@@ -150,7 +150,7 @@ void FilterDlg::OnOK(wxCommandEvent& event)
excludeFilter = m_textCtrlExclude->GetValue();
//when leaving dialog: filter and redraw grid, if filter is active
- EndModal(okayButtonPressed);
+ EndModal(BUTTON_OKAY);
}
@@ -181,29 +181,29 @@ DeleteDialog::~DeleteDialog() {}
void DeleteDialog::OnOK(wxCommandEvent& event)
{
- EndModal(okayButtonPressed);
+ EndModal(BUTTON_OKAY);
}
void DeleteDialog::OnCancel(wxCommandEvent& event)
{
- EndModal(cancelButtonPressed);
+ EndModal(BUTTON_CANCEL);
}
void DeleteDialog::OnClose(wxCloseEvent& event)
{
- EndModal(cancelButtonPressed);
+ EndModal(BUTTON_CANCEL);
}
//########################################################################################
ErrorDlg::ErrorDlg(const wxString messageText, bool& continueError) :
- ErrorDlgGenerated(0),
+ ErrorDlgGenerated(NULL),
continueOnError(continueError)
{
m_bitmap10->SetBitmap(*globalResource.bitmapWarning);
m_textCtrl8->SetValue(messageText);
- m_buttonContinue->SetFocus();
+ m_buttonRetry->SetFocus();
}
ErrorDlg::~ErrorDlg() {}
@@ -212,31 +212,156 @@ ErrorDlg::~ErrorDlg() {}
void ErrorDlg::OnClose(wxCloseEvent& event)
{
//continueOnError = m_checkBoxContinueError->GetValue(); -> not needed here
- EndModal(abortButtonPressed);
+ EndModal(BUTTON_ABORT);
}
void ErrorDlg::OnContinue(wxCommandEvent& event)
{
continueOnError = m_checkBoxContinueError->GetValue();
- EndModal(continueButtonPressed);
+ EndModal(BUTTON_CONTINUE);
}
void ErrorDlg::OnRetry(wxCommandEvent& event)
{
//continueOnError = m_checkBoxContinueError->GetValue(); -> not needed here
- EndModal(retryButtonPressed);
+ EndModal(BUTTON_RETRY);
}
void ErrorDlg::OnAbort(wxCommandEvent& event)
{
//continueOnError = m_checkBoxContinueError->GetValue(); -> not needed here
- EndModal(abortButtonPressed);
+ EndModal(BUTTON_ABORT);
}
+
+
//########################################################################################
+ModifyFilesDlg::ModifyFilesDlg(wxWindow* window, const wxString& parentDirectory, const int timeShift) :
+ ModifyFilesDlgGenerated(window)
+{
+ m_dirPicker->SetPath(parentDirectory);
+ m_textCtrlDirectory->SetValue(parentDirectory);
+ m_spinCtrlTimeShift->SetValue(timeShift);
+
+ m_buttonApply->SetFocus();
+}
+
+
+ModifyFilesDlg::~ModifyFilesDlg() {}
+
+
+class ModifyErrorHandler : public ErrorHandler
+{
+public:
+ ModifyErrorHandler(bool& unsolvedErrorOccured) :
+ continueOnError(false),
+ unsolvedErrors(unsolvedErrorOccured) {}
+
+ ~ModifyErrorHandler() {}
+
+ Response reportError(const wxString& text)
+ {
+ if (continueOnError)
+ {
+ unsolvedErrors = true;
+ return ErrorHandler::CONTINUE_NEXT;
+ }
+
+ ErrorDlg* errorDlg = new ErrorDlg(text, continueOnError);
+
+ int rv = errorDlg->ShowModal();
+ errorDlg->Destroy();
+ switch (rv)
+ {
+ case ErrorDlg::BUTTON_CONTINUE:
+ unsolvedErrors = true;
+ return ErrorHandler::CONTINUE_NEXT;
+ case ErrorDlg::BUTTON_RETRY:
+ return ErrorHandler::RETRY;
+ case ErrorDlg::BUTTON_ABORT:
+ {
+ unsolvedErrors = true;
+ throw AbortThisProcess();
+ }
+ default:
+ assert (false);
+ }
+
+ return ErrorHandler::CONTINUE_NEXT; //dummy return value
+ }
+private:
+
+ bool continueOnError;
+ bool& unsolvedErrors;
+};
+
+
+void ModifyFilesDlg::OnApply(wxCommandEvent& event)
+{
+ const int timeToShift = m_spinCtrlTimeShift->GetValue();
+ const wxString parentDir = m_textCtrlDirectory->GetValue();
+
+ if (!wxDirExists(parentDir))
+ {
+ wxMessageBox(wxString(_("Directory does not exist: ")) + wxT("\"") + parentDir + wxT("\""), _("Error"), wxOK | wxICON_ERROR);
+ return;
+ }
+
+ bool unsolvedErrorOccured = false; //if an error is skipped a re-compare will be necessary!
+ try
+ {
+ ModifyErrorHandler errorHandler(unsolvedErrorOccured);
+ FreeFileSync::adjustModificationTimes(parentDir, timeToShift, &errorHandler);
+ }
+ catch (const AbortThisProcess& theException)
+ {
+ EndModal(0);
+ }
+
+ if (unsolvedErrorOccured)
+ wxMessageBox(_("Unresolved errors occured during operation!"), _("Info"), wxOK);
+ else
+ wxMessageBox(_("All file times have been adjusted successfully!"), _("Info"), wxOK);
+ EndModal(0);
+}
+
+
+void ModifyFilesDlg::OnCancel(wxCommandEvent& event)
+{
+ EndModal(0);
+}
+
+
+void ModifyFilesDlg::OnClose(wxCloseEvent& event)
+{
+ EndModal(0);
+}
+
+
+void ModifyFilesDlg::OnWriteDirManually(wxCommandEvent& event)
+{
+ wxString newDir = FreeFileSync::getFormattedDirectoryName(event.GetString());
+ if (wxDirExists(newDir))
+ m_dirPicker->SetPath(newDir);
+
+ event.Skip();
+}
+
+
+void ModifyFilesDlg::OnDirSelected(wxFileDirPickerEvent& event)
+{
+ const wxString newPath = event.GetPath();
+ m_textCtrlDirectory->SetValue(newPath);
+
+ event.Skip();
+}
+
+
+
+//########################################################################################
/*
class for calculation of remaining time:
----------------------------------------
@@ -330,9 +455,9 @@ wxLongLong RemainingTime::getRemainingTime(double processedDataSinceLastCall, in
//########################################################################################
-SyncStatus::SyncStatus(StatusUpdater* updater, wxWindow* parentWindow) :
+SyncStatus::SyncStatus(StatusHandler* updater, wxWindow* parentWindow) :
SyncStatusDlgGenerated(parentWindow),
- currentStatusUpdater(updater),
+ currentStatusHandler(updater),
windowToDis(parentWindow),
currentProcessIsRunning(true),
totalData(0),
@@ -403,18 +528,23 @@ void SyncStatus::updateStatusDialogNow()
m_gauge1->SetValue(int(currentData * scalingFactor));
//status text
- m_textCtrlInfo->SetValue(currentStatusText);
+ if (m_textCtrlInfo->GetValue() != currentStatusText) //avoid screen flicker
+ m_textCtrlInfo->SetValue(currentStatusText);
//remaining objects
- m_staticTextRemainingObj->SetLabel(numberToWxString(totalObjects - currentObjects));
-
+ const wxString remainingObjTmp = numberToWxString(totalObjects - currentObjects);
+ if (m_staticTextRemainingObj->GetLabel() != remainingObjTmp) //avoid screen flicker
+ m_staticTextRemainingObj->SetLabel(remainingObjTmp);
//remaining bytes left for copy
- const wxString remainingBytes = FreeFileSync::formatFilesizeToShortString(totalData - currentData);
- m_staticTextDataRemaining->SetLabel(remainingBytes);
+ const wxString remainingBytesTmp = FreeFileSync::formatFilesizeToShortString(totalData - currentData);
+ if (m_staticTextDataRemaining->GetLabel() != remainingBytesTmp) //avoid screen flicker
+ m_staticTextDataRemaining->SetLabel(remainingBytesTmp);
//time elapsed
- m_staticTextTimeElapsed->SetLabel((wxTimeSpan::Milliseconds(timeElapsed.Time())).Format());
+ const wxString timeElapsedTmp = (wxTimeSpan::Milliseconds(timeElapsed.Time())).Format();
+ if (m_staticTextTimeElapsed->GetLabel() != timeElapsedTmp) //avoid screen flicker
+ m_staticTextTimeElapsed->SetLabel(timeElapsedTmp);
//do the ui update
bSizer28->Layout();
@@ -472,8 +602,8 @@ void SyncStatus::setCurrentStatus(SyncStatusID id)
}
-void SyncStatus::processHasFinished(SyncStatusID id) //essential to call this in StatusUpdater derived class destructor
-{ //at the LATEST(!) to prevent access to currentStatusUpdater
+void SyncStatus::processHasFinished(SyncStatusID id) //essential to call this in StatusHandler derived class destructor
+{ //at the LATEST(!) to prevent access to currentStatusHandler
currentProcessIsRunning = false; //enable okay and close events; may be set ONLY in this method
setCurrentStatus(id);
@@ -532,7 +662,7 @@ void SyncStatus::OnAbort(wxCommandEvent& event)
setStatusText_NoUpdate(_("Abort requested: Waiting for current operation to finish..."));
//no Layout() or UI-update here to avoid cascaded Yield()-call
- currentStatusUpdater->requestAbortion();
+ currentStatusHandler->requestAbortion();
}
}
@@ -540,7 +670,8 @@ void SyncStatus::OnAbort(wxCommandEvent& event)
void SyncStatus::OnClose(wxCloseEvent& event)
{
processPaused = false;
- if (currentProcessIsRunning) currentStatusUpdater->requestAbortion();
+ if (currentProcessIsRunning)
+ currentStatusHandler->requestAbortion();
else
Destroy();
}
@@ -635,19 +766,26 @@ void CompareStatus::setStatusText_NoUpdate(const wxString& text)
void CompareStatus::updateStatusPanelNow()
{
//status texts
- m_textCtrlFilename->SetValue(currentStatusText);
+ if (m_textCtrlFilename->GetValue() != currentStatusText) //avoid screen flicker
+ m_textCtrlFilename->SetValue(currentStatusText);
- m_staticTextScanned->SetLabel(numberToWxString(scannedObjects));
+ //nr of scanned objects
+ const wxString scannedObjTmp = numberToWxString(scannedObjects);
+ if (m_staticTextScanned->GetLabel() != scannedObjTmp) //avoid screen flicker
+ m_staticTextScanned->SetLabel(scannedObjTmp);
//progress indicator for "compare file content"
m_gauge2->SetValue(int(processedCmpData * scalingFactorCmp));
- //remaining file to compare
- m_staticTextFilesToCompare->SetLabel(numberToWxString(totalCmpObjects - processedCmpObjects));
+ //remaining files left for file comparison
+ const wxString filesToCompareTmp = numberToWxString(totalCmpObjects - processedCmpObjects);
+ if (m_staticTextFilesToCompare->GetLabel() != filesToCompareTmp) //avoid screen flicker
+ m_staticTextFilesToCompare->SetLabel(filesToCompareTmp);
//remaining bytes left for file comparison
- const wxString remainingBytes = FreeFileSync::formatFilesizeToShortString(totalCmpData - processedCmpData);
- m_staticTextDataToCompare->SetLabel(remainingBytes);
+ const wxString remainingBytesTmp = FreeFileSync::formatFilesizeToShortString(totalCmpData - processedCmpData);
+ if (m_staticTextDataToCompare->GetLabel() != remainingBytesTmp) //avoid screen flicker
+ m_staticTextDataToCompare->SetLabel(remainingBytesTmp);
/*
//remaining time in seconds
@@ -659,7 +797,9 @@ void CompareStatus::updateStatusPanelNow()
*/
//time elapsed
- m_staticTextTimeElapsed->SetLabel((wxTimeSpan::Milliseconds(timeElapsed.Time())).Format());
+ const wxString timeElapsedTmp = (wxTimeSpan::Milliseconds(timeElapsed.Time())).Format();
+ if (m_staticTextTimeElapsed->GetLabel() != timeElapsedTmp) //avoid screen flicker
+ m_staticTextTimeElapsed->SetLabel(timeElapsedTmp);
//do the ui update
bSizer42->Layout();
diff --git a/ui/SmallDialogs.h b/ui/SmallDialogs.h
index b70e6105..7efb4dbe 100644
--- a/ui/SmallDialogs.h
+++ b/ui/SmallDialogs.h
@@ -35,7 +35,10 @@ public:
FilterDlg(wxWindow* window, wxString& filterIncl, wxString& filterExcl);
~FilterDlg();
- static const int okayButtonPressed = 25;
+ enum
+ {
+ BUTTON_OKAY
+ };
private:
void OnHelp(wxCommandEvent& event);
@@ -55,8 +58,11 @@ public:
DeleteDialog(const wxString& headerText, const wxString& messageText, wxWindow* main);
~DeleteDialog();
- static const int okayButtonPressed = 35;
- static const int cancelButtonPressed = 45;
+ enum
+ {
+ BUTTON_OKAY,
+ BUTTON_CANCEL
+ };
private:
void OnOK(wxCommandEvent& event);
@@ -71,9 +77,12 @@ public:
ErrorDlg(const wxString messageText, bool& continueError);
~ErrorDlg();
- static const int continueButtonPressed = 35;
- static const int retryButtonPressed = 45;
- static const int abortButtonPressed = 55;
+ enum
+ {
+ BUTTON_CONTINUE,
+ BUTTON_RETRY,
+ BUTTON_ABORT
+ };
private:
void OnClose(wxCloseEvent& event);
@@ -85,10 +94,26 @@ private:
};
+class ModifyFilesDlg : public ModifyFilesDlgGenerated
+{
+public:
+ ModifyFilesDlg(wxWindow* window, const wxString& parentDirectory, const int timeShift);
+ ~ModifyFilesDlg();
+
+private:
+ void OnApply(wxCommandEvent& event);
+ void OnCancel(wxCommandEvent& event);
+ void OnClose(wxCloseEvent& event);
+
+ void OnWriteDirManually(wxCommandEvent& event);
+ void OnDirSelected(wxFileDirPickerEvent& event);
+};
+
+
class SyncStatus : public SyncStatusDlgGenerated
{
public:
- SyncStatus(StatusUpdater* updater, wxWindow* parentWindow = NULL);
+ SyncStatus(StatusHandler* updater, wxWindow* parentWindow = NULL);
~SyncStatus();
enum SyncStatusID
@@ -118,7 +143,7 @@ private:
wxStopWatch timeElapsed;
- StatusUpdater* currentStatusUpdater;
+ StatusHandler* currentStatusHandler;
wxWindow* windowToDis;
bool currentProcessIsRunning;
diff --git a/ui/SyncDialog.cpp b/ui/SyncDialog.cpp
index ad1c1a21..7a1d4602 100644
--- a/ui/SyncDialog.cpp
+++ b/ui/SyncDialog.cpp
@@ -31,11 +31,11 @@ SyncDialog::SyncDialog(wxWindow* window,
//set icons for this dialog
m_bpButton18->SetBitmapLabel(*globalResource.bitmapStartSync);
m_bpButton18->SetBitmapDisabled(*globalResource.bitmapStartSyncDis);
- m_bitmap13->SetBitmap(*globalResource.bitmapLeftOnlyDeact);
- m_bitmap14->SetBitmap(*globalResource.bitmapRightOnlyDeact);
- m_bitmap15->SetBitmap(*globalResource.bitmapLeftNewerDeact);
- m_bitmap16->SetBitmap(*globalResource.bitmapRightNewerDeact);
- m_bitmap17->SetBitmap(*globalResource.bitmapDifferentDeact);
+ m_bitmap13->SetBitmap(*globalResource.bitmapLeftOnly);
+ m_bitmap14->SetBitmap(*globalResource.bitmapRightOnly);
+ m_bitmap15->SetBitmap(*globalResource.bitmapLeftNewer);
+ m_bitmap16->SetBitmap(*globalResource.bitmapRightNewer);
+ m_bitmap17->SetBitmap(*globalResource.bitmapDifferent);
if (synchronizationEnabled)
m_bpButton18->Enable();
@@ -46,18 +46,18 @@ SyncDialog::SyncDialog(wxWindow* window,
}
//set radiobutton
- if (localSyncConfiguration.exLeftSideOnly == SYNC_DIR_RIGHT &&
- localSyncConfiguration.exRightSideOnly == SYNC_DIR_RIGHT &&
- localSyncConfiguration.leftNewer == SYNC_DIR_RIGHT &&
- localSyncConfiguration.rightNewer == SYNC_DIR_RIGHT &&
- localSyncConfiguration.different == SYNC_DIR_RIGHT)
+ if ( localSyncConfiguration.exLeftSideOnly == SyncConfiguration::SYNC_DIR_RIGHT &&
+ localSyncConfiguration.exRightSideOnly == SyncConfiguration::SYNC_DIR_RIGHT &&
+ localSyncConfiguration.leftNewer == SyncConfiguration::SYNC_DIR_RIGHT &&
+ localSyncConfiguration.rightNewer == SyncConfiguration::SYNC_DIR_RIGHT &&
+ localSyncConfiguration.different == SyncConfiguration::SYNC_DIR_RIGHT)
m_radioBtn1->SetValue(true); //one way ->
- else if (localSyncConfiguration.exLeftSideOnly == SYNC_DIR_RIGHT &&
- localSyncConfiguration.exRightSideOnly == SYNC_DIR_LEFT &&
- localSyncConfiguration.leftNewer == SYNC_DIR_RIGHT &&
- localSyncConfiguration.rightNewer == SYNC_DIR_LEFT &&
- localSyncConfiguration.different == SYNC_DIR_NONE)
+ else if (localSyncConfiguration.exLeftSideOnly == SyncConfiguration::SYNC_DIR_RIGHT &&
+ localSyncConfiguration.exRightSideOnly == SyncConfiguration::SYNC_DIR_LEFT &&
+ localSyncConfiguration.leftNewer == SyncConfiguration::SYNC_DIR_RIGHT &&
+ localSyncConfiguration.rightNewer == SyncConfiguration::SYNC_DIR_LEFT &&
+ localSyncConfiguration.different == SyncConfiguration::SYNC_DIR_NONE)
m_radioBtn2->SetValue(true); //two way <->
else
@@ -81,81 +81,81 @@ void SyncDialog::updateConfigIcons(wxBitmapButton* button1,
wxBitmapButton* button5,
const SyncConfiguration& syncConfig)
{
- if (syncConfig.exLeftSideOnly == SYNC_DIR_RIGHT)
+ if (syncConfig.exLeftSideOnly == SyncConfiguration::SYNC_DIR_RIGHT)
{
button1->SetBitmapLabel(*globalResource.bitmapArrowRightCr);
button1->SetToolTip(_("Copy from left to right"));
}
- else if (syncConfig.exLeftSideOnly == SYNC_DIR_LEFT)
+ else if (syncConfig.exLeftSideOnly == SyncConfiguration::SYNC_DIR_LEFT)
{
button1->SetBitmapLabel(*globalResource.bitmapDeleteLeft);
button1->SetToolTip(_("Delete files/folders existing on left side only"));
}
- else if (syncConfig.exLeftSideOnly == SYNC_DIR_NONE)
+ else if (syncConfig.exLeftSideOnly == SyncConfiguration::SYNC_DIR_NONE)
{
button1->SetBitmapLabel(*globalResource.bitmapArrowNone);
button1->SetToolTip(_("Do nothing"));
}
- if (syncConfig.exRightSideOnly == SYNC_DIR_RIGHT)
+ if (syncConfig.exRightSideOnly == SyncConfiguration::SYNC_DIR_RIGHT)
{
button2->SetBitmapLabel(*globalResource.bitmapDeleteRight);
button2->SetToolTip(_("Delete files/folders existing on right side only"));
}
- else if (syncConfig.exRightSideOnly == SYNC_DIR_LEFT)
+ else if (syncConfig.exRightSideOnly == SyncConfiguration::SYNC_DIR_LEFT)
{
button2->SetBitmapLabel(*globalResource.bitmapArrowLeftCr);
button2->SetToolTip(_("Copy from right to left"));
}
- else if (syncConfig.exRightSideOnly == SYNC_DIR_NONE)
+ else if (syncConfig.exRightSideOnly == SyncConfiguration::SYNC_DIR_NONE)
{
button2->SetBitmapLabel(*globalResource.bitmapArrowNone);
button2->SetToolTip(_("Do nothing"));
}
- if (syncConfig.leftNewer == SYNC_DIR_RIGHT)
+ if (syncConfig.leftNewer == SyncConfiguration::SYNC_DIR_RIGHT)
{
button3->SetBitmapLabel(*globalResource.bitmapArrowRight);
button3->SetToolTip(_("Copy from left to right overwriting"));
}
- else if (syncConfig.leftNewer == SYNC_DIR_LEFT)
+ else if (syncConfig.leftNewer == SyncConfiguration::SYNC_DIR_LEFT)
{
button3->SetBitmapLabel(*globalResource.bitmapArrowLeft);
button3->SetToolTip(_("Copy from right to left overwriting"));
}
- else if (syncConfig.leftNewer == SYNC_DIR_NONE)
+ else if (syncConfig.leftNewer == SyncConfiguration::SYNC_DIR_NONE)
{
button3->SetBitmapLabel(*globalResource.bitmapArrowNone);
button3->SetToolTip(_("Do nothing"));
}
- if (syncConfig.rightNewer == SYNC_DIR_RIGHT)
+ if (syncConfig.rightNewer == SyncConfiguration::SYNC_DIR_RIGHT)
{
button4->SetBitmapLabel(*globalResource.bitmapArrowRight);
button4->SetToolTip(_("Copy from left to right overwriting"));
}
- else if (syncConfig.rightNewer == SYNC_DIR_LEFT)
+ else if (syncConfig.rightNewer == SyncConfiguration::SYNC_DIR_LEFT)
{
button4->SetBitmapLabel(*globalResource.bitmapArrowLeft);
button4->SetToolTip(_("Copy from right to left overwriting"));
}
- else if (syncConfig.rightNewer == SYNC_DIR_NONE)
+ else if (syncConfig.rightNewer == SyncConfiguration::SYNC_DIR_NONE)
{
button4->SetBitmapLabel(*globalResource.bitmapArrowNone);
button4->SetToolTip(_("Do nothing"));
}
- if (syncConfig.different == SYNC_DIR_RIGHT)
+ if (syncConfig.different == SyncConfiguration::SYNC_DIR_RIGHT)
{
button5->SetBitmapLabel(*globalResource.bitmapArrowRight);
button5->SetToolTip(_("Copy from left to right overwriting"));
}
- else if (syncConfig.different == SYNC_DIR_LEFT)
+ else if (syncConfig.different == SyncConfiguration::SYNC_DIR_LEFT)
{
button5->SetBitmapLabel(*globalResource.bitmapArrowLeft);
button5->SetToolTip(_("Copy from right to left overwriting"));
}
- else if (syncConfig.different == SYNC_DIR_NONE)
+ else if (syncConfig.different == SyncConfiguration::SYNC_DIR_NONE)
{
button5->SetBitmapLabel(*globalResource.bitmapArrowNone);
button5->SetToolTip(_("Do nothing"));
@@ -257,11 +257,11 @@ void SyncDialog::OnSelectRecycleBin(wxCommandEvent& event)
void SyncDialog::OnSyncLeftToRight(wxCommandEvent& event)
{
- localSyncConfiguration.exLeftSideOnly = SYNC_DIR_RIGHT;
- localSyncConfiguration.exRightSideOnly = SYNC_DIR_RIGHT;
- localSyncConfiguration.leftNewer = SYNC_DIR_RIGHT;
- localSyncConfiguration.rightNewer = SYNC_DIR_RIGHT;
- localSyncConfiguration.different = SYNC_DIR_RIGHT;
+ localSyncConfiguration.exLeftSideOnly = SyncConfiguration::SYNC_DIR_RIGHT;
+ localSyncConfiguration.exRightSideOnly = SyncConfiguration::SYNC_DIR_RIGHT;
+ localSyncConfiguration.leftNewer = SyncConfiguration::SYNC_DIR_RIGHT;
+ localSyncConfiguration.rightNewer = SyncConfiguration::SYNC_DIR_RIGHT;
+ localSyncConfiguration.different = SyncConfiguration::SYNC_DIR_RIGHT;
updateConfigIcons(m_bpButton5, m_bpButton6, m_bpButton7, m_bpButton8, m_bpButton9, localSyncConfiguration);
calculatePreview();
@@ -273,11 +273,11 @@ void SyncDialog::OnSyncLeftToRight(wxCommandEvent& event)
void SyncDialog::OnSyncBothSides(wxCommandEvent& event)
{
- localSyncConfiguration.exLeftSideOnly = SYNC_DIR_RIGHT;
- localSyncConfiguration.exRightSideOnly = SYNC_DIR_LEFT;
- localSyncConfiguration.leftNewer = SYNC_DIR_RIGHT;
- localSyncConfiguration.rightNewer = SYNC_DIR_LEFT;
- localSyncConfiguration.different = SYNC_DIR_NONE;
+ localSyncConfiguration.exLeftSideOnly = SyncConfiguration::SYNC_DIR_RIGHT;
+ localSyncConfiguration.exRightSideOnly = SyncConfiguration::SYNC_DIR_LEFT;
+ localSyncConfiguration.leftNewer = SyncConfiguration::SYNC_DIR_RIGHT;
+ localSyncConfiguration.rightNewer = SyncConfiguration::SYNC_DIR_LEFT;
+ localSyncConfiguration.different = SyncConfiguration::SYNC_DIR_NONE;
updateConfigIcons(m_bpButton5, m_bpButton6, m_bpButton7, m_bpButton8, m_bpButton9, localSyncConfiguration);
calculatePreview();
@@ -287,14 +287,14 @@ void SyncDialog::OnSyncBothSides(wxCommandEvent& event)
}
-void toggleSyncDirection(SyncDirection& current)
+void toggleSyncDirection(SyncConfiguration::Direction& current)
{
- if (current == SYNC_DIR_RIGHT)
- current = SYNC_DIR_LEFT;
- else if (current == SYNC_DIR_LEFT)
- current = SYNC_DIR_NONE;
- else if (current== SYNC_DIR_NONE)
- current = SYNC_DIR_RIGHT;
+ if (current == SyncConfiguration::SYNC_DIR_RIGHT)
+ current = SyncConfiguration::SYNC_DIR_LEFT;
+ else if (current == SyncConfiguration::SYNC_DIR_LEFT)
+ current = SyncConfiguration::SYNC_DIR_NONE;
+ else if (current== SyncConfiguration::SYNC_DIR_NONE)
+ current = SyncConfiguration::SYNC_DIR_RIGHT;
else
assert (false);
}
@@ -403,11 +403,11 @@ BatchDialog::BatchDialog(wxWindow* window,
//set icons for this dialog
- m_bitmap13->SetBitmap(*globalResource.bitmapLeftOnlyDeact);
- m_bitmap14->SetBitmap(*globalResource.bitmapRightOnlyDeact);
- m_bitmap15->SetBitmap(*globalResource.bitmapLeftNewerDeact);
- m_bitmap16->SetBitmap(*globalResource.bitmapRightNewerDeact);
- m_bitmap17->SetBitmap(*globalResource.bitmapDifferentDeact);
+ m_bitmap13->SetBitmap(*globalResource.bitmapLeftOnly);
+ m_bitmap14->SetBitmap(*globalResource.bitmapRightOnly);
+ m_bitmap15->SetBitmap(*globalResource.bitmapLeftNewer);
+ m_bitmap16->SetBitmap(*globalResource.bitmapRightNewer);
+ m_bitmap17->SetBitmap(*globalResource.bitmapDifferent);
m_bitmap8->SetBitmap(*globalResource.bitmapInclude);
m_bitmap9->SetBitmap(*globalResource.bitmapExclude);
@@ -542,31 +542,28 @@ void BatchDialog::OnCreateBatchJob(wxCommandEvent& event)
//create batch file
if (createBatchFile(fileName))
EndModal(batchFileCreated);
- else
- wxMessageBox(wxString(_("Could not create file ")) + wxT("\"") + fileName + wxT("\""), _("Error"), wxOK | wxICON_ERROR);
}
}
bool BatchDialog::createBatchFile(const wxString& filename)
{
- XmlOutput outputFile(filename, XML_BATCH_CONFIG);
+ XmlBatchConfig batchCfg;
//load structure with basic settings "mainCfg"
- XmlMainConfig mainCfg;
if (m_radioBtnSizeDate->GetValue())
- mainCfg.cfg.compareVar = CMP_BY_TIME_SIZE;
+ batchCfg.mainCfg.compareVar = CMP_BY_TIME_SIZE;
else if (m_radioBtnContent->GetValue())
- mainCfg.cfg.compareVar = CMP_BY_CONTENT;
+ batchCfg.mainCfg.compareVar = CMP_BY_CONTENT;
else
return false;
- mainCfg.cfg.syncConfiguration = localSyncConfiguration;
- mainCfg.cfg.filterIsActive = filterIsActive;
- mainCfg.cfg.includeFilter = m_textCtrlInclude->GetValue();
- mainCfg.cfg.excludeFilter = m_textCtrlExclude->GetValue();
- mainCfg.cfg.useRecycleBin = m_checkBoxUseRecycler->GetValue();
- mainCfg.cfg.continueOnError = m_checkBoxContinueError->GetValue();
+ batchCfg.mainCfg.syncConfiguration = localSyncConfiguration;
+ batchCfg.mainCfg.filterIsActive = filterIsActive;
+ batchCfg.mainCfg.includeFilter = m_textCtrlInclude->GetValue();
+ batchCfg.mainCfg.excludeFilter = m_textCtrlExclude->GetValue();
+ batchCfg.mainCfg.useRecycleBin = m_checkBoxUseRecycler->GetValue();
+ batchCfg.mainCfg.continueOnError = m_checkBoxContinueError->GetValue();
for (unsigned int i = 0; i < localFolderPairs.size(); ++i)
{
@@ -574,20 +571,23 @@ bool BatchDialog::createBatchFile(const wxString& filename)
newPair.leftDirectory = localFolderPairs[i]->m_directoryLeft->GetValue();
newPair.rightDirectory = localFolderPairs[i]->m_directoryRight->GetValue();
- mainCfg.directoryPairs.push_back(newPair);
+ batchCfg.directoryPairs.push_back(newPair);
}
//load structure with batch settings "batchCfg"
- XmlBatchConfig batchCfg;
batchCfg.silent = m_checkBoxSilent->GetValue();
- //populate and write XML tree
- if ( !outputFile.writeXmlMainConfig(mainCfg) || //add basic configuration settings
- !outputFile.writeXmlBatchConfig(batchCfg) || //add batch configuration settings
- !outputFile.writeToFile()) //save XML
+ //write config to XML
+ try
+ {
+ xmlAccess::writeBatchConfig(filename, batchCfg);
+ }
+ catch (const FileError& error)
+ {
+ wxMessageBox(error.show(), _("Error"), wxOK | wxICON_ERROR);
return false;
- else
- return true;
+ }
+ return true;
}
diff --git a/ui/guiGenerated.cpp b/ui/guiGenerated.cpp
index 06f82d9f..e78dc2e9 100644
--- a/ui/guiGenerated.cpp
+++ b/ui/guiGenerated.cpp
@@ -17,6 +17,16 @@ GuiGenerated::GuiGenerated( wxWindow* parent, wxWindowID id, const wxString& tit
m_menubar1 = new wxMenuBar( 0 );
m_menu1 = new wxMenu();
+ wxMenuItem* m_menuItem10;
+ m_menuItem10 = new wxMenuItem( m_menu1, wxID_ANY, wxString( _("1. &Compare") ) + wxT('\t') + wxT("ALT-C"), wxEmptyString, wxITEM_NORMAL );
+ m_menu1->Append( m_menuItem10 );
+
+ wxMenuItem* m_menuItem11;
+ 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_menuItem4;
m_menuItem4 = new wxMenuItem( m_menu1, wxID_EXIT, wxString( _("&Quit") ) + wxT('\t') + wxT("CTRL-Q"), wxEmptyString, wxITEM_NORMAL );
m_menu1->Append( m_menuItem4 );
@@ -24,20 +34,19 @@ GuiGenerated::GuiGenerated( wxWindow* parent, wxWindowID id, const wxString& tit
m_menubar1->Append( m_menu1, _("&File") );
m_menu3 = new wxMenu();
- wxMenuItem* m_menuItem5;
- m_menuItem5 = new wxMenuItem( m_menu3, wxID_ANY, wxString( _("&Export file list") ) , wxEmptyString, wxITEM_NORMAL );
- m_menu3->Append( m_menuItem5 );
-
m_menu31 = new wxMenu();
- m_menuItemEnglish = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("English") ) , wxEmptyString, wxITEM_RADIO );
- m_menu31->Append( m_menuItemEnglish );
-
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_menuItemDutch = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("Nederlands") ) , wxEmptyString, wxITEM_RADIO );
+ m_menu31->Append( m_menuItemDutch );
+
m_menuItemJapanese = new wxMenuItem( m_menu31, wxID_ANY, wxString( _("日本語") ) , wxEmptyString, wxITEM_RADIO );
m_menu31->Append( m_menuItemJapanese );
@@ -45,10 +54,18 @@ GuiGenerated::GuiGenerated( wxWindow* parent, wxWindowID id, const wxString& tit
m_menu3->AppendSeparator();
+ wxMenuItem* m_menuItem9;
+ m_menuItem9 = new wxMenuItem( m_menu3, wxID_ANY, wxString( _("&Adjust file times") ) , wxEmptyString, wxITEM_NORMAL );
+ m_menu3->Append( m_menuItem9 );
+
wxMenuItem* m_menuItem7;
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();
@@ -101,7 +118,7 @@ GuiGenerated::GuiGenerated( wxWindow* parent, wxWindowID id, const wxString& tit
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 (UTC) and date\nare the same.") );
+ 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 );
@@ -420,45 +437,21 @@ GuiGenerated::GuiGenerated( wxWindow* parent, wxWindowID id, const wxString& tit
sbSizer31->Add( 0, 0, 1, wxEXPAND, 5 );
m_bpButtonLeftOnly = new wxBitmapButton( m_panel12, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- m_bpButtonLeftOnly->SetToolTip( _("Show files that exist on left side only") );
-
- m_bpButtonLeftOnly->SetToolTip( _("Show files that exist on left side only") );
-
sbSizer31->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_bpButtonLeftNewer = new wxBitmapButton( m_panel12, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- m_bpButtonLeftNewer->SetToolTip( _("Show files that are newer on left") );
-
- m_bpButtonLeftNewer->SetToolTip( _("Show files that are newer on left") );
-
sbSizer31->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_bpButtonEqual = new wxBitmapButton( m_panel12, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- m_bpButtonEqual->SetToolTip( _("Show files that are equal") );
-
- m_bpButtonEqual->SetToolTip( _("Show files that are equal") );
-
sbSizer31->Add( m_bpButtonEqual, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_bpButtonDifferent = new wxBitmapButton( m_panel12, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- m_bpButtonDifferent->SetToolTip( _("Show files that are different") );
-
- m_bpButtonDifferent->SetToolTip( _("Show files that are different") );
-
sbSizer31->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_bpButtonRightNewer = new wxBitmapButton( m_panel12, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- m_bpButtonRightNewer->SetToolTip( _("Show files that are newer on right") );
-
- m_bpButtonRightNewer->SetToolTip( _("Show files that are newer on right") );
-
sbSizer31->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_bpButtonRightOnly = new wxBitmapButton( m_panel12, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- m_bpButtonRightOnly->SetToolTip( _("Show files that exist on right side only") );
-
- m_bpButtonRightOnly->SetToolTip( _("Show files that exist on right side only") );
-
sbSizer31->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_VERTICAL, 5 );
@@ -557,13 +550,17 @@ GuiGenerated::GuiGenerated( wxWindow* parent, wxWindowID id, const wxString& tit
// Connect Events
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GuiGenerated::OnClose ) );
+ this->Connect( m_menuItem10->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnCompare ) );
+ this->Connect( m_menuItem11->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnSync ) );
this->Connect( m_menuItem4->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuQuit ) );
- this->Connect( m_menuItem5->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuExportFileList ) );
- this->Connect( m_menuItemEnglish->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangEnglish ) );
this->Connect( m_menuItemGerman->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangGerman ) );
+ this->Connect( m_menuItemEnglish->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangEnglish ) );
this->Connect( m_menuItemFrench->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangFrench ) );
+ this->Connect( m_menuItemDutch->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangDutch ) );
this->Connect( m_menuItemJapanese->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangJapanese ) );
+ this->Connect( m_menuItem9->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuAdjustFileTimes ) );
this->Connect( m_menuItem7->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuBatchJob ) );
+ this->Connect( m_menuItem5->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuExportFileList ) );
this->Connect( m_menuItem3->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuAbout ) );
m_bpButtonCompare->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnCompare ), NULL, this );
m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnAbortCompare ), NULL, this );
@@ -604,13 +601,17 @@ GuiGenerated::~GuiGenerated()
{
// Disconnect Events
this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GuiGenerated::OnClose ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnCompare ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnSync ) );
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuQuit ) );
- this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuExportFileList ) );
- this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangEnglish ) );
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangGerman ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangEnglish ) );
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangFrench ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangDutch ) );
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuLangJapanese ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuAdjustFileTimes ) );
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuBatchJob ) );
+ this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuExportFileList ) );
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( GuiGenerated::OnMenuAbout ) );
m_bpButtonCompare->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnCompare ), NULL, this );
m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GuiGenerated::OnAbortCompare ), NULL, this );
@@ -737,7 +738,7 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
m_staticText54->Wrap( 380 );
m_staticText54->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxT("Tahoma") ) );
- bSizer69->Add( m_staticText54, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizer69->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
bSizer69->Add( 0, 5, 0, 0, 5 );
@@ -777,7 +778,7 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
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 (UTC) and date\nare the same.") );
+ 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 );
@@ -975,7 +976,7 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizer69->Add( bSizer68, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
- bSizer54->Add( bSizer69, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizer54->Add( bSizer69, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
this->SetSizer( bSizer54 );
this->Layout();
@@ -1705,7 +1706,7 @@ HelpDlgGenerated::HelpDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr
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 );
+ bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxALIGN_CENTER_VERTICAL, 5 );
bSizer72->Add( 20, 0, 0, 0, 5 );
@@ -1922,7 +1923,7 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
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,70 ) );
+ m_scrolledWindow3->SetMinSize( wxSize( -1,90 ) );
m_scrolledWindow3->SetMaxSize( wxSize( -1,100 ) );
wxBoxSizer* bSizer72;
@@ -1941,19 +1942,27 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
m_staticText68 = new wxStaticText( m_scrolledWindow3, wxID_ANY, _("Jean-François Hartmann"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText68->Wrap( -1 );
- fgSizer9->Add( m_staticText68, 0, 0, 5 );
+ 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, 0, 5 );
+ 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, 0, 5 );
+ 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, 0, 5 );
+ 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 );
bSizer72->Add( fgSizer9, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM, 5 );
@@ -2108,12 +2117,12 @@ ErrorDlgGenerated::ErrorDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizer25 = new wxBoxSizer( wxHORIZONTAL );
m_buttonContinue = new wxButton( this, wxID_OK, _("&Continue"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_buttonContinue->SetDefault();
m_buttonContinue->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) );
bSizer25->Add( m_buttonContinue, 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 );
@@ -2271,9 +2280,21 @@ FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizer52->Add( m_staticText45, 0, wxBOTTOM, 5 );
- m_staticText18 = new wxStaticText( m_panel13, wxID_ANY, _("1. Enter full file or directory names separated by ';' or a new line.\n2. Use wildcard characters '*' and '?'."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText18->Wrap( -1 );
- bSizer52->Add( m_staticText18, 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 );
@@ -2399,3 +2420,115 @@ FilterDlgGenerated::~FilterDlgGenerated()
m_button17->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this );
m_button10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnOK ), NULL, this );
}
+
+ModifyFilesDlgGenerated::ModifyFilesDlgGenerated( 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* bSizer80;
+ bSizer80 = new wxBoxSizer( wxVERTICAL );
+
+ 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 );
+
+
+ bSizer72->Add( 20, 0, 0, 0, 5 );
+
+ m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Adjust file times"), 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|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ bSizer72->Add( 20, 0, 0, 0, 5 );
+
+ m_panel8->SetSizer( bSizer72 );
+ m_panel8->Layout();
+ bSizer72->Fit( m_panel8 );
+ bSizer80->Add( m_panel8, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer80->Add( 0, 5, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer84;
+ bSizer84 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer84->Add( 10, 0, 0, wxEXPAND, 5 );
+
+ m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("Adjust modification times of all files contained in the specified folder and its subfolders. This manual adaption might become necessary if you are synchronizing against a FAT32 drive and the daylight saving time is switched. For an overview about the issue see this article:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextHeader->Wrap( 400 );
+ m_staticTextHeader->SetFont( wxFont( 8, 74, 90, 90, false, wxT("Tahoma") ) );
+
+ bSizer84->Add( m_staticTextHeader, 0, wxALL, 5 );
+
+
+ bSizer84->Add( 10, 0, 0, wxEXPAND, 5 );
+
+ bSizer80->Add( bSizer84, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_hyperlink6 = new wxHyperlinkCtrl( this, wxID_ANY, _("http://www.codeproject.com/KB/datetime/dstbugs.aspx"), wxT("http://www.codeproject.com/KB/datetime/dstbugs.aspx"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer80->Add( m_hyperlink6, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer80->Add( 0, 5, 0, wxEXPAND, 5 );
+
+ wxStaticBoxSizer* sbSizer24;
+ sbSizer24 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Select folder") ), wxHORIZONTAL );
+
+ m_textCtrlDirectory = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ sbSizer24->Add( m_textCtrlDirectory, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
+
+ m_dirPicker = new wxDirPickerCtrl( this, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DIR_MUST_EXIST );
+ sbSizer24->Add( m_dirPicker, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ bSizer80->Add( sbSizer24, 0, wxEXPAND|wxALL, 5 );
+
+ wxStaticBoxSizer* sbSizer23;
+ sbSizer23 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Time shift in seconds") ), wxVERTICAL );
+
+ m_spinCtrlTimeShift = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, -2100000000, 2100000000, 0 );
+ sbSizer23->Add( m_spinCtrlTimeShift, 0, wxRIGHT|wxLEFT, 5 );
+
+ bSizer80->Add( sbSizer23, 0, wxALL|wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer83;
+ bSizer83 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_button21 = new wxButton( this, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_button21->SetFont( wxFont( 10, 74, 90, 90, false, wxT("Tahoma") ) );
+
+ bSizer83->Add( m_button21, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_buttonApply = new wxButton( this, wxID_ANY, _("Apply"), wxDefaultPosition, wxSize( -1,35 ), 0 );
+ m_buttonApply->SetFont( wxFont( 10, 74, 90, 92, false, wxT("Tahoma") ) );
+
+ bSizer83->Add( m_buttonApply, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizer80->Add( bSizer83, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ this->SetSizer( bSizer80 );
+ this->Layout();
+ bSizer80->Fit( this );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ModifyFilesDlgGenerated::OnClose ) );
+ m_textCtrlDirectory->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( ModifyFilesDlgGenerated::OnWriteDirManually ), NULL, this );
+ m_dirPicker->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( ModifyFilesDlgGenerated::OnDirSelected ), NULL, this );
+ m_button21->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ModifyFilesDlgGenerated::OnCancel ), NULL, this );
+ m_buttonApply->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ModifyFilesDlgGenerated::OnApply ), NULL, this );
+}
+
+ModifyFilesDlgGenerated::~ModifyFilesDlgGenerated()
+{
+ // Disconnect Events
+ this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ModifyFilesDlgGenerated::OnClose ) );
+ m_textCtrlDirectory->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( ModifyFilesDlgGenerated::OnWriteDirManually ), NULL, this );
+ m_dirPicker->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( ModifyFilesDlgGenerated::OnDirSelected ), NULL, this );
+ m_button21->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ModifyFilesDlgGenerated::OnCancel ), NULL, this );
+ m_buttonApply->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ModifyFilesDlgGenerated::OnApply ), NULL, this );
+}
diff --git a/ui/guiGenerated.h b/ui/guiGenerated.h
index 7df68fd7..81875ec6 100644
--- a/ui/guiGenerated.h
+++ b/ui/guiGenerated.h
@@ -43,6 +43,7 @@ class CustomGrid;
#include <wx/animate.h>
#include <wx/treectrl.h>
#include <wx/notebook.h>
+#include <wx/spinctrl.h>
///////////////////////////////////////////////////////////////////////////
@@ -59,9 +60,10 @@ protected:
wxMenu* m_menu1;
wxMenu* m_menu3;
wxMenu* m_menu31;
- wxMenuItem* m_menuItemEnglish;
wxMenuItem* m_menuItemGerman;
+ wxMenuItem* m_menuItemEnglish;
wxMenuItem* m_menuItemFrench;
+ wxMenuItem* m_menuItemDutch;
wxMenuItem* m_menuItemJapanese;
wxMenu* m_menu2;
wxBoxSizer* bSizer1;
@@ -134,15 +136,15 @@ protected:
{
event.Skip();
}
- virtual void OnMenuQuit( wxCommandEvent& event )
+ virtual void OnCompare( wxCommandEvent& event )
{
event.Skip();
}
- virtual void OnMenuExportFileList( wxCommandEvent& event )
+ virtual void OnSync( wxCommandEvent& event )
{
event.Skip();
}
- virtual void OnMenuLangEnglish( wxCommandEvent& event )
+ virtual void OnMenuQuit( wxCommandEvent& event )
{
event.Skip();
}
@@ -150,23 +152,35 @@ protected:
{
event.Skip();
}
+ virtual void OnMenuLangEnglish( wxCommandEvent& event )
+ {
+ event.Skip();
+ }
virtual void OnMenuLangFrench( wxCommandEvent& event )
{
event.Skip();
}
+ virtual void OnMenuLangDutch( wxCommandEvent& event )
+ {
+ event.Skip();
+ }
virtual void OnMenuLangJapanese( wxCommandEvent& event )
{
event.Skip();
}
+ virtual void OnMenuAdjustFileTimes( wxCommandEvent& event )
+ {
+ event.Skip();
+ }
virtual void OnMenuBatchJob( wxCommandEvent& event )
{
event.Skip();
}
- virtual void OnMenuAbout( wxCommandEvent& event )
+ virtual void OnMenuExportFileList( wxCommandEvent& event )
{
event.Skip();
}
- virtual void OnCompare( wxCommandEvent& event )
+ virtual void OnMenuAbout( wxCommandEvent& event )
{
event.Skip();
}
@@ -198,10 +212,6 @@ protected:
{
event.Skip();
}
- virtual void OnSync( wxCommandEvent& event )
- {
- event.Skip();
- }
virtual void OnWriteDirManually( wxCommandEvent& event )
{
event.Skip();
@@ -730,6 +740,8 @@ protected:
wxStaticText* m_staticText69;
wxStaticText* m_staticText70;
wxStaticText* m_staticText71;
+ wxStaticText* m_staticText711;
+ wxStaticText* m_staticText712;
wxStaticLine* m_staticline3;
wxStaticText* m_staticText131;
wxStaticBitmap* m_bitmap9;
@@ -862,7 +874,10 @@ protected:
wxPanel* m_panel13;
wxStaticLine* m_staticline10;
wxStaticText* m_staticText45;
- wxStaticText* m_staticText18;
+ wxStaticText* m_staticText83;
+ wxStaticText* m_staticText84;
+ wxStaticText* m_staticText85;
+ wxStaticText* m_staticText86;
wxStaticText* m_staticText181;
wxStaticText* m_staticText1811;
@@ -908,4 +923,57 @@ public:
};
+///////////////////////////////////////////////////////////////////////////////
+/// Class ModifyFilesDlgGenerated
+///////////////////////////////////////////////////////////////////////////////
+class ModifyFilesDlgGenerated : public wxDialog
+{
+private:
+
+protected:
+ wxPanel* m_panel8;
+
+ wxStaticText* m_staticText56;
+
+
+
+ wxStaticText* m_staticTextHeader;
+
+ wxHyperlinkCtrl* m_hyperlink6;
+
+ wxTextCtrl* m_textCtrlDirectory;
+ wxDirPickerCtrl* m_dirPicker;
+ wxSpinCtrl* m_spinCtrlTimeShift;
+ wxButton* m_button21;
+ wxButton* m_buttonApply;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event )
+ {
+ event.Skip();
+ }
+ virtual void OnWriteDirManually( wxCommandEvent& event )
+ {
+ event.Skip();
+ }
+ virtual void OnDirSelected( wxFileDirPickerEvent& event )
+ {
+ event.Skip();
+ }
+ virtual void OnCancel( wxCommandEvent& event )
+ {
+ event.Skip();
+ }
+ virtual void OnApply( wxCommandEvent& event )
+ {
+ event.Skip();
+ }
+
+
+public:
+ ModifyFilesDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~ModifyFilesDlgGenerated();
+
+};
+
#endif //__guiGenerated__
bgstack15