home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 568b.lha / PowerSource_v3.0 / source.lzh / source / MenuMain.c < prev    next >
C/C++ Source or Header  |  1991-09-15  |  12KB  |  344 lines

  1. /*----------------------------------------------------------------------*
  2.     MenuMain.c version 3.0 - © Copyright 1991 Jaba Development
  3.  
  4.     Author : Jan van den Baard
  5.     Purpose: The main menu editing loop.
  6.  *----------------------------------------------------------------------*/
  7. extern struct Window        *MainWindow;
  8. extern struct Screen        *MainScreen;
  9. extern struct RastPort      *MainRP;
  10. extern struct Menu           MainMenuStrip[];
  11. extern struct Menu           ItemMenuStrip[];
  12. extern struct Menu           SubMenuStrip[], Titles[];
  13. extern struct MenuItem       TheItem[], SubItem[], MainItem[];
  14. extern struct MemoryChain    Memory;
  15. extern struct MyMenuItem     dummy;
  16. extern struct MyMenu        *MenuStrip, *ParentMenu;
  17. extern struct MyMenuItem    *ParentItem;
  18. extern struct ListItem      *MenusList, *ItemsList, *SubsList;
  19. extern ULONG                 Class;
  20. extern UWORD                 Code, Qualifier, FrontPen, BackPen;
  21. extern UWORD                 MenuCount, ItemCount, SubCount, ActEd;
  22. extern UWORD                 MenuTotal, ItemTotal, SubTotal;
  23.  
  24. void TestMenus( void )
  25. {
  26.     if(MenuStrip) {
  27.         SetWindowTitles(MainWindow,(char *)-1L,"Menu testing! ESC to quit!");
  28.         sst("Menu testing! ESC to quit!");
  29.  
  30.         ClearMenuStrip(MainWindow);
  31.         SetMenuStrip(MainWindow,(struct Menu *)MenuStrip);
  32.         while(read_msg(MainWindow));
  33.  
  34.         while(1) {
  35.             WaitPort(MainWindow->UserPort);
  36.             while(read_msg(MainWindow));
  37.             if(Class == RAWKEY && Code == 0x45)
  38.                 break;
  39.         }
  40.  
  41.         ClearMenuStrip(MainWindow);
  42.         SetMenuStrip(MainWindow,&MainMenuStrip[0]);
  43.         refresh();
  44.     }
  45. }
  46.  
  47. void SetMainMenus( void )
  48. {
  49.     ClearMenuStrip(MainWindow);
  50.     if(ActEd == MENUED) {
  51.         SetMenuStrip(MainWindow,&MainMenuStrip[0]);
  52.         if(NOT MenuCount) {
  53.             OffMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(1)|SHIFTSUB(NOSUB)));
  54.             OffMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(2)|SHIFTSUB(NOSUB)));
  55.             OffMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(3)|SHIFTSUB(NOSUB)));
  56.             OffMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(4)|SHIFTSUB(NOSUB)));
  57.         } else {
  58.             OnMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(1)|SHIFTSUB(NOSUB)));
  59.             OnMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(2)|SHIFTSUB(NOSUB)));
  60.             OnMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(3)|SHIFTSUB(NOSUB)));
  61.             OnMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(4)|SHIFTSUB(NOSUB)));
  62.         }
  63.         if(MenuTotal == 31)
  64.             OffMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(0)));
  65.         else
  66.             OnMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(0)));
  67.     } else if(ActEd == ITEMED) {
  68.         SetMenuStrip(MainWindow,&ItemMenuStrip[0]);
  69.         if(NOT ItemCount) {
  70.             OffMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(1)|SHIFTSUB(NOSUB)));
  71.             OffMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(2)|SHIFTSUB(NOSUB)));
  72.             OffMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(3)|SHIFTSUB(NOSUB)));
  73.             OffMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(4)|SHIFTSUB(NOSUB)));
  74.             OffMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(6)|SHIFTSUB(NOSUB)));
  75.         } else {
  76.             OnMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(1)|SHIFTSUB(NOSUB)));
  77.             OnMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(2)|SHIFTSUB(NOSUB)));
  78.             OnMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(3)|SHIFTSUB(NOSUB)));
  79.             OnMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(4)|SHIFTSUB(NOSUB)));
  80.             OnMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(6)|SHIFTSUB(NOSUB)));
  81.         }
  82.         if(ItemTotal == 63)
  83.             OffMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(0)));
  84.         else
  85.             OnMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(0)));
  86.     } else {
  87.         SetMenuStrip(MainWindow,&SubMenuStrip[0]);
  88.         if(NOT SubCount) {
  89.             OffMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(1)|SHIFTSUB(NOSUB)));
  90.             OffMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(2)|SHIFTSUB(NOSUB)));
  91.             OffMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(3)|SHIFTSUB(NOSUB)));
  92.             OffMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(6)|SHIFTSUB(NOSUB)));
  93.         } else {
  94.             OnMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(1)|SHIFTSUB(NOSUB)));
  95.             OnMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(2)|SHIFTSUB(NOSUB)));
  96.             OnMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(3)|SHIFTSUB(NOSUB)));
  97.             OnMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(6)|SHIFTSUB(NOSUB)));
  98.         }
  99.         if(MenuTotal == 31)
  100.             OffMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(0)|SHIFTSUB(0)));
  101.         else
  102.             OnMenu(MainWindow,(SHIFTMENU(0)|SHIFTITEM(0)|SHIFTSUB(0)));
  103.     }
  104. }
  105.  
  106. void CreateList( void )
  107. {
  108.     struct MyMenu       *menus;
  109.     struct MyMenuItem   *items;
  110.     UWORD               count;
  111.  
  112.     if(ActEd == MENUED) {
  113.         if(MenuStrip) {
  114.             for(MenuCount = 0, menus = MenuStrip; menus; MenuCount++, menus = menus->NextMenu);
  115.         } else {
  116.             for(count = 1; count < 5; count++)
  117.                 MainItem[count].SubItem = NULL;
  118.             MenuCount = MenuTotal = NULL;
  119.             MenusList = NULL;
  120.         }
  121.     } else if(ActEd == ITEMED) {
  122.         if(ParentMenu->FirstItem != &dummy) {
  123.             for(count = 1; count < 5; count++)
  124.                 TheItem[count].SubItem = (struct MenuItem *)ParentMenu->FirstItem->ItsListItem;
  125.             for(ItemCount = 0, items = ParentMenu->FirstItem; items; ItemCount++, items = items->NextItem);
  126.             ItemsList = ParentMenu->FirstItem->ItsListItem;
  127.         } else {
  128.             for(count = 1; count < 5; count++)
  129.                 TheItem[count].SubItem = NULL;
  130.             ItemCount = ItemTotal = NULL;
  131.             ItemsList = NULL;
  132.         }
  133.     } else if(ActEd == SUBED) {
  134.         if(ParentItem->SubItem) {
  135.             for(count = 1; count < 4; count++)
  136.                 SubItem[count].SubItem = (struct MenuItem *)ParentItem->SubItem->ItsListItem;
  137.             for(SubCount = 0, items = ParentItem->SubItem; items; SubCount++, items = items->NextItem);
  138.             SubsList = ParentItem->SubItem->ItsListItem;
  139.         } else {
  140.             for(count = 1; count < 4; count++)
  141.                 SubItem[count].SubItem = NULL;
  142.             SubCount = SubTotal = NULL;
  143.             SubsList = NULL;
  144.         }
  145.     }
  146. }
  147.  
  148. struct Menu Exclusion = {
  149.     NULL,0,0,128,9,MENUENABLED,(BYTE *)"MutualExclude",NULL,0,0,0,0 };
  150.  
  151. UWORD WaitMenu( void )
  152. {
  153.     UWORD   number;
  154.  
  155.     while(read_msg(MainWindow));
  156.  
  157.     while(1) {
  158.         WaitPort(MainWindow->UserPort);
  159.         while(read_msg(MainWindow));
  160.         if(Class == MENUPICK AND Code != MENUNULL) {
  161.             number = Code;
  162.             break;
  163.         } else if(Class == RAWKEY AND Code == ESC) {
  164.             number = MENUNULL;
  165.             break;
  166.         }
  167.     }
  168.     while(read_msg(MainWindow));
  169.     return(number);
  170. }
  171.  
  172. void SetMutualEx( void )
  173. {
  174.     register struct ListItem  *toexcl, *thatexcl;
  175.     register LONG   exval = NULL;
  176.     register UWORD  inum, bnum;
  177.  
  178.     if(ActEd == ITEMED)
  179.         Exclusion.FirstItem = &ParentMenu->FirstItem->ItsListItem->AItem;
  180.     else
  181.         Exclusion.FirstItem = &ParentItem->SubItem->ItsListItem->AItem;
  182.  
  183.     ClearMenuStrip(MainWindow);
  184.     SetMenuStrip(MainWindow,&Exclusion);
  185.  
  186.     sst("PICK ITEM THAT EXCLUDES....");
  187.  
  188.     if((inum = WaitMenu()) == MENUNULL)
  189.         goto noShow;
  190.  
  191.     thatexcl = (struct ListItem *)ItemAddress(&Exclusion,inum);
  192.  
  193.     sst("DRAG-SELECT ITEMS TO EXCLUDE....");
  194.  
  195.     if((inum = WaitMenu()) == MENUNULL)
  196.         goto noShow;
  197.  
  198.     toexcl = (struct ListItem *)ItemAddress(&Exclusion,inum);
  199.  
  200.     while(toexcl) {
  201.         bnum   = ITEMNUM(inum);
  202.         exval |= (1 << bnum);
  203.         inum   = toexcl->AItem.NextSelect;
  204.         toexcl = (struct ListItem *)ItemAddress(&Exclusion,inum);
  205.     }
  206.  
  207.     if(ActEd == ITEMED)
  208.         thatexcl->Item->MutualExclude = exval;
  209.     else
  210.         thatexcl->SubItem->MutualExclude = exval;
  211.  
  212. noShow:
  213.     ClearMenuStrip(MainWindow);
  214.     if(ActEd == ITEMED)
  215.         SetMenuStrip(MainWindow,&ItemMenuStrip[0]);
  216.     else
  217.         SetMenuStrip(MainWindow,&SubMenuStrip[0]);
  218.     refresh();
  219. }
  220.  
  221. ULONG ReAct( ULONG code )
  222. {
  223.     struct MenuItem *Next;
  224.     struct Menu     *Strip;
  225.     struct ListItem *List;
  226.     UWORD            mnum, inum, snum;
  227.  
  228.     if(ActEd == MENUED)
  229.         Strip = &MainMenuStrip[0];
  230.     else if(ActEd == ITEMED)
  231.         Strip = &ItemMenuStrip[0];
  232.     else
  233.         Strip = &SubMenuStrip[0];
  234.  
  235.     while(1) {
  236.         mnum = MENUNUM(code);
  237.         inum = ITEMNUM(code);
  238.         snum = SUBNUM(code);
  239.  
  240.         if(NOT(Next = ItemAddress(Strip,code)))
  241.             break;
  242.  
  243.         code = Next->NextSelect;
  244.  
  245.         switch(mnum) {
  246.             case 0:
  247.                 switch(inum) {
  248.                     case 0:
  249.                         if(ActEd == MENUED)
  250.                             EditMenu(NULL,FALSE);
  251.                         else
  252.                             EditItem(NULL,FALSE);
  253.                         break;
  254.                     case 1:
  255.                         if(ActEd == MENUED)
  256.                             EditMenu(Next,FALSE);
  257.                         else
  258.                             EditItem(Next,FALSE);
  259.                         break;
  260.                     case 2:
  261.                         if(ActEd == MENUED)
  262.                             RemoveMenu(Next);
  263.                         else
  264.                             RemoveItem(Next);
  265.                         break;
  266.                     case 3:
  267.                         if(ActEd == MENUED)
  268.                             EditMenu(Next,TRUE);
  269.                         else
  270.                             EditItem(Next,TRUE);
  271.                         break;
  272.                     case 4:
  273.                         if(ActEd == MENUED) {
  274.                             ActEd = ITEMED;
  275.                             ParentMenu = ((struct ListItem *)Next)->Menu;
  276.                             ParentItem = ((struct ListItem *)Next)->Item;
  277.                         } else if(ActEd == ITEMED) {
  278.                             ActEd = SUBED;
  279.                             ParentMenu = ((struct ListItem *)Next)->Menu;
  280.                             ParentItem = ((struct ListItem *)Next)->Item;
  281.                         } else
  282.                             ActEd = ITEMED;
  283.                         CreateList();
  284.                         SetMainMenus();
  285.                         break;
  286.                     case 5:
  287.                         if(ActEd == MENUED)
  288.                             TestMenus();
  289.                         else {
  290.                             ActEd = MENUED;
  291.                             SetMainMenus();
  292.                         }
  293.                         break;
  294.                     case 6:
  295.                         if(ActEd == MENUED)
  296.                             return(TRUE);
  297.                         else
  298.                             SetMutualEx();
  299.                         break;
  300.                 }
  301.                 break;
  302.             case 1:
  303.                 FrontPen = inum;
  304.                 break;
  305.             case 2:
  306.                 BackPen = inum;
  307.                 break;
  308.         }
  309.     }
  310.     return(FALSE);
  311. }
  312.  
  313. void MenuEditing( void )
  314. {
  315.     BOOL    running = TRUE;
  316.  
  317.     ActEd = MENUED;
  318.  
  319.     ClearMenuStrip(MainWindow);
  320.     MainMenuStrip[0].NextMenu = &Titles[2];
  321.     ItemMenuStrip[0].NextMenu = &Titles[2];
  322.     SubMenuStrip[0].NextMenu  = &Titles[2];
  323.     SetMenuStrip(MainWindow,&MainMenuStrip[0]);
  324.     CreateList();
  325.     SetMainMenus();
  326.  
  327.     do {
  328.         WaitPort(MainWindow->UserPort);
  329.         SetWindowTitles(MainWindow,(char *)-1L,(char *)TITLE);
  330.         while(read_msg(MainWindow)) {
  331.             switch(Class) {
  332.                 case MENUPICK:
  333.                     if(ReAct(Code))
  334.                         running = FALSE;
  335.                     break;
  336.             }
  337.         }
  338.     } while(running == TRUE);
  339.  
  340.     ClearMenuStrip(MainWindow);
  341.     SetMenu(MainWindow);
  342.     return;
  343. }
  344.