1
0
mirror of https://github.com/salvadordf/CEF4Delphi.git synced 2025-04-17 06:57:13 +02:00

Expose additional event properties

This commit is contained in:
martin 2021-03-20 02:14:13 +01:00
parent 05d3f02c8e
commit c45c130b33
3 changed files with 146 additions and 38 deletions

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<CONFIG> <CONFIG>
<Package Version="4"> <Package Version="5">
<PathDelim Value="\"/> <PathDelim Value="\"/>
<Name Value="CEF4Delphi_Lazarus"/> <Name Value="CEF4Delphi_Lazarus"/>
<Type Value="RunAndDesignTime"/> <Type Value="RunAndDesignTime"/>
@ -850,19 +850,23 @@
<UnitName Value="uCEFLazarusOsrBrowserWindow"/> <UnitName Value="uCEFLazarusOsrBrowserWindow"/>
</Item202> </Item202>
</Files> </Files>
<RequiredPkgs Count="4"> <CompatibilityMode Value="True"/>
<RequiredPkgs Count="5">
<Item1> <Item1>
<PackageName Value="dcpcrypt"/> <PackageName Value="IDEIntf"/>
</Item1> </Item1>
<Item2> <Item2>
<PackageName Value="LCL"/> <PackageName Value="dcpcrypt"/>
</Item2> </Item2>
<Item3> <Item3>
<PackageName Value="LCLBase"/> <PackageName Value="LCL"/>
</Item3> </Item3>
<Item4> <Item4>
<PackageName Value="FCL"/> <PackageName Value="LCLBase"/>
</Item4> </Item4>
<Item5>
<PackageName Value="FCL"/>
</Item5>
</RequiredPkgs> </RequiredPkgs>
<UsageOptions> <UsageOptions>
<UnitPath Value="$(PkgOutDir)"/> <UnitPath Value="$(PkgOutDir)"/>

View File

