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

RichEdit

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {       RichView                                        }
  4. {       TRichViewRVData represents RichView document.   }
  5. {       This is a type of TRichView.RVData.             }
  6. {                                                       }
  7. {       Copyright (c) Sergey Tkachenko                  }
  8. {       svt@trichview.com                               }
  9. {       http://www.trichview.com                        }
  10. {                                                       }
  11. {*******************************************************}
  12. unit RVRVData;
  13. interface
  14. {$I RV_Defs.inc}
  15. uses Windows, Classes, Controls, Graphics, Forms, StdCtrls,
  16.      RVItem, RVBack, RVStyle, CRVData, CRVFData, RVCtrlData, RVScroll,
  17.     {$IFDEF RICHVIEWDEF4}
  18.      ImgList,
  19.     {$ENDIF}
  20.     {$IFNDEF RVDONOTUSELISTS}
  21.      RVMarker,
  22.     {$ENDIF}
  23.     {$IFNDEF RVDONOTUSEDRAGDROP}
  24.      ActiveX, RVDragDrop,
  25.     {$ENDIF}
  26.     {$IFNDEF RVDONOTUSESMARTPOPUP}
  27.     RVPopup,
  28.     {$ENDIF}
  29.      RVClasses, RVFuncs, RVAnimate
  30.      ;
  31. type
  32.   TRichViewRVData = class (TRVControlData)
  33.   protected
  34.     FRichView: TRVScroller;
  35.     FFontInfoCache: TRVFontInfoCache;
  36.     RVFTextStylesMapping, RVFParaStylesMapping, RVFListStyleMapping: TRVIntegerList;
  37.     {$IFNDEF RVDONOTUSELISTS}
  38.     FMarkers: TRVMarkerList;
  39.     procedure DestroyMarkers; override;
  40.     {$ENDIF}
  41.     function GetInplaceEditor: TControl; override;
  42.     procedure DestroyInplaceEditor; override;
  43.     function GetRTFProperties: TPersistent{TRVRTFReaderProperties}; override;
  44.     procedure InitStyleMappings(var PTextStylesMapping,
  45.       PParaStylesMapping, PListStylesMapping: PRVIntegerList); override;
  46.     procedure DoneStyleMappings(PTextStylesMapping,
  47.       PParaStylesMapping, PListStylesMapping: PRVIntegerList); override;
  48.     {$IFNDEF RVDONOTUSEDRAGDROP}
  49.     { Drag & drop: drop from }
  50.     function CanStartDragging: Boolean; override;
  51.     function InitDragging(var DropSource: TRVDropSource;
  52.       var OKEffect: Integer): Boolean; override;
  53.     procedure DoneDragging(FDeleteSelection: Boolean); override;
  54.     {$ENDIF}
  55.     function GetRVDataExtraVOffs: Integer; override;
  56.     function DoCreateFontInfoCache(ACanvas: TCanvas;
  57.       Owner: TCustomRVFormattedData): TRVFontInfoCache;
  58.     procedure CreateFontInfoCache(ACanvas: TCanvas); override;
  59.     procedure DestroyFontInfoCache(var Cache: TRVFontInfoCache); override;
  60.     function GetFontInfoCache(ACanvas: TCanvas;
  61.       RVData: TCustomRVFormattedData): TRVFontInfoCache; override;
  62.   public
  63.     {$IFNDEF RVDONOTUSEANIMATION}
  64.     FPlayingAnimation: Boolean;
  65.     FAnimatorList: TRVAnimatorList;
  66.     {$ENDIF}
  67.     {$IFNDEF RVDONOTUSEDRAGDROP}
  68.     FDropSource: TRVDropSource; // object implemeting IDropSource and IDataObject
  69.     {$ENDIF}
  70.     {$IFNDEF RVDONOTUSESMARTPOPUP}
  71.     FSmartPopupButton: TRVSmartPopupButton;
  72.     {$ENDIF}
  73.     {$IFNDEF RVDONOTUSESMARTPOPUP}
  74.     procedure AdjustSpecialControlsCoords(RVData: TCustomRVFormattedData); override;
  75.     procedure SetSmartPopupCoords;
  76.     //procedure InternalFreeItem(item: TCustomRVItemInfo; Clearing: Boolean); override;
  77.     {$ENDIF}                
  78.     procedure Clear; override;
  79.     destructor Destroy; override;
  80.     function CanLoadLayout: Boolean; override;
  81.     function GetExtraRTFCode(Area: TRVRTFSaveArea; Obj: TObject;
  82.       Index1, Index2: Integer; InStyleSheet: Boolean): String; override;
  83.     function GetExtraHTMLCode(Area: TRVHTMLSaveArea; CSSVersion: Boolean): String; override;
  84.     function GetParaHTMLCode(RVData: TCustomRVData; ItemNo: Integer;
  85.       ParaStart, CSSVersion: Boolean): String; override;
  86.     function GetChosenRVData: TCustomRVData; override;
  87.     function GetChosenItem: TCustomRVItemInfo; override;
  88.     procedure AssignChosenRVData(RVData: TCustomRVFormattedData;
  89.                                  Item: TCustomRVItemInfo); override;
  90.     procedure SilentReplaceChosenRVData(RVData: TCustomRVFormattedData); override;
  91.     procedure UnassignChosenRVData(RVData: TCustomRVData); override;
  92.     function GetParentControl: TWinControl; override;
  93.     function GetDoInPaletteMode: TRVPaletteAction; override;
  94.     function GetRVPalette: HPALETTE; override;
  95.     function GetRVStyle: TRVStyle; override;
  96.     function GetRVLogPalette: PLogPalette; override;
  97.     function GetURL(id: Integer): String; override;
  98.     procedure ReadHyperlink(const Target, Extras: String; DocFormat: TRVLoadFormat;
  99.       var StyleNo, ItemTag: Integer; var ItemName: String); override;
  100.     procedure WriteHyperlink(id: Integer; RVData: TCustomRVData; ItemNo: Integer;
  101.        SaveFormat: TRVSaveFormat; var Target, Extras: String); override;
  102.     function GetOptions: TRVOptions; override;
  103.     procedure SetOptions(const Value: TRVOptions); override;
  104.     function GetDocProperties: TStringList; override;    
  105.     function GetRVFOptions: TRVFOptions; override;
  106.     procedure SetRVFOptions(const Value: TRVFOptions); override;
  107.     function GetRVFWarnings: TRVFWarnings; override;
  108.     procedure SetRVFWarnings(const Value: TRVFWarnings); override;
  109.     function GetRTFOptions: TRVRTFOptions; override;
  110.     procedure SetRTFOptions(const Value: TRVRTFOptions); override;
  111.     function GetAreaWidth: Integer; override;
  112.     function GetAreaHeight: Integer; override;
  113.     procedure GetOrigin(var ALeft, ATop: Integer); override;
  114.     procedure GetOriginEx(var ALeft, ATop: Integer); override;
  115.     function GetMinTextWidth: Integer; override;
  116.     function GetMaxTextWidth: Integer; override;
  117.     function GetLeftMargin: Integer; override;
  118.     function GetRightMargin: Integer; override;
  119.     function GetTopMargin: Integer; override;
  120.     function GetBottomMargin: Integer; override;
  121.     function GetFlags: TRVFlags; override;
  122.     procedure SetFlags(const Value: TRVFlags); override;
  123.     procedure AdjustVScrollUnits; override;
  124.     procedure SetDocumentAreaSize(Width,Height: Integer; UpdateH: Boolean); override;
  125.     procedure ScrollTo(Y: Integer; Redraw: Boolean); override;
  126.     procedure HScrollTo(X: Integer); override;
  127.     function GetVSmallStep: Integer; override;
  128.     function GetBackground: TRVBackground; override;
  129.     function IsAssignedCopy: Boolean; override;
  130.     function IsAssignedRVMouseDown: Boolean; override;
  131.     function IsAssignedRVMouseUp: Boolean; override;
  132.     function IsAssignedRVRightClick: Boolean; override;
  133.     function IsAssignedJump: Boolean; override;
  134.     function IsAssignedRVDblClick: Boolean; override;
  135.     function IsAssignedCheckpointVisible: Boolean; override;
  136.     function IsAssignedOnProgress: Boolean; override;
  137.     procedure DoProgress(Operation: TRVLongOperation; Stage: TRVProgressStage;
  138.       PercentDone: Byte); override;
  139.     procedure DoCopy; override;
  140.     procedure DoRVMouseMove(id: Integer); override;
  141.     procedure DoRVMouseDown(Button: TMouseButton; Shift: TShiftState;
  142.       ItemNo, X, Y: Integer); override;
  143.     procedure DoRVMouseUp(Button: TMouseButton; Shift: TShiftState;
  144.       ItemNo, X, Y: Integer); override;
  145.     procedure DoRVRightClick(const ClickedWord: String; StyleNo,
  146.       X, Y: Integer); override;
  147.     procedure DoRVDblClick(const ClickedWord: String; StyleNo: Integer); override;
  148.     procedure DoCheckpointVisible(CheckpointData: TCheckpointData); override;
  149.     procedure DoJump(id: Integer); override;
  150.     procedure DoSelect; override;
  151.     function GetNormalCursor: TCursor; override;
  152.     function GetCPEventKind: TCPEventKind; override;
  153.     procedure HTMLSaveImage(RVData: TCustomRVData; ItemNo: Integer;
  154.       const Path: String; BackgroundColor: TColor; var Location: String;
  155.       var DoDefault: Boolean); override;
  156.     procedure SaveImage2(Graphic: TGraphic; SaveFormat: TRVSaveFormat;
  157.       const Path, ImagePrefix: String; var ImageSaveNo: Integer;
  158.       var Location: String; var DoDefault: Boolean); override;
  159.     constructor Create(RichView: TRVScroller); virtual;
  160.     function GetHOffs: Integer; override;
  161.     function GetVOffs: Integer; override;
  162.     function GetCanvas: TCanvas; override;
  163.     function GetWidth: Integer; override;
  164.     function GetHeight: Integer; override;
  165.     function GetColor: TColor; override;
  166.     function SaveComponentToFile(const Path: String; SaveMe: TComponent;
  167.       SaveFormat: TRVSaveFormat): String; override;
  168.     function SaveItemToFile(const Path: String; RVData: TCustomRVData;
  169.       ItemNo: Integer; SaveFormat: TRVSaveFormat; Unicode: Boolean;
  170.       var Text: String): Boolean; override;
  171.     function ImportPicture(const Location: String;
  172.       Width, Height: Integer; var Invalid: Boolean): TGraphic; override;
  173.     function GetItemHint(RVData: TCustomRVData; ItemNo: Integer;
  174.       const UpperRVDataHint: String): String; override;
  175.     function RVFPictureNeeded(const ItemName: String;
  176.       ItemTag: Integer): TGraphic; override;
  177.     function RVFControlNeeded(const ItemName: String;
  178.       ItemTag: Integer): TControl; override;
  179.     function RVFImageListNeeded(ImageListTag: Integer): TCustomImageList; override;
  180.     function GetDelimiters: String; override;
  181.     function GetRVFTextStylesReadMode: TRVFReaderStyleMode; override;
  182.     function GetRVFParaStylesReadMode: TRVFReaderStyleMode; override;
  183.     function GetBiDiMode: TRVBiDiMode; override;
  184.     procedure ControlAction2(ControlAction: TRVControlAction; ItemNo: Integer;
  185.                             var Control:TControl); override;
  186.     procedure ItemAction(ItemAction: TRVItemAction; Item: TCustomRVItemInfo;
  187.                              var Text: String; RVData: TCustomRVData); override;
  188.     {$IFNDEF RVDONOTUSEDRAGDROP}
  189.     { Drag & drop: drop to }
  190.     function GetDragDropCaretInfo: TRVDragDropCaretInfo; override;
  191.     { Drag & drop: drop from }
  192.     function IsDragging: Boolean; override;
  193.     {$ENDIF}
  194.     {$IFNDEF RVDONOTUSEANIMATION}
  195.     procedure InsertAnimator(var Animator: TObject); override;
  196.     function AllowAnimation: Boolean; override;
  197.     procedure ResetAniBackground; override;
  198.     {$ENDIF}
  199.     {$IFNDEF RVDONOTUSELISTS}
  200.     function GetMarkers(AllowCreate: Boolean): TRVMarkerList; override;
  201.     {$ENDIF}
  202.     property RichView: TRVScroller read FRichView;
  203.   end;
  204.   TRichViewRVDataClass = class of TRichViewRVData;
  205.   TRVFontInfoCacheFast = class(TRVFontInfoCache)
  206.   protected
  207.     function GetItems(Index: Integer): TRVFontInfoCacheItem; override;
  208.   public
  209.     procedure Clear; {$IFDEF RICHVIEWDEF4}override;{$ENDIF}
  210.   end;
  211.   TRVFontInfoCacheLowResource = class(TRVFontInfoCache)
  212.   protected
  213.     function GetItems(Index: Integer): TRVFontInfoCacheItem; override;
  214.   end;  
  215. implementation
  216. uses RichView, RVUni;
  217. {============================ TRichViewRVData =================================}
  218. constructor TRichViewRVData.Create(RichView: TRVScroller);
  219. begin
  220.   inherited Create;
  221.   FRichView := RichView;
  222. end;
  223. {------------------------------------------------------------------------------}
  224. destructor TRichViewRVData.Destroy;
  225. begin
  226.   {$IFNDEF RVDONOTUSELISTS}
  227.   FMarkers.Free;
  228.   FMarkers := nil;
  229.   {$ENDIF}
  230.   {$IFNDEF RVDONOTUSEANIMATION}
  231.   TCustomRichView(RichView).StopAnimation;
  232.   FAnimatorList.Free;
  233.   FAnimatorList := nil;
  234.   {$ENDIF}
  235.   FFontInfoCache.Free;
  236.   inherited Destroy;
  237. end;
  238. {------------------------------------------------------------------------------}
  239. function TRichViewRVData.GetDoInPaletteMode: TRVPaletteAction;
  240. begin
  241.   Result := TCustomRichView(FRichView).DoInPaletteMode;
  242. end;
  243. {------------------------------------------------------------------------------}
  244. function TRichViewRVData.GetOptions: TRVOptions;
  245. begin
  246.   Result := TCustomRichView(FRichView).Options;
  247. end;
  248. {------------------------------------------------------------------------------}
  249. procedure TRichViewRVData.SetOptions(const Value: TRVOptions);
  250. begin
  251.   TCustomRichView(FRichView).Options := Value;
  252. end;
  253. {------------------------------------------------------------------------------}
  254. function TRichViewRVData.GetParentControl: TWinControl;
  255. begin
  256.   Result := TWinControl(FRichView);
  257. end;
  258. {------------------------------------------------------------------------------}
  259. function TRichViewRVData.GetRVFOptions: TRVFOptions;
  260. begin
  261.   Result := TCustomRichView(FRichView).RVFOptions;
  262. end;
  263. {------------------------------------------------------------------------------}
  264. procedure TRichViewRVData.SetRVFOptions(const Value: TRVFOptions);
  265. begin
  266.   TCustomRichView(FRichView).RVFOptions := Value;
  267. end;
  268. {------------------------------------------------------------------------------}
  269. function TRichViewRVData.GetRTFOptions: TRVRTFOptions;
  270. begin
  271.   Result := TCustomRichView(FRichView).RTFOptions;
  272. end;
  273. {------------------------------------------------------------------------------}
  274. procedure TRichViewRVData.SetRTFOptions(const Value: TRVRTFOptions);
  275. begin
  276.   TCustomRichView(FRichView).RTFOptions := Value;
  277. end;
  278. {------------------------------------------------------------------------------}
  279. function TRichViewRVData.GetRVFWarnings: TRVFWarnings;
  280. begin
  281.   Result := TCustomRichView(FRichView).RVFWarnings;
  282. end;
  283. {------------------------------------------------------------------------------}
  284. procedure TRichViewRVData.SetRVFWarnings(const Value: TRVFWarnings);
  285. begin
  286.   TCustomRichView(FRichView).RVFWarnings := Value;
  287. end;
  288. {------------------------------------------------------------------------------}
  289. function TRichViewRVData.GetRVLogPalette: PLogPalette;
  290. begin
  291.   Result := TCustomRichView(FRichView).PRVLogPalette;
  292. end;
  293. {------------------------------------------------------------------------------}
  294. function TRichViewRVData.GetRVPalette: HPALETTE;
  295. begin
  296.   Result := TCustomRichView(FRichView).RVPalette;
  297. end;
  298. {------------------------------------------------------------------------------}
  299. function TRichViewRVData.GetURL(id: Integer): String;
  300. begin
  301.   Result := '';
  302.   if Assigned(TCustomRichView(FRichView).OnURLNeeded) then
  303.     TCustomRichView(FRichView).OnURLNeeded(TCustomRichView(FRichView), id, Result);
  304. end;
  305. {------------------------------------------------------------------------------}
  306. function TRichViewRVData.CanLoadLayout: Boolean;
  307. begin
  308.   Result := True;
  309. end;
  310. {------------------------------------------------------------------------------}
  311. function TRichViewRVData.GetExtraRTFCode(Area: TRVRTFSaveArea;
  312.   Obj: TObject; Index1, Index2: Integer; InStyleSheet: Boolean): String;
  313. begin
  314.   Result := '';
  315.   if Assigned(TCustomRichView(FRichView).OnSaveRTFExtra) then
  316.     TCustomRichView(FRichView).OnSaveRTFExtra(TCustomRichView(FRichView),
  317.       Area, Obj, Index1, Index2, InStyleSheet, Result);
  318. end;
  319. {------------------------------------------------------------------------------}
  320. function TRichViewRVData.GetExtraHTMLCode(Area: TRVHTMLSaveArea; CSSVersion: Boolean): String; 
  321. begin
  322.   Result := '';
  323.   if Assigned(TCustomRichView(FRichView).OnSaveHTMLExtra) then
  324.     TCustomRichView(FRichView).OnSaveHTMLExtra(TCustomRichView(FRichView),
  325.       Area, CSSVersion, Result);
  326. end;
  327. {------------------------------------------------------------------------------}
  328. function TRichViewRVData.GetParaHTMLCode(RVData: TCustomRVData;
  329.   ItemNo: Integer; ParaStart, CSSVersion: Boolean): String;
  330. begin
  331.   Result := '';
  332.   if Assigned(TCustomRichView(FRichView).OnSaveParaToHTML) then
  333.     TCustomRichView(FRichView).OnSaveParaToHTML(TCustomRichView(FRichView),
  334.       RVData, ItemNo, ParaStart, CSSVersion, Result);
  335. end;
  336. {------------------------------------------------------------------------------}
  337. procedure TRichViewRVData.ReadHyperlink(const Target, Extras: String;
  338.   DocFormat: TRVLoadFormat; var StyleNo, ItemTag: Integer;
  339.   var ItemName: String);
  340. begin
  341.   case StyleNo of
  342.     rvsPicture:
  343.       StyleNo := rvsHotPicture;
  344.     rvsBullet:
  345.       StyleNo := rvsHotspot;
  346.   end;
  347.   if Assigned(TCustomRichView(FRichView).OnReadHyperlink) then
  348.     TCustomRichView(FRichView).OnReadHyperlink(TCustomRichView(FRichView),
  349.       Target, Extras, DocFormat, StyleNo, ItemTag, ItemName);
  350. end;
  351. {------------------------------------------------------------------------------}
  352. procedure TRichViewRVData.WriteHyperlink(id: Integer; RVData: TCustomRVData;
  353.   ItemNo: Integer; SaveFormat: TRVSaveFormat;
  354.   var Target, Extras: String);
  355. begin
  356.   Target := '';
  357.   Extras := '';
  358.   if rvflRoot in Flags then begin
  359.     {$IFNDEF RVDONOTUSEITEMHINTS}
  360.     RVData.GetItem(ItemNo).GetExtraStrProperty(rvespHint, Extras);
  361.     Extras := RV_GetHintStr(SaveFormat, Extras);
  362.     {$ENDIF}
  363.     if Assigned(TCustomRichView(FRichView).OnWriteHyperlink) then
  364.       TCustomRichView(FRichView).OnWriteHyperlink(TCustomRichView(FRichView),
  365.         id, RVData, ItemNo, SaveFormat, Target, Extras)
  366.     else
  367.       Target := GetURL(id)
  368.     end
  369.   else
  370.     inherited;
  371. end;
  372. {------------------------------------------------------------------------------}
  373. function TRichViewRVData.RVFControlNeeded(const ItemName: String; ItemTag: Integer): TControl;
  374. begin
  375.   Result := nil;
  376.   if Assigned(  TCustomRichView(FRichView).OnRVFControlNeeded) then
  377.       TCustomRichView(FRichView).OnRVFControlNeeded(TCustomRichView(FRichView),
  378.                                               ItemName, ItemTag, Result);
  379. end;
  380. {------------------------------------------------------------------------------}
  381. function TRichViewRVData.RVFImageListNeeded(ImageListTag: Integer): TCustomImageList;
  382. begin
  383.   Result := nil;
  384.   if Assigned(TCustomRichView(FRichView).OnRVFImageListNeeded) then
  385.     TCustomRichView(FRichView).OnRVFImageListNeeded(TCustomRichView(FRichView),
  386.                                               ImageListTag, Result);
  387. end;
  388. {------------------------------------------------------------------------------}
  389. function TRichViewRVData.RVFPictureNeeded(const ItemName: String;
  390.   ItemTag: Integer): TGraphic;
  391. begin
  392.   Result := nil;
  393.   if Assigned(TCustomRichView(FRichView).OnRVFPictureNeeded) then
  394.     TCustomRichView(FRichView).OnRVFPictureNeeded(TCustomRichView(FRichView),
  395.                                             ItemName, ItemTag, Result);
  396. end;
  397. {------------------------------------------------------------------------------}
  398. function TRichViewRVData.SaveComponentToFile(const Path: String;
  399.   SaveMe: TComponent; SaveFormat: TRVSaveFormat): String;
  400. begin
  401.   Result := '';
  402.   if Assigned(TCustomRichView(FRichView).OnSaveComponentToFile) then
  403.     TCustomRichView(FRichView).OnSaveComponentToFile(
  404.       TCustomRichView(FRichView), Path, SaveMe, SaveFormat, Result);
  405. end;
  406. {------------------------------------------------------------------------------}
  407. function TRichViewRVData.SaveItemToFile(const Path: String; 
  408.   RVData: TCustomRVData; ItemNo: Integer; SaveFormat: TRVSaveFormat;
  409.   Unicode: Boolean; var Text: String): Boolean;
  410. begin
  411.   if Assigned(TCustomRichView(FRichView).OnSaveItemToFile) then begin
  412.     Result := True;
  413.     TCustomRichView(FRichView).OnSaveItemToFile(TCustomRichView(FRichView),
  414.       Path, RVData, ItemNo, SaveFormat, Unicode, Text, Result);
  415.     Result := not Result;
  416.     end
  417.   else
  418.     Result := False;
  419. end;
  420. {------------------------------------------------------------------------------}
  421. function TRichViewRVData.ImportPicture(const Location: String; Width,
  422.   Height: Integer; var Invalid: Boolean): TGraphic;
  423. begin
  424.   Result := nil;
  425.   if Assigned(TCustomRichView(FRichView).OnImportPicture) then begin
  426.     TCustomRichView(FRichView).CurPictureInvalid := False;
  427.     TCustomRichView(FRichView).OnImportPicture(TCustomRichView(FRichView),
  428.       Location, Width, Height, Result);
  429.     Invalid := TCustomRichView(FRichView).CurPictureInvalid;
  430.     TCustomRichView(FRichView).CurPictureInvalid := False;
  431.   end;
  432. end;
  433. {------------------------------------------------------------------------------}
  434. function TRichViewRVData.GetItemHint(RVData: TCustomRVData;
  435.   ItemNo: Integer; const UpperRVDataHint: String): String;
  436. begin
  437.   if ItemNo<0 then begin
  438.     Result := UpperRVDataHint;
  439.     exit;
  440.   end;
  441.   {$IFNDEF RVDONOTUSEITEMHINTS}
  442.   RVData.GetItem(ItemNo).GetExtraStrProperty(rvespHint, Result);
  443.   {$ELSE}
  444.   Result := '';
  445.   {$ENDIF}
  446.   if Assigned(TCustomRichView(FRichView).OnItemHint) then
  447.     TCustomRichView(FRichView).OnItemHint(TCustomRichView(FRichView),
  448.       RVData, ItemNo, Result);
  449.   if Result='' then
  450.     Result := UpperRVDataHint;
  451. end;
  452. {------------------------------------------------------------------------------}
  453. function TRichViewRVData.IsAssignedCopy: Boolean;
  454. begin
  455.   Result := Assigned(TCustomRichView(FRichView).OnCopy);
  456. end;
  457. {------------------------------------------------------------------------------}
  458. procedure TRichViewRVData.DoCopy;
  459. begin
  460.   if Assigned(TCustomRichView(FRichView).OnCopy) then
  461.     TCustomRichView(FRichView).OnCopy(TCustomRichView(FRichView));
  462. end;
  463. {------------------------------------------------------------------------------}
  464. procedure TRichViewRVData.DoRVMouseMove(id: Integer);
  465. begin
  466.   if Assigned(TCustomRichView(FRichView).OnRVMouseMove) then
  467.     TCustomRichView(FRichView).OnRVMouseMove(TCustomRichView(FRichView),id);
  468. end;
  469. {------------------------------------------------------------------------------}
  470. procedure TRichViewRVData.DoRVMouseDown(Button: TMouseButton;
  471.   Shift: TShiftState; ItemNo, X, Y: Integer);
  472. begin
  473.   if Assigned(TCustomRichView(FRichView).OnRVMouseDown) then
  474.     TCustomRichView(FRichView).OnRVMouseDown(TCustomRichView(FRichView),Button,Shift,ItemNo,X,Y);
  475. end;
  476. {------------------------------------------------------------------------------}
  477. function TRichViewRVData.IsAssignedRVMouseUp: Boolean;
  478. begin
  479.   Result := Assigned(TCustomRichView(FRichView).OnRVMouseUp);
  480. end;
  481. {------------------------------------------------------------------------------}
  482. function TRichViewRVData.IsAssignedRVMouseDown: Boolean;
  483. begin
  484.   Result := Assigned(TCustomRichView(FRichView).OnRVMouseDown);
  485. end;
  486. {------------------------------------------------------------------------------}
  487. function TRichViewRVData.IsAssignedRVRightClick: Boolean;
  488. begin
  489.   Result := Assigned(TCustomRichView(FRichView).OnRVRightClick);
  490. end;
  491. {------------------------------------------------------------------------------}
  492. function TRichViewRVData.IsAssignedJump: Boolean;
  493. begin
  494.   Result := Assigned(TCustomRichView(FRichView).OnJump);
  495. end;
  496. {------------------------------------------------------------------------------}
  497. function TRichViewRVData.IsAssignedRVDblClick: Boolean;
  498. begin
  499.   Result := Assigned(TCustomRichView(FRichView).OnRVDblClick);
  500. end;
  501. {------------------------------------------------------------------------------}
  502. function TRichViewRVData.IsAssignedCheckpointVisible: Boolean;
  503. begin
  504.   Result := Assigned(TCustomRichView(FRichView).OnCheckpointVisible);
  505. end;
  506. {------------------------------------------------------------------------------}
  507. procedure TRichViewRVData.DoRVMouseUp(Button: TMouseButton;
  508.   Shift: TShiftState; ItemNo, X, Y: Integer);
  509. begin
  510.   if IsAssignedRVMouseUp then
  511.     TCustomRichView(FRichView).OnRVMouseUp(TCustomRichView(FRichView),Button,Shift,ItemNo,X,Y);
  512. end;
  513. {------------------------------------------------------------------------------}
  514. procedure TRichViewRVData.DoRVRightClick(const ClickedWord: String;
  515.   StyleNo, X, Y: Integer);
  516. begin
  517.   if Assigned(TCustomRichView(FRichView).OnRVRightClick) then
  518.     TCustomRichView(FRichView).OnRVRightClick(TCustomRichView(FRichView), ClickedWord,
  519.                                         StyleNo, X, Y);
  520. end;
  521. {------------------------------------------------------------------------------}
  522. procedure TRichViewRVData.DoJump(id: Integer);
  523. begin
  524.   if Assigned(TCustomRichView(FRichView).OnJump) then
  525.     TCustomRichView(FRichView).OnJump(TCustomRichView(FRichView), id);
  526. end;
  527. {------------------------------------------------------------------------------}
  528. procedure TRichViewRVData.HTMLSaveImage(RVData: TCustomRVData; ItemNo: Integer;
  529.   const Path: String; BackgroundColor: TColor;
  530.   var Location: String; var DoDefault: Boolean);
  531. begin
  532.   DoDefault := True;
  533.   if Assigned(TCustomRichView(FRichView).OnHTMLSaveImage) then
  534.     TCustomRichView(FRichView).OnHTMLSaveImage(TCustomRichView(FRichView),
  535.       RVData, ItemNo, Path, BackgroundColor, Location, DoDefault);
  536. end;
  537. {------------------------------------------------------------------------------}
  538. procedure TRichViewRVData.SaveImage2(Graphic: TGraphic; SaveFormat: TRVSaveFormat;
  539.   const Path, ImagePrefix: String; var ImageSaveNo: Integer;
  540.   var Location: String; var DoDefault: Boolean); 
  541. begin
  542.   DoDefault := True;
  543.   if Assigned(TCustomRichView(FRichView).OnSaveImage2) then
  544.     TCustomRichView(FRichView).OnSaveImage2(TCustomRichView(FRichView),
  545.       Graphic, SaveFormat, Path, ImagePrefix, ImageSaveNo, Location, DoDefault);
  546. end;
  547. {------------------------------------------------------------------------------}
  548. procedure TRichViewRVData.DoRVDblClick(const ClickedWord: String; StyleNo: Integer);
  549. begin
  550.   if Assigned(TCustomRichView(FRichView).OnRVDblClick) then
  551.     TCustomRichView(FRichView).OnRVDblClick(TCustomRichView(FRichView), ClickedWord, StyleNo);
  552. end;
  553. {------------------------------------------------------------------------------}
  554. procedure TRichViewRVData.DoSelect;
  555. begin
  556.   if Assigned(TCustomRichView(FRichView).OnSelect) and
  557.      not (csDestroying in FRichView.ComponentState) and
  558.      FRichView.HandleAllocated then
  559.     TCustomRichView(FRichView).OnSelect(TCustomRichView(FRichView));
  560. end;
  561. {------------------------------------------------------------------------------}
  562. procedure TRichViewRVData.DoCheckpointVisible(CheckpointData: TCheckpointData);
  563. begin
  564.   if Assigned(TCustomRichView(FRichView).OnCheckpointVisible) then
  565.     TCustomRichView(FRichView).OnCheckpointVisible(TCustomRichView(FRichView), CheckpointData);
  566. end;
  567. {------------------------------------------------------------------------------}
  568. procedure TRichViewRVData.ControlAction2(ControlAction: TRVControlAction;
  569.   ItemNo: Integer; var Control: TControl);
  570. begin
  571.   if Assigned(TCustomRichView(FRichView).OnControlAction) then
  572.     TCustomRichView(FRichView).OnControlAction(TCustomRichView(FRichView), ControlAction,
  573.                                          ItemNo, Control);
  574. end;
  575. {------------------------------------------------------------------------------}
  576. procedure TRichViewRVData.ItemAction(ItemAction: TRVItemAction; Item: TCustomRVItemInfo;
  577.                                      var Text: String; RVData: TCustomRVData);
  578. begin
  579.   if Assigned(TCustomRichView(FRichView).OnItemAction) then
  580.     TCustomRichView(FRichView).OnItemAction(TCustomRichView(FRichView), ItemAction,
  581.                                          Item, Text, RVData);
  582. end;
  583. {------------------------------------------------------------------------------}
  584. procedure TRichViewRVData.DoProgress(Operation: TRVLongOperation;
  585.   Stage: TRVProgressStage; PercentDone: Byte);
  586. begin
  587.   if Assigned(TCustomRichView(FRichView).OnProgress) then
  588.     TCustomRichView(FRichView).OnProgress(TCustomRichView(FRichView),
  589.       Operation, Stage, PercentDone);
  590. end;
  591. {------------------------------------------------------------------------------}
  592. function TRichViewRVData.IsAssignedOnProgress: Boolean;
  593. begin
  594.   Result := Assigned(TCustomRichView(FRichView).OnProgress);
  595. end;
  596. {------------------------------------------------------------------------------}
  597. function TRichViewRVData.GetWidth: Integer;
  598. begin
  599.   Result := FRichView.ClientWidth;
  600. end;
  601. {------------------------------------------------------------------------------}
  602. function TRichViewRVData.GetHeight: Integer;
  603. begin
  604.   Result := FRichView.ClientHeight;
  605. end;
  606. {------------------------------------------------------------------------------}
  607. function TRichViewRVData.GetAreaWidth: Integer;
  608. begin
  609.   Result := FRichView.AreaWidth;
  610. end;
  611. {------------------------------------------------------------------------------}
  612. function TRichViewRVData.GetAreaHeight: Integer;
  613. begin
  614.   Result := FRichView.AreaHeight;
  615. end;
  616. {------------------------------------------------------------------------------}
  617. function TRichViewRVData.GetFlags: TRVFlags;
  618. begin
  619.   Result := TCustomRichView(FRichView).Flags;
  620. end;
  621. {------------------------------------------------------------------------------}
  622. procedure TRichViewRVData.SetFlags(const Value: TRVFlags);
  623. begin
  624.   TCustomRichView(FRichView).Flags := Value;
  625. end;
  626. {------------------------------------------------------------------------------}
  627. function TRichViewRVData.GetHOffs: Integer;
  628. begin
  629.   Result := TCustomRichView(FRichView).HScrollPos;
  630. end;
  631. {------------------------------------------------------------------------------}
  632. function TRichViewRVData.GetVOffs: Integer;
  633. begin
  634.   Result := TCustomRichView(FRichView).VScrollPos*TCustomRichView(FRichView).VSmallStep
  635.     -GetRVDataExtraVOffs;
  636. end;
  637. {------------------------------------------------------------------------------}
  638. function TRichViewRVData.GetLeftMargin: Integer;
  639. begin
  640.   Result := TCustomRichView(FRichView).LeftMargin;
  641. end;
  642. {------------------------------------------------------------------------------}
  643. function TRichViewRVData.GetRightMargin: Integer;
  644. begin
  645.   Result := TCustomRichView(FRichView).RightMargin;
  646. end;
  647. {------------------------------------------------------------------------------}
  648. function TRichViewRVData.GetBottomMargin: Integer;
  649. begin
  650.   Result := TCustomRichView(FRichView).BottomMargin;
  651. end;
  652. {------------------------------------------------------------------------------}
  653. function TRichViewRVData.GetTopMargin: Integer;
  654. begin
  655.   Result := TCustomRichView(FRichView).TopMargin;
  656. end;
  657. {------------------------------------------------------------------------------}
  658. function TRichViewRVData.GetMaxTextWidth: Integer;
  659. begin
  660.   Result := TCustomRichView(FRichView).MaxTextWidth;
  661. end;
  662. {------------------------------------------------------------------------------}
  663. function TRichViewRVData.GetMinTextWidth: Integer;
  664. begin
  665.   Result := TCustomRichView(FRichView).MinTextWidth;
  666. end;
  667. {------------------------------------------------------------------------------}
  668. procedure TRichViewRVData.AdjustVScrollUnits;
  669. var v: Integer;
  670. begin
  671.   if  TCustomRichView(FRichView).VScrollVisible and
  672.      (DocumentHeight div TCustomRichView(FRichView).VSmallStep > 32000) then begin
  673.     v := DocumentHeight div 32000;
  674.     if DocumentHeight div v > 32000 then
  675.       inc(v);
  676.     TCustomRichView(FRichView).VSmallStep := v;
  677.     end
  678.   {$IFNDEF DONOTDECVSCROLLUNITS}
  679.   else if (TCustomRichView(FRichView).VSmallStep>10) and
  680.           (DocumentHeight div 10 <= 32000) then
  681.     TCustomRichView(FRichView).VSmallStep := 10;
  682.   {$ENDIF}
  683. end;
  684. {------------------------------------------------------------------------------}
  685. procedure TRichViewRVData.SetDocumentAreaSize(Width, Height: Integer;
  686.                                               UpdateH: Boolean);
  687. var h: Integer;
  688. begin
  689.   //Width := MulDiv(Width,ZoomPercent,100);
  690.   //Height := MulDiv(Height,ZoomPercent,100);
  691.   {$IFDEF RVDEBUG}{$I Debugc.inc}{$ENDIF}
  692.   h := Height div TCustomRichView(FRichView).VSmallStep;
  693.   if (Height mod TCustomRichView(FRichView).VSmallStep)>0 then
  694.     inc(h);
  695.   FRichView.UpdateScrollBars(Width, h, UpdateH,True);
  696.   {$IFDEF RV_ODHC}
  697.   if Assigned(TCustomRichView(FRichView).OnDocumentHeightChange) then
  698.     TCustomRichView(FRichView).OnDocumentHeightChange(FRichView);
  699.   {$ENDIF}
  700. end;
  701. {------------------------------------------------------------------------------}
  702. procedure TRichViewRVData.ScrollTo(Y: Integer; Redraw: Boolean);
  703. begin
  704.   if rvstNoScroll in State then
  705.     exit;
  706.   if Redraw then
  707.     FRichView.ScrollTo(Y)
  708.   else
  709.     FRichView.ScrollToNoRedraw(Y)
  710. end;
  711. {------------------------------------------------------------------------------}
  712. procedure TRichViewRVData.HScrollTo(X: Integer);
  713. begin
  714.   if rvstNoScroll in State then
  715.     exit;
  716.   TCustomRichView(FRichView).HScrollPos := X;
  717. end;
  718. {------------------------------------------------------------------------------}
  719. function TRichViewRVData.GetVSmallStep: Integer;
  720. begin
  721.   Result := TCustomRichView(FRichView).VSmallStep;
  722. end;
  723. {------------------------------------------------------------------------------}
  724. function TRichViewRVData.GetBackground: TRVBackground;
  725. begin
  726.   Result := TCustomRichView(FRichView).Background;
  727. end;
  728. {------------------------------------------------------------------------------}
  729. function TRichViewRVData.GetColor: TColor;
  730. begin
  731.   if TCustomRichView(FRichView).Color<>clNone then
  732.     Result := TCustomRichView(FRichView).Color
  733.   else
  734.     Result :=  TCustomRichView(FRichView).Style.Color;
  735. end;
  736. {------------------------------------------------------------------------------}
  737. function TRichViewRVData.GetNormalCursor: TCursor;
  738. begin
  739.   Result := TCustomRichView(FRichView).Cursor;
  740. end;
  741. {------------------------------------------------------------------------------}
  742. function TRichViewRVData.GetDelimiters: String;
  743. begin
  744.   Result := TCustomRichView(FRichView).Delimiters;
  745. end;
  746. {------------------------------------------------------------------------------}
  747. function TRichViewRVData.GetCPEventKind: TCPEventKind;
  748. begin
  749.   Result := TCustomRichView(FRichView).CPEventKind;
  750. end;
  751. {------------------------------------------------------------------------------}
  752. function TRichViewRVData.GetCanvas: TCanvas;
  753. begin
  754.   Result := TCustomRichView(FRichView).Canvas;
  755. end;
  756. {------------------------------------------------------------------------------}
  757. function TRichViewRVData.GetRVStyle: TRVStyle;
  758. begin
  759.   Result := TCustomRichView(FRichView).Style;
  760. end;
  761. {------------------------------------------------------------------------------}
  762. procedure TRichViewRVData.AssignChosenRVData(RVData: TCustomRVFormattedData;
  763.                                              Item: TCustomRVItemInfo);
  764. begin
  765.   FRichView.AssignChosenRVData(RVData, Item);
  766.   inherited AssignChosenRVData(RVData, Item);
  767. end;
  768. {------------------------------------------------------------------------------}
  769. procedure TRichViewRVData.SilentReplaceChosenRVData(
  770.   RVData: TCustomRVFormattedData);
  771. begin
  772.   FRichView.SilentReplaceChosenRVData(RVData);
  773. end;
  774. {------------------------------------------------------------------------------}
  775. procedure TRichViewRVData.UnassignChosenRVData(RVData: TCustomRVData);
  776. begin
  777.   if rvstUnAssigningChosen in State then
  778.     exit;
  779.   State := State+[rvstUnAssigningChosen];
  780.   try
  781.     inherited UnassignChosenRVData(RVData);
  782.     FRichView.UnassignChosenRVData(RVData);
  783.   finally
  784.     State := State-[rvstUnAssigningChosen]
  785.   end;
  786. end;
  787. {------------------------------------------------------------------------------}
  788. function TRichViewRVData.GetInplaceEditor: TControl;
  789. begin
  790.   Result := TCustomRichView(FRichView).InplaceEditor;
  791. end;
  792. {------------------------------------------------------------------------------}
  793. function TRichViewRVData.GetChosenRVData: TCustomRVData;
  794. begin
  795.   Result := TCustomRichView(FRichView).ChosenRVData as TCustomRVData;
  796. end;
  797. {------------------------------------------------------------------------------}
  798. function TRichViewRVData.GetChosenItem: TCustomRVItemInfo;
  799. begin
  800.   Result := TCustomRichView(FRichView).ChosenItem as TCustomRVItemInfo;
  801. end;
  802. {------------------------------------------------------------------------------}
  803. procedure TRichViewRVData.DestroyInplaceEditor;
  804. begin
  805.   FRichView.DestroyInplace;
  806. end;
  807. {------------------------------------------------------------------------------}
  808. function TRichViewRVData.GetRTFProperties: TPersistent;
  809. begin
  810.   Result := TCustomRichView(FRichView).RTFReadProperties
  811. end;
  812. {------------------------------------------------------------------------------}
  813. function TRichViewRVData.GetRVFParaStylesReadMode: TRVFReaderStyleMode;
  814. begin
  815.   Result := TCustomRichView(FRichView).RVFParaStylesReadMode;
  816. end;
  817. {------------------------------------------------------------------------------}
  818. function TRichViewRVData.GetRVFTextStylesReadMode: TRVFReaderStyleMode;
  819. begin
  820.   Result := TCustomRichView(FRichView).RVFTextStylesReadMode;
  821. end;
  822. {------------------------------------------------------------------------------}
  823. function TRichViewRVData.GetBiDiMode: TRVBiDiMode;
  824. begin
  825.   Result := TCustomRichView(FRichView).BiDiMode;
  826. end;
  827. {------------------------------------------------------------------------------}
  828. procedure TRichViewRVData.InitStyleMappings(var PTextStylesMapping,
  829.   PParaStylesMapping, PListStylesMapping: PRVIntegerList);
  830. begin
  831.   PTextStylesMapping := @RVFTextStylesMapping;
  832.   PParaStylesMapping := @RVFParaStylesMapping;
  833.   PListStylesMapping := @RVFListStyleMapping;
  834. end;
  835. {------------------------------------------------------------------------------}
  836. procedure TRichViewRVData.DoneStyleMappings(PTextStylesMapping,
  837.   PParaStylesMapping, PListStylesMapping: PRVIntegerList);
  838. begin
  839.   (PTextStylesMapping^).Free;
  840.   (PParaStylesMapping^).Free;
  841.   (PListStylesMapping^).Free;  
  842.   PTextStylesMapping^ := nil;
  843.   PParaStylesMapping^ := nil;
  844.   PListStylesMapping^ := nil;  
  845. end;
  846. {------------------------------------------------------------------------------}
  847. {$IFNDEF RVDONOTUSELISTS}
  848. function TRichViewRVData.GetMarkers(AllowCreate: Boolean): TRVMarkerList;
  849. begin
  850.   if rvflRoot in Flags then begin
  851.     if (FMarkers=nil) and AllowCreate then begin
  852.       FMarkers := TRVMarkerList.Create;
  853.       FMarkers.PrevMarkerList := GetPrevMarkers;
  854.     end;
  855.     Result := FMarkers;
  856.     end
  857.   else
  858.     Result := inherited GetMarkers(AllowCreate);
  859. end;
  860. {------------------------------------------------------------------------------}
  861. procedure TRichViewRVData.DestroyMarkers;
  862. begin
  863.   if rvflRoot in Flags then begin
  864.     FMarkers.Free;
  865.     FMarkers := nil;
  866.     end
  867.   else
  868.     inherited DestroyMarkers;
  869. end;
  870. {$ENDIF}
  871. function TRichViewRVData.GetDocProperties: TStringList;
  872. begin
  873.   if rvflRoot in Flags then
  874.     Result := TCustomRichView(RichView).DocProperties
  875.   else
  876.     Result := nil;
  877. end;
  878. {------------------------------------------------------------------------------}
  879. {$IFNDEF RVDONOTUSEDRAGDROP}
  880. {------------------------------------------------------------------------------}
  881. { Drag&Drop: IDropTarget related                                               }
  882. {------------------------------------------------------------------------------}
  883. { Returns information about drag&drop caret location.
  884.   D&d caret is not allowed in TRichView.
  885.   This method is overriden in TRVEditRVData.                                   }
  886. function TRichViewRVData.GetDragDropCaretInfo: TRVDragDropCaretInfo;
  887. begin
  888.   Result := nil;
  889. end;
  890. {------------------------------------------------------------------------------}
  891. { Drag&Drop: IDropSource related                                               }
  892. {------------------------------------------------------------------------------}
  893. { Can dragging from this TRichView be started?                                 } 
  894. function TRichViewRVData.CanStartDragging: Boolean;
  895. begin
  896.   if not (rvflRoot in Flags) then begin
  897.     Result := inherited CanStartDragging;
  898.     exit;
  899.   end;
  900.   if rvoDisallowDrag in GetOptions then
  901.     Result := False
  902.   else
  903.     Result := FDropSource=nil;
  904. end;
  905. {------------------------------------------------------------------------------}
  906. { Is dragging from this TRichView in process? Overriden in TRichViewRVData.    }
  907. function TRichViewRVData.IsDragging: Boolean;
  908. begin
  909.   if not (rvflRoot in Flags) then
  910.     Result := inherited IsDragging
  911.   else
  912.     Result := FDropSource<>nil;
  913. end;
  914. {------------------------------------------------------------------------------}
  915. { Initializing dragging. Overriden in TRVEditRVData.
  916.   Returns True on success.
  917.   Returns DropSource and OKEffect for call of DoDragDrop.                      }
  918. function TRichViewRVData.InitDragging(var DropSource: TRVDropSource;
  919.   var OKEffect: Integer): Boolean;
  920. begin
  921.   if not (rvflRoot in Flags) then begin
  922.     Result := inherited InitDragging(DropSource, OKEffect);
  923.     exit;
  924.   end;
  925.   if rvoDisallowDrag in GetOptions then
  926.     Result := False
  927.   else begin
  928.     Result := FDropSource=nil;
  929.     if Result then begin
  930.       FDropSource := TRVDropSource.Create(FRichView);
  931.       OKEffect := DROPEFFECT_COPY;
  932.     end;
  933.     DropSource := FDropSource;
  934.   end;
  935. end;
  936. {------------------------------------------------------------------------------}
  937. { Finalizing dragging.
  938.   Note: if FDropSource<>nil, this function loses the object.                   }
  939. procedure TRichViewRVData.DoneDragging(FDeleteSelection: Boolean);
  940. begin
  941.   FDropSource := nil;
  942. end;
  943. {$ENDIF}
  944. {------------------------------------------------------------------------------}
  945. function TRichViewRVData.GetRVDataExtraVOffs: Integer;
  946. begin
  947.   {$IFDEF RICHVIEWDEF3}
  948.   case TCustomRichView(RichView).VAlign of
  949.     tlBottom:
  950.       begin
  951.         Result := GetHeight-DocumentHeight;
  952.         if Result<0 then
  953.           Result := 0;
  954.       end;
  955.     tlCenter:
  956.       begin
  957.         Result := (GetHeight-DocumentHeight) div 2;
  958.         if Result<0 then
  959.           Result := 0;
  960.       end;
  961.     else
  962.       Result := 0;
  963.   end;
  964.   {$ELSE}
  965.   Result := 0;
  966.   {$ENDIF}
  967. end;
  968. {------------------------------------------------------------------------------}
  969. procedure TRichViewRVData.GetOrigin(var ALeft, ATop: Integer);
  970. begin
  971.   ALeft := 0;
  972.   ATop := GetRVDataExtraVOffs;
  973. end;
  974. {------------------------------------------------------------------------------}
  975. procedure TRichViewRVData.GetOriginEx(var ALeft, ATop: Integer);
  976. begin
  977.   ALeft := 0;
  978.   ATop := GetRVDataExtraVOffs;
  979. end;
  980. {------------------------------------------------------------------------------}
  981. procedure TRichViewRVData.Clear;
  982. begin
  983.   {$IFNDEF RVDONOTUSELIVESPELL}
  984.   if RichView<>nil then
  985.     TCustomRichView(RichView).ClearLiveSpellingResults;
  986.   {$ENDIF}
  987.   {$IFNDEF RVDONOTUSEANIMATION}
  988.   if TCustomRichView(RichView).AnimationMode=rvaniOnFormat then
  989.     TCustomRichView(RichView).StopAnimation;
  990.   {$ENDIF}
  991.   {$IFNDEF RVDONOTUSESMARTPOPUP}
  992.   FSmartPopupButton.Free;
  993.   FSmartPopupButton := nil;
  994.   {$ENDIF}
  995.   inherited;
  996. end;
  997. {------------------------------------------------------------------------------}
  998. {$IFNDEF RVDONOTUSEANIMATION}
  999. procedure TRichViewRVData.InsertAnimator(var Animator: TObject);
  1000. begin
  1001.   if rvflRoot in Flags then begin
  1002.     if FAnimatorList=nil then
  1003.       FAnimatorList := TRVAnimatorList.Create;
  1004.     FAnimatorList.Add(TRVAnimator(Animator));
  1005.     if FPlayingAnimation then
  1006.       TCustomRichView(RichView).StartAnimation;
  1007.     end
  1008.   else
  1009.     inherited InsertAnimator(Animator);
  1010. end;
  1011. {------------------------------------------------------------------------------}
  1012. function TRichViewRVData.AllowAnimation: Boolean;
  1013. begin
  1014.   if rvflRoot in Flags then
  1015.     Result := TCustomRichView(RichView).AnimationMode<>rvaniDisabled
  1016.   else
  1017.     Result := inherited AllowAnimation;
  1018. end;
  1019. {------------------------------------------------------------------------------}
  1020. procedure TRichViewRVData.ResetAniBackground;
  1021. begin
  1022.   if rvflRoot in Flags then begin
  1023.     if FAnimatorList<>nil then
  1024.       FAnimatorList.ResetBackground;
  1025.     end
  1026.   else
  1027.     inherited ResetAniBackground;
  1028. end;
  1029. {$ENDIF}
  1030. {------------------------------------------------------------------------------}
  1031. function TRichViewRVData.DoCreateFontInfoCache(ACanvas: TCanvas;
  1032.   Owner: TCustomRVFormattedData): TRVFontInfoCache;
  1033. begin
  1034.   if (rvoFastFormatting in Options) and RVNT then
  1035.     Result := TRVFontInfoCacheFast.Create(Owner, GetRVStyle, ACanvas,
  1036.       rvflCanUseCustomPPI in Flags)
  1037.   else
  1038.     Result := TRVFontInfoCacheLowResource.Create(Owner, GetRVStyle, ACanvas,
  1039.       rvflCanUseCustomPPI in Flags);
  1040. end;
  1041. {------------------------------------------------------------------------------}
  1042. procedure TRichViewRVData.CreateFontInfoCache(ACanvas: TCanvas);
  1043. begin
  1044.   FFontInfoCache.Free;
  1045.   FFontInfoCache := DoCreateFontInfoCache(ACanvas, Self);
  1046. end;
  1047. {------------------------------------------------------------------------------}
  1048. procedure TRichViewRVData.DestroyFontInfoCache(var Cache: TRVFontInfoCache);
  1049. begin
  1050.   if Cache=FFontInfoCache then
  1051.     FFontInfoCache := nil;
  1052.   inherited DestroyFontInfoCache(Cache);
  1053. end;
  1054. {------------------------------------------------------------------------------}
  1055. function TRichViewRVData.GetFontInfoCache(ACanvas: TCanvas;
  1056.   RVData: TCustomRVFormattedData): TRVFontInfoCache;
  1057. begin
  1058.   Result := FFontInfoCache;
  1059.   if Result = nil then begin
  1060.     Result := DoCreateFontInfoCache(ACanvas, RVData);
  1061.   end;
  1062. end;
  1063. {========================== TRVFontInfoCacheFast ==============================}
  1064. procedure TRVFontInfoCacheFast.Clear;
  1065. var
  1066.   CacheItem: TRVFontInfoCacheItem;
  1067.   i: Integer;
  1068. begin
  1069.   for i := 0 to Count-1 do
  1070.     if Items[i] <> nil then begin
  1071.       CacheItem := Items[i];
  1072.       DeleteDC(CacheItem.Canvas.Handle);
  1073.       CacheItem.Canvas.Handle := 0;
  1074.       CacheItem.Canvas.Free;
  1075.     end;
  1076.   inherited Clear;
  1077. end;
  1078. {------------------------------------------------------------------------------}
  1079. function TRVFontInfoCacheFast.GetItems(Index: Integer): TRVFontInfoCacheItem;
  1080. var
  1081.   CacheItem: TRVFontInfoCacheItem;
  1082.   sz: TSize;
  1083. begin
  1084.   CacheItem := Get(Index);
  1085.   if CacheItem = nil then begin
  1086.     CacheItem := TRVFontInfoCacheItem.Create;
  1087.     CacheItem.Canvas := TCanvas.Create;
  1088.     CacheItem.Canvas.Handle := CreateCompatibleDC(FCanvas.Handle);
  1089.     CacheItem.Canvas.Font.PixelsPerInch := FCanvas.Font.PixelsPerInch;
  1090.     CacheItem.FontInfo := FRVStyle.TextStyles[Index];
  1091.     CacheItem.FontInfo.Apply(CacheItem.Canvas, CurParaBiDiMode,
  1092.       FCanUseCustomPPI);
  1093.     CacheItem.LastBiDiMode := CurParaBiDiMode;
  1094.     GetTextMetrics(CacheItem.Canvas.Handle, CacheItem.TextMetric);
  1095.     CacheItem.VerticalOffset :=
  1096.       MulDiv(CacheItem.TextMetric.tmHeight, CacheItem.FontInfo.VShift, 100);
  1097.     GetTextExtentPoint32(CacheItem.Canvas.Handle, '-', 1, sz);
  1098.     CacheItem.EmptyLineHeight := sz.cy;
  1099.     CacheItem.HyphenWidth := sz.cx;
  1100.     Put(Index, CacheItem);
  1101.   end;
  1102.   Result := CacheItem;
  1103.   if CacheItem.LastBiDiMode<>CurParaBiDiMode then
  1104.     CacheItem.FontInfo.ApplyBiDiMode(CacheItem.Canvas, CurParaBiDiMode);
  1105. end;
  1106. {======================== TRVFontInfoCacheLowResource =========================}
  1107. function TRVFontInfoCacheLowResource.GetItems(Index: Integer): TRVFontInfoCacheItem;
  1108. var
  1109.   CacheItem, CacheItem2: TRVFontInfoCacheItem;
  1110.   sz: TSize;
  1111. begin
  1112.   CacheItem := Get(Index);
  1113.   CacheItem2 := CacheItem;
  1114.   if CacheItem = nil then begin
  1115.     CacheItem := TRVFontInfoCacheItem.Create;
  1116.     CacheItem.Canvas := FCanvas;
  1117.     CacheItem.FontInfo := FRVStyle.TextStyles[Index];
  1118.     Put(Index, CacheItem);
  1119.   end;
  1120.   if (LastTextStyle <> Index) or (CacheItem.LastBiDiMode<>CurParaBiDiMode) then begin
  1121.     CacheItem.LastBiDiMode := CurParaBiDiMode;
  1122.     CacheItem.FontInfo.Apply(CacheItem.Canvas, CurParaBiDiMode,
  1123.       FCanUseCustomPPI);
  1124.   end;
  1125.   if CacheItem2 = nil then begin
  1126.     GetTextMetrics(CacheItem.Canvas.Handle, CacheItem.TextMetric);
  1127.     CacheItem.VerticalOffset := MulDiv(CacheItem.TextMetric.tmHeight, CacheItem.FontInfo.VShift, 100);
  1128.     GetTextExtentPoint32(CacheItem.Canvas.Handle, '-', 1, sz);
  1129.     CacheItem.EmptyLineHeight := sz.cy;
  1130.     CacheItem.HyphenWidth := sz.cx;
  1131.   end;
  1132.   Result := CacheItem;
  1133. end;
  1134. {------------------------------------------------------------------------------}
  1135. {$IFNDEF RVDONOTUSESMARTPOPUP}
  1136. procedure TRichViewRVData.AdjustSpecialControlsCoords(RVData: TCustomRVFormattedData);
  1137. begin
  1138.   if (FSmartPopupButton=nil) or (FSmartPopupButton.RVData<>RVData.GetSourceRVData) then
  1139.     exit;
  1140.   RVData := TCustomRVFormattedData(RVData.GetRVData);
  1141.   if (FSmartPopupButton.ItemNo<0) or (FSmartPopupButton.ItemNo>=RVData.ItemCount) or
  1142.     (RVData.GetItem(FSmartPopupButton.ItemNo)<>FSmartPopupButton.Item) then
  1143.     FSmartPopupButton.ItemNo := RVData.GetItemNo(FSmartPopupButton.Item);
  1144.   SetSmartPopupCoords;
  1145. end;
  1146. {------------------------------------------------------------------------------}
  1147. procedure TRichViewRVData.SetSmartPopupCoords;
  1148. var DItemNo: Integer;
  1149.     Left, Top, X, Y, Width, Height: Integer;
  1150.     RVData: TCustomRVFormattedData;
  1151. begin
  1152.   RVData := TCustomRVFormattedData(FSmartPopupButton.RVData.GetRVData);
  1153.   RVData.Item2LastDrawItem(FSmartPopupButton.ItemNo, DItemNo);
  1154.   if DItemNo<0 then begin
  1155.     FSmartPopupButton.Free;
  1156.     FSmartPopupButton := nil;
  1157.     exit;
  1158.   end;
  1159.   RVData.GetOriginEx(Left, Top);
  1160.   X := Left + RVData.DrawItems[DItemNo].Left + RVData.DrawItems[DItemNo].Width;
  1161.   Y := Top  + RVData.DrawItems[DItemNo].Top  + RVData.DrawItems[DItemNo].Height;
  1162.   Width := GetAreaWidth;
  1163.   if GetWidth>Width then
  1164.     Width := GetWidth;
  1165.   if X+FSmartPopupButton.Width>Width then
  1166.     X := Width-FSmartPopupButton.Width;
  1167.   Height := GetAreaHeight*TCustomRichView(FRichView).VSmallStep;
  1168.   if GetHeight>Height then
  1169.     Height := GetHeight;
  1170.   if Y+FSmartPopupButton.Height>Height then
  1171.     Y := Height-FSmartPopupButton.Height;
  1172.   FSmartPopupButton.Left := X - GetHOffs;
  1173.   FSmartPopupButton.Tag  := Y - GetVOffs;
  1174.   RV_Tag2Y(FSmartPopupButton);  
  1175. end;
  1176. {------------------------------------------------------------------------------}
  1177. {
  1178. procedure TRichViewRVData.InternalFreeItem(item: TCustomRVItemInfo;
  1179.   Clearing: Boolean);
  1180. begin
  1181.   inherited;
  1182.   if not Clearing and (FSmartPopupButton<>nil) and
  1183.     (FSmartPopupButton.Item=item) then begin
  1184.     FSmartPopupButton.Free;
  1185.     FSmartPopupButton := nil;
  1186.   end;
  1187. end;
  1188. }
  1189. {$ENDIF}
  1190. end.