crunch@well.UUCP (John Draper) (12/03/86)
/*======================================================================= filemenu.c - contains the FILE menu functions ========================================================================*/ /* The usual header files to be inserted later */ #include <intuition/intuition.h> #include <libraries/dosextens.h> #include <graphics/gfxbase.h> #include <graphics/gfx.h> #include <graphics/display.h> #include <exec/memory.h> #include <workbench/workbench.h> #include <workbench/startup.h> #include <devices/narrator.h> #include <devices/audio.h> #include <libraries/translator.h> #include <stdio.h> #include "gad.h" /* constants */ /* external functions */ extern struct Gadget *grabGad(); /* Gadio.c */ extern void dumpgad(); extern UBYTE *getrname(); extern void disp_render(); extern struct StringInfo *nam_info(); extern long Open(); /* Using 16 bit ints */ /* external vars */ extern UBYTE *gadnames[]; extern struct Gadget *gads[]; extern int nextgad; extern int curgad; extern struct Gadget testgad; extern UBYTE sbuf_1[]; /* Brent's stuff */ extern int link; extern struct Window *w; extern int nextlink; UBYTE gadfile[NAM_SIZ]; /* Brent's stuff */ extern BOOL updated, saved; /* Brent's stuff */ extern UBYTE names [MAX_NUM_GADGETS] [NAM_SIZ]; /* local vars */ /*---------- save as source ----------*/ dumpgadgets() { /* Starting from the LAST gadget in the window's gadget list, each of the Intuitext structures are displayed "FIRST", then the "Specialinfo" structures, the "Borders", and finally the structure. First, a file is opened, and the text is "fprintf'ed" into the file. Change history: 11-17-86 RRL cleaned up this and pgad.c so it would work with all gadget types and with intuitext. Also added name parameters to all disp_ functions - Intuitext is now output as part of disp_renders. */ int i; int strnum = 1; /* idents the string gadgets from each other */ int propnum = 1; /* idents proportional gads from each other */ int rendnum = 1; /* identifier for borders */ static UBYTE fnam[NAM_SIZ]; /* Filename size */ struct StringInfo *si; struct PropInfo *pi; FILE *fopen(), *txt; /* $$$ File descriptor */ /* Open up requester and get gadgets source file name */ get_req_name("Save source file named as:", fnam); /* Open up the file for write access in current directory */ txt = fopen(fnam, "w"); /* First print out a header to the file, containing all the normal */ /* includes, defines for all gadget IDs, and other 'standard' */ /* structures, such as text attributes to be used in intuitext. */ /* this and other disp_ routines are in pgad.c $$$NEW 11/16/86 RRL */ disp_Header(txt); for (i=nextgad-1; i>=0; i--) switch(gads[i]->GadgetType) { case BOOLGADGET: disp_render(txt, gads[i], rendnum, i); disp_gadget(txt, gads[i], BORD, rendnum, 0, gadnames[i], i); rendnum++; break; case STRGADGET: si = (struct StringInfo *)gads[i]->SpecialInfo; disp_render(txt, gads[i], rendnum, i); dispstring(txt, si, strnum, (SHORT)BUFSIZE,gadnames[i]); disp_gadget(txt, gads[i], BORD, rendnum, strnum, gadnames[i],i) ; strnum++; rendnum++; break; case PROPGADGET: pi = (struct PropInfo *)gads[i]->SpecialInfo; disp_render(txt, gads[i], propnum, i); disp_props(txt, pi, propnum, gadnames[i]); disp_gadget(txt, gads[i], 0, 0, propnum, gadnames[i],i); propnum++; break; } fclose(txt); } /*-------- Get a file containing gadgets --------*/ getgad() /* Gets a filename, stores it in the variable 'gadfile'. Opens the file and reads the gadgets into the gads[] array while putting their names in the gadnames[] array. Clears the 'updated' flag, sets the 'saved' flag. WHAT'S NOT DONE YET: After the gadgets have been read in, they are displayed after they are linked to the window. */ { UBYTE tempname[NAM_SIZ], *gadname; long gadfd; int i; int numgad; /* Number of gadgets to read in */ struct Gadget *newgad; struct StringInfo *si; /* StringInfo structure */ UBYTE *str; /* pointer to req buffer string */ /* Get file name. Not a scrolling requester, but maybe soon... */ si = nam_info(); /* Not supposed to access directly */ if (gadfile[0] != '\0') { strcpy(si->Buffer, gadfile); /* Copy string to req buffer */ si->BufferPos = strlen(si->Buffer) + 1; } else { *si->Buffer = '\0'; si->BufferPos = 0; } if ((str = getrname("Gadget file name")) == (UBYTE *) NULL) return(0); strcpy(gadfile, str); /* Try to open the existing file... */ if ((gadfd = Open(gadfile, MODE_OLDFILE)) == NULL) { kprintf("Can't open file %s",gadfile); return(0); } /* Initialize "nextgad" */ nextgad = curgad = NULL; link = FALSE; /* Get the number of gadgets to read */ Read(gadfd, &numgad, (long)sizeof(numgad)); for (i=0; i<numgad; i++) { /* Get the Gadget name */ Read(gadfd, names[i], (long)NAM_SIZ); /* Now get the gadget... */ newgad = grabGad(gadfd, i); curgad = nextgad++; gads[i] = newgad; /* Copy Gadget structure pointer */ AddGadget(w, gads[i], -1L); /* Add it to window */ nextlink++; link = TRUE; /* OK to refresh gadgets */ /* Save the gadget name, too! */ gadnames[i] = names[i]; } /* Don't forget to close the file. */ Close(gadfd); /* Clear 'updated' flag and set 'saved' flag. */ updated = FALSE; saved = TRUE; /* Now refresh the Gadgets */ if (link) RefreshGadgets(gads[0], w, NULL); } /*--------- Save a file containing gadgets --------*/ savegad() { /* Checks 'updated' and 'saved' flags, if necessary, the program should save the gadget info out to the file. Prior to saving each gadget structure to disk, writes the gadget's name. */ long gadfd; UBYTE *str; struct StringInfo *si; int i; /* Get "StringInfo" pointer for Name requestor */ si = nam_info(); /* Get file name. Not a scrolling requester, but maybe soon... */ if (gadfile[0] != '\0') { strcpy(si->Buffer, gadfile); si->BufferPos = strlen(si->Buffer) + 1; /* Posn cur at end */ } else { *si->Buffer = '\0'; si->BufferPos = 0; } if ((str = getrname("Gadget file name")) == NULL) return(0); strcpy(gadfile, str); /* Try to open the existing file... */ if ((gadfd = Open(gadfile, MODE_OLDFILE)) == 0L) /* No go... try to open a new file... */ if ((gadfd = Open(gadfile, MODE_NEWFILE)) == 0L) { kprintf("Can't open the file: '%s'. -- ", gadfile); return(0); } /* Write out the number of gadgets to read, curgad is num of gadgets */ Write(gadfd, &nextgad, (long)sizeof(nextgad)); for (i = 0; i < nextgad; i++) { /* ### Write the gadget name. */ Write(gadfd, gadnames[i], (long)NAM_SIZ); /* Now save the gadget... */ dumpGad(gads[i], gadfd, i); } /* Close file. */ Close(gadfd); /* Clear 'updated' flag and set 'saved' flag. */ updated = FALSE; saved = TRUE; }