using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace EditFavorite
{
    public partial class EditableWindow
    {
        
        private void BuildMenu()
        {
            //お気に入り編集ウィンドウが、×ボタンで閉じられたとき、tagデータが更新されない
            //保存するボタンをクリックした場合は、tagにデータがセットされている。
            if (this.RootMenu.Tag == null)
                return;


            //ルートメニューアイテムtagを元にしてメニューを構築
            object[] arg = (object[])RootMenu.Tag;

            //この形式でセットされている前提
            //List<TreeNode> list = get_AllTreeNode(this.treeView1.Nodes[0]);
            //this.favorites.Tag = new object[] { list , this.writeProtectItems };
            var newRootmenu = MakeMenu(arg);


            //****************************************************************
            //ToolStripItemはコピーできないらしい？？？
            //addrangeするときに、エラーが発生する
            //////元々のメニューを消し、その位置にメニューを追加する
            //////////////////////targetRootMenuItem.DropDownItems.Clear();
            ////////////////////////// //ToolStripItem[] newMenuChildren = null;
            //////////////////////string teststr = "";

            //多分これで正解

            ToolStripItem[] newDropDownItems = new ToolStripItem[newRootmenu.DropDownItems.Count];
            newRootmenu.DropDownItems.CopyTo(newDropDownItems , 0);


            RootMenu.DropDownItems.Clear();
            RootMenu.DropDownItems.AddRange(newDropDownItems);


            #region いろいろ試してみた
            //////foreach (ToolStripItem item in newRootmenu.DropDownItems)
            //////{

            //////   // teststr += item.Name + " " + item.ToString() + "\r\n";
            //////    targetRootMenuItem.DropDownItems.Add(item);
            //////}

            //this.testToolStripMenuItem.DropDownItems.AddRange(newRootmenu.DropDownItems);


            ////////******************************
            ////////元のメニューの位置を記憶しておき
            //////int menuindex = menustrip.Items.IndexOf(targetRootMenuItem);

            ////////いったん登録をはずす
            //////menustrip.Items.Remove(targetRootMenuItem);

            ////////内容を更新して、再登録する
            ////////targetRootMenuItem = newRootmenu;
            //////menustrip.Items.Insert(menuindex , newRootmenu);
            #endregion

        }//method


        /// <summary>
        /// メニューを構築する
        /// </summary>
        /// <param name="obj">構築するためのソース
        /// 配列の１つめは、アイテム情報（string)
        /// 配列の２つめは、上書き禁止のアイテムの一覧</param>
        /// <param name="delim">アイテム情報区切り</param>
        /// <param name="eventhandler">クリック時のイベントハンドラ</param>
        /// <param name="separatorConst">アイテム情報内でのセパレータの表現</param>
        /// <returns>構築後のメニューアイテム</returns>
        private ToolStripMenuItem MakeMenu(object[] obj )
        {
            if (obj == null)
            {
                throw new Exception("メニューアイテム情報が設定されていません");
            }

            //この形式でセットされている前提
            //List<TreeNode> list = get_AllTreeNode(this.treeView1.Nodes[0]);
            //this.favorites.Tag = new object[] { list , this.writeProtectItems };

            //アイテム情報
            var list = (List<TreeNode>)obj[0];
            var wProtectItems = (Dictionary<string , ToolStripMenuItem>)obj[1];

            var itemList = new Dictionary<string , object>();
            ToolStripMenuItem newRootmenu = null;
            int sepCount = 0;

            //まず、階層は考慮せずに、ToolStripMenuItemを作成
            //foreach (var s in src.Split(new string[] { Environment.NewLine } , StringSplitOptions.RemoveEmptyEntries))
            foreach (TreeNode s in list)
                {



                //入れ物を準備しておく。
                //作成するアイテムは以下のいずれか
                ToolStripSeparator Separator = null;
                ToolStripMenuItem menu = null;

                //表示名（TreeNodeのText）
                var itemname = s.Text;

                //セパレーター表現する文字（------）なら、セパレータ作成
                if (itemname == separatorConst)
                {
                    Separator = new ToolStripSeparator();
                    sepCount++;
                }
                else
                {
                    //書き込み禁止アイテムの名前と同じ指定かチェックし、
                    //ヒットしたら、新規アイテム作成ではなく、
                    //保持していたリストから、コピーする
                    if (wProtectItems.Keys.Contains(itemname))
                    {
                        menu = wProtectItems[itemname];
                        wProtectItems.Remove(itemname);
                    }
                    else
                    {
                        menu = new ToolStripMenuItem(itemname);
                        //渡されたハンドラを登録する
                        menu.Click += Handler;
                    }
                }//if

                //この前のブロックで、メニューかセパレーターがセットされている。
                if (menu != null)
                {
                    //ルート設定（￥が含まれていないもの）
                    if (s.FullPath.Contains(@"\") == false)
                    {
                        newRootmenu = menu;
                    }

                    //メニュー（フォルダ、セパレータ以外）には、タグが設定されているはず。
                    //ツリーノードのタグをそのままセットする（フォルダ、セパレータはNull）
                    menu.Tag = s.Tag;
                }
                else if (Separator != null)
                {
                    //下でリストに登録するときに、キーが重複しないように細工する
                    //※セパレータは同じ階層に複数存在しうるため
                    //s.FullPath = s.FullPath + sepCount.ToString();
                }


                //リストに追加しておく
                //キーはアイテムのフルパス
                itemList.Add(s.FullPath , (menu != null) ? (ToolStripItem)menu : (ToolStripItem)Separator);

            }//foreach

            //ここまでで、各アイテムが作成され、リストに登録されている
            //階層を構築する
            foreach (var item in itemList)
            {
                //構築するアイテムは以下のいずれか
                ToolStripSeparator Separator = null;
                ToolStripMenuItem menu = null;

                if (item.Value is ToolStripMenuItem)
                {
                    menu = (ToolStripMenuItem)item.Value;
                }
                else if (item.Value is ToolStripSeparator)
                {
                    Separator = (ToolStripSeparator)item.Value;
                }

                if (item.Key.Contains(@"\"))
                {
                    //aaa\bbb\cccというメニューがあるとしたら、
                    //リストにはaaa,aaa\bbbというフォルダも登録されている
                    //cccをaaa\bbbのDropDownItemsに登録してやることで、階層を構築する
                    //※aaa\bbbもaaaのDropDownItemsに登録する必要があるが、順番は影響しない
                    string s = item.Key.Substring(0 , item.Key.LastIndexOf(@"\"));
                    ((ToolStripMenuItem)itemList[s]).DropDownItems.Add((menu != null) ? (ToolStripItem)menu : (ToolStripItem)Separator);
                }
                else
                {
                    //ルートを自身に追加するとエラーとなる
                    ////newRootmenu.DropDownItems.Add(temp);
                }
            }//foreach

            return newRootmenu;
        }//method MakeMenu













    }//class
}//namespace