SQL Text Editor Gutter lanes
Last modified:
The purpose
Gutter lanes allow for building a feature-rich SQL text editing user interface.

They can be used to mark some positions in the text, highlight the current statement, or indicate user-defined bookmarks or breakpoints.
Setting up gutter lanes
You can define lanes using the TextEditorOptions.GutterOptions.Lanes collection.
textEditor.TextEditorOptions.GutterOptions.Lanes: TacTextEditorLanes;
The TacTextEditorLanes class is a TCollection descendant, so you can use standard methods like Add, Insert, etc.
Lanes are displayed in the order in which they are defined in the Lanes collection, the first is the leftmost.
The TacTextEditorLane class contains only one relevant Width property. Other settings should be defined via the TacTextEditor.OnGetGutterLanePaintParams event.
On changing the width, quantity, or order of lanes, the overall gutter width is updated and the Text Editor is redrawn.
Rendering the lane
To draw a lane, the TextEditor asks for the rendering parameters via the OnGetGutterLanePaintParams event.
TacVisualLineState = (
lsCurrent, // caret is on this line
lsHover, // mouse cursor is over this line
lsHoverLane, // mouse cursor is over the lane
lsHoverGutter, // mouse cursor is over the gutter next to this line
lsHoverText // mouse cursor is over the text area of this line
);
TacVisualLineStates = set of TacVisualLineState;
TacGutterLanePaintParams = record
GutterLane: TacTextEditorLane; // (input) the rendered lane
VisualLine: TacVisualLine; // (input) link to the current VisualLine object
LineState: TacVisualLineStates; // (input) state of the currene line
LaneImage: TGraphic; // (output) assign image to be drawn
PaintLaneImageFrame: Boolean; // (output) determines if image should be drawn with a border.
end;
TacGetGutterLanePaintParamsProc = procedure (ASender: TacTextEditor; var AParams: TacGutterLanePaintParams) of object;
TacTextEditor = class(TCustomPanel, IDropTarget)
// skipped ...
published
property OnGetGutterLanePaintParams: TacGetGutterLanePaintParamsProc read FOnGetGutterLanePaintParams
write FOnGetGutterLanePaintParams;
In this event handler, you can read from the GutterLane, VisualLine, and LineState fields of the TacGutterLanePaintParams type parameter and write to the LaneImage and PaintLaneImageFrame fields if needed.
Mouse click handling
When the user clicks on the lane, the TextEditor.OnGutterLaneMouseDown event is fired.
TacGutterLaneMouseProcParams = record GutterLane: TacTextEditorLane; // the clicked lane VisualLine: TacVisualLine; // link to the current VisualLine object ShiftState: TShiftState; MousePos: TPoint; end; TacGutterLaneMouseProc = procedure (ASender: TacTextEditor; var AParams: TacGutterLaneMouseProcParams) of object; TacTextEditor = class(TCustomPanel, IDropTarget) // skipped ... published property OnGutterLaneMouseDown: TacGutterLaneMouseProc read FOnGutterLaneMouseDown write FOnGutterLaneMouseDown;
sql_text_editor_vcl.png