(*-- AutoRev header do NOT edit! * * Program : GenGuiHandler.mod * Copyright : © 1993 * Author : Thilo Stöferle * Creation Date : 12-Jul-93 * Current version : 1.3 * Translator : M2Amiga V4.107d * * REVISION HISTORY * * Date Version Comment * --------- ------- ------------------------------------------ * 21-Aug-93 1.3 Changed 'scrObject' to 'winObject' * 05-Aug-93 1.2 All systems ready and functioning * 12-Jul-93 0.0 Created module * *-- REV_END --*) IMPLEMENTATION MODULE GenGuiHandler; FROM SYSTEM IMPORT ADR,ADDRESS,LONGSET,CAST,TAG; IMPORT E:ExecL, d:DosD, D:DosL, i:IntuitionD, I:IntuitionL, gt:GadToolsD, GT:GadToolsL, a:AslD, A:AslL, u:UtilityD, U:UtilityL, IM:IntuiMacros, S:String, FN:FileNames; IMPORT IO:GenIO, GUI:GenGui, Y:GenStrs; CONST MinLoc = IO.labelToID; (* 'lowest' localization type *) MaxLoc = IO.textToID; (* 'highest' localization type *) TYPE NameStr = ARRAY [0..255] OF CHAR; NameStrPtr = POINTER TO NameStr; CharPtr = POINTER TO CHAR; TYPE Menus = (Project); ProjectItems = (ProjectStart,ProjectBarlabel1,ProjectAbout,ProjectBarlabel2,ProjectQuit); VAR TagBuffer : ARRAY [0..19] OF LONGINT; GuiFReq,OutputFReq,CdFReq : a.FileRequesterPtr; GuiNameStr,OutputNameStr,CdNameStr : NameStr; StatusStr : ARRAY [0..255] OF CHAR; LocaleSwitch,CDFileSwitch : BOOLEAN; DisplayMain,DisplayLocale,DisplayCDFile : BOOLEAN; (* not to get crushed by thousands of 'too complex' errors... *) PROCEDURE GTSetGadgetAttrs(gad:i.GadgetPtr;args:ADDRESS); BEGIN GT.GTSetGadgetAttrsA(gad,GUI.MainWnd,NIL,args); END GTSetGadgetAttrs; (* write status message *) PROCEDURE WriteStatus(str:ADDRESS;args:ADDRESS); TYPE StrPtr = POINTER TO ARRAY [0..63] OF CHAR; BEGIN IO.StringFormat(StatusStr,CAST(StrPtr,str)^,args); GTSetGadgetAttrs(GUI.MainGadgets[GUI.GDStatus],TAG(TagBuffer, gt.gttxText,ADR(StatusStr), u.tagDone)); END WriteStatus; PROCEDURE SwitchGad(gad:i.GadgetPtr;state:BOOLEAN); BEGIN GTSetGadgetAttrs(gad,TAG(TagBuffer, i.gaDisabled,NOT(state), u.tagDone)); END SwitchGad; PROCEDURE SwitchIntuiGad(gad:i.GadgetPtr;state:BOOLEAN); BEGIN IF state THEN I.OnGadget(gad,GUI.MainWnd,NIL); ELSE I.OffGadget(gad,GUI.MainWnd,NIL); END END SwitchIntuiGad; PROCEDURE SwitchMenu(num:CARDINAL;state:BOOLEAN); BEGIN IF state THEN I.OnMenu(GUI.MainWnd,num); ELSE I.OffMenu(GUI.MainWnd,num); END; END SwitchMenu; (* switch all gads / localization gads / cd file gads on or off *) PROCEDURE SetFlags(main,locale,cdfile:BOOLEAN); VAR MainSw,LocaleSw,CDFileSw : BOOLEAN; BEGIN IF main THEN IF locale THEN CDFileSw := cdfile; ELSE (* switch off CDFile display *) CDFileSw := FALSE; END; LocaleSw := locale; ELSE (* switch off both Locale and CDFile display *) LocaleSw := FALSE; CDFileSw := FALSE; END; MainSw := main; IF (DisplayMain # MainSw) THEN DisplayMain := MainSw; SwitchGad(GUI.MainGadgets[GUI.GDGuiFile],MainSw); SwitchIntuiGad(GUI.MainGadgets[GUI.GDGuiGet],MainSw); SwitchGad(GUI.MainGadgets[GUI.GDOutputName],MainSw); SwitchIntuiGad(GUI.MainGadgets[GUI.GDOutputGet],MainSw); SwitchGad(GUI.MainGadgets[GUI.GDLocalize],MainSw); SwitchGad(GUI.MainGadgets[GUI.GDStart],MainSw); SwitchGad(GUI.MainGadgets[GUI.GDQuit],MainSw); SwitchMenu(IM.ShiftMenu(ORD(Project)),MainSw); SwitchMenu(IM.ShiftMenu(ORD(Project))+IM.ShiftItem(ORD(ProjectStart)),MainSw); SwitchMenu(IM.ShiftMenu(ORD(Project))+IM.ShiftItem(ORD(ProjectAbout)),MainSw); SwitchMenu(IM.ShiftMenu(ORD(Project))+IM.ShiftItem(ORD(ProjectQuit)),MainSw); END; IF (DisplayLocale # LocaleSw) THEN DisplayLocale := LocaleSw; SwitchGad(GUI.MainGadgets[GUI.GDMode],LocaleSw); SwitchGad(GUI.MainGadgets[GUI.GDLocaleName],LocaleSw); SwitchGad(GUI.MainGadgets[GUI.GDCdGenerate],LocaleSw); END; IF (DisplayCDFile # CDFileSw) THEN DisplayCDFile := CDFileSw; SwitchGad(GUI.MainGadgets[GUI.GDCdFile],CDFileSw); SwitchIntuiGad(GUI.MainGadgets[GUI.GDCdGet],CDFileSw); END; (* update global settings *) CDFileSwitch := cdfile; LocaleSwitch := locale; END SetFlags; (* set gadgets to defaults (given via arguments) *) PROCEDURE SetupGads(); BEGIN LocaleSwitch := TRUE; CDFileSwitch := TRUE; DisplayMain := TRUE; DisplayLocale := TRUE; DisplayCDFile := TRUE; GTSetGadgetAttrs(GUI.MainGadgets[GUI.GDGuiFile],TAG(TagBuffer, gt.gtstString,ADR(IO.GuiName), u.tagDone)); GTSetGadgetAttrs(GUI.MainGadgets[GUI.GDOutputName],TAG(TagBuffer, gt.gtstString,ADR(IO.OutputName), u.tagDone)); GTSetGadgetAttrs(GUI.MainGadgets[GUI.GDLocaleName],TAG(TagBuffer, gt.gtstString,ADR(IO.LocaleModule), u.tagDone)); GTSetGadgetAttrs(GUI.MainGadgets[GUI.GDCdFile],TAG(TagBuffer, gt.gtstString,ADR(IO.CDName), u.tagDone)); END SetupGads; PROCEDURE StartGUI(); VAR MyScrErrs : GUI.SetupScreenErrs; MyWinErrs : GUI.OpenProjectErrs; Name,Path : ARRAY [0..255] OF CHAR; Len : INTEGER; BEGIN MyScrErrs := GUI.SetupScreen(); CASE MyScrErrs OF | GUI.scrOk: (* don't exit *) | GUI.scrOpen: IO.ErrorQuit(Y.GetStr(Y.errorScreenOpen),NIL,d.fail); | GUI.scrNoVI: IO.ErrorQuit(Y.GetStr(Y.errorMemory),NIL,d.fail); | GUI.scrClass: IO.ErrorQuit(Y.GetStr(Y.errorImageClass),NIL,d.fail); | GUI.scrFont: IO.ErrorQuit(Y.GetStr(Y.errorScreenFont),NIL,d.fail); ELSE IO.ErrorQuit(Y.GetStr(Y.errorUnknown),NIL,d.fail); END; MyWinErrs := GUI.OpenMainWindow(); CASE MyWinErrs OF | GUI.winOk: (* don't exit *) | GUI.winContext: IO.ErrorQuit(Y.GetStr(Y.errorMemory),NIL,d.fail); | GUI.winCreate: IO.ErrorQuit(Y.GetStr(Y.errorWindowGadgets),NIL,d.fail); | GUI.winMenus: IO.ErrorQuit(Y.GetStr(Y.errorWindowMenus),NIL,d.fail); | GUI.winOpen: IO.ErrorQuit(Y.GetStr(Y.errorWindowOpen),NIL,d.fail); | GUI.winFont: IO.ErrorQuit(Y.GetStr(Y.errorWindowFont),NIL,d.fail); | GUI.winMemory: IO.ErrorQuit(Y.GetStr(Y.errorMemory),NIL,d.fail); | GUI.winObject: IO.ErrorQuit(Y.GetStr(Y.errorImageObject),NIL,d.fail); ELSE IO.ErrorQuit(Y.GetStr(Y.errorUnknown),NIL,d.fail); END; S.Copy(Name,IO.GuiName); FN.GetPath(Name,Path,Len); GuiFReq := A.AllocAslRequest(a.aslFileRequest,TAG(TagBuffer, a.tfrWindow,GUI.MainWnd, a.tfrTitleText,Y.GetStr(Y.freqTitleGui), a.tfrInitialFile,ADR(Name), a.tfrInitialDrawer,ADR(Path), a.tfrInitialPattern,ADR("#?"+IO.GuiSuffix), a.tfrDoPatterns,TRUE, a.tfrRejectIcons,TRUE, a.tfrSleepWindow,TRUE, u.tagDone)); S.Copy(Name,IO.OutputName); FN.GetPath(Name,Path,Len); OutputFReq := A.AllocAslRequest(a.aslFileRequest,TAG(TagBuffer, a.tfrWindow,GUI.MainWnd, a.tfrTitleText,Y.GetStr(Y.freqTitleOutput), a.tfrInitialFile,ADR(Name), a.tfrInitialDrawer,ADR(Path), a.tfrDoSaveMode,TRUE, a.tfrRejectIcons,TRUE, a.tfrSleepWindow,TRUE, u.tagDone)); S.Copy(Name,IO.CDName); FN.GetPath(Name,Path,Len); CdFReq := A.AllocAslRequest(a.aslFileRequest,TAG(TagBuffer, a.tfrWindow,GUI.MainWnd, a.tfrTitleText,Y.GetStr(Y.freqTitleCd), a.tfrInitialFile,ADR(Name), a.tfrInitialDrawer,ADR(Path), a.tfrInitialPattern,ADR("#?"+IO.CDSuffix), a.tfrDoPatterns,TRUE, a.tfrDoSaveMode,TRUE, a.tfrRejectIcons,TRUE, a.tfrSleepWindow,TRUE, u.tagDone)); SetupGads(); WriteStatus(Y.GetStr(Y.ready),NIL); END StartGUI; PROCEDURE EndGUI(); BEGIN IF (CdFReq # NIL) THEN A.FreeAslRequest(CdFReq); CdFReq := NIL; END; IF (OutputFReq # NIL) THEN A.FreeAslRequest(OutputFReq); OutputFReq := NIL; END; IF (GuiFReq # NIL) THEN A.FreeAslRequest(GuiFReq); GuiFReq := NIL; END; GUI.CloseMainWindow(); GUI.CloseDownScreen(); END EndGUI; PROCEDURE ShutdownGUI(); BEGIN SetFlags(FALSE,LocaleSwitch,CDFileSwitch); IF NOT(LocaleSwitch) THEN IO.Localization := IO.none; END; IO.GenCDFile := CDFileSwitch; S.Copy(IO.GuiName,GuiNameStr); S.Copy(IO.OutputName,OutputNameStr); S.Copy(IO.CDName,CdNameStr); END ShutdownGUI; PROCEDURE SetupGUI(); VAR LocaleSw,CDFileSw : BOOLEAN; BEGIN CASE IO.Localization OF | IO.none: LocaleSw := FALSE; (* ** initialize mode gadget default ** This is needed if the user doesn't touch the mode gadget ** after enabling localization. Then the localization type ** must be the same as the default mode gadget state. ** If LocaleSwitch remains 'off' during the session, this ** won't have any effect since the type is set back to 'none' *) IO.Localization := MinLoc; | IO.labelToID: GTSetGadgetAttrs(GUI.MainGadgets[GUI.GDMode],TAG(TagBuffer, gt.gtcyActive,0, u.tagDone)); LocaleSw := TRUE; | IO.textToID: GTSetGadgetAttrs(GUI.MainGadgets[GUI.GDMode],TAG(TagBuffer, gt.gtcyActive,1, u.tagDone)); LocaleSw := TRUE; END; CDFileSw := IO.GenCDFile; GTSetGadgetAttrs(GUI.MainGadgets[GUI.GDLocalize],TAG(TagBuffer, gt.gtcbChecked,LocaleSw, u.tagDone)); GTSetGadgetAttrs(GUI.MainGadgets[GUI.GDCdGenerate],TAG(TagBuffer, gt.gtcbChecked,CDFileSw, u.tagDone)); SetFlags(TRUE,LocaleSw,CDFileSw); END SetupGUI; PROCEDURE DisplayReq (Text,Gads,Args:ADDRESS):LONGINT; VAR DummyIDCMP : i.IDCMPFlagSet; MyReq : i.EasyStruct; BEGIN WITH MyReq DO structSize := SIZE(i.EasyStruct); flags := LONGSET{}; title := NIL; textFormat := Text; gadgetFormat := Gads; END; DummyIDCMP := i.IDCMPFlagSet{}; RETURN(I.EasyRequestArgs(GUI.MainWnd,MyReq,DummyIDCMP,Args)); END DisplayReq ; PROCEDURE ShowAbout(); VAR Num : LONGINT; BEGIN Num := DisplayReq(Y.GetStr(Y.about),Y.GetStr(Y.okay),TAG(TagBuffer, ADR(IO.PrgName), ADR(IO.PrgVerStr), ADR(IO.PrgDateStr), ADR(IO.PrgCopyStr) )); END ShowAbout; PROCEDURE CheckKey(inp:CHAR;key:CharPtr;chkupper:BOOLEAN):BOOLEAN; VAR ch : CHAR; BEGIN IF chkupper THEN ch := U.ToUpper(key^); ELSE ch := U.ToLower(key^); END; RETURN(inp = ch); END CheckKey; PROCEDURE CycleLocale(increase:BOOLEAN):CARDINAL; BEGIN IF increase THEN IF (IO.Localization = MaxLoc) THEN (* wrap to lowest *) IO.Localization := MinLoc; ELSE INC(IO.Localization); END; ELSE IF (IO.Localization = MinLoc) THEN (* wrap to highest *) IO.Localization := MaxLoc; ELSE DEC(IO.Localization); END; END; RETURN(ORD(IO.Localization) - ORD(MinLoc)); END CycleLocale; PROCEDURE HandleGUI():BOOLEAN; VAR SigsRcvd : LONGSET; MyIMsg : i.IntuiMessagePtr; Leave,Quit : BOOLEAN; Class : i.IDCMPFlagSet; Code : CARDINAL; Item : ADDRESS; InpChar : CHAR; NewState : BOOLEAN; NextActive : INTEGER; BEGIN Leave := FALSE; Quit := FALSE; REPEAT SigsRcvd := E.Wait(LONGSET{GUI.MainWnd^.userPort^.sigBit,d.ctrlC}); IF (GUI.MainWnd^.userPort^.sigBit IN SigsRcvd) THEN MyIMsg := GT.GTGetIMsg(GUI.MainWnd^.userPort); WHILE (MyIMsg # NIL) DO (* copy fields interesting to us and reply *) Class := MyIMsg^.class; Code := MyIMsg^.code; Item := MyIMsg^.iAddress; GT.GTReplyIMsg(MyIMsg); IF (i.gadgetUp IN Class) THEN CASE CAST(i.GadgetPtr,Item)^.gadgetID OF | GUI.GDGuiGet: IF A.AslRequest(GuiFReq,NIL) THEN S.Copy(GuiNameStr,GuiFReq^.dir^); IF D.AddPart(ADR(GuiNameStr),GuiFReq^.file,SIZE(GuiNameStr)) THEN GTSetGadgetAttrs(GUI.MainGadgets[GUI.GDGuiFile],TAG(TagBuffer, gt.gtstString,ADR(GuiNameStr), u.tagDone)); END; END; | GUI.GDOutputGet: IF A.AslRequest(OutputFReq,NIL) THEN S.Copy(OutputNameStr,OutputFReq^.dir^); IF D.AddPart(ADR(OutputNameStr),OutputFReq^.file,SIZE(OutputNameStr)) THEN GTSetGadgetAttrs(GUI.MainGadgets[GUI.GDOutputName],TAG(TagBuffer, gt.gtstString,ADR(OutputNameStr), u.tagDone)); END; END; | GUI.GDCdGet: IF A.AslRequest(CdFReq,NIL) THEN S.Copy(CdNameStr,CdFReq^.dir^); IF D.AddPart(ADR(CdNameStr),CdFReq^.file,SIZE(CdNameStr)) THEN GTSetGadgetAttrs(GUI.MainGadgets[GUI.GDCdFile],TAG(TagBuffer, gt.gtstString,ADR(CdNameStr), u.tagDone)); END; END; | GUI.GDMode: CASE Code OF | 0: IO.Localization := IO.labelToID; | 1: IO.Localization := IO.textToID; END; | GUI.GDLocalize: SetFlags(TRUE,(i.selected IN GUI.MainGadgets[GUI.GDLocalize]^.flags),CDFileSwitch); | GUI.GDCdGenerate: SetFlags(TRUE,LocaleSwitch,(i.selected IN GUI.MainGadgets[GUI.GDCdGenerate]^.flags)); | GUI.GDGuiFile: S.Copy(GuiNameStr,CAST(NameStrPtr,CAST(i.StringInfoPtr,GUI.MainGadgets[GUI.GDGuiFile]^.specialInfo)^.buffer)^); | GUI.GDOutputName: S.Copy(OutputNameStr,CAST(NameStrPtr,CAST(i.StringInfoPtr,GUI.MainGadgets[GUI.GDOutputName]^.specialInfo)^.buffer)^); | GUI.GDCdFile: S.Copy(CdNameStr,CAST(NameStrPtr,CAST(i.StringInfoPtr,GUI.MainGadgets[GUI.GDCdFile]^.specialInfo)^.buffer)^); | GUI.GDLocaleName: S.Copy(IO.LocaleModule,CAST(NameStrPtr,CAST(i.StringInfoPtr,GUI.MainGadgets[GUI.GDLocaleName]^.specialInfo)^.buffer)^); | GUI.GDStart: Leave := TRUE; | GUI.GDQuit: Quit := TRUE; Leave := TRUE; END; ELSIF (i.menuPick IN Class) THEN CASE IM.MenuNum(Code) OF | ORD(Project): CASE IM.ItemNum(Code) OF | ORD(ProjectStart): (* Start *) Leave := TRUE; | ORD(ProjectAbout): (* About... *) ShowAbout(); | ORD(ProjectQuit): (* Quit *) Quit := TRUE; Leave := TRUE; ELSE (* none selected *) END; ELSE (* none selected *) END; ELSIF (i.vanillaKey IN Class) THEN InpChar := CHAR(Code); IF CheckKey(InpChar,Y.GetStr(Y.mainModeGadKey),TRUE) THEN IF LocaleSwitch THEN GTSetGadgetAttrs(GUI.MainGadgets[GUI.GDMode],TAG(TagBuffer, gt.gtcyActive,CycleLocale(FALSE), u.tagDone)); END; ELSIF CheckKey(InpChar,Y.GetStr(Y.mainModeGadKey),FALSE) THEN (* currently the same as upper case action *) IF LocaleSwitch THEN GTSetGadgetAttrs(GUI.MainGadgets[GUI.GDMode],TAG(TagBuffer, gt.gtcyActive,CycleLocale(TRUE), u.tagDone)); END; ELSIF CheckKey(InpChar,Y.GetStr(Y.mainLocalizeGadKey),FALSE) THEN NewState := NOT(i.selected IN GUI.MainGadgets[GUI.GDLocalize]^.flags); GTSetGadgetAttrs(GUI.MainGadgets[GUI.GDLocalize],TAG(TagBuffer, gt.gtcbChecked,NewState, u.tagDone)); SetFlags(TRUE,NewState,CDFileSwitch); ELSIF CheckKey(InpChar,Y.GetStr(Y.mainCdGenerateGadKey),FALSE) THEN IF LocaleSwitch THEN NewState := NOT(i.selected IN GUI.MainGadgets[GUI.GDCdGenerate]^.flags); GTSetGadgetAttrs(GUI.MainGadgets[GUI.GDCdGenerate],TAG(TagBuffer, gt.gtcbChecked,NewState, u.tagDone)); SetFlags(TRUE,LocaleSwitch,NewState); END; ELSIF CheckKey(InpChar,Y.GetStr(Y.mainStartGadKey),FALSE) THEN Leave := TRUE; ELSIF CheckKey(InpChar,Y.GetStr(Y.mainQuitGadKey),FALSE) THEN Quit := TRUE; Leave := TRUE; ELSIF CheckKey(InpChar,Y.GetStr(Y.mainGuiFileGadKey),FALSE) THEN NewState := I.ActivateGadget(GUI.MainGadgets[GUI.GDGuiFile],GUI.MainWnd,NIL); ELSIF CheckKey(InpChar,Y.GetStr(Y.mainOutputNameGadKey),FALSE) THEN NewState := I.ActivateGadget(GUI.MainGadgets[GUI.GDOutputName],GUI.MainWnd,NIL); ELSIF CheckKey(InpChar,Y.GetStr(Y.mainLocaleNameGadKey),FALSE) THEN IF LocaleSwitch THEN NewState := I.ActivateGadget(GUI.MainGadgets[GUI.GDLocaleName],GUI.MainWnd,NIL); END; ELSIF CheckKey(InpChar,Y.GetStr(Y.mainCdFileGadKey),FALSE) THEN IF (LocaleSwitch AND CDFileSwitch) THEN NewState := I.ActivateGadget(GUI.MainGadgets[GUI.GDCdFile],GUI.MainWnd,NIL); END; END; ELSIF (i.closeWindow IN Class) THEN Quit := TRUE; Leave := TRUE; ELSIF (i.refreshWindow IN Class) THEN GT.GTBeginRefresh(GUI.MainWnd); GUI.MainRender(); GT.GTEndRefresh(GUI.MainWnd,TRUE); END; MyIMsg := GT.GTGetIMsg(GUI.MainWnd^.userPort); END; ELSIF (d.ctrlC IN SigsRcvd) THEN IO.ErrorQuit(Y.GetStr(Y.break),NIL,d.fail); END; UNTIL Leave; RETURN(Quit); END HandleGUI; BEGIN CLOSE EndGUI(); END GenGuiHandler.