{*******************************************************}
{ }
{ Turbo Pascal Version 7.0 }
{ Turbo Vision Unit }
{ }
{ Copyright (c) 1992 Borland International }
{ }
{*******************************************************}
{$PureInt+}
unit Editors;
{$I-,O+,F+,V-,X+,S-}
interface
uses Drivers, Objects, Views, Dialogs, Use32;
const
cmFind = 82;
cmReplace = 83;
cmSearchAgain = 84;
const
cmCharLeft = 500;
cmCharRight = 501;
cmWordLeft = 502;
cmWordRight = 503;
cmLineStart = 504;
cmLineEnd = 505;
cmLineUp = 506;
cmLineDown = 507;
cmPageUp = 508;
cmPageDown = 509;
cmTextStart = 510;
cmTextEnd = 511;
cmNewLine = 512;
cmBackSpace = 513;
cmDelChar = 514;
cmDelWord = 515;
cmDelStart = 516;
cmDelEnd = 517;
cmDelLine = 518;
cmInsMode = 519;
cmStartSelect = 520;
cmHideSelect = 521;
cmIndentMode = 522;
cmUpdateTitle = 523;
const
edOutOfMemory = 0;
edReadError = 1;
edWriteError = 2;
edCreateError = 3;
edSaveModify = 4;
edSaveUntitled = 5;
edSaveAs = 6;
edFind = 7;
edSearchFailed = 8;
edReplace = 9;
edReplacePrompt = 10;
const
efCaseSensitive = $0001;
efWholeWordsOnly = $0002;
efPromptOnReplace = $0004;
efReplaceAll = $0008;
efDoReplace = $0010;
efBackupFiles = $0100;
const
CIndicator = #2#3;
CEditor = #6#7;
CMemo = #26#27;
const
MaxLineLength = 256;
type
TEditorDialog = function(Dialog: Integer; Info: Pointer): Word;
type
PIndicator = ^TIndicator;
TIndicator = object(TView)
Location: TPoint;
Modified: Boolean;
constructor Init(var Bounds: TRect);
procedure Draw; virtual;
function GetPalette: PPalette; virtual;
procedure SetState(AState: Word; Enable: Boolean); virtual;
procedure SetValue(ALocation: TPoint; AModified: Boolean);
end;
type
PEditBuffer = ^TEditBuffer;
TEditBuffer = array[0..512*1024*1024-1] of Char;
type
PEditor = ^TEditor;
TEditor = object(TView)
HScrollBar: PScrollBar;
VScrollBar: PScrollBar;
Indicator: PIndicator;
Buffer: PEditBuffer;
BufSize: Word;
BufLen: Word;
GapLen: Word;
SelStart: Word;
SelEnd: Word;
CurPtr: Word;
CurPos: TPoint;
Delta: TPoint;
Limit: TPoint;
DrawLine: Integer;
DrawPtr: Word;
DelCount: Word;
InsCount: Word;
IsValid: Boolean;
CanUndo: Boolean;
Modified: Boolean;
Selecting: Boolean;
Overwrite: Boolean;
AutoIndent: Boolean;
constructor Init(var Bounds: TRect;
AHScrollBar, AVScrollBar: PScrollBar;
AIndicator: PIndicator; ABufSize: Word);
constructor Load(var S: TStream);
destructor Done; virtual;
function BufChar(P: Word): Char;
function BufPtr(P: Word): Word;
procedure ChangeBounds(var Bounds: TRect); virtual;
procedure ConvertEvent(var Event: TEvent); virtual;
function CursorVisible: Boolean;
procedure DeleteSelect;
procedure DoneBuffer; virtual;
procedure Draw; virtual;
function GetPalette: PPalette; virtual;
procedure HandleEvent(var Event: TEvent); virtual;
procedure InitBuffer; virtual;
function InsertBuffer(var P: PEditBuffer; Offset, Length: Word;
AllowUndo, SelectText: Boolean): Boolean;
function InsertFrom(Editor: PEditor): Boolean; virtual;
function InsertText(Text: Pointer; Length: Word;
SelectText: Boolean): Boolean;
procedure ScrollTo(X, Y: Integer);
function Search(const FindStr: String; Opts: Word): Boolean;
function SetBufSize(NewSize: Word): Boolean; virtual;
procedure SetCmdState(Command: Word; Enable: Boolean);
procedure SetSelect(NewStart, NewEnd: Word; CurStart: Boolean);
procedure SetState(AState: Word; Enable: Boolean); virtual;
procedure Store(var S: TStream);
procedure TrackCursor(Center: Boolean);
procedure Undo;
procedure UpdateCommands; virtual;
function Valid(Command: Word): Boolean; virtual;
private
LockCount: Byte;
UpdateFlags: Byte;
KeyState: Integer;
function CharPos(P, Target: Word): Integer;
function CharPtr(P: Word; Target: Integer): Word;
function ClipCopy: Boolean;
procedure ClipCut;
procedure ClipPaste;
procedure DeleteRange(StartPtr, EndPtr: Word; DelSelect: Boolean);
procedure DoUpdate;
procedure DoSearchReplace;
procedure DrawLines(Y, Count: Integer; LinePtr: Word);
procedure FormatLine(var DrawBuf; LinePtr: Word;
Width: Integer; Colors: Word);
procedure Find;
function GetMousePtr(Mouse: TPoint): Word;
function HasSelection: Boolean;
procedure HideSelect;
function IsClipboard: Boolean;
function LineEnd(P: Word): Word;
function LineMove(P: Word; Count: Integer): Word;
function LineStart(P: Word): Word;
procedure Lock;
procedure NewLine;
function NextChar(P: Word): Word;
function NextLine(P: Word): Word;
function NextWord(P: Word): Word;
function PrevChar(P: Word): Word;
function PrevLine(P: Word): Word;
function PrevWord(P: Word): Word;
procedure Replace;
procedure SetBufLen(Length: Word);
procedure SetCurPtr(P: Word; SelectMode: Byte);
procedure StartSelect;
procedure ToggleInsMode;
procedure Unlock;
procedure Update(AFlags: Byte);
end;
type
TMemoData = record
Length: Word;
Buffer: TEditBuffer;
end;
type
PMemo = ^TMemo;
TMemo = object(TEditor)
constructor Load(var S: TStream);
function DataSize: Word; virtual;
procedure GetData(var Rec); virtual;
function GetPalette: PPalette; virtual;
procedure HandleEvent(var Event: TEvent); virtual;
procedure SetData(var Rec); virtual;
procedure Store(var S: TStream);
end;
type
PFileEditor = ^TFileEditor;
TFileEditor = object(TEditor)
FileName: FNameStr;
constructor Init(var Bounds: TRect;
AHScrollBar, AVScrollBar: PScrollBar;
AIndicator: PIndicator; AFileName: FNameStr);
constructor Load(var S: TStream);
procedure DoneBuffer; virtual;
procedure HandleEvent(var Event: TEvent); virtual;
procedure InitBuffer; virtual;
function LoadFile: Boolean;
function Save: Boolean;
function SaveAs: Boolean;
function SaveFile: Boolean;
function SetBufSize(NewSize: Word): Boolean; virtual;
procedure Store(var S: TStream);
procedure UpdateCommands; virtual;
function Valid(Command: Word): Boolean; virtual;
end;
type
PEditWindow = ^TEditWindow;
TEditWindow = object(TWindow)
Editor: PFileEditor;
constructor Init(var Bounds: TRect;
FileName: FNameStr; ANumber: Integer);
constructor Load(var S: TStream);
procedure Close; virtual;
function GetTitle(MaxSize: Integer): TTitleStr; virtual;
procedure HandleEvent(var Event: TEvent); virtual;
procedure SizeLimits(var Min, Max: TPoint); virtual;
procedure Store(var S: TStream);
end;
function DefEditorDialog(Dialog: Integer; Info: Pointer): Word;
function CreateFindDialog: PDialog;
function CreateReplaceDialog: PDialog;
function StdEditorDialog(Dialog: Integer; Info: Pointer): Word;
const
WordChars: set of Char = ['0'..'9', 'A'..'Z', '_', 'a'..'z'];
EditorDialog: TEditorDialog = DefEditorDialog;
EditorFlags: Word = efBackupFiles + efPromptOnReplace;
FindStr: String[80] = '';
ReplaceStr: String[80] = '';
Clipboard: PEditor = nil;
type
TFindDialogRec = record
Find: String[80];
Options: Word;
end;
type
TReplaceDialogRec = record
Find: String[80];
Replace: String[80];
Options: Word;
end;
const
REditor: TStreamRec = (
ObjType: 70;
VmtLink: Ofs(TypeOf(TEditor)^);
Load: @TEditor.Load;
Store: @TEditor.Store
);
RMemo: TStreamRec = (
ObjType: 71;
VmtLink: Ofs(TypeOf(TMemo)^);
Load: @TMemo.Load;
Store: @TMemo.Store
);
RFileEditor: TStreamRec = (
ObjType: 72;
VmtLink: Ofs(TypeOf(TFileEditor)^);
Load: @TFileEditor.Load;
Store: @TFileEditor.Store
);
RIndicator: TStreamRec = (
ObjType: 73;
VmtLink: Ofs(TypeOf(TIndicator)^);
Load: @TIndicator.Load;
Store: @TIndicator.Store
);
REditWindow: TStreamRec = (
ObjType: 74;
VmtLink: Ofs(TypeOf(TEditWindow)^);
Load: @TEditWindow.Load;
Store: @TEditWindow.Store
);
procedure RegisterEditors;
implementation
uses Memory, Dos, App, StdDlg, MsgBox;
end.