// // Copyright 2005 The Android Open Source Project // // Preferences modal dialog. // // For compilers that support precompilation, include "wx/wx.h". #include "wx/wxprec.h" // Otherwise, include all standard headers #ifndef WX_PRECOMP # include "wx/wx.h" #endif #include "PrefsDialog.h" #include "Preferences.h" #include "MyApp.h" #include "Resource.h" BEGIN_EVENT_TABLE(PrefsDialog, wxDialog) END_EVENT_TABLE() /* * Constructor. */ PrefsDialog::PrefsDialog(wxWindow* parent) : wxDialog(parent, IDD_PREFS, wxT("Preferences"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER ), mAutoPowerOn(false), mGammaCorrection(1.0), mEnableSound(true), mEnableFakeCamera(true), mLogLevel(0) { LoadPreferences(); CreateControls(); } /* * Destructor. Not much to do. */ PrefsDialog::~PrefsDialog() { } /* * Create all of the pages and add them to the notebook. */ void PrefsDialog::CreateControls(void) { wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* okCancelSizer = new wxBoxSizer(wxHORIZONTAL); mNotebook.Create(this, wxID_ANY); wxPanel* page; /* pages added to notebook are owned by notebook */ page = CreateSimulatorPage(&mNotebook); mNotebook.AddPage(page, wxT("Simulator"), true); // selected page page = CreateRuntimePage(&mNotebook); mNotebook.AddPage(page, wxT("Runtime"), false); wxButton* cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel"), wxDefaultPosition, wxDefaultSize, 0); okCancelSizer->Add(cancel, 0, wxALL | wxALIGN_RIGHT, kInterSpacing); wxButton* ok = new wxButton(this, wxID_OK, wxT("&OK"), wxDefaultPosition, wxDefaultSize, 0); okCancelSizer->Add(ok, 0, wxALL | wxALIGN_RIGHT, kInterSpacing); mainSizer->Add(&mNotebook, 1, wxEXPAND); mainSizer->Add(okCancelSizer, 0, wxALIGN_RIGHT); SetSizer(mainSizer); mainSizer->Fit(this); // shrink-to-fit mainSizer->SetSizeHints(this); // define minimum size } /* * Load preferences from config file */ void PrefsDialog::LoadPreferences(void) { Preferences* pPrefs = ((MyApp*)wxTheApp)->GetPrefs(); assert(pPrefs != NULL); /* * Load preferences. */ mConfigFile = ((MyApp*)wxTheApp)->GetConfigFileName(); pPrefs->GetDouble("gamma", &mGammaCorrection); pPrefs->GetString("debugger", /*ref*/ mDebugger); pPrefs->GetString("valgrinder", /*ref*/ mValgrinder); pPrefs->GetBool("auto-power-on", &mAutoPowerOn); pPrefs->GetBool("enable-sound", &mEnableSound); pPrefs->GetBool("enable-fake-camera", &mEnableFakeCamera); } /* * Transfer data from our members to the window controls. * * First we have to pull the data out of the preferences database. * Anything that hasn't already been added with a default value will * be given a default here, which may or may not match the default * behavior elsewhere. The best solution to this is to define the * default when the preferences file is created or read, so that we're * never left guessing here. */ bool PrefsDialog::TransferDataToWindow(void) { /* * Do standard dialog setup. */ wxTextCtrl* configFileName = (wxTextCtrl*) FindWindow(IDC_SPREFS_CONFIG_NAME); wxTextCtrl* debugger = (wxTextCtrl*) FindWindow(IDC_SPREFS_DEBUGGER); wxTextCtrl* valgrinder = (wxTextCtrl*) FindWindow(IDC_SPREFS_VALGRINDER); wxCheckBox* autoPowerOn = (wxCheckBox*) FindWindow(IDC_SPREFS_AUTO_POWER_ON); wxCheckBox* enableSound = (wxCheckBox*) FindWindow(IDC_RPREFS_ENABLE_SOUND); wxCheckBox* enableFakeCamera = (wxCheckBox*) FindWindow(IDC_RPREFS_ENABLE_FAKE_CAMERA); wxTextCtrl* gamma = (wxTextCtrl*) FindWindow(IDC_RPREFS_GAMMA); configFileName->SetValue(mConfigFile); debugger->SetValue(mDebugger); valgrinder->SetValue(mValgrinder); autoPowerOn->SetValue(mAutoPowerOn); enableSound->SetValue(mEnableSound); enableFakeCamera->SetValue(mEnableFakeCamera); wxString tmpStr; tmpStr.Printf(wxT("%.3f"), mGammaCorrection); gamma->SetValue(tmpStr); return true; } /* * Transfer and validate data from the window controls. * * This doesn't get called if the user cancels out of the dialog. */ bool PrefsDialog::TransferDataFromControls(void) { /* * Do standard dialog export. * * We should error-check all of these. */ // configName is read-only, don't need it here wxTextCtrl* debugger = (wxTextCtrl*) FindWindow(IDC_SPREFS_DEBUGGER); wxTextCtrl* valgrinder = (wxTextCtrl*) FindWindow(IDC_SPREFS_VALGRINDER); wxCheckBox* autoPowerOn = (wxCheckBox*) FindWindow(IDC_SPREFS_AUTO_POWER_ON); wxCheckBox* enableSound = (wxCheckBox*) FindWindow(IDC_RPREFS_ENABLE_SOUND); wxCheckBox* enableFakeCamera = (wxCheckBox*) FindWindow(IDC_RPREFS_ENABLE_FAKE_CAMERA); wxTextCtrl* gamma = (wxTextCtrl*) FindWindow(IDC_RPREFS_GAMMA); mDebugger = debugger->GetValue(); mValgrinder = valgrinder->GetValue(); mAutoPowerOn = autoPowerOn->GetValue(); mEnableSound = enableSound->GetValue(); mEnableFakeCamera = enableFakeCamera->GetValue(); wxString tmpStr; tmpStr = gamma->GetValue(); bool toDouble = tmpStr.ToDouble(&mGammaCorrection); // returns 0.0 on err; use strtof()? if (!toDouble || mGammaCorrection <= 0.0 || mGammaCorrection > 2.0) { wxMessageBox(wxT("Bad value for gamma -- must be > 0.0 and <= 2.0"), wxT("Hoser"), wxOK, this); return false; } return true; } /* * Transfer preferences to config file */ bool PrefsDialog::TransferDataFromWindow(void) { Preferences* pPrefs = ((MyApp*)wxTheApp)->GetPrefs(); assert(pPrefs != NULL); /* * Grab the information from the controls and save in member field */ if (!TransferDataFromControls()) return false; pPrefs->SetString("debugger", mDebugger.ToAscii()); pPrefs->SetString("valgrinder", mValgrinder.ToAscii()); pPrefs->SetBool("auto-power-on", mAutoPowerOn); pPrefs->SetBool("enable-sound", mEnableSound); pPrefs->SetBool("enable-fake-camera", mEnableFakeCamera); pPrefs->SetDouble("gamma", mGammaCorrection); return true; } /* * Create the Simulator Preferences page. */ wxPanel* PrefsDialog::CreateSimulatorPage(wxBookCtrlBase* parent) { wxPanel* panel = new wxPanel(parent); wxStaticText* configNameDescr = new wxStaticText(panel, wxID_STATIC, wxT("Config file:")); wxTextCtrl* configName = new wxTextCtrl(panel, IDC_SPREFS_CONFIG_NAME, wxT(""), wxDefaultPosition, wxDefaultSize, wxTE_READONLY); // make it visibly different; unfortunately this kills scroll, copy&paste configName->Enable(false); wxStaticText* debuggerDescr = new wxStaticText(panel, wxID_STATIC, wxT("Debugger:")); wxTextCtrl* debugger = new wxTextCtrl(panel, IDC_SPREFS_DEBUGGER); wxStaticText* valgrinderDescr = new wxStaticText(panel, wxID_STATIC, wxT("Valgrind:")); wxTextCtrl* valgrinder = new wxTextCtrl(panel, IDC_SPREFS_VALGRINDER); wxCheckBox* autoPowerOn = new wxCheckBox(panel, IDC_SPREFS_AUTO_POWER_ON, wxT("Boot runtime when simulator starts")); wxBoxSizer* sizerPanel = new wxBoxSizer(wxVERTICAL); sizerPanel->Add(kMinWidth, kEdgeSpacing); // forces minimum width sizerPanel->Add(configNameDescr); sizerPanel->Add(configName, 0, wxEXPAND); sizerPanel->AddSpacer(kInterSpacing); sizerPanel->AddSpacer(kInterSpacing); sizerPanel->Add(debuggerDescr); sizerPanel->Add(debugger, 0, wxEXPAND); sizerPanel->AddSpacer(kInterSpacing); sizerPanel->Add(valgrinderDescr); sizerPanel->Add(valgrinder, 0, wxEXPAND); sizerPanel->AddSpacer(kInterSpacing); sizerPanel->Add(autoPowerOn); sizerPanel->AddSpacer(kInterSpacing); wxBoxSizer* horizIndent = new wxBoxSizer(wxHORIZONTAL); horizIndent->AddSpacer(kEdgeSpacing); horizIndent->Add(sizerPanel, wxSHAPED); horizIndent->AddSpacer(kEdgeSpacing); panel->SetSizer(horizIndent); return panel; } /* * Create the Runtime Preferences page. */ wxPanel* PrefsDialog::CreateRuntimePage(wxBookCtrlBase* parent) { wxPanel* panel = new wxPanel(parent); wxStaticText* gammaStrDescr = new wxStaticText(panel, wxID_STATIC, wxT("Gamma correction:")); wxTextCtrl* gammaStr = new wxTextCtrl(panel, IDC_RPREFS_GAMMA); wxBoxSizer* gammaSizer = new wxBoxSizer(wxHORIZONTAL); gammaSizer->Add(gammaStrDescr, 0, wxALIGN_CENTER_VERTICAL); gammaSizer->AddSpacer(kInterSpacing); gammaSizer->Add(gammaStr); wxBoxSizer* sizerPanel = new wxBoxSizer(wxVERTICAL); sizerPanel->Add(kMinWidth, kEdgeSpacing); // forces minimum width sizerPanel->Add(gammaSizer); sizerPanel->AddSpacer(kInterSpacing); wxCheckBox* enableSound = new wxCheckBox(panel, IDC_RPREFS_ENABLE_SOUND, wxT("Enable Sound")); sizerPanel->AddSpacer(kInterSpacing); sizerPanel->Add(enableSound); wxCheckBox* enableFakeCamera = new wxCheckBox(panel, IDC_RPREFS_ENABLE_FAKE_CAMERA, wxT("Enable Fake Camera")); sizerPanel->AddSpacer(kInterSpacing); sizerPanel->Add(enableFakeCamera); wxBoxSizer* horizIndent = new wxBoxSizer(wxHORIZONTAL); horizIndent->AddSpacer(kEdgeSpacing); horizIndent->Add(sizerPanel, wxEXPAND); horizIndent->AddSpacer(kEdgeSpacing); panel->SetSizer(horizIndent); return panel; }