OSDN Git Service

Merge with stable
[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 "Merge.h"
11 #include "Plugins.h"
12 #include "OptionsDef.h"
13 #include "OptionsMgr.h"
14
15 IMPLEMENT_DYNAMIC(PluginsListDlg, CDialog)
16
17 BEGIN_MESSAGE_MAP(PluginsListDlg, CDialog)
18         ON_BN_CLICKED(IDOK, OnBnClickedOk)
19         ON_BN_CLICKED(IDC_PLUGIN_SETTINGS, OnBnClickedPluginSettings)
20         ON_NOTIFY(NM_DBLCLK, IDC_PLUGINSLIST_LIST, OnNMDblclkList)
21 END_MESSAGE_MAP()
22
23 /**
24  * @brief Constructor.
25  */
26 PluginsListDlg::PluginsListDlg(CWnd* pParent /*=NULL*/)
27         : CDialog(PluginsListDlg::IDD, pParent)
28 {
29 }
30
31 /**
32  * @brief Destructor.
33  */
34 PluginsListDlg::~PluginsListDlg()
35 {
36 }
37
38 void PluginsListDlg::DoDataExchange(CDataExchange* pDX)
39 {
40         CDialog::DoDataExchange(pDX);
41         DDX_Control(pDX, IDC_PLUGINSLIST_LIST, m_list);
42 }
43
44 /**
45  * @brief Initialize the dialog.
46  */
47 BOOL PluginsListDlg::OnInitDialog()
48 {
49         theApp.TranslateDialog(m_hWnd);
50         CDialog::OnInitDialog();
51         
52         InitList();
53         AddPlugins();
54         m_list.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);
55
56         bool pluginsEnabled = GetOptionsMgr()->GetBool(OPT_PLUGINS_ENABLED);
57         if (pluginsEnabled)
58         {
59                 CButton *btn = (CButton *)GetDlgItem(IDC_PLUGINS_ENABLE);
60                 btn->SetCheck(BST_CHECKED);
61         }
62
63         return FALSE;  // return TRUE unless you set the focus to a control
64                       // EXCEPTION: OCX Property Pages should return FALSE
65 }
66
67 /**
68  * @brief Set-up the list control.
69  */
70 void PluginsListDlg::InitList()
71 {
72         // Show selection across entire row.
73         // Also enable infotips.
74         m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP);
75
76         String title = _("Name");
77         m_list.InsertColumn(0, title.c_str(), LVCFMT_LEFT, 150);
78         title = _("Type");
79         m_list.InsertColumn(1, title.c_str(), LVCFMT_LEFT, 100);
80         title = _("Description");
81         m_list.InsertColumn(2, title.c_str(), LVCFMT_LEFT, 300);
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 (int 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         }
117 }
118
119 /**
120  * @brief Save plugins enabled setting when closing the dialog.
121  */
122 void PluginsListDlg::OnBnClickedOk()
123 {
124         CButton *btn = (CButton *)GetDlgItem(IDC_PLUGINS_ENABLE);
125         int check = btn->GetCheck();
126         if (check == BST_CHECKED)
127         {
128                 GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED, true);
129         }
130         else
131         {
132                 GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED, false);
133         }
134         OnOK();
135 }
136
137 void PluginsListDlg::OnBnClickedPluginSettings()
138 {
139         POSITION pos = m_list.GetFirstSelectedItemPosition();
140         if (pos)
141         {
142                 String pluginName = static_cast<const TCHAR *>(m_list.GetItemText(m_list.GetNextSelectedItem(pos), 0));
143                 for (int i = 0; TransformationCategories[i]; ++i)
144                 {
145                         PluginInfo * plugin = CAllThreadsScripts::GetActiveSet()->GetPluginByName(TransformationCategories[i], pluginName);
146                         if (plugin)
147                         {
148                                 EnableWindow(false);
149                                 InvokeShowSettingsDialog(plugin->m_lpDispatch);
150                                 EnableWindow(true);
151                                 SetForegroundWindow();
152                                 break;
153                         }
154                 }
155         }
156 }
157
158 void PluginsListDlg::OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult)
159 {
160         OnBnClickedPluginSettings();
161 }