|
@@ -63,6 +63,7 @@ type
|
|
|
procedure SetFormWidth(const AValue: TFresnelLength);
|
|
|
procedure SetVisible(const AValue: boolean);
|
|
|
protected
|
|
|
+ procedure ChildDestroying(El: TFresnelElement); override;
|
|
|
procedure DoCreate; virtual;
|
|
|
procedure DoDestroy; virtual;
|
|
|
procedure Loaded; override;
|
|
@@ -230,15 +231,17 @@ type
|
|
|
private
|
|
|
FAsyncCall: TAsyncCallQueues;
|
|
|
FEventDispatcher: TFresnelEventDispatcher;
|
|
|
- procedure DoFresnelLog(aType: TEventType; const Msg: UTF8String);
|
|
|
- function GetHookFresnelLog: Boolean;
|
|
|
- procedure SetHookFresnelLog(AValue: Boolean);
|
|
|
+ FHoverElements: TFresnelElementArray;
|
|
|
+ procedure SetHoverElements(const AValue: TFresnelElementArray);
|
|
|
protected
|
|
|
+ procedure DoFresnelLog(aType: TEventType; const Msg: UTF8String); virtual;
|
|
|
+ function GetHookFresnelLog: Boolean; virtual;
|
|
|
+ procedure SetHookFresnelLog(AValue: Boolean); virtual;
|
|
|
function CreateEventDispatcher(aDefaultSender : TObject) : TFresnelEventDispatcher; virtual;
|
|
|
procedure DoHandleAsyncCalls; virtual;
|
|
|
class procedure RegisterApplicationEvents; virtual;
|
|
|
procedure DoProcessMessages; virtual;
|
|
|
- procedure ShowMainForm;
|
|
|
+ procedure ShowMainForm; virtual;
|
|
|
Property AsyncCalls: TAsyncCallQueues Read FAsyncCall;
|
|
|
public
|
|
|
constructor Create(AOwner: TComponent); override;
|
|
@@ -248,10 +251,13 @@ type
|
|
|
procedure RemoveAsyncCalls(const aObject: TObject);
|
|
|
Procedure CreateForm(aClass : TComponentClass; Out FormVariable); virtual; // use this for designed forms and components
|
|
|
Procedure CreateFormNew(aClass : TComponentClass; Out FormVariable); virtual;
|
|
|
+ procedure ElementDestroying(El: TFresnelElement); virtual;
|
|
|
function AddEventListener(aID : TEventID; const aHandler : TFresnelEventHandler) : Integer;
|
|
|
function AddEventListener(Const aName: TEventName; const aHandler : TFresnelEventHandler): Integer;
|
|
|
+ function IsHoverElement(El: TFresnelElement): boolean; virtual;
|
|
|
property EventDispatcher : TFresnelEventDispatcher Read FEventDispatcher;
|
|
|
Property HookFresnelLog : Boolean Read GetHookFresnelLog Write SetHookFresnelLog;
|
|
|
+ property HoverElements: TFresnelElementArray read FHoverElements write SetHoverElements;
|
|
|
end;
|
|
|
|
|
|
var
|
|
@@ -371,7 +377,7 @@ begin
|
|
|
if AValue.Bottom<AValue.Top then
|
|
|
AValue.Bottom:=AValue.Top;
|
|
|
if FFormBounds=AValue then exit;
|
|
|
- FLLog(etDebug,['TFresnelCustomForm.SetFormBounds ',ToString,' ',AValue.ToString]);
|
|
|
+ //FLLog(etDebug,['TFresnelCustomForm.SetFormBounds ',ToString,' ',AValue.ToString]);
|
|
|
FFormBounds:=AValue;
|
|
|
if Designer<>nil then
|
|
|
Designer.SetDesignerFormBounds(Self,FFormBounds.GetRect)
|
|
@@ -415,6 +421,13 @@ begin
|
|
|
Hide;
|
|
|
end;
|
|
|
|
|
|
+procedure TFresnelCustomForm.ChildDestroying(El: TFresnelElement);
|
|
|
+begin
|
|
|
+ inherited ChildDestroying(El);
|
|
|
+ if Application<>nil then
|
|
|
+ Application.ElementDestroying(El);
|
|
|
+end;
|
|
|
+
|
|
|
procedure TFresnelCustomForm.DoCreate;
|
|
|
begin
|
|
|
if Assigned(OnCreate) then
|
|
@@ -429,7 +442,7 @@ end;
|
|
|
|
|
|
procedure TFresnelCustomForm.Loaded;
|
|
|
begin
|
|
|
- FLLog(etDebug,['TFresnelCustomForm.Loaded ',ToString]);
|
|
|
+ //FLLog(etDebug,['TFresnelCustomForm.Loaded ',ToString]);
|
|
|
inherited Loaded;
|
|
|
if Visible then
|
|
|
Show
|
|
@@ -547,7 +560,7 @@ end;
|
|
|
|
|
|
procedure TFresnelCustomForm.Hide;
|
|
|
begin
|
|
|
- FLLog(etDebug,'TFresnelCustomForm.Hide '+ToString);
|
|
|
+ //FLLog(etDebug,'TFresnelCustomForm.Hide '+ToString);
|
|
|
if (Designer<>nil)
|
|
|
or ([csLoading,csDesigning]*ComponentState<>[])
|
|
|
or not WSFormAllocated then
|
|
@@ -558,7 +571,7 @@ end;
|
|
|
|
|
|
procedure TFresnelCustomForm.Show;
|
|
|
begin
|
|
|
- FLLog(etDebug,'TFresnelCustomForm.Show '+ToString);
|
|
|
+ //FLLog(etDebug,'TFresnelCustomForm.Show '+ToString);
|
|
|
if (Designer<>nil) or ([csLoading,csDesigning,csDestroying]*ComponentState<>[]) then
|
|
|
FVisible:=true
|
|
|
else
|
|
@@ -591,7 +604,7 @@ begin
|
|
|
if csDestroying in ComponentState then exit;
|
|
|
|
|
|
// consistency checks
|
|
|
- FLLog(etDebug,['TFresnelCustomForm.CreateWSForm ',ToString]);
|
|
|
+ //FLLog(etDebug,['TFresnelCustomForm.CreateWSForm ',ToString]);
|
|
|
if Designer<>nil then
|
|
|
raise Exception.Create('TFresnelCustomForm.CreateWSForm Designer<>nil');
|
|
|
if Parent = Self then
|
|
@@ -612,8 +625,8 @@ end;
|
|
|
|
|
|
procedure TFresnelCustomForm.WSDraw;
|
|
|
begin
|
|
|
- FLLog(etDebug,'TFresnelCustomForm.WSDraw (%s)',[ToString]);
|
|
|
- FLLog(etDebug,'TFresnelCustomForm.WSDraw Have renderer: %b',[Assigned(Renderer)]);
|
|
|
+ //FLLog(etDebug,'TFresnelCustomForm.WSDraw (%s)',[ToString]);
|
|
|
+ //FLLog(etDebug,'TFresnelCustomForm.WSDraw Have renderer: %b',[Assigned(Renderer)]);
|
|
|
Renderer.Draw(Self);
|
|
|
end;
|
|
|
|
|
@@ -621,7 +634,7 @@ procedure TFresnelCustomForm.WSResize(const NewFormBounds: TFresnelRect;
|
|
|
NewWidth, NewHeight: TFresnelLength);
|
|
|
begin
|
|
|
if (FFormBounds=NewFormBounds) and (Width=NewWidth) and (Height=NewHeight) then exit;
|
|
|
- FLLog(etDebug,['TFresnelCustomForm.WSResize ',ToString,' OldForm=',FFormBounds.ToString,' NewForm=',NewFormBounds.ToString,' OldWH=',FloatToStr(Width),',',FloatToStr(Height),' NewWH=',FloatToStr(NewWidth),',',FloatToStr(NewHeight)]);
|
|
|
+ //FLLog(etDebug,['TFresnelCustomForm.WSResize ',ToString,' OldForm=',FFormBounds.ToString,' NewForm=',NewFormBounds.ToString,' OldWH=',FloatToStr(Width),',',FloatToStr(Height),' NewWH=',FloatToStr(NewWidth),',',FloatToStr(NewHeight)]);
|
|
|
FFormBounds:=NewFormBounds;
|
|
|
Width:=NewWidth;
|
|
|
Height:=NewHeight;
|
|
@@ -635,18 +648,23 @@ var
|
|
|
MouseEvt: TFresnelMouseEvent;
|
|
|
X, Y: TFresnelLength;
|
|
|
ClickEvt: TFresnelMouseClickEvent;
|
|
|
+ NewHoverElements: TFresnelElementArray;
|
|
|
begin
|
|
|
X:=WSData.PagePos.X;
|
|
|
Y:=WSData.PagePos.Y;
|
|
|
- El:=GetElementAt(X,Y);
|
|
|
- if El=Nil then
|
|
|
+
|
|
|
+ NewHoverElements:=GetElementsAt(X,Y);
|
|
|
+ Application.HoverElements:=NewHoverElements;
|
|
|
+ if length(NewHoverElements)>0 then
|
|
|
begin
|
|
|
+ El:=NewHoverElements[0];
|
|
|
+ WSData.ControlPos:=PageToContentPos(El,X,Y);
|
|
|
+ end else begin
|
|
|
El:=Self;
|
|
|
WSData.ControlPos:=WSData.PagePos;
|
|
|
- end else begin
|
|
|
- WSData.ControlPos:=PageToContentPos(El,X,Y);
|
|
|
end;
|
|
|
- FLLog(etDebug,'TFresnelCustomForm.WSMouseXY El=%s PagePos=%s ControlPos=%s',[El.ToString, WSData.PagePos.ToString, WSData.ControlPos.ToString]);
|
|
|
+
|
|
|
+ //FLLog(etDebug,'TFresnelCustomForm.WSMouseXY El=%s PagePos=%s ControlPos=%s',[El.ToString, WSData.PagePos.ToString, WSData.ControlPos.ToString]);
|
|
|
case MouseEventId of
|
|
|
evtMouseDown:
|
|
|
fMouseDownElement:=El;
|
|
@@ -819,14 +837,49 @@ begin
|
|
|
TFresnelComponent._LogHook:=Nil;
|
|
|
end;
|
|
|
|
|
|
+procedure TFresnelBaseApplication.SetHoverElements(
|
|
|
+ const AValue: TFresnelElementArray);
|
|
|
+var
|
|
|
+ i: SizeInt;
|
|
|
+ OldEls: TFresnelElementArray;
|
|
|
+ El: TFresnelElement;
|
|
|
+begin
|
|
|
+ if FHoverElements=AValue then Exit;
|
|
|
+ if length(FHoverElements)=length(AValue) then
|
|
|
+ begin
|
|
|
+ i:=length(FHoverElements)-1;
|
|
|
+ while (i>=0)and (FHoverElements[i]=AValue[i]) do dec(i);
|
|
|
+ if i<0 then exit;
|
|
|
+ end;
|
|
|
+ OldEls:=FHoverElements;
|
|
|
+ FHoverElements:=AValue;
|
|
|
+ writeln('TFresnelBaseApplication.SetHoverElements START ',Name,':',ClassName);
|
|
|
+ // notify old hover elements
|
|
|
+ for i:=0 to length(OldEls)-1 do
|
|
|
+ begin
|
|
|
+ El:=OldEls[i];
|
|
|
+ writeln('TFresnelBaseApplication.SetHoverElements Old[',i,']=',El.GetPath);
|
|
|
+ if IsHoverElement(El) then continue;
|
|
|
+ El.CSSPseudoClass[fcpcHover]:=false;
|
|
|
+ end;
|
|
|
+ // notify new hover elements
|
|
|
+ for i:=0 to length(FHoverElements)-1 do
|
|
|
+ begin
|
|
|
+ El:=FHoverElements[i];
|
|
|
+ writeln('TFresnelBaseApplication.SetHoverElements New[',i,']=',El.GetPath);
|
|
|
+ El.CSSPseudoClass[fcpcHover]:=true;
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
procedure TFresnelBaseApplication.DoFresnelLog(aType: TEventType; const Msg: UTF8String);
|
|
|
begin
|
|
|
+ writeln('TFresnelBaseApplication.DoFresnelLog ',aType,' ',Msg);
|
|
|
Log(aType,Msg);
|
|
|
end;
|
|
|
|
|
|
function TFresnelBaseApplication.GetHookFresnelLog: Boolean;
|
|
|
begin
|
|
|
- Result:=(TFresnelComponent._LogHook=@DoFresnelLog);
|
|
|
+ Result:=(TFresnelComponent._LogHook=@DoFresnelLog);
|
|
|
end;
|
|
|
|
|
|
function TFresnelBaseApplication.CreateEventDispatcher(aDefaultSender: TObject): TFresnelEventDispatcher;
|
|
@@ -914,6 +967,15 @@ begin
|
|
|
TComponent(FormVariable):=aClass.Create(Self)
|
|
|
end;
|
|
|
|
|
|
+procedure TFresnelBaseApplication.ElementDestroying(El: TFresnelElement);
|
|
|
+var
|
|
|
+ i: SizeInt;
|
|
|
+begin
|
|
|
+ for i:=length(FHoverElements)-1 downto 0 do
|
|
|
+ if FHoverElements[i]=El then
|
|
|
+ System.Delete(FHoverElements,i,1);
|
|
|
+end;
|
|
|
+
|
|
|
function TFresnelBaseApplication.AddEventListener(aID: TEventID;
|
|
|
const aHandler: TFresnelEventHandler): Integer;
|
|
|
begin
|
|
@@ -926,6 +988,16 @@ begin
|
|
|
Result:=FEventDispatcher.RegisterHandler(aHandler,aName).ID;
|
|
|
end;
|
|
|
|
|
|
+function TFresnelBaseApplication.IsHoverElement(El: TFresnelElement): boolean;
|
|
|
+var
|
|
|
+ i: Integer;
|
|
|
+begin
|
|
|
+ for i:=0 to length(FHoverElements)-1 do
|
|
|
+ if fHoverElements[i]=El then
|
|
|
+ exit(true);
|
|
|
+ Result:=false;
|
|
|
+end;
|
|
|
+
|
|
|
|
|
|
initialization
|
|
|
TFresnelBaseApplication.RegisterApplicationEvents;
|