Пример #1
0
        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;
                    }
                }
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
                }
            }
        }
Пример #4
0
        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;
 }