/// <summary>
 /// Copy constructor, with an alternate parent category
 /// </summary>
 /// <param name="parentCategory">Parent category</param>
 /// <param name="src">Source category</param>
 /// <exception cref="ArgumentNullException">Thrown if src is null</exception>
 public ComponentTypeCategory( ComponentTypeCategory parentCategory, ComponentTypeCategory src )
     : base(parentCategory, src.Name, src.Description, src.Icon)
 {
     Arguments.CheckNotNull( src, "src" );
     m_BaseType = src.BaseType;
     foreach ( ComponentTypeCategory srcSubCategory in src.SubCategories )
     {
         new ComponentTypeCategory( this, srcSubCategory );
     }
 }
        /// <summary>
        /// Setup constructor
        /// </summary>
        /// <param name="view">View to control</param>
        /// <param name="componentTypeCategories">Categories that component types can fall into</param>
        /// <param name="types">Composite types available for use</param>
        /// <param name="composite">Current composite</param>
        /// <exception cref="ArgumentNullException">Thrown if any argument is null</exception>
        public ComponentCompositionEditorController( IComponentCompositionEditorView view, ComponentTypeCategory[] componentTypeCategories, ComponentType[] types, IComposite composite )
        {
            Arguments.CheckNotNull( view, "view" );
            Arguments.CheckNotNull( types, "types" );
            Arguments.CheckNotNull( composite, "composite" );
            Arguments.CheckNotNull( componentTypeCategories, "componentTypeCategories" );

            view.Categories = componentTypeCategories;
            view.Types = types;
            view.CompositeView.Composite = composite;

            view.AddComponentType += OnAddComponentType;
            view.RemoveComponent += OnRemoveComponent;

            composite.ComponentAdded += OnCompositeChanged;
            composite.ComponentRemoved += OnCompositeChanged;

            m_Composite = composite;
            m_View = view;
            m_Types = types;
        }
 /// <summary>
 /// Setup constructor
 /// </summary>
 public ComponentTypeCategory( ComponentTypeCategory parentCategory, Type baseType, string name, string description )
     : base(parentCategory, name, description, s_DefaultIcon)
 {
     Arguments.CheckNotNull( baseType, "baseType" );
     m_BaseType = baseType;
 }
 /// <summary>
 /// Copy constructor
 /// </summary>
 /// <param name="src">Source category</param>
 /// <exception cref="ArgumentNullException">Thrown if src is null</exception>
 public ComponentTypeCategory( ComponentTypeCategory src )
     : this(null, src)
 {
 }
 /// <summary>
 /// Links a template types to the control
 /// </summary>
 private void AddComponentType( ComponentTypeCategory category, ComponentType type )
 {
     if ( category.BaseType.IsAssignableFrom( type.Type ) )
     {
         category.AddComponentType( type, type.Type.Name, "blah" );
     }
     foreach ( ComponentTypeCategory subCategory in category.SubCategories )
     {
         AddComponentType( subCategory, type );
     }
 }
 /// <summary>
 /// Shows a composite object editor as a model dialog
 /// </summary>
 public void ShowEditCompositeView( IComposite composite, ComponentTypeCategory[] categories, ComponentType[] componentTypes )
 {
     CompositeEditorForm form = new CompositeEditorForm( );
     form.CompositeView.Composite = composite;
     form.Categories = categories;
     new ComponentCompositionEditorController( form, categories, componentTypes, composite );
     form.ShowDialog( );
 }