root/src/libs/print/libprint/PagesView.cpp
#include "PagesView.h"

static const float kWidth  = 80;
static const float kHeight = 30;

static const float kPageWidth  = 16;
static const float kPageHeight = 16;

static const float kPageHorizontalIndent = 7;
static const float kPageVerticalIndent = 5;

PagesView::PagesView(BRect frame, const char* name, uint32 resizeMask, uint32 flags)
        :       BView(frame, name, resizeMask, flags),
                fCollate(false),
                fReverse(false)
{
        SetViewColor(B_TRANSPARENT_COLOR);
}

void PagesView::GetPreferredSize(float *width, float *height)
{
        *width  = kWidth;
        *height = kHeight;
}

void PagesView::Draw(BRect rect)
{
        rgb_color backgroundColor = {255, 255, 255};
        // inherit view color from parent if available
        if (Parent() != NULL) {
                backgroundColor = Parent()->ViewColor();
        }
        SetHighColor(backgroundColor);
        FillRect(rect);

        BFont font(be_plain_font);
        font.SetSize(8);
        SetFont(&font);

        BPoint position(3, 3);
        if (fCollate) {
                BPoint next(kPageWidth + kPageHorizontalIndent * 2 + 10, 0);
                _DrawPages(position, 1, 3);
                position += next;
                _DrawPages(position, 1, 3);
        } else {
                BPoint next(kPageWidth + kPageHorizontalIndent * 1 + 10, 0);
                for (int i = 1; i <= 3; i ++) {
                        int page = fReverse ? 4 - i : i;
                        _DrawPages(position, page, 2);
                        position += next;
                }
        }
}

void PagesView::_DrawPages(BPoint position, int number, int count)
{
        position.x += kPageHorizontalIndent * (count - 1);
        BPoint next(-kPageHorizontalIndent, kPageVerticalIndent);
        if (fCollate) {
                for (int i = 0; i < count; i ++) {
                        int page;
                        if (fReverse) {
                                page = 1 + i;
                        } else {
                                page = count - i;
                        }
                        _DrawPage(position, page);
                        position += next;
                }
        } else {
                for (int i = 0; i < count; i ++) {
                        _DrawPage(position, number);
                        position += next;
                }
        }
}

void PagesView::_DrawPage(BPoint position, int number)
{
        const rgb_color pageBackgroundColor = {255, 255, 255};
        const rgb_color pageBorderColor = {0, 0, 0};
        const rgb_color pageNumberColor = {0, 0, 0};

        BPoint page[5];
        page[0].x = position.x + 3;
        page[0].y = position.y;
        page[4].x = position.x;
        page[4].y = position.y + 3;
        page[1].x = position.x + kPageWidth - 1;
        page[1].y = position.y;
        page[2].x = position.x + kPageWidth - 1;
        page[2].y = position.y + kPageHeight - 1;
        page[3].x = position.x;
        page[3].y = position.y + kPageHeight - 1;

        SetHighColor(pageBackgroundColor);
        FillPolygon(page, 5);

        SetHighColor(pageBorderColor);
        StrokePolygon(page, 5);
        StrokeLine(position + BPoint(3, 1), position + BPoint(3, 3));
        StrokeLine(position + BPoint(3, 3), position + BPoint(1, 3));

        SetHighColor(pageNumberColor);
        SetLowColor(pageBackgroundColor);
        DrawChar('0' + number,
                position +
                BPoint(kPageWidth - kPageHorizontalIndent + 1, kPageHeight - 2));
}

void PagesView::SetCollate(bool collate)
{
        fCollate = collate;
        Invalidate();
}

void PagesView::SetReverse(bool reverse)
{
        fReverse = reverse;
        Invalidate();
}