/* CMD: ½QuickMacro                                                     */
/* By Brett Evan Hester      13032 Copenhill Rd. Dallas, Tx. 75240-5302 */
	MacrosName = "QuickMacro"
/* Macro Type:                                                          */
/* SPECIAL     * WARNING!  * REMEMBERS                                  */
/* Description:                                                         */

Info1A = "!Quick Macro Maker ©           Information 1 of 2"
Info1B = ""
Info1C = "@This macro records all mouse movements and keys "
Info1D = "@pressed, for playback later via a new macro.    "
Info1E = "!½½½ Records until: CTRL-LAMIGA-E is pressed. ¼¼¼"
Info1F = ""
Info1G = "þ Two files are actually created:               "
Info1H = "¤ A standard macro, which saves all the info;   "
Info1I = "  and, it also starts playback of the data file."
Info1J = "¤ A data file records all mouse & keyboard      "
Info1K = '  input. (Named with an added suffix of ".REC") '
Info1L = "þ Two support programs are used by this macro,  "
Info1M = '  "C:RECORD" & "C:RECALL".                      '
Info1N = "@Important Info will be displayed before starting"

Info2A = "!Quick Macro Maker ©           Information 2 of 2"
Info2B = "@               Plug-Ins and Go! ©               "
Info2C = "                           Hester and associates"
Info2D = "                           13032 Copenhill Road "
Info2E = "                           Dallas, Texas 75240  "
Info2F = "@Special Thanks to:                              "
Info2G = "Arnie Cachelin  Henry Ribron    Mark J. Holland "
Info2H = "J. Phil Kelso   Terry Wester    Steven K. Simms "
Info2I = "Kevin DeRita    Greg Glaser     William S. Hawes"
Info2J = "NewTek ©        Commodore ©     INOVAtronics ©  "
Info2K = ""
Info2L = "@This macro represents a lot of time & hard work."
Info2M = "@Encourage people to create new ones and not kill"
Info2N = "@that possibility by stealing those that are out."

/* -------------------------------------------------------------------- */
                                     /* Start Error Detection (See End) */
SIGNAL ON ERROR
SIGNAL ON SYNTAX
                                                   /* Address LightWave */
VT3DLib = ADDLIB("LWModelerARexx.port",0)
ADDRESS "LWModelerARexx.port"
                                               /* Add Support Functions */
SupportLib = "rexxsupport.library"
IF POS(SupportLib , SHOW('L')) = 0 THEN
	IF ~ADDLIB(SupportLib , 0 , -30 , 0) THEN DO
		CALL Notify(1,"!Can't find "SupportLib)
		IF (VT3DLib) THEN CALL REMLIB("LWModelerARexx.port")
		EXIT
	END

/* -------------------------------------------------------------------- */
                                          /* Verify Support Files Exist */
IF EXISTS("C:RECORD") = 0 THEN DO
	CALL Notify(1,"!Sorry!,","The program used for recording:",'@"C:RECORD"',"cannot be found.")
	CALL Exiting
END

IF EXISTS("C:RECALL") = 0 THEN DO
	CALL Notify(1,"!Sorry!,",'The program used for running "quick" macros:','@"C:RECALL"',"cannot be found.")
	CALL Exiting
END

/* -------------------------------------------------------------------- */
                                    /* Reading Global Macro Preferences */
BEHDefaultFilePath = "Sys:"
BEHSettingsSavedTo = "T:"
BEHSpeechAndSound = "1"

IF (EXISTS("S:PlugInPrefs")) THEN DO
	IF (~OPEN(PlugInPrefs, "S:PlugInPrefs", 'R')) THEN BREAK
	IF (READLN(PlugInPrefs) ~= "PlugInPrefs") THEN BREAK
	BEHDefaultFilePath = READLN(PlugInPrefs)
	BEHSettingsSavedTo = READLN(PlugInPrefs)
	BEHSpeechAndSound = READLN(PlugInPrefs)
	CALL CLOSE(PlugInPrefs)
END

/* -------------------------------------------------------------------- */
                                            /* Recalling Macro Settings */
Stage = 1
ReqName = "Unnamed"
ReqDesc = "Quick VT3D macro"
ReqCreator = "Unknown"
ReqBegMsg = "Start..."
ReqEndMsg = "...Finish"
FileReq = "/ARexx_Examples/lwm/Unnamed.lwm"
FilePath = "/ARexx_Examples/lwm"
FileName = "Unnamed.lwm"

PrefsFileName = BEHSettingsSavedTo||MacrosName||".PLUG"

IF (EXISTS(PrefsFileName)) THEN DO
	IF (~OPEN(PrefsFile, PrefsFileName, 'R')) THEN BREAK
	IF (READLN(PrefsFile) ~= MacrosName) THEN BREAK

	Stage = READLN(PrefsFile)
	ReqName = READLN(PrefsFile)
	ReqDesc = READLN(PrefsFile)
	ReqCreator = READLN(PrefsFile)
	ReqBegMsg = READLN(PrefsFile)
	ReqEndMsg = READLN(PrefsFile)
	FileReq = READLN(PrefsFile)
	FilePath = READLN(PrefsFile)
	FileName = READLN(PrefsFile)

	CALL CLOSE(PrefsFile)
END

/* ******************************************************************** */
                                                   /* Main Body Of Code */
/* -------------------------------------------------------------------- */
/* Since LightWave started this macro, LightWave will not allow for     */
/*    user interaction outside that of this macro and it's requesters.  */
/* So, this macro will re-start itself, allowing for complete user      */
/*    interaction with LightWave, while this macro continues to run.    */
/* -------------------------------------------------------------------- */

IF Stage = 1 THEN DO
	PARSE SOURCE TempA TempB ThisMacro .           /* Finding this macro */
	CALL MenuRequester
	CALL FileRequester
	NextStage = 2 ; CALL SaveSettings
	ADDRESS COMMAND ; "C:RUN C:RX "||ThisMacro ; ADDRESS
	CALL Exiting
END

IF Stage = 2 THEN DO
	NextStage = 1 ; CALL SaveSettings
	CALL StageTwo
	CALL Exiting
END

/* ******************************************************************** */

/* >>>>>>>>>>>>>>>>>>>>>>>>>>>> STAGE ONE <<<<<<<<<<<<<<<<<<<<<<<<<<<<< */

/* -------------------------------------------------------------------- */
                                                      /* User Interface */
MenuRequester:

	CALL Req_Begin("Quick Macro Maker ©                     by Brett Hester")

	ReqA = Req_AddControl("Internal Name",'S', 40)
	ReqB = Req_AddControl("Description",'S', 40)
	ReqC = Req_AddControl("Creator",'S', 40)
	CALL Req_AddControl("",'T', "")
	CALL Req_AddControl("",'T', "Message displayed when macro starts:")
	ReqD = Req_AddControl("",'S', 40)
	CALL Req_AddControl("",'T', "Message displayed when macro finishes:")
	ReqE = Req_AddControl("",'S', 40)
	ReqF = Req_AddControl("",'CH', "Information")

	CALL Req_SetVal(ReqA, ReqName)
	CALL Req_SetVal(ReqB, ReqDesc)
	CALL Req_SetVal(ReqC, ReqCreator)
	CALL Req_SetVal(ReqD, ReqBegMsg)
	CALL Req_SetVal(ReqE, ReqEndMsg)
	CALL Req_SetVal(ReqF, 0)

	OKorCancel = Req_Post() ; IF OKorCancel = 0 THEN CALL Exiting

	ReqName = Req_GetVal(ReqA)
	ReqDesc = Req_GetVal(ReqB)
	ReqCreator = Req_GetVal(ReqC)
	ReqBegMsg = Req_GetVal(ReqD)
	ReqEndMsg = Req_GetVal(ReqE)
	BEHInfo = Req_GetVal(ReqF)

	CALL Req_End()

	IF BEHInfo = 1 THEN CALL InformationWindows

RETURN

