예제 #1
0
        public GroupTable(IContext context, ITable table, FunctionColumnInfo[] columnInfo, ObjectName[] columns)
            : base(context, table, columnInfo)
        {
            this.table = table;

            if (columns != null && columns.Length > 0)
            {
                CreateMatrix(columns);
            }
            else
            {
                CreateGroup();
            }

            // Set up a group resolver for this method.
            groupResolver = new GroupResolver(this);
        }
예제 #2
0
        //static bool clearedCache;
        //static BetterEditor()
        //{
        //	//if (!clearedCache)
        //	{
        //		clearedCache = true;
        //		MemberDrawersHandler.Instance.ClearCache();
        //	}
        //}

        protected override void OnAwake()
        {
            OnAwakeAssertion();

            // Fetch visible members
            {
                Func <MemberInfo, VisibleMember> newMember = m => new VisibleMember(m, target, target, id);
                var allMembers = ReflectionUtil.GetMemoizedMembers(targetType);
                visibleMembers = SerializationLogic.Default.GetVisibleMembers(allMembers).Select(newMember).ToList();

                // Initialize view
                {
                    minimalView = targetType.IsDefined <MinimalViewAttribute>(true);
                    if (minimalView)
                    {
                        visibleMembers = visibleMembers.OrderBy(x => x.DisplayOrder).ToList();
                    }
                    else
                    {
                        baseCategories = new List <MemberCategory>();

                        Func <string, float, MemberCategory> newCategory = (path, order) =>
                                                                           new MemberCategory(path, new List <ICanBeDrawn>(), order, id, prefs);

                        var basic = targetType.GetCustomAttribute <BasicViewAttribute>(true);
                        if (basic != null)
                        {
                            var c = newCategory(string.Empty, 0f);
                            c.Indent     = false;
                            c.HideHeader = true;
                            visibleMembers.OrderBy(x => x.DisplayOrder).Foreach(c.AddMember);
                            baseCategories.Add(c);
                        }
                        else
                        {
                            // Create the intial input from the target's visible members
                            var input = new MemberGroup(visibleMembers, newMember);

                            // Create resolvers
                            var resolvers = new GroupResolver[]
                            {
                                new PatternResolver(), new MemberTypesResolver(),
                                new ReturnTypeResolver(), new ExplicitMemberAddResolver(),
                                new CategoryMembersResolver()
                            };
                            var core = new CoreResolver(resolvers, () => new MemberGroup(newMember));

                            Action <DefineCategoryAttribute, MemberCategory> resolve = (def, category) =>
                                                                                       core.Resolve(input, def).Members.Foreach(category.AddMember);

                            var multiple    = targetType.GetCustomAttribute <DefineCategoriesAttribute>(true);
                            var ignored     = targetType.GetCustomAttributes <IgnoreCategoriesAttribute>(true);
                            var definitions = targetType.GetCustomAttributes <DefineCategoryAttribute>(true);
                            if (multiple != null)
                            {
                                definitions = definitions.Concat(multiple.names.Select(n => new DefineCategoryAttribute(n, 1000)));
                            }

                            definitions = definitions.Where(d => !ignored.Any(ig => ig.Paths.Contains(d.FullPath)))
                                          .ToList();

                            Func <string, string[]> ParseCategoryPath = fullPath =>
                            {
                                int      nPaths = fullPath.Split('/').Length;
                                string[] result = new string[nPaths];
                                for (int i = 0, index = -1; i < nPaths - 1; i++)
                                {
                                    index     = fullPath.IndexOf('/', index + 1);
                                    result[i] = fullPath.Substring(0, index);
                                }
                                result[nPaths - 1] = fullPath;
                                return(result);
                            };

                            // Order by exclusivity then path lengths
                            var defs = from d in definitions
                                       let paths = ParseCategoryPath(d.FullPath)
                                                   orderby !d.Exclusive                        //, paths.Length
                                                   select new { def = d, paths };

                            Func <MemberCategory, List <MemberCategory> > getParentCats = parent =>
                                                                                          parent == null ? baseCategories :
                                                                                          (from m in parent.Members
                                                                                           let cat = m as MemberCategory
                                                                                                     where cat != null
                                                                                                     select cat).ToList();

                            // Parse paths and resolve definitions
                            var categories = new Dictionary <string, MemberCategory>();
                            foreach (var x in defs)
                            {
                                var paths = x.paths;
                                var d     = x.def;

                                MemberCategory parent = null;

                                for (int i = 0; i < paths.Length; i++)
                                {
                                    var p       = paths[i];
                                    var current = getParentCats(parent).FirstOrDefault(c => c.FullPath == p);
                                    if (current == null)
                                    {
                                        current = newCategory(p, d.DisplayOrder);
                                        if (i == 0)
                                        {
                                            baseCategories.Add(current);
                                        }
                                        if (parent != null)
                                        {
                                            parent.AddMember(current);
                                        }
                                    }
                                    categories[p] = current;
                                    parent        = current;
                                }

                                categories[paths.Last()].ForceExpand = d.ForceExpand;
                                resolve(d, categories[paths.Last()]);
                                categories.Clear();
                                parent.Members = parent.Members.OrderBy(m => m.DisplayOrder).ToList();
                            }
                            baseCategories = baseCategories.OrderBy(x => x.DisplayOrder).ToList();
                        }
                    }

                    script = serializedObject.FindProperty("m_Script");

                    var disInt = prefs.Ints.ValueOrDefault(id + "display", -1);
                    display = disInt == -1 ? DefaultDisplay : (MembersDisplay)disInt;

                    var field = targetType.Field("_serializationData", Flags.InstancePrivate);
                    if (field == null)
                    {
                        throw new MemberNotFoundException("_serializationData");
                    }

                    serializationData = new EditorMember(field, target, target, id);

                    OnInitialized();

#if DBG
                    Log(GetType().Name + " for " + target.GetType().Name + " Initialized");
#endif
                }
            }
        }
예제 #3
0
 public ReferenceResolver(GroupResolver groupResolver, long index)
 {
     this.groupResolver = groupResolver;
     this.index         = index;
 }