From: Robert Roebling Date: Sun, 30 Apr 2006 09:44:29 +0000 (+0000) Subject: Trying to commit wxDirDialog patch. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/b50747ea53f4a9906d572d4bca4e452e66c8dbd5?ds=sidebyside Trying to commit wxDirDialog patch. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38956 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/cocoa/dirdlg.h b/include/wx/cocoa/dirdlg.h index a850bafa2d..6b74ed026f 100644 --- a/include/wx/cocoa/dirdlg.h +++ b/include/wx/cocoa/dirdlg.h @@ -19,7 +19,7 @@ DECLARE_WXCOCOA_OBJC_CLASS(NSSavePanel); // wxDirDialog //------------------------------------------------------------------------- -class WXDLLEXPORT wxDirDialog: public wxDialog +class WXDLLEXPORT wxDirDialog: public wxDirDialogBase { DECLARE_DYNAMIC_CLASS(wxDirDialog) DECLARE_NO_COPY_CLASS(wxDirDialog) @@ -33,8 +33,6 @@ public: const wxString& name = wxDirDialogNameStr); ~wxDirDialog(); - wxString GetMessage() const { return m_message; } - wxString GetPath() const { return m_path; } long GetStyle() const { return m_dialogStyle; } virtual int ShowModal(); @@ -43,11 +41,9 @@ public: { return (WX_NSSavePanel)m_cocoaNSWindow; } protected: - wxString m_message; long m_dialogStyle; wxString m_dir; wxWindow * m_parent; - wxString m_path; wxString m_fileName; private: diff --git a/include/wx/dirdlg.h b/include/wx/dirdlg.h index 2afab20159..7a849a713a 100644 --- a/include/wx/dirdlg.h +++ b/include/wx/dirdlg.h @@ -33,31 +33,38 @@ extern WXDLLEXPORT_DATA(const wxChar) wxDirSelectorPromptStr[]; (wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxDD_NEW_DIR_BUTTON) #endif -/* - The interface (TODO: make the other classes really derive from it!) is - something like this: +//------------------------------------------------------------------------- +// wxDirDialogBase +//------------------------------------------------------------------------- class WXDLLEXPORT wxDirDialogBase : public wxDialog { public: wxDirDialogBase(wxWindow *parent, - const wxString& title = wxFileSelectorPromptStr, + const wxString& title = wxDirSelectorPromptStr, const wxString& defaultPath = wxEmptyString, long style = wxDD_DEFAULT_STYLE, const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize, - const wxString& name = _T("dirdialog")); + const wxString& name = wxDirDialogNameStr) + : wxDialog(parent, wxID_ANY, title, pos, sz, style, name) {} + wxDirDialogBase() {} - void SetMessage(const wxString& message); - void SetPath(const wxString& path); - void SetStyle(long style); + virtual ~wxDirDialogBase() {} - wxString GetMessage() const; - wxString GetPath() const; - long GetStyle() const; + virtual void SetMessage(const wxString& message) { m_message = message; } + virtual void SetPath(const wxString& path) { m_path = path; } + virtual void SetStyle(long style) { SetWindowStyle(style); } + + virtual wxString GetMessage() const { return m_message; } + virtual wxString GetPath() const { return m_path; } + virtual long GetStyle() const { return GetWindowStyle(); } + +protected: + wxString m_message; + wxString m_path; }; -*/ // Universal and non-port related switches with need for generic implementation #if defined(__WXMSW__) && (defined(__WXUNIVERSAL__) || \ @@ -79,6 +86,12 @@ public: #include "wx/msw/dirdlg.h" +// Native GTK +#elif defined(__WXGTK__) + + #include "wx/gtk/dirdlg.h" + #define wxDirDialog wxDirDialogGTK + // Native Mac #elif defined(__WXMAC__) @@ -91,7 +104,6 @@ public: // Other ports use generic implementation #elif defined(__WXMOTIF__) || \ - defined(__WXGTK__) || \ defined(__WXX11__) || \ defined(__WXMGL__) || \ defined(__WXCOCOA__) || \ diff --git a/include/wx/generic/dirdlgg.h b/include/wx/generic/dirdlgg.h index 276f1299e1..93dcac9bec 100644 --- a/include/wx/generic/dirdlgg.h +++ b/include/wx/generic/dirdlgg.h @@ -39,25 +39,31 @@ extern WXDLLEXPORT_DATA(const wxChar) wxDirSelectorPromptStr[]; // wxGenericDirDialog //----------------------------------------------------------------------------- -class WXDLLEXPORT wxGenericDirDialog : public wxDialog +class WXDLLEXPORT wxGenericDirDialog : public wxDirDialogBase { public: - wxGenericDirDialog() : wxDialog() { } + wxGenericDirDialog() : wxDirDialogBase() { } wxGenericDirDialog(wxWindow* parent, const wxString& title = wxDirSelectorPromptStr, const wxString& defaultPath = wxEmptyString, long style = wxDD_DEFAULT_STYLE, const wxPoint& pos = wxDefaultPosition, - const wxSize& sz = wxSize(450, 550), + const wxSize& sz = wxDefaultSize,//Size(450, 550), + const wxString& name = wxDirDialogNameStr); + + bool Create(wxWindow* parent, + const wxString& title = wxDirSelectorPromptStr, + const wxString& defaultPath = wxEmptyString, + long style = wxDD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& sz = wxDefaultSize,//Size(450, 550), const wxString& name = wxDirDialogNameStr); //// Accessors - void SetMessage(const wxString& message) { m_message = message; } void SetPath(const wxString& path); void SetStyle(long style) { m_dialogStyle = style; } - wxString GetMessage() const { return m_message; } wxString GetPath() const; long GetStyle() const { return m_dialogStyle; } @@ -77,9 +83,7 @@ protected: void OnGoHome(wxCommandEvent& event); void OnShowHidden(wxCommandEvent& event); - wxString m_message; long m_dialogStyle; - wxString m_path; wxGenericDirCtrl* m_dirCtrl; wxTextCtrl* m_input; diff --git a/include/wx/gtk/dirdlg.h b/include/wx/gtk/dirdlg.h new file mode 100644 index 0000000000..d044dee873 --- /dev/null +++ b/include/wx/gtk/dirdlg.h @@ -0,0 +1,61 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: dirdlg.h +// Purpose: wxDirDialogGTK +// Author: Francesco Montorsi +// Id: $Id$ +// Copyright: (c) 2006 Francesco Montorsi +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +#ifndef __GTKDIRDLGH__ +#define __GTKDIRDLGH__ + +#include "wx/generic/dirdlgg.h" + +//------------------------------------------------------------------------- +// wxDirDialogGTK +//------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxDirDialogGTK : public wxGenericDirDialog +{ +public: + wxDirDialogGTK() { } + + wxDirDialogGTK(wxWindow *parent, + const wxString& message = wxDirSelectorPromptStr, + const wxString& defaultPath = _T(""), + long style = wxDD_DEFAULT_STYLE, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const wxString& name = wxDirDialogNameStr); + + virtual ~wxDirDialogGTK(); + + +public: // overrides from wxGenericDirDialog + + wxString GetPath() const; + void SetPath(const wxString& path); + + virtual int ShowModal(); + virtual bool Show( bool show = true ); + + +//private: must be accessible by GTK callback + bool m_destroyed_by_delete; + +protected: + // override this from wxTLW since the native + // form doesn't have any m_wxwindow + virtual void DoSetSize(int x, int y, + int width, int height, + int sizeFlags = wxSIZE_AUTO); + + +private: + DECLARE_DYNAMIC_CLASS(wxDirDialogGTK) + DECLARE_EVENT_TABLE() + void OnFakeOk( wxCommandEvent &event ); +}; + +#endif // __GTKDIRDLGH__ diff --git a/include/wx/mac/carbon/dirdlg.h b/include/wx/mac/carbon/dirdlg.h index 98f39ff9ad..1017750ea3 100644 --- a/include/wx/mac/carbon/dirdlg.h +++ b/include/wx/mac/carbon/dirdlg.h @@ -12,7 +12,7 @@ #ifndef _WX_DIRDLG_H_ #define _WX_DIRDLG_H_ -class WXDLLEXPORT wxDirDialog : public wxDialog +class WXDLLEXPORT wxDirDialog : public wxDirDialogBase { public: wxDirDialog(wxWindow *parent, @@ -23,21 +23,14 @@ public: const wxSize& size = wxDefaultSize, const wxString& name = wxDirDialogNameStr); - void SetMessage(const wxString& message) { m_message = message; } - void SetPath(const wxString& path) { m_path = path; } void SetStyle(long style) { m_dialogStyle = style; } - - wxString GetMessage() const { return m_message; } - wxString GetPath() const { return m_path; } long GetStyle() const { return m_dialogStyle; } virtual int ShowModal(); protected: - wxString m_message; long m_dialogStyle; wxWindow * m_parent; - wxString m_path; DECLARE_DYNAMIC_CLASS(wxDirDialog) }; diff --git a/include/wx/mac/classic/dirdlg.h b/include/wx/mac/classic/dirdlg.h index 98f39ff9ad..1017750ea3 100644 --- a/include/wx/mac/classic/dirdlg.h +++ b/include/wx/mac/classic/dirdlg.h @@ -12,7 +12,7 @@ #ifndef _WX_DIRDLG_H_ #define _WX_DIRDLG_H_ -class WXDLLEXPORT wxDirDialog : public wxDialog +class WXDLLEXPORT wxDirDialog : public wxDirDialogBase { public: wxDirDialog(wxWindow *parent, @@ -23,21 +23,14 @@ public: const wxSize& size = wxDefaultSize, const wxString& name = wxDirDialogNameStr); - void SetMessage(const wxString& message) { m_message = message; } - void SetPath(const wxString& path) { m_path = path; } void SetStyle(long style) { m_dialogStyle = style; } - - wxString GetMessage() const { return m_message; } - wxString GetPath() const { return m_path; } long GetStyle() const { return m_dialogStyle; } virtual int ShowModal(); protected: - wxString m_message; long m_dialogStyle; wxWindow * m_parent; - wxString m_path; DECLARE_DYNAMIC_CLASS(wxDirDialog) }; diff --git a/include/wx/msw/dirdlg.h b/include/wx/msw/dirdlg.h index 9800ab84f1..23e416fe2e 100644 --- a/include/wx/msw/dirdlg.h +++ b/include/wx/msw/dirdlg.h @@ -12,7 +12,7 @@ #ifndef _WX_DIRDLG_H_ #define _WX_DIRDLG_H_ -class WXDLLEXPORT wxDirDialog : public wxDialog +class WXDLLEXPORT wxDirDialog : public wxDirDialogBase { public: wxDirDialog(wxWindow *parent, @@ -23,20 +23,10 @@ public: const wxSize& size = wxDefaultSize, const wxString& name = wxDirDialogNameStr); - void SetMessage(const wxString& message) { m_message = message; } void SetPath(const wxString& path); - void SetStyle(long style) { SetWindowStyle(style); } - - wxString GetMessage() const { return m_message; } - wxString GetPath() const { return m_path; } - long GetStyle() const { return GetWindowStyle(); } virtual int ShowModal(); -protected: - wxString m_message; - wxString m_path; - private: DECLARE_DYNAMIC_CLASS_NO_COPY(wxDirDialog) }; diff --git a/include/wx/os2/dirdlg.h b/include/wx/os2/dirdlg.h index 08a393ff91..9f8d900ae3 100644 --- a/include/wx/os2/dirdlg.h +++ b/include/wx/os2/dirdlg.h @@ -16,7 +16,7 @@ WXDLLEXPORT_DATA(extern const wxChar) wxFileSelectorPromptStr[]; -class WXDLLEXPORT wxDirDialog: public wxDialog +class WXDLLEXPORT wxDirDialog: public wxDirDialogBase { DECLARE_DYNAMIC_CLASS(wxDirDialog) public: @@ -24,21 +24,14 @@ public: const wxString& defaultPath = "", long style = 0, const wxPoint& pos = wxDefaultPosition); - inline void SetMessage(const wxString& message) { m_message = message; } - inline void SetPath(const wxString& path) { m_path = path; } inline void SetStyle(long style) { m_dialogStyle = style; } - - inline wxString GetMessage() const { return m_message; } - inline wxString GetPath() const { return m_path; } inline long GetStyle() const { return m_dialogStyle; } int ShowModal(); protected: - wxString m_message; long m_dialogStyle; wxWindow * m_parent; - wxString m_path; }; #endif diff --git a/include/wx/palmos/dirdlg.h b/include/wx/palmos/dirdlg.h index 19d1896354..a8ee2fcdb9 100644 --- a/include/wx/palmos/dirdlg.h +++ b/include/wx/palmos/dirdlg.h @@ -12,7 +12,7 @@ #ifndef _WX_DIRDLG_H_ #define _WX_DIRDLG_H_ -class WXDLLEXPORT wxDirDialog : public wxDialog +class WXDLLEXPORT wxDirDialog : public wxDirDialogBase { public: wxDirDialog(wxWindow *parent, @@ -23,20 +23,10 @@ public: const wxSize& size = wxDefaultSize, const wxString& name = wxDirDialogNameStr); - void SetMessage(const wxString& message) { m_message = message; } void SetPath(const wxString& path); - void SetStyle(long style) { SetWindowStyle(style); } - - wxString GetMessage() const { return m_message; } - wxString GetPath() const { return m_path; } - long GetStyle() const { return GetWindowStyle(); } virtual int ShowModal(); -protected: - wxString m_message; - wxString m_path; - private: DECLARE_DYNAMIC_CLASS_NO_COPY(wxDirDialog) }; diff --git a/src/generic/dirdlgg.cpp b/src/generic/dirdlgg.cpp index 5c5ca45087..e52fea9d91 100644 --- a/src/generic/dirdlgg.cpp +++ b/src/generic/dirdlgg.cpp @@ -79,7 +79,15 @@ wxGenericDirDialog::wxGenericDirDialog(wxWindow* parent, const wxString& title, const wxString& defaultPath, long style, const wxPoint& pos, const wxSize& sz, const wxString& name): - wxDialog(parent, ID_DIRCTRL, title, pos, sz, style, name) + wxDirDialogBase(parent, title, defaultPath, style, pos, sz, name) +{ + Create(parent, title, defaultPath, style, pos, sz, name); +} + +bool wxGenericDirDialog::Create(wxWindow* parent, const wxString& title, + const wxString& defaultPath, long style, + const wxPoint& pos, const wxSize& sz, + const wxString& name) { wxBusyCursor cursor; @@ -197,6 +205,8 @@ wxGenericDirDialog::wxGenericDirDialog(wxWindow* parent, const wxString& title, topsizer->Fit( this ); Centre( wxBOTH ); + + return true; } void wxGenericDirDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) diff --git a/src/gtk/dirdlg.cpp b/src/gtk/dirdlg.cpp new file mode 100644 index 0000000000..29dba78b05 --- /dev/null +++ b/src/gtk/dirdlg.cpp @@ -0,0 +1,272 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/gtk/dirdlg.cpp +// Purpose: native implementation of wxDirDialog +// Author: Robert Roebling, Zbigniew Zagorski, Mart Raudsepp, Francesco Montorsi +// Id: $Id$ +// Copyright: (c) 1998 Robert Roebling, 2004 Zbigniew Zagorski, 2005 Mart Raudsepp +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + + + +/* + NOTE: the GtkFileChooser interface can be used both for wxFileDialog and for wxDirDialog. + Thus following code is very similar (even if not identic) to src/gtk/filedlg.cpp + If you find a problem in this code, remember to check also that file ! +*/ + + + +#if wxUSE_DIRDLG + +#include "wx/dirdlg.h" + +#ifndef WX_PRECOMP + #include "wx/intl.h" +#endif + +#ifdef __WXGTK24__ + +#include +#include "wx/gtk/private.h" + +#include // chdir + +#include "wx/filename.h" // wxFilename +#include "wx/tokenzr.h" // wxStringTokenizer +#include "wx/filefn.h" // ::wxGetCwd +#include "wx/msgdlg.h" // wxMessageDialog + +//----------------------------------------------------------------------------- +// idle system +//----------------------------------------------------------------------------- + +extern void wxapp_install_idle_handler(); + +//----------------------------------------------------------------------------- +// "clicked" for OK-button +//----------------------------------------------------------------------------- + +extern "C" { +static void gtk_filedialog_ok_callback(GtkWidget *widget, wxDirDialog *dialog) +{ + int style = dialog->GetStyle(); + gchar* filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); + + // gtk version numbers must be identical with the one in ctor (that calls set_do_overwrite_confirmation) +#if GTK_CHECK_VERSION(2,7,3) + if(gtk_check_version(2,7,3) != NULL) +#endif + if ((style & wxSAVE) && (style & wxOVERWRITE_PROMPT)) + { + if ( g_file_test(filename, G_FILE_TEST_EXISTS) ) + { + wxString msg; + + msg.Printf( + _("File '%s' already exists, do you really want to overwrite it?"), + wxString(wxConvFileName->cMB2WX(filename)).c_str()); + + wxMessageDialog dlg(dialog, msg, _("Confirm"), + wxYES_NO | wxICON_QUESTION); + if (dlg.ShowModal() != wxID_YES) + return; + } + } + + // change to the directory where the user went if asked + if (style & wxCHANGE_DIR) + { + // Use chdir to not care about filename encodings + gchar* folder = g_path_get_dirname(filename); + chdir(folder); + g_free(folder); + } + + g_free(filename); + + wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK); + event.SetEventObject(dialog); + dialog->GetEventHandler()->ProcessEvent(event); +} +} + +//----------------------------------------------------------------------------- +// "clicked" for Cancel-button +//----------------------------------------------------------------------------- + +extern "C" { +static void gtk_filedialog_cancel_callback(GtkWidget *WXUNUSED(w), + wxDirDialog *dialog) +{ + wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL); + event.SetEventObject(dialog); + dialog->GetEventHandler()->ProcessEvent(event); +} +} + +extern "C" { +static void gtk_filedialog_response_callback(GtkWidget *w, + gint response, + wxDirDialog *dialog) +{ + wxapp_install_idle_handler(); + + if (response == GTK_RESPONSE_ACCEPT) + gtk_filedialog_ok_callback(w, dialog); + else if (response == GTK_RESPONSE_CANCEL) + gtk_filedialog_cancel_callback(w, dialog); + else // "delete" + { + gtk_filedialog_cancel_callback(w, dialog); + dialog->m_destroyed_by_delete = true; + } +} +} + +#endif // __WXGTK24__ + +//----------------------------------------------------------------------------- +// wxDirDialog +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxDirDialog,wxGenericDirDialog) + +BEGIN_EVENT_TABLE(wxDirDialog,wxGenericDirDialog) + EVT_BUTTON(wxID_OK, wxDirDialog::OnFakeOk) +END_EVENT_TABLE() + +wxDirDialog::wxDirDialog(wxWindow* parent, const wxString& title, + const wxString& defaultPath, long style, + const wxPoint& pos, const wxSize& sz, + const wxString& name) +{ +#ifdef __WXGTK24__ + if (!gtk_check_version(2,4,0)) + { + m_message = title; + m_needParent = false; + m_destroyed_by_delete = false; + + if (!PreCreation(parent, pos, wxDefaultSize) || + !CreateBase(parent, wxID_ANY, pos, wxDefaultSize, style, + wxDefaultValidator, wxT("filedialog"))) + { + wxFAIL_MSG( wxT("wxDirDialog creation failed") ); + return; + } + + GtkFileChooserAction gtk_action; + GtkWindow* gtk_parent = NULL; + if (parent) + gtk_parent = GTK_WINDOW( gtk_widget_get_toplevel(parent->m_widget) ); + + gtk_action = GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER; + if (style & wxDD_NEW_DIR_BUTTON) + gtk_action = GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER; + + m_widget = gtk_file_chooser_dialog_new( + wxGTK_CONV(m_message), + gtk_parent, + gtk_action, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + + // 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). + // Currently local-only is kept as the default - true: + // gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(m_widget), true); + + g_signal_connect(G_OBJECT(m_widget), "response", + GTK_SIGNAL_FUNC(gtk_filedialog_response_callback), (gpointer)this); + + if ( !defaultPath.empty() ) + gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(m_widget), + wxConvFileName->cWX2MB(defaultPath) ); + } + else +#endif + wxGenericDirDialog::Create(parent, title, defaultPath, style, pos, sz, name); +} + +wxDirDialog::~wxDirDialog() +{ +#ifdef __WXGTK24__ + if (!gtk_check_version(2,4,0)) + { + if (m_destroyed_by_delete) + m_widget = NULL; + } +#endif +} + +void wxDirDialog::OnFakeOk( wxCommandEvent &event ) +{ +#ifdef __WXGTK24__ + if (!gtk_check_version(2,4,0)) + wxDialog::OnOK( event ); + else +#endif + wxGenericDirDialog::OnOK( event ); +} + +int wxDirDialog::ShowModal() +{ +#ifdef __WXGTK24__ + if (!gtk_check_version(2,4,0)) + return wxDialog::ShowModal(); + else +#endif + return wxGenericDirDialog::ShowModal(); +} + +bool wxDirDialog::Show( bool show ) +{ +#ifdef __WXGTK24__ + if (!gtk_check_version(2,4,0)) + return wxDialog::Show( show ); + else +#endif + return wxGenericDirDialog::Show( show ); +} + +void wxDirDialog::DoSetSize(int x, int y, int width, int height, int sizeFlags ) +{ + if (!m_wxwindow) + return; + else + wxGenericDirDialog::DoSetSize( x, y, width, height, sizeFlags ); +} + +void wxDirDialog::SetPath(const wxString& dir) +{ +#ifdef __WXGTK24__ + if (!gtk_check_version(2,4,0)) + { + if (wxDirExists(dir)) + { + gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(m_widget), wxConvFileName->cWX2MB(dir)); + } + } + else +#endif + wxGenericDirDialog::SetPath( dir ); +} + +wxString wxDirDialog::GetPath() const +{ +#ifdef __WXGTK24__ + if (!gtk_check_version(2,4,0)) + return wxConvFileName->cMB2WX( gtk_file_chooser_get_filename( GTK_FILE_CHOOSER(m_widget) ) ); + else +#endif + return wxGenericDirDialog::GetPath(); +} + +#endif // wxUSE_DIRDLG