// P R E P R E S S M E N U 2 //BCPL.Run/f PrepressMenu2.bcpl //Modified September 26, 1980 10:38 AM by Lyle Ramshaw, PARC // Added verify flag to the dictionary commands. //Modified May 15, 1980 1:56 PM by Lyle Ramshaw, PARC // Changed Kerned to Clipped, adjusted call to DecodeFace // Added MakeKS and ReadKS cases; added Clipped flag to MakeAL. // Added Compact, and added Fast flag to other dictionary commands. //Modified April 7, 1980 12:33 PM by Kerry LaPrade, XEOS // TridentNeeded no longer automatically reverts to true // each time. Supersede spelling changed (formerly spelled // "Supercede." Also, Supersede changed to allow Trident // files. //Modified March 24, 1980 3:38 PM (by LaPrade) // Fixed DeOrbitize and Width problems caused by March 3 work. //Modified March 3, 1980 4:16 PM (by LaPrade) // Fixed Delete and Extract problems caused by fixing // Merge and Rename. //Modified February 28, 1980 12:10 PM (by LaPrade) // Bug fixes to Merge and Rename. //Modified February 4, 1980 1:33 PM (by LaPrade) // As suggested by Ramshaw, changed DecodeFile to treat // zero-length files the same way as it treats non-existent // files. // Made smarter and more protective user interface. Different // mouse buttons do different things. In general, first and // second mouse buttons invoke standard default and third // button reverts to last thing used. // As per Lyle Ramshaw's sugestions and instructions, // fixed Trident drive menu specification to allow access // to multiple directories on T-300's. //Modified: December 18, 1979 1:13 PM (by Lyle Ramshaw, PARC) // Removed static declarations, since the variables are defined in // PrepressMenu1. Added the Notify window, the Trident drive stuff, // and the angleToRotate stuff. Fixed the Rename bug. //Modified: November 26, 1979 3:34 PM (by LaPrade) // Split PrepressMenu.bcpl into two files: PrepressMenu1.bcpl // and PrepressMenu2.bcpl // //Modified: November 5, 1979 3:02 PM (by LaPrade) // Replaced FlipBox (discontinued in version 1.4, July, 1978, // of Keith Knox's menu package) with FillBox (introduced in // version 1.4) get "AuxiliaryMenuDefs.d" get "ix.dfs" get "PrePressNames.D" //outgoing procedures external [ MenuSetUpAngle MenuSetUpBackgroundFile MenuSetUpBigFile MenuSetUpBitFactor MenuSetUpDefaults MenuSetUpDotSize MenuSetUpDrive MenuSetUpFactors MenuSetUpFileName MenuSetUpIncline MenuSetUpOutputFile MenuSetUpPercent MenuSetUpResolution MenuSetUpRotation MenuSetUpSize MenuSetUpSourceFile MenuSetUpTrident MenuSetUpTrueFalse ] //incoming procedures external [ //Float FST //FontWidths DecodeFace //Operating System Allocate Closes DefaultArgs Endofs Free Gets Zero //PrePress PrePressWindowInit //PrePressUtil MulDiv //Scan PrintFloat PrintNumber StrEq //StringUtil CopyString ExtractSubstring ] //incoming statics external [ //Operating System sysZone //PrePress @angleToRotate @BackgroundFileName @bigfilename @bitfactor @convertThicken @convertOrbitized @dotsize @fam @face @incline @InputFileName @Clipped @fastFlag @verifyFlag @menuUserPrefersTrident @OutputFileName @outputFileNeeded @percent @resolutionx @resolutiony @ReviseWidths @rotation @siz @tridentDriveNumber @tridentNeeded @updateflag @xfp @yfp //PrePressMenu1 @boxesOn @decodeFlag @flipFlag @menu @nboxesOn @nstripsOn @outputFileType @selectedBoxNum @selectedButton @sourceFileMissing @sourceFileType @stripsOn ] //internal statics static [ @sourceFileException @fileNamesArray = 0 @latestFileType = 0 ] manifest [ //changed by Lyle Ramshaw May 9, 1980 2:27 PM because of //new IXTypeTexMetrics noIXType = -1 fileTypeSF = IXTypeTexMetrics + 1 // fileTypeBig = fileTypeSF + 1 maxFileNames = (fileTypeSF + 1) * 2 ] //********************************************************* let MenuSetUpAngle() be //********************************************************* SetUpNumber(bAngle, bAngleStrip, angleToRotate) //********************************************************* and MenuSetUpBackgroundFile(name) be //********************************************************* SetUpBoxAndStrip(bBackground, bBackgroundStrip, name, BackgroundFileName) //********************************************************* and MenuSetUpBigFile(name) be //********************************************************* SetUpBoxAndStrip(bBig, bBigStrip, name, bigfilename) //********************************************************* and MenuSetUpBitFactor() be //********************************************************* SetUpNumber(bBitFactor, bBitFactorStrip, bitfactor) //********************************************************* and MenuSetUpDefaults(comm) be //********************************************************* [ sourceFileException = comm eq bMerge % comm eq bSupersede switchon comm into [ case bDelete: fastFlag = true MenuSetUpTrident() MenuSetUpTrueFalse(bFast, bFastStrip, fastFlag) verifyFlag = false MenuSetUpTrueFalse(bVerify, bVerifyStrip, verifyFlag) MenuSetUpSourceFile(0, true, true) // MenuSetUpResolution() MenuSetUpBigFile(MenuSetUpFileName(IXTypeName)) endcase case bList: fastFlag = true MenuSetUpTrident() MenuSetUpTrueFalse(bFast, bFastStrip, fastFlag) MenuSetUpBigFile(MenuSetUpFileName(IXTypeName)) endcase case bCompact: MenuSetUpTrident() verifyFlag = false MenuSetUpTrueFalse(bVerify, bVerifyStrip, verifyFlag) MenuSetUpBigFile(MenuSetUpFileName(IXTypeName)) endcase case bExtract: MenuSetUpTrident() MenuSetUpSourceFile(0, true, true) // MenuSetUpResolution() MenuSetUpOutputFile(MenuSetUpFileName(IXTypeChars)) MenuSetUpBigFile(MenuSetUpFileName(IXTypeName)) endcase case bMerge: fastFlag = true MenuSetUpTrident() MenuSetUpTrueFalse(bFast, bFastStrip, fastFlag) verifyFlag = false MenuSetUpTrueFalse(bVerify, bVerifyStrip, verifyFlag) // MenuSetUpSourceFile(MenuSetUpFileName(IXTypeChars), true) // Changed because file may be a dictionary! MenuSetUpSourceFile(MenuSetUpFileName(0), true) MenuSetUpBigFile(MenuSetUpFileName(IXTypeName)) MenuSetUpTrueFalse(bReviseWidths, bReviseWidthsStrip, ReviseWidths) endcase case bSupersede: fastFlag = true MenuSetUpTrident() MenuSetUpTrueFalse(bFast, bFastStrip, fastFlag) verifyFlag = false MenuSetUpTrueFalse(bVerify, bVerifyStrip, verifyFlag) MenuSetUpSourceFile(MenuSetUpFileName(IXTypeWidths), true) // MenuSetUpBigFile(MenuSetUpFileName(IXTypeName)) MenuSetUpBigFile("Fonts.Widths") endcase case bWidth: // MenuSetUpTrident() // tridentNeeded = false MenuSetUpOutputFile(MenuSetUpFileName(IXTypeWidths)) MenuSetUpSourceFile(MenuSetUpFileName(0), true) endcase case bRename: MenuSetUpSourceFile(MenuSetUpFileName(0), true, true) endcase case bShow: MenuSetUpSourceFile(MenuSetUpFileName(IXTypeChars), true) endcase case bMakeCU: MenuSetUpOutputFile("xxx.CU") MenuSetUpSourceFile(MenuSetUpFileName(IXTypeChars), true) endcase case bReadAL: MenuSetUpOutputFile(MenuSetUpFileName(IXTypeChars)) MenuSetUpSourceFile("SysFont.AL", false) endcase case bMakeAL: MenuSetUpOutputFile("xxx.AL") MenuSetUpTrueFalse(bClip, bClipStrip, Clipped) MenuSetUpSourceFile(MenuSetUpFileName(IXTypeChars), true) endcase case bReadKS: MenuSetUpOutputFile(MenuSetUpFileName(IXTypeChars)) MenuSetUpSourceFile("xxx.KS", false) endcase case bMakeKS: MenuSetUpOutputFile("xxx.KS") MenuSetUpSourceFile(MenuSetUpFileName(IXTypeChars), true) endcase case bMakeStrike: MenuSetUpOutputFile("xxx.STRIKE") MenuSetUpTrueFalse(bClip, bClipStrip, Clipped) MenuSetUpSourceFile(MenuSetUpFileName(IXTypeChars), true) endcase case bReadWidths: MenuSetUpOutputFile(MenuSetUpFileName(IXTypeWidths)) MenuSetUpSourceFile("Fonts.Widths", false) endcase case bReadCU: MenuSetUpOutputFile(MenuSetUpFileName(IXTypeChars)) MenuSetUpSourceFile("xxx.CU", false) endcase case bRotate: MenuSetUpOutputFile(MenuSetUpFileName(IXTypeChars)) MenuSetUpSourceFile(MenuSetUpFileName(IXTypeChars), true) MenuSetUpAngle() endcase case bGrow: //just like shrink case bShrink: MenuSetUpBitFactor() MenuSetUpOutputFile(MenuSetUpFileName(IXTypeChars)) MenuSetUpSourceFile(MenuSetUpFileName(IXTypeChars), true) endcase case bCoordinate: endcase//DOIT!!! case bOrbitFormat: MenuSetUpOutputFile(MenuSetUpFileName(IXTypeOrbitChars)) MenuSetUpSourceFile(MenuSetUpFileName(IXTypeChars), true) endcase case bDeOrbitFormat: MenuSetUpOutputFile(MenuSetUpFileName(IXTypeChars)) MenuSetUpSourceFile(MenuSetUpFileName(IXTypeOrbitChars), true) endcase case bScale: MenuSetUpOutputFile(MenuSetUpFileName(IXTypeChars)) MenuSetUpPercent() MenuSetUpFactors() MenuSetUpSourceFile(MenuSetUpFileName(IXTypeChars), true) endcase case bImposeWidths: MenuSetUpSourceFile(MenuSetUpFileName(IXTypeWidths), true) MenuSetUpOutputFile(MenuSetUpFileName(IXTypeChars)) endcase case bReadSF: MenuSetUpTrueFalse(bUpdate, bUpdateStrip, updateflag) MenuSetUpOutputFile(MenuSetUpFileName(IXTypeSplines)) MenuSetUpIncline() MenuSetUpFactors() MenuSetUpSourceFile(MenuSetUpFileName(fileTypeSF), false) endcase case bConvert: // MenuSetUpOutputFile(MenuSetUpFileName(IXTypeChars)) MenuSetUpOutputFile(MenuSetUpFileName(convertOrbitized? IXTypeOrbitChars, IXTypeChars)) MenuSetUpSourceFile(MenuSetUpFileName(IXTypeSplines), true) MenuSetUpResolution() MenuSetUpSize() MenuSetUpRotation() MenuSetUpIncline() MenuSetUpTrueFalse(bOrbitize, bOrbitizeStrip, convertOrbitized) MenuSetUpTrueFalse(bThicken, bThickenStrip, convertThicken) endcase case bEdit: MenuSetUpDotSize() MenuSetUpBackgroundFile((selectedButton eq 3 ? "ACtemp", "")) MenuSetUpSourceFile(MenuSetUpFileName(IXTypeChars), true) endcase ] ] //********************************************************* and MenuSetUpDotSize() be //********************************************************* SetUpNumber(bDotSize, bDotSizeStrip, dotsize) //********************************************************* and MenuSetUpDrive() be //********************************************************* SetUpNumber(bDrive, bDriveStrip, tridentDriveNumber, 8) //********************************************************* and MenuSetUpFactors() be //********************************************************* [ let floatPointNumString = vec 20 PrintFloat(floatPointNumString, xfp) SetUpBoxAndStrip(bX, bXStrip, floatPointNumString) PrintFloat(floatPointNumString, yfp) SetUpBoxAndStrip(bY, bYStrip, floatPointNumString) ] //********************************************************* and MenuSetUpFileName(fileType, fileName; numargs na) = valof //********************************************************* [ // //Routine for managing fileNamesArray, which is used // for storing default name and name most recently // used for various file format types. // //In general, // fileNamesArray!(2 * fileType) is default name, // fileNamesArray!(2 * fileType + 1) is last name used. // DefaultArgs(lv na, 1, 0) if fileNamesArray eq 0 then //if first time thru [ fileNamesArray = Allocate(sysZone, maxFileNames) Zero(fileNamesArray, maxFileNames) for I = 0 to maxFileNames - 1 do fileNamesArray!I = ExtractSubstring(selecton I into [ case IXTypeSplines * 2: "SDTemp" // case 0: case IXTypeChars * 2: case IXTypeOrbitChars * 2: "ACTemp" case 1: case IXTypeWidths * 2: "WDTemp" case fileTypeSF * 2: "xxx.SF" case IXTypeName * 2: "CD" case IXTypeName * 2 + 1: "SD" default: "" ] ) ] latestFileType = fileType let index = fileType * 2 + 1 test fileName eq 0 ifso //Read name from fileNamesArray. [ if selectedButton ne 3 then index = index - 1 fileName = ExtractSubstring(fileNamesArray!index) ] ifnot //Update fileNamesArray with this name. [ unless StrEq(fileName, fileNamesArray!(index - 1)) do [ Free(sysZone, fileNamesArray!index) fileNamesArray!index = ExtractSubstring(fileName) ] ] resultis fileName ] //********************************************************* and MenuSetUpIncline() be //********************************************************* SetUpNumber(bIncline, bInclineStrip, incline) //********************************************************* and MenuSetUpOutputFile(name) be //********************************************************* [ outputFileType = latestFileType outputFileNeeded = true SetUpBoxAndStrip(bOutput, bOutputStrip, name, OutputFileName) ] //********************************************************* and MenuSetUpPercent() be //********************************************************* SetUpNumber(bPercent, bPercentStrip, percent) //********************************************************* and MenuSetUpResolution() be //********************************************************* [ SetUpNumber(bXRes, bXResStrip, resolutionx / 10) SetUpNumber(bYRes, bYResStrip, resolutiony / 10) ] //********************************************************* and MenuSetUpRotation() be //********************************************************* SetUpNumber(bRotation, bRotationStrip, rotation) //********************************************************* and MenuSetUpSize() be //********************************************************* [ SetUpNumber(bPoint, bPointStrip, MulDiv(siz, 72, 2540)) SetUpNumber(bMica, bMicaStrip, siz) ] //********************************************************* and MenuSetUpSourceFile(name, fillInParams, setStats; numargs na) be //********************************************************* [ //If name eq 0, then no source file is actually being // used for this command, but it is nonetheless // desired to set up and/or activate boxes for file // parameters as in the case of the dictionary // commands "Delete" and "Extract". DefaultArgs(lv na, 1, decodeFlag, false) sourceFileType, decodeFlag = 0, fillInParams let sourceFileStream = 0 //name eq 0 is special case. unless name eq 0 do [ sourceFileType = latestFileType SetUpBoxAndStrip(bSource, bSourceStrip, name, InputFileName) sourceFileStream = (name>> STRING.length eq 0) ? 0, PrePressWindowInit(name, false) ] sourceFileMissing = //Source file nonexistent or empty? sourceFileStream eq 0 ? true, Endofs(sourceFileStream) FillBox(menu!bNameStrip, white) FillBox(menu!bFaceStrip, white) FillBox(menu!bMicaStrip, white) FillBox(menu!bPointStrip, white) FillBox(menu!bRotationStrip, white) FillBox(menu!bXResStrip, white) FillBox(menu!bYResStrip, white) FillBox(menu!bTypeStrip, white) unless name eq 0 do if name>> STRING.length ne 0 & sourceFileStream eq 0 then OverwriteBox(menu!bNotify, ((sourceFileException & tridentNeeded) ? "Merge or Supersede presumes this source file to be on Trident.", "Warning: Source file not on local disk.")) if decodeFlag then DecodeFile(sourceFileStream, setStats) //name eq 0 is special case. if name eq 0 then sourceFileMissing = false unless sourceFileStream eq 0 do Closes(sourceFileStream) ] //********************************************************* //and MenuSetUpTrident(preferTrident; numargs na) be and MenuSetUpTrident() be //********************************************************* [ // DefaultArgs(lv na, 0, true) // tridentNeeded = preferTrident tridentNeeded = menuUserPrefersTrident // SetUpBoxAndStrip(bTrident, bTridentStrip, (preferTrident ? "Prefer", "Ignore")) SetUpBoxAndStrip(bTrident, bTridentStrip, (menuUserPrefersTrident ? "Prefer", "Ignore")) MenuSetUpDrive() ] //********************************************************* and MenuSetUpTrueFalse(index1,index2,staticVal) be //********************************************************* SetUpBoxAndStrip(index1, index2, (staticVal? "true", "false")) //********************************************************* and DecodeFile(fileStream, updateStatics) = valof //********************************************************* [ let ixFamilyName, ix = vec IXLName, vec IXLMax let ixHeaderWord, ixHeaderType = nil, noIXType Zero(ixFamilyName, IXLName + 1) Zero(ix, IXLMax + 1) unless sourceFileMissing do [ ixHeaderWord = Gets(fileStream) ixHeaderType = ixHeaderWord<<IXH.Type test ixHeaderType ne IXTypeName % ixHeaderWord<<IXH.Length ne IXLName ifso sourceFileMissing = true ifnot ParanoidGetBlock(fileStream, ixFamilyName, IXLName) ] unless sourceFileMissing do [ ixHeaderWord = Gets(fileStream) ixHeaderType = ixHeaderWord<<IXH.Type let ixHeaderLength = ixHeaderWord<<IXH.Length test ixHeaderType eq IXTypeName % ixHeaderLength gr IXLMax ifso sourceFileMissing = true ifnot ParanoidGetBlock(fileStream, ix, ixHeaderLength) ] //Is this file type appropriate for this menu command? // Note: sourceFileType 0 is a special case meaning that // more than one different type is legal, i. e., // Rename and Merge if sourceFileType ne 0 & ixHeaderType ne sourceFileType then sourceFileMissing = true let saveFlipFlag = flipFlag flipFlag = flipFlag & updateStatics //The pair of statements above is important because the // procedure "SetUpBoxAndStrip" activates boxes iff // flipFlag. let saveSiz, saveRotation = siz, rotation let saveResolutionx, saveResolutiony = resolutionx, resolutiony //Font family name. SetUpBoxAndStrip(bName, bNameStrip, lv ixFamilyName>> IXN.Name) if (ixFamilyName>> IXN.Name ne 0) & updateStatics then CopyString(fam, lv ixFamilyName>> IXN.Name) //Font face. let v = vec 5; v>> STRING.length=9 DecodeFace(ix>> IX.face, v) SetUpBoxAndStrip(bFace, bFaceStrip, v) if updateStatics then face = ix>> IX.face //Font file format type. let typestr = selecton ixHeaderType into [ case IXTypeName: "Dictionary" case IXTypeSplines: "Splines" case IXTypeChars: "Chars" case IXTypeWidths: "Widths" case IXTypeOrbitChars: "OrbitChars" case IXTypeTexMetrics: "TEX Metrics" case noIXType: default: "???????" ] OverwriteBox(menu!bTypeStrip, typestr) //Font size. siz = ix>> IX.siz MenuSetUpSize() //Font rotation. rotation = ix>> IX.rotation MenuSetUpRotation() //Font resolutions (x and y directions). // if (ixHeaderType eq IXTypeChars) % (ixHeaderType eq IXTypeOrbitChars) % sourceFileMissing then if (sourceFileType eq 0) % (sourceFileType eq IXTypeChars) % (sourceFileType eq IXTypeOrbitChars) then [ resolutionx = ix>> IX.resolutionx resolutiony = ix>> IX.resolutiony MenuSetUpResolution() ] unless updateStatics do [ siz, rotation = saveSiz, saveRotation resolutionx, resolutiony = saveResolutionx, saveResolutiony ] flipFlag = saveFlipFlag ] //********************************************************* and ParanoidGetBlock(fileStream, address, count) be //********************************************************* [ for I = 1 to count - 1 do [ if Endofs(fileStream) then [ sourceFileMissing = true return ] address!I = Gets(fileStream) ] if Endofs(fileStream) then sourceFileMissing = true ] //********************************************************* and SetUpBoxAndStrip(boxNumber, stripNumber, sourceString, destinationString; numargs na) be //********************************************************* [ DefaultArgs(lv na, 2, "", 0) let box, strip = menu!boxNumber, menu!stripNumber if flipFlag then [ nboxesOn, nstripsOn = nboxesOn + 1, nstripsOn + 1 boxesOn!nboxesOn = box stripsOn!nstripsOn = strip FillBox(box, flip, 1) box >>BOX.inactive = false strip >>BOX.inactive = false ] if sourceString ne 0 then [ if destinationString ne 0 then CopyString(destinationString, sourceString) OverwriteBox(strip, sourceString) ] ] //********************************************************* and SetUpNumber(boxNumber1, boxNumber2, number, radix; numargs na) be //********************************************************* [ DefaultArgs(lv na, 3, 10) let numberString = vec 10 PrintNumber(numberString, number, radix) SetUpBoxAndStrip(boxNumber1, boxNumber2, numberString) ]