home *** CD-ROM | disk | FTP | other *** search
/ AMIGA PD 1 / AMIGA-PD-1.iso / Programme_zum_Heft / Anwendungen / Kurztests / PBM / PBMGUI.LHA / PBMGui.c < prev    next >
C/C++ Source or Header  |  1994-02-09  |  40KB  |  1,394 lines

  1. // Freely distributable GadTools interface to PBM Plus
  2.  
  3. // mark@topic.demon.co.uk
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #include <stddef.h>
  9. #include <proto/exec.h>
  10. #include <proto/gadtools.h>
  11. #include <proto/intuition.h>
  12. #include <proto/graphics.h>
  13. #include <proto/asl.h>
  14. extern struct Library *GadToolsBase = NULL;
  15. extern struct Library *AslBase = NULL;
  16. #include <intuition/gadgetclass.h>
  17. #include <dos/dostags.h>
  18.  
  19. #define GetString( g )      ((( struct StringInfo * )g->SpecialInfo )->Buffer  )
  20. #define GetNumber( g )      ((( struct StringInfo * )g->SpecialInfo )->LongInt )
  21.  
  22. #ifdef DEBUG
  23. #define debug1(a) printf(a)
  24. #define debug2(a,b) printf(a,b)
  25. #else
  26. #define debug1(a)
  27. #define debug2(a,b)
  28. #endif
  29.  
  30. #define HEAD_NONE 0
  31. #define HEAD_LOAD 1
  32. #define HEAD_PROCESS 2
  33. #define HEAD_MISC 3
  34. #define HEAD_SAVE 4
  35.  
  36. #define GAD_LFILE    1
  37. #define GAD_SFILE    2
  38. #define GAD_FILE    3
  39. #define GAD_OFILE    4
  40. #define GAD_ONUMBER    5
  41. #define GAD_NUMBER    6
  42. #define GAD_CYCLE    7
  43. #define GAD_STRING    8
  44. #define GAD_OSTRING    9
  45. #define GAD_CHECK    10
  46.  
  47. struct TagItem ProcTags[] = {
  48.     { SYS_Input, 0 },
  49.     { SYS_Output, 0 },
  50.     { NP_Error, 0 },
  51.     { NP_CloseError, FALSE },
  52.     { NP_StackSize, 50000 },
  53.     { TAG_DONE }
  54. };
  55.  
  56. struct MyType {        // Load/Save etc.
  57.     struct List        CList;        // List of commands
  58.     short                Number;        // Number of commands
  59.     struct Gadget    *Gadget;        // Listview gadget
  60. };
  61.  
  62. struct MyCommand {    // A command
  63.     struct Node        CNode;        // In list of commands - holds Title of gadget
  64.     struct List        GList;        // List of gadgets
  65.     struct MyType    *OwnType;    // Owning type
  66.     char                *Command;    //    Command to run
  67.     char                *Comment;    //    Helpful comment
  68. };
  69.  
  70. struct MyGadgetPtr {
  71.     struct MyGadget *MyGadget;
  72.     short                Number;
  73. };
  74.  
  75. struct MyGadget {        // A gadget
  76.     struct Node        GNode;        //    Used for list of gadgets on command
  77.     short                Type;            // Gadget type
  78.     struct List        VList;        // Used for values on cycle gadget
  79.     STRPTR            *VStrings;    //    Used for strings on cycle gadget
  80.     struct MyCommand *OwnCommand;    // Owning command
  81.     struct MyGadget *OwnCycle;    // Owning cycle gadget
  82.     struct Gadget    *Gadget1;    // 1st gadget
  83.     struct Gadget    *Gadget2;    // 2nd gadget
  84.     struct Gadget    *Gadget3;    //    3rd gadget
  85.     long                Activey;        // Cycle value these are activated on
  86.     char                *Title;        // Title of gadget
  87.     char                *Prefix;        // Prefix for command
  88.     char                *Defaults;    //    Default string;
  89.     long                Defaultn;    // Default number;
  90.     short                Defaultc;    // Default check;
  91.     long                Defaulty;    //    Default cycle;
  92.     long                Currentc;    // Current check;
  93.     long                Currenty;    //    Current cycle;
  94.     struct MyGadgetPtr Ptr1;        // UserData points to one of these
  95.     struct MyGadgetPtr Ptr2;
  96.     struct MyGadgetPtr Ptr3;
  97. };
  98.  
  99. struct MyValue {
  100.     struct Node        VNode;        // Used for list of cycle values;
  101.     char                *Prefix;        //    Prefix for command
  102. };
  103.  
  104. UWORD Zoom[] = {
  105.     0,0,
  106.     0,0
  107. };
  108.  
  109. char Version[]="$VER: PBMGui 1.0 (9.2.94)";
  110. char TempFileName[256];
  111. struct FileRequester *filereq;
  112.  
  113. FILE *fp;
  114. char buffer[256];
  115. long linenumber = 0;
  116. short heading=HEAD_NONE;
  117. short FoundError=0;
  118. short OutOfMemory = 0;
  119.  
  120. struct MyType Load,Process,Misc,Save;
  121. struct MyType *CurrentType = NULL;
  122. struct MyCommand *CurrentCommand = NULL;
  123. struct MyGadget *CurrentGadget = NULL;
  124. struct MyGadget *CurrentCycle = NULL;
  125. struct MyValue *CurrentValue = NULL;
  126. long    CurrentCycleVal = -1;
  127.  
  128. /* Wait pointer */
  129. static USHORT __chip BusyPointerData[] =
  130. {
  131.    0x0000,0x0000,
  132.    0x0400,0x07C0,0x0000,0x07C0,0x0100,0x0380,0x0000,0x07E0,
  133.    0x07C0,0x1FF8,0x1FF0,0x3FEC,0x3FF8,0x7FDE,0x3FF8,0x7FBE,
  134.    0x7FFC,0xFF7F,0x7EFC,0xFFFF,0x7FFC,0xFFFF,0x3FF8,0x7FFE,
  135.    0x3FF8,0x7FFE,0x1FF0,0x3FFC,0x07C0,0x1FF8,0x0000,0x07E0,
  136.    0x0000,0x0000,
  137. };
  138.  
  139. void pError(char *a,char *b);
  140. void Command(void);
  141. void ProcessGadget(void);
  142. void ProcessCycle(void);
  143. void GetTitle();
  144. void GetParameter();
  145. void GetStringDefault();
  146. void GetNumberDefault();
  147. void GetCheckDefault();
  148. void GetDefCycle();
  149. void GetCycleTitle();
  150. void GetCycleParameter();
  151. char *myfgets(void);
  152. char *SkipSpace(char *s);
  153. void RequesterStuff(struct MyCommand *MyCommand);
  154. BOOL CreateGadgets(struct MyCommand *MyCommand);
  155. BOOL GetAFile(UBYTE *name,char *Prompt,ULONG flags);
  156.  
  157. #define LISTHEIGHT 160
  158. #define LISTWIDTH 148
  159.  
  160. void
  161. main(int argc,char **argv) {
  162.     struct Screen *MyScreen;
  163.     struct TextAttr *MyTextAttr;
  164.     APTR MyVisInfo;
  165.     struct Gadget *MyContext;
  166.     struct Window *MyWindow;
  167.     struct IntuiMessage    *MyIntuiMsg;
  168.     short Mynotdone = 1;
  169.     struct NewGadget MyNewGadget = {
  170.         0,0,
  171.         LISTWIDTH,LISTHEIGHT,
  172.         NULL,
  173.         NULL,
  174.         PLACETEXT_ABOVE,
  175.         NULL,
  176.         NULL
  177.     };
  178.     struct MyCommand *MyCommand;
  179.     struct MyType *MyType;
  180.     short Count = 0;
  181.     ULONG Secs=0;
  182.     ULONG Micros=0;
  183.     short LastGadget = -1;
  184.     struct MyType *LastType = NULL;
  185.     struct Requester MyRequest;
  186.  
  187. if (IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",37)) {
  188. if (GadToolsBase = OpenLibrary("gadtools.library",37)) {
  189. if (GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",37)) {
  190. if (AslBase = OpenLibrary("asl.library",37)) {
  191. if (filereq = AllocFileRequest()) {
  192.     NewList(&Load.CList);
  193.     Load.Number = 0;
  194.     NewList(&Process.CList);
  195.     Process.Number = 0;
  196.     NewList(&Misc.CList);
  197.     Misc.Number = 0;
  198.     NewList(&Save.CList);
  199.     Save.Number = 0;
  200.     if (fp = fopen("PROGDIR:PBMGui.config","r")) {
  201.         while (myfgets()) {
  202.             if (buffer[0] == '=') {
  203.                 if (!strcmp(&buffer[1],"LOAD\n")) {
  204.                     heading = HEAD_LOAD;
  205.                     CurrentType = &Load;
  206.                 }
  207.                 else {
  208.                     if (!strcmp(&buffer[1],"PROCESS\n")) {
  209.                         heading = HEAD_PROCESS;
  210.                         CurrentType = &Process;
  211.                     }
  212.                     else {
  213.                         if (!strcmp(&buffer[1],"MISC\n")) {
  214.                             heading = HEAD_MISC;
  215.                             CurrentType = &Misc;
  216.                         }
  217.                         else {
  218.                             if (!strcmp(&buffer[1],"SAVE\n")) {
  219.                                 heading = HEAD_SAVE;
  220.                                 CurrentType = &Save;
  221.                             }
  222.                             else {
  223.                                 heading = HEAD_NONE;
  224.                                 CurrentType = NULL;
  225.                                 pError("Invalid = header %s",&buffer[1]);
  226.                             }
  227.                         }
  228.                     }
  229.                 }
  230.             }
  231.             else {
  232.                 if (buffer[0] == '\n') {
  233.                 }
  234.                 else {
  235.                     if (buffer[0] == '"') {
  236.                         Command();
  237.                     }
  238.                 }
  239.             }
  240.         }
  241.         if (!FoundError) {
  242.             if (MyScreen = LockPubScreen(NULL)) {
  243.                 MyTextAttr = MyScreen->Font;
  244.                 if (MyVisInfo = GetVisualInfo(MyScreen,NULL)) {
  245.                     if (CreateContext(&MyContext)) {
  246.                         MyNewGadget.ng_TopEdge = MyScreen->WBorTop + (MyScreen->Font->ta_YSize + 1 + INTERHEIGHT)*2;
  247.                         MyNewGadget.ng_LeftEdge = MyScreen->WBorLeft + INTERWIDTH;
  248.                         MyNewGadget.ng_VisualInfo = MyVisInfo;
  249.                         MyNewGadget.ng_TextAttr = MyTextAttr;
  250.                         MyNewGadget.ng_UserData = &(Load);
  251.                         MyNewGadget.ng_GadgetText = "Load";
  252.                         if (Load.Gadget = CreateGadget(LISTVIEW_KIND,MyContext,&MyNewGadget,
  253.                                         GTLV_Labels, &(Load.CList),
  254.                                         GTLV_ShowSelected,NULL,
  255.                                         TAG_END)) {
  256.                             MyNewGadget.ng_UserData = &(Process);
  257.                             MyNewGadget.ng_GadgetText = "Process";
  258.                             MyNewGadget.ng_LeftEdge += LISTWIDTH + INTERWIDTH;
  259.                             if (Process.Gadget = CreateGadget(LISTVIEW_KIND,Load.Gadget,&MyNewGadget,
  260.                                             GTLV_Labels, &(Process.CList),
  261.                                             GTLV_ShowSelected,NULL,
  262.                                             TAG_END)) {
  263.                                 MyNewGadget.ng_UserData = &(Misc);
  264.                                 MyNewGadget.ng_GadgetText = "Misc";
  265.                                 MyNewGadget.ng_LeftEdge += LISTWIDTH + INTERWIDTH;
  266.                                 if (Misc.Gadget = CreateGadget(LISTVIEW_KIND,Process.Gadget,&MyNewGadget,
  267.                                                 GTLV_Labels, &(Misc.CList),
  268.                                                 GTLV_ShowSelected,NULL,
  269.                                                 TAG_END)) {
  270.                                     MyNewGadget.ng_UserData = &(Save);
  271.                                     MyNewGadget.ng_GadgetText = "Save";
  272.                                     MyNewGadget.ng_LeftEdge += LISTWIDTH + INTERWIDTH;
  273.                                     if (Save.Gadget = CreateGadget(LISTVIEW_KIND,Misc.Gadget,&MyNewGadget,
  274.                                                     GTLV_Labels, &(Save.CList),
  275.                                                     GTLV_ShowSelected,NULL,
  276.                                                     TAG_END)) {
  277.                                         Zoom[0] = 0;
  278.                                         Zoom[1] = MyScreen->BarHeight+1;
  279.                                         Zoom[2] = 200;
  280.                                         Zoom[3] = MyScreen->WBorTop + MyScreen->Font->ta_YSize + 1;
  281.                                         if (MyWindow = OpenWindowTags(NULL,
  282.                                                       WA_Flags,      WFLG_DRAGBAR|
  283.                                                                     WFLG_DEPTHGADGET|
  284.                                                                WFLG_CLOSEGADGET|
  285.                                                                  WFLG_SMART_REFRESH|
  286.                                                               WFLG_ACTIVATE,
  287.                                                    WA_IDCMP,   BUTTONIDCMP|
  288.                                                                 IDCMP_CLOSEWINDOW|
  289.                                                               IDCMP_REFRESHWINDOW|
  290.                                                               LISTVIEWIDCMP,
  291.                                                       WA_Width,   (LISTWIDTH * 4 + INTERWIDTH * 5) + 
  292.                                                                       MyScreen->WBorLeft + MyScreen->WBorRight,
  293.                                                   WA_Height,  LISTHEIGHT + MyScreen->WBorTop + 
  294.                                                                   (MyScreen->Font->ta_YSize + 1)*2 + (INTERHEIGHT * 3),
  295.                                                     WA_Title,    "PBMGui",
  296.                                                     WA_AutoAdjust,    TRUE,
  297.                                                     WA_PubScreen,    MyScreen,
  298.                                                     WA_Gadgets,    MyContext,
  299.                                                     WA_Zoom, Zoom,
  300.                                                     TAG_END)) {
  301.                                             GT_RefreshWindow(MyWindow,NULL);
  302.                                             while (Mynotdone) {
  303.                                                 WaitPort(MyWindow->UserPort);
  304.                                                     while (MyIntuiMsg = GT_GetIMsg(MyWindow->UserPort)) {
  305.                                                         switch (MyIntuiMsg->Class) {
  306.                                                         case IDCMP_REFRESHWINDOW:
  307.                                                             GT_BeginRefresh(MyWindow);
  308.                                                             GT_EndRefresh(MyWindow,TRUE);
  309.                                                             break;
  310.                                                         case IDCMP_CLOSEWINDOW:
  311.                                                             Mynotdone = 0;
  312.                                                             break;
  313.                                                         case IDCMP_GADGETUP:
  314.                                                             MyType = (struct MyType *)((struct Gadget *)MyIntuiMsg->IAddress)->UserData;
  315.                                                             if ((MyType == LastType) &&
  316.                                                                  (LastGadget == MyIntuiMsg->Code) &&
  317.                                                                  DoubleClick(Secs,Micros,MyIntuiMsg->Seconds,MyIntuiMsg->Micros)) {
  318.                                                                 Count = 0;
  319.                                                                 for (MyCommand = (struct MyCommand *)MyType->CList.lh_Head;
  320.                                                                         (Count != MyIntuiMsg->Code);
  321.                                                                         MyCommand = (struct MyCommand *)MyCommand->CNode.ln_Succ) {
  322.                                                                     ++Count;
  323.                                                                 }
  324.                                                                 if (*MyCommand->Command != ' ') {
  325.                                                                     InitRequester(&MyRequest);
  326.                                                                     SetPointer(MyWindow, BusyPointerData, 16, 16, -6, 0);
  327.                                                                     if (Request(&MyRequest,MyWindow)) {
  328.                                                                         RequesterStuff(MyCommand);
  329.                                                                         EndRequest(&MyRequest,MyWindow);
  330.                                                                     }
  331.                                                                     ClearPointer(MyWindow);
  332.                                                                 }
  333.                                                             }
  334.                                                             LastType = MyType;
  335.                                                             LastGadget = MyIntuiMsg->Code;
  336.                                                             Secs = MyIntuiMsg->Seconds;
  337.                                                             Micros = MyIntuiMsg->Micros;
  338.                                                             break;
  339.                                                     }
  340.                                                     GT_ReplyIMsg(MyIntuiMsg);
  341.                                                 }
  342.                                             }
  343.                                             CloseWindow(MyWindow);
  344.                                         }
  345.                                     }
  346.                                 }
  347.                             }
  348.                         }
  349.                         FreeGadgets(MyContext);
  350.                     }
  351.                     FreeVisualInfo(MyVisInfo);
  352.                 }
  353.                 UnlockPubScreen(NULL,MyScreen);
  354.             }
  355.         }
  356.         fclose(fp);
  357.     }
  358. FreeAslRequest(filereq);
  359. }
  360. CloseLibrary(AslBase);
  361. }
  362. CloseLibrary((struct Library *)GfxBase);
  363. }
  364. CloseLibrary(GadToolsBase);
  365. }
  366. CloseLibrary((struct Library *)IntuitionBase);
  367. }
  368. }
  369.  
  370. void
  371. Command(void) {
  372.     char *s,*s1;
  373.     if (CurrentCommand = (struct MyCommand *)calloc(1,sizeof(struct MyCommand))) {
  374.         CurrentCommand->OwnType = CurrentType;
  375.         NewList(&CurrentCommand->GList);
  376.         if (CurrentType) {
  377.             AddTail(&CurrentType->CList,&CurrentCommand->CNode);
  378.             ++CurrentType->Number;
  379.         }
  380.     }
  381.     else {
  382.         pError("Out of memory",NULL);
  383.         OutOfMemory = 1;
  384.         return;
  385.     }
  386.     s = strchr(&buffer[1],'"');
  387.     if (s) {
  388.         *s = 0;
  389.         CurrentCommand->Command = strdup(&buffer[1]);
  390.         while ((s = myfgets()) && !strchr(buffer,'"')) {
  391.         }
  392.         if (s) {
  393.             s = strchr(buffer,'"');
  394.             s1 = strchr(s+1,'"');
  395.             if (s1) {
  396.                 *s1=0;
  397.                 CurrentCommand->Comment = strdup(s+1);
  398.                 if (myfgets()) {
  399.                     s = strchr(buffer,'"');
  400.                     if (s) {
  401.                         s1 = strchr(s+1,'"');
  402.                         if (s1) {
  403.                             *s1=0;
  404.                             CurrentCommand->CNode.ln_Name = strdup(s+1);
  405.                             while (myfgets() && (buffer[0] != '\n')) {
  406.                                 ProcessGadget();
  407.                             }
  408.                          }
  409.                         else {
  410.                             pError("No trailing \" on 'Title' line",NULL);
  411.                             while (myfgets() && (buffer[0] != '\n')) {
  412.                             }
  413.                         }
  414.                     }
  415.                     else {
  416.                         pError("No starting \" on 'Title' line",NULL);
  417.                         while (myfgets() && (buffer[0] != '\n')) {
  418.                         }
  419.                     }
  420.                 }
  421.                 else {
  422.                     pError("Unexpected end of file - missing Title",NULL);
  423.                 }
  424.             }
  425.             else {
  426.                 pError("No trailing \" on 'Comment' line",NULL);
  427.                 while (myfgets() && (buffer[0] != '\n')) {
  428.                 }
  429.             }
  430.         }
  431.         else {
  432.             pError("Unexpected end of file - Missin Comment",NULL);
  433.         }
  434.     }
  435.     else {
  436.         pError("No trailing \" on 'Command' line",NULL);
  437.         while (myfgets() && (buffer[0] != '\n')) {
  438.         }
  439.     }
  440.     CurrentCommand = NULL;
  441. }
  442.  
  443. void
  444. pError(char *a,char *b) {
  445.     if (!OutOfMemory) {
  446.         printf("Error on line %ld\n",linenumber);
  447.         printf(a,b);
  448.         printf("\n");
  449.         ++FoundError;
  450.     }
  451. }
  452.  
  453. char
  454. *myfgets(void) {
  455.     char *s;
  456.     if ((FoundError > 10) || (OutOfMemory)) {
  457.         printf("Too many errors - giving up!!!\n");
  458.         return NULL;
  459.     }
  460.     ++linenumber;
  461.     while ((s = fgets(buffer,255,fp)) && (buffer[0] == '*')) {
  462.         ++linenumber;
  463.     }
  464.     return s;
  465. }
  466.  
  467. void
  468. ProcessGadget(void) {
  469.     char *s;
  470.     if (CurrentGadget = (struct MyGadget *)calloc(1,sizeof(struct MyGadget))) {
  471.         CurrentGadget->OwnCommand = CurrentCommand;
  472.         NewList(&CurrentGadget->VList);
  473.         if (CurrentCommand) {
  474.             AddTail(&CurrentCommand->GList,&CurrentGadget->GNode);
  475.         }
  476.         if (CurrentCycle) {
  477.             CurrentGadget->Activey = CurrentCycleVal;
  478.             CurrentGadget->OwnCycle = CurrentCycle;
  479.         }
  480.     }
  481.     else {
  482.         pError("Out of memory",NULL);
  483.         OutOfMemory = 1;
  484.         return;
  485.     }
  486.     s = SkipSpace(buffer);
  487.     if (s) {
  488.         if (!strncmp(s,"LFILE",strlen("LFILE"))) {
  489.             CurrentGadget->Type = GAD_LFILE;
  490.             GetTitle();
  491.             GetParameter();
  492.             GetStringDefault();
  493.         }
  494.         else {
  495.             if (!strncmp(s,"SFILE",strlen("SFILE"))) {
  496.                 CurrentGadget->Type = GAD_SFILE;
  497.                 GetTitle();
  498.                 GetParameter();
  499.                 GetStringDefault();
  500.             }
  501.             else {
  502.                 if (!strncmp(s,"FILE",strlen("FILE"))) {
  503.                     CurrentGadget->Type = GAD_FILE;
  504.                     GetTitle();
  505.                     GetParameter();
  506.                     GetStringDefault();
  507.                 }
  508.                 else {
  509.                     if (!strncmp(s,"OFILE",strlen("OFILE"))) {
  510.                         CurrentGadget->Type = GAD_OFILE;
  511.                         GetTitle();
  512.                         GetParameter();
  513.                         GetStringDefault();
  514.                         GetCheckDefault();
  515.                     }
  516.                     else {
  517.                         if (!strncmp(s,"ONUMBER",strlen("ONUMBER"))) {
  518.                             CurrentGadget->Type = GAD_ONUMBER;
  519.                             GetTitle();
  520.                             GetParameter();
  521.                             GetNumberDefault();
  522.                             GetCheckDefault();
  523.                         }
  524.                         else {
  525.                             if (!strncmp(s,"NUMBER",strlen("NUMBER"))) {
  526.                                 CurrentGadget->Type = GAD_NUMBER;
  527.                                 GetTitle();
  528.                                 GetParameter();
  529.                                 GetNumberDefault();
  530.                             }
  531.                             else {
  532.                                 if (!strncmp(s,"CYCLE",strlen("CYCLE"))) {
  533.                                     CurrentGadget->Type = GAD_CYCLE;
  534.                                     if (CurrentCycle) {
  535.                                         pError("Cannot have CYCLE in CYCLE",NULL);
  536.                                     }
  537.                                     else {
  538.                                         GetTitle();
  539.                                         ProcessCycle();
  540.                                     }
  541.                                 }
  542.                                 else {
  543.                                     if (!strncmp(s,"STRING",strlen("STRING"))) {
  544.                                         CurrentGadget->Type = GAD_STRING;
  545.                                         GetTitle();
  546.                                         GetParameter();
  547.                                         GetStringDefault();
  548.                                     }
  549.                                     else {
  550.                                         if (!strncmp(s,"OSTRING",strlen("OSTRING"))) {
  551.                                             CurrentGadget->Type = GAD_OSTRING;
  552.                                             GetTitle();
  553.                                             GetParameter();
  554.                                             GetStringDefault();
  555.                                             GetCheckDefault();
  556.                                         }
  557.                                         else {
  558.                                             if (!strncmp(s,"CHECK",strlen("CHECK"))) {
  559.                                                 CurrentGadget->Type = GAD_CHECK;
  560.                                                 GetTitle();
  561.                                                 GetParameter();
  562.                                                 GetCheckDefault();
  563.                                             }
  564.                                             else {
  565.                                                 pError("Unknown gadget type",s);
  566.                                                 while(myfgets() && (buffer[0] != '\n')) {
  567.                                                 }
  568.                                             }
  569.                                         }
  570.                                     }
  571.                                 }
  572.                             }
  573.                         }
  574.                     }
  575.                 }
  576.             }
  577.         }
  578.     }
  579.     else {
  580.         pError("Unexpcted space filled line",NULL);
  581.     }
  582.     CurrentGadget = NULL;
  583. }
  584.  
  585. void
  586. ProcessCycle(void) {
  587.     char *s;
  588.     short endfound = 0;
  589.     short first = 1;
  590.     short StringCount = 0;
  591.     struct MyValue *MyValue;
  592.     STRPTR *ptr;
  593.     CurrentCycle = CurrentGadget;
  594.     CurrentCycleVal = -1;
  595.     while (!endfound && myfgets()) {
  596.         s = SkipSpace(buffer);
  597.         if (s) {
  598.             if (*s == '"') {
  599.                 first = 0;
  600.                 if (CurrentValue = (struct MyValue *)calloc(1,sizeof(struct MyValue))) {
  601.                     AddTail(&CurrentCycle->VList,&CurrentValue->VNode);
  602.                     GetCycleTitle();
  603.                     GetCycleParameter();
  604.                     CurrentValue = NULL;
  605.                     ++StringCount;
  606.                     ++CurrentCycleVal;
  607.                 }
  608.                 else {
  609.                     pError("Out of memory",NULL);
  610.                     OutOfMemory = 1;
  611.                     return;
  612.                 }
  613.             }
  614.             else {
  615.                 if (!first) {
  616.                     if (!strncmp(s,"ENDCYCLE",strlen("ENDCYCLE"))) {
  617.                         GetDefCycle();
  618.                         endfound = 1;
  619.                     }
  620.                     else {
  621.                         ProcessGadget();
  622.                     }
  623.                 }
  624.                 else {
  625.                     pError("Missing first cycle gadget text",NULL);
  626.                     while (myfgets() && (buffer[0] != '\n')) {
  627.                     }
  628.                 }
  629.             }
  630.         }
  631.         else {
  632.             pError("Unexpected space line - Missing ENDCYCLE",NULL);
  633.             return;
  634.         }
  635.     }
  636.     if (!endfound) {
  637.         pError("Unexpected end of file - Missing ENDCYCLE",NULL);
  638.     }
  639.     if (ptr = CurrentCycle->VStrings = (STRPTR *)calloc(sizeof(STRPTR),StringCount+1)) {
  640.         for (MyValue = (struct MyValue *)CurrentCycle->VList.lh_Head;
  641.                 MyValue->VNode.ln_Succ;
  642.                 MyValue = (struct MyValue *)MyValue->VNode.ln_Succ) {
  643.             *ptr = MyValue->VNode.ln_Name;
  644.             ptr++;
  645.         }
  646.     }
  647.     else {
  648.         pError("Out of memory",NULL);
  649.         OutOfMemory = 1;
  650.         return;
  651.     }
  652.     CurrentCycle = NULL;
  653. }
  654.  
  655. char *CurrentPos;
  656.  
  657. void
  658. GetTitle() {
  659.     char *s;
  660.     CurrentPos = strchr(buffer,'"');
  661.     if (CurrentPos) {
  662.         s = CurrentPos + 1;
  663.         CurrentPos = strchr(s,'"');
  664.         if (CurrentPos) {
  665.             *CurrentPos = 0;
  666.             CurrentGadget->Title = strdup(s);
  667.             ++CurrentPos;
  668.         }
  669.         else {
  670.             pError("Missing gadget Title end \"",NULL);
  671.         }
  672.     }
  673.     else {
  674.         pError("Missing gadget Title start \"",NULL);
  675.     }
  676. }
  677.  
  678. void
  679. GetParameter() {
  680.     char *s;
  681.     if (CurrentPos) {
  682.         CurrentPos = strchr(CurrentPos,'"');
  683.         if (CurrentPos) {
  684.             s = CurrentPos + 1;
  685.             CurrentPos = strchr(s,'"');
  686.             if (CurrentPos) {
  687.                 *CurrentPos = 0;
  688.                 CurrentGadget->Prefix = strdup(s);
  689.                 ++CurrentPos;
  690.             }
  691.             else {
  692.                 pError("Missing gadget Prefix end \"",NULL);
  693.             }
  694.         }
  695.         else {
  696.             pError("Missing gadget Prefix start \"",NULL);
  697.         }
  698.     }
  699. }
  700.  
  701. char *NullString = "";
  702.  
  703. void
  704. GetStringDefault() {
  705.     char *s;
  706.     if (CurrentPos) {
  707.         CurrentPos = strchr(CurrentPos,'"');
  708.         if (CurrentPos) {
  709.             s = CurrentPos + 1;
  710.             CurrentPos = strchr(s,'"');
  711.             if (CurrentPos) {
  712.                 *CurrentPos = 0;
  713.                 CurrentGadget->Defaults = strdup(s);
  714.                 ++CurrentPos;
  715.             }
  716.             else {
  717.                 pError("Missing gadget Default end \"",NULL);
  718.             }
  719.         }
  720.         else {
  721.             CurrentGadget->Defaults = NullString;
  722.         }
  723.     }
  724.     else {
  725.         CurrentGadget->Defaults = NullString;
  726.     }
  727. }
  728.  
  729. void
  730. GetNumberDefault() {
  731.     char *s;
  732.     long number;
  733.     if (CurrentPos) {
  734.         CurrentPos = strchr(CurrentPos,'"');
  735.         if (CurrentPos) {
  736.             s = CurrentPos + 1;
  737.             CurrentPos = strchr(s,'"');
  738.             if (CurrentPos) {
  739.                 *CurrentPos = 0;
  740.                 number = strtol(s,&CurrentPos,10);
  741.                 CurrentGadget->Defaultn = number;
  742.                 ++CurrentPos;
  743.             }
  744.             else {
  745.                 pError("Missing gadget Default end \"",NULL);
  746.             }
  747.         }
  748.         else {
  749.             number = 0;
  750.             CurrentGadget->Defaultn = number;
  751.         }
  752.     }
  753.     else {
  754.         number = 0;
  755.         CurrentGadget->Defaultn = number;
  756.     }
  757. }
  758.  
  759. void
  760. GetCheckDefault() {
  761.     char *s;
  762.     short Check;
  763.     if (CurrentPos) {
  764.         s = strpbrk(CurrentPos,"YN");
  765.         if (s && *s) {
  766.             if (*s == 'Y') {
  767.                 Check = 1;
  768.                 CurrentGadget->Defaultc = Check;
  769.             }
  770.             else {
  771.                 Check = 0;
  772.                 CurrentGadget->Defaultc = Check;
  773.             }
  774.         }
  775.         else {
  776.             Check = 0;
  777.             CurrentGadget->Defaultc = Check;
  778.         }
  779.     }
  780.     else {
  781.         Check = 0;
  782.         CurrentGadget->Defaultc = Check;
  783.     }
  784.     CurrentGadget->Currentc = CurrentGadget->Defaultc;
  785. }
  786.  
  787. void
  788. GetDefCycle() {
  789.     char *s;
  790.     long number;
  791.     CurrentPos = strchr(buffer,'"');
  792.     if (CurrentPos) {
  793.         s = CurrentPos + 1;
  794.         CurrentPos = strchr(s,'"');
  795.         if (CurrentPos) {
  796.             *CurrentPos = 0;
  797.             number = strtol(s,&CurrentPos,10);
  798.             CurrentCycle->Defaulty = number;
  799.             ++CurrentPos;
  800.         }
  801.         else {
  802.             pError("Missing gadget Default end \"",NULL);
  803.         }
  804.     }
  805.     else {
  806.         number = 0;
  807.         CurrentCycle->Defaulty = number;
  808.     }
  809.     CurrentCycle->Currenty = CurrentCycle->Defaulty;
  810. }
  811.  
  812. void
  813. GetCycleTitle() {
  814.     char *s;
  815.     CurrentPos = strchr(buffer,'"');
  816.     if (CurrentPos) {
  817.         s = CurrentPos + 1;
  818.         CurrentPos = strchr(s,'"');
  819.         if (CurrentPos) {
  820.             *CurrentPos = 0;
  821.             CurrentValue->VNode.ln_Name = strdup(s);
  822.             ++CurrentPos;
  823.         }
  824.         else {
  825.             pError("Missing Cycle Value end \"",NULL);
  826.         }
  827.     }
  828.     else {
  829.         pError("Missing Cycle Value start \"",NULL);
  830.     }
  831. }
  832.  
  833. void
  834. GetCycleParameter() {
  835.     char *s;
  836.     if (CurrentPos) {
  837.         CurrentPos = strchr(CurrentPos,'"');
  838.         if (CurrentPos) {
  839.             s = CurrentPos + 1;
  840.             CurrentPos = strchr(s,'"');
  841.             if (CurrentPos) {
  842.                 *CurrentPos = 0;
  843.                 CurrentValue->Prefix = strdup(s);
  844.                 ++CurrentPos;
  845.             }
  846.             else {
  847.                 pError("Missing Cycle value Prefix end \"",NULL);
  848.             }
  849.         }
  850.         else {
  851.             pError("Missing Cycle value Prefix start \"",NULL);
  852.         }
  853.     }
  854. }
  855.  
  856. char
  857. *SkipSpace(char *s) {
  858.     while (s && *s && ((*s == ' ') || (*s == '\t'))) {
  859.         ++s;
  860.     }
  861.     return s;
  862. }
  863.  
  864.  
  865. #define LEFT 15
  866. #define RIGHT 30
  867.  
  868. struct Screen *Screen;
  869. struct TextAttr *TextAttr;
  870. APTR VisInfo;
  871. struct Gadget *Context;
  872. struct Window *Window;
  873. struct Requester Requestx;
  874. struct IntuiMessage    *IntuiMsg;
  875. long height = 0;
  876. UWORD width = 0;
  877. BOOL File1 = TRUE;
  878. char Buffer[1024];
  879. char tBuffer[256];
  880.  
  881. void
  882. RequesterStuff(struct MyCommand *MyCommand) {
  883.     struct MyGadgetPtr *Ptr;
  884.     struct MyGadget *MyGadget,*LoopGadget;
  885.     struct MyValue *MyValue;
  886.     short count;
  887.     short notdone = 1;
  888.     if (Screen = LockPubScreen(NULL)) {
  889.         TextAttr = Screen->Font;
  890.         if (VisInfo = GetVisualInfo(Screen,NULL)) {
  891.             if (CreateContext(&Context)) {
  892.                 if (CreateGadgets(MyCommand)) {
  893.                     if (Window = OpenWindowTags(NULL,
  894.                           WA_Flags,      WFLG_DRAGBAR|
  895.                                         WFLG_DEPTHGADGET|
  896.                                    WFLG_CLOSEGADGET|
  897.                                      WFLG_SMART_REFRESH|
  898.                                   WFLG_ACTIVATE,
  899.                        WA_IDCMP,   BUTTONIDCMP|
  900.                                     IDCMP_CLOSEWINDOW|
  901.                                   IDCMP_REFRESHWINDOW,
  902.                           WA_Width,   width * (LEFT + RIGHT) + (INTERWIDTH * 2) +
  903.                                             Screen->WBorLeft +
  904.                                             Screen->WBorRight,
  905.                       WA_Height,  height,
  906.                         WA_Title,    MyCommand->Comment,
  907.                         WA_AutoAdjust,    TRUE,
  908.                         WA_PubScreen,    Screen,
  909.                         WA_Gadgets,    Context,
  910.                         WA_Zoom, Zoom,
  911.                         TAG_END)) {
  912.                         GT_RefreshWindow(Window,NULL);
  913.                         while (notdone) {
  914.                             WaitPort(Window->UserPort);
  915.                             while (IntuiMsg = GT_GetIMsg(Window->UserPort)) {
  916.                                 switch (IntuiMsg->Class) {
  917.                                 case IDCMP_REFRESHWINDOW:
  918.                                     GT_BeginRefresh(Window);
  919.                                     GT_EndRefresh(Window,TRUE);
  920.                                     break;
  921.                                 case IDCMP_CLOSEWINDOW:
  922.                                     if ((MyCommand->OwnType == &Process)) {
  923.                                         File1 = !File1;
  924.                                     }
  925.                                     notdone = 0;
  926.                                     break;
  927.                                 case IDCMP_GADGETUP:
  928.                                     Ptr = (struct MyGadgetPtr *)((struct Gadget *)IntuiMsg->IAddress)->UserData;
  929.                                 if (!Ptr) {
  930.                                     sprintf(Buffer,"%s",MyCommand->Command);
  931.                                     for (LoopGadget = (struct MyGadget *)(MyCommand->GList.lh_Head);
  932.                                             LoopGadget->GNode.ln_Succ;
  933.                                             LoopGadget = (struct MyGadget *)(LoopGadget->GNode.ln_Succ)) {
  934.                                         if (!LoopGadget->OwnCycle || (LoopGadget->OwnCycle->Currenty == LoopGadget->Activey)) {
  935.                                             switch (LoopGadget->Type) {
  936.                                             case GAD_LFILE:
  937.                                             case GAD_SFILE:
  938.                                             case GAD_FILE:
  939.                                                 sprintf(tBuffer,"%s\"%s\" ",LoopGadget->Prefix,GetString(LoopGadget->Gadget1));
  940.                                                 strcat(Buffer,tBuffer);
  941.                                                 break;
  942.                                                 case GAD_OFILE:
  943.                                                 if (LoopGadget->Currentc) {
  944.                                                     sprintf(tBuffer,"%s\"%s\" ",LoopGadget->Prefix,GetString(LoopGadget->Gadget2));
  945.                                                     strcat(Buffer,tBuffer);
  946.                                                 }
  947.                                                 break;
  948.                                             case GAD_ONUMBER:
  949.                                                 if (LoopGadget->Currentc) {
  950.                                                     sprintf(tBuffer,"%s%ld ",LoopGadget->Prefix,GetNumber(LoopGadget->Gadget2));
  951.                                                     strcat(Buffer,tBuffer);
  952.                                                 }
  953.                                                 break;
  954.                                             case GAD_NUMBER:
  955.                                                 sprintf(tBuffer,"%s%ld ",LoopGadget->Prefix,GetNumber(LoopGadget->Gadget1));
  956.                                                 strcat(Buffer,tBuffer);
  957.                                                 break;
  958.                                             case GAD_CYCLE:
  959.                                                 count = 0;
  960.                                                 for (MyValue = (struct MyValue *)(LoopGadget->VList.lh_Head);
  961.                                                         MyValue->VNode.ln_Succ;
  962.                                                         MyValue = (struct MyValue *)(MyValue->VNode.ln_Succ)){
  963.                                                     if (count == LoopGadget->Currenty) {
  964.                                                         sprintf(tBuffer,"%s ",MyValue->Prefix);
  965.                                                         strcat(Buffer,tBuffer);
  966.                                                     }
  967.                                                     ++count;
  968.                                                 }
  969.                                                 break;
  970.                                             case GAD_STRING:
  971.                                                 sprintf(tBuffer,"%s%s ",LoopGadget->Prefix,GetString(LoopGadget->Gadget1));
  972.                                                 strcat(Buffer,tBuffer);
  973.                                                 break;
  974.                                             case GAD_OSTRING:
  975.                                                 if (LoopGadget->Currentc) {
  976.                                                     sprintf(tBuffer,"%s%s ",LoopGadget->Prefix,GetString(LoopGadget->Gadget2));
  977.                                                     strcat(Buffer,tBuffer);
  978.                                                 }
  979.                                                 break;
  980.                                             case GAD_CHECK:
  981.                                                 if (LoopGadget->Currentc) {
  982.                                                     sprintf(tBuffer,"%s ",LoopGadget->Prefix);
  983.                                                     strcat(Buffer,tBuffer);
  984.                                                 }
  985.                                                 break;
  986.                                             }
  987.                                         }
  988.                                     }
  989.                                     InitRequester(&Requestx);
  990.                                     SetPointer(Window, BusyPointerData, 16, 16, -6, 0);
  991.                                     if (Request(&Requestx,Window)) {
  992.                                         ProcTags[0].ti_Data = Input();
  993.                                         ProcTags[1].ti_Data = Output();
  994.                                         ProcTags[2].ti_Data = Output();
  995.                                         if (SystemTagList(Buffer,ProcTags)) {
  996.                                             // if command fails then switch back to original
  997.                                             if ((MyCommand->OwnType == &Process)) {
  998.                                                 File1 = !File1;
  999.                                             }
  1000.                                         }
  1001.                                         EndRequest(&Requestx,Window);
  1002.                                     }
  1003.                                     ClearPointer(Window);
  1004.                                     notdone = 0;
  1005.                                 }
  1006.                                 else {
  1007.                                     MyGadget = Ptr->MyGadget;
  1008.                                     switch (MyGadget->Type) {
  1009.                                         case GAD_LFILE:
  1010.                                         case GAD_SFILE:
  1011.                                         case GAD_FILE:
  1012.                                             switch (Ptr->Number) {
  1013.                                             case 2:
  1014.                                                 if (GetAFile(GetString(MyGadget->Gadget1),
  1015.                                                      (MyGadget->Type == GAD_LFILE)?"Select input file":
  1016.                                                      (MyGadget->Type == GAD_SFILE)?"Select output file":
  1017.                                                      "Select file",
  1018.                                                      (MyGadget->Type == GAD_SFILE)?FILF_SAVE:0)) {
  1019.                                                     GT_SetGadgetAttrs(MyGadget->Gadget1,Window,NULL,
  1020.                                                         GTST_String,TempFileName,
  1021.                                                         TAG_END);
  1022.                                                 }
  1023.                                                 break;
  1024.                                             }
  1025.                                             break;
  1026.                                         case GAD_OFILE:
  1027.                                             switch (Ptr->Number) {
  1028.                                             case 1:
  1029.                                                 MyGadget->Currentc = !MyGadget->Currentc;
  1030.                                                 GT_SetGadgetAttrs(MyGadget->Gadget2,Window,NULL,
  1031.                                                         GA_Disabled,!MyGadget->Currentc,
  1032.                                                         TAG_END);
  1033.                                                 GT_SetGadgetAttrs(MyGadget->Gadget3,Window,NULL,
  1034.                                                         GA_Disabled,!MyGadget->Currentc,
  1035.                                                         TAG_END);
  1036.                                                 if (MyGadget->Currentc) {
  1037.                                                     ActivateGadget(MyGadget->Gadget2,Window,NULL);
  1038.                                                 }
  1039.                                                 break;
  1040.                                             case 3:
  1041.                                                 if (GetAFile(GetString(MyGadget->Gadget2),
  1042.                                                      "Select file",0)) {
  1043.                                                     GT_SetGadgetAttrs(MyGadget->Gadget2,Window,NULL,
  1044.                                                         GTST_String,TempFileName,
  1045.                                                         TAG_END);
  1046.                                                 }
  1047.                                                 break;
  1048.                                             }
  1049.                                             break;
  1050.                                         case GAD_ONUMBER:
  1051.                                             switch (Ptr->Number) {
  1052.                                             case 1:
  1053.                                                 MyGadget->Currentc = !MyGadget->Currentc;
  1054.                                                 GT_SetGadgetAttrs(MyGadget->Gadget2,Window,NULL,
  1055.                                                         GA_Disabled,!MyGadget->Currentc,
  1056.                                                         TAG_END);
  1057.                                                 if (MyGadget->Currentc) {
  1058.                                                     ActivateGadget(MyGadget->Gadget2,Window,NULL);
  1059.                                                 }
  1060.                                                 break;
  1061.                                             }
  1062.                                             break;
  1063.                                         case GAD_NUMBER:
  1064.                                             break;
  1065.                                         case GAD_CYCLE:
  1066.                                             MyGadget->Currenty = IntuiMsg->Code;
  1067.                                             for (LoopGadget = (struct MyGadget *)(MyGadget->OwnCommand->GList.lh_Head);
  1068.                                                     LoopGadget->GNode.ln_Succ;
  1069.                                                     LoopGadget = (struct MyGadget *)(LoopGadget->GNode.ln_Succ)){
  1070.                                                 if (MyGadget == LoopGadget->OwnCycle) {
  1071.                                                     GT_SetGadgetAttrs(LoopGadget->Gadget1,Window,NULL,
  1072.                                                             GA_Disabled,MyGadget->Currenty != LoopGadget->Activey,
  1073.                                                             TAG_END);
  1074.                                                     if (LoopGadget->Gadget2) {
  1075.                                                         GT_SetGadgetAttrs(LoopGadget->Gadget2,Window,NULL,
  1076.                                                                 GA_Disabled,(MyGadget->Currenty != LoopGadget->Activey) |
  1077.                                                                                 (((LoopGadget->Type == GAD_ONUMBER) |
  1078.                                                                                   (LoopGadget->Type == GAD_OSTRING) |
  1079.                                                                                   (LoopGadget->Type == GAD_OFILE)) & (!LoopGadget->Currentc)),
  1080.                                                                 TAG_END);
  1081.                                                     }
  1082.                                                     if (LoopGadget->Gadget3) {
  1083.                                                         GT_SetGadgetAttrs(LoopGadget->Gadget3,Window,NULL,
  1084.                                                                 GA_Disabled,(MyGadget->Currenty != LoopGadget->Activey) |
  1085.                                                                                   ((LoopGadget->Type == GAD_OFILE) & (!LoopGadget->Currentc)),
  1086.                                                                 TAG_END);
  1087.                                                     }
  1088.                                                 }
  1089.                                             }
  1090.                                             break;
  1091.                                         case GAD_STRING:
  1092.                                             break;
  1093.                                         case GAD_OSTRING:
  1094.                                             switch (Ptr->Number) {
  1095.                                             case 1:
  1096.                                                 MyGadget->Currentc = !MyGadget->Currentc;
  1097.                                                 GT_SetGadgetAttrs(MyGadget->Gadget2,Window,NULL,
  1098.                                                         GA_Disabled,!MyGadget->Currentc,
  1099.                                                         TAG_END);
  1100.                                                 if (MyGadget->Currentc) {
  1101.                                                     ActivateGadget(MyGadget->Gadget2,Window,NULL);
  1102.                                                 }
  1103.                                                 break;
  1104.                                             }
  1105.                                             break;
  1106.                                         case GAD_CHECK:
  1107.                                             MyGadget->Currentc = !MyGadget->Currentc;
  1108.                                             break;
  1109.                                     }
  1110.                                 }
  1111.                                     break;
  1112.                                 default:
  1113.                                     break;
  1114.                                 }
  1115.                                 GT_ReplyIMsg(IntuiMsg);
  1116.                             }
  1117.                         }
  1118.                         CloseWindow(Window);
  1119.                     }
  1120.                 }
  1121.                 FreeGadgets(Context);
  1122.             }
  1123.             FreeVisualInfo(VisInfo);
  1124.         }
  1125.         UnlockPubScreen(NULL,Screen);
  1126.     }
  1127. }
  1128.  
  1129. BOOL
  1130. CreateGadgets(struct MyCommand *MyCommand) {
  1131.     struct MyGadget *MyGadget;
  1132.     struct Gadget *Gadget;
  1133.     struct NewGadget NewGadget = {
  1134.         0,0,
  1135.         0,0,
  1136.         NULL,
  1137.         NULL,
  1138.         PLACETEXT_IN,
  1139.         NULL,
  1140.         NULL
  1141.     };
  1142.     char *string;
  1143.     width = min(Screen->Font->ta_YSize,8);
  1144.     Gadget = Context;
  1145.     height = Screen->WBorTop + Screen->Font->ta_YSize + 1;
  1146.     NewGadget.ng_Height = Screen->Font->ta_YSize + 4;
  1147.     NewGadget.ng_VisualInfo = VisInfo;
  1148.     NewGadget.ng_TextAttr = TextAttr;
  1149.     if (MyCommand) {
  1150.         for (MyGadget = (struct MyGadget *)MyCommand->GList.lh_Head;
  1151.                 MyGadget->GNode.ln_Succ && Gadget;
  1152.                 MyGadget = (struct MyGadget *)MyGadget->GNode.ln_Succ) {
  1153.             height += INTERHEIGHT;
  1154.             NewGadget.ng_TopEdge = height;
  1155.             switch (MyGadget->Type) {
  1156.             case GAD_LFILE:
  1157.             case GAD_SFILE:
  1158.             case GAD_FILE:
  1159.                 if (MyGadget->Type == GAD_FILE) {
  1160.                     string = MyGadget->Defaults;
  1161.                 }
  1162.                 else {
  1163.                     if (MyGadget->Type == GAD_LFILE) {
  1164.                         if (MyCommand->OwnType != &Load) {
  1165.                             if (File1) {
  1166.                                 string = "T:PBM_GUI_1";
  1167.                             }
  1168.                             else {
  1169.                                 string = "T:PBM_GUI_2";
  1170.                             }
  1171.                             if (MyCommand->OwnType == &Process) {
  1172.                                 File1 = !File1;
  1173.                             }
  1174.                         }
  1175.                         else {
  1176.                             string = "";
  1177.                         }
  1178.                     }
  1179.                     else {
  1180.                         if (MyCommand->OwnType != &Save) {
  1181.                             if (File1) {
  1182.                                 string = "T:PBM_GUI_1";
  1183.                             }
  1184.                             else {
  1185.                                 string = "T:PBM_GUI_2";
  1186.                             }
  1187.                         }
  1188.                         else {
  1189.                             string = "";
  1190.                         }
  1191.                     }
  1192.                 }
  1193.                 MyGadget->Ptr1.MyGadget = MyGadget;
  1194.                 MyGadget->Ptr1.Number = 1;
  1195.                 NewGadget.ng_UserData = &(MyGadget->Ptr1);
  1196.                 NewGadget.ng_LeftEdge = Screen->WBorLeft + INTERWIDTH + width*LEFT;
  1197.                 NewGadget.ng_Width = width*RIGHT - INTERWIDTH - 26;
  1198.                 NewGadget.ng_GadgetText = MyGadget->Title;
  1199.                 MyGadget->Gadget1 = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  1200.                                             GTST_String, string,
  1201.                                             GTST_MaxChars, 128,
  1202.                                             GA_Disabled, MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE,
  1203.                                             TAG_END);
  1204.                 NewGadget.ng_LeftEdge += NewGadget.ng_Width + INTERWIDTH;
  1205.                 MyGadget->Ptr2.MyGadget = MyGadget;
  1206.                 MyGadget->Ptr2.Number = 2;
  1207.                 NewGadget.ng_UserData = &(MyGadget->Ptr2);
  1208.                 NewGadget.ng_Width = 26;
  1209.                 NewGadget.ng_GadgetText = "«";
  1210.                 MyGadget->Gadget2 = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  1211.                                             GA_Disabled, MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE,
  1212.                                             TAG_END);
  1213.                 break;
  1214.             case GAD_OFILE:
  1215.                 MyGadget->Ptr1.MyGadget = MyGadget;
  1216.                 MyGadget->Ptr1.Number = 1;
  1217.                 NewGadget.ng_UserData = &(MyGadget->Ptr1);
  1218.                 NewGadget.ng_LeftEdge = Screen->WBorLeft + INTERWIDTH + width*LEFT;
  1219.                 NewGadget.ng_Width = 26;
  1220.                 NewGadget.ng_GadgetText = MyGadget->Title;
  1221.                 MyGadget->Gadget1 = Gadget = CreateGadget(CHECKBOX_KIND,Gadget,&NewGadget,
  1222.                                             GTCB_Checked, MyGadget->Currentc,
  1223.                                             GA_Disabled, MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE,
  1224.                                             TAG_END);
  1225.                 MyGadget->Ptr2.MyGadget = MyGadget;
  1226.                 MyGadget->Ptr2.Number = 2;
  1227.                 NewGadget.ng_UserData = &(MyGadget->Ptr2);
  1228.                 NewGadget.ng_LeftEdge += INTERWIDTH + 26;
  1229.                 NewGadget.ng_Width = width*RIGHT - ((INTERWIDTH + 26) * 2);
  1230.                 NewGadget.ng_GadgetText = NULL;
  1231.                 MyGadget->Gadget2 = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  1232.                                             GTST_String, MyGadget->Defaults,
  1233.                                             GTST_MaxChars, 128,
  1234.                                             GA_Disabled,MyGadget->Currentc ? (MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE) : TRUE,
  1235.                                             TAG_END);
  1236.                 NewGadget.ng_LeftEdge += NewGadget.ng_Width + INTERWIDTH;
  1237.                 MyGadget->Ptr3.MyGadget = MyGadget;
  1238.                 MyGadget->Ptr3.Number = 3;
  1239.                 NewGadget.ng_UserData = &(MyGadget->Ptr3);
  1240.                 NewGadget.ng_Width = 26;
  1241.                 NewGadget.ng_GadgetText = "«";
  1242.                 MyGadget->Gadget3 = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  1243.                                             GA_Disabled,MyGadget->Currentc ? (MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE) : TRUE,
  1244.                                             TAG_END);
  1245.                 break;
  1246.             case GAD_ONUMBER:
  1247.                 MyGadget->Ptr1.MyGadget = MyGadget;
  1248.                 MyGadget->Ptr1.Number = 1;
  1249.                 NewGadget.ng_UserData = &(MyGadget->Ptr1);
  1250.                 NewGadget.ng_LeftEdge = Screen->WBorLeft + INTERWIDTH + width*LEFT;
  1251.                 NewGadget.ng_Width = 26;
  1252.                 NewGadget.ng_GadgetText = MyGadget->Title;
  1253.                 MyGadget->Gadget1 = Gadget = CreateGadget(CHECKBOX_KIND,Gadget,&NewGadget,
  1254.                                             GTCB_Checked, MyGadget->Currentc,
  1255.                                             GA_Disabled, MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE,
  1256.                                             TAG_END);
  1257.                 MyGadget->Ptr2.MyGadget = MyGadget;
  1258.                 MyGadget->Ptr2.Number = 2;
  1259.                 NewGadget.ng_UserData = &(MyGadget->Ptr2);
  1260.                 NewGadget.ng_LeftEdge += INTERWIDTH + 26;
  1261.                 NewGadget.ng_Width = width*RIGHT - 26 - INTERWIDTH;
  1262.                 NewGadget.ng_GadgetText = NULL;
  1263.                 MyGadget->Gadget2 = Gadget = CreateGadget(INTEGER_KIND,Gadget,&NewGadget,
  1264.                                             GTIN_Number, MyGadget->Defaultn,
  1265.                                             GA_Disabled,MyGadget->Currentc ? (MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE) : TRUE,
  1266.                                             TAG_END);
  1267.                 break;
  1268.             case GAD_NUMBER:
  1269.                 MyGadget->Ptr1.MyGadget = MyGadget;
  1270.                 MyGadget->Ptr1.Number = 1;
  1271.                 NewGadget.ng_UserData = &(MyGadget->Ptr1);
  1272.                 NewGadget.ng_LeftEdge = Screen->WBorLeft + INTERWIDTH + width*LEFT;
  1273.                 NewGadget.ng_Width = width*RIGHT;
  1274.                 NewGadget.ng_GadgetText = MyGadget->Title;
  1275.                 MyGadget->Gadget1 = Gadget = CreateGadget(INTEGER_KIND,Gadget,&NewGadget,
  1276.                                             GTIN_Number, MyGadget->Defaultn,
  1277.                                             GA_Disabled, MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE,
  1278.                                             TAG_END);
  1279.                 break;
  1280.             case GAD_CYCLE:
  1281.                 MyGadget->Ptr1.MyGadget = MyGadget;
  1282.                 MyGadget->Ptr1.Number = 1;
  1283.                 NewGadget.ng_UserData = &(MyGadget->Ptr1);
  1284.                 NewGadget.ng_LeftEdge = Screen->WBorLeft + INTERWIDTH + width*LEFT;
  1285.                 NewGadget.ng_Width = width*RIGHT;
  1286.                 NewGadget.ng_GadgetText = MyGadget->Title;
  1287.                 MyGadget->Gadget1 = Gadget = CreateGadget(CYCLE_KIND,Gadget,&NewGadget,
  1288.                                             GTCY_Labels, MyGadget->VStrings,
  1289.                                             GTCY_Active, MyGadget->Currenty,
  1290.                                             TAG_END);
  1291.                 break;
  1292.             case GAD_STRING:
  1293.                 MyGadget->Ptr1.MyGadget = MyGadget;
  1294.                 MyGadget->Ptr1.Number = 1;
  1295.                 NewGadget.ng_UserData = &(MyGadget->Ptr1);
  1296.                 NewGadget.ng_LeftEdge = Screen->WBorLeft + INTERWIDTH + width*LEFT;
  1297.                 NewGadget.ng_Width = width*RIGHT;
  1298.                 NewGadget.ng_GadgetText = MyGadget->Title;
  1299.                 MyGadget->Gadget1 = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  1300.                                             GTST_String, MyGadget->Defaults,
  1301.                                             GA_Disabled, MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE,
  1302.                                             TAG_END);
  1303.                 break;
  1304.             case GAD_OSTRING:
  1305.                 MyGadget->Ptr1.MyGadget = MyGadget;
  1306.                 MyGadget->Ptr1.Number = 1;
  1307.                 NewGadget.ng_UserData = &(MyGadget->Ptr1);
  1308.                 NewGadget.ng_LeftEdge = Screen->WBorLeft + INTERWIDTH + width*LEFT;
  1309.                 NewGadget.ng_Width = 26;
  1310.                 NewGadget.ng_GadgetText = MyGadget->Title;
  1311.                 MyGadget->Gadget1 = Gadget = CreateGadget(CHECKBOX_KIND,Gadget,&NewGadget,
  1312.                                             GTCB_Checked, MyGadget->Currentc,
  1313.                                             GA_Disabled, MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE,
  1314.                                             TAG_END);
  1315.                 MyGadget->Ptr2.MyGadget = MyGadget;
  1316.                 MyGadget->Ptr2.Number = 2;
  1317.                 NewGadget.ng_UserData = &(MyGadget->Ptr2);
  1318.                 NewGadget.ng_LeftEdge += INTERWIDTH + 26;
  1319.                 NewGadget.ng_Width = width*RIGHT - 26 - INTERWIDTH;
  1320.                 NewGadget.ng_GadgetText = NULL;
  1321.                 MyGadget->Gadget2 = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  1322.                                             GTST_String, MyGadget->Defaults,
  1323.                                             GA_Disabled,MyGadget->Currentc ? (MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE) : TRUE,
  1324.                                             TAG_END);
  1325.                 break;
  1326.             case GAD_CHECK:
  1327.                 MyGadget->Ptr1.MyGadget = MyGadget;
  1328.                 MyGadget->Ptr1.Number = 1;
  1329.                 NewGadget.ng_UserData = &(MyGadget->Ptr1);
  1330.                 NewGadget.ng_LeftEdge = Screen->WBorLeft + INTERWIDTH + width*LEFT;
  1331.                 NewGadget.ng_Width = 26;
  1332.                 NewGadget.ng_GadgetText = MyGadget->Title;
  1333.                 MyGadget->Gadget1 = Gadget = CreateGadget(CHECKBOX_KIND,Gadget,&NewGadget,
  1334.                                             GTCB_Checked, MyGadget->Currentc,
  1335.                                             GA_Disabled, MyGadget->OwnCycle ?((MyGadget->OwnCycle->Currenty == MyGadget->Activey) ? FALSE : TRUE ) : FALSE,
  1336.                                             TAG_END);
  1337.                 break;
  1338.             }
  1339.             height += Screen->Font->ta_YSize + 2;
  1340.         }
  1341.         height += INTERHEIGHT;
  1342.         NewGadget.ng_TopEdge = height;
  1343.         NewGadget.ng_UserData = NULL;
  1344.         NewGadget.ng_LeftEdge = Screen->WBorLeft + INTERWIDTH;
  1345.         NewGadget.ng_Width = width * (LEFT+RIGHT);
  1346.         NewGadget.ng_GadgetText = "Perform";
  1347.         Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  1348.                                 TAG_END);
  1349.         height += Screen->Font->ta_YSize + 2;
  1350.     }
  1351.     height += Screen->WBorBottom + INTERHEIGHT;
  1352.     return (BOOL)Gadget;
  1353. }
  1354.  
  1355. /* Shows ASL file requester for a file
  1356.  * name    : current file name
  1357.  * Prompt: Title
  1358.  * flags    : e.g. for save flag
  1359.  * Returns: TRUE if file selected, name is TempFileName
  1360.  */
  1361. BOOL
  1362. GetAFile(UBYTE *name,char *Prompt,ULONG flags) {
  1363.     // Split of directory name
  1364.     strncpy(TempFileName,name,(UBYTE *)PathPart(name) - (UBYTE *)name);
  1365.     TempFileName[(UBYTE *)PathPart(name) - (UBYTE *)name] = 0;
  1366.     // Show requesters
  1367.     InitRequester(&Requestx);
  1368.     SetPointer(Window, BusyPointerData, 16, 16, -6, 0);
  1369.     if (Request(&Requestx,Window)) {
  1370.         if (AslRequestTags((APTR) filereq,
  1371.                                 ASL_Hail,(Tag) Prompt,
  1372.                                 ASL_FuncFlags,flags,
  1373.                                 ASL_Dir, (Tag) TempFileName,
  1374.                                 ASL_File,(Tag) FilePart(name),
  1375.                                 ASL_Window, Window,
  1376.                                 TAG_DONE)) {
  1377.             // rejoin name
  1378.             strncpy(TempFileName,filereq->rf_Dir,256);
  1379.             AddPart(TempFileName,filereq->rf_File,256);
  1380.             ClearPointer(Window);
  1381.             EndRequest(&Requestx,Window);
  1382.             return TRUE;
  1383.         }
  1384.         else {
  1385.             ClearPointer(Window);
  1386.             EndRequest(&Requestx,Window);
  1387.             return FALSE;
  1388.         }
  1389.     }
  1390.     else {
  1391.         return FALSE;
  1392.     }
  1393. }
  1394.