private void ShellTreeView_BeforeExpand(object sender, TreeViewCancelEventArgs e) {
if (e.Action == TreeViewAction.Collapse)
this._AcceptSelection = false;
if (e.Action == TreeViewAction.Expand) {
this._ResetEvent.Set();
if (e.Node.Nodes.Count > 0 && (e.Node.Nodes[0].Text == this._EmptyItemString || e.Node.Nodes[0].Text == this._SearchingForFolders)) {
e.Node.Nodes.Clear();
imagesQueue.Clear();
childsQueue.Clear();
var sho = e.Node.Tag as IListItemEx;
//var lvSho = this.ShellListView != null && this.ShellListView.CurrentFolder != null ? this.ShellListView.CurrentFolder.Clone() : null;
var lvSho = this.ShellListView?.CurrentFolder?.Clone();
var node = e.Node;
node.Nodes.Add(this._SearchingForFolders);
new Thread(() => {
var nodesTemp = new List<TreeNode>();
if (sho?.IsLink == true) {
try {
var shellLink = new ShellLink(sho.ParsingName);
var linkTarget = shellLink.TargetPIDL;
sho = FileSystemListItem.ToFileSystemItem(IntPtr.Zero, linkTarget);
shellLink.Dispose();
} catch { }
}
foreach (var item in sho?.Where(w => !sho.IsFileSystem && Path.GetExtension(sho?.ParsingName).ToLowerInvariant() != ".library-ms" || ((w.IsFolder || w.IsLink) && (this.IsShowHiddenItems || w.IsHidden == false)))) {
if (item?.IsLink == true) {
try {
var shellLink = new ShellLink(item.ParsingName);
var linkTarget = shellLink.TargetPIDL;
var itemLinkReal = FileSystemListItem.ToFileSystemItem(IntPtr.Zero, linkTarget);
shellLink.Dispose();
if (!itemLinkReal.IsFolder) continue;
} catch { }
}
var itemNode = new TreeNode(item.DisplayName);
//IListItemEx itemReal = null;
//if (item.Parent?.Parent != null && item.Parent.Parent.ParsingName == KnownFolders.Libraries.ParsingName) {
IListItemEx itemReal = item?.Parent?.Parent?.ParsingName == KnownFolders.Libraries.ParsingName ?
FileSystemListItem.ToFileSystemItem(IntPtr.Zero, item.ParsingName.ToShellParsingName()) :
item;
itemNode.Tag = itemReal;
if ((sho.IsNetworkPath || sho.IsNetworkPath) && sho.ParsingName != KnownFolders.Network.ParsingName) {
itemNode.ImageIndex = this.folderImageListIndex;
} else if (itemReal.IconType == IExtractIconPWFlags.GIL_PERCLASS || sho.ParsingName == KnownFolders.Network.ParsingName) {
itemNode.ImageIndex = itemReal.GetSystemImageListIndex(itemReal.PIDL, ShellIconType.SmallIcon, ShellIconFlags.OpenIcon);
itemNode.SelectedImageIndex = itemNode.ImageIndex;
} else {
itemNode.ImageIndex = this.folderImageListIndex;
}
itemNode.Nodes.Add(this._EmptyItemString);
if (item.ParsingName.EndsWith(".library-ms")) {
var library = ShellLibrary.Load(Path.GetFileNameWithoutExtension(item.ParsingName), false);
if (library.IsPinnedToNavigationPane)
nodesTemp.Add(itemNode);
library.Close();
} else {
nodesTemp.Add(itemNode);
}
//Application.DoEvents();
}
this.BeginInvoke((Action)(() => {
if (node.Nodes.Count == 1 && node.Nodes[0].Text == _SearchingForFolders) node.Nodes.RemoveAt(0);
node.Nodes.AddRange(nodesTemp.ToArray());
if (lvSho != null) this.SelItem(lvSho);
}));
}).Start();
}
}
}