static char rcsid[] = "@(#)$Id: digest.c,v 1.23 2006/04/13 16:35:40 hurtta Exp $";

/******************************************************************************
 *  The Elm (ME+) Mail System  -  $Revision: 1.23 $   $State: Exp $
 *
 *  Author: Kari Hurtta <hurtta+elm@posti.FMI.FI> (was hurtta+elm@ozone.FMI.FI)
 ******************************************************************************
 * This routine mimics some routines from src/file.c and src/elm.c.
 * That code was following copyright:
 *
 *  The Elm Mail System 
 *
 *			Copyright (c) 1988-1992 USENET Community Trust
 *			Copyright (c) 1986,1987 Dave Taylor
 *****************************************************************************/

#include "def_elm.h"
#include "s_elm.h"

DEBUG_VAR(Debug,__FILE__,"ELM");

#if ANSI_C
static subpage_simple_redraw sb_digest_menu;
#endif
static int sb_digest_menu P_((struct menu_context  *ptr,
			      struct menu_param *list));
static int sb_digest_menu(ptr,list)
     struct menu_context  *ptr;
     struct menu_param *list;
{
    struct menu_common *mptr = mp_lookup_mcommon(list,elm_mp_menu);
    int ul = give_dt_enumerate_as_int(&user_level);

    menu_ClearScreen(ptr);

    if (ul == 0) {	/* a rank beginner.  Give less options  */
	menu_print_format_center(ptr,0, 
				 CATGETS(elm_msg_cat, ElmSet, 
					 ElmLevel0MenuLine1,
					 "You can use any of the following commands by pressing the first character;"));
	menu_print_format_center(ptr,1, 
				 CATGETS(elm_msg_cat, ElmSet, 
					 ElmLevel0DgtLine2,
					 "m)ail a message,  r)eply or f)orward mail,  return to i)ndex"));
	menu_print_format_center(ptr,2, 
				 CATGETS(elm_msg_cat, ElmSet, 
					 ElmLevel0DgtLine3,
					 "To read a message, press <return>.  j = move down, k = move up"));
    } else {
	menu_print_format_center(ptr,0,
				 CATGETS(elm_msg_cat, ElmSet, 
					 ElmLevel1MenuLine1,
					 "|=pipe, !=shell, ?=help, <n>=set current to n, /=search pattern"));
        menu_print_format_center(ptr,1, 
				 CATGETS(elm_msg_cat, ElmSet, 
					 ElmLevel1DgtLine2,
					 "a)lias, C)opy, f)orward, g)roup reply, m)ail,"));
	menu_print_format_center(ptr,2, 
				 CATGETS(elm_msg_cat, ElmSet, 
					 ElmLevel1DgtLine3,
					 "n)ext, o)ptions, P)rint text, r)eply, s)ave, t)ag, or i)index"));
    }
    
    return 1;
}

static int showmsg_digest_cmd P_((     struct MailboxView *mailbox,
				       int cmd, 
				       struct pager_page *pager_page));
static int showmsg_digest_cmd(mailbox,cmd,pager_page)
     struct MailboxView *mailbox;
     int cmd; 
     struct pager_page *pager_page;
{
    return cmd;
}



static void set_mailbox_screen P_((struct menu_context  *page, 
				   struct screen_parts *LOC,
				   struct menu_param   *LIST));
static void set_mailbox_screen(page,LOC, LIST)
     struct menu_context  *page;
     struct screen_parts  *LOC;
     struct menu_param    *LIST;
{    
    int   LINES, COLUMNS;	

    menu_get_sizes(page,&LINES, &COLUMNS);
    
    /* 1)  Title part of screen */

    if (! LOC->title_page)
	LOC->title_page = new_menu_subpage(page,0,4,sb_update_title,LIST);
    else
	menu_subpage_relocate(LOC->title_page,page,0,4);

    /* 2) menu part */

    if (LOC->menu_page)
	menu_subpage_relocate(LOC->menu_page,page,LINES-8,4);
    else if (mini_menu)
	LOC->menu_page = new_menu_subpage(page,LINES-8,4,
					  sb_digest_menu,LIST);
   
    mailbox_screen_common(page,LOC, LIST);	
}


static void check_mailbox_screen P_((struct screen_parts *LOC,
    				     struct menu_param *list));
static void check_mailbox_screen(LOC,list)
     struct screen_parts *LOC;
     struct menu_param *list;
{
    if (menu_resized(LOC->title_page)) {
	DPRINT(Debug,1, (&Debug, "title page resized\n"));

    }
    if (menu_need_redraw(LOC->title_page)) {
	DPRINT(Debug,1, (&Debug, "title page redraw???\n"));
	sb_update_title(LOC->title_page,list);
    }

