📄 crvfdata.pas
字号:
unit CRVFData;
interface
{$I RV_Defs.inc}
uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Clipbrd,
Forms,
RVFuncs, RVStyle, RVItem, CRVData, DLines, RVScroll, RVBack, RVUni,
RVClasses;
type
TCustomRVFormattedData = class;
{-----------------------------------------------------------------------}
{ for internal use }
TRVFlag = (rvflUseJumps, rvflTrim, rvflShareContents, rvflUseExternalLeading,
rvflMouseXYAlwaysCorrect, rvflAllowCustomDrawItems,
rvflPrinting, rvflRootEditor, rvflRoot);
TRVFlags = set of TRVFlag;
{-----------------------------------------------------------------------}
TRVJumpInfo = class
public
RVData: TCustomRVFormattedData;
l,t,w,h: Integer;
id, DrawItemNo: Integer;
Cursor: TCursor;
end;
TRVSoftPageBreakInfo = class
ItemNo, Offset, ExtraData: Integer;
end;
TRVSoftPageBreakList = class (TRVList)
function FindItem(ItemNo: Integer): Integer;
end;
{-----------------------------------------------------------------------}
TCustomRVFormattedData = class (TCustomRVData)
private
LastRaisedCP: TRVCPInfo;
XorImageDrawn: Boolean;
FXORDrawing: TMouseMoveEvent;
FCaptureMouseItem: TCustomRVItemInfo;
FZoomPercent: Integer;
//LastSelectionRect: TRect;
function FindDrawItemAtPos(X, Y: Integer): Integer;
procedure CopyText_;
procedure CopyTextW_;
procedure CopyImage_;
{$IFNDEF RVDONOTUSERVF}
procedure CopyRVF_(Color: TColor; Background: TRVBackground);
{$ENDIF}
{$IFNDEF RVDONOTUSERTF}
procedure CopyRTF_(Color: TColor; Background: TRVBackground);
{$ENDIF}
procedure StartFormatting;
procedure EndFormatting;
procedure SearchHotItem(X, Y, HOffs, VOffs: Integer);
//procedure SetZoomPercent(const Value: Integer);
protected
{ Protected declarations }
MouseX, MouseY: Integer;
Jumps: TList;
nJmps: Integer;
LastItemFormatted: Integer;
LastJumpMovedAbove, LastDIMovedAbove: Integer;
LastRVDataMovedAbove: TCustomRVFormattedData;
LastJumpDowned: Integer;
FPartialSelectedItem: TCustomRVItemInfo;
AlreadyFormatted: Boolean;
FSoftPageBreaks: TRVSoftPageBreakList;
procedure GetIndents(ItemNo: Integer; IsParaStart: Boolean;
var FirstParaItemNo: Integer; var LeftIndent, RightIndent: Integer);
function GetMaxIndent(ItemNo: Integer; var FirstParaItemNo: Integer): Integer;
procedure InternalFreeItem(item: TCustomRVItemInfo; Clearing: Boolean); override;
procedure FindDrawItemForSel(X, Y: Integer; var No, Offs: Integer; Strict: Boolean);
procedure GetScreenLineBounds(DrawItemNo: Integer; var First, Last: Integer);
procedure ApplyZoom(Canvas: TCanvas);
procedure ZoomRectDown(var r: TRect);
procedure ZoomInt(var v: Integer);
procedure RestoreZoom(Canvas: TCanvas);
procedure FinishScreenLine(const sad: TRVScreenAndDevice;
LineWidth, LastDrawItem: Integer;
parafinished: Boolean;
var ExtraSpace: Integer;
var dontdoit: Boolean);
procedure FormatLine(const Text: String;
StartOffs, Len, ItemNo: Integer;
var x,baseline,prevdesc,prevabove:Integer;
Canvas: TCanvas;
var sad: TRVScreenAndDevice;
var IsParaStart: Boolean;
var LineWidth, FirstIndent, LastDrawItem, VerticalOffs: Integer;
var DontFSL: Boolean;
var LastTextStyle: Integer;
var TextMetric: TTextMetric;
var FirstParaItemNo: Integer;
NoCaching: Boolean);
procedure FormatWords(ItemNo: Integer;
var x,baseline,prevdesc,prevabove:Integer;
Canvas: TCanvas;
var sad: TRVScreenAndDevice;
var IsParaStart: Boolean;
var LineWidth, FirstIndent, LastDrawItem, VerticalOffs: Integer;
var DontFSL: Boolean;
var LastTextStyle: Integer;
var TextMetric: TTextMetric;
var FirstParaItemNo: Integer;
NoCaching: Boolean);
{$IFNDEF RVDONOTUSERVF}
procedure RVFGetLimits(SaveScope: TRVFSaveScope;
var StartItem, EndItem, StartOffs, EndOffs: Integer;
var StartPart, EndPart: TRVMultiDrawItemPart); override;
{$ENDIF}
function GetClientSelectionRect: TRect;
procedure GetSADForFormatting(Canvas: TCanvas; var sad: TRVScreenAndDevice); virtual;
procedure DeselectPartiallySelectedItem(NewPartiallySelected: TCustomRVItemInfo); dynamic;
procedure SetPartialSelectedItem(Item: TCustomRVItemInfo); virtual;
procedure Formatted(FirstItemNo, LastItemNo: Integer; Partial: Boolean); dynamic;
function GetInplaceEditor: TControl; dynamic;
procedure DestroyInplaceEditor; dynamic;
procedure ClearLastJump;
function InsideSelection(DItemNo, DItemOffs: Integer): Boolean;
procedure AfterDeleteStyles(TextStylesShift, ParaStylesShift, ListStylesShift: TRVIntegerList); override;
procedure ResetSubCoords; dynamic;
procedure ConcateItems(FirstItemNo: Integer);
public
FActiveItem: TCustomRVItemInfo;
DocumentWidth: Integer;
DocumentHeight, TextWidth,FocusedItemNo: Integer;
DrawItems: TRVDrawLines;
FSelStartNo, FSelEndNo, FSelStartOffs, FSelEndOffs: Integer;
{ Declarations that should be protected }
procedure AssignSoftPageBreaks(RVPrint: TComponent);
procedure ClearSoftPageBreaks;
procedure Normalize;
function GetOffsBeforeDrawItem(DrawItemNo: Integer): Integer;
function GetOffsAfterDrawItem(DrawItemNo: Integer): Integer;
function GetEditor: TWinControl; dynamic;
procedure GetItemAt(X,Y: Integer; var ItemNo, OffsetInItem: Integer);
procedure GetItemAtEx(X,Y: Integer; var RVData: TCustomRVFormattedData; var ItemNo, OffsetInItem: Integer;
Strict: Boolean);
function FindWordAt(var Word: String; X, Y: Integer; var StyleNo,
ItemNo, Offs: Integer; var RVData: TCustomRVFormattedData): Boolean;
function GetNextFocusedItem(ItemNo: Integer; GoForward: Boolean;
var TopLevelRVData: TCustomRVFormattedData;
var TopLevelItemNo: Integer): Integer;
procedure ClearFocus;
procedure AdjustFocus(NewFocusedItemNo: Integer; TopLevelRVData: TPersistent; TopLevelItemNo: Integer); dynamic;
procedure GetOrigin(var ALeft, ATop: Integer); virtual;
procedure GetOriginEx(var ALeft, ATop: Integer); dynamic;
procedure BuildJumpsCoords(var StartJumpNo: Integer; jumps: TList);
procedure ShowRectangle(Left, Top, Width, Height: Integer); dynamic;
function GetFlags: TRVFlags; virtual; abstract;
procedure SetFlags(const Value: TRVFlags); virtual; abstract;
function GetAreaWidth: Integer; virtual; abstract;
function GetLeftMargin: Integer; virtual; abstract;
function GetRightMargin: Integer; virtual; abstract;
function GetTopMargin: Integer; virtual; abstract;
function GetBottomMargin: Integer; virtual; abstract;
function GetMinTextWidth: Integer; virtual; abstract;
function GetMaxTextWidth: Integer; virtual; abstract;
function GetBackground: TRVBackground; virtual; abstract;
property Flags: TRVFlags read GetFlags write SetFlags;
procedure GetSelBounds(var StartNo, EndNo, StartOffs, EndOffs: Integer; Normalize: Boolean);
procedure StoreSelBounds(var StartNo, EndNo, StartOffs, EndOffs: Integer; Normalize: Boolean);
procedure RestoreSelBounds(StartNo, EndNo, StartOffs, EndOffs: Integer);
procedure DrawItem2Item(DrawItemNo, DrawItemOffs: Integer; var ItemNo, ItemOffs: Integer);
procedure Item2FirstDrawItem(ItemNo: Integer; var DrawItemNo: Integer);
procedure AdjustJumpsCoords;
procedure AdjustVScrollUnits; virtual; abstract;
procedure SetDocumentAreaSize(Width,Height: Integer; UpdateH: Boolean); virtual; abstract;
function FindDrawItemByItem(ItemNo: Integer): Integer;
function GetFirstVisible(TopLine: Integer): Integer;
procedure DoCopy; dynamic;
function IsAssignedCopy: Boolean; dynamic;
function IsAssignedRVMouseUp: Boolean; dynamic; abstract;
function IsAssignedRVMouseDown: Boolean; dynamic; abstract;
function IsAssignedRVRightClick: Boolean; dynamic;
function IsAssignedJump: Boolean; dynamic; abstract;
function IsAssignedRVDblClick: Boolean; dynamic;
function IsAssignedCheckpointVisible: Boolean; dynamic; abstract;
procedure DoRVMouseUp(Button: TMouseButton; Shift: TShiftState;
ItemNo, X, Y: Integer); dynamic; abstract;
procedure DoRVMouseDown(Button: TMouseButton; Shift: TShiftState;
ItemNo, X, Y: Integer); dynamic; abstract;
procedure DoRVRightClick(const ClickedWord: String; StyleNo, X, Y: Integer);dynamic;
procedure DoJump(id: Integer); dynamic; abstract;
procedure DoRVMouseMove(id: Integer); dynamic; abstract;
procedure DoRVDblClick(const ClickedWord: String;
StyleNo: Integer); dynamic;
procedure DoSelect; dynamic;
procedure DoCheckpointVisible(CheckpointData: TCheckpointData); dynamic; abstract;
function GetNormalCursor: TCursor; dynamic; abstract;
function GetCPEventKind: TCPEventKind; dynamic;
procedure DoOnSelection; dynamic;
procedure InvalidateJumpRect(id: Integer);
procedure Refresh;
procedure UpdateView;
procedure Invalidate;
procedure InvalidateRect(const r: TRect);
function ClientToScreen(const p: TPoint): TPoint; dynamic;
function ScreenToClient(const p: TPoint): TPoint; dynamic;
procedure GetSelStart(var DINo, DIOffs: Integer);dynamic;
procedure SrchSelectIt(strt, offs, len: Integer; Invert: Boolean); dynamic;
procedure SrchStart(Down: Boolean; var strt, offs: Integer);dynamic;
property PartialSelectedItem: TCustomRVItemInfo read FPartialSelectedItem write SetPartialSelectedItem;
function GetHOffs: Integer; virtual;
function GetVOffs: Integer; virtual;
function GetZHOffs: Integer;
function GetZVOffs: Integer;
procedure SetMouseCapture(Item: TCustomRVItemInfo; var Left,Top: Integer);
procedure ReleaseMouseCapture(Item: TCustomRVItemInfo);
function GetWidth: Integer; virtual; abstract;
function GetHeight: Integer; virtual; abstract;
function GetCanvas: TCanvas; virtual;
procedure ScrollTo(Y: Integer; Redraw: Boolean); virtual; abstract;
procedure HScrollTo(X: Integer); virtual; abstract;
function GetVSmallStep: Integer; virtual; abstract;
procedure XorDrawing;
procedure XorDrawingEx(X,Y: Integer);
function ClearXorDrawing: Boolean;
procedure AssignXorDrawing(P: TMouseMoveEvent);
function UsingThisXorDrawing(P: TMouseMoveEvent): Boolean;
procedure UnAssignXorDrawing(P: TMouseMoveEvent);
procedure SetCursor(Cursor: TCursor); dynamic;
function CalculatePureParaSectionWidth(ItemNo: Integer;
var FirstParaItemNo: Integer; sad: PRVScreenAndDevice; Canvas: TCanvas): Integer;
function CalculateParaSectionMinWidth(StartItemNo: Integer;
var FirstParaItemNo: Integer; sad: PRVScreenAndDevice;
Canvas: TCanvas): Integer;
function CalculateParaSectionMinWidthDef(StartItemNo: Integer): Integer;
function CalculateParaSectionsMinWidth(StartItemNo, EndItemNo: Integer;
var FirstParaItemNo: Integer; sad: PRVScreenAndDevice;
Canvas: TCanvas): Integer;
function CalculateParaSectionsMinWidthDef(StartItemNo, EndItemNo: Integer): Integer;
function CalculateMinItemWidthPlus_WithoutPSWidth(ItemNo: Integer;
sad: PRVScreenAndDevice; Canvas: TCanvas): Integer;
function CalculateMinItemsWidthPlus(StartItemNo, EndItemNo: Integer;
var FirstParaItemNo: Integer; sad: PRVScreenAndDevice;
Canvas: TCanvas): Integer;
function CalculateMinItemWidthPlusEx(ItemNo: Integer): Integer;
function CalculateMinItemsWidthPlusEx(StartItemNo, EndItemNo: Integer): Integer;
function CalculateMinDocWidthPlus(sad: PRVScreenAndDevice; Canvas: TCanvas): Integer;
function CalculateMinWidthAfterInsert(item:TCustomRVItemInfo; InsertItemNo: Integer): Integer;
procedure Item2DrawItem(ItemNo, ItemOffs: Integer; var DrawItemNo, DrawItemOffs: Integer);
procedure ClearTemporal;virtual;
procedure Clear; override;
procedure ClearJumps;
procedure AdjustChildrenCoords;
procedure Format_(OnlyResized, ForceFormat, NoScroll: Boolean; depth: Integer; Canvas: TCanvas; OnlyTail, NoCaching: Boolean); virtual;
procedure Format(NoCaching: Boolean);
function GetDrawItemNo(BoundLine: Integer; Option: Integer): Integer;
procedure MouseLeave;
procedure MouseMove(Shift: TShiftState; X, Y: Integer);
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);dynamic;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);dynamic;
procedure DblClick;
procedure AfterVScroll;
procedure UpdateBackgroundPaletteInfo(Background: TRVBackground);
function UpdatingBackgroundPalette: Boolean;
procedure OnTimerScroll;
function GetColor: TColor; virtual; abstract;
procedure AssignChosenRVData(RVData: TCustomRVFormattedData;
Item: TCustomRVItemInfo); dynamic;
procedure SilentReplaceChosenRVData(RVData: TCustomRVFormattedData); dynamic;
procedure UnassignChosenRVData(RVData: TCustomRVData); dynamic;
{ moved from editor }
procedure GetParaBounds(DINo1, DINo2: Integer; var ParaStart, ParaEnd: Integer);
procedure FormatParas(StartDrawItemNo, EndDrawItemNo, ItemsInserted: Integer);
procedure FormatParasExact(StartDrawItemNo, EndDrawItemNo, ItemsInserted: Integer; NoCaching: Boolean);
{ Public declarations }
constructor Create;
destructor Destroy; override;
procedure PaintTo(Canvas: TCanvas; AClipRect: TRect);
function GetFirstItemVisible: Integer; dynamic;
function GetLastItemVisible: Integer; dynamic;
function SearchText(Down, MatchCase, WholeWord: Boolean; s: String): Boolean;
procedure GetWordAt(X, Y: Integer; var RVData: TCustomRVFormattedData; var ItemNo: Integer; var Word: String);
procedure SelectWordAt(X, Y: Integer);
procedure Deselect(NewPartiallySelected: TCustomRVItemInfo; MakeEvent: Boolean); dynamic;
procedure SelectAll;
function SelectionExists(AllowReset: Boolean; UsePartialSelected: Boolean): Boolean;
function GetSelText(Unicode: Boolean): String;
function GetSelectedImage: TGraphic;
procedure GetSelectionBounds(var StartItemNo, StartItemOffs, EndItemNo,
EndItemOffs: Integer; Normalize: Boolean);
procedure GetSelectionBoundsEx(var StartItemNo, StartItemOffs, EndItemNo,
EndItemOffs: Integer; Normalize: Boolean); dynamic;
procedure SetSelectionBounds(StartItemNo, StartItemOffs, EndItemNo,
EndItemOffs: Integer);
function GetSelectionRect: TRect;
procedure GetCheckpointXY(CheckpointData: TCheckpointData; var X, Y: Integer);
function GetCheckpointYEx(CheckpointData: TCheckpointData): Integer;
function GetJumpPointY(id: Integer): Integer;
function GetJumpPointItemNo(id: Integer): Integer;
procedure GetJumpPointLocation(id: Integer; var RVData: TCustomRVFormattedData; var ItemNo: Integer);
procedure DeleteItems(FirstItemNo, Count: Integer); override;
procedure DeleteParas(FirstItemNo, LastItemNo: Integer);
{$IFNDEF RVDONOTUSERVF}
procedure CopyRVF(Color: TColor; Background: TRVBackground);
{$ENDIF}
{$IFNDEF RVDONOTUSERTF}
procedure CopyRTF(Color: TColor; Background: TRVBackground);
{$ENDIF}
procedure CopyText;
procedure CopyTextW;
procedure CopyImage;
procedure Copy(Color: TColor; Background: TRVBackground);
function CopyDef(Color: TColor; Background: TRVBackground): Boolean;
procedure SelectLine(ItemNo, Offs: Integer);
function GetLineNo(ItemNo, ItemOffs: Integer): Integer;
function GetItemCoords(ItemNo: Integer;var Left,Top: Integer): Boolean;
function GetItemClientCoords(ItemNo: Integer;var Left,Top: Integer): Boolean;
property CaptureMouseItem: TCustomRVItemInfo read FCaptureMouseItem;
//property ZoomPercent:Integer read FZoomPercent write SetZoomPercent;
end;
const
RichViewSafeFormatting:Boolean = False;
implementation
uses RichView, RVCtrlData, RVStr, PtblRV, PtRVData
{$IFNDEF RVDONOTUSELISTS}
, RVMarker
{$ENDIF}
;
{==============================================================================}
const gdinFirstVisible = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -