diff options
-rw-r--r-- | src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp | 26 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/inc/wndutil.h | 27 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/thmutil.cpp | 67 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/wndutil.cpp | 157 | ||||
-rw-r--r-- | src/tools/thmviewer/thmviewer.cpp | 27 |
5 files changed, 234 insertions, 70 deletions
diff --git a/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp b/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp index d7b5a269..8544ff0e 100644 --- a/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp +++ b/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp | |||
@@ -1145,26 +1145,19 @@ public: // IBootstrapperApplication | |||
1145 | ) | 1145 | ) |
1146 | { | 1146 | { |
1147 | HRESULT hr = S_OK; | 1147 | HRESULT hr = S_OK; |
1148 | LPWSTR sczPath = NULL; | ||
1148 | 1149 | ||
1149 | if (BOOTSTRAPPER_CACHE_RESOLVE_NONE == *pAction && BOOTSTRAPPER_DISPLAY_FULL == m_command.display) // prompt to change the source location. | 1150 | if (BOOTSTRAPPER_CACHE_RESOLVE_NONE == *pAction && BOOTSTRAPPER_DISPLAY_FULL == m_command.display) // prompt to change the source location. |
1150 | { | 1151 | { |
1151 | OPENFILENAMEW ofn = { }; | 1152 | static COMDLG_FILTERSPEC vrgFilters[] = |
1152 | WCHAR wzFile[MAX_PATH] = { }; | 1153 | { |
1153 | 1154 | { L"All Files", L"*.*" }, | |
1154 | ::StringCchCopyW(wzFile, countof(wzFile), rgSearchPaths[dwRecommendedSearchPath]); | 1155 | }; |
1155 | |||
1156 | ofn.lStructSize = sizeof(ofn); | ||
1157 | ofn.hwndOwner = m_hWnd; | ||
1158 | ofn.lpstrFile = wzFile; | ||
1159 | ofn.nMaxFile = countof(wzFile); | ||
1160 | ofn.lpstrFilter = L"All Files\0*.*\0"; | ||
1161 | ofn.nFilterIndex = 1; | ||
1162 | ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; | ||
1163 | ofn.lpstrTitle = m_pTheme->sczCaption; | ||
1164 | 1156 | ||
1165 | if (::GetOpenFileNameW(&ofn)) | 1157 | hr = WnduShowOpenFileDialog(m_hWnd, TRUE, TRUE, m_pTheme->sczCaption, vrgFilters, countof(vrgFilters), 1, rgSearchPaths[dwRecommendedSearchPath], &sczPath); |
1158 | if (SUCCEEDED(hr)) | ||
1166 | { | 1159 | { |
1167 | hr = m_pEngine->SetLocalSource(wzPackageOrContainerId, wzPayloadId, ofn.lpstrFile); | 1160 | hr = m_pEngine->SetLocalSource(wzPackageOrContainerId, wzPayloadId, sczPath); |
1168 | *pAction = BOOTSTRAPPER_CACHE_RESOLVE_RETRY; | 1161 | *pAction = BOOTSTRAPPER_CACHE_RESOLVE_RETRY; |
1169 | } | 1162 | } |
1170 | else | 1163 | else |
@@ -1175,6 +1168,9 @@ public: // IBootstrapperApplication | |||
1175 | // else there's nothing more we can do in non-interactive mode | 1168 | // else there's nothing more we can do in non-interactive mode |
1176 | 1169 | ||
1177 | *pfCancel |= CheckCanceled(); | 1170 | *pfCancel |= CheckCanceled(); |
1171 | |||
1172 | ReleaseStr(sczPath); | ||
1173 | |||
1178 | return hr; | 1174 | return hr; |
1179 | } | 1175 | } |
1180 | 1176 | ||
diff --git a/src/libs/dutil/WixToolset.DUtil/inc/wndutil.h b/src/libs/dutil/WixToolset.DUtil/inc/wndutil.h index 8de77f6e..ad4e07b0 100644 --- a/src/libs/dutil/WixToolset.DUtil/inc/wndutil.h +++ b/src/libs/dutil/WixToolset.DUtil/inc/wndutil.h | |||
@@ -35,6 +35,33 @@ HRESULT DAPI WnduGetControlText( | |||
35 | __inout_z LPWSTR* psczText | 35 | __inout_z LPWSTR* psczText |
36 | ); | 36 | ); |
37 | 37 | ||
38 | /******************************************************************** | ||
39 | WnduShowOpenFileDialog - shows the system dialog to select a file for opening. | ||
40 | |||
41 | *******************************************************************/ | ||
42 | HRESULT DAPI WnduShowOpenFileDialog( | ||
43 | __in_opt HWND hwndParent, | ||
44 | __in BOOL fForcePathExists, | ||
45 | __in BOOL fForceFileExists, | ||
46 | __in_opt LPCWSTR wzTitle, | ||
47 | __in_opt COMDLG_FILTERSPEC* rgFilters, | ||
48 | __in DWORD cFilters, | ||
49 | __in DWORD dwDefaultFilter, | ||
50 | __in_opt LPCWSTR wzDefaultPath, | ||
51 | __inout LPWSTR* psczPath | ||
52 | ); | ||
53 | |||
54 | /******************************************************************** | ||
55 | WnduShowOpenFolderDialog - shows the system dialog to select a folder. | ||
56 | |||
57 | *******************************************************************/ | ||
58 | HRESULT DAPI WnduShowOpenFolderDialog( | ||
59 | __in_opt HWND hwndParent, | ||
60 | __in BOOL fForceFileSystem, | ||
61 | __in_opt LPCWSTR wzTitle, | ||
62 | __inout LPWSTR* psczPath | ||
63 | ); | ||
64 | |||
38 | #ifdef __cplusplus | 65 | #ifdef __cplusplus |
39 | } | 66 | } |
40 | #endif | 67 | #endif |
diff --git a/src/libs/dutil/WixToolset.DUtil/thmutil.cpp b/src/libs/dutil/WixToolset.DUtil/thmutil.cpp index 52a52a1e..f7f7c5b6 100644 --- a/src/libs/dutil/WixToolset.DUtil/thmutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/thmutil.cpp | |||
@@ -4992,54 +4992,47 @@ static void OnBrowseDirectory( | |||
4992 | ) | 4992 | ) |
4993 | { | 4993 | { |
4994 | HRESULT hr = S_OK; | 4994 | HRESULT hr = S_OK; |
4995 | WCHAR wzPath[MAX_PATH] = { }; | 4995 | LPWSTR sczPath = NULL; |
4996 | BROWSEINFOW browseInfo = { }; | 4996 | THEME_CONTROL* pTargetControl = NULL; |
4997 | PIDLIST_ABSOLUTE pidl = NULL; | 4997 | BOOL fSetVariable = NULL != pTheme->pfnSetStringVariable; |
4998 | 4998 | ||
4999 | browseInfo.hwndOwner = pTheme->hwndParent; | 4999 | hr = WnduShowOpenFolderDialog(pTheme->hwndParent, TRUE, pTheme->sczCaption, &sczPath); |
5000 | browseInfo.pszDisplayName = wzPath; | 5000 | if (HRESULT_FROM_WIN32(ERROR_CANCELLED) == hr) |
5001 | browseInfo.lpszTitle = pTheme->sczCaption; | ||
5002 | browseInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI; | ||
5003 | pidl = ::SHBrowseForFolderW(&browseInfo); | ||
5004 | if (pidl && ::SHGetPathFromIDListW(pidl, wzPath)) | ||
5005 | { | 5001 | { |
5006 | // Since editbox changes aren't immediately saved off, we have to treat them differently. | 5002 | ExitFunction(); |
5007 | THEME_CONTROL* pTargetControl = NULL; | 5003 | } |
5008 | BOOL fSetVariable = NULL != pTheme->pfnSetStringVariable; | 5004 | ThmExitOnFailure(hr, "Failed to prompt user for directory."); |
5009 | |||
5010 | for (DWORD i = 0; i < pTheme->cControls; ++i) | ||
5011 | { | ||
5012 | THEME_CONTROL* pControl = pTheme->rgControls + i; | ||
5013 | |||
5014 | if ((!pControl->wPageId || pControl->wPageId == pTheme->dwCurrentPageId) && | ||
5015 | CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, pControl->sczName, -1, pAction->BrowseDirectory.sczVariableName, -1)) | ||
5016 | { | ||
5017 | pTargetControl = pControl; | ||
5018 | break; | ||
5019 | } | ||
5020 | } | ||
5021 | 5005 | ||
5022 | if (pTargetControl && !pTargetControl->fDisableAutomaticFunctionality && (!fSetVariable || THEME_CONTROL_TYPE_EDITBOX == pTargetControl->type)) | 5006 | for (DWORD i = 0; i < pTheme->cControls; ++i) |
5023 | { | 5007 | { |
5024 | fSetVariable = FALSE; | 5008 | THEME_CONTROL* pControl = pTheme->rgControls + i; |
5025 | hr = ThemeSetTextControl(pTargetControl, wzPath); | ||
5026 | ThmExitOnFailure(hr, "Failed to set text on control: %ls", pTargetControl->sczName); | ||
5027 | } | ||
5028 | 5009 | ||
5029 | if (fSetVariable) | 5010 | if ((!pControl->wPageId || pControl->wPageId == pTheme->dwCurrentPageId) && |
5011 | CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, pControl->sczName, -1, pAction->BrowseDirectory.sczVariableName, -1)) | ||
5030 | { | 5012 | { |
5031 | hr = pTheme->pfnSetStringVariable(pAction->BrowseDirectory.sczVariableName, wzPath, FALSE, pTheme->pvVariableContext); | 5013 | pTargetControl = pControl; |
5032 | ThmExitOnFailure(hr, "Failed to set variable: %ls", pAction->BrowseDirectory.sczVariableName); | 5014 | break; |
5033 | } | 5015 | } |
5016 | } | ||
5034 | 5017 | ||
5035 | ThemeShowPageEx(pTheme, pTheme->dwCurrentPageId, SW_SHOW, THEME_SHOW_PAGE_REASON_REFRESH); | 5018 | // Since editbox changes aren't immediately saved off, we have to treat them differently. |
5019 | if (pTargetControl && !pTargetControl->fDisableAutomaticFunctionality && (!fSetVariable || THEME_CONTROL_TYPE_EDITBOX == pTargetControl->type)) | ||
5020 | { | ||
5021 | fSetVariable = FALSE; | ||
5022 | hr = ThemeSetTextControl(pTargetControl, sczPath); | ||
5023 | ThmExitOnFailure(hr, "Failed to set text on control: %ls", pTargetControl->sczName); | ||
5036 | } | 5024 | } |
5037 | 5025 | ||
5038 | LExit: | 5026 | if (fSetVariable) |
5039 | if (pidl) | ||
5040 | { | 5027 | { |
5041 | ::CoTaskMemFree(pidl); | 5028 | hr = pTheme->pfnSetStringVariable(pAction->BrowseDirectory.sczVariableName, sczPath, FALSE, pTheme->pvVariableContext); |
5029 | ThmExitOnFailure(hr, "Failed to set variable: %ls", pAction->BrowseDirectory.sczVariableName); | ||
5042 | } | 5030 | } |
5031 | |||
5032 | ThemeShowPageEx(pTheme, pTheme->dwCurrentPageId, SW_SHOW, THEME_SHOW_PAGE_REASON_REFRESH); | ||
5033 | |||
5034 | LExit: | ||
5035 | ReleaseStr(sczPath); | ||
5043 | } | 5036 | } |
5044 | 5037 | ||
5045 | static BOOL OnButtonClicked( | 5038 | static BOOL OnButtonClicked( |
diff --git a/src/libs/dutil/WixToolset.DUtil/wndutil.cpp b/src/libs/dutil/WixToolset.DUtil/wndutil.cpp index b75b0491..5d832e50 100644 --- a/src/libs/dutil/WixToolset.DUtil/wndutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/wndutil.cpp | |||
@@ -161,6 +161,163 @@ LExit: | |||
161 | } | 161 | } |
162 | 162 | ||
163 | 163 | ||
164 | DAPI_(HRESULT) WnduShowOpenFileDialog( | ||
165 | __in_opt HWND hwndParent, | ||
166 | __in BOOL fForcePathExists, | ||
167 | __in BOOL fForceFileExists, | ||
168 | __in_opt LPCWSTR wzTitle, | ||
169 | __in COMDLG_FILTERSPEC* rgFilters, | ||
170 | __in DWORD cFilters, | ||
171 | __in DWORD dwDefaultFilter, | ||
172 | __in_opt LPCWSTR wzDefaultPath, | ||
173 | __inout LPWSTR* psczPath | ||
174 | ) | ||
175 | { | ||
176 | HRESULT hr = S_OK; | ||
177 | IFileOpenDialog* pFileOpenDialog = NULL; | ||
178 | FILEOPENDIALOGOPTIONS fos = 0; | ||
179 | FILEOPENDIALOGOPTIONS additionalFlags = FOS_NOCHANGEDIR; | ||
180 | IShellItem* psi = NULL; | ||
181 | LPWSTR sczDefaultDirectory = NULL; | ||
182 | LPWSTR sczPath = NULL; | ||
183 | |||
184 | hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pFileOpenDialog)); | ||
185 | WnduExitOnFailure(hr, "Failed to create FileOpenDialog object."); | ||
186 | |||
187 | hr = pFileOpenDialog->SetTitle(wzTitle); | ||
188 | WnduExitOnFailure(hr, "Failed to set FileOpenDialog title."); | ||
189 | |||
190 | hr = pFileOpenDialog->GetOptions(&fos); | ||
191 | WnduExitOnFailure(hr, "Failed to get FileOpenDialog options."); | ||
192 | |||
193 | if (fForcePathExists) | ||
194 | { | ||
195 | additionalFlags |= FOS_PATHMUSTEXIST; | ||
196 | } | ||
197 | |||
198 | if (fForceFileExists) | ||
199 | { | ||
200 | additionalFlags |= FOS_FILEMUSTEXIST; | ||
201 | } | ||
202 | |||
203 | hr = pFileOpenDialog->SetOptions(fos | additionalFlags); | ||
204 | WnduExitOnFailure(hr, "Failed to set FileOpenDialog options."); | ||
205 | |||
206 | hr = pFileOpenDialog->SetFileTypes(cFilters, rgFilters); | ||
207 | WnduExitOnFailure(hr, "Failed to set FileOpenDialog file types."); | ||
208 | |||
209 | hr = pFileOpenDialog->SetFileTypeIndex(dwDefaultFilter); | ||
210 | WnduExitOnFailure(hr, "Failed to set FileOpenDialog default file type."); | ||
211 | |||
212 | if (wzDefaultPath && *wzDefaultPath) | ||
213 | { | ||
214 | hr = PathGetDirectory(wzDefaultPath, &sczDefaultDirectory); | ||
215 | if (SUCCEEDED(hr)) | ||
216 | { | ||
217 | hr = ::SHCreateItemFromParsingName(sczDefaultDirectory, NULL, IID_PPV_ARGS(&psi)); | ||
218 | if (SUCCEEDED(hr)) | ||
219 | { | ||
220 | hr = pFileOpenDialog->SetFolder(psi); | ||
221 | WnduExitOnFailure(hr, "Failed to set FileOpenDialog folder."); | ||
222 | } | ||
223 | |||
224 | ReleaseNullObject(psi); | ||
225 | } | ||
226 | |||
227 | hr = pFileOpenDialog->SetFileName(wzDefaultPath); | ||
228 | WnduExitOnFailure(hr, "Failed to set FileOpenDialog file name."); | ||
229 | } | ||
230 | |||
231 | hr = pFileOpenDialog->Show(hwndParent); | ||
232 | if (HRESULT_FROM_WIN32(ERROR_CANCELLED) == hr) | ||
233 | { | ||
234 | ExitFunction(); | ||
235 | } | ||
236 | WnduExitOnFailure(hr, "Failed to show FileOpenDialog for file."); | ||
237 | |||
238 | hr = pFileOpenDialog->GetResult(&psi); | ||
239 | WnduExitOnFailure(hr, "Failed to get FileOpenDialog result."); | ||
240 | |||
241 | hr = psi->GetDisplayName(SIGDN_FILESYSPATH, &sczPath); | ||
242 | WnduExitOnFailure(hr, "Failed to get FileOpenDialog result path."); | ||
243 | |||
244 | hr = StrAllocString(psczPath, sczPath, 0); | ||
245 | WnduExitOnFailure(hr, "Failed to copy FileOpenDialog result path."); | ||
246 | |||
247 | LExit: | ||
248 | if (sczPath) | ||
249 | { | ||
250 | ::CoTaskMemFree(sczPath); | ||
251 | } | ||
252 | |||
253 | ReleaseStr(sczDefaultDirectory); | ||
254 | ReleaseObject(psi); | ||
255 | ReleaseObject(pFileOpenDialog); | ||
256 | |||
257 | return hr; | ||
258 | } | ||
259 | |||
260 | |||
261 | DAPI_(HRESULT) WnduShowOpenFolderDialog( | ||
262 | __in_opt HWND hwndParent, | ||
263 | __in BOOL fForceFileSystem, | ||
264 | __in_opt LPCWSTR wzTitle, | ||
265 | __inout LPWSTR* psczPath | ||
266 | ) | ||
267 | { | ||
268 | HRESULT hr = S_OK; | ||
269 | IFileOpenDialog* pFileOpenDialog = NULL; | ||
270 | FILEOPENDIALOGOPTIONS fos = 0; | ||
271 | FILEOPENDIALOGOPTIONS additionalFlags = FOS_PICKFOLDERS | FOS_NOCHANGEDIR; | ||
272 | IShellItem* psi = NULL; | ||
273 | LPWSTR sczPath = NULL; | ||
274 | |||
275 | hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pFileOpenDialog)); | ||
276 | WnduExitOnFailure(hr, "Failed to create FileOpenDialog object."); | ||
277 | |||
278 | hr = pFileOpenDialog->SetTitle(wzTitle); | ||
279 | WnduExitOnFailure(hr, "Failed to set FileOpenDialog title."); | ||
280 | |||
281 | hr = pFileOpenDialog->GetOptions(&fos); | ||
282 | WnduExitOnFailure(hr, "Failed to get FileOpenDialog options."); | ||
283 | |||
284 | if (fForceFileSystem) | ||
285 | { | ||
286 | additionalFlags |= FOS_FORCEFILESYSTEM; | ||
287 | } | ||
288 | |||
289 | hr = pFileOpenDialog->SetOptions(fos | additionalFlags); | ||
290 | WnduExitOnFailure(hr, "Failed to set FileOpenDialog options."); | ||
291 | |||
292 | hr = pFileOpenDialog->Show(hwndParent); | ||
293 | if (HRESULT_FROM_WIN32(ERROR_CANCELLED) == hr) | ||
294 | { | ||
295 | ExitFunction(); | ||
296 | } | ||
297 | WnduExitOnFailure(hr, "Failed to show FileOpenDialog for folder."); | ||
298 | |||
299 | hr = pFileOpenDialog->GetResult(&psi); | ||
300 | WnduExitOnFailure(hr, "Failed to get FileOpenDialog result."); | ||
301 | |||
302 | hr = psi->GetDisplayName(SIGDN_FILESYSPATH, &sczPath); | ||
303 | WnduExitOnFailure(hr, "Failed to get FileOpenDialog result path."); | ||
304 | |||
305 | hr = StrAllocString(psczPath, sczPath, 0); | ||
306 | WnduExitOnFailure(hr, "Failed to copy FileOpenDialog result path."); | ||
307 | |||
308 | LExit: | ||
309 | if (sczPath) | ||
310 | { | ||
311 | ::CoTaskMemFree(sczPath); | ||
312 | } | ||
313 | |||
314 | ReleaseObject(psi); | ||
315 | ReleaseObject(pFileOpenDialog); | ||
316 | |||
317 | return hr; | ||
318 | } | ||
319 | |||
320 | |||
164 | static DWORD CALLBACK RichEditStreamFromFileHandleCallback( | 321 | static DWORD CALLBACK RichEditStreamFromFileHandleCallback( |
165 | __in DWORD_PTR dwCookie, | 322 | __in DWORD_PTR dwCookie, |
166 | __in_bcount(cb) LPBYTE pbBuff, | 323 | __in_bcount(cb) LPBYTE pbBuff, |
diff --git a/src/tools/thmviewer/thmviewer.cpp b/src/tools/thmviewer/thmviewer.cpp index 38f3c4dc..4230dd35 100644 --- a/src/tools/thmviewer/thmviewer.cpp +++ b/src/tools/thmviewer/thmviewer.cpp | |||
@@ -66,6 +66,13 @@ static void CALLBACK ThmviewerTraceError( | |||
66 | __in va_list args | 66 | __in va_list args |
67 | ); | 67 | ); |
68 | 68 | ||
69 | static COMDLG_FILTERSPEC vrgFilters[] = | ||
70 | { | ||
71 | { L"Theme Files (*.thm)", L"*.thm" }, | ||
72 | { L"XML Files (*.xml)", L"*.xml" }, | ||
73 | { L"All Files (*.*)", L"*.*" }, | ||
74 | }; | ||
75 | |||
69 | 76 | ||
70 | int WINAPI wWinMain( | 77 | int WINAPI wWinMain( |
71 | __in HINSTANCE hInstance, | 78 | __in HINSTANCE hInstance, |
@@ -110,24 +117,8 @@ int WINAPI wWinMain( | |||
110 | if (!sczThemeFile) | 117 | if (!sczThemeFile) |
111 | { | 118 | { |
112 | // Prompt for a path to the theme file. | 119 | // Prompt for a path to the theme file. |
113 | OPENFILENAMEW ofn = { }; | 120 | hr = WnduShowOpenFileDialog(hWnd, TRUE, TRUE, vpTheme->sczCaption, vrgFilters, countof(vrgFilters), 1, NULL, &sczThemeFile); |
114 | WCHAR wzFile[MAX_PATH] = { }; | 121 | if (FAILED(hr)) |
115 | |||
116 | ofn.lStructSize = sizeof(ofn); | ||
117 | ofn.hwndOwner = hWnd; | ||
118 | ofn.lpstrFile = wzFile; | ||
119 | ofn.nMaxFile = countof(wzFile); | ||
120 | ofn.lpstrFilter = L"Theme Files (*.thm)\0*.thm\0XML Files (*.xml)\0*.xml\0All Files (*.*)\0*.*\0"; | ||
121 | ofn.nFilterIndex = 1; | ||
122 | ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; | ||
123 | ofn.lpstrTitle = vpTheme->sczCaption; | ||
124 | |||
125 | if (::GetOpenFileNameW(&ofn)) | ||
126 | { | ||
127 | hr = StrAllocString(&sczThemeFile, wzFile, 0); | ||
128 | ExitOnFailure(hr, "Failed to copy opened file to theme file."); | ||
129 | } | ||
130 | else | ||
131 | { | 122 | { |
132 | ::MessageBoxW(hWnd, L"Must specify a path to theme file.", vpTheme->sczCaption, MB_OK | MB_ICONERROR); | 123 | ::MessageBoxW(hWnd, L"Must specify a path to theme file.", vpTheme->sczCaption, MB_OK | MB_ICONERROR); |
133 | ExitFunction1(hr = E_INVALIDARG); | 124 | ExitFunction1(hr = E_INVALIDARG); |