mysticbbs/mystic/bbs_edit_line.pas

292 lines
7.7 KiB
ObjectPascal

Unit bbs_Edit_Line;
// ====================================================================
// Mystic BBS Software Copyright 1997-2013 By James Coyle
// ====================================================================
//
// This file is part of Mystic BBS.
//
// Mystic BBS is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Mystic BBS is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Mystic BBS. If not, see <http://www.gnu.org/licenses/>.
//
// ====================================================================
{$I M_OPS.PAS}
Interface
Function LineEditor (Var Lines : SmallInt; MaxLen: Byte; MaxLine: SmallInt; TEdit: Boolean; Forced: Boolean;
Var Subj: String) : Boolean;
Implementation
Uses
m_Strings,
m_FileIO,
BBS_Common,
BBS_Records,
BBS_DataBase,
BBS_Core,
BBS_FileBase,
BBS_User;
Var
CurLine : Integer;
Done,
Save : Boolean;
Procedure MessageUpload (Var CurLine: SmallInt);
Var
FN : String[100];
TF : Text;
T1 : String[30];
T2 : String[60];
OK : Boolean;
Begin
OK := False;
T1 := Session.io.PromptInfo[1];
T2 := Session.io.PromptInfo[2];
Session.io.OutFull (Session.GetPrompt(352));
If Session.LocalMode Then Begin
FN := Session.io.GetInput(70, 70, 11, '');
If FN = '' Then Exit;
OK := FileExist(FN);
End Else Begin
FN := Session.TempPath + Session.io.GetInput(70, 70, 11, '');
If Session.FileBase.SelectProtocol(True, False) = 'Q' Then Exit;
Session.FileBase.ExecuteProtocol(1, FN);
OK := Session.FileBase.dszSearch(JustFile(FN));
End;
If OK Then Begin
Assign (TF, FN);
Reset (TF);
While Not Eof(TF) and (CurLine < mysMaxMsgLines) Do Begin
ReadLn (TF, Session.Msgs.MsgText[CurLine]);
Inc (CurLine);
End;
Close (TF);
End;
If Not Session.LocalMode Then FileErase(FN);
DirClean (Session.TempPath, 'msgtmp');
Session.io.PromptInfo[1] := T1;
Session.io.PromptInfo[2] := T2;
End;
Procedure Quote;
Var
InFile : Text;
Start,
Finish : Integer;
Lines : Integer;
Text : Array[1..mysMaxMsgLines] of String[80];
Begin
Assign (InFile, Session.TempPath + 'msgtmp');
{$I-} Reset (InFile); {$I+}
If IoResult <> 0 Then Begin
Session.io.OutFullLn (Session.GetPrompt(158));
Exit;
End;
Lines := 0;
Session.io.AllowPause := True;
While Not Eof(InFile) Do Begin
Inc (Lines);
ReadLn (InFile, Text[Lines]);
End;
Close (InFile);
Session.io.OutFullLn(Session.GetPrompt(452));
For Start := 1 to Lines Do Begin
Session.io.PromptInfo[1] := strI2S(Start);
Session.io.PromptInfo[2] := Text[Start];
Session.io.OutFullLn (Session.GetPrompt(341));
If (Session.io.PausePtr = Session.User.ThisUser.ScreenSize) and (Session.io.AllowPause) Then
Case Session.io.MorePrompt of
'N' : Break;
'C' : Session.io.AllowPause := False;
End;
End;
Session.io.AllowPause := True;
Session.io.OutFull (Session.GetPrompt(159));
Start := strS2I(Session.io.GetInput(3, 3, 11, ''));
Session.io.OutFull (Session.GetPrompt(160));
Finish := strS2I(Session.io.GetInput(3, 3, 11, ''));
If (Start > 0) and (Start <= Lines) and (Finish <= Lines) Then Begin
If Finish = 0 Then Finish := Start;
For Lines := Start to Finish Do Begin
If CurLine = mysMaxMsgLines Then Break;
Session.Msgs.MsgText[CurLine] := Text[Lines];
Inc (CurLine);
End;
End;
End;
Function LineEditor (Var Lines : Integer; MaxLen: Byte; MaxLine: Integer; TEdit, Forced : Boolean; Var Subj: String) : Boolean;
Procedure Commands;
Var
Ch : Char;
Begin
Done := False;
Save := False;
Repeat
Session.io.OutFull (Session.GetPrompt(166));
Ch := Session.io.OneKey ('?ACQRSU', True);
Case Ch of
'?' : Session.io.OutFullLn (Session.GetPrompt(167));
'A' : If Forced Then Begin
Session.io.OutFull (Session.GetPrompt(307));
Exit;
End Else
Done := Session.io.GetYN(Session.GetPrompt(168), False);
'C' : Exit;
'Q' : Begin
Quote;
Exit;
End;
'R' : Exit;
'S' : Begin
Save := True;
Done := True;
End;
'U' : Begin
MessageUpload(CurLine);
Exit;
End;
End;
Until Done;
End;
Procedure FullReDraw;
Var
A : Integer;
Begin
Session.io.PromptInfo[1] := strI2S(MaxLen);
Session.io.PromptInfo[2] := strI2S(MaxLine);
Session.io.OutFullLn(Session.GetPrompt(162));
Session.io.OutFullLn(Session.GetPrompt(163));
For A := 1 to CurLine Do Begin
Session.io.OutRaw (Session.Msgs.MsgText[A]);
If A <> CurLine Then Session.io.OutRawLn('');
End;
End;
Procedure GetText;
Var
Ch : Char;
Begin
Repeat
Ch := Session.io.GetKey;
Case Ch of
^R : FullReDraw;
#8 : If Length(Session.Msgs.MsgText[CurLine]) > 0 Then Begin
Session.io.OutBS(1, True);
Dec(Session.Msgs.MsgText[CurLine][0]);
End Else If CurLine > 1 Then Begin
Dec(CurLine);
Session.io.PromptInfo[1] := strI2S(CurLine);
Session.io.OutFullLn (Session.GetPrompt(165));
Session.io.OutRaw (Session.Msgs.MsgText[CurLine]);
If Session.Msgs.MsgText[CurLine] <> '' Then Begin
Session.io.OutBS(1, True);
Dec(Session.Msgs.MsgText[CurLine][0]);
End;
End;
#13 : Begin
If CurLine < MaxLine Then Begin
Inc(CurLine);
Session.io.OutRaw (#13#10);
End;
End;
Else
If (Ch = '/') and (Length(Session.Msgs.MsgText[CurLine]) = 0) Then Begin
Commands;
If (Not Save) and (Not Done) Then FullReDraw;
End Else
If Ch in [#32..#254] Then Begin
If Length(Session.Msgs.MsgText[Curline]) < MaxLen Then Begin
Session.Msgs.MsgText[CurLine] := Session.Msgs.MsgText[CurLine] + Ch;
Session.io.BufAddChar (Ch);
End;
If (Length(Session.Msgs.MsgText[CurLine]) > MaxLen-1) and (CurLine < MaxLine) Then Begin
strWrap (Session.Msgs.MsgText[CurLine], Session.Msgs.MsgText[Succ(CurLine)], MaxLen);
Inc (CurLine);
Session.io.OutBS (Length(Session.Msgs.MsgText[CurLine]), True);
Session.io.OutRawLn ('');
Session.io.OutRaw (Session.Msgs.MsgText[CurLine]);
End;
End;
End;
Until Done;
End;
Var
A : Integer;
Begin
CurLine := Lines;
If CurLine < MaxLine Then Inc(CurLine);
Done := False;
For A := Lines + 1 to mysMaxMsgLines Do Session.Msgs.MsgText[A] := '';
FullReDraw;
GetText;
If Save Then Begin
Lines := CurLine - 1;
LineEditor := True;
End Else
LineEditor := False;
End;
End.