* Copyright 2001-2012, Haiku.
* Distributed under the terms of the MIT License.
*
* Authors:
* Mark Hogben
* DarkWyrm <bpmagic@columbus.rr.com>
* Axel DΓΆrfler, axeld@pinc-software.de
* Philippe St-Pierre, stpere@gmail.com
* Stephan AΓmus <superstippi@gmx.de>
*/
#include "FontView.h"
#include <algorithm>
#include <string.h>
#include <Catalog.h>
#include <ControlLook.h>
#include <GridLayout.h>
#include <LayoutBuilder.h>
#include <Locale.h>
#include <MessageRunner.h>
#include <SpaceLayoutItem.h>
#include "AppearanceWindow.h"
#include "FontSelectionView.h"
#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "Font view"
static const uint32 kMsgCheckFonts = 'chkf';
FontView::FontView(const char* name)
:
BView(name, B_WILL_DRAW )
{
SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
const char* plainLabel = B_TRANSLATE("Plain font:");
const char* boldLabel = B_TRANSLATE("Bold font:");
const char* fixedLabel = B_TRANSLATE("Fixed font:");
const char* menuLabel = B_TRANSLATE("Menu font:");
fPlainView = new FontSelectionView("plain", plainLabel);
fBoldView = new FontSelectionView("bold", boldLabel);
fFixedView = new FontSelectionView("fixed", fixedLabel);
fMenuView = new FontSelectionView("menu", menuLabel);
float longestLabel = StringWidth(plainLabel);
longestLabel = std::max(longestLabel, StringWidth(boldLabel));
longestLabel = std::max(longestLabel, StringWidth(fixedLabel));
longestLabel = std::max(longestLabel, StringWidth(menuLabel));
longestLabel += be_control_look->DefaultLabelSpacing();
BGridLayout* gridLayout;
gridLayout = (BGridLayout*)fPlainView->GetLayout();
gridLayout->SetMinColumnWidth(0, longestLabel);
gridLayout = (BGridLayout*)fBoldView->GetLayout();
gridLayout->SetMinColumnWidth(0, longestLabel);
gridLayout = (BGridLayout*)fFixedView->GetLayout();
gridLayout->SetMinColumnWidth(0, longestLabel);
gridLayout = (BGridLayout*)fMenuView->GetLayout();
gridLayout->SetMinColumnWidth(0, longestLabel);
BLayoutBuilder::Group<>(this, B_VERTICAL, 0)
.Add(fPlainView)
.Add(fBoldView)
.Add(fFixedView)
.Add(fMenuView)
.Add(BSpaceLayoutItem::CreateVerticalStrut(5))
.SetInsets(B_USE_WINDOW_SPACING);
}
void
FontView::AttachedToWindow()
{
fPlainView->SetTarget(this);
fBoldView->SetTarget(this);
fFixedView->SetTarget(this);
fMenuView->SetTarget(this);
UpdateFonts();
fRunner = new BMessageRunner(this, new BMessage(kMsgCheckFonts), 3000000);
}
void
FontView::DetachedFromWindow()
{
delete fRunner;
fRunner = NULL;
}
void
FontView::SetDefaults()
{
fPlainView->SetDefaults();
fBoldView->SetDefaults();
fFixedView->SetDefaults();
fMenuView->SetDefaults();
}
void
FontView::MessageReceived(BMessage* message)
{
switch (message->what) {
case kMsgSetSize:
case kMsgSetFamily:
case kMsgSetStyle:
{
const char* name;
if (message->FindString("name", &name) != B_OK)
break;
if (!strcmp(name, "plain"))
fPlainView->MessageReceived(message);
else if (!strcmp(name, "bold"))
fBoldView->MessageReceived(message);
else if (!strcmp(name, "fixed"))
fFixedView->MessageReceived(message);
else if (!strcmp(name, "menu"))
fMenuView->MessageReceived(message);
else
break;
Window()->PostMessage(kMsgUpdate);
break;
}
case kMsgCheckFonts:
if (update_font_families(true))
UpdateFonts();
break;
default:
BView::MessageReceived(message);
}
}
void
FontView::Revert()
{
fPlainView->Revert();
fBoldView->Revert();
fFixedView->Revert();
fMenuView->Revert();
}
void
FontView::UpdateFonts()
{
fPlainView->UpdateFontsMenu();
fBoldView->UpdateFontsMenu();
fFixedView->UpdateFontsMenu();
fMenuView->UpdateFontsMenu();
}
bool
FontView::IsDefaultable()
{
return fPlainView->IsDefaultable()
|| fBoldView->IsDefaultable()
|| fFixedView->IsDefaultable()
|| fMenuView->IsDefaultable();
}
bool
FontView::IsRevertable()
{
return fPlainView->IsRevertable()
|| fBoldView->IsRevertable()
|| fFixedView->IsRevertable()
|| fMenuView->IsRevertable();
}