xref: /haiku/src/preferences/appearance/FontSelectionView.cpp (revision da8162be21b36442f34a731873d2358a0d63c25a)
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(&currentFamily, &currentStyle);
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(&currentFamily, &currentStyle);
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