/// <summary>
 /// Adds a dependency to this
 /// </summary>
 /// <param name="componentType">Type dependency</param>
 /// <remarks>
 /// When an instance of this type is created, any dependencies must be created also
 /// </remarks>
 public void AddDependency( ComponentType componentType )
 {
     Arguments.CheckNotNull( componentType, "componentType" );
     if ( !m_Dependencies.Contains( componentType ) )
     {
         m_Dependencies.Add( componentType );
     }
     if ( !componentType.m_Dependents.Contains( this ) )
     {
         componentType.m_Dependents.Add( this );
     }
 }
        /// <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>
 /// Adds a component type as a category item to this category, and any type-compatible sub-categories
 /// </summary>
 public void AddComponentType( ComponentType type, string name, string description, Icon icon )
 {
     Arguments.CheckNotNull( type, "type" );
     Arguments.CheckNotNullOrEmpty( name, "name" );
     Arguments.CheckNotNull( description, "description" );
     Arguments.CheckNotNull( icon, "icon" );
     if ( m_BaseType.IsAssignableFrom( type.Type ) )
     {
         CategoryItem item = new CategoryItem( name, description, icon );
         item.Tag = type;
         AddItem( item );
     }
     foreach ( Category subCategory in SubCategories )
     {
         ComponentTypeCategory componentSubCategory = subCategory as ComponentTypeCategory;
         if ( componentSubCategory != null )
         {
             componentSubCategory.AddComponentType( type, name, description, icon );
         }
     }
 }
 /// <summary>
 /// Adds a component type as a category item to this category, and any type-compatible sub-categories
 /// </summary>
 public void AddComponentType( ComponentType type, string name, string description )
 {
     AddComponentType( type, name, description, s_DefaultItemIcon );
 }
 /// <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>
 /// Removes the specified type, and all its dependencies, from the current template
 /// </summary>
 private void RemoveComponentTypesFromTemplate( ComponentType type )
 {
     CompositeUtils.RemoveAllOfType( m_Composite, type.Type );
     foreach ( ComponentType dependent in type.Dependents )
     {
         RemoveComponentTypesFromTemplate( dependent );
     }
 }
 private void OnAddComponentType( ComponentType type )
 {
     type.Create( m_Composite );
 }
 /// <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( );
 }