示例#1
0
 internal IntelliBoxItem(string text, string code, string toolTip, IntelliType intelliType)
 {
     this.Text       = text;
     this.Code       = code;
     this.ToolTip    = toolTip;
     this.ImageIndex = (int)intelliType;
 }
示例#2
0
 internal FilterButton(IntelliType intelliType)
 {
     this.IntelliType = intelliType;
     this.Image       = ItemIcons[(int)this.IntelliType];
     this.ToolTipText = $"Show only {intelliType.ToString().MakePlural()}{GetHotKey(intelliType)}";
     this.Margin      = new Padding(UIUtil.Scale(2));
 }
示例#3
0
        /// <summary>
        /// Fills the iBox with all the Constructors of the given Type.
        /// </summary>
        internal void Populate(Type type)
        {
            this.Items.Clear();
            unFilteredItems.Clear();
            stringFilter      = string.Empty;
            intelliTypeFilter = IntelliType.None;
            membersInBox      = false;

            if (!type.IsEnum && type.IsValueType)
            {
                unFilteredItems.Add(new IntelliBoxItem($"{type.Name}()", string.Empty, $"{type.Name}()", IntelliType.Constructor));
            }

            foreach (ConstructorInfo constructor in type.GetConstructors())
            {
                string toolTip = $"{type.Name}({constructor.Params()})";
                unFilteredItems.Add(new IntelliBoxItem(toolTip, string.Empty, toolTip, IntelliType.Constructor));
            }

            this.Items.AddRange(unFilteredItems.ToArray());
            if (unFilteredItems.Count > 0)
            {
                this.SelectedIndex = 0;
            }
        }
示例#4
0
 private void Clear()
 {
     this.Items.Clear();
     this.unFilteredItems.Clear();
     this.stringFilter      = string.Empty;
     this.intelliTypeFilter = IntelliType.None;
 }
