📄 jveditor.pas
字号:
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnDblClick;
property OnPaintGutter;
property OnCompletionIdentifier;
property OnCompletionTemplate;
property OnCompletionDrawItem;
property OnCompletionMeasureItem;
property OnCompletionApply;
{ TCustomControl }
property Align;
property Enabled;
property Color;
property Ctl3D;
property Font;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ShowHint;
property TabStop;
property Visible;
{$IFDEF COMPILER4_UP}
property Anchors;
property AutoSize;
property BiDiMode;
property Constraints;
property UseDockManager default True;
property DockSite;
property DragKind;
property ParentBiDiMode;
property OnCanResize;
property OnConstrainedResize;
property OnDockDrop;
property OnDockOver;
property OnEndDock;
property OnGetSiteInfo;
property OnStartDock;
property OnUnDock;
{$ENDIF COMPILER4_UP}
end;
TCompletionList = (cmIdentifiers, cmTemplates);
TJvCompletion = class(TPersistent)
private
FJvEditor: TJvCustomEditor;
FPopupList: TListBox;
FIdentifiers: TStrings;
FTemplates: TStrings;
FItems: TStringList;
FItemIndex: Integer;
FMode: TCompletionList;
FDefMode: TCompletionList;
FItemHeight: Integer;
FTimer: TTimer;
FEnabled: Boolean;
FVisible: Boolean;
FDropDownCount: Integer;
FDropDownWidth: Integer;
FListBoxStyle: TListBoxStyle;
FCaretChar: char;
FCRLF: string;
FSeparator: string;
function DoKeyDown(Key: Word; Shift: TShiftState): Boolean;
procedure DoKeyPress(Key: Char);
procedure OnTimer(Sender: TObject);
procedure FindSelItem(var Eq: Boolean);
procedure ReplaceWord(const NewString: string);
procedure SetStrings(Index: Integer; AValue: TStrings);
function GetItemIndex: Integer;
procedure SetItemIndex(AValue: Integer);
function GetInterval: Cardinal;
procedure SetInterval(AValue: Cardinal);
procedure MakeItems;
function GetItems: TStrings;
public
constructor Create(AJvEditor: TJvCustomEditor);
destructor Destroy; override;
procedure DropDown(const AMode: TCompletionList; const ShowAlways: Boolean);
procedure DoCompletion(const AMode: TCompletionList);
procedure CloseUp(const Apply: Boolean);
procedure SelectItem;
property ItemIndex: Integer read GetItemIndex write SetItemIndex;
property Visible: Boolean read FVisible write FVisible;
property Mode: TCompletionList read FMode write FMode;
property Items: TStringList read FItems;
published
property DropDownCount: Integer read FDropDownCount write FDropDownCount
default 6;
property DropDownWidth: Integer read FDropDownWidth write FDropDownWidth
default 300;
property Enabled: Boolean read FEnabled write FEnabled default False;
property Identifiers: TStrings index 0 read FIdentifiers write SetStrings;
property Templates: TStrings index 1 read FTemplates write SetStrings;
property ItemHeight: Integer read FItemHeight write FItemHeight;
property Interval: Cardinal read GetInterval write SetInterval;
property ListBoxStyle: TListBoxStyle read FListBoxStyle write FListBoxStyle;
property CaretChar: char read FCaretChar write FCaretChar;
property CRLF: string read FCRLF write FCRLF;
property Separator: string read FSeparator write FSeparator;
end;
const
{ Editor commands }
{ When add new commands, please add them into JvInterpreter_JvEditor.pas unit also ! }
ecCharFirst = $00;
ecCharLast = $FF;
ecCommandFirst = $100;
ecIntern = $1000; { use on internal updates }
ecUser = $8000; { use this for descendants }
{Cursor}
ecLeft = ecCommandFirst + 1;
ecUp = ecLeft + 1;
ecRight = ecLeft + 2;
ecDown = ecLeft + 3;
{Cursor with select}
ecSelLeft = ecCommandFirst + 9;
ecSelUp = ecSelLeft + 1;
ecSelRight = ecSelLeft + 2;
ecSelDown = ecSelLeft + 3;
{Cursor with column select}
ecSelColumnLeft = ecIntern + 0;
ecSelColumnUp = ecSelColumnLeft + 1;
ecSelColumnRight = ecSelColumnLeft + 2;
ecSelColumnDown = ecSelColumnLeft + 3;
{Cursor On words [translated] }
ecPrevWord = ecSelDown + 1;
ecNextWord = ecPrevWord + 1;
ecSelPrevWord = ecPrevWord + 2;
ecSelNextWord = ecPrevWord + 3;
ecSelWord = ecPrevWord + 4;
ecWindowTop = ecSelWord + 1;
ecWindowBottom = ecWindowTop + 1;
ecPrevPage = ecWindowTop + 2;
ecNextPage = ecWindowTop + 3;
ecSelPrevPage = ecWindowTop + 4;
ecSelNextPage = ecWindowTop + 5;
ecBeginLine = ecSelNextPage + 1;
ecEndLine = ecBeginLine + 1;
ecBeginDoc = ecBeginLine + 2;
ecEndDoc = ecBeginLine + 3;
ecSelBeginLine = ecBeginLine + 4;
ecSelEndLine = ecBeginLine + 5;
ecSelBeginDoc = ecBeginLine + 6;
ecSelEndDoc = ecBeginLine + 7;
ecSelAll = ecBeginLine + 8;
ecScrollLineUp = ecSelAll + 1;
ecScrollLineDown = ecScrollLineUp + 1;
ecInclusiveBlock = ecCommandFirst + 100;
ecLineBlock = ecCommandFirst + 101;
ecColumnBlock = ecCommandFirst + 102;
ecNonInclusiveBlock = ecCommandFirst + 103;
ecInsertPara = ecCommandFirst + 121;
ecBackspace = ecInsertPara + 1;
ecDelete = ecInsertPara + 2;
ecChangeInsertMode = ecInsertPara + 3;
ecTab = ecInsertPara + 4;
ecBackTab = ecInsertPara + 5;
ecIndent = ecInsertPara + 6;
ecUnindent = ecInsertPara + 7;
ecBackspaceWord = ecIntern + 10;
ecDeleteSelected = ecInsertPara + 10;
ecClipboardCopy = ecInsertPara + 11;
ecClipboardCut = ecClipboardCopy + 1;
ecClipboardPaste = ecClipboardCopy + 2;
ecDeleteLine = ecClipboardPaste + 1;
ecDeleteWord = ecDeleteLine + 1;
ecToUpperCase = ecDeleteLine + 2;
ecToLowerCase = ecToUpperCase + 1;
ecChangeCase = ecToUpperCase + 2;
ecUndo = ecChangeCase + 1;
ecRedo = ecUndo + 1;
ecBeginCompound = ecUndo + 2;
ecEndCompound = ecUndo + 3;
ecBeginUpdate = ecUndo + 4;
ecEndUpdate = ecUndo + 5;
ecSetBookmark0 = ecEndUpdate + 1;
ecSetBookmark1 = ecSetBookmark0 + 1;
ecSetBookmark2 = ecSetBookmark0 + 2;
ecSetBookmark3 = ecSetBookmark0 + 3;
ecSetBookmark4 = ecSetBookmark0 + 4;
ecSetBookmark5 = ecSetBookmark0 + 5;
ecSetBookmark6 = ecSetBookmark0 + 6;
ecSetBookmark7 = ecSetBookmark0 + 7;
ecSetBookmark8 = ecSetBookmark0 + 8;
ecSetBookmark9 = ecSetBookmark0 + 9;
ecGotoBookmark0 = ecSetBookmark9 + 1;
ecGotoBookmark1 = ecGotoBookmark0 + 1;
ecGotoBookmark2 = ecGotoBookmark0 + 2;
ecGotoBookmark3 = ecGotoBookmark0 + 3;
ecGotoBookmark4 = ecGotoBookmark0 + 4;
ecGotoBookmark5 = ecGotoBookmark0 + 5;
ecGotoBookmark6 = ecGotoBookmark0 + 6;
ecGotoBookmark7 = ecGotoBookmark0 + 7;
ecGotoBookmark8 = ecGotoBookmark0 + 8;
ecGotoBookmark9 = ecGotoBookmark0 + 9;
ecCompletionIdentifiers = ecGotoBookmark9 + 1;
ecCompletionTemplates = ecCompletionIdentifiers + 1;
ecRecordMacro = ecCompletionTemplates + 1;
ecPlayMacro = ecRecordMacro + 1;
ecBeginRecord = ecRecordMacro + 2;
ecEndRecord = ecRecordMacro + 3;
twoKeyCommand = High(Word);
implementation
uses
Consts, Math,
JvCtlConst, JvStrUtil, JvTypes;
type
TJvCaretUndo = class(TUndo)
private
FCaretX: Integer;
FCaretY: Integer;
public
constructor Create(AJvEditor: TJvCustomEditor; ACaretX, ACaretY: Integer);
procedure Undo; override;
procedure Redo; override;
end;
TJvInsertUndo = class(TJvCaretUndo)
private
FText: string;
public
constructor Create(AJvEditor: TJvCustomEditor; ACaretX, ACaretY: Integer;
const AText: string);
procedure Undo; override;
end;
TJvOverwriteUndo = class(TJvCaretUndo)
private
FOldText: string;
FNewText: string;
public
constructor Create(AJvEditor: TJvCustomEditor; ACaretX, ACaretY: Integer;
const AOldText, ANewText: string);
procedure Undo; override;
end;
TJvReLineUndo = class(TJvInsertUndo);
TJvInsertTabUndo = class(TJvInsertUndo);
TJvInsertColumnUndo = class(TJvInsertUndo)
public
procedure Undo; override;
end;
TJvDeleteUndo = class(TJvInsertUndo)
public
procedure Undo; override;
end;
TJvDeleteLineUndo = class(TJvInsertUndo)
public
procedure Undo; override;
procedure Redo; override;
end;
TJvDeleteTrailUndo = class(TJvDeleteUndo);
TJvBackspaceUndo = class(TJvDeleteUndo)
public
procedure Undo; override;
end;
TJvReplaceUndo = class(TJvCaretUndo)
private
FBegX: Integer;
FBegY: Integer;
FText: string;
FNewText: string;
public
constructor Create(AJvEditor: TJvCustomEditor; ACaretX, ACaretY: Integer;
ABegX, ABegY: Integer; const AText, ANewText: string);
procedure Undo; override;
end;
TJvDeleteSelectedUndo = class(TJvDeleteUndo)
public
constructor Create(AJvEditor: TJvCustomEditor; ACaretX, ACaretY: Integer;
const AText: string);
procedure Undo; override;
end;
TJvSelectUndo = class(TJvCaretUndo)
public
constructor Create(AJvEditor: TJvCustomEditor; ACaretX, ACaretY: Integer);
procedure Undo; override;
end;
TJvUnselectUndo = class(TJvSelectUndo);
TJvIndentColumnUndo = class(TJvInsertColumnUndo)
private
FNewCaretX: Integer;
FNewCaretY: Integer;
public
constructor Create(AJvEditor: TJvCustomEditor; ACaretX, ACaretY: Integer;
ABegX, ABegY: Integer; const AText: string);
procedure Undo; override;
end;
TJvUnindentColumnUndo = class(TJvInsertUndo)
private
FBegX: Integer;
FBegY: Integer;
public
constructor Create(AJvEditor: TJvCustomEditor; ACaretX, ACaretY,
ABegX, ABegY: Integer; const AText: string);
procedure Undo; override;
end;
TJvBeginCompoundUndo = class(TUndo)
public
procedure Undo; override;
end;
TJvEndCompoundUndo = class(TJvBeginCompoundUndo);
var
BlockTypeFormat: Integer;
{$IFNDEF COMPILER6_UP}
type
TValueSign = -1..1;
const
NegativeValue = Low(TValueSign);
ZeroValue = 0;
PositiveValue = High(TValueSign);
function Sign(const AValue: Integer): TValueSign; overload;
begin
Result := ZeroValue;
if AValue < 0 then
Result := NegativeValue
else if AValue > 0 then
Result := PositiveValue;
end;
{$ENDIF}
procedure Err;
begin
MessageBeep(0);
end;
function KeyPressed(VK: Integer): Boolean;
begin
Result := GetKeyState(VK) and $8000 = $8000;
end;
procedure GetEndPosCaret(const Text: string; CaretX, CaretY: Integer;
var X, Y: Integer);
{ GetEndPosCaret returns the caret position of the last char. For the position
after the last char of Text you must add 1 to the returned X value. }
begin
GetXYByPos(Text, Length(Text), X, Y);
if Y = 0 then
Inc(X, CaretX)
else
Inc(X);
Dec(X);
Inc(Y, CaretY);
end;
{$IFDEF COMPILER2}
function CompareMem(P1, P2: Pointer; Length: Integer): Boolean; assembler;
asm
PUSH ESI
PUSH EDI
MOV ESI,P1
MOV EDI,P2
MOV EDX,ECX
XOR EAX,EAX
AND EDX,3
SHR ECX,1
SHR ECX,1
REPE CMPSD
JNE @@2
MOV ECX,EDX
REPE CMPSB
JNE @@2
@@1: INC EAX
@@2: POP EDI
POP ESI
end;
{$ENDIF COMPILER2}
//=== TJvControlScrollBar95 ==================================================
constructor TJvControlScrollBar95.Create;
begin
inherited Create;
FPage := 1;
FSmallChange := 1;
FLargeChange := 1;
end;
const
SBKIND: array[TScrollBarKind] of Integer = (SB_HORZ, SB_VERT);
procedure TJvControlScrollBar95.SetParams(AMin, AMax, APosition, APage: Integer);
var
ScrollInfo: TScrollInfo;
begin
if AMax < AMin then
raise EInvalidOperation.Create(SScrollBarRange);
if APosition < AMin then
APosition := AMin;
if APosition > AMax then
APosition := AMax;
if Handle > 0 then
begin
with ScrollInfo do
begin
cbSize := SizeOf(TScrollInfo);
fMask := SIF_DISABLENOSCROLL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -