Imported Upstream version 9.20
[platform/upstream/7zip.git] / CPP / 7zip / UI / FileManager / PluginsPage.cpp
1 // PluginsPage.cpp\r
2 \r
3 #include "StdAfx.h"\r
4 \r
5 #include "Common/MyCom.h"\r
6 \r
7 #include "Windows/DLL.h"\r
8 \r
9 #include "HelpUtils.h"\r
10 #include "LangUtils.h"\r
11 #include "PluginsPage.h"\r
12 #include "PluginsPageRes.h"\r
13 #include "ProgramLocation.h"\r
14 #include "PluginInterface.h"\r
15 \r
16 static CIDLangPair kIDLangPairs[] =\r
17 {\r
18   { IDC_PLUGINS_STATIC_PLUGINS, 0x03010101},\r
19   { IDC_PLUGINS_BUTTON_OPTIONS, 0x03010110}\r
20 };\r
21 \r
22 static LPCWSTR kPluginsTopic = L"FM/options.htm#plugins";\r
23 \r
24 bool CPluginsPage::OnInit()\r
25 {\r
26   LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0]));\r
27 \r
28   _listView.Attach(GetItem(IDC_PLUGINS_LIST));\r
29 \r
30   UINT32 newFlags = /* LVS_EX_CHECKBOXES | */ LVS_EX_FULLROWSELECT;\r
31   _listView.SetExtendedListViewStyle(newFlags, newFlags);\r
32 \r
33   _listView.InsertColumn(0, L"Plugins", 50);\r
34   \r
35   ReadFileFolderPluginInfoList(_plugins);\r
36 \r
37   _listView.SetRedraw(false);\r
38   // _listView.DeleteAllItems();\r
39   for (int i = 0; i < _plugins.Size(); i++)\r
40   {\r
41     const CPluginInfo &p = _plugins[i];\r
42     if (!p.OptionsClassIDDefined)\r
43       continue;\r
44     LVITEMW item;\r
45     item.iItem = i;\r
46     item.mask = LVIF_TEXT | LVIF_STATE;\r
47     UString pluginName = p.Name;\r
48     item.pszText = (WCHAR *)(const WCHAR *)pluginName;\r
49     item.state = 0;\r
50     item.stateMask = UINT(-1);\r
51     item.iSubItem = 0;\r
52     _listView.InsertItem(&item);\r
53     _listView.SetCheckState(i, true);\r
54   }\r
55   _listView.SetRedraw(true);\r
56   if (_listView.GetItemCount() > 0)\r
57   {\r
58     UINT state = LVIS_SELECTED | LVIS_FOCUSED;\r
59     _listView.SetItemState(0, state, state);\r
60   }\r
61   _listView.SetColumnWidthAuto(0);\r
62 \r
63   return CPropertyPage::OnInit();\r
64 }\r
65 \r
66 LONG CPluginsPage::OnApply()\r
67 {\r
68   /*\r
69   int selectedIndex = m_Lang.GetCurSel();\r
70   int aPathIndex = m_Lang.GetItemData(selectedIndex);\r
71   SaveRegLang(m_Paths[aPathIndex]);\r
72   ReloadLang();\r
73   */\r
74   return PSNRET_NOERROR;\r
75 }\r
76 \r
77 void CPluginsPage::OnNotifyHelp()\r
78 {\r
79   ShowHelpWindow(NULL, kPluginsTopic);\r
80 }\r
81 \r
82 bool CPluginsPage::OnButtonClicked(int buttonID, HWND buttonHWND)\r
83 {\r
84   switch(buttonID)\r
85   {\r
86     case IDC_PLUGINS_BUTTON_OPTIONS:\r
87       OnButtonOptions();\r
88       break;\r
89     default:\r
90       return CPropertyPage::OnButtonClicked(buttonID, buttonHWND);\r
91   }\r
92   return true;\r
93 }\r
94 \r
95 class CPluginOptionsCallback:\r
96   public IPluginOptionsCallback,\r
97   public CMyUnknownImp\r
98 {\r
99   UString _pluginName;\r
100 public:\r
101   MY_UNKNOWN_IMP\r
102 \r
103   STDMETHOD(GetProgramFolderPath)(BSTR *value);\r
104   STDMETHOD(GetProgramPath)(BSTR *Value);\r
105   STDMETHOD(GetRegistryCUPath)(BSTR *Value);\r
106   void Init(const UString &pluginName)\r
107     { _pluginName = pluginName; }\r
108 };\r
109 \r
110 STDMETHODIMP CPluginOptionsCallback::GetProgramFolderPath(BSTR *value)\r
111 {\r
112   *value = 0;\r
113   UString folder;\r
114   if (!::GetProgramFolderPath(folder))\r
115     return E_FAIL;\r
116   return StringToBstr(folder, value);\r
117 }\r
118 \r
119 static UString GetDefaultProgramName()\r
120 {\r
121   return L"7zFM.exe";\r
122 }\r
123 \r
124 STDMETHODIMP CPluginOptionsCallback::GetProgramPath(BSTR *value)\r
125 {\r
126   *value = 0;\r
127   UString folder;\r
128   if (!::GetProgramFolderPath(folder))\r
129     return E_FAIL;\r
130   return StringToBstr(folder + GetDefaultProgramName(), value);\r
131 }\r
132 \r
133 STDMETHODIMP CPluginOptionsCallback::GetRegistryCUPath(BSTR *value)\r
134 {\r
135   return StringToBstr(UString(L"Software"\r
136     WSTRING_PATH_SEPARATOR L"7-Zip"\r
137     WSTRING_PATH_SEPARATOR L"FM"\r
138     WSTRING_PATH_SEPARATOR L"Plugins"\r
139     WSTRING_PATH_SEPARATOR) + _pluginName, value);\r
140 }\r
141 \r
142 void CPluginsPage::OnButtonOptions()\r
143 {\r
144   int index = _listView.GetSelectionMark();\r
145   if (index < 0)\r
146     return;\r
147 \r
148   CPluginInfo pluginInfo = _plugins[index];\r
149   if (!pluginInfo.OptionsClassIDDefined)\r
150   {\r
151     MessageBoxW(HWND(*this), L"There are no options", L"7-Zip", 0);\r
152     return;\r
153   }\r
154   NWindows::NDLL::CLibrary lib;\r
155   CMyComPtr<IPluginOptions> pluginOptions;\r
156   if (!lib.Load(pluginInfo.FilePath))\r
157   {\r
158     MessageBoxW(HWND(*this), L"Can't load plugin", L"7-Zip", 0);\r
159     return;\r
160   }\r
161   typedef UINT32 (WINAPI * CreateObjectPointer)(const GUID *clsID, const GUID *interfaceID, void **outObject);\r
162   CreateObjectPointer createObject = (CreateObjectPointer)lib.GetProc("CreateObject");\r
163   if (createObject == NULL)\r
164   {\r
165     MessageBoxW(HWND(*this), L"Incorrect plugin", L"7-Zip", 0);\r
166     return;\r
167   }\r
168   if (createObject(&pluginInfo.OptionsClassID, &IID_IPluginOptions, (void **)&pluginOptions) != S_OK)\r
169   {\r
170     MessageBoxW(HWND(*this), L"There are no options", L"7-Zip", 0);\r
171     return;\r
172   }\r
173   CPluginOptionsCallback *callbackSpec = new CPluginOptionsCallback;\r
174   CMyComPtr<IPluginOptionsCallback> callback(callbackSpec);\r
175   callbackSpec->Init(pluginInfo.Name);\r
176   pluginOptions->PluginOptions(HWND(*this), callback);\r
177 }\r
178 \r
179 bool CPluginsPage::OnNotify(UINT controlID, LPNMHDR lParam)\r
180 {\r
181   if (lParam->hwndFrom == HWND(_listView) && lParam->code == LVN_ITEMCHANGED)\r
182   {\r
183     const NMLISTVIEW *aNMListView = (const NMLISTVIEW *)lParam;\r
184     if ((aNMListView->uChanged & LVIF_STATE) != 0)\r
185     {\r
186       UINT oldState = aNMListView->uOldState & LVIS_STATEIMAGEMASK;\r
187       UINT newState = aNMListView->uNewState & LVIS_STATEIMAGEMASK;\r
188       if (oldState != newState)\r
189         Changed();\r
190     }\r
191     return true;\r
192   }\r
193   return CPropertyPage::OnNotify(controlID, lParam);\r
194 }\r
195 \r
196 /*\r
197 bool CPluginsPage::OnCommand(int code, int itemID, LPARAM lParam)\r
198 {\r
199   if (code == CBN_SELCHANGE && itemID == IDC_LANG_COMBO_LANG)\r
200   {\r
201     Changed();\r
202     return true;\r
203   }\r
204   return CPropertyPage::OnCommand(code, itemID, lParam);\r
205 }\r
206 \r
207 */\r