    if (LOC->menu_page) {
	/* 2) menu page */
	if (menu_resized(LOC->menu_page)) {
	    DPRINT(Debug,1, (&Debug, "menu page resized\n"));
	    
	}
	if (menu_need_redraw(LOC->menu_page)) {
	    DPRINT(Debug,1, (&Debug, "menu page redraw???\n"));
	    sb_digest_menu(LOC->menu_page,list);
	}
    }

    /* 3) prompt part */
    if (menu_resized(LOC->prompt_page)) {
	DPRINT(Debug,1, (&Debug, "prompt page resized\n"));
    }
    if (menu_need_redraw(LOC->prompt_page)) {
	menu_ClearScreen(LOC->prompt_page);

	show_last_error();	/* for those operations that have to
				 * clear the footer except for a message.
				 */
    }    

    /* 4) headers part */
    if (menu_resized(LOC->header_page)) {
	DPRINT(Debug,1, (&Debug, "header page resized\n"));
    }
    if (menu_need_redraw(LOC->header_page)) {
	DPRINT(Debug,1, (&Debug, "header page redraw\n"));
	menu_ClearScreen(LOC->header_page);
    }
}

/* Return 'i' if to should return to i)ndex */
static int digest_loop P_((struct MailboxView *mailbox,
			   struct AliasView *aview,
			   int *needresort));
static int digest_loop(mailbox, aview, needresort)
     struct MailboxView *mailbox;
     struct AliasView *aview;
     int *needresort;
{
    int retch = '\0';
    int leave = 0;
    int auto_assemble = 1;

    struct menu_context  *page = new_menu_context();
    struct screen_parts LOC = { NULL };
    struct menu_common MENU;
    struct menu_param  PARAM[elm_mp_COUNT+1] = { 
	{ mp_menu_common, 0 },
	{ mp_integer, 0 },
	{ mp_END,0 }
    };

    mp_list_set_mcommon(PARAM,elm_mp_menu,&MENU);

    set_mcommon_from_mbxview(&MENU,mailbox);
    set_mailbox_screen(page,&LOC,PARAM);

    resort_mailbox(mailbox,1);
    get_page(&MENU, LOC.header_page);  /* resort_mailbox no longer call get_page() */
    copy_current(&MENU,LOC.header_page);
    
    showscreen(page);

    while (!leave) {
	int ch;
	int   LINES, COLUMNS;	

	menu_set_default(page);

	menu_get_sizes(page,&LINES, &COLUMNS);

	set_mcommon_from_mbxview(&MENU,mailbox);

	if (menu_resized(page)) {
	    
	    set_mailbox_screen(page,&LOC,PARAM);

	    menu_get_sizes(page,&LINES, &COLUMNS);

	    menu_trigger_redraw(page);
	} 

	if (update_view(mailbox)) {
	    resort_mailbox(mailbox,1);
	    get_page(&MENU, LOC.header_page);  /* resort_mailbox no longer call get_page() */
	    menu_trigger_redraw(LOC.header_page);
	    menu_trigger_redraw(LOC.title_page);	
	}

	if (menu_need_redraw(page)) 
	    showscreen(page);
	check_mailbox_screen(&LOC, PARAM);
	
	{   
	    int lin,col;
	    int fh = give_dt_enumerate_as_int(&fragment_handling);

	    menu_PutLineX(LOC.prompt_page,0,0,
			  FRM("%S"),mcommon_give_item(&MENU, m_Prompt));
	    menu_GetXYLocation(LOC.prompt_page,&lin,&col);

	    menu_CleartoEOLN(LOC.prompt_page);

	    if (auto_assemble && 2 == fh &&
		have_partial(mailbox)) {
		ch = 'A';
		auto_assemble = 0;
		
		DPRINT(Debug,4,(&Debug,"Automatic assemble ... \n"));
	    } else
		ch = GetPrompt(LOC.prompt_page);
	
	    menu_CleartoEOS(LOC.prompt_page);

	    if (isascii(ch) && isprint(ch)) {
		DPRINT(Debug,4,(&Debug, 
				"\nCommand: %c [%d]\n\n", ch, ch));
	    } else {
		DPRINT(Debug,4,(&Debug, 
				"\nCommand: %d\n\n", ch));
	    }
	    
	    set_error("");	/* clear error buffer */
	
	    menu_MoveCursor(LOC.prompt_page,lin,col);
	}	

	ch = mailbox_command(mailbox,ch, &LOC,
			     showmsg_digest_cmd, aview,
			     page);


	switch (ch) {
	case 0:  /* OK */
	    break;

	case 'A': {
	    int current = get_current(mailbox);


	    menu_Write_to_screen(LOC.prompt_page,
				 CATGETS(elm_msg_cat, 
					     ElmSet, ElmAssemble,
					     "Assemble message fragments"));
	    FlushBuffer();
	    sleep_message();

	    ViewPartial(mailbox,aview,page);
	    
	    get_page(&MENU, LOC.header_page);
	}
	    break;

 	case 'o'    :  {
 	    int current = get_current(mailbox);
 	    int i;
	    
	    *needresort = 1;

 	    menu_Write_to_screen(LOC.prompt_page,
 				 CATGETS(elm_msg_cat, ElmSet,
					 ElmOptions,
 					 "Options"));
 	    if((i=options(mailbox, aview)) > 0) {
 		current = get_current(mailbox);
 		get_page(&MENU, LOC.header_page);
 	    } else if(i < 0)
 		goto OUT;
 	    
	    menu_trigger_redraw(page);	/* always fix screen... */
 	}
	    break;
 
	case 'i':
	    retch = 'i';
	    menu_Write_to_screen(LOC.prompt_page,
				 CATGETS(elm_msg_cat, ElmSet,
					 ElmReturnIndex,
					 "Return to index"));  
	    FlushBuffer();
	    /* FALLTHRU */
	case ctrl('Q') :
	case 'q':
	case 'Q':
	case 'x':
	case 'X':

	    leave = 1;

	    break;
	case EOF:
	    retch = EOF;
	    goto OUT;

	default:
	    lib_error(CATGETS(elm_msg_cat, ElmSet,
			      ElmUnknownCommand2,			
			      "Unknown command."));

	}
	
	if (menu_need_redraw(page))
	    showscreen(page);
	
	check_range(&MENU,&LOC);
	check_mailbox_screen(&LOC,PARAM);
	
    } /* the BIG while loop! */

 OUT:
    free_mailbox_screen(&LOC);
    erase_menu_context(&page);

    return retch;
}

