OSDN Git Service

Add WinMergePluginBase.h (2)
[winmerge-jp/winmerge-jp.git] / Src / PluginsListDlg.cpp
1 /**
2  * @file  PluginsListDlg.cpp
3  *
4  * @brief Implementation file for PluginsList dialog
5  */
6
7 #include "stdafx.h"
8 #include "PluginsListDlg.h"
9 #include "WildcardDropList.h"
10 #include "UnicodeString.h"
11 #include "Plugins.h"
12 #include "OptionsDef.h"
13 #include "OptionsMgr.h"
14 #include "Merge.h"
15
16 /** @brief Location for plugins specific help to open. */
17 static TCHAR PluginsHelpLocation[] = _T("::/htmlhelp/Plugins.html");
18
19 IMPLEMENT_DYNAMIC(PluginsListDlg, CTrDialog)
20
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)
31 END_MESSAGE_MAP()
32
33 /**
34  * @brief Constructor.
35  */
36 PluginsListDlg::PluginsListDlg(CWnd* pParent /*= nullptr*/)
37         : CTrDialog(PluginsListDlg::IDD, pParent)
38 {
39 }
40
41 /**
42  * @brief Destructor.
43  */
44 PluginsListDlg::~PluginsListDlg()
45 {
46 }
47
48 void PluginsListDlg::DoDataExchange(CDataExchange* pDX)
49 {
50         CTrDialog::DoDataExchange(pDX);
51         DDX_Control(pDX, IDC_PLUGINSLIST_LIST, m_list);
52         DDX_Control(pDX, IDC_PLUGIN_FILEFILTERS, m_comboPatterns);
53 }
54
55 /**
56  * @brief Initialize the dialog.
57  */
58 BOOL PluginsListDlg::OnInitDialog()
59 {
60         CTrDialog::OnInitDialog();
61         
62         InitList();
63         AddPlugins();
64         m_list.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);
65
66         CheckDlgButton(IDC_PLUGINS_ENABLE, 
67                 GetOptionsMgr()->GetBool(OPT_PLUGINS_ENABLED) ? BST_CHECKED : BST_UNCHECKED);
68
69         return FALSE;  // return TRUE unless you set the focus to a control
70                       // EXCEPTION: OCX Property Pages should return FALSE
71 }
72
73 /**
74  * @brief Set-up the list control.
75  */
76 void PluginsListDlg::InitList()
77 {
78         // Show selection across entire row.
79         // Also enable infotips.
80         m_list.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP);
81
82         const int lpx = CClientDC(this).GetDeviceCaps(LOGPIXELSX);
83         auto pointToPixel = [lpx](int point) { return MulDiv(point, lpx, 72); };
84
85         String title = _("Name");
86         m_list.InsertColumn(0, title.c_str(), LVCFMT_LEFT, pointToPixel(150));
87         title = _("Type");
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));
91 }
92
93 /**
94  * @brief Add found plugins to the list.
95  */
96 void PluginsListDlg::AddPlugins()
97 {
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);
107 }
108
109 /**
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.
113  */
114 void PluginsListDlg::AddPluginsToList(const wchar_t *pluginEvent, const String& pluginType)
115 {
116         PluginArray * piPluginArray = 
117                 CAllThreadsScripts::GetActiveSet()->GetAvailableScripts(pluginEvent);
118
119         for (size_t iPlugin = 0 ; iPlugin < piPluginArray->size() ; iPlugin++)
120         {
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         }
127 }
128
129 PluginInfo *PluginsListDlg::GetSelectedPluginInfo() const
130 {
131         String name = m_list.GetItemText(m_list.GetNextItem(-1, LVNI_SELECTED), 0);
132         return CAllThreadsScripts::GetActiveSet()->GetPluginByName(nullptr, name);
133 }
134
135 /**
136  * @brief Save plugins enabled setting when closing the dialog.
137  */
138 void PluginsListDlg::OnBnClickedOk()
139 {
140         GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED, 
141                 (IsDlgButtonChecked(IDC_PLUGINS_ENABLE) == 1));
142
143         OnLVNItemChanging(nullptr, nullptr);
144
145         for (int i = 0; i < m_list.GetItemCount(); ++i)
146         {
147                 PluginInfo * plugin = CAllThreadsScripts::GetActiveSet()->GetPluginByName(nullptr, String(m_list.GetItemText(i, 0)));
148                 plugin->m_disabled = !m_list.GetCheck(i);
149         }
150
151         CAllThreadsScripts::GetActiveSet()->SaveSettings();
152         OnOK();
153 }
154
155 void PluginsListDlg::OnBnClickedPluginSettings()
156 {
157         POSITION pos = m_list.GetFirstSelectedItemPosition();
158         if (pos != nullptr)
159         {
160                 String pluginName = static_cast<const TCHAR *>(m_list.GetItemText(m_list.GetNextSelectedItem(pos), 0));
161                 for (int i = 0; TransformationCategories[i] != nullptr; ++i)
162                 {
163                         PluginInfo * plugin = CAllThreadsScripts::GetActiveSet()->GetPluginByName(TransformationCategories[i], pluginName);
164                         if (plugin != nullptr)
165                         {
166                                 EnableWindow(false);
167                                 plugin::InvokeShowSettingsDialog(plugin->m_lpDispatch);
168                                 EnableWindow(true);
169                                 SetForegroundWindow();
170                                 break;
171                         }
172                 }
173         }
174 }
175
176 void PluginsListDlg::OnBnClickedFileFiltesDefaults()
177 {
178         PluginInfo *plugin = GetSelectedPluginInfo();
179         if (plugin)
180                 SetDlgItemText(IDC_PLUGIN_FILEFILTERS, plugin->m_filtersTextDefault);
181 }
182
183 void PluginsListDlg::OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult)
184 {
185         OnBnClickedPluginSettings();
186 }
187
188 void PluginsListDlg::OnLVNItemChanging(NMHDR *pNMHDR, LRESULT *pResult)
189 {
190         PluginInfo *plugin = GetSelectedPluginInfo();
191         if (plugin)
192         {
193                 GetDlgItemText(IDC_PLUGIN_FILEFILTERS, plugin->m_filtersText);
194                 WildcardRemoveDuplicatePatterns(plugin->m_filtersText);
195                 plugin->LoadFilterString();
196         }
197 }
198
199 void PluginsListDlg::OnLVNItemChanged(NMHDR *pNMHDR, LRESULT *pResult)
200 {
201         PluginInfo *plugin = GetSelectedPluginInfo();
202         if (plugin)
203                 SetDlgItemText(IDC_PLUGIN_FILEFILTERS, plugin->m_filtersText);
204 }
205
206 /**
207  * @brief Prepares multi-selection drop list 
208  */
209 void PluginsListDlg::OnDropDownPatterns()
210 {
211         PluginInfo *plugin = GetSelectedPluginInfo();
212         if (plugin)
213         {
214                 String patterns = plugin->m_filtersTextDefault;
215                 WildcardDropList::OnDropDown(m_comboPatterns, 3, patterns.c_str());
216         }
217 }
218
219 /**
220  * @brief Finishes drop list multi-selection
221  */
222 void PluginsListDlg::OnCloseUpPatterns()
223 {
224         WildcardDropList::OnCloseUp(m_comboPatterns);
225 }
226
227 /**
228  * @brief Open help from mainframe when user presses F1.
229  */
230 void PluginsListDlg::OnHelp()
231 {
232         theApp.ShowHelp(PluginsHelpLocation);
233 }
234