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 293