Browse Source

* Safer UnRender, split templatewidget

michael 6 years ago
parent
commit
2e22184840
1 changed files with 75 additions and 27 deletions
  1. 75 27
      packages/webwidget/webwidget.pas

+ 75 - 27
packages/webwidget/webwidget.pas

@@ -650,22 +650,45 @@ Type
   TCustomTemplateWidget = Class(TWebWidget)
   TCustomTemplateWidget = Class(TWebWidget)
   private
   private
     FContainerTag: String;
     FContainerTag: String;
-    FTemplate: TStrings;
-    procedure DoTemplateChanged(Sender: TObject);
     procedure SetContainerTag(AValue: String);
     procedure SetContainerTag(AValue: String);
-    procedure SetTemplate(AValue: TStrings);
   Protected
   Protected
-    function GetTemplateHTML: String; virtual;
+    function GetTemplateHTML: String; virtual; abstract;
     Procedure ApplyTemplate(aElement : TJSHTMLElement); virtual;
     Procedure ApplyTemplate(aElement : TJSHTMLElement); virtual;
     Function DoRenderHTML(aParent, aElement: TJSHTMLElement) : TJSHTMLElement; override;
     Function DoRenderHTML(aParent, aElement: TJSHTMLElement) : TJSHTMLElement; override;
-    // The template.
-    Property Template : TStrings Read FTemplate Write SetTemplate;
     // When set, a tag will be created and the template will be rendered below this tag.
     // When set, a tag will be created and the template will be rendered below this tag.
     Property ContainerTag : String Read FContainerTag Write SetContainerTag;
     Property ContainerTag : String Read FContainerTag Write SetContainerTag;
   Public
   Public
     Function HTMLTag : String; override;
     Function HTMLTag : String; override;
+  end;
+
+  { TSimpleTemplateWidget }
+
+  TSimpleTemplateWidget = Class(TCustomTemplateWidget)
+  Private
+    FTemplate: String;
+    procedure SetTemplate(AValue: String);
+  Protected
+    function GetTemplateHTML: String; override;
+  Published
+    // The template.
+    Property Template : String Read FTemplate Write SetTemplate;
+    Property References;
+  end;
+
+
+  TTemplateWidget = Class(TCustomTemplateWidget)
+  Private
+    FTemplate: TStrings;
+    procedure DoTemplateChanged(Sender: TObject);
+    procedure SetTemplate(AValue: TStrings);
+  Protected
+    function GetTemplateHTML: String; override;
+  Public
     Constructor Create(aOwner : TComponent); override;
     Constructor Create(aOwner : TComponent); override;
     Destructor Destroy; override;
     Destructor Destroy; override;
+    // The template.
+    Property Template : TStrings Read FTemplate Write SetTemplate;
+    Property References;
   end;
   end;
 
 
 implementation
 implementation
@@ -684,6 +707,21 @@ ResourceString
    SErrNotRendered = 'Cannot perform this operation: Widget not rendered';
    SErrNotRendered = 'Cannot perform this operation: Widget not rendered';
    SErrCannotRefreshNoWidget = 'Cannot refresh references without widget';
    SErrCannotRefreshNoWidget = 'Cannot refresh references without widget';
 
 
+{ TSimpleTemplateWidget }
+
+procedure TSimpleTemplateWidget.SetTemplate(AValue: String);
+begin
+  FTemplate:=AValue;
+  if isRendered then
+    Refresh;
+end;
+
+function TSimpleTemplateWidget.GetTemplateHTML: String;
+begin
+  Result:=FTemplate;
+end;
+
+
 { TWebWidgetReferences }
 { TWebWidgetReferences }
 
 
 function TWebWidgetReferences.GetReferenceItem(aIndex : Integer): TReferenceItem;
 function TWebWidgetReferences.GetReferenceItem(aIndex : Integer): TReferenceItem;
@@ -869,17 +907,6 @@ end;
 
 
 { TCustomTemplateWidget }
 { TCustomTemplateWidget }
 
 
-procedure TCustomTemplateWidget.SetTemplate(AValue: TStrings);
-begin
-  if FTemplate=AValue then Exit;
-  FTemplate.Assign(AValue);
-end;
-
-function TCustomTemplateWidget.GetTemplateHTML: String;
-begin
-  Result:=FTemplate.Text;
-end;
-
 procedure TCustomTemplateWidget.ApplyTemplate(aElement: TJSHTMLElement);
 procedure TCustomTemplateWidget.ApplyTemplate(aElement: TJSHTMLElement);
 begin
 begin
   aElement.InnerHTML:=GetTemplateHTML;
   aElement.InnerHTML:=GetTemplateHTML;
@@ -899,26 +926,40 @@ begin
     end;
     end;
 end;
 end;
 
 
+procedure TCustomTemplateWidget.SetContainerTag(AValue: String);
+begin
+  if FContainerTag=AValue then Exit;
+  FContainerTag:=AValue;
+  if IsRendered then
+    Refresh;
+end;
+
 function TCustomTemplateWidget.HTMLTag: String;
 function TCustomTemplateWidget.HTMLTag: String;
 begin
 begin
   Result:=ContainerTag;
   Result:=ContainerTag;
 end;
 end;
 
 
-procedure TCustomTemplateWidget.DoTemplateChanged(Sender: TObject);
+{ TTemplateWidget }
+
+procedure TTemplateWidget.SetTemplate(AValue: TStrings);
 begin
 begin
-  if isRendered then
-    Refresh;
+  if FTemplate=AValue then Exit;
+  FTemplate.Assign(AValue);
 end;
 end;
 
 
-procedure TCustomTemplateWidget.SetContainerTag(AValue: String);
+function TTemplateWidget.GetTemplateHTML: String;
 begin
 begin
-  if FContainerTag=AValue then Exit;
-  FContainerTag:=AValue;
-  if IsRendered then
+  Result:=FTemplate.Text;
+end;
+
+
+procedure TTemplateWidget.DoTemplateChanged(Sender: TObject);
+begin
+  if isRendered then
     Refresh;
     Refresh;
 end;
 end;
 
 
-constructor TCustomTemplateWidget.Create(aOwner: TComponent);
+constructor TTemplateWidget.Create(aOwner: TComponent);
 
 
 begin
 begin
   inherited Create(aOwner);
   inherited Create(aOwner);
@@ -927,7 +968,7 @@ begin
   FContainerTag:='';
   FContainerTag:='';
 end;
 end;
 
 
-destructor TCustomTemplateWidget.Destroy;
+destructor TTemplateWidget.Destroy;
 
 
 begin
 begin
   FreeAndNil(FTemplate);
   FreeAndNil(FTemplate);
@@ -1873,11 +1914,18 @@ end;
 
 
 procedure TCustomWebWidget.DoUnRender(aParent: TJSHTMLElement);
 procedure TCustomWebWidget.DoUnRender(aParent: TJSHTMLElement);
 
 
+Var
+  el : TJSHTMLElement;
+
 begin
 begin
   if Assigned(aParent) and Assigned(FElement) then
   if Assigned(aParent) and Assigned(FElement) then
     begin
     begin
     if FOwnsElement then
     if FOwnsElement then
-      aParent.removeChild(TopElement);
+      begin
+      el:=TopElement;
+      if (El.ParentElement=aParent) then
+        aParent.removeChild(el);
+      end;
     InvalidateElement;
     InvalidateElement;
     end;
     end;
 end;
 end;