The Android Open Source Project | 52d4c30 | 2009-03-03 19:29:09 -0800 | [diff] [blame] | 1 | // |
| 2 | // Copyright 2005 The Android Open Source Project |
| 3 | // |
| 4 | // Preferences modal dialog. |
| 5 | // |
| 6 | |
| 7 | // For compilers that support precompilation, include "wx/wx.h". |
| 8 | #include "wx/wxprec.h" |
| 9 | // Otherwise, include all standard headers |
| 10 | #ifndef WX_PRECOMP |
| 11 | # include "wx/wx.h" |
| 12 | #endif |
| 13 | |
| 14 | #include "PrefsDialog.h" |
| 15 | #include "Preferences.h" |
| 16 | #include "MyApp.h" |
| 17 | #include "Resource.h" |
| 18 | |
| 19 | BEGIN_EVENT_TABLE(PrefsDialog, wxDialog) |
| 20 | END_EVENT_TABLE() |
| 21 | |
| 22 | /* |
| 23 | * Constructor. |
| 24 | */ |
| 25 | PrefsDialog::PrefsDialog(wxWindow* parent) |
| 26 | : wxDialog(parent, IDD_PREFS, wxT("Preferences"), wxDefaultPosition, |
| 27 | wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ), |
| 28 | mAutoPowerOn(false), |
| 29 | mGammaCorrection(1.0), |
| 30 | mEnableSound(true), |
| 31 | mEnableFakeCamera(true), |
| 32 | mLogLevel(0) |
| 33 | { |
| 34 | LoadPreferences(); |
| 35 | CreateControls(); |
| 36 | } |
| 37 | |
| 38 | /* |
| 39 | * Destructor. Not much to do. |
| 40 | */ |
| 41 | PrefsDialog::~PrefsDialog() |
| 42 | { |
| 43 | } |
| 44 | |
| 45 | /* |
| 46 | * Create all of the pages and add them to the notebook. |
| 47 | */ |
| 48 | void PrefsDialog::CreateControls(void) |
| 49 | { |
| 50 | wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL); |
| 51 | wxBoxSizer* okCancelSizer = new wxBoxSizer(wxHORIZONTAL); |
| 52 | mNotebook.Create(this, wxID_ANY); |
| 53 | wxPanel* page; |
| 54 | |
| 55 | /* pages added to notebook are owned by notebook */ |
| 56 | page = CreateSimulatorPage(&mNotebook); |
| 57 | mNotebook.AddPage(page, wxT("Simulator"), true); // selected page |
| 58 | page = CreateRuntimePage(&mNotebook); |
| 59 | mNotebook.AddPage(page, wxT("Runtime"), false); |
| 60 | |
| 61 | wxButton* cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel"), |
| 62 | wxDefaultPosition, wxDefaultSize, 0); |
| 63 | okCancelSizer->Add(cancel, 0, wxALL | wxALIGN_RIGHT, kInterSpacing); |
| 64 | |
| 65 | wxButton* ok = new wxButton(this, wxID_OK, wxT("&OK"), |
| 66 | wxDefaultPosition, wxDefaultSize, 0); |
| 67 | okCancelSizer->Add(ok, 0, wxALL | wxALIGN_RIGHT, kInterSpacing); |
| 68 | |
| 69 | mainSizer->Add(&mNotebook, 1, wxEXPAND); |
| 70 | mainSizer->Add(okCancelSizer, 0, wxALIGN_RIGHT); |
| 71 | |
| 72 | SetSizer(mainSizer); |
| 73 | |
| 74 | mainSizer->Fit(this); // shrink-to-fit |
| 75 | mainSizer->SetSizeHints(this); // define minimum size |
| 76 | } |
| 77 | |
| 78 | /* |
| 79 | * Load preferences from config file |
| 80 | */ |
| 81 | void PrefsDialog::LoadPreferences(void) |
| 82 | { |
| 83 | Preferences* pPrefs = ((MyApp*)wxTheApp)->GetPrefs(); |
| 84 | assert(pPrefs != NULL); |
| 85 | |
| 86 | /* |
| 87 | * Load preferences. |
| 88 | */ |
| 89 | mConfigFile = ((MyApp*)wxTheApp)->GetConfigFileName(); |
| 90 | |
| 91 | pPrefs->GetDouble("gamma", &mGammaCorrection); |
| 92 | pPrefs->GetString("debugger", /*ref*/ mDebugger); |
| 93 | pPrefs->GetString("valgrinder", /*ref*/ mValgrinder); |
| 94 | pPrefs->GetBool("auto-power-on", &mAutoPowerOn); |
| 95 | pPrefs->GetBool("enable-sound", &mEnableSound); |
| 96 | pPrefs->GetBool("enable-fake-camera", &mEnableFakeCamera); |
| 97 | } |
| 98 | |
| 99 | /* |
| 100 | * Transfer data from our members to the window controls. |
| 101 | * |
| 102 | * First we have to pull the data out of the preferences database. |
| 103 | * Anything that hasn't already been added with a default value will |
| 104 | * be given a default here, which may or may not match the default |
| 105 | * behavior elsewhere. The best solution to this is to define the |
| 106 | * default when the preferences file is created or read, so that we're |
| 107 | * never left guessing here. |
| 108 | */ |
| 109 | bool PrefsDialog::TransferDataToWindow(void) |
| 110 | { |
| 111 | /* |
| 112 | * Do standard dialog setup. |
| 113 | */ |
| 114 | wxTextCtrl* configFileName = (wxTextCtrl*) FindWindow(IDC_SPREFS_CONFIG_NAME); |
| 115 | wxTextCtrl* debugger = (wxTextCtrl*) FindWindow(IDC_SPREFS_DEBUGGER); |
| 116 | wxTextCtrl* valgrinder = (wxTextCtrl*) FindWindow(IDC_SPREFS_VALGRINDER); |
| 117 | wxCheckBox* autoPowerOn = (wxCheckBox*) FindWindow(IDC_SPREFS_AUTO_POWER_ON); |
| 118 | wxCheckBox* enableSound = (wxCheckBox*) FindWindow(IDC_RPREFS_ENABLE_SOUND); |
| 119 | wxCheckBox* enableFakeCamera = (wxCheckBox*) FindWindow(IDC_RPREFS_ENABLE_FAKE_CAMERA); |
| 120 | |
| 121 | wxTextCtrl* gamma = (wxTextCtrl*) FindWindow(IDC_RPREFS_GAMMA); |
| 122 | |
| 123 | configFileName->SetValue(mConfigFile); |
| 124 | debugger->SetValue(mDebugger); |
| 125 | valgrinder->SetValue(mValgrinder); |
| 126 | autoPowerOn->SetValue(mAutoPowerOn); |
| 127 | enableSound->SetValue(mEnableSound); |
| 128 | enableFakeCamera->SetValue(mEnableFakeCamera); |
| 129 | |
| 130 | wxString tmpStr; |
| 131 | tmpStr.Printf(wxT("%.3f"), mGammaCorrection); |
| 132 | gamma->SetValue(tmpStr); |
| 133 | |
| 134 | return true; |
| 135 | } |
| 136 | |
| 137 | /* |
| 138 | * Transfer and validate data from the window controls. |
| 139 | * |
| 140 | * This doesn't get called if the user cancels out of the dialog. |
| 141 | */ |
| 142 | bool PrefsDialog::TransferDataFromControls(void) |
| 143 | { |
| 144 | /* |
| 145 | * Do standard dialog export. |
| 146 | * |
| 147 | * We should error-check all of these. |
| 148 | */ |
| 149 | // configName is read-only, don't need it here |
| 150 | wxTextCtrl* debugger = (wxTextCtrl*) FindWindow(IDC_SPREFS_DEBUGGER); |
| 151 | wxTextCtrl* valgrinder = (wxTextCtrl*) FindWindow(IDC_SPREFS_VALGRINDER); |
| 152 | wxCheckBox* autoPowerOn = (wxCheckBox*) FindWindow(IDC_SPREFS_AUTO_POWER_ON); |
| 153 | wxCheckBox* enableSound = (wxCheckBox*) FindWindow(IDC_RPREFS_ENABLE_SOUND); |
| 154 | wxCheckBox* enableFakeCamera = (wxCheckBox*) FindWindow(IDC_RPREFS_ENABLE_FAKE_CAMERA); |
| 155 | |
| 156 | wxTextCtrl* gamma = (wxTextCtrl*) FindWindow(IDC_RPREFS_GAMMA); |
| 157 | |
| 158 | mDebugger = debugger->GetValue(); |
| 159 | mValgrinder = valgrinder->GetValue(); |
| 160 | mAutoPowerOn = autoPowerOn->GetValue(); |
| 161 | mEnableSound = enableSound->GetValue(); |
| 162 | mEnableFakeCamera = enableFakeCamera->GetValue(); |
| 163 | |
| 164 | wxString tmpStr; |
| 165 | tmpStr = gamma->GetValue(); |
| 166 | bool toDouble = tmpStr.ToDouble(&mGammaCorrection); // returns 0.0 on err; use strtof()? |
| 167 | |
| 168 | if (!toDouble || mGammaCorrection <= 0.0 || mGammaCorrection > 2.0) { |
| 169 | wxMessageBox(wxT("Bad value for gamma -- must be > 0.0 and <= 2.0"), |
| 170 | wxT("Hoser"), wxOK, this); |
| 171 | return false; |
| 172 | } |
| 173 | |
| 174 | return true; |
| 175 | } |
| 176 | |
| 177 | /* |
| 178 | * Transfer preferences to config file |
| 179 | */ |
| 180 | bool PrefsDialog::TransferDataFromWindow(void) |
| 181 | { |
| 182 | Preferences* pPrefs = ((MyApp*)wxTheApp)->GetPrefs(); |
| 183 | assert(pPrefs != NULL); |
| 184 | |
| 185 | /* |
| 186 | * Grab the information from the controls and save in member field |
| 187 | */ |
| 188 | |
| 189 | if (!TransferDataFromControls()) |
| 190 | return false; |
| 191 | |
| 192 | pPrefs->SetString("debugger", mDebugger.ToAscii()); |
| 193 | pPrefs->SetString("valgrinder", mValgrinder.ToAscii()); |
| 194 | pPrefs->SetBool("auto-power-on", mAutoPowerOn); |
| 195 | pPrefs->SetBool("enable-sound", mEnableSound); |
| 196 | pPrefs->SetBool("enable-fake-camera", mEnableFakeCamera); |
| 197 | |
| 198 | pPrefs->SetDouble("gamma", mGammaCorrection); |
| 199 | |
| 200 | return true; |
| 201 | } |
| 202 | |
| 203 | |
| 204 | /* |
| 205 | * Create the Simulator Preferences page. |
| 206 | */ |
| 207 | wxPanel* PrefsDialog::CreateSimulatorPage(wxBookCtrlBase* parent) |
| 208 | { |
| 209 | wxPanel* panel = new wxPanel(parent); |
| 210 | |
| 211 | wxStaticText* configNameDescr = new wxStaticText(panel, wxID_STATIC, |
| 212 | wxT("Config file:")); |
| 213 | wxTextCtrl* configName = new wxTextCtrl(panel, IDC_SPREFS_CONFIG_NAME, |
| 214 | wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_READONLY); |
| 215 | // make it visibly different; unfortunately this kills scroll, copy&paste |
| 216 | configName->Enable(false); |
| 217 | |
| 218 | wxStaticText* debuggerDescr = new wxStaticText(panel, wxID_STATIC, |
| 219 | wxT("Debugger:")); |
| 220 | wxTextCtrl* debugger = new wxTextCtrl(panel, IDC_SPREFS_DEBUGGER); |
| 221 | |
| 222 | wxStaticText* valgrinderDescr = new wxStaticText(panel, wxID_STATIC, |
| 223 | wxT("Valgrind:")); |
| 224 | wxTextCtrl* valgrinder = new wxTextCtrl(panel, IDC_SPREFS_VALGRINDER); |
| 225 | |
| 226 | wxCheckBox* autoPowerOn = new wxCheckBox(panel, IDC_SPREFS_AUTO_POWER_ON, |
| 227 | wxT("Boot runtime when simulator starts")); |
| 228 | |
| 229 | wxBoxSizer* sizerPanel = new wxBoxSizer(wxVERTICAL); |
| 230 | sizerPanel->Add(kMinWidth, kEdgeSpacing); // forces minimum width |
| 231 | sizerPanel->Add(configNameDescr); |
| 232 | sizerPanel->Add(configName, 0, wxEXPAND); |
| 233 | sizerPanel->AddSpacer(kInterSpacing); |
| 234 | sizerPanel->AddSpacer(kInterSpacing); |
| 235 | sizerPanel->Add(debuggerDescr); |
| 236 | sizerPanel->Add(debugger, 0, wxEXPAND); |
| 237 | sizerPanel->AddSpacer(kInterSpacing); |
| 238 | sizerPanel->Add(valgrinderDescr); |
| 239 | sizerPanel->Add(valgrinder, 0, wxEXPAND); |
| 240 | sizerPanel->AddSpacer(kInterSpacing); |
| 241 | sizerPanel->Add(autoPowerOn); |
| 242 | sizerPanel->AddSpacer(kInterSpacing); |
| 243 | |
| 244 | wxBoxSizer* horizIndent = new wxBoxSizer(wxHORIZONTAL); |
| 245 | horizIndent->AddSpacer(kEdgeSpacing); |
| 246 | horizIndent->Add(sizerPanel, wxSHAPED); |
| 247 | horizIndent->AddSpacer(kEdgeSpacing); |
| 248 | panel->SetSizer(horizIndent); |
| 249 | |
| 250 | return panel; |
| 251 | } |
| 252 | |
| 253 | /* |
| 254 | * Create the Runtime Preferences page. |
| 255 | */ |
| 256 | wxPanel* PrefsDialog::CreateRuntimePage(wxBookCtrlBase* parent) |
| 257 | { |
| 258 | wxPanel* panel = new wxPanel(parent); |
| 259 | |
| 260 | wxStaticText* gammaStrDescr = new wxStaticText(panel, wxID_STATIC, |
| 261 | wxT("Gamma correction:")); |
| 262 | wxTextCtrl* gammaStr = new wxTextCtrl(panel, IDC_RPREFS_GAMMA); |
| 263 | |
| 264 | wxBoxSizer* gammaSizer = new wxBoxSizer(wxHORIZONTAL); |
| 265 | gammaSizer->Add(gammaStrDescr, 0, wxALIGN_CENTER_VERTICAL); |
| 266 | gammaSizer->AddSpacer(kInterSpacing); |
| 267 | gammaSizer->Add(gammaStr); |
| 268 | |
| 269 | wxBoxSizer* sizerPanel = new wxBoxSizer(wxVERTICAL); |
| 270 | sizerPanel->Add(kMinWidth, kEdgeSpacing); // forces minimum width |
| 271 | sizerPanel->Add(gammaSizer); |
| 272 | sizerPanel->AddSpacer(kInterSpacing); |
| 273 | |
| 274 | wxCheckBox* enableSound = new wxCheckBox(panel, IDC_RPREFS_ENABLE_SOUND, |
| 275 | wxT("Enable Sound")); |
| 276 | sizerPanel->AddSpacer(kInterSpacing); |
| 277 | sizerPanel->Add(enableSound); |
| 278 | |
| 279 | wxCheckBox* enableFakeCamera = new wxCheckBox(panel, IDC_RPREFS_ENABLE_FAKE_CAMERA, |
| 280 | wxT("Enable Fake Camera")); |
| 281 | sizerPanel->AddSpacer(kInterSpacing); |
| 282 | sizerPanel->Add(enableFakeCamera); |
| 283 | |
| 284 | wxBoxSizer* horizIndent = new wxBoxSizer(wxHORIZONTAL); |
| 285 | horizIndent->AddSpacer(kEdgeSpacing); |
| 286 | horizIndent->Add(sizerPanel, wxEXPAND); |
| 287 | horizIndent->AddSpacer(kEdgeSpacing); |
| 288 | panel->SetSizer(horizIndent); |
| 289 | |
| 290 | return panel; |
| 291 | } |
| 292 | |