static char rcsid[] = "@(#)$Id: canceled.c,v 1.14 2006/04/09 07:37:19 hurtta Exp $";
/******************************************************************************
* The Elm (ME+) Mail System - $Revision: 1.14 $ $State: Exp $
*
* Author: Kari Hurtta <hurtta+elm@posti.FMI.FI>
****************************************************************************
* Some code copiend from src/elm.c and src/leavembox.c.
* On these are 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_cancel_menu;
#endif
static int sb_cancel_menu P_((struct menu_context *ptr,
struct menu_param *list));
static int sb_cancel_menu(ptr,list)
struct menu_context *ptr;
struct menu_param *list;
{
struct menu_common *mptr = mp_lookup_mcommon(list,elm_mp_menu);
menu_ClearScreen(ptr);
menu_print_format_center(ptr,0,
CATGETS(elm_msg_cat, ElmSet,
ElmCancelMenuLine1,
"To select canceled message for mailing, press <return>."));
menu_print_format_center(ptr,1,
CATGETS(elm_msg_cat, ElmSet,
ElmCancelMenuLine2,
"To read message, press space. j = move down, k = move up"));
menu_print_format_center(ptr,2,
CATGETS(elm_msg_cat, ElmSet,
ElmCancelMenuLine3,
"Also available: d)elete, u)ndelete, i)ndex"));
return 1;
}
static int showmsg_cancel_cmd P_(( struct MailboxView *mailbox,
int cmd,
struct pager_page *pager_page));
static int showmsg_cancel_cmd(mailbox,cmd,pager_page)
struct MailboxView *mailbox;
int cmd;
struct pager_page *pager_page;
{
return cmd;
}
/* This leaks on exit */
char * last_canceled_mail = NULL;
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_cancel_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_cancel_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);
}
}
int view_canceled_mails(cancel_view,cancel_selection,aview)
struct MailboxView * cancel_view;
int *cancel_selection;
struct AliasView *aview;
{
int leave = 0;
int can_flag = 0;
int i;
struct menu_context *page = new_menu_context();
struct screen_parts LOC = { NULL, NULL, 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;
set_mcommon_from_mbxview(&MENU,cancel_view);
mp_list_set_mcommon(PARAM,elm_mp_menu,&MENU);
set_mailbox_screen(page,&LOC,PARAM);
if (get_message_count(cancel_view) > 0) {
if (! last_canceled_mail ||
! cancel_set_current(cancel_view,last_canceled_mail))
set_current(cancel_view,1); /* Set current to first message */
copy_current(&MENU,LOC.header_page);
update_view(cancel_view);
resort_mailbox(cancel_view,1);
get_page(&MENU, LOC.header_page); /* resort_mailbox no longer call get_page() */
}
start_again:
leave = 0;
menu_get_sizes(page,&LINES, &COLUMNS);
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(cancel_view, page, &LOC);
if (update_view(cancel_view)) {
resort_mailbox(cancel_view,1);
/* resort_mailbox no longer call get_page() */
get_page(&MENU, LOC.header_page);
menu_trigger_redraw(LOC.header_page);
}
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 = motion(ch,&MENU,&LOC,
page);
switch (ch) {
case 0: /* OK */
break;
quit_mark:
case ctrl('Q') :
case 'Q':
case 'X':
leave = -2;
break;
case 'q':
case 'i':
leave = 1;
break;
case '$':
menu_Write_to_screen(LOC.prompt_page,
CATGETS(elm_msg_cat, ElmSet,
ElmResyncFolder,
"Resynchronize folder"));
FlushBuffer();
leave = -1;
break;
case ' ': /* Copied from mailbox_command */ {
int current = get_current(cancel_view);
menu_Write_to_screen(LOC.prompt_page,
CATGETS(elm_msg_cat, ElmSet,
ElmDisplayMessage,
"Display message"));
FlushBuffer();
if (current < 1)
lib_error(CATGETS(elm_msg_cat, ElmSet,
ElmNoMailToRead,
"No mail to read!"));
else {
int x = show_message_normal(cancel_view,showmsg_cancel_cmd,
aview,page,LOC.header_page);
switch (x) {
case EOF:
goto eof_mark;
case 'X': /* Quick Exit */
goto quit_mark;
}
current = get_current(cancel_view);
}
}
break;
case ctrl('J'):
case ctrl('M'): {
int current = get_current(cancel_view);
menu_Write_to_screen(LOC.prompt_page,
CATGETS(elm_msg_cat, ElmSet,
ElmSelectCanMessage,
"Select Canceled message"));
FlushBuffer();
if (current > 0) {
*cancel_selection = current -1;
leave = 1;
can_flag = 1;
}
}
break;
eof_mark:
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! */
if (leave != -2) {
int marked_deleted = 0;
for (i = 0; i < get_message_count(cancel_view); i++) {
if (mcommon_ison_status(&MENU,i,status_basic,DELETED))
marked_deleted++;
}
if (marked_deleted > 0) {
int answer = (always_del ?
*def_ans_yes : *def_ans_no); /* default answer */
if(question_me) {
int def = answer;
/* NOTICE: prompt_letter may return EOF */
if (marked_deleted == 1)
answer = prompt_letter(LINES-4,"",def,
PROMPT_yesno|PROMPT_cancel|
PROMPT_redraw_mark|PROMPT_ctrlL,
page,
CATGETS(elm_msg_cat, ElmSet,
ElmLeaveDeleteMessage,
"Delete message? (%c/%c) "),
*def_ans_yes, *def_ans_no);
else
answer = prompt_letter(LINES-4,"",def,
PROMPT_yesno|PROMPT_cancel|
PROMPT_redraw_mark|PROMPT_ctrlL,
page,
CATGETS(elm_msg_cat, ElmSet,
ElmLeaveDeleteMessages,
"Delete messages? (%c/%c) "),
*def_ans_yes, *def_ans_no);
if (TERMCH_interrupt_char == answer) {
leave = 0;
can_flag = 0;
goto start_again;
}
if (answer == ('L'&31) || answer == REDRAW_MARK) {
menu_ClearScreen(page);
goto start_again;
}
if (answer == EOF) {
can_flag = 0;
goto OUT;
}
}
if (answer == *def_ans_yes) {
/* NOTICE: This does not update index so
*cancel_selection is still valid */
delete_marked_canceled_mails(cancel_view);
}
}
}
if (leave == -1) {
int n;
*cancel_selection = -1;
can_flag = 0;
sync_canceled_mails(cancel_view) ;
if (get_current(cancel_view) > (n = get_message_count(cancel_view)))
set_current(cancel_view,n);
resort_mailbox(cancel_view,1);
get_page(&MENU, LOC.header_page); /* resort_mailbox no longer call get_page() */
goto start_again;
}
OUT:
free_mailbox_screen(&LOC);
erase_menu_context(&page);
DPRINT(Debug,4,(&Debug, "view_canceled_mails=%d *cancel_selection=%d\n",
can_flag,*cancel_selection));
return can_flag;
}
/*
* Local Variables:
* mode:c
* c-basic-offset:4
* buffer-file-coding-system: iso-8859-1
* End:
*/
syntax highlighted by Code2HTML, v. 0.9.1