home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 100-199 / ff193.lzh / KeyMapEd / Source / KME_ProcFileReq.c < prev    next >
C/C++ Source or Header  |  1989-03-13  |  10KB  |  321 lines

  1. /*
  2.  * Key Map Editor ver 1.0
  3.  * Process File Requester
  4.  *
  5.  * parameter:     Option - "Load" or "Save" strings to place in gadget
  6.  * returns:     Filename - Filename of file to load or save
  7.  *
  8.  * by: Tim Friest
  9.  * on: January 7, 1989
  10.  */
  11.  
  12. #include "KME_Includes.h"
  13. #include "KME_Protos.h"
  14. #include "KME_Defs.h"
  15. #include "KME_FileReq.h"
  16. #include "KME_Globals.h"
  17.  
  18. extern int InsertFileNode(struct FileNode *);
  19. extern void GetFileList(void);
  20. extern struct FileNode *UpdateFileDisplay(struct FileNode *, int *, int);
  21.  
  22. USHORT    PotIncrement;
  23.  
  24. char *ProcFileReq(Option)
  25. char *Option;
  26. {
  27.     struct FileNode *DisplayFile;
  28.     int    CurrentDisplayFile = 0;
  29.     static SHORT FileReqWindx = FRWLEFTEDGE;
  30.     static SHORT FileReqWindy = FRWTOPEDGE;
  31.     ULONG    FileWind_sf = 0;
  32.     struct IntuiMessage    *Message;
  33.     ULONG    Class;
  34.     USHORT    Code;
  35.     struct Gadget *Gad;
  36.     struct StringInfo *StrInfo;
  37.     char    *filename = NULL;
  38.     int    Done = FALSE;
  39.     ULONG    signal;
  40.     int    Move;
  41.     
  42.     if (!(CheckResource(RF_FileList)))
  43.         GetFileList();
  44.     NewFileReqWindow.LeftEdge = FileReqWindx;
  45.     NewFileReqWindow.TopEdge = FileReqWindy;
  46.     if ((FileReqWindow = OpenWindow(&NewFileReqWindow)) == NULL)
  47.         return(NULL);
  48.     FileWind_sf = (1<<FileReqWindow->UserPort->mp_SigBit);
  49.     if (CheckResource(RF_Font))
  50.         SetFont(FileReqWindow->RPort, TopazFont);
  51.     ContinueGadget.GadgetText->IText = Option;
  52.     if (NameGadgetListLen < FileListLength) {
  53.         SliderGadPInfo.VertBody = MAXBODY / FileListLength * NameGadgetListLen;
  54.         PotIncrement = MAXPOT/(FileListLength-NameGadgetListLen);
  55.     }
  56.     else {
  57.         SliderGadPInfo.VertBody = -1;
  58.         PotIncrement = -1;
  59.     }
  60.     if (!Request(&FileRequester, FileReqWindow))
  61.         Done = TRUE;
  62.     while (!Done) {
  63.         while ((signal = Wait(FileWind_sf|Wind_sf)) == Wind_sf) {
  64.             while ((Message = (struct IntuiMessage *)GetMsg(KeyMapEdWindow->UserPort)) != NULL)
  65.                 ReplyMsg((struct Message *)Message);
  66.             DisplayBeep(FileReqWindow->WScreen);
  67.         } /* while */
  68.         if (signal == Timer_sf) {
  69.             WaitIO((struct IORequest *)Timer);
  70.             ClearFlag(SF_Timer);
  71.         }
  72.         while ((!Done) && ((Message = (struct IntuiMessage *)GetMsg(FileReqWindow->UserPort)) != NULL)) {
  73.             Class = Message->Class;
  74.             Code = Message->Code;
  75.             Gad = (struct Gadget *)Message->IAddress;
  76.             ReplyMsg((struct Message *)Message);
  77.             switch (Class) {
  78.                 case REQSET:
  79.                     DisplayFile = UpdateFileDisplay(FileList, &CurrentDisplayFile, 0);
  80.                     if (!ActivateGadget(&NameStrGadget, FileReqWindow, &FileRequester)) {
  81.                         EndRequest(&FileRequester, FileReqWindow);
  82.                         Done = TRUE;
  83.                     }
  84.                     break;
  85.                 case GADGETDOWN:
  86.                     if (CheckFlag(SF_Timer)) {
  87.                         if (CheckIO((struct IORequest *)Timer))
  88.                             WaitIO((struct IORequest *)Timer);
  89.                         else
  90.                             AbortIO((struct IORequest *)Timer);
  91.                         ClearFlag(SF_Timer);
  92.                     }
  93.                     switch (Gad->GadgetID) {
  94.                         case 0x03: /* slider down gad */
  95.                             do {
  96.                                 DisplayFile = UpdateFileDisplay(DisplayFile, &CurrentDisplayFile, 1);
  97.                                 Timer->tr_node.io_Command = TR_ADDREQUEST;
  98.                                 Timer->tr_time.tv_secs = 0;
  99.                                 Timer->tr_time.tv_micro = 50000;
  100.                                 SendIO((struct IORequest *)Timer);
  101.                                 if ((signal = Wait(FileWind_sf|Timer_sf)) == Timer_sf)
  102.                                     WaitIO((struct IORequest *)Timer);
  103.                             } while ((signal == Timer_sf) && (Gad->Flags & SELECTED));
  104.                             if (signal != Timer_sf)
  105.                                 AbortIO((struct IORequest *)Timer);
  106.                             if ((Message = (struct IntuiMessage *)GetMsg(FileReqWindow->UserPort)) != NULL)
  107.                                 ReplyMsg((struct Message *)Message);
  108.                             break;
  109.                         case 0x04: /* slider up gad */
  110.                             do {
  111.                                 DisplayFile = UpdateFileDisplay(DisplayFile, &CurrentDisplayFile, -1);
  112.                                 Timer->tr_node.io_Command = TR_ADDREQUEST;
  113.                                 Timer->tr_time.tv_secs = 0;
  114.                                 Timer->tr_time.tv_micro = 50000;
  115.                                 SendIO((struct IORequest *)Timer);
  116.                                 if ((signal = Wait(FileWind_sf|Timer_sf)) == Timer_sf)
  117.                                     WaitIO((struct IORequest *)Timer);
  118.                             } while ((signal == Timer_sf) && (Gad->Flags & SELECTED));
  119.                             if (signal != Timer_sf)
  120.                                 AbortIO((struct IORequest *)Timer);
  121.                             if ((Message = (struct IntuiMessage *)GetMsg(FileReqWindow->UserPort)) != NULL)
  122.                                 ReplyMsg((struct Message *)Message);
  123.                     } /* switch */
  124.                     break;
  125.                 case GADGETUP:
  126.                     switch (Gad->GadgetID) {
  127.                         case 0x00: /* Abort Gadget Selected */
  128.                             EndRequest(&FileRequester, FileReqWindow);
  129.                             filename = NULL;
  130.                             Done = TRUE;
  131.                             break;
  132.                         case 0x01: /* Continue Gadget Selected */ 
  133.                         case 0x05: /* String Gadget Selected */
  134.                             EndRequest(&FileRequester, FileReqWindow);
  135.                             StrInfo = (struct StringInfo *)NameStrGadget.SpecialInfo;
  136.                             filename = StrInfo->Buffer;
  137.                             Done = TRUE;
  138.                             break;
  139.                         case 0x02: /* Slider Gadget Selected */
  140.                             Move = (SliderGadPInfo.VertPot/PotIncrement) - CurrentDisplayFile;
  141.                             if (Move != 0)
  142.                                 DisplayFile = UpdateFileDisplay(DisplayFile, &CurrentDisplayFile, Move);
  143.                             break;
  144.                         case 0x10: /* Name GadgetID-$10 Selected */
  145.                         case 0x11:
  146.                         case 0x12:
  147.                         case 0x13:
  148.                         case 0x14:
  149.                         case 0x15:
  150.                         case 0x16:
  151.                             if (CheckFlag(SF_Timer)) {
  152.                                 if (CheckIO((struct IORequest *)Timer)) {
  153.                                     WaitIO((struct IORequest *)Timer);
  154.                                     ClearFlag(SF_Timer);
  155.                                 }
  156.                                 else {
  157.                                     AbortIO((struct IORequest *)Timer);
  158.                                     ClearFlag(SF_Timer);
  159.                                     if (strcmp(filename, Gad->GadgetText->IText) == 0) {
  160.                                         EndRequest(&FileRequester, FileReqWindow);
  161.                                         Done = TRUE;
  162.                                         break;
  163.                                     }
  164.                                 }
  165.                             }
  166.                             strcpy(FileNameBuff, Gad->GadgetText->IText);
  167.                             filename = FileNameBuff;
  168.                             NameStrGadSInfo.BufferPos = strlen(filename);
  169.                             RefreshGList(&NameStrGadget, FileReqWindow, &FileRequester, 1);
  170.                             if (!ActivateGadget(&NameStrGadget, FileReqWindow, &FileRequester)) {
  171.                                 EndRequest(&FileRequester, FileReqWindow);
  172.                                 Done = TRUE;
  173.                             }
  174.                             Timer->tr_node.io_Command = TR_ADDREQUEST;
  175.                             Timer->tr_time.tv_secs = 0;
  176.                             Timer->tr_time.tv_micro = 250000;
  177.                             SendIO((struct IORequest *)Timer);
  178.                             SetFlag(SF_Timer);
  179.                     } /* switch */
  180.             } /* switch */
  181.         } /* while */
  182.     } /* while */
  183.     FileReqWindx = FileReqWindow->LeftEdge;
  184.     FileReqWindy = FileReqWindow->TopEdge;
  185.     CloseWindow(FileReqWindow);
  186.     if (CheckFlag(SF_Timer)) {
  187.         if (CheckIO((struct IORequest *)Timer))
  188.             WaitIO((struct IORequest *)Timer);
  189.         else
  190.             AbortIO((struct IORequest *)Timer);
  191.         ClearFlag(SF_Timer);
  192.     }
  193.     if (stricmp(Option, "Save") == 0) {
  194.         int len;
  195.         struct FileNode *temp;
  196.  
  197.         len = strlen(filename)+1;
  198.         if ((temp = (struct FileNode *)AllocMem(sizeof(struct FileNode), 0)) != 0)
  199.             if ((temp->FileName = (char *)AllocMem(len, MEMF_CLEAR)) != NULL) {
  200.                 strcpy(temp->FileName, filename);
  201.                 if (!InsertFileNode(temp)) {
  202.                     FreeMem(temp->FileName, len);
  203.                     FreeMem(temp, sizeof(struct FileNode));
  204.                 }
  205.             }
  206.             else
  207.                 FreeMem(temp, sizeof(struct FileNode));
  208.     }
  209.     return(filename);
  210. }
  211.  
  212. /*
  213.  * Insert File Node
  214.  */
  215. int InsertFileNode(Node)
  216. struct FileNode *Node;
  217. {
  218.     struct FileNode *temp, *prev = NULL;
  219.     int result = 1;
  220.  
  221.     temp = FileList;
  222.     while ((temp != NULL) && ((result = stricmp(Node->FileName, temp->FileName)) > 0)) {
  223.         prev = temp;
  224.         temp = temp->NextFile;
  225.     } /* while */
  226.     if (result != 0) {
  227.         Node->NextFile = temp;
  228.         if (temp != NULL)
  229.             temp->PrevFile = Node;
  230.         Node->PrevFile = prev;
  231.         if (prev != NULL)
  232.             prev->NextFile = Node;
  233.         else
  234.             FileList = Node;
  235.         FileListLength += 1;
  236.     }
  237.     return(result);
  238. }
  239.  
  240. /*
  241.  * Get File List
  242.  */
  243. void GetFileList()
  244. {
  245.     struct FileInfoBlock *FileInfo;
  246.     struct FileNode *temp;
  247.     int len;
  248.  
  249.     if ((FileInfo = (struct FileInfoBlock *)AllocMem(sizeof(struct FileInfoBlock), MEMF_CLEAR)) != NULL) {
  250.         if (Examine(DirLock, FileInfo)) {
  251.             temp = (struct FileNode *)AllocMem(sizeof(struct FileNode), 0);
  252.             while ((temp != NULL) && (ExNext(DirLock, FileInfo))) {
  253.                 len = strlen(FileInfo->fib_FileName)+1;
  254.                 if ((temp->FileName = (char *)AllocMem(len, MEMF_CLEAR)) != NULL) {
  255.                     strcpy(temp->FileName, FileInfo->fib_FileName);
  256.                     if (InsertFileNode(temp))
  257.                         temp = (struct FileNode *)AllocMem(sizeof(struct FileNode), 0);
  258.                     else
  259.                         FreeMem(temp->FileName, sizeof(temp->FileName)+1);
  260.                 }
  261.                 else {
  262.                     FreeMem(temp, sizeof(struct FileNode));
  263.                     temp = NULL;
  264.                 }
  265.             } /* while */
  266.         }
  267.         if (temp != NULL)
  268.             FreeMem(temp, sizeof(struct FileNode));
  269.         FreeMem(FileInfo, sizeof(struct FileInfoBlock));
  270.         if (FileList != NULL)
  271.             FlagResource(RF_FileList);
  272.     }
  273. }
  274.  
  275. /*
  276.  * Update File Display
  277.  */
  278. struct FileNode *UpdateFileDisplay(DisplayFile, CurrentDisplayFile, Move)
  279. struct FileNode *DisplayFile;
  280. int *CurrentDisplayFile;
  281. int Move;
  282. {
  283.     struct FileNode *temp;
  284.     struct Gadget *Gad;
  285.  
  286.     temp = DisplayFile;
  287.     if (Move > 0) {
  288.         *CurrentDisplayFile += Move;
  289.         for (;((temp->NextFile != NULL) && (Move > 0)); Move--)
  290.             temp = temp->NextFile;
  291.         *CurrentDisplayFile -= Move;
  292.         DisplayFile = temp;
  293.         for (Move = 1; ((temp->NextFile != NULL) && (Move < NameGadgetListLen)); Move++)
  294.             temp = temp->NextFile;
  295.         Move = Move - NameGadgetListLen;
  296.         temp = DisplayFile;
  297.     }
  298.     if (Move < 0) {
  299.         *CurrentDisplayFile += Move;
  300.         for (;((temp->PrevFile != NULL) && (Move < 0)); Move++)
  301.             temp = temp->PrevFile;
  302.         *CurrentDisplayFile -= Move;
  303.         DisplayFile = temp;
  304.     }
  305.     Gad = NameGadgetList;
  306.     while (Gad != NULL) {
  307.         if (temp != NULL) {
  308.             Gad->GadgetText->IText = temp->FileName;
  309.             temp = temp->NextFile;
  310.         }
  311.         else
  312.             Gad->GadgetText->IText = NULL;
  313.         Gad = Gad->NextGadget;
  314.     } /* while */
  315.     ModifyProp(&SliderGadget, FileReqWindow, &FileRequester, SliderGadPInfo.Flags,
  316.         SliderGadPInfo.HorizPot, (PotIncrement * (*CurrentDisplayFile)),
  317.         SliderGadPInfo.HorizBody, SliderGadPInfo.VertBody);
  318.     RefreshGList(NameGadgetList, FileReqWindow, &FileRequester, NameGadgetListLen);
  319.     return(DisplayFile);
  320. }
  321.