From bcd9116085451cf8f3b9b231169e2aefdda3223f Mon Sep 17 00:00:00 2001 From: skalogryz Date: Thu, 27 Nov 2014 05:05:33 +0000 Subject: [PATCH] richmemo: implemented gtk2 getting para-range and style-range git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3791 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- components/richmemo/gtk2/gtk2richmemo.pas | 58 +++++++++++++++++++++-- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/components/richmemo/gtk2/gtk2richmemo.pas b/components/richmemo/gtk2/gtk2richmemo.pas index 26a5e1d56..fdf0bc0b2 100644 --- a/components/richmemo/gtk2/gtk2richmemo.pas +++ b/components/richmemo/gtk2/gtk2richmemo.pas @@ -49,9 +49,12 @@ type published class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override; - class function GetTextAttributes(const AWinControl: TWinControl; TextStart: Integer; var Params: TIntFontParams): Boolean; override; - class procedure SetTextAttributes(const AWinControl: TWinControl; TextStart, TextLen: Integer; const Params: TIntFontParams); override; - + class function GetStyleRange(const AWinControl: TWinControl; TextStart: Integer; + var RangeStart, RangeLen: Integer): Boolean; override; + class function GetTextAttributes(const AWinControl: TWinControl; TextStart: Integer; + var Params: TIntFontParams): Boolean; override; + class procedure SetTextAttributes(const AWinControl: TWinControl; TextStart, TextLen: Integer; + const Params: TIntFontParams); override; class function GetParaAlignment(const AWinControl: TWinControl; TextStart: Integer; var AAlign: TIntParaAlignment): Boolean; override; class procedure SetParaAlignment(const AWinControl: TWinControl; TextStart, TextLen: Integer; @@ -62,6 +65,7 @@ type class procedure SetParaMetric(const AWinControl: TWinControl; TextStart, TextLen: Integer; const AMetric: TIntParaMetric); override; + class function GetParaRange(const AWinControl: TWinControl; TextStart: Integer; var rng: TParaRange): Boolean; override; class procedure InDelText(const AWinControl: TWinControl; const TextUTF8: String; DstStart, DstLen: Integer); override; class function Search(const AWinControl: TWinControl; const ANiddle: string; const SearchOpts: TIntSearchOpt): Integer; override; @@ -233,6 +237,32 @@ begin SetCallbacks(Widget, WidgetInfo); end; +class function TGtk2WSCustomRichMemo.GetStyleRange( + const AWinControl: TWinControl; TextStart: Integer; var RangeStart, + RangeLen: Integer): Boolean; +var + w : PGtkWidget; + b : PGtkTextBuffer; + istart : TGtkTextIter; + iend : TGtkTextIter; +begin + GetWidgetBuffer(AWinControl, w, b); + if not Assigned(b) then begin + Result:=false; + Exit; + end; + + gtk_text_buffer_get_iter_at_offset (b, @istart, TextStart+1); + gtk_text_iter_backward_to_tag_toggle(@istart, nil); + RangeStart:=gtk_text_iter_get_offset(@istart); + + gtk_text_buffer_get_iter_at_offset (b, @iend, TextStart); + gtk_text_iter_forward_to_tag_toggle(@iend, nil); + + RangeLen:=gtk_text_iter_get_offset(@iend)-RangeStart; + Result:=true; +end; + class procedure TGtk2WSCustomRichMemo.SetTextAttributes(const AWinControl: TWinControl; TextStart, TextLen: Integer; const Params: TIntFontParams); var TextWidget: PGtkWidget; @@ -391,6 +421,28 @@ begin ApplyTag(buffer, tag, TextStart, TextLen, true); end; +class function TGtk2WSCustomRichMemo.GetParaRange( + const AWinControl: TWinControl; TextStart: Integer; var rng: TParaRange + ): Boolean; +var + w : PGtkWidget; + b : PGtkTextBuffer; + istart : TGtkTextIter; + iend : TGtkTextIter; +begin + GetWidgetBuffer(AWinControl, w, b); + if not Assigned(b) then Exit; + gtk_text_buffer_get_iter_at_offset (b, @istart, TextStart); + gtk_text_buffer_get_iter_at_offset (b, @iend, TextStart); + gtk_text_iter_set_line_offset(@istart, 0); + gtk_text_iter_forward_to_line_end(@iend); + rng.start:=gtk_text_iter_get_offset(@istart); + rng.lenghtNoBr:=gtk_text_iter_get_offset(@iend)-rng.start; + + gtk_text_iter_forward_char(@iend); // if there's a character to move, then it's end of line, if not then it won't change! + rng.length:=gtk_text_iter_get_offset(@iend)-rng.start; +end; + class procedure TGtk2WSCustomRichMemo.InDelText(const AWinControl: TWinControl; const TextUTF8: String; DstStart, DstLen: Integer); var