⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rvervdata.pas

📁 richview1.7 full.source
💻 PAS
📖 第 1 页 / 共 5 页
字号:
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 + -