📄 crvdata.pas
字号:
unit CRVData;
interface
{$I RV_Defs.inc}
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
{$IFNDEF RVDONOTUSEJPEGIMAGE}
Jpeg,
{$ENDIF}
{$IFNDEF RVDONOTUSELISTS}
RVMarker,
{$ENDIF}
{$IFDEF RICHVIEWDEF4}
ImgList,
{$ENDIF}
RVBack, RVFuncs, RVItem, RVScroll, RVStyle, RVUni, RVClasses,
RVRTFErr;
type
TRVRTFFontTable = class;
{-----------------------------------------------------------------------}
TRVLayoutInfo = class
public
Loaded: Boolean;
LeftMargin, RightMargin, TopMargin, BottomMargin: Integer;
MinTextWidth, MaxTextWidth: Integer;
BiDiMode: TRVBiDiMode;
procedure SaveToStream(Stream: TStream; IncludeSize: Boolean);
procedure LoadFromStream(Stream: TStream; IncludeSize: Boolean);
procedure SaveTextToStream(Stream: TStream);
procedure LoadText(const s: String);
procedure LoadBinary(const s: String);
end;
{-----------------------------------------------------------------------}
TRVHTMLBulletInfo = class
public
FileName: String;
ImageList: TCustomImageList;
ImageIndex: Integer;
BackColor: TColor;
Graphic: TGraphic;
end;
TRVState = (rvstMakingSelection, rvstDrawHover,
rvstSkipFormatting, rvstFormatParas, rvstIgnoreNextMouseDown,
rvstChangingBkPalette, rvstCompletelySelected,
rvstClearing, rvstResizing, rvstDoNotMoveChildren,
rvstForceStyleChangeEvent, rvstIgnoreNextChar,
rvstDoNotTab, rvstDeselecting, rvstUnAssigningChosen,
rvstNoScroll, rvstFinalizingUndo, rvstRTFSkipPar,
rvstLoadingAsPartOfItem, rvstMarkersBadlyNeeded,
rvstReformatParentOnExit, rvstNoKillFocusEvents,
rvstEditorUnformatted, rvstNameSet
{$IFDEF RVMUDESELECT}
, rvstMidSelClicked
{$ENDIF}
);
TRVStates = set of TRVState;
TRVFSaveScope = (rvfss_Full, rvfss_Selection, rvfss_Page);
PRVIntegerList = ^TRVIntegerList;
TCustomRVData = class;
TCustomRVData = class(TPersistent)
private
{ Private declarations }
FFirstJumpNo: Integer;
FItems: TStringList;
function GetPageBreaksBeforeItems(Index: Integer): Boolean;
procedure SetPageBreaksBeforeItems(Index: Integer; Value: Boolean);
function GetItemCount: Integer;
protected
{ Protected declarations }
FAllowNewPara: Boolean;
FirstCP, LastCP, NotAddedCP: TRVCPInfo;
CPCount: Integer;
function NextCharStr(const str: String; ItemNo, Index: Integer): Integer;
function PrevCharStr(const str: String; ItemNo, Index: Integer): Integer;
function NextChar(ItemNo: Integer; Index: Integer): Integer;
function PrevChar(ItemNo: Integer; Index: Integer): Integer;
procedure CheckItemClass(ItemNo: Integer;
RequiredClass: TCustomRVItemInfoClass);
function ShareItems: Boolean; dynamic;
function CanLoadLayout: Boolean; dynamic;
function GetDoInPaletteMode: TRVPaletteAction; virtual;
function GetRVPalette: HPALETTE; virtual;
function GetRVLogPalette: PLogPalette; virtual;
function GetURL(id: Integer): String; dynamic; abstract;
function GetOptions: TRVOptions; virtual;
procedure SetOptions(const Value: TRVOptions); virtual;
function GetRVFOptions: TRVFOptions; virtual;
procedure SetRVFOptions(const Value: TRVFOptions); virtual;
function GetRTFOptions: TRVRTFOptions; virtual;
procedure SetRTFOptions(const Value: TRVRTFOptions); virtual;
function GetRVFWarnings: TRVFWarnings; virtual;
procedure SetRVFWarnings(const Value: TRVFWarnings); virtual;
function GetDelimiters: String; dynamic;
function GetRVFTextStylesReadMode: TRVFReaderStyleMode; virtual;
function GetRVFParaStylesReadMode: TRVFReaderStyleMode; virtual;
procedure RVFGetLimits(SaveScope: TRVFSaveScope;
var StartItem, EndItem, StartOffs, EndOffs: Integer;
var StartPart, EndPart: TRVMultiDrawItemPart); dynamic;
function GetRTFProperties:TPersistent {TRVRTFReaderProperties}; dynamic;
{$IFNDEF RVDONOTUSERVF}
function InsertRVFFromStream_(Stream: TStream;
var Index: Integer;
AParaNo: Integer;
AllowReplaceStyles, AppendMode, EditFlag: Boolean;
var Color: TColor;
Background: TRVBackground;
Layout: TRVLayoutInfo;
var NonFirstItemsAdded: Integer;
var Protect, FullReformat: Boolean):Boolean;
procedure DataWriter(Stream: TStream);
procedure DataReader(Stream: TStream);
{$ENDIF}
procedure NormalizeParas(StartItemNo: Integer);
procedure InsertCheckpoint(ItemNo, Tag: Integer; const Name: String; RaiseEvent: Boolean);
procedure UpdateCPPos(cp: TRVCPInfo; ItemNo: Integer);
procedure UnlinkCheckpoint(cp: TRVCPInfo; DecCPCount: Boolean);
function FindCPBeforeItem(ItemNo: Integer): TRVCPInfo;
procedure UpdateCPItemNo;
procedure InternalFreeItem(item: TCustomRVItemInfo; Clearing: Boolean); virtual;
function IsDelimiterA(ch: Char): Boolean;
function IsDelimiterW(ch: Word): Boolean;
function IsDelimiter(const s: String; Index: Integer; ItemOptions: TRVItemOptions): Boolean;
function GetItemOptions(ItemNo: Integer): TRVItemOptions;
procedure Replace0(var s: String);
function RV_CanConcateItems(FirstItemNo: Integer;
li1, li2: TCustomRVItemInfo;
IgnorePara: Boolean): Boolean;
procedure SimpleConcate(FirstItemNo: Integer; li1, li2: TCustomRVItemInfo);
procedure MassSimpleConcate(FirstItemNo, LastItemNo: Integer);
procedure AfterDeleteStyles(TextStylesShift, ParaStylesShift, ListStylesShift: TRVIntegerList); dynamic;
procedure InitStyleMappings(var PTextStylesMapping, PParaStylesMapping, PListStylesMapping: PRVIntegerList); dynamic;
procedure DoneStyleMappings(PTextStylesMapping, PParaStylesMapping, PListStylesMapping: PRVIntegerList); dynamic;
function SupportsPageBreaks: Boolean; dynamic;
procedure AdjustInItemsRange(var ItemNo: Integer);
{$IFNDEF RVDONOTUSEHTML}
procedure SaveHTMLCheckpoint(Stream: TStream;
Checkpoint: TRVCPInfo; var cpno: Integer;
const Prefix: String;
FromNewLine: Boolean;
Options: TRVSaveOptions);
{$ENDIF}
function GetFirstParaItem(ItemNo: Integer): Integer;
function GetFirstParaSectionItem(ItemNo: Integer): Integer;
{$IFNDEF RVDONOTUSELISTS}
procedure DestroyMarkers; dynamic;
function FindPreviousMarker(ItemNo: Integer): TRVMarkerItemInfo;
function FindMarkerLocalLocationFrom(StartItemNo: Integer;
Marker: TRVMarkerItemInfo): Integer;
function FindLastMarkerIndex(StartAfterMeIndex: Integer; ListStyles: TRVIntegerList): Integer;
{$ENDIF}
public
{ Declarations that should be protected }
State: TRVStates;
procedure ExpandToParaSection(ItemNo1,ItemNo2: Integer; var FirstItemNo, LastItemNo: Integer);
procedure ExpandToPara(ItemNo1,ItemNo2: Integer; var FirstItemNo, LastItemNo: Integer);
function GetBiDiMode: TRVBiDiMode; virtual;
function GetItemBiDiMode(ItemNo: Integer): TRVBiDiMode;
function GetParaBiDiMode(ParaNo: Integer): TRVBiDiMode;
function GetExtraRTFCode(Area: TRVRTFSaveArea; Obj: TObject; Index1, Index2: Integer; InStyleSheet: Boolean): String; dynamic;
function GetExtraHTMLCode(Area: TRVHTMLSaveArea; CSSVersion: Boolean): String; dynamic;
function ItemLength(ItemNo: Integer): Integer;
procedure ReadHyperlink(const Target, Extras: String; DocFormat: TRVLoadFormat;
var StyleNo, ItemTag: Integer; var ItemName: String); dynamic;
function InsertFirstRVFItem(var Index: Integer; var s: String;
var li: TCustomRVItemInfo; EditFlag: Boolean;
var FullReformat: Boolean;
var NewListNo: Integer): Boolean; dynamic;
function GetNextFileName(const ImagesPrefix, Path, Ext: String;
var imgSaveNo: Integer;
OverrideFiles: Boolean): String; dynamic;
function GetRVData: TCustomRVData; virtual;
function GetSourceRVData: TCustomRVData; virtual;
function GetStyleCodePage(StyleNo: Integer): TRVCodePage;
function GetDefaultCodePage: TRVCodePage;
procedure FreeCheckpoint(var cp: TRVCPInfo; AdjustLinks, DecCPCount: Boolean);
procedure SetCP(Item: TCustomRVItemInfo; var PrevCP, CP: TRVCPInfo);
procedure FreeItem(ItemNo: Integer; Clearing: Boolean);
procedure Clear; dynamic;
function ReplaceTabs(const s: String; StyleNo: Integer; UnicodeDef: Boolean): String;
function SaveComponentToFile(const Path: String;
SaveMe: TComponent;
SaveFormat: TRVSaveFormat): String; virtual;
function SavePicture(DocumentSaveFormat: TRVSaveFormat;
const imgSavePrefix, Path: String;
var imgSaveNo: Integer;
OverrideFiles: Boolean;
CurrentFileColor: TColor;
gr: TGraphic): String; virtual;
function RVFPictureNeeded(const ItemName: String; ItemTag: Integer): TGraphic; dynamic;
procedure ControlAction(ControlAction: TRVControlAction; ItemNo: Integer;
Item: TCustomRVItemInfo);
procedure ItemAction(ItemAction: TRVItemAction; Item: TCustomRVItemInfo;
var Text: String; RVData: TCustomRVData); virtual;
procedure ControlAction2(ControlAction: TRVControlAction; ItemNo: Integer;
var Control: TControl); dynamic; abstract;
function RVFControlNeeded(const ItemName: String; ItemTag: Integer): TControl; dynamic;
function RVFImageListNeeded(ImageListTag: Integer): TCustomImageList; dynamic;
procedure HTMLSaveImage(RVData: TCustomRVData; ItemNo: Integer;
const Path: String; BackgroundColor: TColor;
var Location: String; var DoDefault: Boolean); dynamic; abstract;
function GetRVStyle: TRVStyle; virtual;
function GetParentControl: TWinControl; dynamic;
procedure ShareItemsFrom(Source: TCustomRVData);
procedure UpdateItemsPaletteInfo;
procedure DrainFrom(Victim: TCustomRVData);
procedure SetParagraphStyleToAll(ParaNo: Integer);
procedure MakeRTFTables(ColorList: TRVColorList; ListOverrideCountList: TRVIntegerList; TopLevel: Boolean);
procedure MarkStylesInUse(UsedTextStyles, UsedParaStyles, UsedListStyles: TRVIntegerList); dynamic;
procedure UpdateStyles(TextStylesShift, ParaStylesShift, ListStylesShift: TRVIntegerList);
procedure GetParentInfo(var ParentItemNo: Integer;
var Location: TRVStoreSubRVData); dynamic;
function GetChosenRVData: TCustomRVData; dynamic;
function GetChosenItem: TCustomRVItemInfo; dynamic;
{ Public declarations }
constructor Create;
destructor Destroy; override;
procedure DeleteUnusedStyles(TextStyles, ParaStyles, ListStyles: Boolean);
procedure AddItem(const Text: String; Item: TCustomRVItemInfo);
procedure AddBreakExTag(Width: Byte; Style: TRVBreakStyle;
Color: TColor; Tag: Integer);
procedure AddBreak;
procedure AddBreakEx(Width: Byte; Style: TRVBreakStyle; Color: TColor);
procedure AddBreakTag(Tag: Integer);
procedure AddFmt(const FormatStr: String; const Args: array of const;
StyleNo, ParaNo: Integer);
procedure AddNL(const s: String; StyleNo, ParaNo: Integer);
procedure AddNLTag(const s: String; StyleNo, ParaNo, Tag: Integer);
procedure AddTextNL(s: String; StyleNo, FirstParaNo, OtherParaNo: Integer
{$IFDEF RICHVIEWDEF4};Tag: Integer=0{$ENDIF});
procedure AddTextBlockNL(s: String; StyleNo, ParaNo: Integer
{$IFDEF RICHVIEWDEF4};Tag: Integer=0{$ENDIF});
procedure AddBulletEx(const Name: String; ImageIndex: Integer;
ImageList: TCustomImageList; ParaNo: Integer);
procedure AddBulletExTag(const Name: String; ImageIndex: Integer;
ImageList: TCustomImageList; ParaNo, Tag: Integer);
procedure AddHotspotEx(const Name: String; ImageIndex,
HotImageIndex: Integer; ImageList: TCustomImageList; ParaNo: Integer);
procedure AddHotspotExTag(const Name: String; ImageIndex,
HotImageIndex: Integer; ImageList: TCustomImageList;
ParaNo, Tag: Integer);
function AddNamedCheckpointExTag(const CpName: String; RaiseEvent: Boolean;
Tag: Integer): Integer;
procedure AddPictureExTag(const Name: String; gr: TGraphic; ParaNo: Integer;
VAlign: TRVVAlign; Tag: Integer);
procedure AddControlExTag(const Name: String; ctrl: TControl;
ParaNo: Integer; VAlign: TRVVAlign; Tag: Integer);
procedure AddPictureEx(const Name: String; gr: TGraphic; ParaNo: Integer;
VAlign: TRVVAlign);
procedure AddControlEx(const Name: String; ctrl: TControl;
ParaNo: Integer; VAlign: TRVVAlign);
procedure AddHotPicture(const Name: String; gr: TGraphic; ParaNo: Integer;
VAlign: TRVVAlign);
procedure AddHotPictureTag(const Name: String; gr: TGraphic; ParaNo: Integer;
VAlign: TRVVAlign; Tag: Integer);
function GetFirstCheckpoint: TCheckpointData;
function GetNextCheckpoint(CheckpointData: TCheckpointData): TCheckpointData;
function GetLastCheckpoint: TCheckpointData;
function GetPrevCheckpoint(CheckpointData: TCheckpointData): TCheckpointData;
function GetItemCheckpoint(ItemNo: Integer):TCheckpointData;
function FindCheckpointByName(const Name: String): TCheckpointData;
function FindCheckpointByTag(Tag: Integer): TCheckpointData;
function GetCheckpointByNo(No: Integer): TCheckpointData;
function GetCheckpointItemNo(CheckpointData: TCheckpointData): Integer;
function GetCheckpointNo(CheckpointData: TCheckpointData): Integer;
procedure GetCheckpointInfo(CheckpointData: TCheckpointData;
var Tag: Integer; var Name: String;
var RaiseEvent: Boolean);
procedure GetBreakInfo(ItemNo: Integer; var AWidth: Byte;
var AStyle: TRVBreakStyle; var AColor: TColor;
var ATag: Integer);
procedure GetBulletInfo(ItemNo: Integer; var AName: String;
var AImageIndex: Integer;
var AImageList: TCustomImageList;
var ATag: Integer);
procedure GetHotspotInfo(ItemNo: Integer; var AName: String;
var AImageIndex, AHotImageIndex: Integer;
var AImageList: TCustomImageList;
var ATag: Integer);
procedure GetPictureInfo(ItemNo: Integer; var AName: String;
var Agr: TGraphic; var AVAlign: TRVVAlign;
var ATag: Integer);
procedure GetControlInfo(ItemNo: Integer; var AName: String;
var Actrl: TControl; var AVAlign: TRVVAlign;
var ATag: Integer);
procedure GetTextInfo(ItemNo: Integer; var AText: String;
var ATag: Integer);
function GetItemTag(ItemNo: Integer): Integer;
function IsParaStart(ItemNo: Integer): Boolean;
function GetItemPara(ItemNo: Integer): Integer;
function IsFromNewLine(ItemNo: Integer): Boolean;
procedure SetBreakInfo(ItemNo: Integer; AWidth: Byte; AStyle: TRVBreakStyle;
AColor: TColor; ATag: Integer);
procedure SetBulletInfo(ItemNo: Integer; const AName: String;
AImageIndex: Integer; AImageList: TCustomImageList;
ATag: Integer);
procedure SetHotspotInfo(ItemNo: Integer; const AName: String;
AImageIndex, AHotImageIndex: Integer;
AImageList: TCustomImageList; ATag: Integer);
// ret value: reformatting needed
function SetPictureInfo(ItemNo: Integer; const AName: String;
Agr: TGraphic; AVAlign: TRVVAlign;
ATag: Integer): Boolean;
function SetControlInfo(ItemNo: Integer; const AName: String;
AVAlign: TRVVAlign; ATag: Integer): Boolean;
procedure SetItemTag(ItemNo: Integer; ATag: Integer);
function SetItemExtraIntProperty(ItemNo: Integer; Prop: TRVExtraItemProperty; Value: Integer): Boolean;
function GetItemExtraIntProperty(ItemNo: Integer; Prop: TRVExtraItemProperty; var Value: Integer): Boolean;
procedure SetCheckpointInfo(ItemNo: Integer; ATag: Integer; const AName: String;
ARaiseEvent: Boolean);
function RemoveCheckpoint(ItemNo: Integer): Boolean;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -