using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
namespace Sample.Extender
{
/// --------------------------------------------------------------------------------
/// <summary>
/// </summary>
/// --------------------------------------------------------------------------------
public enum FieldCategory
{
None,
CategoryX,
CategoryY,
CategoryZ
}
/// --------------------------------------------------------------------------------
/// <summary>
/// </summary>
/// --------------------------------------------------------------------------------
public enum FieldSubCategory
{
None,
SubCategoryX1,
SubCategoryX2,
SubCategoryX3,
SubCategoryY1,
SubCategoryY2,
SubCategoryY3,
SubCategoryZ1,
SubCategoryZ2,
SubCategoryZ3
}
[ProvideProperty("FieldCategory", typeof(Component)),
ProvideProperty("FieldSubCategory", typeof(Component))]
public class TestExtender : Component, IExtenderProvider
{
private Dictionary<Component, FieldCategory> fieldCategories = new Dictionary<Component, FieldCategory>();
private Dictionary<Component, FieldSubCategory> fieldSubCategories = new Dictionary<Component, FieldSubCategory>();
public class FieldSubCategoryConverter : EnumConverter
{
public FieldSubCategoryConverter(Type type)
: base(type)
{
}
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
//-------------------- (ここを改善したい) --------------------
TestExtender targetExtender = null;
IExtenderListService extenderListService = (IExtenderListService)context.GetService(typeof(IExtenderListService));
if (extenderListService != null) {
IExtenderProvider[] extenders = extenderListService.GetExtenderProviders();
for (int i = 0; i < extenders.Length; i++) {
if (extenders[i].GetType() == typeof(TestExtender)) {
targetExtender = (TestExtender)extenders[i];
break;
}
}
}
//------------------------------------------------------------
System.Collections.ArrayList range = new System.Collections.ArrayList();
range.Add(FieldSubCategory.None);
if (targetExtender != null) {
Control control = (Control)context.Instance;
FieldCategory fieldCategory = targetExtender.GetFieldCategory(control);
switch (fieldCategory)
{
case FieldCategory.CategoryX:
range.Add(FieldSubCategory.SubCategoryX1);
range.Add(FieldSubCategory.SubCategoryX2);
range.Add(FieldSubCategory.SubCategoryX3);
break;
case FieldCategory.CategoryY:
range.Add(FieldSubCategory.SubCategoryY1);
range.Add(FieldSubCategory.SubCategoryY2);
range.Add(FieldSubCategory.SubCategoryY3);
break;
case FieldCategory.CategoryZ:
range.Add(FieldSubCategory.SubCategoryZ1);
range.Add(FieldSubCategory.SubCategoryZ2);
range.Add(FieldSubCategory.SubCategoryZ3);
break;
}
}
return new StandardValuesCollection(range);
}
}
public TestExtender()
{
}
public TestExtender(IContainer container)
{
container.Add(this);
}
public void SetFieldCategory(Component component, FieldCategory fieldCategory)
{
if (fieldCategories.ContainsKey(component)) {
fieldCategories.Remove(component);
}
fieldCategories.Add(component, fieldCategory);
SetFieldSubCategory(component, FieldSubCategory.None);
}
[DefaultValue(FieldCategory.None),
Category("データ"),
Description("入力項目のカテゴリを示す値を取得または設定します。")]
public FieldCategory GetFieldCategory(Component component)
{
return fieldCategories.ContainsKey(component) ? fieldCategories[component] : FieldCategory.None;
}
public void SetFieldSubCategory(Component component, FieldSubCategory fieldSubCategory)
{
if (fieldSubCategories.ContainsKey(component)) {
fieldSubCategories.Remove(component);
}
fieldSubCategories.Add(component, fieldSubCategory);
}
[DefaultValue(FieldSubCategory.None),
Category("データ"),
Description("入力項目のサブカテゴリを示す値を取得または設定します。"),
TypeConverter(typeof(FieldSubCategoryConverter))]
public FieldSubCategory GetFieldSubCategory(Component component)
{
return fieldSubCategories.ContainsKey(component) ? fieldSubCategories[component] : FieldSubCategory.None;
}
bool IExtenderProvider.CanExtend(object target)
{
if (target is Control && !(target is TestExtender)) {
return true;
}
return false;
}
}
}
|