int ViewDigest(parent_mailbox, aview, parent_page)
     struct MailboxView *parent_mailbox;
     struct AliasView *aview;
     struct menu_context  *parent_page;
{
    int retch = '0';
    int tagged = 0;
    int mc,i;
    struct MailboxView *new_mailbox = NULL;
    int current = get_current(parent_mailbox);

    mc = get_message_count(parent_mailbox);
    for (i=0; i < mc; i++) {
	if (ison_status_message(parent_mailbox,i,status_basic,TAGGED)) {
	    tagged++;
	}
    }

    if (tagged == 0) {
	tagged = 1;
	setf_status_message(parent_mailbox,current-1,status_basic,TAGGED);
    }

    mc = get_message_count(parent_mailbox);
    for (i=0; i < mc; i++) {	/* get each tagged msg */
	if (ison_status_message(parent_mailbox,i,status_basic,TAGGED)) {
	    struct header_rec * hdr;
	    FILE *F;

	    clearf_status_message(parent_mailbox,i,status_basic,
				  TAGGED);

	    if (give_message_data(parent_mailbox,i,
				  &hdr,&F,NULL,
				  mime_parse_routine)) {
		if (new_mailbox)
		    add_digest(new_mailbox,
			       & hdr->mime_rec,
			       hdr->received_time,
			       hdr->env_from,
			       F,
			       hdr->header_charset);
		else
		    new_mailbox = 
			digest_to_mailbox_view(& hdr->mime_rec,
					       hdr->received_time,
					       hdr->env_from,
					       F,
					       hdr->header_charset);
	    }

	}
    }

    if (new_mailbox) {
	int need_resort = 0;
 
	if (get_message_count(new_mailbox) > 0) {
	    set_current(new_mailbox,1);   /* Set current to first message */

	    update_view(new_mailbox);
	}

	retch = digest_loop(new_mailbox, aview, &need_resort);

	free_mailbox(& new_mailbox);
    

	/* This is needed if sort order is changed on o)ptions menu */
	if (need_resort)
	    resort_mailbox(parent_mailbox,1);

	menu_trigger_redraw(parent_page);
	
	/* Force default return to parent page ... */
	menu_set_default(parent_page); 
    }

    return retch;
}

/*
 * Local Variables:
 *  mode:c
 *  c-basic-offset:4
 *  buffer-file-coding-system: iso-8859-1
 * End:
 */



syntax highlighted by Code2HTML, v. 0.9.1