public GetEditor ( |
||
editorBaseType | ||
return | object |
public virtual object GetEditor(Type editorBaseType)
{
object editor = null;
// Always grab the attribute collection first here, because if the metadata version
// changes it will invalidate our editor cache.
AttributeCollection attrs = Attributes;
// Check the editors we've already created for this type.
//
if (_editorTypes != null)
{
for (int i = 0; i < _editorCount; i++)
{
if (_editorTypes[i] == editorBaseType)
{
return _editors[i];
}
}
}
// If one wasn't found, then we must go through the attributes.
//
if (editor == null)
{
for (int i = 0; i < attrs.Count; i++)
{
EditorAttribute attr = attrs[i] as EditorAttribute;
if (attr == null)
{
continue;
}
Type editorType = GetTypeFromName(attr.EditorBaseTypeName);
if (editorBaseType == editorType)
{
Type type = GetTypeFromName(attr.EditorTypeName);
if (type != null)
{
editor = CreateInstance(type);
break;
}
}
}
// Now, if we failed to find it in our own attributes, go to the
// component descriptor.
//
if (editor == null)
{
editor = TypeDescriptor.GetEditor(PropertyType, editorBaseType);
}
// Now, another slot in our editor cache for next time
//
if (_editorTypes == null)
{
_editorTypes = new Type[5];
_editors = new object[5];
}
if (_editorCount >= _editorTypes.Length)
{
Type[] newTypes = new Type[_editorTypes.Length * 2];
object[] newEditors = new object[_editors.Length * 2];
Array.Copy(_editorTypes, newTypes, _editorTypes.Length);
Array.Copy(_editors, newEditors, _editors.Length);
_editorTypes = newTypes;
_editors = newEditors;
}
_editorTypes[_editorCount] = editorBaseType;
_editors[_editorCount++] = editor;
}
return editor;
}
public PropertyEditorCell GetEditor (PropertyDescriptor pd) { PropertyEditorCell cell = pd.GetEditor (typeof(PropertyEditorCell)) as PropertyEditorCell; if (cell != null) return cell; Type editorType = GetEditorType (pd); if (editorType == null) return Default; if (typeof(IPropertyEditor).IsAssignableFrom (editorType)) { if (!typeof(Gtk.Widget).IsAssignableFrom (editorType)) throw new Exception ("The property editor '" + editorType + "' must be a Gtk Widget"); return Default; } cell = cellCache [editorType] as PropertyEditorCell; if (cell != null) return cell; if (!typeof(PropertyEditorCell).IsAssignableFrom (editorType)) throw new Exception ("The property editor '" + editorType + "' must be a subclass of Stetic.PropertyEditorCell or implement Stetic.IPropertyEditor"); cell = (PropertyEditorCell) Activator.CreateInstance (editorType); cellCache [editorType] = cell; return cell; }