Starts addding TMemo support to LCL-CustomDrawn and some fixes related to the TCDEdit.MultiLine implementation

git-svn-id: trunk@36931 -
This commit is contained in:
sekelsenmat 2012-04-20 14:35:33 +00:00
parent eb613379a2
commit 9b1fbde31c
4 changed files with 85 additions and 9 deletions

View File

@ -794,7 +794,8 @@ var
begin begin
if not AStateEx.CaretIsVisible then Exit; if not AStateEx.CaretIsVisible then Exit;
lControlText := AStateEx.Lines.Strings[AStateEx.CaretPos.Y]; if AStateEx.Lines.Count = 0 then lControlText := ''
else lControlText := AStateEx.Lines.Strings[AStateEx.CaretPos.Y];
lCaptionHeight := GetMeasuresEx(ADest, TCDCONTROL_CAPTION_HEIGHT, AState, AStateEx); lCaptionHeight := GetMeasuresEx(ADest, TCDCONTROL_CAPTION_HEIGHT, AState, AStateEx);
lTextBottomSpacing := GetMeasures(TCDEDIT_BOTTOM_TEXT_SPACING); lTextBottomSpacing := GetMeasures(TCDEDIT_BOTTOM_TEXT_SPACING);
lTextTopSpacing := GetMeasures(TCDEDIT_TOP_TEXT_SPACING); lTextTopSpacing := GetMeasures(TCDEDIT_TOP_TEXT_SPACING);

View File

@ -1496,6 +1496,7 @@ begin
// Impose limits in the caret too // Impose limits in the caret too
FEditState.CaretPos.X := Min(FEditState.CaretPos.X, UTF8Length(lLineText)); FEditState.CaretPos.X := Min(FEditState.CaretPos.X, UTF8Length(lLineText));
FEditState.CaretPos.Y := Min(FEditState.CaretPos.Y, FEditState.Lines.Count-1); FEditState.CaretPos.Y := Min(FEditState.CaretPos.Y, FEditState.Lines.Count-1);
FEditState.CaretPos.Y := Max(FEditState.CaretPos.Y, 0);
end; end;
// Result.X -> returns a zero-based position of the caret // Result.X -> returns a zero-based position of the caret
@ -1516,6 +1517,7 @@ begin
if Result.Y < 0 then if Result.Y < 0 then
begin begin
Result.X := 1; Result.X := 1;
Result.Y := 0;
Exit; Exit;
end; end;
@ -1903,12 +1905,22 @@ end;
function TCDEdit.GetCurrentLine: string; function TCDEdit.GetCurrentLine: string;
begin begin
Result := FLines.Strings[FEditState.CaretPos.Y]; if (FEditState.Lines.Count = 0) or (FEditState.CaretPos.Y >= FEditState.Lines.Count) then
Result := ''
else Result := FLines.Strings[FEditState.CaretPos.Y];
end; end;
procedure TCDEdit.SetCurrentLine(AStr: string); procedure TCDEdit.SetCurrentLine(AStr: string);
begin begin
FLines.Strings[FEditState.CaretPos.Y] := AStr; if (FEditState.Lines.Count = 0) or (FEditState.CaretPos.Y >= FEditState.Lines.Count) then
begin
FEditState.Lines.Text := AStr;
FEditState.VisibleTextStart.X := 1;
FEditState.VisibleTextStart.Y := 0;
FEditState.CaretPos.X := 0;
FEditState.CaretPos.Y := 0;
end
else FLines.Strings[FEditState.CaretPos.Y] := AStr;
end; end;
{ TCDCheckBox } { TCDCheckBox }

View File

@ -297,8 +297,8 @@ end;
function RegisterCustomMemo: Boolean; alias : 'WSRegisterCustomMemo'; function RegisterCustomMemo: Boolean; alias : 'WSRegisterCustomMemo';
begin begin
// RegisterWSComponent(TCustomMemo, TWinCEWSCustomMemo); RegisterWSComponent(TCustomMemo, TCDWSCustomMemo);
Result := False; Result := True;
end; end;
function RegisterButtonControl: Boolean; alias : 'WSRegisterButtonControl'; function RegisterButtonControl: Boolean; alias : 'WSRegisterButtonControl';

View File

