You've already forked lazarus-ccr
richmemo: gtk2 text search, partially based on the patch by Krzysztof Dibowski
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3779 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@@ -29,7 +29,7 @@ uses
|
|||||||
// RTL/FCL
|
// RTL/FCL
|
||||||
Types, Classes, SysUtils,
|
Types, Classes, SysUtils,
|
||||||
// LCL
|
// LCL
|
||||||
LCLType, Controls, Graphics,
|
LCLType, Controls, Graphics, LazUTF8,
|
||||||
// Gtk2 widget
|
// Gtk2 widget
|
||||||
Gtk2Def,
|
Gtk2Def,
|
||||||
GTK2WinApiWindow, Gtk2Globals, Gtk2Proc, InterfaceBase,
|
GTK2WinApiWindow, Gtk2Globals, Gtk2Proc, InterfaceBase,
|
||||||
@@ -64,6 +64,8 @@ type
|
|||||||
|
|
||||||
class procedure InDelText(const AWinControl: TWinControl; const TextUTF8: String; DstStart, DstLen: Integer); 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;
|
||||||
|
|
||||||
class function ImageFromFile(const ARichMemo: TCustomRichMemo; APos: Integer;
|
class function ImageFromFile(const ARichMemo: TCustomRichMemo; APos: Integer;
|
||||||
const FileNameUTF8: string;
|
const FileNameUTF8: string;
|
||||||
const AImgSize: TSize
|
const AImgSize: TSize
|
||||||
@@ -348,7 +350,6 @@ var
|
|||||||
h : double;
|
h : double;
|
||||||
fl : double;
|
fl : double;
|
||||||
t : double;
|
t : double;
|
||||||
v : Integer;
|
|
||||||
attr : PGtkTextAttributes;
|
attr : PGtkTextAttributes;
|
||||||
fp : TFontParams;
|
fp : TFontParams;
|
||||||
const
|
const
|
||||||
@@ -407,6 +408,91 @@ begin
|
|||||||
gtk_text_buffer_insert(b, @istart, @textUTF8[1], length(TextUTF8));
|
gtk_text_buffer_insert(b, @istart, @textUTF8[1], length(TextUTF8));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure UTF8CharsToWideString(const p: Pchar; var w: WideString);
|
||||||
|
var
|
||||||
|
slen : Integer;
|
||||||
|
cnt: Integer;
|
||||||
|
sz: SizeUInt;
|
||||||
|
begin
|
||||||
|
if not Assigned(p) then begin
|
||||||
|
w:='';
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
slen:=strlen(p);
|
||||||
|
if slen=0 then begin
|
||||||
|
w:='';
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
cnt:=UTF8Length(p, slen);
|
||||||
|
SetLength(w, cnt);
|
||||||
|
if cnt>0 then
|
||||||
|
ConvertUTF8ToUTF16( @w[1], length(w), p, slen, [toInvalidCharToSymbol], sz);
|
||||||
|
SetLength(w, sz);
|
||||||
|
end;
|
||||||
|
|
||||||
|
class function TGtk2WSCustomRichMemo.Search(const AWinControl: TWinControl;
|
||||||
|
const ANiddle: string; const SearchOpts: TIntSearchOpt): Integer;
|
||||||
|
var
|
||||||
|
TextWidget : PGtkWidget;
|
||||||
|
buffer : PGtkTextBuffer;
|
||||||
|
istart : TGtkTextIter;
|
||||||
|
iend : TGtkTextIter;
|
||||||
|
start_match : TGtkTextIter;
|
||||||
|
end_match : TGtkTextIter;
|
||||||
|
Found : Boolean;
|
||||||
|
opt : TGtkTextSearchFlags;
|
||||||
|
gstr : PChar;
|
||||||
|
txt : WideString;
|
||||||
|
sub : WIdeString;
|
||||||
|
const
|
||||||
|
GTK_TEXT_SEARCH_VISIBLE_ONLY = 1 shl 0; (* values of TGtkTextSearchFlags *)
|
||||||
|
{%H-}GTK_TEXT_SEARCH_TEXT_ONLY = 1 shl 1;
|
||||||
|
GTK_TEXT_SEARCH_CASE_INSENSITIVE = 1 shl 2;
|
||||||
|
begin
|
||||||
|
Result := -1;
|
||||||
|
GetWidgetBuffer(AWinControl, TextWidget, buffer);
|
||||||
|
if not Assigned(buffer) then Exit;
|
||||||
|
|
||||||
|
opt:=GTK_TEXT_SEARCH_VISIBLE_ONLY;
|
||||||
|
if not (soMatchCase in SearchOpts.Options) then begin
|
||||||
|
opt:=opt or GTK_TEXT_SEARCH_CASE_INSENSITIVE; // doesn't work anyway! it works in gtk3 only
|
||||||
|
|
||||||
|
gtk_text_buffer_get_iter_at_offset (buffer, @istart, SearchOpts.start);
|
||||||
|
gtk_text_buffer_get_iter_at_offset (buffer, @iend, SearchOpts.start+SearchOpts.len);
|
||||||
|
|
||||||
|
gtk_text_buffer_get_text(buffer, @istart, @iend, false);
|
||||||
|
gstr := gtk_text_buffer_get_text(Buffer, @istart, @iend, False);
|
||||||
|
if Assigned(gstr) then begin
|
||||||
|
UTF8CharsToWideString(gstr, txt);
|
||||||
|
g_free(gstr);
|
||||||
|
txt:=WideUpperCase(txt);
|
||||||
|
sub:=WideUpperCase(UTF8Decode(ANiddle));
|
||||||
|
Result:=Pos(sub,txt);
|
||||||
|
if Result>0 then
|
||||||
|
Result:=Result-1+SearchOpts.start
|
||||||
|
else
|
||||||
|
Result:=-1;
|
||||||
|
end else
|
||||||
|
Result:=-1;
|
||||||
|
end else begin
|
||||||
|
gtk_text_buffer_get_iter_at_offset(buffer, @istart, SearchOpts.start );
|
||||||
|
if not (soBackward in SearchOpts.Options) then
|
||||||
|
begin
|
||||||
|
gtk_text_buffer_get_iter_at_offset(buffer, @iend, SearchOpts.start+SearchOpts.len );
|
||||||
|
Found := gtk_text_iter_forward_search(@istart, PgChar(ANiddle), opt,
|
||||||
|
@start_match, @end_match, @iend)
|
||||||
|
end else begin
|
||||||
|
gtk_text_buffer_get_iter_at_offset(buffer, @iend, SearchOpts.start-SearchOpts.len);
|
||||||
|
Found := gtk_text_iter_backward_search(@istart, PgChar(ANiddle), opt,
|
||||||
|
@start_match, @end_match, @iend)
|
||||||
|
end;
|
||||||
|
|
||||||
|
if Found
|
||||||
|
then Result := gtk_text_iter_get_offset(@start_match)
|
||||||
|
else Result := -1;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
class function TGtk2WSCustomRichMemo.ImageFromFile(
|
class function TGtk2WSCustomRichMemo.ImageFromFile(
|
||||||
const ARichMemo: TCustomRichMemo; APos: Integer; const FileNameUTF8: string;
|
const ARichMemo: TCustomRichMemo; APos: Integer; const FileNameUTF8: string;
|
||||||
const AImgSize: TSize): Boolean;
|
const AImgSize: TSize): Boolean;
|
||||||
|
Reference in New Issue
Block a user