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_FILEFILTERS_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);
129 PluginInfo *PluginsListDlg::GetSelectedPluginInfo() const
131 String name = m_list.GetItemText(m_list.GetNextItem(-1, LVNI_SELECTED), 0);
132 return CAllThreadsScripts::GetActiveSet()->GetPluginByName(nullptr, name);
136 * @brief Save plugins enabled setting when closing the dialog.
138 void PluginsListDlg::OnBnClickedOk()
140 GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED,
141 (IsDlgButtonChecked(IDC_PLUGINS_ENABLE) == 1));
143 OnLVNItemChanging(nullptr, nullptr);
145 for (int i = 0; i < m_list.GetItemCount(); ++i)
147 PluginInfo * plugin = CAllThreadsScripts::GetActiveSet()->GetPluginByName(nullptr, String(m_list.GetItemText(i, 0)));
148 plugin->m_disabled = !m_list.GetCheck(i);
151 CAllThreadsScripts::GetActiveSet()->SaveSettings();
155 void PluginsListDlg::OnBnClickedPluginSettings()
157 POSITION pos = m_list.GetFirstSelectedItemPosition();
160 String pluginName = static_cast<const TCHAR *>(m_list.GetItemText(m_list.GetNextSelectedItem(pos), 0));
161 for (int i = 0; TransformationCategories[i] != nullptr; ++i)
163 PluginInfo * plugin = CAllThreadsScripts::GetActiveSet()->GetPluginByName(TransformationCategories[i], pluginName);
164 if (plugin != nullptr)
167 plugin::InvokeShowSettingsDialog(plugin->m_lpDispatch);
169 SetForegroundWindow();
176 void PluginsListDlg::OnBnClickedFileFiltesDefaults()
178 PluginInfo *plugin = GetSelectedPluginInfo();
180 SetDlgItemText(IDC_PLUGIN_FILEFILTERS, plugin->m_filtersTextDefault);
183 void PluginsListDlg::OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult)
185 OnBnClickedPluginSettings();
188 void PluginsListDlg::OnLVNItemChanging(NMHDR *pNMHDR, LRESULT *pResult)
190 PluginInfo *plugin = GetSelectedPluginInfo();
193 GetDlgItemText(IDC_PLUGIN_FILEFILTERS, plugin->m_filtersText);
194 WildcardRemoveDuplicatePatterns(plugin->m_filtersText);
195 plugin->LoadFilterString();
199 void PluginsListDlg::OnLVNItemChanged(NMHDR *pNMHDR, LRESULT *pResult)
201 PluginInfo *plugin = GetSelectedPluginInfo();
203 SetDlgItemText(IDC_PLUGIN_FILEFILTERS, plugin->m_filtersText);
207 * @brief Prepares multi-selection drop list
209 void PluginsListDlg::OnDropDownPatterns()
211 PluginInfo *plugin = GetSelectedPluginInfo();
214 String patterns = plugin->m_filtersTextDefault;
215 WildcardDropList::OnDropDown(m_comboPatterns, 3, patterns.c_str());
220 * @brief Finishes drop list multi-selection
222 void PluginsListDlg::OnCloseUpPatterns()
224 WildcardDropList::OnCloseUp(m_comboPatterns);
228 * @brief Open help from mainframe when user presses F1.
230 void PluginsListDlg::OnHelp()
232 theApp.ShowHelp(PluginsHelpLocation);