You've already forked lazarus-ccr
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:
@ -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;
|
||||||
@ -539,32 +538,46 @@ 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;
|
||||||
|
Reference in New Issue
Block a user