// Purpose: Implementation of wxPreferencesEditor.
// Author: Vaclav Slavik
// Created: 2013-02-19
-// RCS-ID: $Id$
// Copyright: (c) 2013 Vaclav Slavik <vslavik@fastmail.fm>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#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))
{
m_notebook->AddPage(win, page->GetName());
}
+ int GetSelectedPage() const
+ {
+ return m_notebook->GetSelection();
+ }
+
+ void SelectPage(int page)
+ {
+ m_notebook->ChangeSelection(page);
+ }
+
private:
wxNotebook *m_notebook;
};
class wxGenericPreferencesEditorImplBase : public wxPreferencesEditorImpl
{
public:
+ void SetTitle(const wxString& title)
+ {
+ m_title = title;
+ }
+
virtual void AddPage(wxPreferencesPage* page)
{
m_pages.push_back(wxSharedPtr<wxPreferencesPage>(page));
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).
dlg->AddPage(i->get());
}
+ dlg->Fit();
+
return dlg;
}
typedef wxVector< wxSharedPtr<wxPreferencesPage> > Pages;
Pages m_pages;
+private:
+ wxString m_title;
};
wxWeakRef<wxWindow> m_win;
};
+inline
+wxGenericPreferencesEditorImplBase* NewGenericImpl()
+{
+ return new wxModelessPreferencesEditorImpl;
+}
+
#else // !wxHAS_PREF_EDITOR_MODELESS
class wxModalPreferencesEditorImpl : public wxGenericPreferencesEditorImplBase
{
public:
+ wxModalPreferencesEditorImpl()
+ {
+ m_dlg = NULL;
+ m_currentPage = -1;
+ }
+
virtual void Show(wxWindow* parent)
{
wxScopedPtr<wxGenericPrefsDialog> dlg(CreateDialog(parent));
- dlg->Fit();
- dlg->ShowModal();
+
+ // 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 )
+ dlg->SelectPage(m_currentPage);
+
+ // Don't remember the last selected page if the dialog was cancelled.
+ if ( dlg->ShowModal() != wxID_CANCEL )
+ m_currentPage = dlg->GetSelectedPage();
}
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