diff options
Diffstat (limited to 'ui/folder_pair.h')
-rw-r--r-- | ui/folder_pair.h | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/ui/folder_pair.h b/ui/folder_pair.h new file mode 100644 index 00000000..27f3ab29 --- /dev/null +++ b/ui/folder_pair.h @@ -0,0 +1,206 @@ +// ************************************************************************** +// * 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) * +// ************************************************************************** +// +#ifndef FOLDERPAIR_H_INCLUDED +#define FOLDERPAIR_H_INCLUDED + +#include "../structures.h" +#include "../shared/drag_n_drop.h" +#include "../library/resources.h" +#include "small_dlgs.h" +#include "sync_cfg.h" +#include <wx/event.h> +#include "is_null_filter.h" +#include "../shared/util.h" +#include "../shared/string_conv.h" + +namespace ffs3 +{ +//basic functionality for handling alternate folder pair configuration: change sync-cfg/filter cfg, right-click context menu, button icons... + +template <class GuiPanel> +class FolderPairPanelBasic : private wxEvtHandler +{ +public: + typedef boost::shared_ptr<const ffs3::AlternateSyncConfig> AltSyncCfgPtr; + + + Zstring getLeftDir() const + { + return wxToZ(basicPanel_.m_directoryLeft->GetValue()); + } + + Zstring getRightDir() const + { + return wxToZ(basicPanel_.m_directoryRight->GetValue()); + } + + AltSyncCfgPtr getAltSyncConfig() const + { + return altSyncConfig; + } + + FilterConfig getAltFilterConfig() const + { + return localFilter; + } + + void setValues(const Zstring& leftDir, + const Zstring& rightDir, + AltSyncCfgPtr syncCfg, + const FilterConfig& filter) + { + altSyncConfig = syncCfg; + localFilter = filter; + + //insert directory names + ffs3::setDirectoryName(zToWx(leftDir), basicPanel_.m_directoryLeft, basicPanel_.m_dirPickerLeft); + ffs3::setDirectoryName(zToWx(rightDir), basicPanel_.m_directoryRight, basicPanel_.m_dirPickerRight); + + refreshButtons(); + } + + + void refreshButtons() + { + if (altSyncConfig.get()) + { + basicPanel_.m_bpButtonAltSyncCfg->SetBitmapLabel(GlobalResources::getInstance().getImageByName(wxT("syncConfigSmall"))); + basicPanel_.m_bpButtonAltSyncCfg->SetToolTip(wxString(_("Select alternate synchronization settings")) + wxT(" ") + common::LINE_BREAK + + wxT("(") + getVariantName(altSyncConfig->syncConfiguration) + wxT(")")); + } + else + { + basicPanel_.m_bpButtonAltSyncCfg->SetBitmapLabel(GlobalResources::getInstance().getImageByName(wxT("syncConfigSmallGrey"))); + basicPanel_.m_bpButtonAltSyncCfg->SetToolTip(_("Select alternate synchronization settings")); + } + + //test for Null-filter + if (isNullFilter(localFilter)) + { + basicPanel_.m_bpButtonLocalFilter->SetBitmapLabel(GlobalResources::getInstance().getImageByName(wxT("filterSmallGrey"))); + basicPanel_.m_bpButtonLocalFilter->SetToolTip(_("No filter selected")); + } + else + { + basicPanel_.m_bpButtonLocalFilter->SetBitmapLabel(GlobalResources::getInstance().getImageByName(wxT("filterSmall"))); + basicPanel_.m_bpButtonLocalFilter->SetToolTip(_("Filter is active")); + } + } + +protected: + FolderPairPanelBasic(GuiPanel& basicPanel) : //takes reference on basic panel to be enhanced + basicPanel_(basicPanel) + { + //register events for removal of alternate configuration + basicPanel_.m_bpButtonAltSyncCfg->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(FolderPairPanelBasic::OnAltSyncCfgRemove), NULL, this); + basicPanel_.m_bpButtonLocalFilter->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(FolderPairPanelBasic::OnLocalFilterCfgRemove), NULL, this); + + basicPanel_.m_bpButtonAltSyncCfg-> Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FolderPairPanelBasic::OnAltSyncCfg), NULL, this); + basicPanel_.m_bpButtonLocalFilter->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FolderPairPanelBasic::OnLocalFilterCfg), NULL, this); + + basicPanel_.m_bpButtonRemovePair->SetBitmapLabel(GlobalResources::getInstance().getImageByName(wxT("removeFolderPair"))); + } + + virtual void OnLocalFilterCfgRemoveConfirm(wxCommandEvent& event) + { + localFilter = FilterConfig(); + refreshButtons(); + } + + virtual void OnAltSyncCfgRemoveConfirm(wxCommandEvent& event) + { + altSyncConfig.reset(); + refreshButtons(); + } + + +private: + void OnLocalFilterCfgRemove(wxCommandEvent& event) + { + const int menuId = 1234; + contextMenu.reset(new wxMenu); //re-create context menu + contextMenu->Append(menuId, _("Clear filter settings")); + contextMenu->Connect(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(FolderPairPanelBasic::OnLocalFilterCfgRemoveConfirm), NULL, this); + + if (NameFilter(localFilter.includeFilter, localFilter.excludeFilter).isNull()) + contextMenu->Enable(menuId, false); //disable menu item, if clicking wouldn't make sense anyway + + basicPanel_.PopupMenu(contextMenu.get()); //show context menu + } + + void OnAltSyncCfgRemove(wxCommandEvent& event) + { + const int menuId = 1234; + contextMenu.reset(new wxMenu); //re-create context menu + contextMenu->Append(menuId, _("Remove alternate settings")); + contextMenu->Connect(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(FolderPairPanelBasic::OnAltSyncCfgRemoveConfirm), NULL, this); + + if (!altSyncConfig.get()) + contextMenu->Enable(menuId, false); //disable menu item, if clicking wouldn't make sense anyway + + basicPanel_.PopupMenu(contextMenu.get()); //show context menu + } + + virtual MainConfiguration getMainConfig() const = 0; + virtual wxWindow* getParentWindow() = 0; + + virtual void OnAltSyncCfgChange() {}; + + void OnAltSyncCfg(wxCommandEvent& event) + { + const MainConfiguration mainCfg = getMainConfig(); + const AlternateSyncConfig syncConfigMain(mainCfg.syncConfiguration, + mainCfg.handleDeletion, + mainCfg.customDeletionDirectory); + + AlternateSyncConfig altSyncCfg = altSyncConfig.get() ? *altSyncConfig : syncConfigMain; + SyncCfgDialog* syncDlg = new SyncCfgDialog(getParentWindow(), + mainCfg.compareVar, + altSyncCfg.syncConfiguration, + altSyncCfg.handleDeletion, + altSyncCfg.customDeletionDirectory, + NULL); + if (syncDlg->ShowModal() == SyncCfgDialog::BUTTON_APPLY) + { + altSyncConfig.reset(new AlternateSyncConfig(altSyncCfg)); + refreshButtons(); + + OnAltSyncCfgChange(); + } + } + + virtual void OnLocalFilterCfgChange() {}; + + void OnLocalFilterCfg(wxCommandEvent& event) + { + FilterConfig localFiltTmp = localFilter; + + if (showFilterDialog(false, //is local filter dialog + localFiltTmp.includeFilter, + localFiltTmp.excludeFilter) == DefaultReturnCode::BUTTON_OKAY) + { + localFilter = localFiltTmp; + refreshButtons(); + + OnLocalFilterCfgChange(); + } + } + + GuiPanel& basicPanel_; //panel to be enhanced by this template + + //alternate configuration attached to it + AltSyncCfgPtr altSyncConfig; //optional: present if non-NULL + FilterConfig localFilter; + + std::auto_ptr<wxMenu> contextMenu; +}; +} + + +#endif // FOLDERPAIR_H_INCLUDED + + |