/*
 * File      : about_view.c
 * This file is part of RTGUI in RT-Thread RTOS
 * COPYRIGHT (C) 2010, RT-Thread Development Team
 *
 * The license and distribution terms for this file may be
 * found in the file LICENSE in this distribution or at
 * http://www.rt-thread.org/license/LICENSE
 *
 * Change Logs:
 * Date           Author       Notes
 * 2010-01-06     Bernard      first version
 */

#include <rtgui/rtgui_theme.h>
#include <rtgui/widgets/about_view.h>

static void _rtgui_about_view_constructor(struct rtgui_about_view *view)
{
	/* default rect */
	struct rtgui_rect rect = {0, 0, 200, 200};

	/* set default widget rect and set event handler */
	rtgui_widget_set_event_handler(RTGUI_WIDGET(view),rtgui_about_view_event_handler);
	rtgui_widget_set_rect(RTGUI_WIDGET(view), &rect);

	RTGUI_WIDGET(view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;

	view->logo = RT_NULL;
	view->description = RT_NULL;

	RTGUI_WIDGET_TEXTALIGN(RTGUI_WIDGET(view)) = RTGUI_ALIGN_CENTER_VERTICAL;
}

rtgui_type_t *rtgui_about_view_type_get(void)
{
	static rtgui_type_t *list_view_type = RT_NULL;

	if (!list_view_type)
	{
		list_view_type = rtgui_type_create("aboutview", RTGUI_VIEW_TYPE,
			sizeof(rtgui_about_view_t), RTGUI_CONSTRUCTOR(_rtgui_about_view_constructor), RT_NULL);
	}

	return list_view_type;
}

void rtgui_about_view_ondraw(struct rtgui_about_view* view)
{
	struct rtgui_rect rect;
	struct rtgui_dc* dc;

	dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(view));
	if (dc == RT_NULL) return;

	rtgui_widget_get_rect(RTGUI_WIDGET(view), &rect);
	rtgui_dc_fill_rect(dc, &rect);

	if (view->logo != RT_NULL)
		rtgui_image_blit(view->logo, dc, &rect);

	rect.y1 += view->logo->h + 5;
	if (view->description != RT_NULL)
		rtgui_dc_draw_text(dc, view->description, &rect);

	rect.y1 += rtgui_dc_get_font(dc)->height;
	rtgui_dc_draw_hline(dc, rect.x1 + 3, rect.x2 - 3, rect.y1);
	rtgui_dc_set_color(dc, white);
	rtgui_dc_draw_hline(dc, rect.x1 + 4, rect.x2 - 2, rect.y1 + 1);

	rtgui_dc_end_drawing(dc);
}

rt_bool_t rtgui_about_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
{
	struct rtgui_about_view* view = RT_NULL;

	view = RTGUI_ABOUT_VIEW(widget);
	switch (event->type)
	{
	case RTGUI_EVENT_PAINT:
		rtgui_about_view_ondraw(view);
		return RT_FALSE;
	}

    /* use view event handler */
    return rtgui_view_event_handler(widget, event);
}

rtgui_about_view_t* rtgui_about_view_create(rtgui_image_t *logo, const char* description)
{
	struct rtgui_about_view* view = RT_NULL;

	view = (struct rtgui_about_view*) rtgui_widget_create(RTGUI_ABOUT_VIEW_TYPE);
	if (view != RT_NULL)
	{
	    view->logo = logo;
	    view->description = description;
	}

	return view;
}

void rtgui_about_view_destroy(rtgui_about_view_t* view)
{
    /* destroy view */
	rtgui_widget_destroy(RTGUI_WIDGET(view));
}