示例#5
0
 private static string GetHotKey(IntelliType intelliType)
 {
     return(intelliType switch
     {
         IntelliType.Method => " (Alt+M)",
         IntelliType.Property => " (Alt+P)",
         IntelliType.Event => " (Alt+V)",
         IntelliType.Field => " (Alt+F)",
         IntelliType.Keyword => " (Alt+K)",
         IntelliType.Variable => " (Alt+L)",
         IntelliType.Class => " (Alt+C)",
         IntelliType.Struct => " (Alt+S)",
         IntelliType.Enum => " (Alt+E)",
         IntelliType.Constant => " (Alt+O)",
         IntelliType.Snippet => " (Alt+T)",
         IntelliType.Interface => " (Alt+I)",
         IntelliType.Delegate => " (Alt+D)",
         _ => string.Empty,
     });
示例#6
0
        internal void Filter(IntelliType intelliType)
        {
            IEnumerable <FilterButton> filterbuttons = this.toolStrip.Items.OfType <FilterButton>();
            FilterButton filterButton = filterbuttons.Where(b => b.Visible && b.IntelliType == intelliType).FirstOrDefault();

            if (filterButton is null)
            {
                return;
            }

            filterButton.Checked = !filterButton.Checked;

            IEnumerable <IntelliType> matchingTypes = listBox.Items.OfType <IntelliBoxItem>().Select(i => i.IntelliType).Distinct().ToArray();

            if (filterbuttons.Any(x => x.Checked))
            {
                IEnumerable <IntelliType> checkedTypes = filterbuttons.Where(x => x.Checked).Select(x => x.IntelliType).Intersect(matchingTypes);
                SetFilterButtonAppearance(checkedTypes);
            }
            else
            {
                SetFilterButtonAppearance(matchingTypes);
            }

            if (intelliType == IntelliType.None)
            {
                enumFilters.Clear();
            }
            else if (enumFilters.Contains(intelliType))
            {
                enumFilters.Remove(intelliType);
            }
            else
            {
                enumFilters.Add(intelliType);
            }

            Filter();
        }
示例#7
0
        private void AddType(Type type, string typeName, bool?isNested)
        {
            string realName = type.Name;
            string name     = typeName;
            string code     = typeName;

            if (type.IsGenericType)
            {
                realName = type.GetGenericName();
                if (typeName.Equals(type.Name, StringComparison.Ordinal))
                {
                    name = type.GetGenericName();
                    code = Regex.Replace(type.Name, @"`\d", string.Empty);
                }

                if (type.IsGenericTypeDefinition)
                {
                    string constraints = type.GetGenericArguments().GetConstraints().Join("\r\n    ");
                    if (constraints.Length > 0)
                    {
                        realName += "\r\n    " + constraints;
                    }
                }
            }

            string      baseType = "Type";
            IntelliType icon     = IntelliType.Type;

            if (type.IsEnum)
            {
                baseType = "enum";
                icon     = IntelliType.Enum;
            }
            else if (type.IsValueType)
            {
                baseType = "struct";
                icon     = IntelliType.Struct;
            }
            else if (type.IsDelegate())
            {
                baseType = "delegate";
                icon     = IntelliType.Delegate;
            }
            else if (type.IsClass)
            {
                baseType = "class";
                icon     = IntelliType.Class;
            }
            else if (type.IsInterface)
            {
                baseType = "interface";
                icon     = IntelliType.Interface;
            }

            string toolTip;

            if (isNested == null)
            {
                toolTip = $"{baseType} - {type.DeclaringType.Name}.{realName}\nType"; // User Defined
            }
            else if (isNested == true)
            {
                toolTip = $"{baseType} - {realName}\nNested Type";
            }
            else
            {
                toolTip = $"{baseType} - {type.Namespace}.{realName}\nType";
            }

            unFilteredItems.Add(new IntelliBoxItem(name, code, toolTip, icon));
        }
示例#8
0
        internal void Filter(IntelliType intelliTypes)
        {
            intelliTypeFilter = (intelliTypes == intelliTypeFilter) ? IntelliType.None : intelliTypes;

            Filter();
        }
示例#9
0
        /// <summary>
        /// Fills the iBox with all non-member objects, and then filters them with the given char.
        /// </summary>
        internal void Populate(char startChar)
        {
            this.Items.Clear();
            unFilteredItems.Clear();
            stringFilter      = string.Empty;
            intelliTypeFilter = IntelliType.None;
            membersInBox      = false;

            foreach (string type in Intelli.AutoCompleteTypes.Keys)
            {
                Type t = Intelli.AutoCompleteTypes[type];

                string name     = t.IsGenericType && type.Equals(t.Name, StringComparison.Ordinal) ? t.GetGenericName() : type;
                string realName = t.IsGenericType ? t.GetGenericName() : t.Name;
                string code     = t.IsGenericType && type.Equals(t.Name, StringComparison.Ordinal) ? Regex.Replace(t.Name, @"`\d", string.Empty) + "<>" : type;

                string      baseType = "Type";
                IntelliType icon     = IntelliType.Type;

                if (t.IsEnum)
                {
                    baseType = "enum";
                    icon     = IntelliType.Enum;
                }
                else if (t.IsValueType)
                {
                    baseType = "struct";
                    icon     = IntelliType.Struct;
                }
                else if (t.IsClass)
                {
                    baseType = "class";
                    icon     = IntelliType.Class;
                }
                else if (t.IsInterface)
                {
                    // Disabled simply because I don't think they're useful in the context of CodeLab
                    //baseType = "interface";
                    //icon = IntelliTypes.Interface;
                    continue;
                }

                string toolTip = $"{baseType} - {t.Namespace}.{realName}\nType";
                unFilteredItems.Add(new IntelliBoxItem(name, code, toolTip, icon));
            }

            foreach (string type in Intelli.UserDefinedTypes.Keys)
            {
                Type t = Intelli.UserDefinedTypes[type];

                string name     = t.IsGenericType && type.Equals(t.Name, StringComparison.Ordinal) ? t.GetGenericName() : type;
                string realName = t.IsGenericType ? t.GetGenericName() : t.Name;
                string code     = t.IsGenericType && type.Equals(t.Name, StringComparison.Ordinal) ? Regex.Replace(t.Name, @"`\d", string.Empty) + "<>" : type;

                string      baseType = "Type";
                IntelliType icon     = IntelliType.Type;

                if (t.IsEnum)
                {
                    baseType = "enum";
                    icon     = IntelliType.Enum;
                }
                else if (t.IsValueType)
                {
                    baseType = "struct";
                    icon     = IntelliType.Struct;
                }
                else if (t.IsClass)
                {
                    baseType = "class";
                    icon     = IntelliType.Class;
                }
                else if (t.IsInterface)
                {
                    // Disabled simply because I don't think they're useful in the context of CodeLab
                    //baseType = "interface";
                    //icon = IntelliTypes.Interface;
                    continue;
                }

                string toolTip = $"{baseType} - {t.DeclaringType.Name}.{realName}\nType";
                unFilteredItems.Add(new IntelliBoxItem(name, code, toolTip, icon));
            }

            foreach (string var in Intelli.Variables.Keys)
            {
                string type    = Intelli.Variables[var].GetDisplayName();
                string toolTip = $"{type} - {var}\nLocal Variable";
                unFilteredItems.Add(new IntelliBoxItem(var, var, toolTip, IntelliType.Variable));
            }

            foreach (string para in Intelli.Parameters.Keys)
            {
                string type    = Intelli.Parameters[para].GetDisplayName();
                string toolTip = $"{type} - {para}\nParameter";
                unFilteredItems.Add(new IntelliBoxItem(para, para, toolTip, IntelliType.Variable)); // use the var icon
            }

            foreach (string key in Intelli.Keywords)
            {
                string toolTip = $"{key}\nKeyword";
                unFilteredItems.Add(new IntelliBoxItem(key, key, toolTip, IntelliType.Keyword));
            }

            foreach (string snip in Intelli.Snippets.Keys)
            {
                string toolTip = $"{snip}\nSnippet - Tab Twice";
                unFilteredItems.Add(new IntelliBoxItem(snip, snip, toolTip, IntelliType.Snippet));
            }

            MemberInfo[] members = Intelli.UserScript.GetMembers(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
            foreach (MemberInfo memberInfo in members)
            {
                if (memberInfo.GetCustomAttribute <ObsoleteAttribute>() != null)
                {
                    continue;
                }

                string returnType = string.Empty;
                string toolTip    = string.Empty;

                switch (memberInfo.MemberType)
                {
                case MemberTypes.Method:
                    MethodInfo methodInfo = (MethodInfo)memberInfo;
                    if (methodInfo.IsSpecialName || methodInfo.DeclaringType != Intelli.UserScript ||
                        methodInfo.Name.Equals("Render", StringComparison.Ordinal) || methodInfo.Name.Equals("PreRender", StringComparison.Ordinal))
                    {
                        continue;
                    }

                    string methodParameters = $"({methodInfo.Params()})";

                    returnType = methodInfo.ReturnType.GetDisplayName();
                    toolTip    = $"{returnType} - {methodInfo.Name}{methodParameters}\n{methodInfo.MemberType}";
                    unFilteredItems.Add(new IntelliBoxItem(methodInfo.Name + methodParameters, methodInfo.Name, toolTip, IntelliType.Method));
                    break;

                case MemberTypes.Property:
                    if (memberInfo.Name.Equals("SetRenderInfoCalled", StringComparison.Ordinal) || memberInfo.Name.Equals("__DebugMsgs", StringComparison.Ordinal))
                    {
                        continue;
                    }

                    string getSet = ((PropertyInfo)memberInfo).GetterSetter();

                    returnType = ((PropertyInfo)memberInfo).PropertyType.GetDisplayName();
                    toolTip    = $"{returnType} - {memberInfo.Name}{getSet}\n{memberInfo.MemberType}";
                    unFilteredItems.Add(new IntelliBoxItem(memberInfo.Name, memberInfo.Name, toolTip, IntelliType.Property));
                    break;

                case MemberTypes.Event:
                    returnType = ((EventInfo)memberInfo).EventHandlerType.GetDisplayName();
                    toolTip    = $"{returnType} - {memberInfo.Name}\n{memberInfo.MemberType}";
                    unFilteredItems.Add(new IntelliBoxItem(memberInfo.Name, memberInfo.Name, toolTip, IntelliType.Event));
                    break;

                case MemberTypes.Field:
                    if (memberInfo.Name.Equals("RandomNumber", StringComparison.Ordinal) || memberInfo.Name.Equals("instanceSeed", StringComparison.Ordinal) ||
                        memberInfo.Name.EndsWith("_BackingField", StringComparison.Ordinal) ||
                        memberInfo.Name.Equals("__listener", StringComparison.Ordinal) || memberInfo.Name.Equals("__debugWriter", StringComparison.Ordinal))
                    {
                        continue;
                    }

                    FieldInfo   field = (FieldInfo)memberInfo;
                    string      fieldTypeName;
                    IntelliType fieldType;
                    string      fieldValue;

                    if (!field.IsStatic)
                    {
                        fieldTypeName = "Field";
                        fieldType     = IntelliType.Field;
                        fieldValue    = string.Empty;
                    }
                    else if (field.FieldType.IsEnum)
                    {
                        fieldTypeName = "Enum Value";
                        fieldType     = IntelliType.EnumItem;
                        fieldValue    = $" ({(int)field.GetValue(null)})";
                    }
                    else if (field.IsLiteral && !field.IsInitOnly)
                    {
                        fieldTypeName = "Constant";
                        fieldType     = IntelliType.Constant;
                        fieldValue    = $" ({field.GetValue(null)})";
                    }
                    else
                    {
                        fieldTypeName = "Field";
                        fieldType     = IntelliType.Field;
                        fieldValue    = $" ( {field.GetValue(null)} )";
                    }

                    returnType = field.FieldType.GetDisplayName();
                    toolTip    = $"{returnType} - {memberInfo.Name}{fieldValue}\n{fieldTypeName}";
                    unFilteredItems.Add(new IntelliBoxItem(memberInfo.Name, memberInfo.Name, toolTip, fieldType));
                    break;
                }
            }

            unFilteredItems.Sort();
            Filter(startChar.ToString().Trim());
        }
示例#10
0
        /// <summary>
        /// Fills the iBox with members of the given Type.
        /// </summary>
        internal void Populate(Type type, bool isStatic)
        {
            this.Items.Clear();
            unFilteredItems.Clear();
            stringFilter      = string.Empty;
            intelliTypeFilter = IntelliType.None;
            membersInBox      = true;

            MemberInfo[] members = isStatic ?
                                   type.GetMembers(BindingFlags.Static | BindingFlags.Public) :
                                   type.GetMembers(BindingFlags.Instance | BindingFlags.FlattenHierarchy | BindingFlags.CreateInstance | BindingFlags.Public);

            foreach (MemberInfo memberInfo in members)
            {
                if ((!memberInfo.ReflectedType.IsVisible && memberInfo.DeclaringType?.DeclaringType?.FullName != "PaintDotNet.Effects.UserScript") ||
                    memberInfo.ReflectedType.IsSpecialName || memberInfo.GetCustomAttribute <ObsoleteAttribute>() != null)
                {
                    continue;
                }

                string returnType = string.Empty;
                string toolTip    = string.Empty;

                switch (memberInfo.MemberType)
                {
                case MemberTypes.Method:
                    MethodInfo methodInfo = (MethodInfo)memberInfo;
                    if (methodInfo.IsSpecialName)
                    {
                        continue;
                    }

                    string methodParameters = $"({methodInfo.Params()})";

                    returnType = methodInfo.ReturnType.GetDisplayName();
                    toolTip    = $"{returnType} - {methodInfo.Name}{methodParameters}\n{methodInfo.MemberType}";
                    unFilteredItems.Add(new IntelliBoxItem(methodInfo.Name + methodParameters, methodInfo.Name, toolTip, IntelliType.Method));
                    break;

                case MemberTypes.Property:
                    PropertyInfo property = (PropertyInfo)memberInfo;
                    if (property.GetIndexParameters().Length > 0)
                    {
                        continue;
                    }

                    string getSet = property.GetterSetter();

                    returnType = property.PropertyType.GetDisplayName();
                    toolTip    = $"{returnType} - {property.Name}{getSet}\n{property.MemberType}";
                    unFilteredItems.Add(new IntelliBoxItem(property.Name, property.Name, toolTip, IntelliType.Property));
                    break;

                case MemberTypes.Event:
                    returnType = ((EventInfo)memberInfo).EventHandlerType.GetDisplayName();
                    toolTip    = $"{returnType} - {memberInfo.Name}\n{memberInfo.MemberType}";
                    unFilteredItems.Add(new IntelliBoxItem(memberInfo.Name, memberInfo.Name, toolTip, IntelliType.Event));
                    break;

                case MemberTypes.Field:
                    FieldInfo   field = (FieldInfo)memberInfo;
                    string      fieldTypeName;
                    IntelliType fieldType;
                    string      fieldValue;

                    if (!field.IsStatic)
                    {
                        fieldTypeName = "Field";
                        fieldType     = IntelliType.Field;
                        fieldValue    = string.Empty;
                    }
                    else if (field.FieldType.IsEnum)
                    {
                        fieldTypeName = "Enum Value";
                        fieldType     = IntelliType.EnumItem;
                        fieldValue    = $" ({field.GetEnumValue()})";
                    }
                    else if (field.IsLiteral && !field.IsInitOnly)
                    {
                        fieldTypeName = "Constant";
                        fieldType     = IntelliType.Constant;
                        fieldValue    = $" ({field.GetValue(null)})";
                    }
                    else
                    {
                        fieldTypeName = "Field";
                        fieldType     = IntelliType.Field;
                        fieldValue    = $" ( {field.GetValue(null)} )";
                    }

                    returnType = field.FieldType.GetDisplayName();
                    toolTip    = $"{returnType} - {field.Name}{fieldValue}\n{fieldTypeName}";
                    unFilteredItems.Add(new IntelliBoxItem(field.Name, field.Name, toolTip, fieldType));
                    break;

                case MemberTypes.NestedType:
                    Type        nestedType  = (Type)memberInfo;
                    IntelliType intelliType = IntelliType.Type;
                    string      subType     = "Type";

                    if (nestedType.IsEnum)
                    {
                        subType     = "enum";
                        intelliType = IntelliType.Enum;
                    }
                    else if (nestedType.IsValueType)
                    {
                        subType     = "struct";
                        intelliType = IntelliType.Struct;
                    }
                    else if (nestedType.IsClass)
                    {
                        subType     = "class";
                        intelliType = IntelliType.Class;
                    }

                    toolTip = $"{subType} - {nestedType.Name}\nNested Type";
                    unFilteredItems.Add(new IntelliBoxItem(nestedType.Name, nestedType.Name, toolTip, intelliType));
                    break;
                }
            }
            unFilteredItems.Sort();
            this.Items.AddRange(unFilteredItems.ToArray());

            if (this.Items.Contains(this.LastUsedMember))
            {
                this.SelectedItem = this.LastUsedMember;
            }
            else if (this.Items.Contains(this.LastUsedNonMember))
            {
                this.SelectedItem = this.LastUsedNonMember;
            }
            else if (this.Items.Count > 0)
            {
                this.SelectedIndex = 0;
            }
        }