1
0
mirror of https://github.com/salvadordf/CEF4Delphi.git synced 2025-04-17 06:57:13 +02:00
CEF4Delphi/source/uCEFViewComponent.pas
salvadordf ca8bc9dff4 Added cef4delphi.chm help file
Added the PDS file to extract the HTML Help files using PasDoc
Added more XML documentation
Fixed some XML errors.
Removed the license copy from the pas units.
Updated the LICENSE.md file
2023-08-09 19:38:57 +02:00

699 lines
22 KiB
ObjectPascal

unit uCEFViewComponent;
{$IFDEF FPC}
{$MODE OBJFPC}{$H+}
{$ENDIF}
{$I cef.inc}
{$IFNDEF TARGET_64BITS}{$ALIGN ON}{$ENDIF}
{$MINENUMSIZE 4}
interface
uses
{$IFDEF DELPHI16_UP}
{$IFDEF MSWINDOWS}WinApi.Windows,{$ENDIF} System.Classes,
{$ELSE}
{$IFDEF MSWINDOWS}Windows,{$ENDIF} Classes,
{$IFDEF FPC}
LCLProc, LCLType, LCLIntf, LResources, InterfaceBase,
{$ENDIF}
{$ENDIF}
uCEFTypes, uCEFInterfaces, uCEFViewsFrameworkEvents;
type
TCEFViewComponent = class(TComponent, ICefViewDelegateEvents)
protected
// ICefViewDelegateEvents
FOnGetPreferredSize : TOnGetPreferredSizeEvent;
FOnGetMinimumSize : TOnGetMinimumSizeEvent;
FOnGetMaximumSize : TOnGetMaximumSizeEvent;
FOnGetHeightForWidth : TOnGetHeightForWidthEvent;
FOnParentViewChanged : TOnParentViewChangedEvent;
FOnChildViewChanged : TOnChildViewChangedEvent;
FOnWindowChanged : TOnWindowChangedEvent;
FOnLayoutChanged : TOnLayoutChangedEvent;
FOnFocus : TOnFocusEvent;
FOnBlur : TOnBlurEvent;
procedure CreateView; virtual;
procedure DestroyView; virtual;
procedure Initialize; virtual;
function GetInitialized : boolean; virtual;
function GetAsView : ICefView; virtual;
function GetTypeString : ustring;
function GetAsBrowserView : ICefBrowserView; virtual;
function GetAsButton : ICefButton; virtual;
function GetAsPanel : ICefPanel; virtual;
function GetAsScrollView : ICefScrollView; virtual;
function GetAsTextfield : ICefTextfield; virtual;
function GetIsValid : boolean;
function GetIsAttached : boolean;
function GetDelegate : ICefViewDelegate;
function GetWindow : ICefWindow;
function GetID : Integer;
function GetGroupID : Integer;
function GetParentView : ICefView;
function GetBounds : TCefRect;
function GetBoundsInScreen : TCefRect;
function GetSize : TCefSize;
function GetPosition : TCefPoint;
function GetPreferredSize : TCefSize;
function GetMinimumSize : TCefSize;
function GetMaximumSize : TCefSize;
function GetIsVisible : boolean;
function GetIsDrawn : boolean;
function GetIsEnabled : boolean;
function GetIsFocusable : boolean;
function GetIsAccessibilityFocusable : boolean;
function GetBackgroundColor : TCefColor;
function GetViewForID(id_: Integer): ICefView;
function GetHeightForWidth(width: Integer): Integer;
procedure SetID(id_: Integer);
procedure SetGroupID(group_id: Integer);
procedure SetBounds(const bounds_: TCefRect);
procedure SetSize(const size_: TCefSize);
procedure SetPosition(const position_: TCefPoint);
procedure SetVisible(visible_: boolean);
procedure SetEnabled(enabled_: boolean);
procedure SetFocusable(focusable_: boolean);
procedure SetBackgroundColor(color: TCefColor);
// ICefViewDelegateEvents
procedure doOnGetPreferredSize(const view: ICefView; var aResult : TCefSize); virtual;
procedure doOnGetMinimumSize(const view: ICefView; var aResult : TCefSize); virtual;
procedure doOnGetMaximumSize(const view: ICefView; var aResult : TCefSize); virtual;
procedure doOnGetHeightForWidth(const view: ICefView; width: Integer; var aResult: Integer); virtual;
procedure doOnParentViewChanged(const view: ICefView; added: boolean; const parent: ICefView); virtual;
procedure doOnChildViewChanged(const view: ICefView; added: boolean; const child: ICefView); virtual;
procedure doOnWindowChanged(const view: ICefView; added: boolean); virtual;
procedure doOnLayoutChanged(const view: ICefView; new_bounds: TCefRect); virtual;
procedure doOnFocus(const view: ICefView); virtual;
procedure doOnBlur(const view: ICefView); virtual;
procedure doCreateCustomView; virtual;
public
constructor Create(AOwner: TComponent); override;
procedure BeforeDestruction; override;
function ToStringEx(include_children: boolean): ustring;
function IsSame(const that: ICefView): boolean;
procedure SizeToPreferredSize;
procedure InvalidateLayout;
procedure RequestFocus;
function ConvertPointToScreen(var point: TCefPoint): boolean;
function ConvertPointFromScreen(var point: TCefPoint): boolean;
function ConvertPointToWindow(var point: TCefPoint): boolean;
function ConvertPointFromWindow(var point: TCefPoint): boolean;
function ConvertPointToView(const view : ICefView; var point: TCefPoint): boolean;
function ConvertPointFromView(const view : ICefView; var point: TCefPoint): boolean;
property Initialized : boolean read GetInitialized;
property AsView : ICefView read GetAsView;
property AsBrowserView : ICefBrowserView read GetAsBrowserView;
property AsButton : ICefButton read GetAsButton;
property AsPanel : ICefPanel read GetAsPanel;
property AsScrollView : ICefScrollView read GetAsScrollView;
property AsTextfield : ICefTextfield read GetAsTextfield;
property ViewForID[id_: Integer] : ICefView read GetViewForID;
property Valid : boolean read GetIsValid;
property Attached : boolean read GetIsAttached;
property Delegate : ICefViewDelegate read GetDelegate;
property Window : ICefWindow read GetWindow;
property ParentView : ICefView read GetParentView;
property BoundsInScreen : TCefRect read GetBoundsInScreen;
property PreferredSize : TCefSize read GetPreferredSize;
property MinimumSize : TCefSize read GetMinimumSize;
property MaximumSize : TCefSize read GetMaximumSize;
property Visible : boolean read GetIsVisible write SetVisible;
property Drawn : boolean read GetIsDrawn;
property Enabled : boolean read GetIsEnabled write SetEnabled;
property Focusable : boolean read GetIsFocusable write SetFocusable;
property AccessibilityFocusable : boolean read GetIsAccessibilityFocusable;
property BackgroundColor : TCefColor read GetBackgroundColor write SetBackgroundColor;
property ID : integer read GetID write SetID;
property GroupID : integer read GetGroupID write SetGroupID;
property Bounds : TCefRect read GetBounds write SetBounds;
property Size : TCefSize read GetSize write SetSize;
property Position : TCefPoint read GetPosition write SetPosition;
property TypeString : ustring read GetTypeString;
property HeightForWidth[width: Integer] : Integer read GetHeightForWidth;
published
property OnGetPreferredSize : TOnGetPreferredSizeEvent read FOnGetPreferredSize write FOnGetPreferredSize;
property OnGetMinimumSize : TOnGetMinimumSizeEvent read FOnGetMinimumSize write FOnGetMinimumSize;
property OnGetMaximumSize : TOnGetMaximumSizeEvent read FOnGetMaximumSize write FOnGetMaximumSize;
property OnGetHeightForWidth : TOnGetHeightForWidthEvent read FOnGetHeightForWidth write FOnGetHeightForWidth;
property OnParentViewChanged : TOnParentViewChangedEvent read FOnParentViewChanged write FOnParentViewChanged;
property OnChildViewChanged : TOnChildViewChangedEvent read FOnChildViewChanged write FOnChildViewChanged;
property OnWindowChanged : TOnWindowChangedEvent read FOnWindowChanged write FOnWindowChanged;
property OnLayoutChanged : TOnLayoutChangedEvent read FOnLayoutChanged write FOnLayoutChanged;
property OnFocus : TOnFocusEvent read FOnFocus write FOnFocus;
property OnBlur : TOnBlurEvent read FOnBlur write FOnBlur;
end;
// *********************************************************
// ********************** ATTENTION ! **********************
// *********************************************************
// ** **
// ** MANY OF THE EVENTS IN CEF4DELPHI COMPONENTS LIKE **
// ** TCHROMIUM, TFMXCHROMIUM OR TCEFAPPLICATION ARE **
// ** EXECUTED IN A CEF THREAD BY DEFAULT. **
// ** **
// ** WINDOWS CONTROLS MUST BE CREATED AND DESTROYED IN **
// ** THE SAME THREAD TO AVOID ERRORS. **
// ** SOME OF THEM RECREATE THE HANDLERS IF THEY ARE **
// ** MODIFIED AND CAN CAUSE THE SAME ERRORS. **
// ** **
// ** DON'T CREATE, MODIFY OR DESTROY WINDOWS CONTROLS **
// ** INSIDE THE CEF4DELPHI EVENTS AND USE **
// ** SYNCHRONIZATION OBJECTS TO PROTECT VARIABLES AND **
// ** FIELDS IF THEY ARE ALSO USED IN THE MAIN THREAD. **
// ** **
// ** READ THIS FOR MORE INFORMATION : **
// ** https://www.briskbard.com/index.php?pageid=cef **
// ** **
// ** USE OUR FORUMS FOR MORE QUESTIONS : **
// ** https://www.briskbard.com/forum/ **
// ** **
// *********************************************************
// *********************************************************
implementation
uses
uCEFViewDelegate, uCEFMiscFunctions, uCEFTask;
constructor TCEFViewComponent.Create(AOwner: TComponent);
begin
inherited Create(aOwner);
Initialize;
end;
procedure TCEFViewComponent.BeforeDestruction;
begin
DestroyView;
inherited BeforeDestruction;
end;
procedure TCEFViewComponent.Initialize;
begin
FOnGetPreferredSize := nil;
FOnGetMinimumSize := nil;
FOnGetMaximumSize := nil;
FOnGetHeightForWidth := nil;
FOnParentViewChanged := nil;
FOnChildViewChanged := nil;
FOnWindowChanged := nil;
FOnLayoutChanged := nil;
FOnFocus := nil;
FOnBlur := nil;
end;
procedure TCEFViewComponent.CreateView;
var
TempTask : ICefTask;
begin
if CefCurrentlyOn(TID_UI) then
doCreateCustomView
else
try
TempTask := TCefCreateCustomViewTask.Create(self);
CefPostTask(TID_UI, TempTask);
finally
TempTask := nil;
end;
end;
procedure TCEFViewComponent.DestroyView;
begin
//
end;
function TCEFViewComponent.GetInitialized : boolean;
begin
Result := False;
end;
function TCEFViewComponent.GetAsView : ICefView;
begin
Result := nil;
end;
function TCEFViewComponent.GetAsBrowserView : ICefBrowserView;
begin
if Initialized then
Result := AsView.AsBrowserView
else
Result := nil;
end;
function TCEFViewComponent.GetAsButton : ICefButton;
begin
if Initialized then
Result := AsView.AsButton
else
Result := nil;
end;
function TCEFViewComponent.GetAsPanel : ICefPanel;
begin
if Initialized then
Result := AsView.AsPanel
else
Result := nil;
end;
function TCEFViewComponent.GetAsScrollView : ICefScrollView;
begin
if Initialized then
Result := AsView.AsScrollView
else
Result := nil;
end;
function TCEFViewComponent.GetAsTextfield : ICefTextfield;
begin
if Initialized then
Result := AsView.AsTextfield
else
Result := nil;
end;
function TCEFViewComponent.GetTypeString : ustring;
begin
if Initialized then
Result := AsView.GetTypeString
else
Result := '';
end;
function TCEFViewComponent.ToStringEx(include_children: boolean): ustring;
begin
if Initialized then
Result := AsView.ToStringEx(include_children)
else
Result := '';
end;
function TCEFViewComponent.GetIsValid : boolean;
begin
Result := Initialized and AsView.IsValid;
end;
function TCEFViewComponent.GetIsAttached : boolean;
begin
Result := Initialized and AsView.IsAttached;
end;
function TCEFViewComponent.IsSame(const that: ICefView): boolean;
begin
if Initialized then
Result := AsView.IsSame(that)
else
Result := False;
end;
function TCEFViewComponent.GetDelegate : ICefViewDelegate;
begin
if Initialized then
Result := AsView.GetDelegate
else
Result := nil;
end;
function TCEFViewComponent.GetWindow : ICefWindow;
begin
if Initialized then
Result := AsView.GetWindow
else
Result := nil;
end;
function TCEFViewComponent.GetID : Integer;
begin
if Initialized then
Result := AsView.GetID
else
Result := 0;
end;
procedure TCEFViewComponent.SetID(id_: Integer);
begin
if Initialized then
AsView.SetID(id_);
end;
function TCEFViewComponent.GetGroupID : Integer;
begin
if Initialized then
Result := AsView.GetGroupID
else
Result := -1;
end;
procedure TCEFViewComponent.SetGroupID(group_id: Integer);
begin
if Initialized then
AsView.SetGroupID(group_id);
end;
function TCEFViewComponent.GetParentView : ICefView;
begin
if Initialized then
Result := AsView.GetParentView
else
Result := nil;
end;
function TCEFViewComponent.GetViewForID(id_: Integer): ICefView;
begin
if Initialized then
Result := AsView.GetViewForID(id_)
else
Result := nil;
end;
procedure TCEFViewComponent.SetBounds(const bounds_: TCefRect);
begin
if Initialized then
AsView.SetBounds(bounds_);
end;
function TCEFViewComponent.GetBounds : TCefRect;
var
TempRect : TCefRect;
begin
if Initialized then
TempRect := AsView.GetBounds
else
begin
TempRect.x := 0;
TempRect.y := 0;
TempRect.width := 0;
TempRect.height := 0;
end;
Result := TempRect;
end;
function TCEFViewComponent.GetBoundsInScreen : TCefRect;
var
TempRect : TCefRect;
begin
if Initialized then
TempRect := AsView.GetBoundsInScreen
else
begin
TempRect.x := 0;
TempRect.y := 0;
TempRect.width := 0;
TempRect.height := 0;
end;
Result := TempRect;
end;
procedure TCEFViewComponent.SetSize(const size_: TCefSize);
begin
if Initialized then
AsView.SetSize(size_);
end;
function TCEFViewComponent.GetSize : TCefSize;
var
TempSize : TCefSize;
begin
if Initialized then
TempSize := AsView.GetSize
else
begin
TempSize.width := 0;
TempSize.height := 0;
end;
Result := TempSize;
end;
procedure TCEFViewComponent.SetPosition(const position_: TCefPoint);
begin
if Initialized then
AsView.SetPosition(position_);
end;
function TCEFViewComponent.GetPosition : TCefPoint;
var
TempPoint : TCefPoint;
begin
if Initialized then
TempPoint := AsView.GetPosition
else
begin
TempPoint.x := 0;
TempPoint.y := 0;
end;
Result := TempPoint;
end;
function TCEFViewComponent.GetPreferredSize : TCefSize;
var
TempSize : TCefSize;
begin
if Initialized then
TempSize := AsView.GetPreferredSize
else
begin
TempSize.width := 0;
TempSize.height := 0;
end;
Result := TempSize;
end;
procedure TCEFViewComponent.SizeToPreferredSize;
begin
if Initialized then
AsView.SizeToPreferredSize;
end;
function TCEFViewComponent.GetMinimumSize : TCefSize;
var
TempSize : TCefSize;
begin
if Initialized then
TempSize := AsView.GetMinimumSize
else
begin
TempSize.width := 0;
TempSize.height := 0;
end;
Result := TempSize;
end;
function TCEFViewComponent.GetMaximumSize : TCefSize;
var
TempSize : TCefSize;
begin
if Initialized then
TempSize := AsView.GetMaximumSize
else
begin
TempSize.width := 0;
TempSize.height := 0;
end;
Result := TempSize;
end;
function TCEFViewComponent.GetHeightForWidth(width: Integer): Integer;
begin
if Initialized then
Result := AsView.GetHeightForWidth(width)
else
Result := 0;
end;
procedure TCEFViewComponent.InvalidateLayout;
begin
if Initialized then
AsView.InvalidateLayout;
end;
procedure TCEFViewComponent.SetVisible(visible_: boolean);
begin
if Initialized then
AsView.SetVisible(visible_);
end;
function TCEFViewComponent.GetIsVisible : boolean;
begin
Result := Initialized and AsView.IsVisible;
end;
function TCEFViewComponent.GetIsDrawn : boolean;
begin
Result := Initialized and AsView.IsDrawn;
end;
procedure TCEFViewComponent.SetEnabled(enabled_: boolean);
begin
if Initialized then
AsView.SetEnabled(enabled_);
end;
function TCEFViewComponent.GetIsEnabled : boolean;
begin
Result := Initialized and AsView.IsEnabled;
end;
procedure TCEFViewComponent.SetFocusable(focusable_: boolean);
begin
if Initialized then
AsView.SetFocusable(focusable_);
end;
function TCEFViewComponent.GetIsFocusable : boolean;
begin
Result := Initialized and AsView.IsFocusable;
end;
function TCEFViewComponent.GetIsAccessibilityFocusable : boolean;
begin
Result := Initialized and AsView.IsAccessibilityFocusable;
end;
procedure TCEFViewComponent.RequestFocus;
begin
if Initialized then
AsView.RequestFocus;
end;
procedure TCEFViewComponent.SetBackgroundColor(color: TCefColor);
begin
if Initialized then
AsView.SetBackgroundColor(color);
end;
function TCEFViewComponent.GetBackgroundColor : TCefColor;
begin
if Initialized then
Result := AsView.GetBackgroundColor
else
Result := 0;
end;
function TCEFViewComponent.ConvertPointToScreen(var point: TCefPoint): boolean;
begin
Result := Initialized and AsView.ConvertPointToScreen(point);
end;
function TCEFViewComponent.ConvertPointFromScreen(var point: TCefPoint): boolean;
begin
Result := Initialized and AsView.ConvertPointFromScreen(point);
end;
function TCEFViewComponent.ConvertPointToWindow(var point: TCefPoint): boolean;
begin
Result := Initialized and AsView.ConvertPointToWindow(point);
end;
function TCEFViewComponent.ConvertPointFromWindow(var point: TCefPoint): boolean;
begin
Result := Initialized and AsView.ConvertPointFromWindow(point);
end;
function TCEFViewComponent.ConvertPointToView(const view : ICefView; var point: TCefPoint): boolean;
begin
Result := Initialized and AsView.ConvertPointToView(view, point);
end;
function TCEFViewComponent.ConvertPointFromView(const view : ICefView; var point: TCefPoint): boolean;
begin
Result := Initialized and AsView.ConvertPointFromView(view, point);
end;
procedure TCEFViewComponent.doOnGetPreferredSize(const view : ICefView;
var aResult : TCefSize);
begin
if assigned(FOnGetPreferredSize) then
FOnGetPreferredSize(self, view, aResult);
end;
procedure TCEFViewComponent.doOnGetMinimumSize(const view : ICefView;
var aResult : TCefSize);
begin
if assigned(FOnGetMinimumSize) then
FOnGetMinimumSize(self, view, aResult);
end;
procedure TCEFViewComponent.doOnGetMaximumSize(const view : ICefView;
var aResult : TCefSize);
begin
if assigned(FOnGetMaximumSize) then
FOnGetMaximumSize(self, view, aResult);
end;
procedure TCEFViewComponent.doOnGetHeightForWidth(const view : ICefView;
width : Integer;
var aResult : Integer);
begin
if assigned(FOnGetHeightForWidth) then
FOnGetHeightForWidth(self, view, width, aResult);
end;
procedure TCEFViewComponent.doOnParentViewChanged(const view : ICefView;
added : boolean;
const parent : ICefView);
begin
if assigned(FOnParentViewChanged) then
FOnParentViewChanged(self, view, added, Parent);
end;
procedure TCEFViewComponent.doOnChildViewChanged(const view : ICefView;
added : boolean;
const child : ICefView);
begin
if assigned(FOnChildViewChanged) then
FOnChildViewChanged(self, view, added, child);
end;
procedure TCEFViewComponent.doOnWindowChanged(const view : ICefView;
added : boolean);
begin
if assigned(FOnWindowChanged) then
FOnWindowChanged(self, view, added);
end;
procedure TCEFViewComponent.doOnLayoutChanged(const view: ICefView; new_bounds: TCefRect);
begin
if assigned(FOnLayoutChanged) then
FOnLayoutChanged(self, view, new_bounds);
end;
procedure TCEFViewComponent.doOnFocus(const view: ICefView);
begin
if assigned(FOnFocus) then
FOnFocus(self, view);
end;
procedure TCEFViewComponent.doOnBlur(const view: ICefView);
begin
if assigned(FOnBlur) then
FOnBlur(self, view);
end;
procedure TCEFViewComponent.doCreateCustomView;
begin
//
end;
end.