@ -44,21 +44,33 @@ interface
uses uses
{$IFDEF FPC} {$IFDEF FPC}
LResources, LResources, PropEdits,
{$ENDIF} {$ENDIF}
uCEFApplication, uCEFChromiumWindow, uCEFTypes, uCEFInterfaces, uCEFChromium, uCEFApplication, uCEFChromiumWindow, uCEFTypes, uCEFInterfaces, uCEFChromium,
uCEFLinkedWinControlBase, uCEFLazApplication, uCEFBufferPanel, uCEFLinkedWinControlBase, uCEFLazApplication, uCEFBufferPanel,
uCEFLazarusBrowserWindow, uCEFBitmapBitBuffer, uCEFMiscFunctions, uCEFLazarusBrowserWindow, uCEFBitmapBitBuffer, uCEFMiscFunctions,
uCEFConstants, Forms, ExtCtrls, LCLType, Graphics, Controls, syncobjs, uCEFConstants, uCEFChromiumEvents, Forms, ExtCtrls, LCLType, Graphics,
LazLogger, Classes, sysutils, math; Controls, syncobjs, LazLogger, Classes, sysutils, math;
type type
TBrowserMouseEvent = procedure(Sender: TObject; Button: TMouseButton; TBrowserMouseEvent = procedure(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer; Shift: TShiftState; X, Y: Integer;
var AHandled: Boolean) of Object; var AHandled: Boolean) of Object;
TBrowserMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState;
X, Y: Integer;
var AHandled: Boolean) of Object;
TBrowserMouseWheelEvent = procedure(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint;
var AHandled: Boolean) of Object;
TBrowserKeyEvent = procedure(Sender: TObject; var Key: Word; Shift: TShiftState; var AHandled: Boolean) of Object;
//TBrowserKeyPressEvent = procedure(Sender: TObject; var Key: char; var AHandled: Boolean) of Object;
TBrowserUTF8KeyPressEvent = procedure(Sender: TObject; var UTF8Key: TUTF8Char; var AHandled: Boolean) of Object;
TLazOsrChromium = class(TLazChromium)
end;
{ TLazarusOsrBrowserWindow } { TLazarusOsrBrowserWindow }
TLazarusOsrBrowserWindow = class(TBufferPanel) TLazarusOsrBrowserWindow = class(TBufferPanel)
@ -114,17 +126,22 @@ type
AHeight: Integer); AHeight: Integer);
private private
FChromium : TLazChromium; FChromium : TLazOsrChromium;
FOnBrowserClosed : TNotifyEvent; FOnBrowserClosed : TNotifyEvent;
FOnBrowserCreated : TNotifyEvent; FOnBrowserCreated : TNotifyEvent;
FOnKeyDown: TBrowserKeyEvent;
FOnKeyUp: TBrowserKeyEvent;
FOnMouseDown: TBrowserMouseEvent; FOnMouseDown: TBrowserMouseEvent;
FOnMouseMove: TBrowserMouseMoveEvent;
FOnMouseUp: TBrowserMouseEvent; FOnMouseUp: TBrowserMouseEvent;
FOnMouseWheel: TBrowserMouseWheelEvent;
FOnUtf8KeyPress: TBrowserUTF8KeyPressEvent;
procedure DoCreateBrowserAfterContext(Sender: TObject); procedure DoCreateBrowserAfterContext(Sender: TObject);
protected protected
function GetChromium: TLazChromium; function GetChromium: TLazOsrChromium;
function getModifiers(Shift: TShiftState): TCefEventFlags; function getModifiers(Shift: TShiftState): TCefEventFlags;
function getKeyModifiers(Shift: TShiftState): TCefEventFlags; function getKeyModifiers(Shift: TShiftState): TCefEventFlags;
function GetButton(Button: TMouseButton): TCefMouseButtonType; function GetButton(Button: TMouseButton): TCefMouseButtonType;
@ -166,13 +183,18 @@ type
procedure LoadURL(aURL: ustring); procedure LoadURL(aURL: ustring);
// //
published published
property Chromium : TLazChromium read GetChromium; property Chromium : TLazOsrChromium read GetChromium;
property OnBrowserCreated : TNotifyEvent read FOnBrowserCreated write FOnBrowserCreated; property OnBrowserCreated : TNotifyEvent read FOnBrowserCreated write FOnBrowserCreated;
property OnBrowserClosed : TNotifyEvent read FOnBrowserClosed write FOnBrowserClosed; property OnBrowserClosed : TNotifyEvent read FOnBrowserClosed write FOnBrowserClosed;
property OnMouseDown: TBrowserMouseEvent read FOnMouseDown write FOnMouseDown; property OnMouseDown: TBrowserMouseEvent read FOnMouseDown write FOnMouseDown;
property OnMouseUp: TBrowserMouseEvent read FOnMouseUp write FOnMouseUp; property OnMouseUp: TBrowserMouseEvent read FOnMouseUp write FOnMouseUp;
property OnMouseMove: TBrowserMouseMoveEvent read FOnMouseMove write FOnMouseMove;
property OnMouseWheel: TBrowserMouseWheelEvent read FOnMouseWheel write FOnMouseWheel;
property OnKeyDown: TBrowserKeyEvent read FOnKeyDown write FOnKeyDown;
property OnKeyUp: TBrowserKeyEvent read FOnKeyUp write FOnKeyUp;
property OnUtf8KeyPress: TBrowserUTF8KeyPressEvent read FOnUtf8KeyPress write FOnUtf8KeyPress;
end; end;
{$IFDEF FPC} {$IFDEF FPC}
@ -498,7 +520,7 @@ begin
end; end;
end; end;
function TLazarusOsrBrowserWindow.GetChromium: TLazChromium; function TLazarusOsrBrowserWindow.GetChromium: TLazOsrChromium;
begin begin
Result := FChromium; Result := FChromium;
end; end;
@ -649,8 +671,14 @@ end;
procedure TLazarusOsrBrowserWindow.MouseMove(Shift: TShiftState; X, Y: Integer); procedure TLazarusOsrBrowserWindow.MouseMove(Shift: TShiftState; X, Y: Integer);
var var
TempEvent : TCefMouseEvent; TempEvent : TCefMouseEvent;
IsHandled: Boolean;
begin begin
inherited MouseMove(Shift, X, Y); inherited MouseMove(Shift, X, Y);
IsHandled := False;
if FOnMouseMove <> nil then
FOnMouseMove(Self, Shift, X, Y, IsHandled);
if IsHandled then
exit;
TempEvent.x := x; TempEvent.x := x;
TempEvent.y := y; TempEvent.y := y;
@ -699,8 +727,14 @@ function TLazarusOsrBrowserWindow.DoMouseWheel(Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint): Boolean; WheelDelta: Integer; MousePos: TPoint): Boolean;
var var
TempEvent : TCefMouseEvent; TempEvent : TCefMouseEvent;
IsHandled: Boolean;
begin begin
Result := inherited DoMouseWheel(Shift, WheelDelta, MousePos); Result := inherited DoMouseWheel(Shift, WheelDelta, MousePos);
IsHandled := False;
if FOnMouseWheel <> nil then
FOnMouseWheel(Self, Shift, WheelDelta, MousePos, IsHandled);
if IsHandled then
exit;
TempEvent.x := MousePos.x; TempEvent.x := MousePos.x;
TempEvent.y := MousePos.y; TempEvent.y := MousePos.y;
@ -717,7 +751,16 @@ end;
procedure TLazarusOsrBrowserWindow.KeyDown(var Key: Word; Shift: TShiftState); procedure TLazarusOsrBrowserWindow.KeyDown(var Key: Word; Shift: TShiftState);
var var
TempKeyEvent : TCefKeyEvent; TempKeyEvent : TCefKeyEvent;
IsHandled: Boolean;
begin begin
IsHandled := False;
if FOnKeyDown <> nil then
FOnKeyDown(Self, Key, Shift, IsHandled);
if IsHandled then begin
inherited KeyDown(Key, Shift);
exit;
end;
FLastKeyDown := Key; FLastKeyDown := Key;
if (Key <> 0) and (Chromium <> nil) then if (Key <> 0) and (Chromium <> nil) then
begin begin
@ -742,7 +785,16 @@ procedure TLazarusOsrBrowserWindow.UTF8KeyPress(var UTF8Key: TUTF8Char);
var var
TempKeyEvent : TCefKeyEvent; TempKeyEvent : TCefKeyEvent;
TempString : UnicodeString; TempString : UnicodeString;
IsHandled: Boolean;
begin begin
IsHandled := False;
if FOnUtf8KeyPress <> nil then
FOnUtf8KeyPress(Self, UTF8Key, IsHandled);
if IsHandled then begin
inherited UTF8KeyPress(UTF8Key);
exit;
end;
if Focused then if Focused then
begin begin
TempString := UTF8Decode(UTF8Key); TempString := UTF8Decode(UTF8Key);
@ -773,7 +825,16 @@ end;
procedure TLazarusOsrBrowserWindow.KeyUp(var Key: Word; Shift: TShiftState); procedure TLazarusOsrBrowserWindow.KeyUp(var Key: Word; Shift: TShiftState);
var var
TempKeyEvent : TCefKeyEvent; TempKeyEvent : TCefKeyEvent;
IsHandled: Boolean;
begin begin
IsHandled := False;
if FOnKeyUp <> nil then
FOnKeyUp(Self, Key, Shift, IsHandled);
if IsHandled then begin
inherited KeyUp(Key, Shift);
exit;
end;
if (Key <> 0) and (Chromium <> nil) then if (Key <> 0) and (Chromium <> nil) then
begin begin
TempKeyEvent.kind := KEYEVENT_KEYUP; TempKeyEvent.kind := KEYEVENT_KEYUP;
@ -843,9 +904,9 @@ begin
FSelectedRange.from := 0; FSelectedRange.from := 0;
FSelectedRange.to_ := 0; FSelectedRange.to_ := 0;
FChromium := TLazChromium.Create(Self); FChromium := TLazOsrChromium.Create(Self);
FChromium.OnBrowserClosed := {$IFDEF FPC}@{$ENDIF}DoOnClosed; FChromium.InternalOnBrowserClosed := {$IFDEF FPC}@{$ENDIF}DoOnClosed;
FChromium.OnBrowserCreated := {$IFDEF FPC}@{$ENDIF}DoOnCreated; FChromium.InternalOnBrowserCreated := {$IFDEF FPC}@{$ENDIF}DoOnCreated;
FChromium.OnPaint := {$IFDEF FPC}@{$ENDIF}DoChromiumPaint; FChromium.OnPaint := {$IFDEF FPC}@{$ENDIF}DoChromiumPaint;
FChromium.OnGetViewRect := {$IFDEF FPC}@{$ENDIF}DoGetChromiumViewRect; FChromium.OnGetViewRect := {$IFDEF FPC}@{$ENDIF}DoGetChromiumViewRect;
@ -910,6 +971,17 @@ procedure Register;
begin begin
// {$I res/tlazarusosrbrowserwindow.lrs} // {$I res/tlazarusosrbrowserwindow.lrs}
RegisterComponents('Chromium', [TLazarusOsrBrowserWindow]); RegisterComponents('Chromium', [TLazarusOsrBrowserWindow]);
RegisterPropertyEditor(TypeInfo(TOnClose), TLazOsrChromium,'OnClose',THiddenPropertyEditor);
RegisterPropertyEditor(TypeInfo(TOnPaint), TLazOsrChromium,'OnPaint',THiddenPropertyEditor);
RegisterPropertyEditor(TypeInfo(TOnGetViewRect), TLazOsrChromium,'OnGetViewRect',THiddenPropertyEditor);
RegisterPropertyEditor(TypeInfo(TOnCursorChange), TLazOsrChromium,'OnCursorChange',THiddenPropertyEditor);
RegisterPropertyEditor(TypeInfo(TOnGetScreenPoint), TLazOsrChromium,'OnGetScreenPoint',THiddenPropertyEditor);
RegisterPropertyEditor(TypeInfo(TOnGetScreenInfo), TLazOsrChromium,'OnGetScreenInfo',THiddenPropertyEditor);
RegisterPropertyEditor(TypeInfo(TOnPopupShow), TLazOsrChromium,'OnPopupShow',THiddenPropertyEditor);
RegisterPropertyEditor(TypeInfo(TOnPopupSize), TLazOsrChromium,'OnPopupSize',THiddenPropertyEditor);
RegisterPropertyEditor(TypeInfo(TOnTooltip), TLazOsrChromium,'OnTooltip',THiddenPropertyEditor);
RegisterPropertyEditor(TypeInfo(TOnBeforePopup), TLazOsrChromium,'OnBeforePopup',THiddenPropertyEditor);
RegisterPropertyEditor(TypeInfo(TOnIMECompositionRangeChanged), TLazOsrChromium,'OnIMECompositionRangeChanged',THiddenPropertyEditor);
end; end;
{$ENDIF} {$ENDIF}

View File

@ -44,11 +44,11 @@ interface
uses uses
{$IFDEF FPC} {$IFDEF FPC}
LResources, LResources, PropEdits,
{$ENDIF} {$ENDIF}
uCEFApplication, uCEFChromiumWindow, uCEFTypes, uCEFInterfaces, uCEFChromium, uCEFApplication, uCEFChromiumWindow, uCEFTypes, uCEFInterfaces, uCEFChromium,
uCEFLinkedWinControlBase, uCEFLazApplication, uCEFBrowserViewComponent, Forms, uCEFLinkedWinControlBase, uCEFLazApplication, uCEFBrowserViewComponent,
ExtCtrls, Controls, Classes, sysutils; uCEFChromiumEvents, Forms, ExtCtrls, Controls, Classes, sysutils;
type type
@ -63,18 +63,22 @@ type
private type private type
TLazChromiumState = (csNoBrowser, csCreatingBrowser, csHasBrowser, csClosingBrowser, csCloseAfterCreate); TLazChromiumState = (csNoBrowser, csCreatingBrowser, csHasBrowser, csClosingBrowser, csCloseAfterCreate);
private private
FState : TLazChromiumState; FInternalOnGotFocus: TOnGotFocus;
FOnBrowserClosed : TNotifyEvent; FState : TLazChromiumState;
FOnBrowserCreated : TNotifyEvent; FInternalOnBrowserClosed : TNotifyEvent;
FInternalOnBrowserCreated : TNotifyEvent;
FLoadUrl, FFrameName : ustring; FLoadUrl, FFrameName : ustring;
function GetIsClosing: Boolean; function GetIsClosing: Boolean;
procedure SetInternalOnClose(AValue: TOnClose);
protected protected
function GetHasBrowser : boolean; reintroduce; function GetHasBrowser : boolean; reintroduce;
procedure doOnBeforeClose(const ABrowser: ICefBrowser); override; procedure doOnBeforeClose(const ABrowser: ICefBrowser); override;
procedure doOnAfterCreated(const ABrowser: ICefBrowser); override; procedure doOnAfterCreated(const ABrowser: ICefBrowser); override;
procedure doOnGotFocus(const Abrowser: ICefBrowser); override;
function MustCreateFocusHandler: boolean; override;
procedure DoCreated(Data: PtrInt); procedure DoCreated(Data: PtrInt);
procedure DoOnClosed(Data: PtrInt); procedure DoOnClosed(Data: PtrInt);
@ -108,8 +112,9 @@ type
- OnBrowserCreated: the parent event may be called when procedure Initialized is still false. - OnBrowserCreated: the parent event may be called when procedure Initialized is still false.
- OnBrowserCreated: may not be called, if the CloseBrowser has already been called - OnBrowserCreated: may not be called, if the CloseBrowser has already been called
*) *)
property OnBrowserCreated : TNotifyEvent read FOnBrowserCreated write FOnBrowserCreated; property InternalOnBrowserCreated : TNotifyEvent read FInternalOnBrowserCreated write FInternalOnBrowserCreated;
property OnBrowserClosed : TNotifyEvent read FOnBrowserClosed write FOnBrowserClosed; property InternalOnBrowserClosed : TNotifyEvent read FInternalOnBrowserClosed write FInternalOnBrowserClosed;
property InternalOnGotFocus : TOnGotFocus read FInternalOnGotFocus write FInternalOnGotFocus;
end; end;
TLazarusBrowserWindow = class; TLazarusBrowserWindow = class;
@ -148,6 +153,7 @@ type
*) *)
procedure WaitForBrowserClosed; procedure WaitForBrowserClosed;
published
property Chromium: TLazChromium read FChromium; property Chromium: TLazChromium read FChromium;
end; end;
@ -167,6 +173,7 @@ type
procedure DoCreateBrowser(Sender: TObject); procedure DoCreateBrowser(Sender: TObject);
procedure DoCreateBrowserAfterContext(Sender: TObject); procedure DoCreateBrowserAfterContext(Sender: TObject);
function GetLazChromium: TLazChromium;
protected protected
function GetChromium: TChromium; override; function GetChromium: TChromium; override;
procedure DestroyHandle; override; procedure DestroyHandle; override;
@ -188,7 +195,7 @@ type
procedure LoadURL(aURL: ustring); procedure LoadURL(aURL: ustring);
published published
property Chromium; // : TChromium read GetChromium; property Chromium: TLazChromium read GetLazChromium;
property OnBrowserCreated : TNotifyEvent read FOnBrowserCreated write FOnBrowserCreated; property OnBrowserCreated : TNotifyEvent read FOnBrowserCreated write FOnBrowserCreated;
(* OnBrowserClosed will not be called, if the TLazarusBrowserWindow is (* OnBrowserClosed will not be called, if the TLazarusBrowserWindow is
@ -210,6 +217,11 @@ begin
Result := FState in [csCloseAfterCreate, csClosingBrowser]; Result := FState in [csCloseAfterCreate, csClosingBrowser];
end; end;
procedure TLazChromium.SetInternalOnClose(AValue: TOnClose);
begin
inherited OnClose := AValue;
end;
function TLazChromium.GetHasBrowser: boolean; function TLazChromium.GetHasBrowser: boolean;
begin begin
Result := (FState <> csNoBrowser) or (inherited GetHasBrowser); Result := (FState <> csNoBrowser) or (inherited GetHasBrowser);
@ -233,6 +245,19 @@ begin
Application.QueueAsyncCall(@DoCreated, 0); Application.QueueAsyncCall(@DoCreated, 0);
end; end;
procedure TLazChromium.doOnGotFocus(const Abrowser: ICefBrowser);
begin
inherited doOnGotFocus(Abrowser);
if Assigned(FInternalOnGotFocus) then
FInternalOnGotFocus(Self, Abrowser);
end;
function TLazChromium.MustCreateFocusHandler: boolean;
begin
Result := assigned(FInternalOnGotFocus) or
inherited MustCreateFocusHandler;
end;
procedure TLazChromium.DoCreated(Data: PtrInt); procedure TLazChromium.DoCreated(Data: PtrInt);
var var
u, f: ustring; u, f: ustring;
@ -247,8 +272,8 @@ begin
LoadURL(u, f); LoadURL(u, f);
end; end;
if (FOnBrowserCreated <> nil) then if (FInternalOnBrowserCreated <> nil) then
FOnBrowserCreated(Self); FInternalOnBrowserCreated(Self);
end; end;
csCloseAfterCreate: begin csCloseAfterCreate: begin
FState := csHasBrowser; FState := csHasBrowser;
@ -259,8 +284,8 @@ end;
procedure TLazChromium.DoOnClosed(Data: PtrInt); procedure TLazChromium.DoOnClosed(Data: PtrInt);
begin begin
if (FOnBrowserClosed <> nil) then if (FInternalOnBrowserClosed <> nil) then
FOnBrowserClosed(Self); FInternalOnBrowserClosed(Self);
end; end;
constructor TLazChromium.Create(AOwner: TComponent); constructor TLazChromium.Create(AOwner: TComponent);
@ -400,15 +425,15 @@ begin
FBrowserWindow := AOwner; FBrowserWindow := AOwner;
FWrapperState := wsNone; FWrapperState := wsNone;
FChromium := TLazChromium.Create(nil);
if not(csDesigning in AOwner.ComponentState) then if not(csDesigning in AOwner.ComponentState) then
begin begin
FChromium := TLazChromium.Create(nil); FChromium.OnClose := {$IFDEF FPC}@{$ENDIF}BrowserThread_OnClose;
FChromium.OnClose := {$IFDEF FPC}@{$ENDIF}BrowserThread_OnClose; FChromium.InternalOnBrowserClosed := {$IFDEF FPC}@{$ENDIF}DoOnBeforeClose;
FChromium.OnBrowserClosed := {$IFDEF FPC}@{$ENDIF}DoOnBeforeClose; FChromium.InternalOnBrowserCreated := {$IFDEF FPC}@{$ENDIF}DoOnAfterCreated;
FChromium.OnBrowserCreated := {$IFDEF FPC}@{$ENDIF}DoOnAfterCreated;
{$IFDEF LINUX} {$IFDEF LINUX}
// This is a workaround for the CEF issue #2026. Read below for more info. // This is a workaround for the CEF issue #2026. Read below for more info.
FChromium.OnGotFocus := {$IFDEF FPC}@{$ENDIF}BrowserThread_OnGotFocus; FChromium.InternalOnGotFocus := {$IFDEF FPC}@{$ENDIF}BrowserThread_OnGotFocus;
{$ENDIF} {$ENDIF}
end; end;
@ -518,6 +543,11 @@ begin
{$ENDIF} {$ENDIF}
end; end;
function TLazarusBrowserWindow.GetLazChromium: TLazChromium;
begin
Result := FChromiumWrapper.Chromium;
end;
function TLazarusBrowserWindow.GetChromium: TChromium; function TLazarusBrowserWindow.GetChromium: TChromium;
begin begin
Result := FChromiumWrapper.FChromium; Result := FChromiumWrapper.FChromium;
@ -643,6 +673,8 @@ procedure Register;
begin begin
{$I res/tlazarusbrowserwindow.lrs} {$I res/tlazarusbrowserwindow.lrs}
RegisterComponents('Chromium', [TLazarusBrowserWindow]); RegisterComponents('Chromium', [TLazarusBrowserWindow]);
RegisterPropertyEditor(ClassTypeInfo(TLazChromium), nil,'',TClassPropertyEditor);
RegisterPropertyEditor(TypeInfo(TOnClose), TLazChromium, 'OnClose', THiddenPropertyEditor);
end; end;
{$ENDIF} {$ENDIF}