4 * Copyright (c) 2010-2011 project bchan
6 * This software is provided 'as-is', without any express or implied
7 * warranty. In no event will the authors be held liable for any damages
8 * arising from the use of this software.
10 * Permission is granted to anyone to use this software for any purpose,
11 * including commercial applications, and to alter it and redistribute it
12 * freely, subject to the following restrictions:
14 * 1. The origin of this software must not be misrepresented; you must not
15 * claim that you wrote the original software. If you use this software
16 * in a product, an acknowledgment in the product documentation would be
17 * appreciated but is not required.
19 * 2. Altered source versions must be plainly marked as such, and must not be
20 * misrepresented as being the original software.
22 * 3. This notice may not be removed or altered from any source
29 #include "layoutarray.h"
30 #include "layoutstyle.h"
36 #include <btron/btron.h>
37 #include <btron/libapp.h>
42 datlayoutstyle_t *style;
43 datlayoutarray_t *array;
44 W view_l, view_t, view_r, view_b;
47 LOCAL W datrender_entrydraw_drawbody(datlayout_res_t *entry, GID gid, W dh, W dv)
49 TC *str = entry->parser_res->body;
50 W len = entry->parser_res->body_len;
51 return tadlib_drawtext(str, len, gid, dh, dv);
54 LOCAL W datrender_entrydraw_drawname(datlayout_res_t *entry, GID gid, W dh, W dv)
56 TC *str = entry->parser_res->name;
57 W len = entry->parser_res->name_len;
58 return tadlib_drawtext(str, len, gid, dh, dv);
61 LOCAL W datrender_entrydraw_drawmail(datlayout_res_t *entry, GID gid, W dh, W dv)
63 TC *str = entry->parser_res->mail;
64 W len = entry->parser_res->mail_len;
65 return tadlib_drawtext(str, len, gid, dh, dv);
68 LOCAL W datrender_entrydraw_drawdateidbeid(datlayout_res_t *entry, GID gid, W dh, W dv)
73 if (entry->parser_res->dateinfo.date != NULL) {
74 err = gset_chp(gid, 16, 0, 0);
78 str = entry->parser_res->dateinfo.date;
79 len = entry->parser_res->dateinfo.date_len;
80 err = tadlib_drawtext(str, len, gid, dh, dv);
85 if (entry->parser_res->dateinfo.id != NULL) {
86 err = gset_chp(gid, 16, 0, 0);
90 str = entry->parser_res->dateinfo.id;
91 len = entry->parser_res->dateinfo.id_len;
92 err = tadlib_drawtext(str, len, gid, dh, dv);
97 if (entry->parser_res->dateinfo.beid != NULL) {
98 err = gset_chp(gid, 16, 0, 0);
102 str = entry->parser_res->dateinfo.beid;
103 len = entry->parser_res->dateinfo.beid_len;
104 err = tadlib_drawtext(str, len, gid, dh, dv);
111 TC *str = entry->parser_res->date;
112 W len = entry->parser_res->date_len;
113 return tadlib_drawtext(str, len, gid, dh, dv);
117 LOCAL W datrender_entrydraw_resnumber(datlayout_res_t *entry, W resnum, GID target)
122 numstr_len = tadlib_UW_to_str(resnum, numstr, 10);
123 err = gdra_str(target, numstr, numstr_len, G_STORE);
131 LOCAL int sectrect_tmp(RECT a, W left, W top, W right, W bottom)
133 return (a.c.left<right && left<a.c.right && a.c.top<bottom && top<a.c.bottom);
136 LOCAL W andrect_tmp(W *l_dest, W *t_dest, W *r_dest, W *b_dest, W l2, W t2, W r2, W b2)
138 if (!(*l_dest<r2 && l2<*r_dest && *t_dest<b2 && t2<*b_dest)) {
162 LOCAL W datrender_fillrect(datrender_t *render, RECT *rect, W l, W t, W r, W b)
174 sect = andrect_tmp(&l, &t, &r, &b, render->view_l, render->view_t, render->view_r, render->view_b);
182 sect = sectrect_tmp(*rect, l - dh, t - dv, r - dh, b - dv);
187 border.c.left = l - dh;
188 border.c.top = t - dv;
189 border.c.right = r - dh;
190 border.c.bottom = b - dv;
192 err = gfil_rec(render->target, border, &pat0, 0, G_STORE);
200 LOCAL W datlayout_box_drawleftborder(datlayout_box_t *box, datlayout_style_t *style, datrender_t *render, RECT *rect)
204 if (style->border_width_left <= 0) {
208 l = box->l - style->padding_width_left - style->border_width_left;
209 t = box->t - style->padding_width_top - style->border_width_top;
210 r = box->l - style->padding_width_left;
211 b = box->b + style->padding_width_bottom + style->border_width_bottom;
213 return datrender_fillrect(render, rect, l, t, r, b);
216 LOCAL W datlayout_box_drawtopborder(datlayout_box_t *box, datlayout_style_t *style, datrender_t *render, RECT *rect)
220 if (style->border_width_top <= 0) {
224 l = box->l - style->padding_width_left - style->border_width_left;
225 t = box->t - style->padding_width_top - style->border_width_top;
226 r = box->r + style->padding_width_right + style->border_width_right;
227 b = box->t - style->padding_width_bottom;
229 return datrender_fillrect(render, rect, l, t, r, b);
232 LOCAL W datlayout_box_drawrightborder(datlayout_box_t *box, datlayout_style_t *style, datrender_t *render, RECT *rect)
236 if (style->border_width_right <= 0) {
240 l = box->r + style->padding_width_right;
241 t = box->t - style->padding_width_top - style->border_width_top;
242 r = box->r + style->padding_width_right + style->border_width_right;
243 b = box->b + style->padding_width_bottom + style->border_width_bottom;
245 return datrender_fillrect(render, rect, l, t, r, b);
248 LOCAL W datlayout_box_drawbottomborder(datlayout_box_t *box, datlayout_style_t *style, datrender_t *render, RECT *rect)
252 if (style->border_width_top <= 0) {
256 l = box->l - style->padding_width_left - style->border_width_left;
257 t = box->b + style->padding_width_top;
258 r = box->r + style->padding_width_right + style->border_width_right;
259 b = box->b + style->padding_width_bottom + style->border_width_bottom;
261 return datrender_fillrect(render, rect, l, t, r, b);
264 LOCAL W datlayout_box_drawborder(datlayout_box_t *box, datlayout_style_t *style, datrender_t *render, RECT *r)
268 err = datlayout_box_drawleftborder(box, style, render, r);
272 err = datlayout_box_drawtopborder(box, style, render, r);
276 err = datlayout_box_drawrightborder(box, style, render, r);
280 err = datlayout_box_drawbottomborder(box, style, render, r);
287 LOCAL W datrender_drawresborder(datrender_t *render, datlayout_res_t *layout_res, RECT *r)
291 err = datlayout_box_drawborder(&(layout_res->box.res), &render->style->res, render, r);
295 err = datlayout_box_drawborder(&(layout_res->box.resheader), &render->style->resheader, render, r);
299 err = datlayout_box_drawborder(&(layout_res->box.resmessage), &render->style->resmessage, render, r);
307 LOCAL W datrender_entrydrawnormal(datlayout_res_t *entry, datlayout_style_t *resstyle, datlayout_style_t *resheaderstyle, datlayout_style_t *resmessagestyle, W index, datrender_t *render, GID target, RECT *r, W dh, W dv)
310 W rv_l, rv_t, rv_r, rv_b;
312 datlayout_res_getviewrect(entry, resstyle, &rv_l, &rv_t, &rv_r, &rv_b);
315 sect = sectrect_tmp(*r, rv_l - dh, rv_t - dv, rv_r - dh, rv_b - dv);
320 err = datrender_drawresborder(render, entry, r);
325 gset_chc(target, 0x10000000, 0x10efefef);
326 err = gset_chp(target, entry->box.resheader.l - dh, entry->box.resheader.t + 16 - dv, 1);
330 err = datrender_entrydraw_resnumber(entry, index+1, target);
334 err = gset_chp(target, 16, 0, 0);
338 if (entry->parser_res->mail_len != 0) {
339 gset_chc(target, 0x100000ff, 0x10efefef);
341 gset_chc(target, 0x10008000, 0x10efefef);
343 err = datrender_entrydraw_drawname(entry, target, dh, dv);
347 err = gset_chp(target, 16, 0, 0);
351 gset_chc(target, 0x10000000, 0x10efefef);
352 layoutstyle_resetgenvfont(target);
353 gdra_chr(target, TK_LABR, G_STORE);
354 err = datrender_entrydraw_drawmail(entry, target, dh, dv);
358 layoutstyle_resetgenvfont(target);
359 gdra_chr(target, TK_RABR, G_STORE);
361 err = datrender_entrydraw_drawdateidbeid(entry, target, dh, dv);
366 err = gset_chp(target, entry->box.resmessage.l - dh, entry->box.resmessage.t + 16 - dv, 1);
370 layoutstyle_resetgenvfont(target);
371 err = datrender_entrydraw_drawbody(entry, target, dh - entry->box.resmessage.l/* Ugh! */, dv);
379 LOCAL W datrender_entrydraw_drawNGrect(datrender_t *render, datlayout_res_t *entry, RECT *r)
381 W rv_l, rv_t, rv_r, rv_b;
393 datlayout_res_getcontentrect(entry, &render->style->res, &rv_l, &rv_t, &rv_r, &rv_b);
395 fr.c.left = rv_l - render->view_l;
396 fr.c.top = rv_t - render->view_t;
397 fr.c.right = rv_r - render->view_l + 1;
398 fr.c.bottom = rv_b - render->view_t + 1;
399 err = gfra_rec(render->target, fr, 1, &pat0, 0, G_STORE);
404 p0.x = rv_l - render->view_l;
405 p0.y = rv_t - render->view_t;
406 p1.x = rv_r - render->view_l;
407 p1.y = rv_b - render->view_t;
408 err = gdra_lin(render->target, p0, p1, 1, &pat0, G_STORE);
413 p0.x = rv_l - render->view_l;
414 p0.y = rv_b - render->view_t;
415 p1.x = rv_r - render->view_l;
416 p1.y = rv_t - render->view_t;
417 err = gdra_lin(render->target, p0, p1, 1, &pat0, G_STORE);
425 LOCAL W datrender_entrydrawNG(datrender_t *render, datlayout_res_t *entry, W index, RECT *r, W dh, W dv, Bool is_display_id, Bool is_number_grayout)
428 W rv_l, rv_t, rv_r, rv_b;
429 datlayout_style_t *resstyle;
433 target = render->target;
434 resstyle = &render->style->res;
436 datlayout_res_getviewrect(entry, resstyle, &rv_l, &rv_t, &rv_r, &rv_b);
439 sect = sectrect_tmp(*r, rv_l - dh, rv_t - dv, rv_r - dh, rv_b - dv);
444 err = datrender_entrydraw_drawNGrect(render, entry, r);
449 err = datrender_drawresborder(render, entry, r);
454 if (is_number_grayout == True) {
455 gset_chc(target, 0x10888888, 0x10efefef); /* tmp color */
457 gset_chc(target, 0x10000000, 0x10efefef);
459 err = gset_chp(target, entry->box.resheader.l - dh, entry->box.resheader.t + 16 - dv, 1);
463 err = datrender_entrydraw_resnumber(entry, index+1, target);
468 if ((is_display_id == True) && (entry->parser_res->dateinfo.id != NULL)) {
469 gset_chc(target, 0x10000000, 0x10efefef);
470 err = gset_chp(target, entry->box.resheader.l - dh + entry->headerinfo.rel_id_pos.c.left, entry->box.resheader.t + 16 - dv, 1);
474 err = layoutstyle_sethankakufont(target);
478 str = entry->parser_res->dateinfo.id;
479 len = entry->parser_res->dateinfo.id_len;
480 err = tadlib_drawtext(str, len, target, dh, dv);
489 LOCAL W datrender_entrydraw(datlayout_res_t *entry, datlayout_style_t *resstyle, datlayout_style_t *resheaderstyle, datlayout_style_t *resmessagestyle, W index, datrender_t *render, GID target, RECT *r, W dh, W dv)
493 isNG = datlayout_res_isenableindexNG(entry);
495 return datrender_entrydrawNG(render, entry, index, r, dh, dv, False, False);
497 isNG = datlayout_res_isenableidNG(entry);
499 return datrender_entrydrawNG(render, entry, index, r, dh, dv, True, True);
501 isNG = datlayout_res_isenablewordNG(entry);
503 return datrender_entrydrawNG(render, entry, index, r, dh, dv, False, True);
505 return datrender_entrydrawnormal(entry, resstyle, resheaderstyle, resmessagestyle, index, render, target, r, dh, dv);
508 LOCAL W datrender_bodyborderdraw(datrender_t *render, RECT *r)
510 datlayout_box_t bodybox;
511 datlayoutarray_getbodybox(render->array, &bodybox);
512 return datlayout_box_drawborder(&bodybox, &(render->style->body), render, r);
515 EXPORT W datrender_draw(datrender_t *render, RECT *r)
519 datlayout_res_t *layout_res;
522 target = render->target;
523 len = datlayoutarray_length(render->array);
525 for (i = 0; i < len; i++) {
526 exist = datlayoutarray_getresbyindex(render->array, i, &layout_res);
527 if (exist == False) {
530 layoutstyle_resetgenvfont(render->target);
531 err = datrender_entrydraw(layout_res, &(render->style->res), &(render->style->resheader), &(render->style->resmessage), i, render, target, r, render->view_l, render->view_t);
537 err = datrender_bodyborderdraw(render, r);
545 LOCAL W datrender_findentryaction(datlayout_res_t *entry, datlayout_style_t *resstyle, datlayout_style_t *resheaderstyle, datlayout_style_t *resmessagestyle, W abs_x, W abs_y, W *al, W *at, W *ar, W *ab, W *type, UB **start, W *len)
552 datlayout_res_getviewrect(entry, resstyle, &l, &t, &r, &b);
553 if (!((l <= abs_x)&&(abs_x < r)&&(t <= abs_y)&&(abs_y < b))) {
556 datlayout_resheader_getcontentrect(entry, resheaderstyle, &l, &t, &r, &b);
557 if ((l <= abs_x)&&(abs_x < r)&&(t <= abs_y)&&(abs_y < b)) {
569 in = inrect(entry->headerinfo.rel_number_pos, pos);
571 *type = DATRENDER_FINDACTION_TYPE_NUMBER;
574 in = inrect(entry->headerinfo.rel_id_pos, pos);
576 *type = DATRENDER_FINDACTION_TYPE_RESID;
581 datlayout_resmessage_getcontentrect(entry, resmessagestyle, &l, &t, &r, &b);
582 if ((l <= abs_x)&&(abs_x < r)&&(t <= abs_y)&&(abs_y < b)) {
585 fnd = actionlist_findboard(entry->action.body, pos, &rect, type, start, len);
587 *al = rect.c.left + l;
588 *at = rect.c.top + t;
589 *ar = rect.c.right + l;
590 *ab = rect.c.bottom + t;
597 EXPORT W datrender_findaction(datrender_t *render, PNT rel_pos, RECT *rect, W *type, UB **start, W *len, W *resindex)
599 W i,abs_x,abs_y,fnd,layout_len;
602 datlayout_res_t *res;
604 abs_x = rel_pos.x + render->view_l;
605 abs_y = rel_pos.y + render->view_t;
606 layout_len = datlayoutarray_length(render->array);
608 for (i = 0; i < layout_len; i++) {
609 exist = datlayoutarray_getresbyindex(render->array, i, &res);
610 if (exist == False) {
614 fnd = datrender_findentryaction(res, &(render->style->res), &(render->style->resheader), &(render->style->resmessage), abs_x, abs_y, &l, &t, &r, &b, type, start, len);
616 rect->c.left = l - render->view_l;
617 rect->c.top = t - render->view_t;
618 rect->c.right = r - render->view_l;
619 rect->c.bottom = b - render->view_t;
628 EXPORT VOID datrender_setviewrect(datrender_t *render, W l, W t, W r, W b)
636 EXPORT VOID datrender_getviewrect(datrender_t *render, W *l, W *t, W *r, W *b)
644 EXPORT VOID datrender_scrollviewrect(datrender_t *render, W dh, W dv)
646 render->view_l += dh;
647 render->view_t += dv;
648 render->view_r += dh;
649 render->view_b += dv;
652 EXPORT datrender_t* datrender_new(GID target, datlayoutstyle_t *style, datlayoutarray_t *layoutarray)
656 render = (datrender_t*)malloc(sizeof(datrender_t));
657 if (render == NULL) {
660 render->target = target;
661 render->style = style;
662 render->array = layoutarray;
671 EXPORT VOID datrender_delete(datrender_t *render)