#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"
//-----------------------------------------------------------------------------
wxGtkString str( gtk_file_chooser_get_filename( m_widget ) );
wxString string;
- if (str.c_str() != NULL)
+ if (str)
string = wxString::FromUTF8(str);
return string;
}
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 )
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 ) );
return index;
}
+bool wxGtkFileChooser::HasFilterChoice() const
+{
+ return gtk_file_chooser_get_filter( m_widget ) != NULL;
+}
+
//-----------------------------------------------------------------------------
// end wxGtkFileChooser Implementation
//-----------------------------------------------------------------------------
}
}
+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;
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 )
if ( !dir.empty() )
{
gtk_file_chooser_set_current_folder( m_fcWidget,
- dir.fn_str() );
+ wxGTK_CONV_FN(dir) );
}
const wxString fname = fn.GetFullName();
if ( !fname.empty() )
{
gtk_file_chooser_set_current_name( m_fcWidget,
- fname.fn_str() );
+ wxGTK_CONV_FN(fname) );
}
}
else // wxFC_OPEN
if ( !fname.empty() )
{
gtk_file_chooser_set_filename( m_fcWidget,
- fn.GetFullPath().fn_str() );
+ wxGTK_CONV_FN(fn.GetFullPath()) );
}
}
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