]> git.saurik.com Git - wxWidgets.git/blame - src/msw/filedlg.cpp
add a simple benchmark for wx and iconv converters benchmarking
[wxWidgets.git] / src / msw / filedlg.cpp
CommitLineData
2bda0e17 1/////////////////////////////////////////////////////////////////////////////
f6bcfd97 2// Name: src/msw/filedlg.cpp
2bda0e17
KB
3// Purpose: wxFileDialog
4// Author: Julian Smart
5// Modified by:
6// Created: 01/02/97
7// RCS-ID: $Id$
6c9a19aa 8// Copyright: (c) Julian Smart
65571936 9// Licence: wxWindows licence
2bda0e17
KB
10/////////////////////////////////////////////////////////////////////////////
11
f6bcfd97
BP
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
2bda0e17
KB
20// For compilers that support precompilation, includes "wx.h".
21#include "wx/wxprec.h"
22
23#ifdef __BORLANDC__
ba681060 24 #pragma hdrstop
2bda0e17
KB
25#endif
26
3180bc0e 27#if wxUSE_FILEDLG && !(defined(__SMARTPHONE__) && defined(__WXWINCE__))
1e6feb95 28
949c9f74
WS
29#include "wx/filedlg.h"
30
2bda0e17 31#ifndef WX_PRECOMP
57bd4c60
WS
32 #include "wx/msw/wrapcdlg.h"
33 #include "wx/msw/missing.h"
ba681060
VZ
34 #include "wx/utils.h"
35 #include "wx/msgdlg.h"
2b5f62a0 36 #include "wx/filefn.h"
ba681060 37 #include "wx/intl.h"
2662e49e 38 #include "wx/log.h"
f6bcfd97 39 #include "wx/app.h"
18680f86 40 #include "wx/math.h"
8f177c8e 41#endif
2bda0e17 42
2bda0e17
KB
43#include <stdlib.h>
44#include <string.h>
45
8ad9ca97 46#include "wx/filename.h"
8f177c8e
VZ
47#include "wx/tokenzr.h"
48
f6bcfd97
BP
49// ----------------------------------------------------------------------------
50// constants
51// ----------------------------------------------------------------------------
52
53#ifdef __WIN32__
2b5f62a0 54# define wxMAXPATH 65534
f6bcfd97
BP
55#else
56# define wxMAXPATH 1024
57#endif
58
59# define wxMAXFILE 1024
60
61# define wxMAXEXT 5
62
0b11099d
VZ
63// ----------------------------------------------------------------------------
64// globals
65// ----------------------------------------------------------------------------
66
0a7b0229
VZ
67// standard dialog size for the old Windows systems where the dialog wasn't
68// resizeable
0b11099d
VZ
69static wxRect gs_rectDialog(0, 0, 428, 266);
70
f6bcfd97
BP
71// ============================================================================
72// implementation
73// ============================================================================
74
f74172ab 75IMPLEMENT_CLASS(wxFileDialog, wxFileDialogBase)
2bda0e17 76
0b11099d
VZ
77// ----------------------------------------------------------------------------
78// hook function for moving the dialog
79// ----------------------------------------------------------------------------
80
106d80ad 81UINT_PTR APIENTRY
0b11099d
VZ
82wxFileDialogHookFunction(HWND hDlg,
83 UINT iMsg,
84 WPARAM WXUNUSED(wParam),
85 LPARAM lParam)
86{
cb80db46 87 switch ( iMsg )
0b11099d 88 {
0b11099d
VZ
89 case WM_NOTIFY:
90 {
cb80db46
VZ
91 OFNOTIFY *pNotifyCode = wx_reinterpret_cast(OFNOTIFY *, lParam);
92 if ( pNotifyCode->hdr.code == CDN_INITDONE )
0b11099d 93 {
0a7b0229
VZ
94 wx_reinterpret_cast(wxFileDialog *,
95 pNotifyCode->lpOFN->lCustData)
96 ->MSWOnInitDone((WXHWND)hDlg);
0b11099d
VZ
97 }
98 }
99 break;
cb80db46
VZ
100
101 case WM_DESTROY:
102 // reuse the position used for the dialog the next time by default
103 //
104 // NB: at least under Windows 2003 this is useless as after the
105 // first time it's shown the dialog always remembers its size
106 // and position itself and ignores any later SetWindowPos calls
107 wxCopyRECTToRect(wxGetWindowRect(::GetParent(hDlg)), gs_rectDialog);
108 break;
0b11099d
VZ
109 }
110
111 // do the default processing
112 return 0;
113}
114
f6bcfd97 115// ----------------------------------------------------------------------------
b600ed13 116// wxFileDialog
f6bcfd97
BP
117// ----------------------------------------------------------------------------
118
2b5f62a0
VZ
119wxFileDialog::wxFileDialog(wxWindow *parent,
120 const wxString& message,
121 const wxString& defaultDir,
122 const wxString& defaultFileName,
123 const wxString& wildCard,
124 long style,
ff3e84ff
VZ
125 const wxPoint& pos,
126 const wxSize& sz,
127 const wxString& name)
0b11099d 128 : wxFileDialogBase(parent, message, defaultDir, defaultFileName,
ff3e84ff 129 wildCard, style, pos, sz, name)
f74172ab 130
2bda0e17 131{
556151f5 132 // NB: all style checks are done by wxFileDialogBase::Create
2bda0e17 133
0b11099d 134 m_bMovedWindow = false;
0a7b0229 135 m_centreDir = 0;
0b11099d
VZ
136
137 // Must set to zero, otherwise the wx routines won't size the window
138 // the second time you call the file dialog, because it thinks it is
139 // already at the requested size.. (when centering)
140 gs_rectDialog.x =
141 gs_rectDialog.y = 0;
0b11099d 142}
0a7b0229 143
c61f4f6d
VZ
144void wxFileDialog::GetPaths(wxArrayString& paths) const
145{
146 paths.Empty();
147
148 wxString dir(m_dir);
149 if ( m_dir.Last() != _T('\\') )
150 dir += _T('\\');
151
152 size_t count = m_fileNames.GetCount();
153 for ( size_t n = 0; n < count; n++ )
154 {
8ad9ca97
JS
155 if (wxFileName(m_fileNames[n]).IsAbsolute())
156 paths.Add(m_fileNames[n]);
157 else
158 paths.Add(dir + m_fileNames[n]);
c61f4f6d
VZ
159 }
160}
161
89654c9a
VZ
162void wxFileDialog::GetFilenames(wxArrayString& files) const
163{
164 files = m_fileNames;
165}
166
2b5f62a0
VZ
167void wxFileDialog::SetPath(const wxString& path)
168{
169 wxString ext;
170 wxSplitPath(path, &m_dir, &m_fileName, &ext);
171 if ( !ext.empty() )
172 m_fileName << _T('.') << ext;
173}
174
cb80db46 175void wxFileDialog::DoGetPosition(int *x, int *y) const
0b11099d 176{
cb80db46
VZ
177 if ( x )
178 *x = gs_rectDialog.x;
179 if ( y )
180 *y = gs_rectDialog.y;
0b11099d
VZ
181}
182
0b11099d
VZ
183void wxFileDialog::DoGetSize(int *width, int *height) const
184{
cb80db46
VZ
185 if ( width )
186 *width = gs_rectDialog.width;
187 if ( height )
188 *height = gs_rectDialog.height;
0b11099d
VZ
189}
190
cb80db46 191void wxFileDialog::DoMoveWindow(int x, int y, int WXUNUSED(w), int WXUNUSED(h))
0b11099d 192{
0b11099d
VZ
193 gs_rectDialog.x = x;
194 gs_rectDialog.y = y;
195
0a7b0229
VZ
196 // our HWND is only set when we're called from MSWOnInitDone(), test if
197 // this is the case
198 HWND hwnd = GetHwnd();
199 if ( hwnd )
200 {
201 // size of the dialog can't be changed because the controls are not
202 // laid out correctly then
203 ::SetWindowPos(hwnd, HWND_TOP, x, y, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
204 }
205 else // just remember that we were requested to move the window
206 {
207 m_bMovedWindow = true;
208
209 // if Centre() had been called before, it shouldn't be taken into
210 // account now
211 m_centreDir = 0;
212 }
213}
214
215void wxFileDialog::DoCentre(int dir)
216{
217 m_centreDir = dir;
218 m_bMovedWindow = true;
219
220 // it's unnecessary to do anything else at this stage as we'll redo it in
221 // MSWOnInitDone() anyhow
222}
223
224void wxFileDialog::MSWOnInitDone(WXHWND hDlg)
225{
226 // note the the dialog is the parent window: hDlg is a child of it when
227 // OFN_EXPLORER is used
228 HWND hFileDlg = ::GetParent((HWND)hDlg);
229
230 // set HWND so that our DoMoveWindow() works correctly
231 SetHWND((WXHWND)hFileDlg);
232
233 if ( m_centreDir )
234 {
235 // now we have the real dialog size, remember it
236 RECT rect;
237 GetWindowRect(hFileDlg, &rect);
238 gs_rectDialog = wxRectFromRECT(rect);
239
240 // and position the window correctly: notice that we must use the base
241 // class version as our own doesn't do anything except setting flags
242 wxFileDialogBase::DoCentre(m_centreDir);
243 }
244 else // need to just move it to the correct place
245 {
246 SetPosition(gs_rectDialog.GetPosition());
247 }
248
249 // we shouldn't destroy this HWND
250 SetHWND(NULL);
0b11099d
VZ
251}
252
fe048d77
VZ
253// helper used below in ShowCommFileDialog(): style is used to determine
254// whether to show the "Save file" dialog (if it contains wxFD_SAVE bit) or
255// "Open file" one; returns true on success or false on failure in which case
256// err is filled with the CDERR_XXX constant
c46c1fb8
VZ
257static bool DoShowCommFileDialog(OPENFILENAME *of, long style, DWORD *err)
258{
e031f1df 259 if ( style & wxFD_SAVE ? GetSaveFileName(of) : GetOpenFileName(of) )
c46c1fb8
VZ
260 return true;
261
262 if ( err )
263 {
264#ifdef __WXWINCE__
265 // according to MSDN, CommDlgExtendedError() should work under CE as
266 // well but apparently in practice it doesn't (anybody has more
267 // details?)
268 *err = GetLastError();
269#else
270 *err = CommDlgExtendedError();
271#endif
272 }
273
274 return false;
275}
276
04227efc
VZ
277// We want to use OPENFILENAME struct version 5 (Windows 2000/XP) but we don't
278// know if the OPENFILENAME declared in the currently used headers is a V5 or
279// V4 (smaller) one so we try to manually extend the struct in case it is the
280// old one.
5bb37216 281//
04227efc
VZ
282// We don't do this on Windows CE nor under Win64, however, as there are no
283// compilers with old headers for these architectures
284#if defined(__WXWINCE__) || defined(__WIN64__)
5bb37216
VZ
285 typedef OPENFILENAME wxOPENFILENAME;
286
04227efc
VZ
287 static const DWORD gs_ofStructSize = sizeof(OPENFILENAME);
288#else // !__WXWINCE__ || __WIN64__
289 #define wxTRY_SMALLER_OPENFILENAME
290
5bb37216
VZ
291 struct wxOPENFILENAME : public OPENFILENAME
292 {
293 // fields added in Windows 2000/XP comdlg32.dll version
294 void *pVoid;
295 DWORD dw1;
296 DWORD dw2;
297 };
298
299 // hardcoded sizeof(OPENFILENAME) in the Platform SDK: we have to do it
300 // because sizeof(OPENFILENAME) in the headers we use when compiling the
301 // library could be less if _WIN32_WINNT is not >= 0x500
302 static const DWORD wxOPENFILENAME_V5_SIZE = 88;
303
304 // this is hardcoded sizeof(OPENFILENAME_NT4) from Platform SDK
305 static const DWORD wxOPENFILENAME_V4_SIZE = 76;
5bb37216 306
04227efc
VZ
307 // always try the new one first
308 static DWORD gs_ofStructSize = wxOPENFILENAME_V5_SIZE;
309#endif // __WXWINCE__ || __WIN64__/!...
5bb37216 310
fe048d77
VZ
311static bool ShowCommFileDialog(OPENFILENAME *of, long style)
312{
313 DWORD errCode;
314 bool success = DoShowCommFileDialog(of, style, &errCode);
315
316#ifdef wxTRY_SMALLER_OPENFILENAME
317 // the system might be too old to support the new version file dialog
318 // boxes, try with the old size
319 if ( !success && errCode == CDERR_STRUCTSIZE &&
320 of->lStructSize != wxOPENFILENAME_V4_SIZE )
321 {
322 of->lStructSize = wxOPENFILENAME_V4_SIZE;
323
324 success = DoShowCommFileDialog(of, style, &errCode);
325
326 if ( success || !errCode )
327 {
328 // use this struct size for subsequent dialogs
329 gs_ofStructSize = of->lStructSize;
330 }
331 }
332#endif // wxTRY_SMALLER_OPENFILENAME
333
d4380371
VZ
334 if ( !success &&
335 // FNERR_INVALIDFILENAME is not defined under CE (besides we don't
336 // use CommDlgExtendedError() there anyhow)
337#ifndef __WXWINCE__
338 errCode == FNERR_INVALIDFILENAME &&
339#endif // !__WXWINCE__
340 of->lpstrFile[0] )
fe048d77
VZ
341 {
342 // this can happen if the default file name is invalid, try without it
343 // now
344 of->lpstrFile[0] = _T('\0');
345 success = DoShowCommFileDialog(of, style, &errCode);
346 }
347
348 if ( !success )
349 {
350 // common dialog failed - why?
351 if ( errCode != 0 )
352 {
353 wxLogError(_("File dialog failed with error code %0lx."), errCode);
354 }
355 //else: it was just cancelled
356
357 return false;
358 }
359
360 return true;
361}
362
c61f4f6d 363int wxFileDialog::ShowModal()
2bda0e17 364{
1f2f0331
VZ
365 HWND hWnd = 0;
366 if (m_parent) hWnd = (HWND) m_parent->GetHWND();
f6bcfd97
BP
367 if (!hWnd && wxTheApp->GetTopWindow())
368 hWnd = (HWND) wxTheApp->GetTopWindow()->GetHWND();
2bda0e17 369
f6bcfd97
BP
370 static wxChar fileNameBuffer [ wxMAXPATH ]; // the file-name
371 wxChar titleBuffer [ wxMAXFILE+1+wxMAXEXT ]; // the file-name, without path
2bda0e17 372
223d09f6
KB
373 *fileNameBuffer = wxT('\0');
374 *titleBuffer = wxT('\0');
2bda0e17 375
21416306 376 long msw_flags = OFN_HIDEREADONLY;
21416306 377
b014db05 378 if ( HasFdFlag(wxFD_FILE_MUST_EXIST) )
1f2f0331 379 msw_flags |= OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
0b11099d
VZ
380 /*
381 If the window has been moved the programmer is probably
382 trying to center or position it. Thus we set the callback
383 or hook function so that we can actually adjust the position.
384 Without moving or centering the dlg, it will just stay
385 in the upper left of the frame, it does not center
5bb37216 386 automatically.
0b11099d 387 */
503528dc
JS
388 if (m_bMovedWindow) // we need these flags.
389 {
390 msw_flags |= OFN_EXPLORER|OFN_ENABLEHOOK;
391#ifndef __WXWINCE__
392 msw_flags |= OFN_ENABLESIZING;
393#endif
394 }
6e8aa701 395
b014db05 396 if ( HasFdFlag(wxFD_MULTIPLE) )
6e8aa701
VZ
397 {
398 // OFN_EXPLORER must always be specified with OFN_ALLOWMULTISELECT
399 msw_flags |= OFN_EXPLORER | OFN_ALLOWMULTISELECT;
400 }
401
e031f1df 402 // if wxFD_CHANGE_DIR flag is not given we shouldn't change the CWD which the
af1f0a76
VZ
403 // standard dialog does by default (notice that under NT it does it anyhow,
404 // OFN_NOCHANGEDIR or not, see below)
b014db05 405 if ( !HasFdFlag(wxFD_CHANGE_DIR) )
6e8aa701
VZ
406 {
407 msw_flags |= OFN_NOCHANGEDIR;
408 }
ac95e671 409
b014db05 410 if ( HasFdFlag(wxFD_OVERWRITE_PROMPT) )
99d1b93d
VZ
411 {
412 msw_flags |= OFN_OVERWRITEPROMPT;
413 }
ac95e671 414
5bb37216 415 wxOPENFILENAME of;
f6bcfd97
BP
416 wxZeroMemory(of);
417
5bb37216 418 of.lStructSize = gs_ofStructSize;
e15e548b 419 of.hwndOwner = hWnd;
e0a050e3 420 of.lpstrTitle = m_message.wx_str();
e15e548b 421 of.lpstrFileTitle = titleBuffer;
5bb37216 422 of.nMaxFileTitle = wxMAXFILE + 1 + wxMAXEXT;
2bda0e17 423
0bc9b25e 424 // Convert forward slashes to backslashes (file selector doesn't like
99d1b93d
VZ
425 // forward slashes) and also squeeze multiple consecutive slashes into one
426 // as it doesn't like two backslashes in a row neither
0627d091 427
cbe874bd
WS
428 wxString dir;
429 size_t i, len = m_dir.length();
99d1b93d 430 dir.reserve(len);
0627d091 431 for ( i = 0; i < len; i++ )
99d1b93d
VZ
432 {
433 wxChar ch = m_dir[i];
434 switch ( ch )
435 {
436 case _T('/'):
437 // convert to backslash
438 ch = _T('\\');
439
440 // fall through
0bc9b25e 441
99d1b93d
VZ
442 case _T('\\'):
443 while ( i < len - 1 )
444 {
445 wxChar chNext = m_dir[i + 1];
446 if ( chNext != _T('\\') && chNext != _T('/') )
447 break;
448
04d93c3a
CE
449 // ignore the next one, unless it is at the start of a UNC path
450 if (i > 0)
451 i++;
452 else
0b11099d 453 break;
99d1b93d
VZ
454 }
455 // fall through
456
457 default:
458 // normal char
459 dir += ch;
460 }
461 }
462
463 of.lpstrInitialDir = dir.c_str();
2bda0e17 464
e15e548b 465 of.Flags = msw_flags;
0b11099d 466 of.lpfnHook = wxFileDialogHookFunction;
0a7b0229 467 of.lCustData = (LPARAM)this;
2bda0e17 468
daf32463 469 wxArrayString wildDescriptions, wildFilters;
2bda0e17 470
daf32463 471 size_t items = wxParseCommonDialogsFilter(m_wildCard, wildDescriptions, wildFilters);
2bda0e17 472
daf32463 473 wxASSERT_MSG( items > 0 , _T("empty wildcard list") );
2bda0e17 474
1f2f0331 475 wxString filterBuffer;
2bda0e17 476
daf32463
WS
477 for (i = 0; i < items ; i++)
478 {
479 filterBuffer += wildDescriptions[i];
480 filterBuffer += wxT("|");
481 filterBuffer += wildFilters[i];
482 filterBuffer += wxT("|");
574c0bbf
JS
483 }
484
574c0bbf 485 // Replace | with \0
e031f1df 486 for (i = 0; i < filterBuffer.length(); i++ ) {
223d09f6
KB
487 if ( filterBuffer.GetChar(i) == wxT('|') ) {
488 filterBuffer[i] = wxT('\0');
e15e548b
VZ
489 }
490 }
2bda0e17 491
c9f78968 492 of.lpstrFilter = (LPTSTR)filterBuffer.wx_str();
cc42eb7a 493 of.nFilterIndex = m_filterIndex + 1;
2bda0e17
KB
494
495 //=== Setting defaultFileName >>=========================================
496
e0a050e3 497 wxStrncpy(fileNameBuffer, m_fileName, wxMAXPATH-1);
f6bcfd97 498 fileNameBuffer[ wxMAXPATH-1 ] = wxT('\0');
2bda0e17 499
e15e548b 500 of.lpstrFile = fileNameBuffer; // holds returned filename
f6bcfd97 501 of.nMaxFile = wxMAXPATH;
2bda0e17 502
90bddb85 503 // we must set the default extension because otherwise Windows would check
e031f1df 504 // for the existing of a wrong file with wxFD_OVERWRITE_PROMPT (i.e. if the
90bddb85
VZ
505 // user types "foo" and the default extension is ".bar" we should force it
506 // to check for "foo.bar" existence and not "foo")
507 wxString defextBuffer; // we need it to be alive until GetSaveFileName()!
b014db05 508 if (HasFdFlag(wxFD_SAVE))
90bddb85 509 {
e0a050e3 510 const wxChar* extension = filterBuffer.wx_str();
90bddb85
VZ
511 int maxFilter = (int)(of.nFilterIndex*2L) - 1;
512
513 for( int i = 0; i < maxFilter; i++ ) // get extension
514 extension = extension + wxStrlen( extension ) + 1;
515
516 // use dummy name a to avoid assert in AppendExtension
517 defextBuffer = AppendExtension(wxT("a"), extension);
518 if (defextBuffer.StartsWith(wxT("a.")))
519 {
026ff75b 520 defextBuffer = defextBuffer.Mid(2); // remove "a."
90bddb85
VZ
521 of.lpstrDefExt = defextBuffer.c_str();
522 }
523 }
0b11099d 524
af1f0a76
VZ
525 // store off before the standard windows dialog can possibly change it
526 const wxString cwdOrig = wxGetCwd();
527
2bda0e17
KB
528 //== Execute FileDialog >>=================================================
529
fe048d77
VZ
530 if ( !ShowCommFileDialog(&of, m_windowStyle) )
531 return wxID_CANCEL;
2bda0e17 532
fe048d77
VZ
533 // GetOpenFileName will always change the current working directory on
534 // (according to MSDN) "Windows NT 4.0/2000/XP" because the flag
535 // OFN_NOCHANGEDIR has no effect. If the user did not specify
536 // wxFD_CHANGE_DIR let's restore the current working directory to what it
537 // was before the dialog was shown.
538 if ( msw_flags & OFN_NOCHANGEDIR )
f6bcfd97 539 {
fe048d77 540 wxSetWorkingDirectory(cwdOrig);
f6bcfd97 541 }
c46c1fb8 542
fe048d77 543 m_fileNames.Empty();
c61f4f6d 544
fe048d77 545 if ( ( HasFdFlag(wxFD_MULTIPLE) ) &&
c61f4f6d 546#if defined(OFN_EXPLORER)
fe048d77 547 ( fileNameBuffer[of.nFileOffset-1] == wxT('\0') )
c61f4f6d 548#else
fe048d77 549 ( fileNameBuffer[of.nFileOffset-1] == wxT(' ') )
c61f4f6d 550#endif // OFN_EXPLORER
fe048d77
VZ
551 )
552 {
c61f4f6d 553#if defined(OFN_EXPLORER)
fe048d77
VZ
554 m_dir = fileNameBuffer;
555 i = of.nFileOffset;
556 m_fileName = &fileNameBuffer[i];
557 m_fileNames.Add(m_fileName);
558 i += m_fileName.length() + 1;
c61f4f6d 559
fe048d77
VZ
560 while (fileNameBuffer[i] != wxT('\0'))
561 {
562 m_fileNames.Add(&fileNameBuffer[i]);
563 i += wxStrlen(&fileNameBuffer[i]) + 1;
564 }
c61f4f6d 565#else
fe048d77
VZ
566 wxStringTokenizer toke(fileNameBuffer, _T(" \t\r\n"));
567 m_dir = toke.GetNextToken();
568 m_fileName = toke.GetNextToken();
569 m_fileNames.Add(m_fileName);
c61f4f6d 570
fe048d77
VZ
571 while (toke.HasMoreTokens())
572 m_fileNames.Add(toke.GetNextToken());
c61f4f6d
VZ
573#endif // OFN_EXPLORER
574
fe048d77
VZ
575 wxString dir(m_dir);
576 if ( m_dir.Last() != _T('\\') )
577 dir += _T('\\');
2bda0e17 578
fe048d77
VZ
579 m_path = dir + m_fileName;
580 m_filterIndex = (int)of.nFilterIndex - 1;
581 }
582 else
583 {
584 //=== Adding the correct extension >>=================================
2bda0e17 585
fe048d77 586 m_filterIndex = (int)of.nFilterIndex - 1;
2bda0e17 587
fe048d77
VZ
588 if ( !of.nFileExtension ||
589 (of.nFileExtension && fileNameBuffer[of.nFileExtension] == wxT('\0')) )
590 {
591 // User has typed a filename without an extension:
592 const wxChar* extension = filterBuffer.wx_str();
593 int maxFilter = (int)(of.nFilterIndex*2L) - 1;
a039ccbf 594
fe048d77
VZ
595 for( int i = 0; i < maxFilter; i++ ) // get extension
596 extension = extension + wxStrlen( extension ) + 1;
2bda0e17 597
fe048d77
VZ
598 m_fileName = AppendExtension(fileNameBuffer, extension);
599 wxStrncpy(fileNameBuffer, m_fileName.c_str(), wxMin(m_fileName.length(), wxMAXPATH-1));
600 fileNameBuffer[wxMin(m_fileName.length(), wxMAXPATH-1)] = wxT('\0');
c61f4f6d 601 }
fe048d77
VZ
602
603 m_path = fileNameBuffer;
604 m_fileName = wxFileNameFromPath(fileNameBuffer);
605 m_fileNames.Add(m_fileName);
606 m_dir = wxPathOnly(fileNameBuffer);
7cc98b3e 607 }
2bda0e17 608
fe048d77 609 return wxID_OK;
2bda0e17
KB
610
611}
612
3180bc0e 613#endif // wxUSE_FILEDLG && !(__SMARTPHONE__ && __WXWINCE__)