/* -------------------------------------------------------------------- */
                                                      /* File Requester */
FileRequester:

	FileReq = GetFilename("-- Save Macro --", FilePath, ReqName||".lwm")
	IF FileReq = "(none)" THEN CALL Exiting
	CALL ExtractName
	CALL VerifyInput

RETURN

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
                                               /* Extract Name and Path */
ExtractName:

	FileReqLength = LENGTH(FileReq)
	FileDivider = LASTPOS("/",FileReq)
	IF FileDivider = 0 THEN FileDivider = LASTPOS(":",FileReq)
	FileNameLength = FileReqLength - FileDivider

	FilePath = STRIP(LEFT(FileReq, FileDivider),"T","/")
	FileName = RIGHT(FileReq, FileNameLength)

RETURN

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */

VerifyInput:
                                                         /* Verify Path */
	IF EXISTS(FilePath) = 0 THEN DO
		ReqA = "!Sorry!"
		ReqB = ""
		ReqC = '@Path "'||FilePath||'" not found.'
		ReqD = ""
		ReqE = "Select OK to create the new path / directory.   "
		ReqF = "Select CANCEL to display another file requester."
		OKorCancel = Notify(2, ReqA, ReqB, ReqC, ReqD, ReqE, ReqF)
		IF OKorCancel = 0 THEN CALL FileRequester
		IF OKorCancel = 1 THEN CALL MAKEDIR(FilePath)
	END
                                                         /* Verify Name */
	IF POS(" ",FileReq) ~= 0 THEN DO
		CALL Notify(1,"!Sorry!", "@The filename cannot contain spaces.")
		CALL FileRequester
	END
                                                         /* Verify Name */
	IF FileName = "" THEN DO
		CALL Notify(1,"!Sorry!", "@A name must be provided.")
		CALL FileRequester
	END
                                                       /* Verify Suffix */
	IF UPPER(RIGHT(FileReq,4)) ~= ".LWM" THEN FileReq = FileReq||".lwm"
	IF UPPER(RIGHT(FileName,4)) ~= ".LWM" THEN FileName = FileName||".lwm"
                                                    /* Verify Existance */
	IF EXISTS(FileReq) = 1 THEN DO
		YesOrNo = Notify(3,"!Caution!", '"'||FileReq||'" already exists.', "@Overwrite?")
		IF YesOrNo = 0 THEN CALL FileRequester
	END

RETURN

/* -------------------------------------------------------------------- */

/* >>>>>>>>>>>>>>>>>>>>>>>>>>>> STAGE TWO <<<<<<<<<<<<<<<<<<<<<<<<<<<<< */

