Theme/prompt editor complete!
This commit is contained in:
parent
896d5478ca
commit
c7044c641f
|
@ -244,7 +244,9 @@ Begin
|
||||||
Str := Default;
|
Str := Default;
|
||||||
StrPos := Length(Str) + 1;
|
StrPos := Length(Str) + 1;
|
||||||
Junk := Length(Str) - Field + 1;
|
Junk := Length(Str) - Field + 1;
|
||||||
|
|
||||||
If Junk < 1 Then Junk := 1;
|
If Junk < 1 Then Junk := 1;
|
||||||
|
|
||||||
CurPos := StrPos - Junk + 1;
|
CurPos := StrPos - Junk + 1;
|
||||||
|
|
||||||
Console.CursorXY (X, Y);
|
Console.CursorXY (X, Y);
|
||||||
|
@ -254,9 +256,11 @@ Begin
|
||||||
|
|
||||||
Repeat
|
Repeat
|
||||||
Ch := Key.ReadKey;
|
Ch := Key.ReadKey;
|
||||||
|
|
||||||
Case Ch of
|
Case Ch of
|
||||||
#00 : Begin
|
#00 : Begin
|
||||||
Ch := Key.ReadKey;
|
Ch := Key.ReadKey;
|
||||||
|
|
||||||
Case Ch of
|
Case Ch of
|
||||||
#77 : If StrPos < Length(Str) + 1 Then Begin
|
#77 : If StrPos < Length(Str) + 1 Then Begin
|
||||||
If (CurPos = Field) and (StrPos < Length(Str)) Then ScrollRight;
|
If (CurPos = Field) and (StrPos < Length(Str)) Then ScrollRight;
|
||||||
|
|
|
@ -682,18 +682,20 @@ Begin
|
||||||
|
|
||||||
//If PosY > ScreenSize Then PosY := ScreenSize;
|
//If PosY > ScreenSize Then PosY := ScreenSize;
|
||||||
|
|
||||||
BufSize.Y := PosY - (Y - 1);
|
// If Active Then Begin
|
||||||
BufSize.X := Width;
|
BufSize.Y := PosY - (Y - 1);
|
||||||
BufCoord.X := 0;
|
BufSize.X := Width;
|
||||||
BufCoord.Y := 0;
|
BufCoord.X := 0;
|
||||||
Region.Left := X - 1;
|
BufCoord.Y := 0;
|
||||||
Region.Top := Y - 1;
|
Region.Left := X - 1;
|
||||||
Region.Right := Width - 1;
|
Region.Top := Y - 1;
|
||||||
Region.Bottom := PosY - 1;
|
Region.Right := Width - 1;
|
||||||
|
Region.Bottom := PosY - 1;
|
||||||
|
|
||||||
WriteConsoleOutput (ConOut, @Screen[1][1], BufSize, BufCoord, Region);
|
WriteConsoleOutput (ConOut, @Screen[1][1], BufSize, BufCoord, Region);
|
||||||
|
|
||||||
CursorXY(PosX, PosY);
|
CursorXY(PosX, PosY);
|
||||||
|
// End;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Function TOutputWindows.ReadCharXY (X, Y: Byte) : Char;
|
Function TOutputWindows.ReadCharXY (X, Y: Byte) : Char;
|
||||||
|
|
|
@ -94,18 +94,49 @@ Uses
|
||||||
|
|
||||||
Procedure WriteXY (X, Y, A: Byte; S: String);
|
Procedure WriteXY (X, Y, A: Byte; S: String);
|
||||||
Begin
|
Begin
|
||||||
Session.io.AnsiGotoXY(X, Y);
|
Session.io.AnsiGotoXY (X, Y);
|
||||||
Session.io.AnsiColor(A);
|
Session.io.AnsiColor (A);
|
||||||
Session.io.OutRaw(S);
|
Session.io.OutRaw (S);
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Procedure WriteXYPipe (X, Y, A, SZ: Byte; S: String);
|
Procedure WriteXYPipe (X, Y, A, SZ: Byte; S: String);
|
||||||
|
Var
|
||||||
|
Count : Byte;
|
||||||
|
Code : String[2];
|
||||||
Begin
|
Begin
|
||||||
Session.io.AnsiGotoXY(X, Y);
|
Session.io.AnsiGotoXY (X, Y);
|
||||||
Session.io.AnsiColor(A);
|
Session.io.AnsiColor (A);
|
||||||
Session.io.OutPipe(S);
|
|
||||||
|
|
||||||
While Screen.CursorX < SZ Do Session.io.BufAddChar(' ');
|
Count := 1;
|
||||||
|
|
||||||
|
While Count <= Length(S) Do Begin
|
||||||
|
If S[Count] = '|' Then Begin
|
||||||
|
Code := Copy(S, Count + 1, 2);
|
||||||
|
|
||||||
|
If (Code[1] in ['0'..'2']) and (Code[2] in ['0'..'9']) Then Begin
|
||||||
|
Inc (Count, 2);
|
||||||
|
|
||||||
|
Session.io.BufAddStr(Session.io.Pipe2Ansi(strS2I(Code)));
|
||||||
|
End Else Begin
|
||||||
|
Session.io.BufAddChar(S[Count]);
|
||||||
|
Dec (SZ);
|
||||||
|
End;
|
||||||
|
End Else Begin
|
||||||
|
Session.io.BufAddChar(S[Count]);
|
||||||
|
Dec (SZ);
|
||||||
|
End;
|
||||||
|
|
||||||
|
If SZ = 0 Then Break;
|
||||||
|
|
||||||
|
Inc (Count);
|
||||||
|
End;
|
||||||
|
|
||||||
|
While SZ > 0 Do Begin
|
||||||
|
Session.io.BufAddChar(' ');
|
||||||
|
Dec(SZ);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Session.io.BufFlush;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Function InXY (X, Y, Field, Max, Mode: Byte; Default: String) : String;
|
Function InXY (X, Y, Field, Max, Mode: Byte; Default: String) : String;
|
||||||
|
@ -189,7 +220,8 @@ Begin
|
||||||
Until False;
|
Until False;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
MsgBox.Close;
|
If BoxType < 2 Then MsgBox.Close;
|
||||||
|
|
||||||
MsgBox.Free;
|
MsgBox.Free;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
@ -556,6 +588,8 @@ Begin
|
||||||
|
|
||||||
Inc (A);
|
Inc (A);
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
Update;
|
||||||
End;
|
End;
|
||||||
Until False;
|
Until False;
|
||||||
End;
|
End;
|
||||||
|
|
|
@ -23,11 +23,11 @@ Type
|
||||||
Constructor Create;
|
Constructor Create;
|
||||||
Destructor Destroy; Override;
|
Destructor Destroy; Override;
|
||||||
|
|
||||||
Function GetStr (X, Y, Field, Len, Mode: Byte; Default: String) : String;
|
Function GetStr (X, Y, Field, Len, Mode: Byte; Default: String) : String;
|
||||||
Function GetNum (X, Y, Field, Len: Byte; Min, Max, Default: LongInt) : LongInt;
|
Function GetNum (X, Y, Field, Len: Byte; Min, Max, Default: LongInt) : LongInt;
|
||||||
Function GetChar (X, Y : Byte; Default: Char) : Char;
|
Function GetChar (X, Y : Byte; Default: Char) : Char;
|
||||||
Function GetEnter (X, Y, Len: Byte; Default : String) : Boolean;
|
Function GetEnter (X, Y, Len: Byte; Default : String) : Boolean;
|
||||||
Function GetYN (X, Y : Byte; Default: Boolean) : Boolean;
|
Function GetYN (X, Y : Byte; Default: Boolean) : Boolean;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Implementation
|
Implementation
|
||||||
|
@ -161,24 +161,191 @@ Begin
|
||||||
GetEnter := Res;
|
GetEnter := Res;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
// 0 = numbers only 1 = as typed 2 = all caps 3 = date input
|
||||||
Function TAnsiMenuInput.GetStr (X, Y, Field, Len, Mode : Byte; Default : String) : String;
|
Function TAnsiMenuInput.GetStr (X, Y, Field, Len, Mode : Byte; Default : String) : String;
|
||||||
{ mode options: }
|
|
||||||
{ 0 = numbers only }
|
|
||||||
{ 1 = as typed }
|
|
||||||
{ 2 = all caps }
|
|
||||||
{ 3 = date input }
|
|
||||||
Var
|
Var
|
||||||
Str : String;
|
Ch : Char;
|
||||||
Begin
|
Str : String;
|
||||||
Session.io.AnsiGotoXY(X, Y);
|
StrPos : Integer;
|
||||||
|
Junk : Integer;
|
||||||
|
CurPos : Integer;
|
||||||
|
|
||||||
Case Mode of
|
Procedure ReDraw;
|
||||||
0,
|
Var
|
||||||
1 : Str := Session.io.GetInput(Field, Len, 11, Default);
|
T : String;
|
||||||
2 : Str := Session.io.GetInput(Field, Len, 12, Default);
|
Begin
|
||||||
3 : Str := Session.io.GetInput(Field, Len, 15, Default);
|
T := Copy(Str, Junk, Field);
|
||||||
|
|
||||||
|
WriteXY (X, Y, Attr, T);
|
||||||
|
WriteXY (X + Length(T), Y, FillAttr, strRep(FillChar, Field - Length(T)));
|
||||||
|
|
||||||
|
Session.io.AnsiGotoXY (X + CurPos - 1, Screen.CursorY);
|
||||||
End;
|
End;
|
||||||
|
|
||||||
|
Procedure ReDrawPart;
|
||||||
|
Begin
|
||||||
|
Session.io.AnsiColor (Attr);
|
||||||
|
Session.io.BufAddStr (Copy(Str, StrPos, Field - CurPos + 1));
|
||||||
|
Session.io.AnsiColor (FillAttr);
|
||||||
|
Session.io.BufAddStr (strRep(FillChar, (Field - CurPos + 1) - Length(Copy(Str, StrPos, Field - CurPos + 1))));
|
||||||
|
Session.io.AnsiMoveX (X + CurPos - 1);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure ScrollRight;
|
||||||
|
Begin
|
||||||
|
Inc (Junk);
|
||||||
|
|
||||||
|
If Junk > Length(Str) Then Junk := Length(Str);
|
||||||
|
If Junk > Len then Junk := Len;
|
||||||
|
|
||||||
|
CurPos := StrPos - Junk + 1;
|
||||||
|
|
||||||
|
ReDraw;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure ScrollLeft;
|
||||||
|
Begin
|
||||||
|
If Junk > 1 Then Begin
|
||||||
|
Dec (Junk);
|
||||||
|
|
||||||
|
CurPos := StrPos - Junk + 1;
|
||||||
|
|
||||||
|
ReDraw;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure AddChar (Ch : Char);
|
||||||
|
Begin
|
||||||
|
If Length(Str) >= Len Then Exit;
|
||||||
|
|
||||||
|
If (CurPos >= Field) and (Field <> Len) Then ScrollRight;
|
||||||
|
|
||||||
|
Insert (Ch, Str, StrPos);
|
||||||
|
|
||||||
|
If StrPos < Length(Str) Then ReDrawPart;
|
||||||
|
|
||||||
|
Inc (StrPos);
|
||||||
|
Inc (CurPos);
|
||||||
|
|
||||||
|
Session.io.AnsiColor (Attr);
|
||||||
|
Session.io.BufAddChar (Ch);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Begin
|
||||||
|
Changed := False;
|
||||||
|
Str := Default;
|
||||||
|
StrPos := Length(Str) + 1;
|
||||||
|
Junk := Length(Str) - Field + 1;
|
||||||
|
|
||||||
|
If Junk < 1 Then Junk := 1;
|
||||||
|
|
||||||
|
CurPos := StrPos - Junk + 1;
|
||||||
|
|
||||||
|
ReDraw;
|
||||||
|
|
||||||
|
Repeat
|
||||||
|
Ch := Session.io.GetKey;
|
||||||
|
|
||||||
|
If Session.io.IsArrow Then Begin
|
||||||
|
Case Ch of
|
||||||
|
#77 : If StrPos < Length(Str) + 1 Then Begin
|
||||||
|
If (CurPos = Field) and (StrPos < Length(Str)) Then ScrollRight;
|
||||||
|
|
||||||
|
Inc (CurPos);
|
||||||
|
Inc (StrPos);
|
||||||
|
|
||||||
|
Session.io.AnsiGotoXY (Screen.CursorX + 1, Screen.CursorY);
|
||||||
|
End;
|
||||||
|
#75 : If StrPos > 1 Then Begin
|
||||||
|
If CurPos = 1 Then ScrollLeft;
|
||||||
|
|
||||||
|
Dec (StrPos);
|
||||||
|
Dec (CurPos);
|
||||||
|
|
||||||
|
Session.io.AnsiGotoXY (Screen.CursorX - 1, Screen.CursorY);
|
||||||
|
End;
|
||||||
|
#71 : If StrPos > 1 Then Begin
|
||||||
|
StrPos := 1;
|
||||||
|
Junk := 1;
|
||||||
|
CurPos := 1;
|
||||||
|
|
||||||
|
ReDraw;
|
||||||
|
End;
|
||||||
|
#79 : Begin
|
||||||
|
StrPos := Length(Str) + 1;
|
||||||
|
Junk := Length(Str) - Field + 1;
|
||||||
|
|
||||||
|
If Junk < 1 Then Junk := 1;
|
||||||
|
|
||||||
|
CurPos := StrPos - Junk + 1;
|
||||||
|
|
||||||
|
ReDraw;
|
||||||
|
End;
|
||||||
|
#83 : If (StrPos <= Length(Str)) and (Length(Str) > 0) Then Begin
|
||||||
|
Delete (Str, StrPos, 1);
|
||||||
|
|
||||||
|
ReDrawPart;
|
||||||
|
End;
|
||||||
|
Else
|
||||||
|
If Pos(Ch, HiChars) > 0 Then Begin
|
||||||
|
ExitCode := Ch;
|
||||||
|
|
||||||
|
Break;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
End Else
|
||||||
|
Case Ch of
|
||||||
|
#08 : If StrPos > 1 Then Begin
|
||||||
|
Dec (StrPos);
|
||||||
|
|
||||||
|
Delete (Str, StrPos, 1);
|
||||||
|
|
||||||
|
If CurPos = 1 Then
|
||||||
|
ScrollLeft
|
||||||
|
Else Begin
|
||||||
|
Session.io.AnsiMoveX(Screen.CursorX - 1);
|
||||||
|
|
||||||
|
Dec (CurPos);
|
||||||
|
|
||||||
|
ReDrawPart;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
^Y : Begin
|
||||||
|
Str := '';
|
||||||
|
StrPos := 1;
|
||||||
|
Junk := 1;
|
||||||
|
CurPos := 1;
|
||||||
|
|
||||||
|
ReDraw;
|
||||||
|
End;
|
||||||
|
#32..
|
||||||
|
#254: Case Mode of
|
||||||
|
0 : If Ch in ['0'..'9', '-'] Then AddChar(Ch);
|
||||||
|
1 : AddChar (Ch);
|
||||||
|
2 : AddChar (UpCase(Ch));
|
||||||
|
3 : If (Ch > '/') and (Ch < ':') Then
|
||||||
|
Case StrPos of
|
||||||
|
2,5 : Begin
|
||||||
|
AddChar (Ch);
|
||||||
|
AddChar ('/');
|
||||||
|
End;
|
||||||
|
3,6 : Begin
|
||||||
|
AddChar ('/');
|
||||||
|
AddChar (Ch);
|
||||||
|
End;
|
||||||
|
Else
|
||||||
|
AddChar (Ch);
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
Else
|
||||||
|
If Pos(Ch, LoChars) > 0 Then Begin
|
||||||
|
ExitCode := Ch;
|
||||||
|
|
||||||
|
Break;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
Until False;
|
||||||
|
|
||||||
Changed := (Str <> Default);
|
Changed := (Str <> Default);
|
||||||
Result := Str;
|
Result := Str;
|
||||||
End;
|
End;
|
||||||
|
|
|
@ -82,7 +82,6 @@ Var
|
||||||
Box : TAnsiMenuBox;
|
Box : TAnsiMenuBox;
|
||||||
Image : TConsoleImageRec;
|
Image : TConsoleImageRec;
|
||||||
MenuPos : Array[0..4] of Byte = (1, 1, 1, 1, 1);
|
MenuPos : Array[0..4] of Byte = (1, 1, 1, 1, 1);
|
||||||
ThemeOld : RecTheme;
|
|
||||||
Res : Char;
|
Res : Char;
|
||||||
|
|
||||||
Procedure BoxOpen (X1, Y1, X2, Y2: Byte);
|
Procedure BoxOpen (X1, Y1, X2, Y2: Byte);
|
||||||
|
@ -284,16 +283,6 @@ Begin
|
||||||
#77 : MenuPtr := 4;
|
#77 : MenuPtr := 4;
|
||||||
End;
|
End;
|
||||||
End Else Begin
|
End Else Begin
|
||||||
ThemeOld := Session.Lang;
|
|
||||||
|
|
||||||
Session.Lang.FieldColor1 := 15 + 1 * 16;
|
|
||||||
Session.Lang.FieldColor2 := 7 + 1 * 16;
|
|
||||||
Session.Lang.FieldChar := #176;
|
|
||||||
Session.Lang.EchoChar := '*';
|
|
||||||
|
|
||||||
// theme will need to be reloaded after the theme edito
|
|
||||||
// just in case that specific theme is changed.
|
|
||||||
|
|
||||||
Case Res of
|
Case Res of
|
||||||
'A' : Configuration_ArchiveEditor;
|
'A' : Configuration_ArchiveEditor;
|
||||||
'B' : Configuration_MessageBaseEditor;
|
'B' : Configuration_MessageBaseEditor;
|
||||||
|
@ -311,8 +300,6 @@ Begin
|
||||||
Else
|
Else
|
||||||
MenuPtr := 0;
|
MenuPtr := 0;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Session.Lang := ThemeOld;
|
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
4 : Begin
|
4 : Begin
|
||||||
|
|
|
@ -9,13 +9,546 @@ Function Configuration_ThemeEditor (Select: Boolean) : String;
|
||||||
Implementation
|
Implementation
|
||||||
|
|
||||||
Uses
|
Uses
|
||||||
|
m_Types,
|
||||||
m_FileIO,
|
m_FileIO,
|
||||||
m_Strings,
|
m_Strings,
|
||||||
bbs_Ansi_MenuBox,
|
bbs_Ansi_MenuBox,
|
||||||
bbs_Ansi_MenuForm,
|
bbs_Ansi_MenuForm,
|
||||||
|
bbs_Ansi_MenuInput,
|
||||||
|
bbs_Core,
|
||||||
bbs_Common,
|
bbs_Common,
|
||||||
bbs_Cfg_Common;
|
bbs_Cfg_Common;
|
||||||
|
|
||||||
|
Procedure CompileTheme (Var Theme: RecTheme);
|
||||||
|
Var
|
||||||
|
LastPer : Byte = 0;
|
||||||
|
|
||||||
|
Procedure UpdateBar (Cur : Integer);
|
||||||
|
Var
|
||||||
|
Percent : Byte;
|
||||||
|
Begin
|
||||||
|
Percent := Round(Cur / mysMaxThemeText * 100 / 5);
|
||||||
|
|
||||||
|
If Percent <> LastPer Then Begin
|
||||||
|
LastPer := Percent;
|
||||||
|
WriteXY (34, 12, 113, strRep(#178, Percent) + strRep(#176, 20 - Percent) + strPadL(strI2S(Percent * 5) + '%', 5, ' '));
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Var
|
||||||
|
InFile : Text;
|
||||||
|
PromptFile : File of RecPrompt;
|
||||||
|
Prompt : RecPrompt;
|
||||||
|
Count : Integer;
|
||||||
|
Done : Array[0..mysMaxThemeText] of Boolean;
|
||||||
|
Temp : String;
|
||||||
|
DoneNum : Integer;
|
||||||
|
Begin
|
||||||
|
Assign (PromptFile, Config.DataPath + Theme.FileName + '.thm');
|
||||||
|
|
||||||
|
{$I-} ReWrite (PromptFile); {$I+}
|
||||||
|
|
||||||
|
If IoResult <> 0 Then Begin
|
||||||
|
ShowMsgBox(0, 'Cannot compile theme while using it');
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Assign (InFile, Config.SystemPath + Theme.FileName + '.txt');
|
||||||
|
Reset (InFile);
|
||||||
|
|
||||||
|
ShowMsgBox (3, 'Compiling: ');
|
||||||
|
|
||||||
|
Prompt := '';
|
||||||
|
DoneNum := 0;
|
||||||
|
|
||||||
|
For Count := 0 to mysMaxThemeText Do Begin
|
||||||
|
Done[Count] := False;
|
||||||
|
Write (PromptFile, Prompt);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Reset (PromptFile);
|
||||||
|
|
||||||
|
While Not Eof(InFile) Do Begin
|
||||||
|
ReadLn (InFile, Temp);
|
||||||
|
|
||||||
|
If Copy(Temp, 1, 3) = '000' Then Count := 0 Else
|
||||||
|
If strS2I(Copy(Temp, 1, 3)) > 0 Then Count := strS2I(Copy(Temp, 1, 3)) Else
|
||||||
|
Count := -1;
|
||||||
|
|
||||||
|
If Count <> -1 Then Begin
|
||||||
|
Inc (DoneNum);
|
||||||
|
|
||||||
|
UpdateBar(DoneNum);
|
||||||
|
|
||||||
|
If Count > mysMaxThemeText Then Begin
|
||||||
|
ShowMsgBox(0, 'String #' + strI2S(Count) + ' was not expected');
|
||||||
|
|
||||||
|
Close (InFile);
|
||||||
|
Close (PromptFile);
|
||||||
|
Erase (PromptFile);
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Done[Count] := True;
|
||||||
|
|
||||||
|
Seek (PromptFile, Count);
|
||||||
|
|
||||||
|
Prompt := Copy(Temp, 5, Length(Temp));
|
||||||
|
|
||||||
|
Write (PromptFile, Prompt);
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Close (InFile);
|
||||||
|
Close (PromptFile);
|
||||||
|
|
||||||
|
For Count := 0 to mysMaxThemeText Do Begin
|
||||||
|
If Not Done[Count] Then Begin
|
||||||
|
ShowMsgBox (0, 'String #' + strI2S(Count) + ' was not found');
|
||||||
|
Erase (PromptFile);
|
||||||
|
Break;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure EditPrompts (Var Theme: RecTheme);
|
||||||
|
Const
|
||||||
|
MaxText = 3000;
|
||||||
|
LinesPerPage = 16;
|
||||||
|
WinStartX = 3;
|
||||||
|
WinStartY = 1;
|
||||||
|
Var
|
||||||
|
Box : TAnsiMenuBox;
|
||||||
|
Input : TAnsiMenuInput;
|
||||||
|
InFile : Text;
|
||||||
|
TotalText : Word;
|
||||||
|
StrData : Array[1..MaxText] of ^String;
|
||||||
|
Comment : Array[1..LinesPerPage] of Array[1..3] of String[75];
|
||||||
|
PageData : Array[1..LinesPerPage] of Integer;
|
||||||
|
PageStart : Array[1..100] of Integer;
|
||||||
|
PageTotal : Integer;
|
||||||
|
CurPage : Byte = 1;
|
||||||
|
CurLine : Byte = 1;
|
||||||
|
CurPageLines : Byte;
|
||||||
|
TotalPrompt : Integer;
|
||||||
|
SearchMask : String;
|
||||||
|
CopyStr : String = '';
|
||||||
|
|
||||||
|
Procedure DisposeStringData;
|
||||||
|
Var
|
||||||
|
Count : Word;
|
||||||
|
Begin
|
||||||
|
For Count := TotalText DownTo 1 Do
|
||||||
|
Dispose (StrData[Count]);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Function LoadStringData : Boolean;
|
||||||
|
Var
|
||||||
|
Str : String;
|
||||||
|
Buffer : Array[1..4096] of Byte;
|
||||||
|
Begin
|
||||||
|
Result := False;
|
||||||
|
|
||||||
|
Assign (InFile, Config.SystemPath + Theme.FileName + '.txt');
|
||||||
|
SetTextBuf (InFile, Buffer, SizeOf(Buffer));
|
||||||
|
|
||||||
|
{$I-} Reset (InFile); {$I+}
|
||||||
|
|
||||||
|
If IoResult <> 0 Then Begin
|
||||||
|
ShowMsgBox (0, 'Unable to open ' + Config.SystemPath + Theme.FileName + '.txt');
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
|
|
||||||
|
ShowMsgBox (2, 'Loading ' + Theme.FileName + '.txt');
|
||||||
|
|
||||||
|
TotalText := 0;
|
||||||
|
|
||||||
|
While Not Eof(InFile) Do Begin
|
||||||
|
If TotalText = MaxText Then Begin
|
||||||
|
Close (InFile);
|
||||||
|
|
||||||
|
ShowMsgBox (0, 'File too large');
|
||||||
|
|
||||||
|
DisposeStringData;
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
|
|
||||||
|
ReadLn (InFile, Str);
|
||||||
|
Inc (TotalText);
|
||||||
|
|
||||||
|
New (StrData[TotalText]);
|
||||||
|
|
||||||
|
StrData[TotalText]^ := Str;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Close (InFile);
|
||||||
|
|
||||||
|
Result := True;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure GetTotalPages;
|
||||||
|
Var
|
||||||
|
Str : String;
|
||||||
|
Count : Integer;
|
||||||
|
Lines : Integer;
|
||||||
|
Last : Integer;
|
||||||
|
Begin
|
||||||
|
PageTotal := 0;
|
||||||
|
Lines := 0;
|
||||||
|
Last := 1;
|
||||||
|
Count := 0;
|
||||||
|
TotalPrompt := -1;
|
||||||
|
|
||||||
|
While Count < TotalText Do Begin
|
||||||
|
Inc (Count);
|
||||||
|
|
||||||
|
Str := StrData[Count]^;
|
||||||
|
|
||||||
|
If (Str <> '') and (Str[1] <> ';') and (Str[1] <> '#') Then Begin
|
||||||
|
Inc (TotalPrompt);
|
||||||
|
Inc (Lines);
|
||||||
|
|
||||||
|
If Lines = 1 Then Begin
|
||||||
|
Inc (PageTotal);
|
||||||
|
|
||||||
|
PageStart[PageTotal] := Last;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
If Lines = LinesPerPage Then Begin
|
||||||
|
Lines := 0;
|
||||||
|
Last := Count + 1;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure DrawPage (Silent: Boolean);
|
||||||
|
Var
|
||||||
|
Str : String;
|
||||||
|
A : Byte;
|
||||||
|
Count : Integer;
|
||||||
|
Begin
|
||||||
|
For A := 1 to LinesPerPage Do Begin
|
||||||
|
Comment[A][1] := '';
|
||||||
|
Comment[A][2] := '';
|
||||||
|
Comment[A][3] := '';
|
||||||
|
End;
|
||||||
|
|
||||||
|
CurPageLines := 0;
|
||||||
|
Count := PageStart[CurPage];
|
||||||
|
|
||||||
|
While (CurPageLines < LinesPerPage) and (Count <= TotalText) Do Begin
|
||||||
|
Str := StrData[Count]^;
|
||||||
|
|
||||||
|
Inc (Count);
|
||||||
|
|
||||||
|
If Str[1] = ';' Then Begin
|
||||||
|
Delete (Str, 1, 2);
|
||||||
|
|
||||||
|
Comment[CurPageLines + 1][1] := Comment[CurPageLines + 1][2];
|
||||||
|
Comment[CurPageLines + 1][2] := Comment[CurPageLines + 1][3];
|
||||||
|
Comment[CurPageLines + 1][3] := Str;
|
||||||
|
End Else
|
||||||
|
If (Str <> '') and (Str[1] <> '#') Then Begin
|
||||||
|
Inc(CurPageLines);
|
||||||
|
|
||||||
|
PageData[CurPageLines] := Count - 1;
|
||||||
|
|
||||||
|
If Not Silent Then
|
||||||
|
WriteXYPipe (WinStartX, WinStartY + CurPageLines, 7, 75, Copy(Str, 5, 255));
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
If Not Silent Then
|
||||||
|
If CurPageLines < LinesPerPage Then
|
||||||
|
For A := CurPageLines + 1 to LinesPerPage Do
|
||||||
|
WriteXY (WinStartX, A + WinStartY, 7, strRep(' ', 75));
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure DrawComments;
|
||||||
|
Begin
|
||||||
|
WriteXY (3, 19, 15, strPadR(Comment[CurLine][1], 75, ' '));
|
||||||
|
WriteXY (3, 20, 15, strPadR(Comment[CurLine][2], 75, ' '));
|
||||||
|
WriteXY (3, 21, 15, strPadR(Comment[CurLine][3], 75, ' '));
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure JumpToPrompt (Cur : Word);
|
||||||
|
Var
|
||||||
|
Box : TAnsiMenuBox;
|
||||||
|
Input : TAnsiMenuInput;
|
||||||
|
Num : Word;
|
||||||
|
Count : Word;
|
||||||
|
PageEnd : Word;
|
||||||
|
LineNum : Word;
|
||||||
|
B : Word;
|
||||||
|
Begin
|
||||||
|
Box := TAnsiMenuBox.Create;
|
||||||
|
Input := TAnsiMenuInput.Create;
|
||||||
|
|
||||||
|
Box.Open (27, 8, 53, 12);
|
||||||
|
|
||||||
|
WriteXY (30, 10, 112, 'Jump to prompt #:');
|
||||||
|
|
||||||
|
Num := Input.GetNum(48, 10, 4, 4, 0, mysMaxThemeText, Cur);
|
||||||
|
|
||||||
|
Box.Close;
|
||||||
|
Input.Free;
|
||||||
|
Box.Free;
|
||||||
|
|
||||||
|
If Num <> Cur Then
|
||||||
|
For Count := 1 to PageTotal Do Begin
|
||||||
|
If Count = PageTotal Then
|
||||||
|
PageEnd := TotalText
|
||||||
|
Else
|
||||||
|
PageEnd := PageStart[Count + 1] - 1;
|
||||||
|
|
||||||
|
LineNum := 0;
|
||||||
|
|
||||||
|
For B := PageStart[Count] to PageEnd Do Begin
|
||||||
|
If (StrData[B]^[1] <> ';') and (StrData[B]^[1] <> '#') Then Begin
|
||||||
|
Inc (LineNum);
|
||||||
|
|
||||||
|
If strS2I(Copy(StrData[B]^, 1, 3)) = Num Then Begin
|
||||||
|
If Not ((Count = CurPage) and (CurLine = LineNum)) Then Begin
|
||||||
|
CurPage := Count;
|
||||||
|
CurLine := LineNum;
|
||||||
|
|
||||||
|
DrawPage(False);
|
||||||
|
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
DrawPage(False);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Procedure Search (Again : Boolean);
|
||||||
|
Var
|
||||||
|
Temp : String;
|
||||||
|
Start : Byte;
|
||||||
|
A : Byte;
|
||||||
|
B : Integer;
|
||||||
|
PageEnd : Integer;
|
||||||
|
LineNum : Integer;
|
||||||
|
Box : TAnsiMenuBox;
|
||||||
|
Input : TAnsiMenuInput;
|
||||||
|
Begin
|
||||||
|
If (Not Again) or ((Again) and (SearchMask = '')) Then Begin
|
||||||
|
Box := TAnsiMenuBox.Create;
|
||||||
|
Input := TAnsiMenuInput.Create;
|
||||||
|
|
||||||
|
Box.Header := ' Search ';
|
||||||
|
|
||||||
|
Box.Open(14, 8, 67, 10);
|
||||||
|
|
||||||
|
SearchMask := Input.GetStr(16, 9, 50, 50, 1, SearchMask);
|
||||||
|
|
||||||
|
Input.Free;
|
||||||
|
Box.Free;
|
||||||
|
|
||||||
|
If SearchMask = '' Then Begin
|
||||||
|
DrawPage(False);
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Start := 1;
|
||||||
|
Again := False;
|
||||||
|
End Else
|
||||||
|
Start := CurPage;
|
||||||
|
|
||||||
|
For A := Start to PageTotal Do Begin
|
||||||
|
|
||||||
|
If A = PageTotal Then
|
||||||
|
PageEnd := TotalText
|
||||||
|
Else
|
||||||
|
PageEnd := PageStart[A+1]-1;
|
||||||
|
|
||||||
|
LineNum := 0;
|
||||||
|
|
||||||
|
For B := PageStart[A] to PageEnd Do Begin
|
||||||
|
Temp := StrData[B]^;
|
||||||
|
|
||||||
|
If (Temp[1] <> ';') and (Temp[1] <> '#') Then Begin
|
||||||
|
Inc (LineNum);
|
||||||
|
|
||||||
|
If Again and (A = CurPage) Then
|
||||||
|
If (LineNum <= CurLine) and (LineNum < LinesPerPage) Then Continue;
|
||||||
|
|
||||||
|
If Pos(strUpper(SearchMask), strUpper(strStripPipe(StrData[B]^))) > 0 Then Begin
|
||||||
|
If Not ((A = CurPage) and (CurLine = LineNum)) Then Begin
|
||||||
|
CurPage := A;
|
||||||
|
CurLine := LineNum;
|
||||||
|
|
||||||
|
DrawPage(False);
|
||||||
|
|
||||||
|
Exit;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
ShowMsgBox(0, 'No maching text was found');
|
||||||
|
|
||||||
|
DrawPage(False);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Var
|
||||||
|
EditStr : String;
|
||||||
|
UndoStr : String;
|
||||||
|
CurStr : String[3];
|
||||||
|
Changed : Boolean = False;
|
||||||
|
Saved : Boolean = False;
|
||||||
|
Count : Integer;
|
||||||
|
Image : TConsoleImageRec;
|
||||||
|
Begin
|
||||||
|
Screen.GetScreenImage(1, 1, 79, 24, Image);
|
||||||
|
|
||||||
|
If Not LoadStringData Then Exit;
|
||||||
|
|
||||||
|
GetTotalPages;
|
||||||
|
|
||||||
|
Session.io.AnsiColor(7);
|
||||||
|
Session.io.AnsiClear;
|
||||||
|
|
||||||
|
Box := TAnsiMenuBox.Create;
|
||||||
|
Input := TAnsiMenuInput.Create;
|
||||||
|
|
||||||
|
Box.FrameType := 1;
|
||||||
|
Box.BoxAttr := 8;
|
||||||
|
Box.Box3D := False;
|
||||||
|
Box.Shadow := False;
|
||||||
|
|
||||||
|
Input.HiChars := #72#73#80#81;
|
||||||
|
Input.LoChars := #01#02#06#07#11#16#20#21#27;
|
||||||
|
|
||||||
|
Box.Open (1, 1, 79, 22);
|
||||||
|
|
||||||
|
WriteXY (2, 18, 8, strRep('Ä', 77));
|
||||||
|
WriteXY (3, 1, 8, ' / ');
|
||||||
|
WriteXY (8, 1, 7, strI2S(TotalPrompt));
|
||||||
|
WriteXY (73 - Length(Theme.FileName), 1, 7, ' ' + Theme.FileName + '.txt ');
|
||||||
|
|
||||||
|
WriteXYPipe (1, 23, 112, 79, ' Prompts ³ |01Press |15CTRL |01+ |15T|01op |15B|01ottom |15F|01ind |15A|01gain |15G|01oto |15K|01ut |15P|01aste |15U|01ndo |00³ ESC/Quit ');
|
||||||
|
|
||||||
|
DrawPage(False);
|
||||||
|
|
||||||
|
Repeat
|
||||||
|
DrawComments;
|
||||||
|
|
||||||
|
CurStr := Copy(StrData[PageData[CurLine]]^, 1, 3);
|
||||||
|
EditStr := Copy(StrData[PageData[CurLine]]^, 5, 255);
|
||||||
|
UndoStr := EditStr;
|
||||||
|
|
||||||
|
WriteXY (4, 1, 7, CurStr);
|
||||||
|
|
||||||
|
EditStr := Input.GetStr(WinStartX, WinStartY + CurLine, 75, 254, 1, EditStr);
|
||||||
|
|
||||||
|
Case Input.ExitCode of
|
||||||
|
#16 : If CopyStr <> '' Then Begin
|
||||||
|
EditStr := CopyStr;
|
||||||
|
Input.Changed := True;
|
||||||
|
End;
|
||||||
|
#21 : Begin
|
||||||
|
EditStr := UndoStr;
|
||||||
|
Input.Changed := False;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
|
||||||
|
WriteXYPipe (WinStartX, WinStartY + CurLine, 7, 75, EditStr);
|
||||||
|
|
||||||
|
StrData[PageData[CurLine]]^ := CurStr + ' ' + EditStr;
|
||||||
|
|
||||||
|
If Input.Changed Then Changed := True;
|
||||||
|
|
||||||
|
Case Input.ExitCode of
|
||||||
|
#01 : Search(True);
|
||||||
|
#02 : Begin
|
||||||
|
CurPage := PageTotal;
|
||||||
|
|
||||||
|
DrawPage(False);
|
||||||
|
|
||||||
|
CurLine := CurPageLines;
|
||||||
|
End;
|
||||||
|
|
||||||
|
#06 : Search(False);
|
||||||
|
#07 : JumpToPrompt(strS2I(CurStr));
|
||||||
|
#11 : CopyStr := EditStr;
|
||||||
|
#20 : Begin
|
||||||
|
CurPage := 1;
|
||||||
|
CurLine := 1;
|
||||||
|
|
||||||
|
DrawPage(False);
|
||||||
|
End;
|
||||||
|
#27 : Break;
|
||||||
|
#72 : If CurLine > 1 Then
|
||||||
|
Dec(CurLine)
|
||||||
|
Else Begin
|
||||||
|
If CurPage > 1 Then Begin
|
||||||
|
Dec (CurPage);
|
||||||
|
|
||||||
|
DrawPage(False);
|
||||||
|
|
||||||
|
CurLine := CurPageLines;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
#73 : If CurPage > 1 Then Begin
|
||||||
|
Dec (CurPage);
|
||||||
|
|
||||||
|
DrawPage(False);
|
||||||
|
End Else
|
||||||
|
CurLine := 1;
|
||||||
|
#80 : If CurLine < CurPageLines Then
|
||||||
|
Inc(CurLine)
|
||||||
|
Else Begin
|
||||||
|
If CurPage < PageTotal Then Begin
|
||||||
|
Inc (CurPage);
|
||||||
|
|
||||||
|
DrawPage(False);
|
||||||
|
|
||||||
|
CurLine := 1;
|
||||||
|
End;
|
||||||
|
End;
|
||||||
|
#81 : If CurPage < PageTotal Then Begin
|
||||||
|
Inc (CurPage);
|
||||||
|
|
||||||
|
DrawPage(False);
|
||||||
|
|
||||||
|
CurLine := 1;
|
||||||
|
End Else
|
||||||
|
CurLine := CurPageLines;
|
||||||
|
End;
|
||||||
|
Until False;
|
||||||
|
|
||||||
|
If Changed Then
|
||||||
|
If ShowMsgBox(1, 'Save changes?') Then Begin
|
||||||
|
Saved := True;
|
||||||
|
|
||||||
|
Assign (InFile, Config.SystemPath + Theme.FileName + '.txt');
|
||||||
|
ReWrite (InFile);
|
||||||
|
|
||||||
|
For Count := 1 to TotalText Do Begin
|
||||||
|
EditStr := StrData[Count]^;
|
||||||
|
WriteLn (InFile, EditStr);
|
||||||
|
End;
|
||||||
|
|
||||||
|
Close (InFile);
|
||||||
|
End;
|
||||||
|
|
||||||
|
DisposeStringData;
|
||||||
|
|
||||||
|
If Saved Then
|
||||||
|
CompileTheme(Theme);
|
||||||
|
|
||||||
|
Box.Free;
|
||||||
|
Input.Free;
|
||||||
|
|
||||||
|
Session.io.RemoteRestore(Image);
|
||||||
|
End;
|
||||||
|
|
||||||
Procedure EditBars (Var Theme: RecTheme);
|
Procedure EditBars (Var Theme: RecTheme);
|
||||||
Var
|
Var
|
||||||
Box : TAnsiMenuBox;
|
Box : TAnsiMenuBox;
|
||||||
|
@ -136,6 +669,7 @@ Begin
|
||||||
|
|
||||||
Repeat
|
Repeat
|
||||||
Case Form.Execute of
|
Case Form.Execute of
|
||||||
|
'1' : EditPrompts(Theme);
|
||||||
'2' : EditOptions(Theme);
|
'2' : EditOptions(Theme);
|
||||||
'3' : Begin
|
'3' : Begin
|
||||||
Box.Hide;
|
Box.Hide;
|
||||||
|
|
|
@ -1094,7 +1094,7 @@ End;
|
||||||
{$IFDEF UNIX}
|
{$IFDEF UNIX}
|
||||||
Function TBBSIO.InKey : Char;
|
Function TBBSIO.InKey : Char;
|
||||||
Begin
|
Begin
|
||||||
Result := #1;
|
Result := #255;
|
||||||
IsArrow := False;
|
IsArrow := False;
|
||||||
|
|
||||||
If Input.KeyWait(1000) Then Begin
|
If Input.KeyWait(1000) Then Begin
|
||||||
|
@ -1109,7 +1109,7 @@ Begin
|
||||||
Exit;
|
Exit;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Result := #1;
|
Result := #255;
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
End;
|
End;
|
||||||
|
@ -1121,7 +1121,7 @@ Var
|
||||||
Handles : Array[0..1] of THandle;
|
Handles : Array[0..1] of THandle;
|
||||||
InType : Byte;
|
InType : Byte;
|
||||||
Begin
|
Begin
|
||||||
Result := #1;
|
Result := #255;
|
||||||
|
|
||||||
Handles[0] := Input.ConIn;
|
Handles[0] := Input.ConIn;
|
||||||
|
|
||||||
|
@ -1162,10 +1162,10 @@ Begin
|
||||||
|
|
||||||
ProcessSysopCommand(Result);
|
ProcessSysopCommand(Result);
|
||||||
|
|
||||||
Result := #1;
|
Result := #255;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
If Not Screen.Active Then Result := #1;
|
If Not Screen.Active Then Result := #255;
|
||||||
End;
|
End;
|
||||||
2 : Begin // SOCKET read event
|
2 : Begin // SOCKET read event
|
||||||
If TBBSCore(Core).Client.ReadBuf(Result, 1) < 0 Then Begin
|
If TBBSCore(Core).Client.ReadBuf(Result, 1) < 0 Then Begin
|
||||||
|
@ -1179,12 +1179,14 @@ Begin
|
||||||
IsArrow := True;
|
IsArrow := True;
|
||||||
|
|
||||||
Case Result of
|
Case Result of
|
||||||
|
(*
|
||||||
#03 : Result := #81; { pgdn }
|
#03 : Result := #81; { pgdn }
|
||||||
#04 : Result := #77; { right }
|
#04 : Result := #77; { right }
|
||||||
#05 : Result := #72; { up }
|
#05 : Result := #72; { up }
|
||||||
#18 : Result := #73; { pgup }
|
#18 : Result := #73; { pgup }
|
||||||
#19 : Result := #75; { left }
|
#19 : Result := #75; { left }
|
||||||
#24 : Result := #80; { down }
|
#24 : Result := #80; { down }
|
||||||
|
*)
|
||||||
#27 : Begin
|
#27 : Begin
|
||||||
If Not TBBSCore(Core).Client.DataWaiting Then WaitMS(25);
|
If Not TBBSCore(Core).Client.DataWaiting Then WaitMS(25);
|
||||||
If Not TBBSCore(Core).Client.DataWaiting Then WaitMS(25);
|
If Not TBBSCore(Core).Client.DataWaiting Then WaitMS(25);
|
||||||
|
@ -1218,7 +1220,7 @@ Var
|
||||||
TimeCount : LongInt;
|
TimeCount : LongInt;
|
||||||
LastSec : LongInt;
|
LastSec : LongInt;
|
||||||
Begin
|
Begin
|
||||||
Result := #1;
|
Result := #255;
|
||||||
|
|
||||||
TBBSCore(Core).TimeOut := TimerSeconds;
|
TBBSCore(Core).TimeOut := TimerSeconds;
|
||||||
|
|
||||||
|
@ -1286,7 +1288,7 @@ Begin
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Result := InKey;
|
Result := InKey;
|
||||||
Until Result <> #1;
|
Until Result <> #255;
|
||||||
End;
|
End;
|
||||||
|
|
||||||
Function TBBSIO.GetYNL (Str: String; Yes: Boolean) : Boolean;
|
Function TBBSIO.GetYNL (Str: String; Yes: Boolean) : Boolean;
|
||||||
|
|
|
@ -20,6 +20,7 @@ BUGS AND POSSIBLE ISSUES
|
||||||
FPC BUG? DirAttr is suspect in MPL is it 1 byte or 4 in size?
|
FPC BUG? DirAttr is suspect in MPL is it 1 byte or 4 in size?
|
||||||
! MDL screensave/restore in local console is broken in Windows(?) only?
|
! MDL screensave/restore in local console is broken in Windows(?) only?
|
||||||
! View archive not working if its external view? [Griffin]
|
! View archive not working if its external view? [Griffin]
|
||||||
|
! Editing current theme will prob not save right [g00r00]
|
||||||
|
|
||||||
FUTURE / IDEAS / WORK IN PROGRESS / NOTES
|
FUTURE / IDEAS / WORK IN PROGRESS / NOTES
|
||||||
=========================================
|
=========================================
|
||||||
|
|
Loading…
Reference in New Issue