19ed32a43SStephan Aßmus /*
2f515b1c0SJohn Scipione * Copyright 2001-2022 Haiku, Inc. All rights reserved.
39ed32a43SStephan Aßmus * Distributed under the terms of the MIT License.
49ed32a43SStephan Aßmus *
59ed32a43SStephan Aßmus * Authors:
69ed32a43SStephan Aßmus * Mark Hogben
79ed32a43SStephan Aßmus * DarkWyrm <bpmagic@columbus.rr.com>
89ed32a43SStephan Aßmus * Axel Dörfler, axeld@pinc-software.de
99ed32a43SStephan Aßmus * Philippe Saint-Pierre, stpere@gmail.com
109ed32a43SStephan Aßmus * Stephan Aßmus <superstippi@gmx.de>
11f515b1c0SJohn Scipione * John Scipione, jscipione@gmail.com
129ed32a43SStephan Aßmus */
139ed32a43SStephan Aßmus
1480e5b062SJohn Scipione
159ed32a43SStephan Aßmus #include "FontSelectionView.h"
169ed32a43SStephan Aßmus
179ed32a43SStephan Aßmus #include <Box.h>
189ed32a43SStephan Aßmus #include <Catalog.h>
19*86da0385SAugustin Cavalier #include <ControlLook.h>
2006b10d86SAugustin Cavalier #include <GroupLayoutBuilder.h>
2106b10d86SAugustin Cavalier #include <LayoutItem.h>
229ed32a43SStephan Aßmus #include <Locale.h>
239ed32a43SStephan Aßmus #include <MenuField.h>
249ed32a43SStephan Aßmus #include <MenuItem.h>
259ed32a43SStephan Aßmus #include <PopUpMenu.h>
269ed32a43SStephan Aßmus #include <String.h>
27f515b1c0SJohn Scipione #include <TextView.h>
282d0c3dd6SMikael Konradsson #include <Spinner.h>
2906b10d86SAugustin Cavalier
3006b10d86SAugustin Cavalier #include <FontPrivate.h>
319ed32a43SStephan Aßmus
329ed32a43SStephan Aßmus #include <stdio.h>
339ed32a43SStephan Aßmus
349ed32a43SStephan Aßmus
35546208a5SOliver Tappe #undef B_TRANSLATION_CONTEXT
36546208a5SOliver Tappe #define B_TRANSLATION_CONTEXT "Font Selection view"
379ed32a43SStephan Aßmus
389ed32a43SStephan Aßmus
399ed32a43SStephan Aßmus #define INSTANT_UPDATE
409ed32a43SStephan Aßmus // if defined, the system font will be updated immediately, and not
419ed32a43SStephan Aßmus // only on exit
429ed32a43SStephan Aßmus
439ed32a43SStephan Aßmus static const float kMinSize = 8.0;
442d0c3dd6SMikael Konradsson static const float kMaxSize = 72.0;
452d0c3dd6SMikael Konradsson
462d0c3dd6SMikael Konradsson static const char* kPreviewText = B_TRANSLATE_COMMENT(
472d0c3dd6SMikael Konradsson "The quick brown fox jumps over the lazy dog.",
482d0c3dd6SMikael Konradsson "Don't translate this literally ! Use a phrase showing all chars "
492d0c3dd6SMikael Konradsson "from A to Z.");
509ed32a43SStephan Aßmus
519ed32a43SStephan Aßmus
529ed32a43SStephan Aßmus // private font API
539ed32a43SStephan Aßmus extern void _set_system_font_(const char *which, font_family family,
549ed32a43SStephan Aßmus font_style style, float size);
559ed32a43SStephan Aßmus extern status_t _get_system_default_font_(const char* which,
569ed32a43SStephan Aßmus font_family family, font_style style, float* _size);
579ed32a43SStephan Aßmus
589ed32a43SStephan Aßmus
599ed32a43SStephan Aßmus #ifdef B_BEOS_VERSION_DANO
609ed32a43SStephan Aßmus // this call only exists under R5
619ed32a43SStephan Aßmus void
_set_system_font_(const char * which,font_family family,font_style style,float size)629ed32a43SStephan Aßmus _set_system_font_(const char *which, font_family family,
639ed32a43SStephan Aßmus font_style style, float size)
649ed32a43SStephan Aßmus {
659ed32a43SStephan Aßmus puts("you don't have _set_system_font_()");
669ed32a43SStephan Aßmus }
679ed32a43SStephan Aßmus #endif
689ed32a43SStephan Aßmus
699ed32a43SStephan Aßmus #if !defined(HAIKU_TARGET_PLATFORM_HAIKU) && !defined(HAIKU_TARGET_PLATFORM_LIBBE_TEST)
709ed32a43SStephan Aßmus // this call only exists under Haiku (and the test environment)
719ed32a43SStephan Aßmus status_t
_get_system_default_font_(const char * which,font_family family,font_style style,float * _size)729ed32a43SStephan Aßmus _get_system_default_font_(const char* which, font_family family,
739ed32a43SStephan Aßmus font_style style, float* _size)
749ed32a43SStephan Aßmus {
759ed32a43SStephan Aßmus puts("you don't have _get_system_default_font_()");
769ed32a43SStephan Aßmus return B_ERROR;
779ed32a43SStephan Aßmus }
789ed32a43SStephan Aßmus #endif
799ed32a43SStephan Aßmus
809ed32a43SStephan Aßmus
819ed32a43SStephan Aßmus // #pragma mark -
829ed32a43SStephan Aßmus
839ed32a43SStephan Aßmus
FontSelectionView(const char * name,const char * label,const BFont * currentFont)849ed32a43SStephan Aßmus FontSelectionView::FontSelectionView(const char* name,
859ed32a43SStephan Aßmus const char* label, const BFont* currentFont)
869ed32a43SStephan Aßmus :
879ed32a43SStephan Aßmus BView(name, B_WILL_DRAW),
889ed32a43SStephan Aßmus fMessageTarget(this)
899ed32a43SStephan Aßmus {
909ed32a43SStephan Aßmus if (currentFont == NULL) {
919ed32a43SStephan Aßmus if (!strcmp(Name(), "plain"))
929ed32a43SStephan Aßmus fCurrentFont = *be_plain_font;
939ed32a43SStephan Aßmus else if (!strcmp(Name(), "bold"))
949ed32a43SStephan Aßmus fCurrentFont = *be_bold_font;
959ed32a43SStephan Aßmus else if (!strcmp(Name(), "fixed"))
969ed32a43SStephan Aßmus fCurrentFont = *be_fixed_font;
979ed32a43SStephan Aßmus else if (!strcmp(Name(), "menu")) {
989ed32a43SStephan Aßmus menu_info info;
999ed32a43SStephan Aßmus get_menu_info(&info);
1009ed32a43SStephan Aßmus
1019ed32a43SStephan Aßmus fCurrentFont.SetFamilyAndStyle(info.f_family, info.f_style);
1029ed32a43SStephan Aßmus fCurrentFont.SetSize(info.font_size);
1039ed32a43SStephan Aßmus }
1049ed32a43SStephan Aßmus } else
1059ed32a43SStephan Aßmus fCurrentFont = *currentFont;
1069ed32a43SStephan Aßmus
1079ed32a43SStephan Aßmus fSavedFont = fCurrentFont;
1089ed32a43SStephan Aßmus
1099ed32a43SStephan Aßmus fFontsMenu = new BPopUpMenu("font menu");
1109ed32a43SStephan Aßmus
1119ed32a43SStephan Aßmus // font menu
1129ed32a43SStephan Aßmus fFontsMenuField = new BMenuField("fonts", label, fFontsMenu);
1139ed32a43SStephan Aßmus fFontsMenuField->SetAlignment(B_ALIGN_RIGHT);
1149ed32a43SStephan Aßmus
1152d0c3dd6SMikael Konradsson // font size
1162d0c3dd6SMikael Konradsson BMessage* fontSizeMessage = new BMessage(kMsgSetSize);
1172d0c3dd6SMikael Konradsson fontSizeMessage->AddString("name", Name());
1182d0c3dd6SMikael Konradsson
1192d0c3dd6SMikael Konradsson fFontSizeSpinner = new BSpinner("font size", B_TRANSLATE("Size:"),
1202d0c3dd6SMikael Konradsson fontSizeMessage);
1212d0c3dd6SMikael Konradsson
1222d0c3dd6SMikael Konradsson fFontSizeSpinner->SetRange(kMinSize, kMaxSize);
123f515b1c0SJohn Scipione fFontSizeSpinner->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED,
124f515b1c0SJohn Scipione B_SIZE_UNSET));
1259ed32a43SStephan Aßmus
1269ed32a43SStephan Aßmus // preview
127f515b1c0SJohn Scipione // A string view would be enough if only it handled word-wrap.
128f515b1c0SJohn Scipione fPreviewTextView = new BTextView("preview text");
129f515b1c0SJohn Scipione fPreviewTextView->SetFontAndColor(&fCurrentFont);
130f515b1c0SJohn Scipione fPreviewTextView->SetText(kPreviewText);
131f515b1c0SJohn Scipione fPreviewTextView->MakeResizable(false);
132f515b1c0SJohn Scipione fPreviewTextView->SetWordWrap(true);
133f515b1c0SJohn Scipione fPreviewTextView->MakeEditable(false);
134f515b1c0SJohn Scipione fPreviewTextView->MakeSelectable(false);
135f515b1c0SJohn Scipione fPreviewTextView->SetInsets(0, 0, 0, 0);
136*86da0385SAugustin Cavalier fPreviewTextView->SetViewUIColor(ViewUIColor());
137*86da0385SAugustin Cavalier fPreviewTextView->SetLowUIColor(LowUIColor());
138*86da0385SAugustin Cavalier fPreviewTextView->SetHighUIColor(HighUIColor());
1399ed32a43SStephan Aßmus
140f515b1c0SJohn Scipione // determine initial line count using fCurrentFont
141*86da0385SAugustin Cavalier fPreviewTextWidth = be_control_look->DefaultLabelSpacing() * 58.0f;
142f515b1c0SJohn Scipione float lineCount = ceilf(fCurrentFont.StringWidth(kPreviewText)
143*86da0385SAugustin Cavalier / fPreviewTextWidth);
144*86da0385SAugustin Cavalier fPreviewTextView->SetExplicitSize(BSize(fPreviewTextWidth,
145f515b1c0SJohn Scipione fPreviewTextView->LineHeight(0) * lineCount));
1469ed32a43SStephan Aßmus
1479ed32a43SStephan Aßmus // box around preview
1489ed32a43SStephan Aßmus fPreviewBox = new BBox("preview box", B_WILL_DRAW | B_FRAME_EVENTS);
149f515b1c0SJohn Scipione fPreviewBox->AddChild(BGroupLayoutBuilder(B_VERTICAL)
150f515b1c0SJohn Scipione .AddGroup(B_HORIZONTAL, 0)
1512d0c3dd6SMikael Konradsson .Add(fPreviewTextView)
152f515b1c0SJohn Scipione .AddGlue()
153f515b1c0SJohn Scipione .End()
154e473d011SJohn Scipione .SetInsets(B_USE_SMALL_SPACING, B_USE_SMALL_SPACING,
155e473d011SJohn Scipione B_USE_SMALL_SPACING, B_USE_SMALL_SPACING)
1569ed32a43SStephan Aßmus .TopView()
1579ed32a43SStephan Aßmus );
1582d0c3dd6SMikael Konradsson
1592d0c3dd6SMikael Konradsson _SelectCurrentSize();
1609ed32a43SStephan Aßmus }
1619ed32a43SStephan Aßmus
1629ed32a43SStephan Aßmus
~FontSelectionView()1639ed32a43SStephan Aßmus FontSelectionView::~FontSelectionView()
1649ed32a43SStephan Aßmus {
1659ed32a43SStephan Aßmus #ifndef INSTANT_UPDATE
1669ed32a43SStephan Aßmus _UpdateSystemFont();
1679ed32a43SStephan Aßmus #endif
1689ed32a43SStephan Aßmus }
1699ed32a43SStephan Aßmus
1709ed32a43SStephan Aßmus
1719ed32a43SStephan Aßmus void
SetTarget(BHandler * messageTarget)1729ed32a43SStephan Aßmus FontSelectionView::SetTarget(BHandler* messageTarget)
1739ed32a43SStephan Aßmus {
1749ed32a43SStephan Aßmus fMessageTarget = messageTarget;
1752d0c3dd6SMikael Konradsson fFontSizeSpinner->SetTarget(messageTarget);
1769ed32a43SStephan Aßmus }
1779ed32a43SStephan Aßmus
1789ed32a43SStephan Aßmus
1799ed32a43SStephan Aßmus void
MessageReceived(BMessage * msg)1809ed32a43SStephan Aßmus FontSelectionView::MessageReceived(BMessage* msg)
1819ed32a43SStephan Aßmus {
1829ed32a43SStephan Aßmus switch (msg->what) {
1839ed32a43SStephan Aßmus case kMsgSetSize:
1849ed32a43SStephan Aßmus {
1852d0c3dd6SMikael Konradsson int32 size = fFontSizeSpinner->Value();
1862d0c3dd6SMikael Konradsson if (size == fCurrentFont.Size())
1879ed32a43SStephan Aßmus break;
1889ed32a43SStephan Aßmus
1899ed32a43SStephan Aßmus fCurrentFont.SetSize(size);
1909ed32a43SStephan Aßmus _UpdateFontPreview();
1919ed32a43SStephan Aßmus break;
1929ed32a43SStephan Aßmus }
1939ed32a43SStephan Aßmus
1949ed32a43SStephan Aßmus case kMsgSetFamily:
1959ed32a43SStephan Aßmus {
1969ed32a43SStephan Aßmus const char* family;
1979ed32a43SStephan Aßmus if (msg->FindString("family", &family) != B_OK)
1989ed32a43SStephan Aßmus break;
1999ed32a43SStephan Aßmus
2009ed32a43SStephan Aßmus font_style style;
2019ed32a43SStephan Aßmus fCurrentFont.GetFamilyAndStyle(NULL, &style);
2029ed32a43SStephan Aßmus
2039ed32a43SStephan Aßmus BMenuItem* familyItem = fFontsMenu->FindItem(family);
2049ed32a43SStephan Aßmus if (familyItem != NULL) {
2059ed32a43SStephan Aßmus _SelectCurrentFont(false);
2069ed32a43SStephan Aßmus
2079ed32a43SStephan Aßmus BMenuItem* item = familyItem->Submenu()->FindItem(style);
2089ed32a43SStephan Aßmus if (item == NULL)
2099ed32a43SStephan Aßmus item = familyItem->Submenu()->ItemAt(0);
2109ed32a43SStephan Aßmus
2119ed32a43SStephan Aßmus if (item != NULL) {
2129ed32a43SStephan Aßmus item->SetMarked(true);
2139ed32a43SStephan Aßmus fCurrentFont.SetFamilyAndStyle(family, item->Label());
2149ed32a43SStephan Aßmus _UpdateFontPreview();
2159ed32a43SStephan Aßmus }
2169ed32a43SStephan Aßmus }
2179ed32a43SStephan Aßmus break;
2189ed32a43SStephan Aßmus }
2199ed32a43SStephan Aßmus
2209ed32a43SStephan Aßmus case kMsgSetStyle:
2219ed32a43SStephan Aßmus {
2229ed32a43SStephan Aßmus const char* family;
2239ed32a43SStephan Aßmus const char* style;
2249ed32a43SStephan Aßmus if (msg->FindString("family", &family) != B_OK
2259ed32a43SStephan Aßmus || msg->FindString("style", &style) != B_OK)
2269ed32a43SStephan Aßmus break;
2279ed32a43SStephan Aßmus
2289ed32a43SStephan Aßmus BMenuItem *familyItem = fFontsMenu->FindItem(family);
2299ed32a43SStephan Aßmus if (!familyItem)
2309ed32a43SStephan Aßmus break;
2319ed32a43SStephan Aßmus
2329ed32a43SStephan Aßmus _SelectCurrentFont(false);
2339ed32a43SStephan Aßmus familyItem->SetMarked(true);
2349ed32a43SStephan Aßmus
2359ed32a43SStephan Aßmus fCurrentFont.SetFamilyAndStyle(family, style);
2369ed32a43SStephan Aßmus _UpdateFontPreview();
2379ed32a43SStephan Aßmus break;
2389ed32a43SStephan Aßmus }
2399ed32a43SStephan Aßmus
2409ed32a43SStephan Aßmus default:
2419ed32a43SStephan Aßmus BView::MessageReceived(msg);
2429ed32a43SStephan Aßmus }
2439ed32a43SStephan Aßmus }
2449ed32a43SStephan Aßmus
245f515b1c0SJohn Scipione
2462d0c3dd6SMikael Konradsson BView*
GetPreviewBox() const2472d0c3dd6SMikael Konradsson FontSelectionView::GetPreviewBox() const
2489ed32a43SStephan Aßmus {
2492d0c3dd6SMikael Konradsson return fPreviewBox;
2502d0c3dd6SMikael Konradsson }
2512d0c3dd6SMikael Konradsson
2522d0c3dd6SMikael Konradsson
2532d0c3dd6SMikael Konradsson BView*
GetFontSizeSpinner() const2542d0c3dd6SMikael Konradsson FontSelectionView::GetFontSizeSpinner() const
2552d0c3dd6SMikael Konradsson {
2562d0c3dd6SMikael Konradsson return fFontSizeSpinner;
2579ed32a43SStephan Aßmus }
2589ed32a43SStephan Aßmus
2599ed32a43SStephan Aßmus
2609ed32a43SStephan Aßmus BLayoutItem*
CreateFontsLabelLayoutItem() const2612d0c3dd6SMikael Konradsson FontSelectionView::CreateFontsLabelLayoutItem() const
2629ed32a43SStephan Aßmus {
2639ed32a43SStephan Aßmus return fFontsMenuField->CreateLabelLayoutItem();
2649ed32a43SStephan Aßmus }
2659ed32a43SStephan Aßmus
2669ed32a43SStephan Aßmus
2679ed32a43SStephan Aßmus BLayoutItem*
CreateFontsMenuBarLayoutItem() const2682d0c3dd6SMikael Konradsson FontSelectionView::CreateFontsMenuBarLayoutItem() const
2699ed32a43SStephan Aßmus {
2709ed32a43SStephan Aßmus return fFontsMenuField->CreateMenuBarLayoutItem();
2719ed32a43SStephan Aßmus }
2729ed32a43SStephan Aßmus
2739ed32a43SStephan Aßmus
2749ed32a43SStephan Aßmus void
_SelectCurrentFont(bool select)2759ed32a43SStephan Aßmus FontSelectionView::_SelectCurrentFont(bool select)
2769ed32a43SStephan Aßmus {
2779ed32a43SStephan Aßmus font_family family;
2789ed32a43SStephan Aßmus font_style style;
2799ed32a43SStephan Aßmus fCurrentFont.GetFamilyAndStyle(&family, &style);
2809ed32a43SStephan Aßmus
2819ed32a43SStephan Aßmus BMenuItem *item = fFontsMenu->FindItem(family);
2829ed32a43SStephan Aßmus if (item != NULL) {
2839ed32a43SStephan Aßmus item->SetMarked(select);
2849ed32a43SStephan Aßmus
2859ed32a43SStephan Aßmus if (item->Submenu() != NULL) {
2869ed32a43SStephan Aßmus item = item->Submenu()->FindItem(style);
2879ed32a43SStephan Aßmus if (item != NULL)
2889ed32a43SStephan Aßmus item->SetMarked(select);
2899ed32a43SStephan Aßmus }
2909ed32a43SStephan Aßmus }
2919ed32a43SStephan Aßmus }
2929ed32a43SStephan Aßmus
2939ed32a43SStephan Aßmus
2949ed32a43SStephan Aßmus void
_SelectCurrentSize()2952d0c3dd6SMikael Konradsson FontSelectionView::_SelectCurrentSize()
2969ed32a43SStephan Aßmus {
2972d0c3dd6SMikael Konradsson fFontSizeSpinner->SetValue((int32)fCurrentFont.Size());
2989ed32a43SStephan Aßmus }
2999ed32a43SStephan Aßmus
300f515b1c0SJohn Scipione
3019ed32a43SStephan Aßmus void
_UpdateFontPreview()3029ed32a43SStephan Aßmus FontSelectionView::_UpdateFontPreview()
3039ed32a43SStephan Aßmus {
3049ed32a43SStephan Aßmus #ifdef INSTANT_UPDATE
3059ed32a43SStephan Aßmus _UpdateSystemFont();
3069ed32a43SStephan Aßmus #endif
307f515b1c0SJohn Scipione
308f515b1c0SJohn Scipione fPreviewTextView->SetFontAndColor(&fCurrentFont);
309*86da0385SAugustin Cavalier fPreviewTextView->SetExplicitSize(BSize(fPreviewTextWidth,
310f515b1c0SJohn Scipione fPreviewTextView->LineHeight(0) * fPreviewTextView->CountLines()));
3119ed32a43SStephan Aßmus }
3129ed32a43SStephan Aßmus
3139ed32a43SStephan Aßmus
3149ed32a43SStephan Aßmus void
_UpdateSystemFont()3159ed32a43SStephan Aßmus FontSelectionView::_UpdateSystemFont()
3169ed32a43SStephan Aßmus {
3179ed32a43SStephan Aßmus font_family family;
3189ed32a43SStephan Aßmus font_style style;
3199ed32a43SStephan Aßmus fCurrentFont.GetFamilyAndStyle(&family, &style);
3209ed32a43SStephan Aßmus
3219ed32a43SStephan Aßmus if (strcmp(Name(), "menu") == 0) {
3229ed32a43SStephan Aßmus // The menu font is not handled as a system font
3239ed32a43SStephan Aßmus menu_info info;
3249ed32a43SStephan Aßmus get_menu_info(&info);
3259ed32a43SStephan Aßmus
3269ed32a43SStephan Aßmus strlcpy(info.f_family, (const char*)family, B_FONT_FAMILY_LENGTH);
3279ed32a43SStephan Aßmus strlcpy(info.f_style, (const char*)style, B_FONT_STYLE_LENGTH);
3289ed32a43SStephan Aßmus info.font_size = fCurrentFont.Size();
3299ed32a43SStephan Aßmus
3309ed32a43SStephan Aßmus set_menu_info(&info);
3319ed32a43SStephan Aßmus } else
3329ed32a43SStephan Aßmus _set_system_font_(Name(), family, style, fCurrentFont.Size());
3339ed32a43SStephan Aßmus }
3349ed32a43SStephan Aßmus
3359ed32a43SStephan Aßmus
3369ed32a43SStephan Aßmus void
SetDefaults()3379ed32a43SStephan Aßmus FontSelectionView::SetDefaults()
3389ed32a43SStephan Aßmus {
3399ed32a43SStephan Aßmus font_family family;
3409ed32a43SStephan Aßmus font_style style;
3419ed32a43SStephan Aßmus float size;
3429ed32a43SStephan Aßmus const char* fontName;
3439ed32a43SStephan Aßmus
3449ed32a43SStephan Aßmus if (strcmp(Name(), "menu") == 0)
3459ed32a43SStephan Aßmus fontName = "plain";
3469ed32a43SStephan Aßmus else
3479ed32a43SStephan Aßmus fontName = Name();
3489ed32a43SStephan Aßmus
3499ed32a43SStephan Aßmus if (_get_system_default_font_(fontName, family, style, &size) != B_OK) {
3509ed32a43SStephan Aßmus Revert();
3519ed32a43SStephan Aßmus return;
3529ed32a43SStephan Aßmus }
3539ed32a43SStephan Aßmus
3549ed32a43SStephan Aßmus BFont defaultFont;
3559ed32a43SStephan Aßmus defaultFont.SetFamilyAndStyle(family, style);
3569ed32a43SStephan Aßmus defaultFont.SetSize(size);
3579ed32a43SStephan Aßmus
3589ed32a43SStephan Aßmus if (defaultFont == fCurrentFont)
3599ed32a43SStephan Aßmus return;
3609ed32a43SStephan Aßmus
3619ed32a43SStephan Aßmus _SelectCurrentFont(false);
3629ed32a43SStephan Aßmus
3639ed32a43SStephan Aßmus fCurrentFont = defaultFont;
3649ed32a43SStephan Aßmus _UpdateFontPreview();
3659ed32a43SStephan Aßmus
3669ed32a43SStephan Aßmus _SelectCurrentFont(true);
3672d0c3dd6SMikael Konradsson _SelectCurrentSize();
3689ed32a43SStephan Aßmus }
3699ed32a43SStephan Aßmus
3709ed32a43SStephan Aßmus
3719ed32a43SStephan Aßmus void
Revert()3729ed32a43SStephan Aßmus FontSelectionView::Revert()
3739ed32a43SStephan Aßmus {
3749ed32a43SStephan Aßmus if (!IsRevertable())
3759ed32a43SStephan Aßmus return;
3769ed32a43SStephan Aßmus
3779ed32a43SStephan Aßmus _SelectCurrentFont(false);
3789ed32a43SStephan Aßmus
3799ed32a43SStephan Aßmus fCurrentFont = fSavedFont;
3809ed32a43SStephan Aßmus _UpdateFontPreview();
3819ed32a43SStephan Aßmus
3829ed32a43SStephan Aßmus _SelectCurrentFont(true);
3832d0c3dd6SMikael Konradsson _SelectCurrentSize();
3849ed32a43SStephan Aßmus }
3859ed32a43SStephan Aßmus
3869ed32a43SStephan Aßmus
3879ed32a43SStephan Aßmus bool
IsDefaultable()3889ed32a43SStephan Aßmus FontSelectionView::IsDefaultable()
3899ed32a43SStephan Aßmus {
3909ed32a43SStephan Aßmus font_family defaultFamily;
3919ed32a43SStephan Aßmus font_style defaultStyle;
3929ed32a43SStephan Aßmus float defaultSize;
3939ed32a43SStephan Aßmus const char* fontName;
3949ed32a43SStephan Aßmus
3959ed32a43SStephan Aßmus if (strcmp(Name(), "menu") == 0)
3969ed32a43SStephan Aßmus fontName = "plain";
3979ed32a43SStephan Aßmus else
3989ed32a43SStephan Aßmus fontName = Name();
3999ed32a43SStephan Aßmus
4009ed32a43SStephan Aßmus if (_get_system_default_font_(fontName, defaultFamily, defaultStyle,
4019ed32a43SStephan Aßmus &defaultSize) != B_OK) {
4029ed32a43SStephan Aßmus return false;
4039ed32a43SStephan Aßmus }
4049ed32a43SStephan Aßmus
4059ed32a43SStephan Aßmus font_family currentFamily;
4069ed32a43SStephan Aßmus font_style currentStyle;
4079ed32a43SStephan Aßmus float currentSize;
4089ed32a43SStephan Aßmus
4099ed32a43SStephan Aßmus fCurrentFont.GetFamilyAndStyle(¤tFamily, ¤tStyle);
4109ed32a43SStephan Aßmus currentSize = fCurrentFont.Size();
4119ed32a43SStephan Aßmus
4129ed32a43SStephan Aßmus return strcmp(currentFamily, defaultFamily) != 0
4139ed32a43SStephan Aßmus || strcmp(currentStyle, defaultStyle) != 0
4149ed32a43SStephan Aßmus || currentSize != defaultSize;
4159ed32a43SStephan Aßmus }
4169ed32a43SStephan Aßmus
4179ed32a43SStephan Aßmus
4189ed32a43SStephan Aßmus bool
IsRevertable()4199ed32a43SStephan Aßmus FontSelectionView::IsRevertable()
4209ed32a43SStephan Aßmus {
4219ed32a43SStephan Aßmus return fCurrentFont != fSavedFont;
4229ed32a43SStephan Aßmus }
4239ed32a43SStephan Aßmus
4249ed32a43SStephan Aßmus
4259ed32a43SStephan Aßmus void
UpdateFontsMenu()4269ed32a43SStephan Aßmus FontSelectionView::UpdateFontsMenu()
4279ed32a43SStephan Aßmus {
4289ed32a43SStephan Aßmus int32 numFamilies = count_font_families();
4299ed32a43SStephan Aßmus
4309ed32a43SStephan Aßmus fFontsMenu->RemoveItems(0, fFontsMenu->CountItems(), true);
4319ed32a43SStephan Aßmus BFont font;
4329ed32a43SStephan Aßmus fFontsMenu->GetFont(&font);
4339ed32a43SStephan Aßmus
4349ed32a43SStephan Aßmus font_family currentFamily;
4359ed32a43SStephan Aßmus font_style currentStyle;
4369ed32a43SStephan Aßmus fCurrentFont.GetFamilyAndStyle(¤tFamily, ¤tStyle);
4379ed32a43SStephan Aßmus
4389ed32a43SStephan Aßmus for (int32 i = 0; i < numFamilies; i++) {
4399ed32a43SStephan Aßmus font_family family;
4409ed32a43SStephan Aßmus uint32 flags;
4419ed32a43SStephan Aßmus if (get_font_family(i, &family, &flags) != B_OK)
4429ed32a43SStephan Aßmus continue;
4439ed32a43SStephan Aßmus
44406b10d86SAugustin Cavalier // if we're setting the fixed font, we only want to show fixed and
44506b10d86SAugustin Cavalier // full-and-half-fixed fonts
44606b10d86SAugustin Cavalier if (strcmp(Name(), "fixed") == 0
44706b10d86SAugustin Cavalier && (flags
44806b10d86SAugustin Cavalier & (B_IS_FIXED | B_PRIVATE_FONT_IS_FULL_AND_HALF_FIXED)) == 0) {
4499ed32a43SStephan Aßmus continue;
45006b10d86SAugustin Cavalier }
4519ed32a43SStephan Aßmus
4529ed32a43SStephan Aßmus BMenu* stylesMenu = new BMenu(family);
4539ed32a43SStephan Aßmus stylesMenu->SetRadioMode(true);
4549ed32a43SStephan Aßmus stylesMenu->SetFont(&font);
4559ed32a43SStephan Aßmus
4569ed32a43SStephan Aßmus BMessage* message = new BMessage(kMsgSetFamily);
4579ed32a43SStephan Aßmus message->AddString("family", family);
4589ed32a43SStephan Aßmus message->AddString("name", Name());
4599ed32a43SStephan Aßmus
4609ed32a43SStephan Aßmus BMenuItem* familyItem = new BMenuItem(stylesMenu, message);
4619ed32a43SStephan Aßmus fFontsMenu->AddItem(familyItem);
4629ed32a43SStephan Aßmus
4639ed32a43SStephan Aßmus int32 numStyles = count_font_styles(family);
4649ed32a43SStephan Aßmus
4659ed32a43SStephan Aßmus for (int32 j = 0; j < numStyles; j++) {
4669ed32a43SStephan Aßmus font_style style;
4679ed32a43SStephan Aßmus if (get_font_style(family, j, &style, &flags) != B_OK)
4689ed32a43SStephan Aßmus continue;
4699ed32a43SStephan Aßmus
4709ed32a43SStephan Aßmus message = new BMessage(kMsgSetStyle);
4719ed32a43SStephan Aßmus message->AddString("family", (char*)family);
4729ed32a43SStephan Aßmus message->AddString("style", (char*)style);
4739ed32a43SStephan Aßmus message->AddString("name", Name());
4749ed32a43SStephan Aßmus
4759ed32a43SStephan Aßmus BMenuItem* item = new BMenuItem(style, message);
4769ed32a43SStephan Aßmus
4779ed32a43SStephan Aßmus if (!strcmp(style, currentStyle)
4789ed32a43SStephan Aßmus && !strcmp(family, currentFamily)) {
4799ed32a43SStephan Aßmus item->SetMarked(true);
4809ed32a43SStephan Aßmus familyItem->SetMarked(true);
4819ed32a43SStephan Aßmus }
4829ed32a43SStephan Aßmus stylesMenu->AddItem(item);
4839ed32a43SStephan Aßmus }
4849ed32a43SStephan Aßmus
4859ed32a43SStephan Aßmus stylesMenu->SetTargetForItems(fMessageTarget);
4869ed32a43SStephan Aßmus }
4879ed32a43SStephan Aßmus
4889ed32a43SStephan Aßmus fFontsMenu->SetTargetForItems(fMessageTarget);
4899ed32a43SStephan Aßmus }
490