public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            _editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
            if (_editorService != null)
            {
                if (context.Instance != null)
                {
                    // CR modifying to accomodate PropertyBag
                    Type   instanceType = null;
                    object objinfo      = null;
                    ContextHelper.GetAuthorizationTypeContextInstanceObject(context, ref objinfo, ref instanceType);
                    var obj = (AuthorizationRule)objinfo;
                    _instance = objinfo.GetType();

                    _lstProperties.Items.Clear();
                    _lstProperties.Items.Add("(None)");

                    _sizeSortedNamespaces = new List <string>();
                    var currentCslaObject = (CslaObjectInfo)GeneratorController.Current.GetSelectedItem();
                    _sizeSortedNamespaces = currentCslaObject.Namespaces.ToList();
                    _sizeSortedNamespaces.Add(currentCslaObject.ObjectNamespace);
                    _sizeSortedNamespaces = BusinessRuleTypeEditor.GetSizeSorted(_sizeSortedNamespaces);

                    // Get Assembly File Path
                    var assemblyFileInfo = _instance.GetProperty("AssemblyFile");
                    var assemblyFilePath = (string)assemblyFileInfo.GetValue(objinfo, null);

                    // If Assembly path is available, use assembly to load a drop down with available types.
                    if (!string.IsNullOrEmpty(assemblyFilePath))
                    {
                        var assembly = Assembly.LoadFrom(assemblyFilePath);
                        var alltypes = assembly.GetExportedTypes();
                        if (alltypes.Length > 0)
                        {
                            _baseTypes = new List <BaseProperty>();
                        }

                        foreach (var type in alltypes)
                        {
                            // check here for Csla.Rules.IAuthorizationRule inheritance
                            if (type.GetInterface("Csla.Rules.IAuthorizationRule") != null)
                            {
                                // exclude abstract classes and exclude Property level rules for Objects and vv.
                                if (!type.IsAbstract && CTorMatchesRuleLevel(obj, type))
                                {
                                    var listableType = type.ToString();
                                    if (type.IsGenericType)
                                    {
                                        listableType = listableType.Substring(0, listableType.LastIndexOf('`'));
                                        foreach (var argument in type.GetGenericArguments())
                                        {
                                            listableType += "<" + argument.Name + ">";
                                        }
                                    }
                                    listableType = listableType.Replace("><", ",");
                                    listableType = BusinessRuleTypeEditor.StripKnownNamespaces(_sizeSortedNamespaces,
                                                                                               listableType);
                                    _lstProperties.Items.Add(listableType);
                                    _baseTypes.Add(new BaseProperty(type, type.BaseType, listableType));
                                }
                            }
                        }

                        _lstProperties.Sorted = true;
                    }

                    var entry = BusinessRuleTypeEditor.StripKnownNamespaces(_sizeSortedNamespaces, obj.Type);
                    if (_lstProperties.Items.Contains(entry))
                    {
                        _lstProperties.SelectedItem = entry;
                    }
                    else
                    {
                        _lstProperties.SelectedItem = "(None)";
                    }

                    _editorService.DropDownControl(_lstProperties);

                    if (_lstProperties.SelectedIndex < 0 || _lstProperties.SelectedItem.ToString() == "(None)")
                    {
                        FillPropertyGrid(obj, _lstProperties.SelectedItem.ToString());
                        return(string.Empty);
                    }

                    FillPropertyGrid(obj, _lstProperties.SelectedItem.ToString());

                    return(_lstProperties.SelectedItem.ToString());
                }
            }

            return(value);
        }
        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            _editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
            if (_editorService != null)
            {
                if (context.Instance != null)
                {
                    // CR modifying to accomodate PropertyBag
                    Type   instanceType = null;
                    object objinfo      = null;
                    ContextHelper.GetTypeInfoContextInstanceObject(context, ref objinfo, ref instanceType);
                    var obj = (TypeInfo)objinfo;
                    _instance = objinfo.GetType();

                    _lstProperties.Items.Clear();
                    _lstProperties.Items.Add("(None)");

                    _sizeSortedNamespaces = new List <string>();

                    var currentCslaObject = GeneratorController.Current.CurrentCslaObject;
                    _sizeSortedNamespaces = currentCslaObject.Namespaces.ToList();
                    _sizeSortedNamespaces.Add(currentCslaObject.ObjectNamespace);
                    _sizeSortedNamespaces = BusinessRuleTypeEditor.GetSizeSorted(_sizeSortedNamespaces);

                    var alltypes = GeneratorController.Current.CurrentUnit.CslaObjects;
                    if (alltypes.Count > 0)
                    {
                        _baseTypes = new List <BaseProperty>();
                    }

                    var isCustomCriteria = !(obj.IsInheritedType || obj.IsInheritedTypeWinForms);
                    var currentBaseClass = currentCslaObject.GetCslaBaseClassName();

                    foreach (var type in alltypes)
                    {
                        var addToList = false;

                        if (isCustomCriteria)
                        {
                            addToList = type.IsCriteriaClass();
                        }
                        else
                        {
                            if (!GeneratorController.Current.CurrentUnit.Params.EnforceGenericInheritance)
                            {
                                var isMatch = currentCslaObject.IsObjectType() == type.IsObjectType() &&
                                              currentCslaObject.IsCollectionType() == type.IsCollectionType();
                                var isSameBaseClass = isMatch && currentBaseClass == type.GetCslaBaseClassName();

                                var isInheritedNonGeneric = type.IsBaseClass() &&
                                                            !type.IsGenericType;

                                addToList = isSameBaseClass || isInheritedNonGeneric;
                            }

                            var isInheritedMatchingGeneric = type.IsBaseClass() &&
                                                             type.IsGenericType &&
                                                             type.GetGenericArguments().Length ==
                                                             currentCslaObject.NumberOfGenericArguments();

                            var isNotSameObject = !ReferenceEquals(currentCslaObject, type);

                            addToList = (addToList || isInheritedMatchingGeneric) &&
                                        isNotSameObject;
                        }

                        if (addToList)
                        {
                            var listableType = type.GenericName;
                            if (!string.IsNullOrEmpty(listableType))
                            {
                                listableType = BusinessRuleTypeEditor.StripKnownNamespaces(
                                    _sizeSortedNamespaces,
                                    listableType);
                                _lstProperties.Items.Add(listableType);
                                _baseTypes.Add(new BaseProperty(type, listableType));
                            }
                        }
                    }

                    _lstProperties.Sorted = true;

                    if (_lstProperties.Items.Contains(obj.ObjectName))
                    {
                        _lstProperties.SelectedItem = obj.ObjectName;
                    }
                    else
                    {
                        _lstProperties.SelectedItem = "(None)";
                    }

                    _editorService.DropDownControl(_lstProperties);

                    if (_lstProperties.SelectedIndex < 0 || _lstProperties.SelectedItem.ToString() == "(None)")
                    {
                        FillPropertyGrid(obj, _lstProperties.SelectedItem.ToString());
                        return(string.Empty);
                    }

                    FillPropertyGrid(obj, _lstProperties.SelectedItem.ToString());

                    return(_lstProperties.SelectedItem.ToString());
                }
            }

            return(value);
        }
        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            _editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
            if (_editorService != null)
            {
                if (context.Instance != null)
                {
                    // CR modifying to accomodate PropertyBag
                    Type   instanceType = null;
                    object objinfo      = null;
                    ContextHelper.GetTypeInfoContextInstanceObject(context, ref objinfo, ref instanceType);
                    var obj = (TypeInfo)objinfo;
                    _instance = objinfo.GetType();

                    _lstProperties.Items.Clear();
                    _lstProperties.Items.Add("(None)");

                    var currentCslaObject = GeneratorController.Current.CurrentCslaObject;
                    _sizeSortedNamespaces = currentCslaObject.Namespaces.ToList();
                    _sizeSortedNamespaces.Add(currentCslaObject.ObjectNamespace);
                    _sizeSortedNamespaces.Add("Csla");
                    _sizeSortedNamespaces = BusinessRuleTypeEditor.GetSizeSorted(_sizeSortedNamespaces);

                    // Get Assembly File Path
                    var assemblyFileInfo = _instance.GetProperty("AssemblyFile");
                    var assemblyFilePath = (string)assemblyFileInfo.GetValue(objinfo, null);

                    // If Assembly path is available, use assembly to load a drop down with available types.
                    if (!string.IsNullOrEmpty(assemblyFilePath))
                    {
                        var assembly = Assembly.LoadFrom(assemblyFilePath);
                        var alltypes = assembly.GetExportedTypes();
                        if (alltypes.Length > 0)
                        {
                            _baseTypes = new List <BaseProperty>();
                        }

                        var isCustomCriteria         = !(obj.IsInheritedType || obj.IsInheritedTypeWinForms);
                        var numberOfGenericArguments = 1;
                        if (!isCustomCriteria)
                        {
                            numberOfGenericArguments = currentCslaObject.NumberOfGenericArguments();
                        }

                        foreach (var type in alltypes)
                        {
                            if (type.GetInterface("Csla.Core.IBusinessObject") != null ||
                                type.GetInterface("Csla.Core.IObservableBindingList") != null ||
                                type.GetInterface("Csla.Core.IExtendedBindingList") != null)
                            {
                                // exclude interface classes
                                if (!type.IsInterface)
                                {
                                    var listableType = string.Empty;

                                    if (!GeneratorController.Current.CurrentUnit.Params.EnforceGenericInheritance &&
                                        !isCustomCriteria)
                                    {
                                        listableType = type.ToString();
                                    }

                                    if (type.IsGenericType)
                                    {
                                        if (type.GetGenericArguments().Length == numberOfGenericArguments)
                                        {
                                            listableType = type.ToString();
                                            listableType = listableType.Substring(0, listableType.LastIndexOf('`'));
                                            foreach (var argument in type.GetGenericArguments())
                                            {
                                                listableType += "<" + argument.Name + ">";
                                            }
                                            listableType = listableType.Replace("><", ",");
                                        }
                                        else
                                        {
                                            listableType = string.Empty;
                                        }
                                    }

                                    if (!string.IsNullOrEmpty(listableType))
                                    {
                                        listableType = BusinessRuleTypeEditor.StripKnownNamespaces(
                                            _sizeSortedNamespaces,
                                            listableType);
                                        _lstProperties.Items.Add(listableType);
                                        _baseTypes.Add(new BaseProperty(type, listableType));
                                    }
                                }
                            }
                        }

                        _lstProperties.Sorted = true;
                    }

                    var entry = BusinessRuleTypeEditor.StripKnownNamespaces(_sizeSortedNamespaces, obj.Type);
                    if (_lstProperties.Items.Contains(entry))
                    {
                        _lstProperties.SelectedItem = entry;
                    }
                    else
                    {
                        _lstProperties.SelectedItem = "(None)";
                    }

                    _editorService.DropDownControl(_lstProperties);

                    if (_lstProperties.SelectedIndex < 0 || _lstProperties.SelectedItem.ToString() == "(None)")
                    {
                        FillPropertyGrid(obj, _lstProperties.SelectedItem.ToString());
                        return(string.Empty);
                    }

                    FillPropertyGrid(obj, _lstProperties.SelectedItem.ToString());

                    return(_lstProperties.SelectedItem.ToString());
                }
            }

            return(value);
        }