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

📄 rvedit.pas

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