StageTwo:

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
                                                      /* User Interface */
	ReqA = "!Quick Macro ©                            by Brett Hester"
	ReqB = ""
	ReqC = "@þ Start recording all mouse and keyboard input?          "
	ReqD = "@  Note, there will be a short delay after answering.     "
	ReqE = ""
	ReqF = "þ IMPORTANT INFORMATION -------------------------------- "
	ReqG = "¤ Occasionally, move the pointer to a corner; this       "
	ReqH = "  provides for a base point or frame of reference.       "
	ReqI = '¤ For best results, use "Numeric" whenever posssible.    '
	ReqJ = "¤ Storage space / memory will be taken up untill stopped."
	ReqK = "¤ Sorry, but, no message will be displayed when finished."
	ReqL = "!  ½½½½½½½ Only CTRL-LeftAmiga-E ends recording! ¼¼¼¼¼¼¼  "
	OKorCancel = Notify(2,ReqA,ReqB,ReqC,ReqD,ReqE,ReqF,ReqG,ReqH,ReqI,ReqJ,ReqK,ReqL)
	IF OKorCancel = 0 THEN CALL Exiting

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
                                       /* Creating and Saving New Macro */
	IF (~OPEN(NewMacro, FileReq, 'W')) THEN DO
		CALL Notify(1,"!Sorry!","@Unable to open / create file:",'@"'||FileReq||'"', "No recording will be made.  Exiting.")
		CALL Exiting
	END

	CALL WRITELN(NewMacro,"/* CMD: "||ReqName||" */")
	CALL WRITELN(NewMacro,"/* By: "||ReqCreator||" */")
	CALL WRITELN(NewMacro,'/* - with some assistance from "QuickMacro" a "Plug-In and Go!" macro - */')
	CALL WRITELN(NewMacro,'   MacrosName = "'||ReqName||'"')
	CALL WRITELN(NewMacro,"/* Description: "||ReqDesc||" */")
	CALL WRITELN(NewMacro,"")
	CALL WRITELN(NewMacro,"/* -------------------------------------------------------------------- */")
	CALL WRITELN(NewMacro,"                                     /* Start Error Detection (See End) */")
	CALL WRITELN(NewMacro,"SIGNAL ON ERROR")
	CALL WRITELN(NewMacro,"SIGNAL ON SYNTAX")
	CALL WRITELN(NewMacro,"                                                   /* Address LightWave */")
	CALL WRITELN(NewMacro,'VT3DLib = ADDLIB("LWModelerARexx.port",0)')
	CALL WRITELN(NewMacro,'ADDRESS "LWModelerARexx.port"')
	CALL WRITELN(NewMacro,"")
	CALL WRITELN(NewMacro,"/* -------------------------------------------------------------------- */")
	CALL WRITELN(NewMacro,"                                          /* Verify Support Files Exist */")
	CALL WRITELN(NewMacro,'IF (EXISTS("C:RECORD")) + EXISTS("C:RECALL") ~= 2 THEN DO')
	CALL WRITELN(NewMacro,'	CALL Notify(1,"!Sorry!","@Support files C:RECORD and/or C:RECALL not found.")')
	CALL WRITELN(NewMacro,"	CALL Exiting")
	CALL WRITELN(NewMacro,"END")
	CALL WRITELN(NewMacro,"")
	CALL WRITELN(NewMacro,"PARSE SOURCE TempA TempB ThisMacro .")
	CALL WRITELN(NewMacro,'IF EXISTS(ThisMacro||".REC") = 0 THEN DO')
	CALL WRITELN(NewMacro,'	CALL Notify(1,"!Sorry!","@Quick macro data file not found.",ThisMacro||".REC")')
	CALL WRITELN(NewMacro,"	CALL Exiting")
	CALL WRITELN(NewMacro,"END")
	CALL WRITELN(NewMacro,"")
	CALL WRITELN(NewMacro,"/* -------------------------------------------------------------------- */")
	CALL WRITELN(NewMacro,"                                                   /* Main Body Of Code */")
	CALL WRITELN(NewMacro,"Stage = GETCLIP(QuickMacro)")
	CALL WRITELN(NewMacro,"")
	CALL WRITELN(NewMacro,'IF Stage = "" THEN DO')
	CALL WRITELN(NewMacro,"	CALL SETCLIP(QuickMacro,2)")
	CALL WRITELN(NewMacro,'	ADDRESS COMMAND ; "C:RUN C:RX "||ThisMacro ; ADDRESS')
	CALL WRITELN(NewMacro,"	CALL Exiting")
	CALL WRITELN(NewMacro,"END")
	CALL WRITELN(NewMacro,"")
	CALL WRITELN(NewMacro,'IF Stage = "2" THEN DO')
	CALL WRITELN(NewMacro,"	CALL SETCLIP(QuickMacro)")
	CALL WRITELN(NewMacro,"")
	CALL WRITELN(NewMacro,'	ReqA = "!Quick Macro: '||ReqName||' ©   by '||ReqCreator||'"')
	CALL WRITELN(NewMacro,'	ReqB = "@'||ReqBegMsg||'"')
	CALL WRITELN(NewMacro,'	ReqC = "Quick Macro Maker © by Brett Hester"')
	CALL WRITELN(NewMacro,"	OKorCANCEL = Notify(2,ReqA,ReqB,ReqC)")
	CALL WRITELN(NewMacro,"	IF OKorCancel = 0 THEN CALL Exiting")
	CALL WRITELN(NewMacro,"")
	CALL WRITELN(NewMacro,'	ADDRESS COMMAND ; "C:RECALL FROM "||ThisMacro||".REC" ; ADDRESS')
	CALL WRITELN(NewMacro,"")
	CALL WRITELN(NewMacro,'	ReqA = "!Quick Macro: '||ReqName||' ©   by '||ReqCreator||'"')
	CALL WRITELN(NewMacro,'	ReqB = "@'||ReqEndMsg||'"')
	CALL WRITELN(NewMacro,'	ReqC = "Quick Macro Maker © by Brett Hester"')
	CALL WRITELN(NewMacro,"	CALL Notify(1,ReqA,ReqB,ReqC)")
	CALL WRITELN(NewMacro,"")
	CALL WRITELN(NewMacro,"END")
	CALL WRITELN(NewMacro,"")
	CALL WRITELN(NewMacro,"CALL Exiting")
	CALL WRITELN(NewMacro,"")
	CALL WRITELN(NewMacro,"/* -------------------------------------------------------------------- */")
	CALL WRITELN(NewMacro,"                                                              /* Ending */")
	CALL WRITELN(NewMacro,"Exiting:")
	CALL WRITELN(NewMacro,'	IF (VT3DLib) THEN CALL REMLIB("LWModelerARexx.port")')
	CALL WRITELN(NewMacro,"	EXIT")
	CALL WRITELN(NewMacro,"RETURN")
	CALL WRITELN(NewMacro,"")
	CALL WRITELN(NewMacro,"/* -------------------------------------------------------------------- */")
	CALL WRITELN(NewMacro,"                                                      /* Error Handling */")
	CALL WRITELN(NewMacro,"SYNTAX:")
	CALL WRITELN(NewMacro,"ERROR:")
	CALL WRITELN(NewMacro,"	ErrCode = RC")
	CALL WRITELN(NewMacro,"	ErrLine = SIGL")
	CALL WRITELN(NewMacro,"	ErrInfo = ERRORTEXT(ErrCode)")
	CALL WRITELN(NewMacro,"")
	CALL WRITELN(NewMacro,'	Err1 = "!Sorry!"')
	CALL WRITELN(NewMacro,'	Err2 = "An Error has been detected"')
	CALL WRITELN(NewMacro,'	Err3 = "@þ Macro -            "')
	CALL WRITELN(NewMacro,'	Err4 = "@þ Line Number -      "')
	CALL WRITELN(NewMacro,'	Err5 = "@þ Error Code -       "')
	CALL WRITELN(NewMacro,'	Err6 = "@þ Error Description -"')
	CALL WRITELN(NewMacro,'	Err7 = "@¤ Please Inform -    "')
	CALL WRITELN(NewMacro,"	CALL Notify(1,Err1,Err2,Err3,"||ReqName||",Err4,ErrLine,Err5,ErrCode,Err6,ErrInfo,Err7,"||ReqCreator||")")
	CALL WRITELN(NewMacro,"")
	CALL WRITELN(NewMacro,'	CALL SETCLIP("ErrorMacro",'||ReqName||')')
	CALL WRITELN(NewMacro,'	CALL SETCLIP("ErrorLine",ErrLine)')
	CALL WRITELN(NewMacro,'	CALL SETCLIP("ErrorCode",ErrCode)')
	CALL WRITELN(NewMacro,'	CALL SETCLIP("ErrorDesc",ErrInfo)')
	CALL WRITELN(NewMacro,"	PARSE SOURCE TempA TempB ErrFile TempC TempD TempE")
	CALL WRITELN(NewMacro,'	CALL SETCLIP("ErrorFile",ErrFile)')
	CALL WRITELN(NewMacro,"")
	CALL WRITELN(NewMacro,'	IF (VT3DLib) THEN CALL REMLIB("LWModelerARexx.port")')
	CALL WRITELN(NewMacro,"	EXIT")

	CALL CLOSE(NewMacro)

	AddingMacro = RxCmd_Add(ReqName, FileReq)
	IF AddingMacro = 0 THEN DO
		ReqA = "!Sorry!"
		ReqB = '@Unable to add the macro "'||ReqName||'" to the Macro List.      '
		ReqC = "Possible reason: There is a macro with that name already listed."
		ReqD = "Possible solutions: Choose a new name not already listed or     "
		ReqE = "                    Remove the macro with the name you want.    "
		ReqF = "@Macro created; but, no recording will be made.          Exiting."
		CALL Notify(1,ReqA,ReqB,ReqC,ReqD,ReqE)
		CALL Exiting
	END

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
                                   /* Creating and Saving New Recording */
	ADDRESS COMMAND
	"C:RUN C:RECORD TO "||FileReq||".Rec"||" SMOOTH 0 TRIGGER 0x6000"
	ADDRESS

