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

RichEdit

开发平台:

Delphi

  1. end;
  2. {------------------------------------------------------------------------------}
  3. procedure TCustomRichView.DeleteParas(FirstItemNo, LastItemNo: Integer);
  4. begin
  5.   RVData.DeleteParas(FirstItemNo, LastItemNo);
  6. end;
  7. {------------------------------------------------------------------------------}
  8. function TCustomRichView.GetLineCount: Integer;
  9. begin
  10.   Result := RVData.Items.Count;
  11. end;
  12. {------------------------------------------------------------------------------}
  13. function TCustomRichView.SelectionExists: Boolean;
  14. begin
  15.   Result := RVData.SelectionExists(True, True);
  16. end;
  17. {------------------------------------------------------------------------------}
  18. function TCustomRichView.GetSelectedImage: TGraphic;
  19. begin
  20.   Result := RVData.GetSelectedImage;
  21. end;
  22. {------------------------------------------------------------------------------}
  23. function TCustomRichView.GetSelText: String;
  24. begin
  25.   Result := RVData.GetSelText(False);
  26. end;
  27. {------------------------------------------------------------------------------}
  28. procedure TCustomRichView.CopyText;
  29. begin
  30.   RVData.CopyText;
  31. end;
  32. {------------------------------------------------------------------------------}
  33. procedure TCustomRichView.CopyTextW;
  34. begin
  35.   RVData.CopyTextW;
  36. end;
  37. {------------------------------------------------------------------------------}
  38. procedure TCustomRichView.CopyImage;
  39. begin
  40.   RVData.CopyImage;
  41. end;
  42. {------------------------------------------------------------------------------}
  43. procedure TCustomRichView.Copy;
  44. begin
  45.   RVData.Copy(GetColor, Background);
  46. end;
  47. {------------------------------------------------------------------------------}
  48. function TCustomRichView.IsCopyShortcut(Shift: TShiftState; Key: Word): Boolean;
  49. begin
  50.   Result := (ssCtrl in Shift) and ((Key = ord('C')) or (Key = VK_INSERT)) and not (ssAlt in Shift);
  51. end;
  52. {------------------------------------------------------------------------------}
  53. function TCustomRichView.IsCutShortcut(Shift: TShiftState; Key: Word): Boolean;
  54. begin
  55.   Result := ((ssCtrl in Shift) and (Key = ord('X')) and not (ssAlt in Shift)) or
  56.             ((ssShift in Shift) and (Key = VK_DELETE));
  57. end;
  58. {------------------------------------------------------------------------------}
  59. function TCustomRichView.IsPasteShortcut(Shift: TShiftState; Key: Word): Boolean;
  60. begin
  61.   Result := ((ssCtrl in Shift) and (Key = ord('V')) and not (ssAlt in Shift)) or
  62.             ((ssShift in Shift) and (Key = VK_INSERT));
  63. end;
  64. {------------------------------------------------------------------------------}
  65. function TCustomRichView.CopyDef: Boolean;
  66. begin
  67.   Result := RVData.CopyDef(GetColor, Background);
  68. end;
  69. {------------------------------------------------------------------------------}
  70. procedure TCustomRichView.WMCopy(var Message: TWMCopy);
  71. begin
  72.   {$IFNDEF RVDONOTUSEINPLACE}
  73.   if (InplaceEditor<>nil) then begin
  74.     PostMessage(InplaceEditor.Handle, WM_COPY, 0, 0);
  75.     exit;
  76.   end;
  77.   {$ENDIF}
  78.   CopyDef;
  79. end;
  80. {------------------------------------------------------------------------------}
  81. procedure TCustomRichView.KeyDown(var Key: Word; Shift: TShiftState);
  82. {$IFNDEF RVDONOTUSESMARTPOPUP}
  83. var LKey: Word;
  84.     LShift: TShiftState;
  85. {$ENDIF}
  86. begin
  87.   inherited KeyDown(Key,Shift);
  88.   if IsCopyShortCut(Shift, Key) then
  89.     SendMessage(Handle, WM_COPY, 0, 0);
  90.   if (TabNavigation<>rvtnNone) and
  91.      ((Key=VK_TAB) and not (ssAlt in Shift) and
  92.      (((ssCtrl in Shift) and (TabNavigation=rvtnCtrlTab)) or
  93.        (not (ssCtrl in Shift) and (TabNavigation=rvtnTab)))) then begin
  94.     Exclude(RVData.State,rvstDoNotTab);
  95.     RVData.DoTabNavigation(ssShift in Shift, Self);
  96.   end;
  97.   if (Key=VK_RETURN) then
  98.     RVData.ExecuteFocused;
  99.   {$IFNDEF RVDONOTUSESMARTPOPUP}
  100.   if TRichViewRVData(RVData.GetAbsoluteRootData).FSmartPopupButton<>nil then begin
  101.     ShortCutToKey(
  102.       TCustomRichView(TRichViewRVData(RVData.GetAbsoluteRootData).RichView).SmartPopupProperties.ShortCut, LKey, LShift);
  103.     if (Key=LKey) and (Shift=LShift) then
  104.       TRichViewRVData(RVData.GetAbsoluteRootData).FSmartPopupButton.Click;
  105.   end;
  106.   {$ENDIF}
  107. end;
  108. {------------------------------------------------------------------------------}
  109. procedure TCustomRichView.GenerateMouseMove;
  110. var State: TShiftState;
  111.     KeyboardState: TKeyboardState;
  112.     p: TPoint;
  113. begin
  114.   State := [];
  115.   GetKeyboardState(KeyboardState);
  116.   if KeyboardState[VK_SHIFT] and $80 <> 0 then Include(State, ssShift);
  117.   if KeyboardState[VK_CONTROL] and $80 <> 0 then Include(State, ssCtrl);
  118.   if KeyboardState[VK_MENU] and $80 <> 0 then Include(State, ssAlt);
  119.   if KeyboardState[VK_LBUTTON] and $80 <> 0 then Include(State, ssLeft);
  120.   if KeyboardState[VK_RBUTTON] and $80 <> 0 then Include(State, ssRight);
  121.   if KeyboardState[VK_MBUTTON] and $80 <> 0 then Include(State, ssMiddle);
  122.   GetCursorPos(p);
  123.   p := ScreenToClient(p);
  124.   if (p.X>=0) and (p.X<ClientWidth) and
  125.      (p.Y>=0) and (p.Y<ClientHeight) then
  126.     MouseMove(State,p.X,p.Y);
  127. end;
  128. {------------------------------------------------------------------------------}
  129. procedure TCustomRichView.WMTimer(var Message: TWMTimer);
  130. begin
  131.   case Message.TimerID of
  132.     RV_TIMERID_SCROLLING:
  133.       begin
  134.         //if RVData.CaptureMouseItem<>nil then exit;
  135.         if VScrollDelta<>0 then
  136.           VScrollPos := VScrollPos+VScrollDelta;
  137.         if HScrollDelta<>0 then
  138.           SetHPos(HPos+HScrollDelta);
  139.         if (HScrollDelta<>0) or (VScrollDelta<>0) then begin
  140.           {$IFDEF RVDEBUG}{$I Debugf.inc}{$ENDIF}
  141.           RVData.OnTimerScroll;
  142.           GenerateMouseMove;
  143.         end;
  144.       end;
  145.     {$IFNDEF RVDONOTUSEANIMATION}
  146.     RV_TIMERID_ANIMATION:
  147.       begin
  148.         if (TRichViewRVData(RVData).FAnimatorList=nil) or
  149.            (TRichViewRVData(RVData).FAnimatorList.Count=0) then begin
  150.           KillTimer(Handle, RV_TIMERID_ANIMATION);
  151.           exit;
  152.         end;
  153.         TRichViewRVData(RVData).FAnimatorList.TimerEvent;
  154.         if TRichViewRVData(RVData).FAnimatorList.LastMinInterval<>
  155.            TRichViewRVData(RVData).FAnimatorList.MinInterval then begin
  156.           SetTimer(Handle, RV_TIMERID_ANIMATION, TRichViewRVData(RVData).FAnimatorList.MinInterval, nil);
  157.           TRichViewRVData(RVData).FAnimatorList.LastMinInterval :=
  158.             TRichViewRVData(RVData).FAnimatorList.MinInterval
  159.         end;
  160.       end;
  161.     {$ENDIF}
  162.   end;
  163. end;
  164. {------------------------------------------------------------------------------}
  165. procedure TCustomRichView.Loaded;
  166. begin
  167.   inherited Loaded;
  168.   UpdatePaletteInfo;
  169.   Format;
  170. end;
  171. {------------------------------------------------------------------------------}
  172. procedure TCustomRichView.InplaceRedrawing(AllowRedrawItself: Boolean);
  173. begin
  174.   if AllowRedrawItself then
  175.     Refresh;
  176.   if not FullRedraw or (InplaceEditor=nil) or not (InplaceEditor is TCustomRichView) then
  177.     exit;
  178.   TCustomRichView(InplaceEditor).InplaceRedrawing(True);
  179. end;
  180. {------------------------------------------------------------------------------}
  181. function TCustomRichView.GetAllowSelection: Boolean;
  182. begin
  183.   Result := rvoAllowSelection in Options;
  184. end;
  185. {------------------------------------------------------------------------------}
  186. function TCustomRichView.GetSingleClick: Boolean;
  187. begin
  188.   Result := rvoSingleClick in Options;
  189. end;
  190. {------------------------------------------------------------------------------}
  191. procedure TCustomRichView.SetAllowSelection(const Value: Boolean);
  192. begin
  193.   if Value then
  194.     Include(FOptions, rvoAllowSelection)
  195.   else
  196.     Exclude(FOptions, rvoAllowSelection)
  197. end;
  198. {------------------------------------------------------------------------------}
  199. procedure TCustomRichView.SetSingleClick(const Value: Boolean);
  200. begin
  201.   if Value then
  202.     Include(FOptions, rvoSingleClick)
  203.   else
  204.     Exclude(FOptions, rvoSingleClick)
  205. end;
  206. {------------------------------------------------------------------------------}
  207. function TCustomRichView.GetTabNavigation:TRVTabNavigationType;
  208. begin
  209.   Result := RVData.TabNavigation;
  210. end;
  211. {------------------------------------------------------------------------------}
  212. procedure TCustomRichView.SetTabNavigation(const Value: TRVTabNavigationType);
  213. begin
  214.   RVData.TabNavigation := Value;
  215. end;
  216. {------------------------------------------------------------------------------}
  217. function TCustomRichView.SearchText(const s: String; SrchOptions: TRVSearchOptions): Boolean;
  218. begin
  219.   Result := RVData.SearchText(rvsroDown in SrchOptions, rvsroMatchCase in SrchOptions,
  220.                               rvsroWholeWord in SrchOptions, s);
  221. end;
  222. {------------------------------------------------------------------------------}
  223. function TCustomRichView.GetItemStyle(ItemNo: Integer): Integer;
  224. begin
  225.   Result := RVData.GetItemStyle(ItemNo);
  226. end;
  227. {------------------------------------------------------------------------------}
  228. procedure TCustomRichView.GetBreakInfo(ItemNo: Integer; var AWidth: Byte;
  229.                             var AStyle: TRVBreakStyle; var AColor: TColor;
  230.                             var ATag: Integer);
  231. begin
  232.   RVData.GetBreakInfo(ItemNo, AWidth, AStyle, AColor, ATag);
  233. end;
  234. {------------------------------------------------------------------------------}
  235. procedure TCustomRichView.GetBulletInfo(ItemNo: Integer; var AName: String;
  236.                                   var AImageIndex: Integer;
  237.                                   var AImageList: TCustomImageList;
  238.                                   var ATag: Integer);
  239. begin
  240.   RVData.GetBulletInfo(ItemNo, AName, AImageIndex, AImageList, ATag);
  241. end;
  242. {------------------------------------------------------------------------------}
  243. procedure TCustomRichView.GetHotspotInfo(ItemNo: Integer; var AName: String;
  244.                                   var AImageIndex, AHotImageIndex: Integer;
  245.                                   var AImageList: TCustomImageList;
  246.                                   var ATag: Integer);
  247. begin
  248.   RVData.GetHotspotInfo(ItemNo, AName, AImageIndex, AHotImageIndex,AImageList, ATag);
  249. end;
  250. {------------------------------------------------------------------------------}
  251. procedure TCustomRichView.GetPictureInfo(ItemNo: Integer; var AName: String;
  252.                                    var Agr: TGraphic; var AVAlign: TRVVAlign;
  253.                                    var ATag: Integer);
  254. begin
  255.   RVData.GetPictureInfo(ItemNo, AName, Agr, AVAlign, ATag);
  256. end;
  257. {------------------------------------------------------------------------------}
  258. procedure TCustomRichView.GetControlInfo(ItemNo: Integer; var AName: String;
  259.                                    var Actrl: TControl; var AVAlign: TRVVAlign;
  260.                                    var ATag: Integer);
  261. begin
  262.   RVData.GetControlInfo(ItemNo, AName, Actrl, AVAlign, ATag);
  263. end;
  264. {------------------------------------------------------------------------------}
  265. procedure TCustomRichView.GetTextInfo(ItemNo: Integer; var AText: String;
  266.                                 var ATag: Integer);
  267. begin
  268.   RVData.GetTextInfo(ItemNo, AText, ATag);
  269. end;
  270. {------------------------------------------------------------------------------}
  271. function TCustomRichView.GetItemTag(ItemNo: Integer): Integer;
  272. begin                                     
  273.   Result := RVData.GetItemTag(ItemNo);
  274. end;
  275. {------------------------------------------------------------------------------}
  276. procedure TCustomRichView.SetBreakInfo(ItemNo: Integer; AWidth: Byte;
  277.                             AStyle: TRVBreakStyle; AColor: TColor;
  278.                             ATag: Integer);
  279. begin
  280.   RVData.SetBreakInfo(ItemNo, AWidth, AStyle, AColor, ATag);
  281. end;
  282. {------------------------------------------------------------------------------}
  283. procedure TCustomRichView.SetBulletInfo(ItemNo: Integer; const AName: String;
  284.                                   AImageIndex: Integer;
  285.                                   AImageList: TCustomImageList;
  286.                                   ATag: Integer);
  287. begin
  288.   RVData.SetBulletInfo(ItemNo, AName, AImageIndex, AImageList, ATag);
  289. end;
  290. {------------------------------------------------------------------------------}
  291. procedure TCustomRichView.SetHotspotInfo(ItemNo: Integer; const AName: String;
  292.                                    AImageIndex, AHotImageIndex: Integer;
  293.                                    AImageList: TCustomImageList;
  294.                                    ATag: Integer);
  295. begin
  296.   RVData.SetHotspotInfo(ItemNo, AName, AImageIndex, AHotImageIndex,
  297.                         AImageList, ATag);
  298. end;
  299. {------------------------------------------------------------------------------}
  300. function TCustomRichView.SetPictureInfo(ItemNo: Integer; const AName: String;
  301.                                   Agr: TGraphic; AVAlign: TRVVAlign;
  302.                                   ATag: Integer): Boolean;
  303. begin
  304.   Result := RVData.SetPictureInfo(ItemNo, AName, Agr, AVAlign, ATag);
  305. end;
  306. {------------------------------------------------------------------------------}
  307. function TCustomRichView.SetControlInfo(ItemNo: Integer; const AName: String;
  308.                                   AVAlign: TRVVAlign; ATag: Integer): Boolean;
  309. begin
  310.   Result := RVData.SetControlInfo(ItemNo, AName, AVAlign, ATag);
  311. end;
  312. {------------------------------------------------------------------------------}
  313. procedure TCustomRichView.SetItemTag(ItemNo: Integer; ATag: Integer);
  314. begin
  315.   RVData.SetItemTag(ItemNo, ATag);
  316. end;
  317. {------------------------------------------------------------------------------}
  318. procedure TCustomRichView.SetItemText(ItemNo: Integer; const s: String);
  319. begin
  320.   RVData.Items[ItemNo] := s;
  321. end;
  322. {------------------------------------------------------------------------------}
  323. function TCustomRichView.GetItemText(ItemNo: Integer): String;
  324. begin
  325.   Result := RVData.Items[ItemNo];
  326. end;
  327. {------------------------------------------------------------------------------}
  328. procedure TCustomRichView.SetCheckpointInfo(ItemNo: Integer; ATag: Integer; const AName: String;
  329.                                       ARaiseEvent: Boolean);
  330. begin
  331.   RVData.SetCheckpointInfo(ItemNo, ATag, AName, ARaiseEvent);
  332. end;
  333. {------------------------------------------------------------------------------}
  334. function TCustomRichView.RemoveCheckpoint(ItemNo: Integer):Boolean;
  335. begin
  336.   Result := RVData.RemoveCheckpoint(ItemNo);
  337. end;
  338. {------------------------------------------------------------------------------}
  339. procedure TCustomRichView.SetStyle(Value: TRVStyle);
  340. begin
  341.   FStyle := Value;
  342.   if (csDesigning in ComponentState) or
  343.      (rvoFormatInvalidate in Options) then Invalidate;
  344. end;
  345. {------------------------------------------------------------------------------}
  346. function TCustomRichView.FindControlItemNo(actrl: TControl): Integer;
  347. begin
  348.   Result := RVData.FindControlItemNo(actrl);
  349. end;
  350. {------------------------------------------------------------------------------}
  351. function TCustomRichView.SelectControl(actrl: TControl): Boolean;
  352. begin
  353.   Result := RVData.SelectControl(actrl);
  354. end;
  355. {------------------------------------------------------------------------------}
  356. procedure TCustomRichView.AfterHScroll;
  357. begin
  358.   inherited AfterHScroll;
  359.   GenerateMouseMove;
  360.   InplaceRedrawing(False);  
  361.   {$IFDEF RVDEBUG}{$I Debuga.inc}{$ENDIF}
  362. end;
  363. {------------------------------------------------------------------------------}
  364. procedure TCustomRichView.AfterVScroll;
  365. begin
  366.   {$IFDEF RVDEBUG}{$I Debugb.inc}{$ENDIF}
  367.   inherited AfterVScroll;
  368.   GenerateMouseMove;
  369.   RVData.AfterVScroll;
  370.   InplaceRedrawing(False);
  371. end;
  372. {------------------------------------------------------------------------------}
  373. procedure TCustomRichView.GetSelectionBounds(var StartItemNo, StartItemOffs,
  374.                                  EndItemNo, EndItemOffs: Integer;
  375.                                  Normalize: Boolean);
  376. begin
  377.   RVData.GetSelectionBounds(StartItemNo, StartItemOffs, EndItemNo, EndItemOffs,
  378.                             Normalize);
  379. end;
  380. {------------------------------------------------------------------------------}
  381. procedure TCustomRichView.SetSelectionBounds(StartItemNo, StartItemOffs,
  382.                                  EndItemNo, EndItemOffs: Integer);
  383. begin
  384.   RVData.SetSelectionBounds(StartItemNo, StartItemOffs, EndItemNo, EndItemOffs);
  385. end;
  386. {------------------------------------------------------------------------------}
  387. function TCustomRichView.IsFromNewLine(ItemNo: Integer): Boolean;
  388. begin
  389.   Result := RVData.IsFromNewLine(ItemNo);
  390. end;
  391. {------------------------------------------------------------------------------}
  392. function TCustomRichView.IsParaStart(ItemNo: Integer): Boolean;
  393. begin
  394.   Result := RVData.IsParaStart(ItemNo);
  395. end;
  396. {------------------------------------------------------------------------------}
  397. function TCustomRichView.GetItemPara(ItemNo: Integer): Integer;
  398. begin
  399.   Result := RVData.GetItemPara(ItemNo);
  400. end;
  401. {------------------------------------------------------------------------------}
  402. procedure TCustomRichView.GetWordAt(X,Y: Integer;
  403.   var RVData: TCustomRVFormattedData;  var ItemNo: Integer; var Word: String);
  404. begin
  405.   Self.RVData.GetWordAt(X, Y, RVData, ItemNo, Word);
  406. end;
  407. {------------------------------------------------------------------------------}
  408. {$IFDEF RICHVIEWDEF4}
  409. function TCustomRichView.GetWordAt(X,Y: Integer): String;
  410. var ARVData: TCustomRVFormattedData;
  411.     AItemNo: Integer;
  412. begin
  413.   RVData.GetWordAt(X, Y, ARVData, AItemNo, Result);
  414. end;
  415. {$ENDIF}
  416. {------------------------------------------------------------------------------}
  417. procedure TCustomRichView.WMDestroy(var Message: TWMDestroy);
  418. begin
  419.   DeactivateScrollTimer;
  420.   inherited;
  421. end;
  422. {------------------------------------------------------------------------------}
  423. procedure TCustomRichView.WMGetDlgCode(var Message: TWMGetDlgCode);
  424. begin
  425.   Message.Result := DLGC_WANTARROWS;
  426.   if TabNavigation<>rvtnNone then begin
  427.     Message.Result := Message.Result or DLGC_WANTTAB;
  428.     if RVData.TopLevelFocusedRVData<>nil then
  429.       Message.Result := Message.Result or DLGC_WANTALLKEYS; // wants ENTER
  430.   end;
  431. end;
  432. {------------------------------------------------------------------------------}
  433. procedure TCustomRichView.WMSetFocus(var Message: TWMSetFocus);
  434.   {....................................}
  435.   function GetFocusedControl(Handle: HWND): TWinControl;
  436.   var NewHandle: HWND;
  437.   begin
  438.     Result := nil;
  439.     if Handle=0 then
  440.       exit;
  441.     NewHandle := Windows.GetParent(Handle);
  442.     if NewHandle=0 then begin
  443.       Result := FindControl(Handle);
  444.       exit;
  445.     end;
  446.     Result := FindControl(NewHandle);
  447.     if not (Result is TComboBox) then
  448.       Result := FindControl(Handle);
  449.   end;
  450.   {....................................}
  451. begin
  452.   inherited;
  453.   if csDestroying in ComponentState then
  454.     exit;
  455.   if TabNavigation<>rvtnNone then begin
  456.     if Message.FocusedWnd=0 then
  457.       Include(RVData.State,rvstDoNotTab);
  458.     RVData.DoTabNavigation(GetKeyState(VK_SHIFT)<0, GetFocusedControl(Message.FocusedWnd));
  459.   end;
  460.   if (Style<>nil) and
  461.      ((Style.SelTextColor<>Style.InactiveSelTextColor) or
  462.       (Style.SelColor<>Style.InactiveSelColor)) then
  463.     Invalidate;
  464. end;
  465. {------------------------------------------------------------------------------}
  466. procedure TCustomRichView.WMKillFocus(var Message: TWMKillFocus);
  467. begin
  468.   inherited;
  469.   if (Style<>nil) and
  470.      ((Style.SelTextColor<>Style.InactiveSelTextColor) or
  471.       (Style.SelColor<>Style.InactiveSelColor)) then
  472.     Invalidate;
  473. end;
  474. {------------------------------------------------------------------------------}
  475. function TCustomRichView.GetSelectionRect: TRect;
  476. begin
  477.   Result := RVData.GetSelectionRect;
  478. end;
  479. {------------------------------------------------------------------------------}
  480. function TCustomRichView.GetPageBreaksBeforeItems(Index: Integer): Boolean;
  481. begin
  482.   Result := RVData.PageBreaksBeforeItems[Index];
  483. end;
  484. {------------------------------------------------------------------------------}
  485. procedure TCustomRichView.SetPageBreaksBeforeItems(Index: Integer;  Value: Boolean);
  486. begin
  487.   RVData.PageBreaksBeforeItems[Index] := Value;
  488.   if rvoShowPageBreaks in Options then
  489.     Invalidate;  
  490. end;
  491. {------------------------------------------------------------------------------}
  492. procedure TCustomRichView.SetAddParagraphMode(AllowNewPara: Boolean);
  493. begin
  494.   RVData.SetAddParagraphMode(AllowNewPara);
  495. end;
  496. {------------------------------------------------------------------------------}
  497. function TCustomRichView.GetDocumentHeight: Integer;
  498. begin
  499.   Result := RVData.DocumentHeight;
  500. end;
  501. {----------------------------- Checkpoints ------------------------------------}
  502. function TCustomRichView.GetFirstCheckpoint: TCheckpointData;
  503. begin
  504.   Result := RVData.GetFirstCheckpoint;
  505. end;
  506. {------------------------------------------------------------------------------}
  507. function TCustomRichView.GetNextCheckpoint(CheckpointData: TCheckpointData): TCheckpointData;
  508. begin
  509.   Result := RVData.GetNextCheckpoint(CheckpointData);
  510. end;
  511. {------------------------------------------------------------------------------}
  512. function TCustomRichView.GetLastCheckpoint: TCheckpointData;
  513. begin
  514.   Result := RVData.GetLastCheckpoint;
  515. end;
  516. {------------------------------------------------------------------------------}
  517. function TCustomRichView.GetPrevCheckpoint(CheckpointData: TCheckpointData): TCheckpointData;
  518. begin
  519.   Result := RVData.GetPrevCheckpoint(CheckpointData);
  520. end;
  521. {------------------------------------------------------------------------------}
  522. procedure TCustomRichView.GetCheckpointInfo(CheckpointData: TCheckpointData;
  523.                                 var Tag: Integer; var Name: String;
  524.                                 var RaiseEvent: Boolean);
  525. begin
  526.   RVData.GetCheckpointInfo(CheckpointData, Tag, Name, RaiseEvent);
  527. end;
  528. {------------------------------------------------------------------------------}
  529. procedure TCustomRichView.GetCheckpointXY(CheckpointData: TCheckpointData; var X,Y: Integer);
  530. begin
  531.   RVData.GetCheckpointXY(CheckpointData, X, Y);
  532. end;
  533. {------------------------------------------------------------------------------}
  534. function TCustomRichView.GetCheckpointYEx(CheckpointData: TCheckpointData): Integer;
  535. begin
  536.   Result := RVData.GetCheckpointYEx(CheckpointData);
  537. end;
  538. {------------------------------------------------------------------------------}
  539. function TCustomRichView.FindCheckpointByName(const Name: String): TCheckpointData;
  540. begin
  541.   Result := RVData.FindCheckpointByName(Name);
  542. end;
  543. {------------------------------------------------------------------------------}
  544. function TCustomRichView.FindCheckpointByTag(Tag: Integer): TCheckpointData;
  545. begin
  546.   Result := RVData.FindCheckpointByTag(Tag);
  547. end;
  548. {------------------------------------------------------------------------------}
  549. function TCustomRichView.GetCheckpointNo(CheckpointData: TCheckpointData): Integer;
  550. begin
  551.   Result := RVData.GetCheckpointNo(CheckpointData);
  552. end;
  553. {------------------------------------------------------------------------------}
  554. function TCustomRichView.GetCheckpointByNo(No: Integer): TCheckpointData;
  555. begin
  556.   Result := RVData.GetCheckpointByNo(No);
  557. end;
  558. {------------------------------------------------------------------------------}
  559. function TCustomRichView.GetCheckpointItemNo(CheckpointData: TCheckpointData): Integer;
  560. begin
  561.   Result := RVData.GetCheckpointItemNo(CheckpointData);
  562. end;
  563. {------------------------------------------------------------------------------}
  564. function TCustomRichView.GetItemCheckpoint(ItemNo: Integer): TCheckpointData;
  565. begin
  566.   Result := RVData.GetItemCheckpoint(ItemNo);
  567. end;
  568. {------------------------------------------------------------------------------}
  569. function TCustomRichView.GetCheckpointY(no: Integer): Integer;
  570. begin
  571.   Result := RVData.GetCheckpointYEx(GetCheckpointByNo(No));
  572. end;
  573. {------------------------------------------------------------------------------}
  574. function TCustomRichView.GetJumpPointY(id: Integer): Integer;
  575. begin
  576.   Result := RVData.GetJumpPointY(id);
  577. end;
  578. {------------------------------------------------------------------------------}
  579. function TCustomRichView.GetJumpPointItemNo(id: Integer): Integer;
  580. begin
  581.   Result := RVData.GetJumpPointItemNo(id);
  582. end;
  583. {------------------------------------------------------------------------------}
  584. procedure TCustomRichView.GetJumpPointLocation(id: Integer;
  585.   var RVData: TCustomRVFormattedData; var ItemNo: Integer);
  586. begin
  587.   Self.RVData.GetJumpPointLocation(id, RVData, ItemNo);
  588. end;
  589. {------------------------------------------------------------------------------}
  590. function TCustomRichView.GetItemCoords(ItemNo: Integer;var Left,Top: Integer): Boolean;
  591. begin
  592.   Result := RVData.GetItemCoords(ItemNo, Left,Top);
  593. end;
  594. {------------------------------------------------------------------------------}
  595. function TCustomRichView.GetItemClientCoords(ItemNo: Integer;var Left,Top: Integer): Boolean;
  596. begin
  597.   Result := RVData.GetItemClientCoords(ItemNo, Left,Top);
  598. end;
  599. {------------------------------------------------------------------------------}
  600. {$IFNDEF RVDONOTUSERVF}
  601. function TCustomRichView.CreateLayoutInfo: TRVLayoutInfo;
  602. begin
  603.   Result := TRVLayoutInfo.Create;
  604.   Result.LeftMargin   := LeftMargin;
  605.   Result.RightMargin  := RightMargin;
  606.   Result.BottomMargin := BottomMargin;
  607.   Result.TopMargin    := TopMargin;
  608.   Result.MinTextWidth := MinTextWidth;
  609.   Result.MaxTextWidth := MaxTextWidth;
  610.   Result.BiDiMode     := BiDiMode;
  611. end;
  612. {------------------------------------------------------------------------------}
  613. procedure TCustomRichView.ApplyLayoutInfo(Layout: TRVLayoutInfo);
  614. begin
  615.   LeftMargin   := Layout.LeftMargin;
  616.   RightMargin  := Layout.RightMargin;
  617.   BottomMargin := Layout.BottomMargin;
  618.   TopMargin    := Layout.TopMargin;
  619.   MinTextWidth := Layout.MinTextWidth;
  620.   MaxTextWidth := Layout.MaxTextWidth;
  621.   Include(RVData.State, rvstSkipFormatting);
  622.   try
  623.     BiDiMode     := Layout.BiDiMode;
  624.   finally
  625.     Exclude(RVData.State, rvstSkipFormatting);
  626.   end;
  627. end;
  628. {-------------------------- Loading RVF ---------------------------------------}
  629. function TCustomRichView.InsertRVFFromStream(Stream: TStream; Index: Integer):Boolean;
  630. var AColor: TColor;
  631. begin
  632.   AColor := Color;
  633.   Result := RVData.InsertRVFFromStream(Stream, Index, AColor, Background, nil, False);
  634.   Color := AColor;
  635. end;
  636. {------------------------------------------------------------------------------}
  637. function TCustomRichView.AppendRVFFromStream(Stream: TStream; ParaNo: Integer):Boolean;
  638. var AColor: TColor;
  639. begin
  640.   AColor := Color;
  641.   Result := RVData.AppendRVFFromStream(Stream, ParaNo, AColor, Background);
  642.   Color := AColor;
  643. end;
  644. {------------------------------------------------------------------------------}
  645. function TCustomRichView.LoadRVFFromStream(Stream: TStream):Boolean;
  646. var AColor: TColor;
  647.    Layout: TRVLayoutInfo;
  648. begin
  649.   AColor := Color;
  650.   Layout := TRVLayoutInfo.Create;
  651.   Result := RVData.LoadRVFFromStream(Stream, AColor, Background, Layout);
  652.   if Layout.Loaded then
  653.     ApplyLayoutInfo(Layout);
  654.   Layout.Free;
  655.   Color := AColor;
  656. end;
  657. {------------------------------------------------------------------------------}
  658. function TCustomRichView.LoadRVF(const FileName: String):Boolean;
  659. var AColor: TColor;
  660.    Layout: TRVLayoutInfo;
  661. begin
  662.   AColor := Color;
  663.   Layout := TRVLayoutInfo.Create;  
  664.   Result := RVData.LoadRVF(FileName, AColor, Background, Layout);
  665.   if Layout.Loaded then
  666.     ApplyLayoutInfo(Layout);
  667.   Layout.Free;
  668.   Color := AColor;
  669. end;
  670. {--------------------------- Saving RVF ---------------------------------------}
  671. function TCustomRichView.SaveRVFToStream(Stream: TStream; SelectionOnly: Boolean):Boolean;
  672. var Layout: TRVLayoutInfo;
  673. begin
  674.   Layout := CreateLayoutInfo;
  675.   Result := RVData.SaveRVFToStream(Stream, SelectionOnly, Color, Background, Layout);
  676.   Layout.Free;
  677. end;
  678. {------------------------------------------------------------------------------}
  679. function TCustomRichView.SaveRVF(const FileName: String; SelectionOnly: Boolean):Boolean;
  680. var Layout: TRVLayoutInfo;
  681. begin
  682.   Layout := CreateLayoutInfo;
  683.   Result := RVData.SaveRVF(FileName, SelectionOnly, Color, Background, Layout);
  684.   Layout.Free;  
  685. end;
  686. {------------------------------------------------------------------------------}
  687. procedure TCustomRichView.CopyRVF;
  688. begin
  689.   RVData.CopyRVF(Color, Background);
  690. end;
  691. {------------------------------------------------------------------------------}
  692. {$ENDIF}
  693. {--------------------------- Saving RTF ---------------------------------------}
  694. {$IFNDEF RVDONOTUSERTF}
  695. procedure TCustomRichView.CopyRTF;
  696. begin
  697.   RVData.CopyRTF(Color, Background);
  698. end;
  699. {------------------------------------------------------------------------------}
  700. function TCustomRichView.SaveRTFToStream(Stream: TStream; SelectionOnly: Boolean):Boolean;
  701. begin
  702.   Result := RVData.SaveRTFToStream(Stream, '', SelectionOnly, 0, Color,
  703.     Background, nil, nil, nil, nil, nil, 0.0);
  704. end;
  705. {------------------------------------------------------------------------------}
  706. function TCustomRichView.SaveRTF(const FileName: String; SelectionOnly: Boolean):Boolean;
  707. begin
  708.   Result := RVData.SaveRTF(FileName, SelectionOnly, Color, Background);
  709. end;
  710. {$ENDIF}
  711. {------------------------------- HTML methods ---------------------------------}
  712. {$IFNDEF RVDONOTUSERTFIMPORT}
  713. function TCustomRichView.LoadRTFFromStream(Stream: TStream):Boolean;
  714. begin
  715.   RTFReadProperties; // creating if nil
  716.   Result := RVData.LoadRTFFromStream(Stream)=rtf_ec_OK;
  717. end;
  718. {------------------------------- HTML methods ---------------------------------}
  719. function TCustomRichView.LoadRTF(const FileName: String):Boolean;
  720. begin
  721.   RTFReadProperties; // creating if nil
  722.   Result := RVData.LoadRTF(FileName)=rtf_ec_OK;
  723. end;
  724. {------------------------------- HTML methods ---------------------------------}
  725. {$IFDEF RVUSEWORDDOC}
  726. function TCustomRichView.LoadWordDoc(const FileName: String):Boolean;
  727. begin
  728.   RTFReadProperties; // creating if nil
  729.   Result := RVData.LoadWordDoc(FileName)=rtf_ec_OK;
  730. end;
  731. {$ENDIF}
  732. {$ENDIF}
  733. {------------------------------- HTML methods ---------------------------------}
  734. {$IFNDEF RVDONOTUSEHTML}
  735. function TCustomRichView.SaveHTMLEx(const FileName, Title, ImagesPrefix, ExtraStyles,
  736.                               ExternalCSS, CPPrefix: String;
  737.                               Options: TRVSaveOptions):Boolean;
  738. begin
  739.   imgSavePrefix := ImagesPrefix;
  740.   SaveOptions   := Options;
  741.   imgSaveNo     := 0;
  742.   Result := RVData.SaveHTMLEx( FileName, Title, ImagesPrefix,
  743.                               ExtraStyles, ExternalCSS, CPPrefix,
  744.                               Options, GetColor, CurrentFileColor, imgSaveNo,
  745.                               LeftMargin, TopMargin, RightMargin, BottomMargin,
  746.                               Background);
  747. end;
  748. {------------------------------------------------------------------------------}
  749. function TCustomRichView.SaveHTMLToStreamEx(Stream: TStream;
  750.                         const Path, Title, ImagesPrefix, ExtraStyles,
  751.                         ExternalCSS, CPPrefix: String;
  752.                         Options: TRVSaveOptions):Boolean;
  753. begin
  754.   imgSavePrefix := ImagesPrefix;
  755.   SaveOptions   := Options;
  756.   imgSaveNo     := 0;
  757.   {$IFDEF RVDEBUG}{$I Debugd.inc}{$ENDIF}
  758.   Result := RVData.SaveHTMLToStreamEx(Stream, Path, Title, ImagesPrefix,
  759.                                       ExtraStyles, ExternalCSS, CPPrefix,
  760.                                       Options, GetColor, CurrentFileColor, imgSaveNo,
  761.                                       LeftMargin, TopMargin,
  762.                                       RightMargin, BottomMargin,
  763.                                       Background,nil);
  764. end;
  765. {------------------------------------------------------------------------------}
  766. function TCustomRichView.SaveHTML(const FileName,Title,ImagesPrefix: String;
  767.                            Options: TRVSaveOptions):Boolean;
  768. begin
  769.   imgSavePrefix    := ImagesPrefix;
  770.   CurrentFileColor := GetColor;
  771.   SaveOptions      := Options;
  772.   imgSaveNo        := 0;
  773.   Result := RVData.SaveHTML(FileName, Title, ImagesPrefix, Options,
  774.                             GetColor, imgSaveNo,
  775.                             LeftMargin, TopMargin, RightMargin, BottomMargin,
  776.                             Background);
  777. end;
  778. {------------------------------------------------------------------------------}
  779. function TCustomRichView.SaveHTMLToStream(Stream: TStream; const Path, Title,ImagesPrefix: String;
  780.                                     Options: TRVSaveOptions):Boolean;
  781. begin
  782.   imgSavePrefix    := ImagesPrefix;
  783.   CurrentFileColor := GetColor;
  784.   SaveOptions      := Options;
  785.   imgSaveNo        := 0;
  786.   Result := RVData.SaveHTMLToStream(Stream, Path, Title, ImagesPrefix, Options,
  787.                             GetColor, imgSaveNo,
  788.                             LeftMargin, TopMargin, RightMargin, BottomMargin,
  789.                             Background,nil);
  790. end;
  791. {$ENDIF}
  792. {------------------------------------------------------------------------------}
  793. function TCustomRichView.SavePicture(DocumentSaveFormat: TRVSaveFormat;
  794.                                const Path: String;
  795.                                gr: TGraphic): String;
  796. begin
  797.   Result := RVData.SavePicture(DocumentSaveFormat, imgSavePrefix, Path,
  798.     imgSaveNo, rvsoOverrideImages in SaveOptions, CurrentFileColor, gr);
  799. end;
  800. {----------------------------- Text Files -------------------------------------}
  801. function TCustomRichView.LoadText(const FileName: String; StyleNo, ParaNo: Integer;
  802.   AsSingleParagraph: Boolean):Boolean;
  803. begin
  804.   Result := RVData.LoadText(FileName, StyleNo, ParaNo,AsSingleParagraph);
  805. end;
  806. {------------------------------------------------------------------------------}
  807. function TCustomRichView.LoadTextFromStream(Stream: TStream; StyleNo,
  808.   ParaNo: Integer; AsSingleParagraph: Boolean):Boolean;
  809. begin
  810.   Result := RVData.LoadTextFromStream(Stream, StyleNo, ParaNo,AsSingleParagraph);
  811. end;
  812. {------------------------------------------------------------------------------}
  813. function TCustomRichView.SaveTextToStream(const Path: String; Stream: TStream;
  814.   LineWidth: Integer; SelectionOnly, TextOnly: Boolean):Boolean;
  815. begin
  816.   Result := RVData.SaveTextToStream(Path, Stream, LineWidth, SelectionOnly,
  817.     TextOnly, False, False);
  818. end;
  819. {------------------------------------------------------------------------------}
  820. function TCustomRichView.SaveText(const FileName: String; LineWidth: Integer):Boolean;
  821. begin
  822.   Result := RVData.SaveText(FileName, LineWidth, False);
  823. end;
  824. {------------------------------- Unicode --------------------------------------}
  825. procedure TCustomRichView.AddNLATag(const s: String; StyleNo, ParaNo, Tag: Integer);
  826. begin
  827.   {$IFNDEF RVDONOTUSEUNICODE}
  828.   RVData.AddNLATag(s, StyleNo, ParaNo, Tag);
  829.   {$ELSE}
  830.   RVData.AddNLTag(s, StyleNo, ParaNo, Tag);  
  831.   {$ENDIF}
  832. end;
  833. {------------------------------------------------------------------------------}
  834. {$IFNDEF RVDONOTUSEUNICODE}
  835. function TCustomRichView.LoadTextW(const FileName: String; StyleNo, ParaNo: Integer;
  836.   DefAsSingleParagraph: Boolean):Boolean;
  837. begin
  838.   Result := RVData.LoadTextW(FileName, StyleNo, ParaNo, DefAsSingleParagraph);
  839. end;
  840. {------------------------------------------------------------------------------}
  841. function TCustomRichView.LoadTextFromStreamW(Stream: TStream; StyleNo, ParaNo: Integer;
  842.   DefAsSingleParagraph: Boolean):Boolean;
  843. begin
  844.   Result := RVData.LoadTextFromStreamW(Stream, StyleNo, ParaNo, DefAsSingleParagraph);
  845. end;
  846. {------------------------------------------------------------------------------}
  847. function TCustomRichView.SaveTextW(const FileName: String; LineWidth: Integer):Boolean;
  848. begin
  849.   Result := RVData.SaveText(FileName, LineWidth, True);
  850. end;
  851. {------------------------------------------------------------------------------}
  852. function TCustomRichView.SaveTextToStreamW(const Path: String; Stream: TStream;
  853.   LineWidth: Integer; SelectionOnly, TextOnly: Boolean):Boolean;
  854. begin
  855.   Result := RVData.SaveTextToStream(Path, Stream, LineWidth, SelectionOnly,
  856.     TextOnly, True, False);
  857. end;
  858. {------------------------------------------------------------------------------}
  859. procedure TCustomRichView.SetItemTextA(ItemNo: Integer; const s: String);
  860. begin
  861.   RVData.SetItemTextA(ItemNo, s);
  862. end;
  863. {------------------------------------------------------------------------------}
  864. {$IFDEF RICHVIEWCBDEF3}
  865. procedure TCustomRichView.AddTextNLW(const s: WideString;
  866.   StyleNo, FirstParaNo, OtherParaNo: Integer;
  867.   DefAsSingleParagraph: Boolean);
  868. var ansis: String;
  869.     LParaNo: Integer;
  870. begin
  871.   SetLength(ansis, Length(s)*2);
  872.   Move(Pointer(s)^, Pointer(ansis)^, Length(ansis));
  873.   LParaNo := FirstParaNo;
  874.   if (Style<>nil) and (FirstParaNo=-1) and ((StyleNo<0) or (StyleNo=rvsDefStyle)) then begin
  875.     if ItemCount>0 then
  876.       LParaNo := GetItemPara(ItemCount-1)
  877.     else
  878.       LParaNo := 0;
  879.   end;
  880.   if (Style<>nil) and not Style.TextStyles[RVData.GetActualStyle2(StyleNo,LParaNo)].Unicode then begin
  881.     ansis := RVU_UnicodeToAnsi(RVData.GetStyleCodePage(RVData.GetActualStyle2(StyleNo,LParaNo)), ansis);
  882.     if DefAsSingleParagraph then
  883.       AddTextBlockNL(ansis, StyleNo, FirstParaNo)
  884.     else
  885.       AddTextNL(ansis, StyleNo, FirstParaNo, OtherParaNo);
  886.     end
  887.   else
  888.     RVData.AddTextNLW(ansis, StyleNo, FirstParaNo, OtherParaNo, DefAsSingleParagraph);
  889. end;
  890. {------------------------------------------------------------------------------}
  891. procedure TCustomRichView.AddNLWTag(const s: WideString; StyleNo, ParaNo, Tag: Integer);
  892. begin
  893.   RVData.AddNLWTag(s, StyleNo, ParaNo, Tag);
  894. end;
  895. {------------------------------------------------------------------------------}
  896. function TCustomRichView.GetSelTextW: WideString;
  897. var s: String;
  898. begin
  899.   s := RVData.GetSelText(True);
  900.   SetLength(Result, Length(s) div 2);
  901.   if Length(s)<>0 then
  902.     Move(PChar(s)^, Pointer(Result)^, Length(s));
  903. end;
  904. {------------------------------------------------------------------------------}
  905. function TCustomRichView.GetItemTextW(ItemNo: Integer): WideString;
  906. begin
  907.   Result := RVData.GetItemTextW(ItemNo);
  908. end;
  909. {------------------------------------------------------------------------------}
  910. procedure TCustomRichView.SetItemTextW(ItemNo: Integer;
  911.   const s: WideString);
  912. begin
  913.   RVData.SetItemTextW(ItemNo, s);
  914. end;
  915. {$ENDIF}
  916. {$ENDIF}
  917. {------------------------------------------------------------------------------}
  918. function TCustomRichView.GetItemTextA(ItemNo: Integer): String;
  919. begin
  920.  {$IFNDEF RVDONOTUSEUNICODE}
  921.   Result := RVData.GetItemTextA(ItemNo);
  922.   {$ELSE}
  923.   Result := RVData.GetItemText(ItemNo);
  924.   {$ENDIF}  
  925. end;
  926. {--------------------------- Palette  support ---------------------------------}
  927. procedure TCustomRichView.UpdatePaletteInfo;
  928. begin
  929.   inherited UpdatePaletteInfo;
  930.   RVData.UpdateItemsPaletteInfo;
  931.   RVData.UpdateBackgroundPaletteInfo(Background);
  932.   Invalidate;
  933. end;
  934. {------------------------------------------------------------------------------}
  935. function TCustomRichView.GetItem(ItemNo: Integer): TCustomRVItemInfo;
  936. begin
  937.   Result := TCustomRVItemInfo(RVData.Items.Objects[ItemNo]);
  938. end;
  939. {------------------------------------------------------------------------------}
  940. function TCustomRichView.GetItemNo(Item: TCustomRVItemInfo): Integer;
  941. begin
  942.   Result := RVData.Items.IndexOfObject(Item);
  943. end;
  944. procedure TCustomRichView.GetFocusedItem(var ARVData: TCustomRVFormattedData; var AItemNo: Integer);
  945. begin
  946.   ARVData := RVData.TopLevelFocusedRVData;
  947.   AItemNo := RVData.TopLevelFocusedItemNo;
  948. end;
  949. {$IFDEF RVDEBUG}{$I DebugDecl2.inc}{$ENDIF}
  950. {------------------------------------------------------------------------------}
  951. function TCustomRichView.GetRTFReadProperties: TRVRTFReaderProperties;
  952. begin
  953.   if FRTFReadProperties=nil then
  954.     FRTFReadProperties := TRVRTFReaderProperties.Create;
  955.   Result := FRTFReadProperties;
  956. end;
  957. {------------------------------------------------------------------------------}
  958. procedure TCustomRichView.SetRTFReadProperties(const Value: TRVRTFReaderProperties);
  959. begin
  960.   if Value=nil then begin
  961.     FRTFReadProperties.Free;
  962.     FRTFReadProperties := nil;
  963.     end
  964.   else begin
  965.     RTFReadProperties.Assign(Value);
  966.   end;
  967. end;
  968. {------------------------------------------------------------------------------}
  969. function TCustomRichView.RTFReaderAssigned: Boolean;
  970. begin
  971.   Result := FRTFReadProperties<>nil;
  972. end;
  973. {------------------------------------------------------------------------------}
  974. procedure TCustomRichView.AssignEvents(Source: TCustomRichView);
  975. begin
  976.   OnSaveComponentToFile := Source.OnSaveComponentToFile;
  977.   OnSaveItemToFile     := Source.OnSaveItemToFile;
  978.   OnSaveParaToHTML     := Source.OnSaveParaToHTML;
  979.   OnURLNeeded          := Source.OnURLNeeded;
  980.   OnSelect             := Source.OnSelect;
  981.   OnImportPicture      := Source.OnImportPicture;
  982.   OnRVRightClick       := Source.OnRVRightClick;
  983.   OnRVFPictureNeeded   := Source.OnRVFPictureNeeded;
  984.   OnRVFImageListNeeded := Source.OnRVFImageListNeeded;
  985.   OnRVFControlNeeded   := Source.OnRVFControlNeeded;
  986.   OnRVDblClick         := Source.OnRVDblClick;
  987.   OnJump               := Source.OnJump;
  988.   OnRVMouseMove        := Source.OnRVMouseMove;
  989.   OnCopy               := Source.OnCopy;
  990.   OnRVMouseDown        := Source.OnRVMouseDown;
  991.   OnRVMouseUp          := Source.OnRVMouseUp;
  992.   OnControlAction      := Source.OnControlAction;
  993.   OnItemAction         := Source.OnItemAction;
  994.   OnClick              := Source.OnClick;
  995.   OnKeyDown            := Source.OnKeyDown;
  996.   OnKeyUp              := Source.OnKeyUp;
  997.   OnKeyPress           := Source.OnKeyPress;
  998.   OnHTMLSaveImage      := Source.OnHTMLSaveImage;
  999.   OnSaveImage2         := Source.OnSaveImage2;
  1000.   OnDblClick           := Source.OnDblClick;
  1001.   OnItemHint           := Source.OnItemHint;
  1002.   OnReadHyperlink      := Source.OnReadHyperlink;
  1003.   // OnCheckpointVisible  := Source.OnCheckpointVisible;
  1004. end;
  1005. {------------------------------------------------------------------------------}
  1006. procedure TCustomRichView.DeleteUnusedStyles(TextStyles, ParaStyles, ListStyles: Boolean);
  1007. begin
  1008.   RVData.DeleteUnusedStyles(TextStyles, ParaStyles, ListStyles);
  1009. end;
  1010. {------------------------------------------------------------------------------}
  1011. procedure TCustomRichView.MarkStylesInUse(Data: TRVDeleteUnusedStylesData);
  1012. begin
  1013.   RVData.MarkStylesInUse(Data);
  1014. end;
  1015. {------------------------------------------------------------------------------}
  1016. procedure TCustomRichView.DeleteMarkedStyles(Data: TRVDeleteUnusedStylesData);
  1017. begin
  1018.   RVData.DeleteMarkedStyles(Data);
  1019. end;
  1020. {------------------------------------------------------------------------------}
  1021. { Gets item's property of integer type.
  1022.   ItemNo - index of item. Prop identifies the property. Value receives a
  1023.   property value.
  1024.   Returns true is this item type has this property                             }
  1025. function TCustomRichView.GetItemExtraIntProperty(ItemNo: Integer;
  1026.   Prop: TRVExtraItemProperty; var Value: Integer): Boolean;
  1027. begin
  1028.   Result := RVData.GetItemExtraIntProperty(ItemNo, Prop, Value);
  1029. end;
  1030. {------------------------------------------------------------------------------}
  1031. { Sets item's property of integer type.
  1032.   ItemNo - index of item. Prop identifies the property. Value - new property
  1033.   value.
  1034.   Returns true is this item type has this property                             }
  1035. function TCustomRichView.SetItemExtraIntProperty(ItemNo: Integer;
  1036.   Prop: TRVExtraItemProperty; Value: Integer): Boolean;
  1037. begin
  1038.   Result := RVData.SetItemExtraIntProperty(ItemNo, Prop, Value);
  1039. end;
  1040. {------------------------------------------------------------------------------}
  1041. { Gets item's property of string type.
  1042.   ItemNo - index of item. Prop identifies the property. Value receives a
  1043.   property value.
  1044.   Returns true is this item type has this property                             }
  1045. function TCustomRichView.GetItemExtraStrProperty(ItemNo: Integer;
  1046.   Prop: TRVExtraItemStrProperty; var Value: String): Boolean;
  1047. begin
  1048.   Result := RVData.GetItemExtraStrProperty(ItemNo, Prop, Value);
  1049. end;
  1050. {------------------------------------------------------------------------------}
  1051. { Sets item's property of string type.
  1052.   ItemNo - index of item. Prop identifies the property. Value - new property
  1053.   value.
  1054.   Returns true is this item type has this property                             }
  1055. function TCustomRichView.SetItemExtraStrProperty(ItemNo: Integer;
  1056.   Prop: TRVExtraItemStrProperty; const Value: String): Boolean;
  1057. begin
  1058.   Result := RVData.SetItemExtraStrProperty(ItemNo, Prop, Value);
  1059. end;
  1060. {------------------------------------------------------------------------------}
  1061. procedure TCustomRichView.AssignSoftPageBreaks(RVPrint: TComponent);
  1062. begin
  1063.   RVData.AssignSoftPageBreaks(RVPrint as TCustomRVPrint);
  1064. end;
  1065. {------------------------------------------------------------------------------}
  1066. procedure TCustomRichView.ClearSoftPageBreaks;
  1067. begin
  1068.   if RVData.ClearSoftPageBreaks then
  1069.     Invalidate;
  1070. end;
  1071. {------------------------------------------------------------------------------}
  1072. {$IFNDEF RVDONOTUSELISTS}
  1073. function TCustomRichView.SetListMarkerInfo(AItemNo, AListNo, AListLevel,
  1074.   AStartFrom, AParaNo: Integer; AUseStartFrom: Boolean): Integer;
  1075. begin
  1076.   Result := RVData.SetListMarkerInfo(AItemNo, AListNo, AListLevel, AStartFrom,
  1077.     AParaNo, AUseStartFrom)
  1078. end;
  1079. {------------------------------------------------------------------------------}
  1080. procedure TCustomRichView.RemoveListMarker(ItemNo: Integer);
  1081. begin
  1082.   RVData.RemoveListMarker(ItemNo);
  1083. end;
  1084. {------------------------------------------------------------------------------}
  1085. function TCustomRichView.GetListMarkerInfo(AItemNo: Integer; var AListNo,
  1086.   AListLevel, AStartFrom: Integer; var AUseStartFrom: Boolean): Integer;
  1087. begin
  1088.   Result := RVData.GetListMarkerInfo(AItemNo, AListNo, AListLevel, AStartFrom,
  1089.     AUseStartFrom);
  1090. end;
  1091. {------------------------------------------------------------------------------}
  1092. procedure TCustomRichView.RefreshListMarkers;
  1093. var Markers: TRVMarkerList;
  1094. begin
  1095.   Markers := RVData.GetMarkers(False);
  1096.   if (Markers<>nil) and (Style<>nil) then
  1097.     Markers.RecalcDisplayStrings(Style);
  1098. end;
  1099. {$ENDIF}
  1100. {------------------------------------------------------------------------------}
  1101. function TCustomRichView.GetLineNo(ItemNo, ItemOffs: Integer): Integer;
  1102. begin
  1103.   Result := RVData.GetLineNo(ItemNo, ItemOffs);
  1104. end;
  1105. {------------------------------------------------------------------------------}
  1106. procedure TCustomRichView.WMRVEvent(var Message: TMessage);
  1107. var data: TRVMessageData;
  1108. begin
  1109.   data := TRVMessageData(Message.wParam);
  1110.   case data.Event of
  1111.     rvetDragDrop:
  1112.       with TRVDNDMessageData(data) do
  1113.         DragDrop(Obj,X,Y);
  1114.     rvetEndDrag:
  1115.       with TRVDNDMessageData(data) do
  1116.         DoEndDrag(Obj,X,Y);
  1117.     rvetClick:
  1118.       Click;
  1119.     rvetDblClick:
  1120.       DblClick;
  1121.     rvetMouseMove:
  1122.       with TRVMouseMoveMessageData(data) do
  1123.         MouseMove(Shift, X, Y);
  1124.     rvetRVDblClick:
  1125.       RVData.DoRVDblClick(TRVDblClickMessageData(data).ClickedWord,
  1126.                           TRVDblClickMessageData(data).StyleNo);
  1127.     rvetJump:
  1128.       RVData.DoJump(TRVJumpMessageData(data).id);
  1129.     rvetRVMouseUp:
  1130.       with TRVMouseUpDownMessageData(data) do
  1131.         RVData.DoRVMouseUp(Button,Shift,ItemNo,X,Y);
  1132.     rvetRVMouseDown:
  1133.       with TRVMouseUpDownMessageData(data) do
  1134.         RVData.DoRVMouseDown(Button,Shift,ItemNo,X,Y);
  1135.   end;
  1136.   data.Free;
  1137. end;
  1138. {------------------------------------------------------------------------------}
  1139. procedure TCustomRichView.SetName(const NewName: TComponentName);
  1140. var reg: TRegistry;
  1141.   procedure SetRVFOption(Value: Boolean; Option: TRVFOption);
  1142.   begin
  1143.     if Value then
  1144.       RVFOptions := RVFOptions + [Option]
  1145.     else
  1146.       RVFOptions := RVFOptions - [Option];
  1147.   end;
  1148. begin
  1149.   if (csDesigning in ComponentState) and
  1150.      not (csLoading in ComponentState) and
  1151.      (Name=EmptyStr) and
  1152.      not (rvstNameSet in RVData.State) then begin
  1153.     //Application.MessageBox('Applying!','');
  1154.     try
  1155.       reg := TRegistry.Create;
  1156.       try
  1157.         if reg.OpenKey('SoftwareTRichView', False) then begin
  1158.           try
  1159.             case reg.ReadInteger('Styles') of
  1160.               0:
  1161.               begin
  1162.                 RVFTextStylesReadMode := rvf_sInsertMap;
  1163.                 RVFParaStylesReadMode := rvf_sInsertMap;
  1164.                 RVFOptions := RVFOptions-[rvfoSaveTextStyles, rvfoSaveParaStyles];
  1165.                 RTFReadProperties.TextStyleMode := rvrsUseClosest;
  1166.                 RTFReadProperties.ParaStyleMode := rvrsUseClosest;
  1167.               end;
  1168.               1:
  1169.               begin
  1170.                 RVFTextStylesReadMode := rvf_sInsertMerge;
  1171.                 RVFParaStylesReadMode := rvf_sInsertMerge;
  1172.                 RVFOptions := RVFOptions+[rvfoSaveTextStyles, rvfoSaveParaStyles];
  1173.                 RTFReadProperties.TextStyleMode := rvrsAddIfNeeded;
  1174.                 RTFReadProperties.ParaStyleMode := rvrsAddIfNeeded;
  1175.               end;
  1176.             end;
  1177.           except;
  1178.             RVFTextStylesReadMode := rvf_sInsertMerge;
  1179.             RVFParaStylesReadMode := rvf_sInsertMerge;
  1180.             RVFOptions := RVFOptions+[rvfoSaveTextStyles, rvfoSaveParaStyles];
  1181.             RTFReadProperties.TextStyleMode := rvrsAddIfNeeded;
  1182.             RTFReadProperties.ParaStyleMode := rvrsAddIfNeeded;
  1183.           end;
  1184.           try
  1185.             case reg.ReadInteger('Tags') of
  1186.               0:
  1187.               begin
  1188.                 Options := Options-[rvoTagsArePChars];
  1189.               end;
  1190.               1:
  1191.               begin
  1192.                 Options := Options+[rvoTagsArePChars];
  1193.               end;
  1194.             end;
  1195.           except;
  1196.           end;
  1197.           try
  1198.             SetRVFOption(reg.ReadBool('rvf01'), rvfoSaveBack);
  1199.             SetRVFOption(reg.ReadBool('rvf02'), rvfoSaveLayout);
  1200.             SetRVFOption(reg.ReadBool('rvf03'), rvfoSaveBinary);
  1201.             SetRVFOption(reg.ReadBool('rvf04'), rvfoSavePicturesBody);
  1202.             SetRVFOption(reg.ReadBool('rvf05'), rvfoSaveControlsBody);
  1203.             SetRVFOption(reg.ReadBool('rvf06'), rvfoLoadBack);
  1204.             SetRVFOption(reg.ReadBool('rvf07'), rvfoLoadLayout);
  1205.             SetRVFOption(reg.ReadBool('rvf08'), rvfoIgnoreUnknownPicFmt);
  1206.             SetRVFOption(reg.ReadBool('rvf09'), rvfoIgnoreUnknownCtrls);
  1207.             SetRVFOption(reg.ReadBool('rvf10'), rvfoConvUnknownStylesToZero);
  1208.             SetRVFOption(reg.ReadBool('rvf11'), rvfoConvLargeImageIdxToZero);
  1209.             SetRVFOption(reg.ReadBool('rvf12'), rvfoSaveDocProperties);
  1210.             SetRVFOption(reg.ReadBool('rvf13'), rvfoLoadDocProperties);
  1211.           except;
  1212.           end;
  1213.         end;
  1214.       finally
  1215.         reg.Free;
  1216.       end;
  1217.     except
  1218.     end;
  1219.   end;
  1220.   RVData.State := RVData.State+[rvstNameSet];
  1221.   inherited;
  1222. end;
  1223. {------------------------------------------------------------------------------}
  1224. procedure TCustomRichView.AfterCreateWnd1;
  1225. begin
  1226.   if (RVData=nil) or (RVData.Items=nil) or (RVData.Items.Count=0) then
  1227.     inherited;
  1228. end;
  1229. {------------------------------------------------------------------------------}
  1230. procedure TCustomRichView.AfterCreateWnd2;
  1231. begin
  1232.   if (RVData<>nil) and (RVData.Items<>nil) and (RVData.Items.Count>0) then
  1233.     Format_(True, False, Canvas, False, False, False)
  1234.   else
  1235.     inherited;
  1236. end;
  1237. {------------------------------------------------------------------------------}
  1238. function TCustomRichView.StoreDelimiters: Boolean;
  1239. begin
  1240.   Result := FDelimiters<>RVDEFAULTDELIMITERS;
  1241. end;
  1242. {------------------------------------------------------------------------------}
  1243. function TCustomRichView.GetItemAt(X, Y: Integer;
  1244.   var RVData: TCustomRVFormattedData; var ItemNo, OffsetInItem: Integer;
  1245.   Strict: Boolean): Boolean;
  1246. var Dummy: Boolean;
  1247. begin
  1248.   Self.RVData.GetItemAtEx(X,Y,RVData,ItemNo,OffsetInItem,Strict,Dummy);
  1249.   Result := ItemNo<>-1;
  1250. end;
  1251. {------------------------------------------------------------------------------}
  1252. procedure TCustomRichView.WMRVDragDrop(var Message: TMessage);
  1253. begin
  1254.   {$IFNDEF RVDONOTUSEDRAGDROP}
  1255.   RVData.DoDrag;
  1256.   {$ENDIF}
  1257. end;
  1258. {------------------------------------------------------------------------------}
  1259. {$IFNDEF RVDONOTUSEDRAGDROP}
  1260. procedure TCustomRichView.BeginOleDrag;
  1261. begin
  1262.   PostMessage(RVData.GetAbsoluteRootData.GetParentControl.Handle, WM_RVDRAGDROP,
  1263.     0, 0);
  1264. end;
  1265. {$ENDIF}
  1266. {------------------------------------------------------------------------------}
  1267. { Converts client coordinates (relative to the top left of window)
  1268.   to document coordinates (relative to the top left of scrollable area). }
  1269. function TCustomRichView.ClientToDocument(const APoint: TPoint): TPoint;
  1270. var X, Y: Integer;
  1271. begin
  1272.   RVData.GetOriginEx(X, Y);
  1273.   Result := Point(APoint.X-X+RVData.GetHOffs, APoint.Y-Y+RVData.GetVOffs);
  1274. end;
  1275. {------------------------------------------------------------------------------}
  1276. { Invalidates RichView and all its inplace editors. }
  1277. procedure TCustomRichView.FullInvalidate;
  1278. var rv: TCustomRichView;
  1279. begin
  1280.   rv := Self;
  1281.   while rv<>nil do begin
  1282.     if not rv.HandleAllocated or (csDestroying in rv.ComponentState) then
  1283.       exit;
  1284.     rv.Invalidate;
  1285.     rv := TCustomRichView(rv.InplaceEditor);
  1286.   end;
  1287. end;
  1288. {------------------------------------------------------------------------------}
  1289. {$IFNDEF RVDONOTUSELIVESPELL}
  1290. {------------------------------------------------------------------------------}
  1291. { Clears results of live spelling by calling ClearItemLiveSpellingResults for
  1292.   all items. }
  1293. procedure TCustomRichView.DoClearLiveSpellingResults;
  1294. var Dummy1: Integer;
  1295.     Dummy2: String;
  1296. begin
  1297.   Dummy1 := 0;
  1298.   Dummy2 := '';
  1299.   RVData.EnumItems(ClearItemLiveSpellingResults, Dummy1, Dummy2);
  1300. end;
  1301. {------------------------------------------------------------------------------}
  1302. { Clears live spelling results for the given item. Called from inside
  1303.   RVData.EnumItems from DoClearLiveSpellingResults. }
  1304. procedure TCustomRichView.ClearItemLiveSpellingResults(RVData: TCustomRVData;
  1305.   ItemNo: Integer; var UserData1: Integer; const UserData2: String;
  1306.   var ContinueEnum: Boolean);
  1307. begin
  1308.   RVData.GetItem(ItemNo).ClearLiveSpellingResult;
  1309. end;
  1310. {------------------------------------------------------------------------------}
  1311. { Marks AWord as a valid word: removes misspelling underlines from all
  1312.   occurences of this word by calling LiveSpellingValidateWordInItem for all items.
  1313.   Case sensitive.
  1314.   This procedure should be called after adding this word in a dictinary or
  1315.   ignore list.
  1316.   Repaints RichView. }
  1317. procedure TCustomRichView.LiveSpellingValidateWord(const AWord: String);
  1318. var Res: Integer;
  1319. begin
  1320.   Res := 0;
  1321.   RVData.EnumItems(LiveSpellingValidateWordInItem, Res, AWord);
  1322.   if Res<>0 then
  1323.     FullInvalidate;
  1324. end;
  1325. {------------------------------------------------------------------------------}
  1326. { Marks AWord as a valid word: removes misspelling underlines from all
  1327.   occurences of this word in the given item. Called from inside
  1328.   RVData.EnumItems from LiveSpellingValidateWord. }
  1329. procedure TCustomRichView.LiveSpellingValidateWordInItem(RVData: TCustomRVData;
  1330.   ItemNo: Integer; var UserData1: Integer; const UserData2: String;
  1331.   var ContinueEnum: Boolean);
  1332. begin
  1333.   if RVData.GetItem(ItemNo).ValidateMisspelledWord(RVData.GetItemTextA(ItemNo),
  1334.     UserData2) then
  1335.     UserData1 := 1;
  1336. end;
  1337. {------------------------------------------------------------------------------}
  1338. { Starts live spelling. }
  1339. procedure TCustomRichView.StartLiveSpelling;
  1340. begin
  1341.   if not (rvflRoot in Flags) or not Assigned(FOnSpellingCheck) or (Style=nil) then
  1342.     exit;
  1343.   if FWordEnumThread=nil then
  1344.     FWordEnumThread := TRVWordEnumThread.Create
  1345.   else
  1346.     FWordEnumThread.Stop(True);
  1347.   DoClearLiveSpellingResults;
  1348.   FWordEnumThread.Reset(Self);
  1349.   FWordEnumThread.Priority := tpLowest;
  1350.   FWordEnumThread.Resume;
  1351. end;
  1352. {------------------------------------------------------------------------------}
  1353. { Clears live spelling results and stops live spelling. }
  1354. procedure TCustomRichView.ClearLiveSpellingResults;
  1355. begin
  1356.   if FWordEnumThread<>nil then begin
  1357.     //FWordEnumThread.Stop(True);
  1358.     //FWordEnumThread.Reset(Self);
  1359.     FWordEnumThread.Finish;
  1360.     FWordEnumThread.Reset(nil);
  1361.     FWordEnumThread := nil;
  1362.     DoClearLiveSpellingResults;
  1363.     FullInvalidate;
  1364.   end;
  1365. end;
  1366. {------------------------------------------------------------------------------}
  1367. { Calls LaterSetBackTo for live spelling thread for absolute root RichView. }
  1368. procedure TCustomRichView.LaterSetBackLiveSpellingTo(RVData: TCustomRVData;
  1369.   ItemNo, Offs: Integer);
  1370. var rv: TCustomRichView;
  1371. begin
  1372.   rv := TCustomRichView(TRichViewRVData(Self.RVData.GetAbsoluteRootData).RichView);
  1373.   if rv.FWordEnumThread<>nil then
  1374.     rv.FWordEnumThread.LaterSetBackTo(RVData.GetSourceRVData, ItemNo, Offs);
  1375. end;
  1376. {------------------------------------------------------------------------------}
  1377. { Calls RemoveRVData for live spelling thread for absolute root RichView. }
  1378. procedure TCustomRichView.RemoveRVDataFromLiveSpelling(RVData: TCustomRVData);
  1379. var rv: TCustomRichView;
  1380. begin
  1381.   rv := TCustomRichView(TRichViewRVData(Self.RVData.GetAbsoluteRootData).RichView);
  1382.   if rv.FWordEnumThread<>nil then
  1383.     rv.FWordEnumThread.RemoveRVData(RVData);
  1384. end;
  1385. {------------------------------------------------------------------------------}
  1386. { This method is called when user types character ch. This character was inserted
  1387.   in (RVData, ItemNo, Index).
  1388.   Adjusts misspellings in item (clears for the affected word, shifts for words
  1389.   after it). If delimiter was pressed, or if some misspelling was cleared,
  1390.   returns the thread to the caret position. }
  1391. procedure TCustomRichView.AdjustLiveSpellingOnKeyPress(RVData: TCustomRVData;
  1392.   ItemNo, Index: Integer; ch: Char);
  1393. var rv: TCustomRichView;
  1394. begin
  1395.   rv := TCustomRichView(TRichViewRVData(Self.RVData.GetAbsoluteRootData).RichView);
  1396.   if (rv.FWordEnumThread<>nil) and rv.FWordEnumThread.IsChecked(RVData, ItemNo) then begin
  1397.     if RVData.GetRVData.GetItem(ItemNo).AdjustWordPaintersOnInsert(Index, ch, RVData) then begin
  1398.       rv.FWordEnumThread.HasModifiedWord := False;
  1399.       rv.FWordEnumThread.CheckUnchecked := True;
  1400.       rv.FWordEnumThread.LaterSetBackTo(RVData.GetSourceRVData, ItemNo, 0);
  1401.       end
  1402.     else
  1403.       rv.FWordEnumThread.HasModifiedWord := True;
  1404.   end;
  1405. end;
  1406. {------------------------------------------------------------------------------}
  1407. { This method is called when user deletes Count characters starting from Index
  1408.   in (RVData, ItemNo).
  1409.   Adjusts misspellings in item (clears for the affected word, shifts for words
  1410.   after it). Returns the thread to the caret position. }
  1411. procedure TCustomRichView.AdjustLiveSpellingOnDelete(RVData: TCustomRVData;
  1412.   ItemNo, Index, Count: Integer);
  1413. var rv: TCustomRichView;
  1414. begin
  1415.   rv := TCustomRichView(TRichViewRVData(Self.RVData.GetAbsoluteRootData).RichView);
  1416.   if (rv.FWordEnumThread<>nil) and rv.FWordEnumThread.IsChecked(RVData.GetSourceRVData, ItemNo) then begin
  1417.     if RVData.GetItem(ItemNo).AdjustWordPaintersOnDelete(Index, Count) then begin
  1418.       rv.FWordEnumThread.HasModifiedWord := False;
  1419.       rv.FWordEnumThread.CheckUnchecked := True;
  1420.       rv.FWordEnumThread.LaterSetBackTo(RVData.GetSourceRVData, ItemNo, 0);
  1421.       end
  1422.     else
  1423.       rv.FWordEnumThread.HasModifiedWord := True;
  1424.   end;
  1425. end;
  1426. {------------------------------------------------------------------------------}
  1427. { Continues live spelling stopped by FWordEnumThread.Stop }
  1428. procedure TCustomRichView.ResumeLiveSpelling;
  1429. begin
  1430.   if FWordEnumThread<>nil then begin
  1431.     FWordEnumThread.Stop(False);
  1432.     FWordEnumThread.ContinueCheck;
  1433.   end;
  1434. end;
  1435. {------------------------------------------------------------------------------}
  1436. { Returns live spelling position to the current item (RVData, ItemNo), if
  1437.   thread's HasModifiedWord=True.
  1438.   This method is called when selection is about to change. }
  1439. procedure TCustomRichView.LiveSpellingCheckCurrentItem(RVData: TCustomRVData;
  1440.   ItemNo: Integer);
  1441. var rv: TCustomRichView;
  1442. begin
  1443.   rv := TCustomRichView(TRichViewRVData(Self.RVData.GetAbsoluteRootData).RichView);
  1444.   if rv.FWordEnumThread<>nil then
  1445.     with rv.FWordEnumThread do
  1446.       if HasModifiedWord then begin
  1447.         Stop(True);
  1448.         HasModifiedWord := False;
  1449.         CheckUnchecked := True;
  1450.         LaterSetBackTo(RVData.GetSourceRVData, ItemNo, 0);
  1451.         ContinueCheck;
  1452.       end;
  1453. end;
  1454. {$ENDIF}
  1455. {------------------------------------------------------------------------------}
  1456. { TCustomRichViewEdit overrides this method to display a popup menu below
  1457.   the clicked misspelled word.
  1458.   Pt contains coordinates in document. }
  1459. procedure TCustomRichView.AdjustPopupMenuPos(var pt: TPoint);
  1460. begin
  1461. end;
  1462. {$IFNDEF RVDONOTUSEANIMATION}
  1463. {------------------------------------------------------------------------------}
  1464. { Starts playing animation }
  1465. procedure TCustomRichView.StartAnimation;
  1466. begin
  1467.   TRichViewRVData(RVData).FPlayingAnimation := True;
  1468.   if (TRichViewRVData(RVData).FAnimatorList<>nil) and
  1469.      (TRichViewRVData(RVData).FAnimatorList.Count>0) and
  1470.      not TRichViewRVData(RVData).FAnimatorList.Active then begin
  1471.     TRichViewRVData(RVData).FAnimatorList.Active := True;
  1472.     TRichViewRVData(RVData).FAnimatorList.LastMinInterval :=
  1473.       TRichViewRVData(RVData).FAnimatorList.MinInterval;
  1474.     SetTimer(Handle, RV_TIMERID_ANIMATION, TRichViewRVData(RVData).FAnimatorList.MinInterval, nil);
  1475.   end;
  1476. end;
  1477. {------------------------------------------------------------------------------}
  1478. { Stops playing animation }
  1479. procedure TCustomRichView.StopAnimation;
  1480. begin
  1481.   TRichViewRVData(RVData).FPlayingAnimation := False;
  1482.   if HandleAllocated and
  1483.      (TRichViewRVData(RVData).FAnimatorList<>nil) and
  1484.      TRichViewRVData(RVData).FAnimatorList.Active then begin
  1485.     TRichViewRVData(RVData).FAnimatorList.Active := False;
  1486.     KillTimer(Handle, RV_TIMERID_ANIMATION);
  1487.   end;
  1488. end;
  1489. {------------------------------------------------------------------------------}
  1490. { Frees all animators }
  1491. procedure TCustomRichView.KillAnimators;
  1492. begin
  1493.   StopAnimation;
  1494.   if TRichViewRVData(RVData).FAnimatorList<>nil then begin
  1495.     TRichViewRVData(RVData).FAnimatorList.FreeAnimators;
  1496.     TRichViewRVData(RVData).FAnimatorList.Free;
  1497.     TRichViewRVData(RVData).FAnimatorList := nil;
  1498.   end;
  1499. end;
  1500. {------------------------------------------------------------------------------}
  1501. { WRITE method for AnimationMode property.
  1502.   Assigning to rvaniDisabled, then all animators are freed }
  1503. procedure TCustomRichView.SetAnimationMode(const Value: TRVAnimationMode);
  1504. begin
  1505.   if FAnimationMode<>Value then begin
  1506.     FAnimationMode := Value;
  1507.     case FAnimationMode of
  1508.       rvaniDisabled:
  1509.         KillAnimators;
  1510.     end;
  1511.   end;
  1512. end;
  1513. {------------------------------------------------------------------------------}
  1514. procedure TCustomRichView.CMColorChanged(var Message: TMessage);
  1515. begin
  1516.   if TRichViewRVData(RVData).FAnimatorList<>nil then
  1517.     RVData.ResetAniBackground;
  1518.   inherited;
  1519. end;
  1520. {$ENDIF}
  1521. {------------------------------------------------------------------------------}
  1522. {$IFNDEF RVDONOTUSELINEARPOSITIONS}
  1523. procedure TCustomRichView.EMGetSel(var Message: TMessage);
  1524. var SelStart, SelLength, Sel1, Sel2: Integer;
  1525. begin
  1526.   RVGetSelection(Self, SelStart, SelLength);
  1527.   if SelLength>=0 then begin
  1528.     Sel1 := SelStart;
  1529.     Sel2 := SelStart+SelLength;
  1530.     end
  1531.   else begin
  1532.     Sel1 := SelStart+SelLength;
  1533.     Sel2 := SelStart;
  1534.   end;
  1535.   PInteger(Message.WParam)^ := Sel1;
  1536.   PInteger(Message.LParam)^ := Sel2;
  1537.   Message.Result := MakeLong(Sel1, Sel2);
  1538. end;
  1539. {------------------------------------------------------------------------------}
  1540. procedure TCustomRichView.EMSetSel(var Message: TMessage);
  1541. begin
  1542.   RVSetSelection(Self, Message.WParam, Message.LParam-Message.WParam);
  1543.   Invalidate;
  1544. end;
  1545. {------------------------------------------------------------------------------}
  1546. type
  1547.   TRVCharRange = record
  1548.     cpMin: Longint;
  1549.     cpMax: LongInt;
  1550.   end;
  1551.   TRVTextRange = record
  1552.     chrg: TRVCharRange;
  1553.     lpstrText: PChar;
  1554.   end;
  1555.   PRVTextRange = ^TRVTextRange;
  1556. procedure TCustomRichView.EMGetTextRange(var Message: TMessage);
  1557. var ptr: PRVTextRange;
  1558.     s: String;
  1559.     Len: Integer;
  1560. begin
  1561.   Message.Result := 0;
  1562.   ptr := PRVTextRange(Message.LParam);
  1563.   if ptr.lpstrText=nil then
  1564.     exit;
  1565.   if ptr.chrg.cpMax<0 then
  1566.     Len := -1
  1567.   else
  1568.     Len := ptr.chrg.cpMax-ptr.chrg.cpMin;
  1569.   s := RVGetTextRange(Self, ptr.chrg.cpMin, Len);
  1570.   Move(PChar(s)^, Pointer(ptr.lpstrText)^, Length(s)+1);
  1571.   Message.Result := Length(s);
  1572. end;
  1573. {------------------------------------------------------------------------------}
  1574. {$IFNDEF RICHVIEWDEF9}
  1575. procedure TCustomRichView.WMGetText(var Message: TMessage);
  1576. var s: String;
  1577.     Len: Integer;
  1578. begin
  1579.   if rvflCanProcessGetText in Flags then begin
  1580.     if (Message.WParam<=0) or (ItemCount=0) then begin
  1581.       Message.Result := 0;
  1582.       exit;
  1583.     end;
  1584.     s := RVGetTextRange(Self, 0, -1);
  1585.     Len := Length(s)+1;
  1586.     if Message.WParam<Len then
  1587.       Len := Message.WParam;
  1588.     if Message.LParam<>0 then
  1589.       Move(PChar(s)^, Pointer(Message.LParam)^, Len);
  1590.     Message.Result := Len-1;
  1591.     end
  1592.   else
  1593.     inherited;
  1594. end;
  1595. {------------------------------------------------------------------------------}
  1596. procedure TCustomRichView.WMGetTextLength(var Message: TMessage);
  1597. begin
  1598.   if rvflCanProcessGetText in Flags then begin
  1599.     if ItemCount=0 then
  1600.       Message.Result := 0
  1601.     else
  1602.       Message.Result := RVGetTextLength(Self);
  1603.     end
  1604.   else
  1605.     inherited;
  1606. end;
  1607. {------------------------------------------------------------------------------}
  1608. procedure TCustomRichView.WMSetText(var Message: TMessage);
  1609. var s: String;
  1610. begin
  1611.   if rvflCanProcessGetText in Flags then begin
  1612.     if (Message.WParam<=0) or (Message.LParam=0) then begin
  1613.       Message.Result := 0;
  1614.       exit;
  1615.     end;
  1616.     SetLength(s, Message.WParam-1);
  1617.     Move(Pointer(Message.LParam)^, PChar(s)^, Message.WParam-1);
  1618.     Clear;
  1619.     AddTextNLA(s, 0, 0, 0);
  1620.     Format;
  1621.     end
  1622.   else
  1623.     inherited;
  1624. end;
  1625. {$ENDIF}
  1626. {$ENDIF}
  1627. {------------------------------------------------------------------------------}
  1628. function TCustomRichView.LoadFromStream(Stream: TStream;
  1629.   IsTextUnicode: TRVYesNoAuto): Boolean;
  1630. var s: String;
  1631.   {...................................................}
  1632.   {$IFNDEF RVDONOTUSERTFIMPORT}
  1633. const RTF_START = '{rtf';
  1634.   function IsRTF(Stream: TStream): Boolean;
  1635.   var DataStart: String;
  1636.   begin
  1637.     Result := (Stream.Size>5);
  1638.     if not Result then
  1639.       exit;
  1640.     SetLength(DataStart,5);
  1641.     Stream.ReadBuffer(PChar(DataStart)^,5);
  1642.     Result := DataStart=RTF_START;
  1643.     Stream.Position := 0;
  1644.   end;
  1645.   {$ENDIF}
  1646.   {...................................................}
  1647.   function AllZero(const s: String):Boolean;
  1648.   var i: Integer;
  1649.   begin
  1650.     Result := False;
  1651.     for i := 1 to Length(s) do
  1652.       if s[i]<>#0 then
  1653.         exit;
  1654.     Result := True;
  1655.   end;
  1656.   {...................................................}
  1657. var StartPos: Integer;
  1658. begin
  1659.   Clear;
  1660.   StartPos := Stream.Position;
  1661.   {$IFNDEF RVDONOTUSERVF}
  1662.   Result := LoadRVFFromStream(Stream);
  1663.   {$ELSE}
  1664.   Result := False;
  1665.   {$ENDIF}
  1666.   if not Result then begin
  1667.     {$IFNDEF RVDONOTUSERTFIMPORT}
  1668.     Stream.Position := StartPos;
  1669.     Result := IsRTF(Stream) and LoadRTFFromStream(Stream);
  1670.     if not Result then
  1671.     {$ENDIF}
  1672.     begin
  1673.       Stream.Position := StartPos;
  1674.       SetLength(s, Stream.Size);
  1675.       Stream.ReadBuffer(PChar(s)^,Stream.Size);
  1676.       if AllZero(s) then
  1677.         s := '';
  1678.       {$IFNDEF RVDONOTUSEUNICODE}
  1679.       case IsTextUnicode of
  1680.         rvynaYes:
  1681.           RVData.AddTextNLW(s, 0,0,0, False);
  1682.         rvynaNo:
  1683.           RVData.AddTextNLA(s, 0,0,0);
  1684.         rvynaAuto:
  1685.           if RV_TestStringUnicode(s)=rvutYes then
  1686.             RVData.AddTextNLW(s, 0,0,0, False)
  1687.           else
  1688.             RVData.AddTextNLA(s, 0,0,0);
  1689.       end;
  1690.       {$ELSE}
  1691.         RVData.AddTextNL(s, 0,0,0);
  1692.       {$ENDIF}
  1693.     end;
  1694.   end;
  1695. end;
  1696. {------------------------------------------------------------------------------}
  1697. {$IFNDEF RVDONOTUSESMARTPOPUP}
  1698. function TCustomRichView.GetSmartPopupProperties: TRVSmartPopupProperties;
  1699. begin
  1700.   if FSmartPopupProperties=nil then begin
  1701.     FSmartPopupProperties := TRVSmartPopupProperties.Create;
  1702.     FSmartPopupProperties.RichView := Self;
  1703.   end;
  1704.   Result := FSmartPopupProperties;
  1705. end;
  1706. {------------------------------------------------------------------------------}
  1707. procedure TCustomRichView.SetSmartPopupProperties(
  1708.   const Value: TRVSmartPopupProperties);
  1709. begin
  1710.   if Value=nil then begin
  1711.     FSmartPopupProperties.Free;
  1712.     FSmartPopupProperties := nil;
  1713.     end
  1714.   else if Value<>FSmartPopupProperties then
  1715.     SmartPopupProperties.Assign(Value);
  1716. end;
  1717. {------------------------------------------------------------------------------}
  1718. procedure TCustomRichView.HideSmartPopup;
  1719. var RootRVData: TRichViewRVData;
  1720. begin
  1721.   RootRVData := TRichViewRVData(RVData.GetAbsoluteRootData);
  1722.   RootRVData.FSmartPopupButton.Free;
  1723.   RootRVData.FSmartPopupButton := nil;
  1724. end;
  1725. {------------------------------------------------------------------------------}
  1726. procedure TCustomRichView.SetSmartPopupTarget;
  1727. begin
  1728. end;
  1729. {------------------------------------------------------------------------------}
  1730. procedure TCustomRichView.ShowSmartPopup;
  1731. var RootRVData: TRichViewRVData;
  1732. begin
  1733.   RootRVData := TRichViewRVData(RVData.GetAbsoluteRootData);
  1734.   if RootRVData.FSmartPopupButton=nil then begin
  1735.     RootRVData.FSmartPopupButton := TRVSmartPopupButton.Create(Self);
  1736.     RootRVData.FSmartPopupButton.SmartPopupProperties := SmartPopupProperties;
  1737.   end;
  1738.   SetSmartPopupTarget;
  1739.   RootRVData.FSmartPopupButton.Parent := RootRVData.RichView;
  1740. end;
  1741. {------------------------------------------------------------------------------}
  1742. function TCustomRichView.GetSmartPopupVisible: Boolean;
  1743. begin
  1744.   Result := TRichViewRVData(RVData).FSmartPopupButton<>nil;
  1745. end;
  1746. {------------------------------------------------------------------------------}
  1747. procedure TCustomRichView.SetSmartPopupVisible(const Value: Boolean);
  1748. begin
  1749.   if not (csDesigning in ComponentState) and Value then
  1750.     ShowSmartPopup
  1751.   else
  1752.     HideSmartPopup;
  1753. end;
  1754. {$ENDIF}
  1755. initialization
  1756. {$IFDEF RVDEBUG}{$I DebugInit.inc}{$ENDIF}
  1757. {$IFDEF RVDEBUG}{$I DebugFinal.inc}{$ENDIF}
  1758. end.