From fc539c83cefe68b9135fa67a491e30a4bb83cf4a Mon Sep 17 00:00:00 2001 From: skalogryz Date: Mon, 15 Jun 2009 21:53:45 +0000 Subject: [PATCH] started get style range implementaion for Win32/64 git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@847 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- components/richmemo/win32/win32richmemo.pas | 14 ++++- .../richmemo/win32/win32richmemoproc.pas | 56 ++++++++++++++++++- 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/components/richmemo/win32/win32richmemo.pas b/components/richmemo/win32/win32richmemo.pas index e6ea36985..8c26af2a1 100644 --- a/components/richmemo/win32/win32richmemo.pas +++ b/components/richmemo/win32/win32richmemo.pas @@ -178,8 +178,20 @@ end; class function TWin32WSCustomRichMemo.GetStyleRange( const AWinControl: TWinControl; TextStart: Integer; var RangeStart, RangeLen: Integer): Boolean; +var + OrigStart : Integer; + OrigLen : Integer; begin - Result:=inherited GetStyleRange(AWinControl, TextStart, RangeStart, RangeLen); + if not Assigned(RichEditManager) or not Assigned(AWinControl) then begin + Result := false; + Exit; + end; + RichEditManager.GetSelection(AWinControl.Handle, OrigStart, OrigLen); + LockRedraw(AWinControl.Handle); + RichEditManager.SetSelection(AWinControl.Handle, TextStart, 1); + Result := RichEditManager.GetStyleRange(AWinControl.Handle, TextStart, RangeStart, RangeLen); + RichEditManager.SetSelection(AWinControl.Handle, OrigStart, OrigLen); + UnlockRedraw(AWinControl.Handle); end; class function TWin32WSCustomRichMemo.LoadRichText( diff --git a/components/richmemo/win32/win32richmemoproc.pas b/components/richmemo/win32/win32richmemoproc.pas index 4009d73b5..2428b32db 100644 --- a/components/richmemo/win32/win32richmemoproc.pas +++ b/components/richmemo/win32/win32richmemoproc.pas @@ -21,9 +21,9 @@ type TRichEditManager = class(TObject) public - class function SetSelectedTextStyle(RichEditWnd: Handle; - Params: TIntFontParams): Boolean; virtual; + class function SetSelectedTextStyle(RichEditWnd: Handle; Params: TIntFontParams): Boolean; virtual; class function GetSelectedTextStyle(RichEditWnd: Handle; var Params: TIntFontParams): Boolean; virtual; + class function GetStyleRange(RichEditWnd: Handle; TextStart: Integer; var RangeStart, RangeLen: Integer): Boolean; virtual; class procedure GetSelection(RichEditWnd: Handle; var TextStart, TextLen: Integer); virtual; class procedure SetSelection(RichEditWnd: Handle; TextStart, TextLen: Integer); virtual; class procedure SetHideSelection(RichEditWnd: Handle; AValue: Boolean); virtual; @@ -163,6 +163,58 @@ begin Result := true; end; +class function TRichEditManager.GetStyleRange(RichEditWnd: Handle; TextStart: Integer; + var RangeStart, RangeLen: Integer): Boolean; +var + w : WPARAM; + len : integer; + fmt : TCHARFORMAT; + mask : LongWord; + textlen : TGETTEXTEX; + sel : TCHARRANGE; + rngend : Integer; + d : Integer; +const + CP_UNICODE = 1200; + ALL_MASK = CFM_BOLD or CFM_ITALIC or CFM_STRIKEOUT or CFM_UNDERLINE or + CFM_SIZE or CFM_COLOR or CFM_FACE; +begin + Result := false; + if RichEditWnd = 0 then Exit; + + textlen.flags := GTL_DEFAULT or GTL_NUMCHARS; + textlen.codepage := CP_UNICODE; + len := SendMessage(RichEditWnd, EM_GETTEXTLENGTHEX, WPARAM(@textlen), 0); + + sel.cpMin := TextStart; + sel.cpMax := len; + SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel)); + + FillChar(fmt, sizeof(fmt), 0); + fmt.cbSize := sizeof(fmt); + SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt)); + + + if fmt.dwMask and ALL_MASK <> ALL_MASK then begin + rngend := len; + d := rngend - sel.cpMin; + sel.cpMax := sel.cpMin + d div 2; + while d > 1 do begin + SendMessage(RichEditWnd, EM_EXSETSEL, 0, LPARAM(@sel)); + SendMessage(RichEditWnd, EM_GETCHARFORMAT, SCF_SELECTION, PtrInt(@fmt)); + d := d div 2; + if fmt.dwMask and ALL_MASK = ALL_MASK then + sel.cpMax := sel.cpMax + d + else + sel.cpMax := sel.cpMax - d; + end; + end; + + RangeStart := sel.cpMin; + RangeLen := sel.cpMax - sel.cpMin; + Result := true; +end; + class procedure TRichEditManager.GetSelection(RichEditWnd: Handle; var TextStart, TextLen: Integer); var Range : TCHARRANGE;