Index: modules/gui/wxwidgets/dialogs.cpp =================================================================== --- modules/gui/wxwidgets/dialogs.cpp (revision 12474) +++ modules/gui/wxwidgets/dialogs.cpp (working copy) @@ -24,6 +24,11 @@ /***************************************************************************** * Preamble *****************************************************************************/ + +#ifdef WIN32 +#pragma warning(disable : 4786) +#endif + #include /* malloc(), free() */ #include /* ENOMEM */ #include /* strerror() */ @@ -38,6 +43,186 @@ /* include the icon graphic */ #include "../../../share/vlc32x32.xpm" +//VLC_EXPORT(int, intf_filetypes_get_num_types, ()); +//VLC_EXPORT(int, intf_filetypes_get_type_label, (char* buffer, int buffer_size, int type)); +//VLC_EXPORT(int, intf_filetypes_get_num_subtypes, (int type)); +//VLC_EXPORT(int, intf_filetypes_get_subtype_label, (char* buffer, int buffer_size, int type, int index)); +//VLC_EXPORT(int, intf_filetypes_get_subtype_extension, (char* buffer, int buffer_size, int type, int index)); + +/*****************************************************************************/ + +struct vlc_filetype_filter { + const char* name; // e.g. name = "Playlist Files" + const char* extensions[30]; + // e.g. extensions[0] = "*.m3u", extensions[1] = ".pls", extensions[2] = ".asx" + int dummy; +}; + +static struct vlc_filetype_filter s_filetype_filter_list[4] = { + {"Video Files", + { + ".asf", + ".avi", + ".divx", + ".dv", + ".m1v", + ".m2v", + ".mkv", + ".mow", + ".mp4", + ".mpeg", + ".mpeg1", + ".mpeg2", + ".mpeg4", + ".mpg", + ".ogm", + ".vob", + ".wmv", + "" + }, + 0, + }, + {"Audio Files", + { + ".a52", + ".aac", + ".ac3", + ".dts", + ".flac", + ".mka", + ".mp1", + ".mp2", + ".mp3", + ".ogg", + ".spx", + ".wav", + ".wma", + "" + }, + 0, + }, + {"Playlist Files", {".m3u", ".pls", ".asx", ""}, 0}, + {"Other Files", {".bin", ".cue", ".vlc", ""}, 0}, +}; + +/*****************************************************************************/ + +int intf_filetypes_get_num_types() +{ + return sizeof(s_filetype_filter_list) / sizeof(*s_filetype_filter_list); +} + +int intf_filetypes_get_type_label(char* buffer, int buffer_size, int type) +{ + if (buffer == NULL || !(buffer_size > 0) ) { + return 0; + } + + strncpy(buffer, s_filetype_filter_list[type].name, buffer_size); + return 1; +} + +int intf_filetypes_get_num_subtypes(int type) +{ + int total; + int index; + + if ( type < 0 || type >= intf_filetypes_get_num_types()) { + return 0; + } + + total = sizeof(s_filetype_filter_list[type].extensions) + / sizeof(*s_filetype_filter_list[type].extensions); + + for (index = 0; index < total; index++) + { + if (strlen(s_filetype_filter_list[type].extensions[index]) == 0) { + return index; + } + } + + return 0; +} + +int intf_filetypes_get_subtype_label(char* buffer, int buffer_size, int type, int index) +{ + if (buffer == NULL || !(buffer_size > 0) ) { + return 0; + } + + strncpy(buffer, s_filetype_filter_list[type].name, buffer_size); + return 1; +} + +int intf_filetypes_get_subtype_extension(char* buffer, int buffer_size, int type, int index) +{ + if (buffer == NULL || !(buffer_size > 0) ) { + return 0; + } + + if ( type < 0 || type >= intf_filetypes_get_num_types()) { + return 0; + } + + if ( index < 0 || index >= intf_filetypes_get_num_subtypes(type)) { + return 0; + } + + strncpy(buffer, s_filetype_filter_list[type].extensions[index], buffer_size); + return 1; +} + +/*****************************************************************************/ + +void intf_generate_filetype_filter(char* filter, int filter_size) +{ + int type; + int index; + + if (filter_size < 2048) { + return; + } + + sprintf (filter, "All Files (*.*)|*.*|"); + + int num_types = intf_filetypes_get_num_types(); + for (type = 0; type < num_types; type++) + { + char filetype_label[1024] = {0}; + char filetype_extension[20] = {0}; + int num_subtypes = intf_filetypes_get_num_subtypes(type); + + intf_filetypes_get_type_label(filetype_label, sizeof(filetype_label), type); + + strcat(filter, filetype_label); + strcat(filter, " ("); + + for (index = 0; index < num_subtypes; index++) { + intf_filetypes_get_subtype_extension(filetype_extension, sizeof(filetype_extension), type, index); + strcat(filter, "*"); + strcat(filter, filetype_extension); + if (index < num_subtypes - 1) { + strcat(filter, ";"); + } + } + + sprintf (filter + strlen(filter), ")|"); + for (index = 0; index < num_subtypes; index++) { + intf_filetypes_get_subtype_extension(filetype_extension, sizeof(filetype_extension), type, index); + strcat(filter, "*"); + strcat(filter, filetype_extension); + if (index < num_subtypes - 1) { + strcat(filter, ";"); + } + } + strcat(filter, "|"); + } + + strcat(filter, "|"); +} + +/*****************************************************************************/ + /* Dialogs Provider */ class DialogsProvider: public wxFrame { @@ -392,8 +577,13 @@ } if( p_file_dialog == NULL ) + { + char filter[2048] = {0}; + intf_generate_filetype_filter(filter, sizeof(filter)); + p_file_dialog = new wxFileDialog( NULL, wxU(_("Open File")), - wxT(""), wxT(""), wxT("*"), wxOPEN | wxMULTIPLE ); + wxT(""), wxT(""), wxT(filter), wxOPEN | wxMULTIPLE ); + } if( p_file_dialog && p_file_dialog->ShowModal() == wxID_OK ) {