//
// 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);
}