public SchemaEditor(Type rootClass, ISchemaEditorNodeFactory factory)
 {
     this.factory = factory;
     serializer = new XmlSerializer(rootClass);
     this.rootClass = rootClass;
 }
 private static void PopulateElements(ISchemaEditorNode node, ISchemaEditorNodeFactory factory)
 {
     Type nodeObjectType = node.Value.GetType();
     foreach (FieldInfo field in ElementFields(nodeObjectType))
     {
         if(field.FieldType.IsArray)
             AddArrayField(node,field, factory);
         else
             AddField(node,field, factory);
     }
 }
 private static void AddField(ISchemaEditorNode node, FieldInfo field, ISchemaEditorNodeFactory factory)
 {
     object fieldValue = field.GetValue(node.Value);
     NodeFieldReference fieldReference = new NodeFieldReference(node.Value, field, factory, node);
     node.AddNodeField(fieldReference);
     if (ReflectionUtil.HasValue(fieldValue) )
         AddActiveChildNode(node,fieldReference, fieldValue, factory);
 }
 private static void AddArrayField(ISchemaEditorNode node, FieldInfo field, ISchemaEditorNodeFactory factory)
 {
     object fieldValue = field.GetValue(node.Value);
     ArrayNodeFieldReference fieldReference = new ArrayNodeFieldReference(node.Value,
         field, factory, node);
     node.AddNodeField(fieldReference);
     if (ReflectionUtil.HasValue(fieldValue))
     {
         foreach (object o in (Array) fieldValue)
         {
             AddActiveChildNode(node, fieldReference, o, factory);
         }
     }
 }
 private static ISchemaEditorNode AddActiveChildNode(ISchemaEditorNode parentNode, NodeFieldReference fieldReference, object fieldValue, ISchemaEditorNodeFactory factory)
 {
     ISchemaEditorNode child =  fieldReference.AddExistingValue(fieldValue);
     BuildNodeState(child, factory);
     return child;
 }
 internal static void BuildNodeState(ISchemaEditorNode node, ISchemaEditorNodeFactory factory)
 {
     if (ReflectionUtil.HasValue(node.Value) == false)
         return;
     PopulateAttributes(node);
     PopulateElements(node, factory);
     PopulateTextField(node);
     CheckSchemaCompliance(node);
 }