CalcView::CalcView(BRect frame, rgb_color rgbBaseColor, BMessage* settings) : BView(frame, "DeskCalc", B_FOLLOW_ALL_SIDES, B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE | B_FRAME_EVENTS), fColumns(5), fRows(4), fBaseColor(rgbBaseColor), fExpressionBGColor((rgb_color){ 0, 0, 0, 255 }), fWidth(1), fHeight(1), fKeypadDescription(strdup(kKeypadDescriptionBasic)), fKeypad(NULL), #ifdef __HAIKU__ fCalcIcon(new BBitmap(BRect(0, 0, 15, 15), 0, B_RGBA32)), #else fCalcIcon(new BBitmap(BRect(0, 0, 15, 15), 0, B_CMAP8)), #endif fPopUpMenu(NULL), fAutoNumlockItem(NULL), fAudioFeedbackItem(NULL), fOptions(new CalcOptions()) { // create expression text view fExpressionTextView = new ExpressionTextView(_ExpressionRect(), this); AddChild(fExpressionTextView); // read data from archive _LoadSettings(settings); // tell the app server not to erase our b/g SetViewColor(B_TRANSPARENT_32_BIT); // parse calculator description _ParseCalcDesc(fKeypadDescription); // colorize based on base color. _Colorize(); // Fetch the calc icon for compact view _FetchAppIcon(fCalcIcon); }
void CalcView::SetKeypadMode(uint8 mode) { if (fOptions->keypad_mode == mode) return; BWindow* window = Window(); if (window == NULL) return; fOptions->keypad_mode = mode; _MarkKeypadItems(fOptions->keypad_mode); float width = fWidth; float height = fHeight; switch (fOptions->keypad_mode) { case KEYPAD_MODE_COMPACT: { if (window->Bounds() == Frame()) { window->SetSizeLimits(kMinimumWidthCompact, kMaximumWidthCompact, kMinimumHeightCompact, kMaximumHeightCompact); window->ResizeTo(width, height * kDisplayScaleY); } else ResizeTo(width, height * kDisplayScaleY); break; } case KEYPAD_MODE_SCIENTIFIC: { free(fKeypadDescription); fKeypadDescription = strdup(kKeypadDescriptionScientific); fRows = 8; _ParseCalcDesc(fKeypadDescription); window->SetSizeLimits(kMinimumWidthScientific, kMaximumWidthScientific, kMinimumHeightScientific, kMaximumHeightScientific); if (width < kMinimumWidthScientific) width = kMinimumWidthScientific; if (width > kMaximumWidthScientific) width = kMaximumWidthScientific; if (height < kMinimumHeightScientific) height = kMinimumHeightScientific; if (height > kMaximumHeightScientific) height = kMaximumHeightScientific; ResizeTo(width, height); break; } default: // KEYPAD_MODE_BASIC is the default { free(fKeypadDescription); fKeypadDescription = strdup(kKeypadDescriptionBasic); fRows = 4; _ParseCalcDesc(fKeypadDescription); window->SetSizeLimits(kMinimumWidthBasic, kMaximumWidthBasic, kMinimumHeightBasic, kMaximumHeightBasic); if (width < kMinimumWidthBasic) width = kMinimumWidthBasic; if (width > kMaximumWidthBasic) width = kMaximumWidthBasic; if (height < kMinimumHeightBasic) height = kMinimumHeightBasic; if (height > kMaximumHeightBasic) height = kMaximumHeightBasic; ResizeTo(width, height); } } }
status_t CalcView::_LoadSettings(BMessage* archive) { if (!archive) return B_BAD_VALUE; // record calculator description const char* calcDesc; if (archive->FindString("calcDesc", &calcDesc) < B_OK) calcDesc = kKeypadDescriptionBasic; // save calculator description for reference free(fKeypadDescription); fKeypadDescription = strdup(calcDesc); // read grid dimensions if (archive->FindInt16("cols", &fColumns) < B_OK) fColumns = 5; if (archive->FindInt16("rows", &fRows) < B_OK) fRows = 4; // read color scheme const rgb_color* color; ssize_t size; if (archive->FindData("rgbBaseColor", B_RGB_COLOR_TYPE, (const void**)&color, &size) < B_OK || size != sizeof(rgb_color)) { fBaseColor = ui_color(B_PANEL_BACKGROUND_COLOR); puts("Missing rgbBaseColor from CalcView archive!\n"); } else { fBaseColor = *color; } if (archive->FindData("rgbDisplay", B_RGB_COLOR_TYPE, (const void**)&color, &size) < B_OK || size != sizeof(rgb_color)) { fExpressionBGColor = (rgb_color){ 0, 0, 0, 255 }; puts("Missing rgbBaseColor from CalcView archive!\n"); } else { fExpressionBGColor = *color; } // load options fOptions->LoadSettings(archive); // load display text const char* display; if (archive->FindString("displayText", &display) < B_OK) { puts("Missing expression text from CalcView archive.\n"); } else { // init expression text fExpressionTextView->SetText(display); } // load expression history fExpressionTextView->LoadSettings(archive); // parse calculator description _ParseCalcDesc(fKeypadDescription); // colorize based on base color. _Colorize(); return B_OK; }