OSDN Git Service

Merge remote-tracking branch 'upstream/master'
[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 "UnicodeString.h"
10 #include "Plugins.h"
11 #include "OptionsDef.h"
12 #include "OptionsMgr.h"
13
14 IMPLEMENT_DYNAMIC(PluginsListDlg, CTrDialog)
15
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)
23 END_MESSAGE_MAP()
24
25 /**
26  * @brief Constructor.
27  */
28 PluginsListDlg::PluginsListDlg(CWnd* pParent /*= nullptr*/)
29         : CTrDialog(PluginsListDlg::IDD, pParent)
30 {
31 }
32
33 /**
34  * @brief Destructor.
35  */
36 PluginsListDlg::~PluginsListDlg()
37 {
38 }
39
40 void PluginsListDlg::DoDataExchange(CDataExchange* pDX)
41 {
42         CTrDialog::DoDataExchange(pDX);
43         DDX_Control(pDX, IDC_PLUGINSLIST_LIST, m_list);
44 }
45
46 /**
47  * @brief Initialize the dialog.
48  */
49 BOOL PluginsListDlg::OnInitDialog()
50 {
51         CTrDialog::OnInitDialog();
52         
53         InitList();
54         AddPlugins();
55         m_list.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);
56
57         CheckDlgButton(IDC_PLUGINS_ENABLE, 
58                 GetOptionsMgr()->GetBool(OPT_PLUGINS_ENABLED) ? BST_CHECKED : BST_UNCHECKED);
59
60         return FALSE;  // return TRUE unless you set the focus to a control
61                       // EXCEPTION: OCX Property Pages should return FALSE
62 }
63
64 /**
65  * @brief Set-up the list control.
66  */
67 void PluginsListDlg::InitList()
68 {
69         // Show selection across entire row.
70         // Also enable infotips.
71         m_list.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP);
72
73         const int lpx = CClientDC(this).GetDeviceCaps(LOGPIXELSX);
74         auto pointToPixel = [lpx](int point) { return MulDiv(point, lpx, 72); };
75
76         String title = _("Name");
77         m_list.InsertColumn(0, title.c_str(), LVCFMT_LEFT, pointToPixel(150));
78         title = _("Type");
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));
82 }
83
84 /**
85  * @brief Add found plugins to the list.
86  */
87 void PluginsListDlg::AddPlugins()
88 {
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);
98 }
99
100 /**
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.
104  */
105 void PluginsListDlg::AddPluginsToList(const wchar_t *pluginEvent, const String& pluginType)
106 {
107         PluginArray * piPluginArray = 
108                 CAllThreadsScripts::GetActiveSet()->GetAvailableScripts(pluginEvent);
109
110         for (size_t iPlugin = 0 ; iPlugin < piPluginArray->size() ; iPlugin++)
111         {
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);
117         }
118 }
119
120 PluginInfo *PluginsListDlg::GetSelectedPluginInfo() const
121 {
122         String name = m_list.GetItemText(m_list.GetNextItem(-1, LVNI_SELECTED), 0);
123         return CAllThreadsScripts::GetActiveSet()->GetPluginByName(nullptr, name);
124 }
125
126 /**
127  * @brief Save plugins enabled setting when closing the dialog.
128  */
129 void PluginsListDlg::OnBnClickedOk()
130 {
131         GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED, 
132                 (IsDlgButtonChecked(IDC_PLUGINS_ENABLE) == 1));
133
134         OnLVNItemChanging(nullptr, nullptr);
135
136         for (int i = 0; i < m_list.GetItemCount(); ++i)
137         {
138                 PluginInfo * plugin = CAllThreadsScripts::GetActiveSet()->GetPluginByName(nullptr, String(m_list.GetItemText(i, 0)));
139                 plugin->m_disabled = !m_list.GetCheck(i);
140         }
141
142         CAllThreadsScripts::GetActiveSet()->SaveSettings();
143         OnOK();
144 }
145
146 void PluginsListDlg::OnBnClickedPluginSettings()
147 {
148         POSITION pos = m_list.GetFirstSelectedItemPosition();
149         if (pos != nullptr)
150         {
151                 String pluginName = static_cast<const TCHAR *>(m_list.GetItemText(m_list.GetNextSelectedItem(pos), 0));
152                 for (int i = 0; TransformationCategories[i] != nullptr; ++i)
153                 {
154                         PluginInfo * plugin = CAllThreadsScripts::GetActiveSet()->GetPluginByName(TransformationCategories[i], pluginName);
155                         if (plugin != nullptr)
156                         {
157                                 EnableWindow(false);
158                                 plugin::InvokeShowSettingsDialog(plugin->m_lpDispatch);
159                                 EnableWindow(true);
160                                 SetForegroundWindow();
161                                 break;
162                         }
163                 }
164         }
165 }
166
167 void PluginsListDlg::OnBnClickedFileFiltesDefaults()
168 {
169         PluginInfo *plugin = GetSelectedPluginInfo();
170         if (plugin)
171                 SetDlgItemText(IDC_PLUGIN_FILEFILTERS, plugin->m_filtersTextDefault);
172 }
173
174 void PluginsListDlg::OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult)
175 {
176         OnBnClickedPluginSettings();
177 }
178
179 void PluginsListDlg::OnLVNItemChanging(NMHDR *pNMHDR, LRESULT *pResult)
180 {
181         PluginInfo *plugin = GetSelectedPluginInfo();
182         if (plugin)
183         {
184                 GetDlgItemText(IDC_PLUGIN_FILEFILTERS, plugin->m_filtersText);
185                 plugin->LoadFilterString();
186         }
187 }
188
189 void PluginsListDlg::OnLVNItemChanged(NMHDR *pNMHDR, LRESULT *pResult)
190 {
191         PluginInfo *plugin = GetSelectedPluginInfo();
192         if (plugin)
193                 SetDlgItemText(IDC_PLUGIN_FILEFILTERS, plugin->m_filtersText);
194 }