using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.Runtime.Serialization;

using CategoryTheory;

namespace DiagramUI
{

    /// <summary>
    /// Object label for serialization
    /// </summary>
    [Serializable()]
    public class PureObjectLabelPeer : PureObjectLabel, ISerializable
    {

        #region Constuctors

        /// <summary>
        /// Main constructor
        /// </summary>
        /// <param name="name">The name</param>
        /// <param name="kind">The kind</param>
        /// <param name="type">The type</param>
        /// <param name="x">The x - coordinate</param>
        /// <param name="y">The y - coordinate</param>
        public PureObjectLabelPeer(string name, string kind, string type, int x, int y)
            : base(name, kind, type, x, y)
        {
        }

        /// <summary>
        /// Serialization constructor
        /// </summary>
        /// <param name="info"></param>
        /// <param name="context"></param>
        public PureObjectLabelPeer(SerializationInfo info, StreamingContext context)
        {
            kind = info.GetValue("Kind", typeof(string)) as string;
            type = (string)info.GetValue("Type", typeof(string));
            name = (string)info.GetValue("Name", typeof(string));
            x = (int)info.GetValue("X", typeof(int));
            y = (int)info.GetValue("Y", typeof(int));
            obj = info.GetValue("Object", typeof(object)) as ICategoryObject;
        }

        #endregion


        #region ISerializable Members

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("Kind", kind);
            info.AddValue("Type", type);
            info.AddValue("Name", name);
            info.AddValue("X", x);
            info.AddValue("Y", y);
            info.AddValue("Object", obj);
        }

        #endregion

        #region INamedComponent Members

        /// <summary>
        /// Gets component name relatively desktop
        /// </summary>
        /// <param name="desktop">The desktop</param>
        /// <returns>Relalive name</returns>
        public override string GetName(IDesktop desktop)
        {
            return GetName(this, desktop);
        }

        #endregion

        #region Specific members

        /// <summary>
        /// Gets relative component name
        /// </summary>
        /// <param name="component">The component</param>
        /// <param name="desktop">The base desktop</param>
        /// <returns>Relalive name</returns>
        new public static string GetName(INamedComponent component, IDesktop desktop)
        {
            string name = PureObjectLabel.GetName(component, desktop);
            if (name != null)
            {
                return name;
            }
            if (desktop is PureDesktopPeer)
            {
                PureDesktopPeer p = desktop as PureDesktopPeer;
                name = GetName(component, p.parentDesktop);
                if (name != null)
                {
                    return "../" + name;
                }
            }
            return null;
        }


        #endregion

    }
}