home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 570.lha / PopUpMenu_v4.2 / source.LZH / source / Options.c < prev    next >
Encoding:
Text File  |  1991-10-25  |  12.5 KB  |  316 lines

  1. /* This is needed for Lattice bug with 16 bit ints */
  2. #undef RMBTRAP
  3. #define RMBTRAP 0x00010000L
  4.  
  5.  
  6. #define SHOWSINGLEMENU       0
  7. #define SUBITEMPOINTER       1
  8. #define ITEMSCENTERED       2
  9. #define POPUPWITHQUAL       3
  10. #define POPUPNOQUAL       4
  11. #define CLICKMENUES       5
  12. #define OPENWINDOW       6
  13. #define EXIT           7
  14.  
  15. #define RESET           0x100
  16. #define CANCEL           0x200
  17. #define REMOVE           0x300
  18. #define USE           0x000
  19.  
  20. static USHORT
  21.   chip CheckOffData[] = {0x0000,0x0000,0x07f0,0x0000,0x3c1e,0x0000,0x6003,0x0000,
  22.              0xc001,0x8000,0xc001,0x8000,0xc001,0x8000,0x6003,0x0000,
  23.              0x3c1e,0x0000,0x07f0,0x0000},
  24.   chip CheckOnData[]  = {0x0000,0xf000,0x07f3,0xf800,0x3c1f,0xf000,0x7e3f,0xe000,
  25.              0xff7f,0x8000,0xdffd,0x8000,0xcff1,0x8000,0x67e3,0x0000,
  26.              0x3fde,0x0000,0x07f0,0x0000,
  27.              0x0000,0x0000,0x0000,0xf000,0x0003,0xe000,0x1c0f,0x0000,
  28.              0x1e3c,0x0000,0x0f70,0x0000,0x07e0,0x0000,0x03c0,0x0000,
  29.              0x0180,0x0000,0x0000,0x0000},
  30.   chip LogoData[] = {
  31.     0x0000,0x0000,0x0000,0x0000,0x0700,0x0000,0x0000,0x0000,
  32.     0x0000,0x07FF,0x7FF0,0x0000,0x6180,0x0780,0x0800,0x0000,
  33.     0x0000,0x0000,0x0000,0x07FF,0x8C18,0x0000,0xE180,0x08C0,
  34.     0x1800,0x0000,0x0000,0x0000,0x0000,0x07FF,0x0C18,0x0000,
  35.     0x6180,0x00E0,0x3800,0x0000,0x0000,0x0000,0x0000,0x07FF,
  36.     0x0C10,0xF8CC,0x618C,0xC0F0,0x783C,0x2618,0xC000,0x0000,
  37.     0x0080,0x77FF,0x0FE1,0x0DD6,0x619D,0x60D8,0xD846,0x6B38,
  38.     0xC000,0x0000,0x0480,0x8FFF,0x0C03,0x0CE6,0x618E,0x60CD,
  39.     0x98C4,0xF318,0xC004,0x4E58,0x0480,0x17FF,0x0C03,0x0CC6,
  40.     0x63AC,0x60C7,0x19F8,0x6359,0xD004,0x5224,0x07C0,0x27FF,
  41.     0x0C03,0x08C4,0x65CC,0x40C2,0x1AC2,0x639A,0xE002,0x9420,
  42.     0x0084,0x47FF,0x0C01,0xF0F8,0x398F,0x8080,0x1C7C,0x630C,
  43.     0x4001,0x0F20,0x01C4,0xFFFF,0x1000,0x00C0,0x000C,0x0700,
  44.     0x0000,0x0000,0x0000,0x0000,0x0000,0x07FF,0x0000,0x00C0,
  45.     0x000C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07FF,
  46.     0x0000,0x00C0,0x000C,0x0000,0x0000,0x0000,0x0000,0x0000,
  47.     0x0000,0x07FF,0x0000,0x00C0,0x000C,0x0000,0x0000,0x0000,
  48.     0x0000,0x0000,0x0000,0x07FF,0x0000,0x0080,0x0008,0x0000,
  49.     0x0000,0x0000,0x0000,0x0000,0x0000,0x07FF,0x0000,0x0000,
  50.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07FF,
  51.     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  52.     0x0000,0x07FF,0x0000,0x0000,0x0000,0x0000,0x0700,0x0000,
  53.     0x0000,0x0000,0x0000,0x07FF,0x7FF0,0x0000,0x6180,0x0780,
  54.     0x09C0,0x0000,0x0000,0x0000,0x0000,0x07FF,0x9FFC,0x0000,
  55.     0xF9E0,0x09E0,0x1A70,0x0000,0x0000,0x0000,0x0000,0x07FF,
  56.     0x2FFF,0x0000,0x7FF8,0x02F8,0x3E80,0x0000,0x0000,0x0000,
  57.     0x0000,0x07FF,0x0FD7,0xF8CC,0x7FFC,0xC0FC,0x7FBC,0x2618,
  58.     0xC000,0x0000,0x0000,0x07FF,0x0FE5,0xBFF7,0x7FFF,0x70FE,
  59.     0xDFCF,0x6BBE,0xF000,0x0000,0x0000,0x07FF,0x0FFB,0x4FFF,
  60.     0xFFFF,0xFCFF,0xBFD7,0xFBFF,0xFC00,0x0000,0x0000,0x07FF,
  61.     0x0FFF,0xDFFF,0xFFFF,0xFEFF,0xFFFD,0x7FFF,0xFC00,0x0000,
  62.     0x0000,0x07FF,0x0FC3,0xFBFF,0xFFFF,0xFEFF,0xDFFE,0x7FFF,
  63.     0xFC00,0x0000,0x0000,0x07FF,0x0FC1,0xF2FD,0x7FFF,0xD6BC,
  64.     0xFFFF,0xFFFF,0xFD00,0x0000,0x0000,0x07FF,0x13C0,0x7CFE,
  65.     0x4E7F,0xE72C,0x27BF,0x3EFB,0xBE00,0x0000,0x0000,0x07FF,
  66.     0x04C0,0x1FFF,0x839F,0xF9C8,0x01C7,0xC630,0xC400,0x0000,
  67.     0x0000,0x07FF,0x0100,0x00FC,0x000F,0xC070,0x0000,0x0000,
  68.     0x0000,0x0000,0x0000,0x07FF,0x0000,0x00FC,0x000F,0xC000,
  69.     0x0000,0x0000,0x0000,0x0000,0x0000,0x07FF,0x0000,0x00BC,
  70.     0x000B,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,0x07FF,
  71.     0x0000,0x002C,0x0002,0xC000,0x0000,0x0000,0x0000,0x0000,
  72.     0x0000,0x07FF,0x0000,0x0008,0x0000,0x8000,0x0000,0x0000,
  73.     0x0000,0x0000,0x0000,0x07FF
  74. };
  75.  
  76.           /* Normal gadget */
  77. static struct Image
  78.   CheckOff = { 0, 0, 21, 10, 1, CheckOffData, 1, 0, NULL },
  79.          /* Selected gadget */
  80.   CheckOn  = { 0, 0, 21, 10, 2, CheckOnData,  3, 0, NULL },
  81.          /* PopUpMenu Logo */
  82.   Logo       = { 0, 0,149, 17, 2, LogoData,     3, 0, NULL };
  83.  
  84.          /* Upper & left border for small gadget */
  85. static SHORT
  86.   UpperVectors1[] = {  0, 0,   0,13,   1,12,   1, 0,  58, 0 },
  87.          /* Lower & right border for small gadget */
  88.   LowerVectors1[] = { 59,13,  59, 0,  58, 1,  58,13,   1,13 },
  89.          /* Upper & left border for big gadget */
  90.   UpperVectors2[] = {  0, 0,   0,13,   1,12,   1, 0, 148, 0 },
  91.          /* Lower & Right border for big gadget */
  92.   LowerVectors2[] = {149,13, 149, 0, 148, 1, 148,13,   1,13 };
  93.  
  94.          /* Small border */
  95. static struct Border
  96.   UpBorder1b  = {-2,-1, 2,0,JAM1, 5, LowerVectors1, NULL     },
  97.   UpBorder1a  = {-2,-1, 1,0,JAM1, 5, UpperVectors1, &UpBorder1b  },
  98.          /* Big border */
  99.   UpBorder2b  = {-2,-1, 2,0,JAM1, 5, LowerVectors2, NULL     },
  100.   UpBorder2a  = {-2,-1, 1,0,JAM1, 5, UpperVectors2, &UpBorder2b  };
  101.  
  102. static char
  103.   UseText[]    = {'U','s','e',0},
  104.   ResetText[]  = {'R','e','s','e','t',0},
  105.   CancelText[] = {'C','a','n','c','e','l',0},
  106.  
  107.   RemoveText[] = {'R','e','m','o','v','e',' ','P','o','p','U','p','M','e','n','u',0},
  108.  
  109.   ClickText[]  = {'"','C','l','i','c','k','"',' ','m','e','n','u','e','s',0},
  110.   SubText[]    = {'S','u','b','-','i','t','e','m',' ','p','o','i','n','t','e','r',0},
  111.   ItemsText[]  = {'M','e','n','u','i','t','e','m','s',' ','c','e','n','t','e','r','e','d',0},
  112.   SingleText[] = {'S','h','o','w',' ','s','i','n','g','l','e',' ','m','e','n','u',0},
  113.   PopUpText[]  = {'P','o','p','-','u','p',' ','m','e','n','u','e','s',0},
  114.   WithText[]   = {'w','i','t','h',0},
  115.   WithoutText[]= {'w','i','t','h','o','u','t',0},
  116.   QualText[]   = {'q','u','a','l','i','f','i','e','r','s',0};
  117.  
  118. static struct TextAttr
  119.   Topaz80 = {"topaz.font", TOPAZ_EIGHTY, 0, 0 };
  120.  
  121. static struct IntuiText
  122.   WinText13b = {1,0,JAM1, 93, 30, &Topaz80, ClickText,    NULL       },
  123.   WinText13a = {2,0,JAM1, 95, 31, &Topaz80, ClickText,    &WinText13b},
  124.   WinText12b = {1,0,JAM1, 93, 45, &Topaz80, SubText,    &WinText13a},
  125.   WinText12a = {2,0,JAM1, 95, 46, &Topaz80, SubText,    &WinText12b},
  126.   WinText11b = {1,0,JAM1, 93, 60, &Topaz80, SingleText, &WinText12a},
  127.   WinText11a = {2,0,JAM1, 95, 61, &Topaz80, SingleText, &WinText11b},
  128.   WinText10b = {1,0,JAM1, 93, 75, &Topaz80, ItemsText,    &WinText11a},
  129.   WinText10a = {2,0,JAM1, 95, 76, &Topaz80, ItemsText,    &WinText10b},
  130.   WinText09b = {1,0,JAM1,  8,100, &Topaz80, PopUpText,    &WinText10a},
  131.   WinText09a = {2,0,JAM1, 10,101, &Topaz80, PopUpText,    &WinText09b},
  132.   WinText08b = {1,0,JAM1,140, 92, &Topaz80, WithText,    &WinText09a},
  133.   WinText08a = {2,0,JAM1,142, 93, &Topaz80, WithText,    &WinText08b},
  134.   WinText07b = {1,0,JAM1,140,107, &Topaz80, WithoutText,&WinText08a},
  135.   WinText07a = {2,0,JAM1,142,108, &Topaz80, WithoutText,&WinText07b},
  136.   WinText06b = {1,0,JAM1,204,100, &Topaz80, QualText,    &WinText07a},
  137.   WinText06a = {2,0,JAM1,206,101, &Topaz80, QualText,    &WinText06b};
  138. #define FIRSTWINTEXT WinText06a
  139.  
  140. /****************** Gadget text **********************/
  141. static struct IntuiText
  142.   UseIText1 = {3,0,JAM1, 17,2, &Topaz80, UseText,    NULL    },
  143.   UseIText  = {2,0,JAM1, 19,3, &Topaz80, UseText,    &UseIText1 },
  144.   ResIText1 = {3,0,JAM1,  9,2, &Topaz80, ResetText,  NULL    },
  145.   ResIText  = {2,0,JAM1, 11,3, &Topaz80, ResetText,  &ResIText1 },
  146.   CancIText1= {3,0,JAM1,  5,2, &Topaz80, CancelText, NULL    },
  147.   CancIText = {2,0,JAM1,  7,3, &Topaz80, CancelText, &CancIText1},
  148.   RemIText1 = {3,0,JAM1,  5,2, &Topaz80, RemoveText, NULL    },
  149.   RemIText  = {2,0,JAM1,  7,3, &Topaz80, RemoveText, &RemIText1 };
  150.  
  151. /****************** All gadgets *********************/
  152. static struct Gadget
  153.   ClickGad  = {NULL, 70,28, 135,10, GADGHIMAGE | GADGIMAGE,
  154.            RELVERIFY | TOGGLESELECT,
  155.            BOOLGADGET, (APTR)&CheckOff, (APTR)&CheckOn,
  156.            NULL, 0, NULL, 1<<CLICKMENUES, NULL },
  157.   SubGad    = {&ClickGad, 70,43,  151,10, GADGHIMAGE | GADGIMAGE,
  158.            RELVERIFY | TOGGLESELECT,
  159.            BOOLGADGET, (APTR)&CheckOff, (APTR)&CheckOn,
  160.            NULL, 0, NULL, 1<<SUBITEMPOINTER, NULL },
  161.   ShowGad   = {&SubGad, 70,58, 151,10, GADGHIMAGE | GADGIMAGE,
  162.            RELVERIFY | TOGGLESELECT,
  163.            BOOLGADGET, (APTR)&CheckOff, (APTR)&CheckOn,
  164.            NULL, NULL, NULL, 1<<SHOWSINGLEMENU, NULL },
  165.   ItemGad   = {&ShowGad, 70,73, 167,10, GADGHIMAGE | GADGIMAGE,
  166.            RELVERIFY | TOGGLESELECT,
  167.            BOOLGADGET, (APTR)&CheckOff, (APTR)&CheckOn,
  168.            NULL, NULL, NULL, 1<<ITEMSCENTERED, NULL },
  169.   WithGad   = {&ItemGad, 117,90, 55,10, GADGHIMAGE | GADGIMAGE,
  170.            RELVERIFY | TOGGLESELECT,
  171.            BOOLGADGET, (APTR)&CheckOff, (APTR)&CheckOn,
  172.            NULL, NULL, NULL, 1<<POPUPWITHQUAL, NULL },
  173.   WithoutGad= {&WithGad, 117,105, 79,10, GADGHIMAGE | GADGIMAGE,
  174.            RELVERIFY | TOGGLESELECT,
  175.            BOOLGADGET, (APTR)&CheckOff, (APTR)&CheckOn,
  176.            NULL, NULL, NULL, 1<<POPUPNOQUAL, NULL },
  177.   RemoveGad = {&WithoutGad, 75,150, 145,12, GADGHCOMP, RELVERIFY,
  178.            BOOLGADGET, (APTR)&UpBorder2a, NULL,
  179.            &RemIText, NULL, NULL, REMOVE, NULL },
  180.   UseGad    = {&RemoveGad,220,130, 56,12, GADGHCOMP, RELVERIFY,
  181.            BOOLGADGET, (APTR)&UpBorder1a, NULL,
  182.            &UseIText, NULL, NULL, USE, NULL },
  183.   ResetGad  = {&UseGad,   116,130, 56,12, GADGHCOMP, RELVERIFY,
  184.            BOOLGADGET, (APTR)&UpBorder1a, NULL,
  185.            &ResIText, NULL, NULL, RESET, NULL },
  186.   CancelGad = {&ResetGad, 18,130, 56,12, GADGHCOMP,  RELVERIFY,
  187.            BOOLGADGET, (APTR)&UpBorder1a, NULL,
  188.            &CancIText, NULL, NULL, CANCEL, NULL };
  189. #define FIRSTGADGET CancelGad
  190.  
  191. static struct NewWindow OptionWindow = {
  192.   165,55, 300,170,  0,1,
  193.   GADGETUP, RMBTRAP | WINDOWDRAG | WINDOWDEPTH | ACTIVATE | NOCAREREFRESH, &FIRSTGADGET,
  194.   NULL, "           PopUpMenu          ", NULL, NULL, 0,0,0,0, WBENCHSCREEN};
  195.  
  196. static SHORT
  197.   WindowBorder[] = { 1,169, 298,169, 298,0,  299,0, 299,169 };
  198.  
  199.  
  200. static struct Border
  201.   WBorder = { 0,0, 2,0, JAM1, 5, WindowBorder, NULL};
  202.  
  203.  
  204.        USHORT SelectOpt(USHORT CurrOptions);
  205. STATIC VOID   FixGadgets(UBYTE Options);
  206.  
  207. /*VOID main()*/
  208. /*{*/
  209.   /* The libraries MUST be opened in this or a similar manner in     */
  210.   /* order to use pop-up menus.                      */
  211.  
  212. /*  IntuitionBase = (struct IntuitionBase *)*/
  213. /*  OpenLibrary("intuition.library", 0L);*/
  214. /*  GfxBase = (struct GfxBase *) OpenLibrary("graphics.library", 0L);*/
  215. /*  printf("%x",SelectOptions(0x0f55));*/
  216. /*  CloseLibrary(IntuitionBase);*/
  217. /*  CloseLibrary(GfxBase);*/
  218. /*}*/
  219. USHORT SelectOpt(CurrOptions)
  220.   USHORT CurrOptions;
  221. {
  222.   UBYTE Options = (CurrOptions>>8) & ~((1<<EXIT) | (1<<OPENWINDOW));
  223.   /* Can't reach global IntuitionBase from C */
  224.   struct Library *IntuitionBase = OpenLibrary("intuition.library",0);
  225.   BOOL Quit = FALSE;
  226.   struct Window *Win;
  227.   char Buf[16];
  228.  
  229.   if (IntuitionBase->lib_Version >= 36) { /* Kickstart 2.0 ? */
  230.     /* Switch BLACK and WHITE */
  231.     WinText13b.FrontPen = WinText12b.FrontPen = WinText11b.FrontPen =
  232.     WinText10b.FrontPen = WinText09b.FrontPen = WinText08b.FrontPen =
  233.     WinText07b.FrontPen = WinText06b.FrontPen = UseIText1.FrontPen  =
  234.     ResIText1.FrontPen    = CancIText1.FrontPen = RemIText1.FrontPen  =
  235.     UpBorder1a.FrontPen = UpBorder2a.FrontPen = OptionWindow.BlockPen = 2;
  236.  
  237.     WinText13a.FrontPen = WinText12a.FrontPen = WinText11a.FrontPen =
  238.     WinText10a.FrontPen = WinText09a.FrontPen = WinText08a.FrontPen =
  239.     WinText07a.FrontPen = WinText06a.FrontPen = UseIText.FrontPen   =
  240.     ResIText.FrontPen    = CancIText.FrontPen  = RemIText.FrontPen   =
  241.     UpBorder1b.FrontPen = UpBorder2b.FrontPen = WBorder.FrontPen    = 1;
  242.   }
  243.  
  244.   WBenchToFront();
  245.   if (GetScreenData(Buf,16,WBENCHSCREEN,NULL)) {    /* Get size of Workbench Screen */
  246.     OptionWindow.LeftEdge = (USHORT)((((struct Screen *)Buf)->Width - 300))/2;
  247.     OptionWindow.TopEdge  = (USHORT)((((struct Screen *)Buf)->Height - 170))/2;
  248.  
  249.     FixGadgets(Options);
  250.  
  251.     if (Win = OpenWindow(&OptionWindow)) {
  252.       struct MsgPort *Port = Win->UserPort;
  253.  
  254.       DrawBorder(Win->RPort, &WBorder, 0, 0);
  255.  
  256.       PrintIText(Win->RPort, &FIRSTWINTEXT, 0, 0);
  257.       DrawImage(Win->RPort, &Logo, 74, 11);
  258.  
  259.       do {
  260.     struct IntuiMessage *Message;
  261.  
  262.     WaitPort(Port);
  263.  
  264.     while (Message = (struct IntuiMessage *)GetMsg(Port)) {
  265.       if (Message->Class == GADGETUP) {
  266.         struct Gadget *SelectedGad = (struct Gadget *)Message->IAddress;
  267.  
  268.         if (SelectedGad->GadgetID & 0xff)
  269.           Options ^= SelectedGad->GadgetID;
  270.         else
  271.           switch(SelectedGad->GadgetID) {
  272.         case RESET:
  273.           Options = CurrOptions>>8;
  274.           FixGadgets(Options);
  275.           RefreshGadgets(&WithoutGad,Win,NULL);
  276.           break;
  277.         case USE:
  278.           Quit = TRUE;
  279.           break;
  280.         case CANCEL:
  281.           Options = CurrOptions>>8;
  282.           Quit = TRUE;
  283.           break;
  284.         case REMOVE:
  285.           Options |= 1<<EXIT;
  286.           Quit = TRUE;
  287.           break;
  288.           } /* switch */
  289.       } /* if (Message == GADGETUP) */
  290.       ReplyMsg((struct Message *)Message);
  291.     } /* while */
  292.       } /* do */
  293.       while (!Quit);
  294.  
  295.       CloseWindow(Win);
  296.     } /* if (Win == ... */
  297.   } /* if (GetScreenData ...) */
  298.  
  299.   CloseLibrary(IntuitionBase);
  300.   return (USHORT)((CurrOptions & 0xff) | (Options<<8));
  301. }
  302.  
  303. STATIC VOID FixGadgets(Options)
  304.   UBYTE Options;
  305. {
  306.   struct Gadget *TempGad = &WithoutGad;
  307.  
  308.   do
  309.     if (Options & TempGad->GadgetID)
  310.       TempGad->Flags |= SELECTED;
  311.     else
  312.       TempGad->Flags &= ~SELECTED;
  313.   while (TempGad = TempGad->NextGadget);
  314. }
  315.  
  316.