From d2156b2d4059a1fccc321533fe9c123508743a1e Mon Sep 17 00:00:00 2001 From: sekelsenmat Date: Sat, 26 Apr 2008 00:42:45 +0000 Subject: [PATCH] Patch from Henry Vermaak. Implements TMemo.CaretPos under gtk2 git-svn-id: trunk@14980 - --- docs/Contributors.txt | 1 + lcl/interfaces/gtk2/gtk2wscustommemo.inc | 45 ++++++++++++++++++++++++ lcl/interfaces/gtk2/gtk2wsstdctrls.pp | 3 ++ 3 files changed, 49 insertions(+) diff --git a/docs/Contributors.txt b/docs/Contributors.txt index 7126f9ee15..02ec3d543c 100644 --- a/docs/Contributors.txt +++ b/docs/Contributors.txt @@ -46,6 +46,7 @@ Graeme Geldenhuys Grzegorz Zakrzewski Hakan Kizilhan Hans-Joachim Ott +Henry Vermaak Hwang Weng Sun Ido Kanner James Chandler Jr. diff --git a/lcl/interfaces/gtk2/gtk2wscustommemo.inc b/lcl/interfaces/gtk2/gtk2wscustommemo.inc index 46ef747a28..3b6a543256 100644 --- a/lcl/interfaces/gtk2/gtk2wscustommemo.inc +++ b/lcl/interfaces/gtk2/gtk2wscustommemo.inc @@ -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; diff --git a/lcl/interfaces/gtk2/gtk2wsstdctrls.pp b/lcl/interfaces/gtk2/gtk2wsstdctrls.pp index 3c135dc179..b06653b565 100644 --- a/lcl/interfaces/gtk2/gtk2wsstdctrls.pp +++ b/lcl/interfaces/gtk2/gtk2wsstdctrls.pp @@ -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 }