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
This commit is contained in:
skalogryz 2009-06-15 21:53:45 +00:00
parent 5ce2730604
commit fc539c83ce
2 changed files with 67 additions and 3 deletions

View File

@ -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(

View File

@ -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;