static char rcsid[] = "@(#)$Id: partial.c,v 1.22 2006/05/09 17:45:01 hurtta Exp $"; /****************************************************************************** * The Elm (ME+) Mail System - $Revision: 1.22 $ $State: Exp $ * * Author: Kari Hurtta * (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_partial_menu; #endif static int sb_partial_menu P_((struct menu_context *ptr, struct menu_param *list)); static int sb_partial_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, ElmLevel0PartLine2, "d)elete or u)ndelete mail, m)ail a message, r)eply mail, return to i)ndex")); menu_print_format_center(ptr,2, CATGETS(elm_msg_cat, ElmSet, ElmLevel0PartLine3, "To read a message, press . j = move down, k = move up")); } else { menu_print_format_center(ptr,0, CATGETS(elm_msg_cat, ElmSet, ElmLevel1MenuLine1, "|=pipe, !=shell, ?=help, =set current to n, /=search pattern")); menu_print_format_center(ptr,1, CATGETS(elm_msg_cat, ElmSet, ElmLevel1PartLine2, "a)lias, C)opy, d)elete, f)orward, g)roup reply, m)ail,")); menu_print_format_center(ptr,2, CATGETS(elm_msg_cat, ElmSet, ElmLevel1PartLine3, "n)ext, o)ptions, P)rint text, r)eply, s)ave, t)ag, or i)index")); } return 1; } static int showmsg_partial_cmd P_(( struct MailboxView *mailbox, int cmd, struct pager_page *pager_page)); static int showmsg_partial_cmd(mailbox,cmd,pager_page) struct MailboxView *mailbox; int cmd; struct pager_page *pager_page; { struct menu_common MENU; set_mcommon_from_mbxview(&MENU,mailbox); switch (cmd) { case '|' : { int current = get_current(mailbox); put_cmd_name(pager_page, TRUE, CATGETS(elm_msg_cat, ElmSet, ElmPipe, "Pipe")); if (give_message_data(mailbox,current-1, NULL,NULL,NULL, NO_mime_parse)) do_pipe(mailbox, pager_page->root, pager_page->prompt_area); else { DPRINT(Debug,3,(&Debug, "give_message_data [%d] fails",current-1)); } } break; } 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_partial_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_partial_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); } } static void partial_loop P_((struct MailboxView *mailbox, struct AliasView *aview, int *needresort)); static void partial_loop(mailbox, aview, needresort) struct MailboxView *mailbox; struct AliasView *aview; int *needresort; { int leave = 0; 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 } }; int LINES, COLUMNS; mp_list_set_mcommon(PARAM,elm_mp_menu,&MENU); menu_get_sizes(page,&LINES, &COLUMNS); 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; menu_set_default(page); if (menu_resized(page)) { set_mailbox_screen(page,&LOC,PARAM); menu_get_sizes(page,&LINES, &COLUMNS); menu_trigger_redraw(page); } new_mail_check(mailbox, page, &LOC); 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); /* parent needs alos resorting */ *needresort = 1; } if (menu_need_redraw(page)) showscreen(page); check_mailbox_screen(&LOC, PARAM); { int lin,col; 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); 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_partial_cmd, aview, page); switch (ch) { case 0: /* OK */ break; case '|' : { int current = get_current(mailbox); menu_Writechar(LOC.prompt_page, '|'); if (current < 1) { lib_error(CATGETS(elm_msg_cat, ElmSet, ElmNoMailToPipe, "No mail to pipe!")); } else if (give_message_data(mailbox,current-1, NULL,NULL,NULL,NO_mime_parse)) { /* softkeys_off(); */ do_pipe(mailbox, page,LOC.prompt_page); /* softkeys_on(); */ } else { DPRINT(Debug,3,(&Debug, "give_message_data [%d] fails",current-1)); } } 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 ctrl('Q') : case 'q': case 'Q': case 'i': case 'x': case 'X': menu_Write_to_screen(LOC.prompt_page, CATGETS(elm_msg_cat, ElmSet, ElmReturnIndex, "Return to index")); FlushBuffer(); leave = 1; break; case 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); } void ViewPartial(parent_mailbox, aview,parent_page) struct MailboxView *parent_mailbox; struct AliasView *aview; struct menu_context *parent_page; { struct MailboxView *new_mailbox = NULL; int need_resort = 0; new_mailbox = partial_to_mailbox_view(parent_mailbox); if (new_mailbox) { if (get_message_count(new_mailbox) > 0) { set_current(new_mailbox,1); /* Set current to first message */ update_view(new_mailbox); } partial_loop(new_mailbox, aview, &need_resort); free_mailbox(& new_mailbox); /* If there is new messages arrived when running on partial_loop() parent mailbox is not sorted However, because partial collection mode uses original mailbox, update_view() status of parent mailbox is reset, so we need do resorting on here.... This is also 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; } int have_partial(parent_mailbox) struct MailboxView *parent_mailbox; { int mc = get_message_count(parent_mailbox); int i; for (i = 0; i < mc; i++) { struct header_rec * hdr = give_header(parent_mailbox,i); int z; if (hdr && (hdr->partial_len || (hdr->status & MIME_MESSAGE) && (z = get_type_flags(hdr->mime_rec.TYPE)) && ( z & MIME_PARTIAL))) { DPRINT(Debug,4,(&Debug, "have_partial=1 (message %d)\n", i+1)); return 1; } } DPRINT(Debug,9,(&Debug, "have_partial=0 (message %d)\n")); return 0; } /* * Local Variables: * mode:c * c-basic-offset:4 * buffer-file-coding-system: iso-8859-1 * End: */