root/src/tests/kits/interface/layout/widget_layout_test/StringView.cpp
/*
 * Copyright 2007, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
 * All rights reserved. Distributed under the terms of the MIT License.
 */

#include "StringView.h"

#include <math.h>

#include <View.h>


StringView::StringView(const char* string)
        : View(),
          fString(string),
          fAlignment(B_ALIGN_LEFT),
          fStringAscent(0),
          fStringDescent(0),
          fStringWidth(0),
          fExplicitMinSize(B_SIZE_UNSET, B_SIZE_UNSET)
{
        SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
        fTextColor = (rgb_color){ 0, 0, 0, 255 };
}


void
StringView::SetString(const char* string)
{
        fString = string;

        _UpdateStringMetrics();
        Invalidate();
        InvalidateLayout();
}


void
StringView::SetAlignment(alignment align)
{
        if (align != fAlignment) {
                fAlignment = align;
                Invalidate();
        }
}


void
StringView::SetTextColor(rgb_color color)
{
        fTextColor = color;
        Invalidate();
}


BSize
StringView::MinSize()
{
        BSize size(fExplicitMinSize);
        if (!size.IsWidthSet())
                size.width = fStringWidth - 1;
        if (!size.IsHeightSet())
                size.height = fStringAscent + fStringDescent - 1;
        return size;
}


void
StringView::SetExplicitMinSize(BSize size)
{
        fExplicitMinSize = size;
}


void
StringView::AddedToContainer()
{
        _UpdateStringMetrics();
}


void
StringView::Draw(BView* container, BRect updateRect)
{
        BSize size(Size());
        int widthDiff = (int)size.width + 1 - (int)fStringWidth;
        int heightDiff = (int)size.height + 1
                - (int)(fStringAscent + (int)fStringDescent);
        BPoint base;

        // horizontal alignment
        switch (fAlignment) {
                case B_ALIGN_RIGHT:
                        base.x = widthDiff;
                        break;
                case B_ALIGN_LEFT:
                default:
                        base.x = 0;
                        break;
        }

        base.y = heightDiff / 2 + fStringAscent;

        container->SetHighColor(fTextColor);
        container->DrawString(fString.String(), base);
}


void
StringView::_UpdateStringMetrics()
{
        BView* container = Container();
        if (!container)
                return;

        BFont font;
        container->GetFont(&font);

        font_height fh;
        font.GetHeight(&fh);

        fStringAscent = ceilf(fh.ascent);
        fStringDescent = ceilf(fh.descent);
        fStringWidth = font.StringWidth(fString.String());
}