fix the bug which prevented the same wxFile/DirDialog object from being used twice (patch 1485127)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39397 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -29,7 +29,7 @@ public:
|
|||||||
const wxSize& size = wxDefaultSize,
|
const wxSize& size = wxDefaultSize,
|
||||||
const wxString& name = wxDirDialogNameStr);
|
const wxString& name = wxDirDialogNameStr);
|
||||||
|
|
||||||
virtual ~wxDirDialogGTK();
|
virtual ~wxDirDialogGTK() {}
|
||||||
|
|
||||||
|
|
||||||
public: // overrides from wxGenericDirDialog
|
public: // overrides from wxGenericDirDialog
|
||||||
@@ -41,9 +41,6 @@ public: // overrides from wxGenericDirDialog
|
|||||||
virtual bool Show( bool show = true );
|
virtual bool Show( bool show = true );
|
||||||
|
|
||||||
|
|
||||||
//private: must be accessible by GTK callback
|
|
||||||
bool m_destroyed_by_delete;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// override this from wxTLW since the native
|
// override this from wxTLW since the native
|
||||||
// form doesn't have any m_wxwindow
|
// form doesn't have any m_wxwindow
|
||||||
|
@@ -29,7 +29,7 @@ public:
|
|||||||
long style = 0,
|
long style = 0,
|
||||||
const wxPoint& pos = wxDefaultPosition);
|
const wxPoint& pos = wxDefaultPosition);
|
||||||
|
|
||||||
virtual ~wxFileDialog();
|
virtual ~wxFileDialog() {}
|
||||||
|
|
||||||
virtual wxString GetPath() const;
|
virtual wxString GetPath() const;
|
||||||
virtual void GetPaths(wxArrayString& paths) const;
|
virtual void GetPaths(wxArrayString& paths) const;
|
||||||
@@ -48,8 +48,7 @@ public:
|
|||||||
virtual int ShowModal();
|
virtual int ShowModal();
|
||||||
virtual bool Show( bool show = true );
|
virtual bool Show( bool show = true );
|
||||||
|
|
||||||
//private:
|
|
||||||
bool m_destroyed_by_delete;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// override this from wxTLW since the native
|
// override this from wxTLW since the native
|
||||||
|
@@ -87,13 +87,8 @@ static void gtk_dirdialog_response_callback(GtkWidget *w,
|
|||||||
|
|
||||||
if (response == GTK_RESPONSE_ACCEPT)
|
if (response == GTK_RESPONSE_ACCEPT)
|
||||||
gtk_dirdialog_ok_callback(w, dialog);
|
gtk_dirdialog_ok_callback(w, dialog);
|
||||||
else if (response == GTK_RESPONSE_CANCEL)
|
else // GTK_RESPONSE_CANCEL or GTK_RESPONSE_NONE
|
||||||
gtk_dirdialog_cancel_callback(w, dialog);
|
gtk_dirdialog_cancel_callback(w, dialog);
|
||||||
else // "delete"
|
|
||||||
{
|
|
||||||
gtk_dirdialog_cancel_callback(w, dialog);
|
|
||||||
dialog->m_destroyed_by_delete = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,7 +114,6 @@ wxDirDialogGTK::wxDirDialogGTK(wxWindow* parent, const wxString& title,
|
|||||||
{
|
{
|
||||||
m_message = title;
|
m_message = title;
|
||||||
m_needParent = false;
|
m_needParent = false;
|
||||||
m_destroyed_by_delete = false;
|
|
||||||
|
|
||||||
if (!PreCreation(parent, pos, wxDefaultSize) ||
|
if (!PreCreation(parent, pos, wxDefaultSize) ||
|
||||||
!CreateBase(parent, wxID_ANY, pos, wxDefaultSize, style,
|
!CreateBase(parent, wxID_ANY, pos, wxDefaultSize, style,
|
||||||
@@ -148,6 +142,14 @@ wxDirDialogGTK::wxDirDialogGTK(wxWindow* parent, const wxString& title,
|
|||||||
|
|
||||||
gtk_dialog_set_default_response(GTK_DIALOG(m_widget), GTK_RESPONSE_ACCEPT);
|
gtk_dialog_set_default_response(GTK_DIALOG(m_widget), GTK_RESPONSE_ACCEPT);
|
||||||
|
|
||||||
|
// 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),
|
||||||
|
"delete_event",
|
||||||
|
G_CALLBACK (gtk_widget_hide_on_delete),
|
||||||
|
(gpointer)this);
|
||||||
|
|
||||||
// local-only property could be set to false to allow non-local files to be loaded.
|
// 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
|
// 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,
|
// and the GtkFileChooserDialog should probably also be created with a backend,
|
||||||
@@ -167,17 +169,6 @@ wxDirDialogGTK::wxDirDialogGTK(wxWindow* parent, const wxString& title,
|
|||||||
wxGenericDirDialog::Create(parent, title, defaultPath, style, pos, sz, name);
|
wxGenericDirDialog::Create(parent, title, defaultPath, style, pos, sz, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
wxDirDialogGTK::~wxDirDialogGTK()
|
|
||||||
{
|
|
||||||
#ifdef __WXGTK24__
|
|
||||||
if (!gtk_check_version(2,4,0))
|
|
||||||
{
|
|
||||||
if (m_destroyed_by_delete)
|
|
||||||
m_widget = NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxDirDialogGTK::OnFakeOk( wxCommandEvent &event )
|
void wxDirDialogGTK::OnFakeOk( wxCommandEvent &event )
|
||||||
{
|
{
|
||||||
#ifdef __WXGTK24__
|
#ifdef __WXGTK24__
|
||||||
|
@@ -89,8 +89,7 @@ static void gtk_filedialog_ok_callback(GtkWidget *widget, wxFileDialog *dialog)
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
static void gtk_filedialog_cancel_callback(GtkWidget *WXUNUSED(w),
|
static void gtk_filedialog_cancel_callback(GtkWidget *w, wxFileDialog *dialog)
|
||||||
wxFileDialog *dialog)
|
|
||||||
{
|
{
|
||||||
wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
|
wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
|
||||||
event.SetEventObject(dialog);
|
event.SetEventObject(dialog);
|
||||||
@@ -107,13 +106,8 @@ static void gtk_filedialog_response_callback(GtkWidget *w,
|
|||||||
|
|
||||||
if (response == GTK_RESPONSE_ACCEPT)
|
if (response == GTK_RESPONSE_ACCEPT)
|
||||||
gtk_filedialog_ok_callback(w, dialog);
|
gtk_filedialog_ok_callback(w, dialog);
|
||||||
else if (response == GTK_RESPONSE_CANCEL)
|
else // GTK_RESPONSE_CANCEL or GTK_RESPONSE_NONE
|
||||||
gtk_filedialog_cancel_callback(w, dialog);
|
gtk_filedialog_cancel_callback(w, dialog);
|
||||||
else // "delete"
|
|
||||||
{
|
|
||||||
gtk_filedialog_cancel_callback(w, dialog);
|
|
||||||
dialog->m_destroyed_by_delete = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,7 +136,6 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
|
|||||||
{
|
{
|
||||||
wxASSERT_MSG( !( (style & wxSAVE) && (style & wxMULTIPLE) ), wxT("wxFileDialog - wxMULTIPLE used on a save dialog" ) );
|
wxASSERT_MSG( !( (style & wxSAVE) && (style & wxMULTIPLE) ), wxT("wxFileDialog - wxMULTIPLE used on a save dialog" ) );
|
||||||
m_needParent = false;
|
m_needParent = false;
|
||||||
m_destroyed_by_delete = false;
|
|
||||||
|
|
||||||
if (!PreCreation(parent, pos, wxDefaultSize) ||
|
if (!PreCreation(parent, pos, wxDefaultSize) ||
|
||||||
!CreateBase(parent, wxID_ANY, pos, wxDefaultSize, style,
|
!CreateBase(parent, wxID_ANY, pos, wxDefaultSize, style,
|
||||||
@@ -182,6 +175,14 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
|
|||||||
if ( style & wxMULTIPLE )
|
if ( style & wxMULTIPLE )
|
||||||
gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(m_widget), true);
|
gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(m_widget), true);
|
||||||
|
|
||||||
|
// 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),
|
||||||
|
"delete_event",
|
||||||
|
G_CALLBACK (gtk_widget_hide_on_delete),
|
||||||
|
(gpointer)this);
|
||||||
|
|
||||||
// local-only property could be set to false to allow non-local files to be loaded.
|
// 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
|
// 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,
|
// and the GtkFileChooserDialog should probably also be created with a backend,
|
||||||
@@ -232,17 +233,6 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
|
|||||||
wxGenericFileDialog::Create( parent, message, defaultDir, defaultFileName, wildCard, style, pos );
|
wxGenericFileDialog::Create( parent, message, defaultDir, defaultFileName, wildCard, style, pos );
|
||||||
}
|
}
|
||||||
|
|
||||||
wxFileDialog::~wxFileDialog()
|
|
||||||
{
|
|
||||||
#ifdef __WXGTK24__
|
|
||||||
if (!gtk_check_version(2,4,0))
|
|
||||||
{
|
|
||||||
if (m_destroyed_by_delete)
|
|
||||||
m_widget = NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxFileDialog::OnFakeOk( wxCommandEvent &event )
|
void wxFileDialog::OnFakeOk( wxCommandEvent &event )
|
||||||
{
|
{
|
||||||
#ifdef __WXGTK24__
|
#ifdef __WXGTK24__
|
||||||
|
Reference in New Issue
Block a user