private void AddConcreteTypesToMenu(GenericElementAdderMenu menu, Type[] concreteTypes)
        {
            if (concreteTypes.Length == 0)
            {
                return;
            }

            if (!menu.IsEmpty)
            {
                menu.AddSeparator();
            }

            foreach (var concreteType in concreteTypes)
            {
                var content = new GUIContent(_typeDisplayNameFormatter(concreteType));
                if (_elementAdder != null && _elementAdder.CanAddElement(concreteType))
                {
                    menu.AddItem(content, () => {
                        if (_elementAdder.CanAddElement(concreteType))
                        {
                            _elementAdder.AddElement(concreteType);
                        }
                    });
                }
                else
                {
                    menu.AddDisabledItem(content);
                }
            }
        }
        public IElementAdderMenu GetMenu()
        {
            var menu = new GenericElementAdderMenu();

            AddCommandsToMenu(menu, _customCommands);

            if (_contractType != null)
            {
                AddCommandsToMenu(menu, ElementAdderMeta.GetMenuCommands <TContext>(_contractType));
                AddConcreteTypesToMenu(menu, ElementAdderMeta.GetConcreteElementTypes(_contractType, _typeFilters.ToArray()));
            }

            return(menu);
        }
        private void AddCommandsToMenu(GenericElementAdderMenu menu, IList <IElementAdderMenuCommand <TContext> > commands)
        {
            if (commands.Count == 0)
            {
                return;
            }

            if (!menu.IsEmpty)
            {
                menu.AddSeparator();
            }

            foreach (var command in commands)
            {
                if (_elementAdder != null && command.CanExecute(_elementAdder))
                {
                    menu.AddItem(command.Content, () => command.Execute(_elementAdder));
                }
                else
                {
                    menu.AddDisabledItem(command.Content);
                }
            }
        }