OSDN Git Service

add .gitattributes and .gitignore
[bbk/bchanl.git] / src / subjectlayout.c
index 9f7a28d..4e2b4e1 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * subjectlayout.c
  *
- * Copyright (c) 2009-2010 project bchan
+ * Copyright (c) 2009-2012 project bchan
  *
  * This software is provided 'as-is', without any express or implied
  * warranty. In no event will the authors be held liable for any damages
  */
 
 #include    "subjectlayout.h"
-#include    "subjectparser.h"
+#include    "subjectlist.h"
 #include    "tadlib.h"
 
 #include       <bstdio.h>
 #include       <bstdlib.h>
-#include       <tstring.h>
 #include       <tcode.h>
 #include       <btron/btron.h>
 #include       <btron/dp.h>
@@ -96,10 +95,43 @@ LOCAL W WtoTCS(W num, TC *dest)
                draw = 1;
        }
        digit = num % 10;
-       if ((digit != 0)||(draw != 0)) {
-               dest[i++] = dec[digit];
-               draw = 1;
-       }
+       dest[i++] = dec[digit];
+       draw = 1;
+       dest[i] = TNULL;
+
+       return i;
+}
+
+LOCAL W DATE_TIMtoTCS(DATE_TIM *dtim, TC *dest)
+{
+       W len;
+
+       len = WtoTCS(dtim->d_year + 1900, dest);
+       dest[len++] = TK_SLSH;
+       len += WtoTCS(dtim->d_month, dest + len);
+       dest[len++] = TK_SLSH;
+       len += WtoTCS(dtim->d_day, dest + len);
+       dest[len] = TNULL;
+
+       return len;
+}
+
+LOCAL W VIGORtoTCS(W vigor, TC *dest)
+{
+       W n0 = vigor / 10;
+       W n1 = vigor % 10;
+       W i;
+
+       i = WtoTCS(n0, dest);
+       dest[i++] = TK_PROD;
+       i += WtoTCS(n1, dest + i);
+       dest[i++] = TK_r;
+       dest[i++] = TK_e;
+       dest[i++] = TK_s;
+       dest[i++] = TK_SLSH;
+       dest[i++] = TK_d;
+       dest[i++] = TK_a;
+       dest[i++] = TK_y;
        dest[i] = TNULL;
 
        return i;
@@ -107,15 +139,18 @@ LOCAL W WtoTCS(W num, TC *dest)
 
 typedef struct sbjtlayout_thread_t_ sbjtlayout_thread_t;
 struct sbjtlayout_thread_t_ {
-       sbjtparser_thread_t *parser_thread;
-       W index;
+       sbjtlist_tuple_t *tuple;
+       //W index;
        W view_l,view_t,view_r,view_b;
-       W i_titlesepareter;
        SIZE sz_title;
        W baseline;
        RECT vframe;
 };
 
+#define SBJTLAYOUT_FLAG_RESNUM_DISPLAY 0x00000001
+#define SBJTLAYOUT_FLAG_SINCE_DISPLAY 0x00000002
+#define SBJTLAYOUT_FLAG_VIGOR_DISPLAY 0x00000004
+
 struct sbjtlayout_t_ {
        GID target;
        W draw_l,draw_t,draw_r,draw_b;
@@ -123,45 +158,39 @@ struct sbjtlayout_t_ {
        W len;
        FSSPEC fspec;
        COLOR vobjbgcol;
+       UW flag;
 };
 
-LOCAL sbjtlayout_thread_t* sbjtlayout_thread_new(sbjtparser_thread_t *thread)
+LOCAL sbjtlayout_thread_t* sbjtlayout_thread_new(sbjtlist_tuple_t *thread)
 {
        sbjtlayout_thread_t *layout_thread;
-       TC *str;
 
        layout_thread = (sbjtlayout_thread_t*)malloc(sizeof(sbjtlayout_thread_t));
        if (layout_thread == NULL) {
                return NULL;
        }
-       layout_thread->parser_thread = thread;
+       layout_thread->tuple = thread;
        layout_thread->view_l = 0;
        layout_thread->view_t = 0;
        layout_thread->view_r = 0;
        layout_thread->view_b = 0;
 
-       str = tc_strrchr(thread->title, TK_LPAR);
-       if (str == NULL) {
-               layout_thread->i_titlesepareter = thread->title_len;
-       } else {
-               layout_thread->i_titlesepareter = (str - thread->title) - 1;
-       }
-
        return layout_thread;
 }
 
 LOCAL VOID sbjtlayout_thread_delete(sbjtlayout_thread_t *layout_thread)
 {
-       sbjtparser_thread_delete(layout_thread->parser_thread);
        free(layout_thread);
 }
 
 LOCAL W sbjtlayout_thread_calcindexdrawsize(sbjtlayout_thread_t *layout_thread, GID gid, SIZE *sz)
 {
        TC str[12];
-       W err, len;
+       W err, len, num;
 
-       len = WtoTCS(layout_thread->index, str);
+       sbjtlist_tuple_getnumber(layout_thread->tuple, &num);
+
+       len = WtoTCS(num, str);
        str[len++] = TK_COLN;
        str[len] = TNULL;
 
@@ -181,20 +210,45 @@ LOCAL W sbjtlayout_thread_calcindexdrawsize(sbjtlayout_thread_t *layout_thread,
 
 LOCAL W sbjtlayout_thread_calctitledrawsize(sbjtlayout_thread_t *layout_thread, GID gid, SIZE *sz)
 {
-       return tadlib_calcdrawsize(layout_thread->parser_thread->title, layout_thread->i_titlesepareter, gid, sz);
+       TC *str;
+       W len;
+       sbjtlist_tuple_gettitle(layout_thread->tuple, &str, &len);
+       return tadlib_calcdrawsize(str, len, gid, sz);
 }
 
 LOCAL W sbjtlayout_thread_calcresnumdrawsize(sbjtlayout_thread_t *layout_thread, GID gid, SIZE *sz)
 {
-       return tadlib_calcdrawsize(layout_thread->parser_thread->title + layout_thread->i_titlesepareter, layout_thread->parser_thread->title_len - layout_thread->i_titlesepareter, gid, sz);
+       TC *str;
+       W len;
+       sbjtlist_tuple_getresnumberstr(layout_thread->tuple, &str, &len);
+       return tadlib_calcdrawsize(str, len, gid, sz);
 }
 
-LOCAL W sbjtlayout_thread_calcsize(sbjtlayout_thread_t *layout_res, GID gid, W top, W index)
+LOCAL W sbjtlayout_thread_calcsincedrawsize(sbjtlayout_thread_t *layout_thread, GID gid, SIZE *sz)
 {
-       SIZE sz_index, sz_title, sz_resnum;
-       W err;
+       DATE_TIM dtim;
+       TC str[11];
+       W len = 10;
+       sbjtlist_tuple_getsince(layout_thread->tuple, &dtim);
+       len = DATE_TIMtoTCS(&dtim, str);
+       return tadlib_calcdrawsize(str, len, gid, sz);
+}
+
+LOCAL W sbjtlayout_thread_calcvigordrawsize(sbjtlayout_thread_t *layout_thread, GID gid, SIZE *sz)
+{
+       W vigor;
+       TC str[100];
+       W len;
+       sbjtlist_tuple_getvigor(layout_thread->tuple, &vigor);
+       len = VIGORtoTCS(vigor, str);
+       return tadlib_calcdrawsize(str, len, gid, sz);
+}
 
-       layout_res->index = index;
+LOCAL W sbjtlayout_thread_calcsize(sbjtlayout_thread_t *layout_res, GID gid, W top, sbjtlayout_t *layout)
+{
+       SIZE sz_index, sz_title, sz_resnum, sz_since, sz_vigor;
+       W err;
+       Bool ok;
 
        err = sbjtlayout_thread_calcindexdrawsize(layout_res, gid, &sz_index);
        if (err < 0) {
@@ -208,13 +262,33 @@ LOCAL W sbjtlayout_thread_calcsize(sbjtlayout_thread_t *layout_res, GID gid, W t
        if (err < 0) {
                return err;
        }
+       err = sbjtlayout_thread_calcsincedrawsize(layout_res, gid, &sz_since);
+       if (err < 0) {
+               return err;
+       }
+       err = sbjtlayout_thread_calcvigordrawsize(layout_res, gid, &sz_vigor);
+       if (err < 0) {
+               return err;
+       }
 
        layout_res->sz_title = sz_title;
 
        layout_res->view_t = top + 2;
        layout_res->view_l = 0;
        layout_res->view_b = layout_res->view_t + sz_title.v + 16;
-       layout_res->view_r = 16*6 + sz_title.h + sz_resnum.h;
+       layout_res->view_r = 16*6 + sz_title.h;
+       ok = sbjtlayout_getresnumberdisplay(layout);
+       if (ok != False) {
+               layout_res->view_r += sz_resnum.h;
+       }
+       ok = sbjtlayout_getsincedisplay(layout);
+       if (ok != False) {
+               layout_res->view_r += 16 + sz_since.h;
+       }
+       ok = sbjtlayout_getvigordisplay(layout);
+       if (ok != False) {
+               layout_res->view_r += 16 + sz_vigor.h;
+       }
 
        layout_res->baseline = 20;
        layout_res->vframe.c.left = sz_index.h + 16;
@@ -234,12 +308,12 @@ LOCAL W sbjtlayout_setupgid(sbjtlayout_t *layout, GID gid)
        return gset_fon(gid, &layout->fspec);
 }
 
-EXPORT W sbjtlayout_appendthread(sbjtlayout_t *layout, sbjtparser_thread_t *parser_thread)
+EXPORT W sbjtlayout_appendthread(sbjtlayout_t *layout, sbjtlist_tuple_t *tuple)
 {
        sbjtlayout_thread_t *layout_thread;
        W len;
 
-       layout_thread = sbjtlayout_thread_new(parser_thread);
+       layout_thread = sbjtlayout_thread_new(tuple);
        if (layout_thread == NULL) {
                return -1; /* TODO */
        }
@@ -251,7 +325,7 @@ EXPORT W sbjtlayout_appendthread(sbjtlayout_t *layout, sbjtparser_thread_t *pars
 
        sbjtlayout_setupgid(layout, layout->target);
 
-       sbjtlayout_thread_calcsize(layout_thread, layout->target, layout->draw_b, layout->len);
+       sbjtlayout_thread_calcsize(layout_thread, layout->target, layout->draw_b, layout);
 
        /* orrect */
        if (layout->draw_l > layout_thread->view_l) {
@@ -311,6 +385,60 @@ EXPORT COLOR sbjtlayout_getvobjbgcol(sbjtlayout_t *layout)
        return layout->vobjbgcol;
 }
 
+EXPORT VOID sbjtlayout_setresnumberdisplay(sbjtlayout_t *layout, Bool display)
+{
+       if (display == False) {
+               layout->flag = layout->flag & ~SBJTLAYOUT_FLAG_RESNUM_DISPLAY;
+       } else {
+               layout->flag |= SBJTLAYOUT_FLAG_RESNUM_DISPLAY;
+       }
+}
+
+EXPORT VOID sbjtlayout_setsincedisplay(sbjtlayout_t *layout, Bool display)
+{
+       if (display == False) {
+               layout->flag = layout->flag & ~SBJTLAYOUT_FLAG_SINCE_DISPLAY;
+       } else {
+               layout->flag |= SBJTLAYOUT_FLAG_SINCE_DISPLAY;
+       }
+}
+
+EXPORT VOID sbjtlayout_setvigordisplay(sbjtlayout_t *layout, Bool display)
+{
+       if (display == False) {
+               layout->flag = layout->flag & ~SBJTLAYOUT_FLAG_VIGOR_DISPLAY;
+       } else {
+               layout->flag |= SBJTLAYOUT_FLAG_VIGOR_DISPLAY;
+       }
+}
+
+EXPORT Bool sbjtlayout_getresnumberdisplay(sbjtlayout_t *layout)
+{
+       if ((layout->flag & SBJTLAYOUT_FLAG_RESNUM_DISPLAY) != 0) {
+               return True;
+       } else {
+               return False;
+       }
+}
+
+EXPORT Bool sbjtlayout_getsincedisplay(sbjtlayout_t *layout)
+{
+       if ((layout->flag & SBJTLAYOUT_FLAG_SINCE_DISPLAY) != 0) {
+               return True;
+       } else {
+               return False;
+       }
+}
+
+EXPORT Bool sbjtlayout_getvigordisplay(sbjtlayout_t *layout)
+{
+       if ((layout->flag & SBJTLAYOUT_FLAG_VIGOR_DISPLAY) != 0) {
+               return True;
+       } else {
+               return False;
+       }
+}
+
 EXPORT sbjtlayout_t* sbjtlayout_new(GID gid)
 {
        sbjtlayout_t *layout;
@@ -332,6 +460,7 @@ EXPORT sbjtlayout_t* sbjtlayout_new(GID gid)
        layout->fspec.size.h = 16;
        layout->fspec.size.v = 16;
        layout->vobjbgcol = 0x10000000;
+       layout->flag = 0;
 
        return layout;
 }
@@ -356,19 +485,22 @@ struct sbjtdraw_t_ {
 
 LOCAL W sbjtdraw_entrydraw_drawtitle(sbjtlayout_thread_t *entry, GID gid, W dh, W dv)
 {
-       TC *str = entry->parser_thread->title;
-       W len = entry->i_titlesepareter;
+       TC *str;
+       W len;
+       sbjtlist_tuple_gettitle(entry->tuple, &str, &len);
        return tadlib_drawtext(str, len, gid, dh, dv);
 }
 
 LOCAL W sbjtdraw_entrydraw_drawresnum(sbjtlayout_thread_t *entry, GID gid, W dh, W dv)
 {
-       TC *str = entry->parser_thread->title + entry->i_titlesepareter;
-       W len = entry->parser_thread->title_len - entry->i_titlesepareter;
+       TC *str;
+       W len;
+       sbjtlist_tuple_getresnumberstr(entry->tuple, &str, &len);
        return tadlib_drawtext(str, len, gid, dh, dv);
 }
 
 LOCAL W sbjtdraw_entrydraw_resnumber(sbjtlayout_thread_t *entry, W resnum, GID target)
+
 {
        TC str[11];
        W len;
@@ -377,14 +509,34 @@ LOCAL W sbjtdraw_entrydraw_resnumber(sbjtlayout_thread_t *entry, W resnum, GID t
        return gdra_str(target, str, len, G_STORE);
 }
 
+LOCAL W sbjtdraw_entrydraw_drawsince(sbjtlayout_thread_t *entry, GID gid, W dh, W dv)
+{
+       DATE_TIM dtim;
+       TC str[11];
+       W len = 10;
+       sbjtlist_tuple_getsince(entry->tuple, &dtim);
+       len = DATE_TIMtoTCS(&dtim, str);
+       return gdra_str(gid, str, len, G_STORE);
+}
+
+LOCAL W sbjtdraw_entrydraw_drawvigor(sbjtlayout_thread_t *entry, GID gid, W dh, W dv)
+{
+       W vigor;
+       TC str[100];
+       W len;
+       sbjtlist_tuple_getvigor(entry->tuple, &vigor);
+       len = VIGORtoTCS(vigor, str);
+       return gdra_str(gid, str, len, G_STORE);
+}
+
 LOCAL int sectrect_tmp(RECT a, W left, W top, W right, W bottom)
 {
        return (a.c.left<right && left<a.c.right && a.c.top<bottom && top<a.c.bottom);
 }
 
-LOCAL W sbjtdraw_drawthread(sbjtlayout_thread_t *entry, W index, GID target, RECT *r, W dh, W dv, COLOR vobjbgcol)
+LOCAL W sbjtdraw_drawthread(sbjtlayout_thread_t *entry, GID target, RECT *r, W dh, W dv, COLOR vobjbgcol, sbjtlayout_t *layout)
 {
-       W sect, err;
+       W sect, err, num;
        RECT view, vframe, vframe_b;
        static  PAT     pat0 = {{
                0,
@@ -400,6 +552,7 @@ LOCAL W sbjtdraw_drawthread(sbjtlayout_thread_t *entry, W index, GID target, REC
                0x10000000,
                FILL100
        }};
+       Bool ok;
 
        /* sectrect */
        sect = sectrect_tmp(*r, entry->view_l - dh, entry->view_t - dv, entry->view_r - dh, entry->view_b - dv);
@@ -412,11 +565,13 @@ LOCAL W sbjtdraw_drawthread(sbjtlayout_thread_t *entry, W index, GID target, REC
        view.c.right = entry->view_r - dh;
        view.c.bottom = entry->view_b - dv;
 
+       sbjtlist_tuple_getnumber(entry->tuple, &num);
+
        err = gset_chp(target, - dh, entry->view_t + entry->baseline - dv, 1);
        if (err < 0) {
                return err;
        }
-       err = sbjtdraw_entrydraw_resnumber(entry, index+1, target);
+       err = sbjtdraw_entrydraw_resnumber(entry, num, target);
        if (err < 0) {
                return err;
        }
@@ -455,13 +610,38 @@ LOCAL W sbjtdraw_drawthread(sbjtlayout_thread_t *entry, W index, GID target, REC
        }
 
        gset_chc(target, 0x10000000, 0x10FFFFFF);
+       ok = sbjtlayout_getresnumberdisplay(layout);
        err = gset_chp(target, 16, 0, 0);
        if (err < 0) {
                return err;
        }
-       err = sbjtdraw_entrydraw_drawresnum(entry, target, dh, dv);
-       if (err < 0) {
-               return err;
+       if (ok != False) {
+               err = sbjtdraw_entrydraw_drawresnum(entry, target, dh, dv);
+               if (err < 0) {
+                       return err;
+               }
+       }
+       ok = sbjtlayout_getsincedisplay(layout);
+       if (ok != False) {
+               err = gset_chp(target, 16, 0, 0);
+               if (err < 0) {
+                       return err;
+               }
+               err = sbjtdraw_entrydraw_drawsince(entry, target, dh, dv);
+               if (err < 0) {
+                       return err;
+               }
+       }
+       ok = sbjtlayout_getvigordisplay(layout);
+       if (ok != False) {
+               err = gset_chp(target, 16, 0, 0);
+               if (err < 0) {
+                       return err;
+               }
+               err = sbjtdraw_entrydraw_drawvigor(entry, target, dh, dv);
+               if (err < 0) {
+                       return err;
+               }
        }
 
        return 0;
@@ -478,7 +658,7 @@ EXPORT W sbjtdraw_draw(sbjtdraw_t *draw, RECT *r)
 
        for (i=0;i < layout->len;i++) {
                sbjtlayout_setupgid(layout, layout->target);
-               err = sbjtdraw_drawthread(layout->layout_thread[i], i, target, r, draw->view_l, draw->view_t, layout->vobjbgcol);
+               err = sbjtdraw_drawthread(layout->layout_thread[i], target, r, draw->view_l, draw->view_t, layout->vobjbgcol, layout);
                if (err < 0) {
                        return err;
                }
@@ -487,7 +667,7 @@ EXPORT W sbjtdraw_draw(sbjtdraw_t *draw, RECT *r)
        return 0;
 }
 
-EXPORT W sbjtdraw_findthread(sbjtdraw_t *draw, PNT rel_pos, sbjtparser_thread_t **thread, RECT *vframe)
+EXPORT W sbjtdraw_findthread(sbjtdraw_t *draw, PNT rel_pos, sbjtlist_tuple_t **thread, RECT *vframe)
 {
        W i,abs_x,abs_y,l,t,r,b;
        sbjtlayout_t *layout;
@@ -505,7 +685,7 @@ EXPORT W sbjtdraw_findthread(sbjtdraw_t *draw, PNT rel_pos, sbjtparser_thread_t
                b = sbjt_thread->view_t + sbjt_thread->vframe.c.bottom;
                if ((l <= abs_x)&&(abs_x < r)
                        &&(t <= abs_y)&&(abs_y < b)) {
-                       *thread = sbjt_thread->parser_thread;
+                       *thread = sbjt_thread->tuple;
                        if (vframe != NULL) {
                                vframe->c.left = l - draw->view_l;
                                vframe->c.top = t - draw->view_t;