| // |
| // Copyright 2005 The Android Open Source Project |
| // |
| // Log 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 "LogPrefsDialog.h" |
| #include "Preferences.h" |
| #include "Resource.h" |
| #include "utils.h" |
| |
| BEGIN_EVENT_TABLE(LogPrefsDialog, wxDialog) |
| EVT_CHECKBOX(IDC_LOG_PREFS_WRITE_FILE, LogPrefsDialog::OnWriteFile) |
| END_EVENT_TABLE() |
| |
| static const wxString gSpacerChoices[] = { |
| wxT("0"), wxT("1"), wxT("2") |
| }; |
| static const wxString gPointSizes[] = { |
| wxT("4"), wxT("6"), wxT("8"), wxT("10"), wxT("12"), wxT("14"), wxT("16") |
| }; |
| |
| |
| /* |
| * Constructor. |
| */ |
| LogPrefsDialog::LogPrefsDialog(wxWindow* parent) |
| : wxDialog(parent, IDD_LOG_PREFS, wxT("Log Preferences"), wxDefaultPosition, |
| wxDefaultSize, wxDEFAULT_DIALOG_STYLE), |
| mHeaderFormat(kHFFull), mSingleLine(false), mExtraSpacing(0), |
| mUseColor(false), mFontMonospace(false), mDisplayMax(0), mPoolSizeKB(0) |
| { |
| CreateControls(); |
| } |
| |
| |
| /* |
| * Destructor. Not much to do. |
| */ |
| LogPrefsDialog::~LogPrefsDialog(void) |
| { |
| } |
| |
| /* |
| * Create all of the pages and add them to the notebook. |
| */ |
| void LogPrefsDialog::CreateControls(void) |
| { |
| wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL); |
| wxBoxSizer* okCancelSizer = new wxBoxSizer(wxHORIZONTAL); |
| mNotebook.Create(this, wxID_ANY); |
| wxPanel* page; |
| |
| page = CreateFormatPage(&mNotebook); |
| mNotebook.AddPage(page, wxT("Format"), true); |
| page = CreateLimitsPage(&mNotebook); |
| mNotebook.AddPage(page, wxT("Limits"), false); |
| page = CreateFilesPage(&mNotebook); |
| mNotebook.AddPage(page, wxT("Files"), false); |
| |
| // note to self: could use CreateButtonSizer here? |
| wxButton* cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel"), |
| wxDefaultPosition, wxDefaultSize, 0); |
| okCancelSizer->Add(cancel, 0, wxALL, kInterSpacing); |
| |
| wxButton* ok = new wxButton(this, wxID_OK, wxT("&OK"), |
| wxDefaultPosition, wxDefaultSize, 0); |
| okCancelSizer->Add(ok, 0, wxALL, kInterSpacing); |
| |
| mainSizer->Add(&mNotebook); |
| mainSizer->Add(okCancelSizer, 0, wxALIGN_RIGHT); |
| |
| SetSizer(mainSizer); |
| |
| mainSizer->Fit(this); // shrink-to-fit |
| mainSizer->SetSizeHints(this); // define minimum size |
| } |
| |
| /* |
| * Transfer data from our members to the window controls. |
| */ |
| bool LogPrefsDialog::TransferDataToWindow(void) |
| { |
| /* |
| * Do standard dialog setup. |
| */ |
| wxRadioButton* fmtFull = (wxRadioButton*) FindWindow(IDC_LOG_PREFS_FMT_FULL); |
| wxRadioButton* fmtBrief = (wxRadioButton*) FindWindow(IDC_LOG_PREFS_FMT_BRIEF); |
| wxRadioButton* fmtMinimal = (wxRadioButton*) FindWindow(IDC_LOG_PREFS_FMT_MINIMAL); |
| wxCheckBox* singleLine = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_SINGLE_LINE); |
| wxComboBox* extraSpacing = (wxComboBox*) FindWindow(IDC_LOG_PREFS_EXTRA_SPACING); |
| wxComboBox* pointSize = (wxComboBox*) FindWindow(IDC_LOG_PREFS_POINT_SIZE); |
| wxCheckBox* useColor = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_USE_COLOR); |
| wxCheckBox* fontMono = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_FONT_MONO); |
| // - |
| wxTextCtrl* displayMax = (wxTextCtrl*) FindWindow(IDC_LOG_PREFS_DISPLAY_MAX); |
| wxTextCtrl* poolSize = (wxTextCtrl*) FindWindow(IDC_LOG_PREFS_POOL_SIZE); |
| // - |
| wxCheckBox* writeFile = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_WRITE_FILE); |
| wxTextCtrl* fileName = (wxTextCtrl*) FindWindow(IDC_LOG_PREFS_FILENAME); |
| wxCheckBox* truncateOld = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_TRUNCATE_OLD); |
| // - |
| |
| fmtFull->SetValue(mHeaderFormat == kHFFull); |
| fmtBrief->SetValue(mHeaderFormat == kHFBrief); |
| fmtMinimal->SetValue(mHeaderFormat == kHFMinimal); |
| singleLine->SetValue(mSingleLine); |
| if (mExtraSpacing < 0 || mExtraSpacing > NELEM(gSpacerChoices)) |
| mExtraSpacing = 0; |
| extraSpacing->SetSelection(mExtraSpacing); |
| |
| pointSize->SetSelection(0); |
| for (int i = 0; i < NELEM(gPointSizes); i++) { |
| if (atoi(gPointSizes[i].ToAscii()) == mPointSize) { |
| pointSize->SetSelection(i); |
| break; |
| } |
| } |
| useColor->SetValue(mUseColor); |
| fontMono->SetValue(mFontMonospace); |
| |
| wxString tmpStr; |
| tmpStr.Printf(wxT("%d"), mDisplayMax); |
| displayMax->SetValue(tmpStr); |
| tmpStr.Printf(wxT("%d"), mPoolSizeKB); |
| poolSize->SetValue(tmpStr); |
| |
| writeFile->SetValue(mWriteFile); |
| fileName->SetValue(mFileName); |
| truncateOld->SetValue(mTruncateOld); |
| |
| EnableFileControls(mWriteFile); |
| |
| return true; |
| } |
| |
| /* |
| * Convert a string to a number. The number is expected to be unsigned. |
| * Returns < 0 on failure. |
| */ |
| static long ConvertUnsigned(const wxString& str) |
| { |
| long val; |
| if (!str.ToLong(&val)) |
| return -1; |
| return val; |
| } |
| |
| /* |
| * Transfer and validate data from the window controls. |
| * |
| * This doesn't get called if the user cancels out of the dialog. |
| */ |
| bool LogPrefsDialog::TransferDataFromWindow(void) |
| { |
| /* |
| * Do standard dialog export. |
| */ |
| //wxRadioButton* fmtFull = (wxRadioButton*) FindWindow(IDC_LOG_PREFS_FMT_FULL); |
| wxRadioButton* fmtBrief = (wxRadioButton*) FindWindow(IDC_LOG_PREFS_FMT_BRIEF); |
| wxRadioButton* fmtMinimal = (wxRadioButton*) FindWindow(IDC_LOG_PREFS_FMT_MINIMAL); |
| wxCheckBox* singleLine = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_SINGLE_LINE); |
| wxComboBox* extraSpacing = (wxComboBox*) FindWindow(IDC_LOG_PREFS_EXTRA_SPACING); |
| wxComboBox* pointSize = (wxComboBox*) FindWindow(IDC_LOG_PREFS_POINT_SIZE); |
| wxCheckBox* useColor = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_USE_COLOR); |
| wxCheckBox* fontMono = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_FONT_MONO); |
| // - |
| wxTextCtrl* displayMax = (wxTextCtrl*) FindWindow(IDC_LOG_PREFS_DISPLAY_MAX); |
| wxTextCtrl* poolSize = (wxTextCtrl*) FindWindow(IDC_LOG_PREFS_POOL_SIZE); |
| // - |
| wxCheckBox* writeFile = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_WRITE_FILE); |
| wxTextCtrl* fileName = (wxTextCtrl*) FindWindow(IDC_LOG_PREFS_FILENAME); |
| wxCheckBox* truncateOld = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_TRUNCATE_OLD); |
| // - |
| |
| mHeaderFormat = kHFFull; |
| if (fmtBrief->GetValue()) |
| mHeaderFormat = kHFBrief; |
| else if (fmtMinimal->GetValue()) |
| mHeaderFormat = kHFMinimal; |
| |
| wxString tmpStr; |
| |
| mSingleLine = (singleLine->GetValue() != 0); |
| mExtraSpacing = extraSpacing->GetSelection(); |
| mPointSize = ConvertUnsigned(pointSize->GetValue()); |
| mUseColor = useColor->GetValue(); |
| mFontMonospace = fontMono->GetValue(); |
| |
| tmpStr = displayMax->GetValue(); |
| mDisplayMax = ConvertUnsigned(tmpStr); |
| if (mDisplayMax <= 0 || mDisplayMax > 1000 * 1000) { |
| wxMessageBox(wxT("Bad value for display max -- must be > 0 and <= 1,000,000"), |
| wxT("Hoser"), wxOK, this); |
| return false; |
| } |
| |
| tmpStr = poolSize->GetValue(); |
| mPoolSizeKB = ConvertUnsigned(tmpStr); |
| if (mDisplayMax <= 0 || mDisplayMax > 1048576) { |
| wxMessageBox(wxT("Bad value for pool size -- must be > 0 and <= 1048576"), |
| wxT("Hoser"), wxOK, this); |
| return false; |
| } |
| |
| mWriteFile = (writeFile->GetValue() != 0); |
| mFileName = fileName->GetValue(); |
| mTruncateOld = (truncateOld->GetValue() != 0); |
| if (mWriteFile && mFileName.IsEmpty()) { |
| wxMessageBox(wxT("Log filename may not be blank"), |
| wxT("Hoser"), wxOK, this); |
| return false; |
| } |
| |
| return true; |
| } |
| |
| |
| /* |
| * Create the log Format page. |
| */ |
| wxPanel* LogPrefsDialog::CreateFormatPage(wxBookCtrlBase* parent) |
| { |
| wxPanel* panel = new wxPanel(parent); |
| |
| wxStaticBoxSizer* headerOpts = new wxStaticBoxSizer(wxVERTICAL, panel, |
| wxT("Header")); |
| headerOpts->Add(new wxRadioButton(panel, IDC_LOG_PREFS_FMT_FULL, |
| wxT("Full header"), wxDefaultPosition, wxDefaultSize, |
| wxRB_GROUP)); |
| headerOpts->Add(new wxRadioButton(panel, IDC_LOG_PREFS_FMT_BRIEF, |
| wxT("Brief header"))); |
| headerOpts->Add(new wxRadioButton(panel, IDC_LOG_PREFS_FMT_MINIMAL, |
| wxT("Minimal, integrated header"))); |
| |
| wxCheckBox* singleLine = new wxCheckBox(panel, IDC_LOG_PREFS_SINGLE_LINE, |
| wxT("Put headers and message on same line")); |
| |
| wxStaticText* extraSpacingDescr = new wxStaticText(panel, wxID_STATIC, |
| wxT("Extra line spacing:")); |
| wxComboBox* extraSpacing = new wxComboBox(panel, |
| IDC_LOG_PREFS_EXTRA_SPACING, wxT("blah"), |
| wxDefaultPosition, wxDefaultSize, NELEM(gSpacerChoices), |
| gSpacerChoices, wxCB_READONLY); |
| wxBoxSizer* extraSpacingSizer = new wxBoxSizer(wxHORIZONTAL); |
| extraSpacingSizer->Add(extraSpacingDescr, 0, wxALIGN_CENTER_VERTICAL); |
| extraSpacingSizer->AddSpacer(kInterSpacing); |
| extraSpacingSizer->Add(extraSpacing); |
| |
| wxStaticBoxSizer* textOpts = new wxStaticBoxSizer(wxVERTICAL, panel, |
| wxT("Text")); |
| textOpts->Add( |
| new wxStaticText(panel, wxID_STATIC, wxT("Point size:")) ); |
| textOpts->AddSpacer(kInterSpacing); |
| textOpts->Add( |
| new wxComboBox(panel, |
| IDC_LOG_PREFS_POINT_SIZE, wxT("blah"), |
| wxDefaultPosition, wxDefaultSize, NELEM(gPointSizes), |
| gPointSizes, wxCB_READONLY) ); |
| textOpts->AddSpacer(kInterSpacing); |
| textOpts->Add( |
| new wxCheckBox(panel, IDC_LOG_PREFS_USE_COLOR, |
| wxT("Colorful messages")) ); |
| textOpts->AddSpacer(kInterSpacing); |
| textOpts->Add( |
| new wxCheckBox(panel, IDC_LOG_PREFS_FONT_MONO, |
| wxT("Use monospace font")) ); |
| |
| |
| wxBoxSizer* sizerPanel = new wxBoxSizer(wxVERTICAL); |
| sizerPanel->Add(kMinWidth, kEdgeSpacing); // forces minimum width |
| sizerPanel->Add(headerOpts); |
| sizerPanel->AddSpacer(kInterSpacing); |
| sizerPanel->Add(singleLine); |
| sizerPanel->AddSpacer(kInterSpacing); |
| sizerPanel->Add(extraSpacingSizer); |
| sizerPanel->AddSpacer(kInterSpacing); |
| sizerPanel->Add(textOpts); |
| sizerPanel->AddSpacer(kInterSpacing); |
| |
| wxBoxSizer* horizIndent = new wxBoxSizer(wxHORIZONTAL); |
| horizIndent->AddSpacer(kEdgeSpacing); |
| horizIndent->Add(sizerPanel); |
| horizIndent->AddSpacer(kEdgeSpacing); |
| panel->SetSizer(horizIndent); |
| |
| return panel; |
| } |
| |
| /* |
| * Create the log Limits page. |
| */ |
| wxPanel* LogPrefsDialog::CreateLimitsPage(wxBookCtrlBase* parent) |
| { |
| wxPanel* panel = new wxPanel(parent); |
| |
| wxBoxSizer* displayMaxSizer = new wxBoxSizer(wxHORIZONTAL); |
| displayMaxSizer->Add( |
| new wxStaticText(panel, wxID_ANY, |
| wxT("Maximum entries in log window:"), |
| wxDefaultPosition, wxDefaultSize, |
| wxALIGN_LEFT), |
| 0, wxALIGN_CENTER_VERTICAL); |
| displayMaxSizer->AddSpacer(kInterSpacing); |
| displayMaxSizer->Add( |
| new wxTextCtrl(panel, IDC_LOG_PREFS_DISPLAY_MAX)); |
| |
| wxBoxSizer* poolSizeSizer = new wxBoxSizer(wxHORIZONTAL); |
| poolSizeSizer->Add( |
| new wxStaticText(panel, wxID_ANY, |
| wxT("Size of the log pool (KB):"), |
| wxDefaultPosition, wxDefaultSize, |
| wxALIGN_LEFT), |
| 0, wxALIGN_CENTER_VERTICAL); |
| poolSizeSizer->AddSpacer(kInterSpacing); |
| poolSizeSizer->Add( |
| new wxTextCtrl(panel, IDC_LOG_PREFS_POOL_SIZE)); |
| |
| |
| wxBoxSizer* sizerPanel = new wxBoxSizer(wxVERTICAL); |
| sizerPanel->Add(kMinWidth, kEdgeSpacing); // forces minimum width |
| sizerPanel->Add(displayMaxSizer); |
| sizerPanel->AddSpacer(kInterSpacing); |
| sizerPanel->Add(poolSizeSizer); |
| sizerPanel->AddSpacer(kInterSpacing); |
| |
| wxBoxSizer* horizIndent = new wxBoxSizer(wxHORIZONTAL); |
| horizIndent->AddSpacer(kEdgeSpacing); |
| horizIndent->Add(sizerPanel); |
| horizIndent->AddSpacer(kEdgeSpacing); |
| panel->SetSizer(horizIndent); |
| |
| return panel; |
| } |
| |
| /* |
| * Create the log Files page. |
| */ |
| wxPanel* LogPrefsDialog::CreateFilesPage(wxBookCtrlBase* parent) |
| { |
| wxPanel* panel = new wxPanel(parent); |
| wxStaticBoxSizer* logOpts = new wxStaticBoxSizer(wxVERTICAL, panel, |
| wxT("Log File")); |
| |
| wxCheckBox* writeCopy = |
| new wxCheckBox(panel, IDC_LOG_PREFS_WRITE_FILE, |
| wxT("Write a copy of log output to a file")); |
| |
| logOpts->AddSpacer(kInterSpacing); |
| logOpts->Add( |
| new wxStaticText(panel, wxID_ANY, |
| wxT("Filename:"), |
| wxDefaultPosition, wxDefaultSize, |
| wxALIGN_LEFT)); |
| logOpts->AddSpacer(kInterSpacing); |
| logOpts->Add( |
| new wxTextCtrl(panel, IDC_LOG_PREFS_FILENAME), 0, wxEXPAND); |
| logOpts->AddSpacer(kInterSpacing); |
| logOpts->Add( |
| new wxCheckBox(panel, IDC_LOG_PREFS_TRUNCATE_OLD, |
| wxT("Truncate the file if more than 8 hours old ")) ); |
| |
| |
| wxBoxSizer* sizerPanel = new wxBoxSizer(wxVERTICAL); |
| sizerPanel->Add(kMinWidth, kEdgeSpacing); // forces minimum width |
| sizerPanel->Add(writeCopy); |
| sizerPanel->AddSpacer(kInterSpacing); |
| sizerPanel->Add(logOpts); |
| sizerPanel->AddSpacer(kInterSpacing); |
| |
| wxBoxSizer* horizIndent = new wxBoxSizer(wxHORIZONTAL); |
| horizIndent->AddSpacer(kEdgeSpacing); |
| horizIndent->Add(sizerPanel); |
| horizIndent->AddSpacer(kEdgeSpacing); |
| panel->SetSizer(horizIndent); |
| |
| return panel; |
| } |
| |
| |
| /* |
| * Handle clicks on the "write file" checkbox. |
| */ |
| void LogPrefsDialog::OnWriteFile(wxCommandEvent& event) |
| { |
| EnableFileControls(event.GetInt()); |
| } |
| |
| /* |
| * Enable or disable some of the controls on the "file" page. |
| */ |
| void LogPrefsDialog::EnableFileControls(bool enable) |
| { |
| FindWindow(IDC_LOG_PREFS_FILENAME)->Enable(enable); |
| FindWindow(IDC_LOG_PREFS_TRUNCATE_OLD)->Enable(enable); |
| } |
| |