RVEdit.pas
上传用户:daoqigc
上传日期:2021-04-20
资源大小:2795k
文件大小:161k
源码类别:

RichEdit

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {       RichView                                        }
  4. {       TRichViewEdit: document editor.                 }
  5. {       (registered on "RichView" page of               }
  6. {       the Component Palette)                          }
  7. {                                                       }
  8. {       Copyright (c) Sergey Tkachenko                  }
  9. {       svt@trichview.com                               }
  10. {       http://www.trichview.com                        }
  11. {                                                       }
  12. {*******************************************************}
  13. unit RVEdit;
  14. interface
  15. {$I RV_Defs.inc}
  16. uses
  17.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, RichEdit,
  18.   {$IFDEF RVUSEIME}
  19.   Imm,
  20.   {$ENDIF}
  21.   {$IFNDEF RVDONOTUSELISTS}
  22.   RVMarker,
  23.   {$ENDIF}
  24.   {$IFDEF RICHVIEWDEF4}
  25.   ImgList,
  26.   {$ENDIF}
  27.   {$IFNDEF RVDONOTUSEDRAGDROP}
  28.   ActiveX, ShlObj, RVDragDrop,
  29.   {$ENDIF}
  30.   RVScroll, RVStyle, RVItem, RichView, DLines, Clipbrd, RVFuncs, RVUni,
  31.   CRVData, CRVFData, RVRVData,
  32.   RVRTFErr;
  33. const
  34.   WM_RVUNDOFROMINPLACE = WM_USER+13;
  35.   WM_RVREDOFROMINPLACE = WM_USER+14;
  36. {$IFNDEF RICHVIEWCBDEF3}
  37.   EM_REDO                             = WM_USER + 84;
  38.   EM_CANREDO                          = WM_USER + 85;
  39. {$ENDIF}
  40. type
  41.   { Options for TCustomRichViewEdit.SearchText }
  42.   TRVESearchOption = (
  43.     rvseoMatchCase,    // match case
  44.     rvseoDown,         // search from top to bottom
  45.     rvseoWholeWord);   // match whole words
  46.   TRVESearchOptions = set of TRVESearchOption;
  47.   { Values for TCustomRichViewEdit.EditorOptions }
  48.   TRVEditorOption = (
  49.     rvoClearTagOnStyleApp,  // ApplyTextStyle and ApplyStyleConversion clear tags
  50.     rvoCtrlJumps,           // When user holds Ctrl key, switching to hypertext mode
  51.     rvoDoNotWantReturns,    // Ignore Enter keys
  52.     rvoDoNotWantShiftReturns, // Ignore Shift+Enter keys
  53.     rvoWantTabs,            // Do not ignore Tab keys
  54.     rvoAutoSwitchLang,      // Process WM_INPUTLANGCHANGE. For non-Unicode text,
  55.                             //   switch to style with the proper charset (new
  56.                             //   styles can be added to the collection!)
  57.     rvoHideReadOnlyCaret,   // Hide caret when ReadOnly is True
  58.     rvoNoImageResize,       // Disallow resizing images
  59.     rvoNoCaretHighlightJumps); // Disallow highlighting hyperlinks at caret position
  60.   TRVEditorOptions = set of TRVEditorOption;
  61.   { Drag&drop formats }
  62.   TRVDragDropFormat = (
  63.     rvddRVF,           // RVF ('RichView Format')
  64.     rvddRTF,           // RTF ('Rich Text Format')
  65.     rvddText,          // ANSI text (CF_TEXT)
  66.     rvddUnicodeText,   // Unicode text (CF_UNICODETEXT)
  67.     rvddBitmap,        // Bitmap (CF_DIB or CF_BITMAP)
  68.     rvddMetafile,      // Metafile (CF_ENHMETAFILE);
  69.     rvddURL,           // 'UniformResourceLocator'
  70.     rvddFiles);         // list of files (CF_HDROP)
  71.   TRVDragDropFormats = set of TRVDragDropFormat;
  72.   { Drag&drop effects }
  73.   TRVDropFileAction = (
  74.     rvdfNone,          // Files were ignored
  75.     rvdfInsert,        // Files were Inserted
  76.     rvdfLink);         // Link to files were created
  77.   { Types of undo/redo operations }
  78.   TRVUndoType = (
  79.     rvutNone,          // n/a
  80.     rvutDelete,        // deleting
  81.     rvutInsert,        // inserting
  82.     rvutPara,          // applying paragraph styles
  83.     rvutMiscTyping,    // editing (such as Backspace)
  84.     rvutInsertPageBreak, // insert page-break
  85.     rvutRemovePageBreak, // remove page-break
  86.     rvutTyping,        // text typing
  87.     rvutTag,           // changing tags
  88.     rvutStyleNo,       // applying text styles
  89.     rvutAddCheckpoint, // adding checkpoints
  90.     rvutRemoveCheckpoint, // removing checkpoints
  91.     rvutModifyCheckpoint, // editing checkpoints
  92.     rvutModifyItem,    // chaning item properties
  93.     rvutList,          // applying/removing/editing paragraph lists
  94.     rvutCustom);       // custom (see TCustomRichViewEdit.BeginUndoCustomGroup)
  95.   { Values for Direction parameter of TCustomRichViewEdit.OnCaretGetOut event }
  96.   TRVGetOutDirection = (
  97.     rvdLeft,           // Left at the beginning of doc
  98.     rvdUp,             // Up at the beginning of doc
  99.     rvdRight,          // Right at the end of doc
  100.     rvdDown,           // Down at the end of doc
  101.     rvdTop,            // Ctrl+Home
  102.     rvdBottom);        // Ctrl+End
  103.   { for OnOle*** events }
  104.   TRVOleDropEffect = (rvdeNone, rvdeCopy, rvdeMove, rvdeLink);
  105.   TRVOleDropEffects = set of TRVOleDropEffect;
  106. type
  107.   TCustomRichViewEdit = class;
  108.   { ------------- Types for events of TCustomRichViewEdit -------------------- }
  109.   { OnStyleConversion & OnParaStyleConversion. Occurs when calling
  110.     ApplyStyleConversion or ApplyParaStyleConversion.
  111.     Parameters:
  112.     [in] StyleNo: current text/para style index;
  113.     [in] UserData: value passed to ApplyStyleConversion/ApplyParaStyleConversion;
  114.     [in] AppliedToText: false if the event is called to change current text style
  115.        (not used in OnParaStyleConversion)
  116.     [out] NewStyleNo: set it to text/para style index                          }
  117.   TRVStyleConversionEvent = procedure (Sender: TCustomRichViewEdit;
  118.     StyleNo, UserData: Integer; AppliedToText: Boolean;
  119.     var NewStyleNo: Integer) of object;
  120.   { Internal procedure for the same }
  121.   TRVStyleConversionEvent_ = procedure (Sender: TCustomRichViewEdit;
  122.     StyleNo, ParaStyleNo, UserData: Integer; AppliedToText: Boolean;
  123.     var NewStyleNo: Integer; ToWholeParagraphs: Boolean) of object;
  124.   { OnPaste. Occurs when pasting from the Clipboard.
  125.     Allows to paste in your formats or forbid default pasting.
  126.     Parameters:
  127.     [out] DoDefault: set it to false to prevent default pasting.               }
  128.   TRVPasteEvent = procedure (Sender: TCustomRichViewEdit;
  129.     var DoDefault: Boolean) of object;
  130.   { OnCaretGetOut. Occurs when user presses arrow keys at the beginning/end of
  131.     document in "outside" direction.
  132.     Parameters:
  133.     [in] Direction: see TRVGetOutDirection type                                }
  134.   TRVOnCaretGetOutEvent = procedure (Sender: TCustomRichViewEdit;
  135.     Direction: TRVGetOutDirection) of object;
  136.   { OnChanging. Occurs before editing operations.
  137.     Parameters:
  138.     [out] CanEdit: set to false to disallow the operation.                     }
  139.   TRVChangingEvent = procedure (Sender: TCustomRichViewEdit;
  140.     var CanEdit: Boolean) of object;
  141.  { OnDropFiles. Occurs when dropping files in CF_HDROP format, for example from
  142.    Windows Explorer (rvddFiles must be in AcceptDragDropFormats.
  143.    Parameters:
  144.    [in] Files: a list of file names.
  145.    [out] FileAction: if you inserted files, set to rvdfInserted. If you
  146.      inserted hyperlinks to files, set to rvdfLinked. Ignored if DoDefault is True.
  147.    [out] DoDefault: set to False if you want to allow default processing for
  148.      dropped files.                                                            }
  149.   TRVDropFilesEvent = procedure (Sender: TCustomRichViewEdit;
  150.     Files: TStrings; var FileAction: TRVDropFileAction; var DoDefault: Boolean) of object;
  151.   {$IFNDEF RVDONOTUSEDRAGDROP}
  152.   TRVOleDragEnterEvent = procedure (Sender: TCustomRichView; const DataObject: IDataObject;
  153.     Shift: TShiftState;
  154.     X, Y: Integer; PossibleDropEffects: TRVOleDropEffects;
  155.     var DropEffect: TRVOleDropEffect) of object;
  156.   TRVOleDragOverEvent = procedure (Sender: TCustomRichView; Shift: TShiftState;
  157.     X, Y: Integer; PossibleDropEffects: TRVOleDropEffects;
  158.     var DropEffect: TRVOleDropEffect) of object;
  159.   TRVOleDropEvent = procedure (Sender: TCustomRichView; const DataObject: IDataObject;
  160.     Shift: TShiftState; X, Y: Integer; PossibleDropEffects: TRVOleDropEffects;
  161.     var DropEffect: TRVOleDropEffect; var DoDefault: Boolean) of object;
  162.   {$ENDIF}    
  163.   { ---------------------------------------------------------------------------
  164.     TCustomRichViewEdit: ancestor class for TRichViewEdit and TDBRichViewEdit
  165.     components.
  166.   }
  167.   TCustomRichViewEdit = class(TCustomRichView)
  168.   private
  169.     { Storing properties }
  170.     FModified: Boolean;
  171.     FReadOnly : Boolean;
  172.     FEditorOptions: TRVEditorOptions;
  173.     FAcceptDragDropFormats: TRVDragDropFormats;
  174.     { Events }
  175.     FOnCurParaStyleChanged, FOnCurTextStyleChanged, FOnChange,
  176.     FOnCaretMove: TNotifyEvent;
  177.     FOnChanging: TRVChangingEvent;
  178.     FOnStyleConversion, FOnParaStyleConversion: TRVStyleConversionEvent;
  179.     FOnPaste: TRVPasteEvent;
  180.     {$IFDEF RVONCUT}
  181.     FOnCut: TNotifyEvent;
  182.     {$ENDIF}
  183.     FOnCaretGetOut: TRVOnCaretGetOutEvent;
  184.     FOnDropFiles: TRVDropFilesEvent;
  185.     { Other fields }
  186.     {$IFNDEF RVDONOTUSEDRAGDROP}
  187.     FDropTarget: TRVDropTarget;               // object implemeting IDropTarget
  188.     FOnOleDragEnter: TRVOleDragEnterEvent;
  189.     FOnOleDrop: TRVOleDropEvent;
  190.     FOnOleDragOver: TRVOleDragOverEvent;
  191.     FOnOleDragLeave: TNotifyEvent;
  192.     {$ENDIF}
  193.     procedure CheckItemClass(ItemNo: Integer; RequiredClass: TCustomRVItemInfoClass);
  194.     procedure WMInputLangChange(var Message: TMessage); message WM_INPUTLANGCHANGE;
  195.     procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
  196.     procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
  197.     procedure WMCut(var Message: TWMCut); message WM_CUT;
  198.     procedure WMPaste(var Message: TWMpaste); message WM_PASTE;
  199.     procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
  200.     procedure WMSysChar(var Message: TWMSysChar); message WM_SYSCHAR;
  201.     procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
  202.     procedure WMChar(var Message: TWMChar); message WM_CHAR;
  203.     procedure WMUndoFromInplace(var Message: TMessage); message WM_RVUNDOFROMINPLACE;
  204.     procedure WMRedoFromInplace(var Message: TMessage); message WM_RVREDOFROMINPLACE;
  205.     procedure WMClear(var Message: TMessage); message WM_CLEAR;
  206.     procedure WMUndo(var Message: TMessage); message WM_UNDO;
  207.     procedure EMUndo(var Message: TMessage); message EM_UNDO;
  208.     procedure EMRedo(var Message: TMessage); message EM_REDO;
  209.     procedure EMCanUndo(var Message: TMessage); message EM_CANUNDO;
  210.     procedure EMCanRedo(var Message: TMessage); message EM_CANREDO;
  211.     procedure EMCanPaste(var Message: TMessage); message EM_CANPASTE;
  212.     procedure WMCreate(var Message: TMessage); message WM_CREATE;
  213.     procedure WMDestroy(var Message: TMessage); message WM_DESTROY;
  214.     {$IFDEF RVUSEIME}
  215.     procedure WMImeStartComposition(var Message: TMessage); message WM_IME_STARTCOMPOSITION;
  216.     procedure WMImeComposition(var Message: TMessage); message WM_IME_COMPOSITION;
  217.     {$ENDIF}
  218.     procedure SetCurParaStyleNo(const Value: Integer);
  219.     procedure SetCurTextStyleNo(const Value: Integer);
  220.     function  GetCurParaStyleNo: Integer;
  221.     function  GetCurTextStyleNo: Integer;
  222.     function GetCurItemStyle: Integer;
  223.     function GetCurItemNo: Integer;
  224.     function GetOffsetInCurItem: Integer;
  225.     procedure ApplyTextStyleConversionProc(Sender: TCustomRichViewEdit;
  226.       StyleNo, ParaStyleNo, UserData: Integer; AppliedToText: Boolean;
  227.       var NewStyleNo: Integer; ToWholeParagraphs: Boolean);
  228.     {$IFNDEF RVDONOTUSESTYLETEMPLATES}
  229.     procedure ApplyParaStyleTemplateConversionProc(Sender: TCustomRichViewEdit;
  230.       StyleNo, ParaStyleNo, UserData: Integer; AppliedToText: Boolean;
  231.       var NewStyleNo: Integer; ToWholeParagraphs: Boolean);
  232.     procedure ApplyTextStyleTemplateConversionProc(Sender: TCustomRichViewEdit;
  233.       StyleNo, ParaStyleNo, UserData: Integer; AppliedToText: Boolean;
  234.       var NewStyleNo: Integer; ToWholeParagraphs: Boolean);
  235.     {$ENDIF}
  236.     procedure ApplyUserParaStyleConversionProc(Sender: TCustomRichViewEdit;
  237.       StyleNo, ParaStyleNo, UserData: Integer; AppliedToText: Boolean;
  238.       var NewStyleNo: Integer; ToWholeParagraphs: Boolean);
  239.     procedure ApplyUserTextStyleConversionProc(Sender: TCustomRichViewEdit;
  240.       StyleNo, ParaStyleNo, UserData: Integer; AppliedToText: Boolean;
  241.       var NewStyleNo: Integer; ToWholeParagraphs: Boolean);
  242.     function GetUndoLimit: Integer;
  243.     procedure SetUndoLimit(const Value: Integer);
  244.     function IsUndoShortcut(Shift: TShiftState; Key: Word): Boolean;
  245.     function IsRedoShortcut(Shift: TShiftState; Key: Word): Boolean;
  246.     {$IFNDEF RVDONOTUSEUNICODE}
  247.     procedure InsertTextW_(const text: String);
  248.     {$ENDIF}
  249.     procedure SetTabNavigation(const Value: TRVTabNavigationType);
  250.     function GetTopLevelEditor: TCustomRichViewEdit;
  251.     function GetRootEditor: TCustomRichViewEdit;
  252.     function DoChanging: Boolean;
  253.     function GetActualCurTextStyleNo: Integer;
  254.     {$IFNDEF RVDONOTUSEDRAGDROP}
  255.     procedure RefreshAll;
  256.     {$ENDIF}
  257.   protected
  258.     { Init & info }
  259.     procedure CreateParams(var Params: TCreateParams); override;
  260.     function GetDataClass: TRichViewRVDataClass; override;
  261.     procedure SetReadOnly(const Value: Boolean); virtual;
  262.     function GetReadOnly: Boolean; virtual;
  263.     { Keyboard }
  264.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  265.     procedure KeyUp(var Key: Word; Shift: TShiftState); override;
  266.     procedure KeyPress(var Key: Char); override;
  267.     procedure OnEnterPress(Shift: Boolean);
  268.     procedure OnBackSpacePress(Ctrl: Boolean);
  269.     procedure OnDeletePress(Ctrl: Boolean);
  270.     { Scrolling }
  271.     procedure AfterVScroll; override;
  272.     procedure AfterHScroll; override;
  273.     {$IFNDEF RVDONOTUSEDRAGDROP}
  274.     { Ole drag&drop: IDropTarget related }
  275.     function OleDragEnter(X,Y: Integer): Boolean; override;
  276.     procedure CallOleDragEnterEvent(const DataObj: IDataObject;
  277.       KeyState: Integer; pt: TPoint; PossibleEffects: Integer;
  278.       var Effect: Integer); override;
  279.     procedure OleDragLeave; override;
  280.     function OleDragOver(X, Y: Integer): Boolean; override;
  281.     procedure CallOleDragOverEvent(KeyState: Integer; pt: TPoint;
  282.       PossibleEffects: Integer; var Effect: Integer); override;
  283.     function OleDrop(const DataObj: IDataObject; FMove: Boolean;
  284.       KeyState: Integer; pt: TPoint; PossibleEffects: Integer): Integer; override;
  285.     procedure ReleaseOleDropTargetObject; override;
  286.     function GetAcceptableRVFormat: Word;
  287.     function OleCanAcceptFormat(Format: Word): Boolean; override;
  288.     {$ENDIF}
  289.     procedure AdjustPopupMenuPos(var pt: TPoint); override;
  290.     {$IFNDEF RVDONOTUSERTFIMPORT}
  291.     function GetBasePathFromHTMLInClipboard: String;
  292.     {$ENDIF}
  293.     {$IFNDEF RVDONOTUSESMARTPOPUP}
  294.     procedure SetSmartPopupTarget; override;
  295.     {$ENDIF}
  296.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  297.     property OnCaretMove: TNotifyEvent read FOnCaretMove write FOnCaretMove;
  298.     property OnChanging: TRVChangingEvent read FOnChanging write FOnChanging;
  299.     property OnPaste: TRVPasteEvent read FOnPaste write FOnPaste;
  300.     {$IFDEF RVONCUT}
  301.     property OnCut: TNotifyEvent read FOnCut write FOnCut;
  302.     {$ENDIF}
  303.     property TabNavigation read GetTabNavigation write SetTabNavigation default rvtnNone;
  304.     property AcceptDragDropFormats: TRVDragDropFormats read FAcceptDragDropFormats
  305.       write FAcceptDragDropFormats default [rvddRVF, rvddRTF, rvddText, rvddUnicodeText,
  306.        rvddBitmap, rvddMetafile, rvddFiles];
  307.   public
  308.     LockCount: Integer;
  309.     FCurStyleConversion: TRVStyleConversionEvent_;
  310.     { Constructor - destructor }
  311.     constructor Create(AOwner: TComponent); override;
  312.     { For internal use }
  313.     procedure SetFReadOnly(Value: Boolean);
  314.     function BeforeInserting: Boolean;
  315.     procedure AfterInserting;
  316.     procedure CurParaStyleChange; dynamic;
  317.     procedure CurTextStyleChange; dynamic;
  318.     function BeforeChange(FromOutside: Boolean): Boolean; virtual;
  319.     procedure DoChange(ClearRedo: Boolean); dynamic;
  320.     procedure Selecting; dynamic;
  321.     procedure AfterCaretMove;
  322.     procedure AssignEvents(Source: TCustomRichView);
  323.     {$IFNDEF RVDONOTUSEUNICODE}
  324.     procedure BeforeUnicode;
  325.     {$ENDIF}
  326.     { Inserting in the caret position (can be undone/redone) }
  327.     {$IFNDEF RVDONOTUSEUNICODE}
  328.     {$IFDEF RICHVIEWCBDEF3}
  329.     procedure InsertTextW(const text: WideString; CaretBefore: Boolean {$IFDEF RICHVIEWDEF4}=False{$ENDIF});
  330.     function InsertStringWTag(const s: WideString; Tag: Integer): Boolean;
  331.     {$ENDIF}
  332.     {$ENDIF}
  333.     function InsertItem(const Name: String; Item: TCustomRVItemInfo): Boolean;
  334.     procedure InsertText(const text: String; CaretBefore: Boolean
  335.       {$IFDEF RICHVIEWDEF4}=False{$ENDIF});
  336.     function InsertStringTag(const s: String; Tag: Integer): Boolean;
  337.     {$IFNDEF RVDONOTUSETABS}
  338.     function InsertTab: Boolean;
  339.     {$ENDIF}
  340.     function InsertControl(const Name: String; ctrl: TControl;
  341.       VAlign: TRVVAlign): Boolean;
  342.     function InsertPicture(const Name: String; gr: TGraphic;
  343.       VAlign: TRVVAlign): Boolean;
  344.     function InsertHotPicture(const Name: String; gr: TGraphic;
  345.       VAlign: TRVVAlign): Boolean;
  346.     function InsertBreak(Width: Byte; Style: TRVBreakStyle;
  347.       Color: TColor): Boolean;
  348.     function InsertBullet(ImageIndex: Integer;
  349.       ImageList: TCustomImageList): Boolean;
  350.     function InsertHotspot(ImageIndex, HotImageIndex: Integer;
  351.       ImageList: TCustomImageList): Boolean;
  352.     { Inserting in the caret position from files and streams
  353.       (can be undone/redone) }
  354.     function InsertRVFFromStreamEd(Stream: TStream):Boolean;
  355.     function InsertRVFFromFileEd(const FileName: String):Boolean;
  356.     function InsertTextFromFile(const FileName: String):Boolean;
  357.     function InsertOEMTextFromFile(const FileName: String):Boolean;
  358.     {$IFNDEF RVDONOTUSEUNICODE}
  359.     function InsertTextFromFileW(const FileName: String):Boolean;
  360.     {$ENDIF}
  361.     {$IFNDEF RVDONOTUSERTFIMPORT}
  362.     function InsertRTFFromStreamEd(Stream: TStream): Boolean;
  363.     function InsertRTFFromFileEd(const FileName: String): Boolean;
  364.     {$ENDIF}
  365.     { Page breaks (can be undone/redone) }
  366.     procedure InsertPageBreak;
  367.     procedure RemoveCurrentPageBreak;
  368.     { Operations specific to some item types (can be undone/redone) }
  369.     procedure ConvertToPicture(ItemNo: Integer);
  370.     procedure ConvertToHotPicture(ItemNo: Integer);
  371.     { Operations on selection (can be undone/redone) }
  372.     function  CanDelete: Boolean;
  373.     procedure DeleteSelection;dynamic;
  374.     procedure CutDef;
  375.     procedure ApplyParaStyle(ParaStyleNo: Integer);
  376.     procedure ApplyTextStyle(TextStyleNo: Integer);
  377.     procedure ApplyStyleConversion(UserData: Integer);
  378.     procedure ApplyParaStyleConversion(UserData: Integer);
  379.     {$IFNDEF RVDONOTUSESTYLETEMPLATES}
  380.     procedure ApplyParaStyleTemplate(TemplateNo: Integer);
  381.     procedure ApplyTextStyleTemplate(TemplateNo: Integer; ToWholeParagraphs: Boolean);
  382.     procedure ApplyStyleTemplate(TemplateNo: Integer);
  383.     {$ENDIF}
  384.     { Can paste ? }
  385.     {$IFNDEF RVDONOTUSERTFIMPORT}
  386.     function CanPasteRTF: Boolean;
  387.     {$ENDIF}
  388.     function CanPaste: Boolean; dynamic;
  389.     function CanPasteRVF: Boolean;
  390.     { Pasting from the Clipboard (can be undone/redone) }
  391.     procedure Paste; dynamic;
  392.     procedure PasteBitmap(TextAsName: Boolean);
  393.     procedure PasteMetafile(TextAsName: Boolean);
  394.     procedure PasteText;
  395.     procedure PasteRVF;
  396.     {$IFNDEF RVDONOTUSERTFIMPORT}
  397.     function PasteRTF: Boolean;
  398.     {$ENDIF}
  399.     {$IFNDEF RVDONOTUSEUNICODE}
  400.     procedure PasteTextW;
  401.     {$ENDIF}
  402.     { Get info about item in the position of caret - general properties }
  403.     function GetCurrentTag: Integer;
  404.     function GetCurrentItemText: String;
  405.     function GetCurrentItem: TCustomRVItemInfo;
  406.     function GetCurrentItemEx(RequiredClass: TCustomRVItemInfoClass;
  407.       var ItemRichViewEdit: TCustomRichViewEdit;
  408.       var Item: TCustomRVItemInfo): Boolean;
  409.     {$IFNDEF RVDONOTUSEUNICODE}
  410.     function GetCurrentItemTextA: String;
  411.     {$IFDEF RICHVIEWCBDEF3}
  412.     function GetCurrentItemTextW: WideString;
  413.     {$ENDIF}
  414.     {$ENDIF}
  415.     { Get info about item in the position of caret - for specific item types }
  416.     procedure GetCurrentBreakInfo(var AWidth: Byte;
  417.       var AStyle: TRVBreakStyle; var AColor: TColor; var ATag: Integer);
  418.     procedure GetCurrentBulletInfo(var AName: String;
  419.       var AImageIndex: Integer; var AImageList: TCustomImageList;
  420.       var ATag: Integer);
  421.     procedure GetCurrentHotspotInfo(var AName: String;
  422.       var AImageIndex, AHotImageIndex: Integer; var AImageList: TCustomImageList;
  423.       var ATag: Integer);
  424.     procedure GetCurrentPictureInfo(var AName: String; var Agr: TGraphic;
  425.       var AVAlign: TRVVAlign; var ATag: Integer);
  426.     procedure GetCurrentControlInfo(var AName: String; var Actrl: TControl;
  427.       var AVAlign: TRVVAlign; var ATag: Integer);
  428.     procedure GetCurrentTextInfo(var AText: String; var ATag: Integer);
  429.     { Set info for item - general properties (can be undone/redone) }
  430.     procedure SetItemTextEd(ItemNo: Integer; const s: String);
  431.     procedure SetItemTagEd(ItemNo: Integer; ATag: Integer);    
  432.     procedure ResizeControl(ItemNo, NewWidth, NewHeight: Integer);
  433.     {$IFNDEF RVDONOTUSEUNICODE}
  434.     procedure SetItemTextEdA(ItemNo: Integer; const s: String);
  435.     {$IFDEF RICHVIEWCBDEF3}
  436.     procedure SetItemTextEdW(ItemNo: Integer; const s: WideString);
  437.     {$ENDIF}
  438.     {$ENDIF}
  439.     { Set info for item in the position of caret - general properties
  440.       (can be undone/redone) }
  441.     procedure SetCurrentItemText(const s: String);
  442.     procedure SetCurrentTag(ATag: Integer);
  443.     {$IFNDEF RVDONOTUSEUNICODE}
  444.     procedure SetCurrentItemTextA(const s: String);
  445.     {$IFDEF RICHVIEWCBDEF3}
  446.     procedure SetCurrentItemTextW(const s: WideString);
  447.     {$ENDIF}
  448.     {$ENDIF}
  449.     { Set info for item - for specific item types
  450.       (can be undone/redone) }
  451.     procedure SetBreakInfoEd(ItemNo: Integer; AWidth: Byte;
  452.       AStyle: TRVBreakStyle; AColor: TColor; ATag: Integer);
  453.     procedure SetBulletInfoEd(ItemNo: Integer; const AName: String;
  454.       AImageIndex: Integer; AImageList: TCustomImageList; ATag: Integer);
  455.     procedure SetHotspotInfoEd(ItemNo: Integer; const AName: String;
  456.       AImageIndex,  AHotImageIndex: Integer; AImageList: TCustomImageList;
  457.       ATag: Integer);
  458.     procedure SetPictureInfoEd(ItemNo: Integer; const AName: String;
  459.       Agr: TGraphic; AVAlign: TRVVAlign; ATag: Integer);
  460.     procedure SetControlInfoEd(ItemNo: Integer; const AName: String;
  461.       AVAlign: TRVVAlign; ATag: Integer);
  462.     { Set info for item in the position of caret - for specific item types
  463.       (can be undone/redone) }
  464.     procedure SetCurrentBreakInfo(AWidth: Byte; AStyle: TRVBreakStyle;
  465.       AColor: TColor; ATag: Integer);
  466.     procedure SetCurrentBulletInfo(const AName: String; AImageIndex: Integer;
  467.       AImageList: TCustomImageList; ATag: Integer);
  468.     procedure SetCurrentHotspotInfo(const AName: String;
  469.       AImageIndex, AHotImageIndex: Integer; AImageList: TCustomImageList;
  470.       ATag: Integer);
  471.     procedure SetCurrentPictureInfo(const AName: String; Agr: TGraphic;
  472.       AVAlign: TRVVAlign; ATag: Integer);
  473.     procedure SetCurrentControlInfo(const AName: String; AVAlign: TRVVAlign;
  474.       ATag: Integer);
  475.     procedure ResizeCurrentControl(NewWidth, NewHeight: Integer);
  476.     { Item operations: misc. }
  477.     procedure AdjustControlPlacement(ItemNo: Integer);
  478.     procedure AdjustControlPlacement2(Control: TControl);
  479.     procedure BeginItemModify(ItemNo: Integer; var ModifyData: Integer);
  480.     procedure EndItemModify(ItemNo: Integer; ModifyData: Integer);
  481.     procedure BeginCurrentItemModify(var ModifyData: Integer);
  482.     procedure EndCurrentItemModify(ModifyData: Integer);
  483.     { Extra item properties (changing can be undone/redone) }
  484.     function GetCurrentItemExtraIntProperty(Prop: TRVExtraItemProperty;
  485.       var Value: Integer): Boolean;
  486.     procedure SetItemExtraIntPropertyEd(ItemNo: Integer;
  487.       Prop: TRVExtraItemProperty; Value: Integer; AutoReformat: Boolean);
  488.     procedure SetCurrentItemExtraIntProperty(Prop: TRVExtraItemProperty;
  489.       Value: Integer; AutoReformat: Boolean);
  490.     function GetCurrentItemExtraStrProperty(Prop: TRVExtraItemStrProperty;
  491.       var Value: String): Boolean;
  492.     procedure SetItemExtraStrPropertyEd(ItemNo: Integer;
  493.       Prop: TRVExtraItemStrProperty; const Value: String; AutoReformat: Boolean);
  494.     procedure SetCurrentItemExtraStrProperty(Prop: TRVExtraItemStrProperty;
  495.       const Value: String; AutoReformat: Boolean);
  496.     { Checkpoints (changing can be undone/redone) }
  497.     function GetCurrentCheckpoint: TCheckpointData;
  498.     procedure SetCheckpointInfoEd(ItemNo: Integer; ATag: Integer;
  499.       const AName: String; ARaiseEvent: Boolean);
  500.     procedure RemoveCheckpointEd(ItemNo: Integer);
  501.     procedure SetCurrentCheckpointInfo(ATag: Integer; const AName: String;
  502.       ARaiseEvent: Boolean);
  503.     procedure RemoveCurrentCheckpoint;
  504.     { Selecting }
  505.     function SearchText(s: String; SrchOptions: TRVESearchOptions): Boolean;
  506.     procedure SelectCurrentWord;
  507.     procedure SelectCurrentLine;
  508.     { Changing }
  509.     function CanChange: Boolean;
  510.     procedure Change;
  511.     procedure BeginUpdate;
  512.     procedure EndUpdate;
  513.     { Undo and redo }
  514.     procedure Undo; dynamic;
  515.     procedure Redo; dynamic;
  516.     function UndoAction: TRVUndoType;
  517.     function RedoAction: TRVUndoType;
  518.     function UndoName: String;
  519.     function RedoName: String;
  520.     procedure ClearUndo;
  521.     procedure SetUndoGroupMode(GroupUndo: Boolean);
  522.     procedure BeginUndoGroup(UndoType: TRVUndoType);
  523.     procedure BeginUndoCustomGroup(const Name: String);
  524.     { Lists }
  525.     {$IFNDEF RVDONOTUSELISTS}
  526.     procedure ApplyListStyle(AListNo, AListLevel, AStartFrom: Integer;
  527.                              AUseStartFrom, ARecursive: Boolean);
  528.     procedure RemoveLists(ARecursive: Boolean);
  529.     procedure ChangeListLevels(LevelDelta: Integer);
  530.     {$ENDIF}
  531.     { Live spelling }
  532.     {$IFNDEF RVDONOTUSELIVESPELL}
  533.     function GetCurrentMisspelling(SelectIt: Boolean;
  534.       var Word: String; var StyleNo: Integer): Boolean;
  535.     {$ENDIF}
  536.     procedure GetCurrentLineCol(var Line, Column: Integer);
  537.     property Modified: Boolean read FModified write FModified;
  538.     property CurItemNo: Integer read GetCurItemNo;
  539.     property CurItemStyle: Integer read GetCurItemStyle;
  540.     property CurParaStyleNo: Integer read GetCurParaStyleNo write SetCurParaStyleNo;
  541.     property CurTextStyleNo: Integer read GetCurTextStyleNo write SetCurTextStyleNo;
  542.     property ActualCurTextStyleNo: Integer read GetActualCurTextStyleNo write SetCurTextStyleNo;
  543.     property OffsetInCurItem: Integer read GetOffsetInCurItem;
  544.     property EditorOptions: TRVEditorOptions read FEditorOptions write FEditorOptions default [rvoWantTabs, rvoCtrlJumps];
  545.     property ReadOnly: Boolean read GetReadOnly write SetReadOnly;
  546.     property UndoLimit: Integer read GetUndoLimit write SetUndoLimit default -1;
  547.     property TopLevelEditor: TCustomRichViewEdit read GetTopLevelEditor;
  548.     property RootEditor: TCustomRichViewEdit read GetRootEditor;
  549.     property OnCaretGetOut: TRVOnCaretGetOutEvent read FOnCaretGetOut write FOnCaretGetOut;
  550.     property OnDropFiles: TRVDropFilesEvent read FOnDropFiles write FOnDropFiles;
  551.     property OnParaStyleConversion: TRVStyleConversionEvent read FOnParaStyleConversion write FOnParaStyleConversion;
  552.     property OnStyleConversion: TRVStyleConversionEvent read FOnStyleConversion write FOnStyleConversion;
  553.     property OnCurParaStyleChanged: TNotifyEvent read FOnCurParaStyleChanged write FOnCurParaStyleChanged;
  554.     property OnCurTextStyleChanged: TNotifyEvent read FOnCurTextStyleChanged write FOnCurTextStyleChanged;    
  555.     property OnMouseMove;
  556.     property OnDragOver;
  557.     property OnDragDrop;
  558.     {$IFNDEF RVDONOTUSEDRAGDROP}
  559.     property OnOleDragEnter: TRVOleDragEnterEvent read FOnOleDragEnter write FOnOleDragEnter;
  560.     property OnOleDragOver: TRVOleDragOverEvent read FOnOleDragOver write FOnOleDragOver;
  561.     property OnOleDrop: TRVOleDropEvent read FOnOleDrop write FOnOleDrop;
  562.     property OnOleDragLeave: TNotifyEvent read FOnOleDragLeave write FOnOleDragLeave;
  563.     {$ENDIF}    
  564.   end;
  565.   { ---------------------------------------------------------------------------
  566.     TRichViewEdit component: editor.
  567.     TRichViewEdit publishes properties of TCustomRichViewEdit.
  568.   }
  569.   TRichViewEdit = class (TCustomRichViewEdit)
  570.   published
  571.     { Published declarations: new for TRichViewEdit }
  572.     property AcceptDragDropFormats;
  573.     property EditorOptions;
  574.     property ReadOnly;
  575.     property UndoLimit;
  576.     property OnCaretGetOut;
  577.     property OnChange;
  578.     property OnChanging;
  579.     property OnCaretMove;
  580.     property OnCurParaStyleChanged;
  581.     property OnCurTextStyleChanged;
  582.     {$IFDEF RVONCUT}
  583.     property OnCut;
  584.     {$ENDIF}
  585.     property OnDropFiles;
  586.     {$IFNDEF RVDONOTUSEDRAGDROP}
  587.     property OnOleDragEnter;
  588.     property OnOleDragLeave;
  589.     property OnOleDragOver;
  590.     property OnOleDrop;    
  591.     {$ENDIF}
  592.     property OnParaStyleConversion;
  593.     property OnPaste;
  594.     property OnStyleConversion;
  595.     property TabNavigation;
  596.     { Published standard properties }
  597.     property Align;
  598.     {$IFDEF RICHVIEWDEF4}
  599.     property Anchors;
  600.     property Constraints;
  601.     {$ENDIF}
  602.     property Color default clNone;
  603.     property Ctl3D;
  604.     {$IFDEF RICHVIEWDEF4}
  605.     property DragKind;
  606.     {$ENDIF}
  607.     property DragMode;
  608.     property Enabled;
  609.     property HelpContext;
  610.     property ParentCtl3D;
  611.     property ParentShowHint;
  612.     property PopupMenu;
  613.     property ShowHint;
  614.     property TabOrder;
  615.     property TabStop default True;
  616.     property Visible;
  617.     { Published standard events }
  618.     property OnClick;
  619.     {$IFDEF RICHVIEWDEF5}
  620.     property OnContextPopup;
  621.     {$ENDIF}
  622.     property OnDblClick;
  623.     property OnDragDrop;
  624.     property OnDragOver;
  625.     property OnEndDrag;
  626.     property OnEnter;
  627.     property OnExit;
  628.     property OnKeyDown;
  629.     property OnKeyPress;
  630.     property OnKeyUp;
  631.     property OnMouseMove;
  632.     {$IFDEF RICHVIEWDEF4}
  633.     property OnMouseWheel;
  634.     property OnMouseWheelDown;
  635.     property OnMouseWheelUp;
  636.     property OnResize;    
  637.     {$ENDIF}
  638.     property OnStartDrag;
  639.     { Published RichView properties }
  640.     {$IFNDEF RVDONOTUSEANIMATION}
  641.     property AnimationMode;
  642.     {$ENDIF}    
  643.     property BackgroundBitmap;
  644.     property BackgroundStyle default bsNoBitmap;
  645.     property BiDiMode;
  646.     property BorderStyle default bsSingle;
  647.     property BottomMargin;
  648.     //property CPEventKind stored False;
  649.     property Cursor default crIBeam;
  650.     property Delimiters;
  651.     //property DocProperties;
  652.     property DoInPaletteMode;
  653.     property FirstJumpNo;
  654.     property HScrollVisible;
  655.     property LeftMargin;
  656.     {$IFNDEF RVDONOTUSELIVESPELL}
  657.     property LiveSpellingMode default rvlspOnChange;
  658.     {$ENDIF}
  659.     property MaxTextWidth;
  660.     property MinTextWidth;
  661.     property Options;
  662.     property RightMargin;
  663.     property RTFOptions;
  664.     property RTFReadProperties;
  665.     property RVFOptions;
  666.     property RVFParaStylesReadMode;
  667.     property RVFTextStylesReadMode;
  668.     {$IFNDEF RVDONOTUSESMARTPOPUP}
  669.     property SmartPopupProperties;
  670.     {$ENDIF}
  671.     {$IFDEF RVFLATSCROLLBARS}
  672.     property ScrollBarColor;
  673.     property ScrollBarStyle;
  674.     {$ENDIF}
  675.     property Style;
  676.     //property TabNavigation;
  677.     property TopMargin;
  678.     property Tracking;
  679.     property UseXPThemes;
  680.     {$IFDEF RICHVIEWDEF3}
  681.     property VAlign;
  682.     {$ENDIF}
  683.     property VScrollVisible;
  684.     {$IFDEF RICHVIEWDEF4}
  685.     property WheelStep;
  686.     {$ENDIF}
  687.     { Published RichView events }
  688.     //property OnCheckpointVisible;
  689.     property OnControlAction;
  690.     property OnCopy;
  691.     {$IFDEF RV_ODHC}
  692.     property OnDocumentHeightChange;
  693.     {$ENDIF}
  694.     property OnImportPicture;
  695.     property OnItemAction;
  696.     property OnItemHint;
  697.     property OnJump;
  698.     property OnHScrolled;    
  699.     property OnHTMLSaveImage;
  700.     property OnPaint;
  701.     property OnProgress;    
  702.     property OnReadHyperlink;    
  703.     property OnRVDblClick;
  704.     property OnRVFImageListNeeded;
  705.     property OnRVFControlNeeded;
  706.     property OnRVFPictureNeeded;
  707.     property OnRVMouseDown;
  708.     property OnRVMouseMove;
  709.     property OnRVMouseUp;
  710.     property OnRVRightClick;
  711.     property OnSaveComponentToFile;
  712.     property OnSaveHTMLExtra;
  713.     property OnSaveImage2;
  714.     property OnSaveItemToFile;    
  715.     property OnSaveRTFExtra;    
  716.     property OnSelect;
  717.     {$IFNDEF RVDONOTUSESMARTPOPUP}
  718.     property OnSmartPopupClick;
  719.     {$ENDIF}
  720.     {$IFNDEF RVDONOTUSELIVESPELL}
  721.     property OnSpellingCheck;
  722.     {$IFDEF RVLIVESPELLEXEVENT}
  723.     property OnSpellingCheckEx;
  724.     {$ENDIF}    
  725.     {$ENDIF}    
  726.     property OnVScrolled;
  727.     property OnWriteHyperlink;
  728.     { obsolete properties }
  729.     property AllowSelection;
  730.     property SingleClick;
  731.     property OnURLNeeded;    
  732.   end;
  733.   
  734.   TRichViewUnicodeInput = (rvuiStandard, rvuiAlternative);
  735. const RichViewUnicodeInput: TRichViewUnicodeInput = rvuiStandard;
  736. implementation
  737. uses RVERVData, RVUndo, RVStr;
  738. {------------------------------------------------------------------------------}
  739. constructor TCustomRichViewEdit.Create(AOwner: TComponent);
  740. begin
  741.   inherited Create(AOwner);
  742.   KeyboardScroll   := False;
  743.   Flags            := Flags + [rvflRootEditor] - [rvflUseJumps{, rvflTrim},rvflUseExternalLeading];
  744.   Cursor           := crIBeam;
  745.   EditorOptions    := [rvoWantTabs, rvoCtrlJumps];
  746.   UndoLimit        := -1;
  747.   AcceptDragDropFormats := [rvddRVF, rvddRTF, rvddText, rvddUnicodeText,
  748.     rvddBitmap, rvddMetafile, rvddFiles];
  749.   {$IFNDEF RVDONOTUSELIVESPELL}
  750.   LiveSpellingMode := rvlspOnChange;
  751.   {$ENDIF}
  752. end;
  753. {------------------------------------------------------------------------------}
  754. procedure TCustomRichViewEdit.CreateParams(var Params: TCreateParams);
  755. begin
  756.    inherited CreateParams(Params);
  757.    FVDisableNoScroll := True;
  758. end;
  759. {------------------------------------------------------------------------------}
  760. function TCustomRichViewEdit.GetDataClass: TRichViewRVDataClass;
  761. begin
  762.    Result := TRVEditRVData;
  763. end;
  764. {------------------------------------------------------------------------------}
  765. { Processing message: WM_CREATE.
  766.   Registering itself as a drag&drop target.                                    }
  767. procedure TCustomRichViewEdit.WMCreate(var Message: TMessage);
  768. begin
  769.   inherited;
  770.   {$IFNDEF RVDONOTUSEDRAGDROP}
  771.   if not (csDesigning in ComponentState) then begin
  772.     if FDropTarget=nil then
  773.       FDropTarget := TRVDropTarget.Create(Self);
  774.     FDropTarget.RegisterDragDropForOwner;
  775.   end;
  776.   {$ENDIF}
  777. end;
  778. {------------------------------------------------------------------------------}
  779. { Processing message: WM_DESTROY.
  780.   Unregistering itself as a drag&drop target.                                  }
  781. procedure TCustomRichViewEdit.WMDestroy(var Message: TMessage);
  782. begin
  783.   {$IFNDEF RVDONOTUSEDRAGDROP}
  784.   if not (csDesigning in ComponentState) and Assigned(FDropTarget) then
  785.     FDropTarget.UnRegisterDragDropForOwner;
  786.   {$ENDIF}
  787.   inherited;
  788. end;
  789. {------------------------------------------------------------------------------}
  790. function TCustomRichViewEdit.BeforeInserting: Boolean;
  791. var StyleNo: Integer;
  792. begin
  793.   Result := False;
  794.   if (RVData.PartialSelectedItem<>nil) or not CanDelete or
  795.     not BeforeChange(False) then begin
  796.     TRVEditRVData(RVData).Beep;
  797.     Exclude(RVData.State, rvstDoNotClearCurTag);
  798.     exit;
  799.   end;
  800.   TRVEditRVData(RVData).BeginUndoSequence(rvutInsert, True);
  801.   SetUndoGroupMode(True);
  802.   StyleNo := ActualCurTextStyleNo;
  803.   TRVEditRVData(RVData).AssignCurTag;
  804.   TRVEditRVData(RVData).DeleteSelection_;
  805.   TRVEditRVData(RVData).Deselect(nil, True);
  806.   CurTextStyleNo := StyleNo;
  807.   Result := True;
  808. end;
  809. {------------------------------------------------------------------------------}
  810. procedure TCustomRichViewEdit.AfterInserting;
  811. begin
  812.   SetUndoGroupMode(False);
  813.   Refresh;
  814.   Change;
  815. end;
  816. {------------------------------------------------------------------------------}
  817. function TCustomRichViewEdit.InsertBreak(Width: Byte; Style: TRVBreakStyle;
  818.   Color: TColor): Boolean;
  819. var info: TRVBreakItemInfo;
  820.     s: String;
  821. begin
  822.   Result := False; 
  823.   {$IFNDEF RVDONOTUSEINPLACE}
  824.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  825.     Result := TCustomRichViewEdit(InplaceEditor).InsertBreak(Width, Style, Color);
  826.     exit;
  827.   end;
  828.   {$ENDIF}
  829.   if not BeforeInserting then exit;
  830.   try
  831.     info := TRVBreakItemInfo.CreateEx(RVData, Width, Style, Color);
  832.     s := '';
  833.     Result := TRVEditRVData(RVData).InsertSomething(info, s, False, False);
  834.   finally
  835.     AfterInserting;
  836.   end;
  837. end;
  838. {------------------------------------------------------------------------------}
  839. function TCustomRichViewEdit.InsertBullet(ImageIndex: Integer;
  840.   ImageList: TCustomImageList): Boolean;
  841. var info: TRVBulletItemInfo;
  842.     s: String;
  843. begin
  844.   Result := False;
  845.   {$IFNDEF RVDONOTUSEINPLACE}
  846.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  847.     Result := TCustomRichViewEdit(InplaceEditor).InsertBullet(ImageIndex, ImageList);
  848.     exit;
  849.   end;
  850.   {$ENDIF}
  851.   if not BeforeInserting then exit;
  852.   try
  853.     info  := TRVBulletItemInfo.CreateEx(RVData, ImageIndex, ImageList, rvvaBaseline);
  854.     s := '';
  855.     Result := TRVEditRVData(RVData).InsertSomething(info, s, False, False);
  856.   finally
  857.     AfterInserting;
  858.   end;
  859. end;
  860. {------------------------------------------------------------------------------}
  861. function TCustomRichViewEdit.InsertItem(const Name: String; Item: TCustomRVItemInfo): Boolean;
  862. var s: String;
  863. begin
  864.   {$IFNDEF RVDONOTUSEINPLACE}
  865.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  866.     Result := TCustomRichViewEdit(InplaceEditor).InsertItem(Name, Item);
  867.     exit;
  868.   end;
  869.   {$ENDIF}
  870.   if not BeforeInserting then begin
  871.     Item.Free;
  872.     Result := False;
  873.     exit;
  874.   end;
  875.   try
  876.     s := Name;
  877.     Result := TRVEditRVData(RVData).InsertSomething(Item, s, False, False);
  878.   finally
  879.     AfterInserting;
  880.   end;
  881. end;
  882. {------------------------------------------------------------------------------}
  883. procedure TCustomRichViewEdit.InsertText(const text: String;  CaretBefore: Boolean {$IFDEF RICHVIEWDEF4}=False{$ENDIF});
  884. begin
  885.   {$IFNDEF RVDONOTUSEINPLACE}
  886.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  887.     TCustomRichViewEdit(InplaceEditor).InsertText(text, CaretBefore);
  888.     exit;
  889.   end;
  890.   {$ENDIF}
  891.   Include(RVData.State, rvstDoNotClearCurTag);
  892.   if not BeforeInserting then exit;
  893.   try
  894.     TRVEditRVData(RVData).InsertText_(text, True, CaretBefore);
  895.   finally
  896.     SetUndoGroupMode(False);
  897.     Exclude(RVData.State, rvstDoNotClearCurTag);
  898.     Change;
  899.   end;
  900. end;
  901. {------------------------------------------------------------------------------}
  902. function TCustomRichViewEdit.InsertTextFromFile(const FileName: String):Boolean;
  903. begin
  904.   {$IFNDEF RVDONOTUSEINPLACE}
  905.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  906.     Result := TCustomRichViewEdit(InplaceEditor).InsertTextFromFile(FileName);
  907.     exit;
  908.   end;
  909.   {$ENDIF}
  910.   Result := True;
  911.   Include(RVData.State, rvstDoNotClearCurTag);
  912.   if not BeforeInserting then exit;
  913.   try
  914.     Result := TRVEditRVData(RVData).InsertTextFromFile(FileName, False, False);
  915.   finally
  916.     SetUndoGroupMode(False);
  917.     Exclude(RVData.State, rvstDoNotClearCurTag);    
  918.     Change;
  919.   end;
  920. end;
  921. {------------------------------------------------------------------------------}
  922. {$IFNDEF RVDONOTUSEUNICODE}
  923. {------------------------------------------------------------------------------}
  924. procedure TCustomRichViewEdit.BeforeUnicode;
  925. begin
  926.   if not Style.TextStyles[CurTextStyleNo].Unicode and
  927.      (Style.DefUnicodeStyle>=0) and
  928.      (Style.DefUnicodeStyle<Style.TextStyles.Count) then
  929.     CurTextStyleNo := Style.DefUnicodeStyle;
  930. end;
  931. {------------------------------------------------------------------------------}
  932. function TCustomRichViewEdit.InsertTextFromFileW(const FileName: String):Boolean;
  933. begin
  934.   {$IFNDEF RVDONOTUSEINPLACE}
  935.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  936.     Result := TCustomRichViewEdit(InplaceEditor).InsertTextFromFileW(FileName);
  937.     exit;
  938.   end;
  939.   {$ENDIF}
  940.   Result := True;
  941.   Include(RVData.State, rvstDoNotClearCurTag);
  942.   if not BeforeInserting then exit;
  943.   try
  944.     BeforeUnicode;
  945.     Result := TRVEditRVData(RVData).InsertTextFromFileW(FileName,True);
  946.   finally
  947.     SetUndoGroupMode(False);
  948.     Exclude(RVData.State, rvstDoNotClearCurTag);
  949.     Change;
  950.   end;
  951. end;
  952. {------------------------------------------------------------------------------}
  953. procedure TCustomRichViewEdit.InsertTextW_(const text: String);
  954. begin
  955.   Include(RVData.State, rvstDoNotClearCurTag);
  956.   if not BeforeInserting then exit;
  957.   try
  958.     BeforeUnicode;
  959.     TRVEditRVData(RVData).InsertTextW_(text,True, False);
  960.   finally
  961.     SetUndoGroupMode(False);
  962.     Exclude(RVData.State, rvstDoNotClearCurTag);
  963.     Change;
  964.   end;
  965. end;
  966. {------------------------------------------------------------------------------}
  967. procedure TCustomRichViewEdit.PasteTextW;
  968. var
  969.     mem: Cardinal;
  970.     ptr: Pointer;
  971.     s: String;
  972. begin
  973.   {$IFNDEF RVDONOTUSEINPLACE}
  974.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  975.     TCustomRichViewEdit(InplaceEditor).PasteTextW;
  976.     exit;
  977.   end;
  978.   {$ENDIF}
  979.   if not BeforeChange(False) then exit;
  980.   if not Clipboard.HasFormat(CF_UNICODETEXT) then exit;
  981.   Clipboard.Open;
  982.   try
  983.     mem := Clipboard.GetAsHandle(CF_UNICODETEXT);
  984.     SetLength(s, GlobalSize(mem));
  985.     ptr := GlobalLock(mem);
  986.     Move(ptr^,PChar(s)^, Length(s));
  987.     GlobalUnlock(mem);
  988.   finally
  989.     Clipboard.Close;
  990.   end;
  991.   if Length(s)=0 then exit;
  992.   ptr := RVU_StrScanW(Pointer(s), 0, Length(s) div 2);
  993.   if ptr<>nil then
  994.     SetLength(s, PChar(ptr)-PChar(s));
  995.   InsertTextW_(s);
  996. end;
  997. function TCustomRichViewEdit.GetCurrentItemTextA: String;
  998. begin
  999.   {$IFNDEF RVDONOTUSEINPLACE}
  1000.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1001.     Result := TCustomRichViewEdit(InplaceEditor).GetCurrentItemTextA;
  1002.     exit;
  1003.   end;
  1004.   {$ENDIF}
  1005.   TRVEditRVData(RVData).PrepareForEdit;
  1006.   Result := GetItemTextA(CurItemNo);
  1007. end;
  1008. {------------------------------------------------------------------------------}
  1009. procedure TCustomRichViewEdit.SetItemTextEdA(ItemNo: Integer;
  1010.   const s: String);
  1011. begin
  1012.   SetItemTextEd(ItemNo, RVData.GetTextInItemFormatA(ItemNo, s));
  1013. end;
  1014. {------------------------------------------------------------------------------}
  1015. procedure TCustomRichViewEdit.SetCurrentItemTextA(const s: String);
  1016. begin
  1017.   {$IFNDEF RVDONOTUSEINPLACE}
  1018.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1019.     TCustomRichViewEdit(InplaceEditor).SetCurrentItemTextA(s);
  1020.     exit;
  1021.   end;
  1022.   {$ENDIF}
  1023.   TRVEditRVData(RVData).PrepareForEdit;
  1024.   SetItemTextEdA(CurItemNo, s);
  1025. end;
  1026. {------------------------------------------------------------------------------}
  1027. {$IFDEF RICHVIEWCBDEF3}
  1028. function TCustomRichViewEdit.GetCurrentItemTextW: WideString;
  1029. begin
  1030.   {$IFNDEF RVDONOTUSEINPLACE}
  1031.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1032.     Result := TCustomRichViewEdit(InplaceEditor).GetCurrentItemTextW;
  1033.     exit;
  1034.   end;
  1035.   {$ENDIF}
  1036.   TRVEditRVData(RVData).PrepareForEdit;
  1037.   Result := GetItemTextW(CurItemNo);
  1038. end;
  1039. {------------------------------------------------------------------------------}
  1040. procedure TCustomRichViewEdit.SetItemTextEdW(ItemNo: Integer;
  1041.   const s: WideString);
  1042. begin
  1043.   SetItemTextEd(ItemNo, RVData.GetTextInItemFormatW(ItemNo, s));
  1044. end;
  1045. {------------------------------------------------------------------------------}
  1046. procedure TCustomRichViewEdit.SetCurrentItemTextW(const s: WideString);
  1047. begin
  1048.   {$IFNDEF RVDONOTUSEINPLACE}
  1049.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1050.     TCustomRichViewEdit(InplaceEditor).SetCurrentItemTextW(s);
  1051.     exit;
  1052.   end;
  1053.   {$ENDIF}
  1054.   TRVEditRVData(RVData).PrepareForEdit;
  1055.   SetItemTextEdW(CurItemNo, s);
  1056. end;
  1057. {------------------------------------------------------------------------------}
  1058. procedure TCustomRichViewEdit.InsertTextW(const text: WideString; CaretBefore: Boolean {$IFDEF RICHVIEWDEF4}=False{$ENDIF});
  1059. var s: String;
  1060. begin
  1061.   {$IFNDEF RVDONOTUSEINPLACE}
  1062.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1063.     TCustomRichViewEdit(InplaceEditor).InsertTextW(text, CaretBefore);
  1064.     exit;
  1065.   end;
  1066.   {$ENDIF}
  1067.   if not BeforeInserting then exit;
  1068.   try
  1069.     BeforeUnicode;
  1070.     s := RVU_GetRawUnicode(text);
  1071.     TRVEditRVData(RVData).InsertTextW_(s,True, CaretBefore);
  1072.   finally
  1073.     SetUndoGroupMode(False);
  1074.     Change;
  1075.   end;
  1076. end;
  1077. {------------------------------------------------------------------------------}
  1078. function TCustomRichViewEdit.InsertStringWTag(const s: WideString;
  1079.   Tag: Integer): Boolean;
  1080. var info: TRVTextItemInfo;
  1081.     s2: String;
  1082. begin
  1083.   {$IFNDEF RVDONOTUSEINPLACE}
  1084.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1085.     Result := TCustomRichViewEdit(InplaceEditor).InsertStringWTag(s, Tag);
  1086.     exit;
  1087.   end;
  1088.   {$ENDIF}
  1089.   Result := False;
  1090.   if not BeforeInserting then exit;
  1091.   try
  1092.     BeforeUnicode;
  1093.     info         := RichViewTextItemClass.Create(RVData);
  1094.     info.StyleNo := ActualCurTextStyleNo;
  1095.     info.Tag     := Tag;
  1096.     info.ItemOptions := info.ItemOptions+[rvioUnicode];
  1097.     s2 := RVU_GetRawUnicode(s);
  1098.     s2 := RV_ReplaceTabsW(s2, Style.SpacesInTab);
  1099.     {$IFNDEF RVDONOTUSEUNICODE}
  1100.     if not Style.TextStyles[info.GetActualStyleNo(Style)].Unicode then begin
  1101.       s2 := RVU_UnicodeToAnsi(RVData.GetStyleCodePage(
  1102.         info.GetActualStyleNo(Style)), s2);
  1103.       info.ItemOptions := info.ItemOptions-[rvioUnicode];
  1104.     end;
  1105.     {$ENDIF}
  1106.     Result := TRVEditRVData(RVData).InsertSomething(info, s2, False, False);
  1107.   finally
  1108.     AfterInserting;
  1109.   end;
  1110. end;
  1111. {$ENDIF}
  1112. {$ENDIF}
  1113. {------------------------------------------------------------------------------}
  1114. function TCustomRichViewEdit.InsertOEMTextFromFile(const FileName: String):Boolean;
  1115. begin
  1116.   {$IFNDEF RVDONOTUSEINPLACE}
  1117.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1118.     Result := TCustomRichViewEdit(InplaceEditor).InsertOEMTextFromFile(FileName);
  1119.     exit;
  1120.   end;
  1121.   {$ENDIF}
  1122.   Result := True;
  1123.   if not BeforeInserting then exit;
  1124.   try
  1125.     Result := TRVEditRVData(RVData).InsertTextFromFile(FileName, True, True);
  1126.   finally
  1127.     SetUndoGroupMode(False);
  1128.     Change;
  1129.   end;
  1130. end;
  1131. {------------------------------------------------------------------------------}
  1132. function TCustomRichViewEdit.InsertStringTag(const s: String; Tag: Integer): Boolean;
  1133. var info: TRVTextItemInfo;
  1134.     s2: String;
  1135. begin
  1136.   Result := False;
  1137.   {$IFNDEF RVDONOTUSEINPLACE}
  1138.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1139.     Result := TCustomRichViewEdit(InplaceEditor).InsertStringTag(s, Tag);
  1140.     exit;
  1141.   end;
  1142.   {$ENDIF}
  1143.   if not BeforeInserting then exit;
  1144.   try
  1145.     info         := RichViewTextItemClass.Create(RVData);
  1146.     info.StyleNo := ActualCurTextStyleNo;
  1147.     info.Tag     := Tag;
  1148.     s2 := RV_ReplaceTabsA(s, Style.SpacesInTab);
  1149.     {$IFNDEF RVDONOTUSEUNICODE}
  1150.     if Style.TextStyles[info.GetActualStyleNo(Style)].Unicode then begin
  1151.       s2 := RVU_AnsiToUnicode(RVData.GetStyleCodePage(
  1152.         info.GetActualStyleNo(Style)), s);
  1153.       info.ItemOptions := info.ItemOptions+[rvioUnicode];
  1154.     end;
  1155.     {$ENDIF}
  1156.     Result := TRVEditRVData(RVData).InsertSomething(info, s2, False, False);
  1157.   finally
  1158.     AfterInserting;
  1159.   end;
  1160. end;
  1161. {------------------------------------------------------------------------------}
  1162. {$IFNDEF RVDONOTUSETABS}
  1163. function TCustomRichViewEdit.InsertTab: Boolean;
  1164. var Item: TRVTabItemInfo;
  1165.     s: String;
  1166. begin
  1167.   Result := False;
  1168.   {$IFNDEF RVDONOTUSEINPLACE}
  1169.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1170.     Result := TCustomRichViewEdit(InplaceEditor).InsertTab;
  1171.     exit;
  1172.   end;
  1173.   {$ENDIF}
  1174.   if not BeforeInserting then exit;
  1175.   try
  1176.     Item         := TRVTabItemInfo.Create(RVData);
  1177.     Item.StyleNo := rvsTab;
  1178.     Item.TextStyleNo := ActualCurTextStyleNo;
  1179.     s := '';
  1180.     Result := TRVEditRVData(RVData).InsertSomething(Item, s, False, False);
  1181.   finally
  1182.     AfterInserting;
  1183.   end;
  1184. end;
  1185. {$ENDIF}
  1186. {------------------------------------------------------------------------------}
  1187. function TCustomRichViewEdit.InsertControl(const Name: String; ctrl: TControl;
  1188.   VAlign: TRVVAlign): Boolean;
  1189. var info: TRVControlItemInfo;
  1190.     s: String;
  1191. begin
  1192.   Result := False;
  1193.   {$IFNDEF RVDONOTUSEINPLACE}
  1194.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1195.     Result := TCustomRichViewEdit(InplaceEditor).InsertControl(Name, ctrl, VAlign);
  1196.     exit;
  1197.   end;
  1198.   {$ENDIF}
  1199.   if not BeforeInserting then exit;
  1200.   try
  1201.     info         := TRVControlItemInfo.CreateEx(RVData, ctrl, VAlign);
  1202.     ctrl.Visible := False;
  1203.     ctrl.Parent  := Self;
  1204.     s := Name;
  1205.     Result := TRVEditRVData(RVData).InsertSomething(info, s, False, False);
  1206.   finally
  1207.     AfterInserting;
  1208.   end;
  1209. end;
  1210. {------------------------------------------------------------------------------}
  1211. function TCustomRichViewEdit.InsertHotspot(ImageIndex, HotImageIndex: Integer;
  1212.   ImageList: TCustomImageList): Boolean;
  1213. var info: TRVHotspotItemInfo;
  1214.     s: String;
  1215. begin
  1216.   Result := False;
  1217.   {$IFNDEF RVDONOTUSEINPLACE}
  1218.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1219.     Result := TCustomRichViewEdit(InplaceEditor).InsertHotspot(ImageIndex, HotImageIndex, ImageList);
  1220.     exit;
  1221.   end;
  1222.   {$ENDIF}
  1223.   if not BeforeInserting then exit;
  1224.   try
  1225.     info := TRVHotspotItemInfo.CreateEx(RVData, ImageIndex, HotImageIndex, ImageList, rvvaBaseline);
  1226.     s := '';
  1227.     Result := TRVEditRVData(RVData).InsertSomething(info, s, False, False);
  1228.   finally
  1229.     AfterInserting;
  1230.   end;
  1231. end;
  1232. {------------------------------------------------------------------------------}
  1233. function TCustomRichViewEdit.InsertPicture(const Name: String; gr: TGraphic;
  1234.   VAlign: TRVVAlign): Boolean;
  1235. var info: TRVGraphicItemInfo;
  1236.     s: String;
  1237. begin
  1238.   Result := False;
  1239.   {$IFNDEF RVDONOTUSEINPLACE}
  1240.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1241.     Result := TCustomRichViewEdit(InplaceEditor).InsertPicture(Name, gr, VAlign);
  1242.     exit;
  1243.   end;
  1244.   {$ENDIF}
  1245.   if not BeforeInserting then exit;
  1246.   try
  1247.     info := TRVGraphicItemInfo.CreateEx(RVData, gr, VAlign);
  1248.     info.UpdatePaletteInfo(DoInPaletteMode, False, RVPalette, PRVLogPalette);
  1249.     s := Name;
  1250.     Result := TRVEditRVData(RVData).InsertSomething(info, s, False, False);
  1251.   finally
  1252.     AfterInserting;
  1253.   end;
  1254. end;
  1255. {------------------------------------------------------------------------------}
  1256. function TCustomRichViewEdit.InsertHotPicture(const Name: String; gr: TGraphic;
  1257.   VAlign: TRVVAlign): Boolean;
  1258. var info: TRVHotGraphicItemInfo;
  1259.     s: String;
  1260. begin
  1261.   Result := False;
  1262.   {$IFNDEF RVDONOTUSEINPLACE}
  1263.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1264.     Result := TCustomRichViewEdit(InplaceEditor).InsertHotPicture(Name, gr, VAlign);
  1265.     exit;
  1266.   end;
  1267.   {$ENDIF}
  1268.   if not BeforeInserting then exit;
  1269.   try
  1270.     info := TRVHotGraphicItemInfo.CreateEx(RVData, gr, VAlign);
  1271.     info.UpdatePaletteInfo(DoInPaletteMode, False, RVPalette, PRVLogPalette);
  1272.     s := Name;
  1273.     Result := TRVEditRVData(RVData).InsertSomething(info, s, False, False);
  1274.   finally
  1275.     AfterInserting;
  1276.   end;
  1277. end;
  1278. {------------------------------------------------------------------------------}
  1279. function TCustomRichViewEdit.CanDelete: Boolean;
  1280. begin
  1281.   Result := TRVEditRVData(GetTopLevelEditor.RVData).CanDelete;
  1282. end;
  1283. {------------------------------------------------------------------------------}
  1284. procedure TCustomRichViewEdit.DeleteSelection;
  1285. //var Selected: Boolean;
  1286. begin
  1287.   {$IFNDEF RVDONOTUSEINPLACE}
  1288.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1289.     TCustomRichViewEdit(InplaceEditor).DeleteSelection;
  1290.     exit;
  1291.   end;
  1292.   {$ENDIF}
  1293.   {
  1294.   if not BeforeChange(False) then exit;
  1295.   Selected := RVData.SelectionExists(False, True);
  1296.   TRVEditRVData(RVData).DeleteSelection_;
  1297.   if Selected then
  1298.     Invalidate;
  1299.   }
  1300.   if RVData.SelectionExists(False, True) and BeforeChange(False) then begin
  1301.     TRVEditRVData(RVData).DeleteSelection_;
  1302.     Invalidate;
  1303.   end;
  1304. end;
  1305. {------------------------------------------------------------------------------}
  1306. function TCustomRichViewEdit.GetCurItemNo: Integer;
  1307. begin
  1308.   Result := TRVEditRVData(RVData).GetCurItemNo;
  1309. end;
  1310. {------------------------------------------------------------------------------}
  1311. function TCustomRichViewEdit.GetOffsetInCurItem: Integer;
  1312. begin
  1313.   Result := TRVEditRVData(RVData).GetOffsetInCurItem;
  1314. end;
  1315. {------------------------------------------------------------------------------}
  1316. function TCustomRichViewEdit.GetCurItemStyle: Integer;
  1317. begin
  1318.   {$IFNDEF RVDONOTUSEINPLACE}
  1319.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1320.     Result := TCustomRichViewEdit(InplaceEditor).GetCurItemStyle;
  1321.     exit;
  1322.   end;
  1323.   {$ENDIF}
  1324.   TRVEditRVData(RVData).PrepareForEdit;
  1325.   Result := GetItemStyle(GetCurItemNo);
  1326. end;
  1327. {------------------------------------------------------------------------------}
  1328. procedure TCustomRichViewEdit.WMKillFocus(var Message: TWMKillFocus);
  1329. var PRVData: TCustomRVData;
  1330. begin
  1331.   inherited;
  1332.   if (csDestroying in ComponentState) or (rvstNoKillFocusEvents in RVData.GetAbsoluteRootData.State) then exit;
  1333.   TRVEditRVData(RVData).ClearJumpsCoords;
  1334.   if not ReadOnly then begin
  1335.     PRVData := RVData.GetAbsoluteParentData;
  1336.     if (PRVData<>nil) and (PRVData is TRVEditRVData) then begin
  1337.       TRVEditRVData(PRVData).ClearJumps;
  1338.       TRVEditRVData(PRVData).Flags := TRVEditRVData(PRVData).Flags - [rvflUseJumps];
  1339.       TRVEditRVData(PRVData).State := TRVEditRVData(PRVData).State - [rvstDrawHover];
  1340.     end;
  1341.   end;
  1342.   GenerateMouseMove;
  1343.   if (Style<>nil) and (not TRVEditRVData(RVData).NotFormatted) then begin
  1344.     HideCaret(Handle);
  1345.     DestroyCaret;
  1346. //    Invalidate;
  1347.   end;
  1348. end;
  1349. {------------------------------------------------------------------------------}
  1350. procedure TCustomRichViewEdit.WMInputLangChange(var Message: TMessage);
  1351. {$IFDEF RICHVIEWCBDEF3}
  1352. var NewStyleNo : integer;
  1353. {$ENDIF}
  1354. begin
  1355.   {$IFDEF RICHVIEWCBDEF3}
  1356.   if (Style=nil) or (ItemCount=0) or
  1357.       not (rvoAutoSwitchLang in EditorOptions)
  1358.       {$IFNDEF RVDONOTUSEUNICODE}
  1359.       or Style.TextStyles[CurTextStyleNo].Unicode
  1360.       {$ENDIF}
  1361.       then
  1362.     exit;
  1363.   NewStyleNo := Style.TextStyles.FindStyleWithCharset(CurTextStyleNo, Message.WParam);
  1364.   if NewStyleNo=-1 then begin
  1365.     Style.TextStyles.Add;
  1366.     NewStyleNo := Style.TextStyles.Count-1;
  1367.     Style.TextStyles[NewStyleNo].Assign(Style.TextStyles[CurTextStyleNo]);
  1368.     Style.TextStyles[NewStyleNo].Standard := False;    
  1369.     Style.TextStyles[NewStyleNo].Charset := Message.WParam;
  1370.   end;
  1371.   CurTextStyleNo:=NewStyleNo;
  1372.   Message.Result := 1;
  1373.   {$ENDIF}
  1374. end;
  1375. {------------------------------------------------------------------------------}
  1376. procedure TCustomRichViewEdit.WMSetFocus(var Message: TWMSetFocus);
  1377. begin
  1378.   inherited;
  1379.   if {TRVEditRVData(RVData).NotFormatted} True then begin
  1380.     TRVEditRVData(RVData).PrepareForEdit;
  1381.     if (Style<>nil) and (not TRVEditRVData(RVData).NotFormatted) then begin
  1382.       TRVEditRVData(RVData).ChangeCaret(True,False,True,False);
  1383.       Invalidate;
  1384.     end;
  1385.   end;
  1386. end;
  1387. {------------------------------------------------------------------------------}
  1388. procedure TCustomRichViewEdit.WMGetDlgCode(var Message: TWMGetDlgCode);
  1389. begin
  1390.   Message.Result := DLGC_WANTARROWS or DLGC_WANTCHARS;
  1391.   if not (rvoDoNotWantReturns in EditorOptions) then
  1392.     Message.Result := Message.Result or DLGC_WANTALLKEYS;
  1393.   if rvoWantTabs in EditorOptions then
  1394.     Message.Result := Message.Result or DLGC_WANTTAB;
  1395. end;
  1396. {------------------------------------------------------------------------------}
  1397. procedure TCustomRichViewEdit.EMRedo(var Message: TMessage);
  1398. begin
  1399.   Message.Result := Integer(RedoAction<>rvutNone);
  1400.   if Message.Result<>0 then
  1401.     Redo;
  1402. end;
  1403. {------------------------------------------------------------------------------}
  1404. procedure TCustomRichViewEdit.WMClear(var Message: TMessage);
  1405. begin
  1406.   DeleteSelection;
  1407. end;
  1408. {------------------------------------------------------------------------------}
  1409. procedure TCustomRichViewEdit.WMUndo(var Message: TMessage);
  1410. begin
  1411.   Message.Result := Integer(UndoAction<>rvutNone);
  1412.   Undo;
  1413. end;
  1414. {------------------------------------------------------------------------------}
  1415. procedure TCustomRichViewEdit.EMUndo(var Message: TMessage);
  1416. begin
  1417.   Message.Result := Integer(UndoAction<>rvutNone);
  1418.   Undo;
  1419. end;
  1420. {------------------------------------------------------------------------------}
  1421. procedure TCustomRichViewEdit.EMCanRedo(var Message: TMessage);
  1422. begin
  1423.   Message.Result := Integer(RedoAction<>rvutNone);
  1424. end;
  1425. {------------------------------------------------------------------------------}
  1426. procedure TCustomRichViewEdit.EMCanUndo(var Message: TMessage);
  1427. begin
  1428.   Message.Result := Integer(UndoAction<>rvutNone);
  1429. end;
  1430. {------------------------------------------------------------------------------}
  1431. procedure TCustomRichViewEdit.CurParaStyleChange;
  1432. begin
  1433.   if (Style<>nil) and not (csDestroying in ComponentState) and
  1434.      Assigned(FOnCurParaStyleChanged) then
  1435.     FOnCurParaStyleChanged(GetRootEditor);
  1436. end;
  1437. {------------------------------------------------------------------------------}
  1438. procedure TCustomRichViewEdit.CurTextStyleChange;
  1439. begin
  1440.   if (Style<>nil) and not (csDestroying in ComponentState) and
  1441.      Assigned(FOnCurTextStyleChanged) then
  1442.      FOnCurTextStyleChanged(GetRootEditor);
  1443. end;
  1444. {------------------------------------------------------------------------------}
  1445. procedure TCustomRichViewEdit.SetCurParaStyleNo(const Value: Integer);
  1446. begin
  1447.   {$IFNDEF RVDONOTUSEINPLACE}
  1448.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1449.     TCustomRichViewEdit(InplaceEditor).SetCurParaStyleNo(Value);
  1450.     exit;
  1451.   end;
  1452.   {$ENDIF}
  1453.   if (TRVEditRVData(RVData).FCurParaStyleNo <> Value) or
  1454.      (rvstForceStyleChangeEvent in RVData.State) then begin
  1455.     TRVEditRVData(RVData).FCurParaStyleNo := Value;
  1456.     CurParaStyleChange;
  1457.   end;
  1458. end;
  1459. {------------------------------------------------------------------------------}
  1460. procedure TCustomRichViewEdit.SetCurTextStyleNo(const Value: Integer);
  1461. begin
  1462.   {$IFNDEF RVDONOTUSEINPLACE}
  1463.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1464.     TCustomRichViewEdit(InplaceEditor).SetCurTextStyleNo(Value);
  1465.     exit;
  1466.   end;
  1467.   {$ENDIF}
  1468.   if (TRVEditRVData(RVData).FCurTextStyleNo <> Value) or
  1469.       (rvstForceStyleChangeEvent in RVData.State)
  1470.    then begin
  1471.     Exclude(RVData.State, rvstForceStyleChangeEvent);
  1472.     TRVEditRVData(RVData).FCurTextStyleNo := Value;
  1473.     CurTextStyleChange;
  1474.   end;
  1475. end;
  1476. {------------------------------------------------------------------------------}
  1477. function TCustomRichViewEdit.GetCurParaStyleNo: Integer;
  1478. begin
  1479.   Result := TRVEditRVData(GetTopLevelEditor.RVData).FCurParaStyleNo;
  1480.   {$IFDEF RVDEBUG}{$I Debugk.inc}{$ENDIF}
  1481. end;
  1482. {------------------------------------------------------------------------------}
  1483. function TCustomRichViewEdit.GetCurTextStyleNo: Integer;
  1484. begin
  1485.   Result := RVData.GetActualStyle2(
  1486.     TRVEditRVData(GetTopLevelEditor.RVData).FCurTextStyleNo,
  1487.     TRVEditRVData(GetTopLevelEditor.RVData).FCurParaStyleNo);
  1488. end;
  1489. {------------------------------------------------------------------------------}
  1490. function TCustomRichViewEdit.GetActualCurTextStyleNo: Integer;
  1491. begin
  1492.   Result := TRVEditRVData(GetTopLevelEditor.RVData).FCurTextStyleNo;
  1493. end;
  1494. {------------------------------------------------------------------------------}
  1495. procedure TCustomRichViewEdit.KeyUp(var Key: Word; Shift: TShiftState);
  1496. begin
  1497.   if Key=VK_CONTROL then begin
  1498.     TRVEditRVData(RVdata).ClearJumpsCoords;
  1499.     GenerateMouseMove;
  1500.   end;
  1501.   inherited KeyUp(Key, Shift);
  1502. end;
  1503. {-----------------------------------------------------------------------}
  1504. procedure TCustomRichViewEdit.WMSysChar(var Message: TWMSysChar);
  1505. begin
  1506.   if (Message.CharCode = VK_BACK) and (UndoLimit<>0) then
  1507.     Message.Result := 0
  1508.   else
  1509.     inherited;
  1510. end;
  1511. {-----------------------------------------------------------------------}
  1512. {
  1513. function IsLeadByte(ch: Char; CodePage: TRVCodePage): Boolean;
  1514. var cpinfo: TCPInfo;
  1515.     i: Integer;
  1516. begin
  1517.   Result := False;
  1518.   GetCPInfo(CodePage, cpinfo);
  1519.   if cpinfo.MaxCharSize=1 then
  1520.     exit;
  1521.   for i := 0 to MAX_LEADBYTES div 2-1 do begin
  1522.     if (cpinfo.LeadByte[i*2]=0) and (cpinfo.LeadByte[i*2+1]=0) then
  1523.       break;
  1524.     if ch in [chr(cpinfo.LeadByte[i*2])..chr(cpinfo.LeadByte[i*2+1])] then begin
  1525.       Result := True;
  1526.       break;
  1527.     end;
  1528.   end;
  1529. end;
  1530. }
  1531. {-----------------------------------------------------------------------}
  1532. {$IFDEF VER93} // C++Builder 1
  1533. function ToUnicode(wVirtKey, wScanCode: UINT; const KeyState: TKeyboardState;
  1534.   var pwszBuff; cchBuff: Integer; wFlags: UINT): Integer; stdcall;
  1535.   external user32 name 'ToUnicode';
  1536. {$ENDIF}
  1537. procedure TCustomRichViewEdit.WMKeyDown(var Message: TWMKeyDown);
  1538. {$IFNDEF RVDONOTUSEUNICODE}
  1539. var KeyState: TKeyboardState;
  1540.     s: String;
  1541.     Len: Integer;
  1542.     CodePage: TRVCodePage;
  1543.     ansis: String;
  1544. {$ENDIF}
  1545. begin
  1546.   {$IFNDEF RVDONOTUSEUNICODE}
  1547.   CodePage := RVU_GetKeyboardCodePage;
  1548.   RVData.State := RVData.State-[rvstIgnoreNextChar];
  1549.   Len := 0;
  1550.   if RVNT and (CodePage=0) then
  1551.     BeforeUnicode;
  1552.   if ((RichViewUnicodeInput=rvuiAlternative) or (CodePage=0)) and RVNT and
  1553.      Style.TextStyles[CurTextStyleNo].Unicode then begin
  1554.     // Manual translation of key codes to Unicode
  1555.     if Message.CharCode in [ord('A')..ord('Z'),ord('0')..ord('9'),187..192,219..221] then begin
  1556.       if Style.TextStyles[CurTextStyleNo].Unicode then begin
  1557.         SetLength(s,10);
  1558.         if GetKeyboardState(KeyState)
  1559.           and not (((KeyState[VK_CONTROL] and $80)<>0) and ((KeyState[VK_MENU] and $80)=0)) then begin
  1560.           Len := ToUnicode(Message.CharCode, Message.KeyData, KeyState, PChar(s)^, 5, 0);
  1561.           if Len>0 then begin
  1562.             if not BeforeChange(False) then exit;
  1563.             TRVEditRVData(RVData).DeleteSelection_;
  1564.             SetLength(s, Len*2);
  1565.             if Len=1 then begin
  1566.               if CodePage=0 then
  1567.                 CodePage := Style.DefCodePage;
  1568.               ansis := RVU_UnicodeToAnsi(CodePage, s);
  1569.               if ansis='' then
  1570.                 ansis := '?';
  1571.               TRVEditRVData(RVData).InsertTextTyping(s, ansis[1]);
  1572.               end
  1573.             else
  1574.               InsertTextW_(s);
  1575.           end;
  1576.         end;
  1577.       end;
  1578.     end;
  1579.   end;
  1580.   if Len<=0 then
  1581.     inherited
  1582.   else begin
  1583.     Message.CharCode := 0;
  1584.     Message.Result   := 0;
  1585.     RVData.State := RVData.State+[rvstIgnoreNextChar];
  1586.   end;
  1587.   {$ELSE}
  1588.   inherited;
  1589.   {$ENDIF}
  1590. end;
  1591. {-----------------------------------------------------------------------}
  1592. procedure TCustomRichViewEdit.KeyDown(var Key: Word; Shift: TShiftState);
  1593. var selchanged : ByteBool;
  1594.   {........................................................}
  1595.   procedure GetOut(Direction: TRVGetOutDirection);
  1596.   begin
  1597.     if Assigned(FOnCaretGetOut) then
  1598.       FOnCaretGetOut(Self, Direction);
  1599.   end;
  1600. begin
  1601.   TRVEditRVData(RVData).PrepareForEdit;
  1602.   if (Key=VK_RETURN) and (rvoDoNotWantReturns in EditorOptions) then
  1603.     Key := 0;
  1604.   if IsUndoShortcut(Shift, Key) then begin
  1605.     Undo;
  1606.     Key := 0;
  1607.     end
  1608.   else if IsRedoShortcut(Shift, Key) then begin
  1609.     Redo;
  1610.     Key := 0;
  1611.   end;
  1612.   if Key = 0 then
  1613.     exit;
  1614.   inherited KeyDown(Key, Shift);
  1615.   if Key = 0 then
  1616.     exit;
  1617.   if (Key=VK_ESCAPE) and TRVEditRVData(RVData).CancelResize then
  1618.     exit;
  1619.   if (Key=VK_UP) and (ssCtrl in Shift) then begin
  1620.     GetRootEditor.VScrollPos := GetRootEditor.VScrollPos-1;
  1621.     exit;
  1622.   end;
  1623.   if (Key=VK_DOWN) and (ssCtrl in Shift) then begin
  1624.     GetRootEditor.VScrollPos := GetRootEditor.VScrollPos+1;
  1625.     exit;
  1626.   end;
  1627.   // Step 1 of 3. Working with selection
  1628.   selchanged := False;
  1629.   case Key of
  1630.     VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN,
  1631.     VK_HOME, VK_END, VK_PRIOR, VK_NEXT:
  1632.     begin
  1633.       {$IFNDEF RVDONOTUSELIVESPELL}
  1634.       LiveSpellingCheckCurrentItem(RVData, CurItemNo);
  1635.       {$ENDIF}
  1636.       // if cursor movement key, then handle selection
  1637.       if ssShift in Shift then begin
  1638.           TRVEditRVData(RVData).StartShiftMoving;
  1639.           selchanged := True;
  1640.         end
  1641.       else begin
  1642.         selchanged := SelectionExists;
  1643.         if selchanged then Deselect;
  1644.       end
  1645.     end;
  1646.   VK_MENU, VK_SHIFT,
  1647.   VK_F1..VK_F24, VK_SCROLL, VK_NUMLOCK, VK_PAUSE, VK_CAPITAL, VK_ESCAPE,
  1648.   VK_SNAPSHOT, VK_LWIN, VK_RWIN, VK_APPS, VK_LSHIFT..{VK_LAUNCH_APP2}$B7,
  1649.   VK_PROCESSKEY, VK_ATTN..$FF:
  1650.     begin
  1651.       // Do nothing
  1652.     end;
  1653.   VK_CONTROL:
  1654.     begin
  1655.       if (rvoCtrlJumps in EditorOptions) and not (rvflUseJumps in Flags) then begin
  1656.         TRVEditRVData(RVData).BuildJumpsCoords(False);
  1657.         GenerateMouseMove;
  1658.       end;
  1659.     end;
  1660.   VK_BACK, VK_DELETE:
  1661.     begin
  1662.       // if selection exists then delete it and forbid further actions
  1663.       selchanged := SelectionExists;
  1664.       if selchanged then begin
  1665.         if IsCutShortcut(Shift, Key) then
  1666.           SendMessage(Handle, WM_CUT, 0, 0)
  1667.         else begin
  1668.           if not BeforeChange(False) then exit;
  1669.           TRVEditRVData(RVData).DeleteSelection_;
  1670.           Key := 0;
  1671.           Refresh;
  1672.         end;
  1673.         Exit;
  1674.       end;
  1675.     end;
  1676.   else
  1677.     begin
  1678.       if IsCopyShortcut(Shift,Key) then begin
  1679.         //SendMessage(Handle, WM_COPY, 0, 0); handled by RichView
  1680.         Key := 0;
  1681.         exit;
  1682.       end;
  1683.       if IsCutShortcut(Shift, Key) then begin
  1684.         SendMessage(Handle, WM_CUT, 0, 0);
  1685.         exit;
  1686.       end;
  1687.       if IsPasteShortcut(Shift, Key) then begin
  1688.         SendMessage(Handle, WM_PASTE, 0, 0);
  1689.         exit;
  1690.       end;
  1691.       if not (ssAlt in Shift) and not (ssCtrl in Shift) and (Key<>VK_INSERT) then begin
  1692.         // Just delete selection, if it exists
  1693.         selchanged := SelectionExists;
  1694.         if selchanged then begin
  1695.           if not BeforeChange(False) then exit;
  1696.           TRVEditRVData(RVData).DeleteSelection_;
  1697.         end;
  1698.       end;
  1699.     end;
  1700.   end;
  1701.   // Step 2 of 3. Processing the key
  1702.   case Key of
  1703.     VK_RETURN:
  1704.       begin
  1705.         if not ((ssShift in Shift) and (rvoDoNotWantShiftReturns in EditorOptions)) then
  1706.           OnEnterPress(ssShift in Shift);
  1707.         Key := 0;
  1708.         exit;
  1709.       end;
  1710.     VK_BACK:
  1711.       begin
  1712.         OnBackSpacePress(ssCtrl in Shift);
  1713.         Key := 0;
  1714.         exit;
  1715.       end;
  1716.     VK_DELETE:
  1717.       begin
  1718.         OnDeletePress(ssCtrl in Shift);
  1719.         {$IFDEF RVDEBUG}{$I Debugj.inc}{$ENDIF}
  1720.         Key := 0;
  1721.         exit;
  1722.       end;
  1723.     VK_HOME:
  1724.       if TRVEditRVData(RVData).OnHomePress(ssCtrl in Shift) then
  1725.         GetOut(rvdTop);
  1726.     VK_END:
  1727.       if TRVEditRVData(RVData).OnEndPress(ssCtrl in Shift) then
  1728.         GetOut(rvdBottom);
  1729.     VK_LEFT:
  1730.       if BiDiMode=rvbdRightToLeft then begin
  1731.         if TRVEditRVData(RVData).OnRightPress(ssShift in Shift, ssCtrl in Shift) then
  1732.           GetOut(rvdRight);
  1733.         end
  1734.       else begin
  1735.         if TRVEditRVData(RVData).OnLeftPress(ssShift in Shift, ssCtrl in Shift) then
  1736.           GetOut(rvdLeft);
  1737.       end;
  1738.     VK_RIGHT:
  1739.       if BiDiMode=rvbdRightToLeft then begin
  1740.         if TRVEditRVData(RVData).OnLeftPress(ssShift in Shift, ssCtrl in Shift) then
  1741.           GetOut(rvdLeft);
  1742.         end
  1743.       else begin
  1744.         if TRVEditRVData(RVData).OnRightPress(ssShift in Shift, ssCtrl in Shift) then
  1745.           GetOut(rvdRight);
  1746.       end;
  1747.     VK_UP:
  1748.       if TRVEditRVData(RVData).OnUpPress(ssShift in Shift, ssCtrl in Shift) then
  1749.         GetOut(rvdUp);
  1750.     VK_DOWN:
  1751.       if TRVEditRVData(RVData).OnDownPress(ssShift in Shift, ssCtrl in Shift) then
  1752.         GetOut(rvdDown);      
  1753.     VK_PRIOR:
  1754.       TRVEditRVData(RVData).OnPgUpPress;
  1755.     VK_NEXT:
  1756.       TRVEditRVData(RVData).OnPgDownPress;
  1757.     VK_TAB:
  1758.       begin
  1759.         if ssCtrl in Shift then
  1760.           PostMessage(Handle, WM_CHAR, VK_TAB, 0)
  1761.       end;
  1762.     else
  1763.       begin
  1764.         if selchanged then
  1765.           Invalidate;
  1766.         exit;
  1767.       end;
  1768.   end;
  1769.   // Step 3 of 3: Processing selection (if key is arrow-moving key)
  1770.   if ssShift in Shift then
  1771.     TRVEditRVData(RVData).EndShiftMoving;
  1772.   if selchanged then begin
  1773.     RVData.DoOnSelection(True);
  1774.     Invalidate;
  1775.   end;
  1776. end;
  1777. {------------------------------------------------------------------------------}
  1778. procedure TCustomRichViewEdit.ApplyParaStyle(ParaStyleNo: Integer);
  1779. begin
  1780.   {$IFNDEF RVDONOTUSEINPLACE}
  1781.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1782.     TCustomRichViewEdit(InplaceEditor).ApplyParaStyle(ParaStyleNo);
  1783.     exit;
  1784.   end;
  1785.   {$ENDIF}
  1786.   if not BeforeChange(False) then exit;
  1787.   TRVEditRVData(RVData).BeginUndoSequence(rvutPara, True);
  1788.   TRVEditRVData(RVData).ApplyParaStyle(ParaStyleNo, rvscParaStyle);
  1789. end;
  1790. {------------------------------------------------------------------------------}
  1791. procedure TCustomRichViewEdit.ApplyTextStyleConversionProc(
  1792.   Sender: TCustomRichViewEdit; StyleNo, ParaStyleNo, UserData: Integer;
  1793.   AppliedToText: Boolean; var NewStyleNo: Integer; ToWholeParagraphs: Boolean);
  1794. begin
  1795.   if not (AppliedToText and (rvprStyleProtect in Style.TextStyles[StyleNo].Protection)) then
  1796.     NewStyleNo := UserData;
  1797. end;
  1798. {------------------------------------------------------------------------------}
  1799. {$IFNDEF RVDONOTUSESTYLETEMPLATES}
  1800. procedure TCustomRichViewEdit.ApplyParaStyleTemplateConversionProc(
  1801.   Sender: TCustomRichViewEdit; StyleNo, ParaStyleNo, UserData: Integer;
  1802.   AppliedToText: Boolean; var NewStyleNo: Integer; ToWholeParagraphs: Boolean);
  1803. var ParaStyle: TParaInfo;
  1804. begin
  1805.   if rvpaoStyleProtect in Style.ParaStyles[StyleNo].Options then
  1806.     exit;
  1807.   ParaStyle := TParaInfo.Create(nil);
  1808.   try
  1809.     ParaStyle.Assign(Style.ParaStyles[StyleNo]);
  1810.     if UserData>=0 then
  1811.       Style.StyleTemplates[UserData].ApplyToParaStyle(ParaStyle, True)
  1812.     else
  1813.       Style.StyleTemplates.ClearParaFormat(ParaStyle);
  1814.     NewStyleNo := Style.ParaStyles.FindSuchStyle(StyleNo, ParaStyle, RVAllParaInfoProperties);
  1815.     if NewStyleNo<0 then begin
  1816.       NewStyleNo := Style.ParaStyles.Count;
  1817.       Style.ParaStyles.Add.Assign(ParaStyle);
  1818.       Style.ParaStyles[NewStyleNo].Standard := False;
  1819.     end;
  1820.   finally
  1821.     ParaStyle.Free;
  1822.   end;
  1823. end;
  1824. {------------------------------------------------------------------------------}
  1825. procedure TCustomRichViewEdit.ApplyTextStyleTemplateConversionProc(
  1826.   Sender: TCustomRichViewEdit; StyleNo, ParaStyleNo, UserData: Integer;
  1827.   AppliedToText: Boolean; var NewStyleNo: Integer; ToWholeParagraphs: Boolean);
  1828. var TextStyle: TFontInfo;
  1829. begin
  1830.   if rvprStyleProtect in Style.TextStyles[StyleNo].Protection then
  1831.     exit;
  1832.   TextStyle := TFontInfo.Create(nil);
  1833.   try
  1834.     TextStyle.Assign(Style.TextStyles[StyleNo]);
  1835.     if UserData>=0 then
  1836.       Style.StyleTemplates[UserData].ApplyToTextStyle(TextStyle,
  1837.         Style.ParaStyles[ParaStyleNo], not ToWholeParagraphs)
  1838.     else
  1839.       Style.StyleTemplates.ClearTextFormat(TextStyle, Style.ParaStyles[ParaStyleNo]);
  1840.     NewStyleNo := Style.TextStyles.FindSuchStyle(StyleNo, TextStyle, RVAllFontInfoProperties);
  1841.     if NewStyleNo<0 then begin
  1842.       NewStyleNo := Style.TextStyles.Count;
  1843.       Style.TextStyles.Add.Assign(TextStyle);
  1844.       Style.TextStyles[NewStyleNo].Standard := False;
  1845.     end;
  1846.   finally
  1847.     TextStyle.Free;
  1848.   end;
  1849. end;
  1850. {$ENDIF}
  1851. {------------------------------------------------------------------------------}
  1852. procedure TCustomRichViewEdit.ApplyUserParaStyleConversionProc(
  1853.   Sender: TCustomRichViewEdit; StyleNo, ParaStyleNo, UserData: Integer;
  1854.   AppliedToText: Boolean; var NewStyleNo: Integer; ToWholeParagraphs: Boolean);
  1855. begin
  1856.   FOnParaStyleConversion(Sender, StyleNo, UserData, AppliedToText, NewStyleNo);
  1857. end;
  1858. {------------------------------------------------------------------------------}
  1859. procedure TCustomRichViewEdit.ApplyUserTextStyleConversionProc(
  1860.   Sender: TCustomRichViewEdit; StyleNo, ParaStyleNo, UserData: Integer;
  1861.   AppliedToText: Boolean; var NewStyleNo: Integer; ToWholeParagraphs: Boolean);
  1862. begin
  1863.   FOnStyleConversion(Sender, StyleNo, UserData, AppliedToText, NewStyleNo);
  1864. end;
  1865. {------------------------------------------------------------------------------}
  1866. procedure TCustomRichViewEdit.ApplyStyleConversion(UserData: Integer);
  1867. begin
  1868.   {$IFNDEF RVDONOTUSEINPLACE}
  1869.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1870.     TCustomRichViewEdit(InplaceEditor).ApplyStyleConversion(UserData);
  1871.     exit;
  1872.   end;
  1873.   {$ENDIF}
  1874.   if RVData.SelectionExists(False, True) and not BeforeChange(False) then
  1875.     exit;
  1876.   if Assigned(FOnStyleConversion) then begin
  1877.     FCurStyleConversion := ApplyUserTextStyleConversionProc;
  1878.     TRVEditRVData(RVData).ApplyStyleConversion_(UserData,
  1879.       rvscTextStyleConversion, False);
  1880.   end;
  1881. end;
  1882. {------------------------------------------------------------------------------}
  1883. procedure TCustomRichViewEdit.ApplyParaStyleConversion(UserData: Integer);
  1884. begin
  1885.   {$IFNDEF RVDONOTUSEINPLACE}
  1886.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1887.     TCustomRichViewEdit(InplaceEditor).ApplyParaStyleConversion(UserData);
  1888.     exit;
  1889.   end;
  1890.   {$ENDIF}
  1891.   if Assigned(FOnParaStyleConversion) and BeforeChange(False) then begin
  1892.     TRVEditRVData(RVData).BeginUndoSequence(rvutPara, True);
  1893.     FCurStyleConversion := ApplyUserParaStyleConversionProc;
  1894.     TRVEditRVData(RVData).ApplyParaStyle(UserData, rvscParaStyleConversion);
  1895.   end;
  1896. end;
  1897. {------------------------------------------------------------------------------}
  1898. {$IFNDEF RVDONOTUSESTYLETEMPLATES}
  1899. procedure TCustomRichViewEdit.ApplyStyleTemplate(TemplateNo: Integer);
  1900. var ToWholeParagraphs: Boolean;
  1901. begin
  1902.   {$IFNDEF RVDONOTUSEINPLACE}
  1903.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1904.     TCustomRichViewEdit(InplaceEditor).ApplyStyleTemplate(TemplateNo);
  1905.     exit;
  1906.   end;
  1907.   {$ENDIF}
  1908.   ToWholeParagraphs := not RVData.SelectionExists(True, False) or RVData.IsMultiParagraphSelection;
  1909.   if BeforeChange(False) then begin
  1910.     if ToWholeParagraphs then
  1911.       TRVEditRVData(RVData).BeginUndoSequence(rvutPara, True)
  1912.     else
  1913.       TRVEditRVData(RVData).BeginUndoSequence(rvutStyleNo, True);
  1914.     TRVEditRVData(RVData).SetUndoGroupMode(True);
  1915.     try
  1916.       if ToWholeParagraphs then begin
  1917.         FCurStyleConversion := ApplyParaStyleTemplateConversionProc;
  1918.         TRVEditRVData(RVData).ApplyParaStyle(TemplateNo, rvscParaStyleTemplate);
  1919.       end;
  1920.       FCurStyleConversion := ApplyTextStyleTemplateConversionProc;
  1921.       TRVEditRVData(RVData).ApplyStyleConversion_(TemplateNo,
  1922.         rvscTextStyleTemplate, ToWholeParagraphs);
  1923.     finally
  1924.       TRVEditRVData(RVData).SetUndoGroupMode(False);
  1925.     end;
  1926.   end;
  1927. end;
  1928. {------------------------------------------------------------------------------}
  1929. procedure TCustomRichViewEdit.ApplyParaStyleTemplate(TemplateNo: Integer);
  1930. begin
  1931.   {$IFNDEF RVDONOTUSEINPLACE}
  1932.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1933.     TCustomRichViewEdit(InplaceEditor).ApplyParaStyleTemplate(TemplateNo);
  1934.     exit;
  1935.   end;
  1936.   {$ENDIF}
  1937.   if BeforeChange(False) then begin
  1938.     TRVEditRVData(RVData).BeginUndoSequence(rvutPara, True);
  1939.     FCurStyleConversion := ApplyParaStyleTemplateConversionProc;
  1940.     TRVEditRVData(RVData).ApplyParaStyle(TemplateNo, rvscParaStyleTemplate);
  1941.   end;
  1942. end;
  1943. {------------------------------------------------------------------------------}
  1944. procedure TCustomRichViewEdit.ApplyTextStyleTemplate(TemplateNo: Integer;
  1945.   ToWholeParagraphs: Boolean);
  1946. begin
  1947.   {$IFNDEF RVDONOTUSEINPLACE}
  1948.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1949.     TCustomRichViewEdit(InplaceEditor).ApplyTextStyleTemplate(TemplateNo,
  1950.       ToWholeParagraphs);
  1951.     exit;
  1952.   end;
  1953.   {$ENDIF}
  1954.   if BeforeChange(False) then begin
  1955.     TRVEditRVData(RVData).BeginUndoSequence(rvutPara, True);
  1956.     FCurStyleConversion := ApplyTextStyleTemplateConversionProc;
  1957.     TRVEditRVData(RVData).ApplyStyleConversion_(TemplateNo,
  1958.       rvscTextStyleTemplate, ToWholeParagraphs);
  1959.   end;
  1960. end;
  1961. {$ENDIF}
  1962. {------------------------------------------------------------------------------}
  1963. procedure TCustomRichViewEdit.ApplyTextStyle(TextStyleNo: Integer);
  1964. begin
  1965.   {$IFNDEF RVDONOTUSEINPLACE}
  1966.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1967.     TCustomRichViewEdit(InplaceEditor).ApplyTextStyle(TextStyleNo);
  1968.     exit;
  1969.   end;
  1970.   {$ENDIF}
  1971.   if BeforeChange(False) then begin
  1972.     FCurStyleConversion := ApplyTextStyleConversionProc;
  1973.     TRVEditRVData(RVData).ApplyStyleConversion_(TextStyleNo, rvscTextStyle, False);
  1974.   end;
  1975. end;
  1976. {------------------------------------------------------------------------------}
  1977. procedure TCustomRichViewEdit.OnBackSpacePress(Ctrl: Boolean);
  1978. begin
  1979.   //if not BeforeChange(False) then exit;
  1980.   TRVEditRVData(RVData).OnBackSpacePress_(Ctrl, False, False);
  1981.   Change;
  1982. end;
  1983. {------------------------------------------------------------------------------}
  1984. procedure TCustomRichViewEdit.OnDeletePress(Ctrl: Boolean);
  1985. begin
  1986.   //if not BeforeChange(False) then exit;
  1987.   TRVEditRVData(RVData).OnDeletePress_(Ctrl, False);
  1988.   Change;
  1989. end;
  1990. {------------------------------------------------------------------------------}
  1991. procedure TCustomRichViewEdit.OnEnterPress(Shift: Boolean);
  1992. begin
  1993.   if not BeforeChange(False) then exit;
  1994.   if TRVEditRVData(RVData).OnEnterPress_(Shift, False) then begin
  1995.     Refresh;
  1996.     Change;
  1997.   end;
  1998. end;
  1999. {------------------------------------------------------------------------------}
  2000. function TCustomRichViewEdit.InsertRVFFromStreamEd(Stream: TStream):Boolean;
  2001. begin
  2002.   {$IFNDEF RVDONOTUSEINPLACE}
  2003.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  2004.     Result := TCustomRichViewEdit(InplaceEditor).InsertRVFFromStreamEd(Stream);
  2005.     exit;
  2006.   end;
  2007.   {$ENDIF}
  2008.   Result := True;
  2009.   if not BeforeChange(False) then exit;
  2010.   if (RVData.PartialSelectedItem<>nil)or not CanDelete then begin
  2011.     TRVEditRVData(RVData).Beep;
  2012.     exit;
  2013.   end;
  2014.   TRVEditRVData(RVData).BeginUndoSequence(rvutInsert, True);
  2015.   SetUndoGroupMode(True);
  2016.   try
  2017.     TRVEditRVData(RVData).DeleteSelection_;
  2018.     Result := TRVEditRVData(RVData).InsertRVFFromStreamEd_(Stream);
  2019.   finally
  2020.     SetUndoGroupMode(False);
  2021.     Change;
  2022.   end;
  2023. end;
  2024. {------------------------------------------------------------------------------}
  2025. function TCustomRichViewEdit.InsertRVFFromFileEd(const FileName: String):Boolean;
  2026. var Stream: TFileStream;
  2027. begin
  2028.   try
  2029.     Stream := TFileStream.Create(FileName, fmOpenRead);
  2030.     try
  2031.       Result := InsertRVFFromStreamEd(Stream);
  2032.     finally
  2033.       Stream.Free;
  2034.     end;
  2035.   except
  2036.     Result := False;
  2037.   end;
  2038. end;
  2039. {------------------------------------------------------------------------------}
  2040. procedure TCustomRichViewEdit.WMChar(var Message: TWMChar);
  2041. {$IFNDEF RVDONOTUSEUNICODE}
  2042. var s: String;
  2043. {$ENDIF}
  2044. begin
  2045.   {$IFNDEF RVDONOTUSEUNICODE}
  2046.   if rvstIgnoreNextChar in RVData.State then
  2047.     exit;
  2048.   if Message.CharCode>$FF then begin
  2049.     BeforeUnicode;
  2050.     SetLength(s,2);
  2051.     s[1] := chr(Message.CharCode and $00FF);
  2052.     s[2] := chr((Message.CharCode and $FF00) shr 8);
  2053.     s := RVU_AnsiToUnicode(RVU_GetKeyboardCodePage, s);
  2054.     if Length(s)>0 then
  2055.       if (Length(s)=2) and Style.TextStyles[CurTextStyleNo].Unicode then
  2056.         TRVEditRVData(RVData).InsertTextTyping(s, '?')
  2057.       else
  2058.         InsertTextW_(s);
  2059.     exit;
  2060.   end;
  2061.   {$ENDIF}
  2062.   inherited;
  2063. end;
  2064. {------------------------------------------------------------------------------}
  2065. procedure TCustomRichViewEdit.KeyPress(var Key: Char);
  2066. var s: String;
  2067.     i: Integer;
  2068.     r: Boolean;
  2069. begin
  2070.   if rvstIgnoreNextChar in RVData.State then
  2071.     exit;
  2072.   if (ord(Key)=VK_RETURN) and (rvoDoNotWantReturns in EditorOptions) then begin
  2073.     Key := #0;
  2074.     TRVEditRVData(RVData).Beep;
  2075.     exit;
  2076.   end;
  2077.   if ((Key < #32) or (Key=#127)) and (ord(Key)<>VK_TAB) then exit;
  2078.   Include(RVData.State, rvstKeyPress);
  2079.   try
  2080.   r := BeforeChange(False);
  2081.   finally
  2082.     Exclude(RVData.State, rvstKeyPress);
  2083.   end;
  2084.   if not r then
  2085.     exit;
  2086.   inherited KeyPress(Key);
  2087.   if Key=#0 then
  2088.     exit;
  2089.   DeleteSelection;
  2090.   if ord(Key)=VK_TAB then begin
  2091.     if Style.SpacesInTab>0 then begin
  2092.       SetLength(s, Style.SpacesInTab);
  2093.       for i := 1 to Style.SpacesInTab do
  2094.         s[i] := ' ';
  2095.       InsertText(s, False);
  2096.       end
  2097.    {$IFNDEF RVDONOTUSETABS}
  2098.     else
  2099.       InsertTab
  2100.     {$ENDIF}
  2101.     ;
  2102.     exit;
  2103.   end;
  2104.   TRVEditRVData(RVData).KeyPress(Key);
  2105. end;
  2106. {------------------------------------------------------------------------------}
  2107. procedure TCustomRichViewEdit.SetCheckpointInfoEd(ItemNo: Integer; ATag: Integer; const AName: String;
  2108.                               ARaiseEvent: Boolean);
  2109. var cp: TRVCPInfo;
  2110. begin
  2111.   if not BeforeChange(False) then exit;
  2112.   cp := TCustomRVItemInfo(RVData.Items.Objects[ItemNo]).Checkpoint;
  2113.   if cp<>nil then begin
  2114.     TRVEditRVData(RVData).BeginUndoSequence(rvutModifyCheckpoint, True);
  2115.     if ATag=cp.Tag then
  2116.       ATag := RV_CopyTag(ATag, rvoTagsArePChars in Options);
  2117.     TRVEditRVData(RVData).Do_DeleteCP(ItemNo);
  2118.     end
  2119.   else
  2120.     TRVEditRVData(RVData).BeginUndoSequence(rvutAddCheckpoint, True);
  2121.   cp := TRVCPInfo.Create;
  2122.   cp.Name       := AName;
  2123.   cp.Tag        := ATag;
  2124.   cp.RaiseEvent := ARaiseEvent;
  2125.   TRVEditRVData(RVData).Do_AddCP(ItemNo, cp);
  2126.   Change;
  2127.   Invalidate;
  2128. end;
  2129. {------------------------------------------------------------------------------}
  2130. procedure TCustomRichViewEdit.RemoveCheckpointEd(ItemNo: Integer);
  2131. begin
  2132.   if TCustomRVItemInfo(RVData.Items.Objects[ItemNo]).Checkpoint=nil then exit;
  2133.   if not BeforeChange(False) then exit;
  2134.   TRVEditRVData(RVData).BeginUndoSequence(rvutRemoveCheckpoint, True);
  2135.   TRVEditRVData(RVData).Do_DeleteCP(ItemNo);
  2136.   Change;
  2137.   Invalidate;
  2138. end;
  2139. {------------------------------------------------------------------------------}
  2140. procedure TCustomRichViewEdit.SetCurrentCheckpointInfo(ATag: Integer; const AName: String;
  2141.                                                  ARaiseEvent: Boolean);
  2142. begin
  2143.   {$IFNDEF RVDONOTUSEINPLACE}
  2144.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  2145.     TCustomRichViewEdit(InplaceEditor).SetCurrentCheckpointInfo(ATag, AName, ARaiseEvent);
  2146.     exit;
  2147.   end;
  2148.   {$ENDIF}
  2149.   SetCheckpointInfoEd(CurItemNo, ATag, AName, ARaiseEvent);
  2150. end;
  2151. {------------------------------------------------------------------------------}
  2152. function TCustomRichViewEdit.GetCurrentCheckpoint: TCheckpointData;
  2153. begin
  2154.   {$IFNDEF RVDONOTUSEINPLACE}
  2155.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  2156.     Result := TCustomRichViewEdit(InplaceEditor).GetCurrentCheckpoint;
  2157.     exit;
  2158.   end;
  2159.   {$ENDIF}
  2160.   Result := GetItemCheckpoint(CurItemNo);
  2161. end;
  2162. {------------------------------------------------------------------------------}
  2163. procedure TCustomRichViewEdit.RemoveCurrentCheckpoint;
  2164. begin
  2165.   {$IFNDEF RVDONOTUSEINPLACE}