⛏️ index : haiku.git

/*
 * Copyright 2013, Stephan Aßmus <superstippi@gmx.de>.
 * All rights reserved. Distributed under the terms of the MIT License.
 */

#include "TextView.h"


TextView::TextView(const char* name)
	:
	BView(name, B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE | B_FRAME_EVENTS)
{
	BFont font;
	GetFont(&font);

	::ParagraphStyle style;
	style.SetLineSpacing(ceilf(font.Size() * 0.2));

	SetParagraphStyle(style);
}


TextView::~TextView()
{
}


void
TextView::Draw(BRect updateRect)
{
	FillRect(updateRect, B_SOLID_LOW);

	fTextLayout.SetWidth(Bounds().Width());
	fTextLayout.Draw(this, B_ORIGIN);
}


void
TextView::AttachedToWindow()
{
	AdoptParentColors();
}


void
TextView::FrameResized(float width, float height)
{
	fTextLayout.SetWidth(width);
}


BSize
TextView::MinSize()
{
	return BSize(50.0f, 0.0f);
}


BSize
TextView::MaxSize()
{
	return BSize(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED);
}


BSize
TextView::PreferredSize()
{
	return BSize(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED);
}


bool
TextView::HasHeightForWidth()
{
	return true;
}


void
TextView::GetHeightForWidth(float width, float* min, float* max,
	float* preferred)
{
	ParagraphLayout layout(fTextLayout);
	layout.SetWidth(width);

	float height = layout.Height() + 1;

	if (min != NULL)
		*min = height;
	if (max != NULL)
		*max = height;
	if (preferred != NULL)
		*preferred = height;
}


void
TextView::SetText(const BString& text)
{
	fText.Clear();

	CharacterStyle regularStyle;
	fText.Append(TextSpan(text, regularStyle));

	fTextLayout.SetParagraph(fText);

	InvalidateLayout();
	Invalidate();
}


void
TextView::SetParagraphStyle(const ::ParagraphStyle& style)
{
	fText.SetStyle(style);
	fTextLayout.SetParagraph(fText);

	InvalidateLayout();
	Invalidate();
}