Пример #1
0
        /// <summary>
        /// 子ノードを更新する。
        /// </summary>
        public void UpdateChildren()
        {
            //if(this.TreeView != null)
            //    this.TreeView.BeginUpdate();

            this.Nodes.Clear();
            foreach (ShellItem shChild in ShellItem.GetSubFolders())
            {
                bool           fileSystemRoot = !m_ShellItem.IsFileSystem && shChild.IsFileSystem;
                FolderTreeNode tvwChild       = new FolderTreeNode(shChild, fileSystemRoot);

                //	もしこのアイテムがフォルダで、子フォルダを持っているならプレースフォルダアイテムを追加する(+マークを表示させるため)
                if (shChild.IsFolder && shChild.HasSubFolder)
                {
                    tvwChild.Nodes.Add("PH");
                }
                this.Nodes.Add(tvwChild);
            }

            //if (this.TreeView != null)
            //{
            //    this.TreeView.Sort();
            //    this.TreeView.EndUpdate();
            //}
        }
Пример #2
0
        /// <summary>
        /// サブディレクトリが作成された時の処理。
        /// </summary>
        private void SubdirCreated(string path)
        {
            //	アイテムが展開されていない場合は何もしない(再展開時に更新されるので)
            if (!this.IsExpanded)
            {
                if (this.Nodes.Count == 0)
                {
                    this.Nodes.Add("PH");                     // 子ノード数が0だと次回展開することができないのでダミー追加
                }
                return;
            }

            //	作成されたディレクトリの親に対応するアイテムを検索
            FolderTreeNode parentNode;
            string         parentPath = System.IO.Path.GetDirectoryName(path);

            if (string.Compare(parentPath, m_ShellItem.Path, true) == 0)
            {
                parentNode = this;
            }
            else
            {
                parentNode = FindChild(parentPath);
                if (parentNode == null)
                {
                    return;
                }
            }

            FolderTreeNode node;

            try
            {
                //	作成されたディレクトリに対応するノードを作成
                node = new FolderTreeNode(new ShellItem(path));
            }
            catch (Exception)
            {
                //	作成された直後に削除されたりすると対応する ShellItem が作れずに例外が発生するので普通にリターン
                return;
            }

            //	作成されたディレクトリに対応するアイテムを追加
            node.UpdateChildren();

            //if (this.TreeView != null)
            //    this.TreeView.BeginUpdate();

            parentNode.Nodes.Add(node);

            //if (this.TreeView != null)
            //{
            //    this.TreeView.Sort();
            //    this.TreeView.EndUpdate();
            //}
        }
Пример #3
0
 /// <summary>
 /// 全てのノードのアンマネージリソースを解放する。
 /// </summary>
 public virtual void DisposeAllNodes()
 {
     foreach (TreeNode node in this.Nodes)
     {
         FolderTreeNode ftn = node as FolderTreeNode;
         if (ftn != null)
         {
             ftn.DisposeAllChilds();
         }
     }
 }
Пример #4
0
        /// <summary>
        /// フォルダツリービューのアイテム選択変更イベント。
        /// </summary>
        private void FolderTreeView_AfterSelect(Object sender, TreeViewEventArgs e)
        {
            FolderTreeNode ftn = e.Node as FolderTreeNode;

            if (ftn == null)
            {
                return;
            }

            FolderShellItem = ftn.ShellItem;
        }
Пример #5
0
        /// <summary>
        ///	BeforeExpand イベントトリガをオーバーライド。
        /// </summary>
        protected override void OnBeforeExpand(TreeViewCancelEventArgs e)
        {
            FolderTreeNode ftn = e.Node as FolderTreeNode;

            if (ftn != null)
            {
                //	ファイル監視開始
                ftn.StartFileWatch();

                //	子ノード更新
                ftn.UpdateChildren();
            }
            base.OnBeforeExpand(e);
        }
Пример #6
0
        /// <summary>
        /// サブディレクトリ名が変更された時の処理。
        /// </summary>
        private void SubdirRenamed(string oldPath, string path)
        {
            //	アイテムが展開されていない場合は何もしない(再展開時に更新されるので)
            if (!this.IsExpanded)
            {
                return;
            }

            //	名前変更されたディレクトリに対応するアイテムを検索
            FolderTreeNode node = FindChild(oldPath);

            if (node == null)
            {
                return;
            }

            //	名前を更新
            node.UpdateName(path);
        }
Пример #7
0
        /// <summary>
        /// 指定されたシェルアイテムに対応するツリーノードを取得する。
        /// </summary>
        /// <param name="shellItem">探したいシェルアイテム。</param>
        /// <returns>見つかった:ツりーノード、見つからなかった:null。</returns>
        public FolderTreeNode Find(ShellItem shellItem)
        {
            if (this.Nodes.Count == 0)
            {
                return(null);
            }

            IntPtr             idl1  = shellItem.PIDL;
            TreeNodeCollection nodes = this.Nodes;

            while (true)
            {
                bool found = false;
                foreach (TreeNode n in nodes)
                {
                    FolderTreeNode ftn = n as FolderTreeNode;
                    if (ftn == null)
                    {
                        continue;
                    }

                    IntPtr idl2 = ftn.ShellItem.PIDL;
                    if (ShellAPI.ILIsParent(idl2, idl1, 0) != 0)
                    {
                        if (ShellAPI.ILIsEqual(idl2, idl1) != 0)
                        {
                            return(ftn);
                        }
                        else
                        {
                            ftn.Expand();
                            nodes = ftn.Nodes;
                            found = true;
                            break;
                        }
                    }
                }
                if (!found)
                {
                    return(null);
                }
            }
        }
Пример #8
0
        /// <summary>
        /// サブディレクトリが作成された時の処理。
        /// </summary>
        private void SubdirDeleted(string path)
        {
            //	アイテムが展開されていない場合は何もしない(再展開時に更新されるので)
            if (!this.IsExpanded)
            {
                return;
            }

            //	削除されたディレクトリに対応するアイテムを検索
            FolderTreeNode node = FindChild(path);

            if (node == null)
            {
                return;
            }

            //	アイテムを削除
            if (node.Parent != null)
            {
                node.Parent.Nodes.Remove(node);
            }
        }
Пример #9
0
 /// <summary>
 /// このアイテムの全ての子から指定されたパスに対応するアイテムを検索する。
 /// </summary>
 private FolderTreeNode FindChild(string path)
 {
     foreach (TreeNode node in this.Nodes)
     {
         FolderTreeNode ftn = node as FolderTreeNode;
         if (ftn != null)
         {
             if (string.Compare(ftn.Path, path, true) == 0)
             {
                 return(ftn);
             }
             if (ftn.IsExpanded)
             {
                 if (path.StartsWith(ftn.Path + @"\", StringComparison.OrdinalIgnoreCase))
                 {
                     return(ftn.FindChild(path));
                 }
             }
         }
     }
     return(null);
 }