1 /*!********************************************************************
2 
3  Audacity: A Digital Audio Editor
4 
5  @file SelectFile.cpp
6 
7  Paul Licameli split from FileNames.cpp
8 
9  **********************************************************************/
10 
11 #include "SelectFile.h"
12 #include "FileNames.h"
13 #include "widgets/FileDialog/FileDialog.h"
14 #include "widgets/AudacityMessageBox.h"
15 
16 FilePath
SelectFile(FileNames::Operation op,const TranslatableString & message,const FilePath & default_path,const FilePath & default_filename,const FileExtension & default_extension,const FileTypes & fileTypes,int flags,wxWindow * parent)17 SelectFile(FileNames::Operation op,
18    const TranslatableString& message,
19    const FilePath& default_path,
20    const FilePath& default_filename,
21    const FileExtension& default_extension,
22    const FileTypes& fileTypes,
23    int flags,
24    wxWindow *parent)
25 {
26    return WithDefaultPath(op, default_path, [&](const FilePath &path) {
27       wxString filter;
28       if ( !default_extension.empty() )
29          filter = wxT("*.") + default_extension;
30       return FileSelector(
31             message.Translation(), path, default_filename, filter,
32             FormatWildcard( fileTypes ),
33             flags, parent, wxDefaultCoord, wxDefaultCoord);
34    });
35 }
36 
37 #if defined(__WXMSW__)
38 static wxCharBuffer mFilename;
39 
40 //
41 // On Windows, wxString::mb_str() can return a NULL pointer if the
42 // conversion to multi-byte fails.  So, based on direction intent,
43 // returns a pointer to an empty string or prompts for a NEW name.
44 //
VerifyFilename(const wxString & s,bool input)45 char *VerifyFilename(const wxString &s, bool input)
46 {
47    static wxCharBuffer buf;
48    wxString name = s;
49 
50    if (input) {
51       if ((char *) (const char *)name.mb_str() == NULL) {
52          name = wxEmptyString;
53       }
54    }
55    else {
56       wxFileName ff(name);
57       FileExtension ext;
58       while ((char *) (const char *)name.mb_str() == NULL) {
59          AudacityMessageBox(
60             XO(
61 "The specified filename could not be converted due to Unicode character use."));
62 
63          ext = ff.GetExt();
64          name = SelectFile(FileNames::Operation::_None,
65             XO("Specify New Filename:"),
66             wxEmptyString,
67             name,
68             ext,
69             { ext.empty()
70                ? FileNames::AllFiles
71                : FileNames::FileType{ {}, { ext } }
72             },
73             wxFD_SAVE | wxRESIZE_BORDER,
74             wxGetTopLevelParent(NULL));
75       }
76    }
77 
78    mFilename = name.mb_str();
79 
80    return (char *) (const char *) mFilename;
81 }
82 #endif
83