completed win32 getstylerange, for the best peformance.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@853 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
parent
423ca16d13
commit
9e63e46c6c
@ -163,17 +163,17 @@ begin
|
|||||||
Result := true;
|
Result := true;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
class function TRichEditManager.GetStyleRange(RichEditWnd: Handle; TextStart: Integer;
|
class function TRichEditManager.GetStyleRange(RichEditWnd: Handle; TextStart: Integer;
|
||||||
var RangeStart, RangeLen: Integer): Boolean;
|
var RangeStart, RangeLen: Integer): Boolean;
|
||||||
var
|
var
|
||||||
w : WPARAM;
|
|
||||||
len : integer;
|
len : integer;
|
||||||
fmt : TCHARFORMAT;
|
fmt : TCHARFORMAT;
|
||||||
mask : LongWord;
|
|
||||||
textlen : TGETTEXTEX;
|
textlen : TGETTEXTEX;
|
||||||
sel : TCHARRANGE;
|
sel : TCHARRANGE;
|
||||||
d : Integer;
|
d : Integer;
|
||||||
last : Integer;
|
last : Integer;
|
||||||
|
|
||||||
const
|
const
|
||||||
CP_UNICODE = 1200;
|
CP_UNICODE = 1200;
|
||||||
ALL_MASK = CFM_BOLD or CFM_ITALIC or CFM_STRIKEOUT or CFM_UNDERLINE or
|
ALL_MASK = CFM_BOLD or CFM_ITALIC or CFM_STRIKEOUT or CFM_UNDERLINE or
|
||||||
@ -185,69 +185,75 @@ begin
|
|||||||
textlen.flags := GTL_DEFAULT or GTL_NUMCHARS;
|
textlen.flags := GTL_DEFAULT or GTL_NUMCHARS;
|
||||||
textlen.codepage := CP_UNICODE;
|
textlen.codepage := CP_UNICODE;
|
||||||
len := SendMessage(RichEditWnd, EM_GETTEXTLENGTHEX, WPARAM(@textlen), 0);
|
len := SendMessage(RichEditWnd, EM_GETTEXTLENGTHEX, WPARAM(@textlen), 0);
|
||||||
writeln('TextStart = ', TextStart);
|
|
||||||
writeln('TextLength = ', len);
|
|
||||||
|
|
||||||
sel.cpMin := TextStart;
|
|
||||||
sel.cpMax := len;
|
|
||||||
SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel));
|
|
||||||
|
|
||||||
FillChar(fmt, sizeof(fmt), 0);
|
FillChar(fmt, sizeof(fmt), 0);
|
||||||
fmt.cbSize := sizeof(fmt);
|
fmt.cbSize := sizeof(fmt);
|
||||||
|
|
||||||
//todo: BOOST PERFORMANCE!!!
|
|
||||||
sel.cpMax := TextStart;
|
|
||||||
repeat
|
|
||||||
inc(sel.cpMax);
|
|
||||||
SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel));
|
|
||||||
SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt));
|
|
||||||
until (sel.cpMax > len) or ((fmt.dwMask and ALL_MASK) <> ALL_MASK);
|
|
||||||
|
|
||||||
last := sel.cpMax;
|
|
||||||
sel.cpMin := TextStart;
|
sel.cpMin := TextStart;
|
||||||
sel.cpMax := TextStart+1;
|
sel.cpMax := len+1;
|
||||||
repeat
|
SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel));
|
||||||
dec(sel.cpMin);
|
SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt));
|
||||||
SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel));
|
if (fmt.dwMask and ALL_MASK) <> ALL_MASK then begin
|
||||||
SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt));
|
d := (len - sel.cpMin);
|
||||||
until ((fmt.dwMask and ALL_MASK) <> ALL_MASK) or (sel.cpMin < 0);
|
|
||||||
inc(sel.cpMin);
|
|
||||||
|
|
||||||
{ SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt));
|
|
||||||
|
|
||||||
|
|
||||||
if fmt.dwMask and ALL_MASK <> ALL_MASK then begin
|
|
||||||
d := (len - sel.cpMin) div 2;
|
|
||||||
sel.cpMax := sel.cpMin + d;
|
|
||||||
while d > 1 do begin
|
while d > 1 do begin
|
||||||
SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel));
|
d := d div 2;
|
||||||
SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt));
|
if (fmt.dwMask and ALL_MASK) = ALL_MASK then
|
||||||
d := d div 2;
|
sel.cpMax := sel.cpMax + d
|
||||||
if fmt.dwMask and ALL_MASK = ALL_MASK then
|
|
||||||
sel.cpMax := sel.cpMax + d
|
|
||||||
else
|
else
|
||||||
sel.cpMax := sel.cpMax - d;
|
sel.cpMax := sel.cpMax - d;
|
||||||
|
SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel));
|
||||||
|
SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if (fmt.dwMask and ALL_MASK) = ALL_MASK then begin
|
if (fmt.dwMask and ALL_MASK) = ALL_MASK then begin
|
||||||
repeat
|
while (sel.cpMax <= len) and ((fmt.dwMask and ALL_MASK) = ALL_MASK) do begin
|
||||||
inc(sel.cpMax);
|
inc(sel.cpMax);
|
||||||
SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel));
|
SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel));
|
||||||
SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt));
|
SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt));
|
||||||
writeln(sel.cpMax, ' ', (fmt.dwMask and ALL_MASK) <> ALL_MASK);
|
end;
|
||||||
until (sel.cpMax = len) or ((fmt.dwMask and ALL_MASK) <> ALL_MASK);
|
|
||||||
end else begin
|
end else begin
|
||||||
repeat
|
while (sel.cpMax > sel.cpMin) and ((fmt.dwMask and ALL_MASK) <> ALL_MASK) do begin
|
||||||
dec(sel.cpMax);
|
dec(sel.cpMax);
|
||||||
SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel));
|
SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel));
|
||||||
SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt));
|
SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt));
|
||||||
until (sel.cpMax <= sel.cpMin) or ((fmt.dwMask and ALL_MASK) = ALL_MASK);
|
end;
|
||||||
|
inc(sel.cpMax);
|
||||||
end;
|
end;
|
||||||
end;}
|
end;
|
||||||
|
last := sel.cpMax;
|
||||||
|
|
||||||
|
sel.cpMin := 0;
|
||||||
|
sel.cpMax := TextStart+1;
|
||||||
|
SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel));
|
||||||
|
SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt));
|
||||||
|
if (fmt.dwMask and ALL_MASK) <> ALL_MASK then begin
|
||||||
|
d := TextStart;
|
||||||
|
while d > 1 do begin
|
||||||
|
d := d div 2;
|
||||||
|
if (fmt.dwMask and ALL_MASK) = ALL_MASK then
|
||||||
|
dec(sel.cpMin,d)
|
||||||
|
else
|
||||||
|
inc(sel.cpMin,d);
|
||||||
|
SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel));
|
||||||
|
SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt));
|
||||||
|
end;
|
||||||
|
if (fmt.dwMask and ALL_MASK) = ALL_MASK then begin
|
||||||
|
while (sel.cpMin > 0) and ((fmt.dwMask and ALL_MASK) = ALL_MASK) do begin
|
||||||
|
dec(sel.cpMin);
|
||||||
|
SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel));
|
||||||
|
SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt));
|
||||||
|
end;
|
||||||
|
if (fmt.dwMask and ALL_MASK) <> ALL_MASK then inc(sel.cpMin);
|
||||||
|
end else begin
|
||||||
|
while (sel.cpMin < TextStart) and ((fmt.dwMask and ALL_MASK) <> ALL_MASK) do begin
|
||||||
|
inc(sel.cpMin);
|
||||||
|
SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel));
|
||||||
|
SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt));
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
RangeStart := sel.cpMin;
|
RangeStart := sel.cpMin;
|
||||||
RangeLen := last - sel.cpMin - 1;
|
RangeLen := last - sel.cpMin - 1;
|
||||||
writeln('Range Start = ', RangeStart, ' Len = ', RangeLen);
|
|
||||||
Result := true;
|
Result := true;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user