home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / EDITOR / TDE120.ZIP / TDEKEYS.C < prev    next >
Encoding:
C/C++ Source or Header  |  1991-10-05  |  11.5 KB  |  369 lines

  1. /*
  2.  * This module contains all the routines needed to redefine the keys.
  3.  *
  4.  * Program Name:  tdecfg
  5.  * Author:        Frank Davis
  6.  * Date:          October 5, 1991
  7.  */
  8.  
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13.  
  14. #include "tdecfg.h"
  15. #include "tdekeys.h"
  16.  
  17. extern struct vcfg cfg;
  18. extern FILE *tde_exe;                  /* FILE pointer to tde.exe */
  19.  
  20. static WINDOW *w_ptr;
  21.  
  22.  
  23. /********    EXTREMELY IMPORTANT   ************/
  24. /*
  25.  * If you modify tde, it is your responsibility to find the offset of
  26.  * the key definition array in your new executable, tde.exe.
  27.  *
  28.  */
  29.  
  30. #define KEYS_OFFSET     50154l
  31.  
  32.  
  33. /*
  34.  * Name:    tdekeys
  35.  * Date:    October 1, 1991
  36.  * Notes:   Set up most of the window global variables.
  37.  */
  38. void tdekeys( void )
  39. {
  40. HELP_WINDOW hw;
  41. char t[80];
  42. int  ch;
  43. int  i;
  44.  
  45.    w_ptr = NULL;
  46.    hw.dply_col = 2;
  47.    hw.dply_row = 3;
  48.    hw.line_length = 60;
  49.    hw.avail_lines = 12;
  50.    hw.v_row = 0;
  51.    hw.select = 0;
  52.    hw.num_entries = AVAIL_KEYS;
  53.    hw.ulft_col = 7;
  54.    hw.ulft_row = 2;
  55.    hw.total_col = 64;
  56.    hw.total_row = 20;
  57.  
  58.    initialize_keys( );
  59.    master_help( &hw, key_defs, key_head, t, &ch );
  60.    if (ch == F10) {
  61.       for (i=0; i<hw.num_entries; i++)
  62.          key_func[key_defs[i].key_index].func = key_defs[i].func_index;
  63.       fseek( tde_exe, KEYS_OFFSET, SEEK_SET );
  64.       fwrite( (void *)key_func, sizeof(DISPATCH_TABLE), MAX_KEYS, tde_exe );
  65.    }
  66.    for (i=0; i<hw.num_entries; i++)
  67.       key_defs[i].key[0] = ' ';
  68. }
  69.  
  70.  
  71. /*
  72.  * Name:    initialize_keys
  73.  * Date:    October 1, 1991
  74.  * Notes:   Get the current key definitions from the tde executable file.
  75.  */
  76. void initialize_keys( void )
  77. {
  78. int i, j;
  79.  
  80.    fseek( tde_exe, KEYS_OFFSET, SEEK_SET );
  81.    fread( (void *)key_func, sizeof(DISPATCH_TABLE), MAX_KEYS, tde_exe );
  82.    for (i=0; i<AVAIL_KEYS; i++)
  83.       key_defs[i].func_index = key_func[key_defs[i].key_index].func;
  84. }
  85.  
  86.  
  87. /*
  88.  * Name:    show_key_def_list
  89.  * Date:    October 1, 1991
  90.  * Notes:   Show the key name and current function in a window.
  91.  */
  92. void show_key_def_list( HELP_WINDOW *hw, KEY_DEFS *keys )
  93. {
  94. int row, col, i, j;
  95.  
  96.    col = hw->ulft_col + hw->dply_col;
  97.    row = hw->ulft_row + hw->dply_row;
  98.    scroll_window( 0, row, col, row+hw->avail_lines-1, col+hw->line_length,
  99.                   NORMAL );
  100.    i = 0;
  101.    j = hw->select - hw->v_row;
  102.    for (; i < hw->avail_lines && j<hw->num_entries; ++i, j++, row++) {
  103.       s_output( keys[j].key, row, col, NORMAL );
  104.       s_output(  avail_func[keys[j].func_index], row, col+39, NORMAL );
  105.    }
  106. }
  107.  
  108.  
  109. /*
  110.  * Name:    show_func_list
  111.  * Date:    October 1, 1991
  112.  * Notes:   Show the available functions in the small pop-up window.
  113.  */
  114. void show_func_list( HELP_WINDOW *hw, char *func[] )
  115. {
  116. int row, col, i, j;
  117.  
  118.    col = hw->ulft_col + hw->dply_col;
  119.    row = hw->ulft_row + hw->dply_row;
  120.    scroll_window( 0, row, col, row+hw->avail_lines-1, col+hw->line_length,
  121.                   NORMAL );
  122.    i = 0;
  123.    j = hw->select - hw->v_row;
  124.    for (; i < hw->avail_lines && j<hw->num_entries; ++i, j++, row++)
  125.       s_output( func[j], row, col, NORMAL );
  126. }
  127.  
  128.  
  129. /*
  130.  * Name:    position_cursor
  131.  * Date:    October 1, 1991
  132.  * Notes:   Given a key from the user, find out what action to do.
  133.  */
  134. void position_cursor( HELP_WINDOW *hw, int len, int *un, int *cc, int *ch )
  135. {
  136. int col, row, y, yy;
  137.  
  138.    col = hw->ulft_col + hw->dply_col;
  139.    row = hw->ulft_row + hw->dply_row + hw->v_row;
  140.    y  = hw->ulft_row + hw->dply_row;
  141.    yy = hw->ulft_row + hw->dply_row + hw->avail_lines - 1;
  142.    *un = FALSE;
  143.    switch (*ch) {
  144.       case UP    :
  145.          if (hw->v_row > 0 && hw->select > 0) {
  146.             hlight_line( col, row, len, NORMAL );
  147.             --hw->v_row;
  148.             --hw->select;
  149.             *cc = TRUE;
  150.          } else if (hw->v_row == 0 && hw->select > 0) {
  151.             hlight_line( col, row, len, NORMAL );
  152.             --hw->select;
  153.             scroll_window( -1, y, col, yy+1, col+hw->line_length, NORMAL );
  154.             *un = TRUE;
  155.             *cc = TRUE;
  156.          }
  157.          break;
  158.       case DOWN :
  159.          if (hw->v_row < hw->avail_lines-1 &&
  160.                                       hw->select < hw->num_entries-1) {
  161.             hlight_line( col, row, len, NORMAL );
  162.             ++hw->v_row;
  163.             ++hw->select;
  164.             *cc = TRUE;
  165.          } else if (hw->v_row == hw->avail_lines-1 &&
  166.                                       hw->select < hw->num_entries-1) {
  167.             hlight_line( col, row, len, NORMAL );
  168.             ++hw->select;
  169.             scroll_window( 1, y, col, yy, col+hw->line_length, NORMAL );
  170.             *un = TRUE;
  171.             *cc = TRUE;
  172.          } else if (hw->select == hw->num_entries - 1 && hw->v_row > 0) {
  173.             --hw->v_row;
  174.             scroll_window(1, y, col, yy, col+hw->line_length, NORMAL );
  175.          }
  176.          break;
  177.    }
  178. }
  179.  
  180.  
  181. /*
  182.  * Name:    master_help
  183.  * Date:    October 1, 1991
  184.  * Notes:   master routine for setting up a help window.
  185.  */
  186. void master_help( HELP_WINDOW *hw, KEY_DEFS *help, struct screen *help_heading,
  187.                   char *t, int *ch )
  188. {
  189. int col, row, i;
  190. int update_name, change_color, draw_page;
  191. char str[80];
  192. HELP_WINDOW hw_k;
  193.  
  194.    xygoto( -1, -1 );
  195.    save_and_draw( hw, help_heading, &w_ptr );
  196.    show_key_def_list( hw, help );
  197.  
  198.    col = hw->ulft_col + hw->dply_col;
  199.    row = hw->ulft_row + hw->dply_row + hw->v_row;
  200.    change_color = TRUE;
  201.    *ch = 0;
  202.    while (*ch!=F3 && *ch != F10 && *ch!=ESC) {
  203.       draw_page = FALSE;
  204.       strcpy( str, help[hw->select].key );
  205.       position_cursor( hw, hw->line_length, &update_name, &change_color, ch );
  206.       switch (*ch) {
  207.          case PGUP :
  208.             if (hw->select > hw->avail_lines-1) {
  209.                hw->select = hw->select - hw->avail_lines;
  210.                if (hw->v_row > hw->select)
  211.                   hw->select = hw->v_row;
  212.                draw_page = TRUE;
  213.             } else if (hw->select - hw->v_row > 0) {
  214.                hw->select = hw->v_row;
  215.                draw_page = TRUE;
  216.             }
  217.             break;
  218.          case PGDN :
  219.             if (hw->select + hw->avail_lines < hw->num_entries) {
  220.                hw->select = hw->select + hw->avail_lines;
  221.                draw_page = TRUE;
  222.             } else if (hw->select + hw->avail_lines - hw->v_row <
  223.                                                          hw->num_entries) {
  224.                hw->select = hw->num_entries - 1;
  225.                draw_page = TRUE;
  226.             }
  227.             if ((hw->num_entries - 1) - hw->select <
  228.                                               hw->avail_lines && draw_page) {
  229.                i = row - hw->v_row;
  230.                scroll_window( 0, i, col, i+hw->avail_lines-1,
  231.                               col+hw->line_length, NORMAL );
  232.             }
  233.             break;
  234.          case F5 :
  235.             hw_k.dply_col = 2;
  236.             hw_k.dply_row = 3;
  237.             hw_k.line_length = 33;
  238.             hw_k.avail_lines = 6;
  239.             hw_k.v_row = 0;
  240.             hw_k.select = 0;
  241.             hw_k.num_entries = 77;
  242.             hw_k.ulft_col = 20;
  243.             hw_k.ulft_row = row + 1;
  244.             if (hw_k.ulft_row > 12)
  245.                hw_k.ulft_row = row - 12;
  246.             hw_k.total_col = 37;
  247.             hw_k.total_row = 12;
  248.             new_assignment_help( &hw_k, avail_func, func_head, ch );
  249.             if (*ch == RTURN) {
  250.                help[hw->select].key[0] = '*';
  251.                help[hw->select].func_index = (unsigned char)hw_k.select;
  252.                s_output( help[hw->select].key, row, col, cfg.attr );
  253.                s_output( "                     ", row, col+39, cfg.attr );
  254.                s_output( avail_func[help[hw->select].func_index],
  255.                          row, col+39, cfg.attr );
  256.                *ch = 0;
  257.             }
  258.             break;
  259.       }
  260.       if (draw_page == TRUE) {
  261.          show_key_def_list( hw, help );
  262.          update_name = TRUE;
  263.          change_color = TRUE;
  264.       }
  265.       row = hw->ulft_row + hw->dply_row + hw->v_row;
  266.       if (update_name) {
  267.          s_output( help[hw->select].key, row, col, NORMAL );
  268.          s_output( avail_func[help[hw->select].func_index], row, col+39,
  269.                       NORMAL );
  270.       }
  271.       if (change_color)
  272.          hlight_line( col, row, hw->line_length, cfg.attr );
  273.       *ch = getkey( );
  274.       change_color = FALSE;
  275.    }
  276.    window_control( &w_ptr, RESTORE, hw->ulft_col, hw->ulft_row,
  277.                    hw->total_col, hw->total_row );
  278. }
  279.  
  280.  
  281. /*
  282.  * Name:    new_assignment_help
  283.  * Date:    October 1, 1991
  284.  * Notes:   customized the master_help routine for the available functions.
  285.  */
  286. void new_assignment_help( HELP_WINDOW *hw, char *help[],
  287.                           struct screen *help_heading, int *ch )
  288. {
  289. int col, row, i;
  290. int update_name, change_color, draw_page;
  291. char str[80];
  292.  
  293.    save_and_draw( hw, help_heading, &w_ptr );
  294.    show_func_list( hw, help );
  295.  
  296.    col = hw->ulft_col + hw->dply_col;
  297.    row = hw->ulft_row + hw->dply_row + hw->v_row;
  298.    change_color = TRUE;
  299.    *ch = 0;
  300.    while (*ch!=RTURN && *ch!=ESC) {
  301.       draw_page = FALSE;
  302.       strcpy( str, help[hw->select] );
  303.       position_cursor( hw, hw->line_length, &update_name, &change_color, ch );
  304.       switch (*ch) {
  305.          case PGUP :
  306.             if (hw->select > hw->avail_lines-1) {
  307.                hw->select = hw->select - hw->avail_lines;
  308.                if (hw->v_row > hw->select)
  309.                   hw->select = hw->v_row;
  310.                draw_page = TRUE;
  311.             } else if (hw->select - hw->v_row > 0) {
  312.                hw->select = hw->v_row;
  313.                draw_page = TRUE;
  314.             }
  315.             break;
  316.          case PGDN :
  317.             if (hw->select + hw->avail_lines < hw->num_entries) {
  318.                hw->select = hw->select + hw->avail_lines;
  319.                draw_page = TRUE;
  320.             } else if (hw->select + hw->avail_lines - hw->v_row <
  321.                                                          hw->num_entries) {
  322.                hw->select = hw->num_entries - 1;
  323.                draw_page = TRUE;
  324.             }
  325.             if ((hw->num_entries - 1) - hw->select <
  326.                                               hw->avail_lines && draw_page) {
  327.                i = row - hw->v_row;
  328.                scroll_window( 0, i, col, i+hw->avail_lines-1,
  329.                               col+hw->line_length, NORMAL );
  330.             }
  331.             break;
  332.       }
  333.       if (draw_page == TRUE) {
  334.          show_func_list( hw, help );
  335.          update_name = TRUE;
  336.          change_color = TRUE;
  337.       }
  338.       row = hw->ulft_row + hw->dply_row + hw->v_row;
  339.       if (update_name)
  340.          s_output( help[hw->select], row, col, NORMAL );
  341.       if (change_color)
  342.          hlight_line( col, row, hw->line_length, cfg.attr );
  343.       *ch = getkey( );
  344.       change_color = FALSE;
  345.    }
  346.    window_control( &w_ptr, RESTORE, hw->ulft_col, hw->ulft_row,
  347.                    hw->total_col, hw->total_row );
  348.    if (*ch != RTURN)
  349.       *ch = 0;
  350. }
  351.  
  352.  
  353. /*
  354.  * Name:    save_and_draw
  355.  * Date:    October 1, 1991
  356.  * Notes:   save the contents of the screen where the pop-up or pull-down
  357.  *          window is to be displayed.  then draw the outline of the window
  358.  *          and show the help.
  359.  */
  360. void save_and_draw( HELP_WINDOW *hw, struct screen *help_heading,
  361.                     WINDOW **w_ptr )
  362. {
  363.    window_control( w_ptr, SAVE, hw->ulft_col, hw->ulft_row,
  364.                    hw->total_col, hw->total_row );
  365.    make_window( hw->ulft_col, hw->ulft_row, hw->total_col, hw->total_row,
  366.                 NORMAL );
  367.    show_box( hw->ulft_col, hw->ulft_row, help_heading, NORMAL );
  368. }
  369.