]> git.saurik.com Git - wxWidgets.git/blob - samples/preferences/preferences.cpp
Add a public wxModalDialogHook class for intercepting modal dialogs.
[wxWidgets.git] / samples / preferences / preferences.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: samples/preferences/preferences.cpp
3 // Purpose: Sample demonstrating wxPreferencesEditor use.
4 // Author: Vaclav Slavik
5 // Created: 2013-02-19
6 // RCS-ID: $Id$
7 // Copyright: (c) 2013 Vaclav Slavik <vslavik@fastmail.fm>
8 // Licence: wxWindows licence
9 ///////////////////////////////////////////////////////////////////////////////
10
11
12 #include "wx/wxprec.h"
13
14 #ifdef __BORLANDC__
15 #pragma hdrstop
16 #endif
17
18 #include "wx/preferences.h"
19
20 #include "wx/app.h"
21 #include "wx/config.h"
22 #include "wx/panel.h"
23 #include "wx/scopedptr.h"
24 #include "wx/menu.h"
25 #include "wx/checkbox.h"
26 #include "wx/listbox.h"
27 #include "wx/stattext.h"
28 #include "wx/sizer.h"
29 #include "wx/artprov.h"
30 #include "wx/frame.h"
31
32 class MyApp : public wxApp
33 {
34 public:
35 virtual bool OnInit();
36
37 void ShowPreferencesEditor(wxWindow* parent);
38 void DismissPreferencesEditor();
39
40 private:
41 wxScopedPtr<wxPreferencesEditor> m_prefEditor;
42 };
43
44 IMPLEMENT_APP(MyApp)
45
46
47 class MyFrame : public wxFrame
48 {
49 public:
50 MyFrame() : wxFrame(NULL, wxID_ANY, "Preferences sample")
51 {
52 wxMenu *fileMenu = new wxMenu;
53 fileMenu->Append(wxID_PREFERENCES);
54 fileMenu->Append(wxID_EXIT);
55
56 wxMenuBar *menuBar = new wxMenuBar();
57 menuBar->Append(fileMenu, "&File");
58 SetMenuBar(menuBar);
59
60 Connect(wxID_PREFERENCES,
61 wxEVT_MENU,
62 wxCommandEventHandler(MyFrame::OnPref), NULL, this);
63 Connect(wxID_EXIT,
64 wxEVT_MENU,
65 wxCommandEventHandler(MyFrame::OnExit), NULL, this);
66 Connect(wxEVT_CLOSE_WINDOW,
67 wxCloseEventHandler(MyFrame::OnClose), NULL, this);
68 }
69
70 private:
71 void OnPref(wxCommandEvent&)
72 {
73 wxGetApp().ShowPreferencesEditor(this);
74 }
75
76 void OnExit(wxCommandEvent&)
77 {
78 Close();
79 }
80
81 void OnClose(wxCloseEvent& e)
82 {
83 wxGetApp().DismissPreferencesEditor();
84 e.Skip();
85 }
86 };
87
88
89 class PrefsPageGeneralPanel : public wxPanel
90 {
91 public:
92 PrefsPageGeneralPanel(wxWindow *parent) : wxPanel(parent)
93 {
94 m_useMarkdown = new wxCheckBox(this, wxID_ANY, "User Markdown syntax");
95 m_spellcheck = new wxCheckBox(this, wxID_ANY, "Check spelling");
96
97 wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
98 sizer->Add(m_useMarkdown, wxSizerFlags().Border());
99 sizer->Add(m_spellcheck, wxSizerFlags().Border());
100
101 SetSizerAndFit(sizer);
102
103 // On some platforms (OS X, GNOME), changes to preferences are applied
104 // immediately rather than after the OK or Apply button is pressed.
105 if ( wxPreferencesEditor::ShouldApplyChangesImmediately() )
106 {
107 m_useMarkdown->Connect(wxEVT_CHECKBOX,
108 wxCommandEventHandler(PrefsPageGeneralPanel::ChangedUseMarkdown),
109 NULL, this);
110 m_spellcheck->Connect(wxEVT_CHECKBOX,
111 wxCommandEventHandler(PrefsPageGeneralPanel::ChangedSpellcheck),
112 NULL, this);
113 }
114 }
115
116 virtual bool TransferDataToWindow()
117 {
118 // This is the place where you can initialize values, e.g. from wxConfig.
119 // For demonstration purposes, we just set hardcoded values.
120 m_useMarkdown->SetValue(true);
121 m_spellcheck->SetValue(false);
122 return true;
123 }
124
125 virtual bool TransferDataFromWindow()
126 {
127 // Called on platforms with modal preferences dialog to save and apply
128 // the changes.
129 wxCommandEvent dummy;
130 ChangedUseMarkdown(dummy);
131 ChangedSpellcheck(dummy);
132 return true;
133 }
134
135 private:
136 void ChangedUseMarkdown(wxCommandEvent& WXUNUSED(e))
137 {
138 // save new m_useMarkdown value and apply the change to the app
139 }
140
141 void ChangedSpellcheck(wxCommandEvent& WXUNUSED(e))
142 {
143 // save new m_spellcheck value and apply the change to the app
144 }
145
146 wxCheckBox *m_useMarkdown;
147 wxCheckBox *m_spellcheck;
148 };
149
150 class PrefsPageGeneral : public wxStockPreferencesPage
151 {
152 public:
153 PrefsPageGeneral() : wxStockPreferencesPage(Kind_General) {}
154 virtual wxWindow *CreateWindow(wxWindow *parent)
155 { return new PrefsPageGeneralPanel(parent); }
156 };
157
158
159 class PrefsPageTopicsPanel : public wxPanel
160 {
161 public:
162 PrefsPageTopicsPanel(wxWindow *parent) : wxPanel(parent)
163 {
164 wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
165 sizer->Add(new wxStaticText(this, wxID_ANY, "Search in these topics:"), wxSizerFlags().Border());
166 wxListBox *box = new wxListBox(this, wxID_ANY);
167 box->SetMinSize(wxSize(400, 300));
168 sizer->Add(box, wxSizerFlags(1).Border().Expand());
169 m_fulltext = new wxCheckBox(this, wxID_ANY, "Automatically build fulltext index");
170 sizer->Add(m_fulltext, wxSizerFlags().Border());
171
172 SetSizerAndFit(sizer);
173
174 if ( wxPreferencesEditor::ShouldApplyChangesImmediately() )
175 {
176 m_fulltext->Connect(wxEVT_CHECKBOX,
177 wxCommandEventHandler(PrefsPageTopicsPanel::ChangedFulltext),
178 NULL, this);
179 }
180 }
181
182 virtual bool TransferDataToWindow()
183 {
184 // This is the place where you can initialize values, e.g. from wxConfig.
185 // For demonstration purposes, we just set hardcoded values.
186 m_fulltext->SetValue(true);
187 // TODO: handle the listbox
188 return true;
189 }
190
191 virtual bool TransferDataFromWindow()
192 {
193 // Called on platforms with modal preferences dialog to save and apply
194 // the changes.
195 wxCommandEvent dummy;
196 ChangedFulltext(dummy);
197 // TODO: handle the listbox
198 return true;
199 }
200
201 private:
202 void ChangedFulltext(wxCommandEvent& WXUNUSED(e))
203 {
204 // save new m_fulltext value and apply the change to the app
205 }
206
207 wxCheckBox *m_fulltext;
208 };
209
210 class PrefsPageTopics : public wxPreferencesPage
211 {
212 public:
213 virtual wxString GetName() const { return "Topics"; }
214 virtual wxBitmap GetLargeIcon() const
215 { return wxArtProvider::GetBitmap(wxART_HELP, wxART_TOOLBAR); }
216 virtual wxWindow *CreateWindow(wxWindow *parent)
217 { return new PrefsPageTopicsPanel(parent); }
218 };
219
220
221
222 bool MyApp::OnInit()
223 {
224 if ( !wxApp::OnInit() )
225 return false;
226
227 // This will be used in the title of the preferences dialog under some
228 // platforms, don't leave it as default "Preferences" because this would
229 // result in rather strange "Preferences Preferences" title.
230 SetAppDisplayName("wxWidgets Sample");
231
232 MyFrame *frame = new MyFrame();
233 frame->Show(true);
234
235 return true;
236 }
237
238 void MyApp::ShowPreferencesEditor(wxWindow* parent)
239 {
240 if ( !m_prefEditor )
241 {
242 m_prefEditor.reset(new wxPreferencesEditor);
243 m_prefEditor->AddPage(new PrefsPageGeneral());
244 m_prefEditor->AddPage(new PrefsPageTopics());
245 }
246
247 m_prefEditor->Show(parent);
248 }
249
250 void MyApp::DismissPreferencesEditor()
251 {
252 if ( m_prefEditor )
253 m_prefEditor->Dismiss();
254 }