📄 jvunicodeeditor.pas
字号:
{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvUnicodeEditor.PAS, released on 2004-01-25.
The Initial Developers of the Original Code are: Andrei Prygounkov <a dott prygounkov att gmx dott de>
Copyright (c) 1999, 2002 Andrei Prygounkov
All Rights Reserved.
Contributor(s):
Burov Dmitry, translation of russian text.
Andreas Hausladen
Peter Th鰎nqvist
Remko Bonte
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
component : TJvEditor
description : 'Delphi IDE'-like Editor (unicode)
Known Issues:
Some russian comments were translated to english; these comments are marked
with [translated]
-----------------------------------------------------------------------------}
// $Id: JvUnicodeEditor.pas,v 1.45 2005/02/24 12:26:10 ahuser Exp $
unit JvUnicodeEditor;
{$I jvcl.inc}
interface
uses
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
Windows, Messages, Classes, Controls,
JclWideStrings,
JvEditorCommon;
type
TJvCustomWideEditor = class;
TJvEditorWideStrings = class(TWStringList)
private
FJvEditor: TJvCustomWideEditor;
procedure StringsChanged(Sender: TObject);
procedure SetInternal(Index: Integer; const Value: WideString);
procedure ReLine;
procedure SetLockText(const Text: WideString);
protected
procedure Put(Index: Integer; const S: WideString); override;
procedure InternalPut(Index: Integer; const Value: WideString);
property Internal[Index: Integer]: WideString write SetInternal;
property JvEditor: TJvCustomWideEditor read FJvEditor;
public
constructor Create;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
procedure AddStrings(Strings: TWStrings); override;
procedure SetTextStr(const Value: WideString); override;
function Add(const S: WideString): Integer; override;
procedure Insert(Index: Integer; const S: WideString); override;
procedure DeleteText(BegX, BegY, EndX, EndY: Integer);
procedure InsertText(X, Y: Integer; const Text: WideString);
procedure DeleteColumnText(BegX, BegY, EndX, EndY: Integer);
procedure InsertColumnText(X, Y: Integer; const Text: WideString);
end;
TJvWideCompletion = class;
TOnCompletionApplyW = procedure(Sender: TObject; const OldString: WideString;
var NewString: WideString) of object;
TJvGetLineAttrEventW = procedure(Sender: TObject; var Line: WideString; Index: Integer;
var Attrs: TLineAttrs) of object;
TJvCustomWideEditor = class(TJvCustomEditorBase)
private
{ internal objects }
FLines: TJvEditorWideStrings;
{ events }
FOnGetLineAttr: TJvGetLineAttrEventW;
FOnCompletionApply: TOnCompletionApplyW;
{$IFDEF VCL}
procedure WMGetText(var Msg: TWMGetText); message WM_GETTEXT;
{$ENDIF VCL}
{ get/set for properties }
function GetLines: TWStrings;
procedure SetLines(ALines: TWStrings);
function GetCompletion: TJvWideCompletion;
procedure SetCompletion(const Value: TJvWideCompletion);
protected
function GetLineCount: Integer; override;
function GetLineLength(Index: Integer): Integer; override;
function FindNotBlankCharPosInLine(Line: Integer): Integer; override;
function GetAnsiTextLine(Y: Integer; out Text: AnsiString): Boolean; override;
function GetAnsiWordOnCaret: AnsiString; override;
procedure ReLine; override;
function GetTabStop(X, Y: Integer; Next: Boolean): Integer; override;
function GetBackStop(X, Y: Integer): Integer; override;
procedure TextAllChangedInternal(Unselect: Boolean); override;
protected
procedure PaintLineText(Line: Integer; ColBeg, ColEnd: Integer;
var ColPainted: Integer); override;
procedure InsertChar(const Value: Word); override;
protected
procedure SetLockText(const Text: WideString);
function ExpandTabs(const S: WideString): WideString;
function GetAutoIndentStop(Y: Integer): Integer; override;
{ triggers for descendants }
procedure GetLineAttr(var Str: WideString; Line, ColBeg, ColEnd: Integer); virtual;
function DoCommand(ACommand: TEditCommand; var X, Y: Integer;
var CaretUndo: Boolean): Boolean; override;
{ TextModified is called when the editor content has changed. }
procedure TextModified(ACaretX, ACaretY: Integer; Action: TModifiedAction;
const Text: WideString); dynamic;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ClipboardCopy; override;
procedure ClipboardPaste; override;
procedure DeleteSelected; override;
function GetSelText: WideString;
procedure SetSelText(const AValue: WideString);
function GetWordOnCaret: WideString;
procedure SelectWordOnCaret; override;
procedure InsertText(const Text: WideString);
procedure InsertColumnText(X, Y: Integer; const Text: WideString);
procedure ReplaceWord(const NewString: WideString);
procedure ReplaceWord2(const NewString: WideString);
procedure IndentColumns(X: Integer; BegY, EndY: Integer); override;
procedure UnIndentColumns(X: Integer; BegY, EndY: Integer); override;
property SelText: WideString read GetSelText write SetSelText;
public
{ published in descendants }
property Lines: TWStrings read GetLines write SetLines;
property Completion: TJvWideCompletion read GetCompletion write SetCompletion;
property OnGetLineAttr: TJvGetLineAttrEventW read FOnGetLineAttr write FOnGetLineAttr;
property OnCompletionApply: TOnCompletionApplyW read FOnCompletionApply write FOnCompletionApply;
end;
TJvWideEditor = class(TJvCustomWideEditor)
published
property BeepOnError;
property BorderStyle;
property Lines;
property ScrollBars;
property GutterWidth;
property GutterColor;
property RightMarginVisible;
property RightMargin;
property RightMarginColor;
property InsertMode;
property ReadOnly;
property DoubleClickLine;
property HideCaret;
property Completion;
property TabStops;
property SmartTab;
property BackSpaceUnindents;
property AutoIndent;
property KeepTrailingBlanks;
property CursorBeyondEOF;
property BracketHighlighting;
property SelForeColor;
property SelBackColor;
property SelBlockFormat;
property OnGetLineAttr;
property OnChangeStatus;
property OnScroll;
property OnResize;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnChange;
property OnSelectionChange;
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 Font;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ShowHint;
property TabStop;
property Visible;
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;
property OnEnter;
property OnExit;
end;
TJvWideCompletion = class(TJvCompletionBase)
private
FIdentifiers: TWStrings;
FTemplates: TWStrings;
FCaretChar: WideChar;
FCRLF: WideString;
FSeparator: WideString;
function GetStrings(Index: Integer): TWStrings;
procedure SetStrings(Index: Integer; AValue: TWStrings);
procedure ReplaceWord(const NewString: WideString);
protected
procedure FindSelItem(var Eq: Boolean); override;
procedure MakeItems; override;
procedure ReplaceWordItemIndex(SubStrStart: Integer); override;
function GetTemplateCount: Integer; override;
function GetIdentifierCount: Integer; override;
function GetAnsiSeparator: AnsiString; override;
public
constructor Create(AJvEditor: TJvCustomWideEditor);
destructor Destroy; override;
published
property Identifiers: TWStrings index 0 read GetStrings write SetStrings;
property Templates: TWStrings index 1 read GetStrings write SetStrings;
property CaretChar: WideChar read FCaretChar write FCaretChar;
property CRLF: WideString read FCRLF write FCRLF;
property Separator: WideString read FSeparator write FSeparator;
end;
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$RCSfile: JvUnicodeEditor.pas,v $';
Revision: '$Revision: 1.45 $';
Date: '$Date: 2005/02/24 12:26:10 $';
LogPath: 'JVCL\run'
);
{$ENDIF UNITVERSIONING}
implementation
uses
Consts,
{$IFDEF HAS_UNIT_RTLCONSTS}
RTLConsts,
{$ENDIF HAS_UNIT_RTLCONSTS}
SysUtils, Math, Graphics, Clipbrd,
JvUnicodeCanvas, JvJCLUtils, JvThemes, JvConsts, JvResources;
type
TJvInsertUndo = class(TJvCaretUndo)
private
FText: WideString;
function GetEditor: TJvCustomWideEditor;
public
constructor Create(AJvEditor: TJvCustomWideEditor; ACaretX, ACaretY: Integer;
const AText: WideString);
procedure Undo; override;
end;
TJvOverwriteUndo = class(TJvCaretUndo)
private
FOldText: WideString;
FNewText: WideString;
function GetEditor: TJvCustomWideEditor;
public
constructor Create(AJvEditor: TJvCustomWideEditor; ACaretX, ACaretY: Integer;
const AOldText, ANewText: WideString);
procedure Undo; override;
end;
TJvReLineUndo = class(TJvInsertUndo, IJvUndoCompound);
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, IJvUndoCompound);
TJvBackspaceUndo = class(TJvDeleteUndo, IJvBackspaceUndo)
public
procedure Undo; override;
end;
TJvBackspaceUnindentUndo = class(TJvDeleteUndo, IJvBackspaceUnindentUndo)
public
procedure Undo; override;
end;
TJvReplaceUndo = class(TJvCaretUndo)
private
FBegX: Integer;
FBegY: Integer;
FText: WideString;
FNewText: WideString;
function GetEditor: TJvCustomWideEditor;
public
constructor Create(AJvEditor: TJvCustomWideEditor; ACaretX, ACaretY: Integer;
ABegX, ABegY: Integer; const AText, ANewText: WideString);
procedure Undo; override;
end;
TJvDeleteSelectedUndo = class(TJvDeleteUndo)
public
constructor Create(AJvEditor: TJvCustomWideEditor; ACaretX, ACaretY: Integer;
const AText: WideString);
procedure Undo; override;
end;
(* // (ahuser) make Delphi 5 compiler happy
TJvIndentColumnUndo = class(TJvInsertColumnUndo)
private
FNewCaretX: Integer;
FNewCaretY: Integer;
public
constructor Create(AJvEditor: TJvCustomWideEditor; ACaretX, ACaretY: Integer;
ABegX, ABegY: Integer; const AText: WideString);
procedure Undo; override;
end;
*)
TJvUnindentColumnUndo = class(TJvInsertUndo)
private
FBegX: Integer;
FBegY: Integer;
public
constructor Create(AJvEditor: TJvCustomWideEditor; ACaretX, ACaretY,
ABegX, ABegY: Integer; const AText: WideString);
procedure Undo; override;
end;
TJvUndoBufferAccessProtected = class(TJvUndoBuffer);
//=== { TJvEditorWideStrings } ===============================================
constructor TJvEditorWideStrings.Create;
begin
inherited Create;
OnChange := StringsChanged;
end;
destructor TJvEditorWideStrings.Destroy;
begin
OnChange := nil;
OnChanging := nil;
inherited Destroy;
end;
procedure TJvEditorWideStrings.Assign(Source: TPersistent);
begin
JvEditor.BeginUpdate;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -