LCL-CustomDrawn: Implements SetFocus and corrects a lot of control injection code which was not updated to the latest way of doing it

git-svn-id: trunk@37048 -
This commit is contained in:
sekelsenmat 2012-04-27 12:20:11 +00:00
parent 8da0ccb743
commit a294a8baf8
10 changed files with 201 additions and 99 deletions

View File

@ -77,4 +77,5 @@
{.$define VerboseCDEvents}
{.$define VerboseCDAccessibility}
{.$define VerboseCDClipboard}
{.$define VerboseCDFocus}

View File

@ -53,6 +53,7 @@ type
function AdjustCoordinatesForScrolling(AX, AY: Integer): TPoint;
procedure UpdateImageAndCanvas; virtual;
function IsControlBackgroundVisible: Boolean; virtual;
function GetWinControl: TWinControl; virtual;
property Props[AnIndex:String]:pointer read GetProps write SetProps;
end;
@ -66,6 +67,7 @@ type
CDControlInjected: Boolean;
procedure UpdateImageAndCanvas; override;
function IsControlBackgroundVisible: Boolean; override;
function GetWinControl: TWinControl; override;
end;
{ TCDForm }
@ -90,6 +92,7 @@ type
procedure SanityCheckScrollPos();
procedure UpdateImageAndCanvas; override;
function IsControlBackgroundVisible: Boolean; override;
function GetWinControl: TWinControl; override;
end;
TCDNonNativeForm = class(TCDForm)
@ -974,6 +977,11 @@ begin
Result:=inherited IsControlBackgroundVisible;
end;
function TCDWinControl.GetWinControl: TWinControl;
begin
Result := WinControl;
end;
{ TCDBitmap }
destructor TCDBitmap.Destroy;
@ -997,6 +1005,11 @@ begin
result := nil;
end;
function TCDBaseControl.GetWinControl: TWinControl;
begin
Result := FWinControl;
end;
procedure TCDBaseControl.SetProps(AnIndex: String; AValue: pointer);
var
i: Integer;
@ -1130,5 +1143,10 @@ begin
Result:=inherited IsControlBackgroundVisible;
end;
function TCDForm.GetWinControl: TWinControl;
begin
Result := LCLForm;
end;
end.

View File

