private void BindObject(object obj, TreeNode root, bool isPriorityTree)
    {
        int index = 0;

        try
        {
            // DataRow source, bind column names
            var dr = obj as DataRow;
            if (dr != null)
            {
                // Create tree structure
                foreach (DataColumn col in dr.Table.Columns)
                {
                    // Stop on max nodes
                    if (index++ >= MacroStaticSettings.MaxMacroNodes)
                    {
                        AppendMore(root);
                        break;
                    }

                    // Add the column
                    object childObj = dr[col.ColumnName];
                    AppendChild(root, col.ColumnName, childObj, false, isPriorityTree);
                }
            }
            else
            {
                // DataRowView source, bind column names
                var drv = obj as DataRowView;
                if (drv != null)
                {
                    // Create tree structure
                    foreach (DataColumn col in drv.DataView.Table.Columns)
                    {
                        // Stop on max nodes
                        if (index++ >= MacroStaticSettings.MaxMacroNodes)
                        {
                            AppendMore(root);
                            break;
                        }

                        // Add the column
                        object childObj = drv[col.ColumnName];
                        AppendChild(root, col.ColumnName, childObj, false, isPriorityTree);
                    }
                }
                else
                {
                    // Hierarchical object source
                    var hc = obj as IHierarchicalObject;
                    if (hc != null)
                    {
                        BaseInfo info = obj as BaseInfo;

                        var props = new List <string>(hc.Properties);

                        var fields = MacroFieldContainer.GetFieldsForObject(hc);
                        if (fields != null)
                        {
                            props.AddRange(fields.Select(x => x.Name));
                        }
                        //props.Sort();

                        if ((info != null) && (info.TypeInfo.SensitiveColumns != null))
                        {
                            props = props.Except(info.TypeInfo.SensitiveColumns).ToList();
                        }

                        // Create tree structure
                        foreach (string col in props)
                        {
                            // Stop on max nodes
                            if (index++ >= MacroStaticSettings.MaxMacroNodes)
                            {
                                AppendMore(root);
                                break;
                            }

                            // Add the property
                            AddProperty(root, isPriorityTree, hc, col);
                        }
                    }
                    else
                    {
                        // Data container source
                        var dc = obj as IDataContainer;
                        if (dc != null)
                        {
                            // Create tree structure
                            foreach (string col in dc.ColumnNames)
                            {
                                // Stop on max nodes
                                if (index++ >= MacroStaticSettings.MaxMacroNodes)
                                {
                                    AppendMore(root);
                                    break;
                                }

                                // Add the column
                                object childObj;
                                dc.TryGetValue(col, out childObj);

                                AppendChild(root, col, childObj, false, isPriorityTree);
                            }
                        }
                    }
                }
            }

            // Enumerable objects
            if ((obj is IEnumerable) && !(obj is string))
            {
                IEnumerable collection = (IEnumerable)obj;
                IEnumerator enumerator = null;

                bool indexByName = false;

                INamedEnumerable namedCol = null;
                if (obj is INamedEnumerable)
                {
                    // Collection with name enumerator
                    namedCol = (INamedEnumerable)collection;
                    if (namedCol.ItemsHaveNames)
                    {
                        enumerator  = namedCol.GetNamedEnumerator <object>();
                        indexByName = true;
                    }
                }

                if (!indexByName)
                {
                    // Standard collection
                    enumerator = collection.GetEnumerator();
                }

                int i = 0;

                List <string> addedItems = new List <string>();
                addedItems.Add("trees");
                addedItems.Add("documents");

                while (enumerator.MoveNext())
                {
                    // Stop on max nodes
                    if (index++ >= MacroStaticSettings.MaxMacroNodes)
                    {
                        AppendMore(root);
                        break;
                    }

                    // Add the item
                    object item = MacroResolver.EncapsulateObject(enumerator.Current);
                    if (indexByName)
                    {
                        // Convert the name with dot to indexer
                        string name = namedCol.GetObjectName(item);
                        if (!ValidationHelper.IsIdentifier(name))
                        {
                            name = "[\"" + name + "\"]";
                        }

                        string nameToLower = name.ToLowerCSafe();
                        if (!addedItems.Contains(nameToLower))
                        {
                            addedItems.Add(nameToLower);
                            AppendChild(root, name, item, false, isPriorityTree);
                        }
                    }
                    else
                    {
                        // Indexed item
                        AppendChild(root, i.ToString(), item, true, isPriorityTree);
                    }

                    i++;
                }
            }
        }
        catch (Exception ex)
        {
            EventLogProvider.LogException("MacroTree", "EXPAND", ex);

            throw;
        }
    }