using System;
/* ControlElementBase.cs
* part of zaaReloaded2
*
* Copyright 2015-2017 Daniel Kraus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
namespace zaaReloaded2.Controller.Elements
{
///
/// Base class for control elements that control e.g. the working
/// set of time points in a Formatter object.
///
[Serializable]
public abstract class ControlElementBase : ElementBase, ISerializable
{
#region Properties
///
/// Gets a list of child elements, all of which must be derived
/// from FormatElementBase.
///
public IList Children { get; internal set; }
///
/// Informs whether this control element can have child elements.
///
public virtual bool CanHaveChildren { get { return true; } }
#endregion
#region Constructors
public ControlElementBase()
: this(new List())
{ }
public ControlElementBase(IList children)
{
Children = children;
}
public ControlElementBase(FormatElementBase children)
: this(new List() { children })
{ }
#endregion
#region Serialization
///
/// Deserialization constructor.
///
protected ControlElementBase(SerializationInfo info, StreamingContext context)
{
int version = info.GetInt32("Version");
int childrenCount = info.GetInt32("ChildrenCount");
Children = new List();
for (int i = 0; i < childrenCount; i++)
{
Type typeOfChild = info.GetValue(SerializedChildName(i, "Type"), typeof(Type)) as Type;
Children.Add(info.GetValue(SerializedChildName(i, "Object"), typeOfChild) as FormatElementBase);
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Version", Properties.Settings.Default.SerializationVersion);
info.AddValue("ChildrenCount", Children.Count);
int i = 0;
foreach (FormatElementBase child in Children)
{
info.AddValue(SerializedChildName(i, "Type"), child.GetType());
info.AddValue(SerializedChildName(i, "Object"), child);
i++;
}
}
private string SerializedChildName(int index, string info)
{
return String.Format("Child{0}{1}", index, info);
}
#endregion
#region Protected methods
///
/// Creates a clone of the Children list (for use in cloning
/// derived classes).
///
/// Clone of the Children list.
protected IList CloneChildren()
{
return Children.Select(child => child.Clone() as FormatElementBase).ToList();
}
#endregion
}
}