@ -4701,6 +4701,8 @@ begin
begin
lControlHandle := TCDWinControl(lHandle);
lControlHandle.IncInvalidateCount();
if lControlHandle.CDControlInjected and (lControlHandle.CDControl <> nil) then
TCDWinControl(lControlHandle.CDControl.Handle).IncInvalidateCount();
lControl := lControlHandle.WinControl;
lControl := Forms.GetParentForm(lControl);
// Don't use Rect in BackendInvalidateRect unless we really make the full
@ -5556,7 +5558,7 @@ begin
QCursor_setPos(X, Y);
Result := True;
end;
end;*)
{------------------------------------------------------------------------------
Function: SetFocus
@ -5564,29 +5566,67 @@ end;
Returns:
------------------------------------------------------------------------------}
function TQtWidgetSet.SetFocus(hWnd: HWND): HWND;
function TCDWidgetSet.SetFocus(hWnd: HWND): HWND;
var
W: TQtWidget;
lObject, lOldObject: TCDBaseControl;
lOldControl: TWinControl;
lHandle: TCDWinControl;
begin
{$ifdef VerboseCDFocus}
DebugLn(Format('[TCDWidgetSet.SetFocus] Handle=%x', [hWnd]));
{$endif}
Result := 0;
if hwnd<>0 then
if hwnd = 0 then
begin
{$ifdef VerboseFocus}
WriteLn('********* TQtWidgetSet.SetFocus INIT focusing ', TQtWidget(hwnd).lclobject.name);
{$endif}
Result := GetFocus;
W := TQtWidget(HWND).getWindow;
if (W <> nil) and W.getVisible and not W.IsActiveWindow and
not TQtMainWindow(W).Blocked then
W.Activate;
TQtWidget(hWnd).setFocus;
{$ifdef VerboseFocus}
DebugLn('********* TQtWidgetSet.SetFocus END was %x now is %x',[result,hwnd]);
Result := GetFocus();
Exit;
end;
lObject := TCDBaseControl(hWnd);
// SetFocus on a child control
if lObject is TCDWinControl then
begin
lHandle := TCDWinControl(lObject);
// If the control is injected, really set focus in the injected one
if lHandle.CDControlInjected and (lHandle.CDControl <> nil) then
begin
Result := SetFocus(LCLType.HWND(lHandle.CDControl.Handle));
Exit;
end;
// Handling for controls without injected controls
Result := GetFocus();
lOldObject := TCDBaseControl(Result);
if lOldObject = nil then
lOldControl := nil
else
lOldControl := lOldObject.GetWinControl();
if lOldControl <> nil then
LCLSendKillFocusMsg(lOldControl);
LCLSendSetFocusMsg(lHandle.WinControl);
FocusedControl := lHandle.WinControl;
FocusedIntfControl := lHandle.CDControl;
{$ifdef VerboseCDFocus}
DebugLn(Format(':[TCDWidgetSet.SetFocus] NewFocusedControl=%s NewFocusedIntfControl=%x', [FocusedControl.Name, PtrUInt(FocusedIntfControl)]));
{$endif}
// Set focus in the parent window
//Result := BackendSetFocus(hWnd);
// Invalidate to redraw the new control
InvalidateRect(LCLType.HWND(lHandle), nil, True);
if lOldObject <> nil then
InvalidateRect(LCLType.HWND(lOldObject), nil, True);
end
// SetFocus on a form
else
begin
Result := BackendSetFocus(hWnd);
end;
end;
function TQtWidgetSet.GetForegroundWindow: HWND;
(*function TQtWidgetSet.GetForegroundWindow: HWND;
var
W: QWidgetH;
begin

View File

@ -5524,7 +5524,7 @@ begin
QCursor_setPos(X, Y);
Result := True;
end;
end;*)
{------------------------------------------------------------------------------
Function: SetFocus
@ -5532,12 +5532,12 @@ end;
Returns:
------------------------------------------------------------------------------}
function TQtWidgetSet.SetFocus(hWnd: HWND): HWND;
var
W: TQtWidget;
function TCDWidgetSet.BackendSetFocus(hWnd: HWND): HWND;
{var
W: TQtWidget;}
begin
Result := 0;
if hwnd<>0 then
(* if hwnd<>0 then
begin
{$ifdef VerboseFocus}
WriteLn('********* TQtWidgetSet.SetFocus INIT focusing ', TQtWidget(hwnd).lclobject.name);
@ -5551,10 +5551,10 @@ begin
{$ifdef VerboseFocus}
DebugLn('********* TQtWidgetSet.SetFocus END was %x now is %x',[result,hwnd]);
{$endif}
end;
end;*)
end;
function TQtWidgetSet.GetForegroundWindow: HWND;
(*function TQtWidgetSet.GetForegroundWindow: HWND;
var
W: QWidgetH;
begin

View File

@ -846,9 +846,20 @@ begin
{$IFDEF VerboseWinAPI}
DebugLn(Format('TCocoaWidgetSet.SelectObject Result: %x', [Result]));
{$ENDIF}
end;
end;*)
{------------------------------------------------------------------------------
Function: SetFocus
Params: hWnd - Window handle to be focused
Returns:
------------------------------------------------------------------------------}
function TCDWidgetSet.BackendSetFocus(hWnd: HWND): HWND;
begin
Result := 0;
end;
(*{------------------------------------------------------------------------------
function ShowWindow(hWnd: HWND; nCmdShow: Integer): Boolean;
nCmdShow:

View File

@ -3148,7 +3148,7 @@ begin
Result := False;
Windows.SetCursorPos(X, Y);
Result := True;
end;
end;*)
{------------------------------------------------------------------------------
Method: SetFocus
@ -3157,19 +3157,22 @@ end;
The SetFocus function sets the keyboard focus to the specified window
------------------------------------------------------------------------------}
function TWin32WidgetSet.SetFocus(HWnd: HWND): HWND;
function TCDWidgetSet.BackendSetFocus(HWnd: HWND): HWND;
var
lWindowInfo: TWindowInfo;
lHandle: HWND;
begin
{
if Windows.GetFocus <> HWnd then
if HWND = 0 then
begin
DebugLn(['TWin32WidgetSet.SetFocus ', ' Wnd = ', WndClassName(HWnd), ' LCLObject = ', dbgsName(GetLCLOwnerObject(HWnd))]);
DumpStack;
Result := GetFocus();
Exit;
end;
}
Result := Windows.SetFocus(HWnd);
lWindowInfo := TWindowInfo(HWnd);
lHandle := lWindowInfo.NativeHandle;
Result := Windows.SetFocus(lHandle);
end;
{------------------------------------------------------------------------------
(*{------------------------------------------------------------------------------
Method: SetForegroundWindow
Params: HWnd - The handle of the window
Returns: True if succesful

View File

@ -5510,7 +5510,7 @@ begin
QCursor_setPos(X, Y);
Result := True;
end;
end;*)
{------------------------------------------------------------------------------
Function: SetFocus
@ -5518,29 +5518,12 @@ end;
Returns:
------------------------------------------------------------------------------}
function TQtWidgetSet.SetFocus(hWnd: HWND): HWND;
var
W: TQtWidget;
function TCDWidgetSet.BackendSetFocus(hWnd: HWND): HWND;
begin
Result := 0;
if hwnd<>0 then
begin
{$ifdef VerboseFocus}
WriteLn('********* TQtWidgetSet.SetFocus INIT focusing ', TQtWidget(hwnd).lclobject.name);
{$endif}
Result := GetFocus;
W := TQtWidget(HWND).getWindow;
if (W <> nil) and W.getVisible and not W.IsActiveWindow and
not TQtMainWindow(W).Blocked then
W.Activate;
TQtWidget(hWnd).setFocus;
{$ifdef VerboseFocus}
DebugLn('********* TQtWidgetSet.SetFocus END was %x now is %x',[result,hwnd]);
{$endif}
end;
end;
function TQtWidgetSet.GetForegroundWindow: HWND;
(*function TQtWidgetSet.GetForegroundWindow: HWND;
var
W: QWidgetH;
begin

View File

@ -206,9 +206,10 @@ function SetCaretPos(X, Y: Integer): Boolean; override;
function SetCaretPosEx(Handle: HWnd; X, Y: Integer): Boolean; override;
function SetCaretRespondToFocus(handle: HWND; ShowHideOnFocus: boolean): Boolean; override;
function SetCursor(ACursor: HCURSOR): HCURSOR; override;
function SetCursorPos(X, Y: Integer): Boolean; override;
function SetCursorPos(X, Y: Integer): Boolean; override;*)
function SetFocus(hWnd: HWND): HWND; override;
function SetForegroundWindow(HWnd: HWND): boolean; override;
function BackendSetFocus(hWnd: HWND): HWND;
(*function SetForegroundWindow(HWnd: HWND): boolean; override;
function SetMapMode(DC: HDC; fnMapMode : Integer): Integer; override;
function SetMenu(AWindowHandle: HWND; AMenuHandle: HMENU): Boolean; override;
function SetParent(hWndChild: HWND; hWndParent: HWND): HWND; override;*)

View File

@ -51,7 +51,7 @@ type
TCDWSCustomTabControl = class(TWSCustomTabControl)
public
class procedure CreateCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
class procedure InjectCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
published
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle; override;
@ -196,7 +196,7 @@ type
TCDWSProgressBar = class(TWSProgressBar)
public
class procedure CreateCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
class procedure InjectCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
published
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
class procedure ShowHide(const AWinControl: TWinControl); override;
@ -234,7 +234,7 @@ type
TCDWSTrackBar = class(TWSTrackBar)
public
class procedure CreateCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
class procedure InjectCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
published
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
class procedure ShowHide(const AWinControl: TWinControl); override;
@ -261,7 +261,7 @@ implementation
{ TCDWSCustomTabControl }
class procedure TCDWSCustomTabControl.CreateCDControl(
class procedure TCDWSCustomTabControl.InjectCDControl(
const AWinControl: TWinControl; var ACDControlField: TCDControl);
begin
ACDControlField := TCDIntfPageControl.Create(AWinControl);
@ -287,8 +287,11 @@ begin
TCDWSWinControl.ShowHide(AWinControl);
if lCDWinControl.CDControl = nil then
CreateCDControl(AWinControl, lCDWinControl.CDControl);
if not lCDWinControl.CDControlInjected then
begin
InjectCDControl(AWinControl, lCDWinControl.CDControl);
lCDWinControl.CDControlInjected := True;
end;
end;
class procedure TCDWSCustomTabControl.AddPage(
@ -299,8 +302,11 @@ var
begin
lCDWinControl := TCDWinControl(ATabControl.Handle);
if lCDWinControl.CDControl = nil then
CreateCDControl(ATabControl, lCDWinControl.CDControl);
if not lCDWinControl.CDControlInjected then
begin
InjectCDControl(ATabControl, lCDWinControl.CDControl);
lCDWinControl.CDControlInjected := True;
end;
TCDPageControl(lCDWinControl.CDControl).InsertPage(AIndex, AChild.Caption);
end;
@ -392,7 +398,7 @@ end;*)
{ TCDWSTrackBar }
class procedure TCDWSTrackBar.CreateCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
class procedure TCDWSTrackBar.InjectCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
begin
ACDControlField := TCDIntfTrackBar.Create(AWinControl);
TCDIntfTrackBar(ACDControlField).LCLControl := TCustomTrackBar(AWinControl);
@ -416,8 +422,11 @@ begin
TCDWSWinControl.ShowHide(AWinControl);
if lCDWinControl.CDControl = nil then
CreateCDControl(AWinControl, lCDWinControl.CDControl);
if not lCDWinControl.CDControlInjected then
begin
InjectCDControl(AWinControl, lCDWinControl.CDControl);
lCDWinControl.CDControlInjected := True;
end;
end;
class procedure TCDWSTrackBar.ApplyChanges(const ATrackBar: TCustomTrackBar);
@ -426,8 +435,11 @@ var
begin
lCDWinControl := TCDWinControl(ATrackBar.Handle);
if lCDWinControl.CDControl = nil then
CreateCDControl(ATrackBar, lCDWinControl.CDControl);
if not lCDWinControl.CDControlInjected then
begin
InjectCDControl(ATrackBar, lCDWinControl.CDControl);
lCDWinControl.CDControlInjected := True;
end;
TCDTrackBar(lCDWinControl.CDControl).Position := ATrackBar.Position;
@ -472,8 +484,11 @@ var
begin
lCDWinControl := TCDWinControl(ATrackBar.Handle);
if lCDWinControl.CDControl = nil then
CreateCDControl(ATrackBar, lCDWinControl.CDControl);
if not lCDWinControl.CDControlInjected then
begin
InjectCDControl(ATrackBar, lCDWinControl.CDControl);
lCDWinControl.CDControlInjected := True;
end;
Result := TCDTrackBar(lCDWinControl.CDControl).Position;
end;
@ -484,8 +499,11 @@ var
begin
lCDWinControl := TCDWinControl(ATrackBar.Handle);
if lCDWinControl.CDControl = nil then
CreateCDControl(ATrackBar, lCDWinControl.CDControl);
if not lCDWinControl.CDControlInjected then
begin
InjectCDControl(ATrackBar, lCDWinControl.CDControl);
lCDWinControl.CDControlInjected := True;
end;
TCDTrackBar(lCDWinControl.CDControl).Position := NewPosition;
end;
@ -519,7 +537,7 @@ end;
{ TCDWSProgressBar }
class procedure TCDWSProgressBar.CreateCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
class procedure TCDWSProgressBar.InjectCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
begin
ACDControlField := TCDIntfProgressBar.Create(AWinControl);
TCDIntfProgressBar(ACDControlField).LCLControl := TCustomProgressBar(AWinControl);
@ -543,8 +561,11 @@ begin
TCDWSWinControl.ShowHide(AWinControl);
if lCDWinControl.CDControl = nil then
CreateCDControl(AWinControl, lCDWinControl.CDControl);
if not lCDWinControl.CDControlInjected then
begin
InjectCDControl(AWinControl, lCDWinControl.CDControl);
lCDWinControl.CDControlInjected := True;
end;
end;
class procedure TCDWSProgressBar.ApplyChanges(const AProgressBar: TCustomProgressBar);
@ -553,8 +574,11 @@ var
begin
lCDWinControl := TCDWinControl(AProgressBar.Handle);
if lCDWinControl.CDControl = nil then
CreateCDControl(AProgressBar, lCDWinControl.CDControl);
if not lCDWinControl.CDControlInjected then
begin
InjectCDControl(AProgressBar, lCDWinControl.CDControl);
lCDWinControl.CDControlInjected := True;
end;
TCDProgressBar(lCDWinControl.CDControl).Position := AProgressBar.Position;
@ -600,8 +624,11 @@ var
begin
lCDWinControl := TCDWinControl(AProgressBar.Handle);
if lCDWinControl.CDControl = nil then
CreateCDControl(AProgressBar, lCDWinControl.CDControl);
if not lCDWinControl.CDControlInjected then
begin
InjectCDControl(AProgressBar, lCDWinControl.CDControl);
lCDWinControl.CDControlInjected := True;
end;
TCDProgressBar(lCDWinControl.CDControl).Position := NewPosition;
end;

View File

@ -253,7 +253,7 @@ type
TCDWSButton = class(TWSButton)
public
class procedure CreateCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
class procedure InjectCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
published
class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override;
class procedure DestroyHandle(const AWinControl: TWinControl); override;
@ -268,7 +268,7 @@ type
TCDWSCustomCheckBox = class(TWSCustomCheckBox)
public
class procedure CreateCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
class procedure InjectCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
published
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle; override;
@ -307,7 +307,7 @@ type
// Make sure to override all methods from TCDWSCustomCheckBox which call CreateCDControl
TCDWSRadioButton = class(TWSRadioButton)
public
class procedure CreateCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
class procedure InjectCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
published
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle; override;
@ -325,7 +325,7 @@ type
TCDWSCustomStaticText = class(TWSCustomStaticText)
public
class procedure CreateCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
class procedure InjectCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
published
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle; override;
@ -1580,7 +1580,7 @@ end;*)
{ TCDWSStaticText }
class procedure TCDWSCustomStaticText.CreateCDControl(
class procedure TCDWSCustomStaticText.InjectCDControl(
const AWinControl: TWinControl; var ACDControlField: TCDControl);
begin
ACDControlField := TCDIntfStaticText.Create(AWinControl);
@ -1622,8 +1622,11 @@ begin
TCDWSWinControl.ShowHide(AWinControl);
if lCDWinControl.CDControl = nil then
CreateCDControl(AWinControl, lCDWinControl.CDControl);
if not lCDWinControl.CDControlInjected then
begin
InjectCDControl(AWinControl, lCDWinControl.CDControl);
lCDWinControl.CDControlInjected := True;
end;
end;
(*{------------------------------------------------------------------------------
@ -1647,7 +1650,7 @@ end;*)
{ TCDWSButton }
class procedure TCDWSButton.CreateCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
class procedure TCDWSButton.InjectCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
begin
ACDControlField := TCDIntfButton.Create(AWinControl);
TCDIntfButton(ACDControlField).LCLControl := TButton(AWinControl);
@ -1689,8 +1692,11 @@ begin
TCDWSWinControl.ShowHide(AWinControl);
if lCDWinControl.CDControl = nil then
CreateCDControl(AWinControl, lCDWinControl.CDControl);
if not lCDWinControl.CDControlInjected then
begin
InjectCDControl(AWinControl, lCDWinControl.CDControl);
lCDWinControl.CDControlInjected := True;
end;
end;
class function TCDWSButton.GetText(const AWinControl: TWinControl;
@ -1733,7 +1739,7 @@ end;*)
{ TCDWSCustomCheckBox }
class procedure TCDWSCustomCheckBox.CreateCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
class procedure TCDWSCustomCheckBox.InjectCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
begin
ACDControlField := TCDIntfCheckBox.Create(AWinControl);
TCDIntfCheckBox(ACDControlField).LCLControl := TCustomCheckBox(AWinControl);
@ -1774,8 +1780,11 @@ begin
TCDWSWinControl.ShowHide(AWinControl);
if lCDWinControl.CDControl = nil then
CreateCDControl(AWinControl, lCDWinControl.CDControl);
if not lCDWinControl.CDControlInjected then
begin
InjectCDControl(AWinControl, lCDWinControl.CDControl);
lCDWinControl.CDControlInjected := True;
end;
end;
class procedure TCDWSCustomCheckBox.GetPreferredSize(
@ -1786,8 +1795,11 @@ var
begin
lCDWinControl := TCDWinControl(AWinControl.Handle);
if lCDWinControl.CDControl = nil then
CreateCDControl(AWinControl, lCDWinControl.CDControl);
if not lCDWinControl.CDControlInjected then
begin
InjectCDControl(AWinControl, lCDWinControl.CDControl);
lCDWinControl.CDControlInjected := True;
end;
lCDWinControl.CDControl.LCLWSCalculatePreferredSize(
PreferredWidth, PreferredHeight, WithThemeSpace, AWinControl.AutoSize);
@ -1796,7 +1808,7 @@ end;
{ TCDWSRadioButton }
class procedure TCDWSRadioButton.CreateCDControl(
class procedure TCDWSRadioButton.InjectCDControl(
const AWinControl: TWinControl; var ACDControlField: TCDControl);
begin
ACDControlField := TCDIntfRadioButton.Create(AWinControl);
@ -1840,8 +1852,11 @@ begin
TCDWSWinControl.ShowHide(AWinControl);
if lCDWinControl.CDControl = nil then
CreateCDControl(AWinControl, lCDWinControl.CDControl);
if not lCDWinControl.CDControlInjected then
begin
InjectCDControl(AWinControl, lCDWinControl.CDControl);
lCDWinControl.CDControlInjected := True;
end;
end;
class procedure TCDWSRadioButton.GetPreferredSize(
@ -1852,8 +1867,11 @@ var
begin
lCDWinControl := TCDWinControl(AWinControl.Handle);
if lCDWinControl.CDControl = nil then
CreateCDControl(AWinControl, lCDWinControl.CDControl);
if not lCDWinControl.CDControlInjected then
begin
InjectCDControl(AWinControl, lCDWinControl.CDControl);
lCDWinControl.CDControlInjected := True;
end;
lCDWinControl.CDControl.LCLWSCalculatePreferredSize(
PreferredWidth, PreferredHeight, WithThemeSpace, AWinControl.AutoSize);