home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 500-599 / ff562.lza / Intuisup / Editor / source.lzh / list.c < prev    next >
C/C++ Source or Header  |  1991-10-25  |  10KB  |  303 lines

  1.         /*************************************
  2.          *                                   *
  3.          *            Editor v1.0            *
  4.          *   by Torsten Jürgeleit in 10/91   *
  5.          *                                   *
  6.          *       Text list editor part       *
  7.          *                                   *
  8.          *************************************/
  9.  
  10.     /* Includes */
  11.  
  12. #include "includes.h"
  13. #include "defines.h"
  14. #include "imports.h"
  15. #include "protos.h"
  16.  
  17.     /* Defines for text list editor gadgets */
  18.  
  19. #define LIST_GADGET_LISTVIEW        0
  20. #define LIST_GADGET_STRING        1
  21. #define LIST_GADGET_EDIT        2
  22. #define LIST_GADGET_ADD            3
  23. #define LIST_GADGET_INSERT        4
  24. #define LIST_GADGET_DELETE        5
  25.  
  26. #define LIST_GADGET1_TYPE        GADGET_DATA_TYPE_LISTVIEW
  27. #define LIST_GADGET1_FLAGS        GADGET_DATA_FLAG_HOT_KEY
  28. #define LIST_GADGET1_TEXT        "Text _list"
  29. #define LIST_GADGET1_LEFT_EDGE        10
  30. #define LIST_GADGET1_TOP_EDGE        28
  31. #define LIST_GADGET1_WIDTH        196
  32. #define LIST_GADGET1_HEIGHT        31
  33. #define LIST_GADGET1_TEXT_ATTR        &topaz80_attr
  34. #define LIST_GADGET1_SPACING        1
  35. #define LIST_GADGET1_TOP        0
  36. #define LIST_GADGET1_LIST        NULL
  37.  
  38. #define LIST_GADGET2_TYPE        GADGET_DATA_TYPE_STRING
  39. #define LIST_GADGET2_FLAGS        (GADGET_DATA_FLAG_HOT_KEY | GADGET_DATA_FLAG_TEXT_RIGHT)
  40. #define LIST_GADGET2_LEFT_EDGE        LIST_GADGET1_LEFT_EDGE
  41. #define LIST_GADGET2_TOP_EDGE        (LIST_GADGET1_TOP_EDGE + LIST_GADGET1_HEIGHT + 1)
  42. #define LIST_GADGET2_WIDTH        (LIST_GADGET1_WIDTH - (4 + 1) * 8)
  43. #define LIST_GADGET2_HEIGHT        12
  44. #define LIST_GADGET2_TEXT        "_Text"
  45. #define LIST_GADGET2_TEXT_ATTR        &topaz80_attr
  46. #define LIST_GADGET2_INPUT_LEN        80
  47. #define LIST_GADGET2_INPUT_NEXT        0
  48. #define LIST_GADGET2_INPUT_DEFAULT    NULL
  49.  
  50. #define LIST_GADGET3_TYPE        GADGET_DATA_TYPE_BUTTON
  51. #define LIST_GADGET3_FLAGS        (GADGET_DATA_FLAG_HOT_KEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  52. #define LIST_GADGET3_LEFT_EDGE        LIST_GADGET1_LEFT_EDGE
  53. #define LIST_GADGET3_TOP_EDGE        (LIST_GADGET2_TOP_EDGE + LIST_GADGET2_HEIGHT + 3)
  54. #define LIST_GADGET3_WIDTH        ((LIST_GADGET1_WIDTH - 3 * 4) / 4)
  55. #define LIST_GADGET3_HEIGHT        13
  56. #define LIST_GADGET3_TEXT        "_Edit"
  57. #define LIST_GADGET3_TEXT_ATTR        &topaz80_attr
  58.  
  59. #define LIST_GADGET4_TYPE        GADGET_DATA_TYPE_BUTTON
  60. #define LIST_GADGET4_FLAGS        (GADGET_DATA_FLAG_HOT_KEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  61. #define LIST_GADGET4_LEFT_EDGE        (LIST_GADGET3_LEFT_EDGE + LIST_GADGET3_WIDTH + 4)
  62. #define LIST_GADGET4_TOP_EDGE        LIST_GADGET3_TOP_EDGE
  63. #define LIST_GADGET4_WIDTH        LIST_GADGET3_WIDTH
  64. #define LIST_GADGET4_HEIGHT        LIST_GADGET3_HEIGHT
  65. #define LIST_GADGET4_TEXT        "_Add"
  66. #define LIST_GADGET4_TEXT_ATTR        &topaz80_attr
  67.  
  68. #define LIST_GADGET5_TYPE        GADGET_DATA_TYPE_BUTTON
  69. #define LIST_GADGET5_FLAGS        (GADGET_DATA_FLAG_HOT_KEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  70. #define LIST_GADGET5_LEFT_EDGE        (LIST_GADGET4_LEFT_EDGE + LIST_GADGET4_WIDTH + 4)
  71. #define LIST_GADGET5_TOP_EDGE        LIST_GADGET4_TOP_EDGE
  72. #define LIST_GADGET5_WIDTH        LIST_GADGET4_WIDTH
  73. #define LIST_GADGET5_HEIGHT        LIST_GADGET4_HEIGHT
  74. #define LIST_GADGET5_TEXT        "_Ins"
  75. #define LIST_GADGET5_TEXT_ATTR        &topaz80_attr
  76.  
  77. #define LIST_GADGET6_TYPE        GADGET_DATA_TYPE_BUTTON
  78. #define LIST_GADGET6_FLAGS        (GADGET_DATA_FLAG_HOT_KEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  79. #define LIST_GADGET6_LEFT_EDGE        (LIST_GADGET5_LEFT_EDGE + LIST_GADGET5_WIDTH + 4)
  80. #define LIST_GADGET6_TOP_EDGE        LIST_GADGET5_TOP_EDGE
  81. #define LIST_GADGET6_WIDTH        LIST_GADGET5_WIDTH
  82. #define LIST_GADGET6_HEIGHT        LIST_GADGET5_HEIGHT
  83. #define LIST_GADGET6_TEXT        "_Del"
  84. #define LIST_GADGET6_TEXT_ATTR        &topaz80_attr
  85.  
  86.     /* Statics for text list editor gadgets */
  87.  
  88. struct GadgetData  list_gadget_data[] = {
  89.    {
  90.     LIST_GADGET1_TYPE,        /* gd_Type */
  91.     LIST_GADGET1_FLAGS,        /* gd_Flags */
  92.     LIST_GADGET1_LEFT_EDGE,        /* gd_LeftEdge */
  93.     LIST_GADGET1_TOP_EDGE,        /* gd_TopEdge */
  94.     LIST_GADGET1_WIDTH,        /* gd_Width */
  95.     LIST_GADGET1_HEIGHT,        /* gd_Height */
  96.     LIST_GADGET1_TEXT,        /* *gd_Text */
  97.     LIST_GADGET1_TEXT_ATTR,        /* *gd_TextAttr */
  98.     {
  99.     LIST_GADGET1_SPACING,        /* gd_ListViewSpacing */
  100.     LIST_GADGET1_TOP,        /* gd_ListViewTop */
  101.     LIST_GADGET1_LIST        /* gd_ListViewList */
  102.     }
  103.    }, {
  104.     LIST_GADGET2_TYPE,        /* gd_Type */
  105.     LIST_GADGET2_FLAGS,        /* gd_Flags */
  106.     LIST_GADGET2_LEFT_EDGE,        /* gd_LeftEdge */
  107.     LIST_GADGET2_TOP_EDGE,        /* gd_TopEdge */
  108.     LIST_GADGET2_WIDTH,        /* gd_Width */
  109.     LIST_GADGET2_HEIGHT,        /* gd_Height */
  110.     LIST_GADGET2_TEXT,        /* *gd_Text */
  111.     LIST_GADGET2_TEXT_ATTR,        /* *gd_TextAttr */
  112.     {
  113.     LIST_GADGET2_INPUT_LEN,        /* gd_InputLen */
  114.     LIST_GADGET2_INPUT_NEXT,    /* gd_InputActivateNext/Prev */
  115.     LIST_GADGET2_INPUT_DEFAULT    /* gd_InputDefault */
  116.     }
  117.    }, {
  118.     LIST_GADGET3_TYPE,        /* gd_Type */
  119.     LIST_GADGET3_FLAGS,        /* gd_Flags */
  120.     LIST_GADGET3_LEFT_EDGE,        /* gd_LeftEdge */
  121.     LIST_GADGET3_TOP_EDGE,        /* gd_TopEdge */
  122.     LIST_GADGET3_WIDTH,        /* gd_Width */
  123.     LIST_GADGET3_HEIGHT,        /* gd_Height */
  124.     LIST_GADGET3_TEXT,        /* *gd_Text */
  125.     LIST_GADGET3_TEXT_ATTR,        /* *gd_TextAttr */
  126.     { 0, 0, 0 }
  127.    }, {
  128.     LIST_GADGET4_TYPE,        /* gd_Type */
  129.     LIST_GADGET4_FLAGS,        /* gd_Flags */
  130.     LIST_GADGET4_LEFT_EDGE,        /* gd_LeftEdge */
  131.     LIST_GADGET4_TOP_EDGE,        /* gd_TopEdge */
  132.     LIST_GADGET4_WIDTH,        /* gd_Width */
  133.     LIST_GADGET4_HEIGHT,        /* gd_Height */
  134.     LIST_GADGET4_TEXT,        /* *gd_Text */
  135.     LIST_GADGET4_TEXT_ATTR,        /* *gd_TextAttr */
  136.     { 0, 0, 0 }
  137.    }, {
  138.     LIST_GADGET5_TYPE,        /* gd_Type */
  139.     LIST_GADGET5_FLAGS,        /* gd_Flags */
  140.     LIST_GADGET5_LEFT_EDGE,        /* gd_LeftEdge */
  141.     LIST_GADGET5_TOP_EDGE,        /* gd_TopEdge */
  142.     LIST_GADGET5_WIDTH,        /* gd_Width */
  143.     LIST_GADGET5_HEIGHT,        /* gd_Height */
  144.     LIST_GADGET5_TEXT,        /* *gd_Text */
  145.     LIST_GADGET5_TEXT_ATTR,    /* *gd_TextAttr */
  146.     { 0, 0, 0 }
  147.    }, {
  148.     LIST_GADGET6_TYPE,        /* gd_Type */
  149.     LIST_GADGET6_FLAGS,        /* gd_Flags */
  150.     LIST_GADGET6_LEFT_EDGE,        /* gd_LeftEdge */
  151.     LIST_GADGET6_TOP_EDGE,        /* gd_TopEdge */
  152.     LIST_GADGET6_WIDTH,        /* gd_Width */
  153.     LIST_GADGET6_HEIGHT,        /* gd_Height */
  154.     LIST_GADGET6_TEXT,        /* *gd_Text */
  155.     LIST_GADGET6_TEXT_ATTR,        /* *gd_TextAttr */
  156.     { 0, 0, 0 }
  157.    }, {
  158.     INTUISUP_DATA_END        /* mark end of gadget data array */
  159.    }
  160. };
  161. STATIC struct Node  *last_node;    /* last selected text list entry */
  162. STATIC BYTE   *last_text;    /* last text defined by string gadget */
  163. STATIC USHORT list_mode;
  164.  
  165.     /* Change mode of text list editor mode */
  166.  
  167.    VOID
  168. change_text_list_editor_mode(APTR gl, USHORT mode)
  169. {
  170.    /* Unselect old mode gadget */
  171.    ISetGadgetAttributes(gl, LIST_GADGET_EDIT + list_mode, 0L, 0L,
  172.                   USE_CURRENT_VALUE, (VOID *)USE_CURRENT_VALUE);
  173.    /* Select new mode gadget */
  174.    ISetGadgetAttributes(gl, LIST_GADGET_EDIT + mode, 0L, 1L,
  175.                   USE_CURRENT_VALUE, (VOID *)USE_CURRENT_VALUE);
  176.    list_mode = mode;
  177.  
  178.    /* Reset string gadget and some variables */
  179.    ISetGadgetAttributes(gl, LIST_GADGET_STRING, 0L, USE_CURRENT_VALUE,
  180.                            USE_CURRENT_VALUE, NULL);
  181.    last_node = NULL;
  182.    last_text = NULL;
  183. }
  184.     /* Perform gadget action text list editor */
  185.  
  186.    SHORT
  187. perform_text_list_editor_action(APTR gl, struct Template  *tp, USHORT entry,
  188.                                 ULONG value)
  189. {
  190.    struct List  *list = &tp->tp_TextList;
  191.    struct Node  *node, *list_node;
  192.    struct GadgetData  *gd = &tp->tp_Data.tp_GadgetData;
  193.    BYTE  *text, **text_array;
  194.    SHORT status = EDITOR_STATUS_NORMAL;
  195.  
  196.    switch (entry) {
  197.       case LIST_GADGET_LISTVIEW :
  198.      node = last_node = get_node(list, (USHORT)value);
  199.      switch (list_mode) {
  200.         case LIST_MODE_EDIT :
  201.         case LIST_MODE_ADD :
  202.  
  203.            /* Copy selected text to string gadget */
  204.            ISetGadgetAttributes(gl, LIST_GADGET_STRING, 0L,
  205.                USE_CURRENT_VALUE, USE_CURRENT_VALUE, node->ln_Name);
  206.            break;
  207.  
  208.         case LIST_MODE_INSERT :
  209.  
  210.            /* Insert text from string gadget before selected entry */
  211.            if (last_text) {
  212.           list_node = get_pred(node);
  213.           if (!(node = build_text_list_entry(last_text))) {
  214.              status = EDITOR_ERROR_OUT_OF_MEM;
  215.           } else {
  216.              Insert(list, node, list_node);
  217.              ISetGadgetAttributes(gl, LIST_GADGET_LISTVIEW, 0L,
  218.                 USE_CURRENT_VALUE, USE_CURRENT_VALUE, list);
  219.           }
  220.            }
  221.            break;
  222.  
  223.         case LIST_MODE_DELETE :
  224.  
  225.            /* Delete selected entry */
  226.            Remove(node);
  227.            free_text_list_entry(node);
  228.            ISetGadgetAttributes(gl, LIST_GADGET_LISTVIEW, 0L,
  229.                 USE_CURRENT_VALUE, USE_CURRENT_VALUE, list);
  230.            break;
  231.      }
  232.      break;
  233.  
  234.       case LIST_GADGET_STRING :
  235.      last_text = (BYTE *)value;
  236.      switch (list_mode) {
  237.         case LIST_MODE_EDIT :
  238.  
  239.            /* Replace text of last selected entry by this one */
  240.            if (last_node) {
  241.           if (!(text = DosAllocMem((LONG)(strlen((BYTE *)value) +
  242.                                      1)))) {
  243.              status = EDITOR_ERROR_OUT_OF_MEM;
  244.           } else {
  245.              DosFreeMem(last_node->ln_Name);
  246.              last_node->ln_Name = text;
  247.              strcpy(text, (BYTE *)value);
  248.              ISetGadgetAttributes(gl, LIST_GADGET_LISTVIEW, 0L,
  249.                 USE_CURRENT_VALUE, USE_CURRENT_VALUE, list);
  250.           }
  251.            }
  252.            break;
  253.  
  254.         case LIST_MODE_ADD :
  255.  
  256.            /* Add text to end of list */
  257.            if (!(node = build_text_list_entry((BYTE *)value))) {
  258.           status = EDITOR_ERROR_OUT_OF_MEM;
  259.            } else {
  260.           AddTail(list, node);
  261.           ISetGadgetAttributes(gl, LIST_GADGET_LISTVIEW, 0L,
  262.                 USE_CURRENT_VALUE, USE_CURRENT_VALUE, list);
  263.            }
  264.            break;
  265.      }
  266.      break;
  267.  
  268.       default :
  269.  
  270.      /* Set new text list editor mode */
  271.      change_text_list_editor_mode(gl, entry - LIST_GADGET_EDIT);
  272.      break;
  273.    }
  274.    if (status == EDITOR_STATUS_NORMAL) {
  275.  
  276.       /* Change template data */
  277.       switch (gd->gd_Type) {
  278.      case GADGET_DATA_TYPE_MX :
  279.         text_array = gd->gd_SpecialData.gd_MXData.gd_MXTextArray;
  280.         if ((status = build_template_text_array(tp)) !=
  281.                              EDITOR_STATUS_NORMAL) {
  282.            gd->gd_SpecialData.gd_MXData.gd_MXTextArray = text_array;
  283.         } else {
  284.            DosFreeMem(text_array);
  285.         }
  286.         break;
  287.      case GADGET_DATA_TYPE_CYCLE :
  288.         text_array = gd->gd_SpecialData.gd_CycleData.gd_CycleTextArray;
  289.         if ((status = build_template_text_array(tp)) !=
  290.                              EDITOR_STATUS_NORMAL) {
  291.            gd->gd_SpecialData.gd_CycleData.gd_CycleTextArray = text_array;
  292.         } else {
  293.            DosFreeMem(text_array);
  294.         }
  295.         break;
  296.      case GADGET_DATA_TYPE_LISTVIEW :
  297.         gd->gd_SpecialData.gd_ListViewData.gd_ListViewList = &tp->tp_TextList;
  298.         break;
  299.       }
  300.    }
  301.    return(status);
  302. }
  303.