5 #include "Common/MyCom.h"
\r
7 #include "Windows/DLL.h"
\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
16 static CIDLangPair kIDLangPairs[] =
\r
18 { IDC_PLUGINS_STATIC_PLUGINS, 0x03010101},
\r
19 { IDC_PLUGINS_BUTTON_OPTIONS, 0x03010110}
\r
22 static LPCWSTR kPluginsTopic = L"FM/options.htm#plugins";
\r
24 bool CPluginsPage::OnInit()
\r
26 LangSetDlgItemsText(HWND(*this), kIDLangPairs, sizeof(kIDLangPairs) / sizeof(kIDLangPairs[0]));
\r
28 _listView.Attach(GetItem(IDC_PLUGINS_LIST));
\r
30 UINT32 newFlags = /* LVS_EX_CHECKBOXES | */ LVS_EX_FULLROWSELECT;
\r
31 _listView.SetExtendedListViewStyle(newFlags, newFlags);
\r
33 _listView.InsertColumn(0, L"Plugins", 50);
\r
35 ReadFileFolderPluginInfoList(_plugins);
\r
37 _listView.SetRedraw(false);
\r
38 // _listView.DeleteAllItems();
\r
39 for (int i = 0; i < _plugins.Size(); i++)
\r
41 const CPluginInfo &p = _plugins[i];
\r
42 if (!p.OptionsClassIDDefined)
\r
46 item.mask = LVIF_TEXT | LVIF_STATE;
\r
47 UString pluginName = p.Name;
\r
48 item.pszText = (WCHAR *)(const WCHAR *)pluginName;
\r
50 item.stateMask = UINT(-1);
\r
52 _listView.InsertItem(&item);
\r
53 _listView.SetCheckState(i, true);
\r
55 _listView.SetRedraw(true);
\r
56 if (_listView.GetItemCount() > 0)
\r
58 UINT state = LVIS_SELECTED | LVIS_FOCUSED;
\r
59 _listView.SetItemState(0, state, state);
\r
61 _listView.SetColumnWidthAuto(0);
\r
63 return CPropertyPage::OnInit();
\r
66 LONG CPluginsPage::OnApply()
\r
69 int selectedIndex = m_Lang.GetCurSel();
\r
70 int aPathIndex = m_Lang.GetItemData(selectedIndex);
\r
71 SaveRegLang(m_Paths[aPathIndex]);
\r
74 return PSNRET_NOERROR;
\r
77 void CPluginsPage::OnNotifyHelp()
\r
79 ShowHelpWindow(NULL, kPluginsTopic);
\r
82 bool CPluginsPage::OnButtonClicked(int buttonID, HWND buttonHWND)
\r
86 case IDC_PLUGINS_BUTTON_OPTIONS:
\r
90 return CPropertyPage::OnButtonClicked(buttonID, buttonHWND);
\r
95 class CPluginOptionsCallback:
\r
96 public IPluginOptionsCallback,
\r
97 public CMyUnknownImp
\r
99 UString _pluginName;
\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
110 STDMETHODIMP CPluginOptionsCallback::GetProgramFolderPath(BSTR *value)
\r
114 if (!::GetProgramFolderPath(folder))
\r
116 return StringToBstr(folder, value);
\r
119 static UString GetDefaultProgramName()
\r
121 return L"7zFM.exe";
\r
124 STDMETHODIMP CPluginOptionsCallback::GetProgramPath(BSTR *value)
\r
128 if (!::GetProgramFolderPath(folder))
\r
130 return StringToBstr(folder + GetDefaultProgramName(), value);
\r
133 STDMETHODIMP CPluginOptionsCallback::GetRegistryCUPath(BSTR *value)
\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
142 void CPluginsPage::OnButtonOptions()
\r
144 int index = _listView.GetSelectionMark();
\r
148 CPluginInfo pluginInfo = _plugins[index];
\r
149 if (!pluginInfo.OptionsClassIDDefined)
\r
151 MessageBoxW(HWND(*this), L"There are no options", L"7-Zip", 0);
\r
154 NWindows::NDLL::CLibrary lib;
\r
155 CMyComPtr<IPluginOptions> pluginOptions;
\r
156 if (!lib.Load(pluginInfo.FilePath))
\r
158 MessageBoxW(HWND(*this), L"Can't load plugin", L"7-Zip", 0);
\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
165 MessageBoxW(HWND(*this), L"Incorrect plugin", L"7-Zip", 0);
\r
168 if (createObject(&pluginInfo.OptionsClassID, &IID_IPluginOptions, (void **)&pluginOptions) != S_OK)
\r
170 MessageBoxW(HWND(*this), L"There are no options", L"7-Zip", 0);
\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
179 bool CPluginsPage::OnNotify(UINT controlID, LPNMHDR lParam)
\r
181 if (lParam->hwndFrom == HWND(_listView) && lParam->code == LVN_ITEMCHANGED)
\r
183 const NMLISTVIEW *aNMListView = (const NMLISTVIEW *)lParam;
\r
184 if ((aNMListView->uChanged & LVIF_STATE) != 0)
\r
186 UINT oldState = aNMListView->uOldState & LVIS_STATEIMAGEMASK;
\r
187 UINT newState = aNMListView->uNewState & LVIS_STATEIMAGEMASK;
\r
188 if (oldState != newState)
\r
193 return CPropertyPage::OnNotify(controlID, lParam);
\r
197 bool CPluginsPage::OnCommand(int code, int itemID, LPARAM lParam)
\r
199 if (code == CBN_SELCHANGE && itemID == IDC_LANG_COMBO_LANG)
\r
204 return CPropertyPage::OnCommand(code, itemID, lParam);
\r