using System;
using System.Data;
using System.Collections.Generic;
using System.Text;
using System.Collections.ObjectModel;
using Aga.Controls.Tree;
using System.Drawing;
namespace SampleApp
{
    /// <summary>
    /// Using a System.Data.DataTable to represent a tree structure 
    /// </summary>
	public class DataTableTreeModel :  TreeModelBase
	{
        private DataRowNode m_root;

        DataTable m_table;
        string m_IDColumnName;

		public DataTableTreeModel(DataTable table, string idColumnName)
		{
            m_table = table;
            m_IDColumnName = idColumnName;
            DataRow[] rows = table.Select(m_IDColumnName+" = ParentID");
            if( rows.Length ==0 )
            {
                throw new Exception("DataTableModel Requires a root Node");
            }
            m_root = new DataRowNode(rows[0],rows[0]["Name"].ToString());
            m_root.Row = rows[0];
		}

        public override System.Collections.IEnumerable GetChildren(TreePath treePath)
        {
            List<DataRowNode> items = new List<DataRowNode>();

            if (treePath.IsEmpty() )
            {
                items.Add(m_root);
            }
            else
            {
                DataRowNode n = treePath.LastNode as DataRowNode;

                DataRow row = n.Row;
                int id = Convert.ToInt32(row[m_IDColumnName]);

                DataRow[] rows = m_table.Select("ParentID = " + id+" and "+m_IDColumnName+" <> "+id);
                foreach (DataRow r in rows)
                {
                    DataRowNode node = new DataRowNode(r,r["Name"].ToString());
                    node.Row = r;
                    //SampleApp.Properties.Resources.ResourceManager.
                    //node.Icon = new Bitmap(SampleApp.Properties.Resources.Records,new Size(15,15));
                    items.Add(node);
                }
            }
            return items;
        }

        public override bool IsLeaf(TreePath treePath)
        {
            DataRowNode n = treePath.LastNode as DataRowNode;
            if (n.Row["IsFolder"] == DBNull.Value)
                return false;
            return !Convert.ToBoolean(n.Row["IsFolder"]);
        }


        //public event EventHandler<TreeModelEventArgs> NodesChanged;

         //public event EventHandler<TreeModelEventArgs> NodesInserted;

        //public event EventHandler<TreeModelEventArgs> NodesRemoved;

        //public event EventHandler<TreePathEventArgs> StructureChanged;


        public void AddChild(TreePath parent, string text)
        {
            DataRowNode n = parent.LastNode as DataRowNode;
             
           DataRow r =   m_table.NewRow();
           r["ID"] = GetNextID();
           r["ParentID"] = n.Row["ID"];
           r["IsFolder"] = false;
           r["Name"] = text;
           r["Tag"] = "";
           m_table.Rows.Add(r);
           DataRowNode child = new DataRowNode(r, text);
           OnStructureChanged(new TreePathEventArgs(parent));
        }

        private int GetNextID()
        {
            int max = 1;
            for (int i = 0; i < m_table.Rows.Count; i++)
            {
                int id = Convert.ToInt32(m_table.Rows[i]["ID"]);
                if (id > max)
                    max = id;
            }

            return max + 1;
        }
    }
}