void CellGUI(Rect cellRect, TreeViewItem item, int column, ref RowGUIArgs args)
        {
            var type = currentSystem.Types[column];

            if (!nativeArrays.ContainsKey(type))
            {
                return;
            }
            var  array = nativeArrays[type];
            Type arrayType;

            if (type.GetInterfaces().Contains(typeof(IComponentData)))
            {
                arrayType = typeof(ComponentDataArray <>).MakeGenericType(type);
            }
            else if (type == typeof(Entity))
            {
                arrayType = typeof(EntityArray);
            }
            else
            {
                return;
            }
            var arrayIndexer = arrayType.GetProperty("Item", BindingFlags.Public | BindingFlags.Instance).GetGetMethod();
            var arrayElement = arrayIndexer.Invoke(array, new object[] { item.id });

            cellRect.height -= pointsBetweenRows;
            StructGUI.CellGUI(cellRect, arrayElement, linesPerRow);
        }
        public void PrepareData()
        {
            var emptyArgs      = new object[0];
            var emptyTypes     = new Type[0];
            var emptyModifiers = new ParameterModifier[0];

            if (currentSystem != null)
            {
                nativeArrays = new Dictionary <Type, object>();
                linesPerRow  = 1;
                foreach (var type in currentSystem.Types)
                {
                    var attr = BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly;
                    if (type.GetInterfaces().Contains(typeof(IComponentData)))
                    {
                        linesPerRow = Mathf.Max(linesPerRow, StructGUI.RowsForType(type));
                        rowHeight   = StructGUI.pointsPerLine * linesPerRow + pointsBetweenRows;
                        var method = typeof(ComponentGroup).GetMethod("GetComponentDataArray", attr, null, emptyTypes, emptyModifiers);
                        method = method.MakeGenericMethod(type);
                        var array = method.Invoke(currentSystem, emptyArgs);
                        nativeArrays.Add(type, array);
                    }
                    else if (typeof(Component).IsAssignableFrom(type))
                    {
                        var method = typeof(ComponentGroupExtensionsForComponentArray).GetMethod("GetComponentArray", attr);
                        method = method.MakeGenericMethod(type);
                        var array = method.Invoke(null, new [] { currentSystem });
                        nativeArrays.Add(type, array);
                    }
                    else if (type == typeof(Entity))
                    {
                        linesPerRow = Mathf.Max(linesPerRow, StructGUI.RowsForType(type));
                        rowHeight   = StructGUI.pointsPerLine * linesPerRow + pointsBetweenRows;
                        var method = typeof(ComponentGroup).GetMethod("GetEntityArray", attr);
                        var args   = new object[] {};
                        var array  = method.Invoke(currentSystem, args);
                        nativeArrays.Add(type, array);
                    }
                    else
                    {
                        nativeArrays.Add(type, null);
                    }
                }
            }
        }
        static MultiColumnHeaderState BuildHeaderState(ComponentGroup system, float listWidth)
        {
            var types   = system.Types;
            var columns = new List <MultiColumnHeaderState.Column>(types.Length + 1);

            var cells = new int[types.Length];

            var totalCells = 0;

            for (var i = 0; i < types.Length; ++i)
            {
                cells[i]    = StructGUI.ColumnsForType(types[i]);
                totalCells += cells[i];
            }

            var cellWidth = listWidth;

            if (totalCells > 0f)
            {
                cellWidth /= totalCells;
            }

            for (var i = 0; i < types.Length; ++i)
            {
                columns.Add(new MultiColumnHeaderState.Column
                {
                    headerContent         = new GUIContent(types[i].Name),
                    contextMenuText       = "Asset",
                    headerTextAlignment   = TextAlignment.Center,
                    sortedAscending       = true,
                    sortingArrowAlignment = TextAlignment.Right,
                    width                 = cells[i] * cellWidth,
                    minWidth              = 60,
                    maxWidth              = 500,
                    autoResize            = false,
                    allowToggleVisibility = true
                });
            }

            var headerState = new MultiColumnHeaderState(columns.ToArray());

            return(headerState);
        }