using System;
/*
using System.Drawing;
using System.Windows.Forms;
*/
using System.Collections;
//using CategoryTheory;


namespace FormulaEditor
{
	/// <summary>
	/// Powered indexed symbol
	/// </summary>
    [Serializable()]
	public class PoweredIndexedSymbol : IndexedSymbol
	{
		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="c">the symbol</param>
		public PoweredIndexedSymbol(char c) : base(c, (byte)FormulaConstants.Powered, true)
		{
			s = "" + c;
		}

		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="c">the symbol</param>
		/// <param name="type">the type</param>
		/// <param name="italic">the italic flag</param>
		public PoweredIndexedSymbol(char c, byte type, bool italic) : base(c, type, italic)
		{
		}

		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="c">the symbol</param>
		/// <param name="type">the type</param>
		/// <param name="italic">the italic flag</param>
		/// <param name="s">string representation</param>
		public PoweredIndexedSymbol(char c, byte type, bool italic, String s) : base(c, type, italic, s)
		{
		}

		/// <summary>
		/// Constructor
		/// </summary>
		/// <param name="c">the symbol</param>
		/// <param name="italic">the italic flag</param>
		/// <param name="type">the type</param>
		public PoweredIndexedSymbol(char c,  bool italic, byte type) : base(c, italic, type)
		{
		}




		/// <summary>
		/// Sets this object to formula
		/// </summary>
		/// <param name="formula">the formula to set</param>
		public override void SetToFormula(MathFormula formula)
		{
			base.SetToFormula(formula);
			/*
			if (italic)
			{
				font = fontsItalic[level];
			}
			else
			{
				font = fonts[level];
			}
			widthInsert = (int)graphics.MeasureString("y", font, 100).Width;
			*/
			if (this is BracketsSymbol | this is BinarySymbol | this is BinaryFunctionSymbol)
			{
				return;
			}
			if (level < (sizes.Length - 1))
			{
				MathFormula child = new MathFormula((byte)(level + 1), sizes);
				children.Add(child);
				//childPositions = new Point[]{new Point(), new Point()};
				return;
			}
			children = null;
		}



		/// <summary>
		/// ICloneable interface implementation
		/// </summary>
		/// <returns></returns>
		public override object Clone()
		{
			return new PoweredIndexedSymbol(symbol, type, italic, s);
		}

		/// <summary>
		/// The associated object
		/// </summary>
		/*public object Object
		{
			get
			{
				return obj;
			}
			set
			{
				obj = value;
			}
		}*/

		public override int SubscriptIndex
		{
			get
			{
				MathFormula f = this[1];
				string s = "";
				for (int i = 0; i < f.Count; i++)
				{
					s += f[i].Symbol;
				}
				return Int32.Parse(s);
			}
		}


		public int Deg
		{
			get
			{
				MathFormula f = this[0];
				if (f.Count == 0)
				{
					return 1;
				}
				string s = "";
				for (int i = 0; i < f.Count; i++)
				{
					s += f[i].Symbol;
				}
				return Int32.Parse(s);
			}
		}
		
		
/*
		/// <summary>
		/// Arity of this operation
		/// </summary>
		public int Arity
		{
			get
			{
				return 0;
			}
		}

		/// <summary>
		/// Return type
		/// </summary>
		public object ReturnType
		{
			get
			{
				return obj;
			}
		}
*/
		/// <summary>
		/// The "is powered" sign
		/// </summary>
		public override bool IsPowered
		{
			get
			{
				return false;
			}
		}



		/// <summary>
		/// Calculates result of this operation
		/// </summary>
	/*	public object this[object[] o]
		{
			get
			{
				return obj;
			}
		}*/

	}
}
