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 >
Wrap
C/C++ Source or Header
|
1989-03-13
|
10KB
|
321 lines
/*
* Key Map Editor ver 1.0
* Process File Requester
*
* parameter: Option - "Load" or "Save" strings to place in gadget
* returns: Filename - Filename of file to load or save
*
* by: Tim Friest
* on: January 7, 1989
*/
#include "KME_Includes.h"
#include "KME_Protos.h"
#include "KME_Defs.h"
#include "KME_FileReq.h"
#include "KME_Globals.h"
extern int InsertFileNode(struct FileNode *);
extern void GetFileList(void);
extern struct FileNode *UpdateFileDisplay(struct FileNode *, int *, int);
USHORT PotIncrement;
char *ProcFileReq(Option)
char *Option;
{
struct FileNode *DisplayFile;
int CurrentDisplayFile = 0;
static SHORT FileReqWindx = FRWLEFTEDGE;
static SHORT FileReqWindy = FRWTOPEDGE;
ULONG FileWind_sf = 0;
struct IntuiMessage *Message;
ULONG Class;
USHORT Code;
struct Gadget *Gad;
struct StringInfo *StrInfo;
char *filename = NULL;
int Done = FALSE;
ULONG signal;
int Move;
if (!(CheckResource(RF_FileList)))
GetFileList();
NewFileReqWindow.LeftEdge = FileReqWindx;
NewFileReqWindow.TopEdge = FileReqWindy;
if ((FileReqWindow = OpenWindow(&NewFileReqWindow)) == NULL)
return(NULL);
FileWind_sf = (1<<FileReqWindow->UserPort->mp_SigBit);
if (CheckResource(RF_Font))
SetFont(FileReqWindow->RPort, TopazFont);
ContinueGadget.GadgetText->IText = Option;
if (NameGadgetListLen < FileListLength) {
SliderGadPInfo.VertBody = MAXBODY / FileListLength * NameGadgetListLen;
PotIncrement = MAXPOT/(FileListLength-NameGadgetListLen);
}
else {
SliderGadPInfo.VertBody = -1;
PotIncrement = -1;
}
if (!Request(&FileRequester, FileReqWindow))
Done = TRUE;
while (!Done) {
while ((signal = Wait(FileWind_sf|Wind_sf)) == Wind_sf) {
while ((Message = (struct IntuiMessage *)GetMsg(KeyMapEdWindow->UserPort)) != NULL)
ReplyMsg((struct Message *)Message);
DisplayBeep(FileReqWindow->WScreen);
} /* while */
if (signal == Timer_sf) {
WaitIO((struct IORequest *)Timer);
ClearFlag(SF_Timer);
}
while ((!Done) && ((Message = (struct IntuiMessage *)GetMsg(FileReqWindow->UserPort)) != NULL)) {
Class = Message->Class;
Code = Message->Code;
Gad = (struct Gadget *)Message->IAddress;
ReplyMsg((struct Message *)Message);
switch (Class) {
case REQSET:
DisplayFile = UpdateFileDisplay(FileList, &CurrentDisplayFile, 0);
if (!ActivateGadget(&NameStrGadget, FileReqWindow, &FileRequester)) {
EndRequest(&FileRequester, FileReqWindow);
Done = TRUE;
}
break;
case GADGETDOWN:
if (CheckFlag(SF_Timer)) {
if (CheckIO((struct IORequest *)Timer))
WaitIO((struct IORequest *)Timer);
else
AbortIO((struct IORequest *)Timer);
ClearFlag(SF_Timer);
}
switch (Gad->GadgetID) {
case 0x03: /* slider down gad */
do {
DisplayFile = UpdateFileDisplay(DisplayFile, &CurrentDisplayFile, 1);
Timer->tr_node.io_Command = TR_ADDREQUEST;
Timer->tr_time.tv_secs = 0;
Timer->tr_time.tv_micro = 50000;
SendIO((struct IORequest *)Timer);
if ((signal = Wait(FileWind_sf|Timer_sf)) == Timer_sf)
WaitIO((struct IORequest *)Timer);
} while ((signal == Timer_sf) && (Gad->Flags & SELECTED));
if (signal != Timer_sf)
AbortIO((struct IORequest *)Timer);
if ((Message = (struct IntuiMessage *)GetMsg(FileReqWindow->UserPort)) != NULL)
ReplyMsg((struct Message *)Message);
break;
case 0x04: /* slider up gad */
do {
DisplayFile = UpdateFileDisplay(DisplayFile, &CurrentDisplayFile, -1);
Timer->tr_node.io_Command = TR_ADDREQUEST;
Timer->tr_time.tv_secs = 0;
Timer->tr_time.tv_micro = 50000;
SendIO((struct IORequest *)Timer);
if ((signal = Wait(FileWind_sf|Timer_sf)) == Timer_sf)
WaitIO((struct IORequest *)Timer);
} while ((signal == Timer_sf) && (Gad->Flags & SELECTED));
if (signal != Timer_sf)
AbortIO((struct IORequest *)Timer);
if ((Message = (struct IntuiMessage *)GetMsg(FileReqWindow->UserPort)) != NULL)
ReplyMsg((struct Message *)Message);
} /* switch */
break;
case GADGETUP:
switch (Gad->GadgetID) {
case 0x00: /* Abort Gadget Selected */
EndRequest(&FileRequester, FileReqWindow);
filename = NULL;
Done = TRUE;
break;
case 0x01: /* Continue Gadget Selected */
case 0x05: /* String Gadget Selected */
EndRequest(&FileRequester, FileReqWindow);
StrInfo = (struct StringInfo *)NameStrGadget.SpecialInfo;
filename = StrInfo->Buffer;
Done = TRUE;
break;
case 0x02: /* Slider Gadget Selected */
Move = (SliderGadPInfo.VertPot/PotIncrement) - CurrentDisplayFile;
if (Move != 0)
DisplayFile = UpdateFileDisplay(DisplayFile, &CurrentDisplayFile, Move);
break;
case 0x10: /* Name GadgetID-$10 Selected */
case 0x11:
case 0x12:
case 0x13:
case 0x14:
case 0x15:
case 0x16:
if (CheckFlag(SF_Timer)) {
if (CheckIO((struct IORequest *)Timer)) {
WaitIO((struct IORequest *)Timer);
ClearFlag(SF_Timer);
}
else {
AbortIO((struct IORequest *)Timer);
ClearFlag(SF_Timer);
if (strcmp(filename, Gad->GadgetText->IText) == 0) {
EndRequest(&FileRequester, FileReqWindow);
Done = TRUE;
break;
}
}
}
strcpy(FileNameBuff, Gad->GadgetText->IText);
filename = FileNameBuff;
NameStrGadSInfo.BufferPos = strlen(filename);
RefreshGList(&NameStrGadget, FileReqWindow, &FileRequester, 1);
if (!ActivateGadget(&NameStrGadget, FileReqWindow, &FileRequester)) {
EndRequest(&FileRequester, FileReqWindow);
Done = TRUE;
}
Timer->tr_node.io_Command = TR_ADDREQUEST;
Timer->tr_time.tv_secs = 0;
Timer->tr_time.tv_micro = 250000;
SendIO((struct IORequest *)Timer);
SetFlag(SF_Timer);
} /* switch */
} /* switch */
} /* while */
} /* while */
FileReqWindx = FileReqWindow->LeftEdge;
FileReqWindy = FileReqWindow->TopEdge;
CloseWindow(FileReqWindow);
if (CheckFlag(SF_Timer)) {
if (CheckIO((struct IORequest *)Timer))
WaitIO((struct IORequest *)Timer);
else
AbortIO((struct IORequest *)Timer);
ClearFlag(SF_Timer);
}
if (stricmp(Option, "Save") == 0) {
int len;
struct FileNode *temp;
len = strlen(filename)+1;
if ((temp = (struct FileNode *)AllocMem(sizeof(struct FileNode), 0)) != 0)
if ((temp->FileName = (char *)AllocMem(len, MEMF_CLEAR)) != NULL) {
strcpy(temp->FileName, filename);
if (!InsertFileNode(temp)) {
FreeMem(temp->FileName, len);
FreeMem(temp, sizeof(struct FileNode));
}
}
else
FreeMem(temp, sizeof(struct FileNode));
}
return(filename);
}
/*
* Insert File Node
*/
int InsertFileNode(Node)
struct FileNode *Node;
{
struct FileNode *temp, *prev = NULL;
int result = 1;
temp = FileList;
while ((temp != NULL) && ((result = stricmp(Node->FileName, temp->FileName)) > 0)) {
prev = temp;
temp = temp->NextFile;
} /* while */
if (result != 0) {
Node->NextFile = temp;
if (temp != NULL)
temp->PrevFile = Node;
Node->PrevFile = prev;
if (prev != NULL)
prev->NextFile = Node;
else
FileList = Node;
FileListLength += 1;
}
return(result);
}
/*
* Get File List
*/
void GetFileList()
{
struct FileInfoBlock *FileInfo;
struct FileNode *temp;
int len;
if ((FileInfo = (struct FileInfoBlock *)AllocMem(sizeof(struct FileInfoBlock), MEMF_CLEAR)) != NULL) {
if (Examine(DirLock, FileInfo)) {
temp = (struct FileNode *)AllocMem(sizeof(struct FileNode), 0);
while ((temp != NULL) && (ExNext(DirLock, FileInfo))) {
len = strlen(FileInfo->fib_FileName)+1;
if ((temp->FileName = (char *)AllocMem(len, MEMF_CLEAR)) != NULL) {
strcpy(temp->FileName, FileInfo->fib_FileName);
if (InsertFileNode(temp))
temp = (struct FileNode *)AllocMem(sizeof(struct FileNode), 0);
else
FreeMem(temp->FileName, sizeof(temp->FileName)+1);
}
else {
FreeMem(temp, sizeof(struct FileNode));
temp = NULL;
}
} /* while */
}
if (temp != NULL)
FreeMem(temp, sizeof(struct FileNode));
FreeMem(FileInfo, sizeof(struct FileInfoBlock));
if (FileList != NULL)
FlagResource(RF_FileList);
}
}
/*
* Update File Display
*/
struct FileNode *UpdateFileDisplay(DisplayFile, CurrentDisplayFile, Move)
struct FileNode *DisplayFile;
int *CurrentDisplayFile;
int Move;
{
struct FileNode *temp;
struct Gadget *Gad;
temp = DisplayFile;
if (Move > 0) {
*CurrentDisplayFile += Move;
for (;((temp->NextFile != NULL) && (Move > 0)); Move--)
temp = temp->NextFile;
*CurrentDisplayFile -= Move;
DisplayFile = temp;
for (Move = 1; ((temp->NextFile != NULL) && (Move < NameGadgetListLen)); Move++)
temp = temp->NextFile;
Move = Move - NameGadgetListLen;
temp = DisplayFile;
}
if (Move < 0) {
*CurrentDisplayFile += Move;
for (;((temp->PrevFile != NULL) && (Move < 0)); Move++)
temp = temp->PrevFile;
*CurrentDisplayFile -= Move;
DisplayFile = temp;
}
Gad = NameGadgetList;
while (Gad != NULL) {
if (temp != NULL) {
Gad->GadgetText->IText = temp->FileName;
temp = temp->NextFile;
}
else
Gad->GadgetText->IText = NULL;
Gad = Gad->NextGadget;
} /* while */
ModifyProp(&SliderGadget, FileReqWindow, &FileRequester, SliderGadPInfo.Flags,
SliderGadPInfo.HorizPot, (PotIncrement * (*CurrentDisplayFile)),
SliderGadPInfo.HorizBody, SliderGadPInfo.VertBody);
RefreshGList(NameGadgetList, FileReqWindow, &FileRequester, NameGadgetListLen);
return(DisplayFile);
}