4 * Copyright (c) 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
27 #include "bchanl_hmi.h"
34 #include <btron/btron.h>
35 #include <btron/hmi.h>
36 #include <btron/vobj.h>
38 #ifdef BCHANL_CONFIG_DEBUG
39 # define DP(arg) printf arg
40 # define DP_ER(msg, err) printf("%s (%d/%x)\n", msg, err>>16, err)
43 # define DP_ER(msg, err) /**/
46 struct subjectwindow_t_ {
49 subjectwindow_scrollcalback scroll_callback;
55 struct bbsmenuwindow_t_ {
58 bbsmenuwindow_scrollcalback scroll_callback;
64 #define SUBJECTOPTIONWINDOW_STRBUF_LEN 512
65 struct subjectoptionwindow_t_ {
80 TC strbuf[SUBJECTOPTIONWINDOW_STRBUF_LEN];
84 #define BCHANLHMI_FLAG_SWITCHBUTDN 0x00000001
90 subjectwindow_t *subjectwindow;
91 bbsmenuwindow_t *bbsmenuwindow;
92 subjectoptionwindow_t *subjectoptionwindow;
95 EXPORT W subjectwindow_startredisp(subjectwindow_t *window, RECT *r)
97 return wsta_dsp(window->wid, r, NULL);
100 EXPORT W subjectwindow_endredisp(subjectwindow_t *window)
102 return wend_dsp(window->wid);
105 EXPORT W subjectwindow_eraseworkarea(subjectwindow_t *window, RECT *r)
107 return wera_wnd(window->wid, r);
110 EXPORT W subjectwindow_scrollworkarea(subjectwindow_t *window, W dh, W dv)
112 return wscr_wnd(window->wid, NULL, dh, dv, W_MOVE|W_RDSET);
115 EXPORT VOID subjectwindow_scrollbyvalue(subjectwindow_t *window, W dh, W dv)
117 windowscroll_scrollbyvalue(&window->wscr, dh, dv);
120 EXPORT W subjectwindow_requestredisp(subjectwindow_t *window)
122 return wreq_dsp(window->wid);
125 EXPORT GID subjectwindow_startdrag(subjectwindow_t *window)
127 return wsta_drg(window->wid, 0);
130 EXPORT W subjectwindow_getdrag(subjectwindow_t *window, PNT *pos, WID *wid, PNT *pos_butup)
134 etype = wget_drg(pos, &window->savedwev);
135 *wid = window->savedwev.s.wid;
136 if (etype == EV_BUTUP) {
137 *pos_butup = window->savedwev.s.pos;
143 EXPORT VOID subjectwindow_enddrag(subjectwindow_t *window)
148 EXPORT VOID subjectwindow_responsepasterequest(subjectwindow_t *window, W nak, PNT *pos)
151 window->savedwev.r.r.p.rightbot.x = pos->x;
152 window->savedwev.r.r.p.rightbot.y = pos->y;
154 wrsp_evt(&window->savedwev, nak);
157 EXPORT W subjectwindow_getworkrect(subjectwindow_t *window, RECT *r)
159 return wget_wrk(window->wid, r);
162 EXPORT GID subjectwindow_getGID(subjectwindow_t *window)
164 return wget_gid(window->wid);
167 EXPORT WID subjectwindow_getWID(subjectwindow_t *window)
172 EXPORT W subjectwindow_settitle(subjectwindow_t *window, TC *title)
174 return wset_tit(window->wid, -1, title, 0);
177 EXPORT Bool subjectwindow_isactive(subjectwindow_t *window)
180 wid = wget_act(NULL);
181 if (window->wid == wid) {
187 EXPORT W subjectwindow_setdrawrect(subjectwindow_t *window, W l, W t, W r, W b)
189 return windowscroll_setdrawrect(&window->wscr, l, t, r, b);
192 EXPORT W subjectwindow_setworkrect(subjectwindow_t *window, W l, W t, W r, W b)
194 return windowscroll_setworkrect(&window->wscr, l, t, r, b);
197 EXPORT W bbsmenuwindow_startredisp(bbsmenuwindow_t *window, RECT *r)
199 return wsta_dsp(window->wid, r, NULL);
202 EXPORT W bbsmenuwindow_endredisp(bbsmenuwindow_t *window)
204 return wend_dsp(window->wid);
207 EXPORT W bbsmenuwindow_eraseworkarea(bbsmenuwindow_t *window, RECT *r)
209 return wera_wnd(window->wid, r);
212 EXPORT W bbsmenuwindow_scrollworkarea(bbsmenuwindow_t *window, W dh, W dv)
214 return wscr_wnd(window->wid, NULL, dh, dv, W_MOVE|W_RDSET);
217 EXPORT VOID bbsmenuwindow_scrollbyvalue(bbsmenuwindow_t *window, W dh, W dv)
219 windowscroll_scrollbyvalue(&window->wscr, dh, dv);
222 EXPORT W bbsmenuwindow_requestredisp(bbsmenuwindow_t *window)
224 return wreq_dsp(window->wid);
227 EXPORT GID bbsmenuwindow_startdrag(bbsmenuwindow_t *window)
229 return wsta_drg(window->wid, 0);
232 EXPORT W bbsmenuwindow_getdrag(bbsmenuwindow_t *window, PNT *pos, WID *wid, PNT *pos_butup)
236 etype = wget_drg(pos, &window->savedwev);
237 *wid = window->savedwev.s.wid;
238 if (etype == EV_BUTUP) {
239 *pos_butup = window->savedwev.s.pos;
245 EXPORT VOID bbsmenuwindow_enddrag(bbsmenuwindow_t *window)
250 EXPORT VOID bbsmenuwindow_responsepasterequest(bbsmenuwindow_t *window, W nak, PNT *pos)
253 window->savedwev.r.r.p.rightbot.x = pos->x;
254 window->savedwev.r.r.p.rightbot.y = pos->y;
256 wrsp_evt(&window->savedwev, nak);
259 EXPORT W bbsmenuwindow_getworkrect(bbsmenuwindow_t *window, RECT *r)
261 return wget_wrk(window->wid, r);
264 EXPORT GID bbsmenuwindow_getGID(bbsmenuwindow_t *window)
266 return wget_gid(window->wid);
269 EXPORT WID bbsmenuwindow_getWID(bbsmenuwindow_t *window)
274 EXPORT W bbsmenuwindow_settitle(bbsmenuwindow_t *window, TC *title)
276 return wset_tit(window->wid, -1, title, 0);
279 EXPORT Bool bbsmenuwindow_isactive(bbsmenuwindow_t *window)
282 wid = wget_act(NULL);
283 if (window->wid == wid) {
289 EXPORT W bbsmenuwindow_setdrawrect(bbsmenuwindow_t *window, W l, W t, W r, W b)
291 return windowscroll_setdrawrect(&window->wscr, l, t, r, b);
294 EXPORT W bbsmenuwindow_setworkrect(bbsmenuwindow_t *window, W l, W t, W r, W b)
296 return windowscroll_setworkrect(&window->wscr, l, t, r, b);
299 EXPORT W subjectoptionwindow_open(subjectoptionwindow_t *window)
303 if (window->wid > 0) {
307 wid = wopn_wnd(WA_SUBW|WA_TITL|WA_HHDL, window->parent, &(window->r), NULL, 2, NULL, &window->bgpat, NULL);
309 DP_ER("wopn_wnd: subjectoption error", wid);
313 window->gid = wget_gid(wid);
315 window->tb_filter_id = copn_par(wid, window->dnum_filter, NULL);
316 if (window->tb_filter_id < 0) {
317 DP_ER("copn_par list error:", window->tb_filter_id);
319 window->ws_order_id = copn_par(wid, window->dnum_order, NULL);
320 if (window->ws_order_id < 0) {
321 DP_ER("copn_par delete error:", window->ws_order_id);
323 window->ws_orderby_id = copn_par(wid, window->dnum_orderby, NULL);
324 if (window->ws_orderby_id < 0) {
325 DP_ER("copn_par input error:", window->ws_orderby_id);
333 EXPORT VOID subjectoptionwindow_close(subjectoptionwindow_t *window)
338 if (window->wid < 0) {
343 err = wget_sts(window->wid, &stat, NULL);
347 cdel_pwd(window->wid, NOCLR);
348 wcls_wnd(window->wid, CLR);
353 EXPORT Bool subjectoptionwindow_isopen(subjectoptionwindow_t *window)
355 if (window->wid < 0) {
361 EXPORT W subjectoptionwindow_setorder(subjectoptionwindow_t *window, W order)
363 if ((order != SUBJECTOPTIONWINDOW_ORDER_ASCENDING)
364 &&(order != SUBJECTOPTIONWINDOW_ORDER_DESCENDING)) {
365 return -1; /* TODO */
367 window->order = order;
368 if (window->wid < 0) {
371 return cset_val(window->ws_order_id, 1, (W*)&order);
374 EXPORT W subjectoptionwindow_setorderby(subjectoptionwindow_t *window, W orderby)
376 if ((orderby != SUBJECTOPTIONWINDOW_ORDERBY_NUMBER)
377 &&(orderby != SUBJECTOPTIONWINDOW_ORDERBY_RES)
378 &&(orderby != SUBJECTOPTIONWINDOW_ORDERBY_SINCE)
379 &&(orderby != SUBJECTOPTIONWINDOW_ORDERBY_VIGOR)) {
380 return -1; /* TODO */
382 window->orderby = orderby;
383 if (window->wid < 0) {
386 return cset_val(window->ws_orderby_id, 1, (W*)&orderby);
389 EXPORT W subjectoptionwindow_settext(subjectoptionwindow_t *window, TC *str, W len)
393 if (len < SUBJECTOPTIONWINDOW_STRBUF_LEN) {
396 cp_len = SUBJECTOPTIONWINDOW_STRBUF_LEN;
398 memcpy(window->strbuf, str, cp_len * sizeof(TC));
399 if (window->wid < 0) {
403 return cset_val(window->tb_filter_id, cp_len, (W*)window->strbuf);
406 EXPORT W subjectoptionwindow_getorder(subjectoptionwindow_t *window)
408 return window->order;
411 EXPORT W subjectoptionwindow_getorderby(subjectoptionwindow_t *window)
413 return window->orderby;
416 EXPORT W subjectoptionwindow_gettext(subjectoptionwindow_t *window, TC *str, W len)
420 if (len < SUBJECTOPTIONWINDOW_STRBUF_LEN) {
423 cp_len = SUBJECTOPTIONWINDOW_STRBUF_LEN;
425 memcpy(str, window->strbuf, cp_len * sizeof(TC));
430 EXPORT W subjectoptionwindow_starttextboxaction(subjectoptionwindow_t *window)
432 window->tb_appended = False;
436 EXPORT W subjectoptionwindow_gettextboxaction(subjectoptionwindow_t *window, TC *key, TC **val, W *len)
441 if (window->tb_appended == True) {
442 return SUBJECTOPTIONWINDOW_GETTEXTBOXACTION_FINISH;
445 wev = &window->savedwev;
448 ret = cact_par(window->tb_filter_id, wev);
450 DP_ER("cact_par tb_filter_id error:", ret);
453 switch (ret & 0xefff) {
455 switch (wev->s.type) {
459 return SUBJECTOPTIONWINDOW_GETTEXTBOXACTION_FINISH;
461 oprc_dev(&wev->e, NULL, 0);
464 wev->s.type = EV_NULL;
467 wev->s.type = EV_NULL;
468 if ((wev->s.type == EV_KEYDWN)&&(wev->s.stat & ES_CMD)) {
469 *key = wev->e.data.key.code;
470 return SUBJECTOPTIONWINDOW_GETTEXTBOXACTION_KEYMENU;
472 return SUBJECTOPTIONWINDOW_GETTEXTBOXACTION_MENU;
473 case (0x4000|P_MOVE):
474 return SUBJECTOPTIONWINDOW_GETTEXTBOXACTION_MOVE;
475 case (0x4000|P_COPY):
476 return SUBJECTOPTIONWINDOW_GETTEXTBOXACTION_COPY;
478 len0 = cget_val(window->tb_filter_id, 128, (W*)window->strbuf);
480 return SUBJECTOPTIONWINDOW_GETTEXTBOXACTION_FINISH;
482 *val = window->strbuf;
484 window->tb_appended = True;
485 return SUBJECTOPTIONWINDOW_GETTEXTBOXACTION_APPEND;
487 return SUBJECTOPTIONWINDOW_GETTEXTBOXACTION_FINISH;
490 return SUBJECTOPTIONWINDOW_GETTEXTBOXACTION_FINISH;
492 return SUBJECTOPTIONWINDOW_GETTEXTBOXACTION_FINISH;
496 return SUBJECTOPTIONWINDOW_GETTEXTBOXACTION_FINISH;
499 EXPORT W subjectoptionwindow_endtextboxaction(subjectoptionwindow_t *window)
504 LOCAL VOID subjectoptionwindow_draw(subjectoptionwindow_t *window, RECT *r)
506 cdsp_pwd(window->wid, r, P_RDISP);
509 LOCAL VOID subjectoptionwindow_redisp(subjectoptionwindow_t *window)
513 if (wsta_dsp(window->wid, &r, NULL) == 0) {
516 wera_wnd(window->wid, &r);
517 subjectoptionwindow_draw(window, &r);
518 } while (wend_dsp(window->wid) > 0);
521 LOCAL VOID bchanlhmi_setswitchbutdnflag(bchanlhmi_t *hmi)
523 hmi->flag = hmi->flag | BCHANLHMI_FLAG_SWITCHBUTDN;
526 LOCAL VOID bchanlhmi_clearswitchbutdnflag(bchanlhmi_t *hmi)
528 hmi->flag = hmi->flag & ~BCHANLHMI_FLAG_SWITCHBUTDN;
531 LOCAL Bool bchanlhmi_issetswitchbutdnflag(bchanlhmi_t *hmi)
533 if ((hmi->flag & BCHANLHMI_FLAG_SWITCHBUTDN) == 0) {
539 LOCAL WID bchanlhmi_getsubjectWID(bchanlhmi_t *hmi)
541 if (hmi->subjectwindow == NULL) {
544 return hmi->subjectwindow->wid;
547 LOCAL WID bchanlhmi_getbbsmenuWID(bchanlhmi_t *hmi)
549 if (hmi->bbsmenuwindow == NULL) {
552 return hmi->bbsmenuwindow->wid;
555 LOCAL WID bchanlhmi_getsubjectoptionWID(bchanlhmi_t *hmi)
557 if (hmi->subjectoptionwindow == NULL) {
560 return hmi->subjectoptionwindow->wid;
563 LOCAL VOID bchanlhmi_weventrequest(bchanlhmi_t *hmi, WEVENT *wev, bchanlhmievent_t *evt)
565 WID subject_wid, bbsmenu_wid, subjectoption_wid;
567 subject_wid = bchanlhmi_getsubjectWID(hmi);
568 bbsmenu_wid = bchanlhmi_getbbsmenuWID(hmi);
569 subjectoption_wid = bchanlhmi_getsubjectoptionWID(hmi);
571 switch (wev->g.cmd) {
572 case W_REDISP: /*ºÆɽ¼¨Í×µá*/
573 if (wev->g.wid == subject_wid) {
574 evt->type = BCHANLHMIEVENT_TYPE_SUBJECT_DRAW;
575 } else if (wev->g.wid == bbsmenu_wid) {
576 evt->type = BCHANLHMIEVENT_TYPE_BBSMENU_DRAW;
577 } else if (wev->g.wid == subjectoption_wid) {
578 subjectoptionwindow_redisp(hmi->subjectoptionwindow);
581 case W_PASTE: /*Ž¹þ¤ßÍ×µá*/
582 if (wev->g.wid == subject_wid) {
583 evt->type = BCHANLHMIEVENT_TYPE_SUBJECT_PASTE;
584 memcpy(&hmi->subjectwindow->savedwev, wev, sizeof(WEVENT));
585 } else if (wev->g.wid == bbsmenu_wid) {
586 evt->type = BCHANLHMIEVENT_TYPE_BBSMENU_PASTE;
587 memcpy(&hmi->bbsmenuwindow->savedwev, wev, sizeof(WEVENT));
589 wrsp_evt(wev, 1); /*NACK*/
592 case W_DELETE: /*Êݸ½ªÎ»*/
593 wrsp_evt(wev, 0); /*ACK*/
594 if (wev->g.wid == subject_wid) {
595 evt->type = BCHANLHMIEVENT_TYPE_SUBJECT_CLOSE;
596 evt->data.subject_close.save = True;
597 } else if (wev->g.wid == bbsmenu_wid) {
598 evt->type = BCHANLHMIEVENT_TYPE_BBSMENU_CLOSE;
599 evt->data.bbsmenu_close.save = True;
600 } else if (wev->g.wid == subjectoption_wid) {
601 subjectoptionwindow_close(hmi->subjectoptionwindow);
604 case W_FINISH: /*ÇÑ´þ½ªÎ»*/
605 wrsp_evt(wev, 0); /*ACK*/
606 if (wev->g.wid == subject_wid) {
607 evt->type = BCHANLHMIEVENT_TYPE_SUBJECT_CLOSE;
608 evt->data.subject_close.save = False;
609 } else if (wev->g.wid == bbsmenu_wid) {
610 evt->type = BCHANLHMIEVENT_TYPE_BBSMENU_CLOSE;
611 evt->data.bbsmenu_close.save = False;
612 } else if (wev->g.wid == subjectoption_wid) {
613 subjectoptionwindow_close(hmi->subjectoptionwindow);
619 LOCAL VOID subjectwindow_resize(subjectwindow_t *window, SIZE *sz)
622 Bool workchange = False;
624 wget_wrk(window->wid, &work);
625 if (work.c.left != 0) {
629 if (work.c.top != 0) {
633 wset_wrk(window->wid, &work);
634 gset_vis(window->gid, work);
636 if (workchange == True) {
637 wera_wnd(window->wid, NULL);
638 wreq_dsp(window->wid);
641 sz->v = work.c.bottom - work.c.top;
642 sz->h = work.c.right - work.c.left;
645 LOCAL VOID bbsmenuwindow_resize(bbsmenuwindow_t *window, SIZE *sz)
648 Bool workchange = False;
650 wget_wrk(window->wid, &work);
651 if (work.c.left != 0) {
655 if (work.c.top != 0) {
659 wset_wrk(window->wid, &work);
660 gset_vis(window->gid, work);
662 if (workchange == True) {
663 wera_wnd(window->wid, NULL);
664 wreq_dsp(window->wid);
667 sz->v = work.c.bottom - work.c.top;
668 sz->h = work.c.right - work.c.left;
671 LOCAL VOID subjectoptionwindow_butdnwork(subjectoptionwindow_t *window, WEVENT *wev, bchanlhmievent_t *evt)
676 ret = cfnd_par(window->wid, wev->s.pos, &id);
680 if (id == window->tb_filter_id) {
681 memcpy(&window->savedwev, wev, sizeof(WEVENT));
682 evt->type = BCHANLHMIEVENT_TYPE_SUBJECTOPTION_TEXTBOX;
685 if (id == window->ws_order_id) {
686 ret = cact_par(window->ws_order_id, wev);
687 if ((ret & 0x5000) != 0x5000) {
690 window->order = ret & 0xfff;
691 evt->type = BCHANLHMIEVENT_TYPE_SUBJECTOPTION_CHANGEORDER;
692 evt->data.subjectoption_changeorder.order = window->order;
695 if (id == window->ws_orderby_id) {
696 ret = cact_par(window->ws_orderby_id, wev);
697 if ((ret & 0x5000) != 0x5000) {
700 window->orderby = ret & 0xfff;
701 evt->type = BCHANLHMIEVENT_TYPE_SUBJECTOPTION_CHANGEORDERBY;
702 evt->data.subjectoption_changeorderby.orderby = window->orderby;
707 LOCAL VOID bchanlhmi_weventbutdn(bchanlhmi_t *hmi, WEVENT *wev, bchanlhmievent_t *evt)
710 WID subject_wid, bbsmenu_wid, subjectoption_wid;
712 subject_wid = bchanlhmi_getsubjectWID(hmi);
713 bbsmenu_wid = bchanlhmi_getbbsmenuWID(hmi);
714 subjectoption_wid = bchanlhmi_getsubjectoptionWID(hmi);
716 switch (wev->s.cmd) {
718 switch (wchk_dck(wev->s.time)) {
720 if (wev->s.wid == subject_wid) {
721 evt->type = BCHANLHMIEVENT_TYPE_SUBJECT_CLOSE;
722 evt->data.subject_close.save = True; /* TODO: tmp value. */
723 } else if (wev->s.wid == bbsmenu_wid) {
724 evt->type = BCHANLHMIEVENT_TYPE_BBSMENU_CLOSE;
725 evt->data.bbsmenu_close.save = True; /* TODO: tmp value. */
726 } else if (wev->s.wid == subjectoption_wid) {
727 subjectoptionwindow_close(hmi->subjectoptionwindow);
737 if (wmov_drg(wev, NULL) > 0) {
738 if (wev->s.wid == subject_wid) {
739 evt->type = BCHANLHMIEVENT_TYPE_SUBJECT_DRAW;
740 } else if (wev->s.wid == bbsmenu_wid) {
741 evt->type = BCHANLHMIEVENT_TYPE_BBSMENU_DRAW;
742 } else if (wev->s.wid == subjectoption_wid) {
743 subjectoptionwindow_redisp(hmi->subjectoptionwindow);
751 switch (wchk_dck(wev->s.time)) {
753 i = wchg_wnd(wev->s.wid, NULL, W_MOVE);
756 i = wrsz_drg(wev, NULL, NULL);
762 if (wev->s.wid == subject_wid) {
763 evt->type = BCHANLHMIEVENT_TYPE_SUBJECT_RESIZE;
764 subjectwindow_resize(hmi->subjectwindow, &evt->data.subject_resize.work_sz);
765 windowscroll_updatebar(&hmi->subjectwindow->wscr);
767 //evt->type = BCHANLHMIEVENT_TYPE_SUBJECT_DRAW;
769 evt->data.subject_resize.needdraw = True;
771 evt->data.subject_resize.needdraw = False;
773 } else if (wev->s.wid == bbsmenu_wid) {
774 evt->type = BCHANLHMIEVENT_TYPE_BBSMENU_RESIZE;
775 bbsmenuwindow_resize(hmi->bbsmenuwindow, &evt->data.bbsmenu_resize.work_sz);
776 windowscroll_updatebar(&hmi->bbsmenuwindow->wscr);
778 //evt->type = BCHANLHMIEVENT_TYPE_BBSMENU_DRAW;
780 evt->data.bbsmenu_resize.needdraw = True;
782 evt->data.bbsmenu_resize.needdraw = False;
785 /* subject option window need not do nothing. */
788 if (wev->s.wid == subject_wid) {
789 windowscroll_weventrbar(&hmi->subjectwindow->wscr, wev);
790 } else if (wev->s.wid == bbsmenu_wid) {
791 windowscroll_weventrbar(&hmi->bbsmenuwindow->wscr, wev);
793 /* subject option window need not do nothing. */
796 if (wev->s.wid == subject_wid) {
797 windowscroll_weventbbar(&hmi->subjectwindow->wscr, wev);
798 } else if (wev->s.wid == bbsmenu_wid) {
799 windowscroll_weventbbar(&hmi->bbsmenuwindow->wscr, wev);
801 /* subject option window need not do nothing. */
804 if (wev->s.wid == subject_wid) {
805 evt->type = BCHANLHMIEVENT_TYPE_SUBJECT_BUTDN;
806 evt->data.subject_butdn.type = wchk_dck(wev->s.time);
807 evt->data.subject_butdn.pos = wev->s.pos;
808 memcpy(&hmi->subjectwindow->savedwev, wev, sizeof(WEVENT));
809 } else if (wev->s.wid == bbsmenu_wid) {
810 evt->type = BCHANLHMIEVENT_TYPE_BBSMENU_BUTDN;
811 evt->data.bbsmenu_butdn.type = wchk_dck(wev->s.time);
812 evt->data.bbsmenu_butdn.pos = wev->s.pos;
813 memcpy(&hmi->bbsmenuwindow->savedwev, wev, sizeof(WEVENT));
814 } else if (wev->s.wid == subjectoption_wid) {
815 subjectoptionwindow_butdnwork(hmi->subjectoptionwindow, wev, evt);
823 LOCAL VOID bchanlhmi_weventswitch(bchanlhmi_t *hmi, WEVENT *wev, bchanlhmievent_t *evt)
825 WID subject_wid, bbsmenu_wid;
827 subject_wid = bchanlhmi_getsubjectWID(hmi);
828 bbsmenu_wid = bchanlhmi_getbbsmenuWID(hmi);
830 if (wev->s.wid == subject_wid) {
831 evt->type = BCHANLHMIEVENT_TYPE_SUBJECT_SWITCH;
832 evt->data.subject_switch.needdraw = False;
833 } else if (wev->s.wid == bbsmenu_wid) {
834 evt->type = BCHANLHMIEVENT_TYPE_BBSMENU_SWITCH;
835 evt->data.bbsmenu_switch.needdraw = False;
837 bchanlhmi_setswitchbutdnflag(hmi);
840 LOCAL VOID bchanlhmi_weventreswitch(bchanlhmi_t *hmi, WEVENT *wev, bchanlhmievent_t *evt)
842 WID subject_wid, bbsmenu_wid, subjectoption_wid;
844 subject_wid = bchanlhmi_getsubjectWID(hmi);
845 bbsmenu_wid = bchanlhmi_getbbsmenuWID(hmi);
846 subjectoption_wid = bchanlhmi_getsubjectoptionWID(hmi);
848 if (wev->s.wid == subject_wid) {
849 evt->type = BCHANLHMIEVENT_TYPE_SUBJECT_SWITCH;
850 evt->data.subject_switch.needdraw = True;
851 } else if (wev->s.wid == bbsmenu_wid) {
852 evt->type = BCHANLHMIEVENT_TYPE_BBSMENU_SWITCH;
853 evt->data.bbsmenu_switch.needdraw = True;
854 } else if (wev->s.wid == subjectoption_wid) {
855 subjectoptionwindow_redisp(hmi->subjectoptionwindow);
857 bchanlhmi_setswitchbutdnflag(hmi);
860 LOCAL VOID bchanlhmi_receivemessage(bchanlhmi_t *hmi, bchanlhmievent_t *evt)
865 err = rcv_msg(MM_ALL, &msg, sizeof(MESSAGE), WAIT|NOCLR);
867 if (msg.msg_type == MS_TMOUT) { /* should be use other type? */
868 evt->type = BCHANLHMIEVENT_TYPE_COMMON_TIMEOUT;
869 evt->data.common_timeout.code = msg.msg_body.TMOUT.code;
872 clr_msg(MM_ALL, MM_ALL);
875 EXPORT W bchanlhmi_getevent(bchanlhmi_t *hmi, bchanlhmievent_t **evt)
878 WID subject_wid, bbsmenu_wid, subjectoption_wid;
881 subject_wid = bchanlhmi_getsubjectWID(hmi);
882 bbsmenu_wid = bchanlhmi_getbbsmenuWID(hmi);
883 subjectoption_wid = bchanlhmi_getsubjectoptionWID(hmi);
885 hmi->evt.type = BCHANLHMIEVENT_TYPE_NONE;
888 ok = bchanlhmi_issetswitchbutdnflag(hmi);
890 bchanlhmi_weventbutdn(hmi, wev0, &hmi->evt);
891 bchanlhmi_clearswitchbutdnflag(hmi);
895 wget_evt(wev0, WAIT);
896 switch (wev0->s.type) {
898 cidl_par(wev0->s.wid, &wev0->s.pos);
899 if ((wev0->s.wid != subject_wid)&&(wev0->s.wid != bbsmenu_wid)) {
900 hmi->evt.type = BCHANLHMIEVENT_TYPE_COMMON_MOUSEMOVE;
901 hmi->evt.data.common_mousemove.pos = wev0->s.pos;
902 break; /*¥¦¥£¥ó¥É¥¦³°*/
904 if (wev0->s.cmd != W_WORK)
905 break; /*ºî¶ÈÎΰ賰*/
906 if (wev0->s.stat & ES_CMD)
907 break; /*Ì¿Îᥡ¼¤¬²¡¤µ¤ì¤Æ¤¤¤ë*/
908 if (wev0->s.wid == subject_wid) {
909 hmi->evt.type = BCHANLHMIEVENT_TYPE_SUBJECT_MOUSEMOVE;
910 hmi->evt.data.subject_mousemove.pos = wev0->s.pos;
911 hmi->evt.data.subject_mousemove.stat = wev0->s.stat;
914 if (wev0->s.wid == bbsmenu_wid) {
915 hmi->evt.type = BCHANLHMIEVENT_TYPE_BBSMENU_MOUSEMOVE;
916 hmi->evt.data.bbsmenu_mousemove.pos = wev0->s.pos;
917 hmi->evt.data.bbsmenu_mousemove.stat = wev0->s.stat;
920 if (wev0->s.wid == subjectoption_wid) {
921 cidl_par(wev0->s.wid, &wev0->s.pos);
926 bchanlhmi_weventrequest(hmi, wev0, &hmi->evt);
929 bchanlhmi_weventreswitch(hmi, wev0, &hmi->evt);
932 bchanlhmi_weventswitch(hmi, wev0, &hmi->evt);
935 bchanlhmi_weventbutdn(hmi, wev0, &hmi->evt);
939 hmi->evt.type = BCHANLHMIEVENT_TYPE_COMMON_KEYDOWN;
940 hmi->evt.data.common_keydown.keycode = wev0->e.data.key.code;
941 hmi->evt.data.common_keydown.keytop = wev0->e.data.key.keytop;
942 hmi->evt.data.common_keydown.stat = wev0->e.stat;
948 oprc_dev(&wev0->e, NULL, 0);
951 bchanlhmi_receivemessage(hmi, &hmi->evt);
954 hmi->evt.type = BCHANLHMIEVENT_TYPE_COMMON_MENU;
955 hmi->evt.data.common_menu.pos = wev0->s.pos;
964 LOCAL VOID subjectwindow_scroll(VP arg, W dh, W dv)
966 subjectwindow_t *window = (subjectwindow_t*)arg;
967 (*window->scroll_callback)(window->arg, dh, dv);
970 LOCAL subjectwindow_t* subjectwindow_new(RECT *r, TC *title, PAT *bgpat, subjectwindow_scrollcalback scrollcallback, VP arg)
972 subjectwindow_t* window;
975 window = malloc(sizeof(subjectwindow_t));
976 if (window == NULL) {
980 window->wid = wopn_wnd(WA_SIZE|WA_HHDL|WA_VHDL|WA_BBAR|WA_RBAR, 0, r, NULL, 1, title, bgpat, NULL);
981 if (window->wid < 0) {
985 err = windowscroll_initialize(&window->wscr, window->wid, subjectwindow_scroll, (VP)window);
987 wcls_wnd(window->wid, CLR);
991 window->gid = wget_gid(window->wid);
992 window->scroll_callback = scrollcallback;
998 LOCAL VOID subjectwindow_delete(subjectwindow_t *window)
1000 wcls_wnd(window->wid, CLR);
1001 windowscroll_finalize(&window->wscr);
1005 EXPORT subjectwindow_t* bchanlhmi_newsubjectwindow(bchanlhmi_t *hmi, RECT *r, TC *title, PAT *bgpat, subjectwindow_scrollcalback scrollcallback, VP arg)
1007 hmi->subjectwindow = subjectwindow_new(r, title, bgpat, scrollcallback, arg);
1008 return hmi->subjectwindow;
1011 EXPORT VOID bchanlhmi_deletesubjectwindow(bchanlhmi_t *hmi, subjectwindow_t *window)
1013 subjectwindow_delete(window);
1014 hmi->subjectwindow = NULL;
1017 LOCAL VOID bbsmenuwindow_scroll(VP arg, W dh, W dv)
1019 bbsmenuwindow_t *window = (bbsmenuwindow_t*)arg;
1020 (*window->scroll_callback)(window->arg, dh, dv);
1023 LOCAL bbsmenuwindow_t* bbsmenuwindow_new(RECT *r, TC *title, PAT *bgpat, bbsmenuwindow_scrollcalback scrollcallback, VP arg)
1025 bbsmenuwindow_t* window;
1028 window = malloc(sizeof(bbsmenuwindow_t));
1029 if (window == NULL) {
1033 window->wid = wopn_wnd(WA_SIZE|WA_HHDL|WA_VHDL|WA_BBAR|WA_RBAR, 0, r, NULL, 1, title, bgpat, NULL);
1034 if (window->wid < 0) {
1038 err = windowscroll_initialize(&window->wscr, window->wid, bbsmenuwindow_scroll, (VP)window);
1040 wcls_wnd(window->wid, CLR);
1044 window->gid = wget_gid(window->wid);
1045 window->scroll_callback = scrollcallback;
1051 LOCAL VOID bbsmenuwindow_delete(bbsmenuwindow_t *window)
1053 wcls_wnd(window->wid, CLR);
1054 windowscroll_finalize(&window->wscr);
1058 EXPORT bbsmenuwindow_t* bchanlhmi_newbbsmenuwindow(bchanlhmi_t *hmi, RECT *r, TC *title, PAT *bgpat, bbsmenuwindow_scrollcalback scrollcallback, VP arg)
1060 hmi->bbsmenuwindow = bbsmenuwindow_new(r, title, bgpat, scrollcallback, arg);
1061 return hmi->bbsmenuwindow;
1064 EXPORT VOID bchanlhmi_deletebbsmenuwindow(bchanlhmi_t *hmi, bbsmenuwindow_t *window)
1066 bbsmenuwindow_delete(window);
1067 hmi->bbsmenuwindow = NULL;
1070 LOCAL subjectoptionwindow_t* subjectoptionwindow_new(PNT *p, WID parent, W dnum_filter, W dnum_order, W dnum_orderby)
1072 subjectoptionwindow_t *window;
1075 window = (subjectoptionwindow_t*)malloc(sizeof(subjectoptionwindow_t));
1076 if (window == NULL) {
1077 DP_ER("malloc error:", 0);
1082 window->parent = parent;
1083 window->r.p.lefttop = *p;
1084 window->r.p.rightbot.x = p->x + 8+360+8+80+8 + 7;
1085 window->r.p.rightbot.y = p->y + 8+24+16+70+8 + 7;
1086 err = wget_inf(WI_PANELBACK, &window->bgpat, sizeof(PAT));
1087 if (err != sizeof(PAT)) {
1088 DP_ER("wget_inf error:", err);
1089 window->bgpat.spat.kind = 0;
1090 window->bgpat.spat.hsize = 16;
1091 window->bgpat.spat.vsize = 16;
1092 window->bgpat.spat.fgcol = 0x10ffffff;
1093 window->bgpat.spat.bgcol = 0;
1094 window->bgpat.spat.mask = FILL100;
1096 window->dnum_filter = dnum_filter;
1097 window->dnum_order = dnum_order;
1098 window->dnum_orderby = dnum_orderby;
1099 window->tb_filter_id = -1;
1100 window->ws_order_id = -1;
1101 window->ws_orderby_id = -1;
1102 window->order = SUBJECTOPTIONWINDOW_ORDER_ASCENDING;
1103 window->orderby = SUBJECTOPTIONWINDOW_ORDERBY_NUMBER;
1104 memset(window->strbuf, 0, sizeof(TC)*SUBJECTOPTIONWINDOW_STRBUF_LEN);
1109 LOCAL VOID subjectoptionwindow_delete(subjectoptionwindow_t *window)
1111 if (window->wid > 0) {
1112 cdel_pwd(window->wid, NOCLR);
1113 wcls_wnd(window->wid, CLR);
1118 EXPORT subjectoptionwindow_t *bchanlhmi_newsubjectoptionwindow(bchanlhmi_t *hmi, PNT *p, W dnum_filter, W dnum_order, W dnum_orderby)
1121 subject_wid = bchanlhmi_getsubjectWID(hmi);
1122 if (subject_wid < 0) {
1123 DP_ER("subject window not exist", 0);
1126 hmi->subjectoptionwindow = subjectoptionwindow_new(p, subject_wid, dnum_filter, dnum_order, dnum_orderby);
1127 return hmi->subjectoptionwindow;
1130 EXPORT VOID bchanlhmi_deletesubjectoptionwindow(bchanlhmi_t *hmi, subjectoptionwindow_t *window)
1132 subjectoptionwindow_delete(window);
1133 hmi->subjectoptionwindow = NULL;
1136 EXPORT bchanlhmi_t* bchanlhmi_new()
1140 hmi = (bchanlhmi_t *)malloc(sizeof(bchanlhmi_t));
1144 hmi->subjectwindow = NULL;
1145 hmi->bbsmenuwindow = NULL;
1146 hmi->subjectoptionwindow = NULL;
1151 EXPORT VOID bchanlhmi_delete(bchanlhmi_t *hmi)
1153 if (hmi->subjectoptionwindow != NULL) {
1154 subjectoptionwindow_delete(hmi->subjectoptionwindow);
1156 if (hmi->bbsmenuwindow != NULL) {
1157 bbsmenuwindow_delete(hmi->bbsmenuwindow);
1159 if (hmi->subjectwindow != NULL) {
1160 subjectwindow_delete(hmi->subjectwindow);