📄 rvedit.pas
字号:
{================================} unit RVEdit; {==============================}
{ unit RVEdit: }
{ components: }
{ TRichViewEdit (registered in "RichView" palette page) }
{------------------------------------------------------------------------------}
{ Copyright (C) S.Tkachenko }
{==============================================================================}
interface
{$I RV_Defs.inc}
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, RichEdit,
{$IFDEF RVUSEIME}
Imm,
{$ENDIF}
{$IFNDEF RVDONOTUSELISTS}
RVMarker,
{$ENDIF}
{$IFDEF RICHVIEWDEF4}
ImgList,
{$ENDIF}
RVScroll, RVStyle, RVItem, RichView, DLines, Clipbrd, RVFuncs, RVUni,
CRVData, CRVFData, RVRVData,
RVRTFErr;
const
WM_RVUNDOFROMINPLACE = WM_USER+13;
WM_RVREDOFROMINPLACE = WM_USER+14;
{$IFNDEF RICHVIEWCBDEF3}
EM_REDO = WM_USER + 84;
EM_CANREDO = WM_USER + 85;
{$ENDIF}
type
TRVESearchOption = (rvseoMatchCase, rvseoDown, rvseoWholeWord);
TRVESearchOptions = set of TRVESearchOption;
TRVEditorOption = (rvoClearTagOnStyleApp, rvoCtrlJumps, rvoDoNotWantReturns,
rvoDoNotWantShiftReturns,
rvoWantTabs, rvoAutoSwitchLang, rvoHideReadOnlyCaret);
TRVEditorOptions = set of TRVEditorOption;
const
DEFAULT_RVEDITOROPTIONS = [rvoClearTagOnStyleApp];
type
TCustomRichViewEdit = class;
TRVStyleConversionEvent = procedure (Sender: TCustomRichViewEdit;
StyleNo, UserData: Integer;
AppliedToText: Boolean;
var NewStyleNo: Integer) of object;
TRVPasteEvent = procedure (Sender: TCustomRichViewEdit;
var DoDefault: Boolean) of object;
TRVUndoType = (rvutNone, rvutDelete, rvutInsert, rvutPara, rvutMiscTyping,
rvutInsertPageBreak,rvutRemovePageBreak,rvutTyping,
rvutTag, rvutStyleNo,
rvutAddCheckpoint, rvutRemoveCheckpoint, rvutModifyCheckpoint,
rvutModifyItem, rvutList, rvutCustom);
TRVGetOutDirection = (rvdLeft, rvdUp, rvdRight, rvdDown, rvdTop, rvdBottom);
TRVOnCaretGetOutEvent = procedure (Sender: TCustomRichViewEdit;
Direction: TRVGetOutDirection) of object;
TCustomRichViewEdit = class(TCustomRichView)
private
{ Private declarations }
FModified: Boolean;
FOnCurParaStyleChanged,FOnCurTextStyleChanged, FOnChange, FOnChanging, FOnCaretMove: TNotifyEvent;
FReadOnly : Boolean;
FEditorOptions: TRVEditorOptions;
FOnStyleConversion, FOnParaStyleConversion: TRVStyleConversionEvent;
FOnPaste: TRVPasteEvent;
FOnCaretGetOut: TRVOnCaretGetOutEvent;
procedure CheckItemClass(ItemNo: Integer; RequiredClass: TCustomRVItemInfoClass);
procedure WMInputLangChange(var Message: TMessage); message WM_INPUTLANGCHANGE;
procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
procedure WMCut(var Message: TWMCut); message WM_CUT;
procedure WMPaste(var Message: TWMpaste); message WM_PASTE;
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
procedure WMSysChar(var Message: TWMSysChar); message WM_SYSCHAR;
procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
procedure WMUndoFromInplace(var Message: TMessage); message WM_RVUNDOFROMINPLACE;
procedure WMRedoFromInplace(var Message: TMessage); message WM_RVREDOFROMINPLACE;
procedure WMClear(var Message: TMessage); message WM_CLEAR;
procedure WMUndo(var Message: TMessage); message WM_UNDO;
procedure EMUndo(var Message: TMessage); message EM_UNDO;
procedure EMRedo(var Message: TMessage); message EM_REDO;
procedure EMCanUndo(var Message: TMessage); message EM_CANUNDO;
procedure EMCanRedo(var Message: TMessage); message EM_CANREDO;
procedure EMCanPaste(var Message: TMessage); message EM_CANPASTE;
{$IFDEF RVUSEIME}
procedure WMImeStartComposition(var Message: TMessage); message WM_IME_STARTCOMPOSITION;
procedure WMImeComposition(var Message: TMessage); message WM_IME_COMPOSITION;
{$ENDIF}
procedure SetCurParaStyleNo(const Value: Integer);
procedure SetCurTextStyleNo(const Value: Integer);
function GetCurParaStyleNo: Integer;
function GetCurTextStyleNo: Integer;
function GetCurItemStyle: Integer;
function GetCurItemNo: Integer;
function GetOffsetInCurItem: Integer;
procedure ApplyTextStyleConversionProc(Sender: TCustomRichViewEdit; StyleNo, UserData: Integer;
AppliedToText: Boolean;
var NewStyleNo: Integer);
function GetUndoLimit: Integer;
procedure SetUndoLimit(const Value: Integer);
function IsUndoShortcut(Shift: TShiftState; Key: Word): Boolean;
function IsRedoShortcut(Shift: TShiftState; Key: Word): Boolean;
{$IFNDEF RVDONOTUSEUNICODE}
procedure InsertTextW_(const text: String);
{$ENDIF}
procedure SetTabNavigation(const Value: TRVTabNavigationType);
function GetTopLevelEditor: TCustomRichViewEdit;
protected
{ Protected declarations }
LockCount: Integer;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure KeyUp(var Key: Word; Shift: TShiftState); override;
procedure KeyPress(var Key: Char); override;
procedure CreateParams(var Params: TCreateParams); override;
procedure OnEnterPress(Shift: Boolean);
procedure OnBackSpacePress(Ctrl: Boolean);
procedure OnDeletePress(Ctrl: Boolean);
procedure AfterVScroll; override;
procedure AfterHScroll; override;
function GetDataClass: TRichViewRVDataClass; override;
procedure SetReadOnly(const Value: Boolean); virtual;
function GetReadOnly: Boolean; virtual;
property OnCurParaStyleChanged: TNotifyEvent read FOnCurParaStyleChanged write FOnCurParaStyleChanged;
property OnCurTextStyleChanged: TNotifyEvent read FOnCurTextStyleChanged write FOnCurTextStyleChanged;
property OnChange: TNotifyEvent read FOnChange write FOnChange;
property OnCaretMove: TNotifyEvent read FOnCaretMove write FOnCaretMove;
property OnChanging: TNotifyEvent read FOnChanging write FOnChanging;
property OnPaste: TRVPasteEvent read FOnPaste write FOnPaste;
property TabNavigation read GetTabNavigation write SetTabNavigation default rvtnNone;
public
{ Should be protected. Do not use }
FCurStyleConversion: TRVStyleConversionEvent;
function BeforeInserting: Boolean;
procedure AfterInserting;
procedure CurParaStyleChange; dynamic;
procedure CurTextStyleChange; dynamic;
function BeforeChange(FromOutside: Boolean): Boolean; virtual;
procedure DoChange(ClearRedo: Boolean); dynamic;
procedure Selecting; dynamic;
procedure AfterCaretMove;
{ Public declarations }
procedure Change;
procedure InsertText(const text: String; CaretBefore: Boolean {$IFDEF RICHVIEWDEF4}=False{$ENDIF});
procedure InsertStringTag(const s: String; Tag: Integer);
function InsertRVFFromStreamEd(Stream: TStream):Boolean;
function InsertRVFFromFileEd(const FileName: String):Boolean;
function InsertTextFromFile(const FileName: String):Boolean;
function InsertOEMTextFromFile(const FileName: String):Boolean;
function InsertItem(const Name: String; Item: TCustomRVItemInfo): Boolean;
procedure InsertControl(const Name: String; ctrl: TControl; VAlign: TRVVAlign);
procedure InsertPicture(const Name: String; gr: TGraphic; VAlign: TRVVAlign);
procedure InsertHotPicture(const Name: String; gr: TGraphic; VAlign: TRVVAlign);
procedure InsertBreak(Width: Byte; Style: TRVBreakStyle; Color: TColor);
procedure InsertBullet(ImageIndex: Integer; ImageList: TCustomImageList);
procedure InsertHotspot(ImageIndex, HotImageIndex: Integer; ImageList: TCustomImageList);
procedure ConvertToPicture(ItemNo: Integer);
procedure ConvertToHotPicture(ItemNo: Integer);
procedure DeleteSelection;dynamic;
function CanDelete: Boolean;
constructor Create(AOwner: TComponent); override;
procedure InsertPageBreak;
procedure RemoveCurrentPageBreak;
procedure PasteBitmap(TextAsName: Boolean);
procedure PasteMetafile(TextAsName: Boolean);
procedure PasteText;
procedure PasteRVF;
{$IFNDEF RVDONOTUSERTFIMPORT}
function GetBasePathFromHTMLInClipboard: String;
procedure PasteRTF;
function CanPasteRTF: Boolean;
function InsertRTFFromStreamEd(Stream: TStream): Boolean;
function InsertRTFFromFileEd(const FileName: String): Boolean;
{$ENDIF}
procedure Paste; dynamic;
function CanPaste: Boolean; dynamic;
function CanPasteRVF: Boolean;
procedure CutDef;
procedure ApplyParaStyle(ParaStyleNo: Integer);
procedure ApplyTextStyle(TextStyleNo: Integer);
procedure ApplyStyleConversion(UserData: Integer);
procedure ApplyParaStyleConversion(UserData: Integer);
procedure GetCurrentBreakInfo(var AWidth: Byte;
var AStyle: TRVBreakStyle; var AColor: TColor;
var ATag: Integer);
procedure GetCurrentBulletInfo(var AName: String;
var AImageIndex: Integer;
var AImageList: TCustomImageList;
var ATag: Integer);
procedure GetCurrentHotspotInfo(var AName: String;
var AImageIndex, AHotImageIndex: Integer;
var AImageList: TCustomImageList;
var ATag: Integer);
procedure GetCurrentPictureInfo(var AName: String; var Agr: TGraphic;
var AVAlign: TRVVAlign; var ATag: Integer);
procedure GetCurrentControlInfo(var AName: String; var Actrl: TControl;
var AVAlign: TRVVAlign; var ATag: Integer);
procedure GetCurrentTextInfo(var AText: String; var ATag: Integer);
function GetCurrentTag: Integer;
function GetCurrentItemText: String;
function GetCurrentCheckpoint: TCheckpointData;
procedure SetBreakInfoEd(ItemNo: Integer; AWidth: Byte;
AStyle: TRVBreakStyle; AColor: TColor;
ATag: Integer);
procedure SetBulletInfoEd(ItemNo: Integer; const AName: String;
AImageIndex: Integer;
AImageList: TCustomImageList;
ATag: Integer);
procedure SetHotspotInfoEd(ItemNo: Integer; const AName: String;
AImageIndex, AHotImageIndex: Integer;
AImageList: TCustomImageList;
ATag: Integer);
procedure SetPictureInfoEd(ItemNo: Integer; const AName: String;
Agr: TGraphic; AVAlign: TRVVAlign; ATag: Integer);
procedure SetControlInfoEd(ItemNo: Integer; const AName: String;
AVAlign: TRVVAlign; ATag: Integer);
procedure SetItemTagEd(ItemNo: Integer; ATag: Integer);
procedure SetItemExtraIntPropertyEd(ItemNo: Integer; Prop: TRVExtraItemProperty; Value: Integer; AutoReformat: Boolean);
procedure SetCurrentItemExtraIntProperty(Prop: TRVExtraItemProperty; Value: Integer; AutoReformat: Boolean);
function GetCurrentItemExtraIntProperty(Prop: TRVExtraItemProperty; var Value: Integer): Boolean;
procedure SetItemTextEd(ItemNo: Integer; const s: String);
procedure SetCheckpointInfoEd(ItemNo: Integer; ATag: Integer;
const AName: String;
ARaiseEvent: Boolean);
procedure RemoveCheckpointEd(ItemNo: Integer);
procedure SetCurrentBreakInfo(AWidth: Byte;
AStyle: TRVBreakStyle; AColor: TColor;
ATag: Integer);
procedure SetCurrentBulletInfo(const AName: String; AImageIndex: Integer;
AImageList: TCustomImageList;
ATag: Integer);
procedure SetCurrentHotspotInfo(const AName: String;
AImageIndex, AHotImageIndex: Integer;
AImageList: TCustomImageList;
ATag: Integer);
procedure SetCurrentPictureInfo(const AName: String; Agr: TGraphic;
AVAlign: TRVVAlign; ATag: Integer);
procedure SetCurrentControlInfo(const AName: String; AVAlign: TRVVAlign;
ATag: Integer);
procedure SetCurrentItemText(const s: String);
procedure SetCurrentTag(ATag: Integer);
procedure SetCurrentCheckpointInfo(ATag: Integer; const AName: String;
ARaiseEvent: Boolean);
procedure RemoveCurrentCheckpoint;
procedure ResizeControl(ItemNo, NewWidth, NewHeight: Integer);
procedure ResizeCurrentControl(NewWidth, NewHeight: Integer);
procedure AdjustControlPlacement(ItemNo: Integer);
procedure AdjustControlPlacement2(Control: TControl);
function SearchText(s: String; SrchOptions: TRVESearchOptions): Boolean;
procedure SelectCurrentWord;
procedure SelectCurrentLine;
procedure BeginUpdate;
procedure EndUpdate;
procedure Undo; dynamic;
procedure Redo; dynamic;
function UndoAction: TRVUndoType;
function RedoAction: TRVUndoType;
function UndoName: String;
function RedoName: String;
procedure ClearUndo;
procedure SetUndoGroupMode(GroupUndo: Boolean);
procedure BeginUndoGroup(UndoType: TRVUndoType);
procedure BeginUndoCustomGroup(const Name: String);
{$IFNDEF RVDONOTUSEUNICODE}
procedure BeforeUnicode;
function InsertTextFromFileW(const FileName: String):Boolean;
procedure PasteTextW;
function GetCurrentItemTextA: String;
procedure SetItemTextEdA(ItemNo: Integer; const s: String);
procedure SetCurrentItemTextA(const s: String);
{$IFDEF RICHVIEWCBDEF3}
procedure InsertTextW(const text: WideString; CaretBefore: Boolean {$IFDEF RICHVIEWDEF4}=False{$ENDIF});
procedure InsertStringWTag(const s: WideString; Tag: Integer);
function GetCurrentItemTextW: WideString;
procedure SetItemTextEdW(ItemNo: Integer; const s: WideString);
procedure SetCurrentItemTextW(const s: WideString);
{$ENDIF}
{$ENDIF}
procedure BeginItemModify(ItemNo: Integer; var ModifyData: Integer);
procedure EndItemModify(ItemNo: Integer; ModifyData: Integer);
procedure BeginCurrentItemModify(var ModifyData: Integer);
procedure EndCurrentItemModify(ModifyData: Integer);
function GetCurrentItem: TCustomRVItemInfo;
function GetCurrentItemEx(RequiredClass: TCustomRVItemInfoClass;
var ItemRichViewEdit: TCustomRichViewEdit;
var Item: TCustomRVItemInfo): Boolean;
function CanChange: Boolean;
procedure AssignEvents(Source: TCustomRichView);
{$IFNDEF RVDONOTUSELISTS}
procedure ApplyListStyle(AListNo, AListLevel, AStartFrom: Integer;
AUseStartFrom, ARecursive: Boolean);
procedure RemoveLists(ARecursive: Boolean);
procedure ChangeListLevels(LevelDelta: Integer);
{$ENDIF}
procedure GetCurrentLineCol(var Line, Column: Integer);
property Modified: Boolean read FModified write FModified;
property CurItemNo: Integer read GetCurItemNo;
property CurItemStyle: Integer read GetCurItemStyle;
property CurParaStyleNo: Integer read GetCurParaStyleNo write SetCurParaStyleNo;
property CurTextStyleNo: Integer read GetCurTextStyleNo write SetCurTextStyleNo;
property OffsetInCurItem: Integer read GetOffsetInCurItem;
property EditorOptions: TRVEditorOptions read FEditorOptions write FEditorOptions default DEFAULT_RVEDITOROPTIONS;
property ReadOnly: Boolean read GetReadOnly write SetReadOnly;
property UndoLimit: Integer read GetUndoLimit write SetUndoLimit default -1;
property TopLevelEditor: TCustomRichViewEdit read GetTopLevelEditor;
property OnCaretGetOut: TRVOnCaretGetOutEvent read FOnCaretGetOut write FOnCaretGetOut;
property OnParaStyleConversion: TRVStyleConversionEvent read FOnParaStyleConversion write FOnParaStyleConversion;
property OnStyleConversion: TRVStyleConversionEvent read FOnStyleConversion write FOnStyleConversion;
property OnMouseMove;
property OnDragOver;
property OnDragDrop;
end;
TRichViewEdit = class (TCustomRichViewEdit)
published
{ Published declarations: new for TRichViewEdit }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -