home *** CD-ROM | disk | FTP | other *** search
/ ftp.freefriends.org / ftp.freefriends.org.tar / ftp.freefriends.org / arnold / Source / mush.rstevens.tar.gz / mush.tar / doproc.c < prev    next >
C/C++ Source or Header  |  1992-10-30  |  24KB  |  910 lines

  1. /* @(#)doproc.c        (c) copyright    10/18/86 (Dan Heller) */
  2.  
  3. /* do main panel item procedures */
  4. #include "mush.h"
  5.  
  6. extern void start_textsw_edit();
  7. extern Panel get_compose_panel();
  8. void set_comp_items();
  9.  
  10. extern Panel_item
  11.     file_item, folder_text_item, folder_item, msg_num_item, read_item,
  12.     reply_item, save_item, sub_hdr_item[6];
  13.  
  14. /* following macro is for the next two procedures */
  15. #define hdr_item(item) \
  16.     (item == sub_hdr_item[0] || item == sub_hdr_item[1] || \
  17.      item == sub_hdr_item[2] || item == sub_hdr_item[3] || \
  18.      item == sub_hdr_item[4] || item == sub_hdr_item[5])
  19.  
  20. void
  21. delete_mail(item, value, event)
  22. register Panel_item item;
  23. int value;
  24. register Event *event;
  25. {
  26.     int val = value; /* save cuz we reset value immediately */
  27.     u_long bang = ison(glob_flags, IGN_BANG);
  28.     char buf[128];
  29.  
  30.     (void) panel_set(item, PANEL_VALUE, 0, 0);
  31.     if (hdr_item(item) && event_id(event) != MS_LEFT || val == 2) {
  32.     help(0, "delete", tool_help);
  33.     return;
  34.     }
  35.     /* delete current message */
  36.     wprint(sprintf(buf, "\\%sdelete %s\n",
  37.     ((event_id(event) == MS_LEFT || val == 0)? "" : "un"),
  38.     panel_get_value(msg_num_item)) + 1); /* +1 skips the backslash */
  39.     turnon(glob_flags, IGN_BANG);
  40.     (void) cmd_line(buf, msg_list);
  41.     if (!bang)
  42.     turnoff(glob_flags, IGN_BANG);
  43. }
  44.  
  45. void
  46. read_mail(item, value, event)
  47. Panel_item item;
  48. Event *event;
  49. {
  50.     int this_msg = current_msg;
  51.  
  52.     /* check "event" in case we were called from hdr_sw.c
  53.      * in which case event would be NULL
  54.      */
  55.     if (event && event_id(event) == MS_RIGHT && item &&
  56.     (item == read_item ||
  57.     (item == sub_hdr_item[0] || item == sub_hdr_item[1]))) {
  58.     (void) help(0, "next", tool_help);
  59.     return;
  60.     }
  61.     if (item && (item == sub_hdr_item[4] || item == sub_hdr_item[5])) {
  62.     (void) help(0, "Menu Read", tool_help);
  63.     return;
  64.     }
  65.     if (!msg_cnt) {
  66.     wprint ("No Mail.\n");
  67.     return;
  68.     }
  69.     if (item && item == read_item || ison(msg[current_msg].m_flags, DELETE))
  70.     (void) next_msg();
  71.     if (this_msg != current_msg || ison(msg[current_msg].m_flags, UNREAD) ||
  72.         (current_msg < n_array[0] || current_msg > n_array[screen])) {
  73.     set_isread(current_msg);
  74.     (void) do_hdrs(0, DUBL_NULL, NULL);
  75.     }
  76.     if (isoff(msg[current_msg].m_flags, DELETE))
  77.     display_msg(current_msg, (u_long)0);
  78. }
  79.  
  80. /* the panel button that says "filename" and "directory", etc... text item */
  81. Panel_setting
  82. file_dir(item, event)
  83. Panel_item item;
  84. Event *event;
  85. {
  86.     register char *p;
  87.     u_long bang = ison(glob_flags, IGN_BANG);
  88.     char buf[MAXPATHLEN];
  89.  
  90.     if (event_id(event) == ESC) {
  91.     /* file expansion request */
  92.     int n;
  93.     char **files;
  94.     p = panel_get_value(item);
  95.     (void) sprintf(buf, "%s*", p);
  96.     timeout_cursors(1);
  97.     if ((n = filexp(buf, &files)) > 0) {
  98.         Debug("%d: ",n), print_argv(files);
  99.         if (n > 1) {
  100.         n = lcprefix(files, 0);
  101.         files[0][n] = 0;
  102.         }
  103.         panel_set_value(item, trim_filename(files[0]));
  104.         free_vec(files);
  105.     } else
  106.         errbell(n);    /* see curs_io.c */
  107.     timeout_cursors(0);
  108.     return PANEL_NONE;
  109.     }
  110.  
  111.     if (item == folder_text_item) {
  112.     (void) sprintf(buf, "folder %s %s",
  113.         (ison(glob_flags, READ_ONLY) || ison(glob_flags, DO_UPDATE) &&
  114.         !ask("Folder has been modified.  Update changes?"))? "!" : "",
  115.         panel_get_value(folder_text_item));
  116.     }
  117.     else if (item == file_item) {
  118.     register char *b = buf;
  119.     char msgstr[BUFSIZ];
  120.  
  121.     if (event_id(event) == '\n' || event_id(event) == '\r')
  122.         b += Strcpy(buf, "save  ");
  123.     else
  124.         b += Strcpy(buf, "write ");
  125.     if ((p = panel_get_value(msg_num_item)) && *p)
  126.         b += Strcpy(b, p);
  127.     else {
  128.         if (ison(msg[current_msg].m_flags, DELETE) &&
  129.             !do_set(set_options, "show_deleted")) {
  130.         (void) sprintf(msgstr, "Message %d deleted -- save anyway?",
  131.                         current_msg+1);
  132.         if (ask(msgstr) != TRUE) {
  133.             wprint("Message not saved\n");
  134.             return PANEL_NONE;
  135.         }
  136.         }
  137.         b += strlen(sprintf(b, "%d", current_msg+1));
  138.     }
  139.     *b++ = ' ', *b = 0;
  140.     if (!(p = panel_get_value(item)) || !*p &&
  141.         (!(p = do_set(set_options, "mbox")) || !*p))
  142.         p = DEF_MBOX;
  143.     if (chk_option("verify", "save")) {
  144.         (void) sprintf(msgstr, "%s in \"%s\"?", buf, trim_filename(p));
  145.         if (ask(msgstr) != TRUE) {
  146.         wprint("Message not saved\n");
  147.         return PANEL_NONE;
  148.         }
  149.     }
  150.     (void) strcpy(b, p); /* now add to command */
  151.     }
  152.     turnon(glob_flags, IGN_BANG);
  153.     (void) cmd_line(buf, msg_list);
  154.     if (!bang)
  155.     turnoff(glob_flags, IGN_BANG);
  156.     return PANEL_NONE;
  157. }
  158.  
  159. #ifndef NO_WALK_MENUS
  160. void
  161. xx_file_dir(item, value)
  162. Panel_item item;
  163. char * value;
  164. {
  165.     char buf[BUFSIZ];
  166.     u_long bang = ison(glob_flags, IGN_BANG);
  167.  
  168.     if (item == folder_item) {
  169.     (void) sprintf(buf, "folder %s ",
  170.         (ison(glob_flags, READ_ONLY) || ison(glob_flags, DO_UPDATE) &&
  171.         !ask("Folder has been modified.  Update changes?"))? "!" : "");
  172.     strcat(buf, value);
  173.     } else if (item == save_item) {
  174.     char msgstr[BUFSIZ], *p;
  175.     register char *p2 = (char *)panel_get_value(msg_num_item);
  176.     (void) strcpy(buf, "save ");
  177.  
  178.     if (p2 && *p2) {
  179.         (void) strcat(buf, p2);
  180.         (void) strcat(buf, " ");
  181.     }
  182.     (void) strcat(buf, value);
  183.     if (chk_option("verify", "save")) {
  184.         (void) sprintf(msgstr, "Save in %s? ", trim_filename(value));
  185.         if (ask(msgstr) != TRUE) {
  186.         wprint("Message not saved\n");
  187.         return;
  188.         }
  189.     }
  190.     }
  191.     turnon(glob_flags, IGN_BANG);
  192.     (void) cmd_line(buf, msg_list);
  193.     if (!bang)
  194.     turnoff(glob_flags, IGN_BANG);
  195.     (void) panel_set(item, PANEL_VALUE, 0, NULL); /* remove last value */
  196. }
  197.  
  198. /*
  199.  * callback routine for the panel items that need filename input.
  200.  * (folder and save)
  201.  */
  202. void
  203. do_file_dir(item, event)
  204. Panel_item item;
  205. Event *event;
  206. {
  207.     if (item == folder_item) {
  208.     char *p = panel_get_value(folder_text_item);
  209.     if (!*p) {
  210.         ok_box("Enter folder name.");
  211.         return;
  212.     }
  213.     xx_file_dir(item, p);
  214.     } else if (item == save_item) {
  215.     if (!strcmp("Filename:", panel_get(file_item,PANEL_LABEL_STRING))) {
  216.         event_id(event) = '\n';  /* let file_dir think it got a \n */
  217.         file_dir(file_item, event);
  218.         return;
  219.     }
  220.     }
  221.     (void) panel_set(item, PANEL_VALUE, 0, NULL); /* remove last value */
  222. }
  223. #else /* NO_WALK_MENUS */
  224.  
  225. /*
  226.  * callback routine for the panel items that need filename input.
  227.  * (folder and save)
  228.  */
  229. void
  230. do_file_dir(item, value, event)
  231. Panel_item item;
  232. int value;
  233. Event *event;
  234. {
  235.     char buf[BUFSIZ];
  236.     u_long bang = ison(glob_flags, IGN_BANG);
  237.  
  238.     if (item == folder_item) {
  239.     (void) sprintf(buf, "folder %s ",
  240.         (ison(glob_flags, READ_ONLY) || ison(glob_flags, DO_UPDATE) &&
  241.         !ask("Folder has been modified.  Update changes?"))? "!" : "");
  242.     if (event_id(event) == MS_LEFT) {
  243.         char *p = panel_get_value(folder_text_item);
  244.         if (!*p) {
  245.         ok_box("Enter folder name.");
  246.         return;
  247.         }
  248.         (void) strcat(buf, p);
  249.     } else if (!value)
  250.         (void) strcat(buf, "%");
  251.     else if (value == 1)
  252.         (void) strcat(buf, "&");
  253.     else if (value == 2)
  254.         (void) strcat(buf, "#");
  255.     else
  256.         (void) strcat(buf, panel_get(item, PANEL_CHOICE_STRING, value));
  257.     } else if (item == save_item) {
  258.     char msgstr[BUFSIZ], *p;
  259.     (void) strcpy(buf, "save ");
  260.     if (event_id(event) == MS_LEFT) {
  261.         if (!strcmp("Filename:", panel_get(file_item,PANEL_LABEL_STRING))) {
  262.         event_id(event) = '\n';  /* let file_dir think it got a \n */
  263.         file_dir(file_item, event);
  264.         return;
  265.         }
  266.     } else if (value == 0) {
  267.         register char *p2 = (char *)panel_get_value(msg_num_item);
  268.  
  269.         if (!(p = do_set(set_options, "mbox")) || !*p)
  270.         p = DEF_MBOX;
  271.         if (p2 && *p2) {
  272.         (void) strcat(buf, p2);
  273.         (void) strcat(buf, " ");
  274.         }
  275.         (void) strcat(buf, p);
  276.     } else
  277.         (void) strcat(buf, p = panel_get(item, PANEL_CHOICE_STRING, value));
  278.     if (chk_option("verify", "save")) {
  279.         (void) sprintf(msgstr, "Save in %s? ", trim_filename(p));
  280.         if (ask(msgstr) != TRUE) {
  281.         wprint("Message not saved\n");
  282.         return;
  283.         }
  284.     }
  285.     }
  286.     turnon(glob_flags, IGN_BANG);
  287.     (void) cmd_line(buf, msg_list);
  288.     if (!bang)
  289.     turnoff(glob_flags, IGN_BANG);
  290.     (void) panel_set(item, PANEL_VALUE, 0, NULL); /* remove last value */
  291. }
  292. #endif /* NO_WALK_MENUS */
  293.  
  294. /*ARGSUSED*/
  295. void
  296. do_help(item, value, event)
  297. Panel_item item;
  298. register int value;
  299. Event *event;
  300. {
  301.     register char *p, *helpfile = tool_help;
  302.     if (!event || event_id(event) == MS_LEFT)
  303.     value = 0;
  304.     switch(value) {
  305.     case 0: p = "about", helpfile = cmd_help;
  306.     when 1: p = "help";
  307.     when 2: p = "mouse";
  308.     when 3: p = "windows";
  309.     when 4: p = "hdr_format", helpfile = cmd_help;
  310.     when 5: p = "msg_list", helpfile = cmd_help;
  311.     when 6: p = "folder";
  312.     otherwise: p = "general";
  313.     }
  314.     (void) help(0, p, helpfile);
  315. }
  316.  
  317. /*ARGSUSED*/
  318. void
  319. do_update(item, value, event)
  320. Panel_item item;
  321. int value;
  322. Event *event;
  323. {
  324.     char *argv[2];
  325.     if (event && event_id(event) != MS_LEFT) {
  326.     if (value == 0) {
  327.         if (check_new_mail() == 0)
  328.         print("No new mail.\n");
  329.     } else
  330.         (void) help(0, "update", tool_help);
  331.     return;
  332.     }
  333.     argv[0] = "update";
  334.     argv[1] = NULL;
  335.     timeout_cursors(TRUE);
  336.     (void) folder(0, argv, NULL);
  337.     timeout_cursors(FALSE);
  338. }
  339.  
  340. /*ARGSUSED*/
  341. void
  342. toolquit(item, value, event)
  343. Panel_item item;
  344. int value;
  345. Event *event;
  346. {
  347.     void wmgr_changestate(), wmgr_changelevel();
  348.     register int which;
  349.  
  350.     if (!value || event_id(event) == MS_LEFT) {
  351.     if (ison(glob_flags, DO_UPDATE)) {
  352.         do_update(NO_ITEM, 0, NO_EVENT);
  353.         turnoff(glob_flags, NEW_MAIL);
  354.     }
  355.     check_icons();
  356.     mail_status(0); /* lower flag (if up) print current num of msgs */
  357.     /* wmgr_changestate (window_get(tool, WIN_FD), rootfd, TRUE); */
  358.     /* wmgr_changelevel (window_get(tool, WIN_FD), parentfd, TRUE); */
  359.     close_frame();
  360.     window_set(tool, FRAME_CLOSED, TRUE, NULL);
  361.     is_iconic = ((int) window_get(tool, FRAME_CLOSED));
  362.     return;
  363.     } else if (value == 2) {
  364.     (void) help(0, "quit", tool_help);
  365.     return;
  366.     }
  367.     /* modify this to check for "abort" choice when ternary return values
  368.      * are possible!
  369.      */
  370.     if (isoff(glob_flags, DO_UPDATE) ||
  371.         ask("Folder has been modified -- update?")) {
  372.     if (!copyback("Quit anyway?", TRUE))
  373.         return;
  374.     }
  375.     cleanup(0);
  376. }
  377.  
  378. /*ARGSUSED*/
  379. void
  380. do_mark(item, value, event)
  381. Panel_item item;
  382. int value;
  383. Event *event;
  384. {
  385.     if (event && (event_id(event) == MS_LEFT) || value == 0) {
  386.     int msg_num = event? current_msg : (int)item;
  387.     /* mark message */
  388.     if (ison(msg[msg_num].m_flags, M_PRIORITY(0)))
  389.         turnoff(msg[msg_num].m_flags, M_PRIORITY(0));
  390.     else
  391.         turnon(msg[msg_num].m_flags, M_PRIORITY(0));
  392.     (void) do_hdrs(0, DUBL_NULL, NULL);
  393.     } else if (value < 7) {
  394.     /* set priority */
  395.     char buf[90];
  396.     (void) cmd_line(sprintf(buf, "mark -%c %s",
  397.         value < 6? value + 'A' - 1 : ' ',
  398.         panel_get_value(msg_num_item)), NULL);
  399.     } else
  400.     (void) help(0, "mark", tool_help);
  401.     if (value != 7 && item)
  402.     panel_set_value(item, 0);
  403. }
  404.  
  405. /*ARGSUSED*/
  406. void
  407. do_lpr(item, value, event)
  408. Panel_item item;
  409. int value;
  410. Event *event;
  411. {
  412.     char buf[128];
  413.  
  414.     if (event && (event_id(event) == MS_LEFT)) {
  415.     wprint("Sending message %d to printer...\n", current_msg+1);
  416.     (void) strcpy(buf, "lpr ");
  417.     if (value)
  418.         (void) sprintf(buf, "lpr \"%s\"", panel_get_value(msg_num_item));
  419.     timeout_cursors(TRUE);
  420.     (void) cmd_line(buf, msg_list);
  421.     timeout_cursors(FALSE);
  422.     } else
  423.     (void) help(0, "printer", tool_help);
  424. }
  425.  
  426. /* panel selection button pressed to send a letter.
  427.  * we've attached the sign panel item to this item to 1) avoid
  428.  * using a global and 2) make it general enough so that multiple
  429.  * compose windows can have multiple send_items and we can
  430.  * identify which sign/fortune items are associated with this
  431.  * particular letter.  The fortune item is attached to the sign
  432.  * item.
  433.  */
  434. /*ARGSUSED*/
  435. void
  436. do_send(item, value, event)
  437. Panel_item item;
  438. int value;
  439. register Event *event;
  440. {
  441.     Panel panel = (Panel)panel_get(item, PANEL_PARENT_PANEL);
  442.     Panel_item sign_item = (Panel_item)panel_get(item, PANEL_CLIENT_DATA);
  443.     Panel_item fortune_item =
  444.     (Panel_item)panel_get(sign_item, PANEL_CLIENT_DATA);
  445.     Textsw textsw = (Textsw)panel_get(panel, PANEL_CLIENT_DATA);
  446.     char *argv[5], buf[64];
  447.     char *file = (char *)window_get(textsw, TEXTSW_CLIENT_DATA);
  448.     char *p, *oldsign = NULL, *oldfortune = NULL;
  449.  
  450.     if (textsw_store_file(textsw, file, 0, 0)) {
  451.     error("Can't save to %s", file);
  452.     return;
  453.     }
  454.     /* check if user changed variables before sending */
  455.     if (p = do_set(set_options, "autosign"))
  456.     oldsign = savestr(p);
  457.     if (panel_get_value(sign_item) && !oldsign)
  458.     cmd_line(strcpy(buf, "\\set autosign"), NULL);
  459.     else if (!panel_get_value(sign_item) && oldsign)
  460.     cmd_line(strcpy(buf, "\\unset autosign"), NULL);
  461.     if (p = do_set(set_options, "fortune"))
  462.     oldfortune = savestr(p);
  463.     if (panel_get_value(fortune_item) && !oldfortune)
  464.     (void) cmd_line(strcpy(buf, "\\set fortune"), NULL);
  465.     else if (!panel_get_value(fortune_item) && oldfortune)
  466.     (void) cmd_line(strcpy(buf, "\\unset fortune"), NULL);
  467.     turnoff(glob_flags, IS_GETTING);
  468.     argv[0] = "mail";
  469.     argv[1] = "-Uh";
  470.     argv[2] = file;
  471.     argv[3] = NULL;
  472.     clear_msg_list(msg_list);
  473.     timeout_cursors(TRUE);
  474.     if (do_mail(3, argv, msg_list) == 0) {
  475.     (void) unlink(file);
  476.     set_comp_items(panel);
  477.     }
  478.     if (panel_get_value(sign_item) && !oldsign)
  479.     (void) cmd_line(strcpy(buf, "\\unset autosign"), NULL);
  480.     else if (!panel_get_value(sign_item) && oldsign) {
  481.     argv[0] = "set";
  482.     argv[1] = "autosign";
  483.     if (*oldsign) {
  484.         argv[2] = "=";
  485.         argv[3] = oldsign;
  486.         argv[4] = NULL;
  487.         (void) set(4, argv, NULL);
  488.     } else {
  489.         argv[2] = NULL;
  490.         (void) set(2, argv, NULL);
  491.     }
  492.     }
  493.     if (panel_get_value(fortune_item) && !oldfortune)
  494.     cmd_line(strcpy(buf, "\\unset fortune"), NULL);
  495.     else if (!panel_get_value(fortune_item) && oldfortune) {
  496.     argv[0] = "set";
  497.     argv[1] = "fortune";
  498.     if (*oldfortune) {
  499.         argv[2] = "=";
  500.         argv[3] = oldfortune;
  501.         argv[4] = NULL;
  502.         (void) set(4, argv, NULL);
  503.     } else {
  504.         argv[2] = NULL;
  505.         (void) set(2, argv, NULL);
  506.     }
  507.     }
  508.     xfree(oldsign), xfree(oldfortune);
  509.     timeout_cursors(FALSE);
  510. }
  511.  
  512. /*ARGSUSED*/
  513. void
  514. do_include(item, value, event)
  515. Panel_item item;
  516. int value;
  517. Event *event;
  518. {
  519.     extern FILE *ed_fp;
  520.     char *p, buf[64], *file;
  521.     Textsw textsw = (Textsw)panel_get(panel_get(item, PANEL_PARENT_PANEL),
  522.     PANEL_CLIENT_DATA);
  523.  
  524.     if (event && event_id(event) == MS_LEFT)
  525.     value = 0;
  526.     if (value == 2) {
  527.     (void) help(0, "include", tool_help);
  528.     return;
  529.     }
  530.     p = panel_get_value(msg_num_item);
  531.     (void) sprintf(buf, "%c%c%s", *escape, value == 0? 'i' : 'f', p? p : "");
  532.  
  533.     file = (char *)window_get(textsw, TEXTSW_CLIENT_DATA);
  534.     if (textsw_store_file(textsw, file, 0, 0)) {
  535.     (void) ask("Something's wrong... Click anything.");
  536.     return;
  537.     }
  538.     if (ed_fp) {
  539.     (void) ask("tmpfile already in use... Click anything.");
  540.     (void) fclose(ed_fp);
  541.     }
  542.     if (!(ed_fp = mask_fopen(file, "a"))) {
  543.     error("Cannot open %s to append msg.", file);
  544.     return;
  545.     }
  546.     (void) add_to_letter(buf);
  547.     (void) fclose(ed_fp), ed_fp = NULL_FILE;
  548. #ifdef SUN_4_0 /* SunOS 4.0+ */
  549.     window_set(textsw, TEXTSW_FILE_CONTENTS, file, NULL);
  550. #else /* SUN_4_0 */
  551.     textsw_load_file(textsw, file, 1, 0, 0);
  552. #endif /* SUN_4_0 */
  553.     window_set(textsw, TEXTSW_UPDATE_SCROLLBAR, NULL);
  554.     (void) unlink(file);
  555. }
  556.  
  557. /*ARGSUSED*/
  558. void
  559. do_compose(item, value, event)
  560. Panel_item item;
  561. int value;
  562. Event *event;
  563. {
  564.     char buf[5];
  565.  
  566.     if (event && event_id(event) != MS_LEFT) {
  567.     (void) help(0, "compose", tool_help);
  568.     return;
  569.     }
  570.     open_compose();
  571.     if (!compose_frame)
  572.     return;    /* open failed */
  573.     clear_msg_list(msg_list);
  574.     if (do_mail(0, DUBL_NULL, msg_list) == 0) {
  575.     Panel panel = get_compose_panel();
  576.     Textsw textsw = (Textsw)panel_get(panel, PANEL_CLIENT_DATA);
  577.     start_textsw_edit(textsw, TRUE);
  578.     set_comp_items(panel);
  579.     }
  580. }
  581.  
  582. /*
  583.  * notify proc for reply button -- also called from select.c (do_menu()) ,
  584.  * in which case "event" is null and "value" contains the message
  585.  * number of the message to reply to.
  586.  */
  587. /*ARGSUSED*/
  588. void
  589. respond_mail(item, value, event)
  590. Panel_item item;
  591. int value;
  592. Event *event;
  593. {
  594.     int tmp = current_msg;
  595.     char buf[256];
  596.  
  597.     if (event && event_id(event) == MS_LEFT)
  598.     value = 0;
  599.     if (event && value == 4) {
  600.     (void) help(0, "respond", tool_help);
  601.     return;
  602.     }
  603.     if (!msg_cnt) {
  604.     wprint("No messages to respond to.\n");
  605.     return;
  606.     }
  607.     if (ison(glob_flags, IS_GETTING)) {
  608.     wprint("Finish editing current message first.\n");
  609.     return;
  610.     }
  611.     if (!event)
  612.     tmp = value, value = 0;
  613.     open_compose();
  614.     if (!compose_frame)
  615.     return;    /* open failed */
  616.     (void) sprintf(buf, "%s %s %d",
  617.     (value == 2 || value == 3)? "\\replyall" : "\\replysender",
  618.     (value == 1 || value == 3)? "-i": NO_STRING, tmp+1);
  619.     if (cmd_line(buf, NULL) != -1) {
  620.     Panel panel = get_compose_panel();
  621.     Textsw textsw = (Textsw)panel_get(panel, PANEL_CLIENT_DATA);
  622.     wprint("Responding to message %d\n", tmp+1);
  623.     start_textsw_edit(textsw, FALSE);
  624.     set_comp_items(panel);
  625.     }
  626. }
  627.  
  628. /*ARGSUSED*/
  629. void
  630. load_from_file(item, value, event)
  631. Panel_item item;
  632. int value;
  633. Event *event;
  634. {
  635.     int x = 0;
  636.     Textsw textsw;
  637.     Panel_item filename_item = (Panel_item)panel_get(item, PANEL_CLIENT_DATA);
  638.     char *file, *p = panel_get_value(filename_item);
  639. #ifndef SUN_4_0 /* SunOS 4.0+ */
  640.     char *sfile, buf[128];
  641.     extern FILE *ed_fp;
  642. #endif /* SUN_4_0 */
  643.     
  644.     if (!*p) {
  645.     wprint("Specify Filename.\n");
  646.     return;
  647.     }
  648.     file = getpath(p, &x);
  649.     if (x == 1)
  650.     wprint("%s: is a directory.\n", p);
  651.     else if (x == -1)
  652.     wprint("%s: %s\n", p, file);
  653.     if (x)
  654.     return;
  655.     timeout_cursors(TRUE);
  656.     textsw = (Textsw)panel_get(panel_get(item, PANEL_PARENT_PANEL),
  657.     PANEL_CLIENT_DATA);
  658.     if (event_id(event) != MS_LEFT && value == 1)
  659.     /* replace */
  660.     textsw_load_file(textsw, file, 1, 0, 0);
  661.     else {
  662.     /* insert */
  663. #ifdef SUN_4_0 /* SunOS 4.0+ */
  664.     window_set(textsw, TEXTSW_INSERT_FROM_FILE, file, NULL);
  665. #else /* SUN_4_0 */
  666.     /* best we can do with pre 4.0 is save the current file
  667.      * and append the new file onto the end.
  668.      */
  669.     sfile = (char *)window_get(textsw, TEXTSW_CLIENT_DATA);
  670.     if (textsw_store_file(textsw, sfile, 0, 0)) {
  671.         (void) ask("Can't save file... Click anything.");
  672.         return;
  673.     }
  674.     if (ed_fp) {
  675.         (void) ask("tmpfile already in use... Click anything.");
  676.         fclose(ed_fp);
  677.     }
  678.     if (!(ed_fp = mask_fopen(sfile, "a"))) {
  679.         error("Cannot open %s.", sfile);
  680.         return;
  681.     }
  682.     (void) sprintf(buf, "%c%c%s", *escape, 'r', trim_filename(p));
  683.     (void) add_to_letter(buf);
  684.     (void) fclose(ed_fp), ed_fp = NULL_FILE;
  685.     textsw_load_file(textsw, sfile, 1, 0, 0);
  686.     (void) unlink(sfile);
  687. #endif /* SUN_4_0 */
  688.     }
  689.     window_set(textsw, TEXTSW_UPDATE_SCROLLBAR, NULL);
  690.     panel_set_value(item, 0);
  691.     timeout_cursors(FALSE);
  692. }
  693.  
  694. /*ARGSUSED*/
  695. void
  696. save_to_file(item, value, event)
  697. Panel_item item;
  698. Event *event;
  699. {
  700.     Panel_item filename_item = panel_get(item, PANEL_CLIENT_DATA);
  701.     char *file = panel_get_value(filename_item);
  702.     FILE *fp;
  703.     Textsw textsw = (Textsw)panel_get(panel_get(item, PANEL_PARENT_PANEL),
  704.     PANEL_CLIENT_DATA);
  705.  
  706.     if (!*file) {
  707.     wprint("Specify Filename\n");
  708.     return;
  709.     }
  710.     timeout_cursors(TRUE);
  711.     /* append to file -- no confirmation necessary */
  712.     if (fp = open_file(file, FALSE, TRUE)) {
  713.     char buf[BUFSIZ];
  714.     Textsw_index next_pos = 0, tmp;
  715.     Textsw_index length =
  716.         (Textsw_index)window_get(textsw, TEXTSW_LENGTH);
  717.     do  {
  718.         tmp = next_pos;
  719.         next_pos = (Textsw_index) window_get(textsw, TEXTSW_CONTENTS,
  720.         next_pos, buf, sizeof(buf));
  721.         if (fwrite(buf, sizeof(char), (int)(next_pos - tmp), fp) == 0)
  722.         error("%s may be incomplete", file);
  723.     } while (next_pos < length);
  724.     (void) close_lock(file, fp);
  725.     wprint("Wrote %d bytes to %s\n", length, trim_filename(file));
  726.     }
  727.     timeout_cursors(FALSE);
  728. }
  729.  
  730. void
  731. abort_mail(item, event)
  732. Panel_item item;
  733. Event *event;
  734. {
  735.     Panel panel = (Panel)panel_get(item, PANEL_PARENT_PANEL);
  736.     Textsw textsw = (Textsw)panel_get(panel, PANEL_CLIENT_DATA);
  737.     wprint("Aborted letter.\n");
  738.     textsw_reset(textsw, 0, 0);
  739.     rm_edfile(0);
  740.     set_comp_items(panel);
  741. }
  742.  
  743. /* set the compose panel items */
  744. void
  745. set_comp_items(panel)
  746. Panel panel;
  747. {
  748.     Panel_item item, next;
  749.     Textsw textsw = (Textsw)panel_get(panel, PANEL_CLIENT_DATA);
  750.     int getting = ison(glob_flags, IS_GETTING) != 0;
  751.     int i = 0;
  752.  
  753.     window_set(textsw, TEXTSW_READ_ONLY, !getting, NULL);
  754.     /* remove next line when multiple composes become a reality */
  755.     (void) panel_set(reply_item, PANEL_SHOW_ITEM, !getting, NULL);
  756.     /* skip "close" item */
  757.     item = (Panel_item) panel_get(panel, PANEL_FIRST_ITEM);
  758.     for (item = (Panel_item) panel_get(item, PANEL_NEXT_ITEM);
  759.     item; item = next) {
  760.     next = (Panel_item) panel_get(item, PANEL_NEXT_ITEM);
  761.     (void) panel_set(item,
  762.         PANEL_SHOW_ITEM, (i++ < 1)? !getting : getting, NULL);
  763.     }
  764. }
  765.  
  766. /*
  767.  * Ask a yes/no question and return an answer: TRUE or FALSE.
  768.  */
  769. ask(question)
  770. char *question;
  771. {
  772. #ifdef SUN_4_0 /* SunOS 4.0+ */
  773.     return alert_prompt(tool, (Event *)NULL,
  774.     ALERT_MESSAGE_STRINGS,    question, NULL,
  775.     ALERT_BUTTON_YES,    "Yes",
  776.     ALERT_BUTTON_NO,    "No",
  777.     NULL) == ALERT_YES;
  778. #else /* SUN_4_0 */
  779.     Event event;
  780.     struct prompt prompt;
  781.     Rect *rect = (Rect *)window_get(tool, WIN_RECT);
  782.     char buf[MAXPATHLEN];
  783.  
  784.     (void) sprintf(buf,
  785.         "%s  \nPress LEFT Button to Confirm.  Anything else to cancel.",
  786.         question);
  787.     prompt.prt_rect.r_left = rect->r_left + (rect->r_width / 3);
  788.     prompt.prt_rect.r_top = rect->r_top + (rect->r_height / 3);
  789.     prompt.prt_rect.r_width = prompt.prt_rect.r_height = PROMPT_FLEXIBLE;
  790.     prompt.prt_font = mush_font;
  791.     prompt.prt_text = buf;
  792.  
  793.     menu_prompt(&prompt, &event, window_get(tool, WIN_FD));
  794.     return event_id(&event) == MS_LEFT;
  795. #endif /* SUN_4_0 */
  796. }
  797.  
  798. void
  799. ok_box(buf)
  800. char *buf;
  801. {
  802. #ifdef SUN_4_0
  803.     (void) alert_prompt(tool, (Event *)NULL,
  804.     ALERT_MESSAGE_STRINGS,    buf, NULL,
  805.     ALERT_BUTTON_YES,        "Ok",
  806.     NULL);
  807. #else /* SUN_4_0 */
  808.     Event event;
  809.     struct prompt prompt;
  810.     Rect *rect = (Rect *)window_get(tool, WIN_RECT);
  811.     (void) strcat(buf, "  \nPress LEFT Button to Continue.");
  812.     prompt.prt_rect.r_left = rect->r_left + (rect->r_width / 3);
  813.     prompt.prt_rect.r_top = rect->r_top + (rect->r_height / 3);
  814.     prompt.prt_rect.r_width = prompt.prt_rect.r_height = PROMPT_FLEXIBLE;
  815.     prompt.prt_font = mush_font;
  816.     prompt.prt_text = buf;
  817.     menu_prompt(&prompt, &event, window_get(tool, WIN_FD));
  818. #endif /* SUN_4_0 */
  819. }
  820.  
  821. Panel_setting
  822. msg_num_done(item, event)
  823. Panel_item item;
  824. Event *event;
  825. {
  826.     char buf[82];
  827.     u_long bang = ison(glob_flags, IGN_BANG);
  828.     register char *p;
  829.     int n;
  830.  
  831.     if (event_id(event) != '\n' && event_id(event) != '\r') {
  832.     (void) help(0, "message range", tool_help);
  833.     return PANEL_NONE;
  834.     }
  835.     (void) sprintf(buf, "headers %s", (p = (char *)panel_get_value(item)));
  836.     (void) panel_set(item, PANEL_VALUE, NO_STRING, NULL);
  837.     if (!(n = chk_msg(p)))
  838.     return PANEL_NONE;
  839.     current_msg = --n;
  840.     turnon(glob_flags, IGN_BANG);
  841.     (void) cmd_line(buf, msg_list);
  842.     if (!bang)
  843.     turnoff(glob_flags, IGN_BANG);
  844.     (void) display_msg(n, (u_long)0);
  845.     return PANEL_NONE;
  846. }
  847.  
  848. void
  849. do_sort(item, value, event)
  850. Panel_item item;
  851. int value;
  852. Event *event;
  853. {
  854.     char *argv[3], list[MAXMSGS_BITS];
  855.     char *p = (char *)panel_get_value(msg_num_item);
  856.     int n = 0;
  857.  
  858.     if (p && *p) {
  859.     argv[0] = p;
  860.     argv[1] = NULL;
  861.     n = get_msg_list(argv, list);
  862.     }
  863.     argv[0] = "sort";
  864.     argv[2] = NULL;
  865.  
  866.     if (event_id(event) == MS_LEFT)
  867.     value = 0;
  868.     switch(value) {
  869.     case 0: argv[1] = "S";
  870.     when 1: argv[1] = "a";
  871.     when 2: argv[1] = "l";
  872.     when 3: argv[1] = "R";
  873.     when 4: argv[1] = "s";
  874.     when 5: argv[1] = "d";
  875.     when 6: argv[1] = "p";
  876.     when 7: if (!(argv[1] = do_set(set_options, "sort"))) return;
  877.     when 8: (void) help(0, "sort", tool_help);
  878.     }
  879.     if (value != 8) {
  880.     if (n > 0) {
  881.         turnon(glob_flags, IS_PIPE);
  882.         (void) sort(2, argv, list);
  883.         turnoff(glob_flags, IS_PIPE);
  884.     } else
  885.         (void) sort(2, argv, NULL);
  886.     (void) do_hdrs(0, DUBL_NULL, NULL);
  887.     }
  888.     (void) panel_set(item, PANEL_VALUE, 0, NULL);
  889. }
  890.  
  891. void
  892. do_options(item, value, event)
  893. Panel_item item;
  894. int value;
  895. Event *event;
  896. {
  897.     if (event_id(event) == MS_LEFT) {
  898.     view_options();
  899.     return;
  900.     }
  901.     switch (value) {
  902.     case 0:
  903.         view_options();
  904.     when 1:
  905.         do_ignore();
  906.     when 2:
  907.         do_aliases();
  908.     }
  909. }
  910.