FMxXCollectionEditor.pas 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. //
  2. // The graphics engine GLXEngine. The unit of GXScene for Delphi
  3. //
  4. unit FMxXCollectionEditor;
  5. (* Edits a TXCollection *)
  6. interface
  7. uses
  8. System.SysUtils,
  9. System.Types,
  10. System.UITypes,
  11. System.Classes,
  12. System.Rtti,
  13. System.Variants,
  14. System.Actions,
  15. System.TypInfo,
  16. FMX.Types,
  17. FMX.Controls,
  18. FMX.Forms,
  19. FMX.Graphics,
  20. FMX.Dialogs,
  21. FMX.StdCtrls,
  22. FMX.ListView.Types,
  23. FMX.ActnList,
  24. FMX.Menus,
  25. FMX.ListView.Appearances,
  26. FMX.ListView.Adapters.Base,
  27. FMX.Controls.Presentation,
  28. FMX.ListView,
  29. GXS.Scene,
  30. Stage.Strings,
  31. GXS.Behaviours,
  32. GXS.XCollection;
  33. type
  34. IDesigner = interface //in designintf -> (IDesigner200)
  35. ['{93F3FCBC-968E-45A9-9641-609E8FB3AC60}']
  36. function CreateChild(ComponentClass: TComponentClass; Parent: TComponent): TComponent;
  37. end;
  38. TInstProp = record
  39. Instance: TPersistent;
  40. PropInfo: PPropInfo;
  41. end;
  42. PInstPropList = ^TInstPropList;
  43. TInstPropList = array[0..1023] of TInstProp;
  44. type
  45. TXCollectionEditorForm = class(TForm)
  46. ToolBar1: TToolBar;
  47. TBAdd: TButton;
  48. ListView: TListView;
  49. PMListView: TPopupMenu;
  50. PMToolBar: TPopupMenu;
  51. ActionList: TActionList;
  52. ACRemove: TAction;
  53. ACMoveUp: TAction;
  54. ACMoveDown: TAction;
  55. Button1: TButton;
  56. Button2: TButton;
  57. Button3: TButton;
  58. procedure ACRemoveExecute(Sender: TObject);
  59. procedure ACMoveUpExecute(Sender: TObject);
  60. procedure ACMoveDownExecute(Sender: TObject);
  61. procedure FormCreate(Sender: TObject);
  62. procedure FormDestroy(Sender: TObject);
  63. procedure FormHide(Sender: TObject);
  64. procedure ListViewChange(Sender: TObject);
  65. private
  66. FXCollection: TXCollection;
  67. // ownerComponent : TComponent;
  68. FDesigner: IDesigner;
  69. UpdatingListView: Boolean;
  70. procedure PrepareListView;
  71. procedure PrepareXCollectionItemPopup(parent: TMenuItem);
  72. procedure OnAddXCollectionItemClick(Sender: TObject);
  73. procedure OnNameChanged(Sender: TObject);
  74. procedure OnXCollectionDestroyed(Sender: TObject);
  75. public
  76. procedure SetXCollection(aXCollection: TXCollection; designer: IDesigner);
  77. end;
  78. function XCollectionEditorForm: TXCollectionEditorForm;
  79. procedure ReleaseXCollectionEditor;
  80. //=======================================================================
  81. implementation
  82. //=======================================================================
  83. {$R *.fmx}
  84. var
  85. vXCollectionEditor: TXCollectionEditorForm;
  86. function XCollectionEditorForm: TXCollectionEditorForm;
  87. begin
  88. if not Assigned(vXCollectionEditor) then
  89. vXCollectionEditor := TXCollectionEditorForm.Create(nil);
  90. Result := vXCollectionEditor;
  91. end;
  92. procedure ReleaseXCollectionEditor;
  93. begin
  94. if Assigned(vXCollectionEditor) then
  95. begin
  96. vXCollectionEditor.Release;
  97. vXCollectionEditor := nil;
  98. end;
  99. end;
  100. //--------------------------------------------
  101. // TXCollectionEditorForm
  102. //--------------------------------------------
  103. procedure TXCollectionEditorForm.FormCreate(Sender: TObject);
  104. begin
  105. RegisterBehaviourNameChangeEvent(OnNameChanged);
  106. RegisterXCollectionDestroyEvent(OnXCollectionDestroyed);
  107. end;
  108. procedure TXCollectionEditorForm.FormDestroy(Sender: TObject);
  109. begin
  110. DeRegisterBehaviourNameChangeEvent(OnNameChanged);
  111. DeRegisterXCollectionDestroyEvent(OnXCollectionDestroyed);
  112. end;
  113. procedure TXCollectionEditorForm.FormHide(Sender: TObject);
  114. begin
  115. SetXCollection(nil, nil);
  116. ReleaseXCollectionEditor;
  117. end;
  118. procedure TXCollectionEditorForm.SetXCollection(aXCollection: TXCollection; designer: IDesigner);
  119. begin
  120. // if Assigned(ownerComponent) then
  121. // ownerComponent.RemoveFreeNotification(Self);
  122. FXCollection := aXCollection;
  123. FDesigner := designer;
  124. if Assigned(FXCollection) then
  125. begin
  126. // if Assigned(FXCollection.Owner) and (FXCollection.Owner is TComponent) then
  127. // ownerComponent:=TComponent(FXCollection.Owner);
  128. // if Assigned(ownerComponent) then
  129. // ownerComponent.FreeNotification(Self);
  130. Caption := FXCollection.GetNamePath;
  131. end
  132. else
  133. begin
  134. // ownerComponent:=nil;
  135. Caption := strXCollectionEditor;
  136. end;
  137. PrepareListView;
  138. end;
  139. procedure TXCollectionEditorForm.ListViewChange(Sender: TObject);
  140. var
  141. sel: Boolean;
  142. begin
  143. if (*(Change = ctState) and *)Assigned(FDesigner) and (not updatingListView) then
  144. begin
  145. // setup enablings
  146. sel := (ListView.Selected <> nil);
  147. TBAdd.Enabled := Assigned(FDesigner);
  148. ACRemove.Enabled := sel;
  149. ACMoveUp.Enabled := sel and (ListView.Selected.Index > 0);
  150. ACMoveDown.Enabled := sel and
  151. (ListView.Selected.Index < ListView.Items.Count - 1);
  152. if Assigned(FDesigner) then
  153. { TODO : E2003 Undeclared identifier: 'SelectComponent' }
  154. (*
  155. if sel then
  156. FDesigner.SelectComponent(TXCollectionItem(ListView.Selected.Data))
  157. else
  158. FDesigner.SelectComponent(nil);
  159. *)
  160. end;
  161. end;
  162. procedure TXCollectionEditorForm.ACMoveDownExecute(Sender: TObject);
  163. begin
  164. if ListView.Selected <> nil then
  165. begin
  166. /// to do
  167. end;
  168. end;
  169. procedure TXCollectionEditorForm.ACMoveUpExecute(Sender: TObject);
  170. begin
  171. if ListView.Selected <> nil then
  172. begin
  173. /// to do
  174. end;
  175. end;
  176. procedure TXCollectionEditorForm.ACRemoveExecute(Sender: TObject);
  177. begin
  178. if ListView.Selected <> nil then
  179. begin
  180. /// to do
  181. end;
  182. end;
  183. procedure TXCollectionEditorForm.OnAddXCollectionItemClick(Sender: TObject);
  184. begin
  185. /// to do
  186. end;
  187. procedure TXCollectionEditorForm.OnNameChanged(Sender: TObject);
  188. begin
  189. /// to do
  190. end;
  191. procedure TXCollectionEditorForm.OnXCollectionDestroyed(Sender: TObject);
  192. begin
  193. if TXCollection(Sender) = FXCollection then
  194. Close;
  195. end;
  196. procedure TXCollectionEditorForm.PrepareListView;
  197. var
  198. i: Integer;
  199. prevSelData: TValue; // prev Pointer;
  200. XCollectionItem: TXCollectionItem;
  201. DisplayedName: String;
  202. begin
  203. Assert(Assigned(ListView));
  204. updatingListView := True;
  205. try
  206. if ListView.Selected <> nil then
  207. ///in VCL prevSelData := ListView.Selected.Data[DisplayedName]
  208. prevSelData := ListView.Selected.FieldAddress(DisplayedName)
  209. else
  210. prevSelData := nil;
  211. with ListView.Items do
  212. begin
  213. BeginUpdate;
  214. Clear;
  215. if Assigned(FXCollection) then
  216. begin
  217. for i := 0 to FXCollection.Count - 1 do
  218. with Add do
  219. begin
  220. XCollectionItem := FXCollection[i];
  221. DisplayedName := XCollectionItem.Name;
  222. if DisplayedName = '' then
  223. DisplayedName := '(unnamed)';
  224. Caption := Format('%d - %s', [i, DisplayedName]);
  225. { TODO : E2003 Undeclared identifier: 'SubItems' }
  226. (*SubItems.Add(XCollectionItem.FriendlyName);*)
  227. Data[DisplayedName] := XCollectionItem;
  228. end;
  229. { TODO : E2015 Operator not applicable to this operand type }
  230. (*
  231. if prevSelData <> nil then
  232. ListView.Selected := ListView.FindData(0, prevSelData, True, False);
  233. *)
  234. end;
  235. EndUpdate;
  236. end;
  237. finally
  238. updatingListView := False;
  239. end;
  240. ListViewChange(Self);
  241. end;
  242. procedure TXCollectionEditorForm.PrepareXCollectionItemPopup(parent: TMenuItem);
  243. var
  244. i: Integer;
  245. list: TList;
  246. XCollectionItemClass: TXCollectionItemClass;
  247. mi, categoryItem: TMenuItem;
  248. begin
  249. list := GetXCollectionItemClassesList(FXCollection.ItemsClass);
  250. try
  251. parent.Clear;
  252. for i := 0 to list.Count - 1 do
  253. begin
  254. XCollectionItemClass := TXCollectionItemClass(list[i]);
  255. if XCollectionItemClass.ItemCategory <> '' then
  256. begin
  257. { TODO : E2003 Undeclared identifier: 'Find' }
  258. (*categoryItem := parent.Find(XCollectionItemClass.ItemCategory);*)
  259. if categoryItem = nil then
  260. begin
  261. categoryItem := TMenuItem.Create(owner);
  262. categoryItem.Text := XCollectionItemClass.ItemCategory;
  263. parent.AddObject(categoryItem);
  264. end;
  265. end
  266. else
  267. categoryItem := parent;
  268. mi := TMenuItem.Create(owner);
  269. mi.Text := XCollectionItemClass.FriendlyName;
  270. mi.OnClick := OnAddXCollectionItemClick;
  271. mi.Tag := Integer(XCollectionItemClass);
  272. mi.Enabled := Assigned(FXCollection) and
  273. FXCollection.CanAdd(XCollectionItemClass);
  274. categoryItem.AddObject(mi);
  275. end;
  276. finally
  277. list.Free;
  278. end;
  279. end;
  280. end.