richmemo: speed up range style selection by comparing flag to initalStyle rather than all supported styles

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5050 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
skalogryz
2016-07-29 19:01:40 +00:00
parent 58c9433aa1
commit 267efe922d

View File

@ -521,10 +521,9 @@ var
sel : TCHARRANGE; sel : TCHARRANGE;
d : Integer; d : Integer;
last : Integer; last : Integer;
initMask : DWORD;
const const
ALL_MASK = CFM_RICHMEMO_ATTRS; ALL_MASK = CFM_RICHMEMO_ATTRS;
begin begin
Result := false; Result := false;
if (RichEditWnd = 0) then Exit; if (RichEditWnd = 0) then Exit;
@ -538,33 +537,47 @@ begin
FillChar(fmt, sizeof(fmt), 0); FillChar(fmt, sizeof(fmt), 0);
fmt.cbSize := sizeof(fmt); fmt.cbSize := sizeof(fmt);
sel.cpMin := TextStart;
sel.cpMax := TextStart;
SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel));
SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt));
initMask := fmt.dwMask and ALL_MASK;
FillChar(fmt, sizeof(fmt), 0);
fmt.cbSize := sizeof(fmt);
sel.cpMin := TextStart; sel.cpMin := TextStart;
sel.cpMax := len+1; sel.cpMax := len+1;
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));
if (fmt.dwMask and ALL_MASK) <> ALL_MASK then begin fmt.dwMask:=fmt.dwMask and ALL_MASK;
if fmt.dwMask <> initMask then begin
d := (len - sel.cpMin); d := (len - sel.cpMin);
while d > 1 do begin while d > 1 do begin
d := d div 2; d := d div 2;
if (fmt.dwMask and ALL_MASK) = ALL_MASK then if fmt.dwMask = initMask then
sel.cpMax := sel.cpMax + d 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_EXSETSEL, 0, LPARAM(@sel));
SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt)); SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt));
fmt.dwMask:=fmt.dwMask and ALL_MASK;
end; end;
if (fmt.dwMask and ALL_MASK) = ALL_MASK then begin if fmt.dwMask = initMask then begin
while (sel.cpMax <= len) and ((fmt.dwMask and ALL_MASK) = ALL_MASK) do begin while (sel.cpMax <= len) and (fmt.dwMask = initMask) 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));
fmt.dwMask:=fmt.dwMask and ALL_MASK;
end; end;
end else begin end else begin
while (sel.cpMax > sel.cpMin) and ((fmt.dwMask and ALL_MASK) <> ALL_MASK) do begin while (sel.cpMax > sel.cpMin) and (fmt.dwMask <> initMask) 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));
fmt.dwMask:=fmt.dwMask and ALL_MASK;
end; end;
inc(sel.cpMax); inc(sel.cpMax);
end; end;
@ -575,29 +588,33 @@ begin
sel.cpMax := TextStart+1; sel.cpMax := TextStart+1;
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));
if (fmt.dwMask and ALL_MASK) <> ALL_MASK then begin fmt.dwMask:=fmt.dwMask and ALL_MASK;
if fmt.dwMask <> initMask then begin
d := TextStart; d := TextStart;
while d > 1 do begin while d > 1 do begin
d := d div 2; d := d div 2;
if (fmt.dwMask and ALL_MASK) = ALL_MASK then if fmt.dwMask = initMask then
dec(sel.cpMin,d) dec(sel.cpMin,d)
else else
inc(sel.cpMin,d); inc(sel.cpMin,d);
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));
fmt.dwMask:=fmt.dwMask and ALL_MASK;
end; end;
if (fmt.dwMask and ALL_MASK) = ALL_MASK then begin if (fmt.dwMask = initMask) then begin
while (sel.cpMin > 0) and ((fmt.dwMask and ALL_MASK) = ALL_MASK) do begin while (sel.cpMin > 0) and (fmt.dwMask = initMask) do begin
dec(sel.cpMin); dec(sel.cpMin);
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));
fmt.dwMask:=fmt.dwMask and ALL_MASK;
end; end;
if (fmt.dwMask and ALL_MASK) <> ALL_MASK then inc(sel.cpMin); if (fmt.dwMask = initMask) then inc(sel.cpMin);
end else begin end else begin
while (sel.cpMin < TextStart) and ((fmt.dwMask and ALL_MASK) <> ALL_MASK) do begin while (sel.cpMin < TextStart) and (fmt.dwMask <> initMask) do begin
inc(sel.cpMin); inc(sel.cpMin);
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));
fmt.dwMask:=fmt.dwMask and ALL_MASK;
end; end;
end; end;
end; end;