X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b74d7c8525b3388bf60b998c238af972e51f97ef..fb8d7eb7a880f1f2e32d8830f9c5e12b2536e05f:/src/gtk/filectrl.cpp?ds=sidebyside diff --git a/src/gtk/filectrl.cpp b/src/gtk/filectrl.cpp index f670e07350..b6c642fcab 100644 --- a/src/gtk/filectrl.cpp +++ b/src/gtk/filectrl.cpp @@ -14,18 +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" //----------------------------------------------------------------------------- @@ -46,7 +41,7 @@ wxString wxGtkFileChooser::GetPath() const wxGtkString str( gtk_file_chooser_get_filename( m_widget ) ); wxString string; - if (str.c_str() != NULL) + if (str) string = wxString::FromUTF8(str); return string; } @@ -87,7 +82,32 @@ bool wxGtkFileChooser::SetPath( const wxString& path ) if ( path.empty() ) return true; - return gtk_file_chooser_set_filename( m_widget, path.utf8_str() ); + 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 false; } bool wxGtkFileChooser::SetDirectory( const wxString& dir ) @@ -126,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 ) ); @@ -201,6 +224,11 @@ int wxGtkFileChooser::GetFilterIndex() const return index; } +bool wxGtkFileChooser::HasFilterChoice() const +{ + return gtk_file_chooser_get_filter( m_widget ) != NULL; +} + //----------------------------------------------------------------------------- // end wxGtkFileChooser Implementation //----------------------------------------------------------------------------- @@ -257,10 +285,31 @@ 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_checkNextSelEvent = false; @@ -311,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 ) @@ -334,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(); @@ -343,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 @@ -351,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()) ); } } @@ -422,8 +475,7 @@ void wxGtkFileCtrl::GetFilenames( wxArrayString& files ) const void wxGtkFileCtrl::ShowHidden(bool show) { - // gtk_file_chooser_set_show_hidden() is new in 2.6 - g_object_set (G_OBJECT (m_fcWidget), "show-hidden", show, NULL); + gtk_file_chooser_set_show_hidden(m_fcWidget, show); } #endif // wxUSE_FILECTRL