X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cdc48273b49b0b90d9587a1ecc5935d38a160620..12bb29f5432174ecbd65549bda832d70d34a98ae:/src/gtk/dirdlg.cpp diff --git a/src/gtk/dirdlg.cpp b/src/gtk/dirdlg.cpp index 7f06ed819a..7372b32300 100644 --- a/src/gtk/dirdlg.cpp +++ b/src/gtk/dirdlg.cpp @@ -31,51 +31,15 @@ #include "wx/gtk/private.h" -#include // chdir - -//----------------------------------------------------------------------------- -// "clicked" for OK-button -//----------------------------------------------------------------------------- - -extern "C" { -static void gtk_dirdialog_ok_callback(GtkWidget *widget, wxDirDialog *dialog) -{ - // change to the directory where the user went if asked - if (dialog->HasFlag(wxDD_CHANGE_DIR)) - { - wxGtkString filename(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget))); - chdir(filename); - } - - wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK); - event.SetEventObject(dialog); - dialog->HandleWindowEvent(event); -} -} - -//----------------------------------------------------------------------------- -// "clicked" for Cancel-button -//----------------------------------------------------------------------------- - extern "C" { -static void gtk_dirdialog_cancel_callback(GtkWidget *WXUNUSED(w), - wxDirDialog *dialog) -{ - wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL); - event.SetEventObject(dialog); - dialog->HandleWindowEvent(event); -} -} - -extern "C" { -static void gtk_dirdialog_response_callback(GtkWidget *w, +static void gtk_dirdialog_response_callback(GtkWidget * WXUNUSED(w), gint response, wxDirDialog *dialog) { if (response == GTK_RESPONSE_ACCEPT) - gtk_dirdialog_ok_callback(w, dialog); + dialog->GTKOnAccept(); else // GTK_RESPONSE_CANCEL or GTK_RESPONSE_NONE - gtk_dirdialog_cancel_callback(w, dialog); + dialog->GTKOnCancel(); } } @@ -85,10 +49,6 @@ static void gtk_dirdialog_response_callback(GtkWidget *w, IMPLEMENT_DYNAMIC_CLASS(wxDirDialog, wxDialog) -BEGIN_EVENT_TABLE(wxDirDialog, wxDirDialogBase) - EVT_BUTTON(wxID_OK, wxDirDialog::OnFakeOk) -END_EVENT_TABLE() - wxDirDialog::wxDirDialog(wxWindow* parent, const wxString& title, const wxString& defaultPath, @@ -96,6 +56,17 @@ wxDirDialog::wxDirDialog(wxWindow* parent, const wxPoint& pos, const wxSize& WXUNUSED(sz), const wxString& WXUNUSED(name)) +{ + Create(parent, title, defaultPath, style, pos); +} + +bool wxDirDialog::Create(wxWindow* parent, + const wxString& title, + const wxString& defaultPath, + long style, + const wxPoint& pos, + const wxSize& WXUNUSED(sz), + const wxString& WXUNUSED(name)) { m_message = title; @@ -106,7 +77,7 @@ wxDirDialog::wxDirDialog(wxWindow* parent, wxDefaultValidator, wxT("dirdialog"))) { wxFAIL_MSG( wxT("wxDirDialog creation failed") ); - return; + return false; } GtkWindow* gtk_parent = NULL; @@ -127,7 +98,7 @@ wxDirDialog::wxDirDialog(wxWindow* parent, // gtk_widget_hide_on_delete is used here to avoid that Gtk automatically destroys // the dialog when the user press ESC on the dialog: in that case a second call to // ShowModal() would result in a bunch of Gtk-CRITICAL errors... - g_signal_connect (G_OBJECT(m_widget), + g_signal_connect (m_widget, "delete_event", G_CALLBACK (gtk_widget_hide_on_delete), (gpointer)this); @@ -135,7 +106,7 @@ wxDirDialog::wxDirDialog(wxWindow* parent, // local-only property could be set to false to allow non-local files to be loaded. // In that case get/set_uri(s) should be used instead of get/set_filename(s) everywhere // and the GtkFileChooserDialog should probably also be created with a backend, - // e.g "gnome-vfs", "default", ... (gtk_file_chooser_dialog_new_with_backend). + // e.g. "gnome-vfs", "default", ... (gtk_file_chooser_dialog_new_with_backend). // Currently local-only is kept as the default - true: // gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(m_widget), true); @@ -143,15 +114,30 @@ wxDirDialog::wxDirDialog(wxWindow* parent, G_CALLBACK (gtk_dirdialog_response_callback), this); if ( !defaultPath.empty() ) - gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(m_widget), - defaultPath.fn_str() ); + SetPath(defaultPath); + + return true; } -void wxDirDialog::OnFakeOk(wxCommandEvent& WXUNUSED(event)) +void wxDirDialog::GTKOnAccept() { + wxGtkString str(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(m_widget))); + m_selectedDirectory = wxString::FromUTF8(str); + + // change to the directory where the user went if asked + if (HasFlag(wxDD_CHANGE_DIR)) + { + wxSetWorkingDirectory(m_selectedDirectory); + } + EndDialog(wxID_OK); } +void wxDirDialog::GTKOnCancel() +{ + EndDialog(wxID_CANCEL); +} + void wxDirDialog::DoSetSize(int x, int y, int width, int height, int sizeFlags) { if (!m_wxwindow) @@ -165,14 +151,13 @@ void wxDirDialog::SetPath(const wxString& dir) if (wxDirExists(dir)) { gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(m_widget), - dir.fn_str()); + wxGTK_CONV_FN(dir)); } } wxString wxDirDialog::GetPath() const { - wxGtkString str(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(m_widget))); - return wxString::FromUTF8(str); + return m_selectedDirectory; } #endif // wxUSE_DIRDLG