GuiEdit.pas
上传用户:ctlcnc
上传日期:2021-12-10
资源大小:4933k
文件大小:18k
源码类别:

2D图形编程

开发平台:

Delphi

  1. unit GuiEdit;
  2. //---------------------------------------------------------------------------
  3. // GuiEdit.pas                                          Modified: 03-Mar-2007
  4. // A simple edit box for Asphyre GUI foundation                   Version 1.0
  5. //---------------------------------------------------------------------------
  6. // Important Notice:
  7. //
  8. // If you modify/use this code or one of its parts either in original or
  9. // modified form, you must comply with Mozilla Public License v1.1,
  10. // specifically section 3, "Distribution Obligations". Failure to do so will
  11. // result in the license breach, which will be resolved in the court.
  12. // Remember that violating author's rights is considered a serious crime in
  13. // many countries. Thank you!
  14. //
  15. // !! Please *read* Mozilla Public License 1.1 document located at:
  16. //  http://www.mozilla.org/MPL/
  17. //
  18. // If you require any clarifications about the license, feel free to contact
  19. // us or post your question on our forums at: http://www.afterwarp.net
  20. //---------------------------------------------------------------------------
  21. // The contents of this file are subject to the Mozilla Public License
  22. // Version 1.1 (the "License"); you may not use this file except in
  23. // compliance with the License. You may obtain a copy of the License at
  24. // http://www.mozilla.org/MPL/
  25. //
  26. // Software distributed under the License is distributed on an "AS IS"
  27. // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  28. // License for the specific language governing rights and limitations
  29. // under the License.
  30. //
  31. // The Original Code is GuiEdit.pas.
  32. //
  33. // The Initial Developer of the Original Code is M. Sc. Yuriy Kotsarenko.
  34. // Portions created by M. Sc. Yuriy Kotsarenko are Copyright (C) 2007,
  35. // Afterwarp Interactive. All Rights Reserved.
  36. //---------------------------------------------------------------------------
  37. interface
  38. //---------------------------------------------------------------------------
  39. uses
  40.  Windows, Types, Classes, Clipbrd, Vectors2px, HelperSets, AsphyreTypes,
  41.  AsphyreUtils, AsphyreEffects, AsphyreFonts, GuiSkins, GuiTypes, GuiUtils,
  42.  GuiShapeRep, GuiObjects, GuiControls;
  43. //---------------------------------------------------------------------------
  44. type
  45.  TGuiEdit = class(TGuiControl)
  46.  private
  47.   FTextOpt : TFontOptions;
  48.   FTextCol : TGuiFontCol;
  49.   FTextFont: string;
  50.   FTextRect: TRect;
  51.   FText    : string;
  52.   FOnChange: TNotifyEvent;
  53.   FSideSpace: Integer;
  54.   FScrollPos: Integer;
  55.   FReadOnly : Boolean;
  56.   FMaxLength: Integer;
  57.   CachedFont : TAsphyreNativeFont;
  58.   PrevDrawPos: TPoint2px;
  59.   TextDrawPos: TPoint2px;
  60.   TextSize   : TPoint2px;
  61.   VirtualSize: TPoint2px;
  62.   LocalRects : TRectList;
  63.   ScreenRects: TRectList;
  64.   FCaretPos   : Integer;
  65.   SelectedPos : Integer;
  66.   FCaretColor : Cardinal;
  67.   FCaretAlpha : Integer;
  68.   FSelectColor: Cardinal;
  69.   FSelectAlpha: Integer;
  70.   function GetTextOpt(): PFontOptions;
  71.   procedure SetText(const Value: string);
  72.   procedure SetMaxLength(const Value: Integer);
  73.   procedure SetScrollPos(const Value: Integer);
  74.   function GetCaretSize(): TPoint2px;
  75.   function UpdateTextRects(): Boolean;
  76.   procedure DrawCaret();
  77.   procedure DrawSelected();
  78.   function NeedToScroll(): Boolean;
  79.   procedure ConstraintScroll();
  80.   procedure ScrollToLeft(Index: Integer);
  81.   procedure ScrollToRight(Index: Integer);
  82.   procedure StripInvalidChars(var Text: string);
  83.   function CharAtPos(const Pos: TPoint2px): Integer;
  84.  protected
  85.   procedure DoDestroy(); override;
  86.   procedure DoDraw(const DrawPos: TPoint2px); override;
  87.   procedure DoKeyEvent(Key: Integer; Event: TKeyEventType;
  88.    SpecialKeys: TSpecialKeyState); override;
  89.   procedure DoMouseEvent(const Pos: TPoint2px; Event: TMouseEventType;
  90.    Button: TMouseButtonType; SpecialKeys: TSpecialKeyState); override;
  91.   procedure DoDescribe(); override;
  92.   procedure WriteProperty(Code: Cardinal; Source: Pointer); override;
  93.   function GetSkinDrawType(): TSkinDrawType; override;
  94.  public
  95.   property TextOpt : PFontOptions read GetTextOpt;
  96.   property TextCol : TGuiFontCol read FTextCol;
  97.   property TextFont: string read FTextFont write FTextFont;
  98.   property TextRect: TRect read FTextRect write FTextRect;
  99.   property SideSpace: Integer read FSideSpace write FSideSpace;
  100.   property ScrollPos: Integer read FScrollPos write SetScrollPos;
  101.   property CaretPos : Integer read FCaretPos write FCaretPos;
  102.   property ReadOnly : Boolean read FReadOnly write FReadOnly;
  103.   property MaxLength: Integer read FMaxLength write SetMaxLength;
  104.   property CaretColor : Cardinal read FCaretColor write FCaretColor;
  105.   property CaretAlpha : Integer read FCaretAlpha write FCaretAlpha;
  106.   property SelectColor: Cardinal read FSelectColor write FSelectColor;
  107.   property SelectAlpha: Integer read FSelectAlpha write FSelectAlpha;
  108.   property OnChange: TNotifyEvent read FOnChange write FOnChange;
  109.   property Text: string read FText write SetText;
  110.   constructor Create(AOwner: TGuiObject); override;
  111.  end;
  112. //---------------------------------------------------------------------------
  113. implementation
  114. uses
  115.  SysUtils;
  116. //---------------------------------------------------------------------------
  117. const
  118.  PropBase = $1000;
  119. //---------------------------------------------------------------------------
  120.  CaretDrawSpeed  = 1.0;
  121.  SelectDrawSpeed = 1.2;
  122.  AllowedChars    = [#32..#255];
  123.  SpaceToCaret    = 1;
  124. //---------------------------------------------------------------------------
  125. constructor TGuiEdit.Create(AOwner: TGuiObject);
  126. begin
  127.  inherited;
  128.  FTextCol   := TGuiFontCol.Create();
  129.  LocalRects := TRectList.Create();
  130.  ScreenRects:= TRectList.Create();
  131.  FSideSpace := 2;
  132.  FScrollPos := 0;
  133.  FReadOnly  := False;
  134.  FMaxLength := 0;
  135.  SelectedPos := -1;
  136.  FCaretAlpha := 96;
  137.  FSelectAlpha:= 32;
  138.  FText:= '';
  139.  FTextOpt.Reset();
  140. end;
  141. //---------------------------------------------------------------------------
  142. procedure TGuiEdit.DoDestroy();
  143. begin
  144.  ScreenRects.Free();
  145.  LocalRects.Free();
  146.  FTextCol.Free();
  147.  inherited;
  148. end;
  149. //---------------------------------------------------------------------------
  150. function TGuiEdit.GetTextOpt(): PFontOptions;
  151. begin
  152.  Result:= @FTextOpt;
  153. end;
  154. //---------------------------------------------------------------------------
  155. procedure TGuiEdit.SetText(const Value: string);
  156. var
  157.  Changed: Boolean;
  158. begin
  159.  Changed:= (Value <> FText);
  160.  FText:= Value;
  161.  if (FMaxLength > 0)and(Length(FText) > FMaxLength) then
  162.   FText:= Copy(FText, 1, FMaxLength);
  163.  FCaretPos:= Length(FText);
  164.  if (NeedToScroll()) then ScrollToRight(FCaretPos);
  165.  if (Changed)and(Assigned(OnChange)) then OnChange(Self)
  166. end;
  167. //---------------------------------------------------------------------------
  168. procedure TGuiEdit.SetMaxLength(const Value: Integer);
  169. begin
  170.  FMaxLength:= Value;
  171.  if (FMaxLength > 0)and(Length(FText) > FMaxLength) then
  172.   begin
  173.    FText:= Copy(FText, 1, FMaxLength);
  174.    if (FScrollPos > Length(FText)) then FScrollPos:= Length(FText);
  175.   end;
  176. end;
  177. //---------------------------------------------------------------------------
  178. procedure TGuiEdit.SetScrollPos(const Value: Integer);
  179. begin
  180.  FScrollPos:= Value;
  181.  if (FScrollPos < 0) then FScrollPos:= 0;
  182.  if (FScrollPos > Length(FText)) then FScrollPos:= Length(FText);
  183. end;
  184. //---------------------------------------------------------------------------
  185. function TGuiEdit.GetCaretSize(): TPoint2px;
  186. begin
  187.  Result.x:= (FTextRect.Bottom - FTextRect.Top) div 3;
  188.  Result.y:= (FTextRect.Bottom - FTextRect.Top) - (SideSpace * 2);
  189. end;
  190. //---------------------------------------------------------------------------
  191. function TGuiEdit.UpdateTextRects(): Boolean;
  192. var
  193.  i: Integer;
  194.  CaretSize: TPoint2px;
  195. begin
  196.  CachedFont:= GuiFonts.Font[FTextFont];
  197.  if (CachedFont = nil) then
  198.   begin
  199.    Result:= False;
  200.    Exit;
  201.   end;
  202.  CachedFont.Options^:= FTextOpt;
  203.  // (1) Determine the complete text and caret size.
  204.  TextSize := CachedFont.TextExtent(FText);
  205.  CaretSize:= GetCaretSize();
  206.  // (2) Determine the "virtualized" text size, including caret.
  207.  VirtualSize.x:= TextSize.x + SpaceToCaret + CaretSize.x;
  208.  VirtualSize.y:= (FTextRect.Bottom - FTextRect.Top) - (FSideSpace * 2);
  209.  // (4) The position in screen space to draw text and caret at.
  210.  TextDrawPos.x:= PrevDrawPos.x + FSideSpace + FTextRect.Left - FScrollPos;
  211.  TextDrawPos.y:= PrevDrawPos.y +  FTextRect.Top + ((FTextRect.Bottom -
  212.   FTextRect.Top) - TextSize.y) div 2;
  213.  // (5) Find individual letter rectangles.
  214.  LocalRects.Clear();
  215.  CachedFont.TextRects(FText, LocalRects);
  216. // (6) Include caret in rectangle list. 
  217.  if (LocalRects.Count > 0) then
  218.   LocalRects.Add(TextSize.x + SpaceToCaret, 0, CaretSize.x, VirtualSize.y)
  219.    else LocalRects.Add(0, 0, CaretSize.x, VirtualSize.y);
  220.  ScreenRects.Clear();
  221.  for i:= 0 to LocalRects.Count - 1 do
  222.   ScreenRects.Add(TextDrawPos.x + LocalRects[i].Left, PrevDrawPos.y +
  223.    FTextRect.Top + FSideSpace, LocalRects[i].Right - LocalRects[i].Left,
  224.    (FTextRect.Bottom - FTextRect.Top) - (FSideSpace * 2));
  225.  Result:= True;
  226. end;
  227. //---------------------------------------------------------------------------
  228. procedure TGuiEdit.DoDraw(const DrawPos: TPoint2px);
  229. var
  230.  PrevClipRect: TRect;
  231. begin
  232.  PrevDrawPos:= DrawPos;
  233.  if (not UpdateTextRects()) then Exit;
  234.  PrevClipRect:= GuiCanvas.ClipRect;
  235.  GuiCanvas.ClipRect:= MoveRect(FTextRect, DrawPos);
  236.  CachedFont.TextOut(FText, TextDrawPos.x, TextDrawPos.y,
  237.   FTextCol.UseColor(GetSkinDrawType()));
  238.  if (SelectedPos <> -1)and(SelectedPos <> FCaretPos) then DrawSelected();
  239.  if (Focused) then DrawCaret();
  240.  GuiCanvas.ClipRect:= PrevClipRect;
  241. end;
  242. //---------------------------------------------------------------------------
  243. procedure TGuiEdit.DrawCaret();
  244. var
  245.  Theta: Real;
  246.  Alpha: Integer;
  247. begin
  248.  if (FCaretPos < 0)or(FCaretPos >= ScreenRects.Count) then Exit;
  249.  Theta:= (Sin(GetTickCount() * CaretDrawSpeed / 100.0) + 1.0) * 0.5;
  250.  Theta:= 0.5 + (Theta * 0.5);
  251.  Alpha:= Round(Theta * FCaretAlpha);
  252.  GuiCanvas.FillQuad(pRect4(ScreenRects[FCaretPos]^), cColorAlpha4(FCaretColor,
  253.   Alpha), fxuBlend);
  254.  GuiCanvas.WireQuadHw(pRect4(ScreenRects[FCaretPos]^), cColorAlpha4(FCaretColor,
  255.   Alpha), fxuBlend);
  256. end;
  257. //---------------------------------------------------------------------------
  258. procedure TGuiEdit.DrawSelected();
  259. var
  260.  Theta: Real;
  261.  Alpha: Integer;
  262. begin
  263.  if (SelectedPos < 0)or(SelectedPos >= ScreenRects.Count) then Exit;
  264.  Theta:= (Sin(GetTickCount() * SelectDrawSpeed / 100.0) + 1.0) * 0.5;
  265.  Theta:= 0.5 + (Theta * 0.5);
  266.  Alpha:= Round(Theta * FSelectAlpha);
  267.  GuiCanvas.FillQuad(pRect4(ScreenRects[SelectedPos]^),
  268.   cColorAlpha4(FSelectColor,  Alpha), fxuBlend);
  269.  GuiCanvas.WireQuadHw(pRect4(ScreenRects[SelectedPos]^),
  270.   cColorAlpha4(FSelectColor, Alpha), fxuBlend);
  271. end;
  272. //---------------------------------------------------------------------------
  273. function TGuiEdit.NeedToScroll(): Boolean;
  274. var
  275.  ChRect, CutRect: TRect;
  276. begin
  277.  if (not UpdateTextRects())or(FCaretPos < 0)or
  278.   (FCaretPos >= LocalRects.Count) then
  279.   begin
  280.    Result:= False;
  281.    Exit;
  282.   end;
  283.  ChRect := MoveRect(LocalRects[FCaretPos]^, Point2px(-FScrollPos, 0));
  284.  CutRect:= ShortRect(ChRect, Bounds(0, 0, (FTextRect.Right - FTextRect.Left) -
  285.   (FSideSpace * 2), FTextRect.Bottom - FTextRect.Top));
  286.  Result:= (CutRect.Right - CutRect.Left) < (ChRect.Right - ChRect.Left);
  287. end;
  288. //---------------------------------------------------------------------------
  289. procedure TGuiEdit.ConstraintScroll();
  290. var
  291.  MaxScroll: Integer;
  292. begin
  293.  MaxScroll:= TextSize.x;
  294.  if (MaxScroll = 0) then MaxScroll:= GetCaretSize().x
  295.   else Inc(MaxScroll, SpaceToCaret + GetCaretSize().x);
  296.  MaxScroll:= Max2(MaxScroll - ((FTextRect.Right - FTextRect.Left) -
  297.   (FSideSpace * 2)), 0);
  298.  FScrollPos:= MinMax2(FScrollPos, 0, MaxScroll); 
  299. end;
  300. //---------------------------------------------------------------------------
  301. procedure TGuiEdit.ScrollToLeft(Index: Integer);
  302. var
  303.  ChRect: TRect;
  304. begin
  305.  if (not UpdateTextRects())or(Index < 0)or
  306.   (Index >= LocalRects.Count) then Exit;
  307.  ChRect:= LocalRects[Index]^;
  308.  if (ChRect.Right <= ChRect.Left)and(ChRect.Right = 0) then Exit;
  309.  FScrollPos:= ChRect.Left;
  310.  ConstraintScroll();
  311. end;
  312. //---------------------------------------------------------------------------
  313. procedure TGuiEdit.ScrollToRight(Index: Integer);
  314. var
  315.  ChRect: TRect;
  316. begin
  317.  if (not UpdateTextRects())or(Index < 0)or
  318.   (Index >= LocalRects.Count) then Exit;
  319.  ChRect:= LocalRects[Index]^;
  320.  if (ChRect.Right <= ChRect.Left)and(ChRect.Right = 0) then Exit;
  321.  FScrollPos:= ChRect.Right - ((FTextRect.Right - FTextRect.Left) -
  322.   (FSideSpace * 2));
  323.  ConstraintScroll();
  324. end;
  325. //---------------------------------------------------------------------------
  326. procedure TGuiEdit.StripInvalidChars(var Text: string);
  327. var
  328.  i: Integer;
  329. begin
  330.  Text:= Trim(Text);
  331.  for i:= Length(Text) downto 1 do
  332.   if (not (Text[i] in AllowedChars)) then Delete(Text, i, 1);
  333. end;
  334. //---------------------------------------------------------------------------
  335. procedure TGuiEdit.DoKeyEvent(Key: Integer; Event: TKeyEventType;
  336.  SpecialKeys: TSpecialKeyState);
  337. var
  338.  Ch: Char;
  339.  Clipboard: TClipboard;
  340.  AddTx: string;
  341. begin
  342.  if (Event = ketDown) then
  343.   begin
  344.    case Key of
  345.     VK_RIGHT:
  346.      begin
  347.       if (FCaretPos < LocalRects.Count - 1) then Inc(FCaretPos);
  348.       if (NeedToScroll()) then ScrollToRight(FCaretPos);
  349.      end;
  350.     VK_LEFT:
  351.      begin
  352.       if (FCaretPos > 0) then Dec(FCaretPos);
  353.       if (NeedToScroll()) then ScrollToLeft(FCaretPos);
  354.      end;
  355.     VK_BACK:
  356.      if (not FReadOnly) then
  357.       begin
  358.        Delete(FText, FCaretPos, 1);
  359.        if (FCaretPos > 0) then Dec(FCaretPos);
  360.        if (NeedToScroll()) then ScrollToRight(FCaretPos);
  361.        if (Assigned(FOnChange)) then FOnChange(Self);
  362.       end;
  363.     VK_DELETE:
  364.      if (not FReadOnly) then
  365.       begin
  366.        Delete(FText, FCaretPos + 1, 1);
  367.        if (Assigned(FOnChange)) then FOnChange(Self);
  368.       end;
  369.     VK_HOME:
  370.      begin
  371.       FCaretPos:= 0;
  372.       if (NeedToScroll()) then ScrollToLeft(FCaretPos);
  373.      end;
  374.     VK_END:
  375.      begin
  376.       FCaretPos:= Length(FText);
  377.       if (NeedToScroll()) then ScrollToRight(FCaretPos);
  378.      end;
  379.    end;
  380.    if (Key = Byte('V'))and(sksCtrl in SpecialKeys)and(not FReadOnly) then
  381.     begin
  382.      Clipboard:= TClipboard.Create();
  383.      AddTx:= Clipboard.AsText;
  384.      StripInvalidChars(AddTx);
  385.      Insert(AddTx, FText, FCaretPos + 1);
  386.      Inc(FCaretPos, Length(AddTx));
  387.      if (FMaxLength > 0)and(Length(FText) > FMaxLength) then
  388.       begin
  389.        FText:= Copy(FText, 1, FMaxLength);
  390.        if (FCaretPos > Length(FText)) then FCaretPos:= Length(FText);
  391.       end;
  392.      if (NeedToScroll()) then ScrollToRight(FCaretPos);
  393.      Clipboard.Free();
  394.      if (Assigned(FOnChange)) then FOnChange(Self);
  395.     end;
  396.    Exit;
  397.   end else if (Event <> ketPress)or(FReadOnly) then Exit;
  398.  Ch:= Char(Key);
  399.  if (Ch in AllowedChars)and((FMaxLength < 1)or(Length(FText) < FMaxLength)) then
  400.   begin
  401.    if (FText = '')or(FCaretPos >= Length(FText)) then FText:= FText + Ch
  402.     else Insert(Ch, FText, FCaretPos + 1);
  403.    Inc(FCaretPos);
  404.    if (NeedToScroll()) then ScrollToRight(FCaretPos);
  405.    if (Assigned(FOnChange)) then FOnChange(Self);
  406.   end;
  407. { if (Ch = #9) then
  408.   FocusNextTabOrder();}
  409. end;
  410. //---------------------------------------------------------------------------
  411. function TGuiEdit.CharAtPos(const Pos: TPoint2px): Integer;
  412. var
  413.  ScreenRect: TRect;
  414.  i: Integer;
  415. begin
  416.  ScreenRect:= MoveRect(FTextRect, PrevDrawPos);
  417.  Result:= -1;
  418.  for i:= 0 to ScreenRects.Count - 1 do
  419.   if (PointInRect(Pos, ShortRect(ScreenRects[i]^, ScreenRect))) then
  420.    begin
  421.     Result:= i;
  422.     Break;
  423.    end;
  424. end;
  425. //---------------------------------------------------------------------------
  426. procedure TGuiEdit.DoMouseEvent(const Pos: TPoint2px; Event: TMouseEventType;
  427.  Button: TMouseButtonType; SpecialKeys: TSpecialKeyState);
  428. var
  429.  LocalPos: TPoint2px;
  430. begin
  431.  LocalPos:= ScreenToLocal(Pos);
  432.  if (not PointInRect(LocalPos, FTextRect)) then Exit;
  433.  SelectedPos:= CharAtPos(Pos);
  434.  if (Event = metDown)and(Button = mbtLeft)and(SelectedPos <> -1) then
  435.   begin
  436.    FCaretPos:= SelectedPos;
  437.    if (LocalPos.x > GetBoundBox(Shape).Right div 2) then
  438.     ScrollToRight(FCaretPos) else ScrollToLeft(FCaretPos);
  439.   end;
  440. end;
  441. //---------------------------------------------------------------------------
  442. procedure TGuiEdit.DoDescribe();
  443. begin
  444.  inherited;
  445.  Describe(PropBase + $0, 'TextOpt',     gdtFontOpt);
  446.  Describe(PropBase + $1, 'TextCol',     gdtFontColor);
  447.  Describe(PropBase + $2, 'TextFont',    gdtString);
  448.  Describe(PropBase + $3, 'TextRect',    gdtRect);
  449.  Describe(PropBase + $4, 'SideSpace',   gdtInteger);
  450.  Describe(PropBase + $5, 'ReadOnly',    gdtBoolean);
  451.  Describe(PropBase + $6, 'MaxLength',   gdtInteger);
  452.  Describe(PropBase + $7, 'CaretColor',  gdtColor);
  453.  Describe(PropBase + $8, 'CaretAlpha',  gdtInteger);
  454.  Describe(PropBase + $9, 'SelectColor', gdtColor);
  455.  Describe(PropBase + $A, 'SelectAlpha', gdtInteger);
  456.  Describe(PropBase + $B, 'Text',        gdtString);
  457. end;
  458. //---------------------------------------------------------------------------
  459. procedure TGuiEdit.WriteProperty(Code: Cardinal; Source: Pointer);
  460. begin
  461.  case Code of
  462.   PropBase + $0:
  463.    FTextOpt:= PFontOptions(Source)^;
  464.   PropBase + $1:
  465.    FTextCol.Assign(TGuiFontCol(Source));
  466.   PropBase + $2:
  467.    FTextFont:= PChar(Source);
  468.   PropBase + $3:
  469.    FTextRect:= PRect(Source)^;
  470.   PropBase + $4:
  471.    FSideSpace:= PInteger(Source)^;
  472.   PropBase + $5:
  473.    FReadOnly:= PBoolean(Source)^;
  474.   PropBase + $6:
  475.    FMaxLength:= PInteger(Source)^;
  476.   PropBase + $7:
  477.    FCaretColor:= PCardinal(Source)^;
  478.   PropBase + $8:
  479.    FCaretAlpha:= PInteger(Source)^;
  480.   PropBase + $9:
  481.    FSelectColor:= PCardinal(Source)^;
  482.   PropBase + $A:
  483.    FSelectAlpha:= PInteger(Source)^;
  484.   PropBase + $B:
  485.    Text:= PChar(Source);
  486.   else inherited WriteProperty(Code, Source);
  487.  end;
  488. end;
  489. //---------------------------------------------------------------------------
  490. function TGuiEdit.GetSkinDrawType(): TSkinDrawType;
  491. begin
  492.  Result:= sdtNormal;
  493.  if (MouseOver) then Result:= sdtOver;
  494.  if (MouseDown) then Result:= sdtDown;
  495.  if (Focused) then Result:= sdtFocused;
  496.  if (not Enabled) then Result:= sdtDisabled;
  497. end;
  498. //---------------------------------------------------------------------------
  499. end.