X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0cf3e587a2ec542ba1eb6e03a84c54edefae1881..12bb29f5432174ecbd65549bda832d70d34a98ae:/src/gtk/filectrl.cpp diff --git a/src/gtk/filectrl.cpp b/src/gtk/filectrl.cpp index fa3d8dc8c7..b6c642fcab 100644 --- a/src/gtk/filectrl.cpp +++ b/src/gtk/filectrl.cpp @@ -14,16 +14,13 @@ #pragma hdrstop #endif -#include "wx/filectrl.h" +#if wxUSE_FILECTRL && !defined(__WXUNIVERSAL__) -#ifndef WX_PRECOMP -# include "wx/sizer.h" -# include "wx/debug.h" -#endif +#include "wx/filectrl.h" #include "wx/gtk/private.h" -#include "wx/filedlg.h" #include "wx/filename.h" +#include "wx/scopeguard.h" #include "wx/tokenzr.h" //----------------------------------------------------------------------------- @@ -43,10 +40,10 @@ wxString wxGtkFileChooser::GetPath() const { wxGtkString str( gtk_file_chooser_get_filename( m_widget ) ); - if ( str.c_str() == NULL ) - return wxEmptyString; - - return wxConvFileName->cMB2WX( str ); + wxString string; + if (str) + string = wxString::FromUTF8(str); + return string; } void wxGtkFileChooser::GetFilenames( wxArrayString& files ) const @@ -68,7 +65,7 @@ void wxGtkFileChooser::GetPaths( wxArrayString& paths ) const GSList *gpaths = gpathsi; while ( gpathsi ) { - wxString file( wxConvFileName->cMB2WX( ( gchar* ) gpathsi->data ) ); + wxString file(wxString::FromUTF8(static_cast(gpathsi->data))); paths.Add( file ); g_free( gpathsi->data ); gpathsi = gpathsi->next; @@ -82,24 +79,46 @@ void wxGtkFileChooser::GetPaths( wxArrayString& paths ) const bool wxGtkFileChooser::SetPath( const wxString& path ) { - if ( path.empty() ) return true; + if ( path.empty() ) + return true; + + switch ( gtk_file_chooser_get_action( m_widget ) ) + { + case GTK_FILE_CHOOSER_ACTION_SAVE: + { + wxFileName fn(path); + + const wxString fname = fn.GetFullName(); + gtk_file_chooser_set_current_name( m_widget, fname.utf8_str() ); + + // set the initial file name and/or directory + const wxString dir = fn.GetPath(); + return gtk_file_chooser_set_current_folder( m_widget, + dir.utf8_str() ) != 0; + } + + case GTK_FILE_CHOOSER_ACTION_OPEN: + return gtk_file_chooser_set_filename( m_widget, path.utf8_str() ) != 0; + + case GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER: + case GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER: + break; + } + + wxFAIL_MSG( "Unexpected file chooser type" ); - return gtk_file_chooser_set_filename( m_widget, - wxConvFileName->cWX2MB( path.c_str() ) ); + return false; } bool wxGtkFileChooser::SetDirectory( const wxString& dir ) { - const gboolean b = - gtk_file_chooser_set_current_folder( m_widget, - wxConvFileName->cWX2MB( dir.c_str() ) ); - return b == TRUE; + return gtk_file_chooser_set_current_folder( m_widget, dir.utf8_str() ) != 0; } wxString wxGtkFileChooser::GetDirectory() const { const wxGtkString str( gtk_file_chooser_get_current_folder( m_widget ) ); - return wxString( str, *wxConvFileName ); + return wxString::FromUTF8(str); } wxString wxGtkFileChooser::GetFilename() const @@ -109,6 +128,8 @@ wxString wxGtkFileChooser::GetFilename() const void wxGtkFileChooser::SetWildcard( const wxString& wildCard ) { + m_wildcards.Empty(); + // parse filters wxArrayString wildDescriptions, wildFilters; @@ -125,6 +146,9 @@ void wxGtkFileChooser::SetWildcard( const wxString& wildCard ) GSList* ifilters = gtk_file_chooser_list_filters( chooser ); GSList* filters = ifilters; + m_ignoreNextFilterEvent = true; + wxON_BLOCK_EXIT_SET(m_ignoreNextFilterEvent, false); + while ( ifilters ) { gtk_file_chooser_remove_filter( chooser, GTK_FILE_FILTER( ifilters->data ) ); @@ -142,10 +166,16 @@ void wxGtkFileChooser::SetWildcard( const wxString& wildCard ) gtk_file_filter_set_name( filter, wxGTK_CONV_SYS( wildDescriptions[n] ) ); wxStringTokenizer exttok( wildFilters[n], wxT( ";" ) ); + + int n1 = 1; while ( exttok.HasMoreTokens() ) { wxString token = exttok.GetNextToken(); gtk_file_filter_add_pattern( filter, wxGTK_CONV_SYS( token ) ); + + if (n1 == 1) + m_wildcards.Add( token ); // Only add first pattern to list, used later when saving + n1++; } gtk_file_chooser_add_filter( chooser, filter ); @@ -192,7 +222,12 @@ int wxGtkFileChooser::GetFilterIndex() const } else return index; -}; +} + +bool wxGtkFileChooser::HasFilterChoice() const +{ + return gtk_file_chooser_get_filter( m_widget ) != NULL; +} //----------------------------------------------------------------------------- // end wxGtkFileChooser Implementation @@ -250,13 +285,33 @@ extern "C" } } +extern "C" +{ + static void + gtkfilechooserwidget_notify_callback( GObject *WXUNUSED( gobject ), GParamSpec *arg1, wxGtkFileCtrl *fileCtrl ) + { + const char *name = g_param_spec_get_name (arg1); + if ( strcmp( name, "filter" ) == 0 && + fileCtrl->HasFilterChoice() && + !fileCtrl->GTKShouldIgnoreNextFilterEvent() ) + { + GenerateFilterChangedEvent( fileCtrl, fileCtrl ); + } + } +} + // wxGtkFileCtrl implementation IMPLEMENT_DYNAMIC_CLASS( wxGtkFileCtrl, wxControl ) +wxGtkFileCtrl::~wxGtkFileCtrl() +{ + if (m_fcWidget) + GTKDisconnect(m_fcWidget); +} + void wxGtkFileCtrl::Init() { - m_hasFocus = false; m_checkNextSelEvent = false; // ignore the first folder change event which is fired upon startup. @@ -280,19 +335,14 @@ bool wxGtkFileCtrl::Create( wxWindow *parent, return false; } - GtkFileChooserAction gtkAction; + GtkFileChooserAction gtkAction = GTK_FILE_CHOOSER_ACTION_OPEN; if ( style & wxFC_SAVE ) - { gtkAction = GTK_FILE_CHOOSER_ACTION_SAVE; - } - else if ( style & wxFC_OPEN ) - { - gtkAction = GTK_FILE_CHOOSER_ACTION_OPEN; - } m_widget = gtk_alignment_new ( 0, 0, 1, 1 ); - m_fcWidget = GTK_FILE_CHOOSER( gtk_file_chooser_widget_new( GTK_FILE_CHOOSER_ACTION_OPEN ) ); + g_object_ref(m_widget); + m_fcWidget = GTK_FILE_CHOOSER( gtk_file_chooser_widget_new(gtkAction) ); gtk_widget_show ( GTK_WIDGET( m_fcWidget ) ); gtk_container_add ( GTK_CONTAINER ( m_widget ), GTK_WIDGET( m_fcWidget ) ); @@ -310,6 +360,10 @@ bool wxGtkFileCtrl::Create( wxWindow *parent, G_CALLBACK ( gtkfilechooserwidget_selection_changed_callback ), this ); + g_signal_connect ( m_fcWidget, "notify", + G_CALLBACK ( gtkfilechooserwidget_notify_callback ), + this ); + m_fc.SetWidget( m_fcWidget ); if ( style & wxFC_MULTIPLE ) @@ -333,7 +387,7 @@ bool wxGtkFileCtrl::Create( wxWindow *parent, if ( !dir.empty() ) { gtk_file_chooser_set_current_folder( m_fcWidget, - dir.fn_str() ); + wxGTK_CONV_FN(dir) ); } const wxString fname = fn.GetFullName(); @@ -342,7 +396,7 @@ bool wxGtkFileCtrl::Create( wxWindow *parent, if ( !fname.empty() ) { gtk_file_chooser_set_current_name( m_fcWidget, - fname.fn_str() ); + wxGTK_CONV_FN(fname) ); } } else // wxFC_OPEN @@ -350,7 +404,7 @@ bool wxGtkFileCtrl::Create( wxWindow *parent, if ( !fname.empty() ) { gtk_file_chooser_set_filename( m_fcWidget, - fn.GetFullPath().fn_str() ); + wxGTK_CONV_FN(fn.GetFullPath()) ); } } @@ -373,18 +427,13 @@ bool wxGtkFileCtrl::SetDirectory( const wxString& dir ) bool wxGtkFileCtrl::SetFilename( const wxString& name ) { - if ( !gtk_check_version( 2, 4, 0 ) ) + if ( HasFlag( wxFC_SAVE ) ) { - if ( HasFlag( wxFC_SAVE ) ) - { - gtk_file_chooser_set_current_name( m_fcWidget, wxGTK_CONV( name ) ); - return true; - } - else - return SetPath( wxFileName( GetDirectory(), name ).GetFullPath() ); + gtk_file_chooser_set_current_name( m_fcWidget, wxGTK_CONV( name ) ); + return true; } - - return false; + else + return SetPath( wxFileName( GetDirectory(), name ).GetFullPath() ); } void wxGtkFileCtrl::SetWildcard( const wxString& wildCard ) @@ -424,9 +473,11 @@ void wxGtkFileCtrl::GetFilenames( wxArrayString& files ) const m_fc.GetFilenames( files ); } -void wxGtkFileCtrl::ShowHidden(const bool show) +void wxGtkFileCtrl::ShowHidden(bool show) { - gtk_file_chooser_set_show_hidden( m_fcWidget, ( show == true ) ? TRUE : FALSE ); + gtk_file_chooser_set_show_hidden(m_fcWidget, show); } #endif // wxUSE_FILECTRL + +#endif // wxUSE_FILECTRL && !defined(__WXUNIVERSAL__)