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

RichEdit

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {       RichView                                        }
  4. {       A set of functions retrieving WideString text
  5. {       from document.                                  }
  6. {                                                       }
  7. {       Copyright (c) 2003, Sergey Tkachenko            }
  8. {       svt@trichview.com                               }
  9. {       http://www.trichview.com                        }
  10. {                                                       }
  11. {*******************************************************}
  12. unit RVGetTextW;
  13. interface
  14. uses RVUni, RVItem, RichView, RVEdit, CRVData;
  15. // Returns text of line with caret
  16. function GetCurrentLineText(rve: TCustomRichViewEdit): WideString;
  17. // Returns visible text (may be, with a line before and after)
  18. function GetVisibleText(rv: TCustomRichView): WideString;
  19. // Returns all text
  20. function GetAllText(rv: TCustomRichView): WideString;
  21. // Returns all text in RVData
  22. function GetRVDataText(RVData: TCustomRVData): WideString;
  23. // Returns text of paragraph section with caret
  24. // (paragraph section is a part of document limited either by
  25. // paragraph breaks or by new line breaks (added with Shift+Enter)
  26. function GetCurrentParaSectionText(rve: TCustomRichViewEdit): WideString;
  27. // Returns text of paragraph with caret
  28. function GetCurrentParaText(rve: TCustomRichViewEdit): WideString;
  29. // Returns character to the left of caret.
  30. // If caret is at the beginning of line, - to the right.
  31. // If no character, returns empty string
  32. function GetCurrentChar(rve: TCustomRichViewEdit): WideString;
  33. // Returns the current word
  34. function GetCurrentWord(rve: TCustomRichViewEdit): WideString;
  35. implementation
  36. function GetItemText(rv: TCustomRichView; ItemNo: Integer): WideString;
  37. var s: String;
  38. begin
  39.   if rv.GetItemStyle(ItemNo)>=0 then
  40.     Result := rv.GetItemTextA(ItemNo)
  41.   else if rv.GetItem(ItemNo).GetBoolValue(rvbpAlwaysInText) then begin
  42.     s := rv.GetItem(ItemNo).AsText(0, rv.RVData, rv.GetItemText(ItemNo), '', True, True);
  43.     if not rv.GetItem(ItemNo).GetBoolValue(rvbpCanSaveUnicode) then
  44.       s := RVU_AnsiToUnicode(rv.RVData.GetDefaultCodePage, s);
  45.     Result := RVU_RawUnicodeToWideString(s);
  46.     end
  47.   else
  48.     Result := '';
  49. end;
  50. function GetItemText2(RVData: TCustomRVData; ItemNo: Integer): WideString;
  51. var s: String;
  52. begin
  53.   if RVData.GetItemStyle(ItemNo)>=0 then
  54.     Result := RVData.GetItemTextA(ItemNo)
  55.   else if RVData.GetItem(ItemNo).GetBoolValue(rvbpAlwaysInText) then begin
  56.     s := RVData.GetItem(ItemNo).AsText(0, RVData, RVData.GetItemText(ItemNo), '', True, True);
  57.     if not RVData.GetItem(ItemNo).GetBoolValue(rvbpCanSaveUnicode) then
  58.       s := RVU_AnsiToUnicode(RVData.GetDefaultCodePage, s);
  59.     Result := RVU_RawUnicodeToWideString(s);
  60.     end
  61.   else
  62.     Result := '';
  63. end;
  64. function GetCurrentLineText(rve: TCustomRichViewEdit): WideString;
  65. var i, DNo1, DNo2, DOffs: Integer;
  66.     No1, No2, Offs1, Offs2: Integer;
  67.     s: WideString;
  68. begin
  69.   Result := '';
  70.   rve := rve.TopLevelEditor;
  71.   rve.RVData.Item2DrawItem(rve.CurItemNo, rve.OffsetInCurItem, DNo1, DOffs);
  72.   DNo2 := DNo1+1;
  73.   while not rve.RVData.DrawItems[DNo1].FromNewLine do
  74.     dec(DNo1);
  75.   while (DNo2<rve.ItemCount) and not rve.RVData.DrawItems[DNo2].FromNewLine do
  76.     inc(DNo2);
  77.   dec(DNo2);
  78.   rve.RVData.DrawItem2Item(DNo1, rve.RVData.GetOffsBeforeDrawItem(DNo1), No1, Offs1);
  79.   rve.RVData.DrawItem2Item(DNo2, rve.RVData.GetOffsAfterDrawItem(DNo2), No2, Offs2);
  80.   if No1<>No2 then begin
  81.     if rve.GetItemStyle(No1)>=0 then begin
  82.       s := rve.GetItemTextA(No1);
  83.       Result := Copy(s, Offs1, Length(s));
  84.     end;
  85.     for i := No1+1 to No2-1 do
  86.       if rve.GetItemStyle(i)>=0 then
  87.         Result := Result+rve.GetItemTextA(i);
  88.     if rve.GetItemStyle(No2)>=0 then begin
  89.       s := rve.GetItemTextA(No2);
  90.       Result := Result+Copy(s, 1, Offs2-1);
  91.     end;
  92.     end
  93.   else if rve.GetItemStyle(No1)<0 then
  94.     Result := GetItemText(rve, No1)
  95.   else
  96.     Result := Copy(rve.GetItemTextA(No1), Offs1, Offs2-Offs1);
  97. end;
  98. function GetVisibleText(rv: TCustomRichView): WideString;
  99. var i: Integer;
  100. begin
  101.   i := rv.FirstItemVisible;
  102.   if i<0 then begin
  103.     Result := '';
  104.     exit;
  105.   end;
  106.   Result := GetItemText(rv, i);
  107.   for i := i+1 to rv.LastItemVisible do begin
  108.     if rv.IsFromNewLine(i) then
  109.       Result := Result + #13#10;
  110.     Result := Result+GetItemText(rv, i);
  111.   end;
  112. end;
  113. function GetRVDataText(RVData: TCustomRVData): WideString;
  114. var i: Integer;
  115. begin
  116.   if RVData.ItemCount=0 then begin
  117.     Result := '';
  118.     exit;
  119.   end;
  120.   i := 0;
  121.   Result := GetItemText2(RVData, i);
  122.   for i := i+1 to RVData.ItemCount-1 do begin
  123.     if RVData.IsFromNewLine(i) then
  124.       Result := Result + #13#10;
  125.     Result := Result+GetItemText2(RVData, i);
  126.   end;
  127. end;
  128. function GetAllText(rv: TCustomRichView): WideString;
  129. begin
  130.   Result := GetRVDataText(rv.RVData);
  131. end;
  132. function GetCurrentParaSectionText(rve: TCustomRichViewEdit): WideString;
  133. var i: Integer;
  134.     No1, No2, Offs1, Offs2: Integer;
  135. begin
  136.   Result := '';
  137.   rve := rve.TopLevelEditor;
  138.   rve.RVData.GetSelectionBoundsEx(No1,Offs1,No2,Offs2,True);
  139.   rve.RVData.ExpandToParaSection(No1,No2,No1,No2);
  140.   for i := No1 to No2 do
  141.     if rve.GetItemStyle(i)>=0 then
  142.       Result := Result+GetItemText(rve, i);
  143. end;
  144. function GetCurrentParaText(rve: TCustomRichViewEdit): WideString;
  145. var i: Integer;
  146.     No1, No2, Offs1, Offs2: Integer;
  147. begin
  148.   Result := '';
  149.   rve := rve.TopLevelEditor;
  150.   rve.RVData.GetSelectionBoundsEx(No1,Offs1,No2,Offs2,True);
  151.   rve.RVData.ExpandToPara(No1,No2,No1,No2);
  152.   Result := GetItemText(rve,No1);
  153.   for i := No1+1 to No2 do begin
  154.     if rve.IsFromNewLine(i) then
  155.       Result := Result + #13#10;
  156.     Result := Result+GetItemText(rve,i);
  157.   end;
  158. end;
  159. function GetCurrentChar(rve: TCustomRichViewEdit): WideString;
  160. var ItemNo, Offs: Integer;
  161. begin
  162.   Result := '';
  163.   rve := rve.TopLevelEditor;
  164.   ItemNo := rve.CurItemNo;
  165.   Offs := rve.OffsetInCurItem;
  166.   if (Offs<rve.GetOffsBeforeItem(ItemNo)) and
  167.     (ItemNo>0) and not rve.IsFromNewLine(ItemNo) then begin
  168.     dec(ItemNo);
  169.     Offs := rve.GetOffsAfterItem(ItemNo);
  170.   end;
  171.   if rve.GetItemStyle(ItemNo)>=0 then begin
  172.     dec(Offs);
  173.     if Offs=0 then Offs := 1;
  174.     Result := rve.GetItemTextA(ItemNo);
  175.     if Length(Result)>=Offs then
  176.       Result := Result[Offs]
  177.     else
  178.       Result := '';
  179.   end;
  180. end;
  181. function GetCurrentWord(rve: TCustomRichViewEdit): WideString;
  182. var first, last, ItemNo, Offs, Len: Integer;
  183.     s: WideString;
  184. begin
  185.   Result := '';
  186.   rve := rve.TopLevelEditor;
  187.   if rve.GetItemStyle(rve.CurItemNo)<0 then
  188.     exit;
  189.   Offs   := rve.OffsetInCurItem;
  190.   ItemNo := rve.CurItemNo;
  191.   Last   := Offs;
  192.   First  := Offs;
  193.   s      := rve.GetItemTextA(ItemNo);
  194.   Len    := Length(s);
  195.   while (Last<=Len) do begin
  196.     if Pos(s[Last], rve.Delimiters)>0 then
  197.       break;
  198.     inc(Last);
  199.   end;
  200.   dec(First);
  201.   while (First>0) do begin
  202.     if Pos(s[First], rve.Delimiters)>0 then begin
  203.       inc(First);
  204.       break;
  205.     end;
  206.     dec(First);
  207.   end;
  208.   if First=0 then
  209.     inc(First);
  210.   Result := Copy(s, First, Last-First);
  211. end;
  212. end.