LuaVirtualTrees.pas 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. //******************************************************************************
  2. //*** LUA SCRIPT DELPHI UTILITIES ***
  3. //*** ***
  4. //*** (c) 2006 Jean-François Goulet ***
  5. //*** ***
  6. //*** ***
  7. //******************************************************************************
  8. // File : LuaVirtualTrees.pas
  9. //
  10. // Description : ?
  11. //
  12. //******************************************************************************
  13. //** See Copyright Notice in lua.h
  14. //Revision 0.1
  15. // JF Adds :
  16. // LuaTableToVirtualTreeView
  17. //
  18. Unit LuaVirtualTrees;
  19. interface
  20. Uses SysUtils, Classes, lua, LuaUtils, VirtualTrees;
  21. type
  22. PBasicTreeData = ^TBasicTreeData;
  23. TBasicTreeData = record
  24. sName: String;
  25. sValue: String;
  26. end;
  27. procedure LuaTableToVirtualTreeView(L: Plua_State; Index: Integer; VTV: TVirtualStringTree; MaxTable: Integer; SubTableMax: Integer; CheckCyclicReferencing: Boolean);
  28. var
  29. SubTableCount: Integer;
  30. SubTableCount2: Integer;
  31. implementation
  32. procedure LuaTableToVirtualTreeView(L: Plua_State; Index: Integer; VTV: TVirtualStringTree; MaxTable: Integer; SubTableMax: Integer; CheckCyclicReferencing: Boolean);
  33. var
  34. pGLobalsIndexPtr: Pointer;
  35. PtrsList: TList;
  36. pTreeNodeData: PBasicTreeData;
  37. // Go through all child of current table and create nodes
  38. procedure ParseTreeNode(TreeNode: PVirtualNode; Index: Integer);
  39. var
  40. Key: string;
  41. pData: PBasicTreeData;
  42. pNode: PVirtualNode;
  43. begin
  44. // Retreive absolute index
  45. Index := LuaAbsIndex(L, Index);
  46. lua_pushnil(L);
  47. while (lua_next(L, Index) <> 0) do
  48. begin
  49. if Assigned(TreeNode) then
  50. pTreeNodeData := VTV.GetNodeData(TreeNode)
  51. else
  52. pTreeNodeData := nil;
  53. if (pTreeNodeData = nil) or (pTreeNodeData.sValue <> '[CYCLIC_REFERENCING_DETECTED]') then
  54. begin
  55. Key := Dequote(LuaStackToStr(L, -2, MaxTable, SubTableMax, CheckCyclicReferencing));
  56. if lua_type(L, -1) <> LUA_TTABLE then
  57. begin
  58. pData := VTV.GetNodeData(VTV.AddChild(TreeNode));
  59. pData.sName := Key;
  60. pData.sValue := LuaStackToStr(L, -1, MaxTable, SubTableMax, CheckCyclicReferencing);
  61. end
  62. else
  63. begin
  64. if ((Key = '_G') or (lua_topointer(L, -1) = pGLobalsIndexPtr)) then
  65. begin
  66. pData := VTV.GetNodeData(VTV.AddChild(TreeNode));
  67. pData.sName := Key;
  68. pData.sValue := '[LUA_GLOBALSINDEX]';
  69. end
  70. else
  71. begin
  72. pNode := VTV.AddChild(TreeNode);
  73. pData := VTV.GetNodeData(pNode);
  74. pData.sName := Key;
  75. if CheckCyclicReferencing and (PtrsList.IndexOf(lua_topointer(L, -1)) <> -1) then
  76. pData.sValue := '[CYCLIC_REFERENCING_DETECTED]'
  77. else
  78. pData.sValue := LuaStackToStr(L, -1, MaxTable, SubTableMax, CheckCyclicReferencing);
  79. if SubTableCount < SubTableMax then
  80. begin
  81. if CheckCyclicReferencing then
  82. PtrsList.Add(lua_topointer(L, -1));
  83. SubTableCount := SubTableCount + 1;
  84. ParseTreeNode(pNode, -1);
  85. SubTableCount := SubTableCount - 1;
  86. if not Assigned(TreeNode) then
  87. PtrsList.Clear;
  88. end;
  89. end;
  90. end;
  91. end;
  92. lua_pop(L, 1);
  93. end;
  94. end;
  95. begin
  96. PtrsList := TList.Create;
  97. Assert(lua_type(L, Index) = LUA_TTABLE);
  98. lua_checkstack(L, SubTableMax * 3); // Ensure there is enough space on stack to work with according to user's setting
  99. pGLobalsIndexPtr := lua_topointer(L, LUA_GLOBALSINDEX); // Retrieve globals index pointer for later conditions
  100. VTV.BeginUpdate;
  101. VTV.Clear;
  102. try
  103. ParseTreeNode(nil, Index);
  104. finally
  105. VTV.EndUpdate;
  106. PtrsList.Free;
  107. end;
  108. end;
  109. end.