Too much stuff to list

This commit is contained in:
mysticbbs 2013-02-26 07:45:01 -05:00
parent a416312104
commit 3b41411d22
19 changed files with 586 additions and 202 deletions

View File

@ -30,7 +30,7 @@ Type
End;
Const
Num_Cmds = 99;
Num_Cmds = 100;
MenuCmds : Array[1..Num_Cmds] of CmdRec = (
// AUTOSIG MENU COMMANDS
( Name: 'AE'; Desc: 'Autosig editor' ),
@ -138,6 +138,7 @@ Const
// OTHER MENU COMMANDS
( Name: '-D'; Desc: 'Set access flags (set 2)' ),
( Name: '-F'; Desc: 'Set access flags (set 1)' ),
( Name: '-G'; Desc: 'Show generated menu' ),
( Name: '-I'; Desc: 'Set menu timer' ),
( Name: '-K'; Desc: 'Add keys to input buffer' ),
( Name: '-N'; Desc: 'Ask Yes/No (default No)' ),
@ -473,13 +474,13 @@ Begin
Form.AddStr ('D', ' Description' , 9, 7, 24, 7, 13, 30, 30, @Menu.Info.Description, Topic + 'Description of menu');
Form.AddStr ('A', ' Access' , 14, 8, 24, 8, 8, 30, 30, @Menu.Info.Access, Topic + 'Security requirements to access this menu');
Form.AddStr ('B', ' Fallback' , 12, 9, 24, 9, 10, 20, 20, @Menu.Info.Fallback, Topic + 'Menu loaded if user has no access (Blank/Last)');
Form.AddTog ('T', ' Menu Type' , 11, 10, 24, 10, 11, 13, 0, 2, 'Standard Lightbar Lightbar/Grid', @Menu.Info.MenuType, Topic + 'Type of menu');
Form.AddTog ('T', ' Menu Type' , 11, 10, 24, 10, 11, 15, 0, 3, 'Standard Lightbar Lightbar/Grid Lightbar/Prompt', @Menu.Info.MenuType, Topic + 'Type of menu');
Form.AddTog ('I', ' Input Type' , 10, 11, 24, 11, 12, 12, 0, 2, 'User_Defined HotKey LongKey', @Menu.Info.InputType, Topic + 'Input type for this menu');
Form.AddTog ('C', ' Input Chars' , 9, 12, 24, 12, 13, 9, 0, 2, 'Uppercase Lowercase Hidden', @Menu.Info.CharType, Topic + 'Input format display');
Form.AddBol ('G', ' Use Global' , 10, 13, 24, 13, 12, 3, @Menu.Info.Global, Topic + 'Include global menu options in this menu?');
Form.AddStr ('N', ' Node Status' , 9, 14, 24, 14, 13, 30, 30, @Menu.Info.NodeStatus, Topic + 'Node/User status set when this menu is loaded');
Form.AddStr ('F', ' Display File', 8, 15, 24, 15, 14, 20, 20, @Menu.Info.DispFile, Topic + 'Display file shown instead of generated menu');
Form.AddTog ('L', ' Display Cols', 8, 16, 24, 16, 14, 1, 1, 4, '1 2 3 4', @Menu.Info.DispCols, Topic + 'Number of columns in generated menu');
Form.AddTog ('L', ' Display Cols', 8, 16, 24, 16, 14, 1, 0, 4, '0 1 2 3 4', @Menu.Info.DispCols, Topic + 'Number of columns in generated menu');
Form.AddPipe ('H', ' Menu Header' , 9, 17, 24, 17, 13, 50, 160, @Menu.Info.Header, Topic + 'Menu header displayed in generated menu');
Form.AddPipe ('P', ' Menu Prompt' , 9, 18, 24, 18, 13, 50, 160, @Menu.Info.Footer, Topic + 'Menu prompt displayed in generated menu');
Form.AddByte ('X', ' X' , 19, 19, 24, 19, 3, 2, 0, 80, @Menu.Info.DoneX, Topic + 'Locate to X coordinate after lightbar menu');

View File

@ -132,7 +132,7 @@ Begin
Form.AddWord ('C', ' Password Change', 18, 9, 37, 9, 17, 5, 0, 65535, @Config.PWChange, Topic + 'Days before forcing PW change (0/Disabled)');
Form.AddBol ('I', ' Password Inquiry', 17, 10, 37, 10, 18, 3, @Config.PWInquiry, Topic + 'Allow password inquiry e-mails?');
Form.AddByte ('W', ' Password Attempts', 16, 11, 37, 11, 19, 2, 1, 99, @Config.PWAttempts, Topic + 'Max Password attempts');
Form.AddTog ('O', ' Start Code Page', 18, 12, 37, 12, 17, 5, 0, 1, 'CP437 UTF-8', @Config.StartCodePage, Topic + 'Logging in user''s code page');
Form.AddBol ('U', ' Use Matrix Login', 17, 13, 37, 13, 18, 3, @Config.UseMatrix, Topic + 'Use Matrix login menu?');
Form.AddStr ('M', ' Matrix Menu', 22, 14, 37, 14, 13, 20, 20, @Config.MatrixMenu, Topic + 'Matrix menu file name');
Form.AddPass ('P', ' Matrix Password', 18, 15, 37, 15, 17, 15, 15, @Config.MatrixPW, Topic + 'Matrix password to login (Blank/Disabled)');

View File

@ -150,6 +150,7 @@ Begin
Form.AddBol ('X', ' Msg Index' , 7, 11, 23, 11, 14, 3, @U.UseLBIndex, Topic + 'Start reading at message index');
Form.AddBol ('I', ' Mail Index' , 7, 12, 23, 12, 14, 3, @U.UseLBMIdx, Topic + 'Start reading email at message index');
Form.AddTog ('N', ' Node Chat' , 7, 13, 23, 13, 14, 8, 0, 1, 'Standard Full', @U.UseFullChat, Topic + 'User''s node chat type');
Form.AddTog ('C', ' Code Page' , 7, 14, 23, 14, 14, 5, 0, 1, 'CP437 UTF-8', @U.CodePage, Topic + 'User''s character translation');
End;
4 : Begin
Form.Clear;

View File

@ -1646,7 +1646,7 @@ End;
Procedure TFileBase.FileGroupChange (Ops: String; FirstBase, Intro: Boolean);
Var
A : Word;
Count : Word;
Total : Word;
tGroup : recGroup;
tFBase : RecFileBase;
@ -1659,16 +1659,16 @@ Begin
If (Ops = '+') or (Ops = '-') Then Begin
Reset (FGroupFile);
A := Session.User.ThisUser.LastFGroup - 1;
Count := Session.User.ThisUser.LastFGroup - 1;
Repeat
Case Ops[1] of
'+' : Inc(A);
'-' : Dec(A);
'+' : Inc(Count);
'-' : Dec(Count);
End;
{$I-}
Seek (FGroupFile, A);
Seek (FGroupFile, Count);
Read (FGroupFile, FGroup);
{$I+}
@ -1771,9 +1771,11 @@ Begin
Else Begin
Session.io.OutFull (Session.GetPrompt(217));
A := strS2I(Session.io.GetInput(4, 4, 11, ''));
Session.io.OneKeyRange(#13 + 'Q', 1, Total);
If (A > 0) and (A <= Total) Then Begin
Count := Session.io.RangeValue;
If (Count > 0) and (Count <= Total) Then Begin
Total := 0;
Reset (FGroupFile);
@ -1781,7 +1783,7 @@ Begin
Repeat
Read (FGroupFile, FGroup);
If Not FGroup.Hidden And Session.User.Access(FGroup.ACS) Then Inc(Total);
If A = Total Then Break;
If Count = Total Then Break;
Until False;
Session.User.ThisUser.LastFGroup := FilePos(FGroupFile);
@ -1858,7 +1860,6 @@ Var
A : Word;
Total : Word;
Old : RecFileBase;
Str : String[5];
Compress : Boolean;
Begin
Old := FBase;
@ -1929,16 +1930,17 @@ Begin
Repeat
Session.io.OutFull (Session.GetPrompt(36));
Str := Session.io.GetInput(5, 5, 12, '');
If Str = '?' Then Begin
Compress := Config.FCompress;
Total := ListFileAreas(Compress);
End Else
Case Session.io.OneKeyRange(#13 + '?Q', 1, Total) of
'?': Begin
Compress := Config.FCompress;
Total := ListFileAreas(Compress);
End;
Else
Break;
End;
Until False;
A := strS2I(Str);
A := Session.io.RangeValue;
If (A > 0) and (A <= Total) Then Begin
Reset (FBaseFile);
@ -2611,11 +2613,75 @@ Var
Procedure Ascii_List;
Var
A : LongInt;
B : LongInt;
okSave : Byte;
Keys : String[20];
Files : Cardinal;
Procedure FlagFile (Number: Integer);
Var
Count1 : Integer;
Count2 : Integer;
Begin
If Not Session.User.Access(FBase.DLACS) Then
Session.io.OutFullLn (Session.GetPrompt(224))
Else Begin
If BatchNum = mysMaxBatchQueue Then Begin
Session.io.OutFullLn (Session.GetPrompt(46));
Exit;
End;
If (Number < 1) or (Number > ListSize) Then Exit;
okSave := 0;
Seek (FDirFile, List[Number].RecPos);
Read (FDirFile, FDir);
For Count1 := 1 to BatchNum Do
If FDir.FileName = Batch[Count1].FileName Then Begin
Session.io.PromptInfo[1] := FDir.FileName;
Session.io.PromptInfo[2] := strComma(Batch[Count1].Size);
Session.io.OutFullLn (Session.GetPrompt(54));
For Count2 := Count1 to BatchNum Do
Batch[Count2] := Batch[Count2 + 1];
Dec (BatchNum);
okSave := 2;
End;
If okSave = 0 Then
Case CheckFileLimits(1, FDir.Size DIV 1024) of
0 : okSave := 1;
1 : Session.io.OutFullLn (Session.GetPrompt(224));
2 : Session.io.OutFullLn (Session.GetPrompt(58));
3 : Session.io.OutFullLn (Session.GetPrompt(211));
End;
If okSave = 1 Then Begin
Session.io.PromptInfo[1] := FDir.FileName;
Session.io.PromptInfo[2] := strComma(FDir.Size);
Session.io.OutFullLn (Session.GetPrompt(50));
Inc (BatchNum);
Batch[BatchNum].FileName := FDir.FileName;
Batch[BatchNum].Size := FDir.Size;
If Mode = 1 Then
Batch[BatchNum].Area := Session.User.ThisUser.LastFBase
Else
Batch[BatchNum].Area := FilePos(FBaseFile);
End;
End;
End;
Begin
ListType := 0;
Files := FileSize(FDirFile);
strListFormat := Session.GetPrompt(42);
strDesc := Session.GetPrompt(43);
@ -2634,9 +2700,17 @@ Var
If Session.User.Access(FBase.SysopACS) Then Keys := Keys + 'E';
Repeat
Session.io.PromptInfo[1] := strI2S(Files);
Session.io.PromptInfo[2] := strI2S(BotPage);
Session.io.OutFull (Session.GetPrompt(44));
Case Session.io.OneKey(Keys, True) of
Case Session.io.OneKeyRange(Keys, 1, ListSize) of
#00 : Begin
FlagFile(Session.io.RangeValue);
DrawPage;
Continue;
End;
'E' : Begin
DoEditor;
DrawPage;
@ -2663,7 +2737,9 @@ Var
'V' : Begin
Session.io.OutFull (Session.GetPrompt(358));
A := strS2I(Session.io.GetInput(2, 2, 12, ''));
Session.io.OneKeyRange('Q' + #13, 1, ListSize);
A := Session.io.RangeValue;
If (A > 0) and (A <= ListSize) Then
If Not ArchiveView (FBase.Path + List[A].FileName) Then
@ -2671,67 +2747,19 @@ Var
DrawPage;
End;
'F' : If Not Session.User.Access(FBase.DLACS) Then
Session.io.OutFullLn (Session.GetPrompt(224))
Else Begin
'F' : Begin
Repeat
If BatchNum = mysMaxBatchQueue Then Begin
Session.io.OutFullLn (Session.GetPrompt(46));
Break;
End;
Session.io.OutFull (Session.GetPrompt(357));
A := strS2I(Session.io.GetInput(2, 2, 12, ''));
If (A < 1) or (A > ListSize) Then Break;
okSave := 0;
Seek (FDirFile, List[A].RecPos);
Read (FDirFile, FDir);
For A := 1 to BatchNum Do
If FDir.FileName = Batch[A].FileName Then Begin
Session.io.PromptInfo[1] := FDir.FileName;
Session.io.PromptInfo[2] := strComma(Batch[A].Size);
Session.io.OutFullLn (Session.GetPrompt(54));
For B := A to BatchNum Do
Batch[B] := Batch[B + 1];
Dec (BatchNum);
okSave := 2;
End;
If okSave = 0 Then
Case CheckFileLimits(1, FDir.Size DIV 1024) of
0 : okSave := 1;
1 : Session.io.OutFullLn (Session.GetPrompt(224));
2 : Session.io.OutFullLn (Session.GetPrompt(58));
3 : Session.io.OutFullLn (Session.GetPrompt(211));
End;
If okSave = 1 Then Begin
Session.io.PromptInfo[1] := FDir.FileName;
Session.io.PromptInfo[2] := strComma(FDir.Size);
Session.io.OutFullLn (Session.GetPrompt(50));
Inc (BatchNum);
Batch[BatchNum].FileName := FDir.FileName;
Batch[BatchNum].Size := FDir.Size;
If Mode = 1 Then
Batch[BatchNum].Area := Session.User.ThisUser.LastFBase
Else
Batch[BatchNum].Area := FilePos(FBaseFile);
Case Session.io.OneKeyRange('Q' + #13, 1, ListSize) of
#00 : FlagFile(Session.io.RangeValue);
'Q',
#13 : Break;
End;
Until False;
Until False;
DrawPage;
End;
DrawPage;
End;
End;
Until False;

View File

@ -4,7 +4,7 @@ Unit BBS_IO;
Interface
{.$DEFINE UTF8}
{.$DEFINE USEUTF8}
Uses
{$IFDEF WINDOWS}
@ -122,56 +122,7 @@ Uses
bbs_General,
bbs_NodeInfo;
Constructor TBBSIO.Create (Var Owner: Pointer);
Begin
Core := Owner;
FmtString := False;
FmtLen := 0;
FmtType := 0;
InMacro := False;
InMacroPos := 0;
InMacroStr := '';
AllowPause := False;
AllowMCI := True;
LocalInput := False;
AllowArrow := False;
IsArrow := False;
UseInField := True;
UseInLimit := False;
UseInSize := False;
InLimit := 0;
InSize := 0;
NoFile := False;
Graphics := 1;
PausePtr := 1;
LastMCIValue := '';
InputPos := 0;
GetKeyCallBack := NIL;
FillChar(OutBuffer, SizeOf(OutBuffer), 0);
OutBufPos := 0;
{$IFDEF WINDOWS}
If Not TBBSCore(Core).LocalMode Then
SocketEvent := WSACreateEvent;
{$ENDIF}
Term := TTermAnsi.Create(Screen);
End;
Destructor TBBSIO.Destroy;
Begin
{$IFDEF WINDOWS}
If Not TBBSCore(Core).LocalMode Then WSACloseEvent(SocketEvent);
{$ENDIF}
Term.Free;
Inherited Destroy;
End;
{$IFDEF UTF8}
{$IFDEF USEUTF8}
Function UTF8Encode(Ch : LongInt) : String;
Const
CP437_Map : Array[0..255] of LongInt = (
@ -245,10 +196,59 @@ Begin
Result := ' ';
End;
{$ENDIF}
Constructor TBBSIO.Create (Var Owner: Pointer);
Begin
Core := Owner;
FmtString := False;
FmtLen := 0;
FmtType := 0;
InMacro := False;
InMacroPos := 0;
InMacroStr := '';
AllowPause := False;
AllowMCI := True;
LocalInput := False;
AllowArrow := False;
IsArrow := False;
UseInField := True;
UseInLimit := False;
UseInSize := False;
InLimit := 0;
InSize := 0;
NoFile := False;
Graphics := 1;
PausePtr := 1;
LastMCIValue := '';
InputPos := 0;
GetKeyCallBack := NIL;
FillChar(OutBuffer, SizeOf(OutBuffer), 0);
OutBufPos := 0;
{$IFDEF WINDOWS}
If Not TBBSCore(Core).LocalMode Then
SocketEvent := WSACreateEvent;
{$ENDIF}
Term := TTermAnsi.Create(Screen);
End;
Destructor TBBSIO.Destroy;
Begin
{$IFDEF WINDOWS}
If Not TBBSCore(Core).LocalMode Then WSACloseEvent(SocketEvent);
{$ENDIF}
Term.Free;
Inherited Destroy;
End;
{$IFDEF USEUTF8}
Procedure TBBSIO.BufAddChar (Ch: Char);
Const
ConvertUTF8 : Boolean = True;
Var
S : String;
C : Byte;
@ -257,7 +257,7 @@ Begin
Term.Process(Ch);
{$ENDIF}
If ConvertUTF8 Then Begin
If Session.User.ThisUser.CodePage = 1 Then Begin
S := UTF8Encode(LongInt(Ch));
For C := 1 to Length(S) Do Begin
@ -286,13 +286,13 @@ End;
{$ELSE}
Procedure TBBSIO.BufAddChar (Ch: Char);
Begin
Term.Process(Ch);
OutBuffer[OutBufPos] := Ch;
Inc (OutBufPos);
If OutBufPos = TBBSIOBufferSize Then BufFlush;
Term.Process(Ch);
End;
{$ENDIF}
@ -1622,14 +1622,24 @@ Function TBBSIO.OneKeyRange (Str: String; Lo, Hi: LongInt) : Char;
Var
Ch : Char;
CurStr : String = '';
LoStr : String[10];
HiStr : String[10];
Field : Byte;
xPos : Byte;
Begin
PurgeInputBuffer;
RangeValue := -1;
LoStr := strI2S(Lo);
HiStr := strI2S(Hi);
Field := Length(strI2S(Hi));
xPos := Screen.CursorX;
If UseInField and (Graphics = 1) Then Begin
AnsiColor (TBBSCore(Core).Theme.FieldColor2);
BufAddStr (strRep(Session.Theme.FieldChar, Field));
AnsiColor (TBBSCore(Core).Theme.FieldColor1);
AnsiMoveX (xPos);
End Else
UseInField := False;
Repeat
Ch := UpCase(GetKey);
@ -1637,39 +1647,46 @@ Begin
If (Pos(Ch, Str) > 0) and (CurStr = '') Then Begin
Result := Ch;
OutRawLn(Ch);
OutRaw(Ch);
Exit;
Break
End Else
Case Ch of
#08 : If CurStr <> '' Then Begin
Dec (CurStr[0]);
OutRaw (#08#32#08);
If UseInField Then AnsiColor(TBBSCore(Core).Theme.FieldColor2);
BufAddStr (#8 + Session.Theme.FieldChar + #8);
If UseInField Then AnsiColor(TBBSCore(Core).Theme.FieldColor1);
End;
#13 : If CurStr <> '' Then Begin
RangeValue := strS2I(CurStr);
Result := #0;
OutRawLn('');
Exit;
Break;
End Else
If Pos(#13, Str) > 0 Then Begin
Result := #13;
Break;
End;
'0'..
'9' : If (strS2I(CurStr + Ch) >= Lo) and (strS2I(CurStr + Ch) <= Hi) Then Begin
CurStr := CurStr + Ch;
If Length(CurStr) = Length(HiStr) Then Begin
OutRawLn(Ch);
OutRaw(Ch);
RangeValue := strS2I(CurStr);
Result := #0;
Exit;
Break;
End Else
OutRaw (Ch);
End;
End;
Until False;
OutFullLn ('|16');
End;
Function TBBSIO.GetInput (Field, Max, Mode: Byte; Default: String) : String;

View File

@ -39,9 +39,10 @@ Type
Function SpecialKey (Str: String) : Boolean;
Function MenuGetKey : Char;
Function ShowMenu : Boolean;
Procedure GenerateMenu;
Procedure GenerateMenu (Cols: Integer; Cmd: Boolean);
Procedure DoStandardMenu;
Procedure DoLightBarMenu;
Procedure DoLBPromptMenu;
End;
Implementation
@ -139,6 +140,7 @@ Begin
'-' : Case Cmd[2] of
'D' : ToggleAccessFlags(CmdData, Session.User.ThisUser.AF2);
'F' : ToggleAccessFlags(CmdData, Session.User.ThisUser.AF1);
'G' : GenerateMenu(strS2I(CmdData), True);
'I' : TimerCount := strS2I(CmdData);
'N' : Session.User.AcsOkFlag := Session.io.GetYN(CmdData, False);
'P' : Session.User.AcsOkFlag := Session.io.GetPW(Copy(CmdData, 1, Pos(';', CmdData) - 1), Session.GetPrompt(417),
@ -433,7 +435,7 @@ Begin
(Str = 'TIMER');
End;
Procedure TMenuEngine.GenerateMenu;
Procedure TMenuEngine.GenerateMenu (Cols: Integer; Cmd: Boolean);
Var
Format : Byte;
Listed : Word;
@ -445,8 +447,11 @@ Begin
Data.Item[Count]^.TimerShow := True;
End;
If ShowMenu Then Begin
Case Data.Info.DispCols of
If (Cols < 0) or (Cols > 4) Then
Cols := Data.Info.DispCols;
If ShowMenu And (Cols > 0) Then Begin
Case Cols of
1 : Format := 79;
2 : Format := 39;
3 : Format := 26;
@ -467,11 +472,11 @@ Begin
Then Continue;
If Data.Item[Count]^.HotKey = 'LINEFEED' Then Begin
If Listed MOD Data.Info.DispCols <> 0 Then Session.io.OutRawLn('');
If Listed MOD Cols <> 0 Then Session.io.OutRawLn('');
Session.io.OutFullLn(Data.Item[Count]^.Text);
While Listed Mod Data.Info.DispCols <> 0 Do Inc(Listed);
While Listed Mod Cols <> 0 Do Inc(Listed);
End Else Begin
Inc (Listed);
@ -483,21 +488,23 @@ Begin
While Screen.CursorX < Format Do
Session.io.BufAddChar(' ');
If Listed MOD Data.Info.DispCols = 0 Then
If Listed MOD Cols = 0 Then
TBBSCore(Owner).io.OutFullLn ('');
End;
End;
If Listed MOD Data.Info.DispCols <> 0 Then
If Listed MOD Cols <> 0 Then
TBBSCore(Owner).io.OutFullLn ('');
TBBSCore(Owner).io.BufFlush;
End;
If ExecuteByHotKey('AFTER', 0) = 2 Then Exit;
If Not Cmd Then Begin
If ExecuteByHotKey('AFTER', 0) = 2 Then Exit;
If Data.Info.Footer <> '' Then
TBBSCore(Owner).io.OutFull(Data.Info.Footer);
If Data.Info.Footer <> '' Then
TBBSCore(Owner).io.OutFull(Data.Info.Footer);
End;
TBBSCore(Owner).io.BufFlush;
End;
@ -542,7 +549,7 @@ Begin
If Not ViewOnly Then
If ExecuteByHotKey('EVERY', 0) = 2 Then Exit;
If ReDraw Then GenerateMenu;
If ReDraw Then GenerateMenu(-1, False);
TBBSCore(Owner).io.AllowArrow := True;
@ -626,6 +633,226 @@ Begin
End;
End;
Procedure TMenuEngine.DoLBPromptMenu;
Var
CurItem : Word = 0;
ItemX : Byte = 1;
ItemY : Byte = 1;
MaxLBSize : Byte = 1;
MaxDESize : Byte = 1;
Procedure FindNextItem;
Var
SavedItem : Integer;
Wrapped : Boolean = False;
Begin
SavedItem := CurItem;
Repeat
Inc (CurItem);
If (CurItem = SavedItem) and Wrapped Then
Break
Else
If (CurItem > Data.NumItems) Then Begin
CurItem := 1;
If Wrapped Then Break;
CurItem := 1;
Wrapped := True;
End;
If Not SpecialKey(Data.Item[CurItem]^.HotKey) Then
If TBBSCore(Owner).User.Access(Data.Item[CurItem]^.Access) Then Break;
Until False;
End;
Procedure FindPrevItem;
Var
SavedItem : Integer;
Wrapped : Boolean = False;
Begin
SavedItem := CurItem;
Repeat
Dec (CurItem);
If (CurItem = SavedItem) and Wrapped Then
Break
Else
If (CurItem < 1) Then Begin
CurItem := Data.NumItems;
If Wrapped Then Break;
CurItem := Data.NumItems;
Wrapped := True;
End;
If Not SpecialKey(Data.Item[CurItem]^.HotKey) Then
If TBBSCore(Owner).User.Access(Data.Item[CurItem]^.Access) Then Break;
Until False;
End;
Function FindByKey (Str: String) : Boolean;
Var
SavedItem : Integer;
Wrapped : Boolean = False;
Begin
SavedItem := CurItem;
Result := False;
Repeat
Inc (CurItem);
If (CurItem = SavedItem) and Wrapped Then
Break
Else
If (CurItem > Data.NumItems) Then Begin
CurItem := 1;
If Wrapped Then Begin
CurItem := SavedItem;
Break;
End;
CurItem := 1;
Wrapped := True;
End;
If (Length(Data.Item[CurItem]^.HotKey) >= Length(Str)) And (strUpper(Copy(Data.Item[CurItem]^.HotKey, 1, Length(Str))) = Str) And Not SpecialKey(Data.Item[CurItem]^.HotKey) And TBBSCore(Owner).User.Access(Data.Item[CurItem]^.Access) Then Begin
Result := True;
Break;
End;
Until False;
If (Length(Data.Item[CurItem]^.HotKey) >= Length(Str)) And (strUpper(Copy(Data.Item[CurItem]^.HotKey, 1, Length(Str))) = Str) And Not SpecialKey(Data.Item[CurItem]^.HotKey) And TBBSCore(Owner).User.Access(Data.Item[CurItem]^.Access) Then
Result := True;
End;
Procedure DrawItem;
Begin
If ItemY >= Session.User.ThisUser.ScreenSize {24} Then Begin
Session.io.OutRawLn('');
//ItemY := Session.User.ThisUser.ScreenSize - 1;
Dec (ItemY);
End;
If Data.Item[CurItem]^.TextLo <> '' Then Begin
IF Data.Item[CurItem]^.X <> 0 Then
Session.io.AnsiGotoXY (Data.Item[CurItem]^.X, ItemY + 1)
Else
Session.io.AnsiGotoXY (ItemX, ItemY + 1);
Session.io.OutFull(Data.Item[CurItem]^.TextLo);
If Screen.CursorX > MaxDESize Then
MaxDESize := Screen.CursorX;
While Screen.CursorX < MaxDESize Do
Session.io.OutRaw(' ');
End;
Session.io.AnsiGotoXY (ItemX, ItemY);
Session.io.OutFull (Data.Item[CurItem]^.TextHi);
If Screen.CursorX > MaxLBSize Then
MaxLBSize := Screen.CursorX;
While Screen.CursorX < MaxLBSize Do
Session.io.OutRaw(' ');
End;
Var
HotKey : String;
Ch : Char;
Begin
While Not TBBSCore(Owner).ShutDown Do Begin
If Not ViewOnly Then
If ExecuteByHotKey('EVERY', 0) = 2 Then Exit;
If ReDraw Then GenerateMenu(-1, False);
ItemX := Screen.CursorX;
ItemY := Screen.CursorY;
TBBSCore(Owner).io.AllowArrow := True;
If SetAction Then
If Data.Info.NodeStatus <> '' Then
Set_Node_Action(Data.Info.NodeStatus)
Else
Set_Node_Action(TBBSCore(Owner).GetPrompt(346));
HotKey := '';
If CurItem = 0 Then FindNextItem;
DrawItem;
While Not TBBSCore(Owner).ShutDown Do Begin
Ch := MenuGetKey;
If TBBSCore(Owner).ShutDown Then Exit;
If UseTimer And (Ch = #02) Then Begin
If TimerReload Then Exit;
If ReDraw Then Break;
End;
If Session.io.IsArrow Then Begin
Case Ch of
#72,
#75 : Begin
FindPrevItem;
DrawItem;
End;
#77,
#80 : Begin
FindNextItem;
DrawItem;
End;
End;
End Else Begin
Case Ch of
#13 : Begin
HotKey := Data.Item[CurItem]^.HotKey;
Break;
End;
#32..
#126: Begin
HotKey := HotKey + UpCase(Ch);
If Not FindByKey(HotKey) Then Begin
HotKey := UpCase(Ch);
If Not FindByKey(HotKey) Then
HotKey := '';
End;
DrawItem;
If (HotKey <> '') And (HotKey = Data.Item[CurItem]^.HotKey) And UseHotKeys Then
Break;
End;
End;
End;
End;
Session.io.OutFullLn('|CR');
If ViewOnly Then Exit;
If Not TBBSCore(Owner).ShutDown Then
If ExecuteByHotKey(HotKey, 0) = 2 Then
Exit;
End;
End;
Function TMenuEngine.MenuGetKey : Char;
Var
LastSec : LongInt;
@ -1034,6 +1261,10 @@ Begin
DoLightBarMenu
Else
DoStandardMenu;
3 : If TBBSCore(Owner).io.Graphics > 0 Then
DoLBPromptMenu
Else
DoStandardMenu;
End;
Exit;
@ -1099,6 +1330,10 @@ Begin
DoLightBarMenu
Else
DoStandardMenu;
3 : If TBBSCore(Owner).io.Graphics > 0 Then
DoLBPromptMenu
Else
DoStandardMenu;
End;
End;

View File

@ -388,7 +388,6 @@ Var
Count : LongInt;
Total : Word;
Old : RecMessageBase;
Str : String[5];
Compress : Boolean;
Begin
Compress := Config.MCompress;
@ -471,16 +470,17 @@ Begin
Repeat
Session.io.OutFull (Session.GetPrompt(102));
Str := Session.io.GetInput(5, 5, 12, '');
If Str = '?' Then Begin
Compress := Config.MCompress;
Total := ListAreas(Compress);
End Else
Case Session.io.OneKeyRange(#13 + '?Q', 1, Total) of
'?': Begin
Compress := Config.MCompress;
Total := ListAreas(Compress);
End;
Else
Break;
End;
Until False;
Count := strS2I(Str);
Count := Session.io.RangeValue;
If (Count > 0) and (Count <= Total) Then Begin
Reset (MBaseFile);
@ -671,7 +671,7 @@ End;
Procedure TMsgBase.MessageGroupChange (Ops : String; FirstBase, Intro : Boolean);
Var
A : Word;
Count : Word;
Total : Word;
tGroup : RecGroup;
tMBase : RecMessageBase;
@ -684,16 +684,16 @@ Begin
If (Ops = '+') or (Ops = '-') Then Begin
Reset (GroupFile);
A := Session.User.ThisUser.LastMGroup - 1;
Count := Session.User.ThisUser.LastMGroup - 1;
Repeat
Case Ops[1] of
'+' : Inc(A);
'-' : Dec(A);
'+' : Inc(Count);
'-' : Dec(Count);
End;
{$I-}
Seek (GroupFile, A);
Seek (GroupFile, Count);
Read (GroupFile, Group);
{$I+}
@ -731,7 +731,7 @@ Begin
Exit;
End;
Seek (GroupFile, Data-1);
Seek (GroupFile, Data - 1);
Read (GroupFile, Group);
If Session.User.Access(Group.ACS) Then Begin
@ -804,9 +804,11 @@ Begin
Else Begin
Session.io.OutFull (Session.GetPrompt(177));
A := strS2I(Session.io.GetInput(5, 5, 11, ''));
Session.io.OneKeyRange(#13 + 'Q', 1, Total);
If (A > 0) and (A <= Total) Then Begin
Count := Session.io.RangeValue;
If (Count > 0) and (Count <= Total) Then Begin
Total := 0;
Reset (GroupFile);
@ -816,7 +818,7 @@ Begin
If Not Group.Hidden And Session.User.Access(Group.ACS) Then Inc(Total);
If A = Total Then Break;
If Count = Total Then Break;
Until False;
Session.User.ThisUser.LastMGroup := FilePos(GroupFile);
@ -2253,7 +2255,7 @@ Var
'L' : Begin
Session.io.PausePtr := 1;
Session.io.AllowPause := True;
A := MsgBase^.GetMsgNum;
A := MsgBase^.GetMsgNum;
Session.io.OutFullLn(Session.GetPrompt(411));
@ -2273,6 +2275,9 @@ Var
MsgBase^.SeekFirst(A);
MsgBase^.MsgStartup;
Session.io.PromptInfo[1] := strI2S(MsgBase^.GetMsgNum);
Session.io.PromptInfo[2] := strI2S(MsgBase^.GetHighMsgNum);
End;
'M' : Begin
If MoveMessage(False) Then
@ -2428,7 +2433,9 @@ Begin
Session.io.OutFull (Session.GetPrompt(338));
MsgNum := strS2I(Session.io.GetInput(6, 6, 12, ''));
Session.io.OneKeyRange(#13, 1, MsgBase^.GetHighMsgNum);
MsgNum := Session.io.RangeValue;
End;
Set_Node_Action (Session.GetPrompt(348));

View File

@ -125,7 +125,6 @@ Var
ToNode : Byte;
A, B, C : Byte;
Temp : ChatRec;
Str : String[3];
NodeMsgFile : File of NodeMsgRec;
NodeMsg : NodeMsgRec;
SkipCurrent : Boolean = False;
@ -133,11 +132,15 @@ Begin
If Data = '' Then Begin
Repeat
Session.io.OutFull (Session.GetPrompt(146));
Str := Session.io.GetInput(3, 3, 12, '');
If Str = '?' Then WhosOnline Else Break;
Case Session.io.OneKeyRange('?Q', 1, Config.INetTNNodes) of
#00 : Break;
'?' : WhosOnline;
'Q' : Break;
End;
Until False;
ToNode := strS2I(Str);
ToNode := Session.io.RangeValue;
If (ToNode < 0) or (ToNode > Config.INetTNNodes) Then Begin
Session.io.OutFullLn (Session.GetPrompt(147));
@ -290,4 +293,4 @@ Begin
Session.InMessage := False;
End;
End.
End.

View File

@ -108,6 +108,7 @@ Begin
ThisUser.LastMGroup := Config.StartMGroup;
ThisUser.UseLBQuote := True;
ThisUser.UseFulLChat := True;
ThisUser.CodePage := Config.StartCodePage;
IgnoreGroup := False;
InChat := False;
@ -1193,11 +1194,11 @@ Begin
Halt(0);
End;
// Session.io.AnsiClear;
// Session.io.OutFullLn('|CR' + strPadC(mysSoftwareID + ' BBS v' + mysVersion + ' [' + OSID + '] : Node |ND', 79, ' '));
// Session.io.OutFullLn(strPadC(CopyID, 79, ' '));
//Session.io.OutFullLn('|CL|CR' + strPadC(mysSoftwareID + ' BBS Version ' + mysVersion + ' for ' + OSID, 79, ' '));
//Session.io.OutFullLn(strPadC(CopyID, 79, ' '));
//Session.io.OutFullLn('|CR' + strPadC(mysWebSite, 79, ' '));
Session.io.OutFullLn ('|CL' + mysSoftwareID + ' BBS v' + mysVersion + ' [' + OSID + '] : Node |ND');
Session.io.OutFullLn ('|CL' + mysSoftwareID + ' BBS Version ' + mysVersion + ' for ' + OSID + ' : Node |ND');
Session.io.OutFullLn (CopyID);
If Config.DefTermMode = 0 Then

View File

@ -19,7 +19,6 @@ Uses
Procedure PageUserForChat;
Var
Str : String;
ToNode : Byte;
ReqType : Byte = 8;
TempChat : ChatRec;
@ -27,13 +26,14 @@ Begin
Repeat
Session.io.OutFull (Session.GetPrompt(479));
Str := Session.io.GetInput(3, 3, 12, '');
If Str = '?' Then WhosOnline Else
If Str = 'Q' Then Exit Else Break;
Case Session.io.OneKeyRange('Q?', 1, Config.INetTNNodes) of
#00 : Break;
'Q' : Exit;
'?' : WhosOnline;
End;
Until False;
ToNode := strS2I(Str);
ToNode := Session.io.RangeValue;
If (Not GetChatRecord(ToNode, TempChat)) or (ToNode = Session.NodeNum) or
(Not TempChat.Active) or (Not TempChat.Available) Then Begin

View File

@ -107,6 +107,7 @@
; &1 = size, &2 = date, &3 = DLs, &4 = desc, &5 = uploader
043 |07|$D29 |&4
; File listing pause prompt
; &1 = total files &1 = current file
044 |CR|01[|10þ|01] |09Pause: |01(|07N|01)|09ext, |01(|07P|01)|09rev, |01(|07F|01)|09lag, |01(|07V|01)|09iew, or |01(|07Q|01)|09uit? |07
; Standard file list, ext desc: &4 = description
045 |07|$D29 |&4

View File

@ -1,5 +1,5 @@
// ====================================================================
// Mystic BBS Software Copyright 1997-2012 By James Coyle
// Mystic BBS Software Copyright 1997-2013 By James Coyle
// ====================================================================
//
// This file is part of Mystic BBS.

View File

@ -1,5 +1,5 @@
// ====================================================================
// Mystic BBS Software Copyright 1997-2012 By James Coyle
// Mystic BBS Software Copyright 1997-2013 By James Coyle
// ====================================================================
//
// This file is part of Mystic BBS.

View File

@ -1,5 +1,5 @@
// ====================================================================
// Mystic BBS Software Copyright 1997-2012 By James Coyle
// Mystic BBS Software Copyright 1997-2013 By James Coyle
// ====================================================================
//
// This file is part of Mystic BBS.

View File

@ -1,7 +1,7 @@
Program MUTIL;
// ====================================================================
// Mystic BBS Software Copyright 1997-2012 By James Coyle
// Mystic BBS Software Copyright 1997-2013 By James Coyle
// ====================================================================
//
// This file is part of Mystic BBS.

View File

@ -1,5 +1,5 @@
// ====================================================================
// Mystic BBS Software Copyright 1997-2012 By James Coyle
// Mystic BBS Software Copyright 1997-2013 By James Coyle
// ====================================================================
//
// This file is part of Mystic BBS.

View File

@ -1,5 +1,5 @@
// ====================================================================
// Mystic BBS Software Copyright 1997-2012 By James Coyle
// Mystic BBS Software Copyright 1997-2013 By James Coyle
// ====================================================================
//
// This file is part of Mystic BBS.

View File

@ -1,6 +1,6 @@
{
===========================================================================
Mystic BBS Software Copyright (C) 1997-2012 By James Coyle
Mystic BBS Software Copyright (C) 1997-2013 By James Coyle
===========================================================================
File | RECORDS.PAS
Desc | This file holds the data file records for all data files used
@ -22,8 +22,9 @@
Const
mysSoftwareID = 'Mystic'; // no idea
mysCopyYear = '1997-2012'; // its been a long time!
mysVersion = '1.10 A25'; // current version
mysCopyYear = '1997-2013'; // its been a long time!
mysWebsite = 'sourceforge.net/projects/mysticbbs';
mysVersion = '1.10 A26'; // current version
mysDataChanged = '1.10 A11'; // version of last records change
{$IFDEF WIN32}
@ -278,7 +279,8 @@ Type
// UNSORTED
inetTNHidden : Boolean;
ThemeOnStart : Boolean;
Reserved : Array[1..844] of Char;
StartCodePage : Byte;
Reserved : Array[1..843] of Char;
End;
Const
@ -357,7 +359,8 @@ Type
UseFullChat : Boolean; { use full screen teleconference }
Credits : LongInt;
Protocol : Char;
Reserved : Array[1..389] of Byte;
CodePage : Byte; // 0 = CP437, 1 = UTF8
Reserved : Array[1..388] of Byte;
End;
// day of week

View File

@ -2431,3 +2431,90 @@
a message number on the prompt to automatically jump to that message.
<ALPHA 25 RELEASED>
! After doing a list of message in the standard message reader, the
current message number on the prompt will no longer show the wrong
message number.
+ Added two MCI codes to prompt #44: &1 total files in base &2 last listed
file number.
+ In a standard generated menu you can now set the "display columns" to
zero which will cause the generated menu to only show the menu prompt.
+ Added new menu command: -G. This command shows the currently loaded
internally generated menu. The optional data field will determine the
number of display columns to use to format the menu. The -G command does
not display the menu prompt or execute "EVERY" menu commands.
+ Added a new menu type that can be created in the menu editor. You can
now set a "Lightbar/Prompt" type menu, which will allow you to create
menus similar to the old Searchlight style with a lightbar prompt. Users
can scroll through commands with the arrow keys or also search by simply
typing in letters. Our version supports commands with hotkeys that
contain more than one character among other things that Searchlight
didn't do.
If the user has hotkeys enabled, or the menu forces hotkeys, the command
will be executed as soon as a match of a hotkey is inputted from the user.
If the user has hotkeys disabled, or the menu forces longkeys, then the
user will always have to press enter to execute the selected command.
Each menu item is created similar to a standard type menu, with the the
following changes:
1. The "Lightbar Hi" text contains the look of the selected lightbar
command. The location prompt will be generated where the cursor
is after the menu prompt is displayed.
2. The "Lightbar Lo" text contains the description that will be
displayed below the currently selected command. If this is blank
the extended description will not be used.
The description will automatically be aligned below the lightbar
command, unless the "X" value of the command is defined. If the X
is not equal to 0, Mystic will print the description at that X
column instead.
A new menu has been included with the default installation called
testlbprompt.mnu. Please use this to experiment with these types of
menus if it interests you.
+ The smart input used by the standard message base reader to jump between
messages now creates an input field according to the selected theme. You
can of course turn it off for specific prompts using the IF MCI code if
you don't like it.
+ The message base change command now uses the smart input function for
input while prompting to select a message base.
+ The message group change command now uses the smart input function for
input while prompting to select a message group.
+ The file base change command now uses the smart input function for input
while prompting to select a file base.
+ The file group change command now uses the smart input function for input
while prompting to select a file group.
+ Rewrote the file tagging system in the standard file listing. The old
way still works, by pressing F to flag a file. However, you can now
just type in the file number to add or remove a file from your batch
queue without every pressing the F key.
+ The F flag command now uses smart input when prompting for the file number
to add/remove from queue (in standard file listing)
+ The V view command now uses smart input when prompting for the file number
to view in the standard file listing.
+ Sending a node message will now use the smart input function when
prompting for the node number.
+ Paging a user for user/user chat now uses the smart input function.
+ When selecting "Forward" reading, Mystic now uses the smart input
function to prompt for the message start number.
<ALPHA 26 RELEASED>