BExplorer.Shell.ShellTreeViewEx.ShellTreeView_BeforeExpand C# (CSharp) Method

ShellTreeView_BeforeExpand() private method

private ShellTreeView_BeforeExpand ( object sender, System.Windows.Forms.TreeViewCancelEventArgs e ) : void
sender object
e System.Windows.Forms.TreeViewCancelEventArgs
return void
		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();
				}
			}
		}