405 lines
13 KiB
C++
405 lines
13 KiB
C++
//
|
|
// 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);
|
|
}
|
|
|