// Purpose: wxGtkFileCtrl Implementation
// Author: Diaa M. Sami
// Created: 2007-08-10
-// RCS-ID: $Id$
// Copyright: (c) Diaa M. Sami
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#pragma hdrstop
#endif
-#include "wx/filectrl.h"
-
-#if defined(__WXGTK24__) && !defined(__WXUNIVERSAL__)
+#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)
- string = wxConvFileName->cMB2WX(str);
+ if (str)
+ string = wxString::FromUTF8(str);
return string;
}
GSList *gpaths = gpathsi;
while ( gpathsi )
{
- wxString file( wxConvFileName->cMB2WX( ( gchar* ) gpathsi->data ) );
+ wxString file(wxString::FromUTF8(static_cast<gchar *>(gpathsi->data)));
paths.Add( file );
g_free( gpathsi->data );
gpathsi = gpathsi->next;
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;
- return gtk_file_chooser_set_filename( m_widget,
- wxConvFileName->cWX2MB( path.c_str() ) );
+ 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 )
{
- const gboolean b =
- gtk_file_chooser_set_current_folder( m_widget,
- wxConvFileName->cWX2MB( dir.c_str() ) );
- return b != 0;
+ 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
void wxGtkFileChooser::SetWildcard( const wxString& wildCard )
{
+ m_wildcards.Empty();
+
// parse filters
wxArrayString wildDescriptions, wildFilters;
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 ) );
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 );
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_hasFocus = false;
m_checkNextSelEvent = false;
// ignore the first folder change event which is fired upon startup.
gtkAction = GTK_FILE_CHOOSER_ACTION_SAVE;
m_widget = gtk_alignment_new ( 0, 0, 1, 1 );
+ 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 ) );
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()) );
}
}
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 )
void wxGtkFileCtrl::ShowHidden(bool show)
{
-#ifdef __WXGTK26__
gtk_file_chooser_set_show_hidden(m_fcWidget, show);
-#else
- // gtk_file_chooser_set_show_hidden only in 2.6
- g_object_set (G_OBJECT (m_fcWidget), "show-hidden", show, NULL);
-#endif
}
-#endif
- // wxUSE_FILECTRL
+#endif // wxUSE_FILECTRL
-#endif
- // if defined(__WXGTK24__) && !defined(__WXUNIVERSAL__)
+#endif // wxUSE_FILECTRL && !defined(__WXUNIVERSAL__)