@ -212,16 +212,23 @@ type
{ TCDWSCustomMemo } { TCDWSCustomMemo }
TCDWSCustomMemo = class(TWSCustomMemo) TCDWSCustomMemo = class(TWSCustomMemo)
public
class procedure InjectCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
published published
{ class function CreateHandle(const AWinControl: TWinControl; // TWSWinControl
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): HWND; override; const AParams: TCreateParams): HWND; override;
class procedure DestroyHandle(const AWinControl: TWinControl); override;
class procedure AppendText(const ACustomMemo: TCustomMemo; const AText: string); override; class procedure AppendText(const ACustomMemo: TCustomMemo; const AText: string); override;
class function GetStrings(const ACustomMemo: TCustomMemo): TStrings; override; class function GetStrings(const ACustomMemo: TCustomMemo): TStrings; override;
class procedure SetAlignment(const ACustomEdit: TCustomEdit; const AAlignment: TAlignment); override; class procedure FreeStrings(var AStrings: TStrings); override;
{ class procedure SetAlignment(const ACustomEdit: TCustomEdit; const AAlignment: TAlignment); override;
class procedure SetScrollbars(const ACustomMemo: TCustomMemo; const NewScrollbars: TScrollStyle); override; class procedure SetScrollbars(const ACustomMemo: TCustomMemo; const NewScrollbars: TScrollStyle); override;
class procedure SetWantReturns(const ACustomMemo: TCustomMemo; const NewWantReturns: boolean); override; class procedure SetWantReturns(const ACustomMemo: TCustomMemo; const NewWantReturns: boolean); override;
class procedure SetWantTabs(const ACustomMemo: TCustomMemo; const NewWantTabs: boolean); override; class procedure SetWantTabs(const ACustomMemo: TCustomMemo; const NewWantTabs: boolean); override;
class procedure SetWordWrap(const ACustomMemo: TCustomMemo; const NewWordWrap: boolean); override;} class procedure SetWordWrap(const ACustomMemo: TCustomMemo; const NewWordWrap: boolean); override;}
class procedure ShowHide(const AWinControl: TWinControl); override;
end; end;
{ TCDWSEdit } { TCDWSEdit }
@ -338,6 +345,62 @@ type
implementation implementation
{ TCDWSCustomMemo }
class procedure TCDWSCustomMemo.InjectCDControl(const AWinControl: TWinControl;
var ACDControlField: TCDControl);
begin
TCDIntfEdit(ACDControlField).LCLControl := TCustomEdit(AWinControl);
TCDIntfEdit(ACDControlField).MultiLine := True;
ACDControlField.Caption := AWinControl.Caption;
ACDControlField.Parent := AWinControl;
ACDControlField.Align := alClient;
end;
class function TCDWSCustomMemo.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): HWND;
var
lCDWinControl: TCDWinControl;
begin
Result := TCDWSWinControl.CreateHandle(AWinControl, AParams);
lCDWinControl := TCDWinControl(Result);
lCDWinControl.CDControl := TCDIntfEdit.Create(AWinControl);
end;
class procedure TCDWSCustomMemo.DestroyHandle(const AWinControl: TWinControl);
var
lCDWinControl: TCDWinControl;
begin
lCDWinControl := TCDWinControl(AWinControl.Handle);
lCDWinControl.CDControl.Free;
lCDWinControl.Free;
end;
class procedure TCDWSCustomMemo.AppendText(const ACustomMemo: TCustomMemo;
const AText: string);
begin
end;
class function TCDWSCustomMemo.GetStrings(const ACustomMemo: TCustomMemo): TStrings;
var
lCDWinControl: TCDWinControl;
begin
lCDWinControl := TCDWinControl(ACustomMemo.Handle);
if lCDWinControl.CDControl = nil then Exit;
Result := TCDIntfEdit(lCDWinControl.CDControl).Lines;
end;
class procedure TCDWSCustomMemo.FreeStrings(var AStrings: TStrings);
begin
// Don't free it in the WS!
end;
class procedure TCDWSCustomMemo.ShowHide(const AWinControl: TWinControl);
begin
inherited ShowHide(AWinControl);
end;
{ TCDWSScrollBar } { TCDWSScrollBar }
class procedure TCDWSScrollBar.InjectCDControl(const AWinControl: TWinControl; class procedure TCDWSScrollBar.InjectCDControl(const AWinControl: TWinControl;
@ -1263,7 +1326,7 @@ begin
Result := False; Result := False;
lCDWinControl := TCDWinControl(AWinControl.Handle); lCDWinControl := TCDWinControl(AWinControl.Handle);
if lCDWinControl.CDControl = nil then Exit; if lCDWinControl.CDControl = nil then Exit;
AText := TCDIntfEdit(lCDWinControl.CDControl).Text; AText := TCDIntfEdit(lCDWinControl.CDControl).Lines.Text;
//DebugLn('[TCDWSCustomEdit.GetText] AWinControl=' + AWinControl.Name + ' AText='+AText); //DebugLn('[TCDWSCustomEdit.GetText] AWinControl=' + AWinControl.Name + ' AText='+AText);
Result := True; Result := True;
end; end;
@ -1275,7 +1338,7 @@ var
begin begin
lCDWinControl := TCDWinControl(AWinControl.Handle); lCDWinControl := TCDWinControl(AWinControl.Handle);
if lCDWinControl.CDControl = nil then Exit; if lCDWinControl.CDControl = nil then Exit;
TCDIntfEdit(lCDWinControl.CDControl).Text := AText; TCDIntfEdit(lCDWinControl.CDControl).Lines.Text := AText;
end; end;
class procedure TCDWSCustomEdit.ShowHide(const AWinControl: TWinControl); class procedure TCDWSCustomEdit.ShowHide(const AWinControl: TWinControl);