#include "DFC5.h" char df0[] = "df0:" ; /* use only one copy of this name */ char df1[] = "df1:" ; /* ditto */ char df2[] = "df2:" ; /* ditto */ char df3[] = "df3:" ; /* ditto */ char *df[]={df0, df1, df2, df3}; /* for easy access to drive names */ /* * Always use topaz 80, and let's define an intuition buffer for our * general string writing stuff. */ struct TextAttr Topaz8 = {(STRPTR)"topaz.font", TOPAZ_EIGHTY, 0, 0 }; struct IntuiText IntuiText = {1, 0, JAM2, 0, 0, &Topaz8} ; /* * This is to ``get that look''... */ SHORT XY1[6]={ 0,11,0,0,63,0 }; SHORT XY2[6]={ 1,11,63,11,63,0 }; /* * The copy progress bar 3D border. */ SHORT BXY1[6]={ 0,9,321,9,321,0 }; SHORT BXY2[6]={ 0,8,0,0,320,0 }; /* * The first two items are the gadget border, the other two ones the progress * bar border. */ struct Border Border[] = { { 0,0,2,0,JAM1,3,XY1,&Border[1] }, { 0,0,1,0,JAM1,3,XY2,NULL }, { 0,0,2,0,JAM1,3,BXY1,&Border[3] }, { 0,0,1,0,JAM1,3,BXY2,NULL } }; /* * ITexts for gadgets. */ struct IntuiText IText[18] = { { 1,0,JAM1, 17,2, &Topaz8, df0, NULL }, { 1,0,JAM1, 17,2, &Topaz8, df1, NULL }, { 1,0,JAM1, 17,2, &Topaz8, df2, NULL }, { 1,0,JAM1, 17,2, &Topaz8, df3, NULL }, { 1,0,JAM1, 17,2, &Topaz8, df0, NULL }, { 1,0,JAM1, 17,2, &Topaz8, df1, NULL }, { 1,0,JAM1, 17,2, &Topaz8, df2, NULL }, { 1,0,JAM1, 17,2, &Topaz8, df3, NULL }, { 1,0,JAM1, 8,2, &Topaz8, "Verify", NULL }, { 1,0,JAM1, 8,2, &Topaz8, "Buffer", NULL }, { 1,0,JAM1, 16,2, &Topaz8, "Talk", NULL }, { 1,0,JAM1, 20,2, &Topaz8, "FFS", NULL }, { 1,0,JAM1, 16,2, &Topaz8, "Date", NULL }, { 1,0,JAM1, 16,2, &Topaz8, "Stop", NULL }, { 1,0,JAM1, 24,2, &Topaz8, "Go", NULL }, { 1,0,JAM1, 8,2, &Topaz8, "Repeat", NULL }, { 1,0,JAM1, 8,2, &Topaz8, "Format", NULL }, { 1,0,JAM1, 16,2, &Topaz8, "Auto", NULL } }; /* * The gadgets. */ struct Gadget Gadget[18] = { { &Gadget[1], 80,20, 64,12, GADGHCOMP, GADGIMMEDIATE | TOGGLESELECT, BOOLGADGET, (APTR)&Border[0], NULL, &IText[0], NULL, NULL, '0', NULL }, { &Gadget[2], 148,20, 64,12, GADGHCOMP, GADGIMMEDIATE | TOGGLESELECT, BOOLGADGET, (APTR)&Border[0], NULL, &IText[1], NULL, NULL, '1', NULL }, { &Gadget[3], 216,20, 64,12, GADGHCOMP, GADGIMMEDIATE | TOGGLESELECT, BOOLGADGET, (APTR)&Border[0], NULL, &IText[2], NULL, NULL, '2', NULL }, { &Gadget[4], 284,20, 64,12, GADGHCOMP, GADGIMMEDIATE | TOGGLESELECT, BOOLGADGET, (APTR)&Border[0], NULL, &IText[3], NULL, NULL, '3', NULL }, { &Gadget[5], 80,50, 64,12, GADGHCOMP, GADGIMMEDIATE | TOGGLESELECT, BOOLGADGET, (APTR)&Border[0], NULL, &IText[4], NULL, NULL, '4', NULL }, { &Gadget[6], 148,50, 64,12, GADGHCOMP, GADGIMMEDIATE | TOGGLESELECT, BOOLGADGET, (APTR)&Border[0], NULL, &IText[5], NULL, NULL, '5', NULL }, { &Gadget[7], 216,50, 64,12, GADGHCOMP, GADGIMMEDIATE | TOGGLESELECT, BOOLGADGET, (APTR)&Border[0], NULL, &IText[6], NULL, NULL, '6', NULL }, { &Gadget[8], 284,50, 64,12, GADGHCOMP, GADGIMMEDIATE | TOGGLESELECT, BOOLGADGET, (APTR)&Border[0], NULL, &IText[7], NULL, NULL, '7', NULL }, { &Gadget[9], 12,65, 64,12, GADGHCOMP| SELECTED, GADGIMMEDIATE | TOGGLESELECT, BOOLGADGET, (APTR)&Border[0], NULL, &IText[8], NULL, NULL, 'V', NULL }, { &Gadget[10], 80,65, 64,12, GADGHCOMP, GADGIMMEDIATE | TOGGLESELECT, BOOLGADGET, (APTR)&Border[0], NULL, &IText[9], NULL, NULL, 'B', NULL }, { &Gadget[11], 148,65, 64,12, GADGHCOMP, GADGIMMEDIATE | TOGGLESELECT, BOOLGADGET, (APTR)&Border[0], NULL, &IText[10], NULL, NULL, 'T', NULL }, { &Gadget[12], 216,65, 64,12, GADGHCOMP, GADGIMMEDIATE | TOGGLESELECT, BOOLGADGET, (APTR)&Border[0], NULL, &IText[11], NULL, NULL, 'N', NULL }, { &Gadget[13], 284,65, 64,12, GADGHCOMP| SELECTED, GADGIMMEDIATE | TOGGLESELECT, BOOLGADGET, (APTR)&Border[0], NULL, &IText[12], NULL, NULL, 'D', NULL }, { &Gadget[14], 12,80, 64,12, GADGHCOMP, RELVERIFY, BOOLGADGET, (APTR)&Border[0], NULL, &IText[13], NULL, NULL, 'S', NULL }, { &Gadget[15], 80,80, 64,12, GADGHCOMP, RELVERIFY, BOOLGADGET, (APTR)&Border[0], NULL, &IText[14], NULL, NULL, 'G', NULL }, { &Gadget[16], 148,80, 64,12, GADGHCOMP, RELVERIFY, BOOLGADGET, (APTR)&Border[0], NULL, &IText[15], NULL, NULL, 'R', NULL }, { &Gadget[17], 216,80, 64,12, GADGHCOMP, RELVERIFY, BOOLGADGET, (APTR)&Border[0], NULL, &IText[16], NULL, NULL, 'F', NULL }, { NULL, 284,80, 64,12, GADGHCOMP | GADGDISABLED, GADGIMMEDIATE | TOGGLESELECT, BOOLGADGET, (APTR)&Border[0], NULL, &IText[17], NULL, NULL, 'A', NULL } }; struct NewWindow NewWindow = { 128,64, 360,100, 0,1, GADGETDOWN | GADGETUP | CLOSEWINDOW | VANILLAKEY, WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE | ACTIVATE | NOCAREREFRESH, &Gadget[0], NULL, "DFC5--by T. Rokicki/S. Vigna", NULL, NULL, 360,100, -1,-1, WBENCHSCREEN }; /* * This structures are for AutoRequest(); */ struct IntuiText Req = { AUTOFRONTPEN, AUTOBACKPEN, AUTODRAWMODE, 20,20, &Topaz8, }; struct IntuiText Cancel = { AUTOFRONTPEN, AUTOBACKPEN, AUTODRAWMODE, AUTOLEFTEDGE, AUTOTOPEDGE, &Topaz8, NULL, AUTONEXTTEXT }; struct IntuiText Retry = { AUTOFRONTPEN, AUTOBACKPEN, AUTODRAWMODE, AUTOLEFTEDGE, AUTOTOPEDGE, &Topaz8, "Try Again", AUTONEXTTEXT }; /* * Here we invert the border colors if we are under 1.3 */ void ReverseBorderColors(void) { int i; for(i=0; i<4; i++) Border[i].FrontPen = i%2+1; } /* * This is for read errors, write errors etc. */ int ProblemsWithUnit(char *s, int Unit, int Track) { static char s2[100]; sprintf(s2, "%s error on disk %ld, track %ld.", s, Unit, Track); Req.IText = s2; Say(s2); Cancel.IText = "So What?"; return(AutoRequest(0, &Req, &Retry, &Cancel, 0, 0, 320, 72)); } /* * This is only for saying something that's only a notification. */ void Acknowledge(char *s) { Req.IText = s; Say(s); Cancel.IText = "OK"; AutoRequest(0, &Req, NULL, &Cancel, 0, 0, 320, 72); } /* * This routine draws a string into the window at * a specific X, Y location. */ void DrawText(struct Window *Window, char *String, int x, int y) { IntuiText.IText = (UBYTE *)String ; PrintIText(Window->RPort, &IntuiText, (long)x, (long)y) ; } /* * This set of routines draw the progress bar. They're fairly smart--- * first they update Bar, then they check for the layer we need being * unlocked. If it's not the case, they set SomethingFailed go. * As soon as the layer is free, the bar is redrawn basing on Bar. * This allows for smooth copy operations even if someone uses menus * (thus locking all layers). UpDateProgress forces the bar to be * updated. */ static unsigned char SomethingFailed, Bar[20]; void PrintRectAt(struct Window *Window, int n, int color) { SetDrMd(Window->RPort, JAM1); SetAPen(Window->RPort, color); RectFill(Window->RPort, 21+n*4, 37, (21+3)+n*4, 44); } void UpdateProgress(struct Window *Window) { register int i; if (SomethingFailed) { for(i=0; i<80; i++) PrintRectAt(Window, i, (Bar[i/4]>>(2*(i%4))) & 3); SomethingFailed = 0; } } void DrawProgress(struct Window *Window, int n, int color) { Bar[n/4] &= ~(3<<(2*(n%4))); Bar[n/4] |= color<<(2*(n%4)); if (Window->WScreen->LayerInfo.Lock.ss_NestCount == 0) { UpdateProgress(Window); PrintRectAt(Window, n, color); } else SomethingFailed = 1; } /* * This routine wipes the progress bar. */ void WipeProgress(struct Window *Window, int start) { register int i; for(i=start; i<80; i++) DrawProgress(Window, i, 0); } /* * This sets up the window. */ struct Window *SetUpWindow(void) { register struct Window *Window; if (Window = OpenWindow(&NewWindow)) { DrawText(Window, "Source", 20, 22); DrawText(Window, "Dest", 28, 52); DrawBorder(Window->RPort, &Border[2], 20, 36); } return(Window); } /* * Here we wipe completely a gadget */ void WipeGadget(struct Window *Window, struct Gadget *G) { SetAPen(Window->RPort, 0); SetDrMd(Window->RPort, JAM1); RectFill(Window->RPort, G->LeftEdge, G->TopEdge, G->LeftEdge+G->Width-1, G->TopEdge+G->Height-1); } /* * This routines selects or delects a gadget. */ void SelectGadget(struct Window *Window, struct Gadget *G, int Bool) { register int pos; if ((Bool && (G->Flags & SELECTED)) || (!Bool && !(G->Flags & SELECTED))) return; pos = RemoveGadget(Window, G); if (Bool) G->Flags |= SELECTED; else G->Flags &= ~SELECTED; AddGadget(Window, G, pos); WipeGadget(Window, G); RefreshGList(G, Window, NULL, 1); } /* * This routines toggles a gadget. */ void ToggleGadget(struct Window *Window, struct Gadget *G) { if (G->Flags & SELECTED) SelectGadget(Window, G, FALSE); else SelectGadget(Window, G, TRUE); } /* * This routine returns the address of a gadget. *MUCH* better than global data. * If the gadget is disabled, returns NULL. */ struct Gadget *GAddr(int GadgetNumber) { return(Gadget[GadgetNumber].Flags & GADGDISABLED ? NULL : &Gadget[GadgetNumber]); } /* * EnableGadgets takes a mask of sizeof(Gadget)/sizeof(struct Gadget) bits and sets * all of the gadgets accordingly. Notice that if all it's already OK, we don't * do anything. */ void EnableGadgets(struct Window *Window, int Mask) { register int i, pos=0; for(i=0; i