static char rcsid[] = "@(#)$Id: header.c,v 1.6 2006/04/09 07:37:37 hurtta Exp $"; /****************************************************************************** * The Elm (ME+) Mail System - $Revision: 1.6 $ $State: Exp $ * * Author: Kari Hurtta *****************************************************************************/ #include "def_screen.h" #include "def_scommon.h" DEBUG_VAR(Debug,__FILE__,"screen"); #define MENU_HEADER_magic 0xF804 struct menu_header { struct subpage_common c; unsigned short magic; /* MENU_HEADER_magic */ int params[HEADER_PARAMS_COUNT]; header_line_redraw * line_redraw; header_line_redraw * current_redraw; header_param_changed * param_change; header_line_redraw * status_redraw; }; #if ANSI_C #define S_(x) static x; #else #define S_(x) #endif S_(w_menu_init mheader_init) static void mheader_init P_((struct menu_context *ctx)); static void mheader_init(ctx) struct menu_context *ctx; { int i; DPRINT(Debug,10, (&Debug, "mheader_init: %p\n", ctx)); ctx->u.header = safe_malloc (sizeof (* ctx->u.header)); /* bzero is defined hdrs/defs.h */ bzero((void *)ctx->u.header,sizeof (* ctx->u.header)); scommon_zero(&(ctx->u.header->c)); ctx->u.header->magic = MENU_HEADER_magic; for (i = 0; i < HEADER_PARAMS_COUNT; i++) ctx->u.header->params[i] = 0; ctx->u.header->line_redraw = header_line_noredraw; ctx->u.header->current_redraw = header_line_noredraw; ctx->u.header->param_change = null_header_param_changed; ctx->u.header->status_redraw = header_line_noredraw; } S_(w_menu_free mheader_free) static void mheader_free P_((struct menu_context *ctx)); static void mheader_free(ctx) struct menu_context *ctx; { DPRINT(Debug,10, (&Debug, "mheader_free: %p\n", ctx)); if (MENU_HEADER_magic != ctx->u.header->magic) panic("SCREEN PANIC",__FILE__,__LINE__,"subpage_free", "Bad magic number",0); scommon_clear( & (ctx->u.header->c) ); ctx->u.header->magic = 0; /* Invalidate */ free(ctx->u.header); ctx->u.header = NULL; } static void header_change_current P_((struct menu_context *ctx, int old_value)); static void header_change_current(ctx,old_value) struct menu_context *ctx; int old_value; { int current = ctx->u.header->params[header_current]; int top = ctx->u.header->params[header_top_line]; int i; i = old_value - top; if (i >= 0 && i < ctx->lines) ctx->u.header->current_redraw(ctx, ctx->u.header->c.param_ptr, i, old_value, 0); i = current - top; if (i >= 0 && i < ctx->lines) ctx->u.header->current_redraw(ctx, ctx->u.header->c.param_ptr, i, current, 1); } S_(w_menu_do_redraw mheader_do_redraw) static int mheader_do_redraw P_((struct menu_context *ctx)); static int mheader_do_redraw(ctx) struct menu_context *ctx; { int current, line,i; if (MENU_HEADER_magic != ctx->u.header->magic) panic("SCREEN PANIC",__FILE__,__LINE__,"header_do_redraw", "Bad magic number",0); current = ctx->u.header->params[header_current]; line = ctx->u.header->params[header_top_line]; for (i = 0; i < ctx->lines; i++) { ctx->u.header->line_redraw(ctx, ctx->u.header->c.param_ptr, i, line, line == current); line++; } return 1; } static struct menu_draw_routine HEADER_ROUTINES = { MENU_DRAW_magic, mheader_init, mheader_free, scommon_Writechar, scommon_PutLineS, scommon_PutLine0, scommon_CleartoEOLN, scommon_CleartoEOS, scommon_ReadCh2, scommon_ScreenSize, scommon_GetXYLocation, scommon_ClearScreen, scommon_MoveCursor, scommon_changemode, scommon_SyncEnter, scommon_SyncLeave, scommon_resized, scommon_calculate_line, scommon_get_linelimit, scommon_reset_redraw, mheader_do_redraw, }; void header_line_noredraw(ptr,list,line_number,index,is_current) struct menu_context *ptr; struct menu_param *list; int line_number; int index; int is_current; { return; } void null_header_param_changed(ptr,list,param_index) struct menu_context *ptr; struct menu_param *list; int param_index; { return; } struct menu_context * new_menu_header(parent,rel_start_line,lines, line_redraw,current_redraw, param_change,status_redraw,list) struct menu_context *parent; int rel_start_line; int lines; header_line_redraw line_redraw; header_line_redraw current_redraw; header_param_changed param_change; header_line_redraw status_redraw; /* only rereference is saved */ struct menu_param *list; { int rline = 0; int lline = 0; struct menu_context *ret = new_menu_type(&HEADER_ROUTINES); if (MENU_CONTEXT_magic != parent->magic) panic("SCREEN PANIC",__FILE__,__LINE__,"new_menu_header", "Bad parent magic number",0); ret->lines = lines; ret->columns = parent->columns; ret->u.header->c.rel_start_line = rel_start_line; ret->u.header->c.param_ptr = list; ret->u.header->line_redraw = line_redraw; ret->u.header->current_redraw = current_redraw; ret->u.header->param_change = param_change; ret->u.header->status_redraw = status_redraw; if (MENU_DRAW_magic != parent->routine->magic) panic("SCREEN PANIC",__FILE__,__LINE__,"new_menu_header", "Bad parent draw magic number",0); parent->routine->wra_calculate_line(parent,rel_start_line,&rline); lline = rline + lines -1; /* calculate_printing_area() fixes */ attach_subpage(parent,ret,rline,lline); calculate_printing_area(ret); return ret; } void menu_header_change(subpage,param,value) struct menu_context *subpage; enum header_params param; int value; { int old_value; if (&HEADER_ROUTINES != subpage->routine) panic("SCREEN PANIC",__FILE__,__LINE__,"menu_header_change", "Not a header subpage",0); if (MENU_HEADER_magic != subpage->u.header->magic) panic("SCREEN PANIC",__FILE__,__LINE__,"menu_header_change", "Bad magic number",0); if (param < 0 || param >= HEADER_PARAMS_COUNT) panic("SCREEN PANIC",__FILE__,__LINE__,"menu_header_change", "Bad param number",0); old_value = subpage->u.header->params[param]; subpage->u.header->params[param] = value; switch (param) { case header_top_line: if (value != old_value) menu_trigger_redraw(subpage); break; case header_current: if (value != old_value) header_change_current(subpage,old_value); break; } } int menu_header_get(subpage,param) struct menu_context *subpage; enum header_params param; { if (&HEADER_ROUTINES != subpage->routine) panic("SCREEN PANIC",__FILE__,__LINE__,"menu_header_get", "Not a header subpage",0); if (MENU_HEADER_magic != subpage->u.header->magic) panic("SCREEN PANIC",__FILE__,__LINE__,"menu_header_get", "Bad magic number",0); if (param < 0 || param >= HEADER_PARAMS_COUNT) panic("SCREEN PANIC",__FILE__,__LINE__,"menu_header_get", "Bad param number",0); return subpage->u.header->params[param]; } void menu_header_relocate(subpage,parent,rel_start_line,lines) struct menu_context *subpage; struct menu_context *parent; int rel_start_line; int lines; { if (&HEADER_ROUTINES != subpage->routine) panic("SCREEN PANIC",__FILE__,__LINE__,"menu_header_relocate", "Not a header subpage",0); scommon_relocate(subpage,parent,rel_start_line,lines); } void menu_header_status_update(subpage,item) struct menu_context *subpage; int item; { int i, current, top; if (&HEADER_ROUTINES != subpage->routine) panic("SCREEN PANIC",__FILE__,__LINE__,"menu_header_status_update", "Not a header subpage",0); if (MENU_HEADER_magic != subpage->u.header->magic) panic("SCREEN PANIC",__FILE__,__LINE__,"menu_header_status_update", "Bad magic number",0); current = subpage->u.header->params[header_current]; top = subpage->u.header->params[header_top_line]; i = item - top; if (i >= 0 && i < subpage->lines) { DPRINT(Debug,11, (&Debug, "menu_header_status_update(%p,%d): current=%d, top=%d => i=%d\n", subpage,item,current,top,i)); subpage->u.header->status_redraw(subpage, subpage->u.header->c.param_ptr, i, item, current == item); } else { DPRINT(Debug,11, (&Debug, "menu_header_status_update(%p,%d): current=%d, top=%d => i=%d (OUT OF RANGE), lines=%d\n", subpage,item,current,top,i,subpage->lines)); } } /* * Local Variables: * mode:c * c-basic-offset:4 * buffer-file-coding-system: iso-8859-1 * End: */