/// <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(); //} }
/// <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(); //} }
/// <summary> /// 全てのノードのアンマネージリソースを解放する。 /// </summary> public virtual void DisposeAllNodes() { foreach (TreeNode node in this.Nodes) { FolderTreeNode ftn = node as FolderTreeNode; if (ftn != null) { ftn.DisposeAllChilds(); } } }
/// <summary> /// フォルダツリービューのアイテム選択変更イベント。 /// </summary> private void FolderTreeView_AfterSelect(Object sender, TreeViewEventArgs e) { FolderTreeNode ftn = e.Node as FolderTreeNode; if (ftn == null) { return; } FolderShellItem = ftn.ShellItem; }
/// <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); }
/// <summary> /// サブディレクトリ名が変更された時の処理。 /// </summary> private void SubdirRenamed(string oldPath, string path) { // アイテムが展開されていない場合は何もしない(再展開時に更新されるので) if (!this.IsExpanded) { return; } // 名前変更されたディレクトリに対応するアイテムを検索 FolderTreeNode node = FindChild(oldPath); if (node == null) { return; } // 名前を更新 node.UpdateName(path); }
/// <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); } } }
/// <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); } }
/// <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); }