diff options
author | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:08:06 +0200 |
---|---|---|
committer | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:08:06 +0200 |
commit | fbe76102e941b9f1edaf236788e42678f05fdf9a (patch) | |
tree | f5f538316019fa89be8dc478103490c3a826f3ac /ui/small_dlgs.cpp | |
parent | 3.8 (diff) | |
download | FreeFileSync-fbe76102e941b9f1edaf236788e42678f05fdf9a.tar.gz FreeFileSync-fbe76102e941b9f1edaf236788e42678f05fdf9a.tar.bz2 FreeFileSync-fbe76102e941b9f1edaf236788e42678f05fdf9a.zip |
3.9
Diffstat (limited to 'ui/small_dlgs.cpp')
-rw-r--r-- | ui/small_dlgs.cpp | 1028 |
1 files changed, 1028 insertions, 0 deletions
diff --git a/ui/small_dlgs.cpp b/ui/small_dlgs.cpp new file mode 100644 index 00000000..785dd793 --- /dev/null +++ b/ui/small_dlgs.cpp @@ -0,0 +1,1028 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2010 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** +// +#include "gui_generated.h" +#include "small_dlgs.h" +#include "msg_popup.h" +#include "../library/resources.h" +#include "../algorithm.h" +#include "../shared/string_conv.h" +#include "../shared/util.h" +#include "../synchronization.h" +#include "../library/custom_grid.h" +#include "../shared/custom_button.h" +#include "../shared/localization.h" +#include "../shared/global_func.h" +#include "../shared/build_info.h" +#include <wx/wupdlock.h> +#include <wx/msgdlg.h> + +using namespace ffs3; + + +class AboutDlg : public AboutDlgGenerated +{ +public: + AboutDlg(wxWindow* window); + +private: + void OnClose(wxCloseEvent& event); + void OnOK(wxCommandEvent& event); +}; + + +AboutDlg::AboutDlg(wxWindow* window) : AboutDlgGenerated(window) +{ + m_bitmap9->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("website"))); + m_bitmap10->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("email"))); + m_bitmap11->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("logo"))); + m_bitmap13->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("gpl"))); + + //create language credits + for (std::vector<LocInfoLine>::const_iterator i = LocalizationInfo::getMapping().begin(); i != LocalizationInfo::getMapping().end(); ++i) + { + //flag + wxStaticBitmap* staticBitmapFlag = new wxStaticBitmap(m_scrolledWindowTranslators, wxID_ANY, GlobalResources::getInstance().getImageByName(i->languageFlag), wxDefaultPosition, wxSize(-1,11), 0 ); + fgSizerTranslators->Add(staticBitmapFlag, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + //language name + wxStaticText* staticTextLanguage = new wxStaticText(m_scrolledWindowTranslators, wxID_ANY, i->languageName, wxDefaultPosition, wxDefaultSize, 0 ); + staticTextLanguage->Wrap( -1 ); + fgSizerTranslators->Add(staticTextLanguage, 0, wxALIGN_CENTER_VERTICAL, 5); + + //translator name + wxStaticText* staticTextTranslator = new wxStaticText(m_scrolledWindowTranslators, wxID_ANY, i->translatorName, wxDefaultPosition, wxDefaultSize, 0 ); + staticTextTranslator->Wrap( -1 ); + fgSizerTranslators->Add(staticTextTranslator, 0, wxALIGN_CENTER_VERTICAL, 5); + } + + bSizerTranslators->Fit(m_scrolledWindowTranslators); + + + //build information + wxString build = __TDATE__; +#if wxUSE_UNICODE + build += wxT(" - Unicode"); +#else + build += wxT(" - ANSI"); +#endif //wxUSE_UNICODE + + //compile time info about 32/64-bit build + if (util::is64BitBuild) + build += wxT(" x64"); + else + build += wxT(" x86"); + assert_static(util::is32BitBuild || util::is64BitBuild); + + wxString buildFormatted = _("(Build: %x)"); + buildFormatted.Replace(wxT("%x"), build); + + m_build->SetLabel(buildFormatted); + + m_animationControl1->SetAnimation(*GlobalResources::getInstance().animationMoney); + m_animationControl1->Play(); + + m_buttonOkay->SetFocus(); + Fit(); +} + + +void AboutDlg::OnClose(wxCloseEvent& event) +{ + EndModal(0); +} + + +void AboutDlg::OnOK(wxCommandEvent& event) +{ + EndModal(0); +} + + +void ffs3::showAboutDialog() +{ + AboutDlg* aboutDlg = new AboutDlg(NULL); + aboutDlg->ShowModal(); + aboutDlg->Destroy(); +} +//######################################################################################## + + +class HelpDlg : public HelpDlgGenerated +{ +public: + HelpDlg(wxWindow* window); + +private: + void OnClose(wxCloseEvent& event); + void OnOK(wxCommandEvent& event); +}; + + +HelpDlg::HelpDlg(wxWindow* window) : HelpDlgGenerated(window) +{ + m_notebook1->SetFocus(); + + m_bitmap25->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("help"))); + + //populate decision trees: "compare by date" + wxTreeItemId treeRoot = m_treeCtrl1->AddRoot(_("DECISION TREE")); + wxTreeItemId treeBothSides = m_treeCtrl1->AppendItem(treeRoot, _("file exists on both sides")); + wxTreeItemId treeOneSide = m_treeCtrl1->AppendItem(treeRoot, _("on one side only")); + + m_treeCtrl1->AppendItem(treeOneSide, _("- left")); + m_treeCtrl1->AppendItem(treeOneSide, _("- right")); + + m_treeCtrl1->AppendItem(treeBothSides, _("- equal")); + wxTreeItemId treeDifferent = m_treeCtrl1->AppendItem(treeBothSides, _("different")); + + m_treeCtrl1->AppendItem(treeDifferent, _("- left newer")); + m_treeCtrl1->AppendItem(treeDifferent, _("- right newer")); + m_treeCtrl1->AppendItem(treeDifferent, _("- conflict (same date, different size)")); + + m_treeCtrl1->ExpandAll(); + + //populate decision trees: "compare by content" + wxTreeItemId tree2Root = m_treeCtrl2->AddRoot(_("DECISION TREE")); + wxTreeItemId tree2BothSides = m_treeCtrl2->AppendItem(tree2Root, _("file exists on both sides")); + wxTreeItemId tree2OneSide = m_treeCtrl2->AppendItem(tree2Root, _("on one side only")); + + m_treeCtrl2->AppendItem(tree2OneSide, _("- left")); + m_treeCtrl2->AppendItem(tree2OneSide, _("- right")); + + m_treeCtrl2->AppendItem(tree2BothSides, _("- equal")); + m_treeCtrl2->AppendItem(tree2BothSides, _("- different")); + + m_treeCtrl2->ExpandAll(); +} + + +void HelpDlg::OnClose(wxCloseEvent& event) +{ + Destroy(); +} + + +void HelpDlg::OnOK(wxCommandEvent& event) +{ + Destroy(); +} + + +void ffs3::showHelpDialog() +{ + HelpDlg* helpDlg = new HelpDlg(NULL); + helpDlg->ShowModal(); + helpDlg->Destroy(); +} +//######################################################################################## + + +class FilterDlg : public FilterDlgGenerated +{ +public: + FilterDlg(wxWindow* window, + bool isGlobalFilter, + Zstring& filterIncl, + Zstring& filterExcl); + ~FilterDlg() {} + + enum + { + BUTTON_APPLY = 1 + }; + +private: + void OnHelp(wxCommandEvent& event); + void OnDefault(wxCommandEvent& event); + void OnApply(wxCommandEvent& event); + void OnCancel(wxCommandEvent& event); + void OnClose(wxCloseEvent& event); + + const bool isGlobalFilter_; + Zstring& includeFilter; + Zstring& excludeFilter; +}; + + +FilterDlg::FilterDlg(wxWindow* window, + bool isGlobalFilter, //global or local filter dialog? + Zstring& filterIncl, + Zstring& filterExcl) : + FilterDlgGenerated(window), + isGlobalFilter_(isGlobalFilter), + includeFilter(filterIncl), + excludeFilter(filterExcl) +{ + m_bitmap8->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("include"))); + m_bitmap9->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("exclude"))); + m_bitmap26->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("filterOn"))); + m_bpButtonHelp->SetBitmapLabel(GlobalResources::getInstance().getImageByName(wxT("help"))); + + m_textCtrlInclude->SetValue(zToWx(includeFilter)); + m_textCtrlExclude->SetValue(zToWx(excludeFilter)); + + m_panel13->Hide(); + m_button10->SetFocus(); + + //adapt header for global/local dialog + if (isGlobalFilter_) + m_staticTexHeader->SetLabel(_("Filter: All pairs")); + else + m_staticTexHeader->SetLabel(_("Filter: Single pair")); + + Fit(); +} + + +void FilterDlg::OnHelp(wxCommandEvent& event) +{ + m_bpButtonHelp->Hide(); + m_panel13->Show(); + Fit(); + Refresh(); + + event.Skip(); +} + + +void FilterDlg::OnDefault(wxCommandEvent& event) +{ + const FilterConfig nullFilter; + + if (isGlobalFilter_) + { + m_textCtrlInclude->SetValue(zToWx(nullFilter.includeFilter)); + //exclude various recycle bin directories with global filter + m_textCtrlExclude->SetValue(zToWx(standardExcludeFilter())); + } + else + { + m_textCtrlInclude->SetValue(zToWx(nullFilter.includeFilter)); + m_textCtrlExclude->SetValue(zToWx(nullFilter.excludeFilter)); + } + + //changes to mainDialog are only committed when the OK button is pressed + Fit(); +} + + +void FilterDlg::OnApply(wxCommandEvent& event) +{ + //only if user presses ApplyFilter, he wants the changes to be committed + includeFilter = wxToZ(m_textCtrlInclude->GetValue()); + excludeFilter = wxToZ(m_textCtrlExclude->GetValue()); + + //when leaving dialog: filter and redraw grid, if filter is active + EndModal(BUTTON_APPLY); +} + + +void FilterDlg::OnCancel(wxCommandEvent& event) +{ + EndModal(0); +} + + +void FilterDlg::OnClose(wxCloseEvent& event) +{ + EndModal(0); +} + + + +DefaultReturnCode::Response ffs3::showFilterDialog(bool isGlobalFilter, + Zstring& filterIncl, + Zstring& filterExcl) +{ + DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL; + FilterDlg* filterDlg = new FilterDlg(NULL, + isGlobalFilter, //is main filter dialog + filterIncl, + filterExcl); + if (filterDlg->ShowModal() == FilterDlg::BUTTON_APPLY) + rv = DefaultReturnCode::BUTTON_OKAY; + + filterDlg->Destroy(); + return rv; +} +//######################################################################################## + + +class DeleteDialog : public DeleteDlgGenerated +{ +public: + DeleteDialog(wxWindow* main, + const std::vector<ffs3::FileSystemObject*>& rowsOnLeft, + const std::vector<ffs3::FileSystemObject*>& rowsOnRight, + bool& deleteOnBothSides, + bool& useRecycleBin, + int& totalDeleteCount); + + enum + { + BUTTON_OKAY = 1, + BUTTON_CANCEL + }; + +private: + void OnOK(wxCommandEvent& event); + void OnCancel(wxCommandEvent& event); + void OnClose(wxCloseEvent& event); + void OnDelOnBothSides(wxCommandEvent& event); + void OnUseRecycler(wxCommandEvent& event); + + void updateTexts(); + + const std::vector<ffs3::FileSystemObject*>& rowsToDeleteOnLeft; + const std::vector<ffs3::FileSystemObject*>& rowsToDeleteOnRight; + bool& m_deleteOnBothSides; + bool& m_useRecycleBin; + int& totalDelCount; +}; + + +DeleteDialog::DeleteDialog(wxWindow* main, + const std::vector<FileSystemObject*>& rowsOnLeft, + const std::vector<FileSystemObject*>& rowsOnRight, + bool& deleteOnBothSides, + bool& useRecycleBin, + int& totalDeleteCount) : + DeleteDlgGenerated(main), + rowsToDeleteOnLeft(rowsOnLeft), + rowsToDeleteOnRight(rowsOnRight), + m_deleteOnBothSides(deleteOnBothSides), + m_useRecycleBin(useRecycleBin), + totalDelCount(totalDeleteCount) +{ + m_checkBoxDeleteBothSides->SetValue(deleteOnBothSides); + m_checkBoxUseRecycler->SetValue(useRecycleBin); + updateTexts(); + + m_buttonOK->SetFocus(); +} + + +void DeleteDialog::updateTexts() +{ + if (m_checkBoxUseRecycler->GetValue()) + { + m_staticTextHeader->SetLabel(_("Do you really want to move the following object(s) to the Recycle Bin?")); + m_bitmap12->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("recycler"))); + } + else + { + m_staticTextHeader->SetLabel(_("Do you really want to delete the following object(s)?")); + m_bitmap12->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("deleteFile"))); + } + + const std::pair<wxString, int> delInfo = ffs3::deleteFromGridAndHDPreview( + rowsToDeleteOnLeft, + rowsToDeleteOnRight, + m_checkBoxDeleteBothSides->GetValue()); + + const wxString filesToDelete = delInfo.first; + totalDelCount = delInfo.second; + + m_textCtrlMessage->SetValue(filesToDelete); + + Layout(); +} + + +void DeleteDialog::OnOK(wxCommandEvent& event) +{ + EndModal(BUTTON_OKAY); +} + +void DeleteDialog::OnCancel(wxCommandEvent& event) +{ + EndModal(BUTTON_CANCEL); +} + +void DeleteDialog::OnClose(wxCloseEvent& event) +{ + EndModal(BUTTON_CANCEL); +} + +void DeleteDialog::OnDelOnBothSides(wxCommandEvent& event) +{ + m_deleteOnBothSides = m_checkBoxDeleteBothSides->GetValue(); + updateTexts(); +} + +void DeleteDialog::OnUseRecycler(wxCommandEvent& event) +{ + m_useRecycleBin = m_checkBoxUseRecycler->GetValue(); + updateTexts(); +} + + +DefaultReturnCode::Response ffs3::showDeleteDialog(const std::vector<ffs3::FileSystemObject*>& rowsOnLeft, + const std::vector<ffs3::FileSystemObject*>& rowsOnRight, + bool& deleteOnBothSides, + bool& useRecycleBin, + int& totalDeleteCount) +{ + DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL; + + DeleteDialog* confirmDeletion = new DeleteDialog(NULL, + rowsOnLeft, + rowsOnRight, + deleteOnBothSides, + useRecycleBin, + totalDeleteCount); + if (confirmDeletion->ShowModal() == DeleteDialog::BUTTON_OKAY) + rv = DefaultReturnCode::BUTTON_OKAY; + + confirmDeletion->Destroy(); + return rv; +} +//######################################################################################## + + +class CustomizeColsDlg : public CustomizeColsDlgGenerated +{ +public: + CustomizeColsDlg(wxWindow* window, xmlAccess::ColumnAttributes& attr); + + enum + { + BUTTON_OKAY = 10 + }; + +private: + void OnOkay(wxCommandEvent& event); + void OnDefault(wxCommandEvent& event); + void OnCancel(wxCommandEvent& event); + void OnClose(wxCloseEvent& event); + + void OnMoveUp(wxCommandEvent& event); + void OnMoveDown(wxCommandEvent& event); + + xmlAccess::ColumnAttributes& output; +}; + + +CustomizeColsDlg::CustomizeColsDlg(wxWindow* window, xmlAccess::ColumnAttributes& attr) : + CustomizeColsDlgGenerated(window), + output(attr) +{ + m_bpButton29->SetBitmapLabel(GlobalResources::getInstance().getImageByName(wxT("moveUp"))); + m_bpButton30->SetBitmapLabel(GlobalResources::getInstance().getImageByName(wxT("moveDown"))); + + xmlAccess::ColumnAttributes columnSettings = attr; + + sort(columnSettings.begin(), columnSettings.end(), xmlAccess::sortByPositionOnly); + + for (xmlAccess::ColumnAttributes::const_iterator i = columnSettings.begin(); i != columnSettings.end(); ++i) //love these iterators! + { + m_checkListColumns->Append(CustomGridRim::getTypeName(i->type)); + m_checkListColumns->Check(i - columnSettings.begin(), i->visible); + } + + m_checkListColumns->SetSelection(0); + Fit(); +} + + +void CustomizeColsDlg::OnOkay(wxCommandEvent& event) +{ + for (int i = 0; i < int(m_checkListColumns->GetCount()); ++i) + { + const wxString label = m_checkListColumns->GetString(i); + for (xmlAccess::ColumnAttributes::iterator j = output.begin(); j != output.end(); ++j) + { + if (CustomGridRim::getTypeName(j->type) == label) //not nice but short and no performance issue + { + j->position = i; + j->visible = m_checkListColumns->IsChecked(i);; + break; + } + } + } + + EndModal(BUTTON_OKAY); +} + + +void CustomizeColsDlg::OnDefault(wxCommandEvent& event) +{ + xmlAccess::ColumnAttributes defaultColumnAttr = CustomGridRim::getDefaultColumnAttributes(); + + m_checkListColumns->Clear(); + for (xmlAccess::ColumnAttributes::const_iterator i = defaultColumnAttr.begin(); i != defaultColumnAttr.end(); ++i) + { + m_checkListColumns->Append(CustomGridRim::getTypeName(i->type)); + m_checkListColumns->Check(i - defaultColumnAttr.begin(), i->visible); + } +} + + +void CustomizeColsDlg::OnCancel(wxCommandEvent& event) +{ + EndModal(0); +} + + +void CustomizeColsDlg::OnClose(wxCloseEvent& event) +{ + EndModal(0); +} + + +void CustomizeColsDlg::OnMoveUp(wxCommandEvent& event) +{ + const int pos = m_checkListColumns->GetSelection(); + if (1 <= pos && pos < int(m_checkListColumns->GetCount())) + { + const bool checked = m_checkListColumns->IsChecked(pos); + const wxString label = m_checkListColumns->GetString(pos); + + m_checkListColumns->SetString(pos, m_checkListColumns->GetString(pos - 1)); + m_checkListColumns->Check(pos, m_checkListColumns->IsChecked(pos - 1)); + m_checkListColumns->SetString(pos - 1, label); + m_checkListColumns->Check(pos - 1, checked); + m_checkListColumns->Select(pos - 1); + } +} + + +void CustomizeColsDlg::OnMoveDown(wxCommandEvent& event) +{ + const int pos = m_checkListColumns->GetSelection(); + if (0 <= pos && pos < int(m_checkListColumns->GetCount()) - 1) + { + const bool checked = m_checkListColumns->IsChecked(pos); + const wxString label = m_checkListColumns->GetString(pos); + + m_checkListColumns->SetString(pos, m_checkListColumns->GetString(pos + 1)); + m_checkListColumns->Check(pos, m_checkListColumns->IsChecked(pos + 1)); + m_checkListColumns->SetString(pos + 1, label); + m_checkListColumns->Check(pos + 1, checked); + m_checkListColumns->Select(pos + 1); + } +} + + +DefaultReturnCode::Response ffs3::showCustomizeColsDlg(xmlAccess::ColumnAttributes& attr) +{ + DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL; + + CustomizeColsDlg* customizeDlg = new CustomizeColsDlg(NULL, attr); + if (customizeDlg->ShowModal() == CustomizeColsDlg::BUTTON_OKAY) + rv = DefaultReturnCode::BUTTON_OKAY; + customizeDlg->Destroy(); + + return rv; +} +//######################################################################################## + + +class SyncPreviewDlg : public SyncPreviewDlgGenerated +{ +public: + SyncPreviewDlg(wxWindow* parentWindow, + const wxString& variantName, + const ffs3::SyncStatistics& statistics, + bool& dontShowAgain); + enum + { + BUTTON_START = 1, + BUTTON_CANCEL = 2 + }; + +private: + void OnClose(wxCloseEvent& event); + void OnCancel(wxCommandEvent& event); + void OnStartSync(wxCommandEvent& event); + + bool& m_dontShowAgain; +}; + + + +SyncPreviewDlg::SyncPreviewDlg(wxWindow* parentWindow, + const wxString& variantName, + const ffs3::SyncStatistics& statistics, + bool& dontShowAgain) : + SyncPreviewDlgGenerated(parentWindow), + m_dontShowAgain(dontShowAgain) +{ + using ffs3::numberToStringSep; + + m_buttonStartSync->setBitmapFront(GlobalResources::getInstance().getImageByName(wxT("startSync"))); + m_bitmapCreate->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("create"))); + m_bitmapUpdate->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("update"))); + m_bitmapDelete->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("delete"))); + m_bitmapData->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("data"))); + + m_staticTextVariant->SetLabel(variantName); + m_textCtrlData->SetValue(ffs3::formatFilesizeToShortString(statistics.getDataToProcess())); + + m_textCtrlCreateL->SetValue(numberToStringSep(statistics.getCreate( true, false))); + m_textCtrlUpdateL->SetValue(numberToStringSep(statistics.getOverwrite(true, false))); + m_textCtrlDeleteL->SetValue(numberToStringSep(statistics.getDelete( true, false))); + + m_textCtrlCreateR->SetValue(numberToStringSep(statistics.getCreate( false, true))); + m_textCtrlUpdateR->SetValue(numberToStringSep(statistics.getOverwrite(false, true))); + m_textCtrlDeleteR->SetValue(numberToStringSep(statistics.getDelete( false, true))); + + m_checkBoxDontShowAgain->SetValue(dontShowAgain); + + m_buttonStartSync->SetFocus(); + Fit(); +} + + +void SyncPreviewDlg::OnClose(wxCloseEvent& event) +{ + EndModal(BUTTON_CANCEL); +} + + +void SyncPreviewDlg::OnCancel(wxCommandEvent& event) +{ + EndModal(BUTTON_CANCEL); +} + + +void SyncPreviewDlg::OnStartSync(wxCommandEvent& event) +{ + m_dontShowAgain = m_checkBoxDontShowAgain->GetValue(); + EndModal(BUTTON_START); +} + + +DefaultReturnCode::Response ffs3::showSyncPreviewDlg( + const wxString& variantName, + const ffs3::SyncStatistics& statistics, + bool& dontShowAgain) +{ + DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL; + + SyncPreviewDlg* preview = new SyncPreviewDlg(NULL, + variantName, + statistics, + dontShowAgain); + + if (preview->ShowModal() == SyncPreviewDlg::BUTTON_START) + rv = DefaultReturnCode::BUTTON_OKAY; + + preview->Destroy(); + + return rv; +} +//######################################################################################## + + +class CompareCfgDialog : public CmpCfgDlgGenerated +{ +public: + CompareCfgDialog(wxWindow* parentWindow, + const wxPoint& position, + ffs3::CompareVariant& cmpVar, + SymLinkHandling& handleSymlinks); + + enum + { + BUTTON_OKAY = 10 + }; + +private: + void OnOkay(wxCommandEvent& event); + void OnClose(wxCloseEvent& event); + void OnCancel(wxCommandEvent& event); + void OnTimeSize(wxCommandEvent& event); + void OnContent(wxCommandEvent& event); + void OnShowHelp(wxCommandEvent& event); + + void updateView(); + + ffs3::CompareVariant& cmpVarOut; + SymLinkHandling& handleSymlinksOut; +}; + + +namespace +{ +void setValue(wxChoice& choiceCtrl, ffs3::SymLinkHandling value) +{ + choiceCtrl.Clear(); + choiceCtrl.Append(_("Ignore")); + choiceCtrl.Append(_("Direct")); + choiceCtrl.Append(_("Follow")); + + //default + choiceCtrl.SetSelection(0); + + switch (value) + { + case ffs3::SYMLINK_IGNORE: + choiceCtrl.SetSelection(0); + break; + case ffs3::SYMLINK_USE_DIRECTLY: + choiceCtrl.SetSelection(1); + break; + case ffs3::SYMLINK_FOLLOW_LINK: + choiceCtrl.SetSelection(2); + break; + } +} + + +ffs3::SymLinkHandling getValue(const wxChoice& choiceCtrl) +{ + switch (choiceCtrl.GetSelection()) + { + case 0: + return ffs3::SYMLINK_IGNORE; + case 1: + return ffs3::SYMLINK_USE_DIRECTLY; + case 2: + return ffs3::SYMLINK_FOLLOW_LINK; + default: + assert(false); + return ffs3::SYMLINK_IGNORE; + } +} +} + +CompareCfgDialog::CompareCfgDialog(wxWindow* parentWindow, + const wxPoint& position, + CompareVariant& cmpVar, + SymLinkHandling& handleSymlinks) : + CmpCfgDlgGenerated(parentWindow), + cmpVarOut(cmpVar), + handleSymlinksOut(handleSymlinks) +{ + //move dialog up so that compare-config button and first config-variant are on same level + Move(wxPoint(position.x, std::max(0, position.y - (m_buttonTimeSize->GetScreenPosition() - GetScreenPosition()).y))); + + m_bpButtonHelp->SetBitmapLabel(GlobalResources::getInstance().getImageByName(wxT("help"))); + m_bitmapByTime->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("cmpByTime"))); + m_bitmapByContent->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("cmpByContent"))); + + switch (cmpVar) + { + case CMP_BY_TIME_SIZE: + m_radioBtnSizeDate->SetValue(true); + m_buttonContent->SetFocus(); //set focus on the other button + break; + case CMP_BY_CONTENT: + m_radioBtnContent->SetValue(true); + m_buttonTimeSize->SetFocus(); //set focus on the other button + break; + } + + + setValue(*m_choiceHandleSymlinks, handleSymlinks); + + updateView(); +} + +void CompareCfgDialog::updateView() +{ + Fit(); +} + +void CompareCfgDialog::OnOkay(wxCommandEvent& event) +{ + if (m_radioBtnContent->GetValue()) + cmpVarOut = CMP_BY_CONTENT; + else + cmpVarOut = CMP_BY_TIME_SIZE; + + handleSymlinksOut = getValue(*m_choiceHandleSymlinks);; + + EndModal(BUTTON_OKAY); +} + + +void CompareCfgDialog::OnClose(wxCloseEvent& event) +{ + EndModal(0); +} + + +void CompareCfgDialog::OnCancel(wxCommandEvent& event) +{ + EndModal(0); +} + + +void CompareCfgDialog::OnTimeSize(wxCommandEvent& event) +{ + m_radioBtnSizeDate->SetValue(true); + OnOkay(event); +} + + +void CompareCfgDialog::OnContent(wxCommandEvent& event) +{ + m_radioBtnContent->SetValue(true); + OnOkay(event); +} + + +void CompareCfgDialog::OnShowHelp(wxCommandEvent& event) +{ + HelpDlg* helpDlg = new HelpDlg(this); + helpDlg->ShowModal(); +} + + +DefaultReturnCode::Response ffs3::showCompareCfgDialog( + const wxPoint& position, + CompareVariant& cmpVar, + SymLinkHandling& handleSymlinks) +{ + CompareCfgDialog syncDlg(NULL, position, cmpVar, handleSymlinks); + + return syncDlg.ShowModal() == CompareCfgDialog::BUTTON_OKAY ? + DefaultReturnCode::BUTTON_OKAY : + DefaultReturnCode::BUTTON_CANCEL; +} +//######################################################################################## + + +class GlobalSettingsDlg : public GlobalSettingsDlgGenerated +{ +public: + GlobalSettingsDlg(wxWindow* window, xmlAccess::XmlGlobalSettings& globalSettings); + + enum + { + BUTTON_OKAY = 10 + }; + +private: + void OnOkay(wxCommandEvent& event); + void OnResetDialogs(wxCommandEvent& event); + void OnDefault(wxCommandEvent& event); + void OnCancel(wxCommandEvent& event); + void OnClose(wxCloseEvent& event); + void OnAddRow(wxCommandEvent& event); + void OnRemoveRow(wxCommandEvent& event); + + void set(const xmlAccess::ExternalApps& extApp); + xmlAccess::ExternalApps getExtApp(); + + xmlAccess::XmlGlobalSettings& settings; +}; + + +GlobalSettingsDlg::GlobalSettingsDlg(wxWindow* window, xmlAccess::XmlGlobalSettings& globalSettings) : + GlobalSettingsDlgGenerated(window), + settings(globalSettings) +{ + m_bitmapSettings->SetBitmap(GlobalResources::getInstance().getImageByName(wxT("settings"))); + m_buttonResetDialogs->setBitmapFront(GlobalResources::getInstance().getImageByName(wxT("warningSmall")), 5); + m_bpButtonAddRow->SetBitmapLabel(GlobalResources::getInstance().getImageByName(wxT("addFolderPair"))); + m_bpButtonRemoveRow->SetBitmapLabel(GlobalResources::getInstance().getImageByName(wxT("removeFolderPair"))); + + m_checkBoxIgnoreOneHour->SetValue(globalSettings.ignoreOneHourDiff); + m_checkBoxCopyLocked->SetValue(globalSettings.copyLockedFiles); + m_checkBoxCopyPermissions->SetValue(globalSettings.copyFilePermissions); + +#ifndef FFS_WIN + m_checkBoxCopyLocked->Hide(); +#endif + + set(globalSettings.gui.externelApplications); + + const wxString toolTip = wxString(_("Integrate external applications into context menu. The following macros are available:")) + wxT("\n\n") + + wxT("%name \t") + _("- full file or directory name") + wxT("\n") + + wxT("%dir \t") + _("- directory part only") + wxT("\n") + + wxT("%nameCo \t") + _("- Other side's counterpart to %name") + wxT("\n") + + wxT("%dirCo \t") + _("- Other side's counterpart to %dir"); + + m_gridCustomCommand->GetGridWindow()->SetToolTip(toolTip); + m_gridCustomCommand->GetGridColLabelWindow()->SetToolTip(toolTip); + + m_buttonOkay->SetFocus(); + + Fit(); +} + + +void GlobalSettingsDlg::OnOkay(wxCommandEvent& event) +{ + //write global settings only when okay-button is pressed! + settings.ignoreOneHourDiff = m_checkBoxIgnoreOneHour->GetValue(); + settings.copyLockedFiles = m_checkBoxCopyLocked->GetValue(); + settings.copyFilePermissions = m_checkBoxCopyPermissions->GetValue(); + settings.gui.externelApplications = getExtApp(); + + EndModal(BUTTON_OKAY); +} + + +void GlobalSettingsDlg::OnResetDialogs(wxCommandEvent& event) +{ + QuestionDlg* messageDlg = new QuestionDlg(this, + QuestionDlg::BUTTON_YES | QuestionDlg::BUTTON_CANCEL, + _("Re-enable all hidden dialogs?")); + + if (messageDlg->ShowModal() == QuestionDlg::BUTTON_YES) + settings.optDialogs.resetDialogs(); +} + + +void GlobalSettingsDlg::OnDefault(wxCommandEvent& event) +{ + xmlAccess::XmlGlobalSettings defaultCfg; + + m_checkBoxIgnoreOneHour-> SetValue(defaultCfg.ignoreOneHourDiff); + m_checkBoxCopyLocked-> SetValue(defaultCfg.copyLockedFiles); + m_checkBoxCopyPermissions->SetValue(defaultCfg.copyFilePermissions); + set(defaultCfg.gui.externelApplications); +} + + +void GlobalSettingsDlg::OnCancel(wxCommandEvent& event) +{ + EndModal(0); +} + + +void GlobalSettingsDlg::OnClose(wxCloseEvent& event) +{ + EndModal(0); +} + + +void GlobalSettingsDlg::set(const xmlAccess::ExternalApps& extApp) +{ + const int rowCount = m_gridCustomCommand->GetNumberRows(); + if (rowCount > 0) + m_gridCustomCommand->DeleteRows(0, rowCount); + + m_gridCustomCommand->AppendRows(static_cast<int>(extApp.size())); + for (xmlAccess::ExternalApps::const_iterator i = extApp.begin(); i != extApp.end(); ++i) + { + const int row = i - extApp.begin(); + m_gridCustomCommand->SetCellValue(row, 0, i->first); //description + m_gridCustomCommand->SetCellValue(row, 1, i->second); //commandline + } + Fit(); +} + + +xmlAccess::ExternalApps GlobalSettingsDlg::getExtApp() +{ + xmlAccess::ExternalApps output; + for (int i = 0; i < m_gridCustomCommand->GetNumberRows(); ++i) + output.push_back( + std::make_pair(m_gridCustomCommand->GetCellValue(i, 0), //description + m_gridCustomCommand->GetCellValue(i, 1))); //commandline + return output; +} + + +void GlobalSettingsDlg::OnAddRow(wxCommandEvent& event) +{ + wxWindowUpdateLocker dummy(this); //avoid display distortion + + const int selectedRow = m_gridCustomCommand->GetGridCursorRow(); + if (0 <= selectedRow && selectedRow < m_gridCustomCommand->GetNumberRows()) + m_gridCustomCommand->InsertRows(selectedRow); + else + m_gridCustomCommand->AppendRows(); + + Fit(); +} + + +void GlobalSettingsDlg::OnRemoveRow(wxCommandEvent& event) +{ + if (m_gridCustomCommand->GetNumberRows() > 0) + { + wxWindowUpdateLocker dummy(this); //avoid display distortion + + const int selectedRow = m_gridCustomCommand->GetGridCursorRow(); + if (0 <= selectedRow && selectedRow < m_gridCustomCommand->GetNumberRows()) + m_gridCustomCommand->DeleteRows(selectedRow); + else + m_gridCustomCommand->DeleteRows(m_gridCustomCommand->GetNumberRows() - 1); + + Fit(); + } +} + + +DefaultReturnCode::Response ffs3::showGlobalSettingsDlg(xmlAccess::XmlGlobalSettings& globalSettings) +{ + DefaultReturnCode::Response rv = DefaultReturnCode::BUTTON_CANCEL; + + wxDialog* settingsDlg = new GlobalSettingsDlg(NULL, globalSettings); + if (settingsDlg->ShowModal() == GlobalSettingsDlg::BUTTON_OKAY) + rv = DefaultReturnCode::BUTTON_OKAY; + + settingsDlg->Destroy(); + + return rv; +} |