You've already forked lazarus-ccr
richmemo: prevent win32 scrolling on changing text attributes
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5974 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -864,7 +864,6 @@ var
|
|||||||
p : TFontParams;
|
p : TFontParams;
|
||||||
allowInternalChange: Boolean;
|
allowInternalChange: Boolean;
|
||||||
fp : TFontParams;
|
fp : TFontParams;
|
||||||
h,v : integer;
|
|
||||||
const
|
const
|
||||||
AllFontStyles : TFontStyles = [fsBold, fsItalic, fsUnderline, fsStrikeOut];
|
AllFontStyles : TFontStyles = [fsBold, fsItalic, fsUnderline, fsStrikeOut];
|
||||||
begin
|
begin
|
||||||
@ -872,8 +871,6 @@ begin
|
|||||||
|
|
||||||
if (ModifyMask = []) or (TextLength = 0) then Exit;
|
if (ModifyMask = []) or (TextLength = 0) then Exit;
|
||||||
|
|
||||||
h:=Self.HorzScrollBar.Position;
|
|
||||||
v:=Self.VertScrollBar.Position;
|
|
||||||
allowInternalChange:=(not (tmm_Styles in ModifyMask)) or (AddFontStyle+RemoveFontStyle=AllFontStyles);
|
allowInternalChange:=(not (tmm_Styles in ModifyMask)) or (AddFontStyle+RemoveFontStyle=AllFontStyles);
|
||||||
|
|
||||||
if allowInternalChange and (TWSCustomRichMemoClass(WidgetSetClass).isInternalChange(Self, ModifyMask)) then
|
if allowInternalChange and (TWSCustomRichMemoClass(WidgetSetClass).isInternalChange(Self, ModifyMask)) then
|
||||||
@ -886,8 +883,6 @@ begin
|
|||||||
Exit;
|
Exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
//todo: this is temporary workaround
|
|
||||||
// the style changing should not be adjusting the scroll
|
|
||||||
Lines.BeginUpdate;
|
Lines.BeginUpdate;
|
||||||
try
|
try
|
||||||
// manually looping from text ranges and re-applying
|
// manually looping from text ranges and re-applying
|
||||||
@ -912,10 +907,6 @@ begin
|
|||||||
inc(i, l);
|
inc(i, l);
|
||||||
end;
|
end;
|
||||||
finally
|
finally
|
||||||
// todo: this is a workaround.
|
|
||||||
// getting position is necessary, so the cached values are refershed
|
|
||||||
if Self.HorzScrollBar.Position<>h then Self.HorzScrollBar.Position:=h;
|
|
||||||
if Self.VertScrollBar.Position<>v then Self.VertScrollBar.Position:=v;
|
|
||||||
Lines.EndUpdate;
|
Lines.EndUpdate;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
@ -630,9 +630,11 @@ var
|
|||||||
OrigLen : Integer;
|
OrigLen : Integer;
|
||||||
NeedLock : Boolean;
|
NeedLock : Boolean;
|
||||||
eventmask : Integer;
|
eventmask : Integer;
|
||||||
|
pt : TPoint;
|
||||||
begin
|
begin
|
||||||
if not Assigned(RichEditManager) or not Assigned(AWinControl) then Exit;
|
if not Assigned(RichEditManager) or not Assigned(AWinControl) then Exit;
|
||||||
|
|
||||||
|
RichEditManager.GetScroll(AWinControl.Handle, pt);
|
||||||
eventmask := RichEditManager.SetEventMask(AWinControl.Handle, 0);
|
eventmask := RichEditManager.SetEventMask(AWinControl.Handle, 0);
|
||||||
RichEditManager.GetSelection(AWinControl.Handle, OrigStart, OrigLen);
|
RichEditManager.GetSelection(AWinControl.Handle, OrigStart, OrigLen);
|
||||||
|
|
||||||
@ -646,6 +648,7 @@ begin
|
|||||||
end else
|
end else
|
||||||
RichEditManager.SetSelectedTextStyle(AWinControl.Handle, Params);
|
RichEditManager.SetSelectedTextStyle(AWinControl.Handle, Params);
|
||||||
|
|
||||||
|
RichEditManager.SetScroll(AWinControl.Handle, pt);
|
||||||
RichEditManager.SetEventMask(AWinControl.Handle, eventmask);
|
RichEditManager.SetEventMask(AWinControl.Handle, eventmask);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -654,12 +657,15 @@ class function TWin32WSCustomRichMemo.GetTextAttributes(const AWinControl: TWinC
|
|||||||
var
|
var
|
||||||
Orig : TCHARRANGE;
|
Orig : TCHARRANGE;
|
||||||
eventmask : LongWord;
|
eventmask : LongWord;
|
||||||
|
pt : TPoint;
|
||||||
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);
|
InitFontParams(Params);
|
||||||
|
|
||||||
|
RichEditManager.GetScroll(AWinControl.Handle, pt);
|
||||||
eventmask := RichEditManager.SetEventMask(AWinControl.Handle, 0);
|
eventmask := RichEditManager.SetEventMask(AWinControl.Handle, 0);
|
||||||
|
|
||||||
LockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle);
|
LockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle);
|
||||||
@ -670,6 +676,7 @@ begin
|
|||||||
Result := RichEditManager.GetSelectedTextStyle(AWinControl.Handle, Params );
|
Result := RichEditManager.GetSelectedTextStyle(AWinControl.Handle, Params );
|
||||||
|
|
||||||
RichEditManager.SetSelRange(AWinControl.Handle, Orig);
|
RichEditManager.SetSelRange(AWinControl.Handle, Orig);
|
||||||
|
RichEditManager.SetScroll(AWinControl.Handle, pt);
|
||||||
UnlockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle, false);
|
UnlockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle, false);
|
||||||
|
|
||||||
RichEditManager.SetEventMask(AWinControl.Handle,eventmask);
|
RichEditManager.SetEventMask(AWinControl.Handle,eventmask);
|
||||||
@ -689,8 +696,10 @@ var
|
|||||||
OrigLen : Integer;
|
OrigLen : Integer;
|
||||||
eventmask : longword;
|
eventmask : longword;
|
||||||
NeedLock : Boolean;
|
NeedLock : Boolean;
|
||||||
|
pt : TPoint;
|
||||||
begin
|
begin
|
||||||
eventmask := RichEditManager.SetEventMask(AWinControl.Handle, 0);
|
eventmask := RichEditManager.SetEventMask(AWinControl.Handle, 0);
|
||||||
|
RichEditManager.GetScroll(AWinControl.Handle, pt);
|
||||||
RichEditManager.GetSelection(AWinControl.Handle, OrigStart, OrigLen);
|
RichEditManager.GetSelection(AWinControl.Handle, OrigStart, OrigLen);
|
||||||
|
|
||||||
NeedLock := (OrigStart <> TextStart) or (OrigLen <> TextLen);
|
NeedLock := (OrigStart <> TextStart) or (OrigLen <> TextLen);
|
||||||
@ -703,6 +712,7 @@ begin
|
|||||||
end else
|
end else
|
||||||
RichEditManager.SetSelectedTextStyle(AWinControl.Handle, Params, True, AModifyMask);
|
RichEditManager.SetSelectedTextStyle(AWinControl.Handle, Params, True, AModifyMask);
|
||||||
|
|
||||||
|
RichEditManager.SetScroll(AWinControl.Handle, pt);
|
||||||
RichEditManager.SetEventMask(AWinControl.Handle, eventmask);
|
RichEditManager.SetEventMask(AWinControl.Handle, eventmask);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -743,12 +753,15 @@ class function TWin32WSCustomRichMemo.GetStyleRange(
|
|||||||
var
|
var
|
||||||
Orig : TCharRange;
|
Orig : TCharRange;
|
||||||
eventmask : longword;
|
eventmask : longword;
|
||||||
|
pt : TPoint;
|
||||||
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;
|
||||||
|
|
||||||
|
RichEditManager.GetScroll(AWinControl.Handle, pt);
|
||||||
|
|
||||||
eventmask := RichEditManager.SetEventMask(AWinControl.Handle, 0);
|
eventmask := RichEditManager.SetEventMask(AWinControl.Handle, 0);
|
||||||
LockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle);
|
LockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle);
|
||||||
|
|
||||||
@ -761,6 +774,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
RichEditManager.SetSelRange(AWinControl.Handle, Orig);
|
RichEditManager.SetSelRange(AWinControl.Handle, Orig);
|
||||||
|
RichEditManager.SetScroll(AWinControl.Handle, pt);
|
||||||
UnlockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle, false);
|
UnlockRedraw(TCustomRichMemo(AWinControl), AWinControl.Handle, false);
|
||||||
|
|
||||||
RichEditManager.SetEventMask(AWinControl.Handle, eventmask);
|
RichEditManager.SetEventMask(AWinControl.Handle, eventmask);
|
||||||
@ -1460,10 +1474,10 @@ var
|
|||||||
begin
|
begin
|
||||||
if not Assigned(AWinControl) or not (AWinControl.HandleAllocated) or ((DeltaX=0) and (DeltaY=0)) then Exit;
|
if not Assigned(AWinControl) or not (AWinControl.HandleAllocated) or ((DeltaX=0) and (DeltaY=0)) then Exit;
|
||||||
|
|
||||||
Windows.SendMessage(AWinControl.Handle, EM_GETSCROLLPOS, 0, LPARAM(@pt));
|
RichEditManager.GetScroll(AWinControl.Handle, pt);
|
||||||
dec(pt.x,DeltaX);
|
dec(pt.x,DeltaX);
|
||||||
dec(pt.y,Deltay);
|
dec(pt.y,Deltay);
|
||||||
Windows.SendMessage(AWinControl.Handle, EM_SETSCROLLPOS, 0, LPARAM(@pt));
|
RichEditManager.SetScroll(AWinControl.Handle, pt);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// The function doesn't use Windows 7 (Vista?) animations. And should.
|
// The function doesn't use Windows 7 (Vista?) animations. And should.
|
||||||
|
@ -193,6 +193,9 @@ type
|
|||||||
class function Find(RichEditWnd: THandle; const ANiddle: WideString; const ASearch: TIntSearchOpt; var TextLen: Integer): Integer; virtual; overload;
|
class function Find(RichEditWnd: THandle; const ANiddle: WideString; const ASearch: TIntSearchOpt; var TextLen: Integer): Integer; virtual; overload;
|
||||||
class function Find(RichEditWnd: THandle; const ANiddle: WideString; const ASearch: TIntSearchOpt): Integer; overload;
|
class function Find(RichEditWnd: THandle; const ANiddle: WideString; const ASearch: TIntSearchOpt): Integer; overload;
|
||||||
class procedure GetParaRange(RichEditWnd: Handle; TextStart: integer; var para: TParaRange); virtual;
|
class procedure GetParaRange(RichEditWnd: Handle; TextStart: integer; var para: TParaRange); virtual;
|
||||||
|
|
||||||
|
class procedure GetScroll(RichEditWnd: Handle; out pt: TPoint); virtual;
|
||||||
|
class procedure SetScroll(RichEditWnd: Handle; const pt: TPoint); virtual;
|
||||||
end;
|
end;
|
||||||
TRichManagerClass = class of TRichEditManager;
|
TRichManagerClass = class of TRichEditManager;
|
||||||
|
|
||||||
@ -973,6 +976,16 @@ begin
|
|||||||
para.length:=toend;
|
para.length:=toend;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
class procedure TRichEditManager.GetScroll(RichEditWnd: Handle; out pt: TPoint);
|
||||||
|
begin
|
||||||
|
SendMessage(RichEditWnd, EM_GETSCROLLPOS, 0, LPARAM(@pt));
|
||||||
|
end;
|
||||||
|
|
||||||
|
class procedure TRichEditManager.SetScroll(RichEditWnd: Handle; const pt: TPoint);
|
||||||
|
begin
|
||||||
|
SendMessage(RichEditWnd, EM_SETSCROLLPOS, 0, LPARAM(@pt));
|
||||||
|
end;
|
||||||
|
|
||||||
function WinInsertImageFromFile (const ARichMemo: TCustomRichMemo; APos: Integer;
|
function WinInsertImageFromFile (const ARichMemo: TCustomRichMemo; APos: Integer;
|
||||||
const FileNameUTF8: string;
|
const FileNameUTF8: string;
|
||||||
const AImgSize: TSize): Boolean;
|
const AImgSize: TSize): Boolean;
|
||||||
|
Reference in New Issue
Block a user