X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f3c0bcfab0cff80daad95da8236334a18164e87d..6f026b5b63fe7ccb025e84509886f74772b9df13:/src/generic/preferencesg.cpp diff --git a/src/generic/preferencesg.cpp b/src/generic/preferencesg.cpp index 72624a93ec..97236af305 100644 --- a/src/generic/preferencesg.cpp +++ b/src/generic/preferencesg.cpp @@ -3,7 +3,6 @@ // Purpose: Implementation of wxPreferencesEditor. // Author: Vaclav Slavik // Created: 2013-02-19 -// RCS-ID: $Id$ // Copyright: (c) 2013 Vaclav Slavik // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// @@ -23,22 +22,29 @@ #pragma hdrstop #endif +#if wxUSE_PREFERENCES_EDITOR + #include "wx/private/preferences.h" #ifndef wxHAS_PREF_EDITOR_NATIVE +#include "wx/app.h" #include "wx/dialog.h" #include "wx/notebook.h" #include "wx/sizer.h" #include "wx/sharedptr.h" #include "wx/scopedptr.h" +#include "wx/scopeguard.h" #include "wx/vector.h" +namespace +{ + class wxGenericPrefsDialog : public wxDialog { public: - wxGenericPrefsDialog(wxWindow *parent) - : wxDialog(parent, wxID_ANY, _("Preferences"), + wxGenericPrefsDialog(wxWindow *parent, const wxString& title) + : wxDialog(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE & ~(wxRESIZE_BORDER | wxMAXIMIZE_BOX | wxMINIMIZE_BOX)) { @@ -83,6 +89,11 @@ private: class wxGenericPreferencesEditorImplBase : public wxPreferencesEditorImpl { public: + void SetTitle(const wxString& title) + { + m_title = title; + } + virtual void AddPage(wxPreferencesPage* page) { m_pages.push_back(wxSharedPtr(page)); @@ -91,7 +102,15 @@ public: protected: wxGenericPrefsDialog *CreateDialog(wxWindow *parent) { - wxGenericPrefsDialog *dlg = new wxGenericPrefsDialog(parent); + if ( m_title.empty() ) + { + // Use the default title, which should include the application name + // under both MSW and GTK (and OSX uses its own native + // implementation anyhow). + m_title.Printf(_("%s Preferences"), wxTheApp->GetAppDisplayName()); + } + + wxGenericPrefsDialog *dlg = new wxGenericPrefsDialog(parent, m_title); // TODO: Don't create all pages immediately like this, do it on demand // when a page is selected in the notebook (as is done on OS X). @@ -107,12 +126,16 @@ protected: dlg->AddPage(i->get()); } + dlg->Fit(); + return dlg; } typedef wxVector< wxSharedPtr > Pages; Pages m_pages; +private: + wxString m_title; }; @@ -161,6 +184,12 @@ private: wxWeakRef m_win; }; +inline +wxGenericPreferencesEditorImplBase* NewGenericImpl() +{ + return new wxModelessPreferencesEditorImpl; +} + #else // !wxHAS_PREF_EDITOR_MODELESS class wxModalPreferencesEditorImpl : public wxGenericPreferencesEditorImplBase @@ -168,13 +197,18 @@ class wxModalPreferencesEditorImpl : public wxGenericPreferencesEditorImplBase public: wxModalPreferencesEditorImpl() { + m_dlg = NULL; m_currentPage = -1; } virtual void Show(wxWindow* parent) { wxScopedPtr dlg(CreateDialog(parent)); - dlg->Fit(); + + // Store it for Dismiss() but ensure that the pointer is reset to NULL + // when the dialog is destroyed on leaving this function. + m_dlg = dlg.get(); + wxON_BLOCK_EXIT_NULL(m_dlg); // Restore the previously selected page, if any. if ( m_currentPage != -1 ) @@ -187,24 +221,40 @@ public: virtual void Dismiss() { - // nothing to do + if ( m_dlg ) + { + m_dlg->EndModal(wxID_CANCEL); + m_dlg = NULL; + } } private: + wxGenericPrefsDialog* m_dlg; int m_currentPage; + + wxDECLARE_NO_COPY_CLASS(wxModalPreferencesEditorImpl); }; +inline +wxGenericPreferencesEditorImplBase* NewGenericImpl() +{ + return new wxModalPreferencesEditorImpl; +} + #endif // !wxHAS_PREF_EDITOR_MODELESS +} // anonymous namespace /*static*/ -wxPreferencesEditorImpl* wxPreferencesEditorImpl::Create() +wxPreferencesEditorImpl* wxPreferencesEditorImpl::Create(const wxString& title) { -#ifdef wxHAS_PREF_EDITOR_MODELESS - return new wxModelessPreferencesEditorImpl(); -#else - return new wxModalPreferencesEditorImpl(); -#endif + wxGenericPreferencesEditorImplBase* const impl = NewGenericImpl(); + + impl->SetTitle(title); + + return impl; } #endif // !wxHAS_PREF_EDITOR_NATIVE + +#endif // wxUSE_PREFERENCES_EDITOR