RETURN

/* -------------------------------------------------------------------- */
                                                              /* Ending */
Exiting:

	IF (VT3DLib) THEN CALL REMLIB("LWModelerARexx.port")
	EXIT

RETURN

/* -------------------------------------------------------------------- */
                                            /* Recording Macro Settings */
SaveSettings:

	IF (OPEN(PrefsFile, PrefsFileName, 'W')) THEN DO
		CALL WRITELN(PrefsFile, MacrosName)

		CALL WRITELN(PrefsFile, NextStage)
		CALL WRITELN(PrefsFile, ReqName)
		CALL WRITELN(PrefsFile, ReqDesc)
		CALL WRITELN(PrefsFile, ReqCreator)
		CALL WRITELN(PrefsFile, ReqBegMsg)
		CALL WRITELN(PrefsFile, ReqEndMsg)
		CALL WRITELN(PrefsFile, FileReq)
		CALL WRITELN(PrefsFile, FilePath)
		CALL WRITELN(PrefsFile, FileName)

		CALL CLOSE(PrefsFile)
	END

RETURN

/* -------------------------------------------------------------------- */
                                                 /* Information Windows */
InformationWindows:

	OKorCancel = Notify(2, Info1A, Info1B, Info1C, Info1D, Info1E, Info1F, Info1G, Info1H, Info1I, Info1J, Info1K, Info1L, Info1M, Info1N)
	IF OKorCancel = 1 THEN CALL Notify(1, Info2A, Info2B, Info2C, Info2D, Info2E, Info2F, Info2G, Info2H, Info2I, Info2J, Info2K, Info2L, Info2M, Info2N)
	CALL MenuRequester

RETURN

/* -------------------------------------------------------------------- */
                                                      /* Error Handling */
SYNTAX:
ERROR:

	ErrCode = RC
	ErrLine = SIGL
	ErrInfo = ERRORTEXT(ErrCode)

	Err1 = "!Sorry!"
	Err2 = "An Error has been detected"
	Err3 = "@þ Macro -            "
	Err4 = "@þ Line Number -      "
	Err5 = "@þ Error Code -       "
	Err6 = "@þ Error Description -"
	Err7 = "@¤ Please Inform -    "
	Err8 = '  "Error Notice"     '
	Err9 = "  13032 Copenhill Rd."
	Err10 = "  Dallas, TX. 75240  "

	Call Notify(1,Err1,Err2,Err3,MacrosName,Err4,ErrLine,Err5,ErrCode,Err6,ErrInfo,Err7,Err8,Err9,Err10)

/* -------------------------------------------------------------------- */
                                             /* Advanced Error Handling */
	CALL SETCLIP("ErrorMacro",MacrosName)
	CALL SETCLIP("ErrorLine",ErrLine)
	CALL SETCLIP("ErrorCode",ErrCode)
	CALL SETCLIP("ErrorDesc",ErrInfo)

	PARSE SOURCE TempA TempB ErrFile TempC TempD TempE

	CALL SETCLIP("ErrorFile",ErrFile)

/* -------------------------------------------------------------------- */

	IF (VT3DLib) THEN CALL REMLIB("LWModelerARexx.port")
	EXIT
