📄 rvervdata.pas
字号:
unit RVERVData;
{$I RV_Defs.inc}
interface
uses SysUtils, Windows, Graphics, Classes, Controls, Forms,
CRVData, CRVFData, RVRVData, RVItem, RVUndo, RVBack,
DLines, RVFuncs, RVEdit, RVUni,
RVScroll, RichView, RVStyle, ComCtrls, TypInfo, RVClasses,
RVRTFProps,
RVRTFErr;
type
TRVCharPos = class (TCollectionItem)
public
X, DrawItemNo, Offset, MoveRightTo: Integer;
constructor Create(Owner: TCollection); override;
procedure Assign(Source: TPersistent); override;
end;
TRVCharPosCollection = class (TCollection)
private
function GetItem(Index: Integer): TRVCharPos;
procedure SetItem(Index: Integer; const Value: TRVCharPos);
public
property Items[Index: Integer]: TRVCharPos read GetItem write SetItem;
end;
TRVParaListOperation = (rvplopChange, rvplopRemove, rvplopLevel);
TRVUndoDest = (udNone, udUndo, udRedo);
TRVEditRVData = class (TRichViewRVData)
private
FPrevTextStyleNo: Integer;
ResizingControl: TControl;
function InsSomething(var info: TCustomRVItemInfo; var s: String;
AutoTag: Boolean;
var InsertPoint, ItemsAdded: Integer;
var FullReformat: Boolean;
var NewListNo: Integer): Boolean;
function InsEmptyString(Index, Tag, ParaStyle, FontStyle: Integer; SameAsPrev, BR: Boolean):TCustomRVItemInfo;
function InsString(s: String; Index, Tag, ParaStyle, FontStyle: Integer; SameAsPrev, BR: Boolean;
var FullReformat: Boolean): TCustomRVItemInfo;
function InsString2(s: String; Index, Tag: Integer; Source: TCustomRVItemInfo; SameAsPrev, BR: Boolean;
var FullReformat: Boolean): TCustomRVItemInfo;
function CreateTextItem(Tag, ParaStyle, FontStyle: Integer; SameAsPrev, BR: Boolean): TCustomRVItemInfo;
function CreateTextItem2(Tag: Integer; Source: TCustomRVItemInfo; SameAsPrev, BR: Boolean): TCustomRVItemInfo;
procedure InsertString(var s: String; StyleNo: Integer; AutoTag, CaretBefore: Boolean);
procedure DoResizeControl(ItemNo, OldWidth, OldHeight, NewWidth, NewHeight: Integer);
function GetParaEndItemNo(ItemNo: Integer): Integer;
procedure SetParaStyle(StartItemNo,EndItemNo, ParaNo: Integer; var FullReformat: Boolean);
procedure AfterAddingText(StartItemNo,EndItemNo, ItemsAdded, DIStartNo,DIEndNo: Integer;
FullReformat, CaretBefore: Boolean);
protected
CaretHeight: Integer;
CharEnds: TRVCharPosCollection;
function IsProtected(ItemNo: Integer; Option: TRVProtectOption): Boolean;
function IsParaProtected(ParaNo: Integer; Option: TRVParaOption): Boolean;
function IsItemParaProtected(ItemNo: Integer): Boolean;
function IsSticking(FirstItemNo: Integer): Boolean;
procedure DeselectPartiallySelectedItem(NewPartiallySelected: TCustomRVItemInfo); override;
procedure SetPartialSelectedItem(Item: TCustomRVItemInfo); override;
procedure AfterDeleteStyles(TextStylesShift, ParaStylesShift, ListStylesShift: TRVIntegerList); override;
{$IFNDEF RVDONOTUSELISTS}
function ReplicateMarker(ReferenceItemNo, InsertItemNo: Integer; var FullReformat: Boolean;
EditFlag: Boolean): Boolean;
procedure AdjustMarkerCaret(Right: Boolean; var Offs: Integer);
procedure AdjustMarkerPos(var ItemNo, Offs: Integer);
{$ENDIF}
function CaretAtTheBeginningOfParaSection: Boolean;
function CaretAtTheEndOfParaSection: Boolean;
public
FCurTextStyleNo, FCurParaStyleNo: Integer;
UndoList, RedoList: TRVUndoList;
UndoDest: TRVUndoDest;
CaretDrawItemNo: Integer;
CaretOffs: Integer;
procedure MarkStylesInUse(UsedTextStyles, UsedParaStyles, UsedListStyles: TRVIntegerList); override;
function InsertFirstRVFItem(var Index: Integer; var s: String;
var li: TCustomRVItemInfo; EditFlag: Boolean;
var FullReformat: Boolean;
var NewListNo: Integer): Boolean; override;
function GetUndoList: TRVUndoList;
procedure Change;
procedure ChangeEx(ClearRedo: Boolean);
procedure DoOnSelection; override;
procedure Do_ReformateRange(StartNo, EndNo: Integer; SuperReformat: Boolean);
procedure Do_DeleteItem(ItemNo: Integer; var FullReformat: Boolean);
procedure Do_InsertItem(ItemNo: Integer; var s: String; item: TCustomRVItemInfo; FromUndo: Boolean;
var FullReformat: Boolean);
procedure Do_ReplaceItem(ItemNo: Integer; item: TCustomRVItemInfo);
procedure Do_DeleteItems(StartItemNo, EndItemNo: Integer; var FullReformat: Boolean);
procedure Do_InsertItems(ItemNo: Integer; sl: TStringList; FromUndo: Boolean;
var FullReformat: Boolean);
procedure Do_ModifyItem(ItemNo: Integer; const s: String; Item: TCustomRVItemInfo);
function Do_InsertItems_1(ItemNo,Count: Integer): TRVUndoInsertItemsInfo;
procedure Do_InsertItems_2(ItemNo,Count: Integer; ui: TRVUndoInsertItemsInfo;
var FullReformat: Boolean);
procedure Do_DeleteSubstring(ItemNo, Index, ALength: Integer);
procedure Do_InsertSubstring(ItemNo, Index: Integer; const s: String);
procedure Do_NewLine(ItemNo: Integer; SameAsPrev: Boolean; ParaNo: Integer;
var FullReformat: Boolean);
procedure Do_BR(ItemNo: Integer; BR: Boolean; var FullReformat: Boolean);
procedure Do_PageBreak(ItemNo: Integer; PageBreak: Boolean);
procedure Do_ExtraIntProperty(ItemNo: Integer; Prop: TRVExtraItemProperty; Value: Integer);
procedure Do_Concate(FirstItemNo: Integer);
procedure Do_Para(FirstItemNo, EndItemNo, ParaNo: Integer; var FullReformat: Boolean);
procedure Do_ParaList(FirstItemNo: Integer; ParaList: TRVIntegerList; var FullReformat: Boolean);
procedure Do_StyleNo(ItemNo, StyleNo: Integer);
procedure Do_Tag(ItemNo, Tag: Integer; AssignAsIs: Boolean);
procedure Do_AddCP(ItemNo: Integer; Checkpoint: TRVCPInfo);
procedure Do_DeleteCP(ItemNo: Integer);
procedure Do_ChangeText(ItemNo: Integer; const s: String);
procedure Do_ChangeVAlign(ItemNo: Integer; VAlign: TRVVAlign);
procedure Do_Resize(ItemNo: Integer; Width, Height: Integer;Reformat: Boolean);
procedure Do_ItemModifyTerminator(ItemNo: Integer; Opening: Boolean);
function Do_ModifyItemIntProperty(ItemNo: Integer;
SubObject: TObject;
const PropertyName: String;
Value: LongInt;
AffectSize, AffectWidth: Boolean;
UndoInfoClass: TRVUndoInfoClass):TRVUndoModifyItemProps;
function Do_ModifyItemIntProperties(ItemNo: Integer;
SubObject: TObject;
PropList: TStringList;
AffectSize, AffectWidth: Boolean;
UndoInfoClass: TRVUndoInfoClass):TRVUndoModifyItemProps;
procedure BeginUndoSequence(UndoType: TRVUndoType; AllowFinalize: Boolean);
procedure SetUndoGroupMode(GroupUndo: Boolean);
procedure BeginNamedUndoSequence(UndoType: TRVUndoType; const Caption: String;
AllowFinalize: Boolean);
procedure EndUndoSequence;
procedure BeginRedoSequence(UndoType: TRVUndoType; const Caption: String);
procedure GetSelectionBoundsEx(var StartItemNo, StartItemOffs, EndItemNo,
EndItemOffs: Integer; Normalize: Boolean); override;
procedure Clear; override;
procedure PrepareForEdit;
function DeleteSelection_: Boolean;
function CanDelete: Boolean;
procedure InsertTextTyping(text: String);
procedure InsertText_(const text: String; AutoTag, CaretBefore: Boolean);
procedure InsertTextW_(const text: String; AutoTag, CaretBefore: Boolean);
procedure OnEnterPress_(Shift: Boolean);
procedure OnDeletePress_(Ctrl: Boolean; MovedFromLineEnd: Boolean);
procedure OnBackSpacePress_(Ctrl: Boolean; MultiDelete: Boolean);
procedure SetCurTextStyleNo(Value: Integer);
procedure SetCurParaStyleNo(Value: Integer);
procedure ClearTemporal; override;
procedure ApplyParaStyle(ParaStyleNo: Integer; UseConversion: Boolean);
function OnHomePress(Ctrl: Boolean): Boolean;
function OnDownPress(Shift, Ctrl: Boolean): Boolean;
function OnEndPress(Ctrl: Boolean): Boolean;
function OnLeftPress(Shift, Ctrl: Boolean): Boolean;
function OnPgDownPress: Boolean;
function OnPgUpPress: Boolean;
function OnRightPress(Shift, Ctrl: Boolean): Boolean;
function OnUpPress(Shift,Ctrl: Boolean): Boolean;
procedure ChangeCaret(ForceCreate, ScrollToCaret, DontChangeStyle, RefreshBefore: Boolean);
function BuildJumpsCoords(IgnoreReadOnly: Boolean): Integer; dynamic;
procedure ClearJumpsCoords; dynamic;
procedure Format_(OnlyResized,ForceFormat,NoScroll: Boolean; depth: Integer; Canvas: TCanvas; OnlyTail, NoCaching: Boolean); override;
procedure GetSelStart(var DINo, DIOffs: Integer);override;
procedure SrchSelectIt(strt, offs, len: Integer; Invert: Boolean);override;
procedure SrchStart(Down: Boolean; var strt, offs: Integer);override;
function GetCurItemNo: Integer;
function GetOffsetInCurItem: Integer;
function InsertSomething(info: TCustomRVItemInfo; var s: String; AutoTag, CaretBefore: Boolean): Boolean;
function NotFormatted: Boolean;
procedure StartShiftMoving;
procedure EndShiftMoving;
procedure ApplyStyleConversion_(UserData: Integer);
function InsertRVFFromStreamEd_(Stream: TStream): Boolean;
procedure OnChangeCaretLine(DLOffs: Integer);
procedure ConcateAfterAdding(var InsertPoint, LastInserted, ItemsAdded, Offs: Integer);
{$IFNDEF RVDONOTUSERTFIMPORT}
function InsertRTFFromStreamEd_(Stream: TStream): Boolean;
{$ENDIF}
{$IFNDEF RVDONOTUSERTF}
function SaveRTFToStream(Stream: TStream; SelectionOnly: Boolean;
Level: Integer; Color: TColor; Background: TRVBackground; ColorList: TRVColorList;
StyleToFont, ListOverrideOffsetsList1, ListOverrideOffsetsList2: TRVIntegerList;
FontTable: TRVRTFFontTable; tpp: Double):Boolean; override;
{$ENDIF}
function InsertTextFromFile(const FileName: String; OEM, AutoTag: Boolean): Boolean;
function InsertTextFromFileW(const FileName: String; AutoTag: Boolean): Boolean;
procedure KeyPress(var Key: Char);
procedure AdjustControlPlacement(ItemNo: Integer);
procedure ResizeControl(ItemNo, NewWidth, NewHeight: Integer; Reformat: Boolean);
procedure Reformat(FullFormat,ForceFormat, NoScroll: Boolean; ItemNo: Integer; UpdateView: Boolean);
procedure Reformat_(FullFormat: Boolean; StartDrawItem, EndDrawItem, ItemsAdded: Integer);
procedure BeginItemModify(ItemNo: Integer; var ModifyData: Integer);
procedure EndItemModify(ItemNo: Integer; ModifyData: Integer);
procedure SelectCurrentWord;
procedure InsertPageBreak;
{$IFNDEF RVDONOTUSEHTML}
function SaveHTMLToStreamEx(Stream: TStream;
const Path, Title, ImagesPrefix, ExtraStyles,
ExternalCSS, CPPrefix: String;
Options: TRVSaveOptions; Color: TColor;
var CurrentFileColor: TColor;
var imgSaveNo: Integer;
LeftMargin, TopMargin, RightMargin, BottomMargin: Integer;
Background: TRVBackground;
Bullets: TRVList): Boolean; override;
function SaveHTMLToStream(Stream: TStream;
const Path, Title,ImagesPrefix: String;
Options: TRVSaveOptions; Color: TColor;
var imgSaveNo: Integer;
LeftMargin, TopMargin, RightMargin, BottomMargin: Integer;
Background: TRVBackground;
Bullets: TRVList): Boolean; override;
{$ENDIF}
function GetIMEWinCoord: TPoint;
{$IFNDEF RVDONOTUSELISTS}
procedure UpdateAfterMarkers(FirstItemNo, LastMarkerIndex: Integer; ListNos: TRVIntegerList;
ListNo: Integer);
procedure PrepareForUpdateRangeAfterMarkers(StartNo, EndNo: Integer;
ForDeletion: Boolean;
var FirstItemNo, LastMarkerIndex: Integer; var ListNos: TRVIntegerList);
procedure UpdateRangeAfterMarkers(StartNo, EndNo: Integer);
procedure ApplyListStyle_(AListNo, AListLevel, AStartFrom: Integer;
AUseStartFrom, ARecursive: Boolean;
Operation: TRVParaListOperation;
var ItemsAdded, StartNo, EndNo, SelStartNo, SelEndNo: Integer;
ListNos: TRVIntegerList; var LastVWMarkerIndex: Integer);
procedure ApplyListStyle(AListNo, AListLevel, AStartFrom: Integer;
AUseStartFrom, ARecursive: Boolean;
Operation: TRVParaListOperation);
{$ENDIF}
constructor Create(RichView: TRVScroller); override;
destructor Destroy; override;
end;
const RichViewEditCaretWidth: Integer = 1;
RichViewEditCaretHeightExtra: Integer = 0;
RichViewEditMaxCaretHeight: Integer = 1000;
implementation
uses RVStr
{$IFNDEF RVDONOTUSELISTS}
, RVMarker
{$ENDIF}
;
{==============================================================================}
function RV_CreateTextCopy(li: TRVTextItemInfo;
RVData: TCustomRVData): TRVTextItemInfo;
begin
Result := RichViewTextItemClass.Create(RVData);
with Result do begin
Assign(li);
ItemOptions := [];
SameAsPrev := li.SameAsPrev;
{$IFNDEF RVDONOTUSEUNICODE}
if rvioUnicode in li.ItemOptions then
Include(ItemOptions,rvioUnicode);
{$ENDIF}
Tag := RV_CopyTag(li.Tag, rvoTagsArePChars in RVData.Options);
Checkpoint := nil;
end;
end;
{================================== TRVCharPos ================================}
constructor TRVCharPos.Create(Owner: TCollection);
begin
inherited Create(Owner);
X := 0;
DrawItemNo := -1;
Offset := -1;
end;
{------------------------------------------------------------------------------}
procedure TRVCharPos.Assign(Source: TPersistent);
begin
if Source is TRVCharPos then begin
X := TRVCharPos(Source).X;
DrawItemNo := TRVCharPos(Source).DrawItemNo;
Offset := TRVCharPos(Source).Offset;
end;
end;
{============================= TRVCharPosCollection ===========================}
function TRVCharPosCollection.GetItem(Index: Integer): TRVCharPos;
begin
Result := TRVCharPos(inherited GetItem(Index));
end;
{------------------------------------------------------------------------------}
procedure TRVCharPosCollection.SetItem(Index: Integer;
const Value: TRVCharPos);
begin
inherited SetItem(Index, Value);
end;
{================================= TRVEditRVData ==============================}
constructor TRVEditRVData.Create(RichView: TRVScroller);
begin
inherited Create(RichView);
CharEnds := TRVCharPosCollection.Create(TRVCharPos);
CaretDrawItemNo := -1;
CaretOffs := -1;
CaretHeight := 0;
FCurTextStyleNo := 0;
FCurParaStyleNo := 0;
FPrevTextStyleNo := 0;
UndoList := TRVUndoList.Create(TCustomRVFormattedData(Self.GetAbsoluteRootData));
RedoList := TRVUndoList.Create(TCustomRVFormattedData(Self.GetAbsoluteRootData));
TabNavigation := rvtnNone;
end;
{------------------------------------------------------------------------------}
destructor TRVEditRVData.Destroy;
begin
CharEnds.Free;
UndoList.Free;
RedoList.Free;
CharEnds := nil;
UndoList := nil;
RedoList := nil;
inherited Destroy;
end;
{------------------------------------------------------------------------------}
procedure TRVEditRVData.ClearTemporal;
begin
if CharEnds<>nil then
CharEnds.Clear;
CaretDrawItemNo := -1;
CaretOffs := -1;
inherited ClearTemporal;
end;
{------------------------------------------------------------------------------}
procedure TRVEditRVData.Clear;
begin
inherited Clear;
if RichView<>nil then
TCustomRichViewEdit(RichView).Modified := False;
if UndoList<>nil then
UndoList.Clear;
if RedoList<>nil then
RedoList.Clear;
FPrevTextStyleNo := 0;
SetCurParaStyleNo(0);
SetCurTextStyleNo(0);
Include(State, rvstEditorUnformatted);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -