home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 411b.lha / dme_1.42 / src.LZH / src / menu.c < prev    next >
C/C++ Source or Header  |  1990-04-01  |  5KB  |  290 lines

  1.  
  2. /*
  3.  *  MENU.C
  4.  *
  5.  *  Menu routines... made to take up as little space as possible, and
  6.  *  thus uses many tricks which you should watch out for.
  7.  */
  8.  
  9. #include "defs.h"
  10.  
  11. typedef struct {
  12.     ITEM item;
  13.     char *com;
  14. } XITEM;
  15.  
  16. short Menuoff;
  17. short DoMenuoff;
  18.  
  19. MENU *Menu;
  20.  
  21. void
  22. menu_strip(win)
  23. WIN *win;
  24. {
  25.     if (!Menuoff && Menu) {
  26.     SetMenuStrip(win,Menu);
  27.     Forbid();
  28.     win->Flags &= ~RMBTRAP;
  29.     Permit();
  30.     }
  31. }
  32.  
  33. void
  34. menu_off()
  35. {
  36.     ED *ed;
  37.     if (Menuoff == 0) {
  38.     for (ed = (ED *)DBase.mlh_Head; ed->Node.mln_Succ; ed = (ED *)ed->Node.mln_Succ) {
  39.         ClearMenuStrip(ed->Win);
  40.         Forbid();
  41.         ed->Win->Flags |= RMBTRAP;
  42.         Permit();
  43.     }
  44.     }
  45.     ++Menuoff;
  46. }
  47.  
  48. void
  49. menu_on()
  50. {
  51.     ED *ed;
  52.     if (Menu && Menuoff == 1) {
  53.     fixmenu();
  54.     for (ed = (ED *)DBase.mlh_Head; ed->Node.mln_Succ; ed = (ED *)ed->Node.mln_Succ) {
  55.         SetMenuStrip(ed->Win,Menu);
  56.         Forbid();
  57.         ed->Win->Flags &= ~RMBTRAP;
  58.         Permit();
  59.     }
  60.     }
  61.     --Menuoff;
  62. }
  63.  
  64. void
  65. do_menuoff()
  66. {
  67.     menu_off();
  68.     ++DoMenuoff;
  69. }
  70.  
  71. void
  72. do_menuon()
  73. {
  74.     if (DoMenuoff) {
  75.     --DoMenuoff;
  76.     menu_on();
  77.     }
  78. }
  79.  
  80. char *
  81. menutomacro(str)
  82. char *str;
  83. {
  84.     char header[64];
  85.     char itembuf[64];
  86.     short i;
  87.     char *ptr;
  88.     MENU *menu;
  89.     ITEM *item;
  90.  
  91.     for (i = 0; str[i] && str[i] != '-'; ++i);
  92.     if (str[i] == '-') {
  93.     strncpy(header, str, i);
  94.     header[i] = 0;
  95.     strcpy(itembuf, str + i + 1);
  96.     for (menu = Menu; menu; menu = menu->NextMenu) {
  97.         if (ncstrcmp(header, menu->MenuName) == 0) {
  98.         for (item = menu->FirstItem; item; item = item->NextItem) {
  99.             ptr = (char *)((ITEXT *)item->ItemFill)->IText;
  100.             if (ncstrcmp(itembuf, ptr) == 0) {
  101.             ptr = ((XITEM *)item)->com;
  102.             goto done;
  103.             }
  104.         }
  105.         }
  106.     }
  107.     }
  108.     ptr = NULL;
  109. done:
  110.     return(ptr);
  111. }
  112.  
  113. char *
  114. menu_cmd(im)
  115. IMESS *im;
  116. {
  117.     XITEM *item;
  118.  
  119.     if (item = (XITEM *)ItemAddress(Menu, im->Code))
  120.     return(item->com);
  121.     return(NULL);
  122. }
  123.  
  124. void
  125. fixmenu()
  126. {
  127.     MENU *menu;
  128.     ITEM *item;
  129.     ITEXT *it;
  130.     int row, col, maxc, scr;
  131.  
  132.     col = 0;
  133.     for (menu = Menu; menu; menu = menu->NextMenu) {
  134.     short hdr_width;
  135.     maxc = strlen(menu->MenuName);
  136.     hdr_width = maxc * 8 + 16;
  137.     menu->Width = hdr_width;
  138.     row = 0;
  139.     for (item = menu->FirstItem; item; item = item->NextItem) {
  140.         it = (ITEXT *)item->ItemFill;
  141.         item->TopEdge = row;
  142.         scr = strlen(((ITEXT *)item->ItemFill)->IText);
  143.         if (scr > maxc)
  144.         maxc = scr;
  145.         item->Height = 10;
  146.         row += item->Height;
  147.     }
  148.     maxc = (maxc * 8) + 16;
  149.     for (item = menu->FirstItem; item; item = item->NextItem)
  150.         item->Width = maxc;
  151.     menu->LeftEdge = col;
  152.     menu->Height = row;
  153.     col += hdr_width;
  154.     }
  155. }
  156.  
  157. /*
  158.  *  menuclear
  159.  *  menuadd    header    item    command
  160.  *  menudel    header    item
  161.  *  menudelhdr    header
  162.  */
  163.  
  164. void
  165. do_menuclear()
  166. {
  167.     menu_off();
  168.     while (Menu) {
  169.     av[1] = (ubyte *)Menu->MenuName;
  170.     do_menudelhdr();
  171.     }
  172.     menu_on();
  173. }
  174.  
  175. void
  176. do_menuadd()
  177. {
  178.     MENU *menu, **mpr;
  179.     ITEM *item, **ipr;
  180.     ITEXT *it;
  181.  
  182.     menu_off();
  183.     mpr = &Menu;
  184.     for (menu = *mpr; menu; menu = *mpr) {
  185.     if (strcmp(av[1], menu->MenuName) == 0) {
  186.         ipr = &menu->FirstItem;
  187.         for (item = *ipr; item; item = *ipr) {
  188.         if (strcmp(av[2], ((ITEXT *)item->ItemFill)->IText) == 0)
  189.             goto newname;
  190.         ipr = &item->NextItem;
  191.         }
  192.         goto newitem;
  193.     }
  194.     mpr = &menu->NextMenu;
  195.     }
  196. newmenu:    /*    create new menu */
  197.     menu = malloc(sizeof(MENU));
  198.     clrmem(menu, sizeof(MENU));
  199.     menu->NextMenu = *mpr;
  200.     *mpr = menu;
  201.     menu->Flags = MENUENABLED;
  202.     menu->MenuName = malloc(strlen(av[1])+1);
  203.     strcpy(menu->MenuName, av[1]);
  204.     ipr = &menu->FirstItem;
  205.     *ipr = NULL;
  206. newitem:    /*    create new item */
  207.     it = malloc(sizeof(ITEXT));
  208.     clrmem(it, sizeof(ITEXT));
  209.     it->BackPen = 1;
  210.     it->DrawMode = JAM2;
  211.     it->IText = malloc(strlen(av[2])+1);
  212.     strcpy(it->IText, av[2]);
  213.     item = malloc(sizeof(XITEM));
  214.     clrmem(item, sizeof(XITEM));
  215.     item->NextItem = *ipr;
  216.     *ipr = item;
  217.     item->ItemFill = (APTR)it;
  218.     item->Flags = ITEMTEXT|ITEMENABLED|HIGHCOMP;
  219. newname:    /*    create new name */
  220.     if (((XITEM *)item)->com)
  221.     free(((XITEM *)item)->com);
  222.     ((XITEM *)item)->com = malloc(strlen(av[3])+1);
  223.     strcpy(((XITEM *)item)->com, av[3]);
  224.     menu_on();
  225. }
  226.  
  227. void
  228. do_menudelhdr()
  229. {
  230.     MENU *menu;
  231.     MENU **mpr;
  232.  
  233.     menu_off();
  234.     mpr = &Menu;
  235.     for (menu = *mpr; menu; menu = *mpr) {
  236.     if (strcmp(av[1], menu->MenuName) == 0) {
  237.         if (menu->FirstItem) {
  238.         while (menu->FirstItem) {
  239.             av[2] = ((ITEXT *)menu->FirstItem->ItemFill)->IText;
  240.             if (do_menudel())
  241.             break;
  242.         }
  243.         break;
  244.         }
  245.         *mpr = menu->NextMenu;
  246.         free(menu->MenuName);
  247.         free(menu);
  248.         break;
  249.     }
  250.     mpr = &menu->NextMenu;
  251.     }
  252.     menu_on();
  253. }
  254.  
  255. int
  256. do_menudel()
  257. {
  258.     MENU *menu;
  259.     ITEM *item, **ipr;
  260.     ITEXT *it;
  261.     short ret = 0;
  262.  
  263.     menu_off();
  264.     for (menu = Menu; menu; menu = menu->NextMenu) {
  265.     if (strcmp(av[1], menu->MenuName) == 0) {
  266.         ipr = &menu->FirstItem;
  267.         for (item = *ipr; item; item = *ipr) {
  268.         it = (ITEXT *)item->ItemFill;
  269.         if (strcmp(av[2], it->IText) == 0) {
  270.             *ipr = item->NextItem;
  271.             free(it->IText);
  272.             free(it);
  273.             free(((XITEM *)item)->com);
  274.             free(item);
  275.             if (!menu->FirstItem) {
  276.             do_menudelhdr();
  277.             ret = 1;
  278.             }
  279.             menu_on();
  280.             return((int)ret);
  281.         }
  282.         ipr = &item->NextItem;
  283.         }
  284.     }
  285.     }
  286.     menu_on();
  287.     return((int)ret);
  288. }
  289.  
  290.