unit ATSynEdit_Gutter; {$mode objfpc}{$H+} interface uses Classes, SysUtils; type TATGutterItem = class Visible: boolean; Size: integer; Left, Right: integer; end; type TATGutter = class private FList: TList; function GetItem(N: Integer): TATGutterItem; public constructor Create; virtual; destructor Destroy; override; function IsIndexValid(N: integer): boolean; procedure Add(ASize: integer); procedure Delete(N: integer); procedure Clear; function Count: integer; property Items[N: integer]: TATGutterItem read GetItem; default; function Width: integer; procedure Update; function IndexAt(AX: integer): integer; end; implementation { TATGutter } function TATGutter.IsIndexValid(N: integer): boolean; begin Result:= (N>=0) and (N0 then Result:= Items[Count-1].Right else Result:= 0; end; procedure TATGutter.Update; var i: integer; begin for i:= 0 to Count-1 do with Items[i] do begin if i>0 then Left:= Items[i-1].Right else Left:= 0; Right:= Left; if Visible then Inc(Right, Size); end; end; function TATGutter.IndexAt(AX: integer): integer; var i: integer; begin Result:= -1; for i:= 0 to Count-1 do with Items[i] do if (AX>=Left) and (AX