OSDN Git Service

* Introduce new plugin type FILE_FOLDER_PACK_UNPACKER
[winmerge-jp/winmerge-jp.git] / Src / PluginsListDlg.cpp
1 /**
2  * @file  PluginsListDlg.cpp
3  *
4  * @brief Implementation file for PluginsList dialog
5  */
6 // ID line follows -- this is updated by SVN
7 // $Id$
8
9 #include "stdafx.h"
10 #include "PluginsListDlg.h"
11 #include "UnicodeString.h"
12 #include "Merge.h"
13 #include "Plugins.h"
14 #include "OptionsDef.h"
15 #include "OptionsMgr.h"
16
17 IMPLEMENT_DYNAMIC(PluginsListDlg, CDialog)
18
19 BEGIN_MESSAGE_MAP(PluginsListDlg, CDialog)
20         ON_BN_CLICKED(IDOK, OnBnClickedOk)
21         ON_BN_CLICKED(IDC_PLUGIN_SETTINGS, OnBnClickedPluginSettings)
22         ON_NOTIFY(NM_DBLCLK, IDC_PLUGINSLIST_LIST, OnNMDblclkList)
23 END_MESSAGE_MAP()
24
25 /**
26  * @brief Constructor.
27  */
28 PluginsListDlg::PluginsListDlg(CWnd* pParent /*=NULL*/)
29         : CDialog(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         CDialog::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         theApp.TranslateDialog(m_hWnd);
52         CDialog::OnInitDialog();
53         
54         InitList();
55         AddPlugins();
56         m_list.SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);
57
58         BOOL pluginsEnabled = GetOptionsMgr()->GetBool(OPT_PLUGINS_ENABLED);
59         if (pluginsEnabled)
60         {
61                 CButton *btn = (CButton *)GetDlgItem(IDC_PLUGINS_ENABLE);
62                 btn->SetCheck(BST_CHECKED);
63         }
64
65         return FALSE;  // return TRUE unless you set the focus to a control
66                       // EXCEPTION: OCX Property Pages should return FALSE
67 }
68
69 /**
70  * @brief Set-up the list control.
71  */
72 void PluginsListDlg::InitList()
73 {
74         // Show selection across entire row.
75         // Also enable infotips.
76         m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_INFOTIP);
77
78         String title = LoadResString(IDS_PLUGINSLIST_NAME);
79         m_list.InsertColumn(0, title.c_str(), LVCFMT_LEFT, 150);
80         title = LoadResString(IDS_PLUGINSLIST_TYPE);
81         m_list.InsertColumn(1, title.c_str(), LVCFMT_LEFT, 100);
82         title = LoadResString(IDS_PLUGINSLIST_DESC);
83         m_list.InsertColumn(2, title.c_str(), LVCFMT_LEFT, 300);
84 }
85
86 /**
87  * @brief Add found plugins to the list.
88  */
89 void PluginsListDlg::AddPlugins()
90 {
91         String type = LoadResString(IDS_PLUGINS_TYPE_UNPACKER);
92         AddPluginsToList(L"FILE_PACK_UNPACK", type.c_str());
93         AddPluginsToList(L"BUFFER_PACK_UNPACK", type.c_str());
94         AddPluginsToList(L"FILE_FOLDER_PACK_UNPACK", type.c_str());
95         type = LoadResString(IDS_PLUGINS_TYPE_PREDIFFER);
96         AddPluginsToList(L"FILE_PREDIFF", type.c_str());
97         AddPluginsToList(L"BUFFER_PREDIFF", type.c_str());
98         type = LoadResString(IDS_PLUGINS_TYPE_EDITSCRIPT);
99         AddPluginsToList(L"EDITOR_SCRIPT", type.c_str());
100 }
101
102 /**
103  * @brief Add plugins of given event type to the list.
104  * @param [in] pluginEvent Event type for plugins to add.
105  * @param [in] pluginType String to use as type in the list.
106  */
107 void PluginsListDlg::AddPluginsToList(LPCWSTR pluginEvent, LPCTSTR pluginType)
108 {
109         PluginArray * piPluginArray = 
110                 CAllThreadsScripts::GetActiveSet()->GetAvailableScripts(pluginEvent);
111
112         for (int iPlugin = 0 ; iPlugin < piPluginArray->size() ; iPlugin++)
113         {
114                 const PluginInfoPtr& plugin = piPluginArray->at(iPlugin);
115                 int ind = m_list.InsertItem(m_list.GetItemCount(), plugin->m_name.c_str());
116                 m_list.SetItemText(ind, 1, pluginType);
117                 m_list.SetItemText(ind, 2, plugin->m_description.c_str());
118         }
119 }
120
121 /**
122  * @brief Save plugins enabled setting when closing the dialog.
123  */
124 void PluginsListDlg::OnBnClickedOk()
125 {
126         CButton *btn = (CButton *)GetDlgItem(IDC_PLUGINS_ENABLE);
127         int check = btn->GetCheck();
128         if (check == BST_CHECKED)
129         {
130                 GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED, true);
131         }
132         else
133         {
134                 GetOptionsMgr()->SaveOption(OPT_PLUGINS_ENABLED, false);
135         }
136         OnOK();
137 }
138
139 void PluginsListDlg::OnBnClickedPluginSettings()
140 {
141         POSITION pos = m_list.GetFirstSelectedItemPosition();
142         if (pos)
143         {
144                 String pluginName = static_cast<const TCHAR *>(m_list.GetItemText(m_list.GetNextSelectedItem(pos), 0));
145                 for (int i = 0; TransformationCategories[i]; ++i)
146                 {
147                         PluginInfo * plugin = CAllThreadsScripts::GetActiveSet()->GetPluginByName(TransformationCategories[i], pluginName);
148                         if (plugin)
149                         {
150                                 EnableWindow(false);
151                                 InvokeShowSettingsDialog(plugin->m_lpDispatch);
152                                 EnableWindow(true);
153                                 SetForegroundWindow();
154                                 break;
155                         }
156                 }
157         }
158 }
159
160 void PluginsListDlg::OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult)
161 {
162         OnBnClickedPluginSettings();
163 }