richmemo: always update the selection to make the "SelStart" at the minimal character position, when detecting styles

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5049 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
skalogryz
2016-07-29 18:47:08 +00:00
parent 5cfee9383f
commit 58c9433aa1

View File

@ -165,6 +165,8 @@ var
// or set it to whatever function desired // or set it to whatever function desired
NCPaint : TNCPaintProc = nil; NCPaint : TNCPaintProc = nil;
function GetSelRTF(amemo: TCustomRichMemo): string;
implementation implementation
type type
@ -567,30 +569,22 @@ class function TWin32WSCustomRichMemo.GetTextAttributes(const AWinControl: TWinC
var var
OrigStart : Integer; OrigStart : Integer;
OrigLen : Integer; OrigLen : Integer;
NeedLock : Boolean;
eventmask : LongWord; eventmask : LongWord;
begin begin
if not Assigned(RichEditManager) or not Assigned(AWinControl) then begin if not Assigned(RichEditManager) or not Assigned(AWinControl) then begin
Result := false; Result := false;
Exit; Exit;
end; end;
InitFontParams(Params);
eventmask := RichEditManager.SetEventMask(AWinControl.Handle, 0); eventmask := RichEditManager.SetEventMask(AWinControl.Handle, 0);
RichEditManager.GetSelection(AWinControl.Handle, OrigStart, OrigLen); RichEditManager.GetSelection(AWinControl.Handle, OrigStart, OrigLen);
NeedLock := (OrigStart <> TextStart); LockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle);
if NeedLock then begin RichEditManager.SetSelection(AWinControl.Handle, TextStart, 1);
LockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle); Result := RichEditManager.GetSelectedTextStyle(AWinControl.Handle, Params );
RichEditManager.SetSelection(AWinControl.Handle, TextStart, 1); RichEditManager.SetSelection(AWinControl.Handle, OrigStart, OrigLen);
Result := RichEditManager.GetSelectedTextStyle(AWinControl.Handle, Params ); UnlockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle, false);
RichEditManager.SetSelection(AWinControl.Handle, OrigStart, OrigLen);
UnlockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle, false);
end else begin
LockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle);
Result := RichEditManager.GetSelectedTextStyle(AWinControl.Handle, Params);
UnlockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle, false);
end;
RichEditManager.SetEventMask(AWinControl.Handle,eventmask); RichEditManager.SetEventMask(AWinControl.Handle,eventmask);
end; end;
@ -718,7 +712,6 @@ class function TWin32WSCustomRichMemo.GetTextUIParams(const AWinControl: TWinCon
var var
OrigStart : Integer; OrigStart : Integer;
OrigLen : Integer; OrigLen : Integer;
NeedLock : Boolean;
eventmask : Integer; eventmask : Integer;
begin begin
if not Assigned(RichEditManager) or not Assigned(AWinControl) then begin if not Assigned(RichEditManager) or not Assigned(AWinControl) then begin
@ -729,15 +722,11 @@ begin
eventmask := RichEditManager.SetEventMask(AWinControl.Handle, 0); eventmask := RichEditManager.SetEventMask(AWinControl.Handle, 0);
RichEditManager.GetSelection(AWinControl.Handle, OrigStart, OrigLen); RichEditManager.GetSelection(AWinControl.Handle, OrigStart, OrigLen);
NeedLock := (OrigStart <> TextStart); LockRedraw( TCustomRichMemo(AWinControl), AWinControl.Handle);
if NeedLock then begin RichEditManager.SetSelection(AWinControl.Handle, TextStart, 1);
LockRedraw( TCustomRichMemo(AWinControl), AWinControl.Handle); RichEditManager.GetTextUIStyle(AWinControl.Handle, ui);
RichEditManager.SetSelection(AWinControl.Handle, TextStart, 1); RichEditManager.SetSelection(AWinControl.Handle, OrigStart, OrigLen);
RichEditManager.GetTextUIStyle(AWinControl.Handle, ui); UnlockRedraw( TCustomRichMemo(AWinControl), AWinControl.Handle);
RichEditManager.SetSelection(AWinControl.Handle, OrigStart, OrigLen);
UnlockRedraw( TCustomRichMemo(AWinControl), AWinControl.Handle);
end else
RichEditManager.GetTextUIStyle(AWinControl.Handle, ui);
RichEditManager.SetEventMask(AWinControl.Handle, eventmask); RichEditManager.SetEventMask(AWinControl.Handle, eventmask);
Result:=true; Result:=true;
@ -1356,6 +1345,54 @@ begin
end; end;
end; end;
type
TStreamText = record
buf : AnsiString;
end;
PStreamText = ^TStreamText;
function Read(dwCookie:PDWORD; pbBuff:LPBYTE; cb:LONG; var pcb:LONG):DWORD; stdcall;
var
p : PStreamText;
b : string;
i : integer;
begin
b:=PStreamText(dwCookie)^.buf;
i:=length(b);
SetLength(b, length(b)+cb);
Move(pbBuff^, b[i+1], cb);
pcb:=cb;
PStreamText(dwCookie)^.buf:=b;
Result:=0;
end;
type
_editstream = record
dwCookie : PTRUINT;
dwError : DWORD;
pfnCallback : EDITSTREAMCALLBACK;
end;
function GetSelRTF(amemo: TCustomRichMemo): string;
var
str : _EDITSTREAM;
tt : TStreamText;
begin
if not Assigned(amemo) or (not amemo.HandleAllocated) then begin
Result:='';
Exit;
end;
FillChar(str, sizeof(str),0);
str.dwCookie:=PtrUInt(@tt);
str.pfnCallback:=@Read;
SendMessage( amemo.Handle, EM_STREAMOUT, SF_RTFNOOBJS or SFF_PLAINRTF or SFF_SELECTION, LParam(@str));
Result:=tt.buf;
end;
initialization initialization
NCPaint := @ThemedNCPaint; NCPaint := @ThemedNCPaint;