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

RichEdit

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {       RichView                                        }
  4. {       Combo Item - item class for RichView.           }
  5. {       Non-text item that looks like a text            }
  6. {       (but cannot be wrapped and edited)              }
  7. {       and shows combobox when focused.                }
  8. {       Does not support Unicode.                       }
  9. {       Shows combobox only in TRichView,               }
  10. {       not in TRichViewEdit                            }
  11. {                                                       }
  12. {       Copyright (c) Sergey Tkachenko                  }
  13. {       svt@trichview.com                               }
  14. {       http://www.trichview.com                        }
  15. {                                                       }
  16. {*******************************************************}
  17. unit ComboItem;
  18. {$I RV_Defs.inc}
  19. interface
  20. uses Windows, SysUtils, Graphics, Classes, Controls, StdCtrls,
  21.      RVItem, CRVData, CRVFData, RVStyle, RVScroll, RVFMisc,
  22.      LabelItem;
  23. const
  24.   rvsCombo = -201;
  25. type
  26.   TRVComboItemInfo = class (TRVLabelItemInfo)
  27.   private
  28.     FItems: TStringList;
  29.     FComboBox: TComboBox;
  30.     FRVData: TCustomRVData;
  31.     function GetItems: TStrings;
  32.     procedure SetItems(const Value: TStrings);
  33.     procedure DoComboBoxClick(Sender: TObject);
  34.   protected
  35.     function GetRVFExtraPropertyCount: Integer; override;
  36.     procedure SaveRVFExtraProperties(Stream: TStream); override;
  37.   public
  38.     constructor Create(RVData: TPersistent); override;
  39.     constructor CreateEx(RVData: TPersistent; TextStyleNo: Integer; const Text: String);
  40.     destructor Destroy; override;
  41.     function SetExtraCustomProperty(const PropName, Value: String): Boolean; override;
  42.     function ReadRVFLine(const s: String; RVData: TPersistent;
  43.       ReadType, LineNo, LineCount: Integer; var Name: String;
  44.       var ReadMode: TRVFReadMode; var ReadState: TRVFReadState): Boolean; override;
  45.     function GetBoolValueEx(Prop: TRVItemBoolPropertyEx; RVStyle: TRVStyle): Boolean; override;
  46.     function GetBoolValue(Prop: TRVItemBoolProperty): Boolean; override;
  47.     procedure Focusing; override;
  48.     procedure ClearFocus; override;
  49.     procedure Inserting(RVData: TObject; var Text: String; Safe: Boolean); override;
  50.     function OwnsControl(AControl: TControl): Boolean; override;
  51.     procedure AdjustInserted(x,y: Integer; adjusty: Boolean); override;
  52.     property Items: TStrings read GetItems write SetItems;
  53.   end;
  54. implementation
  55. {============================== TRVComboItemInfo ==============================}
  56. constructor TRVComboItemInfo.Create(RVData: TPersistent);
  57. begin
  58.   inherited;
  59.   StyleNo := rvsCombo;
  60.   Spacing := 0;
  61. end;
  62. {------------------------------------------------------------------------------}
  63. constructor TRVComboItemInfo.CreateEx(RVData: TPersistent;
  64.   TextStyleNo: Integer; const Text: String);
  65. begin
  66.   inherited CreateEx(RVData, TextStyleNo, Text);
  67.   StyleNo := rvsCombo;
  68.   Spacing := 0;
  69. end;
  70. {------------------------------------------------------------------------------}
  71. destructor TRVComboItemInfo.Destroy;
  72. begin
  73.   FItems.Free;
  74.   ClearFocus;
  75.   inherited;
  76. end;
  77. {------------------------------------------------------------------------------}
  78. procedure TRVComboItemInfo.ClearFocus;
  79. var ComboBox: TComboBox;
  80. begin
  81.   ComboBox := FComboBox;
  82.   FComboBox := nil;
  83.   ComboBox.Free;
  84. end;
  85. {------------------------------------------------------------------------------}
  86. procedure TRVComboItemInfo.Focusing;
  87. var ItemNo, DItemNo: Integer;
  88. begin
  89.   ClearFocus;
  90.   if FRVData<>nil then begin
  91.     FComboBox := TComboBox.Create(nil);
  92.     FComboBox.Visible := False;
  93.     FComboBox.Parent := FRVData.GetParentControl;
  94.     ItemNo := FRVData.GetItemNo(Self);
  95.     TCustomRVFormattedData(FRVData).Item2FirstDrawItem(ItemNo, DItemNo);
  96.     with TCustomRVFormattedData(FRVData).DrawItems[DItemNo] do begin
  97.       FComboBox.Width := Width{+GetSystemMetrics(SM_CXVSCROLL)};
  98.       FComboBox.Height := Height;
  99.       FComboBox.Font.Assign(FRVData.GetRVStyle.TextStyles[TextStyleNo]);
  100.       if FRVData.GetRVStyle.TextStyles[TextStyleNo].BackColor<>clNone then
  101.         FComboBox.Color := FRVData.GetRVStyle.TextStyles[TextStyleNo].BackColor;
  102.       FComboBox.Style := csDropDownList;
  103.       FComboBox.Items := Items;
  104.       FComboBox.ItemIndex := FComboBox.Items.IndexOf(Text);
  105.       FComboBox.OnClick := DoComboBoxClick;
  106.       TCustomRVFormattedData(FRVData).ResetSubCoords;
  107.       AdjustInserted(Left-TCustomRVFormattedData(FRVData).GetHOffs,
  108.         Top-TCustomRVFormattedData(FRVData).GetVOffs, True);
  109.     end;
  110.     FComboBox.Visible := True;
  111.     FComboBox.SetFocus;
  112.   end;
  113. end;
  114. {------------------------------------------------------------------------------}
  115. function TRVComboItemInfo.GetBoolValueEx(Prop: TRVItemBoolPropertyEx;
  116.   RVStyle: TRVStyle): Boolean;
  117. begin
  118.   case Prop of
  119.     rvbpAllowsFocus:
  120.       Result := True;
  121.     rvbpXORFocus:
  122.       Result := False;
  123.     else
  124.       Result := inherited GetBoolValueEx(Prop, RVStyle);
  125.   end;
  126. end;
  127. {------------------------------------------------------------------------------}
  128. function TRVComboItemInfo.GetBoolValue(Prop: TRVItemBoolProperty): Boolean;
  129. begin
  130.   case Prop of
  131.    rvbpImmediateControlOwner:
  132.      Result := FComboBox<>nil;
  133.    else
  134.      Result := inherited GetBoolValue(Prop);
  135.   end;
  136. end;
  137. {------------------------------------------------------------------------------}
  138. function TRVComboItemInfo.GetItems: TStrings;
  139. begin
  140.   if FItems=nil then
  141.     FItems := TStringList.Create;
  142.   Result := FItems;
  143. end;
  144. {------------------------------------------------------------------------------}
  145. procedure TRVComboItemInfo.SetItems(const Value: TStrings);
  146. begin
  147.   FItems.Assign(Value);
  148. end;
  149. {------------------------------------------------------------------------------}
  150. procedure TRVComboItemInfo.Inserting(RVData: TObject; var Text: String;
  151.   Safe: Boolean);
  152. begin
  153.   FRVData := TCustomRVData(RVData);
  154.   if FComboBox<>nil then begin
  155.     FComboBox.Visible := False;
  156.     if not Safe and (RVData<>nil) then
  157.       FComboBox.Parent := FRVData.GetParentControl
  158.     else
  159.       FComboBox.Parent := nil;
  160.   end;
  161.   inherited Inserting(RVData, Text, Safe);
  162. end;
  163. {------------------------------------------------------------------------------}
  164. function TRVComboItemInfo.OwnsControl(AControl: TControl): Boolean;
  165. begin
  166.   Result := AControl=FComboBox;
  167. end;
  168. {------------------------------------------------------------------------------}
  169. procedure TRVComboItemInfo.AdjustInserted(x, y: Integer; adjusty: Boolean);
  170. begin
  171.   if FComboBox<>nil then begin
  172.     FComboBox.Left := x+Spacing;
  173.     FComboBox.Tag  := y+Spacing;
  174.     if adjusty then
  175.       RV_Tag2Y(FComboBox);
  176.     FComboBox.Visible := True;
  177.   end;
  178. end;
  179. {------------------------------------------------------------------------------}
  180. procedure TRVComboItemInfo.DoComboBoxClick(Sender: TObject);
  181. begin
  182.   if FComboBox.ItemIndex>=0 then begin
  183.     Text := FComboBox.Text;
  184.     UpdateMe;
  185.   end;
  186. end;
  187. {------------------------------------------------------------------------------}
  188. function TRVComboItemInfo.GetRVFExtraPropertyCount: Integer;
  189. begin
  190.   Result := Items.Count + inherited GetRVFExtraPropertyCount;
  191. end;
  192. {------------------------------------------------------------------------------}
  193. procedure TRVComboItemInfo.SaveRVFExtraProperties(Stream: TStream);
  194. var i: Integer;
  195. begin
  196.   inherited SaveRVFExtraProperties(Stream);
  197.   for i := 0 to items.Count-1 do
  198.     RVFWriteLine(Stream, Format('item=%s', [Items[i]]));
  199. end;
  200. {------------------------------------------------------------------------------}
  201. function TRVComboItemInfo.SetExtraCustomProperty(const PropName, Value: String): Boolean;
  202. begin
  203.   if PropName='item' then begin
  204.     Items.Add(Value);
  205.     Result := True;
  206.     end
  207.   else
  208.     Result := inherited SetExtraCustomProperty(PropName, Value);
  209. end;
  210. {------------------------------------------------------------------------------}
  211. function TRVComboItemInfo.ReadRVFLine(const s: String; RVData: TPersistent;
  212.   ReadType, LineNo, LineCount: Integer; var Name: String;
  213.   var ReadMode: TRVFReadMode; var ReadState: TRVFReadState): Boolean;
  214. begin
  215.   if LineNo=0 then
  216.     Items.Clear;
  217.   Result := inherited ReadRVFLine(s, RVData, ReadType, LineNo, LineCount, Name,
  218.     ReadMode, ReadState);
  219. end;
  220. initialization
  221.   RegisterRichViewItemClass(rvsCombo, TRVComboItemInfo);
  222. end.