summaryrefslogtreecommitdiff
path: root/ui/settingsDialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ui/settingsDialog.cpp')
-rw-r--r--ui/settingsDialog.cpp248
1 files changed, 174 insertions, 74 deletions
diff --git a/ui/settingsDialog.cpp b/ui/settingsDialog.cpp
index 90437453..230d187d 100644
--- a/ui/settingsDialog.cpp
+++ b/ui/settingsDialog.cpp
@@ -489,48 +489,14 @@ void SyncCfgDialog::OnConflict(wxCommandEvent& event)
toggleSyncDirection(localSyncConfiguration.conflict);
updateConfigIcons(cmpVariant, localSyncConfiguration);
}
-//###################################################################################################################################
-
-
-typedef FreeFileSync::FolderPairPanelBasic<BatchFolderPairGenerated> FolderPairParent;
-
-class BatchFolderPairPanel : public FolderPairParent
-{
-public:
- BatchFolderPairPanel(wxWindow* parent, BatchDialog* batchDialog) :
- FolderPairParent(parent),
- batchDlg(batchDialog) {}
-
-private:
- virtual wxWindow* getParentWindow()
- {
- return batchDlg;
- }
- virtual MainConfiguration getMainConfig() const
- {
- return batchDlg->getCurrentConfiguration().mainCfg;
- }
-
- virtual void OnAltFilterCfgChange(bool defaultValueSet)
- {
- if (!defaultValueSet)
- {
- //activate filter
- batchDlg->m_checkBoxFilter->SetValue(true);
- batchDlg->updateVisibleTabs();
- }
- }
- BatchDialog* batchDlg;
-};
//###################################################################################################################################
-
class BatchFileDropEvent : public wxFileDropTarget
{
public:
- BatchFileDropEvent(BatchDialog* dlg) :
+ BatchFileDropEvent(BatchDialog& dlg) :
batchDlg(dlg) {}
virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames)
@@ -543,7 +509,7 @@ public:
//test if ffs batch file has been dropped
if (fileType == xmlAccess::XML_BATCH_CONFIG)
- batchDlg->loadBatchFile(droppedFileName);
+ batchDlg.loadBatchFile(droppedFileName);
else
{
wxString errorMessage = _("%x is not a valid FreeFileSync batch file!");
@@ -555,10 +521,89 @@ public:
}
private:
- BatchDialog* batchDlg;
+ BatchDialog& batchDlg;
+};
+
+//###################################################################################################################################
+
+//------------------------------------------------------------------
+/* class hierarchy:
+
+ template<>
+ FolderPairPanelBasic
+ /|\
+ |
+ template<>
+ FolderPairCallback BatchFolderPairGenerated
+ /|\ /|\
+ _________|______________ ________|
+ | | |
+ FirstBatchFolderPairCfg BatchFolderPairPanel
+*/
+
+template <class GuiPanel>
+class FolderPairCallback : public FolderPairPanelBasic<GuiPanel> //implements callback functionality to BatchDialog as imposed by FolderPairPanelBasic
+{
+public:
+ FolderPairCallback(GuiPanel& basicPanel, BatchDialog& batchDialog) :
+ FolderPairPanelBasic<GuiPanel>(basicPanel), //pass FolderPairGenerated part...
+ batchDlg(batchDialog) {}
+
+private:
+ virtual wxWindow* getParentWindow()
+ {
+ return &batchDlg;
+ }
+
+ virtual MainConfiguration getMainConfig() const
+ {
+ return batchDlg.getCurrentConfiguration().mainCfg;
+ }
+
+ BatchDialog& batchDlg;
+};
+
+
+class BatchFolderPairPanel :
+ public BatchFolderPairGenerated, //BatchFolderPairPanel "owns" BatchFolderPairGenerated!
+ public FolderPairCallback<BatchFolderPairGenerated>
+{
+public:
+ BatchFolderPairPanel(wxWindow* parent, BatchDialog& batchDialog) :
+ BatchFolderPairGenerated(parent),
+ FolderPairCallback<BatchFolderPairGenerated>(static_cast<BatchFolderPairGenerated&>(*this), batchDialog), //pass BatchFolderPairGenerated part...
+ dragDropOnLeft( m_panelLeft, m_dirPickerLeft, m_directoryLeft),
+ dragDropOnRight(m_panelRight, m_dirPickerRight, m_directoryRight) {}
+
+private:
+ //support for drag and drop
+ DragDropOnDlg dragDropOnLeft;
+ DragDropOnDlg dragDropOnRight;
};
+class FirstBatchFolderPairCfg : public FolderPairCallback<BatchDlgGenerated>
+{
+public:
+ FirstBatchFolderPairCfg(BatchDialog& batchDialog) :
+ FolderPairCallback<BatchDlgGenerated>(batchDialog, batchDialog),
+
+ //prepare drag & drop
+ dragDropOnLeft(batchDialog.m_panelLeft,
+ batchDialog.m_dirPickerLeft,
+ batchDialog.m_directoryLeft),
+ dragDropOnRight(batchDialog.m_panelRight,
+ batchDialog.m_dirPickerRight,
+ batchDialog.m_directoryRight) {}
+
+private:
+ //support for drag and drop
+ DragDropOnDlg dragDropOnLeft;
+ DragDropOnDlg dragDropOnRight;
+};
+
+
+//###################################################################################################################################
BatchDialog::BatchDialog(wxWindow* window, const xmlAccess::XmlBatchConfig& batchCfg) :
BatchDlgGenerated(window)
{
@@ -577,14 +622,17 @@ BatchDialog::BatchDialog(wxWindow* window, const wxString& filename) :
void BatchDialog::init()
{
+ wxWindowUpdateLocker dummy(this); //avoid display distortion
+
+ //init handling of first folder pair
+ firstFolderPair.reset(new FirstBatchFolderPairCfg(*this));
+
+
//prepare drag & drop for loading of *.ffs_batch files
- SetDropTarget(new BatchFileDropEvent(this));
+ SetDropTarget(new BatchFileDropEvent(*this));
dragDropOnLogfileDir.reset(new DragDropOnDlg(m_panelLogging, m_dirPickerLogfileDir, m_textCtrlLogfileDir));
- //support for drag and drop on main pair
- dragDropOnLeft.reset( new DragDropOnDlg(m_panelLeft, m_dirPickerLeft, m_directoryLeft));
- dragDropOnRight.reset(new DragDropOnDlg(m_panelRight, m_dirPickerRight, m_directoryRight));
-
+ //support for drag and drop: user-defined deletion directory
dragDropCustomDelFolder.reset(new DragDropOnDlg(m_panelCustomDeletionDir, m_dirPickerCustomDelFolder, m_textCtrlCustomDelFolder));
@@ -769,6 +817,16 @@ void BatchDialog::OnConflict(wxCommandEvent& event)
void BatchDialog::OnCheckFilter(wxCommandEvent& event)
{
updateVisibleTabs();
+
+ //update main local filter
+ firstFolderPair->refreshButtons();
+
+ //update folder pairs
+ for (std::vector<BatchFolderPairPanel*>::const_iterator i = additionalFolderPairs.begin(); i != additionalFolderPairs.end(); ++i)
+ {
+ BatchFolderPairPanel* dirPair = *i;
+ dirPair->refreshButtons();
+ }
}
@@ -798,7 +856,7 @@ void BatchDialog::OnCheckSilent(wxCommandEvent& event)
void BatchDialog::updateVisibleTabs()
{
- showNotebookpage(m_panelFilter, _("Filter"), m_checkBoxFilter->GetValue());
+ showNotebookpage(m_panelFilter, _("Filter"), m_checkBoxFilter->GetValue());
showNotebookpage(m_panelLogging, _("Logging"), m_checkBoxSilent->GetValue());
}
@@ -936,8 +994,8 @@ void BatchDialog::OnLoadBatchJob(wxCommandEvent& event)
inline
FolderPairEnh getEnahncedPair(const BatchFolderPairPanel* panel)
{
- return FolderPairEnh(wxToZ(panel->m_directoryLeft->GetValue()),
- wxToZ(panel->m_directoryRight->GetValue()),
+ return FolderPairEnh(panel->getLeftDir(),
+ panel->getRightDir(),
panel->getAltSyncConfig(),
panel->getAltFilterConfig());
}
@@ -956,9 +1014,11 @@ xmlAccess::XmlBatchConfig BatchDialog::getCurrentConfiguration() const
batchCfg.mainCfg.handleDeletion = getDeletionHandling();
batchCfg.mainCfg.customDeletionDirectory = m_textCtrlCustomDelFolder->GetValue();
- //main pair
- batchCfg.mainCfg.mainFolderPair.leftDirectory = wxToZ(m_directoryLeft->GetValue());
- batchCfg.mainCfg.mainFolderPair.rightDirectory = wxToZ(m_directoryRight->GetValue());
+ //first folder pair
+ batchCfg.mainCfg.firstPair = FolderPairEnh(firstFolderPair->getLeftDir(),
+ firstFolderPair->getRightDir(),
+ firstFolderPair->getAltSyncConfig(),
+ firstFolderPair->getAltFilterConfig());
//add additional pairs
batchCfg.mainCfg.additionalPairs.clear();
@@ -1053,10 +1113,11 @@ void BatchDialog::loadBatchCfg(const xmlAccess::XmlBatchConfig& batchCfg)
//error handling is dependent from m_checkBoxSilent! /|\ \|/
setSelectionHandleError(batchCfg.handleError);
-
- //set main folder pair
- FreeFileSync::setDirectoryName(zToWx(batchCfg.mainCfg.mainFolderPair.leftDirectory), m_directoryLeft, m_dirPickerLeft);
- FreeFileSync::setDirectoryName(zToWx(batchCfg.mainCfg.mainFolderPair.rightDirectory), m_directoryRight, m_dirPickerRight);
+ //set first folder pair
+ firstFolderPair->setValues(batchCfg.mainCfg.firstPair.leftDirectory,
+ batchCfg.mainCfg.firstPair.rightDirectory,
+ batchCfg.mainCfg.firstPair.altSyncConfig,
+ batchCfg.mainCfg.firstPair.localFilter);
//remove existing additional folder pairs
clearAddFolderPairs();
@@ -1074,14 +1135,19 @@ void BatchDialog::loadBatchCfg(const xmlAccess::XmlBatchConfig& batchCfg)
void BatchDialog::OnAddFolderPair(wxCommandEvent& event)
{
+ wxWindowUpdateLocker dummy(this); //avoid display distortion
+
std::vector<FolderPairEnh> newPairs;
- newPairs.push_back(
- FolderPairEnh(Zstring(),
- Zstring(),
- boost::shared_ptr<AlternateSyncConfig>(),
- boost::shared_ptr<AlternateFilter>()));
+ newPairs.push_back(getCurrentConfiguration().mainCfg.firstPair);
+
+ addFolderPair(newPairs, true); //add pair in front of additonal pairs
- addFolderPair(newPairs, false); //add pair at the end of additional pairs
+ //clear first pair
+ const FolderPairEnh cfgEmpty;
+ firstFolderPair->setValues(cfgEmpty.leftDirectory,
+ cfgEmpty.rightDirectory,
+ cfgEmpty.altSyncConfig,
+ cfgEmpty.localFilter);
}
@@ -1104,13 +1170,16 @@ void BatchDialog::OnRemoveTopFolderPair(wxCommandEvent& event)
{
if (additionalFolderPairs.size() > 0)
{
- const wxString leftDir = (*additionalFolderPairs.begin())->m_directoryLeft ->GetValue().c_str();
- const wxString rightDir = (*additionalFolderPairs.begin())->m_directoryRight->GetValue().c_str();
+ //get settings from second folder pair
+ const FolderPairEnh cfgSecond = getEnahncedPair(additionalFolderPairs[0]);
- FreeFileSync::setDirectoryName(leftDir, m_directoryLeft, m_dirPickerLeft);
- FreeFileSync::setDirectoryName(rightDir, m_directoryRight, m_dirPickerRight);
+ //reset first pair
+ firstFolderPair->setValues(cfgSecond.leftDirectory,
+ cfgSecond.rightDirectory,
+ cfgSecond.altSyncConfig,
+ cfgSecond.localFilter);
- removeAddFolderPair(0); //remove first of additional folder pairs
+ removeAddFolderPair(0); //remove second folder pair (first of additional folder pairs)
}
}
@@ -1118,18 +1187,45 @@ void BatchDialog::OnRemoveTopFolderPair(wxCommandEvent& event)
const size_t MAX_FOLDER_PAIRS = 3;
-void BatchDialog::addFolderPair(const std::vector<FreeFileSync::FolderPairEnh>& newPairs, bool addFront)
+void BatchDialog::updateGuiForFolderPair()
{
- if (newPairs.size() == 0)
- return;
+ //adapt delete top folder pair button
+ if (additionalFolderPairs.size() == 0)
+ m_bpButtonRemovePair->Hide();
+ else
+ m_bpButtonRemovePair->Show();
+
+ //adapt local filter and sync cfg for first folder pair
+ if ( additionalFolderPairs.size() == 0 &&
+ firstFolderPair->getAltSyncConfig().get() == NULL &&
+ NameFilter(firstFolderPair->getAltFilterConfig().includeFilter,
+ firstFolderPair->getAltFilterConfig().excludeFilter).isNull())
+ {
+ m_bpButtonLocalFilter->Hide();
+ m_bpButtonAltSyncCfg->Hide();
+ }
+ else
+ {
+ m_bpButtonLocalFilter->Show();
+ m_bpButtonAltSyncCfg->Show();
+ }
+
+ m_scrolledWindow6->Fit(); //adjust scrolled window size
+ m_panelOverview->Layout(); //adjust stuff inside scrolled window
+}
+
+void BatchDialog::addFolderPair(const std::vector<FreeFileSync::FolderPairEnh>& newPairs, bool addFront)
+{
wxWindowUpdateLocker dummy(m_panelOverview); //avoid display distortion
+ if (!newPairs.empty())
+{
//add folder pairs
int pairHeight = 0;
for (std::vector<FreeFileSync::FolderPairEnh>::const_iterator i = newPairs.begin(); i != newPairs.end(); ++i)
{
- BatchFolderPairPanel* newPair = new BatchFolderPairPanel(m_scrolledWindow6, this);
+ BatchFolderPairPanel* newPair = new BatchFolderPairPanel(m_scrolledWindow6, *this);
if (addFront)
{
@@ -1148,12 +1244,11 @@ void BatchDialog::addFolderPair(const std::vector<FreeFileSync::FolderPairEnh>&
//register events
newPair->m_bpButtonRemovePair->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(BatchDialog::OnRemoveFolderPair), NULL, this );
- //insert directory names
- FreeFileSync::setDirectoryName(zToWx(i->leftDirectory), newPair->m_directoryLeft, newPair->m_dirPickerLeft);
- FreeFileSync::setDirectoryName(zToWx(i->rightDirectory), newPair->m_directoryRight, newPair->m_dirPickerRight);
-
//set alternate configuration
- newPair->setValues(i->altSyncConfig, i->altFilter);
+ newPair->setValues(i->leftDirectory,
+ i->rightDirectory,
+ i->altSyncConfig,
+ i->localFilter);
}
//set size of scrolled window
const int visiblePairs = std::min(additionalFolderPairs.size() + 1, MAX_FOLDER_PAIRS); //up to MAX_FOLDER_PAIRS pairs shall be shown
@@ -1168,13 +1263,16 @@ void BatchDialog::addFolderPair(const std::vector<FreeFileSync::FolderPairEnh>&
m_bpButtonLeftOnly->SetFocus();
}
+ updateGuiForFolderPair();
+}
+
void BatchDialog::removeAddFolderPair(const int pos)
{
- if (0 <= pos && pos < static_cast<int>(additionalFolderPairs.size()))
- {
wxWindowUpdateLocker dummy(m_panelOverview); //avoid display distortion
+ if (0 <= pos && pos < static_cast<int>(additionalFolderPairs.size()))
+ {
//remove folder pairs from window
BatchFolderPairPanel* pairToDelete = additionalFolderPairs[pos];
const int pairHeight = pairToDelete->GetSize().GetHeight();
@@ -1197,6 +1295,8 @@ void BatchDialog::removeAddFolderPair(const int pos)
//after changing folder pairs window focus is lost: results in scrolled window scrolling to top each time window is shown: we don't want this
m_bpButtonLeftOnly->SetFocus();
}
+
+ updateGuiForFolderPair();
}
bgstack15