2 * @file PluginsListDlg.cpp
4 * @brief Implementation file for PluginsList dialog
8 #include "PluginsListDlg.h"
9 #include "WildcardDropList.h"
10 #include "UnicodeString.h"
12 #include "OptionsDef.h"
13 #include "OptionsMgr.h"
16 /** @brief Location for plugins specific help to open. */
17 static TCHAR PluginsHelpLocation[] = _T("::/htmlhelp/Plugins.html");
19 IMPLEMENT_DYNAMIC(PluginsListDlg, CTrDialog)
21 BEGIN_MESSAGE_MAP(PluginsListDlg, CTrDialog)
22 ON_BN_CLICKED(IDOK, OnBnClickedOk)
23 ON_BN_CLICKED(IDC_PLUGIN_SETTINGS, OnBnClickedPluginSettings)
24 ON_BN_CLICKED(IDC_PLUGIN_DEFAULTS, OnBnClickedFileFiltesDefaults)
25 ON_CBN_DROPDOWN(IDC_PLUGIN_FILEFILTERS, OnDropDownPatterns)
26 ON_CBN_CLOSEUP(IDC_PLUGIN_FILEFILTERS, OnCloseUpPatterns)
27 ON_NOTIFY(NM_DBLCLK, IDC_PLUGINSLIST_LIST, OnNMDblclkList)
28 ON_NOTIFY(LVN_ITEMCHANGING, IDC_PLUGINSLIST_LIST, OnLVNItemChanging)
29 ON_NOTIFY(LVN_ITEMCHANGED, IDC_PLUGINSLIST_LIST, OnLVNItemChanged)
30 ON_COMMAND(ID_HELP, OnHelp)
36 PluginsListDlg::PluginsListDlg(CWnd* pParent /*= nullptr*/)
37 : CTrDialog(PluginsListDlg::IDD, pParent)
44 PluginsListDlg::~PluginsListDlg()
48 void PluginsListDlg::DoDataExchange(CDataExchange* pDX)
50 CTrDialog::DoDataExchange(pDX);
51 DDX_Control(pDX, IDC_PLUGINSLIST_LIST, m_list);
52 DDX_Control(pDX, IDC_PLUGIN_FILEFILTERS, m_comboPatterns);
56 * @brief Initialize the dialog.
58 BOOL PluginsListDlg::OnInitDialog()
60 CTrDialog::OnInitDialog();
64 m_list.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);
66 CheckDlgButton(IDC_PLUGINS_ENABLE,
67 GetOptionsMgr()->GetBool(OPT_PLUGINS_ENABLED) ? BST_CHECKED : BST_UNCHECKED);
69 return FALSE; // return TRUE unless you set the focus to a control
70 // EXCEPTION: OCX Property Pages should return FALSE
74 * @brief Set-up the list control.
76 void PluginsListDlg::InitList()
78 // Show selection across entire row.
79 // Also enable infotips.
80 m_list.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP);
82 const int lpx = CClientDC(this).GetDeviceCaps(LOGPIXELSX);
83 auto pointToPixel = [lpx](int point) { return MulDiv(point, lpx, 72); };
85 String title = _("Name");
86 m_list.InsertColumn(0, title.c_str(), LVCFMT_LEFT, pointToPixel(150));
88 m_list.InsertColumn(1, title.c_str(), LVCFMT_LEFT, pointToPixel(75));
89 title = _("Description");
90 m_list.InsertColumn(2, title.c_str(), LVCFMT_LEFT, pointToPixel(225));
94 * @brief Add found plugins to the list.
96 void PluginsListDlg::AddPlugins()
98 String type = _("Unpacker");
99 AddPluginsToList(L"FILE_FOLDER_PACK_UNPACK", type);
100 AddPluginsToList(L"FILE_PACK_UNPACK", type);
101 AddPluginsToList(L"BUFFER_PACK_UNPACK", type);
102 type = _("Prediffer");
103 AddPluginsToList(L"FILE_PREDIFF", type);
104 AddPluginsToList(L"BUFFER_PREDIFF", type);
105 type = _("Editor script");
106 AddPluginsToList(L"EDITOR_SCRIPT", type);
110 * @brief Add plugins of given event type to the list.
111 * @param [in] pluginEvent Event type for plugins to add.
112 * @param [in] pluginType String to use as type in the list.
114 void PluginsListDlg::AddPluginsToList(const wchar_t *pluginEvent, const String& pluginType)
116 PluginArray * piPluginArray =
117 CAllThreadsScripts::GetActiveSet()->GetAvailableScripts(pluginEvent);
119 for (size_t iPlugin = 0 ; iPlugin < piPluginArray->size() ; iPlugin++)
121 const PluginInfoPtr& plugin = piPluginArray->at(iPlugin);
122 int ind = m_list.InsertItem(m_list.GetItemCount(), plugin->m_name.c_str());
123 m_list.SetItemText(ind, 1, pluginType.c_str());
124 m_list.SetItemText(ind, 2, plugin->m_description.c_str());
125 m_list.SetCheck(ind, !plugin->m_disabled);
126 m_list.SetItemData(ind, reinterpret_cast<DWORD_PTR>(plugin.get()));
130 PluginInfo *PluginsListDlg::GetSelectedPluginInfo() const
132 int ind = m_list.GetNextItem(-1, LVNI_SELECTED);
135 return reinterpret_cast<PluginInfo *>(m_list.GetItemData(ind));
139 * @brief Save plugins enabled setting when closing the dialog.
141 void PluginsListDlg::OnBnClickedOk()
143 GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED,
144 (IsDlgButtonChecked(IDC_PLUGINS_ENABLE) == 1));
146 OnLVNItemChanging(nullptr, nullptr);
148 for (int i = 0; i < m_list.GetItemCount(); ++i)
150 PluginInfo * plugin = CAllThreadsScripts::GetActiveSet()->GetPluginByName(nullptr, String(m_list.GetItemText(i, 0)));
151 plugin->m_disabled = !m_list.GetCheck(i);
154 CAllThreadsScripts::GetActiveSet()->SaveSettings();
155 CAllThreadsScripts::ReloadCustomSettings();
159 void PluginsListDlg::OnBnClickedPluginSettings()
161 POSITION pos = m_list.GetFirstSelectedItemPosition();
164 String pluginName = static_cast<const TCHAR *>(m_list.GetItemText(m_list.GetNextSelectedItem(pos), 0));
165 for (int i = 0; TransformationCategories[i] != nullptr; ++i)
167 PluginInfo * plugin = CAllThreadsScripts::GetActiveSet()->GetPluginByName(TransformationCategories[i], pluginName);
168 if (plugin != nullptr)
171 plugin::InvokeShowSettingsDialog(plugin->m_lpDispatch);
173 SetForegroundWindow();
180 void PluginsListDlg::OnBnClickedFileFiltesDefaults()
182 PluginInfo *plugin = GetSelectedPluginInfo();
185 SetDlgItemText(IDC_PLUGIN_FILEFILTERS, plugin->m_filtersTextDefault);
186 SetDlgItemText(IDC_PLUGIN_ARGUMENTS, plugin->m_argumentsDefault);
187 CheckDlgButton(IDC_PLUGIN_AUTOMATIC, plugin->m_bAutomaticDefault);
191 void PluginsListDlg::OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult)
193 OnBnClickedPluginSettings();
196 void PluginsListDlg::OnLVNItemChanging(NMHDR *pNMHDR, LRESULT *pResult)
198 PluginInfo *plugin = GetSelectedPluginInfo();
201 GetDlgItemText(IDC_PLUGIN_FILEFILTERS, plugin->m_filtersText);
202 WildcardRemoveDuplicatePatterns(plugin->m_filtersText);
203 plugin->LoadFilterString();
204 GetDlgItemText(IDC_PLUGIN_ARGUMENTS, plugin->m_arguments);
205 plugin->m_bAutomatic = !!IsDlgButtonChecked(IDC_PLUGIN_AUTOMATIC);
209 void PluginsListDlg::OnLVNItemChanged(NMHDR *pNMHDR, LRESULT *pResult)
211 PluginInfo *plugin = GetSelectedPluginInfo();
214 SetDlgItemText(IDC_PLUGIN_FILEFILTERS, plugin->m_filtersText);
215 SetDlgItemText(IDC_PLUGIN_ARGUMENTS, plugin->m_arguments);
216 CheckDlgButton(IDC_PLUGIN_AUTOMATIC, plugin->m_bAutomatic);
221 * @brief Prepares multi-selection drop list
223 void PluginsListDlg::OnDropDownPatterns()
225 PluginInfo *plugin = GetSelectedPluginInfo();
228 String patterns = plugin->m_filtersTextDefault;
229 WildcardDropList::OnDropDown(m_comboPatterns, 3, patterns.c_str());
234 * @brief Finishes drop list multi-selection
236 void PluginsListDlg::OnCloseUpPatterns()
238 WildcardDropList::OnCloseUp(m_comboPatterns);
242 * @brief Open help from mainframe when user presses F1.
244 void PluginsListDlg::OnHelp()
246 theApp.ShowHelp(PluginsHelpLocation);