home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 552.lha / Browser_II_v1.0 / source.LZH / source / Request.c < prev    next >
C/C++ Source or Header  |  1991-07-20  |  15KB  |  613 lines

  1. /*
  2.  *    Request.c - Copyright © 1991 by S.R. & P.C.
  3.  *
  4.  *    Created:    10 Mar 1991  17:09:34
  5.  *    Modified:    20 Jul 1991  16:45:15
  6.  *
  7.  *    Make>> make
  8.  */
  9.  
  10. #include "Global.h"
  11. #include "proto/Request.h"
  12. #include "proto/String.h"
  13. #include "proto/File.h"
  14.  
  15. extern void setmem(void *mem, size_t size, long value);
  16.  
  17. extern struct ParMConfig ParMConfig;
  18. extern struct Screen *Screen;
  19. extern char *ReqTitle;
  20.  
  21.  
  22. static struct IntuiText IText2 = {
  23.     0,1,JAM1,
  24.     2,1,
  25.     NULL,
  26.     (UBYTE *)"Leave",
  27.     NULL
  28. };
  29.  
  30. static struct MenuItem MenuItem2 = {
  31.     NULL,
  32.     0,9,
  33.     94,9,
  34.     ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
  35.     0,
  36.     (APTR)&IText2,
  37.     NULL,
  38.     'L',
  39.     NULL,
  40.     MENUNULL
  41. };
  42.  
  43. static struct IntuiText IText1 = {
  44.     0,1,JAM1,
  45.     2,1,
  46.     NULL,
  47.     (UBYTE *)"Reset",
  48.     NULL
  49. };
  50.  
  51. static struct MenuItem MenuItem1 = {
  52.     &MenuItem2,
  53.     0,0,
  54.     94,9,
  55.     ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
  56.     0,
  57.     (APTR)&IText1,
  58.     NULL,
  59.     'R',
  60.     NULL,
  61.     MENUNULL
  62. };
  63.  
  64. static struct Menu Menu1 = {
  65.     NULL,
  66.     0,0,
  67.     0,0,
  68.     MENUENABLED,
  69.     NULL,
  70.     &MenuItem1
  71. };
  72.  
  73.  
  74. static struct NewWindow NWS = {
  75.     0,0,        /* window XY origin relative to TopLeft of screen */
  76.     257,0,        /* window width and height */
  77.     2,1,        /* detail and block pens */
  78.     CLOSEWINDOW|GADGETUP|GADGETDOWN|MENUPICK|RAWKEY,        /* IDCMP flags */
  79.     WINDOWDRAG+WINDOWDEPTH+WINDOWCLOSE+ACTIVATE+NOCAREREFRESH,    /* other window flags */
  80.     NULL,        /* first gadget in gadget list */
  81.     NULL,        /* custom CHECKMARK imagery */
  82.     NULL,        /* window title */
  83.     NULL,        /* custom screen pointer */
  84.     NULL,        /* custom bitmap */
  85.     5,5,        /* minimum width and height */
  86.     -1,-1,        /* maximum width and height */
  87.     CUSTOMSCREEN    /* destination screen type */
  88. };
  89.  
  90.  
  91. static char *Titles[] = {
  92.     "Set Protect...",
  93.     "Filters",
  94.     "Select..."
  95. };
  96.  
  97. static char *GadgetText1[] = {
  98.     "Files: ",
  99.     "Dirs: ",
  100.     "Affect subdirs"
  101. };
  102.  
  103. static short x1[] = { 8, 73, 135 };
  104. static char *FileDirGadgetText[] = { "N", "Y", "?" };
  105.  
  106. static struct IntuiText FilesGadgetsIText = {
  107.     3,0,JAM2,
  108.     48,0,
  109.     NULL,
  110.     NULL,
  111.     NULL
  112. };
  113.  
  114. static struct IntuiText DirsGadgetsIText = {
  115.     3,0,JAM2,
  116.     40,0,
  117.     NULL,
  118.     NULL,
  119.     NULL
  120. };
  121.  
  122. static char *GadgetText2[] = {
  123.     "  Ok  ",
  124.     "Cancel",
  125.     "Clear",
  126.     "RWED"
  127. };
  128.  
  129. static short x2[] = { 8, 199, 8, 57 };
  130.  
  131. static char *TextTab[] = {
  132.     "Pattern:",
  133.     "Min size:",
  134.     "Max size:",
  135.     "Since:",
  136.     "Before:"
  137. };
  138.  
  139. static char *ProtectGadgetText[] = { " ", "+", "-" };
  140.  
  141. static WORD ProtectGadgetsVectors[] = { 0, 0, 10, 0, 10, 11, 0, 11, 0, 0 };
  142.  
  143. static struct IntuiText ProtectGadgetsIText = {
  144.     1,0,JAM2,
  145.     2,2,
  146.     NULL,
  147.     NULL,
  148.     NULL
  149. };
  150.  
  151. static struct Border ProtectGadgetsBorder = {
  152.     0,0,
  153.     2,0,JAM2,
  154.     5,
  155.     ProtectGadgetsVectors,
  156.     NULL
  157. };
  158.  
  159.  
  160. struct ReqGadgets {
  161.     struct GadgetBlock Gadgets1[3];            /* Files, Dirs, and Affect subdirs gadgets */
  162.     struct StringBlock StringGadgets[5];
  163.     char Buffer[5][PATTERN_BUF_SIZE];
  164.     char UndoBuffer[5][PATTERN_BUF_SIZE];
  165.     struct GadgetBlock Gadgets2[4];            /* Ok, Cancel gadgets */
  166.     struct Gadget Gadgets3[9];                /* protect gadgets */
  167.     struct IntuiText Gadgets3IText[9];
  168. };
  169.  
  170.  
  171. /*  return pointer to the first non blank char in a string, or to the '\0' if
  172.  *  the string is empty
  173.  */
  174.  
  175. static char *FirstNonBlank(char *buf)
  176. {
  177.     while(*buf && *buf == ' ') buf++;
  178.     return buf;
  179. }
  180.  
  181.  
  182. /* check if buffer is empty or not */
  183.  
  184. static BOOL IsEmpty(char *buf)
  185. {
  186.     return (*FirstNonBlank(buf)) ? FALSE : TRUE;
  187. }
  188.  
  189.  
  190. static BOOL String2Date(char *src, struct DateStamp *ds)
  191. {
  192.     struct DateTime *dt;
  193.     BOOL Ok = TRUE;
  194.     char *s1, *s2;
  195.     char buf[PATTERN_BUF_SIZE];
  196.     
  197.     if (!(dt = AllocMem(sizeof(struct DateTime), MEMF_PUBLIC|MEMF_CLEAR)))
  198.         return FALSE;
  199.     strcpy(buf, src);
  200.     s1 = s2 = FirstNonBlank(buf);
  201.     if (*s1) {
  202.         dt->dat_StrDate = s1;
  203.         while(*s2 && *s2 != ' ') s2++;
  204.         if (*s2) {
  205.             *s2++ = '\0';
  206.             s2 = FirstNonBlank(s2);
  207.         }
  208.         if (*s2) {
  209.             dt->dat_StrTime = s2;
  210.             if (StrtoStamp(dt))
  211.                 Ok = FALSE;
  212.         }
  213.         else if (StrtoStamp(dt)) {
  214.             dt->dat_StrDate = NULL;
  215.             dt->dat_StrTime = s1;
  216.             if (StrtoStamp(dt))
  217.                 Ok = FALSE;
  218.         }
  219.         if (Ok)
  220.             *ds = dt->dat_Stamp;
  221.         else
  222.             DisplayBeep(NULL);
  223.     }
  224.     FreeMem(dt, sizeof(struct DateTime));
  225.     return Ok;
  226. }
  227.  
  228.  
  229. static void DoFileDirGadget(struct Window *IW, struct Gadget *G)
  230. {
  231.     G->GadgetID++;
  232.     G->GadgetID %= 3;
  233.     G->GadgetText->NextText->IText = (UBYTE *)FileDirGadgetText[G->GadgetID];
  234.     RefreshGList(G, IW, NULL, 1);
  235. }
  236.  
  237.  
  238. static void MakeFileDirGadgets(struct ReqGadgets *Gads, struct Window *IW, short Flags)
  239. {
  240.     Gads->Gadgets1[0].Gadget.GadgetID = (Flags & (SI_ALL_FILES|SI_MATCH_FILES)) - 1;
  241.     Gads->Gadgets1[0].Gadget.Flags = GADGHNONE;
  242.     DoFileDirGadget(IW, &Gads->Gadgets1[0].Gadget);
  243.     Gads->Gadgets1[1].Gadget.GadgetID = ((Flags & (SI_ALL_DIRS|SI_MATCH_DIRS)) >> 2) - 1;
  244.     Gads->Gadgets1[1].Gadget.Flags = GADGHNONE;
  245.     DoFileDirGadget(IW, &Gads->Gadgets1[1].Gadget);
  246. }
  247.  
  248.  
  249. static void DoProtectGadget(struct Window *IW, struct Gadget *G)
  250. {
  251.     G->GadgetID++;
  252.     G->GadgetID %= 3;
  253.     G->GadgetText->IText = (UBYTE *)ProtectGadgetText[G->GadgetID];
  254.     RefreshGList(G, IW, NULL, 1);
  255. }
  256.  
  257.  
  258. static void RefreshProtect(struct ReqGadgets *Gads, struct Window *IW, short Flags, short State)
  259. {
  260.     struct Gadget *G;
  261.     short i;
  262.  
  263.     for( i=0 ; i<9 ; i++ ) {
  264.         G = &Gads->Gadgets3[i];
  265.         if (Flags & 1<<i) {
  266.             G->GadgetText->IText = (UBYTE *)ProtectGadgetText[State];
  267.             G->GadgetID = State;            /* store state into GadgetID */
  268.         }
  269.     }
  270.     RefreshGList(&Gads->Gadgets3[8], IW, NULL, 9);
  271. }
  272.  
  273.  
  274. static void MakeProtectGadgets(struct ReqGadgets *Gads, struct SelectInfo *SelectInfo, short StartY)
  275. {
  276.     struct Gadget *G;
  277.     short i, x, y;
  278.  
  279.     for( i=0 ; i<4 ; i++ ) {
  280.         y = (i<2) ? StartY + 15 : StartY;
  281.         LinkGadget(&Gads->Gadgets2[i], GadgetText2[i], &NWS, x2[i], y);
  282.         Gads->Gadgets2[i].Gadget.GadgetID = i+1;
  283.         Gads->Gadgets2[i].Border.FrontPen = 2;
  284.     }
  285.     for( i=0, x=238 ; i<9 ; i++ ) {
  286.         G = &Gads->Gadgets3[i];
  287.         Gads->Gadgets3IText[i] = ProtectGadgetsIText;    /* Init IText structure */
  288.         if (SelectInfo->si_PosProtect & 1<<i)
  289.             G->GadgetID = 1;
  290.         else if (SelectInfo->si_NegProtect & 1<<i)
  291.             G->GadgetID = 2;
  292.         else
  293.             G->GadgetID = 0;
  294.         G->NextGadget = NWS.FirstGadget;
  295.         NWS.FirstGadget = G;
  296.         G->LeftEdge = x;
  297.         G->TopEdge = StartY-2;
  298.         G->Width = 11;
  299.         G->Height = 12;
  300.         G->GadgetText = &Gads->Gadgets3IText[i];
  301.         G->GadgetText->IText = (UBYTE *)ProtectGadgetText[G->GadgetID];
  302.         G->Flags = GADGHNONE;
  303.         G->Activation = GADGIMMEDIATE;
  304.         G->GadgetType = BOOLGADGET;
  305.         G->GadgetRender = (APTR)&ProtectGadgetsBorder;
  306.         x -= 16;
  307.     }
  308. }
  309.  
  310.  
  311. BOOL FiltersReq(struct SelectInfo *SelectInfo, short ReqType)
  312. {
  313.     struct ReqGadgets *Gads;
  314.     struct Window *IW;
  315.     struct IntuiMessage *IMsg;
  316.     struct DateStamp *ds;
  317.     struct Gadget *G;
  318.     ULONG Class;
  319.     USHORT Code, Qual;
  320.     BOOL quit = FALSE;
  321.     BOOL Ok;
  322.     short NextString, y, i;
  323.     char buf[PATTERN_BUF_SIZE];
  324.  
  325.     if (!(Gads = AllocMem(sizeof(struct ReqGadgets), MEMF_PUBLIC|MEMF_CLEAR)))
  326.         return FALSE;
  327.     NWS.FirstGadget = NULL;
  328.     if (ReqType != PROTECT_REQ) {
  329.         for( i=0 ; i<=ReqType ; i++ ) {
  330.             LinkGadget(&Gads->Gadgets1[i], GadgetText1[i], &NWS, x1[i], 15);
  331.             Gads->Gadgets1[i].Gadget.Activation = GADGIMMEDIATE;
  332.             Gads->Gadgets1[i].Border.FrontPen = 2;
  333.         }
  334.         Gads->Gadgets1[0].Text.NextText = &FilesGadgetsIText;
  335.         Gads->Gadgets1[1].Text.NextText = &DirsGadgetsIText;
  336.         if (ReqType == SELECT_REQ) {
  337.             if (SelectInfo->si_Flags & SI_AFFECT_SUBDIRS)
  338.                 Gads->Gadgets1[2].Gadget.Flags |= SELECTED;
  339.             Gads->Gadgets1[2].Gadget.Activation = RELVERIFY|TOGGLESELECT;
  340.         }
  341.         for( i=0, y = 29 ; i<5 ; i++ ) {
  342.             LinkStringGadget(&Gads->StringGadgets[i], Gads->Buffer[i], Gads->UndoBuffer[i], &NWS, 152, PATTERN_BUF_SIZE, 95, y);
  343.             if (i==1 || i==2)
  344.                 Gads->StringGadgets[i].Gadget.Activation |= LONGINT;
  345.             Gads->StringGadgets[i].Gadget.GadgetID = 10+i;
  346.             Gads->StringGadgets[i].Border.FrontPen = 2;
  347.             Gads->StringGadgets[i].Pairs[5] = 11;
  348.             Gads->StringGadgets[i].Pairs[7] = 11;
  349.             y += 14;
  350.         }
  351.         MakeProtectGadgets(Gads, SelectInfo, 110);
  352.         NWS.Height = 137;
  353.         strcpy(Gads->Buffer[0], SelectInfo->si_Pattern);
  354.         if (SelectInfo->si_MinSize) {
  355.             SPrintf(Gads->Buffer[1], "%ld", SelectInfo->si_MinSize);
  356.             ((struct StringInfo *)Gads->StringGadgets[1].Gadget.SpecialInfo)->LongInt = SelectInfo->si_MinSize;
  357.         }
  358.         if (SelectInfo->si_MaxSize) {
  359.             SPrintf(Gads->Buffer[2], "%ld", SelectInfo->si_MaxSize);
  360.             ((struct StringInfo *)Gads->StringGadgets[2].Gadget.SpecialInfo)->LongInt = SelectInfo->si_MaxSize;
  361.         }
  362.         if (SelectInfo->si_Flags & SI_SINCEDATE)
  363.             Date2String(&SelectInfo->si_SinceDate, Gads->Buffer[3]);
  364.         if (SelectInfo->si_Flags & SI_BEFOREDATE)
  365.             Date2String(&SelectInfo->si_BeforeDate, Gads->Buffer[4]);
  366.         for( i=0 ; i<5 ; i++ )
  367.             strcpy(Gads->UndoBuffer[i], Gads->Buffer[i]);
  368.     }
  369.     else {
  370.         MakeProtectGadgets(Gads, SelectInfo, 25);
  371.         NWS.Height = 52;
  372.     }
  373.     switch(ReqType) {
  374.     case PROTECT_REQ:
  375.         Menu1.MenuName = "Protect";
  376.         break;
  377.     case FILTERS_REQ:
  378.         Menu1.MenuName = "Filters";
  379.         break;
  380.     case SELECT_REQ:
  381.         Menu1.MenuName = "Select";
  382.         break;
  383.     }
  384.     Menu1.Width = (strlen(Menu1.MenuName) << 3) + 12;
  385.     NWS.Title = (UBYTE *)Titles[ReqType];
  386.     NWS.Screen = Screen;
  387.     Center(&NWS, NWS.Width/2, NWS.Height/2);
  388.     if (!(IW = OpenWindow(&NWS))) {
  389.         FreeMem(Gads, sizeof(struct ReqGadgets));
  390.         return FALSE;
  391.     }
  392.     SetMenuStrip(IW, &Menu1);
  393.     SetAPen(IW->RPort, 1);
  394.     if (ReqType != PROTECT_REQ) {
  395.         MakeFileDirGadgets(Gads, IW, SelectInfo->si_Flags);
  396.         for( i=0, y=35 ; i<5 ; i++ ) {
  397.             Move(IW->RPort, 8, y);
  398.             Text(IW->RPort, TextTab[i], strlen(TextTab[i]));
  399.             y += 14;
  400.         }
  401.         y = 105;
  402.     }
  403.     else
  404.         y = 20;
  405.     Move(IW->RPort, 8, y);
  406.     Text(IW->RPort, "Protection:  C H S P A R W E D", 30);
  407.     ActivateGadget(&Gads->StringGadgets[0].Gadget, IW, NULL);
  408.     do {
  409.         while (!quit) {
  410.             WaitPort(IW->UserPort);
  411.             while (IMsg = (struct IntuiMessage *)GetMsg(IW->UserPort)) {
  412.                 Class = IMsg->Class;
  413.                 Code = IMsg->Code;
  414.                 Qual = IMsg->Qualifier;
  415.                 /* Use raw keys to prevent ALT and CTRL convertions. Allow only Shift qualifiers */
  416.                 if (Class == RAWKEY) {
  417.                     Code = RawKeyToAscii(Code, Qual & (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT), IMsg->IAddress);
  418.                     if (Code != 0 && (Qual & ParMConfig.ShortCutQual) && !(Qual & IEQUALIFIER_REPEAT)) {
  419.                         Code = MakeMenuShortCut(&Menu1, Code);
  420.                         Class = MENUPICK;
  421.                     }
  422.                 }
  423.                 G = (struct Gadget *)IMsg->IAddress;
  424.                 ReplyMsg((struct Message *)IMsg);
  425.                 switch(Class) {
  426.                 case CLOSEWINDOW:
  427.                     Ok = FALSE;
  428.                     quit = TRUE;
  429.                     break;
  430.                 case MENUPICK:
  431.                     switch(ITEMNUM(Code)) {
  432.                     case 0:        /* Reset */
  433.                         setmem(Gads->Buffer, PATTERN_BUF_SIZE * 5, 0);
  434.                         setmem(Gads->UndoBuffer, PATTERN_BUF_SIZE * 5, 0);
  435.                         Gads->Gadgets1[0].Gadget.Flags |= SELECTED;
  436.                         Gads->Gadgets1[1].Gadget.Flags |= SELECTED;
  437.                         Gads->Gadgets1[2].Gadget.Flags &= ~SELECTED;
  438.                         RefreshGadgets(IW->FirstGadget, IW, NULL);
  439.                         RefreshProtect(Gads, IW, 0xFFFF, 0);
  440.                         switch(ReqType) {
  441.                         case SELECT_REQ:
  442.                             MakeFileDirGadgets(Gads, IW, SI_MATCH_FILES|SI_MATCH_DIRS);
  443.                             break;
  444.                         case FILTERS_REQ:
  445.                             MakeFileDirGadgets(Gads, IW, SI_ALL_FILES|SI_ALL_DIRS);
  446.                             break;
  447.                         }
  448.                         break;
  449.                     case 1:        /* Leave */
  450.                         Ok = FALSE;
  451.                         quit = TRUE;
  452.                         break;
  453.                     }
  454.                     break;
  455.                 case GADGETUP:
  456.                     NextString = 0;
  457.                     ds = NULL;
  458.                     switch(G->GadgetID) {
  459.                     case 1:        /* Ok */
  460.                         Ok = TRUE;
  461.                         quit = TRUE;
  462.                         break;
  463.                     case 2:        /* Cancel */
  464.                         Ok = FALSE;
  465.                         quit = TRUE;
  466.                         break;
  467.                     case 3:        /* Clear */
  468.                         RefreshProtect(Gads, IW, 0x00FF, 2);
  469.                         break;
  470.                     case 4:        /* RWED */
  471.                         RefreshProtect(Gads, IW, 0x000F, 1);
  472.                         break;
  473.                     case 13:
  474.                         ds = &SelectInfo->si_SinceDate;
  475.                         NextString = 4;
  476.                         break;
  477.                     case 14:
  478.                         ds = &SelectInfo->si_BeforeDate;
  479.                         break;
  480.                     default:
  481.                         NextString = G->GadgetID-10+1;
  482.                     }
  483.                     if (ds) {
  484.                         i = G->GadgetID-10;
  485.                         if (!IsEmpty(Gads->Buffer[i])) {
  486.                             if (String2Date(Gads->Buffer[i], ds)) {
  487.                                 Date2String(ds, Gads->Buffer[i]);
  488.                                 RefreshGList(&Gads->StringGadgets[i].Gadget, IW, NULL, 1);
  489.                             }
  490.                             else
  491.                                 NextString = i;    /* Reactivate same gadget */
  492.                         }
  493.                     }
  494.                     if (G->GadgetID >= 10 && G->GadgetID <= 14 && (Qual & (IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT))) {
  495.                         Ok = TRUE;
  496.                         quit = TRUE;
  497.                     } else if (NextString)
  498.                         ActivateGadget(&Gads->StringGadgets[NextString].Gadget, IW, NULL);
  499.                     break;
  500.                 case GADGETDOWN:
  501.                     if (G == &Gads->Gadgets1[0].Gadget)
  502.                         DoFileDirGadget(IW, G);
  503.                     else if (G == &Gads->Gadgets1[1].Gadget)
  504.                         DoFileDirGadget(IW, G);
  505.                     else
  506.                         DoProtectGadget(IW, G);
  507.                     break;
  508.                 }
  509.             }
  510.         }
  511.         if (Ok) {
  512.             SelectInfo->si_Flags = 0;
  513.             if (ReqType != PROTECT_REQ) {
  514.                 if (!IsEmpty(Gads->Buffer[3])) {
  515.                     if (!String2Date(Gads->Buffer[3], &SelectInfo->si_SinceDate)) {
  516.                         ActivateGadget(&Gads->StringGadgets[3].Gadget, IW, NULL);
  517.                         quit = FALSE;
  518.                         continue;
  519.                     }
  520.                     SelectInfo->si_SinceSecs = Date2Secs(&SelectInfo->si_SinceDate);
  521.                     SelectInfo->si_Flags |= SI_SINCEDATE;
  522.                 }
  523.                 if (!IsEmpty(Gads->Buffer[4])) {
  524.                     if (!String2Date(Gads->Buffer[4], &SelectInfo->si_BeforeDate)) {
  525.                         ActivateGadget(&Gads->StringGadgets[4].Gadget, IW, NULL);
  526.                         quit = FALSE;
  527.                         continue;
  528.                     }
  529.                     SelectInfo->si_BeforeSecs = Date2Secs(&SelectInfo->si_BeforeDate);
  530.                     SelectInfo->si_Flags |= SI_BEFOREDATE;
  531.                 }
  532.                 /* First clear pattern to avoid trouble in structure comparison */
  533.                 setmem(SelectInfo->si_Pattern, PATTERN_BUF_SIZE, 0);
  534.                 if (!IsEmpty(Gads->Buffer[0])) {
  535.                     strcpy(SelectInfo->si_Pattern, Gads->Buffer[0]);
  536.                     UStrcpy(buf, SelectInfo->si_Pattern);
  537.                     PreParse(buf, SelectInfo->si_PatTok);    /* tokenize Pattern for PatternMatch() */
  538.                     SelectInfo->si_Flags |= SI_NAME;
  539.                 }
  540.                 SelectInfo->si_MinSize = ((struct StringInfo *)Gads->StringGadgets[1].Gadget.SpecialInfo)->LongInt;
  541.                 SelectInfo->si_MaxSize = ((struct StringInfo *)Gads->StringGadgets[2].Gadget.SpecialInfo)->LongInt;
  542.                 if (SelectInfo->si_MinSize || SelectInfo->si_MaxSize)
  543.                     SelectInfo->si_Flags |= SI_SIZE;
  544.                 if (ReqType == SELECT_REQ && (Gads->Gadgets1[2].Gadget.Flags & SELECTED))
  545.                     SelectInfo->si_Flags |= SI_AFFECT_SUBDIRS;
  546.                 for( i=0 ; i<2 ; i++ )
  547.                     SelectInfo->si_Flags |= Gads->Gadgets1[i].Gadget.GadgetID << (i<<1);
  548.             }
  549.             SelectInfo->si_PosProtect = 0;
  550.             SelectInfo->si_NegProtect = 0;
  551.             for( i=0 ; i<9 ; i++ ) {
  552.                 G = &Gads->Gadgets3[i];
  553.                 /* state of Gadget is in GadgetID */
  554.                 switch(G->GadgetID) {
  555.                 case 1:
  556.                     SelectInfo->si_PosProtect |= 1<<i;
  557.                     SelectInfo->si_Flags |= SI_POSPROTECTION;
  558.                     break;
  559.                 case 2:
  560.                     SelectInfo->si_NegProtect |= 1<<i;
  561.                     SelectInfo->si_Flags |= SI_NEGPROTECTION;
  562.                     break;
  563.                 }
  564.             }
  565.         }
  566.     } while(!quit && Ok);    /* quit may be FALSE again if there was an invalid date */
  567.     ClearMenuStrip(IW);
  568.     CloseWindowSafely(IW, NULL);
  569.     FreeMem(Gads, sizeof(struct ReqGadgets));
  570.     return Ok;
  571. }
  572.  
  573.  
  574. short C3GadRequest(char *PositiveText, char *MiddleText, char *fmt, char *Controls);
  575. #pragma regcall(C3GadRequest(a0,a1,a2,a3))
  576.  
  577.  
  578. short C3GadRequest(char *PositiveText, char *MiddleText, char *fmt, char *Controls)
  579. {
  580.     struct TRStructure TRS;
  581.  
  582.     setmem(&TRS, sizeof(struct TRStructure), 0);
  583.     TRS.PositiveText = PositiveText;
  584.     TRS.MiddleText = MiddleText;
  585.     TRS.NegativeText = "Cancel";
  586.     TRS.Text = fmt;
  587.     TRS.Controls = Controls;
  588.     TRS.Title = ReqTitle;
  589.     TRS.KeyMask = 0xFFFF;
  590.     return TextRequest(&TRS);
  591. }
  592.  
  593.  
  594. #asm
  595.  
  596. ;short ThreeGadRequest(char *PositiveText, char *MiddleText, char *fmt,...)
  597.  
  598.     public    _ThreeGadRequest
  599.     public    _C3GadRequest
  600.  
  601. _ThreeGadRequest:
  602.     movem.l a2/a3,-(sp)
  603.     move.l    12(sp),a0        ;TR_PositiveText
  604.     move.l    16(sp),a1        ;TR_MiddleText
  605.     move.l    20(sp),a2        ;TR_Text
  606.     lea.l    24(sp),a3        ;TR_Controls
  607.     jsr        _C3GadRequest
  608.     movem.l (sp)+,a2/a3
  609.     rts
  610.  
  611. #endasm
  612.  
  613.