home *** CD-ROM | disk | FTP | other *** search
/ PC-Online 1999 November / PCOnline_11_1999.iso / filesbbs / OS2 / MMSRC029.ZIP / mmail-0.29 / interfac / help.cc < prev    next >
C/C++ Source or Header  |  1999-08-14  |  5KB  |  272 lines

  1. /*
  2.  * MultiMail offline mail reader
  3.  * help windows
  4.  
  5.  Copyright (c) 1996 Kolossvary Tamas <thomas@vma.bme.hu>
  6.  Copyright (c) 1999 William McBrine <wmcbrine@clark.net>
  7.  
  8.  Distributed under the GNU General Public License.
  9.  For details, see the file COPYING in the parent directory. */
  10.  
  11. #include "interfac.h"
  12.  
  13. HelpWindow::HelpWindow()
  14. {
  15.     baseReset();
  16. }
  17.  
  18. void HelpWindow::newHelpMenu(const char **keys, const char **func, int it)
  19. {
  20.     int x, y, z, end;
  21.  
  22.     items = it;
  23.  
  24.     menu = new Win(3, COLS - 2, LINES - 4, C_HELP2);
  25.  
  26.     midpos = (COLS / 2) - 6;
  27.     endpos = COLS - 21;
  28.  
  29.     if (items < 10)
  30.         end = items;
  31.     else {
  32.         end = base + 8;
  33.         if (end > items)
  34.             end = items;
  35.     }
  36.     for (z = base; z < end; z++) {
  37.         if (keys[z]) {
  38.             x = (z - base) / 3;
  39.             switch ((z - base) % 3) {
  40.             case 0:
  41.                 y = 2;
  42.                 break;
  43.             case 1:
  44.                 y = midpos;
  45.                 break;
  46.             default:
  47.                 y = endpos;
  48.             }
  49.             menu->attrib(C_HELP1);
  50.             menu->put(x, y, ": ");
  51.             menu->put(x, y + 2, func[z]);
  52.  
  53.             y -= strlen(keys[z]);
  54.  
  55.             menu->attrib(C_HELP2);
  56.             menu->put(x, y, keys[z]);
  57.         }
  58.     }
  59.     if (items > 9) {
  60.         menu->put(2, endpos - 1, "O");
  61.         menu->attrib(C_HELP1);
  62.         menu->put(2, endpos, ": Other functions");
  63.     }
  64.     menu->delay_update();
  65. }
  66.  
  67. void HelpWindow::h_packetlist()
  68. {
  69.     static const char *keys[] = {
  70.         "Q", "Enter", "S, $",
  71.         "K", "/, .", "G",
  72.         "U", "R",
  73.  
  74.         "A", "^T", "^Z",
  75.         "B", "Space, F", "^X"
  76.     }, *func[] = {
  77.         "Quit", "select packet", "change Sort type", 
  78.         "Kill packet", "search / next", "Go to directory",
  79.         "Update list", "Rename packet",
  80.  
  81.         "Addressbook", "Tagline editor", "command shell",
  82.         "alias for PgUp", "aliases for PgDn", "eXit now"
  83.     };
  84.  
  85.     newHelpMenu(keys, func, 14);
  86. }
  87.  
  88. void HelpWindow::h_arealist()
  89. {
  90.     static const char *keys[] = {
  91.         "Q", "Enter", "F2, !",
  92.         "E", "S, Ins", "U, Del",
  93.         "L", "-", "+"
  94.     }, *func[] = {
  95.         "back to packet list", "select area", "Make reply packet",
  96.         "Enter letter in area", "Subscribe", "Unsubscribe",
  97.         "Long/short area list", "prev non-empty", "next non-empty"
  98.     };
  99.  
  100.     newHelpMenu(keys, func, 9);
  101. }
  102.  
  103. void HelpWindow::h_letterlist()
  104. {
  105.     static const char *keys[] = {
  106.         "L", "Enter", "$",
  107.         "E",  "^F", "S",
  108.         "U", "M",
  109.  
  110.         "A", "^T", "F2, !",
  111.         0, "-", "+"
  112.     }, *func[] = {
  113.         "List all/unread", "read letter", "change sort type",
  114.         "Enter letter in area", "Forward letter", "Save (all/marked)",
  115.         "Unread/read toggle", "Mark/unmark",
  116.  
  117.         "Addressbook", "Tagline editor", "Make reply packet",
  118.         0, "previous unread", "next unread"
  119.     }, *repkeys[] = {
  120.         "K", "Enter", "$",
  121.         "E", "^F", "S",
  122.         0, "^B",
  123.  
  124.         "A", "^T", "F2, !"
  125.     }, *repfunc[] = {
  126.         "Kill letter", "read letter", "change sort type", 
  127.         "Edit letter", "Forward letter", "Save (all/marked)",
  128.         0, "Break into parts",
  129.  
  130.         "Addressbook", "Tagline editor", "Make reply packet"
  131.     };
  132.  
  133.     if (!mm.areaList->isReplyArea())
  134.         newHelpMenu(keys, func, 14);
  135.     else
  136.         newHelpMenu(repkeys, repfunc, 11);
  137. }
  138.  
  139. void HelpWindow::h_letter(bool isAnsi)
  140. {
  141.     enum {width = 60, citems = 18, regitems = 7, repitems = 3,
  142.         ansitems = 9};
  143.  
  144.     static const char *common[citems] = {
  145.         "S - Save letter",
  146.         "A - Addressbook",
  147.         "C - toggle Character set",
  148.         "D - Decrypt (rot13) toggle",
  149.         "X - eXtra (hidden) lines",
  150.         "I - Ignore soft CRs toggle",
  151.         "^T - Tagline editor",
  152.         "^F - Forward letter",
  153.         "F2, ! - Make reply packet",
  154.         "V, ^V, ^A - ANSI viewer",
  155.         "/ - start a search",
  156.         ". - repeat last search",
  157.         "- - previous letter",
  158.         "+, Enter - next letter",
  159.         "Space - page through area",
  160.         "^Z - command shell",
  161.         "Q - back to letter list",
  162.         "^X - eXit " MM_NAME " now"
  163.     }, *regular[] = {
  164.         "E - Enter letter",
  165.         "R - Reply to letter",
  166.         "O - reply to Original sender",
  167.         "N - Netmail/Internet reply",
  168.         "T - Take tagline",
  169.         "M - Mark/unmark letter",
  170.         "U - Unread/read toggle"
  171.     }, *reply[] = {
  172.         "K - Kill letter",
  173.         "E, R - [Re-]Edit letter",
  174.         "^B - Break reply into parts"
  175.     }, *ansi[] = {
  176.         "S - Save to file",
  177.         "C - toggle Character set",
  178.         "V, ^V, ^A - Animate",
  179.         "/ - start a search",
  180.         ". - repeat last search",
  181.         "Space - page down/next",
  182.         "- - previous",
  183.         "+ - next",
  184.         "Q - Quit ANSI viewer"
  185.     };
  186.  
  187.     int base = isAnsi ? ansitems : mm.areaList->isReplyArea() ?
  188.         repitems : regitems;
  189.     int usecommon = isAnsi ? 0 : citems;
  190.     int height = ((base + usecommon + 1) >> 1) + 4;
  191.  
  192.     menu = new ShadowedWin(height, width, (LINES - height) >> 1,
  193.         C_HELP3);
  194.     menu->attrib(C_HELP4);
  195.  
  196.     const char **basechar = isAnsi ? ansi :
  197.         ((base == 7) ? regular : reply);
  198.  
  199.     int line = 0;
  200.  
  201.     for (int x = 0; x < base; x++) {
  202.         if (!(x & 1))
  203.             line++;
  204.         menu->put(line, (x & 1) ? (width >> 1) + 2 : 2,
  205.             basechar[x]);
  206.     }
  207.  
  208.     for (int x = base; x < usecommon + base; x++) {
  209.         if (!(x & 1))
  210.             line++;
  211.         menu->put(line, (x & 1) ? (width >> 1) + 2 : 2,
  212.             common[x - base]);
  213.     }
  214.  
  215.     menu->put(line + 2, 2,
  216.         "Plus the standard direction keys");
  217.  
  218.     menu->wtouch();
  219. }
  220.  
  221. void HelpWindow::MakeActive()
  222. {
  223.     switch (interface->active()) {
  224.     case ansi_help:
  225.         h_letter(true);
  226.         break;
  227.     case letter_help:
  228.         h_letter(false);
  229.         break;
  230.     case letterlist:
  231.         h_letterlist();
  232.         break;
  233.     case arealist:
  234.         h_arealist();
  235.         break;
  236.     case packetlist:
  237.         h_packetlist();
  238.     default:;
  239.     }
  240. }
  241.  
  242. void HelpWindow::Delete()
  243. {
  244.     switch (interface->active()) {
  245.     case ansi_help:
  246.     case letter_help:
  247.         delete (ShadowedWin *) menu;
  248.         break;
  249.     case letterlist:
  250.     case arealist:
  251.     case packetlist:
  252.         delete menu;
  253.     default:;
  254.     }
  255. }
  256.  
  257. void HelpWindow::baseNext()
  258. {
  259.     if (items > 9) {
  260.         base += 8;
  261.         if (base > (items - 1))
  262.             base = 0;
  263.     }
  264.     Delete();
  265.     MakeActive();
  266. }
  267.  
  268. void HelpWindow::baseReset()
  269. {
  270.     base = 0;
  271. }
  272.