annotate foosdk/sdk/foobar2000/shared/filedialogs.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "shared.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "filedialogs.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <shlobj.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #define dTEXT(X) pfc::stringcvt::string_os_from_utf8(X)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 static UINT_PTR CALLBACK uGetOpenFileName_Hook(HWND wnd,UINT msg,WPARAM wp,LPARAM lp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 switch(msg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 case WM_INITDIALOG:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 OPENFILENAME * ofn = reinterpret_cast<OPENFILENAME*>(lp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 reinterpret_cast<modal_dialog_scope*>(ofn->lCustData)->initialize(FindOwningPopup(wnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 static void ImportExtMask(pfc::array_t<TCHAR> & out, const char * in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 pfc::stringcvt::string_os_from_utf8 temp(in);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 out.set_size(temp.length()+2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 out.fill_null();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 pfc::memcpy_t(out.get_ptr(),temp.get_ptr(),temp.length());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 for(t_size walk = 0; walk < out.get_size(); ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 if (out[walk] == '|') out[walk] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 BOOL Vista_GetOpenFileName(HWND parent,const char * p_ext_mask,unsigned def_ext_mask,const char * p_def_ext,const char * p_title,const char * p_directory,pfc::string_base & p_filename,BOOL b_save);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 BOOL Vista_GetOpenFileNameMulti(HWND parent,const char * p_ext_mask,unsigned def_ext_mask,const char * p_def_ext,const char * p_title,const char * p_directory,pfc::ptrholder_t<uGetOpenFileNameMultiResult> & out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 BOOL Vista_BrowseForFolder(HWND parent, const char * p_title, pfc::string_base & path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 puGetOpenFileNameMultiResult Vista_BrowseForFolderEx(HWND parent,const char * title, const char * initPath);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 static bool UseVistaDialogs() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 #if FB2K_TARGET_MICROSOFT_STORE || _WIN32_WINNT >= 0x600
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 return GetWindowsVersionCode() >= 0x600;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 BOOL SHARED_EXPORT uGetOpenFileName(HWND parent,const char * p_ext_mask,unsigned def_ext_mask,const char * p_def_ext,const char * p_title,const char * p_directory,pfc::string_base & p_filename,BOOL b_save) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 TRACK_CALL_TEXT("uGetOpenFileName");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 if (UseVistaDialogs()) return Vista_GetOpenFileName(parent, p_ext_mask, def_ext_mask, p_def_ext, p_title, p_directory, p_filename, b_save);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 } catch(pfc::exception_not_implemented const &) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 modal_dialog_scope scope;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 pfc::array_t<TCHAR> ext_mask;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 ImportExtMask(ext_mask,p_ext_mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 TCHAR buffer[4096];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 pfc::stringToBuffer(buffer,pfc::stringcvt::string_os_from_utf8(p_filename));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 pfc::stringcvt::string_os_from_utf8 def_ext(p_def_ext ? p_def_ext : ""),title(p_title ? p_title : ""),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 directory(p_directory ? p_directory : "");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 OPENFILENAME ofn = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 ofn.lStructSize=sizeof(ofn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 ofn.hwndOwner = parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 ofn.lpstrFilter = ext_mask.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 ofn.nFilterIndex = def_ext_mask + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 ofn.lpstrFile = buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 ofn.lpstrInitialDir = directory;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 ofn.nMaxFile = _countof(buffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 ofn.Flags = b_save ? OFN_NOCHANGEDIR|OFN_EXPLORER|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_OVERWRITEPROMPT|OFN_ENABLEHOOK|OFN_ENABLESIZING : OFN_NOCHANGEDIR|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_ENABLEHOOK|OFN_ENABLESIZING;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 ofn.lpstrDefExt = *(const TCHAR*)def_ext ? (const TCHAR*)def_ext : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 ofn.lpstrTitle = *(const TCHAR*)title ? (const TCHAR*)title : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 ofn.lCustData = reinterpret_cast<LPARAM>(&scope);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 ofn.lpfnHook = uGetOpenFileName_Hook;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 if (b_save ? GetSaveFileName(&ofn) : GetOpenFileName(&ofn))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 buffer[_countof(buffer)-1]=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 t_size ptr = _tcslen(buffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 while(ptr>0 && buffer[ptr-1]==' ') buffer[--ptr] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 p_filename = pfc::stringcvt::string_utf8_from_os(buffer,_countof(buffer));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 else return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 puGetOpenFileNameMultiResult SHARED_EXPORT uGetOpenFileNameMulti(HWND parent,const char * p_ext_mask,unsigned def_ext_mask,const char * p_def_ext,const char * p_title,const char * p_directory) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 TRACK_CALL_TEXT("uGetOpenFileNameMulti");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 if (UseVistaDialogs()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 pfc::ptrholder_t<uGetOpenFileNameMultiResult> result;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 if (!Vista_GetOpenFileNameMulti(parent,p_ext_mask,def_ext_mask,p_def_ext,p_title,p_directory,result)) return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 return result.detach();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 } catch(pfc::exception_not_implemented const &) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 modal_dialog_scope scope;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 pfc::array_t<TCHAR> ext_mask;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 ImportExtMask(ext_mask,p_ext_mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 TCHAR buffer[0x4000];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 buffer[0]=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 pfc::stringcvt::string_os_from_utf8 def_ext(p_def_ext ? p_def_ext : ""),title(p_title ? p_title : ""),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 directory(p_directory ? p_directory : "");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 OPENFILENAME ofn = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 ofn.lStructSize=sizeof(ofn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 ofn.hwndOwner = parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 ofn.lpstrFilter = ext_mask.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 ofn.nFilterIndex = def_ext_mask + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 ofn.lpstrFile = buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 ofn.lpstrInitialDir = directory;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 ofn.nMaxFile = _countof(buffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 ofn.Flags = OFN_NOCHANGEDIR|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_ALLOWMULTISELECT|OFN_ENABLEHOOK|OFN_ENABLESIZING;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 ofn.lpstrDefExt = *(const TCHAR*)def_ext ? (const TCHAR*)def_ext : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 ofn.lpstrTitle = *(const TCHAR*)title ? (const TCHAR*)title : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 ofn.lCustData = reinterpret_cast<LPARAM>(&scope);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 ofn.lpfnHook = uGetOpenFileName_Hook;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 if (GetOpenFileName(&ofn))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 buffer[_countof(buffer)-1]=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 buffer[_countof(buffer)-2]=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 pfc::ptrholder_t<uGetOpenFileNameMultiResult_impl> result = new uGetOpenFileNameMultiResult_impl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 TCHAR * p=buffer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 while(*p) p++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 p++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 if (!*p)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 t_size ptr = _tcslen(buffer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 while(ptr>0 && buffer[ptr-1]==' ') buffer[--ptr] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 result->AddItem(pfc::stringcvt::string_utf8_from_os(buffer));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 pfc::string_formatter s = (const char*) pfc::stringcvt::string_utf8_from_os(buffer,_countof(buffer));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 t_size ofs = s.length();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 if (ofs>0 && s[ofs-1]!='\\') {s.add_char('\\');ofs++;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 while(*p)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 s.truncate(ofs);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 s += pfc::stringcvt::string_utf8_from_os(p);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 s.skip_trailing_char(' ');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 result->AddItem(s);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 while(*p) p++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 p++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 return result.detach();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 else return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 struct browse_for_dir_struct
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 const TCHAR * m_initval;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 const TCHAR * m_tofind;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 modal_dialog_scope m_scope;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 static bool file_exists(const TCHAR * p_path)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 DWORD val = GetFileAttributes(p_path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 if (val == (-1) || (val & FILE_ATTRIBUTE_DIRECTORY)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 static void browse_proc_check_okbutton(HWND wnd,const browse_for_dir_struct * p_struct,const TCHAR * p_path)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 TCHAR temp[MAX_PATH+1];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 pfc::stringToBuffer(temp, p_path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 t_size len = _tcslen(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 if (len < MAX_PATH && len > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 if (temp[len-1] != '\\')
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 temp[len++] = '\\';
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 t_size idx = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 while(p_struct->m_tofind[idx] && idx+len < MAX_PATH)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 temp[len+idx] = p_struct->m_tofind[idx];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 idx++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 temp[len+idx] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 SendMessage(wnd,BFFM_ENABLEOK,0,!!file_exists(temp));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 static int _stdcall browse_proc(HWND wnd,UINT msg,LPARAM lp,LPARAM dat)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 browse_for_dir_struct * p_struct = reinterpret_cast<browse_for_dir_struct*>(dat);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 switch(msg)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 case BFFM_INITIALIZED:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 p_struct->m_scope.initialize(wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 SendMessage(wnd,BFFM_SETSELECTION,1,(LPARAM)p_struct->m_initval);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 if (p_struct->m_tofind) browse_proc_check_okbutton(wnd,p_struct,p_struct->m_initval);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 case BFFM_SELCHANGED:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 if (p_struct->m_tofind)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 if (lp != 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 TCHAR temp[MAX_PATH+1];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 if (SHGetPathFromIDList(reinterpret_cast<LPCITEMIDLIST>(lp),temp))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 temp[MAX_PATH] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 browse_proc_check_okbutton(wnd,p_struct,temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 SendMessage(wnd,BFFM_ENABLEOK,0,FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 else SendMessage(wnd,BFFM_ENABLEOK,0,FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 static BOOL BrowseForFolderHelper(HWND p_parent,const TCHAR * p_title,TCHAR (&p_out)[MAX_PATH],const TCHAR * p_file_to_find)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 pfc::com_ptr_t<IMalloc> mallocptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 if (FAILED(SHGetMalloc(mallocptr.receive_ptr()))) return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 if (mallocptr.is_empty()) return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 browse_for_dir_struct data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 data.m_initval = p_out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 data.m_tofind = p_file_to_find;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 BROWSEINFO bi=
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 p_parent,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 p_title,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_EDITBOX,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 browse_proc,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 reinterpret_cast<LPARAM>(&data),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 LPITEMIDLIST li = SHBrowseForFolder(&bi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 if (li == NULL) return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 BOOL state = SHGetPathFromIDList(li,p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 mallocptr->Free(li);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 return state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 BOOL SHARED_EXPORT uBrowseForFolder(HWND parent,const char * p_title,pfc::string_base & out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274 TRACK_CALL_TEXT("uBrowseForFolder");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 if (UseVistaDialogs()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 return Vista_BrowseForFolder(parent,p_title,out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 } catch(pfc::exception_not_implemented const &) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 TCHAR temp[MAX_PATH];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 pfc::stringToBuffer(temp,dTEXT(out));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 BOOL rv = BrowseForFolderHelper(parent,dTEXT(p_title),temp,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 if (rv) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 out = pfc::stringcvt::string_utf8_from_os(temp,_countof(temp));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 BOOL SHARED_EXPORT uBrowseForFolderWithFile(HWND parent,const char * title,pfc::string_base & out,const char * p_file_to_find)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 TRACK_CALL_TEXT("uBrowseForFolderWithFile");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 TCHAR temp[MAX_PATH];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 pfc::stringToBuffer(temp,dTEXT(out));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 BOOL rv = BrowseForFolderHelper(parent,dTEXT(title),temp,dTEXT(p_file_to_find));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 if (rv) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 out = pfc::stringcvt::string_utf8_from_os(temp,_countof(temp));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 puGetOpenFileNameMultiResult SHARED_EXPORT uBrowseForFolderEx(HWND parent,const char * title, const char * initPath) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 TRACK_CALL_TEXT("uBrowseForFolderEx");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 if (UseVistaDialogs()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 return Vista_BrowseForFolderEx(parent,title, initPath);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 } catch(pfc::exception_not_implemented const &) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 pfc::string8 temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 if (initPath) temp = initPath;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313 if (!uBrowseForFolder(parent, title, temp)) return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 pfc::ptrholder_t<uGetOpenFileNameMultiResult_impl> result = new uGetOpenFileNameMultiResult_impl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 result->AddItem(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 return result.detach();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 }