richmemo: win32 fix style selection on internal change.

modified Internal change. Only allow if styles is fully modified.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4526 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
skalogryz
2016-02-29 04:48:34 +00:00
parent 5f4b958da5
commit 5804937f58
2 changed files with 13 additions and 3 deletions

View File

@ -845,16 +845,24 @@ var
j : Integer; j : Integer;
l : Integer; l : Integer;
p : TFontParams; p : TFontParams;
allowInternalChange: Boolean;
fp : TFontParams;
const
AllFontStyles : TFontStyles = [fsBold, fsItalic, fsUnderline, fsStrikeOut];
begin begin
if not HandleAllocated then HandleNeeded; if not HandleAllocated then HandleNeeded;
if (ModifyMask = []) or (TextLength = 0) then Exit; if (ModifyMask = []) or (TextLength = 0) then Exit;
if TWSCustomRichMemoClass(WidgetSetClass).isInternalChange(Self, ModifyMask) then allowInternalChange:=(not (tmm_Styles in ModifyMask)) or (AddFontStyle+RemoveFontStyle=AllFontStyles);
if allowInternalChange and (TWSCustomRichMemoClass(WidgetSetClass).isInternalChange(Self, ModifyMask)) then
begin begin
// more effecient from OS view // more effecient from OS view
fp:=fnt;
if tmm_Styles in ModifyMask then fp.Style:=AddFontStyle;
TWSCustomRichMemoClass(WidgetSetClass).SetTextAttributesInternal(Self, TWSCustomRichMemoClass(WidgetSetClass).SetTextAttributesInternal(Self,
TextStart, TextLength, ModifyMask, fnt); TextStart, TextLength, ModifyMask, fp);
Exit; Exit;
end; end;

View File

@ -383,6 +383,8 @@ class function TRichEditManager.SetSelectedTextStyle(RichEditWnd: Handle;
var var
w : WPARAM; w : WPARAM;
fmt : TCHARFORMAT2; fmt : TCHARFORMAT2;
const
CFM_STYLESONLY = CFM_BOLD or CFM_ITALIC or CFM_UNDERLINE or CFM_STRIKEOUT or CFM_SUBSCRIPT or CFM_SUPERSCRIPT;
begin begin
if RichEditWnd = 0 then begin if RichEditWnd = 0 then begin
Result := false; Result := false;
@ -411,7 +413,7 @@ begin
end; end;
if not useMask or (tmm_Styles in AModifyMask) then begin if not useMask or (tmm_Styles in AModifyMask) then begin
fmt.dwMask := fmt.dwMask or CFM_EFFECTS or CFM_SUBSCRIPT or CFM_SUPERSCRIPT; fmt.dwMask := fmt.dwMask or CFM_STYLESONLY;
fmt.dwEffects := FontStylesToEffects(Params.Style) or VScriptPosToEffects(Params.VScriptPos); fmt.dwEffects := FontStylesToEffects(Params.Style) or VScriptPosToEffects(Params.VScriptPos);
end; end;