private void ResolveIcons() { while (true) { FileSystemNode node = null; lock (_syncLock) { if (_iconResolveQueue.Count > 0) { node = _iconResolveQueue.Dequeue(); } else { _resolvingIcons = false; return; } } int imageIndex = _systemImageList.AddShellIcon( node.FileInfo.FullName, (node.FileInfo.Attributes & FileAttributes.Directory) == 0 ? ShellIconType.UseFileAttributes : 0 ); if (imageIndex != node.TreeNode.ImageIndex) { try { BeginInvoke( new InvokeDelegate <FileSystemNode, int>((n, i) => { BeginUpdate(); n.TreeNode.ImageIndex = i; n.TreeNode.SelectedImageIndex = i; EndUpdate(); }), new object[] { node, imageIndex } ); } catch (InvalidOperationException) { return; } } } }
private FileSystemNode CreateNode(string path) { var fileInfo = new FileInfo(path); if (!_showHidden && (fileInfo.Attributes & FileAttributes.Hidden) != 0) { return(null); } int imageIndex; if ((fileInfo.Attributes & FileAttributes.Directory) != 0) { imageIndex = _folderIcon; } else { string dummyName = "dummy" + Path.GetExtension(path); imageIndex = _systemImageList.AddShellIcon(dummyName, ShellIconType.UseFileAttributes); } string name = String.IsNullOrEmpty(fileInfo.Name) ? fileInfo.FullName : fileInfo.Name; var node = new FileSystemNode(new TreeNode(name, imageIndex, imageIndex), fileInfo); if ((fileInfo.Attributes & FileAttributes.Directory) != 0) { if (!DirectoryContainsItems(fileInfo)) { node.IsLoaded = true; } else { node.TreeNode.Nodes.Add(new TreeNode("Loading...")); } } _iconResolveQueue.Enqueue(node); return(node); }
private void AddNodes(List <FileSystemNode> nodes, FileSystemNode node, bool directories) { var items = new List <string>(); foreach (string path in (directories ? Directory.GetDirectories(node.FileInfo.FullName) : Directory.GetFiles(node.FileInfo.FullName))) { items.Add(Path.GetFileName(path)); } items.Sort((a, b) => String.Compare(a, b, true)); foreach (string item in items) { var subNode = CreateNode(Path.Combine(node.FileInfo.FullName, item)); if (subNode != null) { nodes.Add(subNode); } } }
private void LoadNode(FileSystemNode node) { var nodes = new List <FileSystemNode>(); AddNodes(nodes, node, true); if ((Mode & FileSystemTreeViewMode.FilesAndDirectories) != 0) { AddNodes(nodes, node, false); } try { BeginInvoke( new InvokeDelegate <FileSystemNode, List <FileSystemNode> >((n, l) => { BeginUpdate(); foreach (var item in l) { n.TreeNode.Nodes.Add(item.TreeNode); OnNodeCreated(new FileSystemNodeEventArgs(item)); } node.TreeNode.Expand(); EndUpdate(); }), new object[] { node, nodes } ); } catch (InvalidOperationException) { return; } StartResolver(); }
public FileSystemNodeEventArgs(FileSystemNode node) { Node = node; }