1 // 2 // Copyright 2005 The Android Open Source Project 3 // 4 // Log 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 "LogPrefsDialog.h" 15 #include "Preferences.h" 16 #include "Resource.h" 17 #include "utils.h" 18 19 BEGIN_EVENT_TABLE(LogPrefsDialog, wxDialog) 20 EVT_CHECKBOX(IDC_LOG_PREFS_WRITE_FILE, LogPrefsDialog::OnWriteFile) 21 END_EVENT_TABLE() 22 23 static const wxString gSpacerChoices[] = { 24 wxT("0"), wxT("1"), wxT("2") 25 }; 26 static const wxString gPointSizes[] = { 27 wxT("4"), wxT("6"), wxT("8"), wxT("10"), wxT("12"), wxT("14"), wxT("16") 28 }; 29 30 31 /* 32 * Constructor. 33 */ 34 LogPrefsDialog::LogPrefsDialog(wxWindow* parent) 35 : wxDialog(parent, IDD_LOG_PREFS, wxT("Log Preferences"), wxDefaultPosition, 36 wxDefaultSize, wxDEFAULT_DIALOG_STYLE), 37 mHeaderFormat(kHFFull), mSingleLine(false), mExtraSpacing(0), 38 mUseColor(false), mFontMonospace(false), mDisplayMax(0), mPoolSizeKB(0) 39 { 40 CreateControls(); 41 } 42 43 44 /* 45 * Destructor. Not much to do. 46 */ 47 LogPrefsDialog::~LogPrefsDialog(void) 48 { 49 } 50 51 /* 52 * Create all of the pages and add them to the notebook. 53 */ 54 void LogPrefsDialog::CreateControls(void) 55 { 56 wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL); 57 wxBoxSizer* okCancelSizer = new wxBoxSizer(wxHORIZONTAL); 58 mNotebook.Create(this, wxID_ANY); 59 wxPanel* page; 60 61 page = CreateFormatPage(&mNotebook); 62 mNotebook.AddPage(page, wxT("Format"), true); 63 page = CreateLimitsPage(&mNotebook); 64 mNotebook.AddPage(page, wxT("Limits"), false); 65 page = CreateFilesPage(&mNotebook); 66 mNotebook.AddPage(page, wxT("Files"), false); 67 68 // note to self: could use CreateButtonSizer here? 69 wxButton* cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel"), 70 wxDefaultPosition, wxDefaultSize, 0); 71 okCancelSizer->Add(cancel, 0, wxALL, kInterSpacing); 72 73 wxButton* ok = new wxButton(this, wxID_OK, wxT("&OK"), 74 wxDefaultPosition, wxDefaultSize, 0); 75 okCancelSizer->Add(ok, 0, wxALL, kInterSpacing); 76 77 mainSizer->Add(&mNotebook); 78 mainSizer->Add(okCancelSizer, 0, wxALIGN_RIGHT); 79 80 SetSizer(mainSizer); 81 82 mainSizer->Fit(this); // shrink-to-fit 83 mainSizer->SetSizeHints(this); // define minimum size 84 } 85 86 /* 87 * Transfer data from our members to the window controls. 88 */ 89 bool LogPrefsDialog::TransferDataToWindow(void) 90 { 91 /* 92 * Do standard dialog setup. 93 */ 94 wxRadioButton* fmtFull = (wxRadioButton*) FindWindow(IDC_LOG_PREFS_FMT_FULL); 95 wxRadioButton* fmtBrief = (wxRadioButton*) FindWindow(IDC_LOG_PREFS_FMT_BRIEF); 96 wxRadioButton* fmtMinimal = (wxRadioButton*) FindWindow(IDC_LOG_PREFS_FMT_MINIMAL); 97 wxCheckBox* singleLine = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_SINGLE_LINE); 98 wxComboBox* extraSpacing = (wxComboBox*) FindWindow(IDC_LOG_PREFS_EXTRA_SPACING); 99 wxComboBox* pointSize = (wxComboBox*) FindWindow(IDC_LOG_PREFS_POINT_SIZE); 100 wxCheckBox* useColor = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_USE_COLOR); 101 wxCheckBox* fontMono = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_FONT_MONO); 102 // - 103 wxTextCtrl* displayMax = (wxTextCtrl*) FindWindow(IDC_LOG_PREFS_DISPLAY_MAX); 104 wxTextCtrl* poolSize = (wxTextCtrl*) FindWindow(IDC_LOG_PREFS_POOL_SIZE); 105 // - 106 wxCheckBox* writeFile = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_WRITE_FILE); 107 wxTextCtrl* fileName = (wxTextCtrl*) FindWindow(IDC_LOG_PREFS_FILENAME); 108 wxCheckBox* truncateOld = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_TRUNCATE_OLD); 109 // - 110 111 fmtFull->SetValue(mHeaderFormat == kHFFull); 112 fmtBrief->SetValue(mHeaderFormat == kHFBrief); 113 fmtMinimal->SetValue(mHeaderFormat == kHFMinimal); 114 singleLine->SetValue(mSingleLine); 115 if (mExtraSpacing < 0 || mExtraSpacing > NELEM(gSpacerChoices)) 116 mExtraSpacing = 0; 117 extraSpacing->SetSelection(mExtraSpacing); 118 119 pointSize->SetSelection(0); 120 for (int i = 0; i < NELEM(gPointSizes); i++) { 121 if (atoi(gPointSizes[i].ToAscii()) == mPointSize) { 122 pointSize->SetSelection(i); 123 break; 124 } 125 } 126 useColor->SetValue(mUseColor); 127 fontMono->SetValue(mFontMonospace); 128 129 wxString tmpStr; 130 tmpStr.Printf(wxT("%d"), mDisplayMax); 131 displayMax->SetValue(tmpStr); 132 tmpStr.Printf(wxT("%d"), mPoolSizeKB); 133 poolSize->SetValue(tmpStr); 134 135 writeFile->SetValue(mWriteFile); 136 fileName->SetValue(mFileName); 137 truncateOld->SetValue(mTruncateOld); 138 139 EnableFileControls(mWriteFile); 140 141 return true; 142 } 143 144 /* 145 * Convert a string to a number. The number is expected to be unsigned. 146 * Returns < 0 on failure. 147 */ 148 static long ConvertUnsigned(const wxString& str) 149 { 150 long val; 151 if (!str.ToLong(&val)) 152 return -1; 153 return val; 154 } 155 156 /* 157 * Transfer and validate data from the window controls. 158 * 159 * This doesn't get called if the user cancels out of the dialog. 160 */ 161 bool LogPrefsDialog::TransferDataFromWindow(void) 162 { 163 /* 164 * Do standard dialog export. 165 */ 166 //wxRadioButton* fmtFull = (wxRadioButton*) FindWindow(IDC_LOG_PREFS_FMT_FULL); 167 wxRadioButton* fmtBrief = (wxRadioButton*) FindWindow(IDC_LOG_PREFS_FMT_BRIEF); 168 wxRadioButton* fmtMinimal = (wxRadioButton*) FindWindow(IDC_LOG_PREFS_FMT_MINIMAL); 169 wxCheckBox* singleLine = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_SINGLE_LINE); 170 wxComboBox* extraSpacing = (wxComboBox*) FindWindow(IDC_LOG_PREFS_EXTRA_SPACING); 171 wxComboBox* pointSize = (wxComboBox*) FindWindow(IDC_LOG_PREFS_POINT_SIZE); 172 wxCheckBox* useColor = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_USE_COLOR); 173 wxCheckBox* fontMono = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_FONT_MONO); 174 // - 175 wxTextCtrl* displayMax = (wxTextCtrl*) FindWindow(IDC_LOG_PREFS_DISPLAY_MAX); 176 wxTextCtrl* poolSize = (wxTextCtrl*) FindWindow(IDC_LOG_PREFS_POOL_SIZE); 177 // - 178 wxCheckBox* writeFile = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_WRITE_FILE); 179 wxTextCtrl* fileName = (wxTextCtrl*) FindWindow(IDC_LOG_PREFS_FILENAME); 180 wxCheckBox* truncateOld = (wxCheckBox*) FindWindow(IDC_LOG_PREFS_TRUNCATE_OLD); 181 // - 182 183 mHeaderFormat = kHFFull; 184 if (fmtBrief->GetValue()) 185 mHeaderFormat = kHFBrief; 186 else if (fmtMinimal->GetValue()) 187 mHeaderFormat = kHFMinimal; 188 189 wxString tmpStr; 190 191 mSingleLine = (singleLine->GetValue() != 0); 192 mExtraSpacing = extraSpacing->GetSelection(); 193 mPointSize = ConvertUnsigned(pointSize->GetValue()); 194 mUseColor = useColor->GetValue(); 195 mFontMonospace = fontMono->GetValue(); 196 197 tmpStr = displayMax->GetValue(); 198 mDisplayMax = ConvertUnsigned(tmpStr); 199 if (mDisplayMax <= 0 || mDisplayMax > 1000 * 1000) { 200 wxMessageBox(wxT("Bad value for display max -- must be > 0 and <= 1,000,000"), 201 wxT("Hoser"), wxOK, this); 202 return false; 203 } 204 205 tmpStr = poolSize->GetValue(); 206 mPoolSizeKB = ConvertUnsigned(tmpStr); 207 if (mDisplayMax <= 0 || mDisplayMax > 1048576) { 208 wxMessageBox(wxT("Bad value for pool size -- must be > 0 and <= 1048576"), 209 wxT("Hoser"), wxOK, this); 210 return false; 211 } 212 213 mWriteFile = (writeFile->GetValue() != 0); 214 mFileName = fileName->GetValue(); 215 mTruncateOld = (truncateOld->GetValue() != 0); 216 if (mWriteFile && mFileName.IsEmpty()) { 217 wxMessageBox(wxT("Log filename may not be blank"), 218 wxT("Hoser"), wxOK, this); 219 return false; 220 } 221 222 return true; 223 } 224 225 226 /* 227 * Create the log Format page. 228 */ 229 wxPanel* LogPrefsDialog::CreateFormatPage(wxBookCtrlBase* parent) 230 { 231 wxPanel* panel = new wxPanel(parent); 232 233 wxStaticBoxSizer* headerOpts = new wxStaticBoxSizer(wxVERTICAL, panel, 234 wxT("Header")); 235 headerOpts->Add(new wxRadioButton(panel, IDC_LOG_PREFS_FMT_FULL, 236 wxT("Full header"), wxDefaultPosition, wxDefaultSize, 237 wxRB_GROUP)); 238 headerOpts->Add(new wxRadioButton(panel, IDC_LOG_PREFS_FMT_BRIEF, 239 wxT("Brief header"))); 240 headerOpts->Add(new wxRadioButton(panel, IDC_LOG_PREFS_FMT_MINIMAL, 241 wxT("Minimal, integrated header"))); 242 243 wxCheckBox* singleLine = new wxCheckBox(panel, IDC_LOG_PREFS_SINGLE_LINE, 244 wxT("Put headers and message on same line")); 245 246 wxStaticText* extraSpacingDescr = new wxStaticText(panel, wxID_STATIC, 247 wxT("Extra line spacing:")); 248 wxComboBox* extraSpacing = new wxComboBox(panel, 249 IDC_LOG_PREFS_EXTRA_SPACING, wxT("blah"), 250 wxDefaultPosition, wxDefaultSize, NELEM(gSpacerChoices), 251 gSpacerChoices, wxCB_READONLY); 252 wxBoxSizer* extraSpacingSizer = new wxBoxSizer(wxHORIZONTAL); 253 extraSpacingSizer->Add(extraSpacingDescr, 0, wxALIGN_CENTER_VERTICAL); 254 extraSpacingSizer->AddSpacer(kInterSpacing); 255 extraSpacingSizer->Add(extraSpacing); 256 257 wxStaticBoxSizer* textOpts = new wxStaticBoxSizer(wxVERTICAL, panel, 258 wxT("Text")); 259 textOpts->Add( 260 new wxStaticText(panel, wxID_STATIC, wxT("Point size:")) ); 261 textOpts->AddSpacer(kInterSpacing); 262 textOpts->Add( 263 new wxComboBox(panel, 264 IDC_LOG_PREFS_POINT_SIZE, wxT("blah"), 265 wxDefaultPosition, wxDefaultSize, NELEM(gPointSizes), 266 gPointSizes, wxCB_READONLY) ); 267 textOpts->AddSpacer(kInterSpacing); 268 textOpts->Add( 269 new wxCheckBox(panel, IDC_LOG_PREFS_USE_COLOR, 270 wxT("Colorful messages")) ); 271 textOpts->AddSpacer(kInterSpacing); 272 textOpts->Add( 273 new wxCheckBox(panel, IDC_LOG_PREFS_FONT_MONO, 274 wxT("Use monospace font")) ); 275 276 277 wxBoxSizer* sizerPanel = new wxBoxSizer(wxVERTICAL); 278 sizerPanel->Add(kMinWidth, kEdgeSpacing); // forces minimum width 279 sizerPanel->Add(headerOpts); 280 sizerPanel->AddSpacer(kInterSpacing); 281 sizerPanel->Add(singleLine); 282 sizerPanel->AddSpacer(kInterSpacing); 283 sizerPanel->Add(extraSpacingSizer); 284 sizerPanel->AddSpacer(kInterSpacing); 285 sizerPanel->Add(textOpts); 286 sizerPanel->AddSpacer(kInterSpacing); 287 288 wxBoxSizer* horizIndent = new wxBoxSizer(wxHORIZONTAL); 289 horizIndent->AddSpacer(kEdgeSpacing); 290 horizIndent->Add(sizerPanel); 291 horizIndent->AddSpacer(kEdgeSpacing); 292 panel->SetSizer(horizIndent); 293 294 return panel; 295 } 296 297 /* 298 * Create the log Limits page. 299 */ 300 wxPanel* LogPrefsDialog::CreateLimitsPage(wxBookCtrlBase* parent) 301 { 302 wxPanel* panel = new wxPanel(parent); 303 304 wxBoxSizer* displayMaxSizer = new wxBoxSizer(wxHORIZONTAL); 305 displayMaxSizer->Add( 306 new wxStaticText(panel, wxID_ANY, 307 wxT("Maximum entries in log window:"), 308 wxDefaultPosition, wxDefaultSize, 309 wxALIGN_LEFT), 310 0, wxALIGN_CENTER_VERTICAL); 311 displayMaxSizer->AddSpacer(kInterSpacing); 312 displayMaxSizer->Add( 313 new wxTextCtrl(panel, IDC_LOG_PREFS_DISPLAY_MAX)); 314 315 wxBoxSizer* poolSizeSizer = new wxBoxSizer(wxHORIZONTAL); 316 poolSizeSizer->Add( 317 new wxStaticText(panel, wxID_ANY, 318 wxT("Size of the log pool (KB):"), 319 wxDefaultPosition, wxDefaultSize, 320 wxALIGN_LEFT), 321 0, wxALIGN_CENTER_VERTICAL); 322 poolSizeSizer->AddSpacer(kInterSpacing); 323 poolSizeSizer->Add( 324 new wxTextCtrl(panel, IDC_LOG_PREFS_POOL_SIZE)); 325 326 327 wxBoxSizer* sizerPanel = new wxBoxSizer(wxVERTICAL); 328 sizerPanel->Add(kMinWidth, kEdgeSpacing); // forces minimum width 329 sizerPanel->Add(displayMaxSizer); 330 sizerPanel->AddSpacer(kInterSpacing); 331 sizerPanel->Add(poolSizeSizer); 332 sizerPanel->AddSpacer(kInterSpacing); 333 334 wxBoxSizer* horizIndent = new wxBoxSizer(wxHORIZONTAL); 335 horizIndent->AddSpacer(kEdgeSpacing); 336 horizIndent->Add(sizerPanel); 337 horizIndent->AddSpacer(kEdgeSpacing); 338 panel->SetSizer(horizIndent); 339 340 return panel; 341 } 342 343 /* 344 * Create the log Files page. 345 */ 346 wxPanel* LogPrefsDialog::CreateFilesPage(wxBookCtrlBase* parent) 347 { 348 wxPanel* panel = new wxPanel(parent); 349 wxStaticBoxSizer* logOpts = new wxStaticBoxSizer(wxVERTICAL, panel, 350 wxT("Log File")); 351 352 wxCheckBox* writeCopy = 353 new wxCheckBox(panel, IDC_LOG_PREFS_WRITE_FILE, 354 wxT("Write a copy of log output to a file")); 355 356 logOpts->AddSpacer(kInterSpacing); 357 logOpts->Add( 358 new wxStaticText(panel, wxID_ANY, 359 wxT("Filename:"), 360 wxDefaultPosition, wxDefaultSize, 361 wxALIGN_LEFT)); 362 logOpts->AddSpacer(kInterSpacing); 363 logOpts->Add( 364 new wxTextCtrl(panel, IDC_LOG_PREFS_FILENAME), 0, wxEXPAND); 365 logOpts->AddSpacer(kInterSpacing); 366 logOpts->Add( 367 new wxCheckBox(panel, IDC_LOG_PREFS_TRUNCATE_OLD, 368 wxT("Truncate the file if more than 8 hours old ")) ); 369 370 371 wxBoxSizer* sizerPanel = new wxBoxSizer(wxVERTICAL); 372 sizerPanel->Add(kMinWidth, kEdgeSpacing); // forces minimum width 373 sizerPanel->Add(writeCopy); 374 sizerPanel->AddSpacer(kInterSpacing); 375 sizerPanel->Add(logOpts); 376 sizerPanel->AddSpacer(kInterSpacing); 377 378 wxBoxSizer* horizIndent = new wxBoxSizer(wxHORIZONTAL); 379 horizIndent->AddSpacer(kEdgeSpacing); 380 horizIndent->Add(sizerPanel); 381 horizIndent->AddSpacer(kEdgeSpacing); 382 panel->SetSizer(horizIndent); 383 384 return panel; 385 } 386 387 388 /* 389 * Handle clicks on the "write file" checkbox. 390 */ 391 void LogPrefsDialog::OnWriteFile(wxCommandEvent& event) 392 { 393 EnableFileControls(event.GetInt()); 394 } 395 396 /* 397 * Enable or disable some of the controls on the "file" page. 398 */ 399 void LogPrefsDialog::EnableFileControls(bool enable) 400 { 401 FindWindow(IDC_LOG_PREFS_FILENAME)->Enable(enable); 402 FindWindow(IDC_LOG_PREFS_TRUNCATE_OLD)->Enable(enable); 403 } 404 405