{$IFDEF WIN32} {$I DEFINES.INC} {$ENDIF} {$A+,B+,D+,E+,F+,I+,L+,N-,O+,R-,S+,V-} UNIT SysOp7; INTERFACE USES Common; PROCEDURE FindMenu(DisplayStr: AStr; VAR MenuNum: Byte; LowMenuNum, HighMenuNum: Byte; VAR Changed: Boolean); PROCEDURE MenuEditor; IMPLEMENTATION USES Common5, Menus2, SysOp7M; PROCEDURE DisplayMenus(VAR RecNumToList1: Integer; DisplayListNum: Boolean); VAR NumDone: Byte; BEGIN Abort := FALSE; Next := FALSE; AllowContinue := TRUE; MCIAllowed := FALSE; CLS; IF (DisplayListNum) THEN BEGIN PrintACR('^0###^4:^3Menu #^4:^3Menu name'); PrintACR('^4===:======:===================================================================='); END ELSE BEGIN PrintACR('^0Menu #^4:^3Menu name'); PrintACR('^4======:===================================================================='); END; Reset(MenuFile); NumDone := 0; WHILE (NumDone < (PageLength - 7)) AND (RecNumToList1 >= 1) AND (RecNumToList1 <= NumMenus) AND (NOT Abort) AND (NOT HangUp) DO BEGIN Seek(MenuFile,MenuRecNumArray[RecNumToList1]); Read(MenuFile,MenuR); WITH MenuR DO BEGIN IF (DisplayListNum) THEN PrintACR('^0'+PadRightInt(RecNumToList1,3)+ ' ^5'+PadRightInt(MenuNum,6)+ ' ^3'+PadLeftStr(LDesc[1],68)) ELSE PrintACR('^5'+PadRightInt(MenuNum,6)+ ' ^3'+PadLeftStr(LDesc[1],68)); END; Inc(RecNumToList1); Inc(NumDone); END; Close(MenuFile); LastError := IOResult; MCIAllowed := TRUE; AllowContinue := FALSE; IF (NumMenus = 0) THEN Print('*** No menus defined ***'); IF (DisplayListNum) THEN PrintACR('%LF^1[Users start at menu number: ^5'+IntToStr(General.AllStartMenu)+'^1]'); END; PROCEDURE FindMenu(DisplayStr: AStr; VAR MenuNum: Byte; LowMenuNum, HighMenuNum: Byte; VAR Changed: Boolean); VAR TempMenuR: MenuRec; InputStr: AStr; SaveMenuNum: Byte; RecNum, RecNum1, RecNumToList: Integer; BEGIN SaveMenuNum := MenuNum; RecNumToList := 1; InputStr := '?'; REPEAT IF (InputStr = '?') THEN DisplayMenus(RecNumToList,FALSE); Prt(DisplayStr+' (^5'+IntToStr(LowMenuNum)+'^4-^5'+IntToStr(HighMenuNum)+'^4)'+ ' [^5?^4=^5First^4,^5^4=^5Next^4,^5Q^4=^5Quit^4): '); MPL(Length(IntToStr(NumMenus))); ScanInput(InputStr,'Q?'^M); IF (InputStr = '-') THEN InputStr := 'Q'; IF (InputStr <> 'Q') THEN BEGIN IF (InputStr = ^M) THEN BEGIN InputStr := '?'; IF (RecNumToList < 1) OR (RecNumToList > NumMenus) THEN RecNumToList := 1 END ELSE IF (InputStr = '?') THEN RecNumToList := 1 ELSE IF (StrToInt(InputStr) < LowMenuNum) OR (StrToInt(InputStr) > HighMenuNum) THEN Print('%LF^7The range must be from '+IntToStr(LowMenuNum)+' to '+IntToStr(HighMenuNum)+'!^1') ELSE IF (InputStr = '0') AND (LowMenuNum = 0) THEN BEGIN MenuNum := StrToInt(InputStr); InputStr := 'Q'; Changed := TRUE; END ELSE BEGIN RecNum1 := -1; RecNum := 1; Reset(MenuFile); WHILE (RecNum <= NumMenus) AND (RecNum1 = -1) DO BEGIN Seek(MenuFile,MenuRecNumArray[RecNum]); Read(MenuFile,TempMenuR); IF (StrToInt(InputStr) = TempMenuR.MenuNum) THEN RecNum1 := TempMenuR.MenuNum; Inc(RecNum); END; Close(MenuFile); IF (RecNum1 = -1) THEN BEGIN RGNoteStr(2,FALSE); MenuNum := SaveMenuNum; END ELSE BEGIN MenuNum := StrToInt(InputStr); InputStr := 'Q'; Changed := TRUE; END; END; END; UNTIL (InputStr = 'Q') OR (HangUp); END; PROCEDURE MenuEditor; VAR Cmd: Char; SaveCurMenu: Byte; RecNumToList: Integer; SaveTempPause: Boolean; FUNCTION DisplayMenuFlags(MenuFlags: MenuFlagSet; C1,C2: Char): AStr; VAR MenuFlagT: MenuFlagType; TempS: AStr; BEGIN TempS := ''; FOR MenuFlagT := ClrScrBefore TO NoGlobalUsed DO IF (MenuFlagT IN MenuFlags) THEN TempS := TempS + '^'+C1+Copy('CDTNPAF12345',(Ord(MenuFlagT) + 1),1) ELSE TempS := TempS + '^'+C2+'-'; DisplayMenuFlags := TempS; END; PROCEDURE ToggleMenuFlag(MenuFlagT: MenuFlagType; VAR MenuFlags: MenuFlagSet); BEGIN IF (MenuFlagT IN MenuFlags) THEN Exclude(MenuFlags,MenuFlagT) ELSE Include(MenuFlags,MenuFlagT); END; PROCEDURE ToggleMenuFlags(C: Char; VAR MenuFlags: MenuFlagSet; VAR Changed: Boolean); VAR TempMenuFlags: MenuFlagSet; BEGIN TempMenuFlags := MenuFlags; CASE C OF 'C' : ToggleMenuFlag(ClrScrBefore,MenuFlags); 'D' : ToggleMenuFlag(DontCenter,MenuFlags); 'T' : ToggleMenuFlag(NoMenuTitle,MenuFlags); 'N' : ToggleMenuFlag(NoMenuPrompt,MenuFlags); 'P' : ToggleMenuFlag(ForcePause,MenuFlags); 'A' : ToggleMenuFlag(AutoTime,MenuFlags); 'F' : ToggleMenuFlag(ForceLine,MenuFlags); '1' : ToggleMenuFlag(NoGenericAnsi,MenuFlags); '2' : ToggleMenuFlag(NoGenericAvatar,MenuFlags); '3' : ToggleMenuFlag(NoGenericRIP,MenuFlags); '4' : ToggleMenuFlag(NoGlobalDisplayed,MenuFlags); '5' : ToggleMenuFlag(NoGlobalUsed,MenuFlags); END; IF (MenuFlags <> TempMenuFlags) THEN Changed := TRUE; END; PROCEDURE InitMenuVars(VAR MenuR: MenuRec); BEGIN FillChar(MenuR,SizeOf(MenuR),0); WITH MenuR DO BEGIN LDesc[1] := '<< New Menu >>'; LDesc[2] := ''; LDesc[3] := ''; ACS := ''; NodeActivityDesc := ''; Menu := TRUE; MenuFlags := [AutoTime]; LongMenu := ''; MenuNum := 0; MenuPrompt := 'Command? '; Password := ''; FallBack := 0; Directive := ''; ForceHelpLevel := 0; GenCols := 4; GCol[1] := 4; GCol[2] := 3; GCol[3] := 5; END; END; PROCEDURE DeleteMenu; VAR RecNumToDelete, RecNum: Integer; DeleteOk: Boolean; BEGIN IF (NumMenus = 0) THEN Messages(4,0,'menus') ELSE BEGIN RecNumToDelete := -1; InputIntegerWOC('%LFMenu number to delete?',RecNumToDelete,[NumbersOnly],1,NumMenus); IF (RecNumToDelete >= 1) AND (RecNumToDelete <= NumMenus) THEN BEGIN Reset(MenuFile); Seek(MenuFile,MenuRecNumArray[RecNumToDelete]); Read(MenuFile,MenuR); Close(MenuFile); LastError := IOResult; DeleteOK := TRUE; IF (MenuR.MenuNum = General.AllStartMenu) THEN BEGIN Print('%LFYou can not delete the menu new users start at.'); DeleteOK := FALSE; END ELSE IF (MenuR.MenuNum = General.NewUserInformationMenu) THEN BEGIN Print('%LFYou can not delete the new user information menu.'); DeleteOK := FALSE; END ELSE IF (MenuR.MenuNum = General.FileListingMenu) THEN BEGIN Print('%LFYou can not delete the file listing menu.'); DeleteOK := FALSE; END ELSE IF (MenuR.MenuNum = General.MessageReadMenu) THEN BEGIN Print('%LFYou can not delete the message read menu.'); DeleteOK := FALSE; END ELSE IF (CmdNumArray[RecNumToDelete] <> 0) THEN BEGIN Print('%LFThis menu is not empty.'); DeleteOK := FALSE; END; IF (NOT DeleteOK) THEN PauseScr(FALSE) ELSE BEGIN Print('%LFMenu: ^5'+MenuR.LDesc[1]); IF PYNQ('%LFAre you sure you want to delete it? ',0,FALSE) THEN BEGIN Print('%LF[> Deleting menu record ...'); SysOpLog('* Deleted menu: ^5'+MenuR.LDesc[1]); RecNumToDelete := MenuRecNumArray[RecNumToDelete]; { Convert To Real Record Number } Reset(MenuFile); IF (RecNumToDelete >= 0) AND (RecNumToDelete <= (FileSize(MenuFile) - 2)) THEN FOR RecNum := RecNumToDelete TO (FileSize(MenuFile) - 2) DO BEGIN Seek(MenuFile,(RecNum + 1)); Read(MenuFile,MenuR); Seek(MenuFile,RecNum); Write(MenuFile,MenuR); END; Seek(MenuFile,(FileSize(MenuFile) - 1)); Truncate(MenuFile); LoadMenuPointers; Close(MenuFile); LastError := IOResult; END; END; END; END; END; PROCEDURE InsertMenu; VAR RecNumToInsertBefore, NewMenuNum, RecNum: Integer; BEGIN IF (NumMenus = MaxMenus) THEN Messages(5,MaxMenus,'menus') ELSE BEGIN RecNumToInsertBefore := -1; InputIntegerWOC('%LFMenu number to insert before?',RecNumToInsertBefore,[NumbersOnly],1,(NumMenus + 1)); IF (RecNumToInsertBefore >= 1) AND (RecNumToInsertBefore <= (NumMenus + 1)) THEN BEGIN Print('%LF[> Inserting menu record ...'); SysOpLog('* Inserted 1 menu.'); IF (RecNumToInsertBefore = (NumMenus + 1)) THEN MenuRecNumArray[RecNumToInsertBefore] := (MenuRecNumArray[NumMenus] + CmdNumArray[NumMenus] + 1); RecNumToInsertBefore := MenuRecNumArray[RecNumToInsertBefore]; {Convert To Real Record Number } NewMenuNum := 0; Reset(MenuFile); RecNum := 1; WHILE (RecNum <= NumMenus) DO BEGIN Seek(MenuFile,MenuRecNumArray[RecNum]); Read(MenuFile,MenuR); IF (MenuR.MenuNum > NewMenuNum) THEN NewMenuNum := MenuR.MenuNum; Inc(RecNum); END; FOR RecNum := 1 TO 1 DO BEGIN Seek(MenuFile,FileSize(MenuFile)); Write(MenuFile,MenuR); END; FOR RecNum := ((FileSize(MenuFile) - 1) - 1) DOWNTO RecNumToInsertBefore DO BEGIN Seek(MenuFile,RecNum); Read(MenuFile,MenuR); Seek(MenuFile,(RecNum + 1)); Write(MenuFile,MenuR); END; InitMenuVars(MenuR); FOR RecNum := RecNumToInsertBefore TO ((RecNumToInsertBefore + 1) - 1) DO BEGIN Seek(MenuFile,RecNum); MenuR.MenuNum := (NewMenuNum + 1); Write(MenuFile,MenuR); END; LoadMenuPointers; Close(MenuFile); LastError := IOResult; END; END; END; PROCEDURE ModifyMenu; VAR TempMenuR: MenuRec; Cmd1: Char; SaveMenuNum: Byte; RecNum, RecNum1, RecNumToModify, SaveRecNumToModify: Integer; Changed: Boolean; BEGIN IF (NumMenus = 0) THEN Messages(4,0,'menus') ELSE BEGIN RecNumToModify := -1; InputIntegerWOC('%LFMenu number to modify?',RecNumToModify,[NumbersOnly],1,NumMenus); IF (RecNumToModify >= 1) AND (RecNumToModify <= NumMenus) THEN BEGIN SaveRecNumToModify := -1; Cmd1 := #0; Reset(MenuFile); WHILE (Cmd1 <> 'Q') AND (NOT HangUp) DO BEGIN IF (SaveRecNumToModify <> RecNumToModify) THEN BEGIN Seek(MenuFile,MenuRecNumArray[RecNumToModify]); Read(MenuFile,MenuR); SaveRecNumToModify := RecNumToModify; Changed := FALSE; END; WITH MenuR DO REPEAT IF (Cmd1 <> '?') THEN BEGIN Abort := FALSE; Next := FALSE; MCIAllowed := FALSE; CLS; PrintACR('^5Menu #'+IntToStr(RecNumToModify)+' of '+IntToStr(NumMenus)); NL; PrintACR('^11. Menu number : ^5'+IntToStr(MenuNum)); PrintACR('^12. Menu titles : ^5'+LDesc[1]); IF (LDesc[2] <> '') THEN PrintACR('^1 Menu title #2 : ^5'+LDesc[2]); IF (LDesc[3] <> '') THEN PrintACR('^1 Menu title #3 : ^5'+LDesc[3]); PrintACR('^13. Help files : ^5'+AOnOff((Directive = ''),'*Generic*',Directive)+'/'+ AOnOff((LongMenu = ''),'*Generic*',LongMenu)); PrintACR('^14. Menu prompt : ^5'+MenuPrompt); PrintACR('^15. ACS required : ^5"'+ACS+'"'); PrintACR('^16. Password : ^5'+AOnOff((Password = ''),'*None*',Password)); PrintACR('^17. Fallback menu : ^5'+IntToStr(FallBack)); PrintACR('^18. Forced ?-level: ^5'+AOnOff((ForceHelpLevel=0),'*None*',IntToStr(ForceHelpLevel))); PrintACR('^19. Generic info : ^5'+IntToStr(GenCols)+' cols - '+IntToStr(GCol[1])+'/'+IntToStr(GCol[2])+ '/'+IntToStr(GCol[3])); IF (General.MultiNode) THEN PrintACR('^1N. Node activity : ^5'+NodeActivityDesc); PrintACR('^1T. Flags : ^5'+DisplayMenuFlags(MenuFlags,'5','1')); MCIAllowed := TRUE; Print('%LF^1[Commands on this menu: ^5'+IntToStr(CmdNumArray[RecNumToModify])+'^1]'); IF (NumMenus = 0) THEN Print('*** No menus defined ***'); END; IF (General.MultiNode) THEN LOneK('%LFModify menu [^5C^4=^5Command Editor^4,^5?^4=^5Help^4]: ',Cmd1,'Q123456789CNT[]FJL?'^M,TRUE,TRUE) ELSE LOneK('%LFModify menu [^5C^4=^5Command Editor^4,^5?^4=^5Help^4]: ',Cmd1,'Q123456789CT[]FJL?'^M,TRUE,TRUE); CASE Cmd1 OF '1' : BEGIN REPEAT SaveMenuNum := MenuNum; RecNum1 := -1; InputByteWC('%LFNew menu number',MenuNum,[DisplayValue,NumbersOnly],1,(NumMenus + 1),Changed); IF (MenuNum <> SaveMenuNum) AND (MenuNum >= 1) AND (MenuNum <= (NumMenus + 1)) THEN BEGIN RecNum := 1; WHILE (Recnum <= NumMenus) AND (RecNum1 = -1) DO BEGIN Seek(MenuFile,MenuRecNumArray[RecNum]); Read(MenuFile,TempMenuR); IF (MenuNum = TempMenuR.MenuNum) THEN RecNum1 := TempMenuR.MenuNum; Inc(RecNum); END; IF (RecNum1 <> -1) THEN BEGIN NL; Print('^7Duplicate menu number!^1'); MenuNum := SaveMenuNum; END; END; UNTIL (RecNum1 = -1) OR (HangUp); Changed := TRUE; END; '2' : BEGIN InputWNWC('%LFNew menu title #1: ',LDesc[1], (SizeOf(LDesc[1]) - 1),Changed); IF (LDesc[1] <> '') THEN InputWNWC('New menu title #2: ',LDesc[2], (SizeOf(LDesc[2]) - 1),Changed); IF (LDesc[2] <> '') THEN InputWNWC('New menu title #3: ',LDesc[3], (SizeOf(LDesc[3]) - 1),Changed); END; '3' : BEGIN InputWN1('%LFNew file displayed for help: ',Directive,(SizeOf(Directive) - 1), [InterActiveEdit,UpperOnly],Changed); InputWN1('%LFNew file displayed for extended help: ',LongMenu,(SizeOf(LongMenu) - 1), [InterActiveEdit,UpperOnly],Changed); END; '4' : InputWNWC('%LFNew menu prompt: ',MenuPrompt,(SizeOf(MenuPrompt) - 1),Changed); '5' : InputWN1('%LFNew menu ACS: ',ACS,(SizeOf(ACS) - 1),[InterActiveEdit],Changed); '6' : InputWN1('%LFNew password: ',Password,(SizeOf(Password) - 1),[InterActiveEdit,UpperOnly],Changed); '7' : BEGIN SaveMenuNum := FallBack; IF (Changed) THEN BEGIN Seek(MenuFile,MenuRecNumArray[SaveRecNumToModify]); Write(MenuFile,MenuR); Changed := FALSE; END; Close(MenuFile); FindMenu('%LFNew fallback menu (^50^4=^5None^4)',SaveMenuNum,0,NumMenus,Changed); Reset(MenuFile); Seek(MenuFile,MenuRecNumArray[SaveRecNumToModify]); Read(MenuFile,MenuR); IF (Changed) THEN FallBack := SaveMenuNum; END; '8' : InputByteWC('%LFNew forced menu help-level (0=None)',ForceHelpLevel, [DisplayValue,NumbersOnly],0,3,Changed); '9' : BEGIN REPEAT NL; PrintACR('^1C. Generic columns : ^5'+IntToStr(GenCols)); PrintACR('^11. Bracket color : ^5'+IntToStr(GCol[1])); PrintACR('^12. Command color : ^5'+IntToStr(GCol[2])); PrintACR('^13. Description color: ^5'+IntToStr(GCol[3])); PrintACR('^1S. Show menu'); LOneK('%LFSelect (CS,1-3,Q=Quit): ',Cmd1,'QCS123'^M,TRUE,TRUE); CASE Cmd1 OF 'S' : BEGIN IF (Changed) THEN BEGIN Seek(MenuFile,MenuRecNumArray[SaveRecNumToModify]); Write(MenuFile,MenuR); Changed := FALSE; END; Seek(MenuFile,MenuRecNumArray[SaveRecNumToModify]); Read(MenuFile,MenuR); CurMenu := MenuR.MenuNum; LoadMenu; Reset(MenuFile); GenericMenu(2); NL; PauseSCR(FALSE); Seek(MenuFile,MenuRecNumArray[SaveRecNumToModify]); Read(MenuFile,MenuR); END; 'C' : InputByteWC('%LFNew number of generic columns',GenCols, [DisplayValue,NumbersOnly],0,7,Changed); '1' : InputByteWC('%LFNew bracket color',GCol[1],[DisplayValue,NumbersOnly],0,9,Changed); '2' : InputByteWC('%LFNew command color',GCol[2],[DisplayValue,NumbersOnly],0,9,Changed); '3' : InputByteWC('%LFNew description color',GCol[3],[DisplayValue,NumbersOnly],0,9,Changed); END; UNTIL (Cmd1 IN ['Q',^M]) OR (HangUp); Cmd1 := #0; END; 'C' : BEGIN IF (Changed) THEN BEGIN Seek(MenuFile,MenuRecNumArray[SaveRecNumToModify]); Write(MenuFile,MenuR); Changed := FALSE; END; CommandEditor(RecNumToModify,MenuNum,LDesc[1]); SaveRecNumToModify := -1; END; 'N' : IF (General.MultiNode) THEN InputWNWC('%LF^1New node activity description:%LF^4: ',NodeActivityDesc, (SizeOf(NodeActivityDesc) - 1),Changed); 'T' : BEGIN REPEAT LOneK('%LFToggle which flag? ('+DisplayMenuFlags(MenuFlags,'5','4')+'^4)'+ ' [^5?^4=^5Help^4,^5^4=^5Quit^4]: ',Cmd1,^M'CDTNPAF12345?',TRUE,TRUE); CASE Cmd1 OF 'C','D','T','N','P','A','F','1'..'5' : ToggleMenuFlags(Cmd1,MenuFlags,Changed); '?' : BEGIN NL; LCmds(21,3,'Clear screen','Don''t center titles'); LCmds(21,3,'No menu prompt','Pause before display'); LCmds(21,3,'Auto Time display','Force line input'); LCmds(21,3,'Titles not displayed','1 No ANS prompt'); LCmds(21,3,'2 No AVT prompt','3 No RIP prompt'); LCmds(21,3,'4 No Global disp','5 No global use'); END; END; UNTIL (Cmd1 = ^M) OR (HangUp); Cmd1 := #0; END; '[' : IF (RecNumToModify > 1) THEN Dec(RecNumToModify) ELSE BEGIN Messages(2,0,''); Cmd1 := #0; END; ']' : IF (RecNumToModify < NumMenus) THEN Inc(RecNumToModify) ELSE BEGIN Messages(3,0,''); Cmd1 := #0; END; 'F' : IF (RecNumToModify <> 1) THEN RecNumToModify := 1 ELSE BEGIN Messages(2,0,''); Cmd1 := #0; END; 'J' : BEGIN InputIntegerWOC('%LFJump to entry?',RecNumToModify,[NumbersOnly],1,NumMenus); IF (RecNumToModify < 1) AND (RecNumToModify > NumMenus) THEN Cmd1 := #0; END; 'L' : IF (RecNumToModify <> NumMenus) THEN RecNumToModify := NumMenus ELSE BEGIN Messages(3,0,''); Cmd1 := #0; END; '?' : BEGIN Print('%LF^1<^3CR^1>Redisplay screen'); Print('^31-9,C,N,T^1:Modify item'); LCmds(16,3,'[Back entry',']Forward entry'); LCmds(16,3,'Command Editor','First entry in list'); LCmds(16,3,'Jump to entry','Last entry in list'); LCmds(16,3,'Quit and save',''); END; END; UNTIL (Pos(Cmd1,'QC[]FJL') <> 0) OR (HangUp); IF (Changed) THEN BEGIN Seek(MenuFile,MenuRecNumArray[SaveRecNumToModify]); Write(MenuFile,MenuR); Changed := FALSE; SysOpLog('* Modified menu: ^5'+Menur.LDesc[1]); END; END; Close(MenuFile); LastError := IOResult; END; END; END; BEGIN LoadMenuPointers; SaveTempPause := TempPause; TempPause := FALSE; RecNumToList := 1; Cmd := #0; REPEAT IF (Cmd <> '?') THEN DisplayMenus(RecNumToList,TRUE); LOneK('%LFMenu editor [^5?^4=^5Help^4]: ',Cmd,'QDIM?'^M,TRUE,TRUE); CASE Cmd OF ^M : IF (RecNumToList < 1) OR (RecNumToList > NumMenus) THEN RecNumToList := 1; 'D' : DeleteMenu; 'I' : InsertMenu; 'M' : ModifyMenu; '?' : BEGIN Print('%LF^1<^3CR^1>Redisplay screen'); LCmds(12,3,'Delete menu','Insert menu'); LCmds(12,3,'Modify menu','Quit'); END; END; IF (CMD <> ^M) THEN RecNumToList := 1; UNTIL (Cmd = 'Q') OR (HangUp); TempPause := SaveTempPause; LastError := IOResult; LoadMenuPointers; IF (UserOn) THEN BEGIN SaveCurMenu := CurMenu; NumCmds := 0; GlobalCmds := 0; IF (General.GlobalMenu > 0) THEN BEGIN CurMenu := General.GlobalMenu; LoadMenu; GlobalCmds := NumCmds; END; CurMenu := SaveCurMenu; LoadMenu; END; END; END.