2 * @file PluginsListDlg.cpp
4 * @brief Implementation file for PluginsList dialog
8 #include "PluginsListDlg.h"
9 #include "UnicodeString.h"
11 #include "OptionsDef.h"
12 #include "OptionsMgr.h"
14 IMPLEMENT_DYNAMIC(PluginsListDlg, CTrDialog)
16 BEGIN_MESSAGE_MAP(PluginsListDlg, CTrDialog)
17 ON_BN_CLICKED(IDOK, OnBnClickedOk)
18 ON_BN_CLICKED(IDC_PLUGIN_SETTINGS, OnBnClickedPluginSettings)
19 ON_BN_CLICKED(IDC_PLUGIN_FILEFILTERS_DEFAULTS, OnBnClickedFileFiltesDefaults)
20 ON_NOTIFY(NM_DBLCLK, IDC_PLUGINSLIST_LIST, OnNMDblclkList)
21 ON_NOTIFY(LVN_ITEMCHANGING, IDC_PLUGINSLIST_LIST, OnLVNItemChanging)
22 ON_NOTIFY(LVN_ITEMCHANGED, IDC_PLUGINSLIST_LIST, OnLVNItemChanged)
28 PluginsListDlg::PluginsListDlg(CWnd* pParent /*= nullptr*/)
29 : CTrDialog(PluginsListDlg::IDD, pParent)
36 PluginsListDlg::~PluginsListDlg()
40 void PluginsListDlg::DoDataExchange(CDataExchange* pDX)
42 CTrDialog::DoDataExchange(pDX);
43 DDX_Control(pDX, IDC_PLUGINSLIST_LIST, m_list);
47 * @brief Initialize the dialog.
49 BOOL PluginsListDlg::OnInitDialog()
51 CTrDialog::OnInitDialog();
55 m_list.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);
57 CheckDlgButton(IDC_PLUGINS_ENABLE,
58 GetOptionsMgr()->GetBool(OPT_PLUGINS_ENABLED) ? BST_CHECKED : BST_UNCHECKED);
60 return FALSE; // return TRUE unless you set the focus to a control
61 // EXCEPTION: OCX Property Pages should return FALSE
65 * @brief Set-up the list control.
67 void PluginsListDlg::InitList()
69 // Show selection across entire row.
70 // Also enable infotips.
71 m_list.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP);
73 const int lpx = CClientDC(this).GetDeviceCaps(LOGPIXELSX);
74 auto pointToPixel = [lpx](int point) { return MulDiv(point, lpx, 72); };
76 String title = _("Name");
77 m_list.InsertColumn(0, title.c_str(), LVCFMT_LEFT, pointToPixel(150));
79 m_list.InsertColumn(1, title.c_str(), LVCFMT_LEFT, pointToPixel(75));
80 title = _("Description");
81 m_list.InsertColumn(2, title.c_str(), LVCFMT_LEFT, pointToPixel(225));
85 * @brief Add found plugins to the list.
87 void PluginsListDlg::AddPlugins()
89 String type = _("Unpacker");
90 AddPluginsToList(L"FILE_PACK_UNPACK", type);
91 AddPluginsToList(L"BUFFER_PACK_UNPACK", type);
92 AddPluginsToList(L"FILE_FOLDER_PACK_UNPACK", type);
93 type = _("Prediffer");
94 AddPluginsToList(L"FILE_PREDIFF", type);
95 AddPluginsToList(L"BUFFER_PREDIFF", type);
96 type = _("Editor script");
97 AddPluginsToList(L"EDITOR_SCRIPT", type);
101 * @brief Add plugins of given event type to the list.
102 * @param [in] pluginEvent Event type for plugins to add.
103 * @param [in] pluginType String to use as type in the list.
105 void PluginsListDlg::AddPluginsToList(const wchar_t *pluginEvent, const String& pluginType)
107 PluginArray * piPluginArray =
108 CAllThreadsScripts::GetActiveSet()->GetAvailableScripts(pluginEvent);
110 for (size_t iPlugin = 0 ; iPlugin < piPluginArray->size() ; iPlugin++)
112 const PluginInfoPtr& plugin = piPluginArray->at(iPlugin);
113 int ind = m_list.InsertItem(m_list.GetItemCount(), plugin->m_name.c_str());
114 m_list.SetItemText(ind, 1, pluginType.c_str());
115 m_list.SetItemText(ind, 2, plugin->m_description.c_str());
116 m_list.SetCheck(ind, !plugin->m_disabled);
120 PluginInfo *PluginsListDlg::GetSelectedPluginInfo() const
122 String name = m_list.GetItemText(m_list.GetNextItem(-1, LVNI_SELECTED), 0);
123 return CAllThreadsScripts::GetActiveSet()->GetPluginByName(nullptr, name);
127 * @brief Save plugins enabled setting when closing the dialog.
129 void PluginsListDlg::OnBnClickedOk()
131 GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED,
132 (IsDlgButtonChecked(IDC_PLUGINS_ENABLE) == 1));
134 OnLVNItemChanging(nullptr, nullptr);
136 for (int i = 0; i < m_list.GetItemCount(); ++i)
138 PluginInfo * plugin = CAllThreadsScripts::GetActiveSet()->GetPluginByName(nullptr, String(m_list.GetItemText(i, 0)));
139 plugin->m_disabled = !m_list.GetCheck(i);
142 CAllThreadsScripts::GetActiveSet()->SaveSettings();
146 void PluginsListDlg::OnBnClickedPluginSettings()
148 POSITION pos = m_list.GetFirstSelectedItemPosition();
151 String pluginName = static_cast<const TCHAR *>(m_list.GetItemText(m_list.GetNextSelectedItem(pos), 0));
152 for (int i = 0; TransformationCategories[i] != nullptr; ++i)
154 PluginInfo * plugin = CAllThreadsScripts::GetActiveSet()->GetPluginByName(TransformationCategories[i], pluginName);
155 if (plugin != nullptr)
158 plugin::InvokeShowSettingsDialog(plugin->m_lpDispatch);
160 SetForegroundWindow();
167 void PluginsListDlg::OnBnClickedFileFiltesDefaults()
169 PluginInfo *plugin = GetSelectedPluginInfo();
171 SetDlgItemText(IDC_PLUGIN_FILEFILTERS, plugin->m_filtersTextDefault);
174 void PluginsListDlg::OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult)
176 OnBnClickedPluginSettings();
179 void PluginsListDlg::OnLVNItemChanging(NMHDR *pNMHDR, LRESULT *pResult)
181 PluginInfo *plugin = GetSelectedPluginInfo();
184 GetDlgItemText(IDC_PLUGIN_FILEFILTERS, plugin->m_filtersText);
185 plugin->LoadFilterString();
189 void PluginsListDlg::OnLVNItemChanged(NMHDR *pNMHDR, LRESULT *pResult)
191 PluginInfo *plugin = GetSelectedPluginInfo();
193 SetDlgItemText(IDC_PLUGIN_FILEFILTERS, plugin->m_filtersText);