widgetdemo.pp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. unit widgetdemo;
  2. {$mode objfpc}
  3. interface
  4. uses
  5. Classes, SysUtils, web, webwidget;
  6. Type
  7. TDemoRegistration = Class;
  8. { TDemoContainer }
  9. TDemoContainer = class(TWebWidget)
  10. private
  11. FWidgetInstance: TCustomWebWidget;
  12. Protected
  13. // Event that can be used by descendents to attach to OnClick
  14. procedure DoClick(Sender: TObject; Event: TJSEvent); virtual;
  15. // Event that can be used by descendents to attach to OnChange
  16. procedure DoChange(Sender: TObject; Event: TJSEvent); virtual;
  17. // Override this to return something else but the widget itself
  18. function GetInspectorInstance: TObject; virtual;
  19. Public
  20. function HTMLTag: String; override;
  21. function DoRenderHTML(aParent, aElement: TJSHTMLElement): TJSHTMLElement; override;
  22. Class Function Demohelp : String; virtual;
  23. Class Function Description : String; virtual;
  24. Class function WebWidgetClass : TCustomWebWidgetClass; virtual; abstract;
  25. Class Function RegisterDemo : TDemoRegistration;
  26. // The widget instance
  27. Property WidgetInstance : TCustomWebWidget Read FWidgetInstance;
  28. // The object to show in object inspector. By default, this is the widget instance
  29. Property InspectorInstance : TObject Read GetInspectorInstance;
  30. Procedure ShowDemo; virtual;
  31. end;
  32. TDemoContainerClass = Class of TDemoContainer;
  33. { TDemoRegistration }
  34. TDemoRegistration = class(TCollectionItem)
  35. private
  36. FDemoclass: TDemoContainerClass;
  37. Public
  38. Procedure Assign(Source : TPersistent); override;
  39. Property DemoClass : TDemoContainerClass Read FDemoclass;
  40. end;
  41. { TDemoRegistrationList }
  42. TDemoRegistrationList = Class(TCollection)
  43. private
  44. function GetD(aIndex : integer): TDemoRegistration;
  45. Public
  46. Function IndexOf(aClassName: string): Integer;
  47. Function Find(aClassName: string): TDemoRegistration;
  48. Function AddDemo(aClass : TDemoContainerClass) : TDemoRegistration;
  49. Property Demos[aIndex : integer] : TDemoRegistration read GetD; default;
  50. end;
  51. { TDemofactory }
  52. TDemofactory = Class(TComponent)
  53. Private
  54. Class var _Instance : TDemofactory;
  55. Private
  56. FList : TDemoRegistrationList;
  57. function GetC: Integer;
  58. function GetD(aIndex : Integer): TDemoRegistration;
  59. Public
  60. Constructor Create(aOwner : TComponent); override;
  61. Destructor Destroy; override;
  62. Class Function Instance : TDemoFactory;
  63. Function RegisterDemo(aClass : TDemoContainerClass) : TDemoRegistration;
  64. Function FindDemo(aClassName : String) : TDemoRegistration;
  65. Function FindDemoClass(aClassName : String) : TDemoContainerClass;
  66. Property Demos[aIndex : Integer] : TDemoRegistration Read GetD;
  67. Property DemoCount : Integer Read GetC;
  68. end;
  69. Function DemoFactory : TDemofactory;
  70. implementation
  71. uses typinfo;
  72. Function DemoFactory : TDemofactory;
  73. begin
  74. Result:=TDemoFactory.Instance;
  75. end;
  76. { TDemoRegistration }
  77. procedure TDemoRegistration.Assign(Source: TPersistent);
  78. begin
  79. if Source is TDemoRegistration then
  80. Self.FDemoclass:=(Source as TDemoRegistration).DemoClass;
  81. inherited Assign(Source);
  82. end;
  83. { TDemofactory }
  84. function TDemofactory.GetC: Integer;
  85. begin
  86. Result:=FList.Count;
  87. end;
  88. function TDemofactory.GetD(aIndex : Integer): TDemoRegistration;
  89. begin
  90. Result:=Flist[aIndex];
  91. end;
  92. constructor TDemofactory.Create(aOwner: TComponent);
  93. begin
  94. inherited Create(aOwner);
  95. FList:=TDemoRegistrationList.Create(TDemoRegistration);
  96. end;
  97. destructor TDemofactory.Destroy;
  98. begin
  99. FreeAndNil(FList);
  100. inherited Destroy;
  101. end;
  102. class function TDemofactory.Instance: TDemoFactory;
  103. begin
  104. If _instance=Nil then
  105. _Instance:=TDemofactory.Create(Nil);
  106. Result:=_Instance;
  107. end;
  108. function TDemofactory.RegisterDemo(aClass: TDemoContainerClass): TDemoRegistration;
  109. begin
  110. Result:=FList.AddDemo(AClass);
  111. end;
  112. function TDemofactory.FindDemo(aClassName: String): TDemoRegistration;
  113. begin
  114. Result:=FList.Find(aClassName);
  115. end;
  116. function TDemofactory.FindDemoClass(aClassName: String): TDemoContainerClass;
  117. Var
  118. R : TDemoRegistration;
  119. begin
  120. R:=FindDemo(aClassName);
  121. if Assigned(R) then
  122. Result:=R.DemoClass
  123. else
  124. Result:=Nil;
  125. end;
  126. { TDemoRegistrationList }
  127. function TDemoRegistrationList.GetD(aIndex : integer): TDemoRegistration;
  128. begin
  129. Result:=TDemoRegistration(Items[aIndex]);
  130. end;
  131. function TDemoRegistrationList.IndexOf(aClassName: string): Integer;
  132. begin
  133. Result:=Count-1;
  134. while (Result>=0) and Not SameText(aClassName,GetD(Result).DemoClass.ClassName) do
  135. Dec(Result);
  136. end;
  137. function TDemoRegistrationList.Find(aClassName: string): TDemoRegistration;
  138. Var
  139. Idx : integer;
  140. begin
  141. Idx:=IndexOf(aClassName);
  142. if Idx<>-1 then
  143. Result:=GetD(Idx)
  144. else
  145. Result:=Nil;
  146. end;
  147. function TDemoRegistrationList.AddDemo(aClass: TDemoContainerClass): TDemoRegistration;
  148. begin
  149. Result:=Add as TDemoRegistration;
  150. Result.FDemoclass:=aClass;
  151. end;
  152. { TDemoContainer }
  153. function TDemoContainer.GetInspectorInstance: TObject;
  154. begin
  155. Result:=WidgetInstance;
  156. end;
  157. procedure TDemoContainer.DoClick(Sender: TObject; Event: TJSEvent);
  158. begin
  159. Writeln(Sender.ClassName,' : OnClick event');
  160. end;
  161. procedure TDemoContainer.DoChange(Sender: TObject; Event: TJSEvent);
  162. begin
  163. Writeln(Sender.ClassName,' : OnChange event');
  164. if IsPublishedProp(Sender,'Checked') then
  165. Writeln(Sender.ClassName,' checked value :', GetBoolProp(WidgetInstance,'Checked'));
  166. if IsPublishedProp(Sender,'Value') then
  167. Writeln(Sender.ClassName,' Value :', GetJSValueProp(WidgetInstance,'Value'));
  168. end;
  169. function TDemoContainer.HTMLTag: String;
  170. begin
  171. result:='DIV';
  172. end;
  173. function TDemoContainer.DoRenderHTML(aParent, aElement: TJSHTMLElement): TJSHTMLElement;
  174. begin
  175. Result:=inherited DoRenderHTML(aParent, aElement);
  176. end;
  177. class function TDemoContainer.Demohelp: String;
  178. begin
  179. Result:='';
  180. end;
  181. class function TDemoContainer.Description: String;
  182. begin
  183. Result:=WebwidgetClass.ClassName+' demo';
  184. end;
  185. class function TDemoContainer.RegisterDemo: TDemoRegistration;
  186. begin
  187. Result:=TDemoFactory.Instance.RegisterDemo(Self);
  188. end;
  189. procedure TDemoContainer.ShowDemo;
  190. Function MaybeSet(aName : string) : boolean;
  191. begin
  192. Result:=IsPublishedProp(FWidgetInstance,aName) and
  193. (GetPropInfo(FWidgetInstance,aName).TypeInfo.Kind=tkString);
  194. if result then
  195. SetStrProp(FWidgetInstance,aName,'Demo '+FWidgetInstance.Classname);
  196. end;
  197. begin
  198. FreeAndNil(FWidgetInstance);
  199. if Assigned(WebWidgetClass) then
  200. begin
  201. FWidgetInstance:=WebWidgetClass.Create(Self);
  202. FWidgetInstance.Name:=WebWidgetClass.ClassName+'1';
  203. FWidgetInstance.Parent:=Self;
  204. if not MaybeSet('Caption') then
  205. MaybeSet('Text');
  206. FWidgetInstance.Refresh;
  207. end;
  208. end;
  209. end.