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

RichEdit

开发平台:

Delphi

  1.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  2.     TCustomRichViewEdit(InplaceEditor).RemoveCurrentCheckpoint;
  3.     exit;
  4.   end;
  5.   {$ENDIF}
  6.   RemoveCheckpointEd(CurItemNo);
  7. end;
  8. {------------------------------------------------------------------------------}
  9. function TCustomRichViewEdit.BeforeChange(FromOutside: Boolean): Boolean;
  10. begin
  11.   Result := (not ReadOnly) and (Style<>nil) and
  12.             (FromOutside or (RVData.CaptureMouseItem=nil)) and
  13.             DoChanging;
  14.   if Result then begin
  15.     {$IFNDEF RVDONOTUSELIVESPELL}
  16.     if FWordEnumThread<>nil then begin
  17.       FWordEnumThread.Stop(not (rvstKeyPress in TopLevelEditor.RVData.State));
  18.       if not (rvstKeyPress in TopLevelEditor.RVData.State) then
  19.         FWordEnumThread.SetBackToCurItem(TopLevelEditor.RVData.GetSourceRVData,
  20.           TopLevelEditor.CurItemNo);
  21.     end;
  22.     {$ENDIF}
  23.     TRVEditRVData(RVData).PrepareForEdit;
  24.     ClearSoftPageBreaks;
  25.     end
  26.   else
  27.     TRVEditRVData(RVData).Beep;
  28. end;
  29. {------------------------------------------------------------------------------}
  30. procedure TCustomRichViewEdit.DoChange(ClearRedo: Boolean);
  31. begin
  32.   TRVEditRVData(RVData).CreateResizer;
  33.   Modified := True;
  34.   ClearSoftPageBreaks;
  35.   TRVEditRVData(RVData).ClearJumpsCoords;
  36.   if ClearRedo then
  37.     TRVEditRVData(RVData).RedoList.Clear;
  38.   if (GetRootEditor.LockCount<=0) and Assigned(FOnChange) then
  39.     FOnChange(Self);
  40.   {$IFNDEF RVDONOTUSELIVESPELL}
  41.   if (TRVEditRVData(RVData).UndoList.GroupModeCount<=0) and
  42.      (TRVEditRVData(TopLevelEditor.RVData).UndoList.GroupModeCount<=0) then begin
  43.     if FWordEnumThread<>nil then
  44.       ResumeLiveSpelling
  45.     else if LiveSpellingMode=rvlspOnChange then
  46.       StartLiveSpelling;
  47.   end;
  48.   {$ENDIF}
  49.   {$IFNDEF RVDONOTUSESMARTPOPUP}
  50.   HideSmartPopup;
  51.   {$ENDIF}
  52. end;
  53. {------------------------------------------------------------------------------}
  54. procedure TCustomRichViewEdit.Change;
  55. begin
  56.   DoChange(True);
  57. end;
  58. {------------------------------------------------------------------------------}
  59. procedure TCustomRichViewEdit.BeginUpdate;
  60. begin
  61.   inc(GetRootEditor.LockCount);
  62. end;
  63. {------------------------------------------------------------------------------}
  64. procedure TCustomRichViewEdit.EndUpdate;
  65. begin
  66.   dec(GetRootEditor.LockCount);
  67. end;
  68. {------------------------------------------------------------------------------}
  69. function TCustomRichViewEdit.CanPasteRVF: Boolean;
  70. begin
  71.   Result := Clipboard.HasFormat(CFRV_RVF);
  72. end;
  73. {------------------------------------------------------------------------------}
  74. {$IFNDEF RVDONOTUSERTFIMPORT}
  75. function TCustomRichViewEdit.CanPasteRTF: Boolean;
  76. begin
  77.   Result := Clipboard.HasFormat(CFRV_RTF);
  78. end;
  79. {$ENDIF}
  80. {------------------------------------------------------------------------------}
  81. function TCustomRichViewEdit.CanPaste: Boolean;
  82. begin
  83.   Result := (Clipboard.HasFormat(CF_TEXT) or
  84.           {$IFNDEF RVDONOTUSEUNICODE}
  85.           Clipboard.HasFormat(CF_UNICODETEXT) or
  86.           {$ENDIF}
  87.           Clipboard.HasFormat(CF_BITMAP) or
  88.           Clipboard.HasFormat(CF_METAFILEPICT) or
  89.           {$IFNDEF RVDONOTUSERTFIMPORT}
  90.           Clipboard.HasFormat(CFRV_RTF) or
  91.           {$ENDIF}
  92.           Clipboard.HasFormat(CFRV_RVF));
  93. end;
  94. {------------------------------------------------------------------------------}
  95. procedure TCustomRichViewEdit.Paste;
  96.   {..........................................................}
  97.   procedure PasteRest;
  98.   begin
  99.     {$IFNDEF RVDONOTUSEUNICODE}
  100.     if Clipboard.HasFormat(CF_UNICODETEXT) then begin
  101.       if not Style.TextStyles [CurTextStyleNo].Unicode and
  102.          Clipboard.HasFormat(CF_TEXT) then
  103.         PasteText
  104.       else
  105.         PasteTextW;
  106.       end
  107.     else
  108.     {$ENDIF}
  109.     if Clipboard.HasFormat(CF_TEXT) then
  110.       PasteText
  111.     else if Clipboard.HasFormat(CF_BITMAP) then
  112.       PasteBitmap(False)
  113.     else if Clipboard.HasFormat(CF_METAFILEPICT) then
  114.       PasteMetafile(False)
  115.   end;
  116.   {..........................................................}
  117. var DoDefault: Boolean;
  118. begin
  119.   if not BeforeChange(False) then exit;
  120.   try
  121.     DoDefault := True;
  122.     if Assigned(FOnPaste) then
  123.       FOnPaste(GetRootEditor, DoDefault);
  124.     if not DoDefault then exit;
  125.     if Clipboard.HasFormat(CFRV_RVF) then
  126.       PasteRVF
  127.     {$IFNDEF RVDONOTUSERTFIMPORT}
  128.     else if Clipboard.HasFormat(CFRV_RTF) then begin
  129.       if not PasteRTF then PasteRest;
  130.       end
  131.     {$ENDIF}
  132.     else
  133.       PasteRest;
  134.   except
  135.     TRVEditRVData(RVData).Beep;
  136.   end;
  137. end;
  138. {------------------------------------------------------------------------------}
  139. procedure TCustomRichViewEdit.CutDef;
  140. begin
  141.   if not BeforeChange(False) then exit;
  142.   {$IFDEF RVONCUT}
  143.   if Assigned(FOnCut) then
  144.     FOnCut(GetRootEditor);
  145.   {$ENDIF}
  146.   if CopyDef then DeleteSelection;
  147. end;
  148. {------------------------------------------------------------------------------}
  149. procedure TCustomRichViewEdit.WMCut(var Message: TWMCut);
  150. begin
  151.   CutDef;
  152. end;
  153. {------------------------------------------------------------------------------}
  154. procedure TCustomRichViewEdit.WMPaste(var Message: TWMpaste);
  155. begin
  156.   Paste;
  157. end;
  158. {------------------------------------------------------------------------------}
  159. procedure TCustomRichViewEdit.EMCanPaste(var Message: TMessage);
  160. begin
  161.   Message.Result := 0;
  162.   if ReadOnly then
  163.     exit;
  164.   case Message.WParam of
  165.     0:
  166.       Message.Result := Integer(CanPaste);
  167.     CF_BITMAP, CF_TEXT, CF_UNICODETEXT, CF_METAFILEPICT:
  168.       Message.Result := Integer(Clipboard.HasFormat(Message.WParam));
  169.     else
  170.       {$IFNDEF RVDONOTUSERTFIMPORT}
  171.       if UINT(Message.WParam)=CFRV_RTF then
  172.         Message.Result := Integer(CanPasteRTF)
  173.       else
  174.       {$ENDIF}
  175.       if UINT(Message.WParam)=CFRV_RVF then
  176.         Message.Result := Integer(CanPasteRVF)
  177.   end;
  178. end;
  179. {------------------------------------------------------------------------------}
  180. procedure TCustomRichViewEdit.PasteBitmap(TextAsName: Boolean);
  181. var bmp: TBitmap;
  182.     s: String;
  183. begin
  184.   {$IFNDEF RVDONOTUSEINPLACE}
  185.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  186.     TCustomRichViewEdit(InplaceEditor).PasteBitmap(TextAsName);
  187.     exit;
  188.   end;
  189.   {$ENDIF}
  190.   if not BeforeChange(False) then exit;
  191.   if not Clipboard.HasFormat(CF_BITMAP) then exit;
  192.   bmp := TBitmap.Create;
  193.   bmp.Assign(Clipboard);
  194.   if TextAsName and Clipboard.HasFormat(CF_TEXT) then
  195.     s := Clipboard.AsText
  196.   else
  197.     s := '';
  198.   InsertPicture(s,bmp,rvvaBaseline);
  199. end;
  200. {------------------------------------------------------------------------------}
  201. procedure TCustomRichViewEdit.PasteMetafile(TextAsName: Boolean);
  202. var wmf: TMetafile;
  203.     s: String;
  204.     w,h: Integer;
  205. begin
  206.   {$IFNDEF RVDONOTUSEINPLACE}
  207.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  208.     TCustomRichViewEdit(InplaceEditor).PasteMetafile(TextAsName);
  209.     exit;
  210.   end;
  211.   {$ENDIF}
  212.   if not BeforeChange(False) then exit;
  213.   if not Clipboard.HasFormat(CF_METAFILEPICT) then exit;
  214.   wmf := TMetafile.Create;
  215.   wmf.Assign(Clipboard);
  216.   {$IFNDEF RVDONOTCORRECTWMFSCALE}
  217.   if wmf.Inch=0 then
  218.     wmf.Inch := 1440;
  219.   {$ENDIF}
  220.   w := wmf.Width;
  221.   h := wmf.Height;
  222.   if TextAsName and Clipboard.HasFormat(CF_TEXT) then
  223.     s := Clipboard.AsText
  224.   else
  225.     s := '';
  226.   InsertPicture(s,wmf,rvvaBaseline);
  227.   if (GetCurrentItem is TRVGraphicItemInfo) and
  228.      (TRVGraphicItemInfo(GetCurrentItem).Image = wmf) then begin
  229.     GetCurrentItem.SetExtraIntProperty(rvepImageWidth, w);
  230.     GetCurrentItem.SetExtraIntProperty(rvepImageHeight, h);
  231.   end;
  232. end;
  233. {------------------------------------------------------------------------------}
  234. procedure TCustomRichViewEdit.PasteRVF;
  235. var Stream: TMemoryStream;
  236.     {$IFNDEF RICHVIEWCBDEF3}
  237.     Stream2: TMemoryStream;
  238.     {$ENDIF}
  239.     mem: Cardinal;
  240.     ptr: Pointer;
  241.     Size: Integer;
  242. begin
  243.   if not Clipboard.HasFormat(CFRV_RVF) then exit;
  244.   Clipboard.Open;
  245.   Stream := TMemoryStream.Create;
  246.   try
  247.     mem := Clipboard.GetAsHandle(CFRV_RVF);
  248.     Size := GlobalSize(mem);
  249.     Stream.SetSize(Size);
  250.     ptr := GlobalLock(mem);
  251.     Move(ptr^,Stream.Memory^,Size);
  252.     GlobalUnlock(mem);
  253.     Stream.Position := 0;
  254.     Stream.ReadBuffer(Size, SizeOf(Size));
  255.     {$IFDEF RICHVIEWCBDEF3}
  256.     Stream.SetSize(SizeOf(Size)+Size);
  257.     {$ELSE}
  258.     // Delphi2 and Builder1 clear memory streams inside SetSize
  259.     if (Stream.Size<>SizeOf(Size)+Size) then begin
  260.       Stream2 := TMemoryStream.Create;
  261.       try
  262.         Stream.Position := 0;
  263.         Stream2.CopyFrom(Stream,Stream.Size);
  264.         Stream.SetSize(SizeOf(Size)+Size);
  265.         Stream2.Position := 0;
  266.         Stream2.ReadBuffer(Stream.Memory^,SizeOf(Size)+Size);
  267.       finally
  268.         Stream2.Free;
  269.       end;
  270.     end;
  271.     {$ENDIF}
  272.     Stream.Position := SizeOf(Size);
  273.     InsertRVFFromStreamEd(Stream);
  274.   finally
  275.     Stream.Free;
  276.     Clipboard.Close;
  277.   end;
  278. end;
  279. {------------------------------------------------------------------------------}
  280. {$IFNDEF RVDONOTUSERTFIMPORT}
  281. function TCustomRichViewEdit.GetBasePathFromHTMLInClipboard: String;
  282. var
  283.   mem: Cardinal;
  284.   ptr: Pointer;
  285.   HTML: String;
  286.   http: Boolean;
  287.   p: Integer;
  288. begin
  289.   Result := '';
  290.   if not Clipboard.HasFormat(CFRV_HTML) then exit;
  291.   Clipboard.Open;
  292.   try
  293.     mem := Clipboard.GetAsHandle(CFRV_HTML);
  294.     SetLength(HTML, GlobalSize(mem));
  295.     ptr := GlobalLock(mem);
  296.     Move(ptr^,PChar(HTML)^, Length(HTML));
  297.     GlobalUnlock(mem);
  298.   finally
  299.     Clipboard.Close;
  300.   end;
  301.   p := Pos(HTMLClipboardSourceURL, HTML);
  302.   if p=0 then
  303.     exit;
  304.   inc(p, Length(HTMLClipboardSourceURL));
  305.   while not (HTML[p] in [#0,#10,#13]) do begin
  306.     Result := Result + HTML[p];
  307.     inc(p);
  308.   end;
  309.   {$IFDEF RICHVIEWCBDEF3}
  310.   Result := UTF8Decode(Result);
  311.   {$ENDIF}
  312.   if Pos('file://', LowerCase(Result))=1 then
  313.     Result := System.Copy(Result, 8, Length(Result));
  314.   http := Pos('http://', LowerCase(Result))=1;
  315.   if http then
  316.     Result := System.Copy(Result, 8, Length(Result));
  317.   for p := 1 to Length(Result) do
  318.     if Result[p]='/' then
  319.       Result[p]:='' ;
  320.   Result := ExtractFilePath(Result);
  321.   if http then begin
  322.     Result := 'http://'+Result;
  323.     for p := 1 to Length(Result) do
  324.       if Result[p]='' then
  325.         Result[p]:='/' ;
  326.   end;
  327. end;
  328. {------------------------------------------------------------------------------}
  329. function TCustomRichViewEdit.PasteRTF: Boolean;
  330. var Stream: TMemoryStream;
  331.     mem: Cardinal;
  332.     ptr: Pointer;
  333.     Size: Integer;
  334. begin
  335.   Result := False;
  336.   if not Clipboard.HasFormat(CFRV_RTF) then exit;
  337.   Clipboard.Open;
  338.   Stream := TMemoryStream.Create;
  339.   try
  340.     mem := Clipboard.GetAsHandle(CFRV_RTF);
  341.     Result := (mem <> 0) and (mem <> INVALID_HANDLE_VALUE);
  342.     if Result then begin
  343.       Size := GlobalSize(mem);
  344.       Stream.SetSize(Size);
  345.       ptr := GlobalLock(mem);
  346.       Move(ptr^,Stream.Memory^,Size);
  347.       GlobalUnlock(mem);
  348.       Stream.Position := 0;
  349.       RTFReadProperties.BasePath := GetBasePathFromHTMLInClipboard;
  350.       try
  351.         InsertRTFFromStreamEd(Stream);
  352.       finally
  353.         RTFReadProperties.BasePath := '';
  354.       end;
  355.     end;
  356.   finally
  357.     Stream.Free;
  358.     Clipboard.Close;
  359.   end;
  360. end;
  361. {------------------------------------------------------------------------------}
  362. function TCustomRichViewEdit.InsertRTFFromStreamEd(Stream: TStream): Boolean;
  363. begin
  364.   {$IFNDEF RVDONOTUSEINPLACE}
  365.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  366.     Result := TCustomRichViewEdit(InplaceEditor).InsertRTFFromStreamEd(Stream);
  367.     exit;
  368.   end;
  369.   {$ENDIF}
  370.   Result := True;
  371.   if not BeforeChange(False) then exit;
  372.   if (RVData.PartialSelectedItem<>nil)or not CanDelete then begin
  373.     TRVEditRVData(RVData).Beep;
  374.     exit;
  375.   end;
  376.   TRVEditRVData(RVData).BeginUndoSequence(rvutInsert, True);
  377.   SetUndoGroupMode(True);
  378.   try
  379.     TRVEditRVData(RVData).DeleteSelection_;
  380.     RTFReadProperties;
  381.     Result := TRVEditRVData(RVData).InsertRTFFromStreamEd_(Stream);
  382.   finally
  383.     SetUndoGroupMode(False);
  384.     Change;
  385.   end;
  386. end;
  387. {------------------------------------------------------------------------------}
  388. function TCustomRichViewEdit.InsertRTFFromFileEd(const FileName: String): Boolean;
  389. var Stream: TFileStream;
  390. begin
  391.   try
  392.     Stream := TFileStream.Create(FileName, fmOpenRead);
  393.     try
  394.       RTFReadProperties.BasePath := ExtractFilePath(FileName);
  395.       Result := InsertRTFFromStreamEd(Stream);
  396.     finally
  397.       Stream.Free;
  398.       RTFReadProperties.BasePath := '';
  399.     end;
  400.   except
  401.     RTFReadProperties.ErrorCode := rtf_ec_FileOpenError;
  402.     Result := False;
  403.   end;
  404. end;
  405. {$ENDIF}
  406. {------------------------------------------------------------------------------}
  407. procedure TCustomRichViewEdit.PasteText;
  408. begin
  409.   if not BeforeChange(False) then exit;
  410.   if not Clipboard.HasFormat(CF_TEXT) then exit;
  411.   InsertText(Clipboard.AsText, False);
  412. end;
  413. {------------------------------------------------------------------------------}
  414. procedure TCustomRichViewEdit.GetCurrentBreakInfo(var AWidth: Byte;
  415.                              var AStyle: TRVBreakStyle; var AColor: TColor;
  416.                              var ATag: Integer);
  417. begin
  418.   {$IFNDEF RVDONOTUSEINPLACE}
  419.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  420.     TCustomRichViewEdit(InplaceEditor).GetCurrentBreakInfo(AWidth, AStyle, AColor, ATag);
  421.     exit;
  422.   end;
  423.   {$ENDIF}
  424.   GetBreakInfo(CurItemNo, AWidth, AStyle, AColor, ATag);
  425. end;
  426. {------------------------------------------------------------------------------}
  427. procedure TCustomRichViewEdit.GetCurrentBulletInfo(var AName: String;
  428.                         var AImageIndex: Integer;
  429.                         var AImageList: TCustomImageList;
  430.                         var ATag: Integer);
  431. begin
  432.   {$IFNDEF RVDONOTUSEINPLACE}
  433.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  434.     TCustomRichViewEdit(InplaceEditor).GetCurrentBulletInfo(AName, AImageIndex, AImageList, ATag);
  435.     exit;
  436.   end;
  437.   {$ENDIF}
  438.   GetBulletInfo(CurItemNo, AName, AImageIndex, AImageList, ATag);
  439. end;
  440. {------------------------------------------------------------------------------}
  441. procedure TCustomRichViewEdit.GetCurrentHotspotInfo(var AName: String;
  442.                    var AImageIndex, AHotImageIndex: Integer;
  443.                    var AImageList: TCustomImageList;
  444.                    var ATag: Integer);
  445. begin
  446.   {$IFNDEF RVDONOTUSEINPLACE}
  447.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  448.     TCustomRichViewEdit(InplaceEditor).GetCurrentHotspotInfo(AName, AImageIndex, AHotImageIndex, AImageList, ATag);
  449.     exit;
  450.   end;
  451.   {$ENDIF}
  452.   GetHotspotInfo(CurItemNo, AName, AImageIndex, AHotImageIndex, AImageList, ATag);
  453. end;
  454. {------------------------------------------------------------------------------}
  455. procedure TCustomRichViewEdit.GetCurrentPictureInfo(var AName: String;
  456.                  var Agr: TGraphic; var AVAlign: TRVVAlign; var ATag: Integer);
  457. begin
  458.   {$IFNDEF RVDONOTUSEINPLACE}
  459.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  460.     TCustomRichViewEdit(InplaceEditor).GetCurrentPictureInfo(AName, Agr, AVAlign, ATag);
  461.     exit;
  462.   end;
  463.   {$ENDIF}
  464.   GetPictureInfo(CurItemNo, AName, Agr, AVAlign, ATag);
  465. end;
  466. {------------------------------------------------------------------------------}
  467. procedure TCustomRichViewEdit.GetCurrentControlInfo(var AName: String;
  468.                 var Actrl: TControl; var AVAlign: TRVVAlign; var ATag: Integer);
  469. begin
  470.   {$IFNDEF RVDONOTUSEINPLACE}
  471.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  472.     TCustomRichViewEdit(InplaceEditor).GetCurrentControlInfo(AName, Actrl, AVAlign, ATag);
  473.     exit;
  474.   end;
  475.   {$ENDIF}
  476.   GetControlInfo(CurItemNo, AName, Actrl, AVAlign, ATag);
  477. end;
  478. {------------------------------------------------------------------------------}
  479. procedure TCustomRichViewEdit.GetCurrentTextInfo(var AText: String; var ATag: Integer);
  480. begin
  481.   {$IFNDEF RVDONOTUSEINPLACE}
  482.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  483.     TCustomRichViewEdit(InplaceEditor).GetCurrentTextInfo(AText, ATag);
  484.     exit;
  485.   end;
  486.   {$ENDIF}
  487.   GetTextInfo(CurItemNo, AText, ATag);
  488. end;
  489. {------------------------------------------------------------------------------}
  490. procedure TCustomRichViewEdit.CheckItemClass(ItemNo: Integer; RequiredClass: TCustomRVItemInfoClass);
  491. begin
  492.   if not (RVData.Items.Objects[ItemNo] is RequiredClass) then
  493.     raise ERichViewError.Create(errRVTypesMismatch);
  494. end;
  495. {------------------------------------------------------------------------------}
  496. procedure TCustomRichViewEdit.SetBreakInfoEd(ItemNo: Integer; AWidth: Byte;
  497.                              AStyle: TRVBreakStyle; AColor: TColor;
  498.                              ATag: Integer);
  499. var item: TRVBreakItemInfo;
  500. begin
  501.   if not BeforeChange(False) then exit;
  502.   CheckItemClass(ItemNo, TRVBreakItemInfo);
  503.   TRVEditRVData(RVData).BeginUndoSequence(rvutModifyItem, True);
  504.   item := TRVBreakItemInfo.CreateEx(RVData, AWidth, AStyle, AColor);
  505.   item.Tag := ATag;
  506.   TRVEditRVData(RVData).Do_ModifyItem(ItemNo,'',item);
  507.   Invalidate;
  508.   Change;
  509. end;
  510. {------------------------------------------------------------------------------}
  511. procedure TCustomRichViewEdit.SetBulletInfoEd(ItemNo: Integer; const AName: String;
  512.                                         AImageIndex: Integer;
  513.                                         AImageList: TCustomImageList;
  514.                                         ATag: Integer);
  515. var item, olditem: TRVBulletItemInfo;
  516. begin
  517.   if not BeforeChange(False) then exit;
  518.   CheckItemClass(ItemNo, TRVBulletItemInfo);
  519.   TRVEditRVData(RVData).BeginUndoSequence(rvutModifyItem, True);
  520.   olditem := TRVBulletItemInfo(RVData.Items.Objects[ItemNo]);
  521.   item := TRVBulletItemInfo.CreateEx(RVData, AImageIndex, olditem.ImageList,
  522.                                      TRVBulletItemInfo(RVData.Items.Objects[ItemNo]).VAlign);
  523.   item.Tag := ATag;
  524.   TRVEditRVData(RVData).Do_ModifyItem(ItemNo, AName, item);
  525.   Invalidate;
  526.   Change;
  527. end;
  528. {------------------------------------------------------------------------------}
  529. procedure TCustomRichViewEdit.SetHotspotInfoEd(ItemNo: Integer; const AName: String;
  530.                                         AImageIndex, AHotImageIndex: Integer;
  531.                                         AImageList: TCustomImageList;
  532.                                         ATag: Integer);
  533. var item, olditem: TRVHotspotItemInfo;
  534. begin
  535.   if not BeforeChange(False) then exit;
  536.   CheckItemClass(ItemNo, TRVHotspotItemInfo);
  537.   TRVEditRVData(RVData).BeginUndoSequence(rvutModifyItem, True);
  538.   olditem := TRVHotspotItemInfo(RVData.Items.Objects[ItemNo]);
  539.   item := TRVHotspotItemInfo.CreateEx(RVData, AImageIndex, AHotImageIndex, olditem.ImageList,
  540.                                      TRVHotspotItemInfo(RVData.Items.Objects[ItemNo]).VAlign);
  541.   item.Tag := ATag;
  542.   TRVEditRVData(RVData).Do_ModifyItem(ItemNo, AName, item);
  543.   Invalidate;
  544.   Change;
  545. end;
  546. {------------------------------------------------------------------------------}
  547. procedure TCustomRichViewEdit.SetPictureInfoEd(ItemNo: Integer; const AName: String; Agr: TGraphic; AVAlign: TRVVAlign; ATag: Integer);
  548. var item, olditem: TRVGraphicItemInfo;
  549.     NeedFormat: Boolean;
  550.     OldWidth: Integer;
  551. begin
  552.   if not BeforeChange(False) then exit;
  553.   CheckItemClass(ItemNo, TRVGraphicItemInfo);
  554.   TRVEditRVData(RVData).BeginUndoSequence(rvutModifyItem, True);
  555.   olditem := TRVGraphicItemInfo(RVData.Items.Objects[ItemNo]);
  556.   BeginItemModify(ItemNo, OldWidth);
  557.   if olditem.Image = Agr then begin
  558.     Agr := RV_CreateGraphics(TGraphicClass(olditem.Image.ClassType));
  559.     Agr.Assign(olditem.Image);
  560.   end;
  561.   NeedFormat := (Agr.Width<>olditem.Image.Width) or
  562.                 (Agr.Height<>olditem.Image.Height) or
  563.                 (AValign<>olditem.VAlign);
  564.   item := TRVGraphicItemInfoClass(olditem.ClassType).CreateEx(RVData, nil, AVAlign);
  565.   item.Assign(olditem);
  566.   item.Image.Free;
  567.   item.Image := Agr;
  568.   item.VAlign := AVAlign;
  569.   item.ItemOptions := [];
  570.   item.ParaNo := olditem.ParaNo;
  571.   item.Tag := ATag;
  572.   TRVEditRVData(RVData).Do_ModifyItem(ItemNo, AName, item);
  573.   if NeedFormat then
  574.     EndItemModify(ItemNo, OldWidth);
  575.   Invalidate;
  576.   Change;
  577. end;
  578. {------------------------------------------------------------------------------}
  579. procedure TCustomRichViewEdit.AdjustControlPlacement(ItemNo: Integer);
  580. begin
  581.   TRVEditRVData(RVData).AdjustControlPlacement(ItemNo);
  582. end;
  583. {------------------------------------------------------------------------------}
  584. procedure TCustomRichViewEdit.AdjustControlPlacement2(Control: TControl);
  585. var ItemNo: Integer;
  586. begin
  587.   {$IFNDEF RVDONOTUSEINPLACE}
  588.   if (InplaceEditor<>nil)  and
  589.      (InplaceEditor is TCustomRichViewEdit) then
  590.     TCustomRichViewEdit(InplaceEditor).AdjustControlPlacement2(Control);
  591.   {$ENDIF}
  592.   ItemNo := FindControlItemNo(Control);
  593.   if ItemNo=-1 then
  594.     exit;
  595.   if GetItem(ItemNo) is TRVControlItemInfo then
  596.     TRVEditRVData(RVData).AdjustControlPlacement(ItemNo);
  597. end;
  598. {------------------------------------------------------------------------------}
  599. procedure TCustomRichViewEdit.ResizeControl(ItemNo, NewWidth, NewHeight: Integer);
  600. begin
  601.   TRVEditRVData(RVData).BeginUndoSequence(rvutModifyItem, True);
  602.   TRVEditRVData(RVData).Do_Resize(ItemNo, NewWidth, NewHeight, True);
  603.   Change;
  604. end;
  605. {------------------------------------------------------------------------------}
  606. procedure TCustomRichViewEdit.ResizeCurrentControl(NewWidth, NewHeight: Integer);
  607. begin
  608.   {$IFNDEF RVDONOTUSEINPLACE}
  609.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  610.     TCustomRichViewEdit(InplaceEditor).ResizeCurrentControl(NewWidth, NewHeight);
  611.     exit;
  612.   end;
  613.   {$ENDIF}
  614.   ResizeControl(CurItemNo, NewWidth, NewHeight);
  615. end;
  616. {------------------------------------------------------------------------------}
  617. procedure TCustomRichViewEdit.SetControlInfoEd(ItemNo: Integer; const AName: String;
  618.                                          AVAlign: TRVVAlign; ATag: Integer);
  619. var item: TRVControlItemInfo;
  620.     Ref: Boolean;
  621. begin
  622.   if not BeforeChange(False) then exit;
  623.   CheckItemClass(ItemNo, TRVControlItemInfo);
  624.   item := TRVControlItemInfo(RVData.Items.Objects[ItemNo]);
  625.   Ref := item.VAlign<>AVAlign;
  626.   TRVEditRVData(RVData).BeginUndoSequence(rvutModifyItem, True);
  627.   SetUndoGroupMode(True);
  628.   TRVEditRVData(RVData).Do_ChangeText(ItemNo, AName);
  629.   TRVEditRVData(RVData).Do_ChangeVAlign(ItemNo, AVAlign);
  630.   SetItemTagEd(ItemNo, ATag);
  631.   SetUndoGroupMode(False);
  632.   if Ref then
  633.     TRVEditRVData(RVData).Reformat(False,False,False,ItemNo,True);
  634.   Change;
  635. end;
  636. {------------------------------------------------------------------------------}
  637. procedure TCustomRichViewEdit.SetItemTextEd(ItemNo: Integer; const s: String);
  638. var Data, StartNo, EndNo, StartOffs, EndOffs: Integer;
  639. begin
  640.   if not BeforeChange(False) then exit;
  641.   TRVEditRVData(RVData).BeginUndoSequence(rvutModifyItem, True);
  642.   RVData.StoreSelBounds(StartNo, EndNo, StartOffs, EndOffs, False);
  643.   BeginItemModify(ItemNo, Data);
  644.   TRVEditRVData(RVData).Do_ChangeText(ItemNo, s);
  645.   {$IFNDEF RVDONOTUSELIVESPELL}
  646.   TRVEditRVData(RVData).LaterSetBackLiveSpellingTo(ItemNo, 0, True);
  647.   {$ENDIF}
  648.   EndItemModify(ItemNo, Data);
  649.   RVData.RestoreSelBounds(StartNo, EndNo, StartOffs, EndOffs);
  650.   Change;
  651. end;
  652. {------------------------------------------------------------------------------}
  653. procedure TCustomRichViewEdit.SetCurrentBreakInfo(AWidth: Byte;
  654.                              AStyle: TRVBreakStyle; AColor: TColor;
  655.                              ATag: Integer);
  656. begin
  657.   {$IFNDEF RVDONOTUSEINPLACE}
  658.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  659.     TCustomRichViewEdit(InplaceEditor).SetCurrentBreakInfo(AWidth, AStyle, AColor, ATag);
  660.     exit;
  661.   end;
  662.   {$ENDIF}
  663.   SetBreakInfoEd(CurItemNo, AWidth, AStyle, AColor, ATag);
  664. end;
  665. {------------------------------------------------------------------------------}
  666. procedure TCustomRichViewEdit.SetCurrentBulletInfo(const AName: String;
  667.                              AImageIndex: Integer;
  668.                              AImageList: TCustomImageList;
  669.                              ATag: Integer);
  670. begin
  671.   {$IFNDEF RVDONOTUSEINPLACE}
  672.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  673.     TCustomRichViewEdit(InplaceEditor).SetCurrentBulletInfo(AName, AImageIndex, AImageList, ATag);
  674.     exit;
  675.   end;
  676.   {$ENDIF}
  677.   SetBulletInfoEd(CurItemNo, AName, AImageIndex, AImageList, ATag);
  678. end;
  679. {------------------------------------------------------------------------------}
  680. procedure TCustomRichViewEdit.SetCurrentHotspotInfo(const AName: String;
  681.                              AImageIndex, AHotImageIndex: Integer;
  682.                              AImageList: TCustomImageList;
  683.                              ATag: Integer);
  684. begin
  685.   {$IFNDEF RVDONOTUSEINPLACE}
  686.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  687.     TCustomRichViewEdit(InplaceEditor).SetCurrentHotspotInfo(AName, AImageIndex, AHotImageIndex,
  688.                              AImageList, ATag);
  689.     exit;
  690.   end;
  691.   {$ENDIF}
  692.   SetHotspotInfoEd(CurItemNo, AName, AImageIndex, AHotImageIndex, AImageList, ATag);
  693. end;
  694. {------------------------------------------------------------------------------}
  695. procedure TCustomRichViewEdit.SetCurrentPictureInfo(const AName: String; Agr: TGraphic;
  696.                              AVAlign: TRVVAlign; ATag: Integer);
  697. begin
  698.   {$IFNDEF RVDONOTUSEINPLACE}
  699.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  700.     TCustomRichViewEdit(InplaceEditor).SetCurrentPictureInfo(AName, Agr, AVAlign, ATag);
  701.     exit;
  702.   end;
  703.   {$ENDIF}
  704.   SetPictureInfoEd(CurItemNo, AName, Agr, AVAlign, ATag);
  705. end;
  706. {------------------------------------------------------------------------------}
  707. procedure TCustomRichViewEdit.SetCurrentControlInfo(const AName: String;
  708.                              AVAlign: TRVVAlign; ATag: Integer);
  709. begin
  710.   {$IFNDEF RVDONOTUSEINPLACE}
  711.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  712.     TCustomRichViewEdit(InplaceEditor).SetCurrentControlInfo(AName, AVAlign, ATag);
  713.     exit;
  714.   end;
  715.   {$ENDIF}
  716.   SetControlInfoEd(CurItemNo, AName, AVAlign, ATag);
  717. end;
  718. {------------------------------------------------------------------------------}
  719. function TCustomRichViewEdit.GetCurrentTag: Integer;
  720. begin
  721.   {$IFNDEF RVDONOTUSEINPLACE}
  722.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  723.     Result := TCustomRichViewEdit(InplaceEditor).GetCurrentTag;
  724.     exit;
  725.   end;
  726.   {$ENDIF}
  727.   TRVEditRVData(RVData).PrepareForEdit;
  728.   Result := GetItemTag(CurItemNo);
  729. end;
  730. {------------------------------------------------------------------------------}
  731. function TCustomRichViewEdit.GetCurrentItemText: String;
  732. begin
  733.   {$IFNDEF RVDONOTUSEINPLACE}
  734.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  735.     Result := TCustomRichViewEdit(InplaceEditor).GetCurrentItemText;
  736.     exit;
  737.   end;
  738.   {$ENDIF}
  739.   TRVEditRVData(RVData).PrepareForEdit;
  740.   Result := GetItemText(CurItemNo);
  741. end;
  742. {------------------------------------------------------------------------------}
  743. { Sets value of item property of integer type.
  744.   ItemNo - index of item. Prop identifies the property. Value - new property
  745.   value.
  746.   If AutoReformat is true, document will be reformatted automatically, and
  747.   OnChange event will occur.
  748.   This is an editing-style method.                                             }
  749. procedure TCustomRichViewEdit.SetItemExtraIntPropertyEd(ItemNo: Integer;
  750.   Prop: TRVExtraItemProperty; Value: Integer; AutoReformat: Boolean);
  751. var OldValue, Data: Integer;
  752. begin
  753.   if not GetItemExtraIntProperty(ItemNo, Prop, OldValue) or (Value=OldValue) then
  754.     exit;
  755.   if not BeforeChange(False) then
  756.     exit;
  757.   TRVEditRVData(RVData).BeginUndoSequence(rvutModifyItem, True);
  758.   if AutoReformat then
  759.     BeginItemModify(ItemNo, Data);
  760.   TRVEditRVData(RVData).Do_ExtraIntProperty(ItemNo, Prop, Value);
  761.   if AutoReformat then begin
  762.     EndItemModify(ItemNo, Data);
  763.     Change;
  764.   end;
  765. end;
  766. {------------------------------------------------------------------------------}
  767. { The same, but sets value of item property of integer type at the position caret -
  768.   in this RVData or in inplace editor.                                         }
  769. procedure TCustomRichViewEdit.SetCurrentItemExtraIntProperty(
  770.   Prop: TRVExtraItemProperty;
  771.   Value: Integer; AutoReformat: Boolean);
  772. begin
  773.   {$IFNDEF RVDONOTUSEINPLACE}
  774.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  775.     TCustomRichViewEdit(InplaceEditor).SetCurrentItemExtraIntProperty(Prop, Value, AutoReformat);
  776.     exit;
  777.   end;
  778.   {$ENDIF}
  779.   SetItemExtraIntPropertyEd(CurItemNo, Prop, Value, AutoReformat);
  780. end;
  781. {------------------------------------------------------------------------------}
  782. { Gets value of item property of integer type at the position caret -
  783.   in this RVData or in inplace editor.
  784.   Prop identifies the property. Value receives a property value.
  785.   Returns True if this item type has this property.                            }
  786. function TCustomRichViewEdit.GetCurrentItemExtraIntProperty(
  787.   Prop: TRVExtraItemProperty; var Value: Integer): Boolean;
  788. begin
  789.   {$IFNDEF RVDONOTUSEINPLACE}
  790.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  791.     Result := TCustomRichViewEdit(InplaceEditor).GetCurrentItemExtraIntProperty(Prop, Value);
  792.     exit;
  793.   end;
  794.   {$ENDIF}
  795.   Result := GetItemExtraIntProperty(CurItemNo, Prop, Value);
  796. end;
  797. {------------------------------------------------------------------------------}
  798. { Sets value of item property of string type.
  799.   ItemNo - index of item. Prop identifies the property. Value - new property
  800.   value.
  801.   If AutoReformat is true, document will be reformatted automatically, and
  802.   OnChange event will occur.
  803.   This is an editing-style method.                                             }
  804. procedure TCustomRichViewEdit.SetItemExtraStrPropertyEd(ItemNo: Integer;
  805.   Prop: TRVExtraItemStrProperty; const Value: String;
  806.   AutoReformat: Boolean);
  807. var OldValue: String;
  808. //    Data: Integer;
  809. begin
  810.   if not GetItemExtraStrProperty(ItemNo, Prop, OldValue) or (Value=OldValue) then
  811.     exit;
  812.   if not BeforeChange(False) then
  813.     exit;
  814.   TRVEditRVData(RVData).BeginUndoSequence(rvutModifyItem, True);
  815.   //if AutoReformat then
  816.   //  BeginItemModify(ItemNo, Data);
  817.   TRVEditRVData(RVData).Do_ExtraStrProperty(ItemNo, Prop, Value);
  818.   if AutoReformat then begin
  819.     // EndItemModify(ItemNo, Data);
  820.     Change;
  821.   end;
  822. end;
  823. {------------------------------------------------------------------------------}
  824. { The same, but sets value of item property of string type at the position caret -
  825.   in this RVData or in inplace editor.                                         }
  826. procedure TCustomRichViewEdit.SetCurrentItemExtraStrProperty(
  827.   Prop: TRVExtraItemStrProperty; const Value: String; AutoReformat: Boolean);
  828. begin
  829.   {$IFNDEF RVDONOTUSEINPLACE}
  830.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  831.     TCustomRichViewEdit(InplaceEditor).SetCurrentItemExtraStrProperty(Prop, Value, AutoReformat);
  832.     exit;
  833.   end;
  834.   {$ENDIF}
  835.   SetItemExtraStrPropertyEd(CurItemNo, Prop, Value, AutoReformat);
  836. end;
  837. {------------------------------------------------------------------------------}
  838. { Gets value of item property of string type at the position caret -
  839.   in this RVData or in inplace editor.
  840.   Prop identifies the property. Value receives a property value.
  841.   Returns True if this item type has this property.                            }
  842. function TCustomRichViewEdit.GetCurrentItemExtraStrProperty(
  843.   Prop: TRVExtraItemStrProperty; var Value: String): Boolean;
  844. begin
  845.   {$IFNDEF RVDONOTUSEINPLACE}
  846.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  847.     Result := TCustomRichViewEdit(InplaceEditor).GetCurrentItemExtraStrProperty(Prop, Value);
  848.     exit;
  849.   end;
  850.   {$ENDIF}
  851.   Result := GetItemExtraStrProperty(CurItemNo, Prop, Value);
  852. end;
  853. {------------------------------------------------------------------------------}
  854. procedure TCustomRichViewEdit.SetItemTagEd(ItemNo: Integer; ATag: Integer);
  855. begin
  856.   if TCustomRVItemInfo(RVData.Items.Objects[ItemNo]).Tag=ATag then exit;
  857.   if not BeforeChange(False) then exit;
  858.   TRVEditRVData(RVData).BeginUndoSequence(rvutTag, True);
  859.   TRVEditRVData(RVData).Do_Tag(ItemNo,ATag,True);
  860.   Change;
  861. end;
  862. {------------------------------------------------------------------------------}
  863. procedure TCustomRichViewEdit.SetCurrentItemText(const s: String);
  864. begin
  865.   {$IFNDEF RVDONOTUSEINPLACE}
  866.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  867.     TCustomRichViewEdit(InplaceEditor).SetCurrentItemText(s);
  868.     exit;
  869.   end;
  870.   {$ENDIF}
  871.   SetItemTextEd(CurItemNo, s);
  872. end;
  873. {------------------------------------------------------------------------------}
  874. procedure TCustomRichViewEdit.SetCurrentTag(ATag: Integer);
  875. begin
  876.   {$IFNDEF RVDONOTUSEINPLACE}
  877.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  878.     TCustomRichViewEdit(InplaceEditor).SetCurrentTag(ATag);
  879.     exit;
  880.   end;
  881.   {$ENDIF}
  882.   if not BeforeChange(False) then exit;
  883.   SetItemTagEd(CurItemNo, ATag);
  884. end;
  885. {------------------------------------------------------------------------------}
  886. function TCustomRichViewEdit.SearchText(s: String; SrchOptions: TRVESearchOptions): Boolean;
  887. begin
  888.   Result := RVData.SearchText(rvseoDown in SrchOptions, rvseoMatchCase in SrchOptions,
  889.                               rvseoWholeWord in SrchOptions, s);
  890. end;
  891. {------------------------------------------------------------------------------}
  892. procedure TCustomRichViewEdit.AfterVScroll;
  893. begin
  894.   if Assigned(FOnVScrolled) then FOnVScrolled(Self);
  895.   TRVEditRVData(RVData).ChangeCaret(False,False,False,False);
  896.   GenerateMouseMove;
  897.   InplaceRedrawing(False);
  898. end;
  899. {------------------------------------------------------------------------------}
  900. procedure TCustomRichViewEdit.AfterHScroll;
  901. begin
  902.   if Assigned(FOnHScrolled) then FOnHScrolled(Self);
  903.   TRVEditRVData(RVData).ChangeCaret(False,False,False,False);
  904.   GenerateMouseMove;
  905.   InplaceRedrawing(False);
  906. end;
  907. {------------------------------------------------------------------------------}
  908. procedure TCustomRichViewEdit.SelectCurrentWord;
  909. begin
  910.   {$IFNDEF RVDONOTUSEINPLACE}
  911.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  912.     TCustomRichViewEdit(InplaceEditor).SelectCurrentWord;
  913.     exit;
  914.   end;
  915.   {$ENDIF}
  916.   TRVEditRVData(RVData).SelectCurrentWord;
  917. end;
  918. {------------------------------------------------------------------------------}
  919. procedure TCustomRichViewEdit.SelectCurrentLine;
  920. begin
  921.   {$IFNDEF RVDONOTUSEINPLACE}
  922.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  923.     TCustomRichViewEdit(InplaceEditor).SelectCurrentLine;
  924.     exit;
  925.   end;
  926.   {$ENDIF}
  927.   RVData.SelectLine(CurItemNo, OffsetInCurItem);
  928.   Invalidate;
  929. end;
  930. {------------------------------------------------------------------------------}
  931. procedure TCustomRichViewEdit.InsertPageBreak;
  932. begin
  933.   {$IFNDEF RVDONOTUSEINPLACE}
  934.   if InplaceEditor<>nil then begin
  935.     Beep;
  936.     exit;
  937.   end;
  938.   {$ENDIF}
  939.   if not BeforeChange(False) then
  940.     exit;
  941.   TRVEditRVData(RVData).InsertPageBreak;
  942. end;
  943. {------------------------------------------------------------------------------}
  944. procedure TCustomRichViewEdit.RemoveCurrentPageBreak;
  945. begin
  946.   {$IFNDEF RVDONOTUSEINPLACE}
  947.   if InplaceEditor<>nil then begin
  948.     Beep;
  949.     exit;
  950.   end;
  951.   {$ENDIF}
  952.   if not BeforeChange(False) then
  953.     exit;
  954.   TRVEditRVData(RVData).BeginUndoSequence(rvutRemovePageBreak, True);
  955.   TRVEditRVData(RVData).Do_PageBreak(CurItemNo,False);
  956.   Change;
  957.   Invalidate;
  958. end;
  959. {------------------------------------------------------------------------------}
  960. function TCustomRichViewEdit.IsRedoShortcut(Shift: TShiftState;
  961.   Key: Word): Boolean;
  962. begin
  963.   Result := (ssShift in Shift) and
  964.             (((ssCtrl in Shift) and (Key=ord('Z')) and not (ssAlt in Shift)) or
  965.              ((ssAlt in Shift) and (Key=VK_BACK)));
  966. end;
  967. {------------------------------------------------------------------------------}
  968. function TCustomRichViewEdit.IsUndoShortcut(Shift: TShiftState;
  969.   Key: Word): Boolean;
  970. begin
  971.   Result := not (ssShift in Shift) and
  972.             (((ssCtrl in Shift) and (Key=ord('Z')) and not (ssAlt in Shift)) or
  973.              ((ssAlt in Shift) and (Key=VK_BACK)));
  974. end;
  975. {------------------------------------------------------------------------------}
  976. function TCustomRichViewEdit.GetUndoLimit: Integer;
  977. begin
  978.   Result := TRVEditRVData(RVData).UndoList.Limit;
  979. end;
  980. {------------------------------------------------------------------------------}
  981. procedure TCustomRichViewEdit.SetUndoLimit(const Value: Integer);
  982. begin
  983.   TRVEditRVData(RVData).UndoList.Limit := Value;
  984. end;
  985. {------------------------------------------------------------------------------}
  986. procedure TCustomRichViewEdit.BeginUndoCustomGroup(const Name: String);
  987. begin
  988.   TRVEditRVData(RVData).BeginNamedUndoSequence(rvutCustom, Name, True);
  989. end;
  990. {------------------------------------------------------------------------------}
  991. procedure TCustomRichViewEdit.BeginUndoGroup(UndoType: TRVUndoType);
  992. begin                      
  993.   TRVEditRVData(RVData).BeginUndoSequence(UndoType, True);
  994. end;
  995. {------------------------------------------------------------------------------}
  996. function TCustomRichViewEdit.RedoAction: TRVUndoType;
  997. begin
  998. {$IFNDEF RVDONOTUSEINPLACE}
  999.   Result:=rvutNone;
  1000.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then
  1001.     Result := TCustomRichViewEdit(InplaceEditor).RedoAction;
  1002.   if Result=rvutNone then
  1003.   {$ENDIF}
  1004.     Result := TRVEditRVData(RVData).RedoList.CurrentUndoType;
  1005. end;
  1006. {------------------------------------------------------------------------------}
  1007. function TCustomRichViewEdit.UndoAction: TRVUndoType;
  1008. begin
  1009.   {$IFNDEF RVDONOTUSEINPLACE}
  1010.   Result:=rvutNone;
  1011.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then
  1012.     Result := TCustomRichViewEdit(InplaceEditor).UndoAction;
  1013.   if Result=rvutNone then
  1014.   {$ENDIF}
  1015.     Result := TRVEditRVData(RVData).UndoList.CurrentUndoType;
  1016. end;
  1017. {------------------------------------------------------------------------------}
  1018. function TCustomRichViewEdit.RedoName: String;
  1019. begin
  1020.   {$IFNDEF RVDONOTUSEINPLACE}
  1021.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) and
  1022.      (TCustomRichViewEdit(InplaceEditor).RedoAction<>rvutNone) then begin
  1023.     Result := TCustomRichViewEdit(InplaceEditor).RedoName;
  1024.     exit;
  1025.   end;
  1026.   {$ENDIF}
  1027.   Result := TRVEditRVData(RVData).RedoList.CurrentUndoCaption;
  1028. end;
  1029. {------------------------------------------------------------------------------}
  1030. function TCustomRichViewEdit.UndoName: String;
  1031. begin
  1032.   {$IFNDEF RVDONOTUSEINPLACE}
  1033.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) and
  1034.      (TCustomRichViewEdit(InplaceEditor).UndoAction<>rvutNone) then begin
  1035.     Result := TCustomRichViewEdit(InplaceEditor).UndoName;
  1036.     exit;
  1037.   end;
  1038.   {$ENDIF}
  1039.   Result := TRVEditRVData(RVData).UndoList.CurrentUndoCaption;
  1040. end;
  1041. {------------------------------------------------------------------------------}
  1042. procedure TCustomRichViewEdit.WMRedoFromInplace(var Message: TMessage);
  1043. begin
  1044.   DestroyInplace;
  1045.   Redo;
  1046. end;
  1047. {------------------------------------------------------------------------------}
  1048. procedure TCustomRichViewEdit.WMUndoFromInplace(var Message: TMessage);
  1049. begin
  1050.   DestroyInplace;
  1051.   Undo;
  1052. end;
  1053. {------------------------------------------------------------------------------}
  1054. procedure TCustomRichViewEdit.Redo;
  1055. begin
  1056.   if ReadOnly then begin
  1057.     Beep;
  1058.     exit;
  1059.   end;
  1060.   {$IFNDEF RVDONOTUSEINPLACE}
  1061.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1062.     if (TCustomRichViewEdit(InplaceEditor).RedoAction<>rvutNone) then begin
  1063.       TCustomRichViewEdit(InplaceEditor).Redo;
  1064.       exit;
  1065.     end;
  1066.     if RedoAction<>rvutNone then
  1067.       PostMessage(Handle, WM_RVREDOFROMINPLACE,0,0);
  1068.     exit;
  1069.   end;
  1070.   {$ENDIF}
  1071.   if RedoAction<>rvutNone then begin
  1072.     {$IFNDEF RVDONOTUSELIVESPELL}
  1073.     if GetRootEditor.FWordEnumThread<>nil then
  1074.       GetRootEditor.FWordEnumThread.Stop(True);
  1075.     {$ENDIF}
  1076.     TRVEditRVData(RVData).RedoList.Redo(RVData);
  1077.     DoChange(False);
  1078.     end
  1079.   else
  1080.     RVData.Beep;
  1081.   if Visible then
  1082.     SetFocusSilent;
  1083. end;
  1084. {------------------------------------------------------------------------------}
  1085. procedure TCustomRichViewEdit.Undo;
  1086. begin
  1087.   if ReadOnly then begin
  1088.     Beep;
  1089.     exit;
  1090.   end;
  1091.   {$IFNDEF RVDONOTUSEINPLACE}
  1092.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1093.     if (TCustomRichViewEdit(InplaceEditor).UndoAction<>rvutNone) then begin
  1094.       TCustomRichViewEdit(InplaceEditor).Undo;
  1095.       exit;
  1096.     end;
  1097.     if UndoAction<>rvutNone then
  1098.       PostMessage(Handle, WM_RVUNDOFROMINPLACE,0,0);
  1099.     exit;
  1100.   end;
  1101.   {$ENDIF}
  1102.   if UndoAction<>rvutNone then begin
  1103.     {$IFNDEF RVDONOTUSELIVESPELL}
  1104.     if GetRootEditor.FWordEnumThread<>nil then
  1105.       GetRootEditor.FWordEnumThread.Stop(True);
  1106.     {$ENDIF}
  1107.     TRVEditRVData(RVData).UndoList.Undo(RVData);
  1108.     DoChange(False);
  1109.     end
  1110.   else
  1111.     RVData.Beep;
  1112.   if Visible then
  1113.     SetFocusSilent;
  1114. end;
  1115. {------------------------------------------------------------------------------}
  1116. procedure TCustomRichViewEdit.SetUndoGroupMode(GroupUndo: Boolean);
  1117. begin
  1118.   TRVEditRVData(RVData).SetUndoGroupMode(GroupUndo);
  1119. end;
  1120. {------------------------------------------------------------------------------}
  1121. procedure TCustomRichViewEdit.ClearUndo;
  1122. begin
  1123.   {$IFNDEF RVDONOTUSEINPLACE}
  1124.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then
  1125.     TCustomRichViewEdit(InplaceEditor).ClearUndo;
  1126.   {$ENDIF}
  1127.   with TRVEditRVData(RVData) do begin
  1128.     UndoList.Clear;
  1129.     RedoList.Clear;
  1130.   end;
  1131. end;
  1132. {------------------------------------------------------------------------------}
  1133. procedure TCustomRichViewEdit.BeginItemModify(ItemNo: Integer; var ModifyData: Integer);
  1134. begin
  1135.   TRVEditRVData(RVData).BeginItemModify(ItemNo, ModifyData);
  1136. end;
  1137. {------------------------------------------------------------------------------}
  1138. procedure TCustomRichViewEdit.EndItemModify(ItemNo: Integer; ModifyData: Integer);
  1139. begin
  1140.   TRVEditRVData(RVData).EndItemModify(ItemNo, ModifyData);
  1141. end;
  1142. {------------------------------------------------------------------------------}
  1143. procedure TCustomRichViewEdit.BeginCurrentItemModify(var ModifyData: Integer);
  1144. begin
  1145.   {$IFNDEF RVDONOTUSEINPLACE}
  1146.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1147.     TCustomRichViewEdit(InplaceEditor).BeginCurrentItemModify(ModifyData);
  1148.     exit;
  1149.   end;
  1150.   {$ENDIF}
  1151.   BeginItemModify(CurItemNo, ModifyData);
  1152. end;
  1153. {------------------------------------------------------------------------------}
  1154. procedure TCustomRichViewEdit.EndCurrentItemModify(ModifyData: Integer);
  1155. begin
  1156.   {$IFNDEF RVDONOTUSEINPLACE}
  1157.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1158.     TCustomRichViewEdit(InplaceEditor).EndCurrentItemModify(ModifyData);
  1159.     exit;
  1160.   end;
  1161.   {$ENDIF}
  1162.   EndItemModify(CurItemNo, ModifyData);
  1163. end;
  1164. {------------------------------------------------------------------------------}
  1165. function TCustomRichViewEdit.GetCurrentItem: TCustomRVItemInfo;
  1166. begin
  1167.   {$IFNDEF RVDONOTUSEINPLACE}
  1168.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1169.     Result := TCustomRichViewEdit(InplaceEditor).GetCurrentItem;
  1170.     exit;
  1171.   end;
  1172.   {$ENDIF}
  1173.   Result := GetItem(CurItemNo);
  1174. end;
  1175. {------------------------------------------------------------------------------}
  1176. function TCustomRichViewEdit.GetCurrentItemEx(RequiredClass: TCustomRVItemInfoClass;
  1177.                                var ItemRichViewEdit: TCustomRichViewEdit;
  1178.                                var Item: TCustomRVItemInfo): Boolean;
  1179. var Item2: TCustomRVItemInfo;
  1180.      ItemRichViewEdit2: TCustomRichViewEdit;
  1181. begin
  1182.    if GetItem(CurItemNo) is RequiredClass then begin
  1183.      Item := GetItem(CurItemNo);
  1184.      ItemRichViewEdit := Self;
  1185.      end
  1186.    else begin
  1187.      Item := nil;
  1188.      ItemRichViewEdit := nil;
  1189.    end;
  1190.    if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) and
  1191.       (TCustomRichViewEdit(InplaceEditor).CurItemNo >= 0) and
  1192.       TCustomRichViewEdit(InplaceEditor).GetCurrentItemEx(RequiredClass,
  1193.                       ItemRichViewEdit2, Item2) then begin
  1194.        Item := Item2;
  1195.        ItemRichViewEdit := ItemRichViewEdit2;
  1196.      end;
  1197.    Result := Item<>nil;
  1198. end;
  1199. {------------------------------------------------------------------------------}
  1200. function TCustomRichViewEdit.CanChange: Boolean;
  1201. begin
  1202.   Result := BeforeChange(True);
  1203. end;
  1204. {------------------------------------------------------------------------------}
  1205. procedure TCustomRichViewEdit.SetTabNavigation(const Value: TRVTabNavigationType);
  1206. begin
  1207.   if Value<>rvtnNone then
  1208.     raise ERichViewError.Create(errRViewerOnly);
  1209. end;
  1210. {------------------------------------------------------------------------------}
  1211. {$IFDEF RVUSEIME}
  1212. procedure TCustomRichViewEdit.WMImeStartComposition(var Message: TMessage);
  1213. var
  1214.   IMC: HIMC;
  1215.   LogFont: TLogFont;
  1216.   CF: TCompositionForm;
  1217. begin
  1218.   if Style=nil then begin
  1219.     inherited;
  1220.     exit;
  1221.   end;
  1222.   Message.Result := 1;
  1223.   inherited;
  1224.   BeforeUnicode;
  1225.   IMC := ImmGetContext(Handle);
  1226.   if IMC <> 0 then begin
  1227.     Style.TextStyles[CurTextStyleNo].AssignToLogFont(LogFont, Canvas, True);
  1228.     ImmSetCompositionFont(IMC, @LogFont);
  1229.     CF.dwStyle := CFS_RECT;
  1230.     CF.rcArea  := ClientRect;
  1231.     inc(CF.rcArea.Left, LeftMargin);
  1232.     dec(CF.rcArea.Right, RightMargin);
  1233.     with Style.ParaStyles[GetCurParaStyleNo] do begin
  1234.       inc(CF.rcArea.Left, LeftIndent);
  1235.       dec(CF.rcArea.Right, RightIndent);
  1236.     end;
  1237.     CF.ptCurrentPos := TRVEditRVData(RVData).GetIMEWinCoord;
  1238.     if (GetKeyboardLayout(0) and $FFFF)= $0412 then begin// Special support for Korean IME
  1239.       CF.rcArea.TopLeft := CF.ptCurrentPos;
  1240.       OffsetRect(CF.rcArea,0,1);
  1241.     end;
  1242.     ImmSetCompositionWindow(IMC, @CF);
  1243.     ImmReleaseContext(Handle, IMC);
  1244.   end;
  1245. end;
  1246. {------------------------------------------------------------------------------}
  1247. procedure TCustomRichViewEdit.WMImeComposition(var Message: TMessage);
  1248. var
  1249.   IMC: HIMC;
  1250.   s: String;
  1251.   Size: Integer;
  1252.   strend: PChar;
  1253. begin
  1254.   if BeforeChange(False) and ((Message.LParam and GCS_RESULTSTR) <> 0) then begin
  1255.     IMC := ImmGetContext(Handle);
  1256.     if IMC<>0 then begin
  1257.       if RVNT then begin
  1258.         try
  1259.           Size := ImmGetCompositionStringW(IMC, GCS_RESULTSTR, nil, 0);
  1260.           inc(Size, 2);
  1261.           SetLength(s, Size);
  1262.           FillChar(PChar(s)^, Size, 0);
  1263.           ImmGetCompositionStringW(IMC, GCS_RESULTSTR, PChar(s), Size);
  1264.         finally
  1265.           ImmReleaseContext(Handle, IMC);
  1266.         end;
  1267.         strend := RVU_StrScanW(PChar(s), 0, Size div 2);
  1268.         if strend<>nil then
  1269.           SetLength(s, strend-PChar(s));
  1270.         end
  1271.       else begin
  1272.         // IME support for Win95-98
  1273.         // Unfortunately, should properly work not for all versions
  1274.         // (you'll get a line of '?')
  1275.         try
  1276.           Size := ImmGetCompositionStringA(IMC, GCS_RESULTSTR, nil, 0);
  1277.           SetLength(s, Size);
  1278.           ImmGetCompositionStringA(IMC, GCS_RESULTSTR, PChar(s), Size);
  1279.         finally
  1280.           ImmReleaseContext(Handle, IMC);
  1281.         end;
  1282.         s := RVU_KeyToUnicode(s);
  1283.       end;
  1284.       InsertTextW_(s);
  1285.       Message.Result := 0;
  1286.     end;
  1287.     if (GetKeyboardLayout(0) and $FFFF)= $0412 then // Special support for Korean IME
  1288.       PostMessage(Handle, WM_IME_STARTCOMPOSITION,0,0);
  1289.     end
  1290.   else
  1291.     inherited;
  1292. end;
  1293. {$ENDIF}
  1294. {------------------------------------------------------------------------------}
  1295. procedure TCustomRichViewEdit.AssignEvents(Source: TCustomRichView);
  1296. begin
  1297.   inherited AssignEvents(Source);
  1298.   if Source is TCustomRichViewEdit then begin
  1299.     OnStyleConversion     := TCustomRichViewEdit(Source).OnStyleConversion;
  1300.     OnParaStyleConversion := TCustomRichViewEdit(Source).OnParaStyleConversion;
  1301.     OnPaste               := TCustomRichViewEdit(Source).OnPaste;
  1302.     {$IFDEF RVONCUT}
  1303.     OnCut                 := TCustomRichViewEdit(Source).OnCut;
  1304.     {$ENDIF}
  1305.     OnCurParaStyleChanged := TCustomRichViewEdit(Source).OnCurParaStyleChanged;
  1306.     OnCurTextStyleChanged := TCustomRichViewEdit(Source).OnCurTextStyleChanged;
  1307.     OnCaretMove           := TCustomRichViewEdit(Source).OnCaretMove;
  1308.     OnDropFiles           := TCustomRichViewEdit(Source).OnDropFiles;
  1309.     {$IFNDEF RVDONOTUSEDRAGDROP}
  1310.     OnOleDragEnter        := TCustomRichViewEdit(Source).OnOleDragEnter;
  1311.     OnOleDragOver         := TCustomRichViewEdit(Source).OnOleDragOver;
  1312.     OnOleDrop             := TCustomRichViewEdit(Source).OnOleDrop;
  1313.     OnOleDragLeave        := TCustomRichViewEdit(Source).OnOleDragLeave;
  1314.     {$ENDIF}
  1315.   end;
  1316. end;
  1317. {------------------------------------------------------------------------------}
  1318. procedure TCustomRichViewEdit.Selecting;
  1319. begin
  1320. end;
  1321. {------------------------------------------------------------------------------}
  1322. procedure TCustomRichViewEdit.AfterCaretMove;
  1323. begin
  1324.   if Assigned(FOnCaretMove) and not (csDestroying in ComponentState) then
  1325.     FOnCaretMove(Self);
  1326. end;
  1327. {------------------------------------------------------------------------------}
  1328. procedure TCustomRichViewEdit.SetFReadOnly(Value: Boolean);
  1329. begin
  1330.   FReadOnly := Value;
  1331. end;
  1332. {------------------------------------------------------------------------------}
  1333. procedure TCustomRichViewEdit.SetReadOnly(const Value: Boolean);
  1334. var rve: TCustomRichViewEdit;
  1335. begin
  1336.   FReadOnly := Value;
  1337.   if FReadOnly then
  1338.     TRVEditRVData(RVData).BuildJumpsCoords(True)
  1339.   else
  1340.     TRVEditRVData(RVData).ClearJumpsCoords;
  1341.   rve := Self;
  1342.   while (rve.InplaceEditor<>nil) and (rve.InplaceEditor is TCustomRichViewEdit) do
  1343.     rve := TCustomRichViewEdit(rve.InplaceEditor);
  1344.   TRVEditRVData(rve.RVData).ChangeCaret(False, False, True, False);
  1345.   Invalidate;
  1346. end;
  1347. {------------------------------------------------------------------------------}
  1348. function TCustomRichViewEdit.GetReadOnly: Boolean;
  1349. begin
  1350.   Result := FReadOnly;
  1351. end;
  1352. {------------------------------------------------------------------------------}
  1353. {$IFNDEF RVDONOTUSELISTS}
  1354. procedure TCustomRichViewEdit.ApplyListStyle(AListNo, AListLevel, AStartFrom: Integer;
  1355.                                        AUseStartFrom, ARecursive: Boolean);
  1356. begin
  1357.   if not BeforeChange(False) then exit;
  1358.   TRVEditRVData(GetTopLevelEditor.RVData).ApplyListStyle(AListNo, AListLevel, AStartFrom, AUseStartFrom, ARecursive, rvplopChange);
  1359. end;
  1360. {------------------------------------------------------------------------------}
  1361. procedure TCustomRichViewEdit.RemoveLists(ARecursive: Boolean);
  1362. begin
  1363.   if not BeforeChange(False) then exit;
  1364.   TRVEditRVData(GetTopLevelEditor.RVData).ApplyListStyle(-1, -1, -1, False, ARecursive, rvplopRemove);
  1365. end;
  1366. {------------------------------------------------------------------------------}
  1367. procedure TCustomRichViewEdit.ChangeListLevels(LevelDelta: Integer);
  1368. begin
  1369.   if not BeforeChange(False) then exit;
  1370.   TRVEditRVData(GetTopLevelEditor.RVData).ApplyListStyle(-1, LevelDelta, -1, False, False, rvplopLevel);
  1371. end;
  1372. {$ENDIF}
  1373. {------------------------------------------------------------------------------}
  1374. procedure TCustomRichViewEdit.GetCurrentLineCol(var Line, Column: Integer);
  1375. begin
  1376.   {$IFNDEF RVDONOTUSEINPLACE}
  1377.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1378.     TCustomRichViewEdit(InplaceEditor).GetCurrentLineCol(Line, Column);
  1379.     exit;
  1380.   end;
  1381.   {$ENDIF}
  1382.   Line := RVData.GetLineNo(CurItemNo,OffsetInCurItem);
  1383.   Column := TRVEditRVData(RVData).CaretOffs+1;
  1384. end;
  1385. {------------------------------------------------------------------------------}
  1386. procedure TCustomRichViewEdit.ConvertToHotPicture(ItemNo: Integer);
  1387. var item: TRVHotGraphicItemInfo;
  1388. begin
  1389.   {$IFNDEF RVDONOTUSEINPLACE}
  1390.   if (ItemNo<0) and (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1391.     TCustomRichViewEdit(InplaceEditor).ConvertToHotPicture(ItemNo);
  1392.     exit;
  1393.   end;
  1394.   {$ENDIF}
  1395.   if ItemNo<0 then
  1396.     ItemNo := CurItemNo;
  1397.   if GetItemStyle(ItemNo)<>rvsPicture then
  1398.     exit;
  1399.   if not BeforeChange(False) then exit;
  1400.   TRVEditRVData(RVData).BeginUndoSequence(rvutModifyItem, True);
  1401.   item := TRVHotGraphicItemInfo.CreateEx(RVData, nil, rvvaBaseline);
  1402.   SetUndoGroupMode(True);
  1403.   try
  1404.     TRVEditRVData(RVData).Do_ReplaceItem(ItemNo, item);
  1405.   finally
  1406.     SetUndoGroupMode(False);
  1407.   end;
  1408.   Change;
  1409. end;
  1410. {------------------------------------------------------------------------------}
  1411. procedure TCustomRichViewEdit.ConvertToPicture(ItemNo: Integer);
  1412. var item: TRVGraphicItemInfo;
  1413. begin
  1414.   {$IFNDEF RVDONOTUSEINPLACE}
  1415.   if (ItemNo<0) and (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  1416.     TCustomRichViewEdit(InplaceEditor).ConvertToPicture(ItemNo);
  1417.     exit;
  1418.   end;
  1419.   {$ENDIF}
  1420.   if ItemNo<0 then
  1421.     ItemNo := CurItemNo;
  1422.   if GetItemStyle(ItemNo)<>rvsHotPicture then
  1423.     exit;
  1424.   if not BeforeChange(False) then exit;
  1425.   TRVEditRVData(RVData).BeginUndoSequence(rvutModifyItem, True);
  1426.   item := TRVGraphicItemInfo.CreateEx(RVData, nil, rvvaBaseline);
  1427.   SetUndoGroupMode(True);
  1428.   try
  1429.     TRVEditRVData(RVData).Do_ReplaceItem(ItemNo, item);
  1430.   finally
  1431.     SetUndoGroupMode(False);
  1432.   end;
  1433.   Change;
  1434. end;
  1435. {------------------------------------------------------------------------------}
  1436. function TCustomRichViewEdit.GetTopLevelEditor: TCustomRichViewEdit;
  1437. begin
  1438.   Result := Self;
  1439.   {$IFNDEF RVDONOTUSEINPLACE}
  1440.   while (Result.InplaceEditor<>nil) and (Result.InplaceEditor is TCustomRichViewEdit) do
  1441.     Result := TCustomRichViewEdit(Result.InplaceEditor);
  1442.   {$ENDIF}
  1443. end;
  1444. {------------------------------------------------------------------------------}
  1445. function TCustomRichViewEdit.GetRootEditor: TCustomRichViewEdit;
  1446. begin
  1447.   Result := RVData.GetAbsoluteRootData.GetParentControl as TCustomRichViewEdit;
  1448. end;
  1449. {------------------------------------------------------------------------------}
  1450. function TCustomRichViewEdit.DoChanging: Boolean;
  1451. begin
  1452.   Result := True;
  1453.   if (GetRootEditor.LockCount<=0) and Assigned(FOnChanging) then
  1454.     FOnChanging(GetRootEditor, Result);
  1455. end;
  1456. {$IFNDEF RVDONOTUSEDRAGDROP}
  1457. {------------------------------------------------------------------------------}
  1458. { OLE drag&drop,  All these functions are called by FDropTarget:TRVDropTarget,
  1459.   related to IDropTarget.                                                      }
  1460. {------------------------------------------------------------------------------}
  1461. { Drag cursor is entered into the control. From IDropTarget.DragEnter.
  1462.   X,Y - client coordinates.
  1463.   Creating RVData.FDragDropCaretInfo, activating scrolling timer,
  1464.   calling OleDragOver.                                                         }
  1465. function TCustomRichViewEdit.OleDragEnter(X,Y: Integer): Boolean;
  1466. begin
  1467.   if (csDesigning in ComponentState) or (Style=nil) or
  1468.      (ReadOnly and not (rvflDBRichViewEdit in RVData.GetAbsoluteRootData.Flags)) then begin
  1469.     Result := False;
  1470.     exit;
  1471.   end;
  1472.   TRVEditRVData(RVData.GetAbsoluteRootData).CreateDragDropCaretInfo;
  1473.   ActivateScrollTimer(True);
  1474.   OleDragOver(X, Y);
  1475.   TRVEditRVData(TopLevelEditor.RVData).ChangeCaret(False, False, True, False);
  1476.   Result := True;
  1477. end;
  1478. {------------------------------------------------------------------------------}
  1479. function ConvertEffect(Effect: Integer): TRVOleDropEffects;
  1480. begin
  1481.   Result := [];
  1482.   if (DROPEFFECT_COPY and Effect)<>0 then
  1483.     Include(Result, rvdeCopy);
  1484.   if (DROPEFFECT_MOVE and Effect)<>0 then
  1485.     Include(Result, rvdeMove);
  1486.   if (DROPEFFECT_LINK and Effect)<>0 then
  1487.     Include(Result, rvdeLink);
  1488. end;
  1489. {------------------------------------------------------------------------------}
  1490. procedure TCustomRichViewEdit.CallOleDragEnterEvent(const DataObj: IDataObject;
  1491.   KeyState: Integer; pt: TPoint; PossibleEffects: Integer; var Effect: Integer);
  1492. var AEffect: TRVOleDropEffect;
  1493.    Sender: TCustomRichViewEdit;
  1494. begin
  1495.   if Assigned(OnOleDragEnter) then begin
  1496.     Sender := RootEditor;
  1497.     if Sender<>Self then
  1498.       pt := Sender.ScreenToClient(ClientToScreen(pt));
  1499.     AEffect := TRVOleDropEffect(Effect and $F);
  1500.     OnOleDragEnter(Sender, DataObj, KeysToShiftState(KeyState), pt.X, pt.Y,
  1501.       ConvertEffect(PossibleEffects), AEffect);
  1502.     Effect := ord(AEffect);
  1503.   end;
  1504. end;
  1505. {------------------------------------------------------------------------------}
  1506. { Finished. From IDropTarget.DragLeave
  1507.   Deactivating scrolling timer, destroying RVData.FDragDropCaretInfo.          }
  1508. procedure TCustomRichViewEdit.OleDragLeave;
  1509. begin
  1510.   DeactivateScrollTimer;
  1511.   RVData.RemoveDragDropCaret;
  1512.   TRVEditRVData(RVData.GetAbsoluteRootData).ReleaseDragDropCaretInfo;
  1513.   if RVData.GetDragDropCaretInfo=nil then
  1514.     TRVEditRVData(TopLevelEditor.RVData).ChangeCaret(False, False, True, False);
  1515.   if Assigned(OnOleDragLeave) then
  1516.     OnOleDragLeave(GetRootEditor);
  1517. end;
  1518. {------------------------------------------------------------------------------}
  1519. { Dragging over. From IDropTarget.DragOver.
  1520.   X,Y - client coordinates.
  1521.   Scrolling if the caret is in 20-pixels area near the top or bottom
  1522.   (to-do: scrolling does not work for inplace editor).
  1523.   Displaying drag&drop caret.                                                  }
  1524. function TCustomRichViewEdit.OleDragOver(X, Y: Integer): Boolean;
  1525. begin
  1526.   if Y<20 then
  1527.     VScrollDelta := -1
  1528.   else if Y>ClientHeight-20 then
  1529.     VScrollDelta := +1
  1530.   else
  1531.     VScrollDelta := 0;
  1532.   if (TRVEditRVData(RVData).GetDragDropCaretInfo<>nil) then begin
  1533.     RVData.SetDragDropCaretTo(X,Y);
  1534.     with TRVEditRVData(RVData).GetDragDropCaretInfo do
  1535.       Result := TCustomRVFormattedData(RVData).CanInsertHere(ItemNo, ItemOffs);
  1536.     end
  1537.   else
  1538.     Result := False;
  1539. end;
  1540. {------------------------------------------------------------------------------}
  1541. procedure TCustomRichViewEdit.CallOleDragOverEvent(KeyState: Integer; pt: TPoint;
  1542.   PossibleEffects: Integer; var Effect: Integer);
  1543. var AEffect: TRVOleDropEffect;
  1544.    Sender: TCustomRichViewEdit;
  1545. begin
  1546.   if Assigned(OnOleDragOver) then begin
  1547.     Sender := RootEditor;
  1548.     if Sender<>Self then
  1549.       pt := Sender.ScreenToClient(ClientToScreen(pt));
  1550.     AEffect := TRVOleDropEffect(Effect and $F);
  1551.     OnOleDragOver(Sender, KeysToShiftState(KeyState), pt.X, pt.Y,
  1552.       ConvertEffect(PossibleEffects), AEffect);
  1553.     Effect := ord(AEffect);
  1554.   end;
  1555. end;
  1556. {------------------------------------------------------------------------------}
  1557. { Dropping. From IDropTarget.Drop.
  1558.   Known problems:
  1559.   - when moving to inplace editor, will be undone in two steps;
  1560. }
  1561. function TCustomRichViewEdit.OleDrop(const DataObj: IDataObject;
  1562.   FMove: Boolean; KeyState: Integer; pt: TPoint; PossibleEffects: Integer): Integer;
  1563. var CItemNo, COffs: Integer;
  1564.     Format: Word;
  1565.     DragDropCaretInfo: TRVDragDropCaretInfo;
  1566.     UndoGrouped, Beginning, BeginningIsText, BeforeInsertCalled: Boolean;
  1567.     {..............................................}
  1568.     procedure BeforeInsert;
  1569.     begin
  1570.       if BeforeInsertCalled then
  1571.         exit;
  1572.       BeforeInsertCalled := True;
  1573.       if not UndoGrouped then begin
  1574.         BeginUndoGroup(rvutInsert);
  1575.         SetUndoGroupMode(True);
  1576.         //LockWindowUpdate(TopLevelEditor.Handle);
  1577.         SendMessage(GetRootEditor.Handle, WM_SETREDRAW, 0, 0);
  1578.         UndoGrouped := True;
  1579.       end;
  1580.       CItemNo := TopLevelEditor.CurItemNo;
  1581.       COffs   := TopLevelEditor.OffsetInCurItem;
  1582.       Beginning := (COffs<=TopLevelEditor.GetOffsBeforeItem(CItemNo));
  1583.       if Beginning then
  1584.         BeginningIsText := TopLevelEditor.GetItemStyle(CItemNo)>=0;
  1585.     end;
  1586.     {..............................................}
  1587.     procedure AfterInsert;
  1588.     var IsText2: Boolean;
  1589.     begin
  1590.       if UndoGrouped then begin
  1591.         //TRVEditRVData(RVData).FinalizeUndoGroup;
  1592.         SetUndoGroupMode(False);
  1593.         Change;
  1594.       end;
  1595.       if Beginning then begin
  1596.         IsText2 := TopLevelEditor.GetItemStyle(CItemNo)>=0;
  1597.         if BeginningIsText and not IsText2 then
  1598.           COffs := 0
  1599.         else if IsText2 and (COffs=0) then
  1600.           COffs := 1;
  1601.       end;
  1602.       TopLevelEditor.SetSelectionBounds(CItemNo, COffs,
  1603.         TopLevelEditor.CurItemNo, TopLevelEditor.OffsetInCurItem);
  1604.       if UndoGrouped then begin
  1605.         //LockWindowUpdate(0);
  1606.         SendMessage(GetRootEditor.Handle, WM_SETREDRAW, 1, 0);
  1607.         RefreshAll;
  1608.         UndoGrouped := False;
  1609.       end;
  1610.     end;
  1611.     {..............................................}
  1612.     function InsertAsRTF: Boolean;
  1613.     {$IFNDEF RVDONOTUSERTFIMPORT}
  1614.     var Stream : TMemoryStream;
  1615.     {$ENDIF}
  1616.     begin
  1617.       Result := False;
  1618.       {$IFNDEF RVDONOTUSERTFIMPORT}
  1619.       if not (rvddRTF in AcceptDragDropFormats) then
  1620.         exit;
  1621.       if FDropTarget.HasFormat(DataObj, CFRV_RTF) then begin
  1622.         Stream := FDropTarget.GetAsStream(DataObj, CFRV_RTF);
  1623.         if Stream<>nil then begin
  1624.           BeforeInsert;
  1625.           try
  1626.             InsertRTFFromStreamEd(Stream);
  1627.             Result := True;
  1628.           finally
  1629.             AfterInsert;
  1630.             Stream.Free;
  1631.           end;
  1632.         end;
  1633.       end;
  1634.       {$ENDIF}
  1635.     end;
  1636.     {..............................................}
  1637.     function InsertAsRVF: Boolean;
  1638.     var Stream : TMemoryStream;
  1639.     begin
  1640.       Result := False;
  1641.       if not (rvddRVF in AcceptDragDropFormats) then
  1642.         exit;
  1643.       if FDropTarget.HasFormat(DataObj, CFRV_RVF) then begin
  1644.         Stream := FDropTarget.GetAsStream(DataObj, CFRV_RVF);
  1645.         if Stream<>nil then begin
  1646.           BeforeInsert;
  1647.           try
  1648.             InsertRVFFromStreamEd(Stream);
  1649.             Result := True;
  1650.           finally
  1651.             AfterInsert;
  1652.             Stream.Free;
  1653.           end;
  1654.         end;
  1655.       end;
  1656.     end;
  1657.     {..............................................}
  1658.     function InsertAsTextA: Boolean;
  1659.     var s: String;
  1660.     begin
  1661.       Result := False;
  1662.       if not (rvddText in AcceptDragDropFormats) then
  1663.         exit;
  1664.       if FDropTarget.HasFormat(DataObj, CF_TEXT) and
  1665.          FDropTarget.GetAsText(DataObj, CF_TEXT, s) then begin
  1666.         BeforeInsert;
  1667.         try
  1668.           InsertText(s, False);
  1669.           Result := True;
  1670.         finally
  1671.           AfterInsert;
  1672.         end;
  1673.       end;
  1674.     end;
  1675.     {..............................................}
  1676.     function InsertAsTextW: Boolean;
  1677.     {$IFNDEF RVDONOTUSEUNICODE}
  1678.     var s: String;
  1679.     {$ENDIF}
  1680.     begin
  1681.       Result := False;
  1682.       {$IFNDEF RVDONOTUSEUNICODE}
  1683.       if not (rvddUnicodeText in AcceptDragDropFormats) then
  1684.         exit;
  1685.       if FDropTarget.HasFormat(DataObj, CF_UNICODETEXT) and
  1686.          FDropTarget.GetAsTextW(DataObj, s) then begin
  1687.         BeforeInsert;
  1688.         try
  1689.           InsertTextW_(s);
  1690.           Result := True;
  1691.         finally
  1692.           AfterInsert;
  1693.         end;
  1694.       end;
  1695.       {$ENDIF}
  1696.     end;
  1697.     {..............................................}
  1698.     function InsertAsURL: Boolean;
  1699.     var Target, Title: String;
  1700.         StyleNo, Tag: Integer;
  1701.         StgMedium: TStgMedium;
  1702.         PFGD: PFileGroupDescriptor;
  1703.         cf: Word;
  1704.     begin
  1705.       Result := False;
  1706.       if not (rvddURL in AcceptDragDropFormats) then
  1707.         exit;
  1708.       if FDropTarget.HasFormat(DataObj, CFRV_URL) and
  1709.          FDropTarget.GetAsText(DataObj, CFRV_URL, Target) then begin
  1710.         Title := Target;
  1711.         {
  1712.         if FDropTarget.HasFormat(DataObj, CF_HDROP) then begin
  1713.           Files := FDropTarget.GetAsFiles(DataObj);
  1714.           if (Files.Count=1) and
  1715.              (AnsiCompareText(ExtractFileExt(Files[0]), '.url')=0) then
  1716.             Title := System.Copy(Files[0], 1, Length(Files[0])-4);
  1717.           Files.Free;
  1718.         end;
  1719.         }
  1720.         cf := RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR);
  1721.         if FDropTarget.HasFormat(DataObj, cf) and
  1722.            FDropTarget.GetMedium(DataObj, cf, StgMedium) then begin
  1723.           PFGD := Pointer(GlobalLock(StgMedium.HGlobal));
  1724.           Title := pFGD^.fgd[0].cFileName;
  1725.           GlobalUnlock(StgMedium.HGlobal);
  1726.           if Length(Title)>4 then
  1727.             Delete(Title, Length(Title)-3,4)
  1728.           else
  1729.             Title := Target;
  1730.           ReleaseStgMedium(StgMedium);
  1731.         end;
  1732.         BeforeInsert;
  1733.         try
  1734.           if Assigned(OnReadHyperlink) then begin
  1735.             StyleNo := CurTextStyleNo;
  1736.             Tag := 0;
  1737.             OnReadHyperlink(Self, Target, '', rvlfURL, StyleNo, Tag, Title);
  1738.             CurTextStyleNo := StyleNo;
  1739.             InsertStringTag(Title, Tag);
  1740.             end
  1741.           else
  1742.             InsertText(Target, False);
  1743.           Result := True;
  1744.         finally
  1745.           AfterInsert;
  1746.         end;
  1747.       end;
  1748.     end;
  1749.     {..............................................}
  1750.     function InsertAsText: Boolean;
  1751.     begin
  1752.       {$IFNDEF RVDONOTUSEUNICODE}
  1753.       if Style.TextStyles[CurTextStyleNo].Unicode then
  1754.         Result := InsertAsTextW or InsertAsTextA
  1755.       else
  1756.       {$ENDIF}
  1757.         Result := InsertAsTextA or InsertAsTextW;
  1758.     end;
  1759.     {..............................................}
  1760.     function InsertAsBitmap: Boolean;
  1761.     var bmp: TBitmap;
  1762.     begin
  1763.       Result := False;
  1764.       if not (rvddBitmap in AcceptDragDropFormats) then
  1765.         exit;
  1766.       if FDropTarget.HasFormat(DataObj, CF_BITMAP) or
  1767.          FDropTarget.HasFormat(DataObj, CF_DIB) then begin
  1768.         bmp := FDropTarget.GetAsBitmap(DataObj, Format<>CF_BITMAP);
  1769.         if (bmp<>nil) and not bmp.Empty then begin
  1770.           BeforeInsert;
  1771.           try
  1772.             InsertPicture('', bmp, rvvaBaseline);
  1773.             Result := True;
  1774.           finally
  1775.             AfterInsert;
  1776.           end;
  1777.           end
  1778.         else
  1779.           bmp.Free;
  1780.       end;
  1781.     end;
  1782.     {..............................................}
  1783.     function InsertAsMetafile: Boolean;
  1784.     var wmf: TMetafile;
  1785.     begin
  1786.       Result := False;
  1787.       if not (rvddMetafile in AcceptDragDropFormats) then
  1788.         exit;
  1789.       if FDropTarget.HasFormat(DataObj, CF_ENHMETAFILE) then begin
  1790.         wmf := FDropTarget.GetAsMetafile(DataObj);
  1791.         if (wmf<>nil) then begin
  1792.           BeforeInsert;
  1793.           try
  1794.             InsertPicture('', wmf, rvvaBaseline);
  1795.             Result := True;
  1796.           finally
  1797.             AfterInsert;
  1798.           end;
  1799.         end;
  1800.       end;
  1801.     end;
  1802.     {..............................................}
  1803.     function InsertFile(const FileName: String): Boolean;
  1804.     var pic: TPicture;
  1805.         gr: TGraphic;
  1806.         Ext: String;
  1807.     begin
  1808.       Result := False;
  1809.       try
  1810.         pic := TPicture.Create;
  1811.         try
  1812.           pic.LoadFromFile(FileName);
  1813.           gr := RV_CreateGraphics(TGraphicClass(pic.Graphic.ClassType));
  1814.           gr.Assign(pic.Graphic);
  1815.           InsertPicture('', gr, rvvaBaseline);
  1816.           Result := True;
  1817.         except;
  1818.         end;
  1819.         pic.Free;
  1820.         if Result then
  1821.           exit;
  1822.         Ext := LowerCase(ExtractFileExt(FileName));
  1823.         {$IFNDEF RVDONOTUSERTFIMPORT}
  1824.         if Ext='.rtf' then begin
  1825.           InsertRTFFromFileEd(FileName);
  1826.           Result := True;
  1827.           exit;
  1828.         end;
  1829.         {$ENDIF}
  1830.         if Ext='.rvf' then begin
  1831.           InsertRVFFromFileEd(FileName);
  1832.           Result := True;
  1833.           exit;
  1834.         end;
  1835.         if Ext='.txt' then begin
  1836.           InsertTextFromFile(FileName);
  1837.           Result := True;
  1838.           exit;
  1839.         end;
  1840.       except
  1841.       end;
  1842.     end;
  1843.     {..............................................}
  1844.     function InsertAsFiles: Boolean;
  1845.     var Files: TStringList;
  1846.         DoDefault: Boolean;
  1847.         i: Integer;
  1848.         FileAction: TRVDropFileAction;
  1849.     begin
  1850.       Result := False;
  1851.       if not (rvddFiles in AcceptDragDropFormats) then
  1852.         exit;
  1853.       if FDropTarget.HasFormat(DataObj, CF_HDROP) then begin
  1854.         Files := FDropTarget.GetAsFiles(DataObj);
  1855.         if (Files<>nil) then begin
  1856.           BeforeInsert;
  1857.           try
  1858.             DoDefault := True;
  1859.             FileAction := rvdfNone;
  1860.             if Assigned(FOnDropFiles) then
  1861.               FOnDropFiles(GetRootEditor, Files, FileAction, DoDefault);
  1862.             if DoDefault then begin
  1863.               for i := 0 to Files.Count-1 do
  1864.                 Result := InsertFile(Files[i]) or Result;
  1865.               end
  1866.             else
  1867.               Result := FileAction<>rvdfNone;
  1868.           finally
  1869.             AfterInsert;
  1870.             Files.Free;
  1871.           end;
  1872.         end;
  1873.       end;
  1874.     end;
  1875.     {..............................................}
  1876.     function DoInsert(var DropEffect: TRVOleDropEffect): Boolean;
  1877.     var DoDefault: Boolean;
  1878.         Sender: TCustomRichViewEdit;
  1879.     begin
  1880.       DropEffect := rvdeNone;
  1881.       if Assigned(FOnOleDrop) then begin
  1882.         Result := False;
  1883.         if FMove then
  1884.           DropEffect := rvdeMove
  1885.         else
  1886.           DropEffect := rvdeCopy;
  1887.         BeforeInsert;
  1888.         try
  1889.           DoDefault := True;
  1890.           Sender := RootEditor;
  1891.           if Sender<>Self then
  1892.             pt := Sender.ScreenToClient(ClientToScreen(pt));
  1893.           FOnOleDrop(Sender, DataObj, KeysToShiftState(KeyState), pt.X, pt.Y,
  1894.             ConvertEffect(PossibleEffects),  DropEffect, DoDefault);
  1895.           Result := not DoDefault;
  1896.         finally
  1897.           if Result then
  1898.             AfterInsert;
  1899.         end;
  1900.         if Result then
  1901.           exit;
  1902.       end;
  1903.       case Format of
  1904.         0:
  1905.           Result := InsertAsRVF or InsertAsRTF or InsertAsURL or InsertAsText or
  1906.             InsertAsBitmap or InsertAsMetafile or InsertAsFiles;
  1907.         CF_TEXT:
  1908.           Result := InsertAsTextA;
  1909.         {$IFNDEF RVDONOTUSEUNICODE}
  1910.         CF_UNICODETEXT:
  1911.           Result := InsertAsTextW;
  1912.         {$ENDIF}
  1913.         CF_BITMAP:
  1914.           Result := InsertAsBitmap;
  1915.         CF_ENHMETAFILE:
  1916.           Result := InsertAsMetafile;
  1917.         else
  1918.           begin
  1919.             if Format=CFRV_RVF then
  1920.               Result := InsertAsRVF
  1921.             else if Format=CFRV_RTF then
  1922.               Result := InsertAsRTF
  1923.             else
  1924.               Result := False;
  1925.           end;
  1926.       end;
  1927.     end;
  1928.     {..............................................}
  1929. var CustomDropEffect: TRVOleDropEffect;
  1930. begin
  1931.   BeforeInsertCalled := False;
  1932.   UndoGrouped := False;
  1933.   DeactivateScrollTimer;
  1934.   RVData.RemoveDragDropCaret;
  1935.   DragDropCaretInfo := TRVEditRVData(RVData).GetDragDropCaretInfo;
  1936.   if
  1937.     not TCustomRVFormattedData(DragDropCaretInfo.RVData).Item_InsideSelection(
  1938.       DragDropCaretInfo.ItemNo, DragDropCaretInfo.ItemOffs) then begin
  1939.     if TCustomRVFormattedData(DragDropCaretInfo.RVData).CanInsertHere(
  1940.         DragDropCaretInfo.ItemNo, DragDropCaretInfo.ItemOffs) then begin
  1941.       if RVData.IsDragging then begin
  1942.         Format := GetAcceptableRVFormat;
  1943.         if Format<>0 then
  1944.           if not TRichViewRVData(RVData.GetAbsoluteRootData).FDropSource.StoreData(Format) then
  1945.             Format := 0;
  1946.         if FMove then begin
  1947.           //LockWindowUpdate(TopLevelEditor.Handle);
  1948.           SendMessage(GetRootEditor.Handle, WM_SETREDRAW, 0, 0);
  1949.           UndoGrouped := True;
  1950.           BeginUndoGroup(rvutInsert);
  1951.           SetUndoGroupMode(True);
  1952.           DeleteSelection;
  1953.           RVData.GetAbsoluteRootData.State := RVData.GetAbsoluteRootData.State-
  1954.             [rvstCanDragDropDeleteSelection];
  1955.         end;
  1956.         end
  1957.       else
  1958.         Format := 0;
  1959.       DragDropCaretInfo.RVData := DragDropCaretInfo.RVData.Edit;
  1960.       TCustomRVFormattedData(DragDropCaretInfo.RVData).
  1961.         SetSelectionBounds(DragDropCaretInfo.ItemNo, DragDropCaretInfo.ItemOffs,
  1962.           DragDropCaretInfo.ItemNo, DragDropCaretInfo.ItemOffs);
  1963.       if DragDropCaretInfo.RVData is TRVEditRVData then begin
  1964.         TRVEditRVData(RVData.GetAbsoluteRootData).ReleaseDragDropCaretInfo;
  1965.         if DoInsert(CustomDropEffect) then begin
  1966.           if CustomDropEffect=rvdeNone then
  1967.             if FMove then
  1968.               Result := DROPEFFECT_MOVE
  1969.             else
  1970.               Result := DROPEFFECT_COPY
  1971.             else
  1972.               Result := ord(CustomDropEffect)
  1973.           end
  1974.         else
  1975.           Result := DROPEFFECT_NONE;
  1976.         end
  1977.       else begin
  1978.         Result := DROPEFFECT_NONE;
  1979.         RVData.Beep;
  1980.       end;
  1981.       end
  1982.     else
  1983.       Result := DROPEFFECT_NONE;
  1984.     end
  1985.   else begin
  1986.     DragDropCaretInfo.RVData := DragDropCaretInfo.RVData.Edit;
  1987.     TCustomRVFormattedData(DragDropCaretInfo.RVData).
  1988.       SetSelectionBounds(DragDropCaretInfo.ItemNo, DragDropCaretInfo.ItemOffs,
  1989.         DragDropCaretInfo.ItemNo, DragDropCaretInfo.ItemOffs);
  1990.     TCustomRVFormattedData(DragDropCaretInfo.RVData).Invalidate;
  1991.     Result := DROPEFFECT_NONE;
  1992.   end;
  1993.   TRVEditRVData(RVData.GetAbsoluteRootData).ReleaseDragDropCaretInfo;
  1994.   {if Result = DROPEFFECT_NONE then
  1995.     RVData.Beep;}
  1996.   if UndoGrouped then begin
  1997.     SetUndoGroupMode(False);
  1998.     //LockWindowUpdate(0);
  1999.     SendMessage(GetRootEditor.Handle, WM_SETREDRAW, 1, 0);
  2000.     RefreshAll;
  2001.   end;
  2002.   TRVEditRVData(TopLevelEditor.RVData).ChangeCaret(False, False, True, True);
  2003. end;
  2004. {------------------------------------------------------------------------------}
  2005. { Informs about destroying of FDropTarget.
  2006.   It is destroyed when ref-count = 0.
  2007.   Its ref-count is incremented in WMCreate and decremented in WMDestroy.       }
  2008. procedure TCustomRichViewEdit.ReleaseOleDropTargetObject;
  2009. begin
  2010.   FDropTarget := nil;
  2011. end;
  2012. {------------------------------------------------------------------------------}
  2013. { Can the format be accepted?                                                  }
  2014. function TCustomRichViewEdit.OleCanAcceptFormat(Format: Word): Boolean;
  2015. begin
  2016.   case Format of
  2017.     CF_TEXT:
  2018.       Result := rvddText in AcceptDragDropFormats;
  2019.     {$IFNDEF RVDONOTUSEUNICODE}
  2020.     CF_UNICODETEXT:
  2021.       Result := rvddUnicodeText in AcceptDragDropFormats;
  2022.     {$ENDIF}
  2023.     CF_BITMAP, CF_DIB:
  2024.       Result := rvddBitmap in AcceptDragDropFormats;
  2025.     CF_ENHMETAFILE:
  2026.       Result := rvddMetafile in AcceptDragDropFormats;
  2027.     CF_HDROP:
  2028.       Result := rvddFiles in AcceptDragDropFormats;
  2029.     else
  2030.       begin
  2031.         {$IFNDEF RVDONOTUSERTFIMPORT}
  2032.         if Format=CFRV_RTF then begin
  2033.           Result := rvddRTF in AcceptDragDropFormats;
  2034.           exit;
  2035.         end;
  2036.         {$ENDIF}
  2037.         {$IFNDEF RVDONOTUSERVF}
  2038.         if Format=CFRV_RVF then begin
  2039.           Result := rvddRVF in AcceptDragDropFormats;
  2040.           exit;
  2041.         end;
  2042.         {$ENDIF}
  2043.         if Format=CFRV_URL then begin
  2044.           Result := rvddURL in AcceptDragDropFormats;
  2045.           exit;
  2046.         end;
  2047.         Result := False;
  2048.       end;
  2049.   end;
  2050. end;
  2051. {------------------------------------------------------------------------------}
  2052. { Returns a preferable drag&drop format that can be accepted when dragging
  2053.   from itself.                                                                 }
  2054. function TCustomRichViewEdit.GetAcceptableRVFormat: Word;
  2055. var gr: TGraphic;
  2056. begin
  2057.   if rvddRVF in AcceptDragDropFormats then
  2058.     Result := CFRV_RVF
  2059.   {$IFNDEF RVDONOTUSERTFIMPORT}
  2060.   {$IFNDEF RVDONOTUSERTF}
  2061.   else
  2062.     if rvddRTF in AcceptDragDropFormats then
  2063.     Result := CFRV_RTF
  2064.   {$ENDIF}
  2065.   {$ENDIF}
  2066.   else begin
  2067.     Result := 0;
  2068.     gr := GetSelectedImage;
  2069.     if gr<>nil then begin
  2070.       if (gr is TBitmap) and (rvddBitmap in AcceptDragDropFormats) then
  2071.         Result := CF_BITMAP
  2072.       else if (gr is TMetafile) and (rvddMetafile in AcceptDragDropFormats) then
  2073.         Result := CF_ENHMETAFILE;
  2074.     end;
  2075.     if Result=0 then
  2076.       {$IFNDEF RVDONOTUSEUNICODE}
  2077.       if rvddUnicodeText in AcceptDragDropFormats then
  2078.         Result := CF_UNICODETEXT
  2079.       else
  2080.       {$ENDIF}
  2081.       if rvddText in AcceptDragDropFormats then
  2082.         Result := CF_TEXT;
  2083.   end;
  2084. end;
  2085. {$ENDIF}
  2086. {------------------------------------------------------------------------------}
  2087. {$IFNDEF RVDONOTUSELIVESPELL}
  2088. { Returns current (at the position of caret) misspelled word and its text style.
  2089.   If SelectIt, also selects this word.
  2090.   If no selection in the caret position, returns False. }
  2091. function TCustomRichViewEdit.GetCurrentMisspelling(SelectIt: Boolean;
  2092.       var Word: String; var StyleNo: Integer): Boolean;
  2093. var ItemNo, Offs, Len: Integer;
  2094. begin
  2095.   {$IFNDEF RVDONOTUSEINPLACE}
  2096.   if (InplaceEditor<>nil) and (InplaceEditor is TCustomRichViewEdit) then begin
  2097.     Result := TCustomRichViewEdit(InplaceEditor).GetCurrentMisspelling(SelectIt,
  2098.       Word, StyleNo);
  2099.     exit;
  2100.   end;
  2101.   {$ENDIF}
  2102.   Result := False;
  2103.   ItemNo := CurItemNo;
  2104.   Offs := OffsetInCurItem;
  2105.   if (GetItemStyle(ItemNo)<0) then begin
  2106.     if (ItemNo+1<ItemCount) and not IsFromNewLine(ItemNo+1) and
  2107.       (GetItemStyle(ItemNo+1)>=0) then begin
  2108.       inc(ItemNo);
  2109.       Offs := GetOffsBeforeItem(ItemNo);
  2110.       end
  2111.     else
  2112.       exit;
  2113.   end;
  2114.   Result := GetItem(ItemNo).GetMisspelling(Offs, Offs, Len);
  2115.   if Result then begin
  2116.     Word := System.Copy(GetItemTextA(ItemNo), Offs, Len);
  2117.     StyleNo := GetItemStyle(ItemNo);
  2118.     if SelectIt then begin
  2119.       SetSelectionBounds(ItemNo, Offs, ItemNo, Offs+Len);
  2120.       Invalidate;
  2121.     end;
  2122.   end;
  2123. end;
  2124. {$ENDIF}
  2125. {------------------------------------------------------------------------------}
  2126. { If misspelled word was clicked, this method adjusts Y coordinate in pt to
  2127.   display a popup menu below the misspelled word.
  2128.   Pt contains coordinates in document. }
  2129. procedure TCustomRichViewEdit.AdjustPopupMenuPos(var pt: TPoint);
  2130. {$IFNDEF RVDONOTUSELIVESPELL}
  2131. var ItemNo, Offs, Len: Integer;
  2132. {$ENDIF}
  2133. begin
  2134.   {$IFNDEF RVDONOTUSELIVESPELL}
  2135.   ItemNo := CurItemNo;
  2136.   Offs := OffsetInCurItem;
  2137.   if (GetItemStyle(ItemNo)<0) then begin
  2138.     if (ItemNo+1<ItemCount) and not IsFromNewLine(ItemNo+1) and
  2139.       (GetItemStyle(ItemNo+1)>=0) then begin
  2140.       inc(ItemNo);
  2141.       Offs := GetOffsBeforeItem(ItemNo);
  2142.       end
  2143.     else
  2144.       exit;
  2145.   end;
  2146.   if GetItem(ItemNo).GetMisspelling(Offs, Offs, Len) then begin
  2147.     RVData.Item2DrawItem(ItemNo, Offs, ItemNo, Offs);
  2148.     pt.Y := RVData.DrawItems[ItemNo].Top+RVData.DrawItems[ItemNo].Height-RVData.GetVOffs;
  2149.   end;
  2150.   {$ENDIF}
  2151. end;
  2152. {------------------------------------------------------------------------------}
  2153. {$IFNDEF RVDONOTUSEDRAGDROP}
  2154. procedure TCustomRichViewEdit.RefreshAll;
  2155. var rve: TCustomRichViewEdit;
  2156.     i: Integer;
  2157. begin
  2158.   rve := GetRootEditor;
  2159.   while rve<>nil do begin
  2160.     rve.Refresh;
  2161.     for i := 0 to rve.ControlCount-1 do
  2162.       if rve.Controls[i]<>rve.InplaceEditor then begin
  2163.         rve.Controls[i].Hide;
  2164.         rve.Controls[i].Show;
  2165.       end;
  2166.     rve := TCustomRichViewEdit(rve.InplaceEditor);
  2167.   end;
  2168. end;
  2169. {$ENDIF}
  2170. {------------------------------------------------------------------------------}
  2171. {$IFNDEF RVDONOTUSESMARTPOPUP}
  2172. procedure TCustomRichViewEdit.SetSmartPopupTarget;
  2173. var rve: TCustomRichViewEdit;
  2174. begin
  2175.   if TRichViewRVData(RVData).FSmartPopupButton=nil then
  2176.     exit;
  2177.   rve := TopLevelEditor;
  2178.   TRichViewRVData(RVData).FSmartPopupButton.RVData := rve.RVData.GetSourceRVData;
  2179.   TRichViewRVData(RVData).FSmartPopupButton.ItemNo := rve.GetCurItemNo;
  2180.   TRichViewRVData(RVData).FSmartPopupButton.Item   :=
  2181.     rve.RVData.GetRVData.GetItem(TRichViewRVData(RVData).FSmartPopupButton.ItemNo);
  2182.   TRichViewRVData(RVData).SetSmartPopupCoords;
  2183. end;
  2184. {$ENDIF}
  2185. end.