1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxFileDialog
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "filedlg.h"
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
27 #include "wx/dialog.h"
28 #include "wx/filedlg.h"
37 #include "wx/msw/private.h"
43 #define wxDIALOG_DEFAULT_X 300
44 #define wxDIALOG_DEFAULT_Y 300
46 #if !USE_SHARED_LIBRARY
47 IMPLEMENT_CLASS(wxFileDialog
, wxDialog
)
50 char *wxFileSelector(const char *title
,
51 const char *defaultDir
, const char *defaultFileName
,
52 const char *defaultExtension
, const char *filter
, int flags
,
53 wxWindow
*parent
, int x
, int y
)
55 // In the original implementation, defaultExtension is passed to the lpstrDefExt member
56 // of OPENFILENAME. This extension, if non-NULL, is appended to the filename if the user
57 // fails to type an extension.
58 // The new implementation (taken from wxFileSelectorEx) appends the extension automatically,
59 // by looking at the filter specification. In fact this should be better than the
60 // native Microsoft implementation because Windows only allows *one* default extension,
61 // whereas here we do the right thing depending on the filter the user has chosen.
63 // If there's a default extension specified but no filter, we create a suitable
67 if ( defaultExtension
&& !filter
)
68 filter2
= wxString("*.") + wxString(defaultExtension
) ;
72 wxString defaultDirString
;
74 defaultDirString
= defaultDir
;
76 defaultDirString
= "";
78 wxString defaultFilenameString
;
80 defaultFilenameString
= defaultFileName
;
82 defaultFilenameString
= "";
84 wxFileDialog
fileDialog(parent
, title
, defaultDirString
, defaultFilenameString
, filter2
, flags
, wxPoint(x
, y
));
86 if ( fileDialog
.ShowModal() == wxID_OK
)
88 strcpy(wxBuffer
, (const char *)fileDialog
.GetPath());
96 # include <dir.h> // for MAXPATH etc. ( Borland 3.1 )
116 char *wxFileSelectorEx(const char *title
,
117 const char *defaultDir
,
118 const char *defaultFileName
,
119 int* defaultFilterIndex
,
127 wxFileDialog
fileDialog(parent
, title
? title
: "", defaultDir
? defaultDir
: "",
128 defaultFileName
? defaultFileName
: "", filter
? filter
: "", flags
, wxPoint(x
, y
));
130 if ( fileDialog
.ShowModal() == wxID_OK
)
132 *defaultFilterIndex
= fileDialog
.GetFilterIndex();
133 strcpy(wxBuffer
, (const char *)fileDialog
.GetPath());
140 wxFileDialog::wxFileDialog(wxWindow
*parent
, const wxString
& message
,
141 const wxString
& defaultDir
, const wxString
& defaultFileName
, const wxString
& wildCard
,
142 long style
, const wxPoint
& pos
)
145 m_dialogStyle
= style
;
148 m_fileName
= defaultFileName
;
150 m_wildCard
= wildCard
;
154 int wxFileDialog::ShowModal(void)
157 if (m_parent
) hWnd
= (HWND
) m_parent
->GetHWND();
159 static char fileNameBuffer
[ MAXPATH
]; // the file-name
160 char titleBuffer
[ MAXFILE
+1+MAXEXT
]; // the file-name, without path
162 *fileNameBuffer
= '\0';
165 char* filterBuffer
= NULL
;
166 char* extension
= NULL
;
167 char* theFilter
= (char *)(const char *)m_wildCard
;
170 if ( (m_dialogStyle
& wxHIDE_READONLY
) || (m_dialogStyle
& wxSAVE
) )
171 msw_flags
|= OFN_HIDEREADONLY
;
172 if ( m_dialogStyle
& wxFILE_MUST_EXIST
)
173 msw_flags
|= OFN_PATHMUSTEXIST
| OFN_FILEMUSTEXIST
;
176 memset(&of
, 0, sizeof(OPENFILENAME
));
178 of
.lpstrCustomFilter
= NULL
; // system should not save custom filter
179 of
.nMaxCustFilter
= 0L;
181 of
.nFileOffset
= 0; // 0-based pointer to filname in lpstFile
182 of
.nFileExtension
= 0; // 0-based pointer to extension in lpstrFile
183 of
.lpstrDefExt
= NULL
; // no default extension
185 of
.lStructSize
= sizeof(OPENFILENAME
);
187 of
.lpstrTitle
= (char *)(const char *)m_message
;
190 of
.lpstrFileTitle
= titleBuffer
;
191 of
.nMaxFileTitle
= MAXFILE
+ 1 + MAXEXT
; // Windows 3.0 and 3.1
193 of
.lpstrInitialDir
= (const char *) m_dir
;
195 of
.Flags
= msw_flags
;
199 //=== Like Alejandro Sierra's wildcard modification >>===================
201 In wxFileSelector you can put, instead of a single wild_card,
202 pairs of strings separated by '|'.
203 The first string is a description, and the
204 second is the wild card. You can put any number of pairs.
206 eg. "description1 (*.ex1)|*.ex1|description2 (*.ex2)|*.ex2"
208 If you put a single wild card, it works as before the modification.
210 //=======================================================================
212 if ( !theFilter
|| (strcmp(theFilter
, "") == 0)) theFilter
= "*.*";
214 int filterBufferLen
= 0;
216 if ( !strchr( theFilter
, '|' ) ) { // only one filter ==> default text:
217 char buffText
[] = "Files (%s)|%s";
218 filterBufferLen
= strlen( theFilter
)*2 + strlen( buffText
) -4;
219 filterBuffer
= new char[ filterBufferLen
+2 ];
221 if ( filterBuffer
) {
222 sprintf( filterBuffer
, buffText
, theFilter
, theFilter
);
225 else { // more then one filter
226 filterBufferLen
= strlen( theFilter
);
227 filterBuffer
= new char[ filterBufferLen
+2 ];
229 if ( filterBuffer
) {
230 strcpy( filterBuffer
, theFilter
);
234 if ( filterBuffer
) { // Substituting '|' with '\0'
235 for ( int i
= 0; i
< filterBufferLen
; i
++ ) {
236 if ( filterBuffer
[i
] == '|' ) { filterBuffer
[i
] = '\0'; }
240 filterBuffer
[filterBufferLen
+1] = '\0';
242 of
.lpstrFilter
= (LPSTR
)filterBuffer
;
243 of
.nFilterIndex
= m_filterIndex
;
245 //=== Setting defaultFileName >>=========================================
247 strncpy( fileNameBuffer
, (const char *)m_fileName
, MAXPATH
-1 );
248 fileNameBuffer
[ MAXPATH
-1 ] = '\0';
250 of
.lpstrFile
= fileNameBuffer
; // holds returned filename
251 of
.nMaxFile
= MAXPATH
;
253 //== Execute FileDialog >>=================================================
255 bool success
= (m_dialogStyle
& wxSAVE
) ? (GetSaveFileName(&of
) != 0) : (GetOpenFileName(&of
) != 0);
259 //=== Adding the correct extension >>=================================
261 m_filterIndex
= (int)of
.nFilterIndex
;
263 if ( of
.nFileExtension
&& fileNameBuffer
[ of
.nFileExtension
-1] != '.' )
264 { // user has typed an filename
265 // without an extension:
267 int maxFilter
= (int)(of
.nFilterIndex
*2L-1L);
268 extension
= filterBuffer
;
270 for( int i
= 0; i
< maxFilter
; i
++ ) { // get extension
271 extension
= extension
+ strlen( extension
) +1;
274 if ( (extension
= strrchr( extension
, '.' )) // != "blabla"
275 && !strrchr( extension
, '*' ) // != "blabla.*"
276 && !strrchr( extension
, '?' ) // != "blabla.?"
277 && extension
[1] // != "blabla."
278 && extension
[1] != ' ' ) // != "blabla. "
280 // now concat extension to the fileName:
281 m_fileName
= wxString(fileNameBuffer
) + wxString(extension
);
283 int len
= strlen( fileNameBuffer
);
284 strncpy( fileNameBuffer
+ len
, extension
, MAXPATH
- len
);
285 fileNameBuffer
[ MAXPATH
-1 ] = '\0';
289 m_path
= fileNameBuffer
;
290 m_fileName
= wxFileNameFromPath(fileNameBuffer
);
293 //=== Simulating the wxOVERWRITE_PROMPT >>============================
295 if ( (m_dialogStyle
& wxOVERWRITE_PROMPT
) && ::wxFileExists( fileNameBuffer
) )
297 char questionText
[] = "Replace file\n%s?";
298 char* messageText
= new char[strlen(questionText
)+strlen(fileNameBuffer
)-1];
299 sprintf( messageText
, questionText
, fileNameBuffer
);
301 if ( messageText
&& ( wxMessageBox( (const char *)messageText
, m_message
, wxYES_NO
) != wxYES
) )
306 delete[] messageText
;
309 } // END: if ( success )
312 delete[] filterBuffer
;
314 return (success
? wxID_OK
: wxID_CANCEL
) ;
318 #define wxDIALOG_DEFAULT_X 300
319 #define wxDIALOG_DEFAULT_Y 300
321 // Generic file load/save dialog
322 // static inline char * // HP compiler complains
324 wxDefaultFileSelector(bool load
, const char *what
, const char *extension
, const char *default_name
, wxWindow
*parent
)
326 char *ext
= (char *)extension
;
331 str
= (const char*) wxTString("Load %s file");
333 str
= (const char*) wxTString("Save %s file");
334 sprintf(prompt
, str
, what
);
336 if (*ext
== '.') ext
++;
338 sprintf(wild
, "*.%s", ext
);
340 return wxFileSelector (prompt
, NULL
, default_name
, ext
, wild
, 0, parent
);
343 // Generic file load dialog
345 wxLoadFileSelector(const char *what
, const char *extension
, const char *default_name
, wxWindow
*parent
)
347 return wxDefaultFileSelector(TRUE
, what
, extension
, default_name
, parent
);
351 // Generic file save dialog
353 wxSaveFileSelector(const char *what
, const char *extension
, const char *default_name
, wxWindow
*parent
)
355 return wxDefaultFileSelector(FALSE
, what
, extension
, default_name
, parent
);