mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-19 04:02:11 +02:00
Patch from Henry Vermaak. Implements TMemo.CaretPos under gtk2
git-svn-id: trunk@14980 -
This commit is contained in:
parent
44e2489797
commit
d2156b2d40
@ -46,6 +46,7 @@ Graeme Geldenhuys
|
||||
Grzegorz Zakrzewski
|
||||
Hakan Kizilhan
|
||||
Hans-Joachim Ott
|
||||
Henry Vermaak
|
||||
Hwang Weng Sun
|
||||
Ido Kanner
|
||||
James Chandler Jr.
|
||||
|
@ -328,5 +328,50 @@ begin
|
||||
Result := Abs(gtk_text_iter_get_offset(@EndIter) - gtk_text_iter_get_offset(@StartIter));
|
||||
end;
|
||||
|
||||
class function TGtk2WSCustomMemo.GetCaretPos(const ACustomEdit: TCustomEdit
|
||||
): TPoint;
|
||||
var
|
||||
TextView: PGtkTextView;
|
||||
TextBuffer: PGtkTextBuffer;
|
||||
TextMark: PGtkTextMark;
|
||||
TextIter: TGtkTextIter;
|
||||
begin
|
||||
Result := Point(0, 0);
|
||||
if not WSCheckHandleAllocated(ACustomEdit, 'GetCaretPos') then
|
||||
Exit;
|
||||
TextView := PGtkTextView(GetWidgetInfo(Pointer(ACustomEdit.Handle), False)^.CoreWidget);
|
||||
TextBuffer := gtk_text_view_get_buffer(TextView);
|
||||
TextMark := gtk_text_buffer_get_insert(TextBuffer);
|
||||
gtk_text_buffer_get_iter_at_mark(TextBuffer, @TextIter, TextMark);
|
||||
|
||||
Result.X := gtk_text_iter_get_line_offset(@TextIter);
|
||||
Result.Y := gtk_text_iter_get_line(@TextIter);
|
||||
end;
|
||||
|
||||
class procedure TGtk2WSCustomMemo.SetCaretPos(const ACustomEdit: TCustomEdit;
|
||||
const NewPos: TPoint);
|
||||
var
|
||||
TextView: PGtkTextView;
|
||||
TextBuffer: PGtkTextBuffer;
|
||||
TextIter: TGtkTextIter;
|
||||
begin
|
||||
if not WSCheckHandleAllocated(ACustomEdit, 'SetCaretPos') then
|
||||
Exit;
|
||||
TextView := PGtkTextView(GetWidgetInfo(Pointer(ACustomEdit.Handle), False)^.CoreWidget);
|
||||
TextBuffer := gtk_text_view_get_buffer(TextView);
|
||||
|
||||
if (NewPos.X < 0) or (NewPos.Y < 0)
|
||||
then Exit;
|
||||
|
||||
{ this is quicker, but crashes if given invalid coords:
|
||||
gtk_text_buffer_get_iter_at_line_offset(TextBuffer, @TextIter, NewPos.Y, NewPos.X); }
|
||||
|
||||
if (NewPos.Y >= gtk_text_buffer_get_line_count(TextBuffer))
|
||||
then Exit;
|
||||
gtk_text_buffer_get_iter_at_line(TextBuffer, @TextIter, NewPos.Y);
|
||||
if (NewPos.X >= gtk_text_iter_get_chars_in_line(@TextIter))
|
||||
then Exit;
|
||||
gtk_text_iter_set_line_offset(@TextIter, NewPos.X);
|
||||
|
||||
gtk_text_buffer_place_cursor(TextBuffer, @TextIter);
|
||||
end;
|
||||
|
@ -221,6 +221,9 @@ type
|
||||
class procedure GetPreferredSize(const AWinControl: TWinControl;
|
||||
var PreferredWidth, PreferredHeight: integer;
|
||||
WithThemeSpace: Boolean); override;
|
||||
|
||||
class function GetCaretPos(const ACustomEdit: TCustomEdit): TPoint; override;
|
||||
class procedure SetCaretPos(const ACustomEdit: TCustomEdit; const NewPos: TPoint); override;
|
||||
end;
|
||||
|
||||
{ TGtk2WSEdit }
|
||||
|
Loading…
Reference in New